classification.
r=mkanat, r=timello, a=mkanat
if (!grep($_->name eq $self->product_obj->name, @products)) {
unshift(@products, $self->product_obj);
}
+ my %class_ids = map { $_->classification_id => 1 } @products;
+ my $classifications =
+ Bugzilla::Classification->new_from_list([keys %class_ids]);
my %choices = (
bug_status => $self->statuses_available,
+ classification => $classifications,
product => \@products,
component => $self->product_obj->components,
version => $self->product_obj->versions,
package Bugzilla::Classification;
use Bugzilla::Constants;
+use Bugzilla::Field;
use Bugzilla::Util;
use Bugzilla::Error;
use Bugzilla::Product;
-use base qw(Bugzilla::Object);
+use base qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object);
###############################
#### Initialization ####
return $sortkey;
}
+#####################################
+# Implement Bugzilla::Field::Choice #
+#####################################
+
+use constant FIELD_NAME => 'classification';
+use constant is_default => 0;
+use constant is_active => 1;
+
###############################
#### Methods ####
###############################
# See the POD for Bugzilla::Field/is_abnormal to see why these are listed
# here.
use constant ABNORMAL_SELECTS => qw(
+ classification
product
component
);
{name => 'short_desc', desc => 'Summary', in_new_bugmail => 1,
is_mandatory => 1, buglist => 1},
{name => 'classification', desc => 'Classification', in_new_bugmail => 1,
- buglist => 1},
+ type => FIELD_TYPE_SINGLE_SELECT, buglist => 1},
{name => 'product', desc => 'Product', in_new_bugmail => 1,
type => FIELD_TYPE_SINGLE_SELECT, buglist => 1},
{name => 'version', desc => 'Version', in_new_bugmail => 1,
use constant CLASS_MAP => {
bug_status => 'Bugzilla::Status',
+ classification => 'Bugzilla::Classification',
component => 'Bugzilla::Component',
product => 'Bugzilla::Product',
};
return $self->{'flag_types'};
}
+sub classification {
+ my $self = shift;
+ $self->{'classification'} ||=
+ new Bugzilla::Classification($self->classification_id);
+ return $self->{'classification'};
+}
+
###############################
#### Accessors ######
###############################
my $bug_ids = $product->bug_ids();
my $has_access = $product->user_has_access($user);
my $flag_types = $product->flag_types();
+ my $classification = $product->classification();
my $id = $product->id;
my $name = $product->name;
Returns: Two references to an array of flagtype objects.
+=item C<classification()>
+
+ Description: Returns the classification the product belongs to.
+
+ Params: none.
+
+ Returns: A Bugzilla::Classification object.
+
=back
=head1 SUBROUTINES
}
# This allows the Field visibility and value controls to work with the
-# Product field as a parent.
+# Classification and Product fields as a parent.
+$default{'classification'} = $product->classification->name;
$default{'product'} = $product->name;
if ($cloned_bug_id) {
}
}
+/**
+ * Reset the value of the classification field and fire an event change
+ * on it. Called when the product changes, in case the classification
+ * field (which is hidden) controls the visibility of any other fields.
+ */
+function setClassification() {
+ var classification = document.getElementById('classification');
+ var product = document.getElementById('product');
+ var selected_product = product.value;
+ var select_classification = all_classifications[selected_product];
+ classification.value = select_classification;
+ bz_fireEvent(classification, 'change');
+}
+
/**
* Says that a field should only be displayed when another field has
* a certain value. May only be called after the controller has already
[% END %]
+ /* Index all classifications so we can keep track of the classification
+ * for the selected product, which could control field visibility.
+ */
+ var all_classifications = new Array([% bug.choices.product.size %]);
+ [%- FOREACH product = bug.choices.product %]
+ all_classifications['[% product.name FILTER js %]'] = '
+ [%- product.classification.name FILTER js %]';
+ [%- END %]
+
//-->
</script>
[%#############%]
[%# PRODUCT #%]
[%#############%]
-
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.product,
desc_url = 'describecomponents.cgi', value = bug.product
editable = bug.check_can_change_field('product', 0, 1) %]
</tr>
+
+ [%# Classification is here so that it can be used in value controllers
+ # and visibility controllers. It comes after product because
+ # it uses some javascript that depends on the existence of the
+ # product field.
+ #%]
+ <tr class="bz_default_hidden">
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug field = bug_fields.classification
+ override_legal_values = bug.choices.classification
+ value = bug.classification
+ editable = bug.check_can_change_field('product', 0, 1) %]
+ </tr>
[%###############%]
[%# Component #%]
[%###############%]
[% legal_value.id FILTER js %]);
[% END %]
[% END %]
+[% IF field.name == 'classification' %]
+ YAHOO.util.Event.on('product', 'change', setClassification);
+[% END %]