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:
@@ -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
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
<div id="rate_history">
|
||||
<h1><%= l(:rate_label_rate_history) %></h1>
|
||||
|
||||
<%= render :partial => 'list' %>
|
||||
<%= render :partial => 'list' %>
|
||||
</div>
|
||||
|
||||
@@ -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,6 +1,7 @@
|
||||
require 'redmine'
|
||||
|
||||
require 'rate_users_helper_patch'
|
||||
require 'rate_sort_helper_patch'
|
||||
|
||||
Redmine::Plugin.register :redmine_rate do
|
||||
name 'Rate Plugin'
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user