Commit bcab6fcb authored by Kent Rogers's avatar Kent Rogers Committed by Max Kanat-Alexander

Bug 514618: Allow restricting the visibility and values of fields by

classification. r=mkanat, r=timello, a=mkanat
parent 65528cc7
......@@ -3415,9 +3415,13 @@ sub choices {
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,
......
......@@ -20,11 +20,12 @@ use strict;
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 ####
......@@ -111,6 +112,14 @@ sub _check_sortkey {
return $sortkey;
}
#####################################
# Implement Bugzilla::Field::Choice #
#####################################
use constant FIELD_NAME => 'classification';
use constant is_default => 0;
use constant is_active => 1;
###############################
#### Methods ####
###############################
......
......@@ -403,6 +403,7 @@ use constant EMPTY_DATETIME_REGEX => qr/^[0\-:\sA-Za-z]+$/;
# See the POD for Bugzilla::Field/is_abnormal to see why these are listed
# here.
use constant ABNORMAL_SELECTS => qw(
classification
product
component
);
......
......@@ -166,7 +166,7 @@ use constant DEFAULT_FIELDS => (
{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,
......
......@@ -64,6 +64,7 @@ use constant VALIDATORS => {
use constant CLASS_MAP => {
bug_status => 'Bugzilla::Status',
classification => 'Bugzilla::Classification',
component => 'Bugzilla::Component',
product => 'Bugzilla::Product',
};
......
......@@ -791,6 +791,13 @@ sub flag_types {
return $self->{'flag_types'};
}
sub classification {
my $self = shift;
$self->{'classification'} ||=
new Bugzilla::Classification($self->classification_id);
return $self->{'classification'};
}
###############################
#### Accessors ######
###############################
......@@ -853,6 +860,7 @@ Bugzilla::Product - Bugzilla product class.
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;
......@@ -1021,6 +1029,14 @@ a group is valid in a particular product.)
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
......
......@@ -416,7 +416,8 @@ foreach my $field (@enter_bug_fields) {
}
# 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) {
......
......@@ -375,6 +375,20 @@ function updateCommentTagControl(checkbox, form) {
}
/**
* 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
* been added to the DOM.
......
......@@ -128,6 +128,15 @@
[% 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>
......@@ -319,7 +328,6 @@
[%#############%]
[%# PRODUCT #%]
[%#############%]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.product,
......@@ -327,6 +335,19 @@
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 #%]
[%###############%]
......
......@@ -39,3 +39,6 @@
[% legal_value.id FILTER js %]);
[% END %]
[% END %]
[% IF field.name == 'classification' %]
YAHOO.util.Event.on('product', 'change', setClassification);
[% END %]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment