motor-admin 0.2.11 → 0.2.15
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 +4 -4
- data/README.md +18 -5
- data/app/controllers/motor/data_controller.rb +8 -4
- data/app/controllers/motor/sessions_controller.rb +13 -0
- data/config/locales/en.yml +8 -0
- data/config/locales/es.yml +8 -0
- data/config/locales/pt.yml +8 -0
- data/config/routes.rb +1 -0
- data/lib/generators/motor/templates/install.rb +1 -1
- data/lib/motor/active_record_utils/types.rb +1 -0
- data/lib/motor/active_record_utils.rb +12 -0
- data/lib/motor/build_schema/load_from_rails.rb +2 -1
- data/lib/motor/build_schema/merge_schema_configs.rb +1 -1
- data/lib/motor/queries/run_query.rb +37 -3
- data/lib/motor/resources.rb +1 -1
- data/lib/motor/version.rb +1 -1
- data/ui/dist/{main-192e078f9e813b1ffe93.css.gz → main-e5afce0ea81ef4505dc5.css.gz} +0 -0
- data/ui/dist/main-e5afce0ea81ef4505dc5.js.gz +0 -0
- data/ui/dist/manifest.json +5 -5
- metadata +5 -4
- data/ui/dist/main-192e078f9e813b1ffe93.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: 0254bb1cf5ab3176c1c2e923ad755e1f6e445da757aa7981b93b127cb5757c57
|
4
|
+
data.tar.gz: b8c3a27811eb765056a67ffd9f1cb35fbc374b810be25cfa1de2f9791764f162
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07a1cfb97147d11a5f8abd505e7ab2f91a3568a817ced4043b0db394cf3c8d097ae1bbaca27a391af6b133aea89d9a9470afac9ed670b693098d854168c3656c
|
7
|
+
data.tar.gz: be58770afa9930c45e0e66e34d5762de7f3d44acf8775afc01cc945c7a13410a0c1b342f6be0e44f0f59047a5fc7a50d20fec1df5e7d1aaeb3a3c541c3743db3
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Low-code Admin panel and Business intelligence Rails engine **(no DSL - configurable from the UI)**.
|
4
4
|
|
5
|
-
🤓 [Demo App](https://motor-admin.herokuapp.com/demo) | 👀 [Features overview](https://www.youtube.com/watch?v=ngVoci8Hll4&list=PLu7llEMh0KcOkR3Uy_RJT0cXPZQKAYVsq&index=1) | ⭐ [
|
5
|
+
🤓 [Demo App](https://motor-admin.herokuapp.com/demo) | 👀 [Features overview](https://www.youtube.com/watch?v=ngVoci8Hll4&list=PLu7llEMh0KcOkR3Uy_RJT0cXPZQKAYVsq&index=1) | ⭐ [Pro](https://www.getmotoradmin.com/pro)
|
6
6
|
|
7
7
|
[](https://motor-admin.herokuapp.com/demo)
|
8
8
|
|
@@ -39,6 +39,19 @@ $ rails motor:install && rake db:migrate
|
|
39
39
|
* [Optimized for mobile](#optimized-for-mobile)
|
40
40
|
* [Configurations sync between environments](#configurations-sync)
|
41
41
|
|
42
|
+
## [Pro](https://www.getmotoradmin.com/pro)
|
43
|
+
|
44
|
+
* Multiple databases support
|
45
|
+
* Audit log
|
46
|
+
* Live collaboration
|
47
|
+
* Multi-factor authentication
|
48
|
+
* Custom styling
|
49
|
+
* Personalized report alerts via Slack
|
50
|
+
* Full-text search
|
51
|
+
* Stripe integration
|
52
|
+
* Shareable forms and reports
|
53
|
+
* [learn more](https://www.getmotoradmin.com/pro)
|
54
|
+
|
42
55
|
### Customizable CRUD
|
43
56
|
|
44
57
|

|
@@ -49,7 +62,7 @@ Everything in the admin panel can be configured using the intuitive settings UI,
|
|
49
62
|
|
50
63
|
Data displayed on the resource page can be completely customized via [SQL queries](#sql-queries) and [dashboards](#dashboards) attached to the resource as a tab. Usually, queries used to display resource data should contain `{{resource_name_id}}` [variable](#sql-queries).
|
51
64
|
|
52
|
-
[Learn more about resource customizations](https://github.com/
|
65
|
+
[Learn more about resource customizations](https://github.com/motor-admin/motor-admin-rails/blob/master/guides/customizing_resource_table.md)
|
53
66
|
|
54
67
|
### Custom Actions
|
55
68
|
|
@@ -79,7 +92,7 @@ end
|
|
79
92
|
|
80
93
|
Values from the form fields can be used in API path via `{field_name}` syntax: `/api/some-endpoint/{resource_id}/apply`.
|
81
94
|
|
82
|
-
[Learn more about custom forms builder](https://github.com/
|
95
|
+
[Learn more about custom forms builder](https://github.com/motor-admin/motor-admin-rails/blob/master/guides/building_custom_forms.md)
|
83
96
|
|
84
97
|
### SQL Queries
|
85
98
|
|
@@ -115,7 +128,7 @@ Intelligence search can be opened via the top right corner button or using <kbd>
|
|
115
128
|
|
116
129
|
### Authorization
|
117
130
|
|
118
|
-
Motor Admin allows to set row-level and column-level permissions via [cancan](https://github.com/CanCanCommunity/cancancan) gem. Admin UI permissions should be defined in `app/models/motor/ability.rb` file in `Motor::Ability` class. See [Motor Admin guide](https://github.com/
|
131
|
+
Motor Admin allows to set row-level and column-level permissions via [cancan](https://github.com/CanCanCommunity/cancancan) gem. Admin UI permissions should be defined in `app/models/motor/ability.rb` file in `Motor::Ability` class. See [Motor Admin guide](https://github.com/motor-admin/motor-admin-rails/blob/master/guides/defining_permissions.md) and [CanCan documentation](https://github.com/CanCanCommunity/cancancan/blob/develop/docs/Defining-Abilities.md) to learn how to define user permissions.
|
119
132
|
|
120
133
|
### I18n
|
121
134
|
|
@@ -186,4 +199,4 @@ MOTOR_DEVELOPMENT=true rails s
|
|
186
199
|
|
187
200
|
## License
|
188
201
|
|
189
|
-
The gem is available as open source under the terms of the [MIT License](https://github.com/
|
202
|
+
The gem is available as open source under the terms of the [MIT License](https://github.com/motor-admin/motor-admin-rails/blob/master/LICENSE).
|
@@ -10,10 +10,14 @@ module Motor
|
|
10
10
|
def index
|
11
11
|
@resources = Motor::ApiQuery.call(@resources, params)
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
if params[:format] == 'csv'
|
14
|
+
render plain: Motor::ActiveRecordUtils.generate_csv_for_relation(@resources, reset_limit: true)
|
15
|
+
else
|
16
|
+
render json: {
|
17
|
+
data: Motor::ApiQuery::BuildJson.call(@resources, params, current_ability),
|
18
|
+
meta: Motor::ApiQuery::BuildMeta.call(@resources, params)
|
19
|
+
}
|
20
|
+
end
|
17
21
|
end
|
18
22
|
|
19
23
|
def show
|
data/config/locales/en.yml
CHANGED
@@ -266,3 +266,11 @@ en:
|
|
266
266
|
video: Video
|
267
267
|
display_column: Display column
|
268
268
|
not_authorized_to_perform_action: You are not authorized to perform this action.
|
269
|
+
download: Download
|
270
|
+
alert: Alert
|
271
|
+
downloading: Downloading
|
272
|
+
display_id: Display ID
|
273
|
+
display_settings: Display settings
|
274
|
+
sign_out: Sign out
|
275
|
+
header: Header
|
276
|
+
user_dropdown: User dropdown
|
data/config/locales/es.yml
CHANGED
@@ -266,6 +266,14 @@ es:
|
|
266
266
|
video: Video
|
267
267
|
display_column: Columna de visualización
|
268
268
|
not_authorized_to_perform_action: No está autorizado a realizar esta acción.
|
269
|
+
download: Descargar
|
270
|
+
alert: Alerta
|
271
|
+
downloading: Descargando
|
272
|
+
display_id: Visualizar ID
|
273
|
+
display_settings: Configuración de la pantalla
|
274
|
+
sign_out: Sign out
|
275
|
+
header: Header
|
276
|
+
user_dropdown: User dropdown
|
269
277
|
i:
|
270
278
|
locale: es
|
271
279
|
select:
|
data/config/locales/pt.yml
CHANGED
@@ -262,6 +262,14 @@ pt:
|
|
262
262
|
video: Vídeo
|
263
263
|
display_column: Coluna de exibição
|
264
264
|
not_authorized_to_perform_action: Não está autorizado a realizar esta acção.
|
265
|
+
download: Descarregar
|
266
|
+
alert: Alerta
|
267
|
+
downloading: Descarregamento
|
268
|
+
display_id: Mostrar ID
|
269
|
+
display_settings: Definições de visualização
|
270
|
+
sign_out: Sign out
|
271
|
+
header: Header
|
272
|
+
user_dropdown: User dropdown
|
265
273
|
i:
|
266
274
|
locale: pt
|
267
275
|
select:
|
data/config/routes.rb
CHANGED
@@ -19,6 +19,7 @@ Motor::Admin.routes.draw do
|
|
19
19
|
resources :icons, only: %i[index]
|
20
20
|
resources :active_storage_attachments, only: %i[create], path: 'data/active_storage__attachments'
|
21
21
|
resources :audits, only: %i[index]
|
22
|
+
resource :session, only: %i[destroy]
|
22
23
|
resources :resources, path: '/data/:resource',
|
23
24
|
only: %i[index show update create destroy],
|
24
25
|
controller: 'data',
|
@@ -150,7 +150,7 @@ class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Mi
|
|
150
150
|
|
151
151
|
model.create!(key: 'header.links', value: [{
|
152
152
|
name: '⭐ Star on GitHub',
|
153
|
-
path: 'https://github.com/
|
153
|
+
path: 'https://github.com/motor-admin/motor-admin-rails'
|
154
154
|
}].to_json)
|
155
155
|
end
|
156
156
|
|
@@ -12,6 +12,18 @@ module Motor
|
|
12
12
|
ActiveRecord::Base.connection.reset_sequence!(model.table_name, 'id')
|
13
13
|
end
|
14
14
|
end
|
15
|
+
|
16
|
+
def generate_csv_for_relation(relation, reset_limit: false)
|
17
|
+
relation = relation.limit(nil).offset(nil) if reset_limit
|
18
|
+
|
19
|
+
result = relation.klass.connection.exec_query(relation.to_sql)
|
20
|
+
|
21
|
+
CSV.generate do |csv|
|
22
|
+
csv << result.columns
|
23
|
+
|
24
|
+
result.rows.each { |row| csv << row }
|
25
|
+
end
|
26
|
+
end
|
15
27
|
end
|
16
28
|
end
|
17
29
|
|
@@ -135,7 +135,7 @@ module Motor
|
|
135
135
|
access_type: ColumnAccessTypes::READ_ONLY,
|
136
136
|
column_source: ColumnSources::QUERY,
|
137
137
|
virtual: false
|
138
|
-
)
|
138
|
+
).with_indifferent_access
|
139
139
|
end
|
140
140
|
|
141
141
|
reflection_columns = columns_index.values.select { |c| c[:column_source] == ColumnSources::REFLECTION }
|
@@ -83,18 +83,52 @@ module Motor
|
|
83
83
|
# @param result [ActiveRecord::Result]
|
84
84
|
# @return [Hash]
|
85
85
|
def build_columns_hash(result)
|
86
|
-
result.columns.map do |column_name|
|
87
|
-
|
86
|
+
result.columns.map.with_index do |column_name, index|
|
87
|
+
column_type_class = result.column_types[column_name]
|
88
|
+
|
89
|
+
column_type =
|
90
|
+
if column_type_class
|
91
|
+
ActiveRecordUtils::Types.find_name_for_type(column_type_class)
|
92
|
+
else
|
93
|
+
not_nil_value = result.rows.reduce(nil) do |acc, row|
|
94
|
+
column = row[index]
|
95
|
+
|
96
|
+
break column unless column.nil?
|
97
|
+
|
98
|
+
acc
|
99
|
+
end
|
100
|
+
|
101
|
+
fetch_column_type_from_value(not_nil_value)
|
102
|
+
end
|
88
103
|
|
89
104
|
{
|
90
105
|
name: column_name,
|
91
106
|
display_name: column_name.humanize,
|
92
|
-
column_type:
|
107
|
+
column_type: column_type,
|
93
108
|
is_array: column_type.class.to_s == 'ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array'
|
94
109
|
}
|
95
110
|
end
|
96
111
|
end
|
97
112
|
|
113
|
+
# @param value [Object]
|
114
|
+
# @return [String]
|
115
|
+
def fetch_column_type_from_value(value)
|
116
|
+
case value
|
117
|
+
when Integer
|
118
|
+
'integer'
|
119
|
+
when Float
|
120
|
+
'float'
|
121
|
+
when Time
|
122
|
+
'datetime'
|
123
|
+
when Date
|
124
|
+
'date'
|
125
|
+
when TrueClass, FalseClass
|
126
|
+
'boolean'
|
127
|
+
else
|
128
|
+
'string'
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
98
132
|
# @param query [Motor::Query]
|
99
133
|
# @param limit [Integer]
|
100
134
|
# @param variables_hash [Hash]
|
data/lib/motor/resources.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Motor
|
4
4
|
module Resources
|
5
|
-
RESOURCE_ATTRS = %w[display_name display_column icon custom_sql visible].freeze
|
5
|
+
RESOURCE_ATTRS = %w[display_name display_column icon custom_sql visible display_primary_key].freeze
|
6
6
|
COLUMN_ATTRS = %w[name display_name column_type access_type default_value reference virtual format].freeze
|
7
7
|
ASSOCIATION_ATTRS = %w[name display_name model_name icon visible foreign_key primary_key options virtual
|
8
8
|
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-e5afce0ea81ef4505dc5.css.gz": "main-e5afce0ea81ef4505dc5.css.gz",
|
2605
|
+
"main-e5afce0ea81ef4505dc5.js.LICENSE.txt": "main-e5afce0ea81ef4505dc5.js.LICENSE.txt",
|
2606
|
+
"main-e5afce0ea81ef4505dc5.js.gz": "main-e5afce0ea81ef4505dc5.js.gz",
|
2607
|
+
"main.css": "main-e5afce0ea81ef4505dc5.css",
|
2608
|
+
"main.js": "main-e5afce0ea81ef4505dc5.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.15
|
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-10-
|
11
|
+
date: 2021-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord-filter
|
@@ -130,6 +130,7 @@ files:
|
|
130
130
|
- app/controllers/motor/run_queries_controller.rb
|
131
131
|
- app/controllers/motor/schema_controller.rb
|
132
132
|
- app/controllers/motor/send_alerts_controller.rb
|
133
|
+
- app/controllers/motor/sessions_controller.rb
|
133
134
|
- app/controllers/motor/tags_controller.rb
|
134
135
|
- app/controllers/motor/ui_controller.rb
|
135
136
|
- app/jobs/motor/alert_sending_job.rb
|
@@ -1524,8 +1525,8 @@ files:
|
|
1524
1525
|
- ui/dist/icons/zoom-money.svg.gz
|
1525
1526
|
- ui/dist/icons/zoom-out.svg.gz
|
1526
1527
|
- ui/dist/icons/zoom-question.svg.gz
|
1527
|
-
- ui/dist/main-
|
1528
|
-
- ui/dist/main-
|
1528
|
+
- ui/dist/main-e5afce0ea81ef4505dc5.css.gz
|
1529
|
+
- ui/dist/main-e5afce0ea81ef4505dc5.js.gz
|
1529
1530
|
- ui/dist/manifest.json
|
1530
1531
|
homepage:
|
1531
1532
|
licenses:
|
Binary file
|