diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index bf84e44d..b2489c7d 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(current_user.id, :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..75aeb36d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -51,6 +51,21 @@ class User < ActiveRecord::Base self.update_positions(projects.map{ |p| p.id }) return projects end + def actionize(user_id, scope_conditions = {}) + @state = scope_conditions[:state] + query_state = '' + query_state = 'AND project.state = "' + @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 = ? AND NOT todo.state='completed' " + + query_state + + " GROUP BY project.id ORDER by p_count DESC",user_id]) + self.update_positions(projects.map{ |p| p.id }) + projects = find(:all, :conditions => scope_conditions) + 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..32693f0f 100644 --- a/app/views/projects/_project_state_group.rhtml +++ b/app/views/projects/_project_state_group.rhtml @@ -1,7 +1,8 @@
\ No newline at end of file + 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 diff --git a/config/routes.rb b/config/routes.rb index 50e29ff7..1b8bf1c3 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} 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; diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb index f97a892a..ee3df3e4 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(:timemachine).position + assert_equal 3, projects(:moremoney).position + end def test_alphabetize_sorts_active_projects_alphabetically login_as :admin_user