motor-admin 0.1.9 → 0.1.14

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/motor/active_storage_attachments_controller.rb +28 -0
  3. data/app/controllers/motor/alerts_controller.rb +2 -0
  4. data/app/controllers/motor/assets_controller.rb +15 -3
  5. data/app/controllers/motor/configs_controller.rb +2 -0
  6. data/app/controllers/motor/dashboards_controller.rb +2 -0
  7. data/app/controllers/motor/data_controller.rb +20 -1
  8. data/app/controllers/motor/forms_controller.rb +2 -0
  9. data/app/controllers/motor/queries_controller.rb +2 -0
  10. data/app/controllers/motor/resources_controller.rb +2 -0
  11. data/app/controllers/motor/run_queries_controller.rb +2 -0
  12. data/app/controllers/motor/send_alerts_controller.rb +2 -0
  13. data/app/models/motor/alert.rb +1 -1
  14. data/app/models/motor/alert_lock.rb +1 -1
  15. data/app/models/motor/config.rb +1 -1
  16. data/app/models/motor/dashboard.rb +1 -1
  17. data/app/models/motor/form.rb +1 -1
  18. data/app/models/motor/query.rb +1 -1
  19. data/app/models/motor/resource.rb +1 -1
  20. data/app/models/motor/tag.rb +1 -1
  21. data/app/models/motor/taggable_tag.rb +1 -1
  22. data/config/routes.rb +1 -0
  23. data/lib/motor.rb +1 -0
  24. data/lib/motor/active_record_utils.rb +2 -0
  25. data/lib/motor/active_record_utils/active_storage_links_extension.rb +15 -0
  26. data/lib/motor/active_record_utils/defined_scopes_extension.rb +19 -0
  27. data/lib/motor/admin.rb +14 -3
  28. data/lib/motor/alerts/persistance.rb +1 -2
  29. data/lib/motor/alerts/scheduled_alerts_cache.rb +0 -4
  30. data/lib/motor/api_query.rb +2 -0
  31. data/lib/motor/api_query/apply_scope.rb +26 -0
  32. data/lib/motor/api_query/build_json.rb +3 -2
  33. data/lib/motor/api_query/sort.rb +28 -8
  34. data/lib/motor/assets.rb +4 -4
  35. data/lib/motor/build_schema.rb +60 -7
  36. data/lib/motor/build_schema/active_storage_attachment_schema.rb +84 -0
  37. data/lib/motor/build_schema/find_display_column.rb +1 -1
  38. data/lib/motor/build_schema/load_from_rails.rb +112 -84
  39. data/lib/motor/build_schema/merge_schema_configs.rb +13 -6
  40. data/lib/motor/build_schema/persist_resource_configs.rb +38 -1
  41. data/lib/motor/build_schema/reorder_schema.rb +24 -2
  42. data/lib/motor/dashboards/persistance.rb +2 -2
  43. data/lib/motor/forms/persistance.rb +2 -2
  44. data/lib/motor/queries/persistance.rb +2 -2
  45. data/lib/motor/queries/run_query.rb +10 -5
  46. data/lib/motor/version.rb +1 -1
  47. data/ui/dist/main-f7c7f445c53544d2d7b8.css.gz +0 -0
  48. data/ui/dist/main-f7c7f445c53544d2d7b8.js.gz +0 -0
  49. data/ui/dist/manifest.json +5 -5
  50. metadata +9 -4
  51. data/ui/dist/main-46621a8bdbb789e17c3f.css.gz +0 -0
  52. data/ui/dist/main-46621a8bdbb789e17c3f.js.gz +0 -0
@@ -7,6 +7,7 @@ module Motor
7
7
  COLUMN_DEFAULTS = PersistResourceConfigs::COLUMN_DEFAULTS
8
8
  ACTION_DEFAULTS = PersistResourceConfigs::ACTION_DEFAULTS
9
9
  TAB_DEFAULTS = PersistResourceConfigs::TAB_DEFAULTS
10
+ SCOPE_DEFAULTS = PersistResourceConfigs::SCOPE_DEFAULTS
10
11
 
11
12
  module_function
12
13
 
@@ -26,17 +27,17 @@ module Motor
26
27
  def merge_model(model, configs)
27
28
  updated_model = model.merge(configs.slice(*RESOURCE_ATTRS))
28
29
 
30
+ updated_model[:associations] = merge_by_name(
31
+ model[:associations],
32
+ configs[:associations]
33
+ )
34
+
29
35
  updated_model[:columns] = merge_by_name(
30
36
  model[:columns],
31
37
  configs[:columns],
32
38
  COLUMN_DEFAULTS
33
39
  )
34
40
 
35
- updated_model[:associations] = merge_by_name(
36
- model[:associations],
37
- configs[:associations]
38
- )
39
-
40
41
  updated_model[:actions] = merge_by_name(
41
42
  model[:actions],
42
43
  configs[:actions],
@@ -46,7 +47,13 @@ module Motor
46
47
  updated_model[:tabs] = merge_by_name(
47
48
  model[:tabs],
48
49
  configs[:tabs],
49
- ACTION_DEFAULTS
50
+ TAB_DEFAULTS
51
+ )
52
+
53
+ updated_model[:scopes] = merge_by_name(
54
+ model[:scopes],
55
+ configs[:scopes],
56
+ SCOPE_DEFAULTS
50
57
  )
51
58
 
52
59
  updated_model
@@ -6,12 +6,14 @@ module Motor
6
6
  RESOURCE_ATTRS = %w[display_name visible].freeze
7
7
  COLUMN_ATTRS = %w[name display_name column_type access_type default_value virtual].freeze
8
8
  ASSOCIATION_ATTRS = %w[name display_name visible].freeze
9
+ SCOPE_ATTRS = %w[name display_name scope_type preferences visible].freeze
9
10
  ACTION_ATTRS = %w[name display_name action_type preferences visible].freeze
10
11
  TAB_ATTRS = %w[name display_name tab_type preferences visible].freeze
11
12
 
12
13
  COLUMN_DEFAULTS = {
13
14
  access_type: 'read_write',
14
15
  default_value: nil,
16
+ reference: nil,
15
17
  validators: []
16
18
  }.with_indifferent_access
17
19
 
@@ -25,6 +27,12 @@ module Motor
25
27
  preferences: {}
26
28
  }.with_indifferent_access
27
29
 
30
+ SCOPE_DEFAULTS = {
31
+ visible: true,
32
+ scope_type: 'default',
33
+ preferences: {}
34
+ }.with_indifferent_access
35
+
28
36
  module_function
29
37
 
30
38
  # @param resource [Motor::Resource]
@@ -99,6 +107,14 @@ module Motor
99
107
  )
100
108
  end
101
109
 
110
+ if new_prefs[:scopes].present?
111
+ normalized_preferences[:scopes] = normalize_scopes(
112
+ default_prefs[:scopes],
113
+ existing_prefs.fetch(:scopes, []),
114
+ new_prefs.fetch(:scopes, [])
115
+ )
116
+ end
117
+
102
118
  normalized_preferences.compact
103
119
  end
104
120
 
@@ -138,7 +154,7 @@ module Motor
138
154
  action_attrs = new_action.slice(*ACTION_ATTRS)
139
155
 
140
156
  normalized_action = existing_action.merge(action_attrs)
141
- normalized_action = reject_default(default_action.presence || TAB_DEFAULTS, normalized_action)
157
+ normalized_action = reject_default(default_action.presence || ACTION_DEFAULTS, normalized_action)
142
158
 
143
159
  normalized_action.merge(name: name) if normalized_action.present?
144
160
  end.compact.presence
@@ -165,6 +181,27 @@ module Motor
165
181
  end.compact.presence
166
182
  end
167
183
 
184
+ # @param default_scopes [Array<HashWithIndifferentAccess>]
185
+ # @param existing_scopes [Array<HashWithIndifferentAccess>]
186
+ # @param new_scopes [Array<HashWithIndifferentAccess>]
187
+ # @return [Array<HashWithIndifferentAccess>]
188
+ def normalize_scopes(default_scopes, existing_scopes, new_scopes)
189
+ (existing_scopes.pluck(:name) + new_scopes.pluck(:name)).uniq.map do |name|
190
+ new_scope = safe_fetch_by_name(new_scopes, name)
191
+
192
+ next if new_scope[:_remove]
193
+
194
+ existing_scope = safe_fetch_by_name(existing_scopes, name)
195
+ default_scope = safe_fetch_by_name(default_scopes, name)
196
+ scope_attrs = new_scope.slice(*SCOPE_ATTRS)
197
+
198
+ normalized_scope = existing_scope.merge(scope_attrs)
199
+ normalized_scope = reject_default(default_scope.presence || SCOPE_DEFAULTS, normalized_scope)
200
+
201
+ normalized_scope.merge(name: name) if normalized_scope.present?
202
+ end.compact.presence
203
+ end
204
+
168
205
  # @param default_assocs [Array<HashWithIndifferentAccess>]
169
206
  # @param existing_assocs [Array<HashWithIndifferentAccess>]
170
207
  # @param new_assocs [Array<HashWithIndifferentAccess>]
@@ -2,6 +2,18 @@
2
2
 
3
3
  module Motor
4
4
  module ReorderSchema
5
+ COLUMNS_DEFAULT_ORDER_WEIGHTS = {
6
+ id: 0,
7
+ updated_at: 2,
8
+ edited_at: 2,
9
+ created_at: 3,
10
+ inserted_at: 3,
11
+ deleted_at: 4,
12
+ archived_at: 4
13
+ }.with_indifferent_access
14
+
15
+ COLUMNS_DEFAULT_ORDER_WEIGHT = 1
16
+
5
17
  module_function
6
18
 
7
19
  # @param schema [Array<HashWithIndifferentAccess>]
@@ -16,12 +28,14 @@ module Motor
16
28
  associations_order = configs["resources.#{model[:name]}.associations.order"]
17
29
  actions_order = configs["resources.#{model[:name]}.actions.order"]
18
30
  tabs_order = configs["resources.#{model[:name]}.tabs.order"]
31
+ scopes_order = configs["resources.#{model[:name]}.scopes.order"]
19
32
 
20
33
  model.merge(
21
- columns: sort_by_name(model[:columns], columns_order, sort_alphabetically: false),
34
+ columns: sort_by_name(sort_columns(model[:columns]), columns_order, sort_alphabetically: false),
22
35
  associations: sort_by_name(model[:associations], associations_order),
23
36
  actions: sort_by_name(model[:actions], actions_order, sort_alphabetically: false),
24
- tabs: sort_by_name(model[:tabs], tabs_order, sort_alphabetically: false)
37
+ tabs: sort_by_name(model[:tabs], tabs_order, sort_alphabetically: false),
38
+ scopes: sort_by_name(model[:scopes], scopes_order)
25
39
  )
26
40
  end
27
41
  end
@@ -42,6 +56,14 @@ module Motor
42
56
  end
43
57
  end
44
58
 
59
+ def sort_columns(columns)
60
+ columns.each_with_object([]) do |column, acc|
61
+ weight = COLUMNS_DEFAULT_ORDER_WEIGHTS.fetch(column[:name], COLUMNS_DEFAULT_ORDER_WEIGHT)
62
+
63
+ (acc[weight] ||= []) << column
64
+ end.flatten.compact
65
+ end
66
+
45
67
  # @return [Hash<String, HashWithIndifferentAccess>]
46
68
  def load_configs
47
69
  Motor::Config.all.each_with_object({}) do |config, acc|
@@ -30,10 +30,10 @@ module Motor
30
30
  end
31
31
 
32
32
  def update_from_params!(dashboard, params)
33
- raise TitleAlreadyExists if title_already_exists?(dashboard)
34
-
35
33
  dashboard = assign_attributes(dashboard, params)
36
34
 
35
+ raise TitleAlreadyExists if title_already_exists?(dashboard)
36
+
37
37
  ApplicationRecord.transaction do
38
38
  dashboard.save!
39
39
  end
@@ -30,10 +30,10 @@ module Motor
30
30
  end
31
31
 
32
32
  def update_from_params!(form, params)
33
- raise NameAlreadyExists if name_already_exists?(form)
34
-
35
33
  form = assign_attributes(form, params)
36
34
 
35
+ raise NameAlreadyExists if name_already_exists?(form)
36
+
37
37
  ApplicationRecord.transaction do
38
38
  form.save!
39
39
  end
@@ -30,10 +30,10 @@ module Motor
30
30
  end
31
31
 
32
32
  def update_from_params!(query, params)
33
- raise NameAlreadyExists if name_already_exists?(query)
34
-
35
33
  query = assign_attributes(query, params)
36
34
 
35
+ raise NameAlreadyExists if name_already_exists?(query)
36
+
37
37
  ApplicationRecord.transaction do
38
38
  query.save!
39
39
  end
@@ -57,11 +57,16 @@ module Motor
57
57
  "$#{index}"
58
58
  end
59
59
 
60
- [
61
- format(WITH_STATEMENT_TEMPLATE, sql_body: sql.strip.gsub(/;\z/, ''), limit: limit),
62
- 'SQL',
63
- variables.map { |variable_name, default_value| variables_hash[variable_name] || default_value }
64
- ]
60
+ attributes =
61
+ variables.map do |variable_name, default_value|
62
+ ActiveRecord::Relation::QueryAttribute.new(
63
+ variable_name,
64
+ variables_hash[variable_name] || default_value,
65
+ ActiveRecord::Type::Value.new
66
+ )
67
+ end
68
+
69
+ [format(WITH_STATEMENT_TEMPLATE, sql_body: sql.strip.gsub(/;\z/, ''), limit: limit), 'SQL', attributes]
65
70
  end
66
71
  end
67
72
  end
data/lib/motor/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Motor
4
- VERSION = '0.1.9'
4
+ VERSION = '0.1.14'
5
5
  end
@@ -5,9 +5,9 @@
5
5
  "fonts/ionicons.ttf?v=3.0.0-alpha.3": "fonts/ionicons.ttf",
6
6
  "fonts/ionicons.woff2?v=3.0.0-alpha.3": "fonts/ionicons.woff2",
7
7
  "fonts/ionicons.woff?v=3.0.0-alpha.3": "fonts/ionicons.woff",
8
- "main-46621a8bdbb789e17c3f.css.gz": "main-46621a8bdbb789e17c3f.css.gz",
9
- "main-46621a8bdbb789e17c3f.js.LICENSE.txt": "main-46621a8bdbb789e17c3f.js.LICENSE.txt",
10
- "main-46621a8bdbb789e17c3f.js.gz": "main-46621a8bdbb789e17c3f.js.gz",
11
- "main.css": "main-46621a8bdbb789e17c3f.css",
12
- "main.js": "main-46621a8bdbb789e17c3f.js"
8
+ "main-f7c7f445c53544d2d7b8.css.gz": "main-f7c7f445c53544d2d7b8.css.gz",
9
+ "main-f7c7f445c53544d2d7b8.js.LICENSE.txt": "main-f7c7f445c53544d2d7b8.js.LICENSE.txt",
10
+ "main-f7c7f445c53544d2d7b8.js.gz": "main-f7c7f445c53544d2d7b8.js.gz",
11
+ "main.css": "main-f7c7f445c53544d2d7b8.css",
12
+ "main.js": "main-f7c7f445c53544d2d7b8.js"
13
13
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motor-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.1.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pete Matsyburka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-23 00:00:00.000000000 Z
11
+ date: 2021-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord-filter
@@ -132,6 +132,7 @@ files:
132
132
  - LICENSE
133
133
  - README.md
134
134
  - Rakefile
135
+ - app/controllers/motor/active_storage_attachments_controller.rb
135
136
  - app/controllers/motor/alerts_controller.rb
136
137
  - app/controllers/motor/api_base_controller.rb
137
138
  - app/controllers/motor/application_controller.rb
@@ -172,6 +173,8 @@ files:
172
173
  - lib/motor-admin.rb
173
174
  - lib/motor.rb
174
175
  - lib/motor/active_record_utils.rb
176
+ - lib/motor/active_record_utils/active_storage_links_extension.rb
177
+ - lib/motor/active_record_utils/defined_scopes_extension.rb
175
178
  - lib/motor/active_record_utils/fetch_methods.rb
176
179
  - lib/motor/active_record_utils/types.rb
177
180
  - lib/motor/admin.rb
@@ -181,6 +184,7 @@ files:
181
184
  - lib/motor/alerts/scheduler.rb
182
185
  - lib/motor/api.rb
183
186
  - lib/motor/api_query.rb
187
+ - lib/motor/api_query/apply_scope.rb
184
188
  - lib/motor/api_query/build_json.rb
185
189
  - lib/motor/api_query/build_meta.rb
186
190
  - lib/motor/api_query/filter.rb
@@ -189,6 +193,7 @@ files:
189
193
  - lib/motor/api_query/sort.rb
190
194
  - lib/motor/assets.rb
191
195
  - lib/motor/build_schema.rb
196
+ - lib/motor/build_schema/active_storage_attachment_schema.rb
192
197
  - lib/motor/build_schema/find_display_column.rb
193
198
  - lib/motor/build_schema/load_from_rails.rb
194
199
  - lib/motor/build_schema/merge_schema_configs.rb
@@ -208,8 +213,8 @@ files:
208
213
  - lib/motor/ui_configs.rb
209
214
  - lib/motor/version.rb
210
215
  - ui/dist/fonts/ionicons.woff2
211
- - ui/dist/main-46621a8bdbb789e17c3f.css.gz
212
- - ui/dist/main-46621a8bdbb789e17c3f.js.gz
216
+ - ui/dist/main-f7c7f445c53544d2d7b8.css.gz
217
+ - ui/dist/main-f7c7f445c53544d2d7b8.js.gz
213
218
  - ui/dist/manifest.json
214
219
  homepage:
215
220
  licenses: