From 0673d67b620f59c502aa3dbbf232c18274bcc199 Mon Sep 17 00:00:00 2001 From: Walter Cruz Date: Tue, 23 Sep 2008 11:53:11 -0300 Subject: [PATCH 1/6] Adding sort by number of open tasks on each project --- app/views/projects/actionize.js.rjs | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/views/projects/actionize.js.rjs diff --git a/app/views/projects/actionize.js.rjs b/app/views/projects/actionize.js.rjs new file mode 100644 index 00000000..ccb10451 --- /dev/null +++ b/app/views/projects/actionize.js.rjs @@ -0,0 +1,6 @@ +list_id = "list-#{@state}-projects" +page.replace_html list_id, + :partial => 'project_listing', + :collection => @projects +page.sortable list_id, get_listing_sortable_options(list_id) + \ No newline at end of file From ee5c730f44bc12e1d25ccd7b786e3018b84dee63 Mon Sep 17 00:00:00 2001 From: Walter Cruz Date: Tue, 23 Sep 2008 17:06:14 -0300 Subject: [PATCH 2/6] Ading a sort by number of tasks option --- app/controllers/projects_controller.rb | 7 +++++++ app/models/user.rb | 6 ++++++ app/views/projects/_project_state_group.rhtml | 14 +++++++++++++- config/routes.rb | 4 ++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index bf84e44d..ed2128de 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -186,6 +186,13 @@ class ProjectsController < ApplicationController init_not_done_counts(['project']) end + def actionize + @state = params['state'] + @projects = current_user.projects.actionize(:state => @state) if @state + @contexts = current_user.contexts + init_not_done_counts(['project']) + end + protected def render_projects_html diff --git a/app/models/user.rb b/app/models/user.rb index bf84bbd3..4b1f41e7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -51,6 +51,12 @@ class User < ActiveRecord::Base self.update_positions(projects.map{ |p| p.id }) return projects end + def actionize(scope_conditions = {}) + projects = find(:all, :conditions => scope_conditions) + projects.sort!{ |x,y| y.todos.count(:state == 'active') <=> x.todos.count(:state == 'active') } + self.update_positions(projects.map{ |p| p.id }) + return projects + end end has_many :active_projects, :class_name => 'Project', diff --git a/app/views/projects/_project_state_group.rhtml b/app/views/projects/_project_state_group.rhtml index 6fe6ef21..c4a0f0b1 100644 --- a/app/views/projects/_project_state_group.rhtml +++ b/app/views/projects/_project_state_group.rhtml @@ -11,9 +11,21 @@ end end %> + +
+ <%= link_to("Sort By number of tasks", actionize_projects_path(:state => state), + :class => "actionize_link", :title => "Sort these projects by number of tasks") %> + <% apply_behavior '.actionize_link:click', :prevent_default => true do |page, element| + page.confirming 'Are you sure that you want to sort these projects by the number of tasks? This will replace the existing sort order.' do + page << "tasksSort = this.up('.tasks_sort'); + tasksSort.startWaiting();" + page << remote_to_href(:complete => "tasksSort.stopWaiting()") + end + end + %>
<%= render :partial => 'project_listing', :collection => project_state_group %>
<%= sortable_element "list-#{state}-projects", get_listing_sortable_options("list-#{state}-projects") %> - \ No newline at end of file + diff --git a/config/routes.rb b/config/routes.rb index a4eb29e3..4c1e69a6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -28,6 +28,10 @@ ActionController::Routing::Routes.draw do |map| projects.resources :todos, :name_prefix => "project_" end + map.resources :projects, :collection => {:order => :post, :actionize => :post} do |projects| + projects.resources :todos, :name_prefix => "project_" + end + map.resources :todos, :member => {:toggle_check => :put, :toggle_star => :put}, :collection => {:check_deferred => :post, :filter_to_context => :post, :filter_to_project => :post} From e82be2e52214c90762f5d702f9361694afdc1262 Mon Sep 17 00:00:00 2001 From: waltercruz Date: Fri, 24 Oct 2008 10:25:04 -0200 Subject: [PATCH 3/6] Adding test to the sort by number of todos --- test/functional/projects_controller_test.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb index f97a892a..1b3fe5db 100644 --- a/test/functional/projects_controller_test.rb +++ b/test/functional/projects_controller_test.rb @@ -218,6 +218,15 @@ class ProjectsControllerTest < TodoContainerControllerTestBase get :index, { :format => "txt", :token => users(:admin_user).token } assert_response :ok end + + def test_actionize_sorts_active_projects_by_number_of_tasks + login_as :admin_user + u = users(:admin_user) + post :actionize, :state => "active", :format => 'js' + assert_equal 1, projects(:gardenclean).position + assert_equal 2, projects(:moremoney).position + assert_equal 3, projects(:timemachine).position + end def test_alphabetize_sorts_active_projects_alphabetically login_as :admin_user From 385f34d07110ca0876fa22b6650b5449bfd695ae Mon Sep 17 00:00:00 2001 From: waltercruz Date: Sat, 25 Oct 2008 17:43:52 -0200 Subject: [PATCH 4/6] Taking care of css --- app/views/projects/_project_state_group.rhtml | 8 ++++---- public/stylesheets/standard.css | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/views/projects/_project_state_group.rhtml b/app/views/projects/_project_state_group.rhtml index c4a0f0b1..e5393399 100644 --- a/app/views/projects/_project_state_group.rhtml +++ b/app/views/projects/_project_state_group.rhtml @@ -1,5 +1,6 @@
>

<%= project_state_group.length %><%= state.titlecase %> Projects

+
<%= render :partial => 'project_listing', :collection => project_state_group %> diff --git a/public/stylesheets/standard.css b/public/stylesheets/standard.css index 3b31fcd7..ea8f0dc5 100644 --- a/public/stylesheets/standard.css +++ b/public/stylesheets/standard.css @@ -692,11 +692,14 @@ div#list-active-projects, div#list-hidden-projects, div#list-completed-projects, margin:20px 0px 8px 13px } -div.alpha_sort { +div.menu_sort { margin-top:-20px; float:right; } +div.alpha_sort, div.tasks_sort,span.sort_separator { + float:left; +} .container td { border: none; From 0b57b23b2d1aec73003773152f38725d23fdb743 Mon Sep 17 00:00:00 2001 From: waltercruz Date: Tue, 28 Oct 2008 16:40:28 -0200 Subject: [PATCH 5/6] html fixes and sort by number of todos logic --- app/controllers/projects_controller.rb | 11 ++++++++++- app/models/user.rb | 5 ++--- app/views/projects/_project_state_group.rhtml | 6 +++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index ed2128de..cab0bd10 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -188,7 +188,16 @@ class ProjectsController < ApplicationController def actionize @state = params['state'] - @projects = current_user.projects.actionize(:state => @state) if @state + query_state = '' + query_state = 'AND project.state = "' + params['state'] +'" 'if @state + projects = Project.find_by_sql([ + "SELECT project.id, count(todo.id) as p_count " + + "FROM projects as project " + + "LEFT OUTER JOIN todos as todo ON todo.project_id = project.id "+ + "WHERE project.user_id = ? " + + query_state + + " GROUP BY project.id ORDER by p_count DESC",current_user.id]) + @projects = current_user.projects.actionize(projects,:state => @state) if @state @contexts = current_user.contexts init_not_done_counts(['project']) end diff --git a/app/models/user.rb b/app/models/user.rb index 4b1f41e7..59e3cdbc 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -51,10 +51,9 @@ class User < ActiveRecord::Base self.update_positions(projects.map{ |p| p.id }) return projects end - def actionize(scope_conditions = {}) + def actionize(proj,scope_conditions = {}) + self.update_positions(proj.map{ |p| p.id }) projects = find(:all, :conditions => scope_conditions) - projects.sort!{ |x,y| y.todos.count(:state == 'active') <=> x.todos.count(:state == 'active') } - self.update_positions(projects.map{ |p| p.id }) return projects end end diff --git a/app/views/projects/_project_state_group.rhtml b/app/views/projects/_project_state_group.rhtml index e5393399..32693f0f 100644 --- a/app/views/projects/_project_state_group.rhtml +++ b/app/views/projects/_project_state_group.rhtml @@ -1,8 +1,8 @@
>

<%= project_state_group.length %><%= state.titlecase %> Projects

-