diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-06-24 19:48:25 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-06-24 19:48:25 +0000 |
commit | 62a9b70c609243218f68691efb1b9731ed5c9bc4 (patch) | |
tree | 5373e56fa9e3556304ce2f722ca4bcd0921b65f2 | |
parent | 43130a8389c6f3e3c392be8503d3187e34baf71d (diff) | |
download | gitlab-ce-62a9b70c609243218f68691efb1b9731ed5c9bc4.tar.gz |
Add latest changes from gitlab-org/gitlab@12-10-stable-ee
-rw-r--r-- | app/controllers/projects/wikis_controller.rb | 2 | ||||
-rw-r--r-- | app/models/project_wiki.rb | 8 | ||||
-rw-r--r-- | app/views/projects/wikis/_sidebar.html.haml | 2 | ||||
-rw-r--r-- | changelogs/unreleased/correctly-count-wiki-pages-in-sidebar.yml | 5 | ||||
-rw-r--r-- | lib/gitlab/wiki_pages.rb | 3 | ||||
-rw-r--r-- | spec/controllers/projects/wikis_controller_spec.rb | 5 | ||||
-rw-r--r-- | spec/features/projects/wiki/user_creates_wiki_page_spec.rb | 27 | ||||
-rw-r--r-- | spec/models/project_wiki_spec.rb | 38 |
8 files changed, 79 insertions, 11 deletions
diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index 90ff798077a..714aa42e52e 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -144,7 +144,7 @@ class Projects::WikisController < Projects::ApplicationController @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.list_pages(limit: 15)) + @sidebar_wiki_entries, @sidebar_limited = @project_wiki.sidebar_entries end rescue ProjectWiki::CouldNotCreateWikiError flash[:notice] = _("Could not create Wiki Repository at this time. Please try again later.") diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb index 708b45cf5f0..dcef01c0c1f 100644 --- a/app/models/project_wiki.rb +++ b/app/models/project_wiki.rb @@ -114,6 +114,14 @@ class ProjectWiki end end + def sidebar_entries(limit: Gitlab::WikiPages::MAX_SIDEBAR_PAGES, **options) + pages = list_pages(**options.merge(limit: limit + 1)) + limited = pages.size > limit + pages = pages.first(limit) if limited + + [WikiPage.group_by_directory(pages), limited] + end + # Finds a page within the repository based on a tile # or slug. # diff --git a/app/views/projects/wikis/_sidebar.html.haml b/app/views/projects/wikis/_sidebar.html.haml index 0f2938686cc..2b8da83b126 100644 --- a/app/views/projects/wikis/_sidebar.html.haml +++ b/app/views/projects/wikis/_sidebar.html.haml @@ -17,6 +17,6 @@ %ul.wiki-pages = render @sidebar_wiki_entries, context: 'sidebar' .block.w-100 - - if @sidebar_wiki_entries&.length.to_i >= 15 + - if @sidebar_limited = link_to project_wikis_pages_path(@project), class: 'btn btn-block' do = s_("Wiki|View All Pages") diff --git a/changelogs/unreleased/correctly-count-wiki-pages-in-sidebar.yml b/changelogs/unreleased/correctly-count-wiki-pages-in-sidebar.yml new file mode 100644 index 00000000000..f98a9e9cecf --- /dev/null +++ b/changelogs/unreleased/correctly-count-wiki-pages-in-sidebar.yml @@ -0,0 +1,5 @@ +--- +title: Correctly count wiki pages in sidebar +merge_request: 30508 +author: +type: fixed diff --git a/lib/gitlab/wiki_pages.rb b/lib/gitlab/wiki_pages.rb index 47f9aa1117f..dee885e74d1 100644 --- a/lib/gitlab/wiki_pages.rb +++ b/lib/gitlab/wiki_pages.rb @@ -11,5 +11,8 @@ module Gitlab # through the GitLab web interface and API: MAX_TITLE_BYTES = 245 # reserving 10 bytes for the file extension MAX_DIRECTORY_BYTES = 255 + + # Limit the number of pages displayed in the wiki sidebar. + MAX_SIDEBAR_PAGES = 15 end end diff --git a/spec/controllers/projects/wikis_controller_spec.rb b/spec/controllers/projects/wikis_controller_spec.rb index 99d14298cd1..91ca71d20dc 100644 --- a/spec/controllers/projects/wikis_controller_spec.rb +++ b/spec/controllers/projects/wikis_controller_spec.rb @@ -98,13 +98,12 @@ describe Projects::WikisController do let(:id) { wiki_title } it 'limits the retrieved pages for the sidebar' do - expect(controller).to receive(:load_wiki).and_return(project_wiki) - expect(project_wiki).to receive(:list_pages).with(limit: 15).and_call_original - subject expect(response).to have_gitlab_http_status(:ok) expect(assigns(:page).title).to eq(wiki_title) + expect(assigns(:sidebar_wiki_entries)).to contain_exactly(an_instance_of(WikiPage)) + expect(assigns(:sidebar_limited)).to be(false) end context 'when page content encoding is invalid' do 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 67996cc3e5d..6709ca8de89 100644 --- a/spec/features/projects/wiki/user_creates_wiki_page_spec.rb +++ b/spec/features/projects/wiki/user_creates_wiki_page_spec.rb @@ -312,6 +312,7 @@ describe "User creates wiki page" do visit(project_wikis_path(project)) expect(page).to have_content('another') + expect(page).not_to have_link('View All Pages') end context 'when there is a customized sidebar' do @@ -328,17 +329,31 @@ describe "User creates wiki page" do end end - context 'when there are more than 15 existing pages' do + context 'when there are 15 existing pages' do before do - create(:wiki_page, wiki: wiki, attrs: { title: 'home', content: 'home' }) - (1..14).each { |i| create(:wiki_page, wiki: wiki, attrs: { title: "page-#{i}", content: "page #{i}" }) } + (1..5).each { |i| create(:wiki_page, wiki: wiki, title: "my page #{i}") } + (6..10).each { |i| create(:wiki_page, wiki: wiki, title: "parent/my page #{i}") } + (11..15).each { |i| create(:wiki_page, wiki: wiki, title: "grandparent/parent/my page #{i}") } end - it 'renders a default sidebar when there is no customized sidebar' do + it 'shows all pages in the sidebar' do visit(project_wikis_path(project)) - expect(page).to have_content('View All Pages') - expect(page).to have_content('page 1') + (1..15).each { |i| expect(page).to have_content("my page #{i}") } + expect(page).not_to have_link('View All Pages') + end + + context 'when there are more than 15 existing pages' do + before do + create(:wiki_page, wiki: wiki, title: 'my page 16') + end + + it 'shows the first 15 pages in the sidebar' do + visit(project_wikis_path(project)) + + expect(page).to have_text('my page', count: 15) + expect(page).to have_link('View All Pages') + end end end end diff --git a/spec/models/project_wiki_spec.rb b/spec/models/project_wiki_spec.rb index 1b121b7dee1..f1f11f9e294 100644 --- a/spec/models/project_wiki_spec.rb +++ b/spec/models/project_wiki_spec.rb @@ -175,6 +175,44 @@ describe ProjectWiki do end end + describe '#sidebar_entries' do + before do + (1..5).each { |i| create(:wiki_page, wiki: project_wiki, title: "my page #{i}") } + (6..10).each { |i| create(:wiki_page, wiki: project_wiki, title: "parent/my page #{i}") } + (11..15).each { |i| create(:wiki_page, wiki: project_wiki, title: "grandparent/parent/my page #{i}") } + end + + def total_pages(entries) + entries.sum do |entry| + entry.is_a?(WikiDirectory) ? entry.pages.size : 1 + end + end + + context 'when the number of pages does not exceed the limit' do + it 'returns all pages grouped by directory and limited is false' do + entries, limited = subject.sidebar_entries + + expect(entries.size).to be(7) + expect(total_pages(entries)).to be(15) + expect(limited).to be(false) + end + end + + context 'when the number of pages exceeds the limit' do + before do + create(:wiki_page, wiki: project_wiki, title: 'my page 16') + end + + it 'returns 15 pages grouped by directory and limited is true' do + entries, limited = subject.sidebar_entries + + expect(entries.size).to be(8) + expect(total_pages(entries)).to be(15) + expect(limited).to be(true) + end + end + end + describe "#find_page" do before do create_page("index page", "This is an awesome Gollum Wiki") |