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.
- checksums.yaml +4 -4
- data/Gemfile +2 -2
- data/Gemfile.lock +23 -25
- data/Rakefile +2 -0
- data/{public/avo-assets/avo.css → app/assets/builds/avo.base.css} +587 -3848
- data/app/assets/builds/avo.base.js +124556 -0
- data/app/assets/builds/avo.base.js.map +7 -0
- data/app/assets/builds/avo.custom.js +6 -0
- data/app/assets/builds/avo.custom.js.map +7 -0
- data/app/assets/stylesheets/avo.base.css +1 -0
- data/app/assets/stylesheets/css/fields/tags.css +32 -0
- data/app/components/avo/actions_component.rb +1 -1
- data/app/components/avo/field_wrapper_component.html.erb +1 -1
- data/app/components/avo/field_wrapper_component.rb +1 -7
- data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/common/badge_viewer_component.html.erb +1 -24
- data/app/components/avo/fields/common/badge_viewer_component.rb +24 -0
- data/app/components/avo/fields/common/boolean_check_component.html.erb +1 -12
- data/app/components/avo/fields/common/boolean_check_component.rb +2 -1
- data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
- data/app/components/avo/fields/common/gravatar_viewer_component.rb +2 -2
- data/app/components/avo/fields/common/heading_component.html.erb +3 -8
- data/app/components/avo/fields/common/heading_component.rb +1 -3
- data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
- data/app/components/avo/fields/common/key_value_component.rb +2 -2
- data/app/components/avo/fields/common/progress_bar_component.rb +3 -9
- data/app/components/avo/fields/common/status_viewer_component.html.erb +3 -0
- data/app/components/avo/fields/edit_component.rb +1 -1
- data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/file_field/index_component.html.erb +2 -2
- data/app/components/avo/fields/gravatar_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/id_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/index_component.rb +1 -1
- data/app/components/avo/fields/show_component.rb +1 -1
- data/app/components/avo/fields/text_field/index_component.html.erb +1 -1
- data/app/components/avo/index/field_wrapper_component.rb +1 -1
- data/app/components/avo/index/resource_controls_component.rb +1 -1
- data/app/components/avo/index/resource_table_component.rb +3 -9
- data/app/components/avo/resource_component.rb +9 -4
- data/app/components/avo/sidebar_profile_component.html.erb +4 -4
- data/app/components/avo/tab_group_component.html.erb +1 -1
- data/app/components/avo/tab_switcher_component.rb +2 -2
- data/app/components/avo/views/resource_edit_component.html.erb +9 -20
- data/app/components/avo/views/resource_edit_component.rb +5 -5
- data/app/components/avo/views/resource_index_component.rb +1 -1
- data/app/components/avo/views/resource_show_component.html.erb +1 -1
- data/app/components/avo/views/resource_show_component.rb +1 -1
- data/app/controllers/avo/actions_controller.rb +9 -20
- data/app/controllers/avo/application_controller.rb +5 -5
- data/app/controllers/avo/base_controller.rb +39 -1
- data/app/controllers/avo/search_controller.rb +19 -2
- data/app/controllers/concerns/avo/initializes_avo.rb +1 -0
- data/app/helpers/avo/resources_helper.rb +1 -1
- data/app/helpers/avo/url_helpers.rb +1 -1
- data/app/views/avo/base/edit.html.erb +1 -1
- data/app/views/avo/base/index.html.erb +1 -1
- data/app/views/avo/base/new.html.erb +1 -1
- data/app/views/avo/base/show.html.erb +1 -1
- data/app/views/layouts/avo/application.html.erb +10 -2
- data/bin/dev +2 -0
- data/config/routes.rb +4 -3
- data/db/factories.rb +1 -1
- data/lib/avo/base_action.rb +21 -26
- data/lib/avo/base_resource.rb +13 -7
- data/lib/avo/concerns/filters_session_handler.rb +3 -3
- data/lib/avo/concerns/has_helpers.rb +18 -0
- data/lib/avo/concerns/has_items.rb +1 -5
- data/lib/avo/concerns/visible_in_different_views.rb +7 -1
- data/lib/avo/concerns/visible_items.rb +43 -0
- data/lib/avo/configuration.rb +28 -4
- data/lib/avo/current.rb +1 -6
- data/lib/avo/dsl/field_parser.rb +1 -1
- data/lib/avo/execution_context.rb +4 -1
- data/lib/avo/fields/badge_field.rb +1 -1
- data/lib/avo/fields/base_field.rb +21 -44
- data/lib/avo/fields/belongs_to_field.rb +1 -1
- data/lib/avo/fields/concerns/has_html_attributes.rb +2 -0
- data/lib/avo/fields/concerns/use_view_components.rb +45 -0
- data/lib/avo/fields/external_image_field.rb +2 -2
- data/lib/avo/fields/file_field.rb +2 -2
- data/lib/avo/fields/gravatar_field.rb +2 -2
- data/lib/avo/fields/has_base_field.rb +2 -2
- data/lib/avo/fields/heading_field.rb +5 -13
- data/lib/avo/fields/id_field.rb +2 -2
- data/lib/avo/fields/status_field.rb +3 -1
- data/lib/avo/fields/text_field.rb +2 -2
- data/lib/avo/filters/base_filter.rb +1 -1
- data/lib/avo/html/builder.rb +1 -1
- data/lib/avo/licensing/license_manager.rb +1 -1
- data/lib/avo/resources/items/holder.rb +0 -6
- data/lib/avo/resources/items/item_group.rb +2 -2
- data/lib/avo/resources/items/row.rb +3 -3
- data/lib/avo/resources/items/sidebar.rb +1 -1
- data/lib/avo/resources/items/tab.rb +2 -2
- data/lib/avo/resources/items/tab_group.rb +1 -1
- data/lib/avo/resources/resource_manager.rb +6 -1
- data/lib/avo/version.rb +1 -1
- data/lib/avo/view_inquirer.rb +36 -0
- data/lib/avo.rb +9 -0
- data/lib/generators/avo/concerns/parent_controller.rb +20 -0
- data/lib/generators/avo/controller_generator.rb +3 -0
- data/lib/generators/avo/eject_generator.rb +180 -15
- data/lib/generators/avo/field_generator.rb +49 -2
- data/lib/generators/avo/js/install_generator.rb +2 -2
- data/lib/generators/avo/resource_generator.rb +10 -7
- data/lib/generators/avo/tailwindcss/install_generator.rb +58 -12
- data/lib/generators/avo/templates/initializer/avo.tt +6 -1
- data/lib/generators/avo/templates/resource/controller.tt +1 -1
- data/lib/generators/avo/templates/tailwindcss/avo.tailwind.css +5 -3
- data/lib/generators/avo/templates/tailwindcss/tailwind.config.js +11 -0
- data/lib/tasks/avo_tasks.rake +33 -5
- data/public/avo-assets/avo.base.css +75 -4146
- metadata +14 -6
- data/config/master.key +0 -1
- data/public/avo-assets/avo.js +0 -513
- 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 =
|
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
|
-
|
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
|
-
|
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?([
|
285
|
+
@view.in?(%w[new create])
|
309
286
|
end
|
310
287
|
|
311
288
|
def in_action?
|
@@ -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 :
|
7
|
+
attr_reader :link_to_record
|
8
8
|
|
9
9
|
def initialize(id, **args, &block)
|
10
10
|
super(id, **args, &block)
|
11
11
|
|
12
|
-
@
|
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 :
|
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
|
-
@
|
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 :
|
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
|
-
@
|
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 =
|
83
|
-
view =
|
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(
|
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].
|
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
|
-
|
34
|
-
|
35
|
-
super
|
27
|
+
block.present? ? execute_block : @label
|
36
28
|
end
|
37
29
|
end
|
38
30
|
end
|
data/lib/avo/fields/id_field.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Avo
|
2
2
|
module Fields
|
3
3
|
class IdField < BaseField
|
4
|
-
attr_reader :
|
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
|
-
@
|
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 = "
|
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 :
|
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, :
|
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
|
data/lib/avo/html/builder.rb
CHANGED
@@ -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::
|
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::
|
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::
|
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)
|
@@ -152,7 +152,12 @@ module Avo
|
|
152
152
|
def get_available_resources(user = nil)
|
153
153
|
valid_resources
|
154
154
|
.select do |resource|
|
155
|
-
|
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
@@ -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"
|