]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1191706: When editing flag types, components do not match the selected product...
authorFrédéric Buclin <LpSolit@gmail.com>
Mon, 4 Jan 2016 22:47:11 +0000 (23:47 +0100)
committerFrédéric Buclin <LpSolit@gmail.com>
Mon, 4 Jan 2016 22:47:11 +0000 (23:47 +0100)
r=dkl

editflagtypes.cgi
js/productform.js
request.cgi
template/en/default/admin/flag-type/edit.html.tmpl
template/en/default/admin/flag-type/list.html.tmpl
template/en/default/global/js-products.html.tmpl
template/en/default/request/queue.html.tmpl

index d848d250a540b4d95132c7c17ac75d1adcece682..d0b9443b59492a61ddcee28d53123e17323fe01a 100755 (executable)
@@ -436,17 +436,30 @@ sub get_products_and_components {
 
     my @products;
     if ($user->in_group('editcomponents')) {
-        @products = Bugzilla::Product->get_all;
+        if (Bugzilla->params->{useclassification}) {
+            # We want products grouped by classifications.
+            @products = map { @{ $_->products } } Bugzilla::Classification->get_all;
+        }
+        else {
+            @products = Bugzilla::Product->get_all;
+        }
     }
     else {
         @products = @{$user->get_products_by_permission('editcomponents')};
+
+        if (Bugzilla->params->{useclassification}) {
+            my %class;
+            push(@{$class{$_->classification_id}}, $_) foreach @products;
+
+            # Let's sort the list by classifications.
+            @products = ();
+            push(@products, @{$class{$_->id}}) foreach Bugzilla::Classification->get_all;
+        }
     }
-    # We require all unique component names.
+
     my %components;
     foreach my $product (@products) {
-        foreach my $component (@{$product->components}) {
-            $components{$component->name} = 1;
-        }
+        $components{$_->name} = 1 foreach @{$product->components};
     }
     $vars->{'products'} = \@products;
     $vars->{'components'} = [sort(keys %components)];
index d5e24d306c69635c903c9c53348d3c6b1ac86aed..0f669aa26cb057c8218dd7baa50b703b8dab4fa4 100644 (file)
 // collection of javascript arrays containing strings.
 
 /**
- * Reads the selected products and updates component, version and milestone
- * lists accordingly.
+ * Reads the selected products and updates the component list accordingly.
  *
  * @param  product    Select element that contains products.
- * @param  component  Select element that contains components. Can be null if
- *                    there is no such element to update.
- * @param  version    Select element that contains versions. Can be null if
- *                    there is no such element to update.
- * @param  milestone  Select element that contains milestones. Can be null if
- *                    there is no such element to update.
+ * @param  component  Select element that contains components.
  * @param  anyval     Value to use for a special "Any" list item. Can be null
  *                    to not use any. If used must and will be first item in
  *                    the select element.
  * @global cpts       Array of arrays, indexed by product name. The subarrays
  *                    contain a list of components to be fed to the respective
  *                    select element.
- * @global vers       Array of arrays, indexed by product name. The subarrays
- *                    contain a list of versions to be fed to the respective
- *                    select element.
- * @global tms        Array of arrays, indexed by product name. The subarrays
- *                    contain a list of milestones to be fed to the respective
- *                    select element.
  * @global first_load Boolean; true if this is the first time this page loads
  *                    or false if not.
  * @global last_sel   Array that contains last list of products so we know what
  *                    has changed, and optimize for additions.
  */
-function selectProduct(product, component, version, milestone, anyval) {
+function selectProduct(product, component, anyval) {
     // This is to avoid handling events that occur before the form
     // itself is ready, which could happen in buggy browsers.
-    if (!product)
+    if (!product || !component)
         return;
 
     // Do nothing if no products are defined. This is to avoid the
@@ -78,15 +66,8 @@ function selectProduct(product, component, version, milestone, anyval) {
     var findall = (product.selectedIndex == -1
                    || (anyval != null && product.options[0].selected));
 
-    if (useclassification) {
-        // Update index based on the complete product array.
-        sel = get_selection(product, findall, true, anyval);
-        for (var i=0; i<sel.length; i++)
-           sel[i] = prods[sel[i]];
-    }
-    else {
-        sel = get_selection(product, findall, false, anyval);
-    }
+    sel = get_selection(product, findall, false, anyval);
+
     if (!findall) {
         // Save sel for the next invocation of selectProduct().
         var tmp = sel;
@@ -103,23 +84,9 @@ function selectProduct(product, component, version, milestone, anyval) {
     }
 
     // Do the actual fill/update.
-    if (component) {
-        var saved_cpts = get_selection(component, false, true, null);
-        updateSelect(cpts, sel, component, merging, anyval);
-        restoreSelection(component, saved_cpts);
-    }
-
-    if (version) {
-        var saved_vers = get_selection(version, false, true, null);
-        updateSelect(vers, sel, version, merging, anyval);
-        restoreSelection(version, saved_vers);
-    }
-
-    if (milestone) {
-        var saved_tms = get_selection(milestone, false, true, null);
-        updateSelect(tms, sel, milestone, merging, anyval);
-        restoreSelection(milestone, saved_tms);
-    }
+    var saved_cpts = get_selection(component, false, true, null);
+    updateSelect(cpts, sel, component, merging, anyval);
+    restoreSelection(component, saved_cpts);
 }
 
 /**
index 566781a0c0169a82c6599c7dca471e3c0d74b156..347cb7a44fedaeb10a0ec705498a5443c97fad5f 100755 (executable)
@@ -305,13 +305,22 @@ sub queue {
     $vars->{'requests'} = \@requests;
     $vars->{'types'} = \@types;
 
-    my %components;
-    foreach my $prod (@{$user->get_selectable_products}) {
-        foreach my $comp (@{$prod->components}) {
-            $components{$comp->name} = 1;
+    # This code is needed to populate the Product and Component select fields.
+    my ($products, %components);
+    if (Bugzilla->params->{useclassification}) {
+        foreach my $class (@{$user->get_selectable_classifications}) {
+            push @$products, @{$user->get_selectable_products($class->id)};
         }
     }
-    $vars->{'components'} = [ sort { $a cmp $b } keys %components ];
+    else {
+        $products = $user->get_selectable_products;
+    }
+
+    foreach my $product (@$products) {
+        $components{$_->name} = 1 foreach @{$product->components};
+    }
+    $vars->{'products'} = $products;
+    $vars->{'components'} = [ sort keys %components ];
 
     $vars->{'urlquerypart'} = $cgi->canonicalise_query('ctype');
 
index 6c0e0cb78e3e162d2464f112032c52c040617d9b..7505ebd8c39a3ad45dc7d3cce3e6af79b7828484 100644 (file)
@@ -23,7 +23,7 @@
   title = title
   style_urls = ['skins/standard/admin.css']
   onload="var f = document.forms['flagtype_properties'];
-          selectProduct(f.product, f.component, null, null, '__Any__');"
+          selectProduct(f.product, f.component, '__Any__');"
   javascript_urls=["js/productform.js"]
   doc_section = "administering/flags.html"
 %]
@@ -92,7 +92,7 @@
                 id       => "product"
                 name     => "product"
                 add      => "__Any__"
-                onchange => "selectProduct(this, this.form.component, null, null, '__Any__');"
+                onchange => "selectProduct(this, this.form.component, '__Any__');"
                 products => products
               %]<br>
               <select name="component">
index b91b4919960dec065782dd86078f3f4120f609ab..b1665c3b0f3a46550c435c0aca03404e3e1000d6 100644 (file)
@@ -11,7 +11,7 @@
 [% PROCESS global/header.html.tmpl
   title = 'Administer Flag Types'
   style_urls = ['skins/standard/admin.css']
-  onload="var f = document.flagtype_form; selectProduct(f.product, f.component, null, null, '__All__');"
+  onload="var f = document.flagtype_form; selectProduct(f.product, f.component, '__All__');"
   javascript_urls=["js/productform.js"]
   doc_section = "administering/flags.html"
 %]
@@ -43,7 +43,7 @@
       id       => "product"
       name     => "product"
       add      => "__Any__"
-      onchange => "selectProduct(this, this.form.component, null, null, '__Any__');"
+      onchange => "selectProduct(this, this.form.component, '__Any__');"
       products => products
     %]
   </div>
index e40a3e3aef4bfb15d321e30b129655a7aa31d5bb..940a5e64d09dd368af0a445167a07c56bb7a820f 100644 (file)
@@ -8,14 +8,13 @@
 
 [%# The javascript block gets used in header.html.tmpl. %]
 [% javascript = BLOCK %]
-  var useclassification = false; // No classification level in use
   var first_load = true; // Is this the first time we load the page?
   var last_sel = []; // Caches last selection
   var cpts = new Array();
+
   [% n = 1 %]
   [% FOREACH prod = products %]
-    cpts['[% n %]'] = [
-      [%- FOREACH comp = prod.components %]'[% comp.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ];
+    cpts['[% n %]'] = [[% FOREACH comp = prod.components %]'[% comp.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%]];
     [% n = n+1 %]
   [% END %]
 [% END %]
index 4e406190db6d8107b63a02f76977cfe8c8ef68ae..fd3dbde8a0d77cf4ad03fc9f285f4e4fcfbfcfce 100644 (file)
@@ -9,39 +9,16 @@
 [% USE Bugzilla %]
 [% cgi = Bugzilla.cgi %]
 
+[% PROCESS "global/js-products.html.tmpl" %]
+
 [% PROCESS global/header.html.tmpl
   title="Request Queue"
   generate_api_token = 1
-  onload="var f = document.request_form; selectProduct(f.product, f.component, null, null, 'Any');"
+  onload="var f = document.request_form; selectProduct(f.product, f.component, 'Any');"
   javascript_urls=["js/productform.js", "js/field.js"]
   style_urls = ['skins/standard/buglist.css']
 %]
 
-<script type="text/javascript">
-  var useclassification = false; // No classification level in use
-  var first_load = true; // Is this the first time we load the page?
-  var last_sel = []; // Caches last selection
-  var cpts = new Array();
-  [% n = 1 %]
-  [% IF Param('useclassification') %]
-    [% FOREACH clas = user.get_selectable_classifications %]
-      [% FOREACH prod = user.get_selectable_products(clas.id) %]
-        [%+ PROCESS js_comp %]
-      [% END %]
-    [% END %]
-  [% ELSE %]
-    [% FOREACH prod = user.get_selectable_products %]
-      [%+ PROCESS js_comp %]
-    [% END %]
-  [% END %]
-</script>
-
-[% BLOCK js_comp %]
-  cpts['[% n %]'] = [
-    [%- FOREACH comp = prod.components %]'[% comp.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%]];
-  [% n = n+1 %]
-[% END %]
-
 <p>
 When you are logged in, only requests made by you or addressed to you
 are shown by default.  You can change the criteria using the form below.
@@ -71,7 +48,7 @@ to some group are shown by default.
            id       => "product"
            name     => "product"
            add      => "Any"
-           onchange => "selectProduct(this, this.form.component, null, null, 'Any');"
+           onchange => "selectProduct(this, this.form.component, 'Any');"
         %]
       </td>
       <th>Flag:</th>