Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
allow RJS enum values to be passed to visual_effect() and other scrip…
…taculous helpers #4080 [Rick Olson]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3772 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information
dhh committed Mar 5, 2006
1 parent 5afbffd commit 16b9409
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 68 deletions.
10 changes: 6 additions & 4 deletions actionpack/lib/action_view/helpers/prototype_helper.rb
Expand Up @@ -409,7 +409,8 @@ def observe_form(form_id, options = {})
class JavaScriptGenerator
def initialize(context, &block) #:nodoc:
@context, @lines = context, []
include_helpers_from_context
# removed because those methods were overriding valid generator methods
# include_helpers_from_context
@context.instance_exec(self, &block)
end

Expand Down Expand Up @@ -567,7 +568,7 @@ def delay(seconds = 1)

# Starts a script.aculo.us visual effect. See
# ActionView::Helpers::ScriptaculousHelper for more information.
def visual_effect(name, id, options = {})
def visual_effect(name, id = nil, options = {})
record @context.send(:visual_effect, name, id, options)
end

Expand Down Expand Up @@ -791,7 +792,7 @@ def zip(variable, *arguments, &block)
append_enumerable_function!("zip(#{arguments.collect { |a| a.to_json } * ', '}")
if block
function_chain[-1] += ", function(array) {"
yield @generator, ActiveSupport::JSON::Variable.new('array')
yield ActiveSupport::JSON::Variable.new('array')
add_return_statement!
@generator << '});'
else
Expand All @@ -811,7 +812,8 @@ def enumerate(enumerable, variable = nil, &block)
def enumerable_method(enumerable, variable, yield_params, &block)
add_variable_assignment!(variable) if variable
append_enumerable_function!(enumerable)
yield *([@generator] + yield_params.collect { |p| JavaScriptVariableProxy.new(@generator, p) })
# only yield as many params as were passed in the block
yield *yield_params.collect { |p| JavaScriptVariableProxy.new(@generator, p) }[0..block.arity-1]
add_return_statement! if variable
@generator << '});'
end
Expand Down
10 changes: 5 additions & 5 deletions actionpack/lib/action_view/helpers/scriptaculous_helper.rb
Expand Up @@ -42,7 +42,7 @@ module ScriptaculousHelper
# 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"
element = element_id ? element_id.to_json : "element"

js_options[:queue] = if js_options[:queue].is_a?(Hash)
'{' + js_options[:queue].map {|k, v| k == :limit ? "#{k}:#{v}" : "#{k}:'#{v}'" }.join(',') + '}'
Expand Down Expand Up @@ -76,7 +76,7 @@ def sortable_element(element_id, options = {})
end

def sortable_element_js(element_id, options = {}) #:nodoc:
options[:with] ||= "Sortable.serialize('#{element_id}')"
options[:with] ||= "Sortable.serialize(#{element_id.to_json})"
options[:onUpdate] ||= "function(){" + remote_function(options) + "}"
options.delete_if { |key, value| PrototypeHelper::AJAX_OPTIONS.include?(key) }

Expand All @@ -87,7 +87,7 @@ def sortable_element_js(element_id, options = {}) #:nodoc:
options[:containment] = array_or_string_for_javascript(options[:containment]) if options[:containment]
options[:only] = array_or_string_for_javascript(options[:only]) if options[:only]

