diff options
-rw-r--r-- | CGI.pl | 29 | ||||
-rwxr-xr-x | query.cgi | 2 | ||||
-rwxr-xr-x | report.cgi | 73 | ||||
-rw-r--r-- | template/en/default/global/useful-links.html.tmpl | 2 | ||||
-rw-r--r-- | template/en/default/global/user-error.html.tmpl | 5 | ||||
-rw-r--r-- | template/en/default/reports/menu.html.tmpl | 61 | ||||
-rw-r--r-- | template/en/default/reports/report-table.csv.tmpl (renamed from template/en/default/reports/table.csv.tmpl) | 42 | ||||
-rw-r--r-- | template/en/default/reports/report-table.html.tmpl | 207 | ||||
-rw-r--r-- | template/en/default/reports/table.html.tmpl | 143 | ||||
-rw-r--r-- | template/en/default/search/search-report-table.html.tmpl | 98 |
10 files changed, 412 insertions, 250 deletions
@@ -199,6 +199,35 @@ sub ProcessMultipartFormFields { } } +sub CanonicaliseParams { + my ($buffer, $exclude) = (@_); + my %pieces; + + # Split the buffer up into key/value pairs, and store the non-empty ones + my @args = split('&', $buffer); + + foreach my $arg (@args) { + my ($name, $value) = split('=', $arg, 2); + + if ($value) { + push(@{$pieces{$name}}, $value); + } + } + + # Reconstruct the URL by concatenating the sorted param=value pairs + my @parameters; + foreach my $key (sort keys %pieces) { + # Leave this key out if it's in the exclude list + next if lsearch($exclude, $key) != -1; + + foreach my $value (@{$pieces{$key}}) { + push(@parameters, "$key=$value"); + } + } + + return join("&", @parameters); +} + # check and see if a given field exists, is non-empty, and is set to a # legal value. assume a browser bug and abort appropriately if not. # if $legalsRef is not passed, just check to make sure the value exists and @@ -131,7 +131,7 @@ sub PrefillForm { "bug_file_loc_type", "status_whiteboard", "status_whiteboard_type", "bug_id", "bugidtype", "keywords", "keywords_type", - "x_axis_field", "y_axis_field") + "x_axis_field", "y_axis_field", "z_axis_field") { # This is a bit of a hack. The default, empty list has # three entries to accommodate the needs of the email fields - diff --git a/report.cgi b/report.cgi index 525897771..35055110e 100755 --- a/report.cgi +++ b/report.cgi @@ -37,13 +37,22 @@ GetVersionTable(); quietly_check_login(); -# If other report types are added, some of this code can be moved into a sub, -# and the correct sub chosen based on $::FORM{'type'}. +if ($::FORM{'action'} ne "plot") { + print "Content-Type: text/html\n\n"; + $template->process("reports/menu.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; +} $::FORM{'y_axis_field'} || ThrowCodeError("no_y_axis_defined"); +if ($::FORM{'z_axis_field'} && !$::FORM{'x_axis_field'}) { + ThrowUserError("z_axis_defined_with_no_x_axis"); +} + my $col_field = $::FORM{'x_axis_field'}; my $row_field = $::FORM{'y_axis_field'}; +my $tbl_field = $::FORM{'z_axis_field'}; my %columns; $columns{'bug_severity'} = "bugs.bug_severity"; @@ -61,10 +70,11 @@ $columns{'op_sys'} = "bugs.op_sys"; $columns{'votes'} = "bugs.votes"; $columns{'keywords'} = "bugs.keywords"; $columns{'target_milestone'} = "bugs.target_milestone"; +# One which means "nothing". Any number would do, really. It just gets SELECTed +# so that we always select 3 items in the query. +$columns{''} = "42217354"; -my @axis_fields = ($row_field); -# The X axis (horizontal) is optional -push(@axis_fields, $col_field) if $col_field; +my @axis_fields = ($row_field, $col_field, $tbl_field); my @selectnames = map($columns{$_}, @axis_fields); @@ -72,59 +82,42 @@ my $search = new Bugzilla::Search('fields' => \@selectnames, 'url' => $::buffer); my $query = $search->getSQL(); -$query =~ s/DISTINCT//; SendSQL($query, $::userid); -# We have a hash for each direction for the totals, and a hash of hashes for -# the data itself. +# We have a hash of hashes for the data itself, and a hash to hold the +# row/col/table names. my %data; -my %row_totals; -my %col_totals; -my $grand_total; +my %names; # Read the bug data and increment the counts. while (MoreSQLData()) { - my ($row, $col) = FetchSQLData(); - $row = "" if !defined($row); - $col = "" if !defined($col); + my ($row, $col, $tbl) = FetchSQLData(); + $col = "" if ($col == $columns{''}); + $tbl = "" if ($tbl == $columns{''}); - $data{$row}{$col}++; - $row_totals{$row}++; - $col_totals{$col}++; - $grand_total++; + $data{$tbl}{$col}{$row}++; + $names{"col"}{$col}++; + $names{"row"}{$row}++; + $names{"tbl"}{$tbl}++; } -$vars->{'data'} = \%data; -$vars->{'row_totals'} = \%row_totals; -$vars->{'col_totals'} = \%col_totals; -$vars->{'grand_total'} = $grand_total; - # Determine the labels for the rows and columns -my @row_names = sort(keys(%row_totals)); -my @col_names = sort(keys(%col_totals)); - -$vars->{'row_names'} = \@row_names; -$vars->{'col_names'} = \@col_names; - -$vars->{'row_field'} = $row_field; $vars->{'col_field'} = $col_field; +$vars->{'row_field'} = $row_field; +$vars->{'tbl_field'} = $tbl_field; +$vars->{'names'} = \%names; +$vars->{'data'} = \%data; +$vars->{'time'} = time(); $::buffer =~ s/format=[^&]*&?//g; # Calculate the base query URL for the hyperlinked numbers -my $buglistbase = $::buffer; -$buglistbase =~ s/$row_field=[^&]*&?//g; -$buglistbase =~ s/$col_field=[^&]*&?//g; - -$vars->{'buglistbase'} = $buglistbase; +$vars->{'buglistbase'} = CanonicaliseParams($::buffer, + ["x_axis_field", "y_axis_field", "z_axis_field", @axis_fields]); $vars->{'buffer'} = $::buffer; -$::FORM{'type'} =~ s/[^a-zA-Z\-]//g; - # Generate and return the result from the appropriate template. -my $format = GetFormat("reports/$::FORM{'type'}", - $::FORM{'format'}, - $::FORM{'ctype'}); +my $format = GetFormat("reports/report", $::FORM{'format'}, $::FORM{'ctype'}); print "Content-Type: $format->{'contenttype'}\n\n"; $template->process("$format->{'template'}", $vars) || ThrowTemplateError($template->error()); diff --git a/template/en/default/global/useful-links.html.tmpl b/template/en/default/global/useful-links.html.tmpl index 785a9d75e..07ae8f6fe 100644 --- a/template/en/default/global/useful-links.html.tmpl +++ b/template/en/default/global/useful-links.html.tmpl @@ -49,7 +49,7 @@ <input type="submit" value="Find"> bug # <input name="id" size="6"> | - <a href="reports.cgi">Reports</a> + <a href="report.cgi">Reports</a> | <a href="request.cgi">Requests</a> diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl index 1f36f6f1e..91ee01743 100644 --- a/template/en/default/global/user-error.html.tmpl +++ b/template/en/default/global/user-error.html.tmpl @@ -521,6 +521,11 @@ [% title = "Wrong Token" %] That token cannot be used to change your email address. + [% ELSIF error == "z_axis_defined_with_no_x_axis" %] + [% title = "Nonsensical Options" %] + You've defined a field for multiple tables without having defined + a horizontal axis for those tables. + [% ELSIF error == "zero_length_file" %] [% title = "File Is Empty" %] The file you are trying to attach is empty! diff --git a/template/en/default/reports/menu.html.tmpl b/template/en/default/reports/menu.html.tmpl new file mode 100644 index 000000000..d93717532 --- /dev/null +++ b/template/en/default/reports/menu.html.tmpl @@ -0,0 +1,61 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + #%] + +[%# INTERFACE: + # This template has no interface. It's a list of the available report + # types in Bugzilla. + #%] + +[% PROCESS global/header.html.tmpl + title = "Reporting and Charting Kitchen" +%] + +<p> + Bugzilla allows you to view and track the state of your bug database in + all manner of exciting ways. +</p> + +<h2>Current State</h2> + +<ul> + <li> + <strong><a href="query.cgi">Search</a></strong> - + list sets of bugs. + </li> + <li> + <strong> + <a href="query.cgi?format=report-table">Tabular reports</a> + </strong> - + tables of bug counts in 1, 2 or 3 dimensions, as HTML or CSV. + </li> +</ul> + +<h2>Change Over Time</h2> + +<ul> + <li> + <strong><a href="reports.cgi">Charts</a></strong> - + plot the status and/or resolution of bugs against + time, for each product in your database. + </li> +</ul> + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/reports/table.csv.tmpl b/template/en/default/reports/report-table.csv.tmpl index 96b0c3971..a80a618c8 100644 --- a/template/en/default/reports/table.csv.tmpl +++ b/template/en/default/reports/report-table.csv.tmpl @@ -21,21 +21,37 @@ [%# INTERFACE: # See report.html.tmpl. #%] -[% row_field FILTER csv -%] + +[% tbl_names = names.tbl.keys.sort %] +[% col_names = names.col.keys.sort %] +[% row_names = names.row.keys.sort %] -[% IF col_field -%] +[% FOREACH tbl = tbl_names %] + [% IF tbl_field -%] + [% tbl FILTER html %] + [% END %] + + [% row_field FILTER csv -%] + + [% IF col_field -%] \ [% col_field FILTER csv -%], -[% FOREACH col = col_names -%] -[% col FILTER csv -%], -[% END -%] -[% ELSE -%] -,Number of bugs, -[% END %] + [% FOREACH col = col_names -%] + [% col FILTER csv -%], + [% END -%] + [% ELSE -%] + [% -%],Number of bugs + [% END %] -[% FOREACH row = row_names %] -[% row FILTER csv -%], -[% FOREACH col = col_names %] -[% IF data.$row AND data.$row.$col %][% data.$row.$col -%],[% ELSE %]0,[% END %] -[% END %] + [% FOREACH row = row_names %] + [% row FILTER csv -%], + [% FOREACH col = col_names %] + [% IF data.$tbl AND data.$tbl.$col AND data.$tbl.$col.$row %] + [% data.$tbl.$col.$row -%], + [% ELSE %] + [% -%]0, + [% END %] + [% END %] + [% END %] + [% END %] diff --git a/template/en/default/reports/report-table.html.tmpl b/template/en/default/reports/report-table.html.tmpl new file mode 100644 index 000000000..81ca27866 --- /dev/null +++ b/template/en/default/reports/report-table.html.tmpl @@ -0,0 +1,207 @@ + <!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + # <rdean@cambianetworks.com> + #%] + +[%# INTERFACE: + # basequery: The base query for this table, in URL form + # data: hash of hash of hash of numbers. Bug counts. + # names: hash of hash of strings. Names of tables, rows and columns. + # col_field: string. Name of the field being plotted as columns. + # row_field: string. Name of the field being plotted as rows. + # tbl_field: string. Name of the field being plotted as tables. + #%] + +[% PROCESS "global/field-descs.html.tmpl" %] + +[% tbl_field_disp = field_descs.$tbl_field || tbl_field %] +[% col_field_disp = field_descs.$col_field || col_field %] +[% row_field_disp = field_descs.$row_field || row_field %] + +[% title = BLOCK %] + Report: + [% "$tbl_field_disp / " IF tbl_field %] + [% "$col_field_disp / " IF col_field %] + [% row_field_disp %] +[% END %] + +[% PROCESS global/header.html.tmpl + style = " + .t1 { background-color: #ffffff } /* white */ + .t2 { background-color: #dfefff } /* light blue */ + .t3 { background-color: #dddddd } /* grey */ + .t4 { background-color: #c3d3ed } /* darker blue */ + .ttotal { background-color: #cfffdf } /* light green */ + " +%] + +<div align="right"> + [% time2str("%Y-%m-%d %H:%M:%S", time) %] +</div> + +[% tbl_names = names.tbl.keys.sort %] +[% col_names = names.col.keys.sort %] +[% row_names = names.row.keys.sort %] + +[% total_name = "Total" %] + +[% IF tbl_field %] + [%# Calculate and set up the Total table %] + + [% FOREACH tbl = tbl_names %] + [% FOREACH row = row_names %] + [% FOREACH col = col_names %] + [% data.$total_name.$col.$row = + data.$total_name.$col.$row + data.$tbl.$col.$row %] + [% END %] + [% END %] + [% END %] + + [% tbl_names.push(total_name) %] +[% END %] + +<div align="center"> + +[% FOREACH tbl = tbl_names %] + <table> + [% IF tbl_field %] + <tr> + <td> + </td> + <td align="center"> + <h2>[% tbl FILTER html %]</h2> + </td> + </tr> + [% END %] + <tr> + <td> + </td> + <td align="center"> + <strong>[% col_field_disp FILTER html %]</strong> + </td> + </tr> + + <tr> + <td valign="middle"> + <strong>[% row_field_disp FILTER html %]</strong> + </td> + <td> + + +[% classes = [ [ "t1", "t2" ] , [ "t3", "t4" ] ] %] +[% col_idx = 0 %] +[% row_idx = 0 %] +[% grand_total = 0 %] + +<table border="1"> + [% IF col_field %] + <tr> + <td class="[% classes.$row_idx.$col_idx %]"> + </td> + [% FOREACH col = col_names %] + [% col_totals.$col = 0 %] + [% NEXT IF col == "" %] + + [% col_idx = 1 - col_idx %] + <td class="[% classes.$row_idx.$col_idx %]"> + [% col FILTER html %] + </td> + [% END %] + <td class="ttotal"> + Total + </td> + </tr> + [% END %] + + [% FOREACH row = row_names %] + [% row_total = 0 %] + + [% row_idx = 1 - row_idx %] + <tr> + <td class="[% classes.$row_idx.$col_idx %]" align="right"> + [% row FILTER html %] + </td> + [% FOREACH col = col_names %] + [% row_total = row_total + data.$tbl.$col.$row %] + [% col_totals.$col = col_totals.$col + data.$tbl.$col.$row %] + [% NEXT IF col == "" %] + + [% col_idx = 1 - col_idx %] + <td class="[% classes.$row_idx.$col_idx %]" align="center"> + [% IF data.$tbl.$col.$row AND data.$tbl.$col.$row > 0 %] + <a href="buglist.cgi?[% buglistbase %]& + [% tbl_field FILTER url_quote %]=[% tbl FILTER url_quote %]& + [% row_field FILTER url_quote %]=[% row FILTER url_quote %]& + [% col_field FILTER url_quote %]=[% col FILTER url_quote %]"> + [% data.$tbl.$col.$row %]</a> + [% ELSE %] + . + [% END %] + </td> + [% END %] + <td class="ttotal" align="right"> + <a href="buglist.cgi?[% buglistbase %]& + [% tbl_field FILTER url_quote %]=[% tbl FILTER url_quote %]& + [% row_field FILTER url_quote %]=[% row FILTER url_quote %]"> + [% row_total %]</a> + [% grand_total = grand_total + row_total %] + </td> + </tr> + [% END %] + + <tr> + [% row_idx = 1 - row_idx %] + <td class="ttotal"> + Total + </td> + [% FOREACH col = col_names %] + [% NEXT IF col == "" %] + + <td class="ttotal" align="center"> + <a href="buglist.cgi?[% buglistbase %]& + [% tbl_field FILTER url_quote %]=[% tbl FILTER url_quote %]& + [% col_field FILTER url_quote %]=[% col FILTER url_quote %]"> + [% col_totals.$col %]</a> + <strong> + </td> + [% END %] + <td class="ttotal" align="right"> + <strong> + <a href="buglist.cgi?[% buglistbase %]">[% grand_total %]</a> + </strong> + </td> + </tr> +</table> + + + </td> + </tr> + </table> + + <br> + +[% END %] + + <a href="query.cgi?[% buffer %]&format=report-table">Edit this report</a> +</div> + +<br> + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/reports/table.html.tmpl b/template/en/default/reports/table.html.tmpl deleted file mode 100644 index d9a04d5fd..000000000 --- a/template/en/default/reports/table.html.tmpl +++ /dev/null @@ -1,143 +0,0 @@ - <!-- 1.0@bugzilla.org --> -[%# The contents of this file are subject to the Mozilla Public - # License Version 1.1 (the "License"); you may not use this file - # except in compliance with the License. You may obtain a copy of - # the License at http://www.mozilla.org/MPL/ - # - # Software distributed under the License is distributed on an "AS - # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - # implied. See the License for the specific language governing - # rights and limitations under the License. - # - # The Original Code is the Bugzilla Bug Tracking System. - # - # The Initial Developer of the Original Code is Netscape Communications - # Corporation. Portions created by Netscape are - # Copyright (C) 1998 Netscape Communications Corporation. All - # Rights Reserved. - # - # Contributor(s): Gervase Markham <gerv@gerv.net> - # <rdean@cambianetworks.com> - #%] - -[%# INTERFACE: - # basequery: The base query for this table, in URL form - # row_field: string. The field name for the data in table rows - # col_field: string. The field name for the data in table columns - # col_names: array of strings. Values for the columns - # row_names: array of strings. Values for the rows - # col_totals: hash of integers. Totals for the columns, indexed by col_names. - # row_totals: hash of integers. Totals for the rows, indexed by row_names. - # data: hash of hash of numbers. Bug counts indexed by col_names and - # row_names values. - #%] - -[% PROCESS global/header.html.tmpl - title = "Report" - onload = "selectProduct(document.forms['queryform']);" - style = " - .t1 { background-color: #ffffff } - .t2 { background-color: #dfefff } - .t3 { background-color: #dddddd } - .t4 { background-color: #c3d3ed } - .ttotal { background-color: #cfffdf } - " -%] - -<div align="center"> - <table> - <tr> - <td> - </td> - <td align="center"> - <strong>[% col_field FILTER html %]</strong> - </td> - </tr> - - <tr> - <td valign="middle"> - <strong>[% row_field FILTER html %]</strong> - </td> - <td> - - -[% classes = [ [ "t1", "t2" ] , [ "t3", "t4" ] ] %] -[% col_idx = 0 %] -[% row_idx = 0 %] - -<table> - [% IF col_names %] - <tr> - <td class="[% classes.$row_idx.$col_idx %]"> - </td> - [% FOREACH col = col_names %] - [%# If no col header, skip the col. This makes display look right if - there's no defined X axis. Not doing this gives us two cols. %] - [% NEXT IF col == "" %] - [% col_idx = 1 - col_idx %] - <td class="[% classes.$row_idx.$col_idx %]"> - [% col FILTER html %] - </td> - [% END %] - <td class="ttotal"> - Total - </td> - </tr> - [% END %] - - [% FOREACH row = row_names %] - [% row_idx = 1 - row_idx %] - <tr> - <td class="[% classes.$row_idx.$col_idx %]"> - [% row FILTER html %] - </td> - [% FOREACH col = col_names %] - [% NEXT IF col == "" %] - [% col_idx = 1 - col_idx %] - <td class="[% classes.$row_idx.$col_idx %]" align="center"> - [% IF data.$row.$col AND data.$row.$col > 0 %] - <a href="buglist.cgi?[% buglistbase %]& - [% row_field FILTER url_quote %]=[% row FILTER url_quote %]& - [% col_field FILTER url_quote %]=[% col FILTER url_quote %]"> - [% data.$row.$col %]</a> - [% ELSE %] - . - [% END %] - </td> - [% END %] - <td class="ttotal"> - [% row_totals.$row %] - </td> - </tr> - [% END %] - - <tr> - [% row_idx = 1 - row_idx %] - <td class="ttotal"> - Total - </td> - [% FOREACH col = col_names %] - [% NEXT IF col == "" %] - <td class="ttotal" align="center"> - [% col_totals.$col %] - </td> - [% END %] - <td class="ttotal"> - <strong> - [% grand_total %] - </strong> - </td> - </tr> -</table> - - - </td> - </tr> - </table> - - <a href="query.cgi?[% buffer %]&format=report-table">Edit this report</a> -</div> - -<br> - -[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/search/search-report-table.html.tmpl b/template/en/default/search/search-report-table.html.tmpl index 32f816135..73d542124 100644 --- a/template/en/default/search/search-report-table.html.tmpl +++ b/template/en/default/search/search-report-table.html.tmpl @@ -29,47 +29,51 @@ onload = "selectProduct(document.forms['reportform']);" %] +[% PROCESS "global/field-descs.html.tmpl" %] + <p> - Produce a table of bug counts by choosing two fields to plot against each - other, and then refining your set of bugs using the rest of the form. + Produce a table of bug counts by choosing one or more fields to plot against + each other, and then refining your set of bugs using the rest of the form. If + you choose a third axis, it will be represented by multiple tables of data. </p> [% button_name = "Generate Report" %] <form method="get" action="report.cgi" name="reportform"> -<table> +<table align="center"> <tr> - <th align="center"> - Vertical Axis - </th> - <th align="center"> - Horizontal Axis - </th> - <th> - - </th> - <th align="center"> - Format - </th> + <td> + </td> + <td align="center"> + <b>Horizontal Axis:</b> + [% PROCESS select sel = { name => 'x_axis_field', noop = 1 } %] + </td> + <td> </td> + <td rowspan="2"> + <b>Format:</b><br> + <input type="radio" name="ctype" value="html" checked>HTML<br> + <input type="radio" name="ctype" value="csv">CSV + </td> </tr> <tr> - <td align="center"> + <td valign="middle" align="center"> + <b>Vertical Axis:</b><br> [% PROCESS select sel = { name => 'y_axis_field' } %] </td> - <td align="center"> - [% PROCESS select sel = { name => 'x_axis_field', noop = 1 } %] - </td> - <td> - - </td> - <td> - <input type="radio" name="ctype" value="html" checked>HTML - <input type="radio" name="ctype" value="csv">CSV + <td width="150px" height="150px"> + <table border="1" width="100%" height="100%"> + <tr> + <td align="center" valign="middle"> + <b>Multiple Tables:</b><br> + [% PROCESS select sel = { name => 'z_axis_field', noop = 1 } %] + </td> + </tr> + </table> </td> </tr> -</table> +</table> <hr> @@ -77,7 +81,8 @@ <br> <input type="submit" value="[% button_name %]"> -<input type="hidden" name="type" value="table"> +<input type="hidden" name="format" value="table"> +<input type="hidden" name="action" value="plot"> <hr> [% PROCESS "search/boolean-charts.html.tmpl" %] @@ -91,35 +96,24 @@ [%############################################################################%] [% BLOCK select %] - [% fields = [ - { name => "", description => "---" }, - { name => "product", description => "Product" }, - { name => "component", description => "Component" }, - { name => "version", description => "Version" }, - { name => "rep_platform", description => "Platform" }, - { name => "op_sys", description => "OS" }, - { name => "bug_status", description => "Status" }, - { name => "resolution", description => "Resolution" }, - { name => "bug_severity", description => "Severity" }, - { name => "priority", description => "Priority" }, - { name => "target_milestone", description => "Target Milestone" }, - { name => "keywords", description => "Keywords" }, - { name => "assigned_to", description => "Assignee" }, - { name => "reporter", description => "Reporter" }, - { name => "qa_contact", description => "QA Contact" }, - { name => "votes", description => "Votes" } ] %] + [% fields = ["product", "component", "version", "rep_platform", + "op_sys", "bug_status", "resolution", "bug_severity", + "priority", "target_milestone", "keywords", "assigned_to", + "reporter", "qa_contact", "votes" ] %] <select name="[% sel.name %]"> + [% IF sel.noop %] + <option value=""><none></option> + [% END %] + [% FOREACH field = fields %] - [% NEXT IF field.name == "" AND !sel.noop %] - [% NEXT IF field.name == "target_milestone" AND - !Param('usetargetmilestone') %] - [% NEXT IF field.name == "qa_contact" AND !Param('useqacontact') %] - [% NEXT IF field.name == "votes" AND !Param('usevotes') %] + [% NEXT IF field == "target_milestone" AND !Param('usetargetmilestone') %] + [% NEXT IF field == "qa_contact" AND !Param('useqacontact') %] + [% NEXT IF field == "votes" AND !Param('usevotes') %] - <option value="[% field.name FILTER html %]" - [% " selected" IF default.${sel.name}.0 == field.name %]> - [% field.description FILTER html %]</option> + <option value="[% field FILTER html %]" + [% " selected" IF default.${sel.name}.0 == field %]> + [% field_descs.$field || field FILTER html %]</option> [% END %] </select> [% END %] |