Sha256: 4bbd633e26abce5c506928ccb5a662d7083924a8aa24cfcace7d4cb268435125

Contents?: true

Size: 1.42 KB

Versions: 24

Compression:

Stored size: 1.42 KB

Contents

# frozen_string_literal: true

module Maglev
  class BaseComponent
    extend Forwardable
    def_delegators :view_context, :render

    attr_accessor :view_context

    def build(component_class, attributes)
      component_class.new(**attributes).tap do |component|
        component.view_context = view_context
      end
    end

    # Useful helper to avoid manipulating hashes
    # eg.: <%= section.settings.body %> instead of <%= section.settings[:body] %>
    def settings_proxy(map)
      settings_keys = map.keys
      return nil if settings_keys.blank?

      settings_struct = Struct.new(*settings_keys)
      settings_struct.new(*map.values)
    end

    def build_settings_map(settings)
      definition.settings.inject({}) do |memo, setting_def|
        memo.merge(
          setting_def.id.to_sym => build_content(
            self,
            find_setting_value(settings, setting_def),
            setting_def
          )
        )
      end
    end

    def build_content(scope, content, setting)
      Maglev::Content::Builder.build(scope, content, setting)
    end

    private

    def find_setting_value(settings, definition)
      settings.find { |setting| definition.id == setting[:id] }&.[](:value)
    end

    def find_setting(settings, setting_id)
      settings.public_send(setting_id)
    rescue NoMethodError
      raise "[Maglev] We're sorry but there is no '#{setting_id}' setting in your section/block."
    end
  end
end

Version data entries

24 entries across 24 versions & 1 rubygems

Version Path
maglevcms-1.7.3 app/components/maglev/base_component.rb
maglevcms-1.7.2 app/components/maglev/base_component.rb
maglevcms-1.7.1 app/components/maglev/base_component.rb
maglevcms-1.7.0 app/components/maglev/base_component.rb
maglevcms-1.6.1 app/components/maglev/base_component.rb
maglevcms-1.6.0 app/components/maglev/base_component.rb
maglevcms-1.5.1 app/components/maglev/base_component.rb
maglevcms-1.4.0 app/components/maglev/base_component.rb
maglevcms-1.3.0 app/components/maglev/base_component.rb
maglevcms-1.2.2 app/components/maglev/base_component.rb
maglevcms-1.2.1 app/components/maglev/base_component.rb
maglevcms-1.2.0 app/components/maglev/base_component.rb
maglevcms-1.1.7 app/components/maglev/base_component.rb
maglevcms-1.1.6 app/components/maglev/base_component.rb
maglevcms-1.1.5 app/components/maglev/base_component.rb
maglevcms-1.1.4 app/components/maglev/base_component.rb
maglevcms-1.1.3 app/components/maglev/base_component.rb
maglevcms-1.1.2 app/components/maglev/base_component.rb
maglevcms-1.1.1 app/components/maglev/base_component.rb
maglevcms-1.1.0 app/components/maglev/base_component.rb