From 7d9ed8eec1c899dac10d582ced07149fe5c58c4f Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sat, 30 Jan 2010 19:20:49 -0600 Subject: [PATCH] Include prototype ujs adapter with new apps --- .../action_view/helpers/asset_tag_helper.rb | 2 +- .../test/template/asset_tag_helper_test.rb | 15 ++-- railties/Rakefile | 4 + .../app/templates/public/javascripts/rails.js | 77 +++++++++++++++++++ 4 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 railties/lib/generators/rails/app/templates/public/javascripts/rails.js diff --git a/actionpack/lib/action_view/helpers/asset_tag_helper.rb b/actionpack/lib/action_view/helpers/asset_tag_helper.rb index 83357dd76f..4df99f8293 100644 --- a/actionpack/lib/action_view/helpers/asset_tag_helper.rb +++ b/actionpack/lib/action_view/helpers/asset_tag_helper.rb @@ -140,7 +140,7 @@ module AssetTagHelper :stylesheets_dir => "#{assets_dir}/stylesheets", } - JAVASCRIPT_DEFAULT_SOURCES = ['prototype', 'effects', 'dragdrop', 'controls'].freeze unless const_defined?(:JAVASCRIPT_DEFAULT_SOURCES) + JAVASCRIPT_DEFAULT_SOURCES = ['prototype', 'effects', 'dragdrop', 'controls', 'rails'].freeze unless const_defined?(:JAVASCRIPT_DEFAULT_SOURCES) # Returns a link tag that browsers and news readers can use to auto-detect # an RSS or ATOM feed. The +type+ can either be :rss (default) or diff --git a/actionpack/test/template/asset_tag_helper_test.rb b/actionpack/test/template/asset_tag_helper_test.rb index 57802ebf42..586de66714 100644 --- a/actionpack/test/template/asset_tag_helper_test.rb +++ b/actionpack/test/template/asset_tag_helper_test.rb @@ -86,11 +86,11 @@ def teardown %(javascript_include_tag("bank.js")) => %(), %(javascript_include_tag("bank", :lang => "vbscript")) => %(), %(javascript_include_tag("common.javascript", "/elsewhere/cools")) => %(\n), - %(javascript_include_tag(:defaults)) => %(\n\n\n\n), + %(javascript_include_tag(:defaults)) => %(\n\n\n\n\n), %(javascript_include_tag(:all)) => %(\n\n\n\n\n\n\n), %(javascript_include_tag(:all, :recursive => true)) => %(\n\n\n\n\n\n\n\n), - %(javascript_include_tag(:defaults, "bank")) => %(\n\n\n\n\n), - %(javascript_include_tag("bank", :defaults)) => %(\n\n\n\n\n), + %(javascript_include_tag(:defaults, "bank")) => %(\n\n\n\n\n\n), + %(javascript_include_tag("bank", :defaults)) => %(\n\n\n\n\n\n), %(javascript_include_tag("http://example.com/all")) => %(), %(javascript_include_tag("http://example.com/all.js")) => %(), @@ -235,7 +235,7 @@ def test_javascript_include_tag_with_missing_source def test_javascript_include_tag_with_given_asset_id ENV["RAILS_ASSET_ID"] = "1" - assert_dom_equal(%(\n\n\n\n), javascript_include_tag(:defaults)) + assert_dom_equal(%(\n\n\n\n\n), javascript_include_tag(:defaults)) end def test_javascript_include_tag_is_html_safe @@ -246,14 +246,14 @@ def test_javascript_include_tag_is_html_safe def test_register_javascript_include_default ENV["RAILS_ASSET_ID"] = "" ActionView::Helpers::AssetTagHelper::register_javascript_include_default 'bank' - assert_dom_equal %(\n\n\n\n\n), javascript_include_tag(:defaults) + assert_dom_equal %(\n\n\n\n\n\n), javascript_include_tag(:defaults) end def test_register_javascript_include_default_mixed_defaults ENV["RAILS_ASSET_ID"] = "" ActionView::Helpers::AssetTagHelper::register_javascript_include_default 'bank' ActionView::Helpers::AssetTagHelper::register_javascript_include_default 'robber', '/elsewhere/cools.js' - assert_dom_equal %(\n\n\n\n\n\n\n), javascript_include_tag(:defaults) + assert_dom_equal %(\n\n\n\n\n\n\n\n), javascript_include_tag(:defaults) end def test_custom_javascript_expansions @@ -265,7 +265,7 @@ def test_custom_javascript_expansions def test_custom_javascript_expansions_and_defaults_puts_application_js_at_the_end ENV["RAILS_ASSET_ID"] = "" ActionView::Helpers::AssetTagHelper::register_javascript_expansion :robbery => ["bank", "robber"] - assert_dom_equal %(\n\n\n\n\n\n\n\n), javascript_include_tag('controls',:defaults, :robbery, 'effects') + assert_dom_equal %(\n\n\n\n\n\n\n\n\n), javascript_include_tag('controls',:defaults, :robbery, 'effects') end def test_custom_javascript_expansions_with_undefined_symbol @@ -965,6 +965,5 @@ def test_asset_host_without_protocol_should_use_request_protocol_even_if_path_pr def test_assert_css_and_js_of_the_same_name_return_correct_extension assert_dom_equal(%(/collaboration/hieraki/javascripts/foo.js), javascript_path("foo")) assert_dom_equal(%(/collaboration/hieraki/stylesheets/foo.css), stylesheet_path("foo")) - end end diff --git a/railties/Rakefile b/railties/Rakefile index eff59f1f40..b8f5e81b85 100644 --- a/railties/Rakefile +++ b/railties/Rakefile @@ -64,6 +64,10 @@ task :generate_guides do ruby "guides/rails_guides.rb" end +task :update_prototype_ujs do + system "curl http://github.com/rails/prototype-ujs/raw/master/src/rails.js > lib/generators/rails/app/templates/public/javascripts/rails.js" +end + # Generate documentation ------------------------------------------------------------------ Rake::RDocTask.new { |rdoc| diff --git a/railties/lib/generators/rails/app/templates/public/javascripts/rails.js b/railties/lib/generators/rails/app/templates/public/javascripts/rails.js new file mode 100644 index 0000000000..2a0a05d25f --- /dev/null +++ b/railties/lib/generators/rails/app/templates/public/javascripts/rails.js @@ -0,0 +1,77 @@ +document.observe("dom:loaded", function() { + function handleRemote(element) { + var method, url, params; + + if (element.tagName.toLowerCase() == 'form') { + method = element.readAttribute('method') || 'post'; + url = element.readAttribute('action'); + params = element.serialize(true); + } else { + method = element.readAttribute('data-method') || 'get'; + // TODO: data-url support is going away, just use href + url = element.readAttribute('data-url') || element.readAttribute('href'); + params = {}; + } + + var event = element.fire("ajax:before"); + if (event.stopped) return false; + + new Ajax.Request(url, { + method: method, + parameters: params, + asynchronous: true, + evalScripts: true, + + onLoading: function(request) { element.fire("ajax:loading", {request: request}); }, + onLoaded: function(request) { element.fire("ajax:loaded", {request: request}); }, + onInteractive: function(request) { element.fire("ajax:interactive", {request: request}); }, + onComplete: function(request) { element.fire("ajax:complete", {request: request}); }, + onSuccess: function(request) { element.fire("ajax:success", {request: request}); }, + onFailure: function(request) { element.fire("ajax:failure", {request: request}); } + }); + + element.fire("ajax:after"); + } + + $(document.body).observe("click", function(event) { + var element = event.findElement("a[data-remote=true]"); + if (element) { + handleRemote(element); + event.stop(); + } + }); + + $(document.body).observe("ajax:before", function(event) { + var message = event.element().readAttribute('data-confirm'); + if (message && !confirm(message)) event.stop(); + }); + + // TODO: I don't think submit bubbles in IE + $(document.body).observe("submit", function(event) { + var inputs = event.element().select("input[type=submit][data-disable-with]"); + inputs.each(function(input) { + input.disabled = true; + input.writeAttribute('data-original-value', input.value); + input.value = input.readAttribute('data-disable-with'); + }); + + var element = event.findElement("form[data-remote=true]"); + if (element) { + handleRemote(element); + event.stop(); + } + }); + + $(document.body).observe("ajax:complete", function(event) { + var element = event.element(); + + if (element.tagName.toLowerCase() == 'form') { + var inputs = element.select("input[type=submit][disabled=true][data-disable-with]"); + inputs.each(function(input) { + input.value = input.readAttribute('data-original-value'); + input.writeAttribute('data-original-value', null); + input.disabled = false; + }); + } + }); +}); -- GitLab