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