motor-admin 0.1.43 → 0.1.44

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: d06115fe373a464d0e64a5f15b6c895d549e7cef2068e9a9e9d9712cc003046d
4
- data.tar.gz: d01b6707a80c0d30b8c43c40d9c86a7ee98475cf02ee6b8a296aac3ae25a9d27
3
+ metadata.gz: 74c91b2c5dbc0b48fa75a4fa9f5ec2eb8a3848b2e65cf819b9ddc3317e379a19
4
+ data.tar.gz: bee5733d821cde96004674d36c9be0467e32044d921a4b52e863b4be4e3de55b
5
5
  SHA512:
6
- metadata.gz: 4a9b94292f85849ececb737e5d8a962a7b18989d218c72db520eb6e771b9b703083be6c54bf1894f31e1d894af3fca02065653e97497966c3b1dadbfafb098ac
7
- data.tar.gz: c18e73dfd82fa82bf182cc445c22565a73a29006309ccd0ecb1ab92d1f610fe797ee9d4ff6cb84382e039d146ca99d16648a84717f169168e3dc834571c67b7d
6
+ metadata.gz: 9bb22f83f9c270696f2d32cc384b98d90a5dab99f7f377258682dbc3622bd574ea0c6bf43de5cd955bb551dd56d6d43b4e618a53803a7d91417a7ec88ae9571f
7
+ data.tar.gz: 6e1f295abe63ca50e7176789523747810384307c03bcf5c4c719cc41a85296573fb0f6c3e193f06e625ed5801c204a519675539719d966357398293fe3a10977
@@ -26,7 +26,7 @@ module Motor
26
26
  end
27
27
 
28
28
  def file_params
29
- params.require(:data).require(:file).permit(:io, :filename).to_h
29
+ params.require(:data).require(:file).permit(:io, :filename).to_h.symbolize_keys
30
30
  end
31
31
 
32
32
  def attachment_params
data/config/routes.rb CHANGED
@@ -47,5 +47,3 @@ Motor::Admin.routes.draw do
47
47
  end
48
48
  end
49
49
  end
50
-
51
- ActiveSupport::Notifications.instrument('motor.routes.loaded')
@@ -7,3 +7,4 @@ require_relative './active_record_utils/types'
7
7
  require_relative './active_record_utils/fetch_methods'
8
8
  require_relative './active_record_utils/defined_scopes_extension'
9
9
  require_relative './active_record_utils/active_storage_links_extension'
10
+ require_relative './active_record_utils/active_storage_blob_patch'
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Motor
4
+ module ActiveRecordUtils
5
+ module ActiveStorageBlobPatch
6
+ KEYWORD_ARGS = %i[io filename content_type metadata identify].freeze
7
+
8
+ def build_after_upload(hash)
9
+ super(**hash.with_indifferent_access.slice(*KEYWORD_ARGS).symbolize_keys)
10
+ end
11
+
12
+ def build_after_unfurling(hash)
13
+ super(**hash.with_indifferent_access.slice(*KEYWORD_ARGS).symbolize_keys)
14
+ end
15
+
16
+ def create_after_unfurling!(hash)
17
+ super(**hash.with_indifferent_access.slice(*KEYWORD_ARGS).symbolize_keys)
18
+ end
19
+
20
+ def create_and_upload!(hash)
21
+ super(**hash.with_indifferent_access.slice(*KEYWORD_ARGS).symbolize_keys)
22
+ end
23
+ end
24
+ end
25
+ end
data/lib/motor/admin.rb CHANGED
@@ -3,9 +3,11 @@
3
3
  module Motor
4
4
  class Admin < ::Rails::Engine
5
5
  initializer 'motor.startup_message' do
6
- ActiveSupport::Notifications.subscribe('motor.routes.loaded') do
6
+ config.after_initialize do
7
7
  next unless Motor.server?
8
8
 
9
+ Rails.application.reload_routes!
10
+
9
11
  if Rails.application.routes.url_helpers.respond_to?(:motor_admin_path)
10
12
  url =
11
13
  begin
@@ -67,6 +69,10 @@ module Motor
67
69
  ActiveSupport.on_load(:active_storage_attachment) do
68
70
  ActiveStorage::Attachment.include(Motor::ActiveRecordUtils::ActiveStorageLinksExtension)
69
71
  end
72
+
73
+ ActiveSupport.on_load(:active_storage_blob) do
74
+ ActiveStorage::Blob.singleton_class.prepend(Motor::ActiveRecordUtils::ActiveStorageBlobPatch)
75
+ end
70
76
  end
71
77
  end
72
78
  end
@@ -68,6 +68,7 @@ module Motor
68
68
  end
69
69
 
70
70
  require_relative './build_schema/active_storage_attachment_schema'
71
+ require_relative './build_schema/adjust_devise_model_schema'
71
72
  require_relative './build_schema/load_from_rails'
72
73
  require_relative './build_schema/find_display_column'
73
74
  require_relative './build_schema/persist_resource_configs'
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Motor
4
+ module BuildSchema
5
+ module AdjustDeviseModelSchema
6
+ HIDDEN_COLUMNS = %w[
7
+ encrypted_password
8
+ reset_password_token
9
+ confirmation_token
10
+ ].freeze
11
+
12
+ READ_ONLY_COLUMNS = %w[
13
+ reset_password_sent_at
14
+ remember_created_at
15
+ sign_in_count
16
+ current_sign_in_at
17
+ last_sign_in_at
18
+ current_sign_in_ip
19
+ last_sign_in_ip
20
+ confirmed_at
21
+ confirmation_sent_at
22
+ ].freeze
23
+
24
+ module_function
25
+
26
+ def call(schema, devise_modules)
27
+ modify_column_access_types!(schema[:columns])
28
+ add_password_column!(schema[:columns]) if devise_modules.include?(:database_authenticatable)
29
+
30
+ schema
31
+ end
32
+
33
+ def modify_column_access_types!(columns)
34
+ columns.each do |column|
35
+ column[:access_type] =
36
+ case column[:name]
37
+ when *HIDDEN_COLUMNS
38
+ ColumnAccessTypes::HIDDEN
39
+ when *READ_ONLY_COLUMNS
40
+ ColumnAccessTypes::READ_ONLY
41
+ else
42
+ column[:access_type]
43
+ end
44
+ end
45
+ end
46
+
47
+ def add_password_column!(columns)
48
+ columns << {
49
+ name: 'password',
50
+ display_name: 'Password',
51
+ column_type: 'string',
52
+ access_type: 'write_only',
53
+ default_value: nil,
54
+ validators: [],
55
+ virtual: true
56
+ }
57
+ end
58
+ end
59
+ end
60
+ end
@@ -10,7 +10,15 @@ module Motor
10
10
 
11
11
  def call
12
12
  models.map do |model|
13
- build_model_schema(model)
13
+ Object.const_get(model.name)
14
+
15
+ schema = build_model_schema(model)
16
+
17
+ if model.respond_to?(:devise_modules)
18
+ Motor::BuildSchema::AdjustDeviseModelSchema.call(schema, model.devise_modules)
19
+ end
20
+
21
+ schema
14
22
  rescue StandardError, NotImplementedError => e
15
23
  Rails.logger.error(e) if model.name != 'Audited::Audit'
16
24
 
@@ -108,13 +116,15 @@ module Motor
108
116
  model.reflections.map do |name, ref|
109
117
  next if !ref.has_one? && !ref.belongs_to?
110
118
 
111
- begin
112
- ref.klass
113
- rescue StandardError
114
- next
115
- end
119
+ unless ref.polymorphic?
120
+ begin
121
+ next if ref.klass.name == 'ActiveStorage::Blob'
122
+ rescue StandardError => e
123
+ Rails.logger.error(e)
116
124
 
117
- next if ref.klass.name == 'ActiveStorage::Blob'
125
+ next
126
+ end
127
+ end
118
128
 
119
129
  build_reflection_column(name, model, ref, default_attrs)
120
130
  end.compact
@@ -122,7 +132,7 @@ module Motor
122
132
 
123
133
  def build_reflection_column(name, model, ref, default_attrs)
124
134
  column_name = ref.belongs_to? ? ref.foreign_key.to_s : name
125
- is_attachment = ref.klass.name == 'ActiveStorage::Attachment'
135
+ is_attachment = !ref.polymorphic? && ref.klass.name == 'ActiveStorage::Attachment'
126
136
  access_type = ref.belongs_to? || is_attachment ? ColumnAccessTypes::READ_WRITE : ColumnAccessTypes::READ_ONLY
127
137
 
128
138
  {
@@ -139,27 +149,20 @@ module Motor
139
149
  end
140
150
 
141
151
  def build_reference(name, reflection)
142
- is_attachment = reflection.klass.name == 'ActiveStorage::Attachment'
143
-
144
152
  {
145
153
  name: name,
146
154
  display_name: name.humanize,
147
- model_name: reflection.klass.name.underscore,
155
+ model_name: reflection.polymorphic? ? nil : reflection.klass.name.underscore,
148
156
  reference_type: reflection.belongs_to? ? 'belongs_to' : 'has_one',
149
157
  foreign_key: reflection.foreign_key,
150
- polymorphic: reflection.polymorphic? || is_attachment
158
+ polymorphic: reflection.polymorphic?
151
159
  }
152
160
  end
153
161
 
154
162
  def fetch_associations(model)
155
163
  model.reflections.map do |name, ref|
156
164
  next if ref.has_one? || ref.belongs_to?
157
-
158
- begin
159
- ref.klass
160
- rescue StandardError
161
- next
162
- end
165
+ next unless valid_reflection?(ref)
163
166
 
164
167
  model_class = ref.klass
165
168
 
@@ -171,7 +174,7 @@ module Motor
171
174
  slug: name.underscore,
172
175
  model_name: model_class.name.underscore,
173
176
  foreign_key: ref.foreign_key,
174
- polymorphic: ref.polymorphic? || model_class.name == 'ActiveStorage::Attachment',
177
+ polymorphic: ref.options[:as].present?,
175
178
  visible: true
176
179
  }
177
180
  end.compact
@@ -211,6 +214,17 @@ module Motor
211
214
  end
212
215
  end
213
216
 
217
+ def valid_reflection?(reflection)
218
+ reflection.klass
219
+ reflection.foreign_key
220
+
221
+ true
222
+ rescue StandardError => e
223
+ Rails.logger.error(e)
224
+
225
+ false
226
+ end
227
+
214
228
  def eager_load_models!
215
229
  MUTEX.synchronize do
216
230
  if Rails::VERSION::MAJOR > 5 && defined?(Zeitwerk::Loader)
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.43'
4
+ VERSION = '0.1.44'
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-c3893a249308242d20f5.css.gz": "main-c3893a249308242d20f5.css.gz",
9
- "main-c3893a249308242d20f5.js.LICENSE.txt": "main-c3893a249308242d20f5.js.LICENSE.txt",
10
- "main-c3893a249308242d20f5.js.gz": "main-c3893a249308242d20f5.js.gz",
11
- "main.css": "main-c3893a249308242d20f5.css",
12
- "main.js": "main-c3893a249308242d20f5.js"
8
+ "main-e763d59007bb725ea622.css.gz": "main-e763d59007bb725ea622.css.gz",
9
+ "main-e763d59007bb725ea622.js.LICENSE.txt": "main-e763d59007bb725ea622.js.LICENSE.txt",
10
+ "main-e763d59007bb725ea622.js.gz": "main-e763d59007bb725ea622.js.gz",
11
+ "main.css": "main-e763d59007bb725ea622.css",
12
+ "main.js": "main-e763d59007bb725ea622.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.43
4
+ version: 0.1.44
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-05-18 00:00:00.000000000 Z
11
+ date: 2021-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord-filter
@@ -191,6 +191,7 @@ files:
191
191
  - lib/motor-admin.rb
192
192
  - lib/motor.rb
193
193
  - lib/motor/active_record_utils.rb
194
+ - lib/motor/active_record_utils/active_storage_blob_patch.rb
194
195
  - lib/motor/active_record_utils/active_storage_links_extension.rb
195
196
  - lib/motor/active_record_utils/defined_scopes_extension.rb
196
197
  - lib/motor/active_record_utils/fetch_methods.rb
@@ -211,6 +212,7 @@ files:
211
212
  - lib/motor/assets.rb
212
213
  - lib/motor/build_schema.rb
213
214
  - lib/motor/build_schema/active_storage_attachment_schema.rb
215
+ - lib/motor/build_schema/adjust_devise_model_schema.rb
214
216
  - lib/motor/build_schema/find_display_column.rb
215
217
  - lib/motor/build_schema/load_from_rails.rb
216
218
  - lib/motor/build_schema/merge_schema_configs.rb
@@ -242,8 +244,8 @@ files:
242
244
  - lib/motor/tasks/motor.rake
243
245
  - lib/motor/version.rb
244
246
  - ui/dist/fonts/ionicons.woff2
245
- - ui/dist/main-c3893a249308242d20f5.css.gz
246
- - ui/dist/main-c3893a249308242d20f5.js.gz
247
+ - ui/dist/main-e763d59007bb725ea622.css.gz
248
+ - ui/dist/main-e763d59007bb725ea622.js.gz
247
249
  - ui/dist/manifest.json
248
250
  homepage:
249
251
  licenses: