UNPKG

ssd-form

Version:

jQuery plugin to handle form validation and submission

9 lines 7.69 kB
/* * ssdForm jQuery plugin * Examples and documentation at: https://github.com/sebastiansulinski/ssd-form * Copyright (c) 2017 Sebastian Sulinski * Version: 1.5.5 (27-DEC-2017) * Licensed under the MIT. * Requires: jQuery v1.9 or later */ !function(e,n){"function"==typeof define&&define.amd?define(["jquery"],function(e){return n(e)}):"object"==typeof exports?module.exports=n(require("jquery")):n(e.jQuery)}(this,function(e){!function(){"use strict";e.fn.ssdForm=function(n){var t=e.extend({dataFormWrapper:"data-form-wrapper",dataConfirmation:"data-confirmation",dataValidationSegment:"data-validation",dataValidationCase:"data-case",dataSubmitTrigger:"data-submit-trigger",dataSubmitPending:"data-submit-pending",classCkEditor:"editor",classHide:"hide",classShow:"show",extendBehaviours:{},extendValidationRules:{},postAjaxSuccess:function(e,n,t){e.successBehaviour(n,t)},postAjaxFailure:function(e,n,t,i,a){e.endRequestDisplayErrors(n,t.responseJSON)},ignoreElements:".button, [disabled]",serializeAttribute:"name",actionMethod:function(n,t,i,a){e.ajax({method:t.method(),url:t.action(),data:t.data(),dataType:"json",cache:!1,success:i,error:a})}},n),i="["+t.dataFormWrapper+"]",a="["+t.dataConfirmation+"]",r="["+t.dataValidationSegment+"]",s="["+t.dataValidationCase+"]",o="["+t.dataSubmitTrigger+"]",u="["+t.dataSubmitPending+"]",c=function(){var e={};this.add=function(n,t){if(e.hasOwnProperty(n))return!1;e[n]=t},this.all=function(){return e},this.empty=function(){return 0===Object.keys(e).length}},d={replace:function(n){void 0!==n.replace&&e.each(n.replace,function(n,t){e("[data-"+n+"]").html(t)})},remove:function(n){void 0!==n.remove&&e.each(n.remove,function(n,t){e("[data-"+t+"]").remove()})},reload:function(){window.location.reload(!0)},redirect:function(e){window.location.href=e}},l=e.extend({elements:[],required:function(e){return!(""===e.value||null===e.value||void 0===e.value)},checked:function(e){return e.isChecked},radio:function(e){return this.checked(e)},value_is:function(e){return e.value===e.rules_collection[0]},email:function(e){return/^[a-zA-Z0-9._\-]+@[a-zA-Z0-9]+([.\-]?[a-zA-Z0-9]+)?([\.]{1}[a-zA-Z]{2,4}){1,4}$/.test(e.value)},password:function(e){return/(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,}/.test(e.value)},min:function(e){return e.value.length>=e.rules_collection[0]},max:function(e){return e.value.length<=e.rules_collection[0]},confirmed:function(e){var n=e.name+"_confirmation",t=this.elements.filter(function(e){return e.name===n})[0];if(!t)throw new Error(e.name+"_confirmation field is missing");return t.value===e.value},regex:function(e){return new RegExp(e.regex).test(e.value)},test:function(n,t){var i=this,a=e.Deferred();return i.elements=n,e.each(t.rules,function(e,n){var r=n.split(":"),s=r.shift();t.rules_collection=r,i[s](t)||a.reject(s),e+1===t.rules.length&&a.resolve()}),a.promise()}},t.extendValidationRules),f=function(n,t){function i(e){return e.isVisible||e.isEditor}function a(n,t){return-1===e.inArray("required",t.rules)&&""===t.value||l.test(n,t)}function r(e,n,i){e+1===n&&(t.empty()?i.resolve():i.reject(t.all()))}if(!(n instanceof m))throw new Error("Invalid argument form_model.");if(!(t instanceof c))throw new Error("Invalid argument error.");this.run=function(){var s=n.inputs(),o=s.length,u=e.Deferred();return e.each(s,function(n,c){return i(c)?void 0===c.rules||0===c.rules.length?(r(n,o,u),!0):(c.rules=c.rules.split("|"),void e.when(a(s,c)).done(function(){r(n,o,u)}).fail(function(e){t.add(c.name,e),r(n,o,u)})):(r(n,o,u),!0)}),u.promise()}},h=e.extend({redirect:function(e,n){if(!n.redirect)throw new Error("Redirect entry missing.");d.redirect(n.redirect)},reload:function(){d.reload()},fadeOutShowMessage:function(e,n){var t=e.instance().closest(i).find(a);e.instance().fadeOut(200,function(){t.html(n.message).fadeIn(200)})},fadeOutShowMessageRedirect:function(e,n){var t=e.instance().closest(i).find(a);e.instance().fadeOut(200,function(){t.html(n.message).fadeIn(200,function(){setTimeout(function(){window.location.href=n.redirect},3e3)})})},fadeOutShowMessageReload:function(e,n){var t=e.instance().closest(i).find(a);e.instance().fadeOut(200,function(){t.html(n.message).fadeIn(200,function(){setTimeout(function(){window.location.reload(!0)},3e3)})})},fadeOutShowMessageResetFadeIn:function(e,n){var t=e.instance().closest(i).find(a);e.instance().fadeOut(200,function(){v.endRequest(e),t.html(n.message).fadeIn(200),setTimeout(function(){t.fadeOut(200,function(){e.instance()[0].reset(),e.instance().fadeIn(200)})},3e3)})},callReplaceRemove:function(e,n){d.replace(n),d.remove(n)},ask:function(e,n){if(!this.hasOwnProperty(n.behaviour))throw new Error("Behaviour not specified.");this[n.behaviour](e,n)},run:function(e,n){var t=e.successBehaviour();if(!this.hasOwnProperty(t))throw new Error("Behaviour does not exist.");this[t](e,n)}},t.extendBehaviours),m=function(n){function i(n,t){e.each(a,function(e,i){i.name===n&&(a[e].value=t)})}var a=n.serializeArray(),r=function(n){var a=[],r=[],s=[];return n.each(function(n,o){var u=e(o),c=u.attr(t.serializeAttribute);if(c){var d=c.split("["),l=u.attr("id"),f={name:d[0],type:o.type,rules:u.data("validate"),isArray:d.length>1,isChecked:u.is(":checked"),isVisible:u.is(":visible"),isEditor:u.hasClass("editor"),regex:u.data("regex")};if(u.hasClass(t.classCkEditor)?(f.value=window.CKEDITOR.instances[l].getData(),i(l,f.value)):f.value=u.val(),"radio"===f.type){if(s[f.name]){if(!f.isChecked)return;return f.rules=a[s[f.name]].rules,void a.splice(s[f.name],1,f)}s[f.name]=a.length}if(f.isArray){if(r[f.name]){if("checkbox"===f.type&&!f.isChecked)return;return void a[r[f.name]].value.push(f.value)}f.value=[f.value],"checkbox"!==f.type||f.isChecked||(f.value=[]),r[f.name]=a.length}a.push(f)}}),a}(n.find(":input").not(t.ignoreElements)),s=n.prop("method"),o=n.prop("action"),u=n.data("success-behaviour");!function(){if(void 0===s&&(s="post"),void 0===o)throw new Error("No action defined.")}(),this.instance=function(){return n},this.method=function(){return s},this.action=function(){return o},this.successBehaviour=function(){return u},this.inputs=function(){return r},this.data=function(){return a},this.validate=function(){return new f(this,new c).run()},this.reset=function(){n.trigger("reset")}},v={clearErrors:function(e){e.instance().find(r+" "+s).removeClass(t.classShow)},displayAlert:function(e){},displayErrors:function(n,i){var a;for(var r in i)if(i.hasOwnProperty(r)){if("alert"===r){this.displayAlert(i[r]);continue}a=e.isArray(i[r])?i[r][0]:i[r],n.instance().find("["+t.dataValidationSegment+'="'+r+'"] ['+t.dataValidationCase+'="'+a+'"]').addClass(t.classShow)}},beginRequest:function(e){if(e.instance().data("quiet"))return!0;e.instance().find(o).addClass(t.classHide),e.instance().find(u).removeClass(t.classHide)},endRequest:function(e){if(e.instance().data("quiet"))return!0;e.instance().find(o).removeClass(t.classHide),e.instance().find(u).addClass(t.classHide)},successBehaviour:function(e,n){h.run(e,n)},disableForm:function(e){this.submitted=e},enableForm:function(){this.submitted=null},endRequestDisplayErrors:function(e,n){this.endRequest(e),this.displayErrors(e,n)},endRequestDisplayErrorsReset:function(e,n){this.endRequestDisplayErrors(e,n),e.reset()},formAction:function(n,i,a,r){var s=this;e.when(n.validate()).done(function(e,r,o){s.beginRequest(n),t.actionMethod(s,n,i,a)}).fail(r)},submit:function(n){var i=this;e(n).on("submit",function(n){n.preventDefault();var a=new m(e(this));i.clearErrors(a),i.formAction(a,function(e){t.postAjaxSuccess(i,a,e)},function(e,n,r){t.postAjaxFailure(i,a,e,n,r)},function(e){i.endRequestDisplayErrors(a,e)})})},init:function(e){this.submit(e)}};return v.init(this)}}()});