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 { ...@@ -3415,9 +3415,13 @@ sub choices {
if (!grep($_->name eq $self->product_obj->name, @products)) { if (!grep($_->name eq $self->product_obj->name, @products)) {
unshift(@products, $self->product_obj); 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 = ( my %choices = (
bug_status => $self->statuses_available, bug_status => $self->statuses_available,
classification => $classifications,
product => \@products, product => \@products,
component => $self->product_obj->components, component => $self->product_obj->components,
version => $self->product_obj->versions, version => $self->product_obj->versions,
......
...@@ -20,11 +20,12 @@ use strict; ...@@ -20,11 +20,12 @@ use strict;
package Bugzilla::Classification; package Bugzilla::Classification;
use Bugzilla::Constants; use Bugzilla::Constants;
use Bugzilla::Field;
use Bugzilla::Util; use Bugzilla::Util;
use Bugzilla::Error; use Bugzilla::Error;
use Bugzilla::Product; use Bugzilla::Product;
use base qw(Bugzilla::Object); use base qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object);
############################### ###############################
#### Initialization #### #### Initialization ####
...@@ -111,6 +112,14 @@ sub _check_sortkey { ...@@ -111,6 +112,14 @@ sub _check_sortkey {
return $sortkey; return $sortkey;
} }
#####################################
# Implement Bugzilla::Field::Choice #
#####################################
use constant FIELD_NAME => 'classification';
use constant is_default => 0;
use constant is_active => 1;
############################### ###############################
#### Methods #### #### Methods ####
############################### ###############################
......
...@@ -403,6 +403,7 @@ use constant EMPTY_DATETIME_REGEX => qr/^[0\-:\sA-Za-z]+$/; ...@@ -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 # See the POD for Bugzilla::Field/is_abnormal to see why these are listed
# here. # here.
use constant ABNORMAL_SELECTS => qw( use constant ABNORMAL_SELECTS => qw(
classification
product product
component component
); );
......
...@@ -166,7 +166,7 @@ use constant DEFAULT_FIELDS => ( ...@@ -166,7 +166,7 @@ use constant DEFAULT_FIELDS => (
{name => 'short_desc', desc => 'Summary', in_new_bugmail => 1, {name => 'short_desc', desc => 'Summary', in_new_bugmail => 1,
is_mandatory => 1, buglist => 1}, is_mandatory => 1, buglist => 1},
{name => 'classification', desc => 'Classification', in_new_bugmail => 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, {name => 'product', desc => 'Product', in_new_bugmail => 1,
type => FIELD_TYPE_SINGLE_SELECT, buglist => 1}, type => FIELD_TYPE_SINGLE_SELECT, buglist => 1},
{name => 'version', desc => 'Version', in_new_bugmail => 1, {name => 'version', desc => 'Version', in_new_bugmail => 1,
......
...@@ -64,6 +64,7 @@ use constant VALIDATORS => { ...@@ -64,6 +64,7 @@ use constant VALIDATORS => {
use constant CLASS_MAP => { use constant CLASS_MAP => {
bug_status => 'Bugzilla::Status', bug_status => 'Bugzilla::Status',
classification => 'Bugzilla::Classification',
component => 'Bugzilla::Component', component => 'Bugzilla::Component',
product => 'Bugzilla::Product', product => 'Bugzilla::Product',
}; };
......
...@@ -791,6 +791,13 @@ sub flag_types { ...@@ -791,6 +791,13 @@ sub flag_types {
return $self->{'flag_types'}; return $self->{'flag_types'};
} }
sub classification {
my $self = shift;
$self->{'classification'} ||=
new Bugzilla::Classification($self->classification_id);
return $self->{'classification'};
}
############################### ###############################
#### Accessors ###### #### Accessors ######
############################### ###############################
...@@ -853,6 +860,7 @@ Bugzilla::Product - Bugzilla product class. ...@@ -853,6 +860,7 @@ Bugzilla::Product - Bugzilla product class.
my $bug_ids = $product->bug_ids(); my $bug_ids = $product->bug_ids();
my $has_access = $product->user_has_access($user); my $has_access = $product->user_has_access($user);
my $flag_types = $product->flag_types(); my $flag_types = $product->flag_types();
my $classification = $product->classification();
my $id = $product->id; my $id = $product->id;
my $name = $product->name; my $name = $product->name;
...@@ -1021,6 +1029,14 @@ a group is valid in a particular product.) ...@@ -1021,6 +1029,14 @@ a group is valid in a particular product.)
Returns: Two references to an array of flagtype objects. 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 =back
=head1 SUBROUTINES =head1 SUBROUTINES
......
...@@ -416,7 +416,8 @@ foreach my $field (@enter_bug_fields) { ...@@ -416,7 +416,8 @@ foreach my $field (@enter_bug_fields) {
} }
# This allows the Field visibility and value controls to work with the # 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; $default{'product'} = $product->name;
if ($cloned_bug_id) { if ($cloned_bug_id) {
......
...@@ -375,6 +375,20 @@ function updateCommentTagControl(checkbox, form) { ...@@ -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 * Says that a field should only be displayed when another field has
* a certain value. May only be called after the controller has already * a certain value. May only be called after the controller has already
* been added to the DOM. * been added to the DOM.
......
...@@ -128,6 +128,15 @@ ...@@ -128,6 +128,15 @@
[% END %] [% 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> </script>
...@@ -319,7 +328,6 @@ ...@@ -319,7 +328,6 @@
[%#############%] [%#############%]
[%# PRODUCT #%] [%# PRODUCT #%]
[%#############%] [%#############%]
<tr> <tr>
[% INCLUDE bug/field.html.tmpl [% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.product, bug = bug, field = bug_fields.product,
...@@ -327,6 +335,19 @@ ...@@ -327,6 +335,19 @@
desc_url = 'describecomponents.cgi', value = bug.product desc_url = 'describecomponents.cgi', value = bug.product
editable = bug.check_can_change_field('product', 0, 1) %] editable = bug.check_can_change_field('product', 0, 1) %]
</tr> </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 #%] [%# Component #%]
[%###############%] [%###############%]
......
...@@ -39,3 +39,6 @@ ...@@ -39,3 +39,6 @@
[% legal_value.id FILTER js %]); [% legal_value.id FILTER js %]);
[% END %] [% END %]
[% 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