avo 3.0.0.pre18 → 3.0.0.pre19

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.

Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/Gemfile.lock +23 -25
  4. data/Rakefile +2 -0
  5. data/{public/avo-assets/avo.css → app/assets/builds/avo.base.css} +587 -3848
  6. data/app/assets/builds/avo.base.js +124556 -0
  7. data/app/assets/builds/avo.base.js.map +7 -0
  8. data/app/assets/builds/avo.custom.js +6 -0
  9. data/app/assets/builds/avo.custom.js.map +7 -0
  10. data/app/assets/stylesheets/avo.base.css +1 -0
  11. data/app/assets/stylesheets/css/fields/tags.css +32 -0
  12. data/app/components/avo/actions_component.rb +1 -1
  13. data/app/components/avo/field_wrapper_component.html.erb +1 -1
  14. data/app/components/avo/field_wrapper_component.rb +1 -7
  15. data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
  16. data/app/components/avo/fields/common/badge_viewer_component.html.erb +1 -24
  17. data/app/components/avo/fields/common/badge_viewer_component.rb +24 -0
  18. data/app/components/avo/fields/common/boolean_check_component.html.erb +1 -12
  19. data/app/components/avo/fields/common/boolean_check_component.rb +2 -1
  20. data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
  21. data/app/components/avo/fields/common/gravatar_viewer_component.rb +2 -2
  22. data/app/components/avo/fields/common/heading_component.html.erb +3 -8
  23. data/app/components/avo/fields/common/heading_component.rb +1 -3
  24. data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
  25. data/app/components/avo/fields/common/key_value_component.rb +2 -2
  26. data/app/components/avo/fields/common/progress_bar_component.rb +3 -9
  27. data/app/components/avo/fields/common/status_viewer_component.html.erb +3 -0
  28. data/app/components/avo/fields/edit_component.rb +1 -1
  29. data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
  30. data/app/components/avo/fields/file_field/index_component.html.erb +2 -2
  31. data/app/components/avo/fields/gravatar_field/index_component.html.erb +1 -1
  32. data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
  33. data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
  34. data/app/components/avo/fields/id_field/index_component.html.erb +1 -1
  35. data/app/components/avo/fields/index_component.rb +1 -1
  36. data/app/components/avo/fields/show_component.rb +1 -1
  37. data/app/components/avo/fields/text_field/index_component.html.erb +1 -1
  38. data/app/components/avo/index/field_wrapper_component.rb +1 -1
  39. data/app/components/avo/index/resource_controls_component.rb +1 -1
  40. data/app/components/avo/index/resource_table_component.rb +3 -9
  41. data/app/components/avo/resource_component.rb +9 -4
  42. data/app/components/avo/sidebar_profile_component.html.erb +4 -4
  43. data/app/components/avo/tab_group_component.html.erb +1 -1
  44. data/app/components/avo/tab_switcher_component.rb +2 -2
  45. data/app/components/avo/views/resource_edit_component.html.erb +9 -20
  46. data/app/components/avo/views/resource_edit_component.rb +5 -5
  47. data/app/components/avo/views/resource_index_component.rb +1 -1
  48. data/app/components/avo/views/resource_show_component.html.erb +1 -1
  49. data/app/components/avo/views/resource_show_component.rb +1 -1
  50. data/app/controllers/avo/actions_controller.rb +9 -20
  51. data/app/controllers/avo/application_controller.rb +5 -5
  52. data/app/controllers/avo/base_controller.rb +39 -1
  53. data/app/controllers/avo/search_controller.rb +19 -2
  54. data/app/controllers/concerns/avo/initializes_avo.rb +1 -0
  55. data/app/helpers/avo/resources_helper.rb +1 -1
  56. data/app/helpers/avo/url_helpers.rb +1 -1
  57. data/app/views/avo/base/edit.html.erb +1 -1
  58. data/app/views/avo/base/index.html.erb +1 -1
  59. data/app/views/avo/base/new.html.erb +1 -1
  60. data/app/views/avo/base/show.html.erb +1 -1
  61. data/app/views/layouts/avo/application.html.erb +10 -2
  62. data/bin/dev +2 -0
  63. data/config/routes.rb +4 -3
  64. data/db/factories.rb +1 -1
  65. data/lib/avo/base_action.rb +21 -26
  66. data/lib/avo/base_resource.rb +13 -7
  67. data/lib/avo/concerns/filters_session_handler.rb +3 -3
  68. data/lib/avo/concerns/has_helpers.rb +18 -0
  69. data/lib/avo/concerns/has_items.rb +1 -5
  70. data/lib/avo/concerns/visible_in_different_views.rb +7 -1
  71. data/lib/avo/concerns/visible_items.rb +43 -0
  72. data/lib/avo/configuration.rb +28 -4
  73. data/lib/avo/current.rb +1 -6
  74. data/lib/avo/dsl/field_parser.rb +1 -1
  75. data/lib/avo/execution_context.rb +4 -1
  76. data/lib/avo/fields/badge_field.rb +1 -1
  77. data/lib/avo/fields/base_field.rb +21 -44
  78. data/lib/avo/fields/belongs_to_field.rb +1 -1
  79. data/lib/avo/fields/concerns/has_html_attributes.rb +2 -0
  80. data/lib/avo/fields/concerns/use_view_components.rb +45 -0
  81. data/lib/avo/fields/external_image_field.rb +2 -2
  82. data/lib/avo/fields/file_field.rb +2 -2
  83. data/lib/avo/fields/gravatar_field.rb +2 -2
  84. data/lib/avo/fields/has_base_field.rb +2 -2
  85. data/lib/avo/fields/heading_field.rb +5 -13
  86. data/lib/avo/fields/id_field.rb +2 -2
  87. data/lib/avo/fields/status_field.rb +3 -1
  88. data/lib/avo/fields/text_field.rb +2 -2
  89. data/lib/avo/filters/base_filter.rb +1 -1
  90. data/lib/avo/html/builder.rb +1 -1
  91. data/lib/avo/licensing/license_manager.rb +1 -1
  92. data/lib/avo/resources/items/holder.rb +0 -6
  93. data/lib/avo/resources/items/item_group.rb +2 -2
  94. data/lib/avo/resources/items/row.rb +3 -3
  95. data/lib/avo/resources/items/sidebar.rb +1 -1
  96. data/lib/avo/resources/items/tab.rb +2 -2
  97. data/lib/avo/resources/items/tab_group.rb +1 -1
  98. data/lib/avo/resources/resource_manager.rb +6 -1
  99. data/lib/avo/version.rb +1 -1
  100. data/lib/avo/view_inquirer.rb +36 -0
  101. data/lib/avo.rb +9 -0
  102. data/lib/generators/avo/concerns/parent_controller.rb +20 -0
  103. data/lib/generators/avo/controller_generator.rb +3 -0
  104. data/lib/generators/avo/eject_generator.rb +180 -15
  105. data/lib/generators/avo/field_generator.rb +49 -2
  106. data/lib/generators/avo/js/install_generator.rb +2 -2
  107. data/lib/generators/avo/resource_generator.rb +10 -7
  108. data/lib/generators/avo/tailwindcss/install_generator.rb +58 -12
  109. data/lib/generators/avo/templates/initializer/avo.tt +6 -1
  110. data/lib/generators/avo/templates/resource/controller.tt +1 -1
  111. data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
  112. data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
  113. data/lib/tasks/avo_tasks.rake +33 -5
  114. data/public/avo-assets/avo.base.css +75 -4146
  115. metadata +14 -6
  116. data/config/master.key +0 -1
  117. data/public/avo-assets/avo.js +0 -513
  118. data/public/avo-assets/avo.js.map +0 -7
