From 1886faf627dc580f081d2da5efdad09fc00010e0 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Fri, 15 Aug 2014 18:57:51 +0400 Subject: [PATCH] Use editvisibility.cgi to enable/disable dependent values, not dependent fields --- Bugzilla/Field.pm | 16 +++ editvalues.cgi | 62 +-------- editvisibility.cgi | 96 ++++--------- .../custom_fields/visibility-list.html.tmpl | 60 -------- .../fieldvalues/control-list-common.html.tmpl | 4 +- .../admin/fieldvalues/control-list.html.tmpl | 131 +++++++----------- template/en/default/global/messages.html.tmpl | 4 + 7 files changed, 96 insertions(+), 277 deletions(-) delete mode 100644 template/en/default/admin/custom_fields/visibility-list.html.tmpl diff --git a/Bugzilla/Field.pm b/Bugzilla/Field.pm index 71a3927dc..1673eccb2 100644 --- a/Bugzilla/Field.pm +++ b/Bugzilla/Field.pm @@ -634,6 +634,21 @@ sub has_visibility_value return $hash && $hash->{$value}; } +# Check if a value is enabled for some controlling value +sub is_value_enabled +{ + my $self = shift; + my ($value, $visibility_value) = @_; + return 1 if !$self->value_field_id; + ref $_ and $_ = $_->id for $value, $visibility_value; + my $hash = Bugzilla->fieldvaluecontrol + ->{$self->value_field_id} + ->{values} + ->{$self->id} + ->{$value}; + return $hash && $hash->{$visibility_value}; +} + # Check visibility of field for a bug or for a hashref with default value names sub check_visibility { @@ -1076,6 +1091,7 @@ sub update_controlled_values my $self = shift; my ($controlled_value_ids, $visibility_value_id) = @_; $controlled_value_ids ||= []; + $controlled_value_ids = [ $controlled_value_ids ] if !ref $controlled_value_ids; my $vis_field = $self->value_field; if (!$vis_field) { diff --git a/editvalues.cgi b/editvalues.cgi index 8100952da..784f53a59 100755 --- a/editvalues.cgi +++ b/editvalues.cgi @@ -14,10 +14,6 @@ # Contributor(s): Max Kanat-Alexander # Frédéric Buclin -# This is a script to edit the values of fields that have drop-down -# or select boxes. It is largely a copy of editmilestones.cgi, but -# with some cleanup. - use strict; use lib qw(. lib); @@ -38,10 +34,6 @@ my $template = Bugzilla->template; my $ARGS = $cgi->VarHash; my $vars = {}; -# Replace this entry by separate entries in templates when -# the documentation about legal values becomes bigger. -$vars->{doc_section} = 'edit-values.html'; - Bugzilla->user->in_group('editvalues') || $ARGS->{field} eq 'keywords' && Bugzilla->user->in_group('editkeywords') || ThrowUserError('auth_failure', { @@ -57,8 +49,7 @@ my $action = trim($ARGS->{action} || ''); my $token = $ARGS->{token}; # Fields listed here must not be edited from this interface. -my @non_editable_fields = qw(product); -my %block_list = map { $_ => 1 } @non_editable_fields; +my %block_list = map { $_ => 1 } qw(product); # # field = '' -> Show nice list of fields @@ -119,57 +110,6 @@ if ($action eq 'new') display_field_values($vars); } -# -# action='control_list' -> enable/disable values controlled by this one -# -if ($action eq 'control_list') -{ - die('This field has no value field') unless $field->custom && $field->value_field; - - my $step = $ARGS->{step} || 0; - my $visibility_value_id = $ARGS->{visibility_value_id}; - if ($visibility_value_id) - { - $visibility_value_id = $field->value_field->value_type->new($visibility_value_id)->{id}; - } - - my $values = $ARGS->{values}; - my $need_token = 0; - - $vars->{visibility_value_id} = -1; - if ($visibility_value_id) - { - $vars->{visibility_value_id} = $visibility_value_id; - $vars->{default_value_hash} = $field->default_value_hash_for($visibility_value_id); - my %values = map { $_->{id} => $_ } @{$field->value_field->legal_values}; - $vars->{field_value} = $values{$visibility_value_id}; - $step++ unless $token; - $need_token = 1; - if ($token) - { - check_token_data($token, "edit_control_list"); - $field->update_controlled_values($values, $visibility_value_id); - if ($field->default_field_id == $field->value_field_id) - { - $field->update_default_value($visibility_value_id, $field->type == FIELD_TYPE_MULTI_SELECT - ? [ $cgi->param('default_value') ] - : scalar $cgi->param('default_value')); - } - $step++; - $need_token = 0; - delete_token($token); - } - } - - $vars->{step} = $step; - $vars->{token} = issue_session_token("edit_control_list") if $need_token; - - $template->process("admin/fieldvalues/control-list.html.tmpl", $vars) - || ThrowTemplateError($template->error()); - - exit; -} - # After this, we always have a value my $value = $field->value_type->check(exists $ARGS->{value_old} ? $ARGS->{value_old} : $ARGS->{value}); $vars->{value} = $value; diff --git a/editvisibility.cgi b/editvisibility.cgi index 2cc141f42..ec11b1b57 100755 --- a/editvisibility.cgi +++ b/editvisibility.cgi @@ -1,5 +1,5 @@ #!/usr/bin/perl -wT -# Enable/disable custom fields for a value of the controlling field +# Enable/disable field values for a selected value of the controlling field # License: Dual-license GPL 3.0+ or MPL 1.1+ # Contributor(s): Vitaliy Filippov , Vladimir Koptev @@ -20,82 +20,36 @@ my $template = Bugzilla->template; my $vars = {}; my $user = Bugzilla->login(LOGIN_REQUIRED); -$user->in_group('editfields') || ThrowUserError('auth_failure', { - group => "admin", - action => "edit", - object => "custom_fields"}); +$user->in_group('editvalues') || ThrowUserError('auth_failure', { + group => 'admin', + action => 'edit', + object => 'fieldvalues' +}); -my $field_name = trim($ARGS->{field} || ''); -my $value_name = trim($ARGS->{value} || ''); -my $action = trim($ARGS->{action} || ''); -my $token = $ARGS->{token}; +my $deny_edit = { version => 1, target_milestone => 1, component => 1, product => 1 }; +my $field = Bugzilla->get_field($ARGS->{field}); +ThrowUserError('fieldname_invalid', { field => { name => $ARGS->{field} } }) if !$field || $deny_edit->{$field->name}; +ThrowUserError('no_value_field', { field => $field }) unless $field->value_field; -unless ($field_name) +my $value = $field->value_field->value_type->check({ id => $ARGS->{visibility_value_id} }); + +if ($ARGS->{action} eq 'save') { - ThrowUserError('no_valid_field', { field => 'field' }); -} - -my $field = Bugzilla->get_field($field_name); -ThrowUserError('no_valid_field', { field => 'field' }) unless $field; - -my $value = $field->value_type->check($value_name); -ThrowUserError('no_valid_value', { field => 'value' }) unless $value; - -if ($field->name eq 'product') -{ - $user->check_can_admin_product($value->name); -} - -# -# action='' -> Show list of custom fields -# -unless ($action) -{ - $vars->{field} = $field; - $vars->{value} = $value; - $vars->{token} = issue_session_token('change_visibility'); - $template->process('admin/custom_fields/visibility-list.html.tmpl', $vars) - || ThrowTemplateError($template->error); + check_token_data($ARGS->{token}, 'edit_visibility'); + $field->update_controlled_values($ARGS->{values}, $value->id); + delete_token($ARGS->{token}); + Bugzilla->add_result_message({ message => 'visibility_updated' }); + Bugzilla->save_session_data; + print Bugzilla->cgi->redirect('editvisibility.cgi?field='.$field->name.'&visibility_value_id='.$value->id); exit; } -# update result page -if ($action eq 'update' && $token) -{ - check_token_data($token, 'change_visibility'); +$vars->{field} = $field; +$vars->{visibility_value} = $value; +$vars->{token} = issue_session_token('edit_visibility'); - my (@updated, @cleared); - for my $cfield (@{$field->controls_visibility_of}) - { - # check if it is 'visible for all' - my $visibility_values = $cfield->visibility_values || next; - # check if changed - next unless ($ARGS->{'visible_'.$cfield->id} xor $visibility_values->{$value->id}); - if ($ARGS->{'visible_'.$cfield->id}) - { - $visibility_values->{$value->id} = 1; - push @updated, $cfield->description; - } - elsif ($visibility_values->{$value->id}) - { - delete $visibility_values->{$value->id}; - push @cleared, $cfield->description; - } - $cfield->set_visibility_values([ keys %$visibility_values ]); - } - - delete_token($token); - - $vars->{field} = $field; - $vars->{value} = $value; - $vars->{update} = 1; - $vars->{updated} = join(', ', @updated); - $vars->{cleared} = join(', ', @cleared); - $template->process('admin/custom_fields/visibility-list.html.tmpl', $vars) - || ThrowTemplateError($template->error()); - exit; -} - -ThrowUserError('no_valid_action', { field => 'action'}); +$template->process('admin/fieldvalues/control-list.html.tmpl', $vars) + || ThrowTemplateError($template->error()); +exit; __END__ diff --git a/template/en/default/admin/custom_fields/visibility-list.html.tmpl b/template/en/default/admin/custom_fields/visibility-list.html.tmpl deleted file mode 100644 index 0a3df9cf3..000000000 --- a/template/en/default/admin/custom_fields/visibility-list.html.tmpl +++ /dev/null @@ -1,60 +0,0 @@ -[%# Template for editvisibility.cgi - # License: Dual-license GPL 3.0+ or MPL 1.1+ - # Contributor(s): Vitaliy Filippov , Vladimir Koptev - # %] - -[% PROCESS global/header.html.tmpl - title = "Выбор активных полей при установке значения поля $field.description в $value.name" - doc_section = "visibility-list.html" -%] - -[% IF update %] - [% IF updated %] -

