motor-admin 0.1.27 → 0.1.28

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: 696c86b5eeeb132c8216b7662999f671926e0fc9149d74ccb66feb2d120e5e4a
4
- data.tar.gz: 00550110edef326dc5d063577bf29a936e4890031f02f9412fb03b431c310476
3
+ metadata.gz: 5799ce999fa943638fa7c4d655400c1418ee80977bf47f64a71e6d5c496d02de
4
+ data.tar.gz: da99ec7b1c48708d983b663a7f9cb79b6d0e270b2fc9f5538a8121cfabdbc209
5
5
  SHA512:
6
- metadata.gz: c91831b3bca03a0f490fee511dbdb70e0635f7e639778b24df48fc248858ead0de39c0744659f388cfcacaa960f01e4d5622b32bab6d1ca1528819aa2da721d1
7
- data.tar.gz: 010d5465953944c84189ac3c0a458df1ade18175bf2999faf4259e002fb37d7a49ec6428da755c6bac4de5efaa41193c955d0ca7f72c1bc0dc6c35a61210bd65
6
+ metadata.gz: c5fc31a79b01ad0e716700a7c3daed980b293d13081294d1013918cce6f4d24cf4c104e0c44144cde225fd3b1ce07253f9b3ddaf44f1eca2252a01ff9124c52e
7
+ data.tar.gz: efca3a6d85ce6e33c83a63f3cd5addbd75b2baf099bd96c5efbac40445520a7725d68a5c3d0564792f06bdf12fed8958b13a6189047303d3c77f7f0af0ff0bd4
@@ -7,7 +7,7 @@ module Motor
7
7
  load_and_authorize_resource :attachment, class: 'ActiveStorage::Attachment', parent: false
8
8
 
9
9
  def create
10
- if @attachment.record.respond_to?("#{@attachment.name}_attachment=") || @attachment.record.respond_to?("#{@attachment.name}_attachments=")
10
+ if attachable?(@attachment.record)
11
11
  @attachment.record.public_send(@attachment.name).attach(
12
12
  io: StringIO.new(params.dig(:data, :file, :io).to_s.encode('ISO-8859-1')),
13
13
  filename: params.dig(:data, :file, :filename)
@@ -21,6 +21,11 @@ module Motor
21
21
 
22
22
  private
23
23
 
24
+ def attachable?(record)
25
+ record.respond_to?("#{@attachment.name}_attachment=") ||
26
+ record.respond_to?("#{@attachment.name}_attachments=")
27
+ end
28
+
24
29
  def attachment_params
25
30
  params.require(:data).except(:file).permit!
26
31
  end
@@ -21,8 +21,7 @@ module Motor
21
21
  'text' => 'string',
22
22
  'citext' => 'string',
23
23
  'jsonb' => 'json',
24
- 'timestamp' => 'datetime',
25
- 'money' => 'currency'
24
+ 'timestamp' => 'datetime'
26
25
  }.freeze
27
26
 
28
27
  module_function
@@ -29,9 +29,11 @@ module Motor
29
29
  hash = {}
30
30
 
31
31
  path.split('.').reduce(hash) do |acc, part|
32
- acc[part] = {}
32
+ acc_hash = {}
33
33
 
34
- acc[part]
34
+ acc[part] = acc_hash
35
+
36
+ acc_hash
35
37
  end
36
38
 
37
39
  accumulator.deep_merge(hash)
@@ -45,20 +47,25 @@ module Motor
45
47
  return if params[:fields].blank?
46
48
 
47
49
  model = rel.is_a?(ActiveRecord::Relation) ? rel.klass : rel.class
48
- model_name = model.name.underscore
49
50
 
50
51
  params[:fields].each do |key, fields|
51
52
  fields = fields.split(',') if fields.is_a?(String)
52
53
 
53
- if key == model_name || model_name.split('/').last == key
54
- json_params.merge!(build_fields_hash(model, fields))
55
- else
56
- hash = find_key_in_params(json_params, key)
54
+ merge_fields_params!(key, fields, json_params, model)
55
+ end
56
+ end
57
57
 
58
- fields_hash = build_fields_hash(model.reflections[key]&.klass, fields)
58
+ def merge_fields_params!(key, fields, json_params, model)
59
+ model_name = model.name.underscore
59
60
 
60
- hash.merge!(fields_hash)
61
- end
61
+ if key == model_name || model_name.split('/').last == key
62
+ json_params.merge!(build_fields_hash(model, fields))
63
+ else
64
+ hash = find_key_in_params(json_params, key)
65
+
66
+ fields_hash = build_fields_hash(model.reflections[key]&.klass, fields)
67
+
68
+ hash.merge!(fields_hash)
62
69
  end
63
70
  end
64
71
 
@@ -22,7 +22,11 @@ module Motor
22
22
  *path, _ = key.split('.')
23
23
 
24
24
  path.reduce(result) do |acc, fragment|
25
- acc[fragment] = {}
25
+ hash = {}
26
+
27
+ acc[fragment] = hash
28
+
29
+ hash
26
30
  end
27
31
  end
28
32
  end
@@ -3,6 +3,8 @@
3
3
  module Motor
4
4
  module BuildSchema
5
5
  module LoadFromRails
6
+ MUTEX = Mutex.new
7
+
6
8
  module_function
7
9
 
8
10
  def call
@@ -82,22 +84,26 @@ module Motor
82
84
  model.columns.map do |column|
83
85
  next if reference_columns.find { |c| c[:name] == column.name }
84
86
 
85
- {
86
- name: column.name,
87
- display_name: column.name.humanize,
88
- column_type: ActiveRecordUtils::Types::UNIFIED_TYPES[column.type.to_s] || column.type.to_s,
89
- access_type: COLUMN_NAME_ACCESS_TYPES.fetch(column.name, ColumnAccessTypes::READ_WRITE),
90
- default_value: default_attrs[column.name],
91
- validators: fetch_validators(model, column.name),
92
- reference: nil,
93
- format: {},
94
- virtual: false
95
- }
87
+ build_table_column(column, model, default_attrs)
96
88
  end.compact
97
89
 
98
90
  reference_columns + table_columns
99
91
  end
100
92
 
93
+ def build_table_column(column, model, default_attrs)
94
+ {
95
+ name: column.name,
96
+ display_name: column.name.humanize,
97
+ column_type: ActiveRecordUtils::Types::UNIFIED_TYPES[column.type.to_s] || column.type.to_s,
98
+ access_type: COLUMN_NAME_ACCESS_TYPES.fetch(column.name, ColumnAccessTypes::READ_WRITE),
99
+ default_value: default_attrs[column.name],
100
+ validators: fetch_validators(model, column.name),
101
+ reference: nil,
102
+ format: {},
103
+ virtual: false
104
+ }
105
+ end
106
+
101
107
  def fetch_reference_columns(model)
102
108
  default_attrs = model.new.attributes
103
109
 
@@ -110,32 +116,36 @@ module Motor
110
116
  next
111
117
  end
112
118
 
113
- column_name = ref.belongs_to? ? ref.foreign_key.to_s : name
114
-
115
119
  next if ref.klass.name == 'ActiveStorage::Blob'
116
120
 
117
- is_attachment = ref.klass.name == 'ActiveStorage::Attachment'
118
-
119
- {
120
- name: column_name,
121
- display_name: column_name.humanize,
122
- column_type: is_attachment ? 'file' : 'integer',
123
- access_type: ref.belongs_to? || is_attachment ? ColumnAccessTypes::READ_WRITE : ColumnAccessTypes::READ_ONLY,
124
- default_value: default_attrs[column_name],
125
- validators: fetch_validators(model, column_name),
126
- format: {},
127
- reference: {
128
- name: name,
129
- model_name: ref.klass.name.underscore,
130
- reference_type: ref.belongs_to? ? 'belongs_to' : 'has_one',
131
- foreign_key: ref.foreign_key,
132
- polymorphic: ref.polymorphic? || is_attachment
133
- },
134
- virtual: false
135
- }
121
+ build_reflection_column(name, model, ref, default_attrs)
136
122
  end.compact
137
123
  end
138
124
 
125
+ def build_reflection_column(name, model, ref, default_attrs)
126
+ column_name = ref.belongs_to? ? ref.foreign_key.to_s : name
127
+ is_attachment = ref.klass.name == 'ActiveStorage::Attachment'
128
+ access_type = ref.belongs_to? || is_attachment ? ColumnAccessTypes::READ_WRITE : ColumnAccessTypes::READ_ONLY
129
+
130
+ {
131
+ name: column_name,
132
+ display_name: column_name.humanize,
133
+ column_type: is_attachment ? 'file' : 'integer',
134
+ access_type: access_type,
135
+ default_value: default_attrs[column_name],
136
+ validators: fetch_validators(model, column_name),
137
+ format: {},
138
+ reference: {
139
+ name: name,
140
+ model_name: ref.klass.name.underscore,
141
+ reference_type: ref.belongs_to? ? 'belongs_to' : 'has_one',
142
+ foreign_key: ref.foreign_key,
143
+ polymorphic: ref.polymorphic? || is_attachment
144
+ },
145
+ virtual: false
146
+ }
147
+ end
148
+
139
149
  def fetch_associations(model)
140
150
  model.reflections.map do |name, ref|
141
151
  next if ref.has_one? || ref.belongs_to?
@@ -182,10 +192,12 @@ module Motor
182
192
  end
183
193
 
184
194
  def eager_load_models!
185
- if Rails::VERSION::MAJOR > 5 && defined?(Zeitwerk::Loader)
186
- Zeitwerk::Loader.eager_load_all
187
- else
188
- Rails.application.eager_load!
195
+ MUTEX.synchronize do
196
+ if Rails::VERSION::MAJOR > 5 && defined?(Zeitwerk::Loader)
197
+ Zeitwerk::Loader.eager_load_all
198
+ else
199
+ Rails.application.eager_load!
200
+ end
189
201
  end
190
202
  end
191
203
  end
@@ -27,40 +27,81 @@ module Motor
27
27
  def merge_model(model, configs)
28
28
  updated_model = model.merge(configs.slice(*RESOURCE_ATTRS))
29
29
 
30
- updated_model[:associations] = merge_by_name(
30
+ merge_actions!(updated_model, configs)
31
+ merge_assiciations!(updated_model, configs)
32
+ merge_columns!(updated_model, configs)
33
+ merge_tabs!(updated_model, configs)
34
+ merge_scopes!(updated_model, configs)
35
+
36
+ updated_model
37
+ end
38
+
39
+ # @param model [HashWithIndifferentAccess]
40
+ # @param configs [HashWithIndifferentAccess]
41
+ # @return [HashWithIndifferentAccess]
42
+ def merge_assiciations!(model, configs)
43
+ model[:associations] = merge_by_name(
31
44
  model[:associations],
32
45
  configs[:associations],
33
46
  {},
34
47
  ->(_) { true }
35
48
  )
36
49
 
37
- updated_model[:columns] = merge_by_name(
50
+ model
51
+ end
52
+
53
+ # @param model [HashWithIndifferentAccess]
54
+ # @param configs [HashWithIndifferentAccess]
55
+ # @return [HashWithIndifferentAccess]
56
+ def merge_columns!(model, configs)
57
+ model[:columns] = merge_by_name(
38
58
  model[:columns],
39
59
  configs[:columns],
40
60
  COLUMN_DEFAULTS,
41
61
  ->(scope) { !scope[:virtual] }
42
62
  )
43
63
 
44
- updated_model[:actions] = merge_by_name(
64
+ model
65
+ end
66
+
67
+ # @param model [HashWithIndifferentAccess]
68
+ # @param configs [HashWithIndifferentAccess]
69
+ # @return [HashWithIndifferentAccess]
70
+ def merge_actions!(model, configs)
71
+ model[:actions] = merge_by_name(
45
72
  model[:actions],
46
73
  configs[:actions],
47
74
  ACTION_DEFAULTS
48
75
  )
49
76
 
50
- updated_model[:tabs] = merge_by_name(
77
+ model
78
+ end
79
+
80
+ # @param model [HashWithIndifferentAccess]
81
+ # @param configs [HashWithIndifferentAccess]
82
+ # @return [HashWithIndifferentAccess]
83
+ def merge_tabs!(model, configs)
84
+ model[:tabs] = merge_by_name(
51
85
  model[:tabs],
52
86
  configs[:tabs],
53
87
  TAB_DEFAULTS
54
88
  )
55
89
 
56
- updated_model[:scopes] = merge_by_name(
90
+ model
91
+ end
92
+
93
+ # @param model [HashWithIndifferentAccess]
94
+ # @param configs [HashWithIndifferentAccess]
95
+ # @return [HashWithIndifferentAccess]
96
+ def merge_scopes!(model, configs)
97
+ model[:scopes] = merge_by_name(
57
98
  model[:scopes],
58
99
  configs[:scopes],
59
100
  SCOPE_DEFAULTS,
60
101
  ->(scope) { scope[:scope_type] != 'filter' }
61
102
  )
62
103
 
63
- updated_model
104
+ model
64
105
  end
65
106
 
66
107
  # @param defaults [Array<HashWithIndifferentAccess>]
@@ -77,47 +77,26 @@ module Motor
77
77
  normalized_preferences = existing_prefs.merge(normalized_preferences)
78
78
  normalized_preferences = reject_default(default_prefs, normalized_preferences)
79
79
 
80
- if new_prefs[:columns].present?
81
- normalized_preferences[:columns] = normalize_columns(
82
- default_prefs[:columns],
83
- existing_prefs.fetch(:columns, []),
84
- new_prefs.fetch(:columns, [])
85
- )
86
- end
80
+ normalize_configs!(normalized_preferences, :columns, default_prefs, existing_prefs, new_prefs)
81
+ normalize_configs!(normalized_preferences, :associations, default_prefs, existing_prefs, new_prefs)
82
+ normalize_configs!(normalized_preferences, :actions, default_prefs, existing_prefs, new_prefs)
83
+ normalize_configs!(normalized_preferences, :tabs, default_prefs, existing_prefs, new_prefs)
84
+ normalize_configs!(normalized_preferences, :scopes, default_prefs, existing_prefs, new_prefs)
87
85
 
88
- if new_prefs[:associations].present?
89
- normalized_preferences[:associations] = normalize_associations(
90
- default_prefs[:associations],
91
- existing_prefs.fetch(:associations, []),
92
- new_prefs.fetch(:associations, [])
93
- )
94
- end
86
+ normalized_preferences.compact
87
+ end
95
88
 
96
- if new_prefs[:actions].present?
97
- normalized_preferences[:actions] = normalize_actions(
98
- default_prefs[:actions],
99
- existing_prefs.fetch(:actions, []),
100
- new_prefs.fetch(:actions, [])
101
- )
102
- end
89
+ def normalize_configs!(preferences, configs_name, default_prefs, existing_prefs, new_prefs)
90
+ return preferences if new_prefs[configs_name].blank?
103
91
 
104
- if new_prefs[:tabs].present?
105
- normalized_preferences[:tabs] = normalize_tabs(
106
- default_prefs[:tabs],
107
- existing_prefs.fetch(:tabs, []),
108
- new_prefs.fetch(:tabs, [])
109
- )
110
- end
92
+ normalized_configs = public_send("normalize_#{configs_name}",
93
+ default_prefs[:actions],
94
+ existing_prefs.fetch(:actions, []),
95
+ new_prefs.fetch(:actions, []))
111
96
 
112
- if new_prefs[:scopes].present?
113
- normalized_preferences[:scopes] = normalize_scopes(
114
- default_prefs[:scopes],
115
- existing_prefs.fetch(:scopes, []),
116
- new_prefs.fetch(:scopes, [])
117
- )
118
- end
97
+ preferences[configs_name] = normalized_configs
119
98
 
120
- normalized_preferences.compact
99
+ preferences
121
100
  end
122
101
 
123
102
  # @param default_columns [Array<HashWithIndifferentAccess>]
@@ -23,21 +23,29 @@ module Motor
23
23
 
24
24
  schema = sort_by_name(schema, configs['resources.order'])
25
25
 
26
- schema.map do |model|
27
- columns_order = configs["resources.#{model[:name]}.columns.order"]
28
- associations_order = configs["resources.#{model[:name]}.associations.order"]
29
- actions_order = configs["resources.#{model[:name]}.actions.order"]
30
- tabs_order = configs["resources.#{model[:name]}.tabs.order"]
31
- scopes_order = configs["resources.#{model[:name]}.scopes.order"]
26
+ schema.map { |model| reorder_model(model, configs) }
27
+ end
32
28
 
33
- model.merge(
34
- columns: sort_by_name(sort_columns(model[:columns]), columns_order, sort_alphabetically: false),
35
- associations: sort_by_name(model[:associations], associations_order),
36
- actions: sort_by_name(model[:actions], actions_order, sort_alphabetically: false),
37
- tabs: sort_by_name(model[:tabs], tabs_order, sort_alphabetically: false),
38
- scopes: sort_by_name(model[:scopes], scopes_order)
39
- )
40
- end
29
+ def reorder_model(model, configs)
30
+ order_configs = build_order_configs(model[:name], configs)
31
+
32
+ model.merge(
33
+ columns: sort_by_name(sort_columns(model[:columns]), order_configs[:columns], sort_alphabetically: false),
34
+ associations: sort_by_name(model[:associations], order_configs[:associations]),
35
+ actions: sort_by_name(model[:actions], order_configs[:actions], sort_alphabetically: false),
36
+ tabs: sort_by_name(model[:tabs], order_configs[:tabs], sort_alphabetically: false),
37
+ scopes: sort_by_name(model[:scopes], order_configs[:scopes])
38
+ )
39
+ end
40
+
41
+ def build_order_configs(model_name, configs)
42
+ {
43
+ columns: configs["resources.#{model_name}.columns.order"],
44
+ associations: configs["resources.#{model_name}.associations.order"],
45
+ actions: configs["resources.#{model_name}.actions.order"],
46
+ tabs: configs["resources.#{model_name}.tabs.order"],
47
+ scopes: configs["resources.#{model_name}.scopes.order"]
48
+ }
41
49
  end
42
50
 
43
51
  # @param list [Array<HashWithIndifferentAccess>]
@@ -3,7 +3,7 @@
3
3
  module Motor
4
4
  module Queries
5
5
  module RunQuery
6
- DEFAULT_LIMIT = 1_000_000
6
+ DEFAULT_LIMIT = 100_000
7
7
 
8
8
  QueryResult = Struct.new(:data, :columns, keyword_init: true)
9
9
 
@@ -13,6 +13,10 @@ module Motor
13
13
 
14
14
  module_function
15
15
 
16
+ # @param query [Motor::Query]
17
+ # @param variables_hash [Hash]
18
+ # @param limit [Integer]
19
+ # @return [Motor::Queries::RunQuery::QueryResult]
16
20
  def call(query, variables_hash: nil, limit: DEFAULT_LIMIT)
17
21
  variables_hash ||= {}
18
22
 
@@ -21,15 +25,27 @@ module Motor
21
25
  QueryResult.new(data: result.rows, columns: build_columns_hash(result))
22
26
  end
23
27
 
28
+ # @param query [Motor::Query]
29
+ # @param limit [Integer]
30
+ # @param variables_hash [Hash]
31
+ # @return [ActiveRecord::Result]
24
32
  def execute_query(query, limit, variables_hash)
33
+ result = nil
25
34
  statement = prepare_sql_statement(query, limit, variables_hash)
26
35
 
27
- case ActiveRecord::Base.connection
28
- when ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
29
- PostgresqlExecQuery.call(ActiveRecord::Base.connection, statement)
30
- else
31
- ActiveRecord::Base.connection.exec_query(*statement)
36
+ ActiveRecord::Base.transaction do
37
+ result =
38
+ case ActiveRecord::Base.connection
39
+ when ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
40
+ PostgresqlExecQuery.call(ActiveRecord::Base.connection, statement)
41
+ else
42
+ ActiveRecord::Base.connection.exec_query(*statement)
43
+ end
44
+
45
+ raise ActiveRecord::Rollback
32
46
  end
47
+
48
+ result
33
49
  end
34
50
 
35
51
  # @param result [ActiveRecord::Result]
@@ -46,6 +62,10 @@ module Motor
46
62
  end
47
63
  end
48
64
 
65
+ # @param query [Motor::Query]
66
+ # @param limit [Integer]
67
+ # @param variables_hash [Hash]
68
+ # @return [Array]
49
69
  def prepare_sql_statement(query, limit, variables_hash)
50
70
  variables = merge_variable_default_values(query.preferences.fetch(:variables, []), variables_hash)
51
71
 
@@ -56,6 +76,8 @@ module Motor
56
76
  [format(WITH_STATEMENT_TEMPLATE, sql_body: sql.strip.gsub(/;\z/, ''), limit: limit), 'SQL', attributes]
57
77
  end
58
78
 
79
+ # @param variables [Array<(String, Object)>]
80
+ # @return [Array<ActiveRecord::Relation::QueryAttribute>]
59
81
  def build_statement_attributes(variables)
60
82
  variables.map do |variable_name, value|
61
83
  ActiveRecord::Relation::QueryAttribute.new(
@@ -66,6 +88,9 @@ module Motor
66
88
  end
67
89
  end
68
90
 
91
+ # @param variable_configs [Array<Hash>]
92
+ # @param variable_hash [Hash]
93
+ # @return [Hash]
69
94
  def merge_variable_default_values(variable_configs, variables_hash)
70
95
  variable_configs.each_with_object({}) do |variable, acc|
71
96
  acc[variable[:name]] = variables_hash[variable[:name]] || variable[:default_value]
@@ -27,22 +27,42 @@ module Motor
27
27
  {
28
28
  base_path: Motor::Admin.routes.url_helpers.motor_path,
29
29
  schema: Motor::BuildSchema.call,
30
- header_links: Motor::Config.find_by(key: 'header.links')&.value || [],
31
- queries: Motor::Query.all.active.preload(:tags)
32
- .as_json(only: %i[id name updated_at],
33
- include: { tags: { only: %i[id name] } }),
34
- dashboards: Motor::Dashboard.all.active.preload(:tags)
35
- .as_json(only: %i[id title updated_at],
36
- include: { tags: { only: %i[id name] } }),
37
- alerts: Motor::Alert.all.active.preload(:tags)
38
- .as_json(only: %i[id name is_enabled updated_at],
39
- include: { tags: { only: %i[id name] } }),
40
- forms: Motor::Form.all.active.preload(:tags)
41
- .as_json(only: %i[id name updated_at],
42
- include: { tags: { only: %i[id name] } })
30
+ header_links: header_links_data_hash,
31
+ queries: queries_data_hash,
32
+ dashboards: dashboards_data_hash,
33
+ alerts: alerts_data_hash,
34
+ forms: forms_data_hash
43
35
  }
44
36
  end
45
37
 
38
+ def header_links_data_hash
39
+ Motor::Config.find_by(key: 'header.links')&.value || []
40
+ end
41
+
42
+ def queries_data_hash
43
+ Motor::Query.all.active.preload(:tags)
44
+ .as_json(only: %i[id name updated_at],
45
+ include: { tags: { only: %i[id name] } })
46
+ end
47
+
48
+ def dashboards_data_hash
49
+ Motor::Dashboard.all.active.preload(:tags)
50
+ .as_json(only: %i[id title updated_at],
51
+ include: { tags: { only: %i[id name] } })
52
+ end
53
+
54
+ def alerts_data_hash
55
+ Motor::Alert.all.active.preload(:tags)
56
+ .as_json(only: %i[id name is_enabled updated_at],
57
+ include: { tags: { only: %i[id name] } })
58
+ end
59
+
60
+ def forms_data_hash
61
+ Motor::Form.all.active.preload(:tags)
62
+ .as_json(only: %i[id name updated_at],
63
+ include: { tags: { only: %i[id name] } })
64
+ end
65
+
46
66
  # @return [String]
47
67
  def cache_key
48
68
  ActiveRecord::Base.connection.execute(
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.27'
4
+ VERSION = '0.1.28'
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-d6c1f237d3568a138874.css.gz": "main-d6c1f237d3568a138874.css.gz",
9
- "main-d6c1f237d3568a138874.js.LICENSE.txt": "main-d6c1f237d3568a138874.js.LICENSE.txt",
10
- "main-d6c1f237d3568a138874.js.gz": "main-d6c1f237d3568a138874.js.gz",
11
- "main.css": "main-d6c1f237d3568a138874.css",
12
- "main.js": "main-d6c1f237d3568a138874.js"
8
+ "main-4da1a5102d7bc66aefd0.css.gz": "main-4da1a5102d7bc66aefd0.css.gz",
9
+ "main-4da1a5102d7bc66aefd0.js.LICENSE.txt": "main-4da1a5102d7bc66aefd0.js.LICENSE.txt",
10
+ "main-4da1a5102d7bc66aefd0.js.gz": "main-4da1a5102d7bc66aefd0.js.gz",
11
+ "main.css": "main-4da1a5102d7bc66aefd0.css",
12
+ "main.js": "main-4da1a5102d7bc66aefd0.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.27
4
+ version: 0.1.28
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-05 00:00:00.000000000 Z
11
+ date: 2021-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord-filter
@@ -214,8 +214,8 @@ files:
214
214
  - lib/motor/ui_configs.rb
215
215
  - lib/motor/version.rb
216
216
  - ui/dist/fonts/ionicons.woff2
217
- - ui/dist/main-d6c1f237d3568a138874.css.gz
218
- - ui/dist/main-d6c1f237d3568a138874.js.gz
217
+ - ui/dist/main-4da1a5102d7bc66aefd0.css.gz
218
+ - ui/dist/main-4da1a5102d7bc66aefd0.js.gz
219
219
  - ui/dist/manifest.json
220
220
  homepage:
221
221
  licenses: