discourse/db/migrate/20170313192741_add_themes.rb
Sam a3e8c3cd7b 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
2017-04-12 10:53:49 -04:00

80 lines
2.4 KiB
Ruby

class AddThemes < ActiveRecord::Migration
def up
rename_table :site_customizations, :themes
add_column :themes, :user_selectable, :bool, null: false, default: false
add_column :themes, :hidden, :bool, null: false, default: false
add_column :themes, :color_scheme_id, :integer
create_table :child_themes do |t|
t.integer :parent_theme_id
t.integer :child_theme_id
t.timestamps
end
add_index :child_themes, [:parent_theme_id, :child_theme_id], unique: true
add_index :child_themes, [:child_theme_id, :parent_theme_id], unique: true
# versioning in color scheme table was very confusing, remove it
execute "DELETE FROM color_schemes WHERE versioned_id IS NOT NULL"
remove_column :color_schemes, :versioned_id
enabled_theme_count = execute("SELECT count(*) FROM themes WHERE enabled")
.to_a[0]["count"].to_i
enabled_scheme_id = execute("SELECT id FROM color_schemes WHERE enabled")
.to_a[0]&.fetch("id")
theme_key, theme_id =
execute("SELECT key, id FROM themes WHERE enabled").to_a[0]&.values
if (enabled_theme_count == 0 && enabled_scheme_id) || enabled_theme_count > 1
puts "Creating a new default theme!"
theme_key = '7e202ef2-6666-47d5-98d8-a9c8d15e57dd'
sql = <<SQL
INSERT INTO themes(name,created_at,updated_at, enabled, key, user_id)
VALUES('Default', :now, :now, false, :key, -1)
RETURNING *
SQL
sql = ActiveRecord::Base.sql_fragment(sql, now: Time.zone.now, key: theme_key)
theme_id = execute(sql).to_a[0]["id"].to_i
end
if enabled_theme_count > 1
execute <<SQL
INSERT INTO child_themes(parent_theme_id, child_theme_id, created_at, updated_at)
SELECT #{theme_id.to_i}, id, created_at, updated_at
FROM themes WHERE enabled
SQL
end
if enabled_scheme_id
execute "UPDATE themes SET color_scheme_id=#{enabled_scheme_id.to_i} WHERE id=#{theme_id.to_i}"
end
if enabled_scheme_id || (enabled_theme_count > 0)
puts "Setting default theme"
sql = <<SQL
INSERT INTO site_settings(name, data_type, value, created_at, updated_at)
VALUES('default_theme_key', 1, :key, :now, :now)
SQL
sql = ActiveRecord::Base.sql_fragment(sql, now: Time.zone.now, key: theme_key)
execute(sql)
end
remove_column :themes, :enabled
remove_column :color_schemes, :enabled
end
def down
raise IrriversibleMigration
end
end