mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
FEATURE: Native theme support
This feature introduces the concept of themes. Themes are an evolution
of site customizations.
Themes introduce two very big conceptual changes:
- A theme may include other "child themes", children can include grand
children and so on.
- A theme may specify a color scheme
The change does away with the idea of "enabled" color schemes.
It also adds a bunch of big niceties like
- You can source a theme from a git repo
- History for themes is much improved
- You can only have a single enabled theme. Themes can be selected by
users, if you opt for it.
On a technical level this change comes with a whole bunch of goodies
- All CSS is now compiled using a custom pipeline that uses libsass
see /lib/stylesheet
- There is a single pipeline for css compilation (in the past we used
one for customizations and another one for the rest of the app
- The stylesheet pipeline is now divorced of sprockets, there is no
reliance on sprockets for CSS bundling
- CSS is generated with source maps everywhere (including themes) this
makes debugging much easier
- Our "live reloader" is smarter and avoid a flash of unstyled content
we run a file watcher in "puma" in dev so you no longer need to run
rake autospec to watch for CSS changes
This commit is contained in:
@@ -6,6 +6,11 @@ class ColorSchemeColorSerializer < ApplicationSerializer
|
||||
end
|
||||
|
||||
def default_hex
|
||||
ColorScheme.base_colors[object.name]
|
||||
if object.color_scheme
|
||||
object.color_scheme.base_colors[object.name]
|
||||
else
|
||||
# it is a base color so it is already default
|
||||
object.hex
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
class ColorSchemeSerializer < ApplicationSerializer
|
||||
attributes :id, :name, :enabled, :is_base
|
||||
attributes :id, :name, :is_base, :base_scheme_id
|
||||
has_many :colors, serializer: ColorSchemeColorSerializer, embed: :objects
|
||||
|
||||
def base
|
||||
object.is_base || false
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
class SiteCustomizationSerializer < ApplicationSerializer
|
||||
|
||||
attributes :id, :name, :key, :enabled, :created_at, :updated_at,
|
||||
:stylesheet, :header, :footer, :top,
|
||||
:mobile_stylesheet, :mobile_header, :mobile_footer, :mobile_top,
|
||||
:head_tag, :body_tag, :embedded_css
|
||||
end
|
||||
@@ -24,13 +24,25 @@ class SiteSerializer < ApplicationSerializer
|
||||
:tags_filter_regexp,
|
||||
:top_tags,
|
||||
:wizard_required,
|
||||
:topic_featured_link_allowed_category_ids
|
||||
:topic_featured_link_allowed_category_ids,
|
||||
:user_themes
|
||||
|
||||
has_many :categories, serializer: BasicCategorySerializer, embed: :objects
|
||||
has_many :trust_levels, embed: :objects
|
||||
has_many :archetypes, embed: :objects, serializer: ArchetypeSerializer
|
||||
has_many :user_fields, embed: :objects, serialzer: UserFieldSerializer
|
||||
|
||||
def user_themes
|
||||
cache_fragment("user_themes") do
|
||||
Theme.where('key = :default OR user_selectable',
|
||||
default: SiteSetting.default_theme_key)
|
||||
.order(:name)
|
||||
.pluck(:key, :name)
|
||||
.map{|k,n| {theme_key: k, name: n, default: k == SiteSetting.default_theme_key}}
|
||||
.as_json
|
||||
end
|
||||
end
|
||||
|
||||
def groups
|
||||
cache_fragment("group_names") do
|
||||
Group.order(:name).pluck(:id,:name).map { |id,name| { id: id, name: name } }.as_json
|
||||
|
||||
42
app/serializers/theme_serializer.rb
Normal file
42
app/serializers/theme_serializer.rb
Normal file
@@ -0,0 +1,42 @@
|
||||
class ThemeFieldSerializer < ApplicationSerializer
|
||||
attributes :name, :target, :value
|
||||
|
||||
def target
|
||||
case object.target
|
||||
when 0 then "common"
|
||||
when 1 then "desktop"
|
||||
when 2 then "mobile"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class ChildThemeSerializer < ApplicationSerializer
|
||||
attributes :id, :name, :key, :created_at, :updated_at, :default
|
||||
|
||||
def include_default?
|
||||
object.key == SiteSetting.default_theme_key
|
||||
end
|
||||
|
||||
def default
|
||||
true
|
||||
end
|
||||
end
|
||||
|
||||
class RemoteThemeSerializer < ApplicationSerializer
|
||||
attributes :id, :remote_url, :remote_version, :local_version, :about_url,
|
||||
:license_url, :commits_behind, :remote_updated_at, :updated_at
|
||||
|
||||
# wow, AMS has some pretty nutty logic where it tries to find the path here
|
||||
# from action dispatch, tell it not to
|
||||
def about_url
|
||||
object.about_url
|
||||
end
|
||||
end
|
||||
|
||||
class ThemeSerializer < ChildThemeSerializer
|
||||
attributes :color_scheme, :color_scheme_id, :user_selectable, :remote_theme_id
|
||||
|
||||
has_many :theme_fields, serializer: ThemeFieldSerializer, embed: :objects
|
||||
has_many :child_themes, serializer: ChildThemeSerializer, embed: :objects
|
||||
has_one :remote_theme, serializer: RemoteThemeSerializer, embed: :objects
|
||||
end
|
||||
@@ -12,7 +12,8 @@ class UserHistorySerializer < ApplicationSerializer
|
||||
:post_id,
|
||||
:category_id,
|
||||
:action,
|
||||
:custom_type
|
||||
:custom_type,
|
||||
:id
|
||||
|
||||
has_one :acting_user, serializer: BasicUserSerializer, embed: :objects
|
||||
has_one :target_user, serializer: BasicUserSerializer, embed: :objects
|
||||
|
||||
Reference in New Issue
Block a user