%(Sortable.create('#{element_id}', #{options_for_javascript(options)});)
%(Sortable.create(#{element_id.to_json}, #{options_for_javascript(options)});)
end

# Makes the element with the DOM ID specified by +element_id+ draggable.
Expand All @@ -102,7 +102,7 @@ def draggable_element(element_id, options = {})
end

def draggable_element_js(element_id, options = {}) #:nodoc:
%(new Draggable('#{element_id}', #{options_for_javascript(options)});)
%(new Draggable(#{element_id.to_json}, #{options_for_javascript(options)});)
end

# Makes the element with the DOM ID specified by +element_id+ receive
Expand All @@ -128,7 +128,7 @@ def drop_receiving_element_js(element_id, options = {}) #:nodoc:
options[:accept] = array_or_string_for_javascript(options[:accept]) if options[:accept]
options[:hoverclass] = "'#{options[:hoverclass]}'" if options[:hoverclass]

%(Droppables.add('#{element_id}', #{options_for_javascript(options)});)
%(Droppables.add(#{element_id.to_json}, #{options_for_javascript(options)});)
end
end
end
Expand Down
18 changes: 15 additions & 3 deletions actionpack/test/controller/new_render_test.rb
Expand Up @@ -358,24 +358,36 @@ def test_render_xml
assert_equal "<html>\n <p>Hello David</p>\n<p>This is grand!</p>\n</html>\n", @response.body
end

def test_enum_rjs_test
get :enum_rjs_test
assert_equal <<-EOS.strip, @response.body
$$('.product').each(function(value, index) {
new Effect.Highlight(element,{});
new Effect.Highlight(value,{});
Sortable.create(value, {onUpdate:function(){new Ajax.Request('/test/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(value)})}});
new Draggable(value, {});
});
EOS
end

def test_render_xml_with_default
get :greeting
assert_equal "<p>This is grand!</p>\n", @response.body
end

def test_render_rjs_with_default
get :delete_with_js
assert_equal %!["person"].each(Element.remove);\nnew Effect.Highlight('project-4',{});!, @response.body
assert_equal %!["person"].each(Element.remove);\nnew Effect.Highlight(\"project-4\",{});!, @response.body
end

def test_render_rjs_template_explicitly
get :render_js_with_explicit_template
assert_equal %!["person"].each(Element.remove);\nnew Effect.Highlight('project-4',{});!, @response.body
assert_equal %!["person"].each(Element.remove);\nnew Effect.Highlight(\"project-4\",{});!, @response.body
end

def test_rendering_rjs_action_explicitly
get :render_js_with_explicit_action_template
assert_equal %!["person"].each(Element.remove);\nnew Effect.Highlight('project-4',{});!, @response.body
assert_equal %!["person"].each(Element.remove);\nnew Effect.Highlight(\"project-4\",{});!, @response.body
end

def test_layout_rendering
Expand Down
50 changes: 24 additions & 26 deletions actionpack/test/template/prototype_helper_test.rb
Expand Up @@ -260,52 +260,50 @@ def test_select_proxy_one_deep
end

def test_visual_effect
assert_equal %(new Effect.Puff('blah',{});),
assert_equal %(new Effect.Puff("blah",{});),
@generator.visual_effect(:puff,'blah')
end

def test_visual_effect_toggle
assert_equal %(Effect.toggle('blah','appear',{});),
assert_equal %(Effect.toggle("blah",'appear',{});),
@generator.visual_effect(:toggle_appear,'blah')
end

def test_sortable
assert_equal %(Sortable.create('blah', {onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize('blah')})}});),
assert_equal %(Sortable.create("blah", {onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize("blah")})}});),
@generator.sortable('blah', :url => { :action => "order" })
end

def test_draggable
assert_equal %(new Draggable('blah', {});),
assert_equal %(new Draggable("blah", {});),
@generator.draggable('blah')
end

def test_drop_receiving
assert_equal %(Droppables.add('blah', {onDrop:function(element){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}});),
assert_equal %(Droppables.add("blah", {onDrop:function(element){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}});),
@generator.drop_receiving('blah', :url => { :action => "order" })
end

def test_collection_proxy_with_each
@generator.select('p.welcome b').each do |page, value|
@generator.select('p.welcome b').each do |value|
value.remove_class_name 'selected'
end
@generator.select('p.welcome b').each do |page, value, index|
page.call 'alert', index
page.call 'alert', value, 'selected'
@generator.select('p.welcome b').each do |value, index|
@generator.visual_effect :highlight, value
end
assert_equal <<-EOS.strip, @generator.to_s
assert_equal <<-EOS.strip, @generator.to_s
$$('p.welcome b').each(function(value, index) {
value.removeClassName("selected");
});
$$('p.welcome b').each(function(value, index) {
alert(index);
alert(value, "selected");
new Effect.Highlight(value,{});
});
EOS
end

def test_collection_proxy_on_enumerables_with_return_and_index
iterator = Proc.new { |page, value| page << '(value.className == "welcome")' }
iterator_with_index = Proc.new { |page, value, index| page.call 'alert', index ; page << '(value.className == "welcome")' }
iterator = Proc.new { |value| @generator << '(value.className == "welcome")' }
iterator_with_index = Proc.new { |value, index| @generator.call 'alert', index ; @generator << '(value.className == "welcome")' }
ActionView::Helpers::JavaScriptCollectionProxy::ENUMERABLE_METHODS_WITH_RETURN.each do |enum|
@generator.select('p').enumerate(enum, 'a', &iterator)
@generator.select('p').enumerate(enum, 'b', &iterator_with_index)
Expand All @@ -324,12 +322,12 @@ def test_collection_proxy_on_enumerables_with_return_and_index
end

def test_collection_proxy_with_grep
@generator.select('p').grep 'a', /^a/ do |page, value|
page << '(value.className == "welcome")'
@generator.select('p').grep 'a', /^a/ do |value|
@generator << '(value.className == "welcome")'
end
@generator.select('p').grep 'b', /b$/ do |page, value, index|
page.call 'alert', value
page << '(value.className == "welcome")'
@generator.select('p').grep 'b', /b$/ do |value, index|
@generator.call 'alert', value
@generator << '(value.className == "welcome")'
end

assert_equal <<-EOS.strip, @generator.to_s
Expand All @@ -344,12 +342,12 @@ def test_collection_proxy_with_grep
end

def test_collection_proxy_with_inject
@generator.select('p').inject 'a', [] do |page, memo, value|
page << '(value.className == "welcome")'
@generator.select('p').inject 'a', [] do |memo, value|
@generator << '(value.className == "welcome")'
end
@generator.select('p').inject 'b', nil do |page, memo, value, index|
page.call 'alert', memo
page << '(value.className == "welcome")'
@generator.select('p').inject 'b', nil do |memo, value, index|
@generator.call 'alert', memo
@generator << '(value.className == "welcome")'
end

assert_equal <<-EOS.strip, @generator.to_s
Expand All @@ -370,8 +368,8 @@ def test_collection_proxy_with_pluck

def test_collection_proxy_with_zip
ActionView::Helpers::JavaScriptCollectionProxy.new(@generator, '[1, 2, 3]').zip('a', [4, 5, 6], [7, 8, 9])
ActionView::Helpers::JavaScriptCollectionProxy.new(@generator, '[1, 2, 3]').zip('b', [4, 5, 6], [7, 8, 9]) do |page, array|
page.call 'array.reverse'
ActionView::Helpers::JavaScriptCollectionProxy.new(@generator, '[1, 2, 3]').zip('b', [4, 5, 6], [7, 8, 9]) do |array|
@generator.call 'array.reverse'
end

assert_equal <<-EOS.strip, @generator.to_s
Expand Down

0 comments on commit 16b9409

Please sign in to comment.