OSDN Git Service

Sort dropdown for Dashboard#projects page
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Sun, 29 Dec 2013 10:58:00 +0000 (12:58 +0200)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Sun, 29 Dec 2013 10:58:00 +0000 (12:58 +0200)
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>
app/controllers/dashboard_controller.rb
app/controllers/public/projects_controller.rb
app/helpers/dashboard_helper.rb
app/helpers/tab_helper.rb
app/models/project.rb
app/views/dashboard/projects.html.haml

index 7845699..27955c6 100644 (file)
@@ -41,13 +41,13 @@ class DashboardController < ApplicationController
 
     @projects = @projects.where(namespace_id: Group.find_by_name(params[:group])) if params[:group].present?
     @projects = @projects.where(visibility_level: params[:visibility_level]) if params[:visibility_level].present?
-    @projects = @projects.includes(:namespace).sorted_by_activity
+    @projects = @projects.includes(:namespace)
+    @projects = @projects.tagged_with(params[:label]) if params[:label].present?
+    @projects = @projects.sort(@sort = params[:sort])
+    @projects = @projects.page(params[:page]).per(30)
 
     @labels = current_user.authorized_projects.tags_on(:labels)
     @groups = current_user.authorized_groups
-
-    @projects = @projects.tagged_with(params[:label]) if params[:label].present?
-    @projects = @projects.page(params[:page]).per(30)
   end
 
   def merge_requests
index e00cd8c..d729716 100644 (file)
@@ -8,14 +8,7 @@ class Public::ProjectsController < ApplicationController
   def index
     @projects = Project.public_or_internal_only(current_user)
     @projects = @projects.search(params[:search]) if params[:search].present?
-    @sort = params[:sort]
-    @projects = case @sort
-                when 'newest' then @projects.order('created_at DESC')
-                when 'oldest' then @projects.order('created_at ASC')
-                when 'recently_updated' then @projects.order('updated_at DESC')
-                when 'last_updated' then @projects.order('updated_at ASC')
-                else @projects.order("namespaces.path, projects.name ASC")
-                end
+    @projects = @projects.sort(@sort = params[:sort])
     @projects = @projects.includes(:namespace).page(params[:page]).per(20)
   end
 end
index d93eac4..7f86a83 100644 (file)
@@ -21,4 +21,18 @@ module DashboardHelper
       []
     end.count
   end
+
+  def projects_dashboard_filter_path(options={})
+    exist_opts = {
+      sort: params[:sort],
+      scope: params[:scope],
+      group: params[:group],
+    }
+
+    options = exist_opts.merge(options)
+
+    path = request.path
+    path << "?#{options.to_param}"
+    path
+  end
 end
index ce67587..bd373c5 100644 (file)
@@ -92,7 +92,12 @@ module TabHelper
   def nav_tab key, value, &block
     o = {}
     o[:class] = ""
-    o[:class] << " active" if params[key] == value
+
+    if value.nil?
+      o[:class] << " active" if params[key].blank?
+    else
+      o[:class] << " active" if params[key] == value
+    end
 
     if block_given?
       content_tag(:li, capture(&block), o)
index 93aac1a..a55f7a6 100644 (file)
@@ -153,6 +153,16 @@ class Project < ActiveRecord::Base
     def visibility_levels
       Gitlab::VisibilityLevel.options
     end
+
+    def sort(method)
+      case method.to_s
+      when 'newest' then reorder('projects.created_at DESC')
+      when 'oldest' then reorder('projects.created_at ASC')
+      when 'recently_updated' then reorder('projects.updated_at DESC')
+      when 'last_updated' then reorder('projects.updated_at ASC')
+      else reorder("namespaces.path, projects.name ASC")
+      end
+    end
   end
 
   def team
index 96917c3..c59d5ae 100644 (file)
@@ -1,4 +1,26 @@
-%h3.page-title My Projects
+%h3.page-title
+  My Projects
+.pull-right
+  .dropdown.inline
+    %a.dropdown-toggle.btn.btn-small{href: '#', "data-toggle" => "dropdown"}
+      %span.light sort:
+      - if @sort.present?
+        = @sort.humanize
+      - else
+        Name
+      %b.caret
+    %ul.dropdown-menu
+      %li
+        = link_to projects_dashboard_filter_path(sort: nil) do
+          Name
+        = link_to projects_dashboard_filter_path(sort: 'newest') do
+          Newest
+        = link_to projects_dashboard_filter_path(sort: 'oldest') do
+          Oldest
+        = link_to projects_dashboard_filter_path(sort: 'recently_updated') do
+          Recently updated
+        = link_to projects_dashboard_filter_path(sort: 'last_updated') do
+          Last updated
 %p.light
   All projects you have access to are listed here. Public projects are not included here unless you are a member
 %hr
   .span3
     %ul.nav.nav-pills.nav-stacked
       = nav_tab :scope, nil do
-        = link_to projects_dashboard_path do
+        = link_to projects_dashboard_filter_path(scope: nil) do
           All
           %span.pull-right
             = current_user.authorized_projects.count
       = nav_tab :scope, 'personal' do
-        = link_to projects_dashboard_path(scope: 'personal') do
+        = link_to projects_dashboard_filter_path(scope: 'personal') do
           Personal
           %span.pull-right
             = current_user.personal_projects.count
       = nav_tab :scope, 'joined' do
-        = link_to projects_dashboard_path(scope: 'joined') do
+        = link_to projects_dashboard_filter_path(scope: 'joined') do
           Joined
           %span.pull-right
             = current_user.authorized_projects.joined(current_user).count
       = nav_tab :scope, 'owned' do
-        = link_to projects_dashboard_path(scope: 'owned') do
+        = link_to projects_dashboard_filter_path(scope: 'owned') do
           Owned
           %span.pull-right
             = current_user.owned_projects.count
@@ -31,7 +53,7 @@
       %ul.bordered-list.visibility-filter
         - Gitlab::VisibilityLevel.values.each do |level|
           %li{ class: (level.to_s == params[:visibility_level]) ? 'active' : 'light' }
-            = link_to projects_dashboard_path(visibility_level: level) do
+            = link_to projects_dashboard_filter_path(visibility_level: level) do
               = visibility_level_icon(level)
               = visibility_level_label(level)
 
@@ -41,7 +63,7 @@
         %ul.bordered-list
           - @groups.each do |group|
             %li{ class: (group.name == params[:group]) ? 'active' : 'light' }
-              = link_to projects_dashboard_path(group: group.name) do
+              = link_to projects_dashboard_filter_path(group: group.name) do
                 %i.icon-folder-close-alt
                 = group.name
                 %small.pull-right
@@ -55,7 +77,7 @@
         %ul.bordered-list
           - @labels.each do |label|
             %li{ class: (label.name == params[:label]) ? 'active' : 'light' }
-              = link_to projects_dashboard_path(scope: params[:scope], label: label.name) do
+              = link_to projects_dashboard_filter_path(scope: params[:scope], label: label.name) do
                 %i.icon-tag
                 = label.name