Module: Conjoin::Widgets

Defined in:
lib/conjoin/widgets.rb

Defined Under Namespace

Modules: ClassMethods Classes: App, Base, Events, Routes

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Class Attribute Details

.appObject

Returns the value of attribute app.



6
7
8
# File 'lib/conjoin/widgets.rb', line 6

def app
  @app
end

Class Method Details

.setup(app) ⇒ Object



9
10
11
12
13
14
15
# 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

Instance Method Details

#load_widgetsObject



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# 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) ⇒ Object Also known as: widget_render



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 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

#url_for_event(event, options = {}) ⇒ Object



75
76
77
78
# 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 = {}, &block) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# 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

#widgets(list = false) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
# 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_rootObject



30
31
32
# File 'lib/conjoin/widgets.rb', line 30

def widgets_root
  settings[:widgets_root]
end