class Bluesky::PureComponent

A presentation ‘Component`

Public Class Methods

attribute(name, *args) click to toggle source
# File lib/bluesky/pure_component.rb, line 122
def self.attribute(name, *args)
  case args.length
  when 0
    define_method(name) do |&block|
      if block
        _data.store(name, block)
        block
      else
        _data.fetch(name)
      end
    end
  when 1
    if args[0].respond_to?(:call)
      define_method(name) { _data.fetch(name) { _data.store(name, args[0].call) } }
    else
      define_method(name) { _data.fetch(name, args[0]) }
    end
  else
    raise ArgumentError, %{ wrong number of arguments
                            (#{args.length} for 1..2) }
  end
  define_method("#{name}=") { |value| _data.store(name, value) }
end
inherited(subclass) click to toggle source
# File lib/bluesky/pure_component.rb, line 76
def self.inherited(subclass)
  DSL.send(:define_method, subclass.name) do |data = {}, delegate = nil, &block|
    delegate ||= @delegate
    component = subclass.new(data, delegate)
    block.call(component) if block
    component
  end

  @descendants << subclass
end
install_hooks(debug=false) click to toggle source
# File lib/bluesky/pure_component.rb, line 87
def self.install_hooks(debug=false)

  @descendants.each do |subclass|

    if subclass.instance_methods.include?(:component_did_mount) ||
       subclass.instance_methods.include?(:component_will_unmount)
      subclass.class_eval { `Opal.defn(self, '$$mountable', true);` }
    end

    if subclass.instance_methods.include?(:component_will_mount)
      subclass.class_eval { `Opal.defn(self, '$$hook_will_mount', true);` }
    end
    subclass.send(:alias_method, :do_render, :render) unless
      subclass.instance_methods.include?(:do_render)

    subclass.send(:define_method, :render) do
      begin
        $$.console.time("#{subclass.name}:render") if debug
        %x{
          var contents = #{do_render};
          if (self.$$mountable) contents.properties.ref = self;
          return contents;
        }
      rescue Object => err
        warn err
        div({ class: 'broken', style: { display: :none } }, [err.message])
      ensure
        $$.console.timeEnd("#{subclass.name}:render") if debug
      end
    end

  end

end
new(data = {}, delegate = nil) click to toggle source
# File lib/bluesky/pure_component.rb, line 146
def initialize(data = {}, delegate = nil)
  @data     = data
  @delegate = delegate
end

Public Instance Methods

dispatch(action, *payload, &block) click to toggle source
# File lib/bluesky/pure_component.rb, line 166
def dispatch(action, *payload, &block)
  warn 'Missing delegate' unless @delegate
  root = @delegate
  root = root.parent while root.respond_to?(:parent) && root.parent
  root.dispatch(@delegate, action, *payload, &block)
end
mount() click to toggle source
# File lib/bluesky/pure_component.rb, line 173
def mount
  @mounted = true
end
mounted?() click to toggle source
# File lib/bluesky/pure_component.rb, line 181
def mounted?
  !!@mounted
end
shallow_equal?(a, b) click to toggle source
# File lib/bluesky/pure_component.rb, line 151
def shallow_equal?(a, b)
  a.equal?(b) || a.each_pair.all? do |k, v|
    bk = b[k]
    v.equal?(bk) || v.eql?(bk)
  end
rescue Object => _
  false
end
should_render?(previous) click to toggle source
# File lib/bluesky/pure_component.rb, line 160
def should_render?(previous)
  # puts "#{self.class.name}:should_render? #{(@delegate && @delegate.force_update?)}, #{!shallow_equal?(_data, previous._data)}"
  (@delegate && @delegate.force_update?) ||
    !shallow_equal?(_data, previous._data)
end
unmount() click to toggle source
# File lib/bluesky/pure_component.rb, line 177
def unmount
  @mounted = false
end

Protected Instance Methods

_data() click to toggle source
# File lib/bluesky/pure_component.rb, line 187
def _data
  @data
end