Sha256: 432f87bcf010567975b54ae49b09bd90b3e1c85d95fbf3596ef0136ee141798c

Contents?: true

Size: 1.47 KB

Versions: 1

Compression:

Stored size: 1.47 KB

Contents

module MotionPrime
  module ScreenSectionsMixin
    extend ::MotionSupport::Concern

    include HasClassFactory
    include HasNormalizer

    def self.included(base)
      base.class_attribute :_section_options
    end

    def add_sections
      create_sections
      render_sections
    end

    def all_sections
      @sections.values
    end

    def create_sections
      section_options = self.class._section_options
      return unless section_options
      @sections = {}
      section_options.map do |name, options|
        section = create_section(options.clone)
        @sections[name] = section if section
      end
    end

    def create_section(options)
      section_class = class_factory("#{options.delete(:name)}_section")
      options = normalize_options(options).merge(screen: self)
      !options.has_key?(:if) || options[:if] ? section_class.new(options) : nil
    end

    def render_sections
      return unless @sections
      if all_sections.count > 1
        @main_section = MotionPrime::TableSection.new(model: all_sections, screen: self)
        @main_section.render
      else
        all_sections.first.render
      end
    end

    def main_section
      @main_section || all_sections.first
    end

    module ClassMethods
      def section(name, options = {})
        self._section_options ||= {}
        self._section_options[name.to_sym] = options.merge(name: name)

        define_method name do
          @sections[name]
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
motion-prime-0.8.1 motion-prime/screens/_sections_mixin.rb