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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4844a300bd3061e7c289d0c0e36f095922b32eafbb62c61d3e5f763dfe9508da
4
- data.tar.gz: 95d56c11d15471a11c877ba319836c563d858f8c768b9c82a82fbb3d75f22b68
3
+ metadata.gz: a18eff1eb9149993c711610be8362de1818ae5abf9759cf06118d92cffb00c7b
4
+ data.tar.gz: 7cded1f7b12bcc38c10d0abe7df42bf66a412720cd884190d604ba70698d5fdd
5
5
  SHA512:
6
- metadata.gz: ed58d6ab04a5fe3749ab22aaa281e4d4bc618ac652612bb005653a319da55d5ca6f0f4be6f36d445295033e57f6d8296a01750659cd830f0c8f4d95b5d0360cc
7
- data.tar.gz: 5d13f12bce2d5547c3b429ff822c93ed053018a24f5c958da1dd931b08c9adec775c540765ed8e95593cfc9d8983578e8c3ca4943e8d6f48725767c0fb26cca5
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
@@ -8,7 +8,7 @@ module Motor
8
8
 
9
9
  initializer 'motor.alerts.scheduler' do
10
10
  config.after_initialize do |_app|
11
- next unless defined?(Rails::Server)
11
+ next unless Motor.server?
12
12
 
13
13
  Motor::Alerts::Scheduler::SCHEDULER_TASK.execute
14
14
  end
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'
@@ -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!(fields_hash)
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 } || default_attrs
73
+ config_item = configs.find { |e| e[:name] == name }
74
+ default_item = defaults.find { |e| e[:name] == name }
71
75
 
72
- default_item.merge(config_item)
73
- end
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.pluck(:name) + new_columns.pluck(:name)).uniq.map do |name|
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
- normalized_column.merge(name: name) if normalized_column.present?
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.pluck(:name) + new_actions.pluck(:name)).uniq.map do |name|
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
- normalized_action.merge(name: name) if normalized_action.present?
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.pluck(:name) + new_tabs.pluck(:name)).uniq.map do |name|
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
- normalized_tab.merge(name: name) if normalized_tab.present?
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.pluck(:name) + new_scopes.pluck(:name)).uniq.map do |name|
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
- normalized_scope.merge(name: name) if normalized_scope.present?
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]
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './dashboards/persistance'
4
-
5
3
  module Motor
6
4
  module Dashboards
7
5
  end
8
6
  end
7
+
8
+ require_relative './dashboards/persistance'
data/lib/motor/forms.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './forms/persistance'
4
-
5
3
  module Motor
6
4
  module Forms
7
5
  end
8
6
  end
7
+
8
+ require_relative './forms/persistance'
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Motor
4
- VERSION = '0.1.16'
4
+ VERSION = '0.1.22'
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-729641083f64367ce9aa.css.gz": "main-729641083f64367ce9aa.css.gz",
9
- "main-729641083f64367ce9aa.js.LICENSE.txt": "main-729641083f64367ce9aa.js.LICENSE.txt",
10
- "main-729641083f64367ce9aa.js.gz": "main-729641083f64367ce9aa.js.gz",
11
- "main.css": "main-729641083f64367ce9aa.css",
12
- "main.js": "main-729641083f64367ce9aa.js"
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.16
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-30 00:00:00.000000000 Z
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-729641083f64367ce9aa.css.gz
217
- - ui/dist/main-729641083f64367ce9aa.js.gz
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: