avo 2.11.2.pre.1 → 2.11.3.pre.1
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.lock +1 -1
- data/app/assets/stylesheets/avo.css +1 -0
- data/app/assets/stylesheets/css/scrollbar.css +30 -0
- data/app/components/avo/actions_component.html.erb +3 -3
- data/app/components/avo/actions_component.rb +12 -3
- data/app/components/avo/button_component.rb +1 -3
- data/app/components/avo/paginator_component.html.erb +35 -33
- data/app/components/avo/paginator_component.rb +3 -1
- data/app/components/avo/panel_component.html.erb +1 -1
- data/app/components/avo/resource_component.rb +6 -4
- data/app/components/avo/sidebar_component.html.erb +1 -1
- data/app/components/avo/tab_switcher_component.html.erb +1 -1
- data/app/components/avo/views/resource_index_component.html.erb +3 -3
- data/app/components/avo/views/resource_show_component.html.erb +143 -52
- data/app/components/avo/views/resource_show_component.rb +1 -0
- data/app/controllers/avo/base_controller.rb +9 -8
- data/app/javascript/avo.js +1 -1
- data/app/javascript/js/controllers/fields/date_field_controller.js +7 -3
- data/app/views/avo/debug/report.html.erb +1 -0
- data/app/views/avo/private/design.html.erb +1 -1
- data/lib/avo/base_resource.rb +7 -10
- data/lib/avo/concerns/has_editable_controls.rb +34 -0
- data/lib/avo/fields/date_time_field.rb +2 -2
- data/lib/avo/fields/has_base_field.rb +2 -0
- data/lib/avo/licensing/pro_license.rb +1 -0
- data/lib/avo/resources/controls/action.rb +32 -0
- data/lib/avo/resources/controls/actions_list.rb +19 -0
- data/lib/avo/resources/controls/back_button.rb +13 -0
- data/lib/avo/resources/controls/base_control.rb +59 -0
- data/lib/avo/resources/controls/delete_button.rb +13 -0
- data/lib/avo/resources/controls/detach_button.rb +13 -0
- data/lib/avo/resources/controls/edit_button.rb +13 -0
- data/lib/avo/resources/controls/execution_context.rb +59 -0
- data/lib/avo/resources/controls/items_holder.rb +19 -0
- data/lib/avo/resources/controls/link_to.rb +27 -0
- data/lib/avo/version.rb +1 -1
- data/lib/generators/avo/templates/action.tt +1 -1
- data/lib/generators/avo/templates/resource_tools/partial.tt +1 -1
- data/lib/generators/avo/templates/standalone_action.tt +1 -1
- data/public/avo-assets/avo.css +602 -43
- data/public/avo-assets/avo.js +2 -2
- data/public/avo-assets/avo.js.map +2 -2
- metadata +14 -3
- data/lib/avo/concerns/has_model.rb +0 -11
data/lib/avo/base_resource.rb
CHANGED
@@ -3,8 +3,8 @@ module Avo
|
|
3
3
|
extend ActiveSupport::DescendantsTracker
|
4
4
|
|
5
5
|
include ActionView::Helpers::UrlHelper
|
6
|
-
include Avo::Concerns::HasModel
|
7
6
|
include Avo::Concerns::HasFields
|
7
|
+
include Avo::Concerns::HasEditableControls
|
8
8
|
include Avo::Concerns::HasStimulusControllers
|
9
9
|
include Avo::Concerns::ModelClassConstantized
|
10
10
|
|
@@ -274,15 +274,8 @@ module Avo
|
|
274
274
|
|
275
275
|
# Write the user configured extra params to the model
|
276
276
|
if extra_params.present?
|
277
|
-
|
278
|
-
|
279
|
-
param_id = param_id.first.first if param_id.is_a? Hash
|
280
|
-
|
281
|
-
next unless @model.respond_to? "#{param_id}="
|
282
|
-
|
283
|
-
param_value = params[param_id]
|
284
|
-
@model.send("#{param_id}=", param_value)
|
285
|
-
end
|
277
|
+
# Let Rails fill in the rest of the params
|
278
|
+
model.assign_attributes params.permit(extra_params)
|
286
279
|
end
|
287
280
|
|
288
281
|
model
|
@@ -446,5 +439,9 @@ module Avo
|
|
446
439
|
def ordering_host(**args)
|
447
440
|
Avo::Hosts::Ordering.new resource: self, options: self.class.ordering, **args
|
448
441
|
end
|
442
|
+
|
443
|
+
def has_model_id?
|
444
|
+
model.present? && model.id.present?
|
445
|
+
end
|
449
446
|
end
|
450
447
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Avo
|
2
|
+
module Concerns
|
3
|
+
module HasEditableControls
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
class_attribute :show_controls
|
8
|
+
class_attribute :show_controls_holder
|
9
|
+
class_attribute :show_controls_holder_called, default: false
|
10
|
+
end
|
11
|
+
|
12
|
+
def has_show_controls?
|
13
|
+
return false if ::Avo::App.license.lacks_with_trial(:resource_show_controls)
|
14
|
+
|
15
|
+
self.class.show_controls.present?
|
16
|
+
end
|
17
|
+
|
18
|
+
def render_show_controls
|
19
|
+
return [] if ::Avo::App.license.lacks_with_trial(:resource_show_controls)
|
20
|
+
|
21
|
+
if show_controls.present?
|
22
|
+
Avo::Resources::Controls::ExecutionContext.new(
|
23
|
+
block: show_controls,
|
24
|
+
resource: self,
|
25
|
+
model: model,
|
26
|
+
view: view
|
27
|
+
).handle.items
|
28
|
+
else
|
29
|
+
[]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -5,6 +5,7 @@ module Avo
|
|
5
5
|
attr_accessor :scope
|
6
6
|
attr_accessor :attach_scope
|
7
7
|
attr_accessor :description
|
8
|
+
attr_accessor :discreet_pagination
|
8
9
|
|
9
10
|
def initialize(id, **args, &block)
|
10
11
|
super(id, **args, &block)
|
@@ -14,6 +15,7 @@ module Avo
|
|
14
15
|
@display = args[:display].present? ? args[:display] : :show
|
15
16
|
@searchable = args[:searchable] == true
|
16
17
|
@description = args[:description]
|
18
|
+
@discreet_pagination = args[:discreet_pagination] || false
|
17
19
|
end
|
18
20
|
|
19
21
|
def searchable
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Avo
|
2
|
+
module Resources
|
3
|
+
module Controls
|
4
|
+
class Action < BaseControl
|
5
|
+
attr_reader :klass
|
6
|
+
|
7
|
+
def initialize(klass, model: nil, resource: nil, view: nil, **args)
|
8
|
+
super(**args)
|
9
|
+
|
10
|
+
@klass = klass
|
11
|
+
@resource = resource
|
12
|
+
@model = model
|
13
|
+
@view = view
|
14
|
+
end
|
15
|
+
|
16
|
+
def action
|
17
|
+
return @instance if @instance.present?
|
18
|
+
|
19
|
+
@instance = @klass.new(model: @model, resource: @resource, view: @view)
|
20
|
+
end
|
21
|
+
|
22
|
+
def path
|
23
|
+
Avo::Services::URIService.parse(@resource.record_path).append_paths("actions", action.param_id).to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def label
|
27
|
+
@args[:label] || action.action_name
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Avo
|
2
|
+
module Resources
|
3
|
+
module Controls
|
4
|
+
class ActionsList < BaseControl
|
5
|
+
def exclude
|
6
|
+
Array.wrap(@args[:exclude]) || []
|
7
|
+
end
|
8
|
+
|
9
|
+
def color
|
10
|
+
@args[:color] || :primary
|
11
|
+
end
|
12
|
+
|
13
|
+
def style
|
14
|
+
@args[:style] || :outline
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Avo
|
2
|
+
module Resources
|
3
|
+
module Controls
|
4
|
+
class BaseControl
|
5
|
+
def initialize(**args)
|
6
|
+
@args = args
|
7
|
+
end
|
8
|
+
|
9
|
+
def label
|
10
|
+
@args[:label] || @label
|
11
|
+
end
|
12
|
+
|
13
|
+
def title
|
14
|
+
@args[:title]
|
15
|
+
end
|
16
|
+
|
17
|
+
def color
|
18
|
+
@args[:color] || :gray
|
19
|
+
end
|
20
|
+
|
21
|
+
def style
|
22
|
+
@args[:style] || :text
|
23
|
+
end
|
24
|
+
|
25
|
+
def icon
|
26
|
+
@args[:icon] || nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def back_button?
|
30
|
+
is_a? Avo::Resources::Controls::BackButton
|
31
|
+
end
|
32
|
+
|
33
|
+
def edit_button?
|
34
|
+
is_a? Avo::Resources::Controls::EditButton
|
35
|
+
end
|
36
|
+
|
37
|
+
def delete_button?
|
38
|
+
is_a? Avo::Resources::Controls::DeleteButton
|
39
|
+
end
|
40
|
+
|
41
|
+
def actions_list?
|
42
|
+
is_a? Avo::Resources::Controls::ActionsList
|
43
|
+
end
|
44
|
+
|
45
|
+
def link_to?
|
46
|
+
is_a? Avo::Resources::Controls::LinkTo
|
47
|
+
end
|
48
|
+
|
49
|
+
def detach_button?
|
50
|
+
is_a? Avo::Resources::Controls::DetachButton
|
51
|
+
end
|
52
|
+
|
53
|
+
def action?
|
54
|
+
is_a? Avo::Resources::Controls::Action
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require "dry-initializer"
|
2
|
+
|
3
|
+
# This object holds some data tha is usually needed to compute blocks around the app.
|
4
|
+
module Avo
|
5
|
+
module Resources
|
6
|
+
module Controls
|
7
|
+
class ExecutionContext
|
8
|
+
extend Dry::Initializer
|
9
|
+
|
10
|
+
option :context, default: proc { Avo::App.context }
|
11
|
+
option :params, default: proc { Avo::App.params }
|
12
|
+
option :view_context, default: proc { Avo::App.view_context }
|
13
|
+
option :current_user, default: proc { Avo::App.current_user }
|
14
|
+
option :items_holder, default: proc { Avo::Resources::Controls::ItemsHolder.new }
|
15
|
+
option :resource, optional: true
|
16
|
+
option :model, optional: true
|
17
|
+
option :view, optional: true
|
18
|
+
option :block, optional: true
|
19
|
+
|
20
|
+
delegate :authorize, to: Avo::Services::AuthorizationService
|
21
|
+
|
22
|
+
def handle
|
23
|
+
instance_exec(&block)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def back_button(**args)
|
29
|
+
items_holder.add_item Avo::Resources::Controls::BackButton.new(**args)
|
30
|
+
end
|
31
|
+
|
32
|
+
def delete_button(**args)
|
33
|
+
items_holder.add_item Avo::Resources::Controls::DeleteButton.new(**args)
|
34
|
+
end
|
35
|
+
|
36
|
+
def detach_button(**args)
|
37
|
+
items_holder.add_item Avo::Resources::Controls::DetachButton.new(**args)
|
38
|
+
end
|
39
|
+
|
40
|
+
def edit_button(**args)
|
41
|
+
items_holder.add_item Avo::Resources::Controls::EditButton.new(**args)
|
42
|
+
end
|
43
|
+
|
44
|
+
def link_to(label, path, **args)
|
45
|
+
items_holder.add_item Avo::Resources::Controls::LinkTo.new(label: label, path: path, **args)
|
46
|
+
end
|
47
|
+
|
48
|
+
def actions_list(**args)
|
49
|
+
items_holder.add_item Avo::Resources::Controls::ActionsList.new(**args)
|
50
|
+
end
|
51
|
+
|
52
|
+
def action(klass, **args)
|
53
|
+
# abort model.inspect
|
54
|
+
items_holder.add_item Avo::Resources::Controls::Action.new(klass, model: model, resource: resource, view: view, **args)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Avo
|
2
|
+
module Resources
|
3
|
+
module Controls
|
4
|
+
class LinkTo < BaseControl
|
5
|
+
def initialize(**args)
|
6
|
+
super(**args)
|
7
|
+
end
|
8
|
+
|
9
|
+
def path
|
10
|
+
@args[:path]
|
11
|
+
end
|
12
|
+
|
13
|
+
def target
|
14
|
+
@args[:target] || nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def data
|
18
|
+
@args[:data] || {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def class
|
22
|
+
@args[:class] || nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/avo/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class <%= class_name.camelize %> < Avo::BaseAction
|
2
|
-
self.name =
|
2
|
+
self.name = "<%= name.underscore.humanize %>"
|
3
3
|
|
4
4
|
def handle(**args)
|
5
5
|
models, fields, current_user, resource = args.values_at(:models, :fields, :current_user, :resource)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<div class="flex flex-col">
|
2
2
|
<%%= render Avo::PanelComponent.new(name: "<%= human_name %>") do |c| %>
|
3
3
|
<%% c.tools do %>
|
4
|
-
<%%= a_link('/avo', icon: 'heroicons/solid/academic-cap', style: :primary) do %>
|
4
|
+
<%%= a_link('/avo', icon: 'heroicons/solid/academic-cap', color: :primary, style: :primary) do %>
|
5
5
|
Dummy link
|
6
6
|
<%% end %>
|
7
7
|
<%% end %>
|