]> source.dussan.org Git - redmine.git/commitdiff
One-click bulk edition using the issue list context menu within the same project...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 26 Aug 2008 10:34:26 +0000 (10:34 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 26 Aug 2008 10:34:26 +0000 (10:34 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1765 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/issues_controller.rb
app/views/issues/context_menu.rhtml
test/functional/issues_controller_test.rb

index 6e2de17c94afc9cffc2d34c77f7ddb3b0eba5386..3f7723226be6860b96c0963713f4a6c5a5cb2490 100644 (file)
@@ -247,7 +247,7 @@ class IssuesController < ApplicationController
       else
         flash[:error] = l(:notice_failed_to_save_issues, unsaved_issue_ids.size, @issues.size, '#' + unsaved_issue_ids.join(', #'))
       end
-      redirect_to :controller => 'issues', :action => 'index', :project_id => @project
+      redirect_to(params[:back_to] || {:controller => 'issues', :action => 'index', :project_id => @project})
       return
     end
     # Find potential statuses the user could be allowed to switch issues to
@@ -326,20 +326,22 @@ class IssuesController < ApplicationController
     if (@issues.size == 1)
       @issue = @issues.first
       @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
-      @assignables = @issue.assignable_users
-      @assignables << @issue.assigned_to if @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
     end
     projects = @issues.collect(&:project).compact.uniq
     @project = projects.first if projects.size == 1
 
     @can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
             :log_time => (@project && User.current.allowed_to?(:log_time, @project)),
-            :update => (@issue && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && !@allowed_statuses.empty?))),
+            :update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
             :move => (@project && User.current.allowed_to?(:move_issues, @project)),
             :copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
             :delete => (@project && User.current.allowed_to?(:delete_issues, @project))
             }
-
+    if @project
+      @assignables = @project.assignable_users
+      @assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
+    end
+    
     @priorities = Enumeration.get_values('IPRI').reverse
     @statuses = IssueStatus.find(:all, :order => 'position')
     @back = request.env['HTTP_REFERER']
index 0cdcd47333ea4a5c479eb4d6b62021ba16b947c1..671655db765557d6efcc7d7d982b7bdb1346c2f4 100644 (file)
                <% end -%>
                </ul>
        </li>
+<% else %>
+       <li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id)},
+               :class => 'icon-edit', :disabled => !@can[:edit] %></li>
+<% end %>
+
        <li class="folder">                     
                <a href="#" class="submenu"><%= l(:field_priority) %></a>
                <ul>
                <% @priorities.each do |p| -%>
-                   <li><%= context_menu_link p.name, {:controller => 'issues', :action => 'edit', :id => @issue, 'issue[priority_id]' => p, :back_to => @back}, :method => :post,
-                                             :selected => (p == @issue.priority), :disabled => !@can[:edit] %></li>
+                   <li><%= context_menu_link p.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'priority_id' => p, :back_to => @back}, :method => :post,
+                                             :selected => (@issue && p == @issue.priority), :disabled => !@can[:edit] %></li>
                <% end -%>
                </ul>
        </li>
-       <% unless @project.versions.empty? -%>
+       <% unless @project.nil? || @project.versions.empty? -%>
        <li class="folder">                     
                <a href="#" class="submenu"><%= l(:field_fixed_version) %></a>
                <ul>
                <% @project.versions.sort.each do |v| -%>
-                   <li><%= context_menu_link v.name, {:controller => 'issues', :action => 'edit', :id => @issue, 'issue[fixed_version_id]' => v, :back_to => @back}, :method => :post,
-                                             :selected => (v == @issue.fixed_version), :disabled => !@can[:update] %></li>
+                   <li><%= context_menu_link v.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'fixed_version_id' => v, :back_to => @back}, :method => :post,
+                                             :selected => (@issue && v == @issue.fixed_version), :disabled => !@can[:update] %></li>
                <% end -%>
-                   <li><%= context_menu_link l(:label_none), {:controller => 'issues', :action => 'edit', :id => @issue, 'issue[fixed_version_id]' => '', :back_to => @back}, :method => :post,
-                                             :selected => @issue.fixed_version.nil?, :disabled => !@can[:update] %></li>
+                   <li><%= context_menu_link l(:label_none), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'fixed_version_id' => 'none', :back_to => @back}, :method => :post,
+                                             :selected => (@issue && @issue.fixed_version.nil?), :disabled => !@can[:update] %></li>
                </ul>
        </li>
        <% end %>
+       <% unless @assignables.nil? || @assignables.empty? -%>
        <li class="folder">                     
                <a href="#" class="submenu"><%= l(:field_assigned_to) %></a>
                <ul>
                <% @assignables.each do |u| -%>
-                   <li><%= context_menu_link u.name, {:controller => 'issues', :action => 'edit', :id => @issue, 'issue[assigned_to_id]' => u, :back_to => @back}, :method => :post,
-                                             :selected => (u == @issue.assigned_to), :disabled => !@can[:update] %></li>
+                   <li><%= context_menu_link u.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'assigned_to_id' => u, :back_to => @back}, :method => :post,
+                                             :selected => (@issue && u == @issue.assigned_to), :disabled => !@can[:update] %></li>
                <% end -%>
-                   <li><%= context_menu_link l(:label_nobody), {:controller => 'issues', :action => 'edit', :id => @issue, 'issue[assigned_to_id]' => '', :back_to => @back}, :method => :post,
-                                             :selected => @issue.assigned_to.nil?, :disabled => !@can[:update] %></li>
+                   <li><%= context_menu_link l(:label_nobody), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'assigned_to_id' => 'none', :back_to => @back}, :method => :post,
+                                             :selected => (@issue && @issue.assigned_to.nil?), :disabled => !@can[:update] %></li>
                </ul>
        </li>
-       <% unless @project.issue_categories.empty? -%>
+       <% end %>
+       <% unless @project.nil? || @project.issue_categories.empty? -%>
        <li class="folder">                     
                <a href="#" class="submenu"><%= l(:field_category) %></a>
                <ul>
                <% @project.issue_categories.each do |u| -%>
-                   <li><%= context_menu_link u.name, {:controller => 'issues', :action => 'edit', :id => @issue, 'issue[category_id]' => u, :back_to => @back}, :method => :post,
-                                             :selected => (u == @issue.category), :disabled => !@can[:update] %></li>
+                   <li><%= context_menu_link u.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'category_id' => u, :back_to => @back}, :method => :post,
+                                             :selected => (@issue && u == @issue.category), :disabled => !@can[:update] %></li>
                <% end -%>
-                   <li><%= context_menu_link l(:label_none), {:controller => 'issues', :action => 'edit', :id => @issue, 'issue[category_id]' => '', :back_to => @back}, :method => :post,
-                                             :selected => @issue.category.nil?, :disabled => !@can[:update] %></li>
+                   <li><%= context_menu_link l(:label_none), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'category_id' => 'none', :back_to => @back}, :method => :post,
+                                             :selected => (@issue && @issue.category.nil?), :disabled => !@can[:update] %></li>
                </ul>
        </li>
        <% end -%>
                <a href="#" class="submenu"><%= l(:field_done_ratio) %></a>
                <ul>
                <% (0..10).map{|x|x*10}.each do |p| -%>
-                   <li><%= context_menu_link "#{p}%", {:controller => 'issues', :action => 'edit', :id => @issue, 'issue[done_ratio]' => p, :back_to => @back}, :method => :post,
-                                                 :selected => (p == @issue.done_ratio), :disabled => !@can[:edit] %></li>
+                   <li><%= context_menu_link "#{p}%", {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'done_ratio' => p, :back_to => @back}, :method => :post,
+                                                 :selected => (@issue && p == @issue.done_ratio), :disabled => !@can[:edit] %></li>
                <% end -%>
                </ul>
        </li>
+       
+<% if !@issue.nil? %>
+       <li><%= context_menu_link l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue},
+               :class => 'icon-copy', :disabled => !@can[:copy] %></li>
        <% if @can[:log_time] -%>
        <li><%= context_menu_link l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue},
                :class => 'icon-time' %></li>
        <% end %>
-       <li><%= context_menu_link l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue},
-               :class => 'icon-copy', :disabled => !@can[:copy] %></li>
-<% else -%>
-       <li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id)},
-               :class => 'icon-edit', :disabled => !@can[:edit] %></li>
-<% end -%>
-  
+<% end %>
+
   <li><%= context_menu_link l(:button_move), {:controller => 'issues', :action => 'move', :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)},
index 005542f81361ff302746cd5f6330a671570ac7a1..a248d8bde61fcd43e96fe9f66b56a6186e49f2ba 100644 (file)
@@ -532,10 +532,10 @@ class IssuesControllerTest < Test::Unit::TestCase
                             :attributes => { :href => '/issues/edit/1?issue%5Bstatus_id%5D=5',
                                              :class => '' }
     assert_tag :tag => 'a', :content => 'Immediate',
-                            :attributes => { :href => '/issues/edit/1?issue%5Bpriority_id%5D=8',
+                            :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;priority_id=8',
                                              :class => '' }
     assert_tag :tag => 'a', :content => 'Dave Lopper',
-                            :attributes => { :href => '/issues/edit/1?issue%5Bassigned_to_id%5D=3',
+                            :attributes => { :href => '/issues/bulk_edit?assigned_to_id=3&amp;ids%5B%5D=1',
                                              :class => '' }
     assert_tag :tag => 'a', :content => 'Copy',
                             :attributes => { :href => '/projects/ecookbook/issues/new?copy_from=1',
@@ -565,6 +565,12 @@ class IssuesControllerTest < Test::Unit::TestCase
     assert_tag :tag => 'a', :content => 'Edit',
                             :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2',
                                              :class => 'icon-edit' }
+    assert_tag :tag => 'a', :content => 'Immediate',
+                            :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2&amp;priority_id=8',
+                                             :class => '' }
+    assert_tag :tag => 'a', :content => 'Dave Lopper',
+                            :attributes => { :href => '/issues/bulk_edit?assigned_to_id=3&amp;ids%5B%5D=1&amp;ids%5B%5D=2',
+                                             :class => '' }
     assert_tag :tag => 'a', :content => 'Move',
                             :attributes => { :href => '/issues/move?ids%5B%5D=1&amp;ids%5B%5D=2',
                                              :class => 'icon-move' }