summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorEric Davis <edavis@littlestreamsoftware.com>2010-08-11 14:42:10 +0000
committerEric Davis <edavis@littlestreamsoftware.com>2010-08-11 14:42:10 +0000
commitff43bb1a74a7450dbcee2d8b0b152d2173a810e1 (patch)
treed0af815e4139ee61d415704b72461d131862e619 /app
parente43f9fc21edc0a7b3451f64204c3399eab359529 (diff)
downloadredmine-ff43bb1a74a7450dbcee2d8b0b152d2173a810e1.tar.gz
redmine-ff43bb1a74a7450dbcee2d8b0b152d2173a810e1.zip
Refactor: Extract a new IssueMovesController from IssuesController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3936 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app')
-rw-r--r--app/controllers/issue_moves_controller.rb94
-rw-r--r--app/controllers/issues_controller.rb58
-rw-r--r--app/helpers/issue_moves_helper.rb2
-rw-r--r--app/views/issue_moves/new.rhtml (renamed from app/views/issues/move.rhtml)4
-rw-r--r--app/views/issues/_action_menu.rhtml4
-rw-r--r--app/views/issues/context_menu.rhtml4
6 files changed, 102 insertions, 64 deletions
diff --git a/app/controllers/issue_moves_controller.rb b/app/controllers/issue_moves_controller.rb
new file mode 100644
index 000000000..1999930df
--- /dev/null
+++ b/app/controllers/issue_moves_controller.rb
@@ -0,0 +1,94 @@
+class IssueMovesController < ApplicationController
+ default_search_scope :issues
+ before_filter :find_issues
+ before_filter :authorize
+
+ def new
+ prepare_for_issue_move
+ render :layout => false if request.xhr?
+ end
+
+ def create
+ prepare_for_issue_move
+
+ if request.post?
+ new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
+ unsaved_issue_ids = []
+ moved_issues = []
+ @issues.each do |issue|
+ issue.reload
+ issue.init_journal(User.current)
+ call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
+ if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)})
+ moved_issues << r
+ else
+ unsaved_issue_ids << issue.id
+ end
+ end
+ set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
+
+ if params[:follow]
+ if @issues.size == 1 && moved_issues.size == 1
+ redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first
+ else
+ redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project)
+ end
+ else
+ redirect_to :controller => 'issues', :action => 'index', :project_id => @project
+ end
+ return
+ end
+ end
+
+ private
+
+ def prepare_for_issue_move
+ @issues.sort!
+ @copy = params[:copy_options] && params[:copy_options][:copy]
+ @allowed_projects = Issue.allowed_target_projects_on_move
+ @target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
+ @target_project ||= @project
+ @trackers = @target_project.trackers
+ @available_statuses = Workflow.available_statuses(@project)
+ end
+
+ # Filter for bulk operations
+ # TODO: duplicated in IssuesController
+ def find_issues
+ @issues = Issue.find_all_by_id(params[:id] || params[:ids])
+ raise ActiveRecord::RecordNotFound if @issues.empty?
+ projects = @issues.collect(&:project).compact.uniq
+ if projects.size == 1
+ @project = projects.first
+ else
+ # TODO: let users bulk edit/move/destroy issues from different projects
+ render_error 'Can not bulk edit/move/destroy issues from different projects'
+ return false
+ end
+ rescue ActiveRecord::RecordNotFound
+ render_404
+ end
+
+ # TODO: duplicated in IssuesController
+ def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids)
+ if unsaved_issue_ids.empty?
+ flash[:notice] = l(:notice_successful_update) unless issues.empty?
+ else
+ flash[:error] = l(:notice_failed_to_save_issues,
+ :count => unsaved_issue_ids.size,
+ :total => issues.size,
+ :ids => '#' + unsaved_issue_ids.join(', #'))
+ end
+ end
+
+ def extract_changed_attributes_for_move(params)
+ changed_attributes = {}
+ [:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
+ unless params[valid_attribute].blank?
+ changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
+ end
+ end
+ changed_attributes
+ end
+
+end
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index 46c61ea0f..50a6f08e7 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -249,44 +249,6 @@ class IssuesController < ApplicationController
@available_statuses = Workflow.available_statuses(@project)
@custom_fields = @project.all_issue_custom_fields
end
-
- def move
- prepare_for_issue_move
- render :layout => false if request.xhr?
- end
-
- # TODO: more descriptive name? move to separate controller like IssueMovesController?
- def perform_move
- prepare_for_issue_move
-
- if request.post?
- new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
- unsaved_issue_ids = []
- moved_issues = []
- @issues.each do |issue|
- issue.reload
- issue.init_journal(User.current)
- call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
- if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)})
- moved_issues << r
- else
- unsaved_issue_ids << issue.id
- end
- end
- set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
-
- if params[:follow]
- if @issues.size == 1 && moved_issues.size == 1
- redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first
- else
- redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project)
- end
- else
- redirect_to :controller => 'issues', :action => 'index', :project_id => @project
- end
- return
- end
- end
def destroy
@hours = TimeEntry.sum(:hours, :conditions => ['issue_id IN (?)', @issues]).to_f
@@ -462,16 +424,6 @@ private
@allowed_statuses = @issue.new_statuses_allowed_to(User.current, true)
end
- def prepare_for_issue_move
- @issues.sort!
- @copy = params[:copy_options] && params[:copy_options][:copy]
- @allowed_projects = Issue.allowed_target_projects_on_move
- @target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
- @target_project ||= @project
- @trackers = @target_project.trackers
- @available_statuses = Workflow.available_statuses(@project)
- end
-
def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids)
if unsaved_issue_ids.empty?
flash[:notice] = l(:notice_successful_update) unless issues.empty?
@@ -489,14 +441,4 @@ private
return false
end
end
-
- def extract_changed_attributes_for_move(params)
- changed_attributes = {}
- [:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
- unless params[valid_attribute].blank?
- changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
- end
- end
- changed_attributes
- end
end
diff --git a/app/helpers/issue_moves_helper.rb b/app/helpers/issue_moves_helper.rb
new file mode 100644
index 000000000..b58b4ce5a
--- /dev/null
+++ b/app/helpers/issue_moves_helper.rb
@@ -0,0 +1,2 @@
+module IssueMovesHelper
+end
diff --git a/app/views/issues/move.rhtml b/app/views/issue_moves/new.rhtml
index c216cba7c..2dc971df2 100644
--- a/app/views/issues/move.rhtml
+++ b/app/views/issue_moves/new.rhtml
@@ -6,14 +6,14 @@
<% end -%>
</ul>
-<% form_tag({:action => 'perform_move'}, :id => 'move_form') do %>
+<% form_tag({:action => 'create'}, :id => 'move_form') do %>
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
<div class="box tabular">
<p><label for="new_project_id"><%=l(:field_project)%>:</label>
<%= select_tag "new_project_id",
project_tree_options_for_select(@allowed_projects, :selected => @target_project),
- :onchange => remote_function(:url => { :action => 'move' },
+ :onchange => remote_function(:url => { :action => 'new' },
:method => :get,
:update => 'content',
:with => "Form.serialize('move_form')") %></p>
diff --git a/app/views/issues/_action_menu.rhtml b/app/views/issues/_action_menu.rhtml
index 693b49237..c5d17511a 100644
--- a/app/views/issues/_action_menu.rhtml
+++ b/app/views/issues/_action_menu.rhtml
@@ -4,7 +4,7 @@
<% replace_watcher ||= 'watcher' %>
<%= watcher_tag(@issue, User.current, {:id => replace_watcher, :replace => ['watcher','watcher2']}) %>
<%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %>
-<%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'move', :id => @issue, :copy_options => {:copy => 't'} }, :class => 'icon icon-copy' %>
-<%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %>
+<%= link_to_if_authorized l(:button_copy), new_issue_move_path(:id => @issue, :copy_options => {:copy => 't'}), :class => 'icon icon-copy' %>
+<%= link_to_if_authorized l(:button_move), new_issue_move_path(:id => @issue), :class => 'icon icon-move' %>
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
</div>
diff --git a/app/views/issues/context_menu.rhtml b/app/views/issues/context_menu.rhtml
index d9e92a4f8..dc11b5fdb 100644
--- a/app/views/issues/context_menu.rhtml
+++ b/app/views/issues/context_menu.rhtml
@@ -102,9 +102,9 @@
<li><%= context_menu_link l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue},
:class => 'icon-duplicate', :disabled => !@can[:copy] %></li>
<% end %>
- <li><%= context_menu_link l(:button_copy), {:controller => 'issues', :action => 'move', :ids => @issues.collect(&:id), :copy_options => {:copy => 't'}},
+ <li><%= context_menu_link l(:button_copy), new_issue_move_path(:ids => @issues.collect(&:id), :copy_options => {:copy => 't'}),
:class => 'icon-copy', :disabled => !@can[:move] %></li>
- <li><%= context_menu_link l(:button_move), {:controller => 'issues', :action => 'move', :ids => @issues.collect(&:id)},
+ <li><%= context_menu_link l(:button_move), new_issue_move_path(:ids => @issues.collect(&:id)),
:class => 'icon-move', :disabled => !@can[:move] %></li>
<li><%= context_menu_link l(:button_delete), {:controller => 'issues', :action => 'destroy', :ids => @issues.collect(&:id)},
:method => :post, :confirm => l(:text_issues_destroy_confirmation), :class => 'icon-del', :disabled => !@can[:delete] %></li>