aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2006-02-12 18:48:08 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2006-02-12 18:48:08 +0000
commitebdb766e7956520e9e5a784e280a8f1916f50511 (patch)
tree14749af9395b225cc609e4b1e12fcb84723f942a /actionpack
parenta32a9863640dbd7a74b251e5467f90d134396110 (diff)
downloadrails-ebdb766e7956520e9e5a784e280a8f1916f50511.tar.gz
rails-ebdb766e7956520e9e5a784e280a8f1916f50511.tar.bz2
rails-ebdb766e7956520e9e5a784e280a8f1916f50511.zip
Added element and collection proxies to RJS [DHH]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3587 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/CHANGELOG10
-rw-r--r--actionpack/lib/action_view/helpers/prototype_helper.rb39
-rw-r--r--actionpack/test/template/prototype_helper_test.rb25
3 files changed, 73 insertions, 1 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index 79a77ebe4b..d23d46e2bb 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -1,5 +1,15 @@
*SVN*
+* Added element and collection proxies to RJS [DHH]. Examples:
+
+ page['blank_slate'] # => $('blank_slate');
+ page['blank_slate'].show # => $('blank_slate').show();
+ page['blank_slate'].show('first').up # => $('blank_slate').show('first').up();
+
+ page.select('p') # => $$('p');
+ page.select('p.welcome b').first # => $$('p.welcome b').first();
+ page.select('p.welcome b').first.hide # => $$('p.welcome b').first().hide();
+
* Add JavaScriptGenerator#replace_element for replacing an element's "outer HTML". #3246 [tom@craz8.com, Sam Stephenson]
* Remove over-engineered form_for code for a leaner implementation. [Nicholas Seckar]
diff --git a/actionpack/lib/action_view/helpers/prototype_helper.rb b/actionpack/lib/action_view/helpers/prototype_helper.rb
index 26d877c00a..f0d2b405d2 100644
--- a/actionpack/lib/action_view/helpers/prototype_helper.rb
+++ b/actionpack/lib/action_view/helpers/prototype_helper.rb
@@ -416,6 +416,26 @@ module ActionView
def to_s #:nodoc:
@lines * $/
end
+
+ # Returns a element reference by finding it through +id+ in the DOM. This element can then be
+ # used for further method calls. Examples:
+ #
+ # page['blank_slate'] # => $('blank_slate');
+ # page['blank_slate'].show # => $('blank_slate').show();
+ # page['blank_slate'].show('first').up # => $('blank_slate').show('first').up();
+ def [](id)
+ JavaScriptElementProxy.new(self, "$('#{id}')")
+ end
+
+ # Returns a collection reference by finding it through a CSS +pattern+ in the DOM. This collection can then be
+ # used for further method calls. Examples:
+ #
+ # page.select('p') # => $$('p');
+ # page.select('p.welcome b').first # => $$('p.welcome b').first();
+ # page.select('p.welcome b').first.hide # => $$('p.welcome b').first().hide();
+ def select(pattern)
+ JavaScriptElementProxy.new(self, "$$('#{pattern}')")
+ end
# Inserts HTML at the specified +position+ relative to the DOM element
# identified by the given +id+.
@@ -644,5 +664,24 @@ module ActionView
callbacks
end
end
+
+ # Converts chained method calls on DOM proxy elements into JavaScript chains
+ class JavaScriptElementProxy < Builder::BlankSlate #:nodoc:
+ def initialize(generator, root)
+ @generator = generator
+ @generator << root
+ end
+
+ private
+ def method_missing(method, *arguments)
+ method_chain = @generator.instance_variable_get("@lines")
+
+ last_method = method_chain[-1]
+ method_chain[-1] = last_method[0..-2] if last_method[-1..-1] == ";" # strip trailing ; from last method call
+ method_chain[-1] += ".#{method}(#{@generator.send(:arguments_for_call, arguments)});"
+
+ self
+ end
+ end
end
end
diff --git a/actionpack/test/template/prototype_helper_test.rb b/actionpack/test/template/prototype_helper_test.rb
index fc4ebeccc3..8657b1f107 100644
--- a/actionpack/test/template/prototype_helper_test.rb
+++ b/actionpack/test/template/prototype_helper_test.rb
@@ -227,4 +227,27 @@ new Insertion.Bottom("element", "<p>This is a test</p>");
Element.update("baz", "<p>This is a test</p>");
EOS
end
-end
+
+ def test_element_access
+ assert_equal %($('hello');), @generator['hello']
+ end
+
+ def test_element_proxy_one_deep
+ @generator['hello'].hide
+ assert_equal %($('hello').hide();), @generator.to_s
+ end
+
+ def test_element_proxy_two_deep
+ @generator['hello'].hide("first").display
+ assert_equal %($('hello').hide("first").display();), @generator.to_s
+ end
+
+ def test_select_access
+ assert_equal %($$('div.hello');), @generator.select('div.hello')
+ end
+
+ def test_select_proxy_one_deep
+ @generator.select('p.welcome b').first.hide
+ assert_equal %($$('p.welcome b').first().hide();), @generator.to_s
+ end
+end \ No newline at end of file