]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1209599 - group general preferences by category
authorDavid Lawrence <dkl@mozilla.com>
Wed, 21 Oct 2015 03:00:37 +0000 (03:00 +0000)
committerDavid Lawrence <dkl@mozilla.com>
Wed, 21 Oct 2015 03:00:37 +0000 (03:00 +0000)
15 files changed:
Bugzilla/Install.pm
Bugzilla/User/Setting.pm
extensions/BMO/Extension.pm
extensions/BugModal/Extension.pm
extensions/Example/Extension.pm
extensions/Gravatar/Extension.pm
extensions/InlineHistory/Extension.pm
extensions/Needinfo/Extension.pm
extensions/OrangeFactor/Extension.pm
extensions/RequestNagger/Extension.pm
extensions/Review/Extension.pm
skins/standard/admin.css
template/en/default/account/prefs/settings.html.tmpl
template/en/default/admin/settings/edit.html.tmpl
userprefs.cgi

index 9950b222a31332e48da083ab11eb40a35e7a9891..71525115480471034ed34a3fac2b2d98f1d1ac83 100644 (file)
@@ -281,13 +281,8 @@ sub update_settings {
     }
 
     my @settings = @{SETTINGS()};
-    foreach my $setting (@settings) {
-        add_setting($setting->{name},
-                    $setting->{options},
-                    $setting->{default},
-                    $setting->{subclass},
-                    undef,
-                    !$any_settings);
+    foreach my $params (@settings) {
+        add_setting($params);
     }
 }
 
index e083a251ec02d9d0f146a839d79db6e68c86592c..f566b3459b46374023a8cca8c7b0cad6e18f3533 100644 (file)
@@ -66,10 +66,10 @@ sub new {
     # to retrieve the information for this setting ourselves.
     if (scalar @_ == 0) {
 
-        my ($default, $is_enabled, $value);
-        ($default, $is_enabled, $value, $subclass) = 
+        my ($default, $is_enabled, $value, $category);
+        ($default, $is_enabled, $value, $subclass, $category) =
           $dbh->selectrow_array(
-             q{SELECT default_value, is_enabled, setting_value, subclass
+             q{SELECT default_value, is_enabled, setting_value, subclass, category
                  FROM setting
             LEFT JOIN profile_setting
                    ON setting.name = profile_setting.setting_name
@@ -80,17 +80,18 @@ sub new {
 
         # if not defined, then grab the default value
         if (! defined $value) {
-            ($default, $is_enabled, $subclass) =
+            ($default, $is_enabled, $subclass, $category) =
               $dbh->selectrow_array(
-                 q{SELECT default_value, is_enabled, subclass
+                 q{SELECT default_value, is_enabled, subclass, category
                    FROM setting
                    WHERE name = ?},
               undef,
               $setting_name);
         }
 
-        $self->{'is_enabled'} = $is_enabled;
+        $self->{'is_enabled'}    = $is_enabled;
         $self->{'default_value'} = $default;
+        $self->{'category'}      = $category;
 
         # IF the setting is enabled, AND the user has chosen a setting
         # THEN return that value
@@ -109,6 +110,7 @@ sub new {
         $self->{'value'}         = shift;
         $self->{'is_default'}    = shift;
         $subclass                = shift;
+        $self->{'category'}      = shift;
     }
     if ($subclass) {
         eval('require ' . $class . '::' . $subclass);
@@ -129,14 +131,27 @@ sub new {
 ###############################
 
 sub add_setting {
-    my ($name, $values, $default_value, $subclass, $force_check,
-        $silently) = @_;
+    my ($params) = @_;
+    my ($name, $options, $default, $subclass, $force_check, $silently, $category)
+        = @$params{qw( name options default subclass force_check silently category )};
     my $dbh = Bugzilla->dbh;
 
+    # Categories were added later, so we need to check if the old
+    # setting has the correct category if provided
     my $exists = _setting_exists($name);
+    if ($exists && $category) {
+        my $old_category = $dbh->selectrow_arrayref(
+            "SELECT category FROM setting WHERE name = ?", undef, $name);
+        if ($old_category ne $category) {
+            $dbh->do('UPDATE setting SET category = ? WHERE name = ?',
+                     undef, $category, $name);
+            Bugzilla->memcached->clear_config();
+        }
+    }
+
     return if ($exists && !$force_check);
 
-    ($name && $default_value)
+    ($name && $default)
       ||  ThrowCodeError("setting_info_invalid");
 
     if ($exists) {
@@ -144,8 +159,8 @@ sub add_setting {
         $dbh->do('DELETE FROM setting_value WHERE name = ?', undef, $name);
         $dbh->do('DELETE FROM setting WHERE name = ?', undef, $name);
         # Remove obsolete user preferences for this setting.
-        if (defined $values && scalar(@$values)) {
-            my $list = join(', ', map {$dbh->quote($_)} @$values);
+        if (defined $options && scalar(@$options)) {
+            my $list = join(', ', map {$dbh->quote($_)} @$options);
             $dbh->do("DELETE FROM profile_setting
                       WHERE setting_name = ? AND setting_value NOT IN ($list)",
                       undef, $name);
@@ -154,15 +169,15 @@ sub add_setting {
     elsif (!$silently) {
         print get_text('install_setting_new', { name => $name }) . "\n";
     }
-    $dbh->do(q{INSERT INTO setting (name, default_value, is_enabled, subclass)
-                    VALUES (?, ?, 1, ?)},
-             undef, ($name, $default_value, $subclass));
+    $dbh->do(q{INSERT INTO setting (name, default_value, is_enabled, subclass, category)
+                    VALUES (?, ?, 1, ?, ?)},
+             undef, ($name, $default, $subclass, $category));
 
     my $sth = $dbh->prepare(q{INSERT INTO setting_value (name, value, sortindex)
                                     VALUES (?, ?, ?)});
 
     my $sortindex = 5;
-    foreach my $key (@$values){
+    foreach my $key (@$options){
         $sth->execute($name, $key, $sortindex);
         $sortindex += 5;
     }
@@ -177,7 +192,7 @@ sub get_all_settings {
     my $rows = Bugzilla->memcached->get_config({ key => $cache_key });
     if (!$rows) {
         $rows = $dbh->selectall_arrayref(
-            q{SELECT name, default_value, is_enabled, setting_value, subclass
+            q{SELECT name, default_value, is_enabled, setting_value, subclass, category
                 FROM setting
            LEFT JOIN profile_setting
                      ON setting.name = profile_setting.setting_name
@@ -186,7 +201,7 @@ sub get_all_settings {
     }
 
     foreach my $row (@$rows) {
-        my ($name, $default_value, $is_enabled, $value, $subclass) = @$row;
+        my ($name, $default_value, $is_enabled, $value, $subclass, $category) = @$row;
 
         my $is_default;
 
@@ -199,7 +214,8 @@ sub get_all_settings {
 
         $settings->{$name} = new Bugzilla::User::Setting(
            $name, $user_id, $is_enabled,
-           $default_value, $value, $is_default, $subclass);
+           $default_value, $value, $is_default,
+           $subclass, $category);
     }
 
     return $settings;
@@ -217,15 +233,15 @@ sub get_defaults {
 
     $user_id ||= 0;
 
-    my $rows = $dbh->selectall_arrayref(q{SELECT name, default_value, is_enabled, subclass
+    my $rows = $dbh->selectall_arrayref(q{SELECT name, default_value, is_enabled, subclass, category
                                             FROM setting});
 
     foreach my $row (@$rows) {
-        my ($name, $default_value, $is_enabled, $subclass) = @$row;
+        my ($name, $default_value, $is_enabled, $subclass, $category) = @$row;
 
         $default_settings->{$name} = new Bugzilla::User::Setting(
             $name, $user_id, $is_enabled, $default_value, $default_value, 1,
-            $subclass);
+            $subclass, $category);
     }
 
     return $default_settings;
@@ -347,7 +363,7 @@ $settings->{$setting_name} = new Bugzilla::User::Setting(
 
 =over 4
 
-=item C<add_setting($name, \@values, $default_value, $subclass, $force_check)>
+=item C<add_setting($name, \@values, $default_value, $subclass, $force_check, $category)>
 
 Description: Checks for the existence of a setting, and adds it 
              to the database if it does not yet exist.
@@ -361,6 +377,8 @@ Params:      C<$name> - string - the name of the new setting
                not stored in the DB.
              C<$force_check> - boolean - when true, the existing setting
                and all its values are deleted and replaced by new data.
+             C<$category> - string - Category the setting should be
+               grouped by.
 
 Returns:     a pointer to a hash of settings
 
index 6e04c2637d8bc6c5423b04d83d5da160c8303a71..67f7cc160ceaf6077b411dd330e2fc347e9ecf39 100644 (file)
@@ -1089,13 +1089,21 @@ sub install_before_final_checks {
     my ($self, $args) = @_;
 
     # Add product chooser setting
-    add_setting('product_chooser',
-                ['pretty_product_chooser', 'full_product_chooser'],
-                'pretty_product_chooser');
+    add_setting({
+        name     => 'product_chooser',
+        options  => ['pretty_product_chooser', 'full_product_chooser'],
+        default  => 'pretty_product_chooser',
+        category => 'User Interface'
+    });
 
     # Add option to inject x-bugzilla headers into the message body to work
     # around gmail filtering limitations
-    add_setting('headers_in_body', ['on', 'off'], 'off');
+    add_setting({
+        name     => 'headers_in_body',
+        options  => ['on', 'off'],
+        default  => 'off',
+        category => 'Email Notifications'
+    });
 
     # Migrate from 'gmail_threading' setting to 'bugmail_new_prefix'
     my $dbh = Bugzilla->dbh;
index 2c60ef35ad767541610f650d7626b00a065a55b0..e929f3fcbb5f4f02e812d0936c5ad0e577a2ded1 100644 (file)
@@ -292,8 +292,18 @@ sub webservice {
 
 sub install_before_final_checks {
     my ($self, $args) = @_;
-    add_setting('ui_experiments', ['on', 'off'], 'off');
-    add_setting('ui_remember_collapsed', ['on', 'off'], 'off');
+    add_setting({
+        name     => 'ui_experiments',
+        options  => ['on', 'off'],
+        default  => 'off',
+        category => 'User Interface'
+    });
+    add_setting({
+        name     => 'ui_remember_collapsed',
+        options  => ['on', 'off'],
+        default  => 'off',
+        category => 'User Interface'
+    });
 
     # ensure the correct skin is being used
     my $dbh = Bugzilla->dbh;
index 5b76935e31f00546d9dfdf50f55bfc5454d2fa60..4fd2d987f1dac9c911316601b0a064918a3ec214 100644 (file)
@@ -543,10 +543,11 @@ sub install_before_final_checks {
     
     # Add a new user setting like this:
     #
-    # add_setting('product_chooser',           # setting name
-    #             ['pretty', 'full', 'small'], # options
-    #             'pretty');                   # default
-    #
+    # add_setting({
+    #     name     => 'product_chooser',           # setting name
+    #     options  => ['pretty', 'full', 'small'], # options
+    #     category => 'pretty'                     # default
+    # });
     # To add descriptions for the setting and choices, add extra values to 
     # the hash defined in global/setting-descs.none.tmpl. Do this in a hook: 
     # hook/global/setting-descs-settings.none.tmpl .
index 3338790e7631beae4547a61628d1f3474f23db96..06e98fb788df16e143848cb73aa33e53417d7eb0 100644 (file)
@@ -38,8 +38,18 @@ sub _user_gravatar {
 
 sub install_before_final_checks {
     my ($self, $args) = @_;
-    add_setting('show_gravatars', ['On', 'Off'], 'Off');
-    add_setting('show_my_gravatar', ['On', 'Off'], 'On');
+    add_setting({
+        name     => 'show_gravatars',
+        options  => ['On', 'Off'],
+        default  => 'Off',
+        category => 'Bug Editing'
+    });
+    add_setting({
+        name     => 'show_my_gravatar',
+        options  => ['On', 'Off'],
+        default  => 'On',
+        category => 'Bug Editing'
+    });
 }
 
 __PACKAGE__->NAME;
index 86536719f72a978c08b907fe7bd8cd203db16020..d563bede8cc875ad2c2fb32423b2b7e4183270a7 100644 (file)
@@ -231,7 +231,12 @@ sub _add_duplicates {
 
 sub install_before_final_checks {
     my ($self, $args) = @_;
-    add_setting('inline_history', ['on', 'off'], 'off');
+    add_setting({
+        name     => 'inline_history',
+        options  => ['on', 'off'],
+        default  => 'off',
+        category => 'Bug Editing'
+    });
 }
 
 __PACKAGE__->NAME;
index 7d94fb9a4f326a43adb292b7f396b22253dbdbe4..c1659a1ebb93a5800575e42bd6b735e00f83ef79 100644 (file)
@@ -58,7 +58,12 @@ sub install_update_db {
 
 sub install_before_final_checks {
     my ($self, $args) = @_;
-    add_setting('block_needinfo', ['on', 'off'], 'off');
+    add_setting({
+        name     => 'block_needinfo',
+        options  => ['on', 'off'],
+        default  => 'off',
+        category => 'Reviews and Needinfo'
+    });
 }
 
 # Clear the needinfo? flag if comment is being given by
index af629e32310bdf41bb96efa15f133241d31955fa..14d500ba01218aeffb50b34d9207f25b09371ff3 100644 (file)
@@ -37,7 +37,12 @@ sub template_before_process {
 
 sub install_before_final_checks {
     my ($self, $args) = @_;
-    add_setting('orange_factor', ['on', 'off'], 'off');
+    add_setting({
+        name     => 'orange_factor',
+        options  => ['on', 'off'],
+        default  => 'off',
+        category => 'User Interface'
+    });
 }
 
 __PACKAGE__->NAME;
index 169f76b1e4f72c95cb2aeb773af8ddaf4f3e6051..63d79040e1fb3a0b4fa8db78f8cfd6d6fc664986 100644 (file)
@@ -379,7 +379,12 @@ sub install_filesystem {
 
 sub install_before_final_checks {
     my ($self, $args) = @_;
-    add_setting('request_nagging', ['on', 'off'], 'on');
+    add_setting({
+        name     => 'request_nagging',
+        options  => ['on', 'off'],
+        default  => 'on',
+        category => 'Reviews and Needinfo'
+    });
 }
 
 __PACKAGE__->NAME;
index 84ab3e77b3c95f85dd9a8375768081b6466da66b..4fd965b4c1fd59853e601f250f74a1c429649333 100644 (file)
@@ -1041,7 +1041,12 @@ sub install_filesystem {
 
 sub install_before_final_checks {
     my ($self, $args) = @_;
-    add_setting('block_reviews', ['on', 'off'], 'off');
+    add_setting({
+        name     => 'block_reviews',
+        options  => ['on', 'off'],
+        default  => 'off',
+        category => 'Reviews and Needinfo'
+    });
 }
 
 sub config_modify_panels {
index 6a91965e4de77554ada4386d31c7db6a3759e45e..2b56c18310a74aa6e228137716406a335b31decc 100644 (file)
@@ -231,6 +231,16 @@ input[disabled] {
     background: #fff;
 }
 
+.category_header {
+    text-align: left;
+    font-weight: bold;
+    font-size: larger;
+}
+
+.setting_label {
+    text-align: right;
+}
+
 /* mfa */
 
 #mfa {
index 0147f95efbfe3b91163258a7ef81d18e408ef949..b09d7a49125ce15ab1091aeefab35cd890d1733c 100644 (file)
@@ -16,9 +16,9 @@
   #%]
 
 [%# INTERFACE:
-  # setting_names: an array of strings
-  # settings:      a hash of hashes, keyed by setting_name.
-  #                Each hash contains:
+  # settings:      a hash of hashes, keyed by category ame.
+  #                Each hash value is a list of hashes containing:
+  #                 name          - string (name of the setting)
   #                 is_enabled    - boolean
   #                 default_value - string (global default for this setting)
   #                 value         - string (user-defined preference)
@@ -29,7 +29,9 @@
 
 [% PROCESS "global/setting-descs.none.tmpl" %]
 
-[% IF settings.size %]
+[% SET category_names = settings.keys.sort %]
+
+[% IF category_names.size %]
   [% UNLESS has_settings_enabled %]
     <p class="criticalmessages">
       All user preferences have been disabled by the
   [% END %]
 
   <table border="0" cellpadding="8">
-    [% FOREACH name = setting_names %]
-      [% default_name = name _ '-isdefault' %]
-      [% default_val = settings.${name}.default_value %]
-      <tr id="[% name FILTER html %]_row">
-        <td align="right">
-          [% setting_descs.$name OR name FILTER html %]
+  [% FOREACH category = category_names %]
+    <tr>
+      <td class="category_header">
+        [% category FILTER html %]
+      </td>
+    </tr>
+    [% FOREACH setting = settings.$category %]
+      [% setting_name = setting._setting_name %]
+      [% default_name = setting_name _ '-isdefault' %]
+      [% default_val  = setting.default_value %]
+      <tr id="[% setting_name FILTER html %]_row">
+        <td class="setting_label">
+          [% setting_descs.$setting_name OR setting_name FILTER html %]
         </td>
-        <td>
-          [% IF settings.${name}.is_enabled %]
-            <select name="[% name FILTER html %]" id="[% name FILTER html %]">
-              <option value="[% default_name FILTER html %]"
-                [% ' selected="selected"' IF settings.${name}.is_default %]>
-                Site Default ([% setting_descs.${default_val} OR default_val FILTER html %])
+        <td class="setting_choice">
+          <select name="[% setting_name FILTER html %]" id="[% setting_name FILTER html %]">
+            <option value="[% default_name FILTER html %]"
+              [% ' selected="selected"' IF setting.is_default %]>
+              Site Default ([% setting_descs.${default_val} OR default_val FILTER html %])
+            </option>
+            [% FOREACH x = setting.legal_values %]
+              <option value="[% x FILTER html %]"
+                [% ' selected="selected"'
+                  IF x == setting.value
+                    AND NOT setting.is_default %]>
+                [% setting_descs.${x} OR x FILTER html %]
               </option>
-              [% FOREACH x = settings.${name}.legal_values %]
-                <option value="[% x FILTER html %]"
-                  [% ' selected="selected"' 
-                    IF x == settings.${name}.value
-                    AND NOT settings.${name}.is_default %]>
-                  [% setting_descs.${x} OR x FILTER html %]
-                </option>
-              [% END %]
-            </select>
-            [% IF name == "api_key_only" %]
-              [% INCLUDE "mfa/protected.html.tmpl" %]
             [% END %]
-          [% ELSE %]
-            <select name="[% name FILTER html %]" id="[% name FILTER html %]" disabled="disabled">
-              <option value="[% default_name FILTER html %]">
-                Site Default ([% setting_descs.${default_val} OR default_val FILTER html %])
-              </option>
-            </select>
+          </select>
+          [% IF setting_name == "api_key_only" %]
+            [% INCLUDE "mfa/protected.html.tmpl" %]
           [% END %]
         </td>
       </tr>
     [% END %]
+  [% END %]
   </table>
 [% END %]
-<br>
 
 <script>
-YAHOO.util.Event.onDOMReady(function() {
+$().ready(function() {
   var id = document.location.hash.substring(1) + '_row';
-  YAHOO.util.Dom.addClass(id, 'highlighted');
+  $('#' + id).addClass('highlighted');
 });
 </script>
index 7f95f883e18413874e4b29bd0aa266e09ab5af42..eeb6c32036de6c9bcfbc1386d8f15c76e76ac24c 100644 (file)
@@ -51,6 +51,7 @@ page, and the Default Value will automatically apply to everyone.
       <table border="1" cellpadding="4">
       <tr>
         <th>Preference Text</th>
+        <th>Category</th>
         <th>Default Value</th>
         <th>Enabled</th>
       </tr>
@@ -61,6 +62,9 @@ page, and the Default Value will automatically apply to everyone.
             <td align="right">
               [% setting_descs.$name OR name FILTER html %]
             </td>
+            <td align="left">
+              [% settings.$name.category FILTER html %]
+            </td>
             <td>
               <select name="[% name FILTER html %]" id="[% name FILTER html %]">
                 [% FOREACH x = settings.${name}.legal_values %]
index bd1bb8ab7694f8401a3c53b350200b6c7eb5490e..3f5d2038ca8ce0815668aff21a3c81b1ed7afdc7 100755 (executable)
@@ -228,21 +228,20 @@ sub DisableAccount {
 sub DoSettings {
     my $user = Bugzilla->user;
 
-    my $settings = $user->settings;
-    $vars->{'settings'} = $settings;
-
-    my @setting_list = sort keys %$settings;
-    $vars->{'setting_names'} = \@setting_list;
-
-    $vars->{'has_settings_enabled'} = 0;
-    # Is there at least one user setting enabled?
-    foreach my $setting_name (@setting_list) {
-        if ($settings->{"$setting_name"}->{'is_enabled'}) {
-            $vars->{'has_settings_enabled'} = 1;
-            last;
-        }
+    my %settings;
+    my $has_settings_enabled = 0;
+    foreach my $name (sort keys %{ $user->settings }) {
+        my $setting = $user->settings->{$name};
+        next if !$setting->{is_enabled};
+        my $category = $setting->{category};
+        $settings{$category} ||= [];
+        push(@{ $settings{$category} }, $setting);
+        $has_settings_enabled = 1 if $setting->{is_enabled};
     }
-    $vars->{'dont_show_button'} = !$vars->{'has_settings_enabled'};
+
+    $vars->{settings}             = \%settings;
+    $vars->{has_settings_enabled} = $has_settings_enabled;
+    $vars->{dont_show_button}     = !$has_settings_enabled;
 }
 
 sub SaveSettings {