##// END OF EJS Templates
Adds an helper to render other formats download links....
Adds an helper to render other formats download links. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2333 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r2322:2fc789704439
r2331:f1aa0df32666
Show More
sort_helper.rb
171 lines | 5.3 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Initial commit...
r2 # Helpers to sort tables using clickable column headers.
#
# Author: Stuart Rackham <srackham@methods.co.nz>, March 2005.
# License: This source code is released under the MIT license.
#
# - Consecutive clicks toggle the column's sort order.
# - Sort state is maintained by a session hash entry.
# - Icon image identifies sort column and state.
# - Typically used in conjunction with the Pagination module.
#
# Example code snippets:
#
# Controller:
#
# helper :sort
# include SortHelper
#
# def list
# sort_init 'last_name'
# sort_update
# @items = Contact.find_all nil, sort_clause
# end
#
# Controller (using Pagination module):
#
# helper :sort
# include SortHelper
#
# def list
# sort_init 'last_name'
# sort_update
# @contact_pages, @items = paginate :contacts,
# :order_by => sort_clause,
# :per_page => 10
# end
#
# View (table header in list.rhtml):
#
# <thead>
# <tr>
# <%= sort_header_tag('id', :title => 'Sort by contact ID') %>
# <%= sort_header_tag('last_name', :caption => 'Name') %>
# <%= sort_header_tag('phone') %>
# <%= sort_header_tag('address', :width => 200) %>
# </tr>
# </thead>
#
# - The ascending and descending sort icon images are sort_asc.png and
# sort_desc.png and reside in the application's images directory.
# - Introduces instance variables: @sort_name, @sort_default.
# - Introduces params :sort_key and :sort_order.
#
module SortHelper
# Initializes the default sort column (default_key) and sort order
# (default_order).
#
# - default_key is a column attribute name.
# - default_order is 'asc' or 'desc'.
# - name is the name of the session hash entry that stores the sort state,
# defaults to '<controller_name>_sort'.
#
def sort_init(default_key, default_order='asc', name=nil)
Jean-Philippe Lang
replaced deprecated controller instance variables: @params, @session, @request...
r124 @sort_name = name || params[:controller] + params[:action] + '_sort'
Jean-Philippe Lang
Initial commit...
r2 @sort_default = {:key => default_key, :order => default_order}
end
# Updates the sort state. Call this in the controller prior to calling
# sort_clause.
Jean-Philippe Lang
Validates sort_key and sort_order params (#2378)....
r2169 # 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}
Jean-Philippe Lang
replaced deprecated controller instance variables: @params, @session, @request...
r124 elsif session[@sort_name]
sort = session[@sort_name] # Previous sort.
Jean-Philippe Lang
Initial commit...
r2 else
sort = @sort_default
end
Jean-Philippe Lang
replaced deprecated controller instance variables: @params, @session, @request...
r124 session[@sort_name] = sort
Jean-Philippe Lang
Validates sort_key and sort_order params (#2378)....
r2169
sort_column = (sort_keys.is_a?(Hash) ? sort_keys[sort[:key]] : sort[:key])
Jean-Philippe Lang
Prevent SQL error with old sessions after r2171....
r2181 @sort_clause = (sort_column.blank? ? nil : "#{sort_column} #{sort[:order]}")
Jean-Philippe Lang
Initial commit...
r2 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()
Jean-Philippe Lang
Prevent SQL error with old sessions after r2171....
r2181 @sort_clause
Jean-Philippe Lang
Initial commit...
r2 end
# Returns a link which sorts by the named column.
#
# - column is the name of an attribute in the sorted record collection.
# - The optional caption explicitly specifies the displayed link text.
# - A sort icon image is positioned to the right of the sort link.
#
Jean-Philippe Lang
More appropriate default sort order on sortable columns....
r1107 def sort_link(column, caption, default_order)
Jean-Philippe Lang
replaced deprecated controller instance variables: @params, @session, @request...
r124 key, order = session[@sort_name][:key], session[@sort_name][:order]
Jean-Philippe Lang
Initial commit...
r2 if key == column
if order.downcase == 'asc'
Jean-Philippe Lang
* 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-)...
r154 icon = 'sort_asc.png'
Jean-Philippe Lang
Initial commit...
r2 order = 'desc'
else
Jean-Philippe Lang
* 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-)...
r154 icon = 'sort_desc.png'
Jean-Philippe Lang
Initial commit...
r2 order = 'asc'
end
else
icon = nil
Jean-Philippe Lang
More appropriate default sort order on sortable columns....
r1107 order = default_order
Jean-Philippe Lang
Initial commit...
r2 end
caption = titleize(Inflector::humanize(column)) unless caption
Jean-Philippe Lang
Quick fix for:...
r403
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159 sort_options = { :sort_key => column, :sort_order => order }
# don't reuse params if filters are present
url_options = params.has_key?(:set_filter) ? sort_options : params.merge(sort_options)
Jean-Philippe Lang
Quick fix for:...
r403
Eric Davis
Fixes Issue sorting in a project, broken by #2317...
r2322 # Add project_id to url_options
url_options = url_options.merge(:project_id => params[:project_id]) if params.has_key?(:project_id)
Jean-Philippe Lang
ajaxified paginators...
r31 link_to_remote(caption,
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 {:update => "content", :url => url_options, :method => :get},
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159 {:href => url_for(url_options)}) +
Jean-Philippe Lang
ajaxified paginators...
r31 (icon ? nbsp(2) + image_tag(icon) : '')
Jean-Philippe Lang
Initial commit...
r2 end
# Returns a table header <th> tag with a sort link for the named column
# attribute.
#
# Options:
# :caption The displayed link name (defaults to titleized column name).
# :title The tag's 'title' attribute (defaults to 'Sort by :caption').
#
# Other options hash entries generate additional table header tag attributes.
#
# Example:
#
# <%= sort_header_tag('id', :title => 'Sort by contact ID', :width => 40) %>
#
# Renders:
#
# <th title="Sort by contact ID" width="40">
# <a href="/contact/list?sort_order=desc&amp;sort_key=id">Id</a>
# &nbsp;&nbsp;<img alt="Sort_asc" src="/images/sort_asc.png" />
# </th>
#
def sort_header_tag(column, options = {})
Jean-Philippe Lang
Translated 'Sort by' label on table headers....
r615 caption = options.delete(:caption) || titleize(Inflector::humanize(column))
Jean-Philippe Lang
More appropriate default sort order on sortable columns....
r1107 default_order = options.delete(:default_order) || 'asc'
Jean-Philippe Lang
Added radio buttons on the documents list to sort documents by category, date, title or author....
r866 options[:title]= l(:label_sort_by, "\"#{caption}\"") unless options[:title]
Jean-Philippe Lang
More appropriate default sort order on sortable columns....
r1107 content_tag('th', sort_link(column, caption, default_order), options)
Jean-Philippe Lang
Initial commit...
r2 end
private
# Return n non-breaking spaces.
def nbsp(n)
'&nbsp;' * n
end
# Return capitalized title.
def titleize(title)
title.split.map {|w| w.capitalize }.join(' ')
end
end