summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbuglist.cgi49
-rw-r--r--template/en/default/global/per-bug-queries.html.tmpl81
-rw-r--r--template/en/default/global/user-error.html.tmpl16
3 files changed, 116 insertions, 30 deletions
diff --git a/buglist.cgi b/buglist.cgi
index e5fe4ef37..1e8462ffa 100755
--- a/buglist.cgi
+++ b/buglist.cgi
@@ -504,28 +504,49 @@ elsif (($cgi->param('cmdtype') eq "doit") && defined $cgi->param('remtype')) {
my $query_name = $cgi->param('newqueryname');
my $new_query = $cgi->param('newquery');
my $query_type = QUERY_LIST;
- # If add_bugids is true, we are adding individual bugs to a saved
- # search. We get the existing list of bug IDs (if any) and append
- # the new ones.
- if ($cgi->param('add_bugids')) {
- my %bug_ids;
- foreach my $bug_id (split(/[\s,]+/, $cgi->param('bug_ids'))) {
- next unless $bug_id;
- ValidateBugID($bug_id);
- $bug_ids{$bug_id} = 1;
+ # If list_of_bugs is true, we are adding/removing individual bugs
+ # to a saved search. We get the existing list of bug IDs (if any)
+ # and add/remove the passed ones.
+ if ($cgi->param('list_of_bugs')) {
+ # We add or remove bugs based on the action choosen.
+ my $action = trim($cgi->param('action') || '');
+ $action =~ /^(add|remove)$/
+ || ThrowCodeError('unknown_action', {'action' => $action});
+
+ # If we are removing bugs, then we must have an existing
+ # saved search selected.
+ if ($action eq 'remove') {
+ $query_name && ThrowUserError('no_bugs_to_remove');
}
- ThrowUserError("no_bug_ids") unless scalar(keys %bug_ids);
- if (!trim($query_name)) {
- # No new query name has been given. We append new bug IDs
- # to the existing list.
+ my %bug_ids;
+ unless ($query_name) {
+ # No new query name has been given. We retrieve bug IDs
+ # currently set in the selected saved search.
$query_name = $cgi->param('oldqueryname');
my $old_query = LookupNamedQuery($query_name);
foreach my $bug_id (split(/[\s,=]+/, $old_query)) {
$bug_ids{$bug_id} = 1 if detaint_natural($bug_id);
}
}
- $new_query = "bug_id=" . join(',', sort {$a <=> $b} keys %bug_ids);
+
+ my $keep_bug = ($action eq 'add') ? 1 : 0;
+ my $changes = 0;
+ foreach my $bug_id (split(/[\s,]+/, $cgi->param('bug_ids'))) {
+ next unless $bug_id;
+ ValidateBugID($bug_id);
+ $bug_ids{$bug_id} = $keep_bug;
+ $changes = 1;
+ }
+ ThrowUserError('no_bug_ids', {'action' => $action}) unless $changes;
+
+ # Only keep bug IDs we want to add/keep. Disregard deleted ones.
+ my @bug_ids = grep { $bug_ids{$_} == 1 } keys %bug_ids;
+ # If the list is now empty, we could as well delete it completely.
+ ThrowUserError('no_bugs_in_list', {'saved_search' => $query_name})
+ unless scalar(@bug_ids);
+
+ $new_query = "bug_id=" . join(',', sort {$a <=> $b} @bug_ids);
$query_type = LIST_OF_BUGS;
}
my $tofooter = 1;
diff --git a/template/en/default/global/per-bug-queries.html.tmpl b/template/en/default/global/per-bug-queries.html.tmpl
index 9c0fc114d..c288e0cbc 100644
--- a/template/en/default/global/per-bug-queries.html.tmpl
+++ b/template/en/default/global/per-bug-queries.html.tmpl
@@ -15,28 +15,79 @@
#%]
[% IF user.id && user.settings.per_bug_queries.value == "on" %]
+ <script type="text/javascript">
+ <!--
+ function update_text() {
+ // 'lob' means list_of_bugs.
+ var lob_action = document.getElementById('lob_action');
+ var action = lob_action.options[lob_action.selectedIndex].value;
+ var text = document.getElementById('lob_direction');
+ var new_query_text = document.getElementById('lob_new_query_text');
+
+ if (action == "add") {
+ text.innerHTML = "to";
+ new_query_text.style.display = 'inline';
+ }
+ else {
+ text.innerHTML = "from";
+ new_query_text.style.display = 'none';
+ }
+ }
+
+ function manage_old_lists() {
+ var old_lists = document.getElementById('oldqueryname');
+ // If there is no saved searches available, returns.
+ if (!old_lists) return;
+
+ var new_query = document.getElementById('newqueryname').value;
+
+ if (new_query != "") {
+ old_lists.disabled = true;
+ }
+ else {
+ old_lists.disabled = false;
+ }
+ }
+ //-->
+ </script>
+
+ [%# Get existing lists of bugs for this user %]
+ [% lists_of_bugs = [] %]
+ [% FOREACH q = user.queries %]
+ [% NEXT UNLESS q.query_type == constants.LIST_OF_BUGS %]
+ [% lists_of_bugs.push(q.name) %]
+ [% END %]
+
<div id="links-special">
<div class="label">&nbsp;</div>
<div class="links">
- <form action="buglist.cgi" method="get">
+ <hr>
+ <form id="list_of_bugs" action="buglist.cgi" method="get">
<input type="hidden" name="cmdtype" value="doit">
<input type="hidden" name="remtype" value="asnamed">
- <input type="hidden" name="add_bugids" value="1">
- <input type="submit" value="Add" id="add"> [% terms.bugs %]
- <input type="text" name="bug_ids" size="8" maxlength="80"> to
- [% foundq = 0 %]
- [% FOREACH q = user.queries %]
- [% NEXT UNLESS q.query_type == constants.LIST_OF_BUGS %]
- [% IF !foundq %]
- [% foundq = 1 %]
- <select name="oldqueryname">
+ <input type="hidden" name="list_of_bugs" value="1">
+ <select id="lob_action" name="action" onchange="update_text();">
+ <option value="add">Add</option>
+ [% IF lists_of_bugs.size %]
+ <option value="remove">Remove</option>
[% END %]
- <option value="[% q.name FILTER html %]">
- [% q.name FILTER html %]</option>
+ </select>
+ [%+ terms.bugs %]
+ <input type="text" name="bug_ids" size="12" maxlength="80">
+ <span id="lob_direction">to</span>
+ [% IF lists_of_bugs.size %]
+ <select id="oldqueryname" name="oldqueryname">
+ [% FOREACH query = lists_of_bugs %]
+ <option value="[% query FILTER html %]">[% query FILTER html %]</option>
+ [% END %]
+ </select>
[% END %]
- [% "</select> or to " IF foundq %]
- the new saved search:
- <input type="text" name="newqueryname" size="20" maxlength="64">
+ <span id="lob_new_query_text">
+ [% " or to" IF lists_of_bugs.size %] the new saved search:
+ <input type="text" id="newqueryname" name="newqueryname" size="20" maxlength="64"
+ onkeyup="manage_old_lists();">
+ </span>
+ <input type="submit" value="Commit" id="commit_list_of_bugs">
</form>
</div>
</div>
diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl
index e07be8846..4a5634d4a 100644
--- a/template/en/default/global/user-error.html.tmpl
+++ b/template/en/default/global/user-error.html.tmpl
@@ -1002,7 +1002,21 @@
[% ELSIF error == "no_bug_ids" %]
[% title = BLOCK %]No [% terms.Bugs %] Chosen[% END %]
- You didn't choose any [% terms.bugs %] to add to the saved search.
+ You didn't choose any [% terms.bugs %] to
+ [% IF action == "add" %] add to [% ELSE %] remove from [% END %]
+ the saved search.
+
+ [% ELSIF error == "no_bugs_in_list" %]
+ [% title = "Delete Saved Search?" %]
+ You are going to remove all [% terms.bugs %] from the '[% saved_search FILTER html %]'
+ saved search. This will delete this saved search completely. Click
+ <a href="buglist.cgi?cmdtype=dorem&amp;remaction=forget&amp;namedcmd=
+ [%- saved_search FILTER url_quote %]">here</a> if you really want to
+ remove it.
+
+ [% ELSIF error == "no_bugs_to_remove" %]
+ [% title = "No Saved Search Selected" %]
+ You didn't select any saved search to remove [% terms.bugs %] from.
[% ELSIF error == "no_component_change_for_multiple_products" %]
[% title = "Action Not Permitted" %]