From b8a8680e9d5ed7de541ab9f4e0275fa79a9a6d30 Mon Sep 17 00:00:00 2001 From: "mkanat%kerio.com" <> Date: Fri, 25 Feb 2005 06:48:05 +0000 Subject: Bug 281876: New Admin Interface to manage old Enum fields (Field Values) Patch By Max Kanat-Alexander r=joel, a=justdave --- editvalues.cgi | 386 +++++++++++++++++++++ .../admin/fieldvalues/confirm-delete.html.tmpl | 108 ++++++ .../en/default/admin/fieldvalues/create.html.tmpl | 54 +++ .../en/default/admin/fieldvalues/created.html.tmpl | 39 +++ .../en/default/admin/fieldvalues/deleted.html.tmpl | 38 ++ .../en/default/admin/fieldvalues/edit.html.tmpl | 60 ++++ .../en/default/admin/fieldvalues/footer.html.tmpl | 56 +++ .../en/default/admin/fieldvalues/list.html.tmpl | 73 ++++ .../admin/fieldvalues/select-field.html.tmpl | 50 +++ .../en/default/admin/fieldvalues/updated.html.tmpl | 51 +++ template/en/default/admin/table.html.tmpl | 15 +- template/en/default/global/useful-links.html.tmpl | 14 +- template/en/default/global/user-error.html.tmpl | 43 +++ 13 files changed, 976 insertions(+), 11 deletions(-) create mode 100755 editvalues.cgi create mode 100644 template/en/default/admin/fieldvalues/confirm-delete.html.tmpl create mode 100644 template/en/default/admin/fieldvalues/create.html.tmpl create mode 100644 template/en/default/admin/fieldvalues/created.html.tmpl create mode 100644 template/en/default/admin/fieldvalues/deleted.html.tmpl create mode 100644 template/en/default/admin/fieldvalues/edit.html.tmpl create mode 100644 template/en/default/admin/fieldvalues/footer.html.tmpl create mode 100644 template/en/default/admin/fieldvalues/list.html.tmpl create mode 100644 template/en/default/admin/fieldvalues/select-field.html.tmpl create mode 100644 template/en/default/admin/fieldvalues/updated.html.tmpl diff --git a/editvalues.cgi b/editvalues.cgi new file mode 100755 index 000000000..8231dab5b --- /dev/null +++ b/editvalues.cgi @@ -0,0 +1,386 @@ +#!/usr/bin/perl -wT +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Max Kanat-Alexander + +# 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 "."; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Error; +use Bugzilla::Constants; +use Bugzilla::Config qw(:DEFAULT :locations); + +# List of different tables that contain the changeable field values +# (the old "enums.") Keep them in alphabetical order by their +# English name from field-descs.html.tmpl. +# Format: Array of valid field names. +# Admins may add resolution and bug_status to this list, but they +# do so at their own risk. +our @valid_fields = ('op_sys', 'rep_platform', 'priority', 'bug_severity',); + +###################################################################### +# Subroutines +###################################################################### + +# Returns whether or not the specified table exists in the @tables array. +sub FieldExists ($) { + my ($field) = @_; + + return lsearch(\@valid_fields, $field) >= 0; +} + +# Same as FieldExists, but emits and error and dies if it fails. +sub FieldMustExist ($) { + my ($field)= @_; + + $field || + ThrowUserError('fieldname_not_specified'); + + # Is it a valid field to be editing? + FieldExists($field) || + ThrowUserError('fieldname_invalid', {'field' => $field}); +} + +# Returns if the specified value exists for the field specified. +sub ValueExists ($$) { + my ($field, $value) = @_; + FieldMustExist($field); + trick_taint($field); + # Value is safe because it's being passed only to a SELECT + # statement via a placeholder. + trick_taint($value); + + my $dbh = Bugzilla->dbh; + my $value_count = + $dbh->selectrow_array("SELECT COUNT(*) FROM $field " + . " WHERE value = ?", undef, $value); + + return $value_count; +} + +# Same check as ValueExists, emits an error text and dies if it fails. +sub ValueMustExist ($$) { + my ($field, $value)= @_; + + # Values may not be empty (it's very difficult to deal + # with empty values in the admin interface). + trim($value) || ThrowUserError('fieldvalue_not_specified'); + + # Does it exist in the DB? + ValueExists($field, $value) || + ThrowUserError('fieldvalue_doesnt_exist', {'value' => $value, + 'field' => $field}); +} + +###################################################################### +# Main Body Execution +###################################################################### + +# require the user to have logged in +Bugzilla->login(LOGIN_REQUIRED); + +my $dbh = Bugzilla->dbh; +my $cgi = Bugzilla->cgi; +my $template = Bugzilla->template; +my $vars = {}; + +print $cgi->header(); + +exists Bugzilla->user->groups->{'editcomponents'} || + ThrowUserError('auth_failure', {group => "editcomponents", + action => "edit", + object => "field values"}); + +# +# often-used variables +# +my $field = trim($cgi->param('field') || ''); +my $value = trim($cgi->param('value') || ''); +my $sortkey = trim($cgi->param('sortkey') || '0'); +my $action = trim($cgi->param('action') || ''); + + +# +# field = '' -> Show nice list of fields +# +unless ($field) { + # Convert @valid_fields into the format that select-field wants. + my @field_list = (); + foreach my $field_name (@valid_fields) { + push(@field_list, {name => $field_name}); + } + + $vars->{'fields'} = \@field_list; + $template->process("admin/fieldvalues/select-field.html.tmpl", + $vars) + || ThrowTemplateError($template->error()); + exit; +} + + +# +# action='' -> Show nice list of values. +# +unless ($action) { + FieldMustExist($field); + # Now we know the $field is valid. + trick_taint($field); + + my $fieldvalues = + $dbh->selectall_arrayref("SELECT value AS name, sortkey" + . " FROM $field ORDER BY sortkey, value", + {Slice =>{}}); + $vars->{'field'} = $field; + $vars->{'values'} = $fieldvalues; + $template->process("admin/fieldvalues/list.html.tmpl", + $vars) + || ThrowTemplateError($template->error()); + + exit; +} + + +# +# action='add' -> show form for adding new field value. +# (next action will be 'new') +# +if ($action eq 'add') { + FieldMustExist($field); + + $vars->{'value'} = $value; + $vars->{'field'} = $field; + $template->process("admin/fieldvalues/create.html.tmpl", + $vars) + || ThrowTemplateError($template->error()); + + exit; +} + + +# +# action='new' -> add field value entered in the 'action=add' screen +# +if ($action eq 'new') { + FieldMustExist($field); + trick_taint($field); + + # Cleanups and validity checks + $value || ThrowUserError('fieldvalue_undefined'); + + if (length($value) > 60) { + ThrowUserError('fieldvalue_name_too_long', + {'value' => $value}); + } + # Need to store in case detaint_natural() clears the sortkey + my $stored_sortkey = $sortkey; + if (!detaint_natural($sortkey)) { + ThrowUserError('fieldvalue_sortkey_invalid', + {'name' => $field, + 'sortkey' => $stored_sortkey}); + } + if (ValueExists($field, $value)) { + ThrowUserError('fieldvalue_already_exists', + {'field' => $field, + 'value' => $value}); + } + # Value is only used in a SELECT placeholder and through the HTML filter. + trick_taint($value); + + # Add the new field value. + my $sth = $dbh->prepare("INSERT INTO $field ( value, sortkey ) + VALUES ( ?, ? )"); + $sth->execute($value, $sortkey); + + unlink "$datadir/versioncache"; + + $vars->{'value'} = $value; + $vars->{'field'} = $field; + $template->process("admin/fieldvalues/created.html.tmpl", + $vars) + || ThrowTemplateError($template->error()); + + exit; +} + + +# +# action='del' -> ask if user really wants to delete +# (next action would be 'delete') +# +if ($action eq 'del') { + ValueMustExist($field, $value); + trick_taint($field); + trick_taint($value); + + # See if any bugs are still using this value. + $vars->{'bug_count'} = + $dbh->selectrow_array("SELECT COUNT(*) FROM bugs WHERE $field = ?", + undef, $value) || 0; + $vars->{'value_count'} = + $dbh->selectrow_array("SELECT COUNT(*) FROM $field"); + + $vars->{'value'} = $value; + $vars->{'field'} = $field; + $template->process("admin/fieldvalues/confirm-delete.html.tmpl", + $vars) + || ThrowTemplateError($template->error()); + + exit; +} + + +# +# action='delete' -> really delete the field value +# +if ($action eq 'delete') { + ValueMustExist($field, $value); + trick_taint($field); + trick_taint($value); + + # Check if there are any bugs that still have this value. + my $bug_ids = $dbh->selectcol_arrayref( + "SELECT bug_id FROM bugs WHERE $field = ?", undef, $value); + + if (scalar(@$bug_ids)) { + # You tried to delete a field that bugs are still using. + # You can't just delete the bugs. That's ridiculous. + $dbh->do('UNLOCK TABLES'); + ThrowUserError("fieldvalue_still_has_bugs", + { field => $field, value => $value, + count => scalar(@$bug_ids) }); + } + + $dbh->do("DELETE FROM $field WHERE value = ?", undef, $value); + + unlink "$datadir/versioncache"; + + $vars->{'value'} = $value; + $vars->{'field'} = $field; + $template->process("admin/fieldvalues/deleted.html.tmpl", + $vars) + || ThrowTemplateError($template->error()); + exit; +} + + +# +# action='edit' -> present the edit-value form +# (next action would be 'update') +# +if ($action eq 'edit') { + ValueMustExist($field, $value); + trick_taint($field); + trick_taint($value); + + $vars->{'sortkey'} = $dbh->selectrow_array( + "SELECT sortkey FROM $field WHERE value = ?", undef, $value) || 0; + + $vars->{'value'} = $value; + $vars->{'field'} = $field; + + $template->process("admin/fieldvalues/edit.html.tmpl", + $vars) + || ThrowTemplateError($template->error()); + + exit; +} + + +# +# action='update' -> update the field value +# +if ($action eq 'update') { + my $valueold = trim($cgi->param('valueold') || ''); + my $sortkeyold = trim($cgi->param('sortkeyold') || '0'); + + ValueMustExist($field, $valueold); + trick_taint($field); + trick_taint($valueold); + + if (length($value) > 60) { + ThrowUserError('fieldvalue_name_too_long', + {'value' => $value}); + } + + $dbh->do("LOCK TABLES bugs WRITE, $field WRITE"); + + # Need to store because detaint_natural() will delete this if + # invalid + my $stored_sortkey = $sortkey; + if ($sortkey != $sortkeyold) { + + if (!detaint_natural($sortkey)) { + $dbh->do('UNLOCK TABLES'); + ThrowUserError('fieldvalue_sortkey_invalid', + {'name' => $field, + 'sortkey' => $stored_sortkey}); + + } + + $dbh->do("UPDATE $field SET sortkey = ? WHERE value = ?", + undef, $sortkey, $valueold); + + unlink "$datadir/versioncache"; + $vars->{'updated_sortkey'} = 1; + $vars->{'sortkey'} = $sortkey; + } + + if ($value ne $valueold) { + + unless ($value) { + $dbh->do('UNLOCK TABLES'); + ThrowUserError('fieldvalue_undefined'); + } + if (ValueExists($field, $value)) { + $dbh->do('UNLOCK TABLES'); + ThrowUserError('fieldvalue_already_exists', + {'value' => $value, + 'field' => $field}); + } + trick_taint($value); + + $dbh->do("UPDATE bugs SET $field = ?, delta_ts = NOW() + WHERE $field = ?", undef, $value, $valueold); + + $dbh->do("UPDATE $field SET value = ? WHERE value = ?", + undef, $value, $valueold); + + unlink "$datadir/versioncache"; + + $vars->{'updated_value'} = 1; + } + + $dbh->do('UNLOCK TABLES'); + + $vars->{'value'} = $value; + $vars->{'field'} = $field; + $template->process("admin/fieldvalues/updated.html.tmpl", + $vars) + || ThrowTemplateError($template->error()); + + exit; +} + + +# +# No valid action found +# +# We can't get here without $field being defined -- +# See the unless($field) block at the top. +ThrowUserError('no_valid_action', { field => $field } ); diff --git a/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl b/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl new file mode 100644 index 000000000..234a895a7 --- /dev/null +++ b/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl @@ -0,0 +1,108 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # Contributor(s): Max Kanat-Alexander + #%] + +[%# INTERFACE: + # value: string; The field value being deleted. + # bug_count: number; The number of bugs that have this field value. + # value_count: number; The number of values left for this field, including + # this value. + # field: string; The name of the field. + #%] + +[% title = BLOCK %]Delete Value '[% value FILTER html %]' from the + '[% field FILTER html %]' field[% END %] + +[% PROCESS global/header.html.tmpl + title = title +%] + + + + + + + + + + + + + + + + + + +
FieldValue
Field Name:[% field FILTER html %]
Field Value:[% value FILTER html %]
[% terms.Bugs %]: +[% IF bug_count %] + [% bug_count FILTER html %] +[% ELSE %] + None +[% END %] +
+ +

Confirmation

+ +[% IF bug_count %] + + Sorry, there + + [% IF bug_count > 1 %] + are [% bug_count FILTER html %] [%+ terms.bugs %] + [% ELSE %] + is [% bug_count FILTER html %] [%+ terms.bug %] + [% END %] + + that still have this field value. You must change the field value on + + [% IF bug_count > 1 %] + those [% terms.bugs %] + [% ELSE %] + that [% terms.bug %] + [% END %] + + to another value before you can delete this value. + +[% END %] + +[% IF value_count == 1 %] + +

Sorry, but '[% value FILTER html %]' is the last value for + '[%- field FILTER html %]', and so it can not be deleted.

+ + [% ELSE %] + + [% IF bug_count == 0 %] + +

Do you really want to delete this value?

+ +

+ + + + +
+ + [% END %] + +[% END %] + +[% PROCESS admin/fieldvalues/footer.html.tmpl %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/fieldvalues/create.html.tmpl b/template/en/default/admin/fieldvalues/create.html.tmpl new file mode 100644 index 000000000..70dbc4eb7 --- /dev/null +++ b/template/en/default/admin/fieldvalues/create.html.tmpl @@ -0,0 +1,54 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # Contributor(s): Max Kanat-Alexander + #%] + +[%# INTERFACE: + # field: string; name of the field the value is being created for + #%] + +[% title = BLOCK %]Add Value for the '[% field FILTER html %]' field[% END %] +[% h2 = BLOCK %]This page allows you to add a new value for the + '[% field FILTER html %]' field.[% END %] +[% PROCESS global/header.html.tmpl + title = title + h2 = h2 +%] + +
+ + + + + + + + + +
+ + + + +
+ +

+ +[% PROCESS admin/fieldvalues/footer.html.tmpl + no_add_link = 1 + %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/fieldvalues/created.html.tmpl b/template/en/default/admin/fieldvalues/created.html.tmpl new file mode 100644 index 000000000..28688d991 --- /dev/null +++ b/template/en/default/admin/fieldvalues/created.html.tmpl @@ -0,0 +1,39 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # Contributor(s): Max Kanat-Alexander + #%] + +[%# INTERFACE: + # value: string; the name of the newly created field value + # field: string; the name of the field the value belongs to + #%] + +[% title = BLOCK %]New Value '[% product FILTER html %]' added to + '[% field FILTER html %]' field[% END %] +[% PROCESS global/header.html.tmpl + title = title +%] + +

The value ' + [%- value FILTER html %]' has been added as a valid choice for + the '[% field FILTER html %]' field.

+ +

+ +[% PROCESS admin/fieldvalues/footer.html.tmpl %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/fieldvalues/deleted.html.tmpl b/template/en/default/admin/fieldvalues/deleted.html.tmpl new file mode 100644 index 000000000..2bb3c840b --- /dev/null +++ b/template/en/default/admin/fieldvalues/deleted.html.tmpl @@ -0,0 +1,38 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # Contributor(s): Max Kanat-Alexander + #%] + +[%# INTERFACE: + # value: string; the field value that was deleted. + # + # field: string; the field the value was deleted from. + # + #%] + +[% title = BLOCK %]Deleted Value '[% value FILTER html %]' for the + '[% field FILTER html %]' Field[% END %] +[% PROCESS global/header.html.tmpl + title = title +%] + +

Field Value '[% value FILTER html %]' deleted.

+ +

+ +[% PROCESS admin/fieldvalues/footer.html.tmpl + no_edit_link = 1 + %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/fieldvalues/edit.html.tmpl b/template/en/default/admin/fieldvalues/edit.html.tmpl new file mode 100644 index 000000000..9771148cc --- /dev/null +++ b/template/en/default/admin/fieldvalues/edit.html.tmpl @@ -0,0 +1,60 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # Contributor(s): Max Kanat-Alexander + #%] + +[%# INTERFACE: + # value: string; The field value we are editing. + # sortkey: number; Sortkey of the field value we are editing. + # field: string; The field this value belongs to. + #%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = BLOCK %]Edit Value '[% value FILTER html %]' ' + [%- filter FILTER html %]'[% END %] +[% PROCESS global/header.html.tmpl + title = title +%] + +

+ + + + + + + + + + + +
+ + + + + + + +
+ +

+ +[% PROCESS admin/fieldvalues/footer.html.tmpl + no_edit_link = 1 %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/fieldvalues/footer.html.tmpl b/template/en/default/admin/fieldvalues/footer.html.tmpl new file mode 100644 index 000000000..05e8c757b --- /dev/null +++ b/template/en/default/admin/fieldvalues/footer.html.tmpl @@ -0,0 +1,56 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # Contributor(s): Max Kanat-Alexander + #%] + +[%# INTERFACE: + # value: string; the value being inserted/edited. + # field: string; the name of the field which the value + # belongs/belonged to + # + # no_XXX_link: boolean; if defined, then don't show the corresponding + # link. Supported parameters are: + # + # no_edit_link + # no_edit_other_link + # no_add_link + #%] + +

+ +


+ +[% UNLESS no_add_link %] + Add a value. +[% END %] + +[% IF value && !no_edit_milestone_link %] + Edit value + '[% value FILTER html %]'. +[% END %] + +[% UNLESS no_edit_other_link %] + Edit other values for the '[% field FILTER html %]' field. + +[% END %] + +

diff --git a/template/en/default/admin/fieldvalues/list.html.tmpl b/template/en/default/admin/fieldvalues/list.html.tmpl new file mode 100644 index 000000000..4f686d338 --- /dev/null +++ b/template/en/default/admin/fieldvalues/list.html.tmpl @@ -0,0 +1,73 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # Contributor(s): Max Kanat-Alexander + #%] + +[%# INTERFACE: + # values: array of hashes having the following properties: + # - name: string; The value. + # - sortkey: number; The sortkey used to order the value when + # displayed to the user in a list. + # + # field: string; the name of the field we are editing values for. + #%] + +[% USE Bugzilla %] +[% cgi = Bugzilla.cgi %] + +[% PROCESS global/variables.none.tmpl %] + +[% title = BLOCK %]Select value for the + '[% field FILTER html %]' field[% END %] +[% PROCESS global/header.html.tmpl + title = title +%] + +[% edit_contentlink = BLOCK %]editvalues.cgi?action=edit&field= + [%- field FILTER url_quote %]&value=%%name%%[% END %] +[% delete_contentlink = BLOCK %]editvalues.cgi?action=del&field= + [%- field FILTER url_quote %]&value=%%name%%[% END %] + + +[% columns = [ + { + name => "name" + heading => "Edit field value..." + contentlink => edit_contentlink + }, + { + name => "sortkey" + heading => "Sortkey" + }, + ] +%] + +[% columns.push({ + heading => "Action" + content => "Delete" + contentlink => delete_contentlink + }) %] + +[% PROCESS admin/table.html.tmpl + columns = columns + data = values +%] + +

+ +[% PROCESS admin/fieldvalues/footer.html.tmpl + no_edit_other_link = 1 + %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/fieldvalues/select-field.html.tmpl b/template/en/default/admin/fieldvalues/select-field.html.tmpl new file mode 100644 index 000000000..834295225 --- /dev/null +++ b/template/en/default/admin/fieldvalues/select-field.html.tmpl @@ -0,0 +1,50 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # Contributor(s): Max Kanat-Alexander + # + #%] + +[%# INTERFACE: + # fields: Array of hashes. Each hash contains only one key, "name." + # The names are the same as the keys from field_descs + # (see global/field-descs.html.tmpl). + #%] + +[% USE Bugzilla %] +[% cgi = Bugzilla.cgi %] + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Edit values for which field?" +%] + +[% columns = [ + { + name => "name" + heading => "Edit field values for..." + content_use_field = 1 + contentlink => "editvalues.cgi?field=%%name%%" + } + ] +%] + +[% PROCESS admin/table.html.tmpl + columns = columns + data = fields +%] + +

+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/fieldvalues/updated.html.tmpl b/template/en/default/admin/fieldvalues/updated.html.tmpl new file mode 100644 index 000000000..c19aac285 --- /dev/null +++ b/template/en/default/admin/fieldvalues/updated.html.tmpl @@ -0,0 +1,51 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # Contributor(s): Max Kanat-Alexander + #%] + +[%# INTERFACE: + # + # 'updated_XXX' variables are booleans, and are defined if the + # 'XXX' field was updated during the edit just being handled. + # Variables called just 'XXX' are strings, and are the _new_ contents + # of the fields. + # + # value & updated_value: the name of the field value + # sortkey & updated_sortkey: the field value sortkey + # field: string; the field that the value belongs to + #%] + +[% title = BLOCK %]Updating Value '[% value FILTER html %]' of the + '[% field FILTER html %]' Field[% END %] +[% PROCESS global/header.html.tmpl + title = title +%] + +[% IF updated_value %] +

Updated field value to: '[% value FILTER html %]'.

+[% END %] + +[% IF updated_sortkey %] +

Updated field value sortkey to: '[% sortkey FILTER html %]'.

+[% END %] + +[% UNLESS (updated_sortkey || updated_value) %] +

Nothing changed for field value '[% value FILTER html %]'. +[% END %] + +

+ +[% PROCESS admin/fieldvalues/footer.html.tmpl %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/table.html.tmpl b/template/en/default/admin/table.html.tmpl index fd1382b14..4254f80e1 100644 --- a/template/en/default/admin/table.html.tmpl +++ b/template/en/default/admin/table.html.tmpl @@ -33,6 +33,12 @@ # content: If specified, the content of this variable is used # instead of the data pulled from the current row. # NOTE: This value is not HTML filtered at output! + # content_use_field: If defined and true, then each value in the + # column corresponds with a key in the + # field_descs field, and that value from the + # field_descs hash will be used instead of "content." + # See fieldvalues/select-field for an example of use. + # This content WILL be HTML-filtered in this case. # align: left/center/right. Controls the horizontal alignment of the # text in the column. # allow_html_content: if defined, then this column allows html content @@ -46,6 +52,8 @@ # #%] +[% PROCESS "global/field-descs.none.tmpl" %] + [%################### TABLE HEADER ######################%] @@ -77,8 +85,11 @@ [% END %] - [% IF c.content %] - [% c.content %] + [% IF c.content_use_field %] + [% colname = row.${c.name} %] + [% field_descs.${colname} FILTER html %] + [% ELSIF c.content %] + [% c.content %] [% ELSE %] [% IF c.yesno_field %] [% IF row.${c.name} %] diff --git a/template/en/default/global/useful-links.html.tmpl b/template/en/default/global/useful-links.html.tmpl index b9a69a9e9..eb8c7e24c 100644 --- a/template/en/default/global/useful-links.html.tmpl +++ b/template/en/default/global/useful-links.html.tmpl @@ -78,19 +78,15 @@ IF user.groups.tweakparams %] [% ' | Users' IF user.groups.editusers || user.can_bless %] - [% IF Param('useclassification') %] - [% IF user.groups.editclassifications %] + [% IF Param('useclassification') && user.groups.editclassifications %] [% ' | Classifications' %] - [% END %] - [% IF user.groups.editcomponents %] - [% ' | Products' %] - [% END %] - [% ELSE %] - [% ' | Products' + [% END %] + [% ' | Products' IF user.groups.editcomponents %] - [% END %] [% ' | Flags' IF user.groups.editcomponents %] + [% ' | Field Values' + IF user.groups.editcomponents %] [% ' | Groups' IF user.groups.creategroups %] [% ' | Keywords' diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl index 55c796924..47dcaca10 100644 --- a/template/en/default/global/user-error.html.tmpl +++ b/template/en/default/global/user-error.html.tmpl @@ -321,6 +321,49 @@ Sorry; you do not have the permissions necessary to enter [% terms.abug %] against the [% product FILTER html %] product. + [% ELSIF error == "fieldname_invalid" %] + [% title = "Specified Field Does Not Exist" %] + The field '[% field FILTER html %]' does not exist or + cannot be edited with this interface. + + [% ELSIF error == "fieldname_not_specified" %] + [% title = "Field Name Not Specified" %] + No field name specified when trying to edit field values. + + [% ELSIF error == "fieldvalue_already_exists" %] + [% title = "Field Value Already Exists" %] + The value '[% value FILTER html %]' already exists for the + '[%- field FILTER html %]' field. + + [% ELSIF error == "fieldvalue_doesnt_exist" %] + [% title = "Specified Field Value Does Not Exist" %] + The value '[% value FILTER html %]' does not exist for + the '[% field FILTER html %]' field. + + [% ELSIF error == "fieldvalue_name_too_long" %] + [% title = "Field Value Is Too Long" %] + The value of a field is limited to 60 characters. + '[% value FILTER html %]' is too long ([% value.length %] characters). + + [% ELSIF error == "fieldvalue_not_specified" %] + [% title = "Field Value Not Specified" %] + No field value specified when trying to edit a field value. + + [% ELSIF error == "fieldvalue_sortkey_invalid" %] + [% title = "Invalid Field Value Sortkey" %] + The sortkey '[% sortkey FILTER html %]' for the '[% name FILTER html %]' + field is not a valid (positive) number. + + [% ELSIF error == "fieldvalue_still_has_bugs" %] + [% title = "You Cannot Delete This Field Value" %] + You cannot delete the value '[% value FILTER html %]' from the + '[% field FILTER html%]' field, because there are still + [% count FILTER html %] [% terms.bugs %] using it. + + [% ELSIF error == "fieldvalue_undefined" %] + [% title = "Undefined Value Not Allowed" %] + You must specify a value. + [% ELSIF error == "file_not_specified" %] [% title = "No File Specified" %] You did not specify a file to attach. -- cgit v1.2.3-24-g4f1b