summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xenter_bug.cgi40
-rw-r--r--template/en/default/global/choose-classification.html.tmpl5
-rw-r--r--template/en/default/global/choose-product.html.tmpl36
3 files changed, 57 insertions, 24 deletions
diff --git a/enter_bug.cgi b/enter_bug.cgi
index 7f5a17e46..4496f010e 100755
--- a/enter_bug.cgi
+++ b/enter_bug.cgi
@@ -72,21 +72,36 @@ if ($product_name eq '') {
my $classification = Bugzilla->params->{'useclassification'} ?
scalar($cgi->param('classification')) : '__all';
- unless ($classification) {
- my $class;
- # Get all classifications with at least one enterable product.
- foreach my $product (@enterable_products) {
- $class->{$product->classification_id} ||=
- new Bugzilla::Classification($product->classification_id);
+ # Unless a real classification name is given, we sort products
+ # by classification.
+ my @classifications;
+
+ unless ($classification && $classification ne '__all') {
+ if (Bugzilla->params->{'useclassification'}) {
+ my $class;
+ # Get all classifications with at least one enterable product.
+ foreach my $product (@enterable_products) {
+ $class->{$product->classification_id}->{'object'} ||=
+ new Bugzilla::Classification($product->classification_id);
+ # Nice way to group products per classification, without querying
+ # the DB again.
+ push(@{$class->{$product->classification_id}->{'products'}}, $product);
+ }
+ @classifications = sort {$a->{'object'}->sortkey <=> $b->{'object'}->sortkey
+ || lc($a->{'object'}->name) cmp lc($b->{'object'}->name)}
+ (values %$class);
+ }
+ else {
+ @classifications = ({object => undef, products => \@enterable_products});
}
- my @classifications = sort {$a->sortkey <=> $b->sortkey
- || lc($a->name) cmp lc($b->name)}
- (values %$class);
+ }
+ unless ($classification) {
# We know there is at least one classification available,
# else we would have stopped earlier.
if (scalar(@classifications) > 1) {
- $vars->{'classifications'} = \@classifications;
+ # We only need classification objects.
+ $vars->{'classifications'} = [map {$_->{'object'}} @classifications];
$vars->{'target'} = "enter_bug.cgi";
$vars->{'format'} = $cgi->param('format');
@@ -98,7 +113,7 @@ if ($product_name eq '') {
exit;
}
# If we come here, then there is only one classification available.
- $classification = $classifications[0]->name;
+ $classification = $classifications[0]->{'object'}->name;
}
# Keep only enterable products which are in the specified classification.
@@ -108,6 +123,7 @@ if ($product_name eq '') {
if ($class) {
@enterable_products
= grep {$_->classification_id == $class->id} @enterable_products;
+ @classifications = ({object => $class, products => \@enterable_products});
}
else {
@enterable_products = ();
@@ -118,7 +134,7 @@ if ($product_name eq '') {
ThrowUserError('no_products');
}
elsif (scalar(@enterable_products) > 1) {
- $vars->{'products'} = \@enterable_products;
+ $vars->{'classifications'} = \@classifications;
$vars->{'target'} = "enter_bug.cgi";
$vars->{'format'} = $cgi->param('format');
$vars->{'cloned_bug_id'} = $cgi->param('cloned_bug_id');
diff --git a/template/en/default/global/choose-classification.html.tmpl b/template/en/default/global/choose-classification.html.tmpl
index 1ef99d4d8..7f5a5bcad 100644
--- a/template/en/default/global/choose-classification.html.tmpl
+++ b/template/en/default/global/choose-classification.html.tmpl
@@ -41,7 +41,10 @@
</th>
<td valign="top">&nbsp;Show all products</td>
- </tr>
+ </tr>
+ <tr>
+ <th colspan="2">&nbsp;</th>
+ </tr>
[% END %]
[% FOREACH class = classifications %]
diff --git a/template/en/default/global/choose-product.html.tmpl b/template/en/default/global/choose-product.html.tmpl
index 0d4a451b6..a24ca61c1 100644
--- a/template/en/default/global/choose-product.html.tmpl
+++ b/template/en/default/global/choose-product.html.tmpl
@@ -20,8 +20,9 @@
#%]
[%# INTERFACE:
- # products: array of product objects. The list of products
- # the user can enter bugs into.
+ # classifications: array of hashes, with an 'object' key representing a
+ # classification object and 'products' the list of
+ # product objects the user can enter bugs into.
# target: the script that displays this template.
# cloned_bug_id: ID of the bug being cloned.
# format: the desired format to display the target.
@@ -42,16 +43,29 @@
<table>
-[% FOREACH p = products %]
+[% FOREACH c = classifications %]
+ [% IF c.object %]
+ <tr>
+ <th colspan="2" align="left">[% c.object.name FILTER html %]:
+ [%+ c.object.description FILTER html_light %]</th>
+ </tr>
+ [% END %]
+
+ [% FOREACH p = c.products %]
+ <tr>
+ <th align="right" valign="top">
+ <a href="[% target %]?product=[% p.name FILTER url_quote -%]
+ [%- IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER url_quote %][% END -%]
+ [%- IF format %]&amp;format=[% format FILTER url_quote %][% END %]">
+ [% p.name FILTER html FILTER no_break %]</a>:&nbsp;
+ </th>
+
+ <td valign="top">[% p.description FILTER html_light %]</td>
+ </tr>
+ [% END %]
+
<tr>
- <th align="right" valign="top">
- <a href="[% target %]?product=[% p.name FILTER url_quote -%]
- [%- IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER url_quote %][% END -%]
- [%- IF format %]&amp;format=[% format FILTER url_quote %][% END %]">
- [% p.name FILTER html %]</a>:&nbsp;
- </th>
-
- <td valign="top">[% p.description FILTER html_light %]</td>
+ <th colspan="2">&nbsp;</th>
</tr>
[% END %]