vendor/assets/javascripts/webshims/shims/form-validators.js in webshims-rails-1.12.5 vs vendor/assets/javascripts/webshims/shims/form-validators.js in webshims-rails-1.12.7

- old
+ new

@@ -1,17 +1,18 @@ webshims.register('form-validators', function($, webshims, window, document, undefined, options){ "use strict"; - +var iValClasses = '.'+ options.iVal.errorClass +', .'+options.iVal.successClass; (function(){ if(webshims.refreshCustomValidityRules){ webshims.error("form-validators already included. please remove custom-validity.js"); } - + var customValidityRules = {}; var formReady = false; var blockCustom; var initTest; + var elemSels = 'input, select, textarea, fieldset[data-dependent-validation]'; var onEventTest = function(e){ webshims.refreshCustomValidityRules(e.target); }; var noValidate = function(){ return !noValidate.types[this.type]; @@ -23,25 +24,32 @@ reset: 1, submit: 1 }; webshims.customErrorMessages = {}; - webshims.addCustomValidityRule = function(name, test, defaultMessage){ - customValidityRules[name] = test; - if(!webshims.customErrorMessages[name]){ - webshims.customErrorMessages[name] = []; - webshims.customErrorMessages[name][''] = defaultMessage || name; - } - if(formReady){ - $('input, select, textarea, fieldset[data-dependent-validation]') + webshims.addCustomValidityRule = (function(){ + var timer; + var reTest = function(){ + $(document.querySelectorAll(elemSels)) .filter(noValidate) .each(function(){ testValidityRules(this); }) ; - } - }; + }; + return function(name, test, defaultMessage){ + customValidityRules[name] = test; + if(!webshims.customErrorMessages[name]){ + webshims.customErrorMessages[name] = []; + webshims.customErrorMessages[name][''] = defaultMessage || name; + } + if(formReady){ + clearTimeout(timer); + timer = setTimeout(reTest); + } + }; + })(); webshims.refreshCustomValidityRules = function(elem){ if(!initTest){return;} var val, setMessage; var data = $(elem).data(); var message = ''; @@ -98,11 +106,11 @@ $('body').on('click', function(e){ if(e.target.type == 'submit'){ var activeElement = document.activeElement; if(activeElement != e.target && $.data(activeElement, 'webshimsswitchvalidityclass')){ - $(activeElement).trigger('refreshvalidityui'); + $(activeElement).trigger('updatevalidation.webshims'); } } }); } @@ -114,26 +122,25 @@ $.data(elem, 'customMismatchedRule', ''); } return null; } }; - - + setTimeout(function(){ webshims.addReady(function(context, selfElement){ initTest = true; - $('input, select, textarea, fieldset[data-dependent-validation]', context).add(selfElement.filter('input, select, textarea, fieldset[data-dependent-validation]')) + $(context.querySelectorAll(elemSels)).add(selfElement.filter(elemSels)) .filter(noValidate) .each(function(){ testValidityRules(this); }) ; formReady = true; }); $(document).on('refreshCustomValidityRules', onEventTest); - }, 9); + }, 29); }); })(); @@ -161,11 +168,11 @@ addCustomValidityRule('tooShort', function(elem, val, data){ if(!val || !data.minlength){return;} if($.nodeName(elem, 'input')){ - webshims.warn('depreacated data-minlength usage: Use pattern=".{'+ data.minlength +'3,}" instead.'); + webshims.warn('depreacated data-minlength usage: Use pattern=".{'+ data.minlength +',}" instead.'); } return data.minlength > val.length; }, 'Entered value is too short.'); addCustomValidityRule('grouprequired', function(elem, val, data){ @@ -236,11 +243,11 @@ if(data.toggle){ val = !val; } $.prop( elem, data.prop, val); if(e){ - $(elem).getShadowElement().filter('.user-error, .user-success').trigger('refreshvalidityui'); + $(elem).getShadowElement().filter(iValClasses).trigger('updatevalidation.webshims'); } }; if(!data._init || !data.masterElement){ @@ -277,12 +284,12 @@ } else { $(data.masterElement).on('change', function(){ webshims.refreshCustomValidityRules(elem); $(elem) .getShadowElement() - .filter('.user-error, .user-success') - .trigger('refreshvalidityui') + .filter(iValClasses) + .trigger('updatevalidation.webshims') ; }); } } @@ -305,10 +312,11 @@ if(window.JSON){ addCustomValidityRule('ajaxvalidate', function(elem, val, data){ if(!val || !data.ajaxvalidate){return;} var opts; if(!data.remoteValidate){ + webshims.loader.loadList(['jajax']); if(typeof data.ajaxvalidate == 'string'){ data.ajaxvalidate = {url: data.ajaxvalidate, depends: $([])}; } else { data.ajaxvalidate.depends = data.ajaxvalidate.depends ? $(typeof data.ajaxvalidate.depends == 'string' && data.ajaxvalidate.depends.split(' ') || data.ajaxvalidate.depends).map(getId) : @@ -332,19 +340,19 @@ this.restartAjax = remoteData; } else { this.restartAjax = false; this.ajaxLoading = true; $.ajax( - $.extend({}, opts, { + $.extend({dataType: 'json'}, opts, { url: opts.url, - dataType: 'json', depData: remoteData, data: formCFG.fullRemoteForm || opts.fullForm ? $(elem).jProp('form').serializeArray() : remoteData, success: this.getResponse, - complete: this._complete + complete: this._complete, + timeout: 3000 }) ); } }, _complete: function(){ @@ -353,19 +361,24 @@ this.update(remoteValidate.restartAjax); } remoteValidate.restartAjax = false; }, getResponse: function(data){ + if(options.transformAjaxValidate){ + data = options.transformAjaxValidate(data); + } if(!data){ data = {message: '', valid: true}; } else if(typeof data == 'string'){ - data = JSON.parse(data); + try { + data = JSON.parse(data); + } catch (er){} } remoteValidate.message = ('message' in data) ? data.message : !data.valid; remoteValidate.lastMessage = remoteValidate.message; remoteValidate.blockUpdate = true; - $(elem).triggerHandler('refreshvalidityui'); + $(elem).triggerHandler('updatevalidation.webshims'); remoteValidate.message = 'async'; remoteValidate.blockUpdate = false; }, getData: function(){ var data;