motor-admin 0.4.26 → 0.4.27

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: 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