Следующие поля будут показаны для значения [% value.name | html %] поля [% field.description | html %]: [% updated | html %]

- [% END %] - [% IF cleared %] -

Следующие поля будут скрыты для значения [% value.name | html %] поля [% field.description | html %]: [% cleared | html %]

- [% END %] - [% IF !cleared && !updated %] -

Ничего не изменено

- [% END %] -

К списку контролируемых полей

-[% ELSE %] -

Выберите поля, которые будут отображаться, когда значение поля [% field.description | html %] установлено в [% value.name | html %]:

- -
- - - - - - - [% i = 0 %] - [% FOREACH cfield = Bugzilla.get_fields({ visibility_field_id => field.id }) %] - - - - - - [% i = i + 1 %] - [% END %] -
ПолеВидимо ли
[% cfield.description | html %] - - - [% IF !cfield.visibility_values %] - Поле видимо для всех значений поля [% field.description | html %]
- Редактировать - [% END %] -
-

-
-

- - К списку значений поля [% field.description | html %] - -

-[% END %] - -[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/fieldvalues/control-list-common.html.tmpl b/template/en/default/admin/fieldvalues/control-list-common.html.tmpl index fed0e4f4e..4e5a5a948 100644 --- a/template/en/default/admin/fieldvalues/control-list-common.html.tmpl +++ b/template/en/default/admin/fieldvalues/control-list-common.html.tmpl @@ -28,7 +28,7 @@ [% SET any_field = 0 %] [% FOR f = Bugzilla.get_fields({ obsolete => 0, value_field_id => this_field.id, sort => 1 }) %] - [% IF f.name != 'version' && f.name != 'target_milestone' && f.name != 'component' && + [% IF f.name != 'version' && f.name != 'target_milestone' && f.name != 'component' && f.name != 'product' && (f.visibility_field_id != f.value_field_id || f.has_visibility_value(this_value.id)) %] [% IF NOT any_field %] @@ -40,7 +40,7 @@ [% SET any_field = 1 %] [% ELSE %], [% END %] - [% f.description | html %] + [% f.description | html %] [% END %] [% END %] [% IF any_field %] diff --git a/template/en/default/admin/fieldvalues/control-list.html.tmpl b/template/en/default/admin/fieldvalues/control-list.html.tmpl index e4b569eb6..d9db261cf 100644 --- a/template/en/default/admin/fieldvalues/control-list.html.tmpl +++ b/template/en/default/admin/fieldvalues/control-list.html.tmpl @@ -1,91 +1,56 @@ -[% IF step == 0; - SET title = "Выбор активных " _ field.description _ " для различных значений " _ field.value_field.description; - ELSIF step == 1; - SET title = "Значения " _ field.description _ " для " _ field_value.name; - ELSIF step == 2; - SET title = "Значения " _ field.description _ " для " _ field_value.name _ " сохранены."; - END; -%] +[%# Enable/disable field values for a selected value of its controlling value_field + # License: Dual-license GPL 3.0+ or MPL 1.1+ + # Authors: Vitaliy Filippov , Vladimir Koptev + #%] + +[% SET title = "Select Active " _ field.description _ "s For " _ field.value_field.description _ ' ' _ visibility_value.name | html %] [% PROCESS global/header.html.tmpl %] -

Выбор активных [% field.description FILTER html %] для различных значений поля [% field.value_field.description FILTER html %]

+

[% title %]

-
- [% IF token %][% END %] - [% IF step == 0 %] - - -

- Выберите [% field.value_field.description FILTER html %]:  - - -

- [% ELSIF step == 1 %] - - -

Значения [% field.description FILTER html %] для [% field_value.name FILTER html %]:

- - [% IF field.default_field_id == field.value_field_id %] -

Значение по умолчанию:[% "
" IF field.type == constants.FIELD_TYPE_MULTI_SELECT %] - [% IF field.is_select %] - -

- [% ELSE %] - + + + + + + + + + + [% FOREACH value = field.legal_values %] + + + + [% END %] - [% END %] - -
ActiveValue
+ + + + +
- - - - - - [% count = 0 %] - [% FOREACH value = field.legal_values %] - - - - - [% count = count + 1 %] - [% END %] - -
ЗначениеАктивно
- - - - -
-
- - К выбору [% field.value_field.description FILTER html %] - | - [% ELSIF step == 2 %] -

Значения [% field.description FILTER html %] для [% field_value.name FILTER html %] сохранены.

- К выбору значений [% field.description FILTER html %] для [% field_value.name FILTER html %] - | - К выбору [% field.value_field.description FILTER html %] - | - [% END; %] - К списку значений [% field.description FILTER html %] + + +
+
+

+ Edit or add [% field.description | html %]s | + [% IF field.value_field.name == 'product' %] + Edit product [% visibility_value.name | html %] + [% ELSIF field.value_field.name == 'classification' %] + Edit classification [% visibility_value.name | html %] + [% ELSIF field.value_field.name == 'target_milestone' %] + Edit milestone [% visibility_value.name | html %] + [% ELSIF field.value_field.name == 'version' %] + Edit version [% visibility_value.name | html %] + [% ELSIF field.value_field.name == 'component' %] + Edit component [% visibility_value.name | html %] + [% ELSE %] + Edit [% field.value_field.description | html %] [% visibility_value.name | html %] + [% END %] +

+ [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/global/messages.html.tmpl b/template/en/default/global/messages.html.tmpl index 424e763e0..9bd4689d9 100644 --- a/template/en/default/global/messages.html.tmpl +++ b/template/en/default/global/messages.html.tmpl @@ -101,6 +101,10 @@ [% END %] [% END %] +[% BLOCK msg_visibility_updated %] +
Active values updated.
+[% END %] + [%# This is a list of all the possible messages. Please keep them in # alphabetical order by message tag, and leave a blank line between messages. #%]