summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-06-24 19:48:25 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-06-24 19:48:25 +0000
commit62a9b70c609243218f68691efb1b9731ed5c9bc4 (patch)
tree5373e56fa9e3556304ce2f722ca4bcd0921b65f2
parent43130a8389c6f3e3c392be8503d3187e34baf71d (diff)
downloadgitlab-ce-62a9b70c609243218f68691efb1b9731ed5c9bc4.tar.gz
Add latest changes from gitlab-org/gitlab@12-10-stable-ee
-rw-r--r--app/controllers/projects/wikis_controller.rb2
-rw-r--r--app/models/project_wiki.rb8
-rw-r--r--app/views/projects/wikis/_sidebar.html.haml2
-rw-r--r--changelogs/unreleased/correctly-count-wiki-pages-in-sidebar.yml5
-rw-r--r--lib/gitlab/wiki_pages.rb3
-rw-r--r--spec/controllers/projects/wikis_controller_spec.rb5
-rw-r--r--spec/features/projects/wiki/user_creates_wiki_page_spec.rb27
-rw-r--r--spec/models/project_wiki_spec.rb38
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")