keystone_ui-preferences 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +163 -3
  3. data/app/controllers/concerns/keystone_ui/preferences/component_preferences.rb +36 -1
  4. data/app/javascript/keystone_ui/preferences/theme_settings_controller.js +84 -0
  5. data/app/models/keystone_ui/preferences/appearance_choice.rb +172 -0
  6. data/app/models/keystone_ui/preferences/checked_theme.rb +109 -0
  7. data/app/models/keystone_ui/preferences/chosen_colours.rb +44 -0
  8. data/app/models/keystone_ui/preferences/layout_choice.rb +6 -2
  9. data/app/models/keystone_ui/preferences/pick_account_appearance.rb +64 -0
  10. data/app/models/keystone_ui/preferences/pick_appearance.rb +90 -0
  11. data/app/models/keystone_ui/preferences/sent_theme.rb +49 -0
  12. data/app/models/keystone_ui/preferences/theme_css.rb +89 -0
  13. data/app/models/keystone_ui/preferences/theme_reader.rb +34 -0
  14. data/app/models/keystone_ui/preferences/theme_roles.rb +64 -0
  15. data/app/views/keystone_ui/preferences/settings/_account_appearance.html.erb +41 -0
  16. data/app/views/keystone_ui/preferences/settings/_appearance.html.erb +40 -0
  17. data/app/views/keystone_ui/preferences/settings/_colour_choices.html.erb +95 -0
  18. data/app/views/keystone_ui/preferences/settings/_look_choices.html.erb +8 -0
  19. data/app/views/keystone_ui/preferences/settings/_theme_settings.html.erb +17 -0
  20. data/lib/generators/keystone_ui/preferences/install/install_generator.rb +6 -1
  21. data/lib/generators/keystone_ui/preferences/update/templates/copy_keystone_ui_colors_theme_preferences.rb.erb +55 -0
  22. data/lib/generators/keystone_ui/preferences/update/update_generator.rb +15 -1
  23. data/lib/keystone_ui/preferences/colors_check.rb +22 -0
  24. data/lib/keystone_ui/preferences/configuration.rb +11 -1
  25. data/lib/keystone_ui/preferences/engine.rb +24 -0
  26. data/lib/keystone_ui/preferences/version.rb +1 -1
  27. data/lib/keystone_ui/preferences.rb +1 -0
  28. metadata +48 -3
@@ -11,7 +11,7 @@ module KeystoneUi
11
11
 
12
12
  source_root File.expand_path("templates", __dir__)
13
13
 
14
- desc "Installs KeystoneUi::Preferences: copies its migration."
14
+ desc "Installs KeystoneUi::Preferences: copies its migration and its template picker script."
15
15
 
16
16
  def copy_migration
17
17
  migration_template(
@@ -19,6 +19,11 @@ module KeystoneUi
19
19
  "db/migrate/create_keystone_ui_preferences_component_preferences.rb"
20
20
  )
21
21
  end
22
+
23
+ def copy_template_picker_script
24
+ script = File.expand_path("../../../../../app/javascript/keystone_ui/preferences/theme_settings_controller.js", __dir__)
25
+ create_file "app/javascript/controllers/keystone_ui/preferences/theme_settings_controller.js", File.read(script)
26
+ end
22
27
  end
23
28
  end
24
29
  end
