class Para::ComponentsConfiguration::Component
Attributes
Public Class Methods
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
Source
# File lib/para/components_configuration.rb, line 205 def child_components @child_components ||= [] end
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
Source
# 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
Ensures unset :configuration store options are set to nil to allow removing a configuration option from the components.rb file
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