]> source.dussan.org Git - redmine.git/commitdiff
Add warning when loosing data from custom fields when bulk editing issues (#22600).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 18 Jan 2017 14:49:57 +0000 (14:49 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 18 Jan 2017 14:49:57 +0000 (14:49 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@16224 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/issues_controller.rb
app/models/custom_field_value.rb
app/views/issues/bulk_edit.html.erb
config/locales/en.yml
config/locales/fr.yml
test/functional/issues_controller_test.rb

index 1b6a82aa4f638e3695c0e3538ad2dfdb4cfdbe71..0f66f27fb348d9a6d5fda44039a86ba4c6d2ba0f 100644 (file)
@@ -213,6 +213,16 @@ class IssuesController < ApplicationController
 
     edited_issues = Issue.where(:id => @issues.map(&:id)).to_a
 
+    @values_by_custom_field = {}
+    edited_issues.each do |issue|
+      issue.custom_field_values.each do |c|
+        if c.value_present?
+          @values_by_custom_field[c.custom_field] ||= []
+          @values_by_custom_field[c.custom_field] << issue.id
+        end
+      end
+    end
+
     @allowed_projects = Issue.allowed_target_projects
     if params[:issue]
       @target_project = @allowed_projects.detect {|p| p.id.to_s == params[:issue][:project_id].to_s}
@@ -244,6 +254,15 @@ class IssuesController < ApplicationController
       end
     end
 
+    edited_issues.each do |issue|
+      issue.custom_field_values.each do |c|
+        if c.value_present? && @values_by_custom_field[c.custom_field]
+          @values_by_custom_field[c.custom_field].delete(issue.id)
+        end
+      end
+    end
+    @values_by_custom_field.delete_if {|k,v| v.blank?}
+
     @custom_fields = edited_issues.map{|i|i.editable_custom_fields}.reduce(:&).select {|field| field.format.bulk_edit_supported}
     @assignables = target_projects.map(&:assignable_users).reduce(:&)
     @versions = target_projects.map {|p| p.shared_versions.open}.reduce(:&)
index 38cffc0e6e1591db38ce71d257a371d61ac390e3..eea09b289489ddceffeb2736bfb7c4ffc69b3a17 100644 (file)
@@ -52,6 +52,14 @@ class CustomFieldValue
     @value = custom_field.set_custom_field_value(self, v)
   end
 
+  def value_present?
+    if value.is_a?(Array)
+      value.any?(&:present?)
+    else
+      value.present?
+    end
+  end
+
   def validate_value
     custom_field.validate_custom_value(self).each do |message|
       customized.errors.add(:base, custom_field.name + ' ' + message)
index 29b4881c7edd25ed97b3679e6811a3c370c49e15..23817f8754370fa546d70053e1693e5312f0e9f4 100644 (file)
 </fieldset>
 </div>
 
+<% if @values_by_custom_field.present? %>
+<div class="flash warning">
+  <%= l(:warning_fields_cleared_on_bulk_edit) %>:<br /> 
+  <%= safe_join(@values_by_custom_field.map {|field, ids| content_tag "span", "#{field.name} (#{ids.size})"}, ', ') %>
+</div>
+<% end %>
+
 <p>
   <% if @copy %>
     <%= hidden_field_tag 'copy', '1' %>
index b643ae5771c19ae152221db9eadb78a193aa9302..7ba059947d3e812c961f8e8469195a51d959ef4d 100644 (file)
@@ -219,6 +219,7 @@ en:
   error_no_projects_with_tracker_allowed_for_new_issue: "There are no projects with trackers for which you can create an issue"
   error_move_of_child_not_possible: "Subtask %{child} could not be moved to the new project: %{errors}"
   error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: "Spent time cannot be reassigned to an issue that is about to be deleted"
+  warning_fields_cleared_on_bulk_edit: "Changes will result in the automatic deletion of values from one or more fields on the selected objects"
 
   mail_subject_lost_password: "Your %{value} password"
   mail_body_lost_password: 'To change your password, click on the following link:'
index 031ecc4723887b1a07977f7f9b560a961b3a62a7..73aabc0a9f28f7820d84b77072e258a710ee6065 100644 (file)
@@ -239,6 +239,7 @@ fr:
   error_no_projects_with_tracker_allowed_for_new_issue: "Aucun projet ne dispose d'un tracker sur lequel vous pouvez créer une demande"
   error_move_of_child_not_possible: "La sous-tâche %{child} n'a pas pu être déplacée dans le nouveau projet : %{errors}"
   error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: "Le temps passé ne peut pas être réaffecté à une demande qui va être supprimée"
+  warning_fields_cleared_on_bulk_edit: "Les changements apportés entraîneront la suppression automatique des valeurs d'un ou plusieurs champs sur les objets sélectionnés"
 
   mail_subject_lost_password: "Votre mot de passe %{value}"
   mail_body_lost_password: 'Pour changer votre mot de passe, cliquez sur le lien suivant :'
index 2e9a11c4296fb7f466cedae687c86120fd1fc4ac..4e8d88668957dfe4da8f736ec35fc492cff54250 100644 (file)
@@ -4067,6 +4067,23 @@ class IssuesControllerTest < Redmine::ControllerTest
     assert_select 'input[name=?]', "issue[custom_field_values][#{field2.id}]"
   end
 
+  def test_bulk_edit_should_warn_about_custom_field_values_about_to_be_cleared
+    CustomField.delete_all
+
+    cleared = IssueCustomField.generate!(:name => 'Cleared', :tracker_ids => [2], :is_for_all => true)
+    CustomValue.create!(:customized => Issue.find(2), :custom_field => cleared, :value => 'foo')
+
+    not_cleared = IssueCustomField.generate!(:name => 'Not cleared', :tracker_ids => [2, 3], :is_for_all => true)
+    CustomValue.create!(:customized => Issue.find(2), :custom_field => not_cleared, :value => 'bar')
+    @request.session[:user_id] = 2
+
+    get :bulk_edit, :ids => [1, 2], :issue => {:tracker_id => 3}
+    assert_response :success
+    assert_select '.warning', :text => /automatic deletion of values/
+    assert_select '.warning span', :text => 'Cleared (1)'
+    assert_select '.warning span', :text => /Not cleared/, :count => 0
+  end
+
   def test_bulk_update
     @request.session[:user_id] = 2
     # update issues priority