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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f394e032aa3ede14570c098e604143b439bd73c52b1c6fa2cfa800d413efcce
4
- data.tar.gz: edd3909478589fc8cba218c1286fe00e18732b085435a7e02bfdf824c1f363ff
3
+ metadata.gz: ccffdfd1c91afe7ad8001f3e25a42362a7a115393f21a3cb3a525cc529837fae
4
+ data.tar.gz: 62de61940b13775579b6c625e1ac78b163ba515417dba49e3d065d9118d33a67
5
5
  SHA512:
6
- metadata.gz: aed05763bda0b00ceb45839f224720ed0c199d09590d439843557967c26eb4b3fed2a38cea39f81d2d8b39c8f90cca8a7df04e07475002b6dc7130dcc7513292
7
- data.tar.gz: b744249ec9ef523f8c8563d3d98f782e4667ac90e00dc2b82ef9d59fe873838125f5298a7dcbc15c9901c57d9e74611199631e906a33dddaea490229ce058ff1
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
@@ -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'
@@ -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 } || 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>]
@@ -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.pluck(:name) + new_columns.pluck(:name)).uniq.map do |name|
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
- normalized_column.merge(name: name) if normalized_column.present?
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.pluck(:name) + new_actions.pluck(:name)).uniq.map do |name|
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
- normalized_action.merge(name: name) if normalized_action.present?
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.pluck(:name) + new_tabs.pluck(:name)).uniq.map do |name|
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
- normalized_tab.merge(name: name) if normalized_tab.present?
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.pluck(:name) + new_scopes.pluck(:name)).uniq.map do |name|
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
- normalized_scope.merge(name: name) if normalized_scope.present?
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]
@@ -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.17'
4
+ VERSION = '0.1.23'
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-c1f7e0cffddc2e2ac639.css.gz": "main-c1f7e0cffddc2e2ac639.css.gz",
9
- "main-c1f7e0cffddc2e2ac639.js.LICENSE.txt": "main-c1f7e0cffddc2e2ac639.js.LICENSE.txt",
10
- "main-c1f7e0cffddc2e2ac639.js.gz": "main-c1f7e0cffddc2e2ac639.js.gz",
11
- "main.css": "main-c1f7e0cffddc2e2ac639.css",
12
- "main.js": "main-c1f7e0cffddc2e2ac639.js"
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.17
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-04-30 00:00:00.000000000 Z
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-c1f7e0cffddc2e2ac639.css.gz
217
- - ui/dist/main-c1f7e0cffddc2e2ac639.js.gz
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: