From 3e8a6b2bdcd591af4e67002489a71753c7920c7a Mon Sep 17 00:00:00 2001 From: Byron Jones Date: Tue, 15 Jul 2014 13:25:05 +0800 Subject: Bug 1036303: add a list of tracking/project/etc tracking flags to the bugmail filtering prefs page --- extensions/BugmailFilter/Extension.pm | 27 ++- .../default/account/prefs/bugmail_filter.html.tmpl | 202 +++++++++++++-------- extensions/BugmailFilter/web/js/bugmail-filter.js | 5 + extensions/TrackingFlags/Extension.pm | 5 +- extensions/TrackingFlags/lib/Constants.pm | 6 - 5 files changed, 160 insertions(+), 85 deletions(-) diff --git a/extensions/BugmailFilter/Extension.pm b/extensions/BugmailFilter/Extension.pm index 6bcfe70d6..60c180ca7 100644 --- a/extensions/BugmailFilter/Extension.pm +++ b/extensions/BugmailFilter/Extension.pm @@ -116,7 +116,7 @@ sub user_preferences { # remove all tracking flag fields. these change too frequently to be of # value, so they only add noise to the list. - foreach my $field (@{ Bugzilla->tracking_flag_names }) { + foreach my $field (Bugzilla->tracking_flag_names) { delete $fields{$field}; } @@ -159,6 +159,27 @@ sub user_preferences { }) } ]; + # build a list of tracking-flags, grouped by type + require Bugzilla::Extension::TrackingFlags::Constants; + require Bugzilla::Extension::TrackingFlags::Flag; + my %flag_types = + map { $_->{name} => $_->{description} } + @{ Bugzilla::Extension::TrackingFlags::Constants::FLAG_TYPES() }; + my %tracking_flags_by_type; + foreach my $flag (Bugzilla::Extension::TrackingFlags::Flag->get_all) { + my $type = $flag_types{$flag->flag_type}; + $tracking_flags_by_type{$type} //= []; + push @{ $tracking_flags_by_type{$type} }, $flag; + } + my @tracking_flags_by_type; + foreach my $type (sort keys %tracking_flags_by_type) { + push @tracking_flags_by_type, { + name => $type, + flags => $tracking_flags_by_type{$type}, + }; + } + $vars->{tracking_flags_by_type} = \@tracking_flags_by_type; + ${ $args->{handled} } = 1; } @@ -197,7 +218,7 @@ sub user_wants_mail { require Bugzilla::Extension::TrackingFlags::Flag; my %count; my @tracking_flags; - foreach my $field (@$fields, @{ Bugzilla->tracking_flag_names }) { + foreach my $field (@$fields, Bugzilla->tracking_flag_names) { $count{$field}++; } foreach my $field (keys %count) { @@ -212,7 +233,7 @@ sub user_wants_mail { foreach my $type (keys %tracking_types) { push @$fields, 'tracking.' . $type; } - foreach my $field (@{ Bugzilla->tracking_flag_names }) { + foreach my $field (Bugzilla->tracking_flag_names) { $fields = [ grep { $_ ne $field } @$fields ]; } diff --git a/extensions/BugmailFilter/template/en/default/account/prefs/bugmail_filter.html.tmpl b/extensions/BugmailFilter/template/en/default/account/prefs/bugmail_filter.html.tmpl index 83c8d729a..1bcbd35ae 100644 --- a/extensions/BugmailFilter/template/en/default/account/prefs/bugmail_filter.html.tmpl +++ b/extensions/BugmailFilter/template/en/default/account/prefs/bugmail_filter.html.tmpl @@ -173,84 +173,142 @@ var cpts = new Array(); If multiple filters are applicable to the same [% terms.bug %] change, include filters override exclude filters.

+ +
+

Field Groups

+

- Examples: + Some fields are grouped into a single entry in the "field" list. + Following is a list of the groups and all the fields they contain:

+ +[% FOREACH type = tracking_flags_by_type %] + [% type.name FILTER html %]: +
+ [% flag_count = type.flags.size %] + [% FOREACH flag = type.flags %] + [% IF flag_count > 10 && loop.count == 10 %] + + … + (show all) + + + [% END %] + [% flag.description FILTER html FILTER no_break %] + [% ", " UNLESS loop.last %] + [% IF loop.last && flag_count > 10 %] + + [% END %] + [% END %] +
+[% END %] + +
+

Examples

To never receive changes made to the "QA Whiteboard" field for [% terms.bugs %] where you are not the assignee:
- - - - - - - - - - - - - - - - - - - - - -
Field:QA Whiteboard
Product:__Any__
Component:__Any__
Relationship:Not Assignee
Action:Exclude

+ + + + + + + + + + + + + + + + + + + + + +
Field:QA Whiteboard
Product:__Any__
Component:__Any__
Relationship:Not Assignee
Action:Exclude
+ +

+ To receive notifications of new [% terms.bugs %] in Firefox's "New Tab Page" + component, and no other changes, you require three filters. First an + exclude filter to drop all changes made to [% terms.bugs %] in that + component:
+

+ + + + + + + + + + + + + + + + + + + + + +
Field:__Any__
Product:Firefox
Component:New Tab Page
Relationship:__Any__
Action:Exclude

- To receive just comments made to Firefox [% terms.bugs %], and no other - changes, you require two filters. First an exclude filter to drop all - changes made to [% terms.bugs %] in that product:
- - - - - - - - - - - - - - - - - - - - - -
Field:__Any__
Product:Firefox
Component:__Any__
Relationship:__Any__
Action:Exclude
-
Then an include filter to indicate that you want to receive - comments:
- - - - - - - - - - - - - - - - - - - - - -
Field:Comment Created
Product:Firefox
Component:__Any__
Relationship:__Any__
Action:Include
+ notifications when a [% terms.bug %] is created: +

+ + + + + + + + + + + + + + + + + + + + + +
Field:[% terms.Bug %] Created
Product:Firefox
Component:New Tab Page
Relationship:__Any__
Action:Include
+

+ And finally another include filter to catch when a [% terms.bug %] is + moved into the "New Tab Page" component.

+ + + + + + + + + + + + + + + + + + + + + +
Field:Component
Product:Firefox
Component:New Tab Page
Relationship:__Any__
Action:Include
diff --git a/extensions/BugmailFilter/web/js/bugmail-filter.js b/extensions/BugmailFilter/web/js/bugmail-filter.js index e298a60f1..2b320bbbb 100644 --- a/extensions/BugmailFilter/web/js/bugmail-filter.js +++ b/extensions/BugmailFilter/web/js/bugmail-filter.js @@ -29,6 +29,11 @@ function onRemoveChange() { Dom.get('remove').disabled = true; } +function showAllFlags() { + Dom.addClass('show_all', 'bz_default_hidden'); + Dom.removeClass('all_flags', 'bz_default_hidden'); +} + Event.onDOMReady(function() { Event.on('action', 'change', onFilterActionChange); onFilterProductChange(); diff --git a/extensions/TrackingFlags/Extension.pm b/extensions/TrackingFlags/Extension.pm index 9b3d46ad2..301c10245 100644 --- a/extensions/TrackingFlags/Extension.pm +++ b/extensions/TrackingFlags/Extension.pm @@ -32,10 +32,7 @@ BEGIN { } sub _tracking_flag_names { - # return just a list of names, hitting the database directly to avoid the - # overhead of object creation - return Bugzilla->request_cache->{tracking_flag_names} ||= - Bugzilla->dbh->selectcol_arrayref("SELECT name FROM tracking_flags"); + return Bugzilla::Extension::TrackingFlags::Flag->get_all_names(); } sub page_before_template { diff --git a/extensions/TrackingFlags/lib/Constants.pm b/extensions/TrackingFlags/lib/Constants.pm index b6813c3c2..0b1ae3a1a 100644 --- a/extensions/TrackingFlags/lib/Constants.pm +++ b/extensions/TrackingFlags/lib/Constants.pm @@ -34,12 +34,6 @@ sub FLAG_TYPES { collapsed => 1, sortkey => 2 }, - { - name => 'b2g', - description => 'B2G Flags', - collapsed => 1, - sortkey => 3 - }, ); return [ sort { $a->{'sortkey'} <=> $b->{'sortkey'} } @flag_types ]; } -- cgit v1.2.3-24-g4f1b