Commit 6c49a628 authored by Rubén Dávila's avatar Rubén Dávila Committed by Ruben Davila

Restore some changes from !9199

parent 8d1321d6
...@@ -211,6 +211,7 @@ class Admin::UsersController < Admin::ApplicationController ...@@ -211,6 +211,7 @@ class Admin::UsersController < Admin::ApplicationController
:provider, :provider,
:remember_me, :remember_me,
:skype, :skype,
:theme_id,
:twitter, :twitter,
:username, :username,
:website_url :website_url
......
...@@ -35,7 +35,8 @@ class Profiles::PreferencesController < Profiles::ApplicationController ...@@ -35,7 +35,8 @@ class Profiles::PreferencesController < Profiles::ApplicationController
:color_scheme_id, :color_scheme_id,
:layout, :layout,
:dashboard, :dashboard,
:project_view :project_view,
:theme_id
) )
end end
end end
...@@ -40,6 +40,10 @@ module PreferencesHelper ...@@ -40,6 +40,10 @@ module PreferencesHelper
] ]
end end
def user_application_theme
Gitlab::Themes.for_user(current_user).css_class
end
def user_color_scheme def user_color_scheme
Gitlab::ColorSchemes.for_user(current_user).css_class Gitlab::ColorSchemes.for_user(current_user).css_class
end end
......
...@@ -35,6 +35,7 @@ class User < ActiveRecord::Base ...@@ -35,6 +35,7 @@ class User < ActiveRecord::Base
default_value_for :project_view, :files default_value_for :project_view, :files
default_value_for :notified_of_own_activity, false default_value_for :notified_of_own_activity, false
default_value_for :preferred_language, I18n.default_locale default_value_for :preferred_language, I18n.default_locale
default_value_for :theme_id, gitlab_config.default_theme
attr_encrypted :otp_secret, attr_encrypted :otp_secret,
key: Gitlab::Application.secrets.otp_key_base, key: Gitlab::Application.secrets.otp_key_base,
......
...@@ -76,6 +76,14 @@ production: &base ...@@ -76,6 +76,14 @@ production: &base
# default_can_create_group: false # default: true # default_can_create_group: false # default: true
# username_changing_enabled: false # default: true - User can change her username/namespace # username_changing_enabled: false # default: true - User can change her username/namespace
## Default theme ID
## 1 - Graphite
## 2 - Charcoal
## 3 - Green
## 4 - Gray
## 5 - Violet
## 6 - Blue
# default_theme: 2 # default: 2
## Automatic issue closing ## Automatic issue closing
# If a commit message matches this regular expression, all issues referenced from the matched text will be closed. # If a commit message matches this regular expression, all issues referenced from the matched text will be closed.
...@@ -741,4 +749,4 @@ test: ...@@ -741,4 +749,4 @@ test:
admin_group: '' admin_group: ''
staging: staging:
<<: *base <<: *base
\ No newline at end of file
...@@ -232,6 +232,7 @@ Settings['gitlab'] ||= Settingslogic.new({}) ...@@ -232,6 +232,7 @@ Settings['gitlab'] ||= Settingslogic.new({})
Settings.gitlab['default_projects_limit'] ||= 100000 Settings.gitlab['default_projects_limit'] ||= 100000
Settings.gitlab['default_branch_protection'] ||= 2 Settings.gitlab['default_branch_protection'] ||= 2
Settings.gitlab['default_can_create_group'] = true if Settings.gitlab['default_can_create_group'].nil? Settings.gitlab['default_can_create_group'] = true if Settings.gitlab['default_can_create_group'].nil?
Settings.gitlab['default_theme'] = Gitlab::Themes::APPLICATION_DEFAULT if Settings.gitlab['default_theme'].nil?
Settings.gitlab['host'] ||= ENV['GITLAB_HOST'] || 'localhost' Settings.gitlab['host'] ||= ENV['GITLAB_HOST'] || 'localhost'
Settings.gitlab['ssh_host'] ||= Settings.gitlab.host Settings.gitlab['ssh_host'] ||= Settings.gitlab.host
Settings.gitlab['https'] = false if Settings.gitlab['https'].nil? Settings.gitlab['https'] = false if Settings.gitlab['https'].nil?
......
...@@ -32,6 +32,7 @@ Parameters: ...@@ -32,6 +32,7 @@ Parameters:
"twitter": "", "twitter": "",
"website_url": "", "website_url": "",
"email": "john@example.com", "email": "john@example.com",
"theme_id": 2,
"color_scheme_id": 1, "color_scheme_id": 1,
"projects_limit": 10, "projects_limit": 10,
"current_sign_in_at": null, "current_sign_in_at": null,
......
...@@ -39,6 +39,7 @@ Example response: ...@@ -39,6 +39,7 @@ Example response:
"twitter": "", "twitter": "",
"website_url": "", "website_url": "",
"email": "john@example.com", "email": "john@example.com",
"theme_id": 1,
"color_scheme_id": 1, "color_scheme_id": 1,
"projects_limit": 10, "projects_limit": 10,
"current_sign_in_at": "2015-07-07T07:10:58.392Z", "current_sign_in_at": "2015-07-07T07:10:58.392Z",
......
...@@ -72,6 +72,7 @@ GET /users ...@@ -72,6 +72,7 @@ GET /users
"organization": "", "organization": "",
"last_sign_in_at": "2012-06-01T11:41:01Z", "last_sign_in_at": "2012-06-01T11:41:01Z",
"confirmed_at": "2012-05-23T09:05:22Z", "confirmed_at": "2012-05-23T09:05:22Z",
"theme_id": 1,
"last_activity_on": "2012-05-23", "last_activity_on": "2012-05-23",
"color_scheme_id": 2, "color_scheme_id": 2,
"projects_limit": 100, "projects_limit": 100,
...@@ -105,6 +106,7 @@ GET /users ...@@ -105,6 +106,7 @@ GET /users
"organization": "", "organization": "",
"last_sign_in_at": null, "last_sign_in_at": null,
"confirmed_at": "2012-05-30T16:53:06.148Z", "confirmed_at": "2012-05-30T16:53:06.148Z",
"theme_id": 1,
"last_activity_on": "2012-05-23", "last_activity_on": "2012-05-23",
"color_scheme_id": 3, "color_scheme_id": 3,
"projects_limit": 100, "projects_limit": 100,
...@@ -215,6 +217,7 @@ Parameters: ...@@ -215,6 +217,7 @@ Parameters:
"organization": "", "organization": "",
"last_sign_in_at": "2012-06-01T11:41:01Z", "last_sign_in_at": "2012-06-01T11:41:01Z",
"confirmed_at": "2012-05-23T09:05:22Z", "confirmed_at": "2012-05-23T09:05:22Z",
"theme_id": 1,
"last_activity_on": "2012-05-23", "last_activity_on": "2012-05-23",
"color_scheme_id": 2, "color_scheme_id": 2,
"projects_limit": 100, "projects_limit": 100,
...@@ -341,6 +344,7 @@ GET /user ...@@ -341,6 +344,7 @@ GET /user
"organization": "", "organization": "",
"last_sign_in_at": "2012-06-01T11:41:01Z", "last_sign_in_at": "2012-06-01T11:41:01Z",
"confirmed_at": "2012-05-23T09:05:22Z", "confirmed_at": "2012-05-23T09:05:22Z",
"theme_id": 1,
"last_activity_on": "2012-05-23", "last_activity_on": "2012-05-23",
"color_scheme_id": 2, "color_scheme_id": 2,
"projects_limit": 100, "projects_limit": 100,
...@@ -387,6 +391,7 @@ GET /user ...@@ -387,6 +391,7 @@ GET /user
"organization": "", "organization": "",
"last_sign_in_at": "2012-06-01T11:41:01Z", "last_sign_in_at": "2012-06-01T11:41:01Z",
"confirmed_at": "2012-05-23T09:05:22Z", "confirmed_at": "2012-05-23T09:05:22Z",
"theme_id": 1,
"last_activity_on": "2012-05-23", "last_activity_on": "2012-05-23",
"color_scheme_id": 2, "color_scheme_id": 2,
"projects_limit": 100, "projects_limit": 100,
......
...@@ -35,7 +35,7 @@ module API ...@@ -35,7 +35,7 @@ module API
expose :confirmed_at expose :confirmed_at
expose :last_activity_on expose :last_activity_on
expose :email expose :email
expose :color_scheme_id, :projects_limit, :current_sign_in_at expose :theme_id, :color_scheme_id, :projects_limit, :current_sign_in_at
expose :identities, using: Entities::Identity expose :identities, using: Entities::Identity
expose :can_create_group?, as: :can_create_group expose :can_create_group?, as: :can_create_group
expose :can_create_project?, as: :can_create_project expose :can_create_project?, as: :can_create_project
......
module Gitlab
# Module containing GitLab's application theme definitions and helper methods
# for accessing them.
module Themes
extend self
# Theme ID used when no `default_theme` configuration setting is provided.
APPLICATION_DEFAULT = 2
# Struct class representing a single Theme
Theme = Struct.new(:id, :name, :css_class)
# All available Themes
THEMES = [
Theme.new(1, 'Graphite', 'ui_graphite'),
Theme.new(2, 'Charcoal', 'ui_charcoal'),
Theme.new(3, 'Green', 'ui_green'),
Theme.new(4, 'Black', 'ui_black'),
Theme.new(5, 'Violet', 'ui_violet'),
Theme.new(6, 'Blue', 'ui_blue')
].freeze
# Convenience method to get a space-separated String of all the theme
# classes that might be applied to the `body` element
#
# Returns a String
def body_classes
THEMES.collect(&:css_class).uniq.join(' ')
end
# Get a Theme by its ID
#
# If the ID is invalid, returns the default Theme.
#
# id - Integer ID
#
# Returns a Theme
def by_id(id)
THEMES.detect { |t| t.id == id } || default
end
# Returns the number of defined Themes
def count
THEMES.size
end
# Get the default Theme
#
# Returns a Theme
def default
by_id(default_id)
end
# Iterate through each Theme
#
# Yields the Theme object
def each(&block)
THEMES.each(&block)
end
# Get the Theme for the specified user, or the default
#
# user - User record
#
# Returns a Theme
def for_user(user)
if user
by_id(user.theme_id)
else
default
end
end
private
def default_id
id = Gitlab.config.gitlab.default_theme.to_i
# Prevent an invalid configuration setting from causing an infinite loop
if id < THEMES.first.id || id > THEMES.last.id
APPLICATION_DEFAULT
else
id
end
end
end
end
...@@ -25,7 +25,8 @@ describe Profiles::PreferencesController do ...@@ -25,7 +25,8 @@ describe Profiles::PreferencesController do
def go(params: {}, format: :js) def go(params: {}, format: :js)
params.reverse_merge!( params.reverse_merge!(
color_scheme_id: '1', color_scheme_id: '1',
dashboard: 'stars' dashboard: 'stars',
theme_id: '1'
) )
patch :update, user: params, format: format patch :update, user: params, format: format
...@@ -40,7 +41,8 @@ describe Profiles::PreferencesController do ...@@ -40,7 +41,8 @@ describe Profiles::PreferencesController do
it "changes the user's preferences" do it "changes the user's preferences" do
prefs = { prefs = {
color_scheme_id: '1', color_scheme_id: '1',
dashboard: 'stars' dashboard: 'stars',
theme_id: '2'
}.with_indifferent_access }.with_indifferent_access
expect(user).to receive(:assign_attributes).with(prefs) expect(user).to receive(:assign_attributes).with(prefs)
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
"organization", "organization",
"last_sign_in_at", "last_sign_in_at",
"confirmed_at", "confirmed_at",
"theme_id",
"color_scheme_id", "color_scheme_id",
"projects_limit", "projects_limit",
"current_sign_in_at", "current_sign_in_at",
......
...@@ -26,6 +26,32 @@ describe PreferencesHelper do ...@@ -26,6 +26,32 @@ describe PreferencesHelper do
end end
end end
describe 'user_application_theme' do
context 'with a user' do
it "returns user's theme's css_class" do
stub_user(theme_id: 3)
expect(helper.user_application_theme).to eq 'ui_green'
end
it 'returns the default when id is invalid' do
stub_user(theme_id: Gitlab::Themes.count + 5)
allow(Gitlab.config.gitlab).to receive(:default_theme).and_return(2)
expect(helper.user_application_theme).to eq 'ui_charcoal'
end
end
context 'without a user' do
it 'returns the default theme' do
stub_user
expect(helper.user_application_theme).to eq Gitlab::Themes.default.css_class
end
end
end
describe 'user_color_scheme' do describe 'user_color_scheme' do
context 'with a user' do context 'with a user' do
it "returns user's scheme's css_class" do it "returns user's scheme's css_class" do
......
require 'spec_helper'
describe Gitlab::Themes, lib: true do
describe '.body_classes' do
it 'returns a space-separated list of class names' do
css = described_class.body_classes
expect(css).to include('ui_graphite')
expect(css).to include(' ui_charcoal ')
expect(css).to include(' ui_blue')
end
end
describe '.by_id' do
it 'returns a Theme by its ID' do
expect(described_class.by_id(1).name).to eq 'Graphite'
expect(described_class.by_id(6).name).to eq 'Blue'
end
end
describe '.default' do
it 'returns the default application theme' do
allow(described_class).to receive(:default_id).and_return(2)
expect(described_class.default.id).to eq 2
end
it 'prevents an infinite loop when configuration default is invalid' do
default = described_class::APPLICATION_DEFAULT
themes = described_class::THEMES
config = double(default_theme: 0).as_null_object
allow(Gitlab).to receive(:config).and_return(config)
expect(described_class.default.id).to eq default
config = double(default_theme: themes.size + 5).as_null_object
allow(Gitlab).to receive(:config).and_return(config)
expect(described_class.default.id).to eq default
end
end
describe '.each' do
it 'passes the block to the THEMES Array' do
ids = []
described_class.each { |theme| ids << theme.id }
expect(ids).not_to be_empty
end
end
end
...@@ -716,6 +716,7 @@ describe User do ...@@ -716,6 +716,7 @@ describe User do
it "applies defaults to user" do it "applies defaults to user" do
expect(user.projects_limit).to eq(Gitlab.config.gitlab.default_projects_limit) expect(user.projects_limit).to eq(Gitlab.config.gitlab.default_projects_limit)
expect(user.can_create_group).to eq(Gitlab.config.gitlab.default_can_create_group) expect(user.can_create_group).to eq(Gitlab.config.gitlab.default_can_create_group)
expect(user.theme_id).to eq(Gitlab.config.gitlab.default_theme)
expect(user.external).to be_falsey expect(user.external).to be_falsey
end end
end end
...@@ -726,6 +727,7 @@ describe User do ...@@ -726,6 +727,7 @@ describe User do
it "applies defaults to user" do it "applies defaults to user" do
expect(user.projects_limit).to eq(123) expect(user.projects_limit).to eq(123)
expect(user.can_create_group).to be_falsey expect(user.can_create_group).to be_falsey
expect(user.theme_id).to eq(1)
end end
end end
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
"skype":"aertert", "skype":"aertert",
"linkedin":"", "linkedin":"",
"twitter":"", "twitter":"",
"color_scheme_id":2, "theme_id":2,"color_scheme_id":2,
"state":"active", "state":"active",
"created_at":"2012-12-21T13:02:20Z", "created_at":"2012-12-21T13:02:20Z",
"extern_uid":null, "extern_uid":null,
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
"skype":"aertert", "skype":"aertert",
"linkedin":"", "linkedin":"",
"twitter":"", "twitter":"",
"color_scheme_id":2, "theme_id":2,"color_scheme_id":2,
"state":"active", "state":"active",
"created_at":"2012-12-21T13:02:20Z", "created_at":"2012-12-21T13:02:20Z",
"extern_uid":null, "extern_uid":null,
...@@ -17,4 +17,4 @@ ...@@ -17,4 +17,4 @@
"can_create_project":false, "can_create_project":false,
"private_token":"Wvjy2Krpb7y8xi93owUz", "private_token":"Wvjy2Krpb7y8xi93owUz",
"access_token":"Wvjy2Krpb7y8xi93owUz" "access_token":"Wvjy2Krpb7y8xi93owUz"
} }
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment