Commit 611c5f1d7cb0ae74d923499d01c2f30d5e8f9384
1 parent
231b91d0
Exists in
spb-stable
and in
3 other branches
Sort dropdown for Dashboard#projects page
Be default it sorts by name now Respect filters like scope, label, visibility when do sort or another filter Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing
6 changed files
with
65 additions
and
21 deletions
Show diff stats
app/controllers/dashboard_controller.rb
... | ... | @@ -41,13 +41,13 @@ class DashboardController < ApplicationController |
41 | 41 | |
42 | 42 | @projects = @projects.where(namespace_id: Group.find_by_name(params[:group])) if params[:group].present? |
43 | 43 | @projects = @projects.where(visibility_level: params[:visibility_level]) if params[:visibility_level].present? |
44 | - @projects = @projects.includes(:namespace).sorted_by_activity | |
44 | + @projects = @projects.includes(:namespace) | |
45 | + @projects = @projects.tagged_with(params[:label]) if params[:label].present? | |
46 | + @projects = @projects.sort(@sort = params[:sort]) | |
47 | + @projects = @projects.page(params[:page]).per(30) | |
45 | 48 | |
46 | 49 | @labels = current_user.authorized_projects.tags_on(:labels) |
47 | 50 | @groups = current_user.authorized_groups |
48 | - | |
49 | - @projects = @projects.tagged_with(params[:label]) if params[:label].present? | |
50 | - @projects = @projects.page(params[:page]).per(30) | |
51 | 51 | end |
52 | 52 | |
53 | 53 | def merge_requests | ... | ... |
app/controllers/public/projects_controller.rb
... | ... | @@ -8,14 +8,7 @@ class Public::ProjectsController < ApplicationController |
8 | 8 | def index |
9 | 9 | @projects = Project.public_or_internal_only(current_user) |
10 | 10 | @projects = @projects.search(params[:search]) if params[:search].present? |
11 | - @sort = params[:sort] | |
12 | - @projects = case @sort | |
13 | - when 'newest' then @projects.order('created_at DESC') | |
14 | - when 'oldest' then @projects.order('created_at ASC') | |
15 | - when 'recently_updated' then @projects.order('updated_at DESC') | |
16 | - when 'last_updated' then @projects.order('updated_at ASC') | |
17 | - else @projects.order("namespaces.path, projects.name ASC") | |
18 | - end | |
11 | + @projects = @projects.sort(@sort = params[:sort]) | |
19 | 12 | @projects = @projects.includes(:namespace).page(params[:page]).per(20) |
20 | 13 | end |
21 | 14 | end | ... | ... |
app/helpers/dashboard_helper.rb
... | ... | @@ -21,4 +21,18 @@ module DashboardHelper |
21 | 21 | [] |
22 | 22 | end.count |
23 | 23 | end |
24 | + | |
25 | + def projects_dashboard_filter_path(options={}) | |
26 | + exist_opts = { | |
27 | + sort: params[:sort], | |
28 | + scope: params[:scope], | |
29 | + group: params[:group], | |
30 | + } | |
31 | + | |
32 | + options = exist_opts.merge(options) | |
33 | + | |
34 | + path = request.path | |
35 | + path << "?#{options.to_param}" | |
36 | + path | |
37 | + end | |
24 | 38 | end | ... | ... |
app/helpers/tab_helper.rb
... | ... | @@ -92,7 +92,12 @@ module TabHelper |
92 | 92 | def nav_tab key, value, &block |
93 | 93 | o = {} |
94 | 94 | o[:class] = "" |
95 | - o[:class] << " active" if params[key] == value | |
95 | + | |
96 | + if value.nil? | |
97 | + o[:class] << " active" if params[key].blank? | |
98 | + else | |
99 | + o[:class] << " active" if params[key] == value | |
100 | + end | |
96 | 101 | |
97 | 102 | if block_given? |
98 | 103 | content_tag(:li, capture(&block), o) | ... | ... |
app/models/project.rb
... | ... | @@ -153,6 +153,16 @@ class Project < ActiveRecord::Base |
153 | 153 | def visibility_levels |
154 | 154 | Gitlab::VisibilityLevel.options |
155 | 155 | end |
156 | + | |
157 | + def sort(method) | |
158 | + case method.to_s | |
159 | + when 'newest' then reorder('projects.created_at DESC') | |
160 | + when 'oldest' then reorder('projects.created_at ASC') | |
161 | + when 'recently_updated' then reorder('projects.updated_at DESC') | |
162 | + when 'last_updated' then reorder('projects.updated_at ASC') | |
163 | + else reorder("namespaces.path, projects.name ASC") | |
164 | + end | |
165 | + end | |
156 | 166 | end |
157 | 167 | |
158 | 168 | def team | ... | ... |
app/views/dashboard/projects.html.haml
1 | -%h3.page-title My Projects | |
1 | +%h3.page-title | |
2 | + My Projects | |
3 | +.pull-right | |
4 | + .dropdown.inline | |
5 | + %a.dropdown-toggle.btn.btn-small{href: '#', "data-toggle" => "dropdown"} | |
6 | + %span.light sort: | |
7 | + - if @sort.present? | |
8 | + = @sort.humanize | |
9 | + - else | |
10 | + Name | |
11 | + %b.caret | |
12 | + %ul.dropdown-menu | |
13 | + %li | |
14 | + = link_to projects_dashboard_filter_path(sort: nil) do | |
15 | + Name | |
16 | + = link_to projects_dashboard_filter_path(sort: 'newest') do | |
17 | + Newest | |
18 | + = link_to projects_dashboard_filter_path(sort: 'oldest') do | |
19 | + Oldest | |
20 | + = link_to projects_dashboard_filter_path(sort: 'recently_updated') do | |
21 | + Recently updated | |
22 | + = link_to projects_dashboard_filter_path(sort: 'last_updated') do | |
23 | + Last updated | |
2 | 24 | %p.light |
3 | 25 | All projects you have access to are listed here. Public projects are not included here unless you are a member |
4 | 26 | %hr |
... | ... | @@ -6,22 +28,22 @@ |
6 | 28 | .span3 |
7 | 29 | %ul.nav.nav-pills.nav-stacked |
8 | 30 | = nav_tab :scope, nil do |
9 | - = link_to projects_dashboard_path do | |
31 | + = link_to projects_dashboard_filter_path(scope: nil) do | |
10 | 32 | All |
11 | 33 | %span.pull-right |
12 | 34 | = current_user.authorized_projects.count |
13 | 35 | = nav_tab :scope, 'personal' do |
14 | - = link_to projects_dashboard_path(scope: 'personal') do | |
36 | + = link_to projects_dashboard_filter_path(scope: 'personal') do | |
15 | 37 | Personal |
16 | 38 | %span.pull-right |
17 | 39 | = current_user.personal_projects.count |
18 | 40 | = nav_tab :scope, 'joined' do |
19 | - = link_to projects_dashboard_path(scope: 'joined') do | |
41 | + = link_to projects_dashboard_filter_path(scope: 'joined') do | |
20 | 42 | Joined |
21 | 43 | %span.pull-right |
22 | 44 | = current_user.authorized_projects.joined(current_user).count |
23 | 45 | = nav_tab :scope, 'owned' do |
24 | - = link_to projects_dashboard_path(scope: 'owned') do | |
46 | + = link_to projects_dashboard_filter_path(scope: 'owned') do | |
25 | 47 | Owned |
26 | 48 | %span.pull-right |
27 | 49 | = current_user.owned_projects.count |
... | ... | @@ -31,7 +53,7 @@ |
31 | 53 | %ul.bordered-list.visibility-filter |
32 | 54 | - Gitlab::VisibilityLevel.values.each do |level| |
33 | 55 | %li{ class: (level.to_s == params[:visibility_level]) ? 'active' : 'light' } |
34 | - = link_to projects_dashboard_path(visibility_level: level) do | |
56 | + = link_to projects_dashboard_filter_path(visibility_level: level) do | |
35 | 57 | = visibility_level_icon(level) |
36 | 58 | = visibility_level_label(level) |
37 | 59 | |
... | ... | @@ -41,7 +63,7 @@ |
41 | 63 | %ul.bordered-list |
42 | 64 | - @groups.each do |group| |
43 | 65 | %li{ class: (group.name == params[:group]) ? 'active' : 'light' } |
44 | - = link_to projects_dashboard_path(group: group.name) do | |
66 | + = link_to projects_dashboard_filter_path(group: group.name) do | |
45 | 67 | %i.icon-folder-close-alt |
46 | 68 | = group.name |
47 | 69 | %small.pull-right |
... | ... | @@ -55,7 +77,7 @@ |
55 | 77 | %ul.bordered-list |
56 | 78 | - @labels.each do |label| |
57 | 79 | %li{ class: (label.name == params[:label]) ? 'active' : 'light' } |
58 | - = link_to projects_dashboard_path(scope: params[:scope], label: label.name) do | |
80 | + = link_to projects_dashboard_filter_path(scope: params[:scope], label: label.name) do | |
59 | 81 | %i.icon-tag |
60 | 82 | = label.name |
61 | 83 | ... | ... |