Hacked some column sorting onto RatesController

* Added SortHelper to RatesController
* Init and updating the sorting (pre 0.8 sort_update)
* RatesController#index will only render the layout on non-xhr requests
* Changed Rate.history_for_user to take an order clause
* Added rate_sort_header_tag and rate_sort_link to the SortHelper in order
  to get the correct parameters for sorting Rates
* Added rate_sort_header_tags to the Rate lists

  #1915
This commit is contained in:
Eric Davis
2009-01-19 14:43:54 -08:00
parent 3f4ea96777
commit f870a6019e
8 changed files with 101 additions and 11 deletions
+8 -2
View File
@@ -1,5 +1,8 @@
class RatesController < ApplicationController
helper :users
helper :sort
include SortHelper
before_filter :require_admin
before_filter :require_user_id, :only => [:index, :new]
before_filter :set_back_url, :only => [:new, :edit]
@@ -7,10 +10,13 @@ class RatesController < ApplicationController
# GET /rates?user_id=1
# GET /rates.xml?user_id=1
def index
@rates = Rate.history_for_user(@user)
sort_init "#{Rate.table_name}.date_in_effect", "desc"
sort_update # 'date_in_effect' => "#{Rate.table_name}.date_in_effect"
@rates = Rate.history_for_user(@user, sort_clause)
respond_to do |format|
format.html # index.html.erb
format.html { render :action => 'index', :layout => !request.xhr?}
format.xml { render :xml => @rates }
end
end
+3 -3
View File
@@ -11,13 +11,13 @@ class Rate < ActiveRecord::Base
before_save :unlocked?
before_destroy :unlocked?
named_scope :history_for_user, lambda { |user|
named_scope :history_for_user, lambda { |user, order|
{
:conditions => { :user_id => user.id },
:order => 'date_in_effect DESC'
:order => order
}
}
def locked?
return self.time_entries.length > 0
end
+13 -2
View File
@@ -1,7 +1,18 @@
<table class="list">
<thead>
<th style="width:15%"><%= l(:label_date) %></th>
<th><%= l(:label_project) %></th>
<%= rate_sort_header_tag("date_in_effect",
:caption => l(:label_date),
:default_order => 'desc',
:style => "width: 15%",
:method => :get,
:update => "rate-history",
:user_id => @user.id) %>
<%= rate_sort_header_tag("project_id",
:caption => l(:label_project),
:default_order => 'asc',
:method => :get,
:update => "rate-history",
:user_id => @user.id) %>
<th style="width:15%"><%= l(:rate_label_rate) %></th>
<th style="width:5%"></th>
</thead>
+3 -1
View File
@@ -1,3 +1,5 @@
<div id="rate_history">
<h1><%= l(:rate_label_rate_history) %></h1>
<%= render :partial => 'list' %>
<%= render :partial => 'list' %>
</div>
+7 -1
View File
@@ -4,9 +4,15 @@
<% @back_url = url_for(:controller => 'users', :action => 'edit', :id => @user, :tab => 'rates') %>
<%= render :partial => 'rates/form' %>
<div id="rate_history">
<h1><%= l(:rate_label_rate_history) %></h1>
<%# TODO: Refactor out of the view once there is a hook in the controller (Post 0.8.0). %>
<%# Can't expect everyone to upgrade at the moment %>
<% @rates = Rate.history_for_user(@user) %>
<% sort_init "#{Rate.table_name}.date_in_effect", "desc" %>
<% sort_update # 'date_in_effect' => "#{Rate.table_name}.date_in_effect" %>
<% @rates = Rate.history_for_user(@user, "#{Rate.table_name}.date_in_effect desc") %>
<%= render :partial => 'rates/list' %>
</div>
+1
View File
@@ -1,6 +1,7 @@
require 'redmine'
require 'rate_users_helper_patch'
require 'rate_sort_helper_patch'
Redmine::Plugin.register :redmine_rate do
name 'Rate Plugin'
+63
View File
@@ -0,0 +1,63 @@
require_dependency 'sort_helper'
module RateSortHelperPatch
def self.included(base) # :nodoc:
base.send(:include, InstanceMethods)
end
module InstanceMethods
# Allows more parameters than the standard sort_header_tag
def rate_sort_header_tag(column, options = {})
caption = options.delete(:caption) || titleize(Inflector::humanize(column))
default_order = options.delete(:default_order) || 'asc'
options[:title]= l(:label_sort_by, "\"#{caption}\"") unless options[:title]
content_tag('th',
rate_sort_link(column,
caption,
default_order,
{ :method => options[:method], :update => options[:update], :user_id => options[:user_id] }),
options)
end
# Allows more parameters than the standard sort_link and is hard coded to use
# the RatesController
def rate_sort_link(column, caption, default_order, options = { })
key, order = session[@sort_name][:key], session[@sort_name][:order]
if key == column
if order.downcase == 'asc'
icon = 'sort_asc.png'
order = 'desc'
else
icon = 'sort_desc.png'
order = 'asc'
end
else
icon = nil
order = default_order
end
caption = titleize(Inflector::humanize(column)) unless caption
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)
# Hard code url to the Rates index
url_options[:controller] = 'rates'
url_options[:action] = 'index'
url_options[:user_id] ||= options[:user_id]
link_to_remote(caption,
{
:update => options[:update] || "content",
:url => url_options,
:method => options[:method] || :post
},
{:href => url_for(url_options)}) +
(icon ? nbsp(2) + image_tag(icon) : '')
end
end
end
SortHelper.send(:include, RateSortHelperPatch)
+3 -2
View File
@@ -160,10 +160,11 @@ describe RatesController, "as an administrator" do
describe "responding to GET index with user" do
before(:each) do
User.stub!(:find).with(@user.id.to_s).and_return(@user)
@default_sort = "#{Rate.table_name}.date_in_effect desc"
end
it "should expose all historic rates for the user as @rates" do
Rate.should_receive(:history_for_user).with(@user).and_return([mock_rate])
Rate.should_receive(:history_for_user).with(@user, @default_sort).and_return([mock_rate])
get :index, :user_id => @user.id
assigns[:rates].should == [mock_rate]
end
@@ -172,7 +173,7 @@ describe RatesController, "as an administrator" do
it "should render all rates as xml" do
request.env["HTTP_ACCEPT"] = "application/xml"
Rate.should_receive(:history_for_user).with(@user).and_return(rates = mock("Array of Rates"))
Rate.should_receive(:history_for_user).with(@user, @default_sort).and_return(rates = mock("Array of Rates"))
rates.should_receive(:to_xml).and_return("generated XML")
get :index, :user_id => @user.id
response.body.should == "generated XML"