motor-admin 0.2.11 → 0.2.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a5b90096b26ecbc08a8db9eab674f5eb73968cbd3e67fef43c476142f75543e
4
- data.tar.gz: fba671589698de0216d59280c9935f940705d12c837808beed32e5de64dec443
3
+ metadata.gz: 0254bb1cf5ab3176c1c2e923ad755e1f6e445da757aa7981b93b127cb5757c57
4
+ data.tar.gz: b8c3a27811eb765056a67ffd9f1cb35fbc374b810be25cfa1de2f9791764f162
5
5
  SHA512:
6
- metadata.gz: 64046834ea3379dc2e79b1261b985fff168c5c52d19cd2540b6e951d0d669816a78fa21ac544a9cf4b82f81425f73917db39430e42b04d12db66279a3c159a62
7
- data.tar.gz: 22c5025d749429478eb6f2d2d74a2264cbe5153a42b32b6cb2986ed1d694714cfce007a8751cea224748e7521ee5efe40f1ff06531d185e475b8e2a0fe58dce6
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) | ⭐ [Stargathers](https://github.com/omohokcoj/motor-admin/stargazers)
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
  [![Admin Panel](https://user-images.githubusercontent.com/5418788/119318538-1f30e300-bc82-11eb-94a4-107c31c93b13.png)](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
  ![Resource settings](https://user-images.githubusercontent.com/5418788/119318569-2a840e80-bc82-11eb-9ba3-f3964eb6f997.png)
@@ -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/omohokcoj/motor-admin/blob/master/guides/customizing_resource_table.md)
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/omohokcoj/motor-admin/blob/master/guides/building_custom_forms.md)
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/omohokcoj/motor-admin/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.
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/omohokcoj/motor-admin/blob/master/LICENSE).
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
- render json: {
14
- data: Motor::ApiQuery::BuildJson.call(@resources, params, current_ability),
15
- meta: Motor::ApiQuery::BuildMeta.call(@resources, params)
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
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Motor
4
+ class SessionsController < ApiBaseController
5
+ skip_authorization_check
6
+
7
+ def destroy
8
+ session.clear
9
+
10
+ head :ok
11
+ end
12
+ end
13
+ end
@@ -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
@@ -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:
@@ -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/omohokcoj/motor-admin'
153
+ path: 'https://github.com/motor-admin/motor-admin-rails'
154
154
  }].to_json)
155
155
  end
156
156
 
@@ -21,6 +21,7 @@ module Motor
21
21
  'text' => 'string',
22
22
  'citext' => 'string',
23
23
  'jsonb' => 'json',
24
+ 'bool' => 'boolean',
24
25
  'timestamp' => 'datetime'
25
26
  }.freeze
26
27
 
@@ -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
 
@@ -76,7 +76,8 @@ module Motor
76
76
  actions: BuildSchema::Defaults.actions,
77
77
  tabs: BuildSchema::Defaults.tabs,
78
78
  custom_sql: nil,
79
- visible: true
79
+ visible: true,
80
+ display_primary_key: true
80
81
  }.with_indifferent_access
81
82
  end
82
83
 
@@ -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
- column_type = result.column_types[column_name]
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: ActiveRecordUtils::Types.find_name_for_type(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]
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Motor
4
- VERSION = '0.2.11'
4
+ VERSION = '0.2.15'
5
5
  end
@@ -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-192e078f9e813b1ffe93.css.gz": "main-192e078f9e813b1ffe93.css.gz",
2605
- "main-192e078f9e813b1ffe93.js.LICENSE.txt": "main-192e078f9e813b1ffe93.js.LICENSE.txt",
2606
- "main-192e078f9e813b1ffe93.js.gz": "main-192e078f9e813b1ffe93.js.gz",
2607
- "main.css": "main-192e078f9e813b1ffe93.css",
2608
- "main.js": "main-192e078f9e813b1ffe93.js"
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.11
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-19 00:00:00.000000000 Z
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-192e078f9e813b1ffe93.css.gz
1528
- - ui/dist/main-192e078f9e813b1ffe93.js.gz
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: