aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view/helpers/scriptaculous_helper.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_view/helpers/scriptaculous_helper.rb')
-rw-r--r--actionpack/lib/action_view/helpers/scriptaculous_helper.rb105
1 files changed, 105 insertions, 0 deletions
diff --git a/actionpack/lib/action_view/helpers/scriptaculous_helper.rb b/actionpack/lib/action_view/helpers/scriptaculous_helper.rb
new file mode 100644
index 0000000000..105d89d337
--- /dev/null
+++ b/actionpack/lib/action_view/helpers/scriptaculous_helper.rb
@@ -0,0 +1,105 @@
+require File.dirname(__FILE__) + '/javascript_helper'
+
+module ActionView
+ module Helpers
+ # Provides a set of helpers for calling Scriptaculous JavaScript
+ # functions, including those which create Ajax controls and visual effects.
+ #
+ # To be able to use these helpers, you must include the Prototype
+ # JavaScript framework and the Scriptaculous JavaScript library in your
+ # pages. See the documentation for ActionView::Helpers::JavaScriptHelper
+ # for more information on including the necessary JavaScript.
+ #
+ # The Scriptaculous helpers' behavior can be tweaked with various options.
+ # See the documentation at http://script.aculo.us for more information on
+ # using these helpers in your application.
+ module ScriptaculousHelper
+ # Returns a JavaScript snippet to be used on the Ajax callbacks for
+ # starting visual effects.
+ #
+ # Example:
+ # <%= link_to_remote "Reload", :update => "posts",
+ # :url => { :action => "reload" },
+ # :complete => visual_effect(:highlight, "posts", :duration => 0.5)
+ #
+ # If no element_id is given, it assumes "element" which should be a local
+ # variable in the generated JavaScript execution context. This can be
+ # used for example with drop_receiving_element:
+ #
+ # <%= drop_receving_element (...), :loading => visual_effect(:fade) %>
+ #
+ # This would fade the element that was dropped on the drop receiving
+ # element.
+ #
+ # You can change the behaviour with various options, see
+ # http://script.aculo.us for more documentation.
+ def visual_effect(name, element_id = false, js_options = {})
+ element = element_id ? "'#{element_id}'" : "element"
+ js_options[:queue] = "'#{js_options[:queue]}'" if js_options[:queue]
+ "new Effect.#{name.to_s.camelize}(#{element},#{options_for_javascript(js_options)});"
+ end
+
+ # Makes the element with the DOM ID specified by +element_id+ sortable
+ # by drag-and-drop and make an Ajax call whenever the sort order has
+ # changed. By default, the action called gets the serialized sortable
+ # element as parameters.
+ #
+ # Example:
+ # <%= sortable_element("my_list", :url => { :action => "order" }) %>
+ #
+ # In the example, the action gets a "my_list" array parameter
+ # containing the values of the ids of elements the sortable consists
+ # of, in the current order.
+ #
+ # You can change the behaviour with various options, see
+ # http://script.aculo.us for more documentation.
+ def sortable_element(element_id, options = {})
+ options[:with] ||= "Sortable.serialize('#{element_id}')"
+ options[:onUpdate] ||= "function(){" + remote_function(options) + "}"
+ options.delete_if { |key, value| PrototypeHelper::AJAX_OPTIONS.include?(key) }
+
+ [:tag, :overlap, :constraint, :handle].each do |option|
+ options[option] = "'#{options[option]}'" if options[option]
+ end
+
+ options[:containment] = array_or_string_for_javascript(options[:containment]) if options[:containment]
+ options[:only] = array_or_string_for_javascript(options[:only]) if options[:only]
+
+ javascript_tag("Sortable.create('#{element_id}', #{options_for_javascript(options)})")
+ end
+
+ # Makes the element with the DOM ID specified by +element_id+ draggable.
+ #
+ # Example:
+ # <%= draggable_element("my_image", :revert => true)
+ #
+ # You can change the behaviour with various options, see
+ # http://script.aculo.us for more documentation.
+ def draggable_element(element_id, options = {})
+ javascript_tag("new Draggable('#{element_id}', #{options_for_javascript(options)})")
+ end
+
+ # Makes the element with the DOM ID specified by +element_id+ receive
+ # dropped draggable elements (created by draggable_element).
+ # and make an AJAX call By default, the action called gets the DOM ID
+ # of the element as parameter.
+ #
+ # Example:
+ # <%= drop_receiving_element("my_cart", :url =>
+ # { :controller => "cart", :action => "add" }) %>
+ #
+ # You can change the behaviour with various options, see
+ # http://script.aculo.us for more documentation.
+ def drop_receiving_element(element_id, options = {})
+ options[:with] ||= "'id=' + encodeURIComponent(element.id)"
+ options[:onDrop] ||= "function(element){" + remote_function(options) + "}"
+ options.delete_if { |key, value| PrototypeHelper::AJAX_OPTIONS.include?(key) }
+
+ options[:accept] = array_or_string_for_javascript(options[:accept]) if options[:accept]
+ options[:hoverclass] = "'#{options[:hoverclass]}'" if options[:hoverclass]
+
+ javascript_tag("Droppables.add('#{element_id}', #{options_for_javascript(options)})")
+ end
+ end
+ end
+end