@@ -8,7 +8,7 @@ module Avo
8
8
 
9
9
  hide_on [:edit, :new]
10
10
 
11
- default_options = {info: :info, success: :success, danger: :danger, warning: :warning}
11
+ default_options = {info: :info, success: :success, danger: :danger, warning: :warning, neutral: :neutral}
12
12
  @options = args[:options].present? ? default_options.merge(args[:options]) : default_options
13
13
  end
14
14
  end
@@ -7,6 +7,7 @@ module Avo
7
7
  prepend Avo::Concerns::IsResourceItem
8
8
  include Avo::Concerns::IsVisible
9
9
  include Avo::Concerns::VisibleInDifferentViews
10
+ include Avo::Concerns::HasHelpers
10
11
  include Avo::Fields::Concerns::HasFieldName
11
12
  include Avo::Fields::Concerns::HasDefault
12
13
  include Avo::Fields::Concerns::HasHTMLAttributes
@@ -14,6 +15,7 @@ module Avo
14
15
  include Avo::Fields::Concerns::IsReadonly
15
16
  include Avo::Fields::Concerns::IsDisabled
16
17
  include Avo::Fields::Concerns::IsRequired
18
+ include Avo::Fields::Concerns::UseViewComponents
17
19
 
18
20
  include ActionView::Helpers::UrlHelper
19
21
 
@@ -73,11 +75,12 @@ module Avo
73
75
  @visible = args[:visible]
74
76
  @as_avatar = args[:as_avatar] || false
75
77
  @html = args[:html] || nil
76
- @view = args[:view] || nil
78
+ @view = Avo::ViewInquirer.new(args[:view]) || nil
77
79
  @value = args[:value] || nil
78
80
  @stacked = args[:stacked] || nil
79
81
  @for_presentation_only = args[:for_presentation_only] || false
80
82
  @resource = args[:resource]
83
+ @components = args[:components] || {}
81
84
 
82
85
  @args = args
83
86
 
@@ -155,14 +158,7 @@ module Avo
155
158
 
156
159
  # Run computable callback block if present
157
160
  if computable && block.present?
158
- final_value = Avo::ExecutionContext.new(
159
- target: block,
160
- record: record,
161
- resource: @resource,
162
- view: @view,
163
- field: self,
164
- include: self.class.included_modules
165
- ).handle
161
+ final_value = execute_block
166
162
  end
167
163
 
168
164
  # Run the value through resolver if present
@@ -181,6 +177,17 @@ module Avo
181
177
  final_value
182
178
  end
183
179
 
180
+ def execute_block
181
+ Avo::ExecutionContext.new(
182
+ target: block,
183
+ record: record,
184
+ resource: resource,
185
+ view: view,
186
+ field: self,
187
+ include: self.class.included_modules
188
+ ).handle
189
+ end
190
+
184
191
  # Fills the record with the received value on create and update actions.
185
192
  def fill_field(record, key, value, params)
186
193
  return record unless record.methods.include? key.to_sym
@@ -192,7 +199,8 @@ module Avo
192
199
  key: key,
193
200
  value: value,
194
201
  resource: resource,
195
- field: self
202
+ field: self,
203
+ include: self.class.included_modules
196
204
  ).handle
197
205
  end
198
206
 
@@ -220,35 +228,8 @@ module Avo
220
228
  id.to_sym
221
229
  end
222
230
 
223
- def view_component_name
224
- "#{type.camelize}Field"
225
- end
226
-
227
- # For custom components the namespace will be different than Avo::Fields so we should take that into account.
228
- def view_component_namespace
229
- "#{self.class.to_s.deconstantize}::#{view_component_name}"
230
- end
231
-
232
- # Try and build the component class or fallback to a blank one
233
- def component_for_view(view = :index)
234
- # Use the edit variant for all "update" views
235
- view = :edit if view.in? [:new, :create, :update]
236
-
237
- component_class = "#{view_component_namespace}::#{view.to_s.camelize}Component"
238
- component_class.constantize
239
- rescue
240
- unless Rails.env.test?
241
- Avo.logger.info "Failed to find component for the `#{self.class}` field on the `#{view}` view."
242
- end
243
- # When returning nil, a race condition happens and throws an error in some environments.
244
- # See https://github.com/avo-hq/avo/pull/365
245
- ::Avo::BlankFieldComponent
246
- end
247
-
248
231
  def record_errors
249
- return {} if record.nil?
250
-
251
- record.errors
232
+ record.nil? ? {} : record.errors
252
233
  end
253
234
 
254
235
  def type
@@ -289,11 +270,7 @@ module Avo
289
270
  private
290
271
 
291
272
  def model_or_class(model)
292
- if model.instance_of?(String)
293
- "class"
294
- else
295
- "model"
296
- end
273
+ model.instance_of?(String) ? "class" : "model"
297
274
  end
298
275
 
299
276
  def is_model?(model)
@@ -305,7 +282,7 @@ module Avo
305
282
  end
306
283
 
307
284
  def on_create?
308
- @view.in?([:new, :create])
285
+ @view.in?(%w[new create])
309
286
  end
310
287
 
311
288
  def in_action?
@@ -259,7 +259,7 @@ module Avo
259
259
  end
260
260
 
261
261
  def name
262
- return polymorphic_as.to_s.humanize if polymorphic_as.present? && view == :index
262
+ return polymorphic_as.to_s.humanize if polymorphic_as.present? && view.index?
263
263
 
264
264
  super
265
265
  end
@@ -13,6 +13,8 @@ module Avo
13
13
  # get_html :classes, view: :show, element: :wrapper
14
14
  # get_html :styles, view: :index, element: :wrapper
15
15
  def get_html(name = nil, element:, view:)
16
+ view = view.to_sym if view.present?
17
+
16
18
  if [view, element].any?(&:nil?)
17
19
  default_attribute_value name
18
20
  end
@@ -0,0 +1,45 @@
1
+ module Avo
2
+ module Fields
3
+ module Concerns
4
+ module UseViewComponents
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ attr_reader :components
9
+ end
10
+
11
+ def view_component_name
12
+ "#{type.camelize}Field"
13
+ end
14
+
15
+ # For custom components the namespace will be different than Avo::Fields so we should take that into account.
16
+ def view_component_namespace
17
+ "#{self.class.to_s.deconstantize}::#{view_component_name}"
18
+ end
19
+
20
+ # Try and build the component class or fallback to a blank one
21
+ def component_for_view(view = :index)
22
+ # Use the edit variant for all "update" views
23
+ view = :edit if view.in? [:new, :create, :update]
24
+
25
+ custom_components = Avo::ExecutionContext.new(
26
+ target: components,
27
+ resource: @resource,
28
+ record: @record,
29
+ view: view
30
+ ).handle
31
+
32
+ component_class = custom_components.dig("#{view}_component".to_sym) || "#{view_component_namespace}::#{view.to_s.camelize}Component"
33
+ component_class.to_s.constantize
34
+ rescue
35
+ unless Rails.env.test?
36
+ Avo.logger.info "Failed to find component for the `#{self.class}` field on the `#{view}` view."
37
+ end
38
+ # When returning nil, a race condition happens and throws an error in some environments.
39
+ # See https://github.com/avo-hq/avo/pull/365
40
+ ::Avo::BlankFieldComponent
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -4,12 +4,12 @@ module Avo
4
4
  attr_reader :width
5
5
  attr_reader :height
6
6
  attr_reader :radius
7
- attr_reader :link_to_resource
7
+ attr_reader :link_to_record
8
8
 
9
9
  def initialize(id, **args, &block)
10
10
  super(id, **args, &block)
11
11
 
12
- @link_to_resource = args[:link_to_resource].present? ? args[:link_to_resource] : false
12
+ @link_to_record = args[:link_to_record].present? ? args[:link_to_record] : false
13
13
 
14
14
  @width = args[:width].present? ? args[:width] : 40
15
15
  @height = args[:height].present? ? args[:height] : 40
@@ -1,7 +1,7 @@
1
1
  module Avo
2
2
  module Fields
3
3
  class FileField < BaseField
4
- attr_accessor :link_to_resource
4
+ attr_accessor :link_to_record
5
5
  attr_accessor :is_avatar
6
6
  attr_accessor :is_image
7
7
  attr_accessor :is_audio
@@ -12,7 +12,7 @@ module Avo
12
12
  def initialize(id, **args, &block)
13
13
  super(id, **args, &block)
14
14
 
15
- @link_to_resource = args[:link_to_resource].present? ? args[:link_to_resource] : false
15
+ @link_to_record = args[:link_to_record].present? ? args[:link_to_record] : false
16
16
  @is_avatar = args[:is_avatar].present? ? args[:is_avatar] : false
17
17
  @is_image = args[:is_image].present? ? args[:is_image] : @is_avatar
18
18
  @is_audio = args[:is_audio].present? ? args[:is_audio] : false
@@ -4,7 +4,7 @@ require "erb"
4
4
  module Avo
5
5
  module Fields
6
6
  class GravatarField < BaseField
7
- attr_reader :link_to_resource
7
+ attr_reader :link_to_record
8
8
  attr_reader :rounded
9
9
  attr_reader :size
10
10
  attr_reader :default
@@ -16,7 +16,7 @@ module Avo
16
16
 
