99 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| 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 = 1
 | |
| 
 | |
|     # Struct class representing a single Theme
 | |
|     Theme = Struct.new(:id, :name, :css_class, :css_filename, :primary_color)
 | |
| 
 | |
|     # All available Themes
 | |
|     def available_themes
 | |
|       [
 | |
|         Theme.new(1, s_('NavigationTheme|Indigo'), 'ui-indigo', 'theme_indigo', '#292961'),
 | |
|         Theme.new(6, s_('NavigationTheme|Light Indigo'), 'ui-light-indigo', 'theme_light_indigo', '#4b4ba3'),
 | |
|         Theme.new(4, s_('NavigationTheme|Blue'), 'ui-blue', 'theme_blue', '#1a3652'),
 | |
|         Theme.new(7, s_('NavigationTheme|Light Blue'), 'ui-light-blue', 'theme_light_blue', '#2261a1'),
 | |
|         Theme.new(5, s_('NavigationTheme|Green'), 'ui-green', 'theme_green', '#0d4524'),
 | |
|         Theme.new(8, s_('NavigationTheme|Light Green'), 'ui-light-green', 'theme_light_green', '#156b39'),
 | |
|         Theme.new(9, s_('NavigationTheme|Red'), 'ui-red', 'theme_red', '#691a16'),
 | |
|         Theme.new(10, s_('NavigationTheme|Light Red'), 'ui-light-red', 'theme_light_red', '#a62e21'),
 | |
|         Theme.new(2, s_('NavigationTheme|Gray'), 'ui-gray', 'theme_gray', '#303030'),
 | |
|         Theme.new(3, s_('NavigationTheme|Light Gray'), 'ui-light-gray', 'theme_light_gray', '#666'),
 | |
|         Theme.new(11, s_('NavigationTheme|Dark Mode (alpha)'), 'gl-dark', nil, '#303030')
 | |
|       ]
 | |
|     end
 | |
| 
 | |
|     # 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
 | |
|       available_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)
 | |
|       available_themes.detect { |t| t.id == id } || default
 | |
|     end
 | |
| 
 | |
|     # Returns the number of defined Themes
 | |
|     def count
 | |
|       available_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)
 | |
|       available_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
 | |
| 
 | |
|     def self.valid_ids
 | |
|       available_themes.map(&:id)
 | |
|     end
 | |
| 
 | |
|     private
 | |
| 
 | |
|     def default_id
 | |
|       @default_id ||= begin
 | |
|         id = Gitlab.config.gitlab.default_theme.to_i
 | |
|         theme_ids = available_themes.map(&:id)
 | |
| 
 | |
|         theme_ids.include?(id) ? id : APPLICATION_DEFAULT
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 |