Feature #34307 » 34307-copy-custom-field.patch
| app/controllers/custom_fields_controller.rb | ||
|---|---|---|
| 98 | 98 |
if @custom_field.nil? |
| 99 | 99 |
render :action => 'select_type' |
| 100 | 100 |
else |
| 101 |
if params[:copy].present? && @copy_from = CustomField.find_by_id(params[:copy]) |
|
| 102 |
@custom_field.copy_from(@copy_from) |
|
| 103 |
end |
|
| 101 | 104 |
@custom_field.safe_attributes = params[:custom_field] |
| 102 | 105 |
end |
| 103 | 106 |
end |
| app/models/custom_field.rb | ||
|---|---|---|
| 95 | 95 |
'extensions_allowed', |
| 96 | 96 |
'full_width_layout') |
| 97 | 97 | |
| 98 |
def copy_from(arg, options={})
|
|
| 99 |
return if arg.blank? |
|
| 100 |
custom_field = arg.is_a?(CustomField) ? arg : CustomField.find_by_id(arg.to_s) |
|
| 101 |
self.attributes = custom_field.attributes.dup.except("id", "name", "position")
|
|
| 102 |
custom_field.enumerations.each do |e| |
|
| 103 |
new_enumeration = self.enumerations.build |
|
| 104 |
new_enumeration.attributes = e.attributes.except("id")
|
|
| 105 |
end |
|
| 106 |
self.default_value = nil if custom_field.enumerations.any? |
|
| 107 |
if %w(IssueCustomField TimeEntryCustomField ProjectCustomField VersionCustomField).include?(self.class.name) |
|
| 108 |
self.role_ids = custom_field.role_ids.dup |
|
| 109 |
end |
|
| 110 |
if self.is_a?(IssueCustomField) |
|
| 111 |
self.tracker_ids = custom_field.tracker_ids.dup |
|
| 112 |
self.project_ids = custom_field.project_ids.dup |
|
| 113 |
end |
|
| 114 |
self |
|
| 115 |
end |
|
| 116 | ||
| 98 | 117 |
def format |
| 99 | 118 |
@format ||= Redmine::FieldFormat.find(field_format) |
| 100 | 119 |
end |
| app/views/custom_fields/_index.html.erb | ||
|---|---|---|
| 22 | 22 |
<% end %> |
| 23 | 23 |
<td class="buttons"> |
| 24 | 24 |
<%= reorder_handle(custom_field, :url => custom_field_path(custom_field), :param => 'custom_field') %> |
| 25 |
<%= link_to_function l(:button_copy), "location.href = '#{new_custom_field_path(:copy => custom_field)}&type=' + encodeURIComponent(($('.tabs a.selected').attr('id')||'').split('tab-').pop())", :class => 'icon icon-copy' %>
|
|
| 25 | 26 |
<%= delete_link custom_field_path(custom_field) %> |
| 26 | 27 |
</td> |
| 27 | 28 |
</tr> |
| app/views/custom_fields/new.html.erb | ||
|---|---|---|
| 3 | 3 |
<%= labelled_form_for :custom_field, @custom_field, :url => custom_fields_path, :html => {:id => 'custom_field_form'} do |f| %>
|
| 4 | 4 |
<%= render :partial => 'form', :locals => { :f => f } %>
|
| 5 | 5 |
<%= hidden_field_tag 'type', @custom_field.type %> |
| 6 |
<%= hidden_field_tag 'copy', @copy_from.id if @copy_from %> |
|
| 6 | 7 |
<% end %> |
| 7 | 8 | |
| 8 | 9 |
<%= javascript_tag do %> |
| test/functional/custom_fields_controller_test.rb | ||
|---|---|---|
| 325 | 325 |
assert_select 'input[type=radio][name=type]' |
| 326 | 326 |
end |
| 327 | 327 | |
| 328 |
def test_new_with_copy |
|
| 329 |
role_ids = [1, 2] |
|
| 330 |
tracker_ids = [1, 2] |
|
| 331 |
project_ids = [1, 2, 3] |
|
| 332 | ||
| 333 |
copy_from = CustomField.find(1) |
|
| 334 |
copy_from.role_ids = role_ids |
|
| 335 |
copy_from.tracker_ids = tracker_ids |
|
| 336 |
copy_from.project_ids = project_ids |
|
| 337 |
copy_from.save |
|
| 338 | ||
| 339 |
get :new, :params => {:copy => copy_from.id.to_s, :type => IssueCustomField}
|
|
| 340 |
assert_response :success |
|
| 341 | ||
| 342 |
assert_select 'form' do |
|
| 343 |
# field_format selected |
|
| 344 |
assert_select 'select[name=?]', 'custom_field[field_format]' do |
|
| 345 |
assert_select "option[value=\"#{copy_from.field_format}\"][selected=selected]"
|
|
| 346 |
end |
|
| 347 |
# blank name |
|
| 348 |
assert_select 'input[name=?][value=""]', 'custom_field[name]' |
|
| 349 |
# description copied |
|
| 350 |
assert_select 'textarea[name=?]', 'custom_field[description]', :text => copy_from.description |
|
| 351 |
# role checked |
|
| 352 |
role_ids.each do |role_id| |
|
| 353 |
assert_select "input[type=checkbox][name=?][value=#{role_id}][checked=checked]", 'custom_field[role_ids][]'
|
|
| 354 |
end |
|
| 355 |
# role not checked |
|
| 356 |
(Role.givable.pluck(:id) - role_ids).each do |role_id| |
|
| 357 |
assert_select "input[type=checkbox][name=?][value=#{role_id}]", 'custom_field[role_ids][]'
|
|
| 358 |
end |
|
| 359 |
# tracker checked |
|
| 360 |
tracker_ids.each do |tracker_id| |
|
| 361 |
assert_select "input[type=checkbox][name=?][value=#{tracker_id}][checked=checked]", 'custom_field[tracker_ids][]'
|
|
| 362 |
end |
|
| 363 |
# tracker not checked |
|
| 364 |
(Tracker.all.pluck(:id) - tracker_ids).each do |tracker_id| |
|
| 365 |
assert_select "input[type=checkbox][name=?][value=#{tracker_id}]", 'custom_field[tracker_ids][]'
|
|
| 366 |
end |
|
| 367 |
# project checked |
|
| 368 |
project_ids.each do |project_id| |
|
| 369 |
assert_select "input[type=checkbox][name=?][value=#{project_id}][checked=checked]", 'custom_field[project_ids][]'
|
|
| 370 |
end |
|
| 371 |
# project not checked |
|
| 372 |
(Project.all.pluck(:id) - project_ids).each do |project_id| |
|
| 373 |
assert_select "input[type=checkbox][name=?][value=#{project_id}]", 'custom_field[project_ids][]'
|
|
| 374 |
end |
|
| 375 |
end |
|
| 376 |
end |
|
| 377 | ||
| 328 | 378 |
def test_create_list_custom_field |
| 329 | 379 |
field = new_record(IssueCustomField) do |
| 330 | 380 |
post( |
| ... | ... | |
| 423 | 473 |
assert_select 'input[type=radio][name=type]' |
| 424 | 474 |
end |
| 425 | 475 | |
| 476 |
def test_create_with_enumerations |
|
| 477 |
custom_field = IssueCustomField.create(:field_format => 'enumeration', :name => 'IssueCustomField') |
|
| 478 |
custom_field.enumerations.build(:name => 'enumeration1', :position => 1) |
|
| 479 |
custom_field.enumerations.build(:name => 'enumeration2', :position => 2) |
|
| 480 |
assert custom_field.save |
|
| 481 | ||
| 482 |
assert_difference 'CustomField.count' do |
|
| 483 |
post( |
|
| 484 |
:create, |
|
| 485 |
:params => {
|
|
| 486 |
:type => "IssueCustomField", |
|
| 487 |
:copy => custom_field.id, |
|
| 488 |
:custom_field => { :name => "Copy" }
|
|
| 489 |
} |
|
| 490 |
) |
|
| 491 |
assert_response 302 |
|
| 492 |
end |
|
| 493 |
field = IssueCustomField.order("id desc").first
|
|
| 494 |
assert_equal "Copy", field.name |
|
| 495 |
assert_equal ["enumeration1", "enumeration2"], field.enumerations.pluck(:name).sort |
|
| 496 |
assert_equal [1, 2], field.enumerations.pluck(:position).sort |
|
| 497 |
end |
|
| 498 | ||
| 426 | 499 |
def test_edit |
| 427 | 500 |
get( |
| 428 | 501 |
:edit, |
| test/unit/custom_field_test.rb | ||
|---|---|---|
| 372 | 372 |
field2 = IssueCustomField.create!(:name => 'Another long text', :field_format => 'text') |
| 373 | 373 |
assert !field2.full_text_formatting? |
| 374 | 374 |
end |
| 375 | ||
| 376 |
def test_copy_from |
|
| 377 |
custom_field = CustomField.find(1) |
|
| 378 |
copy = CustomField.new.copy_from(custom_field) |
|
| 379 | ||
| 380 |
assert_nil copy.id |
|
| 381 |
assert_equal '', copy.name |
|
| 382 |
assert_nil copy.position |
|
| 383 |
(custom_field.attribute_names - ['id', 'name', 'position']).each do |attribute_name| |
|
| 384 |
assert_equal custom_field.send(attribute_name).to_s, copy.send(attribute_name).to_s |
|
| 385 |
end |
|
| 386 | ||
| 387 |
copy.name = 'Copy' |
|
| 388 |
assert copy.save |
|
| 389 |
end |
|
| 390 | ||
| 391 |
def test_copy_from_should_copy_enumerations |
|
| 392 |
custom_field = CustomField.create(:field_format => 'enumeration', :name => 'CustomField') |
|
| 393 |
custom_field.enumerations.build(:name => 'enumeration1', :position => 1) |
|
| 394 |
custom_field.enumerations.build(:name => 'enumeration2', :position => 2) |
|
| 395 |
assert custom_field.save |
|
| 396 | ||
| 397 |
copy = CustomField.new.copy_from(custom_field) |
|
| 398 |
copy.name = 'Copy' |
|
| 399 |
assert copy.save |
|
| 400 |
assert_equal ['enumeration1', 'enumeration2'], copy.enumerations.pluck(:name) |
|
| 401 |
assert_equal [1, 2], copy.enumerations.pluck(:position) |
|
| 402 |
end |
|
| 403 | ||
| 404 |
def test_copy_from_should_copy_roles |
|
| 405 |
%w(IssueCustomField TimeEntryCustomField ProjectCustomField VersionCustomField).each do |klass_name| |
|
| 406 |
klass = klass_name.constantize |
|
| 407 |
custom_field = klass.new(:name => klass_name, :role_ids => [1, 2, 3, 4, 5]) |
|
| 408 |
copy = klass.new.copy_from(custom_field) |
|
| 409 |
assert_equal [1, 2, 3, 4, 5], copy.role_ids.sort |
|
| 410 |
end |
|
| 411 |
end |
|
| 412 | ||
| 413 |
def test_copy_from_should_copy_trackers |
|
| 414 |
issue_custom_field = IssueCustomField.new(:name => 'IssueCustomField', :tracker_ids => [1, 2, 3]) |
|
| 415 |
copy = IssueCustomField.new.copy_from(issue_custom_field) |
|
| 416 |
assert_equal [1, 2, 3], copy.tracker_ids |
|
| 417 |
end |
|
| 418 | ||
| 419 |
def test_copy_from_should_copy_projects |
|
| 420 |
issue_custom_field = IssueCustomField.new(:name => 'IssueCustomField', :project_ids => [1, 2, 3, 4, 5, 6]) |
|
| 421 |
copy = IssueCustomField.new.copy_from(issue_custom_field) |
|
| 422 |
assert_equal [1, 2, 3, 4, 5, 6], copy.project_ids |
|
| 423 |
end |
|
| 375 | 424 |
end |
- « Previous
- 1
- 2
- Next »