diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 9a3b8242..e3a8bcb4 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -105,7 +105,6 @@ class ProjectsController < ApplicationController
if params['project']['state']
@new_state = params['project']['state']
@state_changed = @project.state != @new_state
- logger.info "@state_changed: #{@project.state} == #{params['project']['state']} != #{@state_changed}"
params['project'].delete('state')
end
success_text = if params['field'] == 'name' && params['value']
@@ -113,7 +112,8 @@ class ProjectsController < ApplicationController
params['project']['name'] = params['value']
end
@project.attributes = params['project']
- if @project.save
+ @saved = @project.save
+ if @saved
@project.transition_to(@new_state) if @state_changed
if boolean_param('wants_render')
if (@project.hidden?)
@@ -149,8 +149,8 @@ class ProjectsController < ApplicationController
return
end
else
- notify :warning, "Couldn't update project"
- render :text => ''
+ init_data_for_sidebar
+ render :template => 'projects/update.js.rjs'
return
end
render :template => 'projects/update.js.rjs'
diff --git a/app/views/projects/_project_form.rhtml b/app/views/projects/_project_form.rhtml
index a2a386f5..f0338fdf 100644
--- a/app/views/projects/_project_form.rhtml
+++ b/app/views/projects/_project_form.rhtml
@@ -3,7 +3,7 @@ project = project_form
%>
<% form_remote_tag(:url => project_path(project), :html => { :id => dom_id(project, 'edit_form'), :class => "inline-form "+dom_id(project, 'edit_form')+"-edit-project-form", :method => :put }) do -%>
-
+
<%= error_messages_for("project") %>
<%= source_view_tag( @source_view ) -%>
diff --git a/app/views/projects/_project_listing.rhtml b/app/views/projects/_project_listing.rhtml
index bfc44ac9..8c35e941 100644
--- a/app/views/projects/_project_listing.rhtml
+++ b/app/views/projects/_project_listing.rhtml
@@ -27,7 +27,8 @@ suppress_edit_button ||= false
:method => 'get',
:with => "'_source_view=#{@source_view}'",
:before => "$('#{dom_id(project)}').block({message:null});",
- :complete => "$('#{dom_id(project)}').unblock();enable_rich_interaction();"
+ :complete => "$('#{dom_id(project)}').unblock();enable_rich_interaction();",
+ :html => {:id => "link_edit_#{dom_id(project)}"}
) %>
<% end -%>
diff --git a/app/views/projects/update.js.rjs b/app/views/projects/update.js.rjs
index 079b98ee..82ceea98 100644
--- a/app/views/projects/update.js.rjs
+++ b/app/views/projects/update.js.rjs
@@ -1,34 +1,39 @@
-status_message = 'Project saved'
-page.notify :notice, status_message, 5.0
-if source_view_is :project_list
- if @state_changed
- page[dom_id(@project, 'container')].remove
- page.insert_html :bottom, "list-#{@project.state}-projects", :partial => 'project_listing', :object => @project
+if @saved
+ status_message = 'Project saved'
+ page.notify :notice, status_message, 5.0
+ if source_view_is :project_list
+ if @state_changed
+ page[dom_id(@project, 'container')].remove
+ page.insert_html :bottom, "list-#{@project.state}-projects", :partial => 'project_listing', :object => @project
+ else
+ page.replace_html dom_id(@project, 'container'), :partial => 'project_listing', :object => @project
+ end
+ page.sortable "list-#{@project.state}-projects", get_listing_sortable_options("list-#{@project.state}-projects")
+ page.replace_html "active-projects-count", @active_projects_count
+ page.replace_html "hidden-projects-count", @hidden_projects_count
+ page.replace_html "completed-projects-count", @completed_projects_count
+
+ page.set_element_visible("list-hidden-projects-container", @hidden_projects_count > 0)
+ page.set_element_visible("list-active-projects-container", @active_projects_count > 0)
+ page.set_element_visible("list-completed-projects-container", @completed_projects_count > 0)
else
- page.replace_html dom_id(@project, 'container'), :partial => 'project_listing', :object => @project
+ page[dom_id(@project, 'edit')].hide
+ page.replace_html dom_id(@project, 'container'), :partial => 'project_settings', :locals => { :project => @project }
+ page[dom_id(@project)].show
+
+ page['todo_context_name'].value = @project.default_context.name if @project.default_context
+ page['#todo_project_name'].value = @project.name
+ page['tag_list'].value = @project.default_tags if @project.default_tags
+ page << "$('input[name=default_context_name]').val('#{@project.default_context.name}');" if @project.default_context
end
- page.sortable "list-#{@project.state}-projects", get_listing_sortable_options("list-#{@project.state}-projects")
- page.replace_html "active-projects-count", @active_projects_count
- page.replace_html "hidden-projects-count", @hidden_projects_count
- page.replace_html "completed-projects-count", @completed_projects_count
- page.set_element_visible("list-hidden-projects-container", @hidden_projects_count > 0)
- page.set_element_visible("list-active-projects-container", @active_projects_count > 0)
- page.set_element_visible("list-completed-projects-container", @completed_projects_count > 0)
+ page['default_project_name_id'].value = @project.name
+ page['todo_project_name'].value = @project.name
+ page.replace_html "project_name", @project.name
+
+ page.replace_html "sidebar", :file => 'sidebar/sidebar.html.erb'
else
- page[dom_id(@project, 'edit')].hide
- page.replace_html dom_id(@project, 'container'), :partial => 'project_settings', :locals => { :project => @project }
- page[dom_id(@project)].show
-
- page['todo_context_name'].value = @project.default_context.name if @project.default_context
- page['#todo_project_name'].value = @project.name
- page['tag_list'].value = @project.default_tags if @project.default_tags
- page << "$('input[name=default_context_name]').val('#{@project.default_context.name}');" if @project.default_context
+ page.show 'error_status'
+ page.replace_html 'error_status', "#{error_messages_for('project')}"
end
-
-page['default_project_name_id'].value = @project.name
-page['todo_project_name'].value = @project.name
-page.replace_html "project_name", @project.name
-
-page.replace_html "sidebar", :file => 'sidebar/sidebar.html.erb'
page << "enable_rich_interaction();"
diff --git a/features/manage_project.feature b/features/manage_project.feature
index 68de937b..58307109 100644
--- a/features/manage_project.feature
+++ b/features/manage_project.feature
@@ -34,3 +34,22 @@ Feature: Manage a project
When I visit the "bananas" project
And I edit the project name to "cherries"
Then the project title should be "cherries"
+
+ # Ticket #1042
+ @selenium
+ Scenario: I cannot change the name of a project in the project view to the name of another existing project
+ Given I have a project "test" with 1 todos
+ When I go to the projects page
+ Then the badge should show 2 # "manage me" and "test"
+ When I visit the "manage me" project
+ And I edit the project name to "test"
+ Then I should see "Name already exists"
+
+ # Ticket #1042
+ @selenium
+ Scenario: I cannot change the name of a project in the project list view to the name of another existing project
+ Given I have a project "test" with 1 todos
+ When I go to the projects page
+ Then the badge should show 2 # "manage me" and "test"
+ When I edit the project name of "manage me" to "test"
+ Then I should see "Name already exists"
\ No newline at end of file
diff --git a/features/step_definitions/project_steps.rb b/features/step_definitions/project_steps.rb
index 5adc0e9a..51112c4b 100644
--- a/features/step_definitions/project_steps.rb
+++ b/features/step_definitions/project_steps.rb
@@ -43,10 +43,20 @@ end
When /^I edit the project name to "([^\"]*)"$/ do |new_title|
click_link "link_edit_project_#{@project.id}"
fill_in "project[name]", :with => new_title
+
+ # changed to make sure selenium waits until the saving has a result either
+ # positive or negative. Was: :element=>"flash", :text=>"Project saved"
+ # we may need to change it back if you really need a positive outcome, i.e.
+ # this step needs to fail if the project was not saved succesfully
selenium.click "submit_project_#{@project.id}",
:wait_for => :text,
- :element => "flash",
- :text => "Project saved"
+ :text => /(Project saved|1 error prohibited this project from being saved)/
+end
+
+When /^I edit the project name of "([^"]*)" to "([^"]*)"$/ do |project_current_name, project_new_name|
+ @project = @current_user.projects.find_by_name(project_current_name)
+ @project.should_not be_nil
+ When "I edit the project name to \"#{project_new_name}\""
end
Then /^I should see the bold text "([^\"]*)" in the project description$/ do |bold|
@@ -69,4 +79,4 @@ end
Then /^the project title should be "(.*)"$/ do |title|
selenium.get_text("css=h2#project_name").should == title
-end
+end
\ No newline at end of file