Skip to content

Commit

Permalink
refactor: move fields logic to concern (#915)
Browse files Browse the repository at this point in the history
  • Loading branch information
adrianthedev committed May 23, 2022
1 parent ea16361 commit 0fc1f95
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 78 deletions.
4 changes: 2 additions & 2 deletions lib/avo/base_action.rb
@@ -1,8 +1,9 @@
module Avo
class BaseAction
extend FieldsCollector
extend HasContext

include Avo::Concerns::HasFields

class_attribute :name, default: nil
class_attribute :message
class_attribute :confirm_button_label
Expand All @@ -12,7 +13,6 @@ class BaseAction
class_attribute :view
class_attribute :user
class_attribute :resource
class_attribute :fields
class_attribute :invalid_fields
class_attribute :standalone, default: false
class_attribute :visible
Expand Down
3 changes: 1 addition & 2 deletions lib/avo/base_resource.rb
@@ -1,11 +1,11 @@
module Avo
class BaseResource
extend ActiveSupport::DescendantsTracker
extend FieldsCollector
extend HasContext

include ActionView::Helpers::UrlHelper
include Avo::Concerns::HasTools
include Avo::Concerns::HasFields

delegate :view_context, to: "Avo::App"
delegate :main_app, to: :view_context
Expand Down Expand Up @@ -33,7 +33,6 @@ class BaseResource
class_attribute :devise_password_optional, default: false
class_attribute :actions_loader
class_attribute :filters_loader
class_attribute :fields
class_attribute :grid_loader
class_attribute :visible_on_sidebar, default: true
class_attribute :unscoped_queries_on_index, default: false
Expand Down
93 changes: 93 additions & 0 deletions lib/avo/concerns/has_fields.rb
@@ -0,0 +1,93 @@
module Avo
module Concerns
module HasFields
extend ActiveSupport::Concern

included do
class_attribute :fields
class_attribute :fields_index, default: 0
end

class_methods do
def field(field_name, as:, **args, &block)
self.invalid_fields ||= []

field_instance = parse_field(field_name, as: as, order_index: fields_index, **args, &block)

if field_instance.present?
add_to_fields field_instance
else
self.invalid_fields << ({
name: field_name,
as: as,
resource: name,
message: "There's an invalid field configuration for this resource. <br/> <code class='px-1 py-px rounded bg-red-600'>field :#{field_name}, as: #{as}</code>"
})
end
end

def parse_field(field_name, as:, **args, &block)
# The field is passed as a symbol eg: :text, :color_picker, :trix
if as.is_a? Symbol
parse_symbol field_name, as: as, **args, &block
elsif as.is_a? Class
parse_class field_name, as: as, **args, &block
end
end

def heading(body, **args)
add_to_fields Avo::Fields::HeadingField.new(body, order_index: fields_index, **args)
end

private

def add_to_fields(instance)
self.fields ||= []
self.fields << instance
self.fields_index += 1
end

def instantiate_field(field_name, klass:, **args, &block)
if block
klass.new(field_name, **args || {}, &block)
else
klass.new(field_name, **args || {})
end
end

def field_class_from_symbol(symbol)
matched_field = Avo::App.fields.find do |field|
field[:name].to_s == symbol.to_s
end

return matched_field[:class] if matched_field.present? && matched_field[:class].present?
end

def parse_symbol(field_name, as:, **args, &block)
field_class = field_class_from_symbol(as)

if field_class.present?
# The field has been registered before.
instantiate_field(field_name, klass: field_class, **args, &block)
else
# The symbol can be transformed to a class and found.
class_name = as.to_s.camelize
field_class = "#{class_name}Field"

# Discover & load custom field classes
if Object.const_defined? field_class
instantiate_field(field_name, klass: field_class.safe_constantize, **args, &block)
end
end
end

def parse_class(field_name, as:, **args, &block)
# The field has been passed as a class.
if Object.const_defined? as.to_s
instantiate_field(field_name, klass: as, **args, &block)
end
end
end
end
end
end
70 changes: 0 additions & 70 deletions lib/avo/fields_collector.rb

This file was deleted.

8 changes: 4 additions & 4 deletions lib/avo/grid_collector.rb
@@ -1,6 +1,6 @@
module Avo
class GridCollector
include FieldsCollector
include Avo::Concerns::HasFields

attr_accessor :cover_field
attr_accessor :title_field
Expand All @@ -13,15 +13,15 @@ def initialize
end

def cover(field_name, as:, **args, &block)
self.cover_field = parse_field(field_name, as: as, **args, &block)
self.cover_field = self.class.parse_field(field_name, as: as, **args, &block)
end

def title(field_name, as:, **args, &block)
self.title_field = parse_field(field_name, as: as, **args, &block)
self.title_field = self.class.parse_field(field_name, as: as, **args, &block)
end

def body(field_name, as:, **args, &block)
self.body_field = parse_field(field_name, as: as, **args, &block)
self.body_field = self.class.parse_field(field_name, as: as, **args, &block)
end

def hydrate(model:, view:, resource:)
Expand Down
2 changes: 2 additions & 0 deletions spec/features/avo/belongs_to_polymorphic_spec.rb
Expand Up @@ -257,6 +257,7 @@
write_in_search "A"

wait_for_search_loaded
sleep 0.1

expect(find(".aa-Panel")).to have_content "Avocados"
expect(find(".aa-Panel")).to have_content "Artichokes"
Expand All @@ -265,6 +266,7 @@
write_in_search "Avocado"

wait_for_search_loaded
sleep 0.1

select_first_result_in_search
wait_for_search_to_dissapear
Expand Down

0 comments on commit 0fc1f95

Please sign in to comment.