diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb
index e002f3a27..11d05c7ce 100644
--- a/app/controllers/admin_controller.rb
+++ b/app/controllers/admin_controller.rb
@@ -28,7 +28,7 @@ class AdminController < ApplicationController
def projects
sort_init 'name', 'asc'
- sort_update
+ sort_update %w(name is_public created_on)
@status = params[:status] ? params[:status].to_i : 0
conditions = nil
diff --git a/app/controllers/boards_controller.rb b/app/controllers/boards_controller.rb
index 5bf4499bd..4ed6f98e9 100644
--- a/app/controllers/boards_controller.rb
+++ b/app/controllers/boards_controller.rb
@@ -36,8 +36,9 @@ class BoardsController < ApplicationController
end
def show
- sort_init "#{Message.table_name}.updated_on", "desc"
- sort_update
+ sort_init 'updated_on', 'desc'
+ sort_update 'created_on' => "#{Message.table_name}.created_on",
+ 'updated_on' => "#{Message.table_name}.updated_on"
@topic_count = @board.topics.count
@topic_pages = Paginator.new self, @topic_count, per_page_option, params['page']
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index 295ee6683..9d9efaa9a 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -45,9 +45,10 @@ class IssuesController < ApplicationController
include IssuesHelper
def index
- sort_init "#{Issue.table_name}.id", "desc"
- sort_update
retrieve_query
+ sort_init 'id', 'desc'
+ sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
+
if @query.valid?
limit = per_page_option
respond_to do |format|
@@ -78,9 +79,10 @@ class IssuesController < ApplicationController
end
def changes
- sort_init "#{Issue.table_name}.id", "desc"
- sort_update
retrieve_query
+ sort_init 'id', 'desc'
+ sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
+
if @query.valid?
@journals = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ],
:conditions => @query.statement,
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 34ce734a5..0bcd65ff5 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -204,8 +204,12 @@ class ProjectsController < ApplicationController
end
def list_files
- sort_init "#{Attachment.table_name}.filename", "asc"
- sort_update
+ sort_init 'filename', 'asc'
+ sort_update 'filename' => "#{Attachment.table_name}.filename",
+ 'created_on' => "#{Attachment.table_name}.created_on",
+ 'size' => "#{Attachment.table_name}.filesize",
+ 'downloads' => "#{Attachment.table_name}.downloads"
+
@versions = @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
render :layout => !request.xhr?
end
diff --git a/app/controllers/timelog_controller.rb b/app/controllers/timelog_controller.rb
index 49758fad2..2879523fb 100644
--- a/app/controllers/timelog_controller.rb
+++ b/app/controllers/timelog_controller.rb
@@ -129,7 +129,12 @@ class TimelogController < ApplicationController
def details
sort_init 'spent_on', 'desc'
- sort_update
+ sort_update 'spent_on' => 'spent_on',
+ 'user' => 'user_id',
+ 'activity' => 'activity_id',
+ 'project' => "#{Project.table_name}.name",
+ 'issue' => 'issue_id',
+ 'hours' => 'hours'
cond = ARCondition.new
cond << (@issue.nil? ? @project.project_condition(Setting.display_subprojects_issues?) :
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 48fc6fade..07829d112 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -31,7 +31,7 @@ class UsersController < ApplicationController
def list
sort_init 'login', 'asc'
- sort_update
+ sort_update %w(login firstname lastname mail admin created_on last_login_on)
@status = params[:status] ? params[:status].to_i : 1
conditions = "status <> 0"
diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb
index a58c5d0ea..3f9f94675 100644
--- a/app/helpers/queries_helper.rb
+++ b/app/helpers/queries_helper.rb
@@ -22,8 +22,8 @@ module QueriesHelper
end
def column_header(column)
- column.sortable ? sort_header_tag(column.sortable, :caption => column.caption,
- :default_order => column.default_order) :
+ column.sortable ? sort_header_tag(column.name.to_s, :caption => column.caption,
+ :default_order => column.default_order) :
content_tag('th', column.caption)
end
diff --git a/app/helpers/sort_helper.rb b/app/helpers/sort_helper.rb
index 9ca5c11bd..d0a292987 100644
--- a/app/helpers/sort_helper.rb
+++ b/app/helpers/sort_helper.rb
@@ -67,23 +67,31 @@ module SortHelper
# Updates the sort state. Call this in the controller prior to calling
# sort_clause.
- #
- def sort_update()
- if params[:sort_key]
- sort = {:key => params[:sort_key], :order => params[:sort_order]}
+ # sort_keys can be either an array or a hash of allowed keys
+ def sort_update(sort_keys)
+ sort_key = params[:sort_key]
+ sort_key = nil unless (sort_keys.is_a?(Array) ? sort_keys.include?(sort_key) : sort_keys[sort_key])
+
+ sort_order = (params[:sort_order] == 'desc' ? 'DESC' : 'ASC')
+
+ if sort_key
+ sort = {:key => sort_key, :order => sort_order}
elsif session[@sort_name]
sort = session[@sort_name] # Previous sort.
else
sort = @sort_default
end
session[@sort_name] = sort
+
+ sort_column = (sort_keys.is_a?(Hash) ? sort_keys[sort[:key]] : sort[:key])
+ @sort_clause = (sort_column.blank? ? '' : "#{sort_column} #{sort[:order]}")
end
# Returns an SQL sort clause corresponding to the current sort state.
# Use this to sort the controller's table items collection.
#
def sort_clause()
- session[@sort_name][:key] + ' ' + (session[@sort_name][:order] || 'ASC')
+ @sort_clause || '' #session[@sort_name][:key] + ' ' + (session[@sort_name][:order] || 'ASC')
end
# Returns a link which sorts by the named column.
diff --git a/app/views/boards/show.rhtml b/app/views/boards/show.rhtml
index 5b0c208a3..5b50b5539 100644
--- a/app/views/boards/show.rhtml
+++ b/app/views/boards/show.rhtml
@@ -32,9 +32,9 @@
<%= l(:field_subject) %>
<%= l(:field_author) %>
- <%= sort_header_tag("#{Message.table_name}.created_on", :caption => l(:field_created_on)) %>
+ <%= sort_header_tag('created_on', :caption => l(:field_created_on)) %>
<%= l(:label_reply_plural) %>
- <%= sort_header_tag("#{Message.table_name}.updated_on", :caption => l(:label_message_last)) %>
+ <%= sort_header_tag('updated_on', :caption => l(:label_message_last)) %>
| <%=l(:field_version)%> | - <%= sort_header_tag("#{Attachment.table_name}.filename", :caption => l(:field_filename)) %> - <%= sort_header_tag("#{Attachment.table_name}.created_on", :caption => l(:label_date), :default_order => 'desc') %> - <%= sort_header_tag("#{Attachment.table_name}.filesize", :caption => l(:field_filesize), :default_order => 'desc') %> - <%= sort_header_tag("#{Attachment.table_name}.downloads", :caption => l(:label_downloads_abbr), :default_order => 'desc') %> + <%= sort_header_tag('filename', :caption => l(:field_filename)) %> + <%= sort_header_tag('created_on', :caption => l(:label_date), :default_order => 'desc') %> + <%= sort_header_tag('size', :caption => l(:field_filesize), :default_order => 'desc') %> + <%= sort_header_tag('downloads', :caption => l(:label_downloads_abbr), :default_order => 'desc') %>MD5 | <% if delete_allowed %><% end %> |
|---|---|---|
| <%= l(:field_comments) %> | <%= sort_header_tag('hours', :caption => l(:field_hours)) %>diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index c4389fedd..2979a5bc8 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -124,6 +124,16 @@ class IssuesControllerTest < Test::Unit::TestCase assert_equal 'application/pdf', @response.content_type end + def test_index_sort + get :index, :sort_key => 'tracker' + assert_response :success + + sort_params = @request.session['issuesindex_sort'] + assert sort_params.is_a?(Hash) + assert_equal 'tracker', sort_params[:key] + assert_equal 'ASC', sort_params[:order] + end + def test_changes get :changes, :project_id => 1 assert_response :success |