Feature #4403 » ro4403-copy_improvements.patch
app/models/issue_relation.rb (working copy) | ||
---|---|---|
26 | 26 |
TYPE_BLOCKED = "blocked" |
27 | 27 |
TYPE_PRECEDES = "precedes" |
28 | 28 |
TYPE_FOLLOWS = "follows" |
29 |
TYPE_COPIES = "copied to" |
|
30 |
TYPE_COPIED = "copied from" |
|
29 | 31 | |
30 | 32 |
TYPES = { TYPE_RELATES => { :name => :label_relates_to, :sym_name => :label_relates_to, :order => 1, :sym => TYPE_RELATES }, |
31 | 33 |
TYPE_DUPLICATES => { :name => :label_duplicates, :sym_name => :label_duplicated_by, :order => 2, :sym => TYPE_DUPLICATED }, |
... | ... | |
33 | 35 |
TYPE_BLOCKS => { :name => :label_blocks, :sym_name => :label_blocked_by, :order => 4, :sym => TYPE_BLOCKED }, |
34 | 36 |
TYPE_BLOCKED => { :name => :label_blocked_by, :sym_name => :label_blocks, :order => 5, :sym => TYPE_BLOCKS, :reverse => TYPE_BLOCKS }, |
35 | 37 |
TYPE_PRECEDES => { :name => :label_precedes, :sym_name => :label_follows, :order => 6, :sym => TYPE_FOLLOWS }, |
36 |
TYPE_FOLLOWS => { :name => :label_follows, :sym_name => :label_precedes, :order => 7, :sym => TYPE_PRECEDES, :reverse => TYPE_PRECEDES } |
|
38 |
TYPE_FOLLOWS => { :name => :label_follows, :sym_name => :label_precedes, :order => 7, :sym => TYPE_PRECEDES, :reverse => TYPE_PRECEDES }, |
|
39 |
TYPE_COPIES => { :name => :label_copied_to, :sym_name => :label_copied_from, :order => 8, :sym => TYPE_COPIED }, |
|
40 |
TYPE_COPIED => { :name => :label_copied_from, :sym_name => :label_copied_to, :order => 9, :sym => TYPE_COPIES, :reverse => TYPE_COPIES } |
|
37 | 41 |
}.freeze |
38 | 42 | |
39 | 43 |
validates_presence_of :issue_from, :issue_to, :relation_type |
app/models/issue.rb (working copy) | ||
---|---|---|
208 | 208 |
end |
209 | 209 |
end |
210 | 210 |
end |
211 |
if options[:relation_type] |
|
212 |
relation = IssueRelation.new( |
|
213 |
:relation_type => options[:relation_type], |
|
214 |
:issue_from => self, |
|
215 |
:issue_to => issue) |
|
216 |
unless relation.save |
|
217 |
issue.destroy |
|
218 |
return false |
|
219 |
end |
|
220 |
end |
|
211 | 221 |
else |
212 | 222 |
return false |
213 | 223 |
end |
app/controllers/issue_moves_controller.rb (working copy) | ||
---|---|---|
22 | 22 |
before_filter :find_issues, :check_project_uniqueness |
23 | 23 |
before_filter :authorize |
24 | 24 | |
25 |
helper :issue_relations |
|
26 |
include IssueRelationsHelper |
|
27 | ||
25 | 28 |
def new |
26 | 29 |
prepare_for_issue_move |
27 | 30 |
render :layout => false if request.xhr? |
... | ... | |
32 | 35 | |
33 | 36 |
if request.post? |
34 | 37 |
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id]) |
38 |
relation_type = params[:relation_type].blank? ? nil : params[:relation_type] |
|
35 | 39 |
unsaved_issue_ids = [] |
36 | 40 |
moved_issues = [] |
37 | 41 |
@issues.each do |issue| |
... | ... | |
39 | 43 |
issue.init_journal(User.current) |
40 | 44 |
issue.current_journal.notes = @notes if @notes.present? |
41 | 45 |
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy }) |
42 |
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)}) |
|
46 |
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :relation_type => relation_type, :attributes => extract_changed_attributes_for_move(params)})
|
|
43 | 47 |
moved_issues << r |
44 | 48 |
else |
45 | 49 |
unsaved_issue_ids << issue.id |
app/views/issue_moves/new.html.erb (working copy) | ||
---|---|---|
22 | 22 |
:update => 'content', |
23 | 23 |
:with => "Form.serialize('move_form')") %></p> |
24 | 24 | |
25 |
<% if @copy && (@project == @target_project || Setting.cross_project_issue_relations?) %> |
|
26 |
<p> |
|
27 |
<label for="relation_type"><%= l(:label_relation_new) %></label> |
|
28 |
<%= select_tag('relation_type', content_tag('option', l(:label_none), :value => '') + |
|
29 |
options_for_select(collection_for_relation_type_select)) %> |
|
30 |
</p> |
|
31 |
<% end %> |
|
32 | ||
25 | 33 |
<p><label for="new_tracker_id"><%=l(:field_tracker)%>:</label> |
26 | 34 |
<%= select_tag "new_tracker_id", "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@trackers, "id", "name") %></p> |
27 | 35 |
config/locales/en.yml (working copy) | ||
---|---|---|
714 | 714 |
label_blocked_by: blocked by |
715 | 715 |
label_precedes: precedes |
716 | 716 |
label_follows: follows |
717 |
label_copied_to: copied to |
|
718 |
label_copied_from: copied from |
|
717 | 719 |
label_end_to_start: end to start |
718 | 720 |
label_end_to_end: end to end |
719 | 721 |
label_start_to_start: start to start |