summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Bugzilla/Field.pm2
-rw-r--r--Bugzilla/Field/Choice.pm9
-rw-r--r--Bugzilla/Product.pm24
-rwxr-xr-xenter_bug.cgi4
-rw-r--r--template/en/default/admin/custom_fields/cf-js.js.tmpl2
-rw-r--r--template/en/default/bug/edit.html.tmpl9
-rw-r--r--template/en/default/bug/field.html.tmpl12
-rw-r--r--template/en/default/global/user-error.html.tmpl4
8 files changed, 52 insertions, 14 deletions
diff --git a/Bugzilla/Field.pm b/Bugzilla/Field.pm
index 91e9bb8b4..1cc89239e 100644
--- a/Bugzilla/Field.pm
+++ b/Bugzilla/Field.pm
@@ -158,7 +158,7 @@ use constant DEFAULT_FIELDS => (
{name => 'classification', desc => 'Classification', in_new_bugmail => 1,
buglist => 1},
{name => 'product', desc => 'Product', in_new_bugmail => 1,
- buglist => 1},
+ type => FIELD_TYPE_SINGLE_SELECT, buglist => 1},
{name => 'version', desc => 'Version', in_new_bugmail => 1,
buglist => 1},
{name => 'rep_platform', desc => 'Platform', in_new_bugmail => 1,
diff --git a/Bugzilla/Field/Choice.pm b/Bugzilla/Field/Choice.pm
index 9e8fb1235..00fa52f99 100644
--- a/Bugzilla/Field/Choice.pm
+++ b/Bugzilla/Field/Choice.pm
@@ -62,6 +62,7 @@ use constant VALIDATORS => {
use constant CLASS_MAP => {
bug_status => 'Bugzilla::Status',
+ product => 'Bugzilla::Product',
};
use constant DEFAULT_MAP => {
@@ -189,6 +190,13 @@ sub remove_from_db {
ThrowUserError("fieldvalue_still_has_bugs",
{ field => $self->field, value => $self });
}
+ $self->_check_if_controller();
+ $self->SUPER::remove_from_db();
+}
+
+# Factored out to make life easier for subclasses.
+sub _check_if_controller {
+ my $self = shift;
my $vis_fields = $self->controls_visibility_of_fields;
my $values = $self->controlled_values;
if (@$vis_fields || @$values) {
@@ -196,7 +204,6 @@ sub remove_from_db {
{ value => $self, fields => [map($_->name, @$vis_fields)],
vals => $values });
}
- $self->SUPER::remove_from_db();
}
diff --git a/Bugzilla/Product.pm b/Bugzilla/Product.pm
index 396aaa346..88292d27e 100644
--- a/Bugzilla/Product.pm
+++ b/Bugzilla/Product.pm
@@ -31,7 +31,9 @@ use Bugzilla::Install::Requirements;
use Bugzilla::Mailer;
use Bugzilla::Series;
-use base qw(Bugzilla::Object);
+# Currently, we only implement enough of the Bugzilla::Field::Choice
+# interface to control the visibility of other fields.
+use base qw(Bugzilla::Field::Choice);
use constant DEFAULT_CLASSIFICATION_ID => 1;
@@ -40,6 +42,10 @@ use constant DEFAULT_CLASSIFICATION_ID => 1;
###############################
use constant DB_TABLE => 'products';
+# Reset these back to the Bugzilla::Object defaults, instead of the
+# Bugzilla::Field::Choice defaults.
+use constant NAME_FIELD => 'name';
+use constant LIST_ORDER => 'name';
use constant DB_COLUMNS => qw(
id
@@ -372,6 +378,8 @@ sub remove_from_db {
$dbh->bz_start_transaction();
+ $self->_check_if_controller();
+
if ($self->bug_count) {
if (Bugzilla->params->{'allowbugdeletion'}) {
require Bugzilla::Bug;
@@ -523,6 +531,20 @@ sub _check_votes {
return $votes;
}
+#####################################
+# Implement Bugzilla::Field::Choice #
+#####################################
+
+sub field {
+ my $invocant = shift;
+ my $class = ref $invocant || $invocant;
+ my $cache = Bugzilla->request_cache;
+ $cache->{"field_$class"} ||= new Bugzilla::Field({ name => 'product' });
+ return $cache->{"field_$class"};
+}
+
+use constant is_default => 0;
+
###############################
#### Methods ####
###############################
diff --git a/enter_bug.cgi b/enter_bug.cgi
index ef0314bca..f028187fd 100755
--- a/enter_bug.cgi
+++ b/enter_bug.cgi
@@ -389,6 +389,10 @@ foreach my $field (@enter_bug_fields) {
$vars->{$field->name} = formvalue($field->name);
}
+# This allows the Field visibility and value controls to work with the
+# Product field as a parent.
+$default{'product'} = $product->name;
+
if ($cloned_bug_id) {
$default{'component_'} = $cloned_bug->component;
diff --git a/template/en/default/admin/custom_fields/cf-js.js.tmpl b/template/en/default/admin/custom_fields/cf-js.js.tmpl
index 891f5da76..89a8529ed 100644
--- a/template/en/default/admin/custom_fields/cf-js.js.tmpl
+++ b/template/en/default/admin/custom_fields/cf-js.js.tmpl
@@ -27,7 +27,7 @@ var select_values = new Array();
[% FOREACH sel_field = Bugzilla.get_fields({ is_select => 1 }) %]
select_values[[% sel_field.id FILTER js %]] = [
[% FOREACH legal_value = sel_field.legal_values %]
- [[% legal_value.id FILTER js %], '[% legal_value.name FILTER html %]'][% ',' UNLESS loop.last %]
+ [[% legal_value.id FILTER js %], '[% legal_value.name FILTER js %]'][% ',' UNLESS loop.last %]
[% END %]
];
[% END %]
diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl
index 80c5745fc..527766357 100644
--- a/template/en/default/bug/edit.html.tmpl
+++ b/template/en/default/bug/edit.html.tmpl
@@ -369,11 +369,12 @@
[%#############%]
[%# PRODUCT #%]
[%#############%]
+
<tr>
- <td class="field_label">
- <label for="product" accesskey="p"><b><u>P</u>roduct</b></label>:
- </td>
- [% PROCESS select selname => "product" %]
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = select_fields.product,
+ desc_url = 'describecomponents.cgi', value = bug.product
+ editable = bug.check_can_change_field('product', 0, 1) %]
</tr>
[%###############%]
[%# Component #%]
diff --git a/template/en/default/bug/field.html.tmpl b/template/en/default/bug/field.html.tmpl
index 04443579e..3ae7302c6 100644
--- a/template/en/default/bug/field.html.tmpl
+++ b/template/en/default/bug/field.html.tmpl
@@ -30,6 +30,10 @@
# the field value.
# no_tds: boolean; if true, don't display the label <th> or the
# wrapping <td> for the field.
+ # desc_url: string; Normally the label of a non-custom field links to
+ # fields.html. If you want it to link elsewhere, specify the
+ # relative URL you want to link to, here. Remember to call
+ # url_quote on any query string arguments.
# bug (optional): The current Bugzilla::Bug being displayed, or a hash
# with default field values being displayed on a page.
#%]
@@ -49,13 +53,13 @@
[% IF editable %]
<label for="[% field.name FILTER html %]">
[% END %]
- [% IF !field.custom %]
+ [% IF desc_url %]
+ <a href="[% desc_url FILTER html %]">
+ [% ELSIF !field.custom %]
<a href="page.cgi?id=fields.html#[% field.name FILTER url_quote %]">
[% END -%]
[% field_descs.${field.name} FILTER html %]:
- [%- IF !field.custom %]
- </a>
- [% END %]
+ [%- '</a>' IF (!field.custom || desc_url) %]
[% '</label>' IF editable %]
</th>
[% END %]
diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl
index 1efee9a5e..570cdc6fe 100644
--- a/template/en/default/global/user-error.html.tmpl
+++ b/template/en/default/global/user-error.html.tmpl
@@ -475,8 +475,8 @@
[% ELSIF error == "fieldvalue_is_controller" %]
[% title = "Value Controls Other Fields" %]
- You cannot delete the '[% value.name FILTER html %]' value for this
- field because
+ You cannot delete the [% value.field.description FILTER html %]
+ '[% value.name FILTER html %]' because
[% IF fields.size %]
it controls the visibility of the following fields:
[%+ fields.join(', ') FILTER html %].