aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_view')
-rw-r--r--actionpack/lib/action_view/helpers/ajax_helper.rb134
1 files changed, 78 insertions, 56 deletions
diff --git a/actionpack/lib/action_view/helpers/ajax_helper.rb b/actionpack/lib/action_view/helpers/ajax_helper.rb
index d6c43a1a15..93a79766dc 100644
--- a/actionpack/lib/action_view/helpers/ajax_helper.rb
+++ b/actionpack/lib/action_view/helpers/ajax_helper.rb
@@ -3,6 +3,16 @@ module ActionView
module AjaxHelper
include UrlHelper
+ def extract_remote_attributes!(options)
+ attributes = options.delete(:html) || {}
+
+ attributes.merge!(extract_update_attributes!(options))
+ attributes.merge!(extract_request_attributes!(options))
+ attributes["data-js-type"] = options.delete(:js_type) || "remote"
+
+ attributes
+ end
+
def remote_form_for(record_or_name_or_array, *args, &proc)
options = args.extract_options!
object_name = extract_object_name_for_form!(args, options, record_or_name_or_array)
@@ -18,26 +28,8 @@ module ActionView
attributes.merge!(extract_remote_attributes!(options))
attributes.merge!(options)
- url = attributes.delete(:url)
- form_tag(attributes.delete(:action) || url_for(url), attributes, &block)
- end
-
- def extract_remote_attributes!(options)
- attributes = options.delete(:html) || {}
-
- update = options.delete(:update)
- if update.is_a?(Hash)
- attributes["data-update-success"] = update[:success]
- attributes["data-update-failure"] = update[:failure]
- else
- attributes["data-update-success"] = update
- end
-
- attributes["data-update-position"] = options.delete(:position)
- attributes["data-method"] = options.delete(:method)
- attributes["data-js-type"] = "remote"
-
- attributes
+ url = attributes.delete("data-url")
+ form_tag(attributes.delete(:action) || url, attributes, &block)
end
def link_to_remote(name, url, options = {})
@@ -48,49 +40,45 @@ module ActionView
url = url_for(url) if url.is_a?(Hash)
link_to(name, url, attributes)
end
-
+
def button_to_remote(name, options = {}, html_options = {})
- url = options.delete(:url)
- url = url_for(url) if url.is_a?(Hash)
-
- html_options.merge!(:type => "button", :value => name,
- :"data-url" => url)
-
- tag(:input, html_options)
+ attributes = html_options.merge!(:type => "button")
+ attributes.merge!(extract_remote_attributes!(options))
+
+ tag(:input, attributes)
+ end
+
+ def periodically_call_remote(options = {})
+# frequency = options[:frequency] || 10 # every ten seconds by default
+# code = "new PeriodicalExecuter(function() {#{remote_function(options)}}, #{frequency})"
+# javascript_tag(code)
end
def observe_field(name, options = {})
- url = options[:url]
- options[:url] = url_for(url) if url && url.is_a?(Hash)
-
+ attributes = extract_remote_attributes!(options)
+ callback = options.delete(:function)
frequency = options.delete(:frequency)
- if frequency && frequency != 0
- options[:frequency] = frequency.to_i
- end
- if with = options[:with]
- if with !~ /[\{=(.]/
- options[:with] = "'#{options[:with]}=' + encodeURIComponent(value)"
- else
- options[:with] ||= 'value' unless options[:function]
- end
- end
+ attributes["data-name"] = name
+ attributes["data-js-type"] = "field_observer"
- if function = options[:function]
- statements = function # || remote_function(options) # TODO: Need to implement remote function - BR
- options[:function] = JSFunction.new(statements, "element", "value")
+ if callback
+ attributes["data-observer-code"] = create_js_function(callback, "element", "value")
+ end
+ if frequency && frequency != 0
+ attributes["data-frequency"] = frequency.to_i
end
- options[:name] = name
- script_decorator("field_observer", options)
+ script_decorator(attributes)
end
- def script_decorator(js_type, options)
- attributes = [%(type="application/json"), %(data-js-type="#{js_type}")]
- attributes += options.map{|k, v| %(data-#{k}="#{v}")}
+ def script_decorator(options)
+ attributes = %w(type="application/json")
+ attributes += options.map{|k, v| k + '="' + v.to_s + '"'}
"<script " + attributes.join(" ") + "></script>"
end
+ # TODO: All evaled goes here per wycats
module Rails2Compatibility
def set_callbacks(options, html)
[:complete, :failure, :success, :interactive, :loaded, :loading].each do |type|
@@ -108,7 +96,6 @@ module ActionView
if !options && url.is_a?(Hash) && url.key?(:url)
url, options = url.delete(:url), url
end
-
set_callbacks(options, options[:html] ||= {})
super
@@ -122,15 +109,50 @@ module ActionView
private
- # TODO: Move to javascript helpers - BR
- class JSFunction
- def initialize(statements, *arguments)
- @statements, @arguments = statements, arguments
+ def extract_request_attributes!(options)
+ attributes = {}
+ attributes["data-method"] = options.delete(:method)
+
+ url = options.delete(:url)
+ attributes["data-url"] = url.is_a?(Hash) ? url_for(url) : url
+
+ #TODO: Remove all references to prototype - BR
+ if options.delete(:form)
+ attributes["data-parameters"] = 'Form.serialize(this)'
+ elsif submit = options.delete(:submit)
+ attributes["data-parameters"] = "Form.serialize('#{submit}')"
+ elsif with = options.delete(:with)
+ if with !~ /[\{=(.]/
+ attributes["data-with"] = "'#{with}=' + encodeURIComponent(value)"
+ else
+ attributes["data-with"] = with
+ end
end
- def to_s(options = nil)
- "function(#{@arguments.join(", ")}) {#{@statements}}"
+ purge_unused_attributes!(attributes)
+ end
+
+ def extract_update_attributes!(options)
+ attributes = {}
+ update = options.delete(:update)
+ if update.is_a?(Hash)
+ attributes["data-update-success"] = update[:success]
+ attributes["data-update-failure"] = update[:failure]
+ else
+ attributes["data-update-success"] = update
end
+ attributes["data-update-position"] = options.delete(:position)
+
+ purge_unused_attributes!(attributes)
+ end
+
+ def purge_unused_attributes!(attributes)
+ attributes.delete_if {|key, value| value.nil? }
+ attributes
+ end
+
+ def create_js_function(statements, *arguments)
+ "function(#{arguments.join(", ")}) {#{statements}}"
end
end