motor-admin 0.4.26 → 0.4.27

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: c3d3f74d751d9aab63f2752c05ce5e2505211f1fc9f5a1e70d261e12f6bc2717
4
- data.tar.gz: 2635bb819b6c3914e9a043322b0e9796401c5c094b818aa396e2a712868ef0b5
3
+ metadata.gz: dbb9e18046dc319e11398a365ce9faaf8e0d657746fd527490c87f97b5ac9839
4
+ data.tar.gz: c2e675d3a0fec9b9a42ea7321e50f3499f2b43a9aa9296a60a0ee1531144b84c
5
5
  SHA512:
6
- metadata.gz: b271b04762f0fcf0e123a7eb1275bd08c94e99d3e6c5cf4cc37282ccc05934afaf05dc428c2e0a62db4bdd80b014a1f4f100329a4c7789c604ebaf8abc689b5a
7
- data.tar.gz: bd88869c1cd00d8e655f7b4169da380e1b649e5f0f128c9a95adf6a86438c433e09b2f666deaa7ae25b51ef8b593a9f66369d79ea24d2f0bc682c326d7e8f993
6
+ metadata.gz: a67eea46969271dd1b8337f84ac0679ffc8fcd436d6fd7990650f305b2ac04086d8ae4a2e8fe1d1964fb62a8c1d715f90e3952a4f71ae080721a1aa04ceb4183
7
+ data.tar.gz: 9bb77c00bc11de56484cbd5357574df5816421624d994ee8f116cdd4dfdfc2e018fe94e58eb0fd651bc7dbe4370014473e7056d37a3209711c503760dff8eb57
@@ -20,6 +20,8 @@ module Motor
20
20
  private
21
21
 
22
22
  def render_result
23
+ authorize_queries!(@query)
24
+
23
25
  query_result = Queries::RunQuery.call(@query, variables_hash: variables_params.to_unsafe_h,
24
26
  limit: params[:limit].presence,
25
27
  filters: filter_params)
@@ -31,6 +33,12 @@ module Motor
31
33
  end
32
34
  end
33
35
 
36
+ def authorize_queries!(query)
37
+ query.sql_body.to_s.scan(/query_\d+/).each do |name|
38
+ Motor::Query.accessible_by(current_ability).find(name.split('_').last)
39
+ end
40
+ end
41
+
34
42
  def current_user_variables
35
43
  return {} unless current_user
36
44
 
