Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: move fields logic to concern #915

Merged
merged 4 commits into from May 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Method parse_symbol has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Method parse_symbol has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.

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