Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/controllers/projects/wikis_controller.rb3
-rw-r--r--app/models/wiki_page.rb25
-rw-r--r--app/views/projects/wikis/_sidebar.html.haml12
-rw-r--r--app/views/projects/wikis/pages.html.haml14
-rw-r--r--changelogs/unreleased/23535-folders-in-wiki-repository.yml4
-rw-r--r--spec/models/wiki_page_spec.rb17
6 files changed, 65 insertions, 10 deletions
diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb
index c3353446fd1..45a42400b2a 100644
--- a/app/controllers/projects/wikis_controller.rb
+++ b/app/controllers/projects/wikis_controller.rb
@@ -8,6 +8,7 @@ class Projects::WikisController < Projects::ApplicationController
def pages
@wiki_pages = Kaminari.paginate_array(@project_wiki.pages).page(params[:page])
+ @wiki_directories = WikiPage.group_by_directory(@wiki_pages)
end
def show
@@ -116,7 +117,7 @@ class Projects::WikisController < Projects::ApplicationController
# Call #wiki to make sure the Wiki Repo is initialized
@project_wiki.wiki
- @sidebar_wiki_pages = @project_wiki.pages.first(15)
+ @sidebar_wiki_directories = WikiPage.group_by_directory(@project_wiki.pages.first(15))
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/wiki_page.rb b/app/models/wiki_page.rb
index c3de278f5b7..30db2b13dc0 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -12,6 +12,23 @@ class WikiPage
ActiveModel::Name.new(self, nil, 'wiki')
end
+ def self.group_by_directory(pages)
+ directories = {}
+
+ pages.each do |page|
+ if page.slug.include?('/')
+ # Directory hierarchy is given by matching from the beginning up to
+ # the last forward slash.
+ directory = page.slug.match(/\A(.+)\//)[1]
+ directories[directory] = add_to_directory(directories[directory], page)
+ else
+ directories['root'] = add_to_directory(directories['root'], page)
+ end
+ end
+
+ directories
+ end
+
def to_key
[:slug]
end
@@ -176,6 +193,14 @@ class WikiPage
private
+ def self.add_to_directory(directory, page)
+ if directory.present?
+ directory << page
+ else
+ [page]
+ end
+ end
+
def set_attributes
attributes[:slug] = @page.url_path
attributes[:title] = @page.title
diff --git a/app/views/projects/wikis/_sidebar.html.haml b/app/views/projects/wikis/_sidebar.html.haml
index cad9c15a49e..5aee1a136f5 100644
--- a/app/views/projects/wikis/_sidebar.html.haml
+++ b/app/views/projects/wikis/_sidebar.html.haml
@@ -12,10 +12,14 @@
.blocks-container
.block.block-first
%ul.wiki-pages
- - @sidebar_wiki_pages.each do |wiki_page|
- %li{ class: params[:id] == wiki_page.slug ? 'active' : '' }
- = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_page) do
- = wiki_page.title.capitalize
+ - @sidebar_wiki_directories.each do |wiki_directory, wiki_pages|
+ %li
+ = wiki_directory
+ %ul
+ - wiki_pages.each do |wiki_page|
+ %li{ class: params[:id] == wiki_page.slug ? 'active' : '' }
+ = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_page) do
+ = wiki_page.title.capitalize
.block
= link_to namespace_project_wikis_pages_path(@project.namespace, @project), class: 'btn btn-block' do
More Pages
diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml
index e1eaffc6884..274afb1bdea 100644
--- a/app/views/projects/wikis/pages.html.haml
+++ b/app/views/projects/wikis/pages.html.haml
@@ -14,10 +14,14 @@
Clone repository
%ul.content-list
- - @wiki_pages.each do |wiki_page|
+ - @wiki_directories.each do |wiki_directory, wiki_pages|
%li
- = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page)
- %small (#{wiki_page.format})
- .pull-right
- %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)}
+ = wiki_directory
+ %ul
+ - wiki_pages.each do |wiki_page|
+ %li
+ = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page)
+ %small (#{wiki_page.format})
+ .pull-right
+ %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)}
= paginate @wiki_pages, theme: 'gitlab'
diff --git a/changelogs/unreleased/23535-folders-in-wiki-repository.yml b/changelogs/unreleased/23535-folders-in-wiki-repository.yml
new file mode 100644
index 00000000000..7361b182a94
--- /dev/null
+++ b/changelogs/unreleased/23535-folders-in-wiki-repository.yml
@@ -0,0 +1,4 @@
+---
+title: Show directory hierarchy when listing wiki pages
+merge_request:
+author: Alex Braha Stoll
diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb
index 5c34b1b0a30..25e7b517fe6 100644
--- a/spec/models/wiki_page_spec.rb
+++ b/spec/models/wiki_page_spec.rb
@@ -7,6 +7,23 @@ describe WikiPage, models: true do
subject { WikiPage.new(wiki) }
+ describe '::group_by_directory' do
+ context 'when there are no pages' do
+ it 'returns an empty hash' do
+ end
+ end
+
+ context 'when there are pages' do
+ let!(:page_1) { create_page('page_1', 'content') }
+ let!(:page_2) { create_page('directory/page_2', 'content') }
+ let(:pages) { [page_1, page_2] }
+
+ xit 'returns a hash in which keys are directories and values are their pages' do
+ expected_grouped_pages = { 'root' => [page_1], 'directory' => [page_2] }
+ end
+ end
+ end
+
describe "#initialize" do
context "when initialized with an existing gollum page" do
before do