@@ -0,0 +1,55 @@
1
+ class CopyKeystoneUiColorsThemePreferences < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
2
+ class ThemePreference < ActiveRecord::Base
3
+ self.table_name = "keystone_ui_colors_theme_preferences"
4
+ end
5
+
6
+ class ComponentPreference < ActiveRecord::Base
7
+ self.table_name = "keystone_ui_preferences_component_preferences"
8
+ end
9
+
10
+ def up
11
+ return unless table_exists?(:keystone_ui_colors_theme_preferences)
12
+
13
+ ThemePreference.find_in_batches do |theme_preferences|
14
+ rows = theme_preferences.flat_map { |theme_preference| [ colours(theme_preference), mode(theme_preference), look(theme_preference) ].compact }
15
+ saved = saved_keys(theme_preferences)
16
+ missing = rows.reject { |row| saved.include?(row.values_at(:owner_type, :owner_id, :component_key)) }
17
+ ComponentPreference.insert_all(missing) if missing.any?
18
+ missing.each { |row| Rails.cache.delete([ "keystone_ui_preferences", *row.values_at(:owner_type, :owner_id, :component_key) ].join("/")) }
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def saved_keys(theme_preferences)
25
+ theme_preferences.group_by(&:owner_type).flat_map do |owner_type, owned|
26
+ ComponentPreference.where(owner_type: owner_type, owner_id: owned.map(&:owner_id), component_key: %w[colours mode look]).pluck(:owner_type, :owner_id, :component_key)
27
+ end.to_set
28
+ end
29
+
30
+ def colours(theme_preference)
31
+ row(theme_preference, "colours", colours_value(theme_preference), members_choose: theme_preference.members_choose)
32
+ end
33
+
34
+ def mode(theme_preference)
35
+ return nil if theme_preference.mode.blank?
36
+
37
+ row(theme_preference, "mode", { "mode" => theme_preference.mode })
38
+ end
39
+
40
+ def look(theme_preference)
41
+ return nil if theme_preference.look.blank? && theme_preference.members_choose_look
42
+
43
+ row(theme_preference, "look", { "look" => theme_preference.look.presence }.compact, members_choose: theme_preference.members_choose_look)
44
+ end
45
+
46
+ def colours_value(theme_preference)
47
+ return { "template_name" => theme_preference.template_name } if theme_preference.template_name.present?
48
+
49
+ { "accent" => theme_preference.accent, "surface" => theme_preference.surface, "text" => theme_preference.text }
50
+ end
51
+
52
+ def row(theme_preference, component_key, value, members_choose: true)
53
+ { owner_type: theme_preference.owner_type, owner_id: theme_preference.owner_id, component_key: component_key, value: value, members_choose: members_choose }
54
+ end
55
+ end
@@ -11,7 +11,7 @@ module KeystoneUi
11
11
 
12
12
  source_root File.expand_path("templates", __dir__)
13
13
 
14
- desc "Updates KeystoneUi::Preferences: copies migrations added since it was installed."
14
+ desc "Updates KeystoneUi::Preferences: copies migrations added since it was installed and the template picker script when the app has none."
15
15
 
16
16
  def copy_remove_extra_owner_index_migration
17
17
  migration_template(
@@ -19,6 +19,20 @@ module KeystoneUi
19
19
  "db/migrate/remove_extra_owner_index_from_keystone_ui_preferences_component_preferences.rb"
20
20
  )
21
21
  end
22
+
23
+ def copy_keystone_ui_colors_theme_preferences_migration
24
+ migration_template(
25
+ "copy_keystone_ui_colors_theme_preferences.rb.erb",
26
+ "db/migrate/copy_keystone_ui_colors_theme_preferences.rb"
27
+ )
28
+ end
29
+
30
+ def copy_template_picker_script
31
+ copy = "app/javascript/controllers/keystone_ui/preferences/theme_settings_controller.js"
32
+ return if File.exist?(File.join(destination_root, copy))
33
+
34
+ create_file copy, File.read(File.expand_path("../../../../../app/javascript/keystone_ui/preferences/theme_settings_controller.js", __dir__))
35
+ end
22
36
  end
23
37
  end