@@ -0,0 +1,340 @@
1
+ ja:
2
+ motor:
3
+ action_has_been_applied: アクションが適用されました
4
+ action_has_failed_with_code: アクションが失敗しました コード
5
+ action_type: アクションタイプ
6
+ actions: アクション
7
+ add: 追加
8
+ add_action: アクションを追加
9
+ add_alert: アラートを追加
10
+ add_column: 列を追加
11
+ add_dashboard: ダッシュボードを追加
12
+ add_field: フィールドを追加
13
+ add_filter: フィルターを追加
14
+ add_form: フォームを追加
15
+ add_group: グループを追加
16
+ add_item: アイテムを追加
17
+ add_link: リンクを追加
18
+ add_query: クエリを追加
19
+ add_scope: スコープを追加
20
+ add_tab: タブを追加
21
+ adjust_form: フォームを調整
22
+ adjust_fields: フィールドを調整
23
+ alert_email_has_been_sent: アラートメールが送信されました
24
+ alert_has_been_activated: アラートが有効化されました
25
+ alert_has_been_disabled: アラートが無効化されました
26
+ alert_has_been_saved: アラートが保存されました
27
+ alert_name: アラート名
28
+ alerts: アラート
29
+ all: すべて
30
+ all_resources: すべてのリソース
31
+ and: そして
32
+ api_path: APIパス
33
+ api_request: APIリクエスト
34
+ apply: 適用
35
+ are_you_sure: 本当によろしいですか?
36
+ associations: 関連付け
37
+ bar_chart: 棒グラフ
38
+ base: 基本
39
+ boolean: 真理値型
40
+ build_custom_form: カスタムフォームを作成
41
+ cancel: キャンセル
42
+ cents: セント
43
+ checkbox: チェックボックス
44
+ clear_all: すべてクリア
45
+ clear_selection: 選択をクリア
46
+ close: 閉じる
47
+ close_editor: エディターを閉じる
48
+ close_settings: 設定を閉じる
49
+ close_variables: 変数を閉じる
50
+ columns: 列
51
+ contains: 含む
52
+ create: 作成
53
+ currency: 通貨
54
+ dashboard: ダッシュボード
55
+ dashboard_has_been_saved: ダッシュボードが保存されました
56
+ dashboard_title: ダッシュボードタイトル
57
+ dashboards: ダッシュボード
58
+ date: 日付
59
+ date_and_time: 日時
60
+ decimal: 小数
61
+ default: デフォルト
62
+ default_value: 初期値
63
+ describe_this_alert_optional: このアラートの説明 (オプション)
64
+ describe_your_dashboard_optional: ダッシュボードの説明 (オプション)
65
+ describe_your_form_optional: フォームの説明 (オプション)
66
+ describe_your_query_optional: クエリの説明 (オプション)
67
+ description: 説明
68
+ deselect_all: 全て選択解除
69
+ details: 詳細
70
+ disable: 無効化
71
+ display_as: 表示形式
72
+ edit: 編集
73
+ edit_sql: SQLを編集
74
+ edit_markdown: マークダウンを編集
75
+ emails: メール
76
+ ends_with: で終わる
77
+ equal_to: 等しい
78
+ every_day_at_hh_mm: 毎日 HH:mm に...
79
+ excludes: 除外
80
+ field_is_not_a_number: '%{field} は数値ではありません'
81
+ field_is_required: '%{field} は必須です'
82
+ field_list_cant_be_empty: "%{field} リストを空にすることはできません"
83
+ field_must_be_exactly_in_length: '%{field} の長さは %{length} でなければなりません'
84
+ field_must_be_less_in_length: '%{field} の長さは %{length} 未満でなければなりません'
85
+ field_must_be_more_in_length: '%{field} の長さは %{length} より大きくなければなりません'
86
+ field_name: フィールド名
87
+ field_value_does_not_match_pattern: '%{field} の値が %{pattern} と一致しません'
88
+ file: ファイル
89
+ filter: フィルター
90
+ filters: フィルター
91
+ form: フォーム
92
+ form_has_been_saved: フォームが保存されました
93
+ form_has_been_submitted_successfully: フォームが正常に送信されました
94
+ form_name: フォーム名
95
+ forms: フォーム
96
+ funnel: ファンネル
97
+ greater_or_equal: 以上
98
+ greater_than: より大きい
99
+ greater_than_or_equal_to: 以上
100
+ group_name: グループ名
101
+ has_been_created: が作成されました
102
+ has_been_removed_succesfully: が正常に削除されました
103
+ has_been_updated: が更新されました
104
+ hello_admin: こんにちは、管理者さん👋
105
+ hidden: 非表示
106
+ image: 画像
107
+ includes: 含む
108
+ input_type: 入力タイプ
109
+ integer: 整数
110
+ interval: 間隔
111
+ is: は
112
+ is_not: ではない
113
+ items_have_been_removed: 件のアイテムが削除されました
114
+ items_will_be_removed: '%{count} 件のアイテムが削除されます'
115
+ json: JSON
116
+ label: 通貨
117
+ less_or_equal: 以下
118
+ less_than: 未満
119
+ less_than_or_equal_to: 以下
120
+ line_chart: 線グラフ
121
+ link_name: リンク名
122
+ links: リンク
123
+ load_initial_data: 初期データをロード
124
+ loading: 読み込み中...
125
+ looks_like_you_are_new_here: 初めてですね🙃
126
+ markdown: マークダウン
127
+ method: メソッド
128
+ method_call: メソッド呼び出し
129
+ multiple: 複数
130
+ name: 名前
131
+ new_alert: 新しいアラート
132
+ new_dashboard: 新しいダッシュボード
133
+ new_form: 新しいフォーム
134
+ new_query: 新しいクエリ
135
+ no_data: データがありません
136
+ not_found: 見つかりませんでした
137
+ number: 数値
138
+ ok: OK
139
+ options_separated_with_new_line_or_comma: 改行またはカンマで区切られたオプション
140
+ or: または
141
+ other_than: 以外
142
+ param_name: パラメータ名
143
+ password: パスワード
144
+ path: パス
145
+ percent: パーセント
146
+ pie_chart: 円グラフ
147
+ queries: クエリ
148
+ query: クエリ
149
+ query_has_been_saved: クエリが保存されました
150
+ query_name: クエリ名
151
+ query_not_selected: クエリが選択されていません
152
+ query_revisions: クエリリビジョン
153
+ read_only: 読み取り専用
154
+ read_write: 読み書き
155
+ reference: 参照
156
+ reference_resource: リソースを参照
157
+ remove: 削除
158
+ reports: レポート
159
+ request_param: リクエストパラメータ
160
+ required: 必須
161
+ resource_filters: '%{resource} フィルター'
162
+ resource_settings: '%{resource} 設定'
163
+ resources: リソース
164
+ resubmit: 再送信
165
+ revert: 元に戻す
166
+ revision_has_been_applied: リビジョンが適用されました
167
+ revisions: リビジョン
168
+ richtext: リッチテキスト
169
+ row_chart: 行グラフ
170
+ save: 保存
171
+ save_and_create_new: 保存して新規作成
172
+ save_as_new: 新規として保存
173
+ save_dashboard: ダッシュボードを保存
174
+ save_form: フォームを保存
175
+ save_query: クエリを保存
176
+ scopes: スコープ
177
+ search: 検索
178
+ search_placeholder: 検索...
179
+ search_query: 検索クエリ
180
+ select: 選択
181
+ select_alert_tags: アラートタグを選択
182
+ select_dashboard: ダッシュボードを選択
183
+ select_dashboard_tags: ダッシュボードタグを選択
184
+ select_form: フォームを選択
185
+ select_form_tags: フォームタグを選択
186
+ select_options: オプションを選択
187
+ select_placeholder: 選択...
188
+ select_query: クエリを選択
189
+ select_query_tags: クエリタグを選択
190
+ select_resource_placeholder: リソースを選択...
191
+ selected_item_has_been_removed: 選択したアイテムが削除されました
192
+ selected_item_will_be_removed: 選択したアイテムが削除されます
193
+ selected_item_will_be_removed_are_you_sure: 選択したアイテムが削除されます。よろしいですか?
194
+ send_empty: 空で送信しますか?
195
+ send_now: 今すぐ送信
196
+ send_to: 送信先
197
+ set_tags: タグを設定
198
+ settings: 設定
199
+ should_be_a_valid_json: '%{field} は有効なJSONでなければなりません'
200
+ should_be_error_constraint: '%{field} は %{error} %{constraint} でなければなりません'
201
+ stacked_bars: 積み上げ棒グラフ
202
+ starts_with: で始まる
203
+ submit: 送信
204
+ tab_type: タブタイプ
205
+ table: テーブル
206
+ tabs: タブ
207
+ tags: タグ
208
+ text: テキスト
209
+ textarea: テキストエリア
210
+ timezone: タイムゾーン
211
+ title: タイトル
212
+ type: 型
213
+ unable_to_load_form_data: フォームデータの読み込みに失敗しました
214
+ unable_to_remove_item: アイテムを削除できませんでした
215
+ unable_to_remove_items: アイテムを削除できませんでした
216
+ unable_to_send_email: メールを送信できませんでした
217
+ unable_to_submit_form: フォームを送信できませんでした
218
+ unit: 単位
219
+ value: 値
220
+ values_axis: 値の軸
221
+ variables: 変数
222
+ visibility: 表示設定
223
+ visualization: 可視化
224
+ write_only: 書き込み専用
225
+ long_text: 長文テキスト
226
+ percentage: パーセンテージ
227
+ change: 変更
228
+ chart: チャート
229
+ tag: タグ
230
+ link: リンク
231
+ color: 色
232
+ link_text: リンクテキスト
233
+ copied_to_the_clipboard: クリップボードにコピーしました
234
+ queries_can_contain_variable_via_syntax_html: "クエリでは <code>{{variable}}</code> 構文を使って変数を埋め込むことができます:"
235
+ syntax_is_used_for_if_and_if_not_conditions_html: "<code>{{#variable}} ... {{/variable}}</code> と <code>{{^variable}} ... {{variable}}</code> 構文は、それぞれ <code>if</code> と <code>if not</code> 条件で使用されます:"
236
+ current_user_variables_are_always_passed_explicitly_and_can_he_used_html: "<code>{{current_user_id}}</code> と <code>{{current_user_email}}</code> 変数は常に明示的に渡されるため、特定のユーザーにどのデータを表示するかを決めるのに使用できます:"
237
+ create_new: 新規作成
238
+ conditional: 条件付き
239
+ condition: 条件
240
+ field: フィールド
241
+ empty: 空
242
+ not_empty: 空ではない
243
+ general: 一般
244
+ run: 実行
245
+ use_default: デフォルトを使用
246
+ query_editor: クエリエディター
247
+ polymorphic: 多態
248
+ foreign_key: 外部キー
249
+ primary_key: 主キー
250
+ through: 経由
251
+ source: ソース
252
+ resource: リソース
253
+ add_association: 関連付けを追加
254
+ there_are_unsaved_changes_from: "%{timestamp} から未保存の変更があります"
255
+ clear: クリア
256
+ restore: 復元
257
+ more: 詳細
258
+ add_text: テキストを追加
259
+ edit_text: テキストを編集
260
+ open_in_markdown_editor: マークダウンエディターで開く
261
+ activate: 有効化
262
+ load_existing_options_from_database: データベースから既存のオプションをロード
263
+ add_database: データベースを追加
264
+ audio: 音声
265
+ video: 動画
266
+ display_column: 表示列
267
+ not_authorized_to_perform_action: この操作を実行する権限がありません。
268
+ upload: アップロード
269
+ there_is_nothing_here_yet: 表示する項目はまだありません🤷‍♂️
270
+ is_null: nullです
271
+ is_not_null: nullではありません
272
+ split_tags_by: タグの区切り文字
273
+ do_not_split: 区切らない
274
+ semicolon: セミコロン
275
+ hyphen: ハイフン
276
+ comma: カンマ
277
+ slash: スラッシュ
278
+ searchable_columns: 検索可能な列
279
+ validate: 検証
280
+ error_message: エラーメッセージ
281
+ validation_regexp: 検証用の正規表現
282
+ regexp: 正規表現
283
+ message: メッセージ
284
+ should_be_a_valid_regexp: 有効な正規表現文字列でなければなりません
285
+ order_by: 並び替え
286
+ ascending: 昇順
287
+ descending: 降順
288
+ url: URL
289
+ expand: 展開
290
+ add_api: APIを追加
291
+ on_collection: コレクション上
292
+ association: 関連付け
293
+ action_has_been_removed: このアクションは削除されました
294
+ every_5_seconds: 5秒ごと
295
+ every_30_seconds: 30秒ごと
296
+ every_minute: 1分ごと
297
+ every_5_minutes: 5分ごと
298
+ do_not_refresh: 更新しない
299
+ html: HTML
300
+ edit_html: HTMLを編集
301
+ there_are_unsaved_changes_close_form: "未保存の変更があります。フォームを閉じますか?"
302
+ send_file_url: ファイルURLを送信
303
+ rating: 評価
304
+ total: 合計
305
+ radar_chart: レーダーチャート
306
+ show_on_table: テーブルに表示
307
+ map: マップ
308
+ audits: 監査ログ
309
+ nothing_to_show_here_yet: まだ何も表示する内容がありません🤷
310
+ internal: 内部/匿名
311
+ updated: 更新済み
312
+ created: 作成済み
313
+ deleted: 削除済み
314
+ sign_out: ログアウト
315
+ header: ヘッダー
316
+ user_dropdown: ユーザードロップダウン
317
+ add_condition: 条件を追加
318
+ remove_condition: 条件を削除
319
+ unable_to_send_alert: アラートを送信できませんでした
320
+ send_via: 送信経路
321
+ download: ダウンロード
322
+ alert: アラート
323
+ downloading: ダウンロード中...
324
+ display_id: 表示ID
325
+ display_settings: 表示設定
326
+ sql: SQL
327
+ api: API
328
+ variable_name: 変数名
329
+ add_variable: 変数を追加
330
+ notes: 備考
331
+ new_mention_for: "%{resource} の新しいメンション"
332
+ user_mentioned_you_with_note: "%{user} があなたにメンションしました:\n%{note}"
333
+ edit_note: 備考を編集
334
+ create_reminder: リマインダーを作成
335
+ new_reminder_for: "%{resource} の新しいリマインダー"
336
+ reminder_has_been_removed: リマインダーが削除されました
337
+ note_has_been_removed: 備考が削除されました
338
+ schedule_at: 予定日時
339
+ kanban_columns: カンバン列
340
+ kanban_card_columns: カンバンカード列
@@ -15,6 +15,7 @@ module Motor
15
15
  RESERVED_VARIABLES = %w[current_user_id current_user_email].freeze
16
16
 
17
17
  DATABASE_URL_VARIABLE_SUFFIX = '_database_url'
18
+ QUERY_VARIABLE_PREFIX = 'query_'
18
19
 
19
20
  DB_LINK_VALIDATE_REGEXP = /(.*?)\s*\{\{\s*\w+_database_url\s*\}\}/i.freeze
20
21
 
@@ -188,6 +189,7 @@ module Motor
188
189
  variables.map do |variable_name, value|
189
190
  [value].flatten.map do |val|
190
191
  val = fetch_variable_database_url(variable_name) if variable_name.ends_with?(DATABASE_URL_VARIABLE_SUFFIX)
192
+ val = fetch_query_data(variable_name) if variable_name.starts_with?(QUERY_VARIABLE_PREFIX)
191
193
 
192
194
  ActiveRecord::Relation::QueryAttribute.new(
193
195
  variable_name,
@@ -206,6 +208,15 @@ module Motor
206
208
  raise UnknownDatabase, "#{class_name} database is not defined"
207
209
  end
208
210
 
211
+ def fetch_query_data(variable_name)
212
+ query = Motor::Query.find(variable_name.split('_').last)
213
+
214
+ result = Motor::Queries::RunQuery.call(query)
215
+ columns = result.columns.pluck(:name)
216
+
217
+ result.data.map { |row| columns.zip(row).to_h }.to_json
218
+ end
219
+
209
220
  # @param array [Array]
210
221
  # @return [Array]
211
222
  def normalize_statement_for_sql(statement)
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  namespace :motor do
4
- desc 'Update configs/motor.yml file'
4
+ desc 'Create migratione and add route'
5
5
 
6
6
  task install: :environment do
7
7
  Rails::Generators.invoke('motor:install')
8
8
  end
9
9
 
10
+ desc 'Update configs/motor.yml file'
11
+
10
12
  task dump: :environment do
11
13
  Motor::Configs::WriteToFile.write_with_lock
12
14
 
@@ -21,6 +23,8 @@ namespace :motor do
21
23
  puts '✅ configs have been loaded from configs/motor.yml'
22
24
  end
23
25
 
26
+ desc 'Reload configs from configs/motor.yml file'
27
+
24
28
  task reload: :environment do
25
29
  ActiveRecord::Base.transaction do
26
30
  Motor::Configs.clear
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.4.26'
4
+ VERSION = '0.4.27'
5
5
  end
@@ -3964,9 +3964,9 @@
3964
3964
  "images/layers-2x.png": "images/layers-2x.png",
3965
3965
  "images/layers.png": "images/layers.png",
3966
3966
  "images/marker-icon.png": "images/marker-icon.png",
3967
- "main-3b866105d1b5846018e0.css.gz": "main-3b866105d1b5846018e0.css.gz",
3968
- "main-3b866105d1b5846018e0.js.LICENSE.txt": "main-3b866105d1b5846018e0.js.LICENSE.txt",
3969
- "main-3b866105d1b5846018e0.js.gz": "main-3b866105d1b5846018e0.js.gz",
3970
- "main.css": "main-3b866105d1b5846018e0.css",
3971
- "main.js": "main-3b866105d1b5846018e0.js"
3967
+ "main-60caa963812c952cdd66.css.gz": "main-60caa963812c952cdd66.css.gz",
3968
+ "main-60caa963812c952cdd66.js.LICENSE.txt": "main-60caa963812c952cdd66.js.LICENSE.txt",
3969
+ "main-60caa963812c952cdd66.js.gz": "main-60caa963812c952cdd66.js.gz",
3970
+ "main.css": "main-60caa963812c952cdd66.css",
3971
+ "main.js": "main-60caa963812c952cdd66.js"
3972
3972
  }
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.4.26
4
+ version: 0.4.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pete Matsyburka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-04 00:00:00.000000000 Z
11
+ date: 2024-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ar_lazy_preload
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '5.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: csv
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
83
97
  description: |
