From 1eb9a02f21d45f2fa301576723bbb0a23b5ba22d Mon Sep 17 00:00:00 2001
From: Robert Speicher <rspeicher@gmail.com>
Date: Wed, 10 Jun 2015 04:42:02 -0400
Subject: [PATCH] Add a form field to customize the dashboard preference

---
 app/helpers/preferences_helper.rb             | 19 +++++++++++++++++++
 app/views/profiles/preferences/show.html.haml | 19 +++++++++++++++++--
 spec/helpers/preferences_helper_spec.rb       | 17 +++++++++++++++++
 3 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb
index 04873b9bd00..c67a34270ff 100644
--- a/app/helpers/preferences_helper.rb
+++ b/app/helpers/preferences_helper.rb
@@ -20,6 +20,25 @@ module PreferencesHelper
     COLOR_SCHEMES.freeze
   end
 
+  # Populates the dashboard preference select field with more user-friendly
+  # values.
+  def dashboard_choices
+    orig = User.dashboards.keys
+
+    choices = [
+      ['Projects (default)', orig[0]],
+      ['Starred Projects',   orig[1]]
+    ]
+
+    if orig.size != choices.size
+      # Assure that anyone adding new options updates this method too
+      raise RuntimeError, "`User` defines #{orig.size} dashboard choices," +
+        " but #{__method__} defined #{choices.size}"
+    else
+      choices
+    end
+  end
+
   def user_application_theme
     theme = Gitlab::Themes.by_id(current_user.try(:theme_id))
     theme.css_class
diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml
index 680c0930bba..8f7c57c12bb 100644
--- a/app/views/profiles/preferences/show.html.haml
+++ b/app/views/profiles/preferences/show.html.haml
@@ -1,8 +1,10 @@
-- page_title "Design"
+- page_title 'Preferences'
 %h3.page-title
   = page_title
 %p.light
-  Appearance settings will be saved to your profile and made available across all devices.
+  These settings allow you to customize the appearance and behavior of the site.
+  They are saved with your account and will persist to any device you use to
+  access the site.
 %hr
 
 = form_for @user, url: profile_preferences_path, remote: true, method: :put, html: {class: 'js-preferences-form'} do |f|
@@ -25,3 +27,16 @@
           .preview= image_tag "#{color_scheme}-scheme-preview.png"
           = f.radio_button :color_scheme_id, color_scheme_id
           = color_scheme.tr('-_', ' ').titleize
+
+  .panel.panel-default
+    .panel-heading
+      Behavior
+    .panel-body
+      .form-group
+        = f.label :dashboard, class: 'control-label'
+        .col-sm-10
+          = f.select :dashboard, dashboard_choices, {}, class: 'form-control'
+          %p.help-block.hint
+            This setting allows you to customize the default Dashboard page.
+    .panel-footer
+      = f.submit 'Save', class: 'btn btn-save'
diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb
index 095b016e6ec..e8d8c4ceb87 100644
--- a/spec/helpers/preferences_helper_spec.rb
+++ b/spec/helpers/preferences_helper_spec.rb
@@ -30,6 +30,23 @@ describe PreferencesHelper do
     end
   end
 
+  describe 'dashboard_choices' do
+    it 'raises an exception when defined choices may be missing' do
+      dashboards = User.dashboards
+      expect(User).to receive(:dashboards).
+        and_return(dashboards.merge(foo: 'foo'))
+
+      expect { dashboard_choices }.to raise_error
+    end
+
+    it 'provides better option descriptions' do
+      choices = dashboard_choices
+
+      expect(choices[0]).to eq ['Projects (default)', 'projects']
+      expect(choices[1]).to eq ['Starred Projects',   'stars']
+    end
+  end
+
   describe 'user_color_scheme_class' do
     context 'with current_user is nil' do
       it 'should return a string' do
-- 
GitLab