class Wedge::Component

Attributes

wedge_on_count[RW]
method_called[RW]
wedge_method_called[RW]

Public Class Methods

config()
Alias for: wedge_config
dom(&block)
Alias for: wedge_dom
html(html = '', &block)
Alias for: wedge_html
html!(&b) click to toggle source
# File lib/wedge/component.rb, line 249
def html!(&b)
  Wedge.html!(self, &b)
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/wedge/component.rb, line 142
def method_missing(method, *args, &block)
  if wedge_config.scope.respond_to?(method, true)
    wedge_config.scope.send method, *args, &block
  else
    super
  end
end
name(*args)
Also aliased as: original_name
Alias for: wedge_name
on(*args, &block)
Alias for: wedge_on
original_name(*args)
Alias for: name
plugin(*args) click to toggle source
# File lib/wedge/component.rb, line 40
def plugin *args
  Wedge.plugin *args
end
set_dom(dom) click to toggle source
# File lib/wedge/component.rb, line 245
def set_dom dom
  @wedge_dom = dom.is_a?(Wedge::DOM) ? dom : Wedge::DOM.new(dom)
end
store() click to toggle source
# File lib/wedge/component.rb, line 253
def store
  wedge_config.store
end
tmpl(name, dom = false, remove = true)
Alias for: wedge_tmpl
wedge_config() click to toggle source
# File lib/wedge/component.rb, line 124
def wedge_config
  @wedge_config ||= Config.new klass: self, scope: Wedge.config.scope, plugins: Wedge.config.plugins
end
Also aliased as: config
wedge_dom() { || ... } click to toggle source
# File lib/wedge/component.rb, line 112
def wedge_dom &block

  unless RUBY_ENGINE == 'opal'
    if block_given?
      yield
    end
  end

  @wedge_dom ||= DOM.new wedge_config.html
end
Also aliased as: dom
wedge_html(html = '') { || ... } click to toggle source
# File lib/wedge/component.rb, line 75
def wedge_html(html = '', &block)
  unless RUBY_ENGINE == 'opal'
    wedge_config.html = begin
      File.read html
    rescue
      (html.is_a?(HTML::DSL) || html.is_a?(DOM)) ? html.to_html : html
    end.strip

    if block_given?
      yield
    end
  end
end
Also aliased as: html
wedge_name(*args) click to toggle source
# File lib/wedge/component.rb, line 45
def wedge_name(*args)
  if args.any?
    unless RUBY_ENGINE == 'opal'
      # set the file path
      path = "#{caller[0]}".gsub(/(?<=\.rb):.*/, '')
        .gsub(%r{(#{Dir.pwd}/#{Wedge.config.app_dir}/|.*(?=wedge))}, '')
        .gsub(/\.rb$/, '')
    end

    @wedge_on_count = 0

    args.each do |name|
      # set the name
      wedge_config.name = name

      unless RUBY_ENGINE == 'opal'
        # set the file path
        wedge_config.path = path
        # add it to the component class list allow path or name
        Wedge.config.component_class[path.gsub(/\//, '__')] = self
      end

      Wedge.config.component_class[name] = self
    end
  else
    original_name
  end
end
Also aliased as: name
wedge_new(klass, *args, &block) click to toggle source
# File lib/wedge/component.rb, line 12
def wedge_new(klass, *args, &block)
  obj = allocate

  # discuss: come up with something better
  obj.wedge_method_called = klass.method_called

  %w(store scope).each do |meth|
    if value = klass.send(meth)
      obj.config.send "#{meth}=", value
    end
  end

  unless RUBY_ENGINE == 'opal'
    obj.config.on_compile.each do |blk|
      obj.instance_exec &blk
    end
  end

  if args.length > 0
    obj.config.initialize_args = args
    obj.send :initialize, *args, &block
  else
    obj.send :initialize, &block
  end

  obj
end
wedge_on(*args, &block) click to toggle source
# File lib/wedge/component.rb, line 129
def wedge_on(*args, &block)
  case args.first.to_s
  when 'server'
    wedge_on_server(&block)
  when 'compile'
    wedge_config.on_compile << block unless RUBY_ENGINE == 'opal'
  else
    @wedge_on_count += 1
    Wedge.events.add(config.name, *args, &block)
  end
end
Also aliased as: on
wedge_on_server(m = false) { || ... } click to toggle source
# File lib/wedge/component.rb, line 150
def wedge_on_server(m = false, &block)
  m ||= Module.new(&block)

  if RUBY_ENGINE != 'opal'
    yield if block_given?

    m.public_instance_methods(false).each do |meth|
      config.server_methods << meth.to_s

      alias_method :"wedge_on_server_#{meth}", :"#{meth}"
      define_method "#{meth}" do |*args, &blk|
        o_name = "wedge_on_server_#{meth}"

        if method(o_name).parameters.length > 0
          result = send(o_name, *args, &block)
        else
          result = send(o_name, &block)
        end

        blk ? blk.call(result) : result
      end
    end
  else
    m.public_instance_methods(false).each do |meth|
      config.server_methods << meth.to_s

      define_method "#{meth}" do |*args, &blk|
        path_name = config.path

        payload = config.client_data.reject do |k, _|
          %w(html tmpl requires plugins object_events js_loaded).include? k
        end
        payload[:__wedge_name__]   = payload[:name]
        payload[:__wedge_method__] = meth
        payload[:__wedge_args__]   = args

        # we want to remove the assets key from the call so we don't get
        # an error if they assets_key has changed and the user hasn't
        # refreshed the browser yet.
        call_url = "#{Wedge.config.assets_key.present?? Wedge.assets_url.sub("/#{Wedge.config.assets_key}",'') : Wedge.assets_url}/#{path_name}.call"

        if block_given?
          HTTP.post(call_url,
            headers: {
              'X-CSRF-TOKEN' => Element.find('meta[name=_csrf]').attr('content'),
              'X-WEDGE-METHOD-REQUEST' => meth
            },
            payload: payload) do |response|

              # We set the new csrf token
              xhr  = Native(response.xhr)
              # discuss: I don't think we should update the csrf token every ajax call
              # csrf = xhr.getResponseHeader('WEDGE-CSRF-TOKEN')
              # Element.find('meta[name=_csrf]').attr 'content', csrf
              ###########################

              res = JSON.from_object(`response`)

              results = blk.call res[:body], res

              # Element.trigger 'wedge:call-finished'

              results
          end
        else
          data = {
            headers: {
             'X-CSRF-TOKEN' => "#{Element.find('meta[name=_csrf]').attr('content')}",
             'X-WEDGE-METHOD-REQUEST' => meth
            },
            dataType: 'json',
            type: 'POST',
            url: call_url,
            data: payload,
            async: false
          }.to_n

          response = `$.ajax(data).responseText`
          begin
            JSON.parse response
          rescue
            if response.empty?
              raise "Ajax response to #{call_url} was empty."
            else
              puts response
            end
          end
        end
      end
    end

    include m
  end
end
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 95
def wedge_tmpl(name, dom = false, remove = true)
  if dom
    dom = remove ? dom.remove : dom
    wedge_config.tmpl[name] = {
      dom:  dom,
      html: dom.to_html
    }
  elsif t = wedge_config.tmpl[name]
    dom = DOM.new t[:html]
  else
    false
  end

  dom
end
Also aliased as: tmpl

Public Instance Methods

class_store()
Alias for: wedge_class_store
config()
Alias for: wedge_config
dom()
Alias for: wedge_dom
from_client?()
Alias for: wedge_from_client?
from_server?()
Alias for: wedge_from_server?
function(*args, &block)
Alias for: wedge_function
html!(&b)
Alias for: wedge_html
javscript(method = false, *args)
Alias for: wedge_javascript
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/wedge/component.rb, line 416
def method_missing(method, *args, &block)
  if config.scope.respond_to?(method, true)
    config.scope.send method, *args, &block
  else
    super
  end
end
method_url(method, *args)
Alias for: wedge_method_url
scope()
Alias for: wedge_scope
store()
Alias for: wedge_store
tmpl(name)
Alias for: wedge_tmpl
to_js(method = false, *args) click to toggle source
# File lib/wedge/component.rb, line 404
def to_js(method = false, *args)
  response = args.any? ? send(method, *args) : send(method)
  response = response.to_html if response.is_a? DOM
  response << wedge_javascript(method, *args) if response.is_a? String
  response
end
trigger(event_name, *args)
Alias for: wedge_trigger
wedge(*args, &block) click to toggle source

We want the scope to override this method if defined

# File lib/wedge/component.rb, line 259
def wedge(*args, &block)
  # fix: can't pass block to Wedge, opal error:
  # https://github.com/opal/opal/issues/959
  # scope.respond_to?(:wedge) ? scope.wedge(*args, &block) : Wedge[*args, &block]
  scope.respond_to?(:wedge) ? scope.wedge(*args, &block) : Wedge[*args]
end
wedge_class_store() click to toggle source
# File lib/wedge/component.rb, line 281
def wedge_class_store
  self.class.wedge_config.store
end
Also aliased as: class_store
wedge_config() click to toggle source

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

# File lib/wedge/component.rb, line 288
def wedge_config
  @wedge_config ||= Config.new(self.class.wedge_config.data.deep_dup)
end
Also aliased as: config
wedge_dom() click to toggle source

Dom @return wedge_dom [Dom]

# File lib/wedge/component.rb, line 302
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_from_client?() click to toggle source
# File lib/wedge/component.rb, line 364
def wedge_from_client?
  begin
    wedge_method_called == caller_locations(1,1)[0].label
  rescue
    false
  end
end
Also aliased as: from_client?
wedge_from_server?() click to toggle source
# File lib/wedge/component.rb, line 353
def wedge_from_server?
  begin
    !(wedge_method_called == caller_locations(1,1)[0].label)
  rescue
    true
  end
end
Also aliased as: from_server?
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 320
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_html(&b) click to toggle source
# File lib/wedge/component.rb, line 411
def wedge_html(&b)
  Wedge.html!(self, &b)
end
Also aliased as: html!
wedge_javascript(method = false, *args) click to toggle source
# File lib/wedge/component.rb, line 373
    def wedge_javascript(method = false, *args)
      return unless server?

      client_data = config.client_data.dup
      client_data.merge!(
        method_called: method,
        method_args: args,
        initialize_args: config.initialize_args
      )

      compiled_opts = Base64.encode64 client_data.to_json

      begin
        javascript = <<-JS
          Wedge.javascript('#{config.path}', JSON.parse(Base64.decode64('#{compiled_opts}')), '#{javascript_path(config.path)}')
        JS
      rescue
        javascript = <<-JS
          Wedge.javascript('#{config.path}', JSON.parse(Base64.decode64('#{compiled_opts}')))
        JS
      end

      "<script>#{Opal.compile(javascript)}</script>"
    end
Also aliased as: javscript
wedge_method_url(method, *args) click to toggle source
# File lib/wedge/component.rb, line 339
def wedge_method_url method, *args
  call_url = "#{Wedge.config.assets_key.present?? Wedge.assets_url.sub("/#{Wedge.config.assets_key}",'') : Wedge.assets_url}/#{wedge_config.path}.call"

  wedge_args = []
  args.each do |arg|
    wedge_args << "__wedge_args__[]=#{arg}"
  end

  wedge_args = (wedge_args.length > 0 ? "&#{wedge_args.join('&')}" : '')

  "#{call_url}?__wedge_name__=#{wedge_config.name}&__wedge_method__=#{method}#{wedge_args}"
end
Also aliased as: method_url
wedge_plugin(name, *args, &block) click to toggle source

We want the scope to override this method if defined

# File lib/wedge/component.rb, line 267
def wedge_plugin(name, *args, &block)
  scope.respond_to?(:wedge_plugin) ? scope.wedge_plugin(*args, &block) : wedge("#{name}_plugin", *args, &block)
end
wedge_scope() click to toggle source
# File lib/wedge/component.rb, line 271
def wedge_scope
  wedge_config.scope
end
Also aliased as: scope
wedge_store() click to toggle source
# File lib/wedge/component.rb, line 276
def wedge_store
  wedge_config.store
end
Also aliased as: store
wedge_tmpl(name) click to toggle source

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

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