From fe22797d69273cc68b5d070416223e9c5f52f396 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Wed, 31 Jan 2007 19:53:24 +0000 Subject: [PATCH] added the ability to set the sort order for issue statuses git-svn-id: http://redmine.rubyforge.org/svn/trunk@205 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/issue_statuses_controller.rb | 20 ++++++++++++++++++- app/controllers/issues_controller.rb | 4 ++-- app/controllers/reports_controller.rb | 2 +- app/controllers/roles_controller.rb | 2 +- app/models/issue_status.rb | 1 + app/models/query.rb | 2 +- app/views/issue_statuses/list.rhtml | 7 +++++++ db/migrate/019_add_issue_status_position.rb | 10 ++++++++++ doc/CHANGELOG | 1 + lang/de.yml | 5 +++++ lang/en.yml | 5 +++++ lang/es.yml | 5 +++++ lang/fr.yml | 5 +++++ public/images/1downarrow.png | Bin 0 -> 461 bytes public/images/1uparrow.png | Bin 0 -> 433 bytes public/images/2downarrow.png | Bin 0 -> 576 bytes public/images/2uparrow.png | Bin 0 -> 526 bytes 17 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 db/migrate/019_add_issue_status_position.rb create mode 100644 public/images/1downarrow.png create mode 100644 public/images/1uparrow.png create mode 100644 public/images/2downarrow.png create mode 100644 public/images/2uparrow.png diff --git a/app/controllers/issue_statuses_controller.rb b/app/controllers/issue_statuses_controller.rb index 5c74fbd02..9180533c3 100644 --- a/app/controllers/issue_statuses_controller.rb +++ b/app/controllers/issue_statuses_controller.rb @@ -19,13 +19,16 @@ class IssueStatusesController < ApplicationController layout 'base' before_filter :require_admin + verify :method => :post, :only => [ :destroy, :create, :update, :move ], + :redirect_to => { :action => :list } + def index list render :action => 'list' unless request.xhr? end def list - @issue_status_pages, @issue_statuses = paginate :issue_statuses, :per_page => 10 + @issue_status_pages, @issue_statuses = paginate :issue_statuses, :per_page => 25, :order => "position" render :action => "list", :layout => false if request.xhr? end @@ -55,6 +58,21 @@ class IssueStatusesController < ApplicationController else render :action => 'edit' end + end + + def move + @issue_status = IssueStatus.find(params[:id]) + case params[:position] + when 'highest' + @issue_status.move_to_top + when 'higher' + @issue_status.move_higher + when 'lower' + @issue_status.move_lower + when 'lowest' + @issue_status.move_to_bottom + end if params[:position] + redirect_to :action => 'list' end def destroy diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 6ac8bc79b..491062e24 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -25,7 +25,7 @@ class IssuesController < ApplicationController include IfpdfHelper def show - @status_options = @issue.status.workflows.find(:all, :include => :new_status, :conditions => ["role_id=? and tracker_id=?", self.logged_in_user.role_for_project(@project.id), @issue.tracker.id]).collect{ |w| w.new_status } if self.logged_in_user + @status_options = @issue.status.workflows.find(:all, :order => 'position', :include => :new_status, :conditions => ["role_id=? and tracker_id=?", self.logged_in_user.role_for_project(@project.id), @issue.tracker.id]).collect{ |w| w.new_status } if self.logged_in_user @custom_values = @issue.custom_values.find(:all, :include => :custom_field) @journals_count = @issue.journals.count @journals = @issue.journals.find(:all, :include => [:user, :details], :limit => 15, :order => "journals.created_on desc") @@ -83,7 +83,7 @@ class IssuesController < ApplicationController def change_status #@history = @issue.histories.build(params[:history]) - @status_options = @issue.status.workflows.find(:all, :conditions => ["role_id=? and tracker_id=?", self.logged_in_user.role_for_project(@project.id), @issue.tracker.id]).collect{ |w| w.new_status } if self.logged_in_user + @status_options = @issue.status.workflows.find(:all, :order => 'position', :include => :new_status, :conditions => ["role_id=? and tracker_id=?", self.logged_in_user.role_for_project(@project.id), @issue.tracker.id]).collect{ |w| w.new_status } if self.logged_in_user @new_status = IssueStatus.find(params[:new_status_id]) if params[:confirm] begin diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb index b27eb19ac..2e2f0fc8e 100644 --- a/app/controllers/reports_controller.rb +++ b/app/controllers/reports_controller.rb @@ -20,7 +20,7 @@ class ReportsController < ApplicationController before_filter :find_project, :authorize def issue_report - @statuses = IssueStatus.find :all + @statuses = IssueStatus.find(:all, :order => 'position') case params[:detail] when "tracker" diff --git a/app/controllers/roles_controller.rb b/app/controllers/roles_controller.rb index ed7c6c200..9e26a6996 100644 --- a/app/controllers/roles_controller.rb +++ b/app/controllers/roles_controller.rb @@ -79,6 +79,6 @@ class RolesController < ApplicationController end @roles = Role.find :all @trackers = Tracker.find :all - @statuses = IssueStatus.find(:all, :include => :workflows) + @statuses = IssueStatus.find(:all, :include => :workflows, :order => 'position') end end diff --git a/app/models/issue_status.rb b/app/models/issue_status.rb index aafafec19..1a690b449 100644 --- a/app/models/issue_status.rb +++ b/app/models/issue_status.rb @@ -18,6 +18,7 @@ class IssueStatus < ActiveRecord::Base before_destroy :check_integrity has_many :workflows, :foreign_key => "old_status_id" + acts_as_list validates_presence_of :name validates_uniqueness_of :name diff --git a/app/models/query.rb b/app/models/query.rb index dbde65a15..5594e5cb6 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -69,7 +69,7 @@ class Query < ActiveRecord::Base def available_filters return @available_filters if @available_filters - @available_filters = { "status_id" => { :type => :list_status, :order => 1, :values => IssueStatus.find(:all).collect{|s| [s.name, s.id.to_s] } }, + @available_filters = { "status_id" => { :type => :list_status, :order => 1, :values => IssueStatus.find(:all, :order => 'position').collect{|s| [s.name, s.id.to_s] } }, "tracker_id" => { :type => :list, :order => 2, :values => Tracker.find(:all).collect{|s| [s.name, s.id.to_s] } }, "priority_id" => { :type => :list, :order => 3, :values => Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect{|s| [s.name, s.id.to_s] } }, "subject" => { :type => :text, :order => 8 }, diff --git a/app/views/issue_statuses/list.rhtml b/app/views/issue_statuses/list.rhtml index bde9b1e23..01617c329 100644 --- a/app/views/issue_statuses/list.rhtml +++ b/app/views/issue_statuses/list.rhtml @@ -9,6 +9,7 @@ <%=l(:field_status)%> <%=l(:field_is_default)%> <%=l(:field_is_closed)%> + <%=l(:button_sort)%> @@ -17,6 +18,12 @@
<%= link_to status.name, :action => 'edit', :id => status %> <%= image_tag 'true.png' if status.is_default? %> <%= image_tag 'true.png' if status.is_closed? %> + + <%= link_to image_tag('2uparrow.png', :alt => l(:label_sort_highest)), {:action => 'move', :id => status, :position => 'highest'}, :method => :post, :title => l(:label_sort_highest) %> + <%= link_to image_tag('1uparrow.png', :alt => l(:label_sort_higher)), {:action => 'move', :id => status, :position => 'higher'}, :method => :post, :title => l(:label_sort_higher) %> - + <%= link_to image_tag('1downarrow.png', :alt => l(:label_sort_lower)), {:action => 'move', :id => status, :position => 'lower'}, :method => :post, :title => l(:label_sort_lower) %> + <%= link_to image_tag('2downarrow.png', :alt => l(:label_sort_lowest)), {:action => 'move', :id => status, :position => 'lowest'}, :method => :post, :title => l(:label_sort_lowest) %> + <%= button_to l(:button_delete), { :action => 'destroy', :id => status }, :confirm => l(:text_are_you_sure), :class => "button-small" %> diff --git a/db/migrate/019_add_issue_status_position.rb b/db/migrate/019_add_issue_status_position.rb new file mode 100644 index 000000000..1c65e52e3 --- /dev/null +++ b/db/migrate/019_add_issue_status_position.rb @@ -0,0 +1,10 @@ +class AddIssueStatusPosition < ActiveRecord::Migration + def self.up + add_column :issue_statuses, :position, :integer, :default => 1, :null => false + IssueStatus.find(:all).each_with_index {|status, i| status.update_attribute(:position, i+1)} + end + + def self.down + remove_column :issue_statuses, :position + end +end diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 05aaa801d..34381a04a 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -11,6 +11,7 @@ http://redmine.rubyforge.org/ * settings are now stored in the database and editable through the application in: Admin -> Settings (config_custom.rb is no longer used) * mail notifications added when a document, a file or an attachment is added * tooltips added on Gantt chart and calender to view the details of the issues +* ability to set the sort order for issue statuses * added missing fields to csv export: priority, start date, due date, done ratio * all icons replaced (new icons are based on GPL icon set: "KDE Crystal Diamond 2.5" -by paolino- and "kNeu! Alpha v0.1" -by Pablo Fabregat-) * added back "fixed version" field on issue screen and in filters diff --git a/lang/de.yml b/lang/de.yml index f1cc3ba66..ffc1f7f74 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -309,6 +309,10 @@ label_latest_revision: Neueste Neuausgabe label_view_revisions: Die Neuausgaben ansehen label_max_size: Maximale Größe label_on: auf +label_sort_highest: Erste +label_sort_higher: Aufzurichten +label_sort_lower: Herabzusteigen +label_sort_lowest: Letzter button_login: Einloggen button_submit: Einreichen @@ -332,6 +336,7 @@ button_move: Bewegen button_back: Rückkehr button_cancel: Annullieren button_activate: Aktivieren +button_sort: Sortieren text_select_mail_notifications: Aktionen für die Mailbenachrichtigung aktiviert werden soll. text_regexp_info: eg. ^[A-Z0-9]+$ diff --git a/lang/en.yml b/lang/en.yml index 85df4e17c..824bb21ff 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -309,6 +309,10 @@ label_latest_revision: Latest revision label_view_revisions: View revisions label_max_size: Maximum size label_on: 'on' +label_sort_highest: Move to top +label_sort_higher: Move up +label_sort_lower: Move down +label_sort_lowest: Move to bottom button_login: Login button_submit: Submit @@ -332,6 +336,7 @@ button_move: Move button_back: Back button_cancel: Cancel button_activate: Activate +button_sort: Sort text_select_mail_notifications: Select actions for which mail notifications should be sent. text_regexp_info: eg. ^[A-Z0-9]+$ diff --git a/lang/es.yml b/lang/es.yml index cff537b09..ea07a50e1 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -309,6 +309,10 @@ label_latest_revision: La revisión más última label_view_revisions: Ver las revisiones label_max_size: Tamaño máximo label_on: en +label_sort_highest: Primero +label_sort_higher: Subir +label_sort_lower: Bajar +label_sort_lowest: Último button_login: Conexión button_submit: Someter @@ -332,6 +336,7 @@ button_move: Mover button_back: Atrás button_cancel: Cancelar button_activate: Activar +button_sort: Clasificar text_select_mail_notifications: Seleccionar las actividades que necesitan la activación de la notificación por mail. text_regexp_info: eg. ^[A-Z0-9]+$ diff --git a/lang/fr.yml b/lang/fr.yml index 2c34755f2..6925a7228 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -309,6 +309,10 @@ label_latest_revision: Dernière révision label_view_revisions: Voir les révisions label_max_size: Taille maximale label_on: sur +label_sort_highest: Remonter en premier +label_sort_higher: Remonter +label_sort_lower: Descendre +label_sort_lowest: Descendre en dernier button_login: Connexion button_submit: Soumettre @@ -332,6 +336,7 @@ button_move: Déplacer button_back: Retour button_cancel: Annuler button_activate: Activer +button_sort: Trier text_select_mail_notifications: Sélectionner les actions pour lesquelles la notification par mail doit être activée. text_regexp_info: ex. ^[A-Z0-9]+$ diff --git a/public/images/1downarrow.png b/public/images/1downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..caa1d2b1ea3df7ca194613eec21e63661f35684e GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(s`F=fm0BCmwH*h@`4}(L*>P0r?X4nPXmUjQdLMqNpOBz zNqJ&XDg#5sEp2`M>!;70*7Nhz@wj?g-;15W>;_weK=7#;plSwBS3j3^P64mU(T)a z?uQj(%c9as80X*R;n}oi6Hixs{SC_#F6XB|yYl5$>8k^pnT`*a>m0i;8TaOBvcmyS zHa12zxi)^C{4KdhoYIf4*uMI8*Ddb-zkWpgfAY1sy=CXk`$if6Q!DCax)~+6S4vn& z+>or>R5#I3^utU^wfjk`2Ungsa9Hnzg8l;4zpoD4UR_e7Shum60#&fb=t-)|68S=sXN_x$rbzl^@UOR`al&5!^4 zh3%|28O+%HrrrO)U;f_rtZO^p&QJgI|Larx!|U~Vc=qr6lm6p#>%@=8*T0Y7d1Gea z7anE?hW~F;z0EfUcml&ssVXF*Bsf2-qWVcw9ZL@5Rnw Xc7rWKAox@aP&I?6tDnm{r-UW|#lO7w literal 0 HcmV?d00001 diff --git a/public/images/2downarrow.png b/public/images/2downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..80d593268298749db5f33bce5c81982267528393 GIT binary patch literal 576 zcmV-G0>AxC?bMO7wh04;y<7`w2L7A0}i2Ee~g_vw1`86QoD*-41o?&=}_t*=MR!- z5}Hd$y&%9RM|nyC-G@GQ@Vm-l^u|KfbJanTO|qU(6cJGDvlh6_stth+zs z=^O&Kz*vjB<~UfnH!T2w&`xteBOyNa_Q~k8+3@ffvn?0Q^5EG#%E}E%pMLsQGwZ8j zpr`6*?g7H)gQ`x-uZ7;8oyGV@JS0Q_02*!JL-s|Hy2i_g6Ul0!aEp!rJyeVdZtwi} zUuo59+K6%qFv~-!md9!SNabB&;rgoZgAk&01W+`!D58<4BhMdA_b-Dn2G0e!IFFb( zKDAqWmHDaYT2vx`GrVu!P3Rz|NJ~Z~bzJ-MS#uP`rAZ_rlc?(zWaa(6LZhA<9O0>d zKmZ`^8zj~lf;2$$dj427OVdedc3jcQc%R!o%*tQ4h6Z^>uDCExI=s=>QW^-eKA4{I zcy3_jqh&fYbAGTE4h7}QTM9Y#j~=vZaUYNj5zSz0hS{*CK5|wpJ2=_wQaih=-vF2D?NY%?PN(TTo*alb-Q_5Tb O00008b1 literal 0 HcmV?d00001 diff --git a/public/images/2uparrow.png b/public/images/2uparrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e8931caa475566b11db3226a66cb7aa82c602f0a GIT binary patch literal 526 zcmV+p0`dKcP)RBxwMKf5#%n$I;tpgxn9C%PbHRGCyQORAQolp@kba5mAg z=