module Conjoin::Widgets

Attributes

app[RW]

Public Class Methods

setup(app) click to toggle source
# File lib/conjoin/widgets.rb, line 9
def self.setup app
  self.app = app
  app.settings[:widgets_root] ||= "#{app.root}/app/widgets"
  app.settings[:widgets] ||= {}

  Dir["#{app.root}/app/widgets/**/*.rb"].each  { |rb| require rb  }
end

Public Instance Methods

load_widgets() click to toggle source
# File lib/conjoin/widgets.rb, line 80
def load_widgets
  req.env[:loaded_widgets] ||= {}

  event = Events.new res, req, settings

  if incoming_event = req.params["widget_event"]
    widget_name = req.params["widget_name"]
    opts = { from_event: true }
  else
    opts = {}
  end

  settings[:widgets].each do |name, widget|
    req.env[:loaded_widgets][name] = widget.constantize.new(self, res, req, settings, event, name, opts)
  end

  [widget_name, incoming_event, event]
end
render_widget(*args) click to toggle source
# File lib/conjoin/widgets.rb, line 34
def render_widget *args
  load_widgets unless req.env[:loaded_widgets]

  if args.first.kind_of? Hash
    opts = args.first
    name = req.env[:widget_name]
  else
    name = args.first
    opts = args.length > 1 ? args.last : {}
  end

  # set the current state (the method that will get called on render_widget)
  state = opts[:state] || 'display'

  widget = req.env[:loaded_widgets][name]

  if widget.method(state).parameters.length > 0
    widget.send state, opts.to_ostruct
  else
    widget.send state
  end
end
Also aliased as: widget_render
url_for_event(event, options = {}) click to toggle source
# File lib/conjoin/widgets.rb, line 75
def url_for_event event, options = {}
  widget_name = options.delete(:widget_name) || req.env[:widget_name]
  "#{Conjoin.env.mounted?? settings[:mounted_url] : ''}/widgets?widget_event=#{event}&widget_name=#{widget_name}" + (options.any?? '&' + URI.encode_www_form(options) : '')
end
widget_div(opts = {}) click to toggle source
# File lib/conjoin/widgets.rb, line 58
def widget_div opts = {}, &block
  defaults = {
    id: "#{req.env[:widget_name]}_#{req.env[:widget_state]}"
  }.merge opts

  name = req.env[:widget_name]
  widget = req.env[:loaded_widgets][name]

  html = block.call(widget)

  mab do
    div defaults do
      text! html
    end
  end
end
widget_render(*args)
Alias for: render_widget
widgets(list = false) click to toggle source
# File lib/conjoin/widgets.rb, line 17
def widgets list = false
  widget_name, incoming_event, event = load_widgets

  if incoming_event
    res.headers["Content-Type"] = "text/javascript; charset=utf-8"
    event.trigger incoming_event.to_sym, widget_name, req.params
    res.write "$('head > meta[name=csrf-token]').attr('content', '#{csrf_token}');"
    res.write '$(document).trigger("page:change");'
  end

  true
end
widgets_root() click to toggle source
# File lib/conjoin/widgets.rb, line 30
def widgets_root
  settings[:widgets_root]
end