84
98
  Motor Admin allows to create a flexible admin panel with writing less code.
85
99
  All customizations to the admin panel can be made directly in the UI without
@@ -165,6 +179,7 @@ files:
165
179
  - config/locales/el.yml
166
180
  - config/locales/en.yml
167
181
  - config/locales/es.yml
182
+ - config/locales/ja.yml
168
183
  - config/locales/pt.yml
169
184
  - config/routes.rb
170
185
  - lib/generators/motor/install_generator.rb
@@ -2235,8 +2250,8 @@ files:
2235
2250
  - ui/dist/images/layers-2x.png
2236
2251
  - ui/dist/images/layers.png
2237
2252
  - ui/dist/images/marker-icon.png
2238
- - ui/dist/main-3b866105d1b5846018e0.css.gz
2239
- - ui/dist/main-3b866105d1b5846018e0.js.gz
2253
+ - ui/dist/main-60caa963812c952cdd66.css.gz
2254
+ - ui/dist/main-60caa963812c952cdd66.js.gz
2240
2255
  - ui/dist/manifest.json
2241
2256
  homepage:
2242
2257
  licenses:
@@ -2265,7 +2280,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
2265
2280
  - !ruby/object:Gem::Version
2266
2281
  version: '0'
2267
2282
  requirements: []
2268
- rubygems_version: 3.4.10
2283
+ rubygems_version: 3.5.9
2269
2284
  signing_key:
2270
2285
  specification_version: 4
2271
2286
  summary: Low-code Admin panel and Business intelligence