24
38
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KeystoneUi
4
+ module Preferences
5
+ class ColorsCheck
6
+ class Error < StandardError; end
7
+
8
+ MESSAGE = "keystone_ui-preferences and keystone_ui-colors both save colours, modes and looks, so the app cannot load both. " \
9
+ "Remove keystone_ui-colors from the Gemfile and change every KeystoneUi::Colors name the app uses first, " \
10
+ "then run bin/rails generate keystone_ui:preferences:update, so the migration copying keystone_ui-colors' saved choices is in db/migrate, " \
11
+ "and then run bin/rails db:migrate."
12
+
13
+ def initialize(colors_loaded:)
14
+ @colors_loaded = colors_loaded
15
+ end
16
+
17
+ def call
18
+ raise Error, MESSAGE if @colors_loaded
19
+ end
20
+ end
21
+ end
22
+ end
@@ -3,13 +3,23 @@
3
3
  module KeystoneUi
4
4
  module Preferences
5
5
  class Configuration
6
- attr_accessor :current_owner_method, :authentication_method, :current_account_method, :max_value_bytes
6
+ attr_accessor :current_owner_method, :authentication_method, :current_account_method, :max_value_bytes, :default_accent, :default_surface, :default_background, :default_text, :default_mode, :user_looks, :app_look_label, :account_colors, :account_looks, :theme_fonts
7
7
 
8
8
  def initialize
9
9
  @current_owner_method = :current_user
10
10
  @authentication_method = :authenticate_user!
11
11
  @component_names = {}
12
12
  @max_value_bytes = 10_000
13
+ @default_accent = "blue"
14
+ @default_surface = "zinc"
15
+ @default_background = "#ffffff"
16
+ @default_text = "#18181b"
17
+ @default_mode = "light"
18
+ @user_looks = true
19
+ @app_look_label = "Classic"
20
+ @account_colors = true
21
+ @account_looks = true
22
+ @theme_fonts = []
13
23
  end
14
24
 
15
25
  def name_component(component_key, name)
@@ -1,10 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "keystone_ui/preferences/colors_check"
4
+
3
5
  module KeystoneUi
4
6
  module Preferences
5
7
  class Engine < ::Rails::Engine
6
8
  isolate_namespace KeystoneUi::Preferences
7
9
 
10
+ def self.check_colors
11
+ KeystoneUi::Preferences::ColorsCheck.new(colors_loaded: KeystoneUi.const_defined?(:Colors, false)).call
12
+ end
13
+
14
+ config.after_initialize do
15
+ KeystoneUi::Preferences::Engine.check_colors
16
+ end
17
+
8
18
  initializer "keystone_ui.preferences.supplier" do
9
19
  KeystoneUi.configure do |config|
10
20
  config.preference_supplier = lambda do |view, component_key|
@@ -12,6 +22,20 @@ module KeystoneUi
12
22
  end
13
23
  end
14
24
  end
25
+
26
+ initializer "keystone_ui.preferences.theme_mode" do
27
+ KeystoneUi.configure do |config|
28
+ config.theme_mode_supplier = lambda do |view|
29
+ view.respond_to?(:keystone_theme_mode) ? view.keystone_theme_mode : KeystoneUi::Preferences.configuration.default_mode
30
+ end
31
+ end
32
+ end
33
+
34
+ initializer "keystone_ui.preferences.look" do
35
+ KeystoneUi.configure do |config|
36
+ config.look_supplier = ->(view) { view.keystone_look if view.respond_to?(:keystone_look) }
37
+ end
38
+ end
15
39
  end
16
40
  end
17
41
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module KeystoneUi
4
4
  module Preferences
5
- VERSION = "0.6.0"
5
+ VERSION = "0.8.0"
6
6
  end
7
7
  end
@@ -1,5 +1,6 @@
1
1
  require "keystone_ui"
2
2
  require "keystone_ui/navigation_order"
3
+ require "keystone_ui/looks"
3
4
  require "keystone_ui/preferences/version"
4
5
  require "keystone_ui/preferences/configuration"
5
6
  require "keystone_ui/preferences/engine"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keystone_ui-preferences
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Schneider
@@ -15,14 +15,42 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 0.41.0
18
+ version: 0.43.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: 0.41.0
25
+ version: 0.43.0
26
+ - !ruby/object:Gem::Dependency
27
+ name: keystone_ui-looks
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.4.0
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 0.4.0
40
+ - !ruby/object:Gem::Dependency
41
+ name: keystone_ui-styles
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 0.18.0
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.18.0
26
54
  - !ruby/object:Gem::Dependency
27
55
  name: railties
28
56
  requirement: !ruby/object:Gem::Requirement
@@ -79,25 +107,42 @@ files:
79
107
  - app/controllers/concerns/keystone_ui/preferences/component_preferences.rb
80
108
  - app/controllers/keystone_ui/preferences/application_controller.rb
81
109
  - app/controllers/keystone_ui/preferences/component_preferences_controller.rb
110
+ - app/javascript/keystone_ui/preferences/theme_settings_controller.js
111
+ - app/models/keystone_ui/preferences/appearance_choice.rb
82
112
  - app/models/keystone_ui/preferences/application_record.rb
113
+ - app/models/keystone_ui/preferences/checked_theme.rb
114
+ - app/models/keystone_ui/preferences/chosen_colours.rb
83
115
  - app/models/keystone_ui/preferences/component_preference.rb
84
116
  - app/models/keystone_ui/preferences/kept.rb
85
117
  - app/models/keystone_ui/preferences/layout_choice.rb
86
118
  - app/models/keystone_ui/preferences/navigation_arrangement.rb
119
+ - app/models/keystone_ui/preferences/pick_account_appearance.rb
87
120
  - app/models/keystone_ui/preferences/pick_account_layouts.rb
121
+ - app/models/keystone_ui/preferences/pick_appearance.rb
88
122
  - app/models/keystone_ui/preferences/pick_navigation_order.rb
89
123
  - app/models/keystone_ui/preferences/pick_navigation_placement.rb
90
124
  - app/models/keystone_ui/preferences/refusal.rb
125
+ - app/models/keystone_ui/preferences/sent_theme.rb
126
+ - app/models/keystone_ui/preferences/theme_css.rb
127
+ - app/models/keystone_ui/preferences/theme_reader.rb
128
+ - app/models/keystone_ui/preferences/theme_roles.rb
129
+ - app/views/keystone_ui/preferences/settings/_account_appearance.html.erb
91
130
  - app/views/keystone_ui/preferences/settings/_account_layouts.html.erb
131
+ - app/views/keystone_ui/preferences/settings/_appearance.html.erb
132
+ - app/views/keystone_ui/preferences/settings/_colour_choices.html.erb
133
+ - app/views/keystone_ui/preferences/settings/_look_choices.html.erb
92
134
  - app/views/keystone_ui/preferences/settings/_navigation_order.html.erb
93
135
  - app/views/keystone_ui/preferences/settings/_navigation_placement.html.erb
136
+ - app/views/keystone_ui/preferences/settings/_theme_settings.html.erb
94
137
  - config/routes.rb
95
138
  - lib/generators/keystone_ui/preferences/install/install_generator.rb
96
139
  - lib/generators/keystone_ui/preferences/install/templates/create_keystone_ui_preferences_component_preferences.rb.erb
140
+ - lib/generators/keystone_ui/preferences/update/templates/copy_keystone_ui_colors_theme_preferences.rb.erb
97
141
  - lib/generators/keystone_ui/preferences/update/templates/remove_extra_owner_index_from_keystone_ui_preferences_component_preferences.rb.erb
98
142
  - lib/generators/keystone_ui/preferences/update/update_generator.rb
99
143
  - lib/keystone_ui-preferences.rb
100
144
  - lib/keystone_ui/preferences.rb
145
+ - lib/keystone_ui/preferences/colors_check.rb
101
146
  - lib/keystone_ui/preferences/configuration.rb
102
147
  - lib/keystone_ui/preferences/engine.rb
103
148
  - lib/keystone_ui/preferences/version.rb