diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 2bc9e321e6b798172d424f6d3018636ed615d632..5720d9713ff983861e96e3f81e75536573179832 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Allow inGroupsOf and eachSlice to be called through rjs. #7046 [Cody Fauser] + * Allow exempt_from_layout :rhtml. #6742, #7026 [dcmanges, Squeegy] * Recognize the .txt extension as Mime::TEXT [Rick] diff --git a/actionpack/lib/action_view/helpers/prototype_helper.rb b/actionpack/lib/action_view/helpers/prototype_helper.rb index 71fe29db9a72f2a70d63ee70863262dcb2de0a08..43d04baf8d04884e971ef9e8d231431ef1880e16 100644 --- a/actionpack/lib/action_view/helpers/prototype_helper.rb +++ b/actionpack/lib/action_view/helpers/prototype_helper.rb @@ -784,7 +784,7 @@ def append_to_function_chain!(call) end class JavaScriptCollectionProxy < JavaScriptProxy #:nodoc: - ENUMERABLE_METHODS_WITH_RETURN = [:all, :any, :collect, :map, :detect, :find, :find_all, :select, :max, :min, :partition, :reject, :sort_by] unless defined? ENUMERABLE_METHODS_WITH_RETURN + ENUMERABLE_METHODS_WITH_RETURN = [:all, :any, :collect, :map, :detect, :find, :find_all, :select, :max, :min, :partition, :reject, :sort_by, :in_groups_of, :each_slice] unless defined? ENUMERABLE_METHODS_WITH_RETURN ENUMERABLE_METHODS = ENUMERABLE_METHODS_WITH_RETURN + [:each] unless defined? ENUMERABLE_METHODS attr_reader :generator delegate :arguments_for_call, :to => :generator @@ -792,11 +792,27 @@ class JavaScriptCollectionProxy < JavaScriptProxy #:nodoc: def initialize(generator, pattern) super(generator, @pattern = pattern) end - + + def each_slice(variable, number, &block) + if block + enumerate :eachSlice, :variable => variable, :method_args => [number], :yield_args => %w(value index), :return => true, &block + else + add_variable_assignment!(variable) + append_enumerable_function!("eachSlice(#{number.to_json});") + end + end + def grep(variable, pattern, &block) enumerate :grep, :variable => variable, :return => true, :method_args => [pattern], :yield_args => %w(value index), &block end - + + def in_groups_of(variable, number, fill_with = nil) + arguments = [number] + arguments << fill_with unless fill_with.nil? + add_variable_assignment!(variable) + append_enumerable_function!("inGroupsOf(#{arguments_for_call arguments});") + end + def inject(variable, memo, &block) enumerate :inject, :variable => variable, :method_args => [memo], :yield_args => %w(memo value index), :return => true, &block end diff --git a/actionpack/test/template/prototype_helper_test.rb b/actionpack/test/template/prototype_helper_test.rb index 7dc366b7d953a37f57e4c985a98d32a6990568d8..1b4f4408e3f3405243165b0b5279ebcfcbf004c7 100644 --- a/actionpack/test/template/prototype_helper_test.rb +++ b/actionpack/test/template/prototype_helper_test.rb @@ -423,6 +423,29 @@ def test_collection_proxy_with_find_all EOS end + def test_collection_proxy_with_in_groups_of + @generator.select('p').in_groups_of('a', 3) + @generator.select('p').in_groups_of('a', 3, 'x') + assert_equal <<-EOS.strip, @generator.to_s +var a = $$("p").inGroupsOf(3); +var a = $$("p").inGroupsOf(3, "x"); + EOS + end + + def test_collection_proxy_with_each_slice + @generator.select('p').each_slice('a', 3) + @generator.select('p').each_slice('a', 3) do |group, index| + group.reverse + end + + assert_equal <<-EOS.strip, @generator.to_s +var a = $$("p").eachSlice(3); +var a = $$("p").eachSlice(3, function(value, index) { +return value.reverse(); +}); + EOS + end + def test_debug_rjs ActionView::Base.debug_rjs = true @generator['welcome'].replace_html 'Welcome'