class Wedge::Component

Constants

REJECTED_CLIENT_OPTS

Public Class Methods

client_wedge_opts() click to toggle source
# File lib/wedge/component.rb, line 170
def client_wedge_opts
  wedge_config.opts_dup.reject {|k, v| REJECTED_CLIENT_OPTS.include? k }
end
components()
Alias for: wedge_components
config()
Alias for: wedge_config
dom()
Alias for: wedge_dom
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/wedge/component.rb, line 162
def method_missing(method, *args, &block)
  if wedge_opts.scope.respond_to?(method, true)
    wedge_opts.scope.send method, *args, &block
  else
    super
  end
end
new(*args, &block) click to toggle source

Override the default new behaviour

# File lib/wedge/component.rb, line 9
def new(*args, &block)
  obj = allocate

  obj.wedge_opts.js   = args.delete(:js)
  obj.wedge_opts.init = args.delete(:init)

  # Merge other args into opts
  args.each { |a| a.each {|k, v| obj.wedge_opts[k] = v } } if args.any?

  obj.wedge_opts.events.scope = obj

  # Set all the on events
  obj.wedge_opts.on.each do |*a, &b|
    obj.wedge_opts.events.add(*a.first.first, &a.first.last)
  end
  wedge_opts.added_class_events = true

  if obj.wedge_opts.init
    if obj.wedge_opts.init.is_a? Array
      obj.send :initialize, *obj.wedge_opts.init, &block
    else
      obj.send :initialize, obj.wedge_opts.init, &block
    end
  else
    obj.send :initialize, &block
  end

  unless wedge_opts.methods_wrapped
    obj.wedge_opts.methods_wrapped = wedge_opts.methods_wrapped = true

    public_instance_methods(false).each do |meth|
      alias_method :"wedge_original_#{meth}", :"#{meth}"
      define_method "#{meth}" do |*d_args, &blk|
        if server? && !wedge_opts.method_called && wedge_opts.js
          wedge_opts.method_called = meth
          wedge_opts.method_args   = *d_args
        end

        o_name = "wedge_original_#{meth}"

        if client? || method(o_name).parameters.length > 0
          result = send(o_name, *d_args, &blk)
        else
          result = send(o_name, &blk)
        end

        # Append the initialize javscript
        if server? && opts.js
          result = result.to_html if result.is_a? DOM
          result << wedge_javascript if result.is_a? String
        end

        result
      end
    end
  end

  obj
end
on(*args, &block)
Alias for: wedge_on
opts()
Alias for: wedge_opts
setup(&block)
Alias for: wedge_setup
tmpl(name, dom = false, remove = true)
Alias for: wedge_tmpl
wedge_components() click to toggle source

Shortcut for Wedge.components

@return [Hash, Wedge.components]

# File lib/wedge/component.rb, line 113
def wedge_components
  Wedge.components ||= {}
end
Also aliased as: components
wedge_config() click to toggle source
# File lib/wedge/component.rb, line 126
def wedge_config
  @wedge_config ||= begin
    args = Wedge.config.opts_dup.merge(klass: self, object_events: {})

    unless RUBY_ENGINE == 'opal'
      args[:file_path] = caller.first.gsub(/(?<=\.rb):.*/, '')
      args[:path_name] = args[:file_path]
        .gsub(%r{(#{Dir.pwd}/|.*(?=wedge))}, '')
        .gsub(/\.rb$/, '')
    end

    c = Config.new(args)

    # If extending from a plugin it will automatically require it.
    ancestors.each do |klass|
      next if klass.to_s == name.to_s

      if klass.method_defined?(:wedge_opts) && klass.wedge_opts.name.to_s =~ /_plugin$/
        c.requires klass.wedge_opts.name
      end
    end

    c
  end
end
Also aliased as: config
wedge_dom() click to toggle source
# File lib/wedge/component.rb, line 105
def wedge_dom
  @wedge_dom ||= DOM.new wedge_opts.html
end
Also aliased as: dom
wedge_on(*args, &block) click to toggle source
# File lib/wedge/component.rb, line 153
def wedge_on(*args, &block)
  if args.first.to_s != 'server'
    wedge_opts.on << [args, block]
  else
    wedge_on_server(&block)
  end
end
Also aliased as: on
wedge_on_server() { || ... } click to toggle source
# File lib/wedge/component.rb, line 174
def wedge_on_server(&block)
  if server?
    yield
  else
    m = Module.new(&block)

    m.public_instance_methods(false).each do |meth|
      wedge_opts.on_server_methods << meth.to_s

      define_method "#{meth}" do |*args, &blk|
        path_name = wedge_opts.path_name
        # event_id = "comp-event-#{$faye.generate_id}"

        payload = client_wedge_opts.reject do |k, _|
          %w(html tmpl requires plugins object_events js_loaded).include? k
        end
        payload[:method_called] = meth
        payload[:method_args]   = args

        HTTP.post("/#{wedge_opts.assets_url}/#{path_name}.call",
          headers: {
            'X-CSRF-TOKEN' => Element.find('meta[name=_csrf]').attr('content')
          },
          payload: payload) do |response|

            # We set the new csrf token
            xhr  = Native(response.xhr)
            csrf = xhr.getResponseHeader('BIO-CSRF-TOKEN')
            Element.find('meta[name=_csrf]').attr 'content', csrf
            ###########################

            res = JSON.from_object(`response`)

            blk.call res[:body], res
        end

        true
      end
    end

    include m
  end
end
wedge_opts() click to toggle source

Shortcut for the Config#opts

@return [Openstruct, Config#opts]

# File lib/wedge/component.rb, line 121
def wedge_opts
  wedge_config.opts
end
Also aliased as: opts
wedge_setup(&block) click to toggle source

Used to setup the component with default options.

@example

class SomeComponent < Component
  setup do |config|
    config.name :some
  end
end

@yield [Config]

# File lib/wedge/component.rb, line 78
def wedge_setup(&block)
  block.call wedge_config
end
Also aliased as: setup
wedge_tmpl(name, dom = false, remove = true) click to toggle source

Set templates

@example

tmpl :some_name, dom.find('#some-div')

@return dom [DOM]

# File lib/wedge/component.rb, line 88
def wedge_tmpl(name, dom = false, remove = true)
  if dom
    dom = remove ? dom.remove : dom
    wedge_opts.tmpl[name] = {
      dom:  dom,
      html: dom.to_html
    }
  elsif t = wedge_opts.tmpl[name]
    dom = DOM.new t[:html]
  else
    false
  end

  dom
end
Also aliased as: tmpl

Public Instance Methods

client_opts()
Alias for: client_wedge_opts
client_wedge_opts() click to toggle source
# File lib/wedge/component.rb, line 297
def client_wedge_opts
  wedge_config.opts_dup.reject {|k, v| REJECTED_CLIENT_OPTS.include? k }
end
Also aliased as: client_opts
config()
Alias for: wedge_config
dom()
Alias for: wedge_dom
function(*args, &block)
Alias for: wedge_function
javscript()
Alias for: wedge_javascript
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/wedge/component.rb, line 313
def method_missing(method, *args, &block)
  if wedge_opts.scope.respond_to?(method, true)
    wedge_opts.scope.send method, *args, &block
  else
    super
  end
end
opts()
Alias for: wedge_opts
tmpl(name)
Alias for: wedge_tmpl
trigger(*args)
Alias for: wedge_trigger
wedge(*args) click to toggle source
# File lib/wedge/component.rb, line 308
def wedge(*args)
  Wedge[*args]
end
wedge_config() click to toggle source

Duplicate of class condig [Config] @return config [Config]

# File lib/wedge/component.rb, line 221
def wedge_config
  @wedge_config ||= begin
    c = Config.new(self.class.wedge_config.opts_dup.merge(events: Events.new))
    c.opts.events.object_events = c.opts.object_events.dup
    c.opts.object_events = {}
    c
  end
end
Also aliased as: config
wedge_dom() click to toggle source

Dom @return wedge_dom [Dom]

# File lib/wedge/component.rb, line 247
def wedge_dom
  @wedge_dom ||= begin
    if server?
      DOM.new self.class.wedge_dom.to_html
    else
      DOM.new(Element)
    end
  end
end
Also aliased as: dom
wedge_function(*args, &block) click to toggle source

Special method that acts like the javascript equivalent @example

foo = {
  bar: function { |moo|
    moo.call 'something'
  }
}.to_n
# File lib/wedge/component.rb, line 265
def wedge_function(*args, &block)
  args.any? && raise(ArgumentError, '`function` does not accept arguments')
  block || raise(ArgumentError, 'block required')
  proc do |*a|
    a.map! {|x| Native(`x`)}
    @this = Native(`this`)
    %x{
     var bs = block.$$s,
        result;
      block.$$s = null;
      result = block.apply(self, a);
      block.$$s = bs;
      
      return result;
    }
  end
end
Also aliased as: function
wedge_javascript() click to toggle source
# File lib/wedge/component.rb, line 284
    def wedge_javascript
      return unless server?

      compiled_opts = Base64.encode64 client_wedge_opts.to_json
      name          = wedge_opts.file_path.gsub("#{Dir.pwd}/", '').gsub(/\.rb$/, '')

      javascript = <<-JS
        Wedge.javascript('#{name}', JSON.parse(Base64.decode64('#{compiled_opts}')))
      JS
      "<script>#{Opal.compile(javascript)}</script>"
    end
Also aliased as: javscript
wedge_opts() click to toggle source

Duplicated of config.opts [Config#opts] @return opts [Config#opts]

# File lib/wedge/component.rb, line 233
def wedge_opts
  wedge_config.opts
end
Also aliased as: opts
wedge_tmpl(name) click to toggle source

Grab a copy of the template @return dom [DOM]

# File lib/wedge/component.rb, line 240
def wedge_tmpl(name)
  self.class.wedge_tmpl name
end
Also aliased as: tmpl
wedge_trigger(*args) click to toggle source
# File lib/wedge/component.rb, line 302
def wedge_trigger(*args)
  wedge_opts.events.trigger(*args)
end
Also aliased as: trigger