summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean McGivern <sean@mcgivern.me.uk>2018-07-17 09:09:44 +0000
committerSean McGivern <sean@mcgivern.me.uk>2018-07-17 09:09:44 +0000
commita9b119d0abd7f899467d4ca7b03d068489001dae (patch)
treee7a77976b05ef4d65c05b6e989c3ef4a2ee3432b
parent05b25f5a5f0b6d1b694d27dea136a4c3341aba8d (diff)
parentb023a920aaf3054c9713f61f5df38b063f7e627c (diff)
downloadgitlab-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.rb7
-rw-r--r--app/models/project_wiki.rb7
-rw-r--r--app/views/projects/wikis/_sidebar.html.haml8
-rw-r--r--changelogs/custom_wiki_sidebar.yml5
-rw-r--r--doc/user/project/wiki/index.md7
-rw-r--r--spec/features/projects/wiki/user_creates_wiki_page_spec.rb46
-rw-r--r--spec/models/project_wiki_spec.rb16
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')) }