From 1bada8f5a3656869e4e74202d3edfb915401da9b Mon Sep 17 00:00:00 2001 From: lukemelia Date: Wed, 28 Feb 2007 05:36:10 +0000 Subject: [PATCH] Introduced separation of projects by state (Active, Hidden, Completed) on the main Projects page. There are still some Ajax corner cases to work out, but it's perfectly usable. Closes #460. I also refactored change password code. git-svn-id: http://www.rousette.org.uk/svn/tracks-repos/trunk@464 a4c988fc-2ded-0310-b66e-134b36920a42 --- tracks/app/controllers/projects_controller.rb | 33 ++++++++--------- tracks/app/controllers/users_controller.rb | 25 ++++--------- tracks/app/helpers/projects_helper.rb | 16 ++++----- tracks/app/models/project.rb | 2 +- tracks/app/models/user.rb | 8 +++++ .../app/views/contexts/_context_listing.rhtml | 2 +- tracks/app/views/projects/_project_form.rhtml | 1 - .../app/views/projects/_project_listing.rhtml | 4 +-- .../views/projects/_project_state_group.rhtml | 7 ++++ tracks/app/views/projects/create.rjs | 4 +-- tracks/app/views/projects/index.rhtml | 13 +++---- tracks/app/views/projects/update.rjs | 14 ++++++-- tracks/db/schema.rb | 36 +++++++++---------- tracks/public/stylesheets/standard.css | 13 +++---- .../functional/projects_controller_test.rb | 4 +-- .../test/functional/users_controller_test.rb | 6 ++-- tracks/test/unit/user_test.rb | 8 +++++ 17 files changed, 103 insertions(+), 93 deletions(-) create mode 100644 tracks/app/views/projects/_project_state_group.rhtml diff --git a/tracks/app/controllers/projects_controller.rb b/tracks/app/controllers/projects_controller.rb index b73ddb57..9aa7de1b 100644 --- a/tracks/app/controllers/projects_controller.rb +++ b/tracks/app/controllers/projects_controller.rb @@ -65,6 +65,8 @@ class ProjectsController < ApplicationController def update params['project'] ||= {} if params['project']['state'] + @state_changed = @project.state != params['project']['state'] + logger.info "@state_changed: #{@project.state} == #{params['project']['state']} != #{@state_changed}" @project.transition_to(params['project']['state']) params['project'].delete('state') end @@ -81,6 +83,9 @@ class ProjectsController < ApplicationController else @project_not_done_counts[@project.id] = @project.reload().not_done_todo_count(:include_project_hidden_todos => true) end + @active_projects_count = @user.projects.count(:conditions => "state = 'active'") + @hidden_projects_count = @user.projects.count(:conditions => "state = 'hidden'") + @completed_projects_count = @user.projects.count(:conditions => "state = 'completed'") render elsif boolean_param('update_status') render :action => 'update_status' @@ -101,15 +106,13 @@ class ProjectsController < ApplicationController end end - # Methods for changing the sort order of the projects in the list - # def order - params["list-projects"].each_with_index do |id, position| - if check_user_matches_project_user(id) - Project.update(id, :position => position + 1) - end - end + project_ids = params["list-active-projects"] || params["list-hidden-projects"] || params["list-completed-projects"] + projects = @user.projects.update_positions( project_ids ) render :nothing => true + rescue + notify :error, $! + redirect_to :action => 'index' end protected @@ -118,6 +121,9 @@ class ProjectsController < ApplicationController lambda do init_project_hidden_todo_counts @page_title = "TRACKS::List Projects" + @active_projects = @projects.select{ |p| p.active? } + @hidden_projects = @projects.select{ |p| p.hidden? } + @completed_projects = @projects.select{ |p| p.completed? } render end end @@ -148,18 +154,7 @@ class ProjectsController < ApplicationController @project = @user.projects.find_by_params(params) render :text => 'Project not found', :status => 404 if @project.nil? end - - def check_user_matches_project_user(id) - @project = Project.find_by_id_and_user_id(id, @user.id) - if @user == @project.user - return @project - else - @project = nil - notify :warning, "Project and session user mis-match: #{@project.user_id} and #{@user.id}!" - render :text => '' - end - end - + def check_user_return_item item = Todo.find( params['id'] ) if @user == item.user diff --git a/tracks/app/controllers/users_controller.rb b/tracks/app/controllers/users_controller.rb index b6f0e625..da371e1d 100644 --- a/tracks/app/controllers/users_controller.rb +++ b/tracks/app/controllers/users_controller.rb @@ -138,12 +138,12 @@ class UsersController < ApplicationController end def update_password - if do_change_password_for(@user) - redirect_to :controller => 'preferences' - else - redirect_to :action => 'change_password' - notify :warning, "There was a problem saving the password. Please retry." - end + @user.change_password(params[:updateuser][:password], params[:updateuser][:password_confirmation]) + notify :notice, "Password updated." + redirect_to :controller => 'preferences' + rescue Exception => error + notify :error, error.message + redirect_to :action => 'change_password' end def change_auth_type @@ -224,19 +224,6 @@ class UsersController < ApplicationController redirect_to :controller => 'preferences', :action => 'index' end - protected - - def do_change_password_for(user) - user.change_password(params[:updateuser][:password], params[:updateuser][:password_confirmation]) - if user.save - notify :notice, "Password updated." - return true - else - notify :error, 'There was a problem saving the password. Please retry.' - return false - end - end - private def get_new_user diff --git a/tracks/app/helpers/projects_helper.rb b/tracks/app/helpers/projects_helper.rb index f91d8a61..e0d7f482 100644 --- a/tracks/app/helpers/projects_helper.rb +++ b/tracks/app/helpers/projects_helper.rb @@ -1,12 +1,12 @@ module ProjectsHelper -def get_listing_sortable_options - { - :tag => 'div', - :handle => 'handle', - :complete => visual_effect(:highlight, 'list-projects'), - :url => order_projects_path - } -end + def get_listing_sortable_options(list_container_id) + { + :tag => 'div', + :handle => 'handle', + :complete => visual_effect(:highlight, list_container_id), + :url => order_projects_path + } + end end diff --git a/tracks/app/models/project.rb b/tracks/app/models/project.rb index 5ea67b50..84022914 100644 --- a/tracks/app/models/project.rb +++ b/tracks/app/models/project.rb @@ -9,7 +9,7 @@ class Project < ActiveRecord::Base validates_does_not_contain :name, :string => '/', :message => "cannot contain the slash ('/') character" validates_does_not_contain :name, :string => ',', :message => "cannot contain the comma (',') character" - acts_as_list :scope => :user + acts_as_list :scope => 'user_id = #{user_id} AND state = \'#{state}\'' acts_as_state_machine :initial => :active, :column => 'state' extend NamePartFinder include Tracks::TodoList diff --git a/tracks/app/models/user.rb b/tracks/app/models/user.rb index 2ceccb2c..d884308f 100644 --- a/tracks/app/models/user.rb +++ b/tracks/app/models/user.rb @@ -30,6 +30,13 @@ class User < ActiveRecord::Base find_by_url_friendly_name(params['project']) end end + def update_positions(project_ids) + project_ids.each_with_index do |id, position| + project = self.detect { |p| p.id == id.to_i } + raise "Project id #{id} not associated with user id #{@user.id}." if project.nil? + project.update_attribute(:position, position + 1) + end + end end has_many :todos, :order => 'completed_at DESC, todos.created_at DESC', @@ -110,6 +117,7 @@ class User < ActiveRecord::Base def change_password(pass,pass_confirm) self.password = pass self.password_confirmation = pass_confirm + save! end def crypt_word diff --git a/tracks/app/views/contexts/_context_listing.rhtml b/tracks/app/views/contexts/_context_listing.rhtml index c824d14e..8af019ff 100644 --- a/tracks/app/views/contexts/_context_listing.rhtml +++ b/tracks/app/views/contexts/_context_listing.rhtml @@ -1,6 +1,6 @@ <% context = context_listing %>
" class="list"> -
+
DRAG
diff --git a/tracks/app/views/projects/_project_form.rhtml b/tracks/app/views/projects/_project_form.rhtml index 117b3435..f3917ee3 100644 --- a/tracks/app/views/projects/_project_form.rhtml +++ b/tracks/app/views/projects/_project_form.rhtml @@ -17,4 +17,3 @@ <% end %> -<% @project = nil %> \ No newline at end of file diff --git a/tracks/app/views/projects/_project_listing.rhtml b/tracks/app/views/projects/_project_listing.rhtml index fa9706ce..7a68955e 100644 --- a/tracks/app/views/projects/_project_listing.rhtml +++ b/tracks/app/views/projects/_project_listing.rhtml @@ -1,6 +1,6 @@ <% project = project_listing %>
" class="list"> -
+
DRAG
@@ -16,7 +16,7 @@ page << " evalScripts:true, method:'delete'}); };" end -%> <%= image_tag( "blank.png", :title => "Edit project", :class=>"edit_item") %> - <%= apply_behavior 'a.edit_project_button:click', :prevent_default => true do |page, element| + <%= apply_behavior 'a.edit_project_button:click', {:prevent_default => true, :external => true} do |page, element| element.up('.project').toggle editform = element.up('.list').down('.edit-form') editform.toggle diff --git a/tracks/app/views/projects/_project_state_group.rhtml b/tracks/app/views/projects/_project_state_group.rhtml new file mode 100644 index 00000000..e6d6b47f --- /dev/null +++ b/tracks/app/views/projects/_project_state_group.rhtml @@ -0,0 +1,7 @@ +
+

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