17
17
  hide_on [:edit, :new]
18
18
 
19
- @link_to_resource = args[:link_to_resource].present? ? args[:link_to_resource] : false
19
+ @link_to_record = args[:link_to_record].present? ? args[:link_to_record] : false
20
20
  @rounded = args[:rounded].nil? ? true : args[:rounded]
21
21
  @size = args[:size].present? ? args[:size].to_i : 32
22
22
  @default = args[:default].present? ? ERB::Util.url_encode(args[:default]).to_s : ""
@@ -79,8 +79,8 @@ module Avo
79
79
 
80
80
  # Adds the view override component
81
81
  # has_one, has_many, has_and_belongs_to_many fields don't have edit views
82
- def component_for_view(view = :index)
83
- view = :show if view.in? [:new, :create, :update, :edit]
82
+ def component_for_view(view = Avo::ViewInquirer.new("index"))
83
+ view = Avo::ViewInquirer.new("show") if view.in? %w[new create update edit]
84
84
 
85
85
  super view
86
86
  end
@@ -4,35 +4,27 @@ module Avo
4
4
  module Fields
5
5
  class HeadingField < BaseField
6
6
  attr_reader :as_html
7
- attr_reader :empty
8
-
9
- def initialize(content, **args, &block)
10
- # Mark the field as empty if there's no content passed
11
- @empty = content.blank?
12
- # Add dummy content
13
- content ||= SecureRandom.hex
14
7
 
8
+ def initialize(id, **args, &block)
15
9
  args[:updatable] = false
10
+ @label = args[:label] || id.to_s.humanize
16
11
 
17
- super(content, **args, &block)
12
+ super(id, **args, &block)
18
13
 
19
14
  # this field is not used to update anything
20
15
  @for_presentation_only = true
21
16
 
22
17
  hide_on :index
23
18
 
24
- @as_html = args[:as_html].present? ? args[:as_html] : false
19
+ @as_html = args[:as_html].presence || false
25
20
  end
26
21
 
27
22
  def id
28
23
  "heading_#{name.to_s.parameterize.underscore}"
29
24
  end
30
25
 
31
- # Override the value method if the field is empty
32
26
  def value
33
- return nil if empty
34
-
35
- super
27
+ block.present? ? execute_block : @label
36
28
  end
37
29
  end
38
30
  end
@@ -1,7 +1,7 @@
1
1
  module Avo
2
2
  module Fields
3
3
  class IdField < BaseField
4
- attr_reader :link_to_resource
4
+ attr_reader :link_to_record
5
5
 
6
6
  def initialize(id, **args, &block)
7
7
  args[:readonly] = true
@@ -12,7 +12,7 @@ module Avo
12
12
 
13
13
  add_boolean_prop args, :sortable, true
14
14
 
15
- @link_to_resource = args[:link_to_resource].present? ? args[:link_to_resource] : false
15
+ @link_to_record = args[:link_to_record].present? ? args[:link_to_record] : false
16
16
  end
17
17
  end
18
18
  end
@@ -6,13 +6,15 @@ module Avo
6
6
 
7
7
  @loading_when = args[:loading_when].present? ? [args[:loading_when]].flatten.map(&:to_sym) : [:waiting, :running]
8
8
  @failed_when = args[:failed_when].present? ? [args[:failed_when]].flatten.map(&:to_sym) : [:failed]
9
+ @success_when = args[:success_when].present? ? [args[:success_when]].flatten.map(&:to_sym) : []
9
10
  end
10
11
 
11
12
  def status
12
- status = "success"
13
+ status = "neutral"
13
14
  if value.present?
14
15
  status = "failed" if @failed_when.include? value.to_sym
15
16
  status = "loading" if @loading_when.include? value.to_sym
17
+ status = "success" if @success_when.include? value.to_sym
16
18
  end
17
19
 
18
20
  status
@@ -1,14 +1,14 @@
1
1
  module Avo
2
2
  module Fields
3
3
  class TextField < BaseField
4
- attr_reader :link_to_resource
4
+ attr_reader :link_to_record
5
5
  attr_reader :as_html
6
6
  attr_reader :protocol
7
7
 
8
8
  def initialize(id, **args, &block)
9
9
  super(id, **args, &block)
10
10
 
11
- add_boolean_prop args, :link_to_resource
11
+ add_boolean_prop args, :link_to_record
12
12
  add_boolean_prop args, :as_html
13
13
  add_string_prop args, :protocol
14
14
  end
@@ -15,7 +15,7 @@ module Avo
15
15
  delegate :params, to: Avo::Current
16
16
  delegate :request, to: Avo::Current
17
17
  delegate :view_context, to: Avo::Current
18
- def curent_user
18
+ def current_user
19
19
  Avo::Current.user
20
20
  end
21
21
 
@@ -22,7 +22,7 @@ class Avo::HTML::Builder
22
22
  delegate :app, to: Avo::Current
23
23
  delegate :root_path, to: :app
24
24
  delegate :params, to: Avo::Current
25
- def curent_user
25
+ def current_user
26
26
  Avo::Current.user
27
27
  end
28
28
 
@@ -9,7 +9,7 @@ module Avo
9
9
  case @hq_response["id"]
10
10
  when "community"
11
11
  CommunityLicense.new @hq_response
12
- when "pro"
12
+ when "pro", "advanced"
13
13
  ProLicense.new @hq_response
14
14
  else
15
15
  NilLicense.new @hq_response
@@ -56,12 +56,6 @@ class Avo::Resources::Items::Holder
56
56
  add_item panel
57
57
  end
58
58
 
59
- def heading(body = nil, **args, &block)
60
- field = Avo::Fields::HeadingField.new(body, **args)
61
-
62
- add_item field
63
- end
64
-
65
59
  def sidebar(**args, &block)
66
60
  add_item Avo::Resources::Items::Sidebar::Builder.parse_block(**args, &block)
67
61
  end
@@ -3,7 +3,7 @@ class Avo::Resources::Items::ItemGroup
3
3
 
4
4
  include Avo::Concerns::HasItems
5
5
  include Avo::Concerns::HasItemType
6
- include Avo::Concerns::IsVisible
6
+ include Avo::Concerns::VisibleItems
7
7
  include Avo::Concerns::VisibleInDifferentViews
8
8
 
9
9
  attr_reader :name
@@ -13,7 +13,7 @@ class Avo::Resources::Items::ItemGroup
13
13
 
14
14
  def initialize(name: nil, description: nil, view: nil, **args)
15
15
  @name = name
16
- @view = view
16
+ @view = Avo::ViewInquirer.new view
17
17
  @description = description
18
18
  @items_holder = Avo::Resources::Items::Holder.new
19
19
  @args = args
@@ -2,7 +2,7 @@ class Avo::Resources::Items::Row
2
2
  include Avo::Concerns::IsResourceItem
3
3
  include Avo::Concerns::HasItems
4
4
  include Avo::Concerns::HasItemType
5
- include Avo::Concerns::IsVisible
5
+ include Avo::Concerns::VisibleItems
6
6
 
7
7
  class_attribute :item_type, default: :row
8
8
 
@@ -12,12 +12,12 @@ class Avo::Resources::Items::Row
12
12
  delegate :items, :add_item, to: :items_holder
13
13
 
14
14
  def initialize(view: nil)
15
- @view = view
15
+ @view = Avo::ViewInquirer.new view
16
16
  @items_holder = Avo::Resources::Items::Holder.new
17
17
  end
18
18
 
19
19
  def hydrate(view: nil, resource: nil, **args)
20
- @view = view
20
+ @view = Avo::ViewInquirer.new view
21
21
  @resource = resource
22
22
 
23
23
  self
@@ -13,7 +13,7 @@ class Avo::Resources::Items::Sidebar
13
13
  def initialize(name: nil, view: nil, **args)
14
14
  @name = name
15
15
  @items_holder = Avo::Resources::Items::Holder.new
16
- @view = view
16
+ @view = Avo::ViewInquirer.new view
17
17
  @args = args
18
18
 
19
19
  post_initialize if respond_to?(:post_initialize)
@@ -3,7 +3,7 @@ class Avo::Resources::Items::Tab
3
3
 
4
4
  include Avo::Concerns::HasItems
5
5
  include Avo::Concerns::HasItemType
6
- include Avo::Concerns::IsVisible
6
+ include Avo::Concerns::VisibleItems
7
7
  include Avo::Concerns::VisibleInDifferentViews
8
8
 
9
9
  delegate :items, :add_item, to: :items_holder
@@ -14,7 +14,7 @@ class Avo::Resources::Items::Tab
14
14
  @name = name
15
15
  @description = description
16
16
  @items_holder = Avo::Resources::Items::Holder.new
17
- @view = view
17
+ @view = Avo::ViewInquirer.new view
18
18
  @args = args
19
19
 
20
20
  post_initialize if respond_to?(:post_initialize)
@@ -12,7 +12,7 @@ class Avo::Resources::Items::TabGroup
12
12
  def initialize(index: 0, view: nil, style: nil, **args)
13
13
  @index = index
14
14
  @items_holder = Avo::Resources::Items::Holder.new
15
- @view = view
15
+ @view = Avo::ViewInquirer.new view
16
16
  @style = style
17
17
  @args = args
18
18
 
@@ -152,7 +152,12 @@ module Avo
152
152
  def get_available_resources(user = nil)
153
153
  valid_resources
154
154
  .select do |resource|
155
- Services::AuthorizationService.authorize user, resource.model_class, Avo.configuration.authorization_methods.stringify_keys["index"], raise_exception: false
155
+ resource.authorization.class.authorize(
156
+ user,
157
+ resource.model_class,
158
+ Avo.configuration.authorization_methods.stringify_keys["index"],
159
+ raise_exception: false
160
+ )
156
161
  end
157
162
  .sort_by { |r| r.name }
158
163
  end
data/lib/avo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Avo
2
- VERSION = "3.0.0.pre18" unless const_defined?(:VERSION)
2
+ VERSION = "3.0.0.pre19" unless const_defined?(:VERSION)
3
3
  end
@@ -0,0 +1,36 @@
1
+ # Allows to check the the view type by using `view.index?` or `view.edit?` etc...
2
+ # It also allows to check if the view is a form or a display view by using `view.form?` or `view.display?`
3
+ module Avo
4
+ class ViewInquirer < ActiveSupport::StringInquirer
5
+ DISPLAY_VIEWS = %w[index show]
6
+ FORM_VIEWS = %w[new edit]
7
+
8
+ def initialize(view)
9
+ super(view.to_s)
10
+
11
+ @display = in? DISPLAY_VIEWS
12
+ @form = in? FORM_VIEWS
13
+ end
14
+
15
+ def display?
16
+ @display
17
+ end
18
+
19
+ def form?
20
+ @form
21
+ end
22
+
23
+ # To avoid breaking changes we allow the comparison with symbols
24
+ def ==(other)
25
+ if other.is_a? Symbol
26
+ to_sym == other
27
+ else
28
+ super(other)
29
+ end
30
+ end
31
+
32
+ def in?(another_object)
33
+ super another_object.map(&:to_s)
34
+ end
35
+ end
36
+ end
data/lib/avo.rb CHANGED
@@ -116,6 +116,15 @@ module Avo
116
116
  true
117
117
  end
118
118
 
119
+ # Mount all Avo engines
120
+ def mount_engines
121
+ -> {
122
+ mount Avo::DynamicFilters::Engine, at: "/avo-dynamic_filters" if defined?(Avo::DynamicFilters::Engine)
123
+ mount Avo::Dashboards::Engine, at: "/dashboards" if defined?(Avo::Dashboards::Engine)
124
+ mount Avo::Pro::Engine, at: "/avo-pro" if defined?(Avo::Pro::Engine)
125
+ }
126
+ end
127
+
119
128
  private
120
129
 
121
130
  def boot_logger
@@ -0,0 +1,20 @@
1
+ module Generators
2
+ module Avo
3
+ module Concerns
4
+ module ParentController
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ class_option "parent-controller",
9
+ desc: "The name of the parent controller.",
10
+ type: :string,
11
+ required: false
12
+ end
13
+
14
+ def parent_controller
15
+ options["parent-controller"] || ::Avo.configuration.resource_parent_controller
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,8 +1,11 @@
1
1
  require_relative "named_base_generator"
2
+ require_relative "concerns/parent_controller"
2
3
 
3
4
  module Generators
4
5
  module Avo
5
6
  class ControllerGenerator < NamedBaseGenerator
7
+ include Generators::Avo::Concerns::ParentController
8
+
6
9
  source_root File.expand_path("templates", __dir__)
7
10
 
8
11
  namespace "avo:controller"