avo 2.27.2.pre.pr1606 → 2.28.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of avo might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 161deecc8d313c1254a3be834d954d88d6a20b5d9d9ba68f17b38eed7eb05de7
4
- data.tar.gz: 9f78a084bf9129ed2789c412ed9836d940f372563d8a0ae715df52e3edce0874
3
+ metadata.gz: 793c8545f234434ece6d95719bbc92501755c47c27515996bae6bd47c8668da8
4
+ data.tar.gz: 528f58dc08e61cdcb2d9d2bcc48b9341793c47d44fdc7b71c9999318aef845d0
5
5
  SHA512:
6
- metadata.gz: 3dd2b783c45b8d836c0715e8677dbcd253d94ac9f59ef3ee9f230464564915bc2730b35e77e2a60626db2fe0131fdbb9f9b467205e66528926392bc5e6376b73
7
- data.tar.gz: 4cc9d8b35be4eebec0323721dce5573ba74e5a2dc2bbbbf16d0a2c0634ecc21b1b20f9ef3e272a3eaf50733694c62437905d94fdd0578cef2032df087474152f
6
+ metadata.gz: 90c629713202b14315db0975c1ebe5cc34c2c5f8f9c9e2509f9d6f05da199ee8b645cc55cc4da6f8a78c4197c59b3c5207b4d00432516698fa068f9490bfb5d8
7
+ data.tar.gz: ea1c21161d42a030d788a0cc3d92dccf5c551de9f466c2cc830a5035d9d1601fc2aee8ec83f7a1c1583060b01236b9adfad3433cd3512a7c04be7768cee3eeb5
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- avo (2.27.2.pre.pr1606)
4
+ avo (2.28.0)
5
5
  actionview (>= 6.0)
6
6
  active_link_to
7
7
  activerecord (>= 6.0)
@@ -85,7 +85,7 @@ GEM
85
85
  zeitwerk (~> 2.3)
86
86
  acts-as-taggable-on (9.0.1)
87
87
  activerecord (>= 6.0, < 7.1)
88
- acts_as_list (1.0.4)
88
+ acts_as_list (1.1.0)
89
89
  activerecord (>= 4.2)
90
90
  addressable (2.8.1)
91
91
  public_suffix (>= 2.0.2, < 6.0)
@@ -124,7 +124,7 @@ GEM
124
124
  parser (>= 2.4)
125
125
  smart_properties
126
126
  bindex (0.8.1)
127
- bootsnap (1.15.0)
127
+ bootsnap (1.16.0)
128
128
  msgpack (~> 1.2)
129
129
  brakeman (5.4.0)
130
130
  builder (3.2.4)
@@ -141,6 +141,7 @@ GEM
141
141
  regexp_parser (>= 1.5, < 3.0)
142
142
  xpath (~> 3.2)
143
143
  chartkick (4.2.1)
144
+ childprocess (4.1.0)
144
145
  concurrent-ruby (1.2.0)
145
146
  countries (4.2.3)
146
147
  i18n_data (~> 0.16.0)
@@ -157,7 +158,7 @@ GEM
157
158
  database_cleaner-core (~> 2.0.0)
158
159
  database_cleaner-core (2.0.1)
159
160
  date (3.3.3)
160
- devise (4.8.1)
161
+ devise (4.9.0)
161
162
  bcrypt (~> 3.0)
162
163
  orm_adapter (~> 0.1)
163
164
  railties (>= 4.1.0)
@@ -254,7 +255,7 @@ GEM
254
255
  mini_magick (4.12.0)
255
256
  mini_mime (1.1.2)
256
257
  mini_portile2 (2.8.1)
257
- minitest (5.17.0)
258
+ minitest (5.18.0)
258
259
  msgpack (1.5.6)
259
260
  multi_xml (0.6.0)
260
261
  net-imap (0.3.4)
@@ -267,18 +268,18 @@ GEM
267
268
  net-smtp (0.3.3)
268
269
  net-protocol
269
270
  nio4r (2.5.8)
270
- nokogiri (1.14.2)
271
+ nokogiri (1.13.10)
271
272
  mini_portile2 (~> 2.8.0)
272
273
  racc (~> 1.4)
273
- nokogiri (1.14.2-x86_64-linux)
274
+ nokogiri (1.13.10-x86_64-linux)
274
275
  racc (~> 1.4)
275
276
  orm_adapter (0.5.0)
276
277
  pagy (6.0.2)
277
278
  parallel (1.22.1)
278
279
  parser (3.2.0.0)
279
280
  ast (~> 2.4.1)
280
- pg (1.4.5)
281
- prefixed_ids (1.3.0)
281
+ pg (1.4.6)
282
+ prefixed_ids (1.4.0)
282
283
  hashids (>= 1.0.0, < 2.0.0)
283
284
  rails (>= 6.0.0)
284
285
  public_suffix (5.0.1)
@@ -287,7 +288,7 @@ GEM
287
288
  pundit (2.2.0)
288
289
  activesupport (>= 3.0.0)
289
290
  racc (1.6.2)
290
- rack (2.2.6.2)
291
+ rack (2.2.6.3)
291
292
  rack-test (2.0.2)
292
293
  rack (>= 1.3)
293
294
  rails (6.1.7.2)
@@ -332,7 +333,7 @@ GEM
332
333
  rb-fsevent (0.11.1)
333
334
  rb-inotify (0.10.1)
334
335
  ffi (~> 1.0)
335
- redis (4.8.0)
336
+ redis (4.8.1)
336
337
  regexp_parser (2.7.0)
337
338
  responders (3.0.1)
338
339
  actionpack (>= 5.0)
@@ -378,10 +379,10 @@ GEM
378
379
  ruby-vips (2.1.4)
379
380
  ffi (~> 1.12)
380
381
  rubyzip (2.3.2)
381
- selenium-webdriver (4.8.1)
382
+ selenium-webdriver (4.1.0)
383
+ childprocess (>= 0.5, < 5.0)
382
384
  rexml (~> 3.2, >= 3.2.5)
383
- rubyzip (>= 1.2.2, < 3.0)
384
- websocket (~> 1.0)
385
+ rubyzip (>= 1.2.2)
385
386
  simple_po_parser (1.1.6)
386
387
  simplecov (0.22.0)
387
388
  docile (~> 1.1)
@@ -412,7 +413,7 @@ GEM
412
413
  test-prof (1.0.10)
413
414
  thor (1.2.1)
414
415
  timeout (0.3.0)
415
- turbo-rails (1.3.3)
416
+ turbo-rails (1.4.0)
416
417
  actionpack (>= 6.0.0)
417
418
  activejob (>= 6.0.0)
418
419
  railties (>= 6.0.0)
@@ -438,7 +439,6 @@ GEM
438
439
  addressable (>= 2.8.0)
439
440
  crack (>= 0.3.2)
440
441
  hashdiff (>= 0.4.0, < 2.0.0)
441
- websocket (1.2.9)
442
442
  websocket-driver (0.7.5)
443
443
  websocket-extensions (>= 0.1.0)
444
444
  websocket-extensions (0.1.5)
data/README.md CHANGED
@@ -72,19 +72,33 @@ Please read the [RELEASE.MD](./RELEASE.MD)
72
72
 
73
73
  # ✨ [Contributors](https://avohq.io/contributors)
74
74
 
75
- <a href="https://github.com/avo-hq/avo/graphs/contributors">
75
+ <a href="https://avohq.io/contributors">
76
76
  <img src="https://contrib.rocks/image?repo=avo-hq/avo" />
77
77
  </a>
78
78
  <!-- https://contrib.rocks -->
79
79
 
80
- # 🥇 Business & Agency Sponsors
81
-
82
- <a href="https://equipetechnique.com/?utm_source=github&utm_medium=link&utm_campaign=avo_code_without_borders" target="_blank">
83
- <picture>
84
- <source media="(prefers-color-scheme: dark)" srcset="https://avohq.io/img/sponsors/ET-dark.jpeg">
85
- <img alt="Equipe Technique Busines Sponsor" src="https://avohq.io/img/sponsors/ET-light.jpeg" width="240px">
86
- </picture>
87
- </a>
80
+ # 🥇 Sponsors
81
+
82
+ <table>
83
+ <tr>
84
+ <td>
85
+ <a href="https://equipetechnique.com/?utm_source=github&utm_medium=link&utm_campaign=avo" target="_blank">
86
+ <picture>
87
+ <source media="(prefers-color-scheme: dark)" srcset="https://avohq.io/img/sponsors/ET-dark.jpeg">
88
+ <img alt="Equipe Technique Busines Sponsor" src="https://avohq.io/img/sponsors/ET-light.jpeg" width="180px">
89
+ </picture>
90
+ </a>
91
+ </td>
92
+ <td>
93
+ <a href="https://www.greenhats.com/?utm_source=github&utm_medium=link&utm_campaign=avo" target="_blank">
94
+ <picture>
95
+ <source media="(prefers-color-scheme: dark)" srcset="https://avohq.io/img/sponsors/greenhats-dark.png">
96
+ <img alt="Greenhats Start-up Sponsor" src="https://avohq.io/img/sponsors/greenhats-light.png" width="360px">
97
+ </picture>
98
+ </a>
99
+ </td>
100
+ </tr>
101
+ </table>
88
102
 
89
103
  [Become a sponsor ](https://github.com/sponsors/adrianthedev)
90
104
 
@@ -20,7 +20,7 @@
20
20
  </div>
21
21
  <div class="flex space-x-2">
22
22
  <div class="flex">
23
- <% if @resource.authorization.authorize_action(:download_attachments?, raise_exception: false) %>
23
+ <% if can_download_file? %>
24
24
  <%= a_link Rails.application.routes.url_helpers.rails_blob_path(file, only_path: true, disposition: :attachment),
25
25
  icon: 'heroicons/outline/download',
26
26
  color: :primary,
@@ -33,7 +33,7 @@
33
33
  <% end %>
34
34
  </div>
35
35
  <div>
36
- <% if @resource.authorization.authorize_action(:delete_attachments?, raise_exception: false) %>
36
+ <% if can_delete_file? %>
37
37
  <%= a_link destroy_path,
38
38
  icon: 'heroicons/outline/trash',
39
39
  color: :red,
@@ -2,8 +2,9 @@
2
2
 
3
3
  class Avo::Fields::Common::SingleFileViewerComponent < ViewComponent::Base
4
4
  include Avo::ApplicationHelper
5
+ include Avo::Fields::Concerns::FileAuthorization
5
6
 
6
- def initialize(file: nil, field:, resource:)
7
+ def initialize(field:, resource:, file: nil)
7
8
  @file = file
8
9
  @field = field
9
10
  @resource = resource
@@ -45,7 +46,7 @@ class Avo::Fields::Common::SingleFileViewerComponent < ViewComponent::Base
45
46
  record_persisted?
46
47
  end
47
48
 
48
- # If model is not persistent blob is automatically destroyed otherwise it can be "lost" on storage
49
+ # If model is not persistent blob is automatically destroyed otherwise it can be "lost" on storage
49
50
  def record_persisted?
50
51
  return true if @resource.model.persisted?
51
52
 
@@ -5,7 +5,7 @@
5
5
  </div>
6
6
  <% end %>
7
7
 
8
- <% if @resource.authorization.authorize_action(:upload_attachments?, raise_exception: false) %>
8
+ <% if can_upload_file? %>
9
9
  <%= @form.file_field @field.id,
10
10
  accept: @field.accept,
11
11
  data: @field.get_html(:data, view: view, element: :input),
@@ -14,5 +14,7 @@
14
14
  style: @field.get_html(:style, view: view, element: :input),
15
15
  class: "w-full"
16
16
  %>
17
+ <% else %>
18
+
17
19
  <% end %>
18
20
  <% end %>
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::Fields::FileField::EditComponent < Avo::Fields::EditComponent
4
+ include Avo::Fields::Concerns::FileAuthorization
4
5
  end
@@ -1,7 +1,7 @@
1
1
  <%= field_wrapper **field_wrapper_args, full_width: true do %>
2
2
  <%= render Avo::Fields::Common::FilesListViewerComponent.new(field: @field, resource: @resource) if @field.value.present? %>
3
3
 
4
- <% if @resource.authorization.authorize_action(:upload_attachments?, raise_exception: false) %>
4
+ <% if can_upload_file? %>
5
5
  <div class="mt-2">
6
6
  <%= @form.file_field @field.id,
7
7
  accept: @field.accept,
@@ -13,5 +13,7 @@
13
13
  class: "w-full"
14
14
  %>
15
15
  </div>
16
+ <% else %>
17
+
16
18
  <% end %>
17
19
  <% end %>
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::Fields::FilesField::EditComponent < Avo::Fields::EditComponent
4
+ include Avo::Fields::Concerns::FileAuthorization
4
5
  end
@@ -18,8 +18,8 @@ module Avo
18
18
  before_action :init_app
19
19
  before_action :check_avo_license
20
20
  before_action :set_resource_name
21
- before_action :set_authorization
22
21
  before_action :_authenticate!
22
+ before_action :set_authorization
23
23
  before_action :set_container_classes
24
24
  before_action :add_initial_breadcrumbs
25
25
  before_action :set_view
@@ -23,6 +23,8 @@ module Avo
23
23
  end
24
24
 
25
25
  def destroy
26
+ raise Avo::NotAuthorizedError.new unless authorized_to :delete
27
+
26
28
  attachment = ActiveStorage::Attachment.find(params[:attachment_id])
27
29
  path = resource_path(model: @model, resource: @resource)
28
30
 
@@ -34,5 +36,13 @@ module Avo
34
36
  redirect_back fallback_location: path, notice: t("avo.failed_to_find_attachment")
35
37
  end
36
38
  end
39
+
40
+ private
41
+
42
+ def authorized_to(action)
43
+ if @resource.authorization.authorize_action("#{action}_attachments?".to_sym, raise_exception: false)
44
+ @resource.authorization.authorize_action("#{action}_#{params[:attachment_name]}?", record: @model, raise_exception: false)
45
+ end
46
+ end
37
47
  end
38
48
  end
@@ -57,6 +57,8 @@ module Avo
57
57
  # - is_disabled?
58
58
 
59
59
  class BelongsToField < BaseField
60
+ include Avo::Fields::Concerns::UseResource
61
+
60
62
  attr_accessor :target
61
63
 
62
64
  attr_reader :polymorphic_as
@@ -79,6 +81,7 @@ module Avo
79
81
  @attach_scope = args[:attach_scope]
80
82
  @polymorphic_help = args[:polymorphic_help]
81
83
  @target = args[:target]
84
+ @use_resource = args[:use_resource] || nil
82
85
  end
83
86
 
84
87
  def searchable
@@ -222,6 +225,8 @@ module Avo
222
225
  end
223
226
 
224
227
  def target_resource
228
+ return use_resource if use_resource.present?
229
+
225
230
  if is_polymorphic?
226
231
  if value.present?
227
232
  return App.get_resource_by_model_name(value.class)
@@ -0,0 +1,31 @@
1
+ module Avo
2
+ module Fields
3
+ module Concerns
4
+ module FileAuthorization
5
+ extend ActiveSupport::Concern
6
+
7
+ delegate :authorization, to: :@resource
8
+ delegate :authorize_action, to: :authorization
9
+ delegate :id, :model, to: :@field
10
+
11
+ def can_upload_file?
12
+ authorize_file_action(:upload)
13
+ end
14
+
15
+ def can_delete_file?
16
+ authorize_file_action(:delete)
17
+ end
18
+
19
+ def can_download_file?
20
+ authorize_file_action(:download)
21
+ end
22
+
23
+ private
24
+
25
+ def authorize_file_action(action)
26
+ authorize_action("#{action}_attachments?", raise_exception: false) || authorize_action("#{action}_#{id}?", record: model, raise_exception: false)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,13 @@
1
+ module Avo
2
+ module Fields
3
+ module Concerns
4
+ module UseResource
5
+ extend ActiveSupport::Concern
6
+
7
+ def use_resource
8
+ App.get_resource @use_resource
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,6 +1,8 @@
1
1
  module Avo
2
2
  module Fields
3
3
  class HasBaseField < BaseField
4
+ include Avo::Fields::Concerns::UseResource
5
+
4
6
  attr_accessor :display
5
7
  attr_accessor :scope
6
8
  attr_accessor :attach_scope
@@ -27,10 +29,6 @@ module Avo
27
29
  @searchable && ::Avo::App.license.has_with_trial(:searchable_associations)
28
30
  end
29
31
 
30
- def use_resource
31
- App.get_resource @use_resource
32
- end
33
-
34
32
  def resource
35
33
  @resource || Avo::App.get_resource_by_model_name(@model.class)
36
34
  end
@@ -18,9 +18,12 @@ module Avo
18
18
  add_array_prop args, :suggestions
19
19
  add_string_prop args, :mode, nil
20
20
  add_string_prop args, :fetch_values_from
21
+ add_string_prop args, :fetch_labels
21
22
  end
22
23
 
23
24
  def field_value
25
+ return fetched_labels if @fetch_labels.present?
26
+
24
27
  return json_value if acts_as_taggable_on.present?
25
28
 
26
29
  value || []
@@ -81,6 +84,14 @@ module Avo
81
84
 
82
85
  private
83
86
 
87
+ def fetched_labels
88
+ if @fetch_labels.respond_to?(:call)
89
+ Avo::Hosts::ResourceRecordHost.new(block: @fetch_labels, resource: resource, record: model).handle
90
+ else
91
+ @fetch_labels
92
+ end
93
+ end
94
+
84
95
  def act_as_taggable_attribute(key)
85
96
  "#{key.singularize}_list="
86
97
  end
data/lib/avo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Avo
2
- VERSION = "2.27.2.pre.pr1606" unless const_defined?(:VERSION)
2
+ VERSION = "2.28.0" unless const_defined?(:VERSION)
3
3
  end
@@ -0,0 +1,126 @@
1
+ ---
2
+ ar:
3
+ avo:
4
+ action_ran_successfully: 'تم تنفيذ الأمر بنجاح!'
5
+ actions: أوامر
6
+ and_x_other_resources: و %{count} موارد أخرى
7
+ are_you_sure: هل أنت متأكد؟
8
+ are_you_sure_detach_item: هل أنت متأكد أنك تريد فصل هذا الـ٪{item}؟
9
+ are_you_sure_you_want_to_run_this_option: هل أنت متأكد أنك تريد تشغيل هذا الخيار؟
10
+ attach: ربط
11
+ attach_and_attach_another: ربط وربط آخر
12
+ attach_item: ربط %{item}
13
+ attachment_class_attached: '%{attachment_class} تم ربط'
14
+ attachment_class_detached: '%{attachment_class} تم فصل'
15
+ attachment_destroyed: تم حذف المرفق
16
+ cancel: إلغاء
17
+ choose_a_country: اختر دولة
18
+ choose_an_option: اختر خيارًا
19
+ choose_item: اختر %{item}
20
+ clear_value: مسح القيمة
21
+ click_to_reveal_filters: انقر لإظهار المرشحات
22
+ confirm: تأكيد
23
+ create_new_item: إنشاء %{item} جديد
24
+ dashboard: لوحة القيادة
25
+ dashboards: لوحات القيادة
26
+ delete: حذف
27
+ delete_file: حذف الملف
28
+ delete_item: حذف %{item}
29
+ detach_item: فصل %{item}
30
+ details: تفاصيل
31
+ download: تنزيل
32
+ download_file: تنزيل الملف
33
+ download_item: تنزيل %{item}
34
+ edit: تعديل
35
+ edit_item: تعديل %{item}
36
+ empty_dashboard_message: أضف بطاقات إلى هذه اللوحة
37
+ failed: فشل
38
+ failed_to_find_attachment: فشل في العثور على المرفق
39
+ failed_to_load: فشل التحميل
40
+ field_translations:
41
+ file:
42
+ one: ملف
43
+ other: ملفات
44
+ zero: ملفات
45
+ people:
46
+ one: شخص
47
+ other: أشخاص
48
+ zero: أشخاص
49
+ filter_by: تصفية حسب
50
+ filters: مرشحات
51
+ go_back: العودة للخلف
52
+ grid_view: عرض الشبكة
53
+ hide_content: إخفاء المحتوى
54
+ home: الصفحة الرئيسية
55
+ key_value_field:
56
+ add_row: إضافة صف
57
+ delete_row: حذف صف
58
+ key: المفتاح
59
+ value: القيمة
60
+ list_is_empty: القائمة فارغة
61
+ loading: جاري التحميل
62
+ more: المزيد
63
+ new: جديد
64
+ next_page: الصفحة التالية
65
+ no_cards_present: لا توجد بطاقات
66
+ no_item_found: لا يوجد سجلات
67
+ no_options_available: لا توجد خيارات متاحة
68
+ no_related_item_found: لم يتم العثور على سجلات متعلقة
69
+ not_authorized: ليس لديك الصلاحية للقيام بهذا الإجراء.
70
+ number_of_items:
71
+ one: سجل %{item} واحد
72
+ other: "%{count} سجل %{item}"
73
+ zero: لا يوجد %{item}
74
+ oops_nothing_found: عذراً! لم يتم العثور على شيء...
75
+ order:
76
+ higher: حرك السجل للأعلى
77
+ lower: حرك السجل للأسفل
78
+ reorder_record: إعادة ترتيب السجل
79
+ to_bottom: حرك السجل للأسفل بشكل كامل
80
+ to_top: حرك السجل للأعلى بشكل كامل
81
+ per_page: لكل صفحة
82
+ prev_page: الصفحة السابقة
83
+ remove_selection: إزالة التحديد
84
+ reset_filters: إعادة تعيين الفلاتر
85
+ resource_created: تم إنشاء السجل
86
+ resource_destroyed: تم حذف السجل
87
+ resource_translations:
88
+ team_members:
89
+ one: عضو فريق
90
+ other: أعضاء الفريق
91
+ zero: أعضاء الفريق
92
+ user:
93
+ one: مستخدم
94
+ other: مستخدمين
95
+ zero: مستخدمين
96
+ resource_updated: تم تحديث السجل
97
+ resources: المصادر
98
+ run: تشغيل
99
+ save: حفظ
100
+ search:
101
+ cancel_button: إلغاء
102
+ placeholder: البحث
103
+ select_all: تحديد الكل
104
+ select_all_matching: تحديد كل المطابق
105
+ select_item: تحديد العنصر
106
+ show_content: عرض المحتوى
107
+ sign_out: تسجيل الخروج
108
+ switch_to_view: التبديل إلى عرض %{view_type}
109
+ table_view: عرض الجدول
110
+ tools: الأدوات
111
+ type_to_search: اكتب للبحث.
112
+ unauthorized: غير مصرح به
113
+ undo: تراجع
114
+ view: عرض
115
+ view_item: عرض %{item}
116
+ was_successfully_created: تم إنشاؤه بنجاح
117
+ was_successfully_updated: تم تحديثه بنجاح
118
+ x_items_more:
119
+ one: عنصر واحد إضافي
120
+ other: "%{count} عناصر إضافية"
121
+ zero: لا توجد عناصر إضافية
122
+ x_records_selected_from_a_total_of_x_html: <span class="font-bold text-gray-700">%{selected}</span> السجلات المحددة في هذه الصفحة من إجمالي<span class="font-bold text-gray-700">%{count}</span>
123
+ x_records_selected_from_all_pages_html: <span class="font-bold text-gray-700">%{count}</span> السجلات المحددة من كل الصفحات
124
+ you_missed_something_check_form: ربما نسيت شيئًا، يرجى التحقق من البيانات.
125
+
126
+