]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 514618: Allow restricting the visibility and values of fields by
authorKent Rogers <kar@cray.com>
Mon, 5 Jul 2010 21:49:52 +0000 (14:49 -0700)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Mon, 5 Jul 2010 21:49:52 +0000 (14:49 -0700)
classification.
r=mkanat, r=timello, a=mkanat

Bugzilla/Bug.pm
Bugzilla/Classification.pm
Bugzilla/Constants.pm
Bugzilla/Field.pm
Bugzilla/Field/Choice.pm
Bugzilla/Product.pm
enter_bug.cgi
js/field.js
template/en/default/bug/edit.html.tmpl
template/en/default/bug/field-events.js.tmpl

index ea8e4bc3d14301e05ae3e4ca2a8009e801672d42..23a92b080ea1368a8cc098b1e9fa7f6dde93e37f 100644 (file)
@@ -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,
index c7cda11be8c479f1959196201f5af97e850c4a77..88ec4eb3b556cae6ff7bf21ab46f3c0fc7a1f6d1 100644 (file)
@@ -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         ####
 ###############################
index a003ce7398859f0b90ff4e332f816862ae54d56a..9c2a3e353c52d7d12aa94bec8731ca0e0f402839 100644 (file)
@@ -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
 );
index 15b4947627493e45d02d85db2692f77a8c63382d..76bb1d41edeffc28db2400abbb01bb7446ea2892 100644 (file)
@@ -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,
index 0c44134ef277822e0b1f69951f04c215d45977ae..773dbd4ce671bb6399dcc0774075e0af5f6bad8a 100644 (file)
@@ -64,6 +64,7 @@ use constant VALIDATORS => {
 
 use constant CLASS_MAP => {
     bug_status => 'Bugzilla::Status',
+    classification => 'Bugzilla::Classification',
     component  => 'Bugzilla::Component',
     product    => 'Bugzilla::Product',
 };
index 51464976345fe35e0f6011951d19460d510138e7..80e1752e64467e14a044e2957c06f3fbf864027d 100644 (file)
@@ -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
index 4aa6a29d9a3244ffa8b3f230f33c1897313a22c2..64b2396282e2b67b51611188cf496bee83d429a1 100755 (executable)
@@ -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) {
index 20485bcc8ca573c9b8a087da8f19f6981bc0228d..0ca59918a3929a28b1fdca4ac25d0afbcddbfa5c 100644 (file)
@@ -374,6 +374,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
index 5520e769966fa832482818688da185b8772021bb..0a558ecc199a4ac0dc8c40ee34e45434d276c46c 100644 (file)
 
 [% 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  #%]
     [%###############%]
index 763687e06c87075fbb6a0898376c4ae6a7f93dbe..f9e0ea93dc166699f931fb30e087ef36ed59d650 100644 (file)
@@ -39,3 +39,6 @@
                   [% legal_value.id FILTER js %]);
   [% END %]
 [% END %]
+[% IF field.name == 'classification' %]
+  YAHOO.util.Event.on('product', 'change', setClassification);
+[% END %]