Merge branch '36958-enable-ordering-projects-subgroups-by-name' into 'master'

Enables ordering groups and their children by name in the web interface

Closes #24962 et #36958

See merge request gitlab-org/gitlab-ce!16045
This commit is contained in:
Rémy Coutable 2017-12-21 09:10:20 +00:00
commit 0a8fa500f0
5 changed files with 52 additions and 21 deletions

View file

@ -43,14 +43,20 @@ module SortingHelper
end end
def groups_sort_options_hash def groups_sort_options_hash
options = { {
sort_value_name => sort_title_name,
sort_value_name_desc => sort_title_name_desc,
sort_value_recently_created => sort_title_recently_created, sort_value_recently_created => sort_title_recently_created,
sort_value_oldest_created => sort_title_oldest_created, sort_value_oldest_created => sort_title_oldest_created,
sort_value_recently_updated => sort_title_recently_updated, sort_value_recently_updated => sort_title_recently_updated,
sort_value_oldest_updated => sort_title_oldest_updated sort_value_oldest_updated => sort_title_oldest_updated
} }
end
options def admin_groups_sort_options_hash
groups_sort_options_hash.merge(
sort_value_largest_group => sort_title_largest_group
)
end end
def member_sort_options_hash def member_sort_options_hash

View file

@ -11,23 +11,7 @@
.search-field-holder .search-field-holder
= search_field_tag :name, project_name, class: "form-control search-text-input js-search-input", autofocus: true, spellcheck: false, placeholder: 'Search by name' = search_field_tag :name, project_name, class: "form-control search-text-input js-search-input", autofocus: true, spellcheck: false, placeholder: 'Search by name'
= icon("search", class: "search-icon") = icon("search", class: "search-icon")
.dropdown = render "shared/groups/dropdown", options_hash: admin_groups_sort_options_hash
- toggle_text = @sort.present? ? sort_options_hash[@sort] : sort_title_recently_created
= dropdown_toggle(toggle_text, { toggle: 'dropdown' })
%ul.dropdown-menu.dropdown-menu-align-right
%li.dropdown-header
Sort by
%li
= link_to admin_groups_path(sort: sort_value_recently_created, name: project_name) do
= sort_title_recently_created
= link_to admin_groups_path(sort: sort_value_oldest_created, name: project_name) do
= sort_title_oldest_created
= link_to admin_groups_path(sort: sort_value_recently_updated, name: project_name) do
= sort_title_recently_updated
= link_to admin_groups_path(sort: sort_value_oldest_updated, name: project_name) do
= sort_title_oldest_updated
= link_to admin_groups_path(sort: sort_value_largest_group, name: project_name) do
= sort_title_largest_group
= link_to new_admin_group_path, class: "btn btn-new" do = link_to new_admin_group_path, class: "btn btn-new" do
New group New group
%ul.content-list %ul.content-list

View file

@ -1,3 +1,4 @@
- options_hash = local_assigns.fetch(:options_hash, groups_sort_options_hash)
- show_archive_options = local_assigns.fetch(:show_archive_options, false) - show_archive_options = local_assigns.fetch(:show_archive_options, false)
- if @sort.present? - if @sort.present?
- default_sort_by = @sort - default_sort_by = @sort
@ -10,12 +11,12 @@
.dropdown.inline.js-group-filter-dropdown-wrap.append-right-10 .dropdown.inline.js-group-filter-dropdown-wrap.append-right-10
%button.dropdown-toggle{ type: 'button', 'data-toggle' => 'dropdown' } %button.dropdown-toggle{ type: 'button', 'data-toggle' => 'dropdown' }
%span.dropdown-label %span.dropdown-label
= sort_options_hash[default_sort_by] = options_hash[default_sort_by]
= icon('chevron-down') = icon('chevron-down')
%ul.dropdown-menu.dropdown-menu-align-right.dropdown-menu-selectable %ul.dropdown-menu.dropdown-menu-align-right.dropdown-menu-selectable
%li.dropdown-header %li.dropdown-header
= _("Sort by") = _("Sort by")
- groups_sort_options_hash.each do |value, title| - options_hash.each do |value, title|
%li.js-filter-sort-order %li.js-filter-sort-order
= link_to filter_groups_path(sort: value), class: ("is-active" if default_sort_by == value) do = link_to filter_groups_path(sort: value), class: ("is-active" if default_sort_by == value) do
= title = title

View file

@ -0,0 +1,5 @@
---
title: Enable ordering of groups and their children by name
merge_request:
author:
type: added

View file

@ -73,6 +73,41 @@ describe GroupDescendantsFinder do
expect(finder.execute).to contain_exactly(matching_project) expect(finder.execute).to contain_exactly(matching_project)
end end
end end
context 'sorting by name' do
let!(:project1) { create(:project, namespace: group, name: 'a', path: 'project-a') }
let!(:project2) { create(:project, namespace: group, name: 'z', path: 'project-z') }
let(:params) do
{
sort: 'name_asc'
}
end
it 'sorts elements by name' do
expect(subject.execute).to eq(
[
project1,
project2
]
)
end
context 'with nested groups', :nested_groups do
let!(:subgroup1) { create(:group, parent: group, name: 'a', path: 'sub-a') }
let!(:subgroup2) { create(:group, parent: group, name: 'z', path: 'sub-z') }
it 'sorts elements by name' do
expect(subject.execute).to eq(
[
subgroup1,
subgroup2,
project1,
project2
]
)
end
end
end
end end
context 'with nested groups', :nested_groups do context 'with nested groups', :nested_groups do