From f21bc2480b8e044f943b6560cee4009c29676cb6 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Tue, 3 Jun 2008 16:00:15 -0700 Subject: [PATCH] Added Ruby sorts on the virtual attributes. #1135 --- app/controllers/deliverables_controller.rb | 42 +++++++++++++++++----- app/views/deliverables/_list.html.erb | 7 ++-- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/app/controllers/deliverables_controller.rb b/app/controllers/deliverables_controller.rb index bb0d516..5a4a9fd 100644 --- a/app/controllers/deliverables_controller.rb +++ b/app/controllers/deliverables_controller.rb @@ -9,15 +9,12 @@ class DeliverablesController < ApplicationController def index sort_init "#{Deliverable.table_name}.id", "desc" sort_update - limit = per_page_option - @deliverable_count = Deliverable.count(:conditions => { :project_id => @project.id }) - @deliverable_pages = Paginator.new self, @deliverable_count, limit, params['page'] - @deliverables = Deliverable.find(:all, - :order => sort_clause, - :conditions => { :project_id => @project.id }, - :limit => limit, - :offset => @deliverable_pages.current.offset) + # TODO: pagination + @deliverables = Deliverable.find(:all, { :conditions => { :project_id => @project.id} }.merge(sort_stuff)) + + @deliverables = sort_if_needed @deliverables + @deliverable = Deliverable.new @budget = Budget.new(@project.id) @@ -114,4 +111,33 @@ class DeliverablesController < ApplicationController def get_settings @settings = Setting.plugin_budget_plugin end + + # Sorting limits + def sort_stuff + if %w(score spent progress).include?(session[@sort_name][:key]) + return { } + else + return { :limit => per_page_option, :order => sort_clause } + end + end + + # Sort +deliverables+ manually using the virtual fields + def sort_if_needed(deliverables) + if %w(score spent progress).include?(session[@sort_name][:key]) + case session[@sort_name][:key] + when "score": + sorted = deliverables.sort {|a,b| a.score <=> b.score} + when "spent": + sorted = deliverables.sort {|a,b| a.spent <=> b.spent} + when "progress": + sorted = deliverables.sort {|a,b| a.progress <=> b.progress} + end + + return sorted if session[@sort_name][:order] == 'asc' + return sorted.reverse! if session[@sort_name][:order] == 'desc' + else + return deliverables + end + end + end diff --git a/app/views/deliverables/_list.html.erb b/app/views/deliverables/_list.html.erb index df37540..7d32cb8 100644 --- a/app/views/deliverables/_list.html.erb +++ b/app/views/deliverables/_list.html.erb @@ -1,14 +1,13 @@ <% form_tag({}) do -%> - <%# TODO: Other sorts %> <%= sort_header_tag("#{Deliverable.table_name}.id", :caption => '#', :default_order => 'desc') %> - <%= content_tag('th', "Score") %> + <%= sort_header_tag("score", :caption => 'Score', :default_order => 'desc') %> <%= sort_header_tag("#{Deliverable.table_name}.subject", :caption => 'Subject') %> <%= sort_header_tag("#{Deliverable.table_name}.budget", :caption => 'Budget') %> - <%= content_tag('th', "Spent") %> + <%= sort_header_tag("spent", :caption => 'Spent') %> <%= sort_header_tag("#{Deliverable.table_name}.due_date", :caption => 'Due') %> - <%= content_tag('th', "Progress") %> + <%= sort_header_tag("progress", :caption => 'Progress') %> <%= content_tag('th', "Actions") %>