class Wedge::Events
Constants
- VIP_ORDER_LIST
Attributes
browser_events[RW]
object_events[RW]
scope[RW]
Public Class Methods
new()
click to toggle source
# File lib/wedge/events.rb, line 7 def initialize @browser_events = [] @object_events = {} end
Public Instance Methods
add(*args, &block)
click to toggle source
# File lib/wedge/events.rb, line 12 def add(*args, &block) event = { name: args.shift, block: block, options: {} } args.each do |arg| if arg.is_a?(String) event[:selector] = arg elsif arg.is_a? Class event[:klass] = arg else event[:options] = event[:options].merge(arg).indifferent.to_h end end if event[:name].to_s == 'ready' || event[:name] =~ /[:\s]/ || event[:selector] browser_events << event else event[:component] = scope.wedge_opts.name if !scope.class.wedge_opts.added_class_events && for_component = event[:options].delete(:for) wedge_opts = Wedge.components[for_component].klass.wedge_opts events = wedge_opts.object_events[event.delete(:name)] ||= [] events << event else events = object_events[event.delete(:name)] ||= [] events << event end end end
trigger(name, options = {})
click to toggle source
# File lib/wedge/events.rb, line 45 def trigger(name, options = {}) name = name.to_s options = options.indifferent case name when 'browser_events' # We make sure anything in the VIP_ORDER_LIST goes first (browser_events.sort_by do |x| [VIP_ORDER_LIST.index(x[:name]) || VIP_ORDER_LIST.length, browser_events.index(x)] end).each do |event| trigger_browser_event event end else events = object_events[name] || [] events.each do |event| Wedge[event[:component]].instance_exec options, &event[:block] end end end
trigger_browser_event(event)
click to toggle source
# File lib/wedge/events.rb, line 65 def trigger_browser_event event comp = Wedge[scope.wedge_opts.name] case event[:name] when 'ready' el = Element.find(event[:selector] != '' ? event[:selector] : 'body') comp.instance_exec el, &event[:block] when 'history_change' $window.history.change do |he| comp.instance_exec he, &event[:block] end when 'form' warn 'missing form class option' unless event[:klass] Document.on :submit, event[:selector] do |evt| el = evt.current_target evt.prevent_default params = {} # loop through all the forum values el.serialize_array.each do |row| field, _ = row # we need to make it native to access it like ruby field = Native(field) name = field['name'] value = field['value'] params[name] = value end params_obj = {} params.each do |param, value| keys = param.gsub(/[^a-z0-9_]/, '|').gsub(/\|\|/, '|').gsub(/\|$/, '').split('|') params_obj = params_obj.deep_merge keys.reverse.inject(value) { |a, n| { n => a } } end opts[:dom] = el if opts && key = opts[:key] form = event[:klass].new params_obj[key], opts else form = event[:klass].new params_obj, opts end el.find(opts[:error_selector] || '.field-error').remove comp.instance_exec form, evt.current_target, evt, &event[:block] end else args = [event[:name]] if selector = event[:selector] args << selector end Document.on(*args) do |evt| el = evt.current_target comp.instance_exec el, evt, &event[:block] end if event[:name] =~ /ready/ el = Element.find(event[:selector] != '' ? event[:selector] : 'body') comp.instance_exec el, &event[:block] end end end