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