class Cuba::Tools::Widget::Base
Constants
- JS_ESCAPE
- PARTIAL_REGEX
- VIEW_TYPES
Attributes
available_helper_methods[RW]
events[RW]
app[RW]
events[RW]
name[RW]
req[RW]
res[RW]
widget_state[RW]
Public Class Methods
new(app, res, req, name, events)
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 10 def initialize app, res, req, name, events @app = app @res = res @req = req @name = name.to_s @events = events @widget_state = false events.add_observer self, :trigger_event end
respond_to(event, opts = {})
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 160 def respond_to event, opts = {} @events ||= [] @events << [event.to_s, opts] end
responds_to(*events)
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 165 def responds_to *events @events ||= [] events.each do |event| @events << [event, {}] end end
Public Instance Methods
current_user()
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 116 def current_user app.current_user end
escape(js)
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 153 def escape js js.to_s.gsub(/(\\|<\/|\r\n|\\3342\\2200\\2250|[\n\r"'])/) {|match| JS_ESCAPE[match] } end
id_for(state)
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 146 def id_for state w_name = req.env[:widget_name].to_s.gsub(/_/, '-') w_state = state.to_s.gsub(/_/, '-') "#{w_name}-#{w_state}" end
partial(template, locals = {})
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 111 def partial template, locals = {} locals[:partial] = template render locals end
render(*args)
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 71 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(PARTIAL_REGEX, '_\1') else state = view = args.first locals = args.length > 1 ? args.last : {} end # set the state and view if it's blank if view.blank? state = view = caller[0][/`.*'/][1..-2] # override state if widget_state set elsif !locals[:state] && widget_state state = widget_state end req.env[:widget_name] = name req.env[:widget_state] = state view_folder = self.class.to_s.gsub( /\w+::Widgets::/, '' ).split('::').map(&:underscore).join('/') # check for the extension file = false VIEW_TYPES.each do |type| file = "#{view_path}/#{view_folder}/#{view}.#{type}" if File.file? file break else file = false end end app.render file, locals end
render_state(options = {})
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 29 def render_state options = {} state = widget_state || options[:state] if method(state).parameters.length > 0 public_send(state, options.to_deep_ostruct) else public_send(state) end end
replace(state, opts = {})
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 124 def replace state, opts = {} 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) opts[:state] = caller[0][/`.*'/][1..-2] content = render_state 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
reset_state()
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 25 def reset_state @widget_state = false end
set_state(state)
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 21 def set_state state @widget_state = state end
trigger(widget_event, data = {})
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 39 def trigger widget_event, data = {} widget_name = data.delete(:for) req.env[:loaded_widgets].each do |n, w| w.trigger_event (widget_name || req.params['widget_name']), widget_event, data.to_deep_ostruct end end
trigger_event(widget_name, widget_event, data = {})
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 48 def trigger_event widget_name, widget_event, data = {} if class_events = self.class.events class_events.each do |class_event, opts| if class_event.to_s == widget_event.to_s && ( widget_name.to_s == name or opts[:for].to_s == widget_name.to_s ) if not opts[:with] e = widget_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
view_path()
click to toggle source
# File lib/cuba/tools/widget/base.rb, line 120 def view_path Widget.config.view_path end