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.
- checksums.yaml +4 -4
- data/app/controllers/motor/active_storage_attachments_controller.rb +28 -0
- data/app/controllers/motor/alerts_controller.rb +2 -0
- data/app/controllers/motor/assets_controller.rb +15 -3
- data/app/controllers/motor/configs_controller.rb +2 -0
- data/app/controllers/motor/dashboards_controller.rb +2 -0
- data/app/controllers/motor/data_controller.rb +20 -1
- data/app/controllers/motor/forms_controller.rb +2 -0
- data/app/controllers/motor/queries_controller.rb +2 -0
- data/app/controllers/motor/resources_controller.rb +2 -0
- data/app/controllers/motor/run_queries_controller.rb +2 -0
- data/app/controllers/motor/send_alerts_controller.rb +2 -0
- data/app/models/motor/alert.rb +1 -1
- data/app/models/motor/alert_lock.rb +1 -1
- data/app/models/motor/config.rb +1 -1
- data/app/models/motor/dashboard.rb +1 -1
- data/app/models/motor/form.rb +1 -1
- data/app/models/motor/query.rb +1 -1
- data/app/models/motor/resource.rb +1 -1
- data/app/models/motor/tag.rb +1 -1
- data/app/models/motor/taggable_tag.rb +1 -1
- data/config/routes.rb +1 -0
- data/lib/motor.rb +1 -0
- data/lib/motor/active_record_utils.rb +2 -0
- data/lib/motor/active_record_utils/active_storage_links_extension.rb +15 -0
- data/lib/motor/active_record_utils/defined_scopes_extension.rb +19 -0
- data/lib/motor/admin.rb +14 -3
- data/lib/motor/alerts/persistance.rb +1 -2
- data/lib/motor/alerts/scheduled_alerts_cache.rb +0 -4
- data/lib/motor/api_query.rb +2 -0
- data/lib/motor/api_query/apply_scope.rb +26 -0
- data/lib/motor/api_query/build_json.rb +3 -2
- data/lib/motor/api_query/sort.rb +28 -8
- data/lib/motor/assets.rb +4 -4
- data/lib/motor/build_schema.rb +60 -7
- data/lib/motor/build_schema/active_storage_attachment_schema.rb +84 -0
- data/lib/motor/build_schema/find_display_column.rb +1 -1
- data/lib/motor/build_schema/load_from_rails.rb +112 -84
- data/lib/motor/build_schema/merge_schema_configs.rb +13 -6
- data/lib/motor/build_schema/persist_resource_configs.rb +38 -1
- data/lib/motor/build_schema/reorder_schema.rb +24 -2
- data/lib/motor/dashboards/persistance.rb +2 -2
- data/lib/motor/forms/persistance.rb +2 -2
- data/lib/motor/queries/persistance.rb +2 -2
- data/lib/motor/queries/run_query.rb +10 -5
- data/lib/motor/version.rb +1 -1
- data/ui/dist/main-f7c7f445c53544d2d7b8.css.gz +0 -0
- data/ui/dist/main-f7c7f445c53544d2d7b8.js.gz +0 -0
- data/ui/dist/manifest.json +5 -5
- metadata +9 -4
- data/ui/dist/main-46621a8bdbb789e17c3f.css.gz +0 -0
- 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
|
-
|
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 ||
|
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
|
-
|
62
|
-
|
63
|
-
|
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
Binary file
|
Binary file
|
data/ui/dist/manifest.json
CHANGED
@@ -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-
|
9
|
-
"main-
|
10
|
-
"main-
|
11
|
-
"main.css": "main-
|
12
|
-
"main.js": "main-
|
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.
|
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-
|
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-
|
212
|
-
- ui/dist/main-
|
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:
|
Binary file
|
Binary file
|