From 10417aca203c5fca59c70c3f797a5421e90025c8 Mon Sep 17 00:00:00 2001 From: lukemelia Date: Wed, 21 Feb 2007 14:12:54 +0000 Subject: [PATCH] Improve and clean up the Ajax interactions involved in deleting projects and contexts from their listing pages. git-svn-id: http://www.rousette.org.uk/svn/tracks-repos/trunk@449 a4c988fc-2ded-0310-b66e-134b36920a42 --- tracks/app/controllers/contexts_controller.rb | 12 +++--- tracks/app/controllers/projects_controller.rb | 17 +++------ .../app/views/contexts/_context_listing.rhtml | 8 ++-- tracks/app/views/contexts/destroy.rjs | 5 +++ .../app/views/projects/_project_listing.rhtml | 38 ++++++++++++------- tracks/app/views/projects/destroy.rjs | 5 +++ .../context_listing/edit_then_delete.rsel | 15 ++++++++ .../project_listing/edit_then_delete.rsel | 15 ++++++++ .../selenium/project_listing/edit_twice.rsel | 19 ++++++++++ 9 files changed, 97 insertions(+), 37 deletions(-) create mode 100644 tracks/app/views/contexts/destroy.rjs create mode 100644 tracks/app/views/projects/destroy.rjs create mode 100644 tracks/test/selenium/context_listing/edit_then_delete.rsel create mode 100644 tracks/test/selenium/project_listing/edit_then_delete.rsel create mode 100644 tracks/test/selenium/project_listing/edit_twice.rsel diff --git a/tracks/app/controllers/contexts_controller.rb b/tracks/app/controllers/contexts_controller.rb index efb3e297..9f5dd721 100644 --- a/tracks/app/controllers/contexts_controller.rb +++ b/tracks/app/controllers/contexts_controller.rb @@ -4,6 +4,7 @@ class ContextsController < ApplicationController before_filter :init, :except => [:create, :destroy, :order] before_filter :init_todos, :only => :show + before_filter :check_user_set_context, :only => [:update, :destroy] skip_before_filter :login_required, :only => [:index] prepend_before_filter :login_or_feed_token_required, :only => [:index] session :off, :only => :index, :if => Proc.new { |req| ['rss','atom','txt'].include?(req.parameters[:format]) } @@ -69,7 +70,6 @@ class ContextsController < ApplicationController # Edit the details of the context # def update - check_user_set_context params['context'] ||= {} success_text = if params['field'] == 'name' && params['value'] params['context']['id'] = params['id'] @@ -92,12 +92,10 @@ class ContextsController < ApplicationController # If the context contains actions, you'll get a warning dialogue. # If you choose to go ahead, any actions in the context will also be deleted. def destroy - check_user_set_context - if @context.destroy - render_text "" - else - notify :warning, "Couldn't delete context \"#{@context.name}\"" - redirect_to :action => 'index' + @context.destroy + respond_to do |format| + format.js + format.xml { render :text => "Deleted context #{@context.name}" } end end diff --git a/tracks/app/controllers/projects_controller.rb b/tracks/app/controllers/projects_controller.rb index 4d4bbd80..43c3ef60 100644 --- a/tracks/app/controllers/projects_controller.rb +++ b/tracks/app/controllers/projects_controller.rb @@ -2,6 +2,7 @@ class ProjectsController < ApplicationController helper :application, :todos, :notes before_filter :init, :except => [:create, :destroy, :order] + before_filter :check_user_set_project, :only => [:update, :destroy, :show] skip_before_filter :login_required, :only => [:index] prepend_before_filter :login_or_feed_token_required, :only => [:index] session :off, :only => :index, :if => Proc.new { |req| ['rss','atom','txt'].include?(req.parameters[:format]) } @@ -30,7 +31,6 @@ class ProjectsController < ApplicationController end def show - check_user_set_project @page_title = "TRACKS::Project: #{@project.name}" @not_done = @project.not_done_todos(:include_project_hidden_todos => true) @deferred = @project.deferred_todos @@ -73,7 +73,6 @@ class ProjectsController < ApplicationController # Edit the details of the project # def update - check_user_set_project params['project'] ||= {} if params['project']['state'] @project.transition_to(params['project']['state']) @@ -104,18 +103,14 @@ class ProjectsController < ApplicationController end end - # Delete a project - # def destroy - check_user_set_project - if @project.destroy - render :text => '' - else - notify :warning, "Couldn't delete project \"#{@project.name}\"" - redirect_to :action => 'index' + @project.destroy + respond_to do |format| + format.js + format.xml { render :text => "Deleted project #{@project.name}" } end end - + # Methods for changing the sort order of the projects in the list # def order diff --git a/tracks/app/views/contexts/_context_listing.rhtml b/tracks/app/views/contexts/_context_listing.rhtml index 41dd4d4b..099d034c 100644 --- a/tracks/app/views/contexts/_context_listing.rhtml +++ b/tracks/app/views/contexts/_context_listing.rhtml @@ -15,12 +15,10 @@ VISIBLE <% end %> <%= image_tag( "blank.png", :title => "Delete context", :class=>"delete_item") %> - <%= apply_behavior "a.delete_context_button:click", :prevent_default => true do |page| + <%= apply_behavior "a.delete_context_button:click", { :prevent_default => true, :external => true} do |page| page << "if (confirm('Are you sure that you want to ' + this.title + '?')) {" - page << " new Ajax.Updater(this.up('.list')," - page << " this.href, {asynchronous:true," - page << " evalScripts:true, method:'delete'," - page << " onLoading:function(request){ Effect.Fade(this.up('.list'));}}); };" + page << " new Ajax.Request(this.href, {asynchronous:true," + page << " evalScripts:true, method:'delete'}); };" end -%> <%= image_tag( "blank.png", :title => "Edit context", :class=>"edit_item") %> <%= apply_behavior 'a.edit_context_button:click', :prevent_default => true do |page, element| diff --git a/tracks/app/views/contexts/destroy.rjs b/tracks/app/views/contexts/destroy.rjs new file mode 100644 index 00000000..fddfde29 --- /dev/null +++ b/tracks/app/views/contexts/destroy.rjs @@ -0,0 +1,5 @@ +page.visual_effect :fade, dom_id(@context, "container"), :duration => 0.5 +page.delay(0.5) do + page[dom_id(@context, "container")].remove +end +page.notify :notice, "Deleted context '#{@context.name}'", 5.0 diff --git a/tracks/app/views/projects/_project_listing.rhtml b/tracks/app/views/projects/_project_listing.rhtml index 74055619..bacb3f0b 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
@@ -9,30 +9,40 @@
<%= project.current_state.to_s.upcase %> - <%= link_to_remote( image_tag("blank.png", :title =>"Delete project", :class=>"delete_item"), - :update => dom_id(project, "container"), - :loading => visual_effect(:fade, dom_id(project, "container")), - :url => project_path(project), - :method => :delete, - :confirm => "Are you sure that you want to delete the project \'#{project.name}\'?" ) %> - <%= link_to_function( image_tag("blank.png", :title => "Edit item", :class=>"edit_item"), - "Element.toggle('#{dom_id(project)}'); Element.toggle('#{dom_id(project, 'edit')}'); new Effect.Appear('#{dom_id(project, 'edit')}'); Form.focusFirstElement('#{dom_id(project, "edit_form")}');" ) %> + <%= image_tag( "blank.png", :title => "Delete project", :class=>"delete_item") %> + <%= apply_behavior "a.delete_project_button:click", { :prevent_default => true, :external => true} do |page| + page << "if (confirm('Are you sure that you want to ' + this.title + '?')) {" + page << " new Ajax.Request(this.href, {asynchronous:true," + 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| + element.up('.project').toggle + editform = element.up('.list').down('.edit-form') + editform.toggle + editform.visual_effect(:appear) + editform.down('input').focus + end + -%>
<% if controller.action_name == 'create' %> diff --git a/tracks/app/views/projects/destroy.rjs b/tracks/app/views/projects/destroy.rjs new file mode 100644 index 00000000..ccf0d531 --- /dev/null +++ b/tracks/app/views/projects/destroy.rjs @@ -0,0 +1,5 @@ +page.visual_effect :fade, dom_id(@project, "container"), :duration => 0.5 +page.delay(0.5) do + page[dom_id(@project, "container")].remove +end +page.notify :notice, "Deleted project '#{@project.name}'", 5.0 diff --git a/tracks/test/selenium/context_listing/edit_then_delete.rsel b/tracks/test/selenium/context_listing/edit_then_delete.rsel new file mode 100644 index 00000000..1e846f7d --- /dev/null +++ b/tracks/test/selenium/context_listing/edit_then_delete.rsel @@ -0,0 +1,15 @@ +setup :fixtures => :all +include_partial 'login/login', :username => 'admin', :password => 'abracadabra' +open "/contexts" +click "css=#context_3 .buttons img.edit_item" +wait_for_visible "edit_context_3" +wait_for_not_visible "context_3" +type "//div[@id='edit_context_3'] //input[@name='context[name]']", "telegraph" +click "//div[@id='edit_context_3'] //input[@value='Update']" +wait_for_not_visible "edit_context_3" +wait_for_visible "context_3" +click "css=#context_3 .buttons img.delete_item" +assert_confirmation "Are you sure that you want to delete the context 'telegraph'?" +wait_for_visible "flash" +assert_text "flash", "Deleted context 'telegraph'" +assert_element_not_present "context_3" \ No newline at end of file diff --git a/tracks/test/selenium/project_listing/edit_then_delete.rsel b/tracks/test/selenium/project_listing/edit_then_delete.rsel new file mode 100644 index 00000000..a2549d16 --- /dev/null +++ b/tracks/test/selenium/project_listing/edit_then_delete.rsel @@ -0,0 +1,15 @@ +setup :fixtures => :all +include_partial 'login/login', :username => 'admin', :password => 'abracadabra' +open "/projects" +click "css=#project_2 .buttons img.edit_item" +wait_for_visible "edit_project_2" +wait_for_not_visible "project_2" +type "//div[@id='edit_project_2'] //input[@name='project[name]']", "become a billionaire" +click "//div[@id='edit_project_2'] //input[@value='Update']" +wait_for_not_visible "edit_project_2" +wait_for_visible "project_2" +click "css=#project_2 .buttons img.delete_item" +assert_confirmation "Are you sure that you want to delete the project 'become a billionaire'?" +wait_for_visible "flash" +assert_text "flash", "Deleted project 'become a billionaire'" +wait_for_element_not_present "project_2" \ No newline at end of file diff --git a/tracks/test/selenium/project_listing/edit_twice.rsel b/tracks/test/selenium/project_listing/edit_twice.rsel new file mode 100644 index 00000000..2b4a2b36 --- /dev/null +++ b/tracks/test/selenium/project_listing/edit_twice.rsel @@ -0,0 +1,19 @@ +setup :fixtures => :all +include_partial 'login/login', :username => 'admin', :password => 'abracadabra' +open "/projects" +click "css=#project_2 .buttons img.edit_item" +wait_for_visible "edit_project_2" +wait_for_not_visible "project_2" +type "//div[@id='edit_project_2'] //input[@name='project[name]']", "become a billionaire" +click "//div[@id='edit_project_2'] //input[@value='Update']" +wait_for_not_visible "edit_project_2" +wait_for_visible "project_2" +assert_text 'css=#project_2 .data a', 'become a billionaire' +click "css=#project_2 .buttons img.edit_item" +wait_for_visible "edit_project_2" +wait_for_not_visible "project_2" +type "//div[@id='edit_project_2'] //input[@name='project[name]']", "become a multi-millionaire" +click "//div[@id='edit_project_2'] //input[@value='Update']" +wait_for_not_visible "edit_project_2" +wait_for_visible "project_2" +assert_text 'css=#project_2 .data a', 'become a multi-millionaire' \ No newline at end of file