Feature #33418 » 0002-Allow-issue-relation-autocomplete-to-select-multiple.patch
app/views/issue_relations/_form.html.erb | ||
---|---|---|
18 | 18 |
<%= link_to_function l(:button_cancel), '$("#new-relation-form").hide();'%> |
19 | 19 |
</p> |
20 | 20 | |
21 |
<%= javascript_tag "observeAutocompleteField('relation_issue_to_id', '#{escape_javascript auto_complete_issues_path(:project_id => @project, :scope => (Setting.cross_project_issue_relations? ? 'all' : nil), :issue_id => @issue.id)}')" %>
|
|
21 |
<%= javascript_tag "multipleAutocompleteField('relation_issue_to_id', '#{escape_javascript auto_complete_issues_path(:project_id => @project, :scope => (Setting.cross_project_issue_relations? ? 'all' : nil), :issue_id => @issue.id)}')" %>
|
|
22 | 22 | |
23 | 23 |
<%= javascript_tag "setPredecessorFieldsVisibility();" %> |
public/javascripts/application.js | ||
---|---|---|
617 | 617 |
}); |
618 | 618 |
} |
619 | 619 | |
620 |
function multipleAutocompleteField(fieldId, url, options) { |
|
621 |
function split(val) { |
|
622 |
return val.split(/,\s*/); |
|
623 |
} |
|
624 | ||
625 |
function extractLast(term) { |
|
626 |
return split(term).pop(); |
|
627 |
} |
|
628 | ||
629 |
$(document).ready(function () { |
|
630 |
$('#' + fieldId).autocomplete($.extend({ |
|
631 |
source: function (request, response) { |
|
632 |
$.getJSON(url, { |
|
633 |
term: extractLast(request.term) |
|
634 |
}, response); |
|
635 |
}, |
|
636 |
minLength: 2, |
|
637 |
position: {collision: "flipfit"}, |
|
638 |
search: function () { |
|
639 |
$('#' + fieldId).addClass('ajax-loading'); |
|
640 |
}, |
|
641 |
response: function () { |
|
642 |
$('#' + fieldId).removeClass('ajax-loading'); |
|
643 |
}, |
|
644 |
select: function (event, ui) { |
|
645 |
var terms = split(this.value); |
|
646 |
// remove the current input |
|
647 |
terms.pop(); |
|
648 |
// add the selected item |
|
649 |
terms.push(ui.item.value); |
|
650 |
// add placeholder to get the comma-and-space at the end |
|
651 |
terms.push(""); |
|
652 |
this.value = terms.join(", "); |
|
653 |
return false; |
|
654 |
} |
|
655 |
}, options)); |
|
656 |
$('#' + fieldId).addClass('autocomplete'); |
|
657 |
}); |
|
658 |
} |
|
659 | ||
620 | 660 |
function observeSearchfield(fieldId, targetId, url) { |
621 | 661 |
$('#'+fieldId).each(function() { |
622 | 662 |
var $this = $(this); |
test/system/issues_test.rb | ||
---|---|---|
540 | 540 |
assert !page.has_css?('#trackers_description') |
541 | 541 |
assert_equal "2", page.find('select#issue_tracker_id').value |
542 | 542 |
end |
543 | ||
544 |
def test_edit_should_allow_adding_multiple_relations_from_autocomplete |
|
545 |
log_user('admin', 'admin') |
|
546 | ||
547 |
visit '/issues/1' |
|
548 |
page.find('#relations .contextual a').click |
|
549 |
page.fill_in 'relation[issue_to_id]', :with => 'issue' |
|
550 | ||
551 |
within('ul.ui-autocomplete') do |
|
552 |
assert page.has_text? 'Bug #12: Closed issue on a locked version' |
|
553 |
assert page.has_text? 'Bug #11: Closed issue on a closed version' |
|
554 | ||
555 |
first('li.ui-menu-item').click |
|
556 |
end |
|
557 |
assert_equal '12, ', find('#relation_issue_to_id').value |
|
558 | ||
559 |
find('#relation_issue_to_id').click.send_keys('issue due') |
|
560 |
within('ul.ui-autocomplete') do |
|
561 |
assert page.has_text? 'Bug #7: Issue due today' |
|
562 | ||
563 |
find('li.ui-menu-item').click |
|
564 |
end |
|
565 |
assert_equal '12, 7, ', find('#relation_issue_to_id').value |
|
566 | ||
567 |
find('#relations').click_button("Add") |
|
568 | ||
569 |
within('#relations table.issues') do |
|
570 |
assert page.has_text? "Related to Bug #12" |
|
571 |
assert page.has_text? "Related to Bug #7" |
|
572 |
end |
|
573 |
end |
|
543 | 574 |
end |