motor-admin 0.1.17 → 0.1.23
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 +6 -1
- 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/build_schema/load_from_rails.rb +2 -0
- data/lib/motor/build_schema/merge_schema_configs.rb +14 -8
- data/lib/motor/build_schema/persist_resource_configs.rb +34 -10
- 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-a32a143c00ba97ad5bf9.css.gz +0 -0
- data/ui/dist/main-a32a143c00ba97ad5bf9.js.gz +0 -0
- data/ui/dist/manifest.json +5 -5
- metadata +4 -4
- data/ui/dist/main-c1f7e0cffddc2e2ac639.css.gz +0 -0
- data/ui/dist/main-c1f7e0cffddc2e2ac639.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: ccffdfd1c91afe7ad8001f3e25a42362a7a115393f21a3cb3a525cc529837fae
|
4
|
+
data.tar.gz: 62de61940b13775579b6c625e1ac78b163ba515417dba49e3d065d9118d33a67
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a5e7082907efa6ab87b89ee7dbc27b313813b5b04a1ec78c8eaab0839419df53a0664243d84600aab3654320bf5be2a19cc3c0bf7032440ef50d010b8c094df6
|
7
|
+
data.tar.gz: 52d7122dafc07fa90a77cd0917d24bdddc8611e372208828be52d157e42fc31551e8bb570944ff8d2edae3f1778e65a0fa8a5cbf473588c964b0b89366e150bb
|
@@ -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,15 +9,20 @@ 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',
|
20
|
-
'timestamp' => 'datetime'
|
24
|
+
'timestamp' => 'datetime',
|
25
|
+
'money' => 'currency'
|
21
26
|
}.freeze
|
22
27
|
|
23
28
|
module_function
|
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'
|
@@ -90,6 +90,7 @@ module Motor
|
|
90
90
|
default_value: default_attrs[column.name],
|
91
91
|
validators: fetch_validators(model, column.name),
|
92
92
|
reference: nil,
|
93
|
+
format: {},
|
93
94
|
virtual: false
|
94
95
|
}
|
95
96
|
end.compact
|
@@ -122,6 +123,7 @@ module Motor
|
|
122
123
|
access_type: ref.belongs_to? || is_attachment ? ColumnAccessTypes::READ_WRITE : ColumnAccessTypes::READ_ONLY,
|
123
124
|
default_value: default_attrs[column_name],
|
124
125
|
validators: fetch_validators(model, column_name),
|
126
|
+
format: {},
|
125
127
|
reference: {
|
126
128
|
name: name,
|
127
129
|
model_name: ref.klass.name.underscore,
|
@@ -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
|
+
->(_) { 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>]
|
@@ -4,7 +4,7 @@ module Motor
|
|
4
4
|
module BuildSchema
|
5
5
|
module PersistResourceConfigs
|
6
6
|
RESOURCE_ATTRS = %w[display_name visible].freeze
|
7
|
-
COLUMN_ATTRS = %w[name display_name column_type access_type default_value virtual].freeze
|
7
|
+
COLUMN_ATTRS = %w[name display_name column_type access_type default_value virtual format].freeze
|
8
8
|
ASSOCIATION_ATTRS = %w[name display_name visible].freeze
|
9
9
|
SCOPE_ATTRS = %w[name display_name scope_type preferences visible].freeze
|
10
10
|
ACTION_ATTRS = %w[name display_name action_type preferences visible].freeze
|
@@ -14,6 +14,7 @@ module Motor
|
|
14
14
|
access_type: 'read_write',
|
15
15
|
default_value: nil,
|
16
16
|
reference: nil,
|
17
|
+
format: {},
|
17
18
|
validators: []
|
18
19
|
}.with_indifferent_access
|
19
20
|
|
@@ -24,6 +25,7 @@ module Motor
|
|
24
25
|
|
25
26
|
TAB_DEFAULTS = {
|
26
27
|
visible: true,
|
28
|
+
tab_type: 'default',
|
27
29
|
preferences: {}
|
28
30
|
}.with_indifferent_access
|
29
31
|
|
@@ -123,7 +125,7 @@ module Motor
|
|
123
125
|
# @param new_columns [Array<HashWithIndifferentAccess>]
|
124
126
|
# @return [Array<HashWithIndifferentAccess>]
|
125
127
|
def normalize_columns(default_columns, existing_columns, new_columns)
|
126
|
-
(existing_columns
|
128
|
+
fetch_update_names(existing_columns, new_columns).uniq.map do |name|
|
127
129
|
new_column = safe_fetch_by_name(new_columns, name)
|
128
130
|
|
129
131
|
next if new_column[:_remove]
|
@@ -135,7 +137,11 @@ module Motor
|
|
135
137
|
normalized_column = existing_column.merge(column_attrs)
|
136
138
|
normalized_column = reject_default(default_column, normalized_column)
|
137
139
|
|
138
|
-
|
140
|
+
next if normalized_column.blank?
|
141
|
+
|
142
|
+
normalized_column[:name] ||= name
|
143
|
+
|
144
|
+
normalized_column
|
139
145
|
end.compact.presence
|
140
146
|
end
|
141
147
|
|
@@ -144,7 +150,7 @@ module Motor
|
|
144
150
|
# @param new_actions [Array<HashWithIndifferentAccess>]
|
145
151
|
# @return [Array<HashWithIndifferentAccess>]
|
146
152
|
def normalize_actions(default_actions, existing_actions, new_actions)
|
147
|
-
(existing_actions
|
153
|
+
fetch_update_names(existing_actions, new_actions).map do |name|
|
148
154
|
new_action = safe_fetch_by_name(new_actions, name)
|
149
155
|
|
150
156
|
next if new_action[:_remove]
|
@@ -156,7 +162,11 @@ module Motor
|
|
156
162
|
normalized_action = existing_action.merge(action_attrs)
|
157
163
|
normalized_action = reject_default(default_action.presence || ACTION_DEFAULTS, normalized_action)
|
158
164
|
|
159
|
-
|
165
|
+
next if normalized_action.blank?
|
166
|
+
|
167
|
+
normalized_action[:name] ||= name
|
168
|
+
|
169
|
+
normalized_action
|
160
170
|
end.compact.presence
|
161
171
|
end
|
162
172
|
|
@@ -165,7 +175,7 @@ module Motor
|
|
165
175
|
# @param new_tabs [Array<HashWithIndifferentAccess>]
|
166
176
|
# @return [Array<HashWithIndifferentAccess>]
|
167
177
|
def normalize_tabs(default_tabs, existing_tabs, new_tabs)
|
168
|
-
(existing_tabs
|
178
|
+
fetch_update_names(existing_tabs, new_tabs).uniq.map do |name|
|
169
179
|
new_tab = safe_fetch_by_name(new_tabs, name)
|
170
180
|
|
171
181
|
next if new_tab[:_remove]
|
@@ -177,7 +187,11 @@ module Motor
|
|
177
187
|
normalized_tab = existing_tab.merge(tab_attrs)
|
178
188
|
normalized_tab = reject_default(default_tab.presence || TAB_DEFAULTS, normalized_tab)
|
179
189
|
|
180
|
-
|
190
|
+
next if normalized_tab.blank?
|
191
|
+
|
192
|
+
normalized_tab[:name] ||= name
|
193
|
+
|
194
|
+
normalized_tab
|
181
195
|
end.compact.presence
|
182
196
|
end
|
183
197
|
|
@@ -186,7 +200,7 @@ module Motor
|
|
186
200
|
# @param new_scopes [Array<HashWithIndifferentAccess>]
|
187
201
|
# @return [Array<HashWithIndifferentAccess>]
|
188
202
|
def normalize_scopes(default_scopes, existing_scopes, new_scopes)
|
189
|
-
(existing_scopes
|
203
|
+
fetch_update_names(existing_scopes, new_scopes).uniq.map do |name|
|
190
204
|
new_scope = safe_fetch_by_name(new_scopes, name)
|
191
205
|
|
192
206
|
next if new_scope[:_remove]
|
@@ -198,7 +212,11 @@ module Motor
|
|
198
212
|
normalized_scope = existing_scope.merge(scope_attrs)
|
199
213
|
normalized_scope = reject_default(default_scope.presence || SCOPE_DEFAULTS, normalized_scope)
|
200
214
|
|
201
|
-
|
215
|
+
next if normalized_scope.blank?
|
216
|
+
|
217
|
+
normalized_scope[:name] ||= name
|
218
|
+
|
219
|
+
normalized_scope
|
202
220
|
end.compact.presence
|
203
221
|
end
|
204
222
|
|
@@ -220,8 +238,14 @@ module Motor
|
|
220
238
|
end.compact.presence
|
221
239
|
end
|
222
240
|
|
241
|
+
def fetch_update_names(existing_items, new_items)
|
242
|
+
new_names = new_items.map { |e| e[:_update] || e[:name] }
|
243
|
+
|
244
|
+
(existing_items.pluck(:name) + new_names).uniq
|
245
|
+
end
|
246
|
+
|
223
247
|
def safe_fetch_by_name(list, name)
|
224
|
-
list.find { |e| e[:name] == name } || {}
|
248
|
+
list.find { |e| e[:_update] == name || e[:name] == name } || {}
|
225
249
|
end
|
226
250
|
|
227
251
|
# @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-a32a143c00ba97ad5bf9.css.gz": "main-a32a143c00ba97ad5bf9.css.gz",
|
9
|
+
"main-a32a143c00ba97ad5bf9.js.LICENSE.txt": "main-a32a143c00ba97ad5bf9.js.LICENSE.txt",
|
10
|
+
"main-a32a143c00ba97ad5bf9.js.gz": "main-a32a143c00ba97ad5bf9.js.gz",
|
11
|
+
"main.css": "main-a32a143c00ba97ad5bf9.css",
|
12
|
+
"main.js": "main-a32a143c00ba97ad5bf9.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.23
|
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-
|
11
|
+
date: 2021-05-05 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-a32a143c00ba97ad5bf9.css.gz
|
217
|
+
- ui/dist/main-a32a143c00ba97ad5bf9.js.gz
|
218
218
|
- ui/dist/manifest.json
|
219
219
|
homepage:
|
220
220
|
licenses:
|
Binary file
|
Binary file
|