class Para::ComponentsConfiguration::Component

Attributes

identifier[RW]
model[RW]
options[RW]
parent[RW]
shown_if[RW]
type[RW]

Public Class Methods

new(identifier, type_identifier, shown_if: nil, **options, &block) click to toggle source
# File lib/para/components_configuration.rb, line 180
def initialize(identifier, type_identifier, shown_if: nil, **options, &block)
  @identifier = identifier.to_s
  @type = Para::Component.registered_components[type_identifier]
  @options = options
  @shown_if = shown_if
  @parent = options.delete(:parent)

  # Build child components if a block is provided
  instance_eval(&block) if block

  return if type

  raise UndefinedComponentTypeError, "Undefined Para component : #{type_identifier}. " +
                                     'Please ensure that your app or gems define this component type.'
end

Public Instance Methods

child_components() click to toggle source
# File lib/para/components_configuration.rb, line 205
def child_components
  @child_components ||= []
end
component(*args, **child_options, &block) click to toggle source
# File lib/para/components_configuration.rb, line 196
def component(*args, **child_options, &block)
  # Do not allow nesting components more than one level as the display of illimited
  # child nesting deepness is not implemented
  raise ComponentTooDeepError, 'Cannot nest components more than one level' if parent

  child_component_options = child_options.merge(parent: self)
  child_components << Component.new(*args, **child_component_options, &block)
end
options_with_defaults() click to toggle source

Ensures unset :configuration store options are set to nil to allow removing a configuration option from the components.rb file

# File lib/para/components_configuration.rb, line 222
def options_with_defaults
  configurable_keys = type.local_stored_attributes.try(:[], :configuration) || []
  configurable_keys += options.keys
  configurable_keys.uniq!

  options_with_defaults = {}

  # Assign parent component resource to the final attribute options, assigning nil
  # if the `:parent` option is empty, to allow extracting a component from its
  # parent by just moving the component call outside of its parent block.
  options_with_defaults[:parent_component] = parent&.model

  configurable_keys.each_with_object(options_with_defaults) do |key, hash|
    hash[key] = options[key]
  end
end
refresh(attributes = {}) click to toggle source
# File lib/para/components_configuration.rb, line 209
def refresh(attributes = {})
  @model = type.where(identifier: identifier).first_or_initialize
  model.update_with(attributes.merge(options_with_defaults))
  model.save!

  child_components.each_with_index do |child_component, child_index|
    child_component.refresh(component_section: nil, position: child_index)
  end
end