summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrojanu <aliustek@gmail.com>2014-04-02 10:35:08 +0200
committerByron Jones <glob@mozilla.com>2014-04-02 10:35:08 +0200
commitb4aecfefc218d425c7c2b05d0878d4b062613a18 (patch)
tree436a2784b28faaecd14f1f9db26fb63821ffb9b6
parentb6027058e4a8e06ffc252645e5e8b695b0aa2802 (diff)
downloadbugzilla-b4aecfefc218d425c7c2b05d0878d4b062613a18.tar.gz
bugzilla-b4aecfefc218d425c7c2b05d0878d4b062613a18.tar.xz
Bug 539894: Use <optgroup/> to group products into classifications in the product drop-down on show_bug.cgi
r=glob, a=justdave
-rwxr-xr-xreports.cgi6
-rw-r--r--template/en/default/admin/flag-type/edit.html.tmpl13
-rw-r--r--template/en/default/admin/flag-type/list.html.tmpl16
-rw-r--r--template/en/default/bug/edit.html.tmpl19
-rw-r--r--template/en/default/global/product-select.html.tmpl80
-rw-r--r--template/en/default/list/edit-multiple.html.tmpl8
-rw-r--r--template/en/default/reports/duplicates.html.tmpl12
-rw-r--r--template/en/default/reports/old-charts.html.tmpl12
-rw-r--r--template/en/default/request/queue.html.tmpl28
-rw-r--r--template/en/default/search/search-specific.html.tmpl29
10 files changed, 135 insertions, 88 deletions
diff --git a/reports.cgi b/reports.cgi
index 618feb8c8..1f1791e42 100755
--- a/reports.cgi
+++ b/reports.cgi
@@ -59,13 +59,7 @@ if (! defined($product_id)) {
push(@datasets, $datasets);
}
- # Start our product list with an entry for all products, then add those
- # products that the user has permissions for.
- my @myproducts = ($product_all);
- push( @myproducts, @{$user->get_selectable_products} );
-
$vars->{'datasets'} = \@datasets;
- $vars->{'products'} = \@myproducts;
print $cgi->header();
}
diff --git a/template/en/default/admin/flag-type/edit.html.tmpl b/template/en/default/admin/flag-type/edit.html.tmpl
index 4ee4a999c..5f45b6b76 100644
--- a/template/en/default/admin/flag-type/edit.html.tmpl
+++ b/template/en/default/admin/flag-type/edit.html.tmpl
@@ -88,12 +88,13 @@
<tr>
<th class="top left">
Product/Component:<br>
- <select name="product" onchange="selectProduct(this, this.form.component, null, null, '__Any__');">
- <option value="">__Any__</option>
- [% FOREACH prod = products %]
- <option value="[% prod.name FILTER html %]">[% prod.name FILTER html %]</option>
- [% END %]
- </select><br>
+ [% INCLUDE "global/product-select.html.tmpl"
+ id => "product"
+ name => "product"
+ add => "__Any__"
+ onchange => "selectProduct(this, this.form.component, null, null, '__Any__');"
+ products => products
+ %]<br>
<select name="component">
<option value="">__Any__</option>
[% FOREACH comp = components %]
diff --git a/template/en/default/admin/flag-type/list.html.tmpl b/template/en/default/admin/flag-type/list.html.tmpl
index 3783cade8..25b2e3390 100644
--- a/template/en/default/admin/flag-type/list.html.tmpl
+++ b/template/en/default/admin/flag-type/list.html.tmpl
@@ -39,15 +39,13 @@
<form id="flagtype_form" name="flagtype_form" action="editflagtypes.cgi" method="get">
<div class="inline">
<label for="product">Product:</label>
- <select id="product" name="product"
- onchange="selectProduct(this, this.form.component, null, null, '__Any__');">
- <option value="">__Any__</option>
- [% FOREACH prod = products %]
- <option value="[% prod.name FILTER html %]"
- [%+ 'selected="selected"' IF selected_product == prod.name %]>
- [%- prod.name FILTER html %]</option>
- [% END %]
- </select>
+ [% INCLUDE "global/product-select.html.tmpl"
+ id => "product"
+ name => "product"
+ add => "__Any__"
+ onchange => "selectProduct(this, this.form.component, null, null, '__Any__');"
+ products => products
+ %]
</div>
<div class="inline">
diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl
index 61fa2c1ec..ae33146a7 100644
--- a/template/en/default/bug/edit.html.tmpl
+++ b/template/en/default/bug/edit.html.tmpl
@@ -241,11 +241,20 @@
[%# PRODUCT #%]
[%#############%]
<tr>
- [% INCLUDE bug/field.html.tmpl
- bug = bug, field = bug_fields.product,
- override_legal_values = bug.choices.product
- desc_url = 'describecomponents.cgi', value = bug.product
- editable = bug.check_can_change_field('product', 0, 1) %]
+ [% PROCESS "bug/field-label.html.tmpl"
+ field = bug_fields.product
+ desc_url = 'describecomponents.cgi'
+ value = bug.product
+ %]
+ <td class="field_value" id="field_container_product">
+ [% INCLUDE "global/product-select.html.tmpl"
+ id => "product"
+ name => "product"
+ value => bug.product
+ products => bug.choices.product
+ isselect => bug.check_can_change_field('product', 0, 1)
+ %]
+ </td>
</tr>
[%# Classification is here so that it can be used in value controllers
diff --git a/template/en/default/global/product-select.html.tmpl b/template/en/default/global/product-select.html.tmpl
new file mode 100644
index 000000000..8e43c9d0e
--- /dev/null
+++ b/template/en/default/global/product-select.html.tmpl
@@ -0,0 +1,80 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# INTERFACE:
+ # name: mandatory; field name
+ # id: optional; field id
+ # value: optional; default field value/selection
+ # classes: optional; an array of classes to be added
+ # onchange: optional; onchange attribute value
+ # disabled: optional; if true, the field is disabled
+ # accesskey: optional; accesskey attribute value
+ # add: optional; prepend menu option for value specified to start of select
+ # dontchange: optional; prepend menu option for "dontchange" to start of select
+ # multiple: optional; do multiselect box, value is size (height) of box
+ # title: optional; extra information to display as a tooltip
+ # products: optional; an array of custom product names
+ # isselect: optional; whether the product list should be displayed as a <select>
+ # or as just the plain text of its value.
+ # valueattribute: optional; the product attribute to be used for <option value="">,
+ # defaults to product name
+ #%]
+
+[% IF !isselect.defined %]
+ [% isselect = 1 %]
+[% END %]
+[% DEFAULT valueattribute = "name" %]
+[% IF isselect %]
+ <select name="[% name FILTER html %]"
+ [% IF id %] id="[% id FILTER html %]" [% END %]
+ [% IF classes %] class="[% classes.join(' ') FILTER html %]" [% END %]
+ [% IF onchange %] onchange="[% onchange FILTER html %]" [% END %]
+ [% IF disabled %] disabled="[% disabled FILTER html %]" [% END %]
+ [% IF accesskey %] accesskey="[% accesskey FILTER html %]" [% END %]
+ [% IF multiple %] multiple="multiple" size="[% multiple FILTER html %]" [% END %]
+ [% IF title %] title="[% title FILTER html %]" [% END %]
+ >
+ [% IF add %]
+ <option value="">[% add FILTER html %]</option>
+ [% END %]
+ [% IF dontchange %]
+ <option value="[% dontchange FILTER html %]">[% dontchange FILTER html %]</option>
+ [% END %]
+
+ [% IF Param('useclassification') %]
+ [% product_ids = {} %]
+ [% IF products %]
+ [% FOREACH p = products %]
+ [% key = p.id -%]
+ [% product_ids.$key = p.id -%]
+ [% END %]
+ [% END %]
+ [% FOREACH c = user.get_selectable_classifications %]
+ <optgroup label="[% c.name FILTER html %]">
+ [% FOREACH p = user.get_selectable_products(c.id) %]
+ [% NEXT IF (products && ! product_ids.exists(p.id)) %]
+ <option value="[% p.$valueattribute FILTER html %]"
+ [% " selected" IF (cgi.param(name) == p.name) || (value == p.name) %]>
+ [% p.name FILTER html %]
+ </option>
+ [% END %]
+ </optgroup>
+ [% END %]
+ [% ELSE %]
+ [% products = user.get_selectable_products UNLESS products %]
+ [% FOREACH p = products %]
+ <option value="[% p.$valueattribute FILTER html %]"
+ [% " selected" IF (cgi.param(name) == p.name) || (value == p.name) %]>
+ [% p.name FILTER html %]
+ </option>
+ [% END %]
+ [% END %]
+ </select>
+[% ELSE %]
+ [% value.join(', ') FILTER html %]
+[% END %]
diff --git a/template/en/default/list/edit-multiple.html.tmpl b/template/en/default/list/edit-multiple.html.tmpl
index 2282d69f4..5adc47a59 100644
--- a/template/en/default/list/edit-multiple.html.tmpl
+++ b/template/en/default/list/edit-multiple.html.tmpl
@@ -49,9 +49,11 @@
<th><label for="product">Product:</label></th>
<td>
- [% PROCESS selectmenu menuname = "product"
- menuitems = products
- property = "name" %]
+ [% INCLUDE "global/product-select.html.tmpl"
+ id => "product"
+ name => "product"
+ dontchange => dontchange
+ %]
</td>
<th><label for="version">Version:</label></th>
diff --git a/template/en/default/reports/duplicates.html.tmpl b/template/en/default/reports/duplicates.html.tmpl
index 67d1f233e..0d47aae75 100644
--- a/template/en/default/reports/duplicates.html.tmpl
+++ b/template/en/default/reports/duplicates.html.tmpl
@@ -51,13 +51,11 @@
<tr>
<td>Restrict to products:</td>
<td>
- <select name="product" size="5" multiple="multiple">
- [% FOREACH p = user.get_selectable_products %]
- <option name="[% p.name FILTER html %]"
- [% ' selected="selected"' IF product.contains(p.name) %]
- >[% p.name FILTER html %]</option>
- [% END %]
- </select>
+ [% INCLUDE "global/product-select.html.tmpl"
+ id => "product"
+ name => "product"
+ multiple => 5
+ %]
</td>
</tr>
diff --git a/template/en/default/reports/old-charts.html.tmpl b/template/en/default/reports/old-charts.html.tmpl
index b3ebe386d..acebca74d 100644
--- a/template/en/default/reports/old-charts.html.tmpl
+++ b/template/en/default/reports/old-charts.html.tmpl
@@ -7,7 +7,6 @@
#%]
[%# INTERFACE:
- # products: an array of product names the user is allowed to view.
# datasets: an array of hashes with available statuses and resolutions.
# url_image: URL of the generated graph.
#%]
@@ -29,11 +28,12 @@
<tr>
<th>Product:</th>
<td>
- <select id="product_id" name="product_id">
- [% FOREACH product = products %]
- <option value="[% product.id FILTER html %]">[% product.name || '-All-' FILTER html %]</option>
- [% END %]
- </select>
+ [% INCLUDE "global/product-select.html.tmpl"
+ id => "product_id"
+ name => "product_id"
+ valueattribute => "id"
+ add => "-All-"
+ %]
</td>
</tr>
<tr>
diff --git a/template/en/default/request/queue.html.tmpl b/template/en/default/request/queue.html.tmpl
index 07dec7315..b2b76ba0b 100644
--- a/template/en/default/request/queue.html.tmpl
+++ b/template/en/default/request/queue.html.tmpl
@@ -67,28 +67,12 @@ to some group are shown by default.
</td>
<th>Product:</th>
<td>
- <select name="product" onchange="selectProduct(this, this.form.component, null, null, 'Any');">
- <option value="">Any</option>
- [% IF Param('useclassification') %]
- [% FOREACH c = user.get_selectable_classifications %]
- <optgroup label="[% c.name FILTER html %]">
- [% FOREACH p = user.get_selectable_products(c.id) %]
- <option value="[% p.name FILTER html %]"
- [% " selected" IF cgi.param('product') == p.name %]>
- [% p.name FILTER html %]
- </option>
- [% END %]
- </optgroup>
- [% END %]
- [% ELSE %]
- [% FOREACH p = user.get_selectable_products %]
- <option value="[% p.name FILTER html %]"
- [% " selected" IF cgi.param('product') == p.name %]>
- [% p.name FILTER html %]
- </option>
- [% END %]
- [% END %]
- </select>
+ [% INCLUDE "global/product-select.html.tmpl"
+ id => "product"
+ name => "product"
+ add => "Any"
+ onchange => "selectProduct(this, this.form.component, null, null, 'Any');"
+ %]
</td>
<th>Flag:</th>
<td>
diff --git a/template/en/default/search/search-specific.html.tmpl b/template/en/default/search/search-specific.html.tmpl
index 4d1b4c7ef..e5d59abfb 100644
--- a/template/en/default/search/search-specific.html.tmpl
+++ b/template/en/default/search/search-specific.html.tmpl
@@ -60,30 +60,11 @@ for "crash secure SSL flash".
<label for="product">[% field_descs.product FILTER html %]:</label>
</th>
<td>
- <select name="product" id="product">
- <option value="">All</option>
- [% IF Param('useclassification') %]
- [% FOREACH c = classification %]
- <optgroup label="[% c.name FILTER html %]">
- [% FOREACH p = user.get_selectable_products(c.id) %]
- [% IF p.components.size %]
- <option value="[% p.name FILTER html %]"
- [% " selected" IF default.product.contains(p.name) %]>
- [% p.name FILTER html %]
- </option>
- [% END %]
- [% END %]
- </optgroup>
- [% END %]
- [% ELSE %]
- [% FOREACH p = product %]
- <option value="[% p.name FILTER html %]"
- [% " selected" IF default.product.contains(p.name) %]>
- [% p.name FILTER html %]
- </option>
- [% END %]
- [% END %]
- </select>
+ [% INCLUDE "global/product-select.html.tmpl"
+ id => "product"
+ name => "product"
+ add => "All"
+ %]
</td>
</tr>
<tr>