From 4ce77d8c851fdc8856226ae43844079d00d888a8 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sat, 19 Feb 2011 23:46:58 -0200 Subject: [PATCH 01/17] refactored element.attr('data-x') to element.data('x') --- src/rails.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/rails.js b/src/rails.js index 17c0b371..723a725b 100644 --- a/src/rails.js +++ b/src/rails.js @@ -36,7 +36,7 @@ // Submits "remote" forms and links with ajax function handleRemote(element) { var method, url, data, - dataType = element.attr('data-type') || ($.ajaxSettings && $.ajaxSettings.dataType); + dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType); if (element.is('form')) { method = element.attr('method'); @@ -49,7 +49,7 @@ element.data('ujs:submit-button', null); } } else { - method = element.attr('data-method'); + method = element.data('method'); url = element.attr('href'); data = null; } @@ -79,7 +79,7 @@ // Delete function handleMethod(link) { var href = link.attr('href'), - method = link.attr('data-method'), + method = link.data('method'), csrf_token = $('meta[name=csrf-token]').attr('content'), csrf_param = $('meta[name=csrf-param]').attr('content'), form = $('
'), @@ -97,7 +97,7 @@ form.find('input[data-disable-with]').each(function() { var input = $(this); input.data('ujs:enable-with', input.val()) - .val(input.attr('data-disable-with')) + .val(input.data('disable-with')) .attr('disabled', 'disabled'); }); } @@ -110,7 +110,7 @@ } function allowAction(element) { - var message = element.attr('data-confirm'); + var message = element.data('confirm'); return !message || (fire(element, 'confirm') && confirm(message)); } @@ -126,17 +126,17 @@ var link = $(this); if (!allowAction(link)) return false; - if (link.attr('data-remote') != undefined) { + if (link.data('remote') != undefined) { handleRemote(link); return false; - } else if (link.attr('data-method')) { + } else if (link.data('method')) { handleMethod(link); return false; } }); $('form').live('submit.rails', function(e) { - var form = $(this), remote = form.attr('data-remote') != undefined; + var form = $(this), remote = form.data('remote') != undefined; if (!allowAction(form)) return false; // skip other logic when required values are missing @@ -158,7 +158,7 @@ var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null; button.closest('form').data('ujs:submit-button', data); }); - + $('form').live('ajax:beforeSend.rails', function(event) { if (this == event.target) disableFormElements($(this)); }); From 0748cac800f43dbe73ae010bb96a14d7358bbdc7 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sat, 19 Feb 2011 23:47:42 -0200 Subject: [PATCH 02/17] removed optional operator --- src/rails.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rails.js b/src/rails.js index 723a725b..5536faaa 100644 --- a/src/rails.js +++ b/src/rails.js @@ -28,7 +28,7 @@ // Triggers an event on an element and returns the event result function fire(obj, name, data) { - var event = new $.Event(name); + var event = $.Event(name); obj.trigger(event, data); return event.result !== false; } From ca5b4b6a37f43b7771d7f36f985d5db2b5e04d65 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sat, 19 Feb 2011 23:49:41 -0200 Subject: [PATCH 03/17] refactored commented code to a function --- src/rails.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/rails.js b/src/rails.js index 5536faaa..994bc1b3 100644 --- a/src/rails.js +++ b/src/rails.js @@ -122,6 +122,11 @@ return missing; } + function register(button) { + var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null; + button.closest('form').data('ujs:submit-button', data); + } + $('a[data-confirm], a[data-method], a[data-remote]').live('click.rails', function(e) { var link = $(this); if (!allowAction(link)) return false; @@ -155,8 +160,7 @@ var button = $(this); if (!allowAction(button)) return false; // register the pressed submit button - var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null; - button.closest('form').data('ujs:submit-button', data); + register(button); }); $('form').live('ajax:beforeSend.rails', function(event) { From 0aa142f83a52861ac1cd25dfdd580c470939b266 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sat, 19 Feb 2011 23:31:06 -0300 Subject: [PATCH 04/17] dryed .live('x.rails') with .on(x) --- src/rails.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/rails.js b/src/rails.js index 994bc1b3..7d65efba 100644 --- a/src/rails.js +++ b/src/rails.js @@ -127,7 +127,11 @@ button.closest('form').data('ujs:submit-button', data); } - $('a[data-confirm], a[data-method], a[data-remote]').live('click.rails', function(e) { + $.fn.on = function(name, fn) { + $(this).live(name + '.rails', fn); + } + + $('a[data-confirm], a[data-method], a[data-remote]').on('click', function(e) { var link = $(this); if (!allowAction(link)) return false; @@ -140,7 +144,7 @@ } }); - $('form').live('submit.rails', function(e) { + $('form').on('submit', function(e) { var form = $(this), remote = form.data('remote') != undefined; if (!allowAction(form)) return false; @@ -156,18 +160,18 @@ } }); - $('form input[type=submit], form button[type=submit], form button:not([type])').live('click.rails', function() { + $('form input[type=submit], form button[type=submit], form button:not([type])').on('click', function() { var button = $(this); if (!allowAction(button)) return false; // register the pressed submit button register(button); }); - $('form').live('ajax:beforeSend.rails', function(event) { + $('form').on('ajax:beforeSend', function(event) { if (this == event.target) disableFormElements($(this)); }); - $('form').live('ajax:complete.rails', function(event) { + $('form').on('ajax:complete', function(event) { if (this == event.target) enableFormElements($(this)); }); })( jQuery ); From 55a5c221676d2e92a0cfb2dc6ba698a4dc5f2e08 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sat, 19 Feb 2011 23:35:47 -0300 Subject: [PATCH 05/17] dryed 's ajax:beforeSend and ajax:complete --- src/rails.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/rails.js b/src/rails.js index 7d65efba..c16fc96f 100644 --- a/src/rails.js +++ b/src/rails.js @@ -131,6 +131,12 @@ $(this).live(name + '.rails', fn); } + $.fn.ifTargetOn = function(name, fn) { + $(this).on(name, function(event) { + if (this == event.target) fn($(this)); + }); + } + $('a[data-confirm], a[data-method], a[data-remote]').on('click', function(e) { var link = $(this); if (!allowAction(link)) return false; @@ -167,11 +173,6 @@ register(button); }); - $('form').on('ajax:beforeSend', function(event) { - if (this == event.target) disableFormElements($(this)); - }); - - $('form').on('ajax:complete', function(event) { - if (this == event.target) enableFormElements($(this)); - }); + $('form').ifTargetOn('ajax:beforeSend', disableFormElements); + $('form').ifTargetOn('ajax:complete', enableFormElements); })( jQuery ); From ce01aadd15ff69d4f65a183db14566b7a75fdf5e Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sat, 19 Feb 2011 23:36:31 -0300 Subject: [PATCH 06/17] removed forgotten comment --- src/rails.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/rails.js b/src/rails.js index c16fc96f..b151d12b 100644 --- a/src/rails.js +++ b/src/rails.js @@ -169,7 +169,6 @@ $('form input[type=submit], form button[type=submit], form button:not([type])').on('click', function() { var button = $(this); if (!allowAction(button)) return false; - // register the pressed submit button register(button); }); From 60117d642bd56fbfcd04e90e830527451aa46cec Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sat, 19 Feb 2011 23:42:29 -0300 Subject: [PATCH 07/17] changed return false in favor of event.preventDefault, as what we really want is to prevent the default event of the elements and not to stop the event chain --- src/rails.js | 51 +++++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/src/rails.js b/src/rails.js index b151d12b..fa44e8e9 100644 --- a/src/rails.js +++ b/src/rails.js @@ -139,37 +139,40 @@ $('a[data-confirm], a[data-method], a[data-remote]').on('click', function(e) { var link = $(this); - if (!allowAction(link)) return false; - - if (link.data('remote') != undefined) { - handleRemote(link); - return false; - } else if (link.data('method')) { - handleMethod(link); - return false; - } + if (allowAction(link)) { + if (link.data('remote') != undefined) { + handleRemote(link); + e.preventDefault(); + } else if (link.data('method')) { + handleMethod(link); + e.preventDefault(); + } + } else { + e.preventDefault(); + } }); $('form').on('submit', function(e) { var form = $(this), remote = form.data('remote') != undefined; - if (!allowAction(form)) return false; - - // skip other logic when required values are missing - if (requiredValuesMissing(form)) return !remote; - - if (remote) { - handleRemote(form); - return false; - } else { - // slight timeout so that the submit button gets properly serialized - setTimeout(function(){ disableFormElements(form) }, 13); - } + if (allowAction(form)) { + // skip other logic when required values are missing + if (requiredValuesMissing(form)) return !remote; + + if (remote) { + handleRemote(form); + e.preventDefault(); + } else { + // slight timeout so that the submit button gets properly serialized + setTimeout(function(){ disableFormElements(form) }, 13); + } + } else { + e.preventDefault(); + } }); - $('form input[type=submit], form button[type=submit], form button:not([type])').on('click', function() { + $('form input[type=submit], form button[type=submit], form button:not([type])').on('click', function(event) { var button = $(this); - if (!allowAction(button)) return false; - register(button); + allowAction(button) ? register(button) : event.preventDefault(); }); $('form').ifTargetOn('ajax:beforeSend', disableFormElements); From af56c2dd1c1346389a776503e26aa3155328c853 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sat, 19 Feb 2011 23:49:34 -0300 Subject: [PATCH 08/17] dryed code that execute an action if the event is allowed --- src/rails.js | 55 ++++++++++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/src/rails.js b/src/rails.js index fa44e8e9..07e79df2 100644 --- a/src/rails.js +++ b/src/rails.js @@ -137,44 +137,39 @@ }); } - $('a[data-confirm], a[data-method], a[data-remote]').on('click', function(e) { - var link = $(this); - if (allowAction(link)) { - if (link.data('remote') != undefined) { - handleRemote(link); - e.preventDefault(); - } else if (link.data('method')) { - handleMethod(link); - e.preventDefault(); - } - } else { - e.preventDefault(); + $.fn.ifAllowedOn = function(name, fn) { + $(this).on(name, function(event) { + var element = $(this); + allowAction(element) ? fn(element, event) : event.preventDefault(); + }); + } + + $('a[data-confirm], a[data-method], a[data-remote]').ifAllowedOn('click', function(link, event) { + if (link.data('remote') != undefined) { + handleRemote(link); + event.preventDefault(); + } else if (link.data('method')) { + handleMethod(link); + event.preventDefault(); } }); - $('form').on('submit', function(e) { - var form = $(this), remote = form.data('remote') != undefined; - if (allowAction(form)) { - // skip other logic when required values are missing - if (requiredValuesMissing(form)) return !remote; - - if (remote) { + $('form').ifAllowedOn('submit', function(form, event) { + if (form.data('remote') != undefined) { + // skip other logic when required values are missing + if (requiredValuesMissing(form)) { + event.preventDefault(); + } else { handleRemote(form); - e.preventDefault(); - } else { - // slight timeout so that the submit button gets properly serialized - setTimeout(function(){ disableFormElements(form) }, 13); - } + event.preventDefault(); + } } else { - e.preventDefault(); + // slight timeout so that the submit button gets properly serialized + setTimeout(function(){ disableFormElements(form) }, 13); } }); - $('form input[type=submit], form button[type=submit], form button:not([type])').on('click', function(event) { - var button = $(this); - allowAction(button) ? register(button) : event.preventDefault(); - }); - + $('form input[type=submit], form button[type=submit], form button:not([type])').ifAllowedOn('click', register) $('form').ifTargetOn('ajax:beforeSend', disableFormElements); $('form').ifTargetOn('ajax:complete', enableFormElements); })( jQuery ); From b36c7d90df158a38536321633e549217998a04de Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sun, 20 Feb 2011 14:16:56 -0300 Subject: [PATCH 09/17] removed some ifs, instead of selecting a lot of elements and then verifying the kind to know what behaviour to apply, select the elements of an specific kind and then apply the behaviour --- src/rails.js | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/rails.js b/src/rails.js index 07e79df2..da794fe3 100644 --- a/src/rails.js +++ b/src/rails.js @@ -144,31 +144,31 @@ }); } - $('a[data-confirm], a[data-method], a[data-remote]').ifAllowedOn('click', function(link, event) { - if (link.data('remote') != undefined) { - handleRemote(link); - event.preventDefault(); - } else if (link.data('method')) { - handleMethod(link); - event.preventDefault(); - } + $('a[data-remote]').ifAllowedOn('click', function(link, event) { + handleRemote(link); + event.preventDefault(); + }); + + $('a[data-method]:not([data-remote])').ifAllowedOn('click', function(link, event) { + handleMethod(link); + event.preventDefault(); }); - $('form').ifAllowedOn('submit', function(form, event) { - if (form.data('remote') != undefined) { - // skip other logic when required values are missing - if (requiredValuesMissing(form)) { - event.preventDefault(); - } else { - handleRemote(form); - event.preventDefault(); - } + $('form[data-remote]').ifAllowedOn('submit', function(form, event) { + // skip other logic when required values are missing + if (requiredValuesMissing(form)) { + event.preventDefault(); } else { - // slight timeout so that the submit button gets properly serialized - setTimeout(function(){ disableFormElements(form) }, 13); + handleRemote(form); + event.preventDefault(); } }); + $('form:not([data-remote])').ifAllowedOn('submit', function(form, event) { + // slight timeout so that the submit button gets properly serialized + setTimeout(function(){ disableFormElements(form) }, 13); + }); + $('form input[type=submit], form button[type=submit], form button:not([type])').ifAllowedOn('click', register) $('form').ifTargetOn('ajax:beforeSend', disableFormElements); $('form').ifTargetOn('ajax:complete', enableFormElements); From 5f29cdbcb3fcaed46c6e7ae4181876ae728ff0a5 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sun, 20 Feb 2011 14:41:34 -0300 Subject: [PATCH 10/17] moved event.preventDefault to handleRemote and handleMethod, as this go together always --- src/rails.js | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/rails.js b/src/rails.js index da794fe3..c23b8fc7 100644 --- a/src/rails.js +++ b/src/rails.js @@ -34,7 +34,7 @@ } // Submits "remote" forms and links with ajax - function handleRemote(element) { + function handleRemote(element, event) { var method, url, data, dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType); @@ -73,11 +73,12 @@ element.trigger('ajax:error', [xhr, status, error]); } }); + event.preventDefault(); } // Handles "data-method" on links such as: // Delete - function handleMethod(link) { + function handleMethod(link, event) { var href = link.attr('href'), method = link.data('method'), csrf_token = $('meta[name=csrf-token]').attr('content'), @@ -91,6 +92,7 @@ form.hide().append(metadata_input).appendTo('body'); form.submit(); + event.preventDefault(); } function disableFormElements(form) { @@ -144,23 +146,15 @@ }); } - $('a[data-remote]').ifAllowedOn('click', function(link, event) { - handleRemote(link); - event.preventDefault(); - }); - - $('a[data-method]:not([data-remote])').ifAllowedOn('click', function(link, event) { - handleMethod(link); - event.preventDefault(); - }); + $('a[data-remote]').ifAllowedOn('click', handleRemote); + $('a[data-method]:not([data-remote])').ifAllowedOn('click', handleMethod); $('form[data-remote]').ifAllowedOn('submit', function(form, event) { // skip other logic when required values are missing if (requiredValuesMissing(form)) { event.preventDefault(); } else { - handleRemote(form); - event.preventDefault(); + handleRemote(form, event); } }); From 86f09008d70d801e2f64ebd313faa18a5c4c384d Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sun, 20 Feb 2011 14:43:21 -0300 Subject: [PATCH 11/17] dryied code --- src/rails.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rails.js b/src/rails.js index c23b8fc7..710ffcc7 100644 --- a/src/rails.js +++ b/src/rails.js @@ -134,7 +134,7 @@ } $.fn.ifTargetOn = function(name, fn) { - $(this).on(name, function(event) { + $(this).on('ajax:' + name, function(event) { if (this == event.target) fn($(this)); }); } @@ -164,6 +164,6 @@ }); $('form input[type=submit], form button[type=submit], form button:not([type])').ifAllowedOn('click', register) - $('form').ifTargetOn('ajax:beforeSend', disableFormElements); - $('form').ifTargetOn('ajax:complete', enableFormElements); + $('form').ifTargetOn('beforeSend', disableFormElements); + $('form').ifTargetOn('complete', enableFormElements); })( jQuery ); From 0524d7ae91ab5eb321d35ae3d40d3579761e8517 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sun, 20 Feb 2011 15:36:20 -0300 Subject: [PATCH 12/17] refactored disableFormElements and enableFormElements, removed .each in favor of .val --- src/rails.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/rails.js b/src/rails.js index 710ffcc7..e44dc2c7 100644 --- a/src/rails.js +++ b/src/rails.js @@ -96,19 +96,15 @@ } function disableFormElements(form) { - form.find('input[data-disable-with]').each(function() { - var input = $(this); - input.data('ujs:enable-with', input.val()) - .val(input.data('disable-with')) - .attr('disabled', 'disabled'); - }); + form.find('input[data-disable-with]').attr('disabled', 'disabled').val(function(index, value) { + return $(this).data('ujs:enable-with', value).data('disable-with'); + }); } function enableFormElements(form) { - form.find('input[data-disable-with]').each(function() { - var input = $(this); - input.val(input.data('ujs:enable-with')).removeAttr('disabled'); - }); + form.find('input[data-disable-with]').removeAttr('disabled').val(function() { + return $(this).data('ujs:enable-with'); + }); } function allowAction(element) { From b593e719929664a5036d4d33cf50d326048ff7e9 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sun, 20 Feb 2011 15:48:34 -0300 Subject: [PATCH 13/17] dryed code by chained two methods --- src/rails.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/rails.js b/src/rails.js index e44dc2c7..f66eb2c4 100644 --- a/src/rails.js +++ b/src/rails.js @@ -126,11 +126,11 @@ } $.fn.on = function(name, fn) { - $(this).live(name + '.rails', fn); + return $(this).live(name + '.rails', fn); } $.fn.ifTargetOn = function(name, fn) { - $(this).on('ajax:' + name, function(event) { + return $(this).on('ajax:' + name, function(event) { if (this == event.target) fn($(this)); }); } @@ -160,6 +160,5 @@ }); $('form input[type=submit], form button[type=submit], form button:not([type])').ifAllowedOn('click', register) - $('form').ifTargetOn('beforeSend', disableFormElements); - $('form').ifTargetOn('complete', enableFormElements); + $('form').ifTargetOn('beforeSend', disableFormElements).ifTargetOn('complete', enableFormElements); })( jQuery ); From cbc01d013d090d9ad100fe3c44e427bb9ceca1c1 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sun, 20 Feb 2011 16:07:21 -0300 Subject: [PATCH 14/17] refactored code that validates if required fields are missing --- src/rails.js | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/rails.js b/src/rails.js index f66eb2c4..04521fd1 100644 --- a/src/rails.js +++ b/src/rails.js @@ -112,19 +112,15 @@ return !message || (fire(element, 'confirm') && confirm(message)); } - function requiredValuesMissing(form) { - var missing = false; - form.find('input[name][required]').each(function() { - if (!$(this).val()) missing = true; - }); - return missing; - } - function register(button) { var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null; button.closest('form').data('ujs:submit-button', data); } + function isMissing() { + return !$(this).val(); + } + $.fn.on = function(name, fn) { return $(this).live(name + '.rails', fn); } @@ -146,12 +142,7 @@ $('a[data-method]:not([data-remote])').ifAllowedOn('click', handleMethod); $('form[data-remote]').ifAllowedOn('submit', function(form, event) { - // skip other logic when required values are missing - if (requiredValuesMissing(form)) { - event.preventDefault(); - } else { - handleRemote(form, event); - } + form.find('input[required]').filter(isMissing).length > 0 ? event.preventDefault() : handleRemote(form, event); }); $('form:not([data-remote])').ifAllowedOn('submit', function(form, event) { From 0cff3094af0c2f4623534fe0f9e1da518d7681f3 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sun, 20 Feb 2011 17:24:24 -0300 Subject: [PATCH 15/17] removed if by dividing handleRemote into handleRemoteForm and handleRemoteLink, as each one has a different behaviour --- src/rails.js | 82 +++++++++++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 43 deletions(-) diff --git a/src/rails.js b/src/rails.js index 04521fd1..708d89fb 100644 --- a/src/rails.js +++ b/src/rails.js @@ -33,49 +33,45 @@ return event.result !== false; } - // Submits "remote" forms and links with ajax - function handleRemote(element, event) { - var method, url, data, - dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType); - - if (element.is('form')) { - method = element.attr('method'); - url = element.attr('action'); - data = element.serializeArray(); - // memoized value from clicked submit button - var button = element.data('ujs:submit-button'); - if (button) { - data.push(button); - element.data('ujs:submit-button', null); - } - } else { - method = element.data('method'); - url = element.attr('href'); - data = null; - } - - $.ajax({ - url: url, type: method || 'GET', data: data, dataType: dataType, - // stopping the "ajax:beforeSend" event will cancel the ajax request - beforeSend: function(xhr, settings) { - if (settings.dataType === undefined) { - xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script); - } - return fire(element, 'ajax:beforeSend', [xhr, settings]); - }, - success: function(data, status, xhr) { - element.trigger('ajax:success', [data, status, xhr]); - }, - complete: function(xhr, status) { - element.trigger('ajax:complete', [xhr, status]); - }, - error: function(xhr, status, error) { - element.trigger('ajax:error', [xhr, status, error]); - } - }); - event.preventDefault(); + function handleRemoteLink(link, event) { + ajax(link, link.attr('href'), link.data('method'), null, event); } + function handleRemoteForm(form, event) { + var data = form.serializeArray(); + // memoized value from clicked submit button + var button = form.data('ujs:submit-button'); + if (button) { + data.push(button); + form.data('ujs:submit-button', null); + } + ajax(form, form.attr('action'), form.attr('method'), data, event); + } + + function ajax(element, url, method, data, event) { + var dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType); + $.ajax({ + url: url, type: method || 'GET', data: data, dataType: dataType, + // stopping the "ajax:beforeSend" event will cancel the ajax request + beforeSend: function(xhr, settings) { + if (settings.dataType === undefined) { + xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script); + } + return fire(element, 'ajax:beforeSend', [xhr, settings]); + }, + success: function(data, status, xhr) { + element.trigger('ajax:success', [data, status, xhr]); + }, + complete: function(xhr, status) { + element.trigger('ajax:complete', [xhr, status]); + }, + error: function(xhr, status, error) { + element.trigger('ajax:error', [xhr, status, error]); + } + }); + event.preventDefault(); + } + // Handles "data-method" on links such as: // Delete function handleMethod(link, event) { @@ -138,11 +134,11 @@ }); } - $('a[data-remote]').ifAllowedOn('click', handleRemote); + $('a[data-remote]').ifAllowedOn('click', handleRemoteLink); $('a[data-method]:not([data-remote])').ifAllowedOn('click', handleMethod); $('form[data-remote]').ifAllowedOn('submit', function(form, event) { - form.find('input[required]').filter(isMissing).length > 0 ? event.preventDefault() : handleRemote(form, event); + form.find('input[required]').filter(isMissing).length > 0 ? event.preventDefault() : handleRemoteForm(form, event); }); $('form:not([data-remote])').ifAllowedOn('submit', function(form, event) { From 3f60112fef850401354882f0a9c231e2cdccfed9 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sun, 20 Feb 2011 17:42:03 -0300 Subject: [PATCH 16/17] refactored code, validating if the form is ok is part of handleRemoteForm --- src/rails.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/rails.js b/src/rails.js index 708d89fb..b0314567 100644 --- a/src/rails.js +++ b/src/rails.js @@ -38,14 +38,17 @@ } function handleRemoteForm(form, event) { - var data = form.serializeArray(); - // memoized value from clicked submit button - var button = form.data('ujs:submit-button'); - if (button) { - data.push(button); - form.data('ujs:submit-button', null); + if (form.find('input[required]').filter(isMissing).length == 0) { + var data = form.serializeArray(); + // memoized value from clicked submit button + var button = form.data('ujs:submit-button'); + if (button) { + data.push(button); + form.data('ujs:submit-button', null); + } + ajax(form, form.attr('action'), form.attr('method'), data, event); } - ajax(form, form.attr('action'), form.attr('method'), data, event); + event.preventDefault(); } function ajax(element, url, method, data, event) { @@ -136,10 +139,7 @@ $('a[data-remote]').ifAllowedOn('click', handleRemoteLink); $('a[data-method]:not([data-remote])').ifAllowedOn('click', handleMethod); - - $('form[data-remote]').ifAllowedOn('submit', function(form, event) { - form.find('input[required]').filter(isMissing).length > 0 ? event.preventDefault() : handleRemoteForm(form, event); - }); + $('form[data-remote]').ifAllowedOn('submit', handleRemoteForm); $('form:not([data-remote])').ifAllowedOn('submit', function(form, event) { // slight timeout so that the submit button gets properly serialized From fa139fd2203a893a4c3a0ca92a6a9c3192a85fa8 Mon Sep 17 00:00:00 2001 From: Diego Carrion Date: Sun, 20 Feb 2011 18:04:34 -0300 Subject: [PATCH 17/17] dryed some code --- src/rails.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/rails.js b/src/rails.js index b0314567..874ffd5b 100644 --- a/src/rails.js +++ b/src/rails.js @@ -51,6 +51,10 @@ event.preventDefault(); } + function trigger(element, name) { + return function() element.trigger('ajax:' + name, arguments); + } + function ajax(element, url, method, data, event) { var dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType); $.ajax({ @@ -62,15 +66,9 @@ } return fire(element, 'ajax:beforeSend', [xhr, settings]); }, - success: function(data, status, xhr) { - element.trigger('ajax:success', [data, status, xhr]); - }, - complete: function(xhr, status) { - element.trigger('ajax:complete', [xhr, status]); - }, - error: function(xhr, status, error) { - element.trigger('ajax:error', [xhr, status, error]); - } + success: trigger(element, 'success'), + complete: trigger(element, 'complete'), + error: trigger(element, 'error') }); event.preventDefault(); }