+
+ <%= 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/tracks/app/views/projects/create.rjs b/tracks/app/views/projects/create.rjs index 553695dc..eabeb9fd 100644 --- a/tracks/app/views/projects/create.rjs +++ b/tracks/app/views/projects/create.rjs @@ -1,6 +1,6 @@ if @saved - page.insert_html :bottom, "list-projects", :partial => 'project_listing', :locals => { :project_listing => @project } - page.sortable "list-projects", get_listing_sortable_options + page.insert_html :bottom, "list-active-projects", :partial => 'project_listing', :locals => { :project_listing => @project } + page.sortable "list-active-projects", get_listing_sortable_options('list-active-projects') page.call "Form.reset", "project-form" page.call "Form.focusFirstElement", "project-form" else diff --git a/tracks/app/views/projects/index.rhtml b/tracks/app/views/projects/index.rhtml index a32d5197..71e15689 100644 --- a/tracks/app/views/projects/index.rhtml +++ b/tracks/app/views/projects/index.rhtml @@ -1,17 +1,18 @@
-
- <%= render :partial => 'project_listing', :collection => @projects %> -
- <%= sortable_element 'list-projects', get_listing_sortable_options %> + <%= render :partial => 'project_state_group', :object => @active_projects, :locals => { :state => 'active'} %> + <%= render :partial => 'project_state_group', :object => @hidden_projects, :locals => { :state => 'hidden'} %> + <%= render :partial => 'project_state_group', :object => @completed_projects, :locals => { :state => 'completed'} %>
- Create new project » + <%= link_to_function("Create a new project »", + "Element.toggle('project_new');Form.focusFirstElement('project-form');", + {:title => "Add a next action", :accesskey => "n"}) %>