]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 344435: Let me remove bugs from saved buglists - Patch by Frédéric Buclin <LpSoli...
authorlpsolit%gmail.com <>
Tue, 22 Aug 2006 03:52:31 +0000 (03:52 +0000)
committerlpsolit%gmail.com <>
Tue, 22 Aug 2006 03:52:31 +0000 (03:52 +0000)
buglist.cgi
template/en/default/global/per-bug-queries.html.tmpl
template/en/default/global/user-error.html.tmpl

index e5fe4ef377a95f4d0a95e8214611443c0b194666..1e8462ffa8a1c153364a2bd330229282ec9a5813 100755 (executable)
@@ -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;
index 9c0fc114de376520e67da4a77ebbc33bdde800b4..c288e0cbc1ad909a218b93bda23e8628e11fbcc8 100644 (file)
   #%]
 
 [% 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>
index e07be8846234493eace8848d310ecb773a9f7f5d..4a5634d4ac490c69f4ff8527178e1d6f4d5e7456 100644 (file)
 
   [% 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" %]