Add a form field to customize the dashboard preference

This commit is contained in:
Robert Speicher 2015-06-10 04:42:02 -04:00
parent 6de3958364
commit 1eb9a02f21
3 changed files with 53 additions and 2 deletions

View file

@ -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

View file

@ -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'

View file

@ -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