motor-admin 0.2.32 → 0.2.36
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/locales/en.yml +3 -0
- data/config/locales/es.yml +3 -0
- data/config/locales/pt.yml +3 -0
- data/lib/motor/active_record_utils/ar_lazy_preload_patch.rb +11 -0
- data/lib/motor/admin.rb +1 -1
- data/lib/motor/api_query/search.rb +19 -27
- data/lib/motor/build_schema/find_searchable_columns.rb +33 -0
- data/lib/motor/build_schema/load_from_rails.rb +4 -1
- data/lib/motor/build_schema.rb +1 -0
- data/lib/motor/configs/sync_from_hash.rb +6 -2
- data/lib/motor/resources/fetch_configured_model.rb +20 -1
- data/lib/motor/resources.rb +2 -1
- data/lib/motor/version.rb +1 -1
- data/ui/dist/main-348da28bba8cc2014150.css.gz +0 -0
- data/ui/dist/main-348da28bba8cc2014150.js.gz +0 -0
- data/ui/dist/manifest.json +5 -5
- metadata +5 -4
- data/ui/dist/main-75c26326d4058b8611c3.css.gz +0 -0
- data/ui/dist/main-75c26326d4058b8611c3.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: 2247da648b9add9fcaab6b8688289ae7a9908e9b8fb23ead4f5acc5917257491
|
4
|
+
data.tar.gz: b14931d1e8ce8a71cd4e686b29517ddf84a599f8d46d7d1f4dab5c3fca9a5e0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1bfce35dcbc6f43985617e1c4cb47be55b00b10aa3df1bc07c6ceb28c18e9351af69f7467b2f52ac30fdd13ab62910ae20d978a6a02f4d361343333f526701c
|
7
|
+
data.tar.gz: 4a3671b36ba7704f58140dcfa1db3c0798a7395a57e1ad20648a0898ad026f0dc03444136cea87998d57a7cc8ada53b35a84ac23ed1a2d3e90421b0ba2ac8432
|
data/config/locales/en.yml
CHANGED
data/config/locales/es.yml
CHANGED
data/config/locales/pt.yml
CHANGED
@@ -18,5 +18,16 @@ if Rails::VERSION::MAJOR == 7
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
module Contexts
|
23
|
+
class BaseContext
|
24
|
+
def preload_records(association_name, records)
|
25
|
+
TemporaryPreloadConfig.within_context do
|
26
|
+
ActiveRecord::Associations::Preloader.new(records: records,
|
27
|
+
associations: association_name).call
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
21
32
|
end
|
22
33
|
end
|
data/lib/motor/admin.rb
CHANGED
@@ -3,9 +3,8 @@
|
|
3
3
|
module Motor
|
4
4
|
module ApiQuery
|
5
5
|
module Search
|
6
|
-
|
7
|
-
|
8
|
-
ID_REGEXP = /\A\d+\z/.freeze
|
6
|
+
STRING_COLUMN_TYPES = %i[text string].freeze
|
7
|
+
NUMBER_COLUMN_TYPES = %i[integer float].freeze
|
9
8
|
|
10
9
|
module_function
|
11
10
|
|
@@ -20,19 +19,27 @@ module Motor
|
|
20
19
|
end
|
21
20
|
|
22
21
|
def fetch_filters(rel, keyword)
|
23
|
-
arel_filters = []
|
24
|
-
|
25
22
|
klass = rel.klass
|
26
|
-
arel_table = klass.arel_table
|
27
23
|
|
28
|
-
|
24
|
+
selected_columns = find_searchable_columns(klass)
|
25
|
+
|
26
|
+
build_arel_filters(klass, selected_columns, keyword)
|
27
|
+
end
|
29
28
|
|
30
|
-
|
31
|
-
|
29
|
+
def build_arel_filters(model, column_names, keyword)
|
30
|
+
arel_table = model.arel_table
|
32
31
|
|
33
|
-
|
32
|
+
column_names.map do |name|
|
33
|
+
column_type = model.columns_hash[name].type
|
34
34
|
|
35
|
-
|
35
|
+
if STRING_COLUMN_TYPES.include?(column_type)
|
36
|
+
arel_table[name].matches("%#{keyword}%")
|
37
|
+
elsif NUMBER_COLUMN_TYPES.include?(column_type)
|
38
|
+
arel_table[name].eq(keyword.to_f)
|
39
|
+
else
|
40
|
+
arel_table[name].eq(keyword)
|
41
|
+
end
|
42
|
+
end
|
36
43
|
end
|
37
44
|
|
38
45
|
def build_arel_or_query(filter_array)
|
@@ -43,23 +50,8 @@ module Motor
|
|
43
50
|
end
|
44
51
|
end
|
45
52
|
|
46
|
-
def select_columns(columns)
|
47
|
-
selected_columns =
|
48
|
-
columns.grep(BuildSchema::FindDisplayColumn::DISPLAY_NAME_REGEXP).presence
|
49
|
-
|
50
|
-
selected_columns ||= columns.first(SELECT_COLUMNS_AMOUNT)
|
51
|
-
|
52
|
-
selected_columns
|
53
|
-
end
|
54
|
-
|
55
53
|
def find_searchable_columns(model)
|
56
|
-
model.
|
57
|
-
next unless column.type.in?(COLUMN_TYPES)
|
58
|
-
next if column.respond_to?(:array?) && column.array?
|
59
|
-
next if model.validators_on(column.name).any?(ActiveModel::Validations::InclusionValidator)
|
60
|
-
|
61
|
-
column.name
|
62
|
-
end.compact
|
54
|
+
model.try(:motor_searchable_columns) || Motor::BuildSchema::FindSearchableColumns.call(model)
|
63
55
|
end
|
64
56
|
end
|
65
57
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Motor
|
4
|
+
module BuildSchema
|
5
|
+
module FindSearchableColumns
|
6
|
+
SELECT_COLUMNS_AMOUNT = 2
|
7
|
+
COLUMN_TYPES = BuildSchema::SEARCHABLE_COLUMN_TYPES
|
8
|
+
|
9
|
+
module_function
|
10
|
+
|
11
|
+
def call(model)
|
12
|
+
columns = find_searchable_columns(model)
|
13
|
+
|
14
|
+
selected_columns =
|
15
|
+
columns.grep(BuildSchema::FindDisplayColumn::DISPLAY_NAME_REGEXP).presence
|
16
|
+
|
17
|
+
selected_columns ||= columns.first(SELECT_COLUMNS_AMOUNT)
|
18
|
+
|
19
|
+
([model.primary_key] + selected_columns).sort
|
20
|
+
end
|
21
|
+
|
22
|
+
def find_searchable_columns(model)
|
23
|
+
model.columns.map do |column|
|
24
|
+
next unless column.type.in?(COLUMN_TYPES)
|
25
|
+
next if column.respond_to?(:array?) && column.array?
|
26
|
+
next if model.validators_on(column.name).any?(ActiveModel::Validations::InclusionValidator)
|
27
|
+
|
28
|
+
column.name
|
29
|
+
end.compact
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -56,6 +56,7 @@ module Motor
|
|
56
56
|
models
|
57
57
|
end
|
58
58
|
|
59
|
+
# rubocop:disable Metrics/MethodLength
|
59
60
|
def build_model_schema(model)
|
60
61
|
model_name = model.name
|
61
62
|
|
@@ -65,7 +66,7 @@ module Motor
|
|
65
66
|
name: model_name.underscore,
|
66
67
|
slug: Utils.slugify(model),
|
67
68
|
table_name: model.table_name,
|
68
|
-
class_name:
|
69
|
+
class_name: model_name,
|
69
70
|
primary_key: model.primary_key,
|
70
71
|
display_name: model.model_name.human(count: :many, default: model_name.titleize.pluralize),
|
71
72
|
display_column: FindDisplayColumn.call(model),
|
@@ -75,11 +76,13 @@ module Motor
|
|
75
76
|
scopes: fetch_scopes(model),
|
76
77
|
actions: BuildSchema::Defaults.actions,
|
77
78
|
tabs: BuildSchema::Defaults.tabs,
|
79
|
+
searchable_columns: FindSearchableColumns.call(model),
|
78
80
|
custom_sql: nil,
|
79
81
|
visible: true,
|
80
82
|
display_primary_key: true
|
81
83
|
}.with_indifferent_access
|
82
84
|
end
|
85
|
+
# rubocop:enable Metrics/MethodLength
|
83
86
|
|
84
87
|
def fetch_scopes(model)
|
85
88
|
model.defined_scopes.map do |scope_name|
|
data/lib/motor/build_schema.rb
CHANGED
@@ -72,10 +72,14 @@ module Motor
|
|
72
72
|
resources_index = Motor::Configs::LoadFromCache.load_resources.index_by(&:name)
|
73
73
|
|
74
74
|
configs_hash[:resources].each do |attrs|
|
75
|
-
record = resources_index
|
75
|
+
record = resources_index.fetch(attrs[:name], Motor::Resource.new)
|
76
76
|
|
77
|
-
next if record.updated_at && attrs[:updated_at]
|
77
|
+
next if record.updated_at && attrs[:updated_at] < record.updated_at
|
78
|
+
next if record.updated_at &&
|
79
|
+
attrs[:updated_at] == record.updated_at &&
|
80
|
+
attrs[:preferences] == record.preferences
|
78
81
|
|
82
|
+
record.updated_at_will_change!
|
79
83
|
record.update!(attrs)
|
80
84
|
end
|
81
85
|
end
|
@@ -33,6 +33,7 @@ module Motor
|
|
33
33
|
define_default_scope(klass, config)
|
34
34
|
define_column_reflections(klass, config)
|
35
35
|
define_associations(klass, config)
|
36
|
+
define_searchable_columns_method(klass, config)
|
36
37
|
|
37
38
|
klass
|
38
39
|
end
|
@@ -75,6 +76,18 @@ module Motor
|
|
75
76
|
klass
|
76
77
|
end
|
77
78
|
|
79
|
+
def define_searchable_columns_method(klass, config)
|
80
|
+
return if config[:searchable_columns].blank?
|
81
|
+
|
82
|
+
klass.instance_variable_set(:@__motor_searchable_columns, config[:searchable_columns])
|
83
|
+
|
84
|
+
klass.instance_eval do
|
85
|
+
def motor_searchable_columns
|
86
|
+
@__motor_searchable_columns
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
78
91
|
def define_columns_hash(klass, config)
|
79
92
|
return klass if config[:custom_sql].blank?
|
80
93
|
|
@@ -82,7 +95,13 @@ module Motor
|
|
82
95
|
|
83
96
|
columns_hash =
|
84
97
|
columns.each_with_object({}) do |column, acc|
|
85
|
-
acc[column[:name]] =
|
98
|
+
acc[column[:name]] =
|
99
|
+
ActiveRecord::ConnectionAdapters::Column.new(
|
100
|
+
column[:name],
|
101
|
+
nil,
|
102
|
+
ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(sql_type: column[:column_type],
|
103
|
+
type: column[:column_type].to_sym)
|
104
|
+
)
|
86
105
|
end
|
87
106
|
|
88
107
|
klass.instance_variable_set(:@__motor_custom_sql_columns_hash, columns_hash)
|
data/lib/motor/resources.rb
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
module Motor
|
4
4
|
module Resources
|
5
|
-
RESOURCE_ATTRS = %w[display_name display_column icon custom_sql visible display_primary_key
|
5
|
+
RESOURCE_ATTRS = %w[display_name display_column icon custom_sql visible display_primary_key
|
6
|
+
searchable_columns].freeze
|
6
7
|
COLUMN_ATTRS = %w[name display_name column_type access_type default_value reference virtual format].freeze
|
7
8
|
ASSOCIATION_ATTRS = %w[name display_name model_name icon visible foreign_key primary_key options virtual
|
8
9
|
polymorphic slug].freeze
|
data/lib/motor/version.rb
CHANGED
Binary file
|
Binary file
|
data/ui/dist/manifest.json
CHANGED
@@ -2601,9 +2601,9 @@
|
|
2601
2601
|
"icons/zoom-out.svg.gz": "icons/zoom-out.svg.gz",
|
2602
2602
|
"icons/zoom-question.svg": "icons/zoom-question.svg",
|
2603
2603
|
"icons/zoom-question.svg.gz": "icons/zoom-question.svg.gz",
|
2604
|
-
"main-
|
2605
|
-
"main-
|
2606
|
-
"main-
|
2607
|
-
"main.css": "main-
|
2608
|
-
"main.js": "main-
|
2604
|
+
"main-348da28bba8cc2014150.css.gz": "main-348da28bba8cc2014150.css.gz",
|
2605
|
+
"main-348da28bba8cc2014150.js.LICENSE.txt": "main-348da28bba8cc2014150.js.LICENSE.txt",
|
2606
|
+
"main-348da28bba8cc2014150.js.gz": "main-348da28bba8cc2014150.js.gz",
|
2607
|
+
"main.css": "main-348da28bba8cc2014150.css",
|
2608
|
+
"main.js": "main-348da28bba8cc2014150.js"
|
2609
2609
|
}
|
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.2.
|
4
|
+
version: 0.2.36
|
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-12-17 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/build_schema/defaults.rb
|
192
192
|
- lib/motor/build_schema/find_display_column.rb
|
193
193
|
- lib/motor/build_schema/find_icon.rb
|
194
|
+
- lib/motor/build_schema/find_searchable_columns.rb
|
194
195
|
- lib/motor/build_schema/load_from_rails.rb
|
195
196
|
- lib/motor/build_schema/merge_schema_configs.rb
|
196
197
|
- lib/motor/build_schema/reorder_schema.rb
|
@@ -1525,8 +1526,8 @@ files:
|
|
1525
1526
|
- ui/dist/icons/zoom-money.svg.gz
|
1526
1527
|
- ui/dist/icons/zoom-out.svg.gz
|
1527
1528
|
- ui/dist/icons/zoom-question.svg.gz
|
1528
|
-
- ui/dist/main-
|
1529
|
-
- ui/dist/main-
|
1529
|
+
- ui/dist/main-348da28bba8cc2014150.css.gz
|
1530
|
+
- ui/dist/main-348da28bba8cc2014150.js.gz
|
1530
1531
|
- ui/dist/manifest.json
|
1531
1532
|
homepage:
|
1532
1533
|
licenses:
|
Binary file
|
Binary file
|