class Conjoin::Widgets::Base

Constants

JS_ESCAPE

Attributes

available_helper_methods[RW]
events[RW]
app[RW]
event[RW]
folder[RW]
options[RW]
req[RW]
res[RW]
settings[RW]
widget_state[RW]

Public Class Methods

new(app, res, req, settings, event, folder, options) click to toggle source
# File lib/conjoin/widgets.rb, line 137
def initialize app, res, req, settings, event, folder, options
  @app          = app
  @res          = res
  @req          = req
  @settings     = settings
  @event        = event
  @folder       = folder
  @options      = options
  @widget_state = false

  # add the widget to the req widgets
  req.env[:widgets] ||= {}
  unless req.env[:widgets][folder]
    req.env[:widgets][folder] = {}
  end

  event.add_observer self, :trigger_event
end

Private Class Methods

helper_method(method) click to toggle source
# File lib/conjoin/widgets.rb, line 337
def helper_method method
  @available_helper_methods ||= []
  @available_helper_methods << method
end
helper_methods(*methods) click to toggle source
# File lib/conjoin/widgets.rb, line 342
def helper_methods *methods
  methods.each do |method|
    helper_method method
  end
end
respond_to(event, opts = {}) click to toggle source
# File lib/conjoin/widgets.rb, line 325
def respond_to event, opts = {}
  @events ||= []
  @events << [event, opts]
end
responds_to(*events) click to toggle source
# File lib/conjoin/widgets.rb, line 330
def responds_to *events
  @events ||= []
  events.each do |event|
    @events << [event, {}]
  end
end

Public Instance Methods

add_after(selector, opts = {}) click to toggle source
# File lib/conjoin/widgets.rb, line 201
def add_after selector, opts = {}
  content = render opts
  res.write '$("' + selector + '").after("'+ escape(content) +'");'
end
append(selector, opts = {}) click to toggle source
# File lib/conjoin/widgets.rb, line 196
def append selector, opts = {}
  content = render opts
  res.write '$("' + selector + '").append("'+ escape(content) +'");'
end
attrs_for(selector, opts = {}) click to toggle source
# File lib/conjoin/widgets.rb, line 206
def attrs_for selector, opts = {}
  res.write '$("' + selector + '").attr('+ (opts.to_json) +');'
end
current_user() click to toggle source
# File lib/conjoin/widgets.rb, line 156
def current_user
  app.current_user
end
escape(js) click to toggle source
# File lib/conjoin/widgets.rb, line 210
def escape js
  js.to_s.gsub(/(\\|<\/|\r\n|\\3342\\2200\\2250|[\n\r"'])/) {|match| JS_ESCAPE[match] }
end
hide(selector) click to toggle source
# File lib/conjoin/widgets.rb, line 192
def hide selector
  res.write '$("' + selector + '").hide();'
end
id_for(state) click to toggle source
# File lib/conjoin/widgets.rb, line 160
def id_for state
  "#{req.env[:widget_name]}_#{state}"
end
page_change() click to toggle source
# File lib/conjoin/widgets.rb, line 164
def page_change
  res.headers["Content-Type"] = "text/javascript; charset=utf-8"
  res.write '$(document).trigger("page:change");'
end
partial(template, locals = {}) click to toggle source
# File lib/conjoin/widgets.rb, line 259
def partial template, locals = {}
  locals[:partial] = template
  render locals
end
render(*args) click to toggle source
# File lib/conjoin/widgets.rb, line 264
def render *args
  if args.first.kind_of? Hash
    locals = args.first
    # if it's a partial we add an underscore infront of it
    state = view = locals[:state] || "#{locals[:partial]}".gsub(/([a-zA-Z_]+)$/, '_\1')
  else
    state = view = args.first
    locals = args.length > 1 ? args.last : {}
  end

  state = widget_state if widget_state

  unless view.present?
    state = view = caller[0][/`.*'/][1..-2]

    if (options.key?(:from_event) and !options.key?(:replace))
      @options[:cache] = false
    end
  end

  if locals.key?(:state) and state and state.to_s == view.to_s
    if method(state).parameters.length > 0
      return send(state, locals.to_ostruct)
    else
      return send(state)
    end
  end

  tmpl_engine = settings[:render][:template_engine]

  if (req_helper_methods = req.env[:widgets][folder][:req_helper_methods]) \
  and (!options.key?(:cache))
    locals.reverse_merge! req_helper_methods
  else
    req.env[:widgets][folder][:req_helper_methods] = {}

    helper_methods.each do |method|
      unless locals.key? method
        req.env[:widgets][folder][:req_helper_methods][method] = locals[method] = self.send method
      end
    end
  end

  req.env[:widget_name]  = folder
  req.env[:widget_state] = state

  locals[:w] = locals[:widget] = self

  view_folder = self.class.to_s.gsub(/\w+::Widgets::/, '').split('::').map(&:underscore).join('/')
  app.render "#{app.widgets_root}/#{view_folder}/#{view}.#{tmpl_engine}", locals
end
render_state(options = {}) click to toggle source
# File lib/conjoin/widgets.rb, line 251
def render_state options = {}
  if method(state).parameters.length > 0
    send(state, options.to_ostruct)
  else
    send(state)
  end
end
replace(state, opts = {}) click to toggle source
# File lib/conjoin/widgets.rb, line 169
def replace state, opts = {}
  @options[:replace] = true

  if !state.is_a? String
    opts[:state] = state
    content = render state, opts
    selector = '#' + id_for(state)
  else
    if !opts.key?(:content) and !opts.key?(:with)
      content = render opts
    else
      content = opts[:content] || opts[:with]
    end
    selector = state
  end

  res.write '$("' + selector + '").replaceWith("' + escape(content) + '");'
  # scroll to the top of the page just as if we went to the url directly
  # if opts[:scroll_to_top]
  #   res.write 'window.scrollTo(0, 0);'
  # end
end
set_state(state) click to toggle source
# File lib/conjoin/widgets.rb, line 243
def set_state state
  @widget_state = state
end
state() click to toggle source
# File lib/conjoin/widgets.rb, line 247
def state
  @widget_state
end
trigger(t_event, data = {}) click to toggle source
# File lib/conjoin/widgets.rb, line 214
def trigger t_event, data = {}
  wid = data.delete(:for).to_s

  req.env[:loaded_widgets].each do |n, w|
    w.trigger_event t_event, (wid || req.params['widget_name']),
      data.to_ostruct
  end
end
trigger_event(t_event, widget_name, data = {}) click to toggle source
# File lib/conjoin/widgets.rb, line 223
def trigger_event t_event, widget_name, data = {}
  if events = self.class.events
    events.each do |class_event, opts|
      if class_event == t_event && (widget_name == folder.to_s or opts[:for].to_s == widget_name)
        if not opts[:with]
          e = t_event
        else
          e = opts[:with]
        end

        if method(e) and method(e).parameters.length > 0
          send(e, data)
        else
          send(e)
        end
      end
    end
  end
end

Private Instance Methods

helper_methods() click to toggle source
# File lib/conjoin/widgets.rb, line 318
def helper_methods
  self.class.available_helper_methods || []
end