]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 891311: Text in the "My Requests" page is misleading about how the AND/OR radio...
authorFrédéric Buclin <LpSolit@gmail.com>
Sat, 28 Sep 2013 11:32:18 +0000 (13:32 +0200)
committerFrédéric Buclin <LpSolit@gmail.com>
Sat, 28 Sep 2013 11:32:18 +0000 (13:32 +0200)
r=dkl a=justdave

request.cgi
template/en/default/request/queue.html.tmpl

index 436f94bc4599cc6a09017f550e75b47b75c3e6ab..118935092f54293a575fc1e9302202f9f77f787d 100755 (executable)
@@ -155,22 +155,8 @@ sub queue {
     # need to display a "status" column in the report because the value for that
     # column will always be the same.
     my @excluded_columns = ();
-    
     my $do_union = $cgi->param('do_union');
 
-    # Filter requests by status: "pending", "granted", "denied", "all" 
-    # (which means any), or "fulfilled" (which means "granted" or "denied").
-    if ($status) {
-        if ($status eq "+-") {
-            push(@criteria, "flags.status IN ('+', '-')");
-            push(@excluded_columns, 'status') unless $do_union;
-        }
-        elsif ($status ne "all") {
-            push(@criteria, "flags.status = '$status'");
-            push(@excluded_columns, 'status') unless $do_union;
-        }
-    }
-    
     # Filter results by exact email address of requester or requestee.
     if (defined $cgi->param('requester') && $cgi->param('requester') ne "") {
         my $requester = $dbh->quote($cgi->param('requester'));
@@ -182,23 +168,44 @@ sub queue {
         if ($cgi->param('requestee') ne "-") {
             my $requestee = $dbh->quote($cgi->param('requestee'));
             trick_taint($requestee); # Quoted above
-            push(@criteria, $dbh->sql_istrcmp('requestees.login_name',
-                            $requestee));
+            push(@criteria, $dbh->sql_istrcmp('requestees.login_name', $requestee));
+        }
+        else {
+            push(@criteria, "flags.requestee_id IS NULL");
         }
-        else { push(@criteria, "flags.requestee_id IS NULL") }
         push(@excluded_columns, 'requestee') unless $do_union;
     }
-    
+
+    # If the user wants requester = foo OR requestee = bar, we have to join
+    # these criteria separately as all other criteria use AND.
+    if (@criteria == 2 && $do_union) {
+        my $union = join(' OR ', @criteria);
+        @criteria = ("($union)");
+    }
+
+    # Filter requests by status: "pending", "granted", "denied", "all"
+    # (which means any), or "fulfilled" (which means "granted" or "denied").
+    if ($status) {
+        if ($status eq "+-") {
+            push(@criteria, "flags.status IN ('+', '-')");
+            push(@excluded_columns, 'status');
+        }
+        elsif ($status ne "all") {
+            push(@criteria, "flags.status = '$status'");
+            push(@excluded_columns, 'status');
+        }
+    }
+
     # Filter results by exact product or component.
     if (defined $cgi->param('product') && $cgi->param('product') ne "") {
         my $product = Bugzilla::Product->check(scalar $cgi->param('product'));
         push(@criteria, "bugs.product_id = " . $product->id);
-        push(@excluded_columns, 'product') unless $do_union;
+        push(@excluded_columns, 'product');
         if (defined $cgi->param('component') && $cgi->param('component') ne "") {
             my $component = Bugzilla::Component->check({ product => $product,
                                                          name => scalar $cgi->param('component') });
             push(@criteria, "bugs.component_id = " . $component->id);
-            push(@excluded_columns, 'component') unless $do_union;
+            push(@excluded_columns, 'component');
         }
     }
 
@@ -216,14 +223,11 @@ sub queue {
         my $quoted_form_type = $dbh->quote($form_type);
         trick_taint($quoted_form_type); # Already SQL quoted
         push(@criteria, "flagtypes.name = " . $quoted_form_type);
-        push(@excluded_columns, 'type') unless $do_union;
+        push(@excluded_columns, 'type');
     }
-    
-    # Add the criteria to the query. Do a union if OR is selected.
-    # Otherwise do an intersection.
-    my $and_or = $do_union ? ' OR ' : ' AND ';
-    $query .= " AND (" . join($and_or, @criteria) . ") " if scalar(@criteria);
-    
+
+    $query .= ' AND ' . join(' AND ', @criteria) if scalar(@criteria);
+
     # Group the records by flag ID so we don't get multiple rows of data
     # for each flag.  This is only necessary because of the code that
     # removes flags on bugs the user is unauthorized to access.
index 68a5197255227a673b5a2345f5796d3f3d17096e..2fb417eb6bea4f1c6b593dfe2ef0db927ce97353 100644 (file)
@@ -147,18 +147,16 @@ to some group are shown by default.
     <tr>
       <th></th>
       <td>
-        <label><input type="radio" name="do_union" value="0" 
-            [% 'checked="checked"' IF !cgi.param('do_union') %]>AND *</label>
-        <label><input type="radio" name="do_union" value="1" 
-            [% 'checked="checked"' IF cgi.param('do_union') %]>OR *</label>
+        <select id="do_union" name="do_union">
+          <option value="0">Match the requester AND requestee</option>
+          <option value="1" [% 'selected="selected"' IF cgi.param('do_union') %]>
+            Match the requester OR requestee</option>
+        </select>
       </td>
       <td colspan="3"></td>
       <td><input type="submit" id="filter" value="Filter"></td>
     </tr>
   </table>
-
-  <p>(* The logical conjunction/disjunction between the requester 
-          and the requestee)</p>
 </form>
 
 [% column_headers = {