diff options
| author | Sean McGivern <sean@mcgivern.me.uk> | 2018-07-17 09:09:44 +0000 |
|---|---|---|
| committer | Sean McGivern <sean@mcgivern.me.uk> | 2018-07-17 09:09:44 +0000 |
| commit | a9b119d0abd7f899467d4ca7b03d068489001dae (patch) | |
| tree | e7a77976b05ef4d65c05b6e989c3ef4a2ee3432b | |
| parent | 05b25f5a5f0b6d1b694d27dea136a4c3341aba8d (diff) | |
| parent | b023a920aaf3054c9713f61f5df38b063f7e627c (diff) | |
| download | gitlab-ce-a9b119d0abd7f899467d4ca7b03d068489001dae.tar.gz | |
Merge branch '14995-custom_wiki_sidebar' into 'master'
Implement customized sidebar
Closes #14995
See merge request gitlab-org/gitlab-ce!17940
| -rw-r--r-- | app/controllers/projects/wikis_controller.rb | 7 | ||||
| -rw-r--r-- | app/models/project_wiki.rb | 7 | ||||
| -rw-r--r-- | app/views/projects/wikis/_sidebar.html.haml | 8 | ||||
| -rw-r--r-- | changelogs/custom_wiki_sidebar.yml | 5 | ||||
| -rw-r--r-- | doc/user/project/wiki/index.md | 7 | ||||
| -rw-r--r-- | spec/features/projects/wiki/user_creates_wiki_page_spec.rb | 46 | ||||
| -rw-r--r-- | spec/models/project_wiki_spec.rb | 16 |
7 files changed, 88 insertions, 8 deletions
diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index c01066c688a..9dc0c31be49 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -116,7 +116,12 @@ class Projects::WikisController < Projects::ApplicationController # Call #wiki to make sure the Wiki Repo is initialized @project_wiki.wiki - @sidebar_wiki_entries = WikiPage.group_by_directory(@project_wiki.pages(limit: 15)) + + @sidebar_page = @project_wiki.find_sidebar(params[:version_id]) + + unless @sidebar_page # Fallback to default sidebar + @sidebar_wiki_entries = WikiPage.group_by_directory(@project_wiki.pages(limit: 15)) + end rescue ProjectWiki::CouldNotCreateWikiError flash[:notice] = "Could not create Wiki Repository at this time. Please try again later." redirect_to project_path(@project) diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb index 9ae2fb0013a..3aa56b3983f 100644 --- a/app/models/project_wiki.rb +++ b/app/models/project_wiki.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class ProjectWiki include Gitlab::ShellAdapter include Storage::LegacyProjectWiki @@ -9,6 +11,7 @@ class ProjectWiki }.freeze unless defined?(MARKUPS) CouldNotCreateWikiError = Class.new(StandardError) + SIDEBAR = '_sidebar' # Returns a string describing what went wrong after # an operation fails. @@ -98,6 +101,10 @@ class ProjectWiki end end + def find_sidebar(version = nil) + find_page(SIDEBAR, version) + end + def find_file(name, version = nil) wiki.file(name, version) end diff --git a/app/views/projects/wikis/_sidebar.html.haml b/app/views/projects/wikis/_sidebar.html.haml index a23396dc0d8..28353927135 100644 --- a/app/views/projects/wikis/_sidebar.html.haml +++ b/app/views/projects/wikis/_sidebar.html.haml @@ -11,9 +11,11 @@ .blocks-container .block.block-first - %ul.wiki-pages - = render @sidebar_wiki_entries, context: 'sidebar' - + - if @sidebar_page + = render_wiki_content(@sidebar_page) + - else + %ul.wiki-pages + = render @sidebar_wiki_entries, context: 'sidebar' .block = link_to project_wikis_pages_path(@project), class: 'btn btn-block' do = s_("Wiki|More Pages") diff --git a/changelogs/custom_wiki_sidebar.yml b/changelogs/custom_wiki_sidebar.yml new file mode 100644 index 00000000000..988fccc929c --- /dev/null +++ b/changelogs/custom_wiki_sidebar.yml @@ -0,0 +1,5 @@ +--- +title: "Custom Wiki Sidebar Support Issue 14995" +merge_request: +author: Josh Sooter +type: added diff --git a/doc/user/project/wiki/index.md b/doc/user/project/wiki/index.md index d084ee41d8a..ad0ef60373c 100644 --- a/doc/user/project/wiki/index.md +++ b/doc/user/project/wiki/index.md @@ -107,3 +107,10 @@ On the right sidebar, click on **Clone repository** and follow the on-screen instructions. [permissions]: ../../permissions.md + +## Customizing sidebar + +By default, the wiki would render a sidebar which lists all the pages for the +wiki. You could as well provide a `_sidebar` page to replace this default +sidebar. When this customized sidebar page is provided, the default sidebar +would not be rendered, but the customized one. diff --git a/spec/features/projects/wiki/user_creates_wiki_page_spec.rb b/spec/features/projects/wiki/user_creates_wiki_page_spec.rb index 830565620d6..149eeb4f9ba 100644 --- a/spec/features/projects/wiki/user_creates_wiki_page_spec.rb +++ b/spec/features/projects/wiki/user_creates_wiki_page_spec.rb @@ -2,16 +2,22 @@ require "spec_helper" describe "User creates wiki page" do let(:user) { create(:user) } + let(:wiki) { ProjectWiki.new(project, user) } + let(:project) { create(:project) } before do project.add_maintainer(user) - sign_in(user) - visit(project_wikis_path(project)) - click_link "Create your first page" + sign_in(user) end context "when wiki is empty" do + before do + visit(project_wikis_path(project)) + + click_link "Create your first page" + end + context "in a user namespace" do let(:project) { create(:project, :wiki_repo, namespace: user.namespace) } @@ -165,7 +171,9 @@ describe "User creates wiki page" do context "when wiki is not empty", :js do before do - create(:wiki_page, wiki: create(:project, :wiki_repo, namespace: user.namespace).wiki, attrs: { title: "home", content: "Home page" }) + create(:wiki_page, wiki: wiki, attrs: { title: 'home', content: 'Home page' }) + + visit(project_wikis_path(project)) end context "in a user namespace" do @@ -290,4 +298,34 @@ describe "User creates wiki page" do end end end + + describe 'sidebar feature' do + context 'when there are some existing pages' do + before do + create(:wiki_page, wiki: wiki, attrs: { title: 'home', content: 'home' }) + create(:wiki_page, wiki: wiki, attrs: { title: 'another', content: 'another' }) + end + + it 'renders a default sidebar when there is no customized sidebar' do + visit(project_wikis_path(project)) + + expect(page).to have_content('Another') + expect(page).to have_content('More Pages') + end + + context 'when there is a customized sidebar' do + before do + create(:wiki_page, wiki: wiki, attrs: { title: '_sidebar', content: 'My customized sidebar' }) + end + + it 'renders my customized sidebar instead of the default one' do + visit(project_wikis_path(project)) + + expect(page).to have_content('My customized sidebar') + expect(page).to have_content('More Pages') + expect(page).not_to have_content('Another') + end + end + end + end end diff --git a/spec/models/project_wiki_spec.rb b/spec/models/project_wiki_spec.rb index a544940800a..528f5b610d7 100644 --- a/spec/models/project_wiki_spec.rb +++ b/spec/models/project_wiki_spec.rb @@ -189,6 +189,22 @@ describe ProjectWiki do end end + describe '#find_sidebar' do + before do + create_page(described_class::SIDEBAR, 'This is an awesome Sidebar') + end + + after do + subject.pages.each { |page| destroy_page(page.page) } + end + + it 'finds the page defined as _sidebar' do + page = subject.find_page('_sidebar') + + expect(page.content).to eq('This is an awesome Sidebar') + end + end + describe '#find_file' do shared_examples 'finding a wiki file' do let(:image) { File.open(Rails.root.join('spec', 'fixtures', 'big-image.png')) } |
