diff options
-rw-r--r-- | Bugzilla/Bug.pm | 14 | ||||
-rw-r--r-- | Bugzilla/DB/Schema.pm | 3 | ||||
-rw-r--r-- | Bugzilla/Install/DB.pm | 4 | ||||
-rw-r--r-- | Bugzilla/Keyword.pm | 28 | ||||
-rw-r--r-- | Bugzilla/Template.pm | 7 | ||||
-rw-r--r-- | Bugzilla/WebService/Bug.pm | 1 | ||||
-rw-r--r-- | docs/en/rst/administering/keywords.rst | 6 | ||||
-rwxr-xr-x | editkeywords.cgi | 8 | ||||
-rw-r--r-- | template/en/default/admin/keywords/edit.html.tmpl | 11 | ||||
-rw-r--r-- | template/en/default/admin/keywords/list.html.tmpl | 56 | ||||
-rw-r--r-- | template/en/default/bug/create/create.html.tmpl | 2 | ||||
-rw-r--r-- | template/en/default/bug/edit.html.tmpl | 2 | ||||
-rw-r--r-- | template/en/default/global/user-error.html.tmpl | 2 | ||||
-rw-r--r-- | template/en/default/reports/keywords.html.tmpl | 73 |
14 files changed, 152 insertions, 65 deletions
diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index 2f34d55e7..6fcf14c5a 100644 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -1851,6 +1851,20 @@ sub _check_keywords { my $obj = Bugzilla::Keyword->check($keyword); $keywords{$obj->id} = $obj; } + + my %old_kw_id; + if (blessed $invocant) { + my @old_keywords = @{$invocant->keyword_objects}; + %old_kw_id = map { $_->id => 1 } @old_keywords; + } + + foreach my $keyword (values %keywords) { + next if $keyword->is_active || exists $old_kw_id{$keyword->id}; + + ThrowUserError('value_inactive', + { value => $keyword->name, class => ref $keyword }); + } + return [values %keywords]; } diff --git a/Bugzilla/DB/Schema.pm b/Bugzilla/DB/Schema.pm index d340cf03d..c089513e3 100644 --- a/Bugzilla/DB/Schema.pm +++ b/Bugzilla/DB/Schema.pm @@ -588,6 +588,8 @@ use constant ABSTRACT_SCHEMA => { PRIMARYKEY => 1}, name => {TYPE => 'varchar(64)', NOTNULL => 1}, description => {TYPE => 'MEDIUMTEXT', NOTNULL => 1}, + is_active => {TYPE => 'BOOLEAN', NOTNULL => 1, + DEFAULT => 'TRUE'}, ], INDEXES => [ keyworddefs_name_idx => {FIELDS => ['name'], @@ -605,7 +607,6 @@ use constant ABSTRACT_SCHEMA => { REFERENCES => {TABLE => 'keyworddefs', COLUMN => 'id', DELETE => 'CASCADE'}}, - ], INDEXES => [ keywords_bug_id_idx => {FIELDS => [qw(bug_id keywordid)], diff --git a/Bugzilla/Install/DB.pm b/Bugzilla/Install/DB.pm index ab02fe41d..ddd127be2 100644 --- a/Bugzilla/Install/DB.pm +++ b/Bugzilla/Install/DB.pm @@ -730,6 +730,10 @@ sub update_table_definitions { $dbh->bz_add_column('longdescs', 'is_markdown', {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 'FALSE'}); + # 2014-11-18 dylan@mozilla.com - Bug 69267 + $dbh->bz_add_column('keyworddefs', 'is_active', + {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 'TRUE'}); + ################################################################ # New --TABLE-- changes should go *** A B O V E *** this point # ################################################################ diff --git a/Bugzilla/Keyword.pm b/Bugzilla/Keyword.pm index afa93e1e9..ef044a0c5 100644 --- a/Bugzilla/Keyword.pm +++ b/Bugzilla/Keyword.pm @@ -26,6 +26,7 @@ use constant DB_COLUMNS => qw( keyworddefs.id keyworddefs.name keyworddefs.description + keyworddefs.is_active ); use constant DB_TABLE => 'keyworddefs'; @@ -33,11 +34,13 @@ use constant DB_TABLE => 'keyworddefs'; use constant VALIDATORS => { name => \&_check_name, description => \&_check_description, + is_active => \&_check_is_active, }; use constant UPDATE_COLUMNS => qw( name description + is_active ); ############################### @@ -62,6 +65,7 @@ sub bug_count { sub set_name { $_[0]->set('name', $_[1]); } sub set_description { $_[0]->set('description', $_[1]); } +sub set_is_active { $_[0]->set('is_active', $_[1]); } ############################### #### Subroutines ###### @@ -125,6 +129,10 @@ sub _check_description { return $desc; } +sub _check_is_active { return $_[1] ? 1 : 0 } + +sub is_active { return $_[0]->{is_active} } + 1; __END__ @@ -145,13 +153,13 @@ Bugzilla::Keyword - A Keyword that can be added to a bug. Bugzilla::Keyword represents a keyword that can be added to a bug. -This implements all standard C<Bugzilla::Object> methods. See +This implements all standard C<Bugzilla::Object> methods. See L<Bugzilla::Object> for more details. -=head1 SUBROUTINES +=head1 METHODS -This is only a list of subroutines specific to C<Bugzilla::Keyword>. -See L<Bugzilla::Object> for more subroutines that this object +This is only a list of methods specific to C<Bugzilla::Keyword>. +See L<Bugzilla::Object> for more methods that this object implements. =over @@ -166,6 +174,18 @@ implements. Returns: A reference to an array of Keyword objects, or an empty arrayref if there are no keywords. +=item C<is_active> + + Description: Indicates if the keyword may be used on a bug + Params: none + Returns: a boolean value that is true if the keyword can be applied to bugs. + +=item C<set_is_active($is_active)> + + Description: Set the is_active property to a boolean value + Params: the new value of the is_active property. + Returns: nothing + =back =cut diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm index de72cd71a..70a8197b5 100644 --- a/Bugzilla/Template.pm +++ b/Bugzilla/Template.pm @@ -1106,11 +1106,16 @@ sub create { # Whether or not keywords are enabled, in this Bugzilla. 'use_keywords' => sub { return Bugzilla::Keyword->any_exist; }, - # All the keywords. + # All the keywords 'all_keywords' => sub { return [map { $_->name } Bugzilla::Keyword->get_all()]; }, + # All the active keywords + 'active_keywords' => sub { + return [map { $_->name } grep { $_->is_active } Bugzilla::Keyword->get_all()]; + }, + 'feature_enabled' => sub { return Bugzilla->feature(@_); }, # field_descs can be somewhat slow to generate, so we generate diff --git a/Bugzilla/WebService/Bug.pm b/Bugzilla/WebService/Bug.pm index fd01afb1b..f034d90d5 100644 --- a/Bugzilla/WebService/Bug.pm +++ b/Bugzilla/WebService/Bug.pm @@ -245,6 +245,7 @@ sub _legal_field_values { elsif ($field_name eq 'keywords') { my @legal_keywords = Bugzilla::Keyword->get_all; foreach my $value (@legal_keywords) { + next unless $value->is_active; push (@result, { name => $self->type('string', $value->name), description => $self->type('string', $value->description), diff --git a/docs/en/rst/administering/keywords.rst b/docs/en/rst/administering/keywords.rst index 245bcbe4c..d636e752c 100644 --- a/docs/en/rst/administering/keywords.rst +++ b/docs/en/rst/administering/keywords.rst @@ -9,8 +9,6 @@ A company might have a policy stating all regressions must be fixed by the next release—this keyword can make tracking those bugs much easier. Keywords are global, rather than per product. -Keywords can be created, edited, or deleted by clicking the "Keywords" +Keywords can be created, edited, deactivated, or deleted by clicking the "Keywords" link in the admin page. There are two fields for each keyword—the keyword -itself and a brief description. Currently keywords cannot be marked obsolete -to prevent future usage. - +itself and a brief description. diff --git a/editkeywords.cgi b/editkeywords.cgi index 41496f362..06e28b79a 100755 --- a/editkeywords.cgi +++ b/editkeywords.cgi @@ -71,11 +71,12 @@ if ($action eq 'add') { # if ($action eq 'new') { check_token_data($token, 'add_keyword'); - my $name = $cgi->param('name') || ''; - my $desc = $cgi->param('description') || ''; + my $name = $cgi->param('name') || ''; + my $is_active = $cgi->param('is_active'); + my $desc = $cgi->param('description') || ''; my $keyword = Bugzilla::Keyword->create( - { name => $name, description => $desc }); + { name => $name, is_active => $is_active, description => $desc }); delete_token($token); @@ -123,6 +124,7 @@ if ($action eq 'update') { $keyword->set_all({ name => scalar $cgi->param('name'), description => scalar $cgi->param('description'), + is_active => scalar $cgi->param('is_active'), }); my $changes = $keyword->update(); diff --git a/template/en/default/admin/keywords/edit.html.tmpl b/template/en/default/admin/keywords/edit.html.tmpl index 23158d36f..7e6617a84 100644 --- a/template/en/default/admin/keywords/edit.html.tmpl +++ b/template/en/default/admin/keywords/edit.html.tmpl @@ -18,14 +18,19 @@ <form method="post" action="editkeywords.cgi"> <table id="admin_table_edit"> <tr> - <th>Name:</th> - <td><input size="64" maxlength="64" name="name" + <th><label for="name">Name:</label></th> + <td><input size="64" maxlength="64" name="name" id="name" value="[% keyword.name FILTER html %]" required></td> </tr> <tr> - <th>Description:</th> + <th><label for="is_active">Enabled For [% terms.Bugs %]</label></th> + <td><input id="is_active" name="is_active" type="checkbox" [% "checked" IF keyword.is_active %]></td> + </tr> + <tr> + <th><label for="decription">Description:</label></th> <td> [% INCLUDE global/textarea.html.tmpl + id = 'description' name = 'description' minrows = 4 cols = 64 diff --git a/template/en/default/admin/keywords/list.html.tmpl b/template/en/default/admin/keywords/list.html.tmpl index c3f4a5292..9d920036e 100644 --- a/template/en/default/admin/keywords/list.html.tmpl +++ b/template/en/default/admin/keywords/list.html.tmpl @@ -10,6 +10,7 @@ # keywords: array keyword objects having the properties: # - id: number. The ID of the keyword. # - name: string. The name of the keyword. + # - is_active: boolean. true if the keyword can be used. # - description: string. The description of the keyword. # - bug_count: number. The number of bugs with the keyword. #%] @@ -20,34 +21,39 @@ %] [% columns = [ - { - name => "name" - heading => "Edit keyword..." - contentlink => "editkeywords.cgi?action=edit&id=%%id%%" - }, - { - name => "description" - heading => "Description" - allow_html_content => 1 - }, - { - name => "bug_count" - heading => "$terms.Bugs" - class => "right" - contentlink => "buglist.cgi?keywords=%%name%%" - }, - { - heading => "Action" - content => "Delete" - contentlink => "editkeywords.cgi?action=del&id=%%id%%" - } - ] + { + name => "name" + heading => "Edit keyword..." + contentlink => "editkeywords.cgi?action=edit&id=%%id%%" + }, + { + name => "description" + heading => "Description" + allow_html_content => 1 + }, + { + name => "is_active", + heading => "Active", + yesno_field => 1 + }, + { + name => "bug_count" + heading => "$terms.Bugs" + class => "right" + contentlink => "buglist.cgi?keywords=%%name%%" + }, + { + heading => "Action" + content => "Delete" + contentlink => "editkeywords.cgi?action=del&id=%%id%%" + } +] %] [% PROCESS admin/table.html.tmpl - columns = columns - data = keywords - footer = footer_row + columns = columns + data = keywords + footer = footer_row %] <p><a href="editkeywords.cgi?action=add">Add a new keyword</a></p> diff --git a/template/en/default/bug/create/create.html.tmpl b/template/en/default/bug/create/create.html.tmpl index 29b17d410..c9a7c7db9 100644 --- a/template/en/default/bug/create/create.html.tmpl +++ b/template/en/default/bug/create/create.html.tmpl @@ -537,7 +537,7 @@ TUI_hide_default('attachment_text_field'); <tr> [% INCLUDE bug/field.html.tmpl bug = default, field = bug_fields.keywords, editable = 1, - value = keywords, possible_values = all_keywords, + value = keywords, possible_values = active_keywords, desc_url = "describekeywords.cgi", value_span = 3 %] </tr> diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl index c5cf88f04..5402624f6 100644 --- a/template/en/default/bug/edit.html.tmpl +++ b/template/en/default/bug/edit.html.tmpl @@ -552,7 +552,7 @@ [% INCLUDE bug/field.html.tmpl bug = bug, field = bug_fields.keywords, value = bug.keywords editable = bug.check_can_change_field("keywords", 0, 1), - desc_url = "describekeywords.cgi", possible_values = all_keywords + desc_url = "describekeywords.cgi", possible_values = active_keywords %] </tr> [% END %] diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl index c74ba1efc..8306657e3 100644 --- a/template/en/default/global/user-error.html.tmpl +++ b/template/en/default/global/user-error.html.tmpl @@ -1452,7 +1452,7 @@ Either you mis-typed the name or that user has not yet registered for a [% terms.Bugzilla %] account. [% ELSIF class == "Bugzilla::Keyword" %] - See the list of available <a href="describekeywords.cgi">keywords</a>. + See the list of available <a href="describekeywords.cgi?show_inactive_keywords=1">keywords</a>. [% END %] [% ELSIF error == "old_password_incorrect" %] diff --git a/template/en/default/reports/keywords.html.tmpl b/template/en/default/reports/keywords.html.tmpl index 598979d33..6e7ad0c50 100644 --- a/template/en/default/reports/keywords.html.tmpl +++ b/template/en/default/reports/keywords.html.tmpl @@ -18,36 +18,67 @@ title = "$terms.Bugzilla Keyword Descriptions" style_urls = ['skins/standard/admin.css'] %] +[% cgi = Bugzilla.cgi %] +[% show_inactive_keywords = cgi.param("show_inactive_keywords") %] -<table id="admin_table"> +<script> + $(document).ready(function () { + var show_inactive_keywords = [% show_inactive_keywords ? "true" : "false" FILTER none %]; + link = $("#keywords_show_hide"), + rows = $("tr.keyword_inactive"); + + link.click(function (event) { + if (show_inactive_keywords) { + show_inactive_keywords = false; + rows.show(); + link.html("Hide inactive keywords"); + } + else { + show_inactive_keywords = true; + rows.hide(); + link.html("Show inactive keywords"); + } + event.preventDefault(); + }).click(); + }); +</script> + +<p> + <a href="[% urlbase FILTER html %]?show_inactive_keywords=[% show_inactive_keywords ? "1" : "0" FILTER none %]" + id="keywords_show_hide">[% show_inactive_keywords ? "Show" : "Hide" FILTER html %] inactive keywords</a> +</p> + +<table id="admin_table" class="describe_keywords"> <tr class="column_header"> <th>Name</th> <th>Description</th> + <th>Active</th> <th>Open [% terms.Bugs %]</th> <th>Total [% terms.Bugs %]</th> </tr> [% FOREACH keyword = keywords %] - <tr id="[% keyword.name FILTER html %]"> - <td>[% keyword.name FILTER html %]</td> - <td>[% keyword.description FILTER html_light %]</td> - <td class="center"> - [% IF keyword.bug_count > 0 %] - <a href="buglist.cgi?keywords=[% keyword.name FILTER uri %]&resolution=---"> - Search</a> - [% ELSE %] - none - [% END %] - </td> - <td class="right"> - [% IF keyword.bug_count > 0 %] - <a href="buglist.cgi?keywords=[% keyword.name FILTER uri %]"> - [% keyword.bug_count %]</a> - [% ELSE %] - none - [% END %] - </td> - </tr> + <tr id="[% keyword.name FILTER html %]" class="[% keyword.is_active ? "keyword_active" : "keyword_inactive" FILTER html %]"> + <td>[% keyword.name FILTER html %]</td> + <td>[% keyword.description FILTER html_light %]</td> + <td>[% keyword.is_active ? "Yes" : "No" FILTER html %]</td> + <td class="center"> + [% IF keyword.bug_count > 0 %] + <a href="buglist.cgi?keywords=[% keyword.name FILTER uri %]&resolution=---"> + Search</a> + [% ELSE %] + none + [% END %] + </td> + <td class="right"> + [% IF keyword.bug_count > 0 %] + <a href="buglist.cgi?keywords=[% keyword.name FILTER uri %]"> + [% keyword.bug_count %]</a> + [% ELSE %] + none + [% END %] + </td> + </tr> [% END %] </table> |