diff options
-rwxr-xr-x | buglist.cgi | 49 | ||||
-rw-r--r-- | template/en/default/global/per-bug-queries.html.tmpl | 81 | ||||
-rw-r--r-- | template/en/default/global/user-error.html.tmpl | 16 |
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"> </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&remaction=forget&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" %] |