diff --git a/actionpack/lib/action_view/helpers/asset_tag_helper.rb b/actionpack/lib/action_view/helpers/asset_tag_helper.rb index 83357dd76f64730ed7c3ef49f1b0bce3a2f8063c..4df99f8293bce65e0f022ec77945c511eacdaaeb 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 57802ebf42a39c781fcabfd38c962a5cc61d47d3..586de667142629826637130bc24c67bef0c4ff06 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 eff59f1f40e43ac1e48cbccbe2397572706876e0..b8f5e81b85045fb4bf68af73e31bd8747834cc82 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 0000000000000000000000000000000000000000..2a0a05d25f87891255d5ba5ff5a3ee003c1d80d9 --- /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; + }); + } + }); +});