motor-admin 0.1.16 → 0.1.22
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/views/layouts/motor/application.html.erb +1 -1
- data/lib/motor.rb +12 -1
- data/lib/motor/active_record_utils.rb +3 -3
- data/lib/motor/active_record_utils/types.rb +4 -0
- data/lib/motor/admin.rb +1 -1
- data/lib/motor/alerts.rb +4 -4
- data/lib/motor/api_query.rb +8 -8
- data/lib/motor/api_query/build_json.rb +5 -5
- data/lib/motor/build_schema/merge_schema_configs.rb +14 -8
- data/lib/motor/build_schema/persist_resource_configs.rb +32 -9
- data/lib/motor/dashboards.rb +2 -2
- data/lib/motor/forms.rb +2 -2
- data/lib/motor/queries.rb +4 -4
- data/lib/motor/version.rb +1 -1
- data/ui/dist/main-25b3270c536d4f5d15b5.css.gz +0 -0
- data/ui/dist/main-25b3270c536d4f5d15b5.js.gz +0 -0
- data/ui/dist/manifest.json +5 -5
- metadata +4 -4
- data/ui/dist/main-729641083f64367ce9aa.css.gz +0 -0
- data/ui/dist/main-729641083f64367ce9aa.js.gz +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a18eff1eb9149993c711610be8362de1818ae5abf9759cf06118d92cffb00c7b
|
4
|
+
data.tar.gz: 7cded1f7b12bcc38c10d0abe7df42bf66a412720cd884190d604ba70698d5fdd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69a7380433550939c6efe7e7a7fb3b5aa7f4ba3d3adc3403c281579f86d7ab2b48c1767aadb059e4e58100cd12ae67a4df349a1d19bab65832421bc32bf57ea8
|
7
|
+
data.tar.gz: 34121a44946d91e89054c6cad50051af5c658e75660e0ba6ac64b77f394337f6d3ac4cbb3a03bb815c3ff6c6ed03b8f9023865fefe186bb1d02e80af68d7f732
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<title>Motor Admin</title>
|
5
|
-
<meta name="viewport" content="width=device-width,initial-scale=1">
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
|
6
6
|
<link rel="stylesheet" media="all" href="<%= Motor::Assets.asset_path('main.css') %>">
|
7
7
|
<%= csrf_meta_tags %>
|
8
8
|
<%= csp_meta_tag %>
|
data/lib/motor.rb
CHANGED
@@ -6,7 +6,6 @@ require 'js_regex'
|
|
6
6
|
require 'fugit'
|
7
7
|
require 'csv'
|
8
8
|
require 'active_record/filter'
|
9
|
-
require 'base64'
|
10
9
|
|
11
10
|
module Motor
|
12
11
|
PATH = Pathname.new(__dir__)
|
@@ -27,6 +26,18 @@ module Motor
|
|
27
26
|
true
|
28
27
|
end
|
29
28
|
|
29
|
+
def server?
|
30
|
+
defined?(::Rails::Server) ||
|
31
|
+
defined?(::Thin::Server) ||
|
32
|
+
defined?(::PhusionPassenger) ||
|
33
|
+
(defined?(::Puma) && File.basename($PROGRAM_NAME) == 'puma') ||
|
34
|
+
defined?(::Unicorn::HttpServer) ||
|
35
|
+
defined?(::Mongrel::HttpServer) ||
|
36
|
+
defined?(::WEBrick::VERSION) ||
|
37
|
+
defined?(JRuby::Rack::VERSION) ||
|
38
|
+
defined?(::Trinidad::Server)
|
39
|
+
end
|
40
|
+
|
30
41
|
def development?
|
31
42
|
ENV['MOTOR_DEVELOPMENT'].present?
|
32
43
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module ActiveRecordUtils
|
4
|
+
end
|
5
|
+
|
3
6
|
require_relative './active_record_utils/types'
|
4
7
|
require_relative './active_record_utils/fetch_methods'
|
5
8
|
require_relative './active_record_utils/defined_scopes_extension'
|
6
9
|
require_relative './active_record_utils/active_storage_links_extension'
|
7
|
-
|
8
|
-
module ActiveRecordUtils
|
9
|
-
end
|
@@ -9,11 +9,15 @@ module Motor
|
|
9
9
|
UNIFIED_TYPES = {
|
10
10
|
'smallint' => 'integer',
|
11
11
|
'int' => 'integer',
|
12
|
+
'int4' => 'integer',
|
12
13
|
'int8' => 'integer',
|
13
14
|
'int16' => 'integer',
|
14
15
|
'bigint' => 'integer',
|
15
16
|
'numeric' => 'float',
|
16
17
|
'decimal' => 'float',
|
18
|
+
'float4' => 'float',
|
19
|
+
'float8' => 'float',
|
20
|
+
'float16' => 'float',
|
17
21
|
'text' => 'string',
|
18
22
|
'citext' => 'string',
|
19
23
|
'jsonb' => 'json',
|
data/lib/motor/admin.rb
CHANGED
data/lib/motor/alerts.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative './alerts/scheduler'
|
4
|
-
require_relative './alerts/scheduled_alerts_cache'
|
5
|
-
require_relative './alerts/persistance'
|
6
|
-
|
7
3
|
module Motor
|
8
4
|
module Alerts
|
9
5
|
end
|
10
6
|
end
|
7
|
+
|
8
|
+
require_relative './alerts/scheduler'
|
9
|
+
require_relative './alerts/scheduled_alerts_cache'
|
10
|
+
require_relative './alerts/persistance'
|
data/lib/motor/api_query.rb
CHANGED
@@ -1,13 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative './api_query/sort'
|
4
|
-
require_relative './api_query/paginate'
|
5
|
-
require_relative './api_query/filter'
|
6
|
-
require_relative './api_query/search'
|
7
|
-
require_relative './api_query/apply_scope'
|
8
|
-
require_relative './api_query/build_meta'
|
9
|
-
require_relative './api_query/build_json'
|
10
|
-
|
11
3
|
module Motor
|
12
4
|
module ApiQuery
|
13
5
|
module_function
|
@@ -22,3 +14,11 @@ module Motor
|
|
22
14
|
end
|
23
15
|
end
|
24
16
|
end
|
17
|
+
|
18
|
+
require_relative './api_query/sort'
|
19
|
+
require_relative './api_query/paginate'
|
20
|
+
require_relative './api_query/filter'
|
21
|
+
require_relative './api_query/search'
|
22
|
+
require_relative './api_query/apply_scope'
|
23
|
+
require_relative './api_query/build_meta'
|
24
|
+
require_relative './api_query/build_json'
|
@@ -49,27 +49,27 @@ module Motor
|
|
49
49
|
|
50
50
|
params[:fields].each do |key, fields|
|
51
51
|
fields = fields.split(',') if fields.is_a?(String)
|
52
|
-
reflection_class = model.reflections[key]&.klass
|
53
|
-
fields_hash = build_fields_hash(reflection_class || model, fields)
|
54
52
|
|
55
53
|
if key == model_name || model_name.split('/').last == key
|
56
|
-
json_params.merge!(
|
54
|
+
json_params.merge!(build_fields_hash(model, fields))
|
57
55
|
else
|
58
56
|
hash = find_key_in_params(json_params, key)
|
59
57
|
|
58
|
+
fields_hash = build_fields_hash(model.reflections[key]&.klass, fields)
|
59
|
+
|
60
60
|
hash.merge!(fields_hash)
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
65
|
def build_fields_hash(model, fields)
|
66
|
-
columns = model.columns.map(&:name)
|
66
|
+
columns = model ? model.columns.map(&:name) : []
|
67
67
|
fields_hash = { 'only' => [], 'methods' => [] }
|
68
68
|
|
69
69
|
fields.each_with_object(fields_hash) do |field, acc|
|
70
70
|
if field.in?(columns)
|
71
71
|
acc['only'] << field
|
72
|
-
elsif model.instance_methods.include?(field.to_sym)
|
72
|
+
elsif model.nil? || model.instance_methods.include?(field.to_sym)
|
73
73
|
acc['methods'] << field
|
74
74
|
end
|
75
75
|
end
|
@@ -29,13 +29,16 @@ module Motor
|
|
29
29
|
|
30
30
|
updated_model[:associations] = merge_by_name(
|
31
31
|
model[:associations],
|
32
|
-
configs[:associations]
|
32
|
+
configs[:associations],
|
33
|
+
{},
|
34
|
+
->(_action) { true }
|
33
35
|
)
|
34
36
|
|
35
37
|
updated_model[:columns] = merge_by_name(
|
36
38
|
model[:columns],
|
37
39
|
configs[:columns],
|
38
|
-
COLUMN_DEFAULTS
|
40
|
+
COLUMN_DEFAULTS,
|
41
|
+
->(scope) { !scope[:virtual] }
|
39
42
|
)
|
40
43
|
|
41
44
|
updated_model[:actions] = merge_by_name(
|
@@ -53,7 +56,8 @@ module Motor
|
|
53
56
|
updated_model[:scopes] = merge_by_name(
|
54
57
|
model[:scopes],
|
55
58
|
configs[:scopes],
|
56
|
-
SCOPE_DEFAULTS
|
59
|
+
SCOPE_DEFAULTS,
|
60
|
+
->(scope) { scope[:scope_type] != 'filter' }
|
57
61
|
)
|
58
62
|
|
59
63
|
updated_model
|
@@ -62,15 +66,17 @@ module Motor
|
|
62
66
|
# @param defaults [Array<HashWithIndifferentAccess>]
|
63
67
|
# @param configs [Array<HashWithIndifferentAccess>]
|
64
68
|
# @return [Array<HashWithIndifferentAccess>]
|
65
|
-
def merge_by_name(defaults, configs, default_attrs = {})
|
69
|
+
def merge_by_name(defaults, configs, default_attrs = {}, default_item_check = nil)
|
66
70
|
return defaults if configs.blank?
|
67
71
|
|
68
72
|
(defaults.pluck(:name) + configs.pluck(:name)).uniq.map do |name|
|
69
|
-
config_item = configs.find { |e| e[:name] == name }
|
70
|
-
default_item = defaults.find { |e| e[:name] == name }
|
73
|
+
config_item = configs.find { |e| e[:name] == name }
|
74
|
+
default_item = defaults.find { |e| e[:name] == name }
|
71
75
|
|
72
|
-
default_item.
|
73
|
-
|
76
|
+
next if default_item.nil? && default_item_check&.call(config_item)
|
77
|
+
|
78
|
+
(default_item || default_attrs).merge(config_item || {})
|
79
|
+
end.compact
|
74
80
|
end
|
75
81
|
|
76
82
|
# @return [HashWithIndifferentAccess<String, HashWithIndifferentAccess>]
|
@@ -24,6 +24,7 @@ module Motor
|
|
24
24
|
|
25
25
|
TAB_DEFAULTS = {
|
26
26
|
visible: true,
|
27
|
+
tab_type: 'default',
|
27
28
|
preferences: {}
|
28
29
|
}.with_indifferent_access
|
29
30
|
|
@@ -123,7 +124,7 @@ module Motor
|
|
123
124
|
# @param new_columns [Array<HashWithIndifferentAccess>]
|
124
125
|
# @return [Array<HashWithIndifferentAccess>]
|
125
126
|
def normalize_columns(default_columns, existing_columns, new_columns)
|
126
|
-
(existing_columns
|
127
|
+
fetch_update_names(existing_columns, new_columns).uniq.map do |name|
|
127
128
|
new_column = safe_fetch_by_name(new_columns, name)
|
128
129
|
|
129
130
|
next if new_column[:_remove]
|
@@ -135,7 +136,11 @@ module Motor
|
|
135
136
|
normalized_column = existing_column.merge(column_attrs)
|
136
137
|
normalized_column = reject_default(default_column, normalized_column)
|
137
138
|
|
138
|
-
|
139
|
+
next if normalized_column.blank?
|
140
|
+
|
141
|
+
normalized_column[:name] ||= name
|
142
|
+
|
143
|
+
normalized_column
|
139
144
|
end.compact.presence
|
140
145
|
end
|
141
146
|
|
@@ -144,7 +149,7 @@ module Motor
|
|
144
149
|
# @param new_actions [Array<HashWithIndifferentAccess>]
|
145
150
|
# @return [Array<HashWithIndifferentAccess>]
|
146
151
|
def normalize_actions(default_actions, existing_actions, new_actions)
|
147
|
-
(existing_actions
|
152
|
+
fetch_update_names(existing_actions, new_actions).map do |name|
|
148
153
|
new_action = safe_fetch_by_name(new_actions, name)
|
149
154
|
|
150
155
|
next if new_action[:_remove]
|
@@ -156,7 +161,11 @@ module Motor
|
|
156
161
|
normalized_action = existing_action.merge(action_attrs)
|
157
162
|
normalized_action = reject_default(default_action.presence || ACTION_DEFAULTS, normalized_action)
|
158
163
|
|
159
|
-
|
164
|
+
next if normalized_action.blank?
|
165
|
+
|
166
|
+
normalized_action[:name] ||= name
|
167
|
+
|
168
|
+
normalized_action
|
160
169
|
end.compact.presence
|
161
170
|
end
|
162
171
|
|
@@ -165,7 +174,7 @@ module Motor
|
|
165
174
|
# @param new_tabs [Array<HashWithIndifferentAccess>]
|
166
175
|
# @return [Array<HashWithIndifferentAccess>]
|
167
176
|
def normalize_tabs(default_tabs, existing_tabs, new_tabs)
|
168
|
-
(existing_tabs
|
177
|
+
fetch_update_names(existing_tabs, new_tabs).uniq.map do |name|
|
169
178
|
new_tab = safe_fetch_by_name(new_tabs, name)
|
170
179
|
|
171
180
|
next if new_tab[:_remove]
|
@@ -177,7 +186,11 @@ module Motor
|
|
177
186
|
normalized_tab = existing_tab.merge(tab_attrs)
|
178
187
|
normalized_tab = reject_default(default_tab.presence || TAB_DEFAULTS, normalized_tab)
|
179
188
|
|
180
|
-
|
189
|
+
next if normalized_tab.blank?
|
190
|
+
|
191
|
+
normalized_tab[:name] ||= name
|
192
|
+
|
193
|
+
normalized_tab
|
181
194
|
end.compact.presence
|
182
195
|
end
|
183
196
|
|
@@ -186,7 +199,7 @@ module Motor
|
|
186
199
|
# @param new_scopes [Array<HashWithIndifferentAccess>]
|
187
200
|
# @return [Array<HashWithIndifferentAccess>]
|
188
201
|
def normalize_scopes(default_scopes, existing_scopes, new_scopes)
|
189
|
-
(existing_scopes
|
202
|
+
fetch_update_names(existing_scopes, new_scopes).uniq.map do |name|
|
190
203
|
new_scope = safe_fetch_by_name(new_scopes, name)
|
191
204
|
|
192
205
|
next if new_scope[:_remove]
|
@@ -198,7 +211,11 @@ module Motor
|
|
198
211
|
normalized_scope = existing_scope.merge(scope_attrs)
|
199
212
|
normalized_scope = reject_default(default_scope.presence || SCOPE_DEFAULTS, normalized_scope)
|
200
213
|
|
201
|
-
|
214
|
+
next if normalized_scope.blank?
|
215
|
+
|
216
|
+
normalized_scope[:name] ||= name
|
217
|
+
|
218
|
+
normalized_scope
|
202
219
|
end.compact.presence
|
203
220
|
end
|
204
221
|
|
@@ -220,8 +237,14 @@ module Motor
|
|
220
237
|
end.compact.presence
|
221
238
|
end
|
222
239
|
|
240
|
+
def fetch_update_names(existing_items, new_items)
|
241
|
+
new_names = new_items.map { |e| e[:_update] || e[:name] }
|
242
|
+
|
243
|
+
(existing_items.pluck(:name) + new_names).uniq
|
244
|
+
end
|
245
|
+
|
223
246
|
def safe_fetch_by_name(list, name)
|
224
|
-
list.find { |e| e[:name] == name } || {}
|
247
|
+
list.find { |e| e[:_update] == name || e[:name] == name } || {}
|
225
248
|
end
|
226
249
|
|
227
250
|
# @param resource_name [String]
|
data/lib/motor/dashboards.rb
CHANGED
data/lib/motor/forms.rb
CHANGED
data/lib/motor/queries.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative './queries/run_query'
|
4
|
-
require_relative './queries/persistance'
|
5
|
-
require_relative './queries/postgresql_exec_query'
|
6
|
-
|
7
3
|
module Motor
|
8
4
|
module Queries
|
9
5
|
end
|
10
6
|
end
|
7
|
+
|
8
|
+
require_relative './queries/run_query'
|
9
|
+
require_relative './queries/persistance'
|
10
|
+
require_relative './queries/postgresql_exec_query'
|
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-25b3270c536d4f5d15b5.css.gz": "main-25b3270c536d4f5d15b5.css.gz",
|
9
|
+
"main-25b3270c536d4f5d15b5.js.LICENSE.txt": "main-25b3270c536d4f5d15b5.js.LICENSE.txt",
|
10
|
+
"main-25b3270c536d4f5d15b5.js.gz": "main-25b3270c536d4f5d15b5.js.gz",
|
11
|
+
"main.css": "main-25b3270c536d4f5d15b5.css",
|
12
|
+
"main.js": "main-25b3270c536d4f5d15b5.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.22
|
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-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord-filter
|
@@ -213,8 +213,8 @@ files:
|
|
213
213
|
- lib/motor/ui_configs.rb
|
214
214
|
- lib/motor/version.rb
|
215
215
|
- ui/dist/fonts/ionicons.woff2
|
216
|
-
- ui/dist/main-
|
217
|
-
- ui/dist/main-
|
216
|
+
- ui/dist/main-25b3270c536d4f5d15b5.css.gz
|
217
|
+
- ui/dist/main-25b3270c536d4f5d15b5.js.gz
|
218
218
|
- ui/dist/manifest.json
|
219
219
|
homepage:
|
220
220
|
licenses:
|
Binary file
|
Binary file
|