You're Invited:Meet the Socket Team at BlackHat and DEF CON in Las Vegas, Aug 4-6.RSVP
Socket
Book a DemoInstallSign in
Socket

angular-auto-validate

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

angular-auto-validate - npm Package Compare versions

Comparing version

to
1.19.0

dist/lang/jcs-auto-validate_nl-nl.json

2

bower.json
{
"name": "angular-auto-validate",
"version": "1.18.14",
"version": "1.19.0",
"description": "An automatic validation module for AngularJS which gets rid of excess html in favour of dynamic element modification to notify the user of validation errors",

@@ -5,0 +5,0 @@ "main": "dist/jcs-auto-validate.js",

@@ -0,1 +1,24 @@

v1.19.0 25/10/2015
Possible breaking change fixing i18n caching issue with en-us and en-gb files. The default language
is now 'default' and not en-gb.
New Turkish translation.
Updated German translation
IE10 speed improvement when validating a form.
The BS3 modifier no longer adds the has-feedback class if state icons are not enabled.
Fixed issue when serialising the form controller to json
You can now add the attribute disable-auto-validate="true" to an element and it won't validate.
v1.18.17 2/09/2015
Added pt-pt and zh-tw lang files
v1.18.16 03/09/2015
Fixes issue (https://github.com/jonsamwell/angular-auto-validate/issues/88) where the node is a comment.
Fixes issue with validation error message placement with checkboxes and radio groups for the BS3 modifier.
V1.18.15 01/09/2015
Added nl-nl (Dutch) language file thanks to <Jonathan voor de Poorte>
Added zh-cn (simplified chinese) language file thanks to <https://github.com/bwlee>
Foundation modifier now checks for either the 'columns' or 'column' class as you can you either with foundation 5.
Fixed issue https://github.com/jonsamwell/angular-auto-validate/issues/85 supportsNgModelOptions logic mistake
V1.18.14 23/08/2015

@@ -2,0 +25,0 @@ Fixed issue with globally changing default form validation options.

/*
* angular-auto-validate - v1.18.14 - 2015-08-23
* angular-auto-validate - v1.19.0 - 2015-10-25
* https://github.com/jonsamwell/angular-auto-validate

@@ -57,2 +57,6 @@ * Copyright (c) 2015 Jon Samwell (http://www.jonsamwell.com)

autoValidateEnabledOnControl = function (el) {
return !getBooleanAttributeValue(el, 'disable-auto-validate');
},
invalidElementStylingEnabled = function (el) {

@@ -259,6 +263,8 @@ return enableInvalidElementStyling && !getBooleanAttributeValue(el, 'disable-invalid-styling');

this.makeValid = function (el) {
if (validElementStylingEnabled(el)) {
this.getDomModifier(el).makeValid(el);
} else {
this.makeDefault(el);
if (autoValidateEnabledOnControl(el)) {
if (validElementStylingEnabled(el)) {
this.getDomModifier(el).makeValid(el);
} else {
this.makeDefault(el);
}
}

@@ -268,6 +274,8 @@ };

this.makeInvalid = function (el, errorMsg) {
if (invalidElementStylingEnabled(el)) {
this.getDomModifier(el).makeInvalid(el, errorMsg);
} else {
this.makeDefault(el);
if (autoValidateEnabledOnControl(el)) {
if (invalidElementStylingEnabled(el)) {
this.getDomModifier(el).makeInvalid(el, errorMsg);
} else {
this.makeDefault(el);
}
}

@@ -277,5 +285,7 @@ };

this.makeDefault = function (el) {
var dm = this.getDomModifier(el);
if (dm.makeDefault) {
dm.makeDefault(el);
if (autoValidateEnabledOnControl(el)) {
var dm = this.getDomModifier(el);
if (dm.makeDefault) {
dm.makeDefault(el);
}
}

@@ -398,3 +408,3 @@ };

inputGroupEl = findInputGroupElement(frmGroupEl[0]);
frmGroupEl.addClass('has-success ' + (inputGroupEl.length > 0 ? '' : 'has-feedback'));
frmGroupEl.addClass('has-success ' + (inputGroupEl.length > 0 || addValidationStateIcons === false ? '' : 'has-feedback'));
if (addValidationStateIcons) {

@@ -434,4 +444,4 @@ var iconElText = '<span class="glyphicon glyphicon-ok form-control-feedback"></span>';

inputGroupEl = findInputGroupElement(frmGroupEl[0]);
frmGroupEl.addClass('has-error ' + (inputGroupEl.length > 0 ? '' : 'has-feedback'));
insertAfter(inputGroupEl.length > 0 ? inputGroupEl : el, helpTextEl);
frmGroupEl.addClass('has-error ' + (inputGroupEl.length > 0 || addValidationStateIcons === false ? '' : 'has-feedback'));
insertAfter(inputGroupEl.length > 0 ? inputGroupEl : getCorrectElementToPlaceErrorElementAfter(el), helpTextEl);
if (addValidationStateIcons) {

@@ -444,3 +454,3 @@ var iconElText = '<span class="glyphicon glyphicon-remove form-control-feedback"></span>';

insertAfter(el, angular.element(iconElText));
insertAfter(getCorrectElementToPlaceErrorElementAfter(el), angular.element(iconElText));
}

@@ -452,2 +462,13 @@ } else {

getCorrectElementToPlaceErrorElementAfter = function (el) {
var correctEl = el,
elType = el[0].type ? el[0].type.toLowerCase() : '';
if ((elType === 'checkbox' || elType === 'radio') && el.parent()[0].nodeName.toLowerCase() === 'label') {
correctEl = el.parent();
}
return correctEl;
},
/**

@@ -538,3 +559,3 @@ * @ngdoc function

angular.autoValidate.errorMessages['en-us'] = angular.autoValidate.errorMessages['en-gb'] = {
angular.autoValidate.errorMessages['default'] = {
defaultMsg: 'Please add error message for {0}',

@@ -554,3 +575,3 @@ email: 'Please enter a valid email address',

function DefaultErrorMessageResolverFn($q, $http) {
var currentCulture = 'en-gb',
var currentCulture = 'default',

@@ -687,3 +708,5 @@ i18nFileRootPath = 'js/angular-auto-validate/dist/lang',

if (errMsg === undefined) {
if (errMsg === undefined && messageTypeOverride !== undefined) {
errMsg = angular.autoValidate.errorMessages[currentCulture].defaultMsg.format(messageTypeOverride);
} else if (errMsg === undefined) {
errMsg = angular.autoValidate.errorMessages[currentCulture].defaultMsg.format(errorType);

@@ -739,3 +762,3 @@ }

for (var i = 0; i <= 3; i += 1) {
if (parent !== undefined && parent.hasClass('columns')) {
if (parent !== undefined && (parent.hasClass('columns') || parent.hasClass('column'))) {
break;

@@ -843,3 +866,3 @@ } else if (parent !== undefined) {

/**
* Only validate if the element is present, it is visible
* Only validate if the element is present, it is visible, if it is not a comment,
* it is either a valid user input control (input, select, textare, form) or

@@ -853,2 +876,3 @@ * it is a custom control register by the developer.

var elementExists = el && el.length > 0,
isElementAComment = elementExists && el[0].nodeName.toLowerCase() === '#comment',
correctVisibilityToValidate,

@@ -858,3 +882,3 @@ correctTypeToValidate,

if (elementExists) {
if (elementExists && isElementAComment === false) {
correctVisibilityToValidate = elementIsVisible(el) || formOptions.validateNonVisibleControls;

@@ -867,3 +891,3 @@ correctTypeToValidate = elementTypesToValidate.indexOf(el[0].nodeName.toLowerCase()) > -1 ||

return elementExists && correctVisibilityToValidate && correctTypeToValidate && correctPhaseToValidate;
return elementExists && !isElementAComment && correctVisibilityToValidate && correctTypeToValidate && correctPhaseToValidate;

@@ -908,3 +932,3 @@ },

if ((frmOptions.forceValidation ||
(shouldValidateElement(el, frmOptions, frmOptions.formController.$submitted) &&
(shouldValidateElement(el, frmOptions, frmOptions.getFormController().$submitted) &&
modelCtrl &&

@@ -999,3 +1023,3 @@ needsValidation))) {

// Firefox in the elements and chrome as a child iterator
angular.forEach((frmElement[0].all || frmElement[0].elements) || frmElement[0], function (ctrlElement) {
angular.forEach((frmElement[0].elements || frmElement[0].all) || frmElement[0], function (ctrlElement) {
processElement(ctrlElement, true, clonedOptions);

@@ -1058,3 +1082,7 @@ });

var opts = ctrl.autoValidateFormOptions = ctrl.autoValidateFormOptions || angular.copy(validator.defaultFormValidationOptions);
opts.formController = ctrl;
// needed to stop circular ref in json serialisation
opts.getFormController = function () {
return ctrl;
};
opts.forceValidation = false;

@@ -1290,3 +1318,3 @@ opts.disabled = !validator.isEnabled() || parseBooleanAttributeValue(attrs.disableDynamicValidation, opts.disabled);

frmCtrl.autoValidateFormOptions.disabled === false)) {
if (supportsNgModelOptions || ngModelOptions === undefined || ngModelOptions.updateOn === undefined || ngModelOptions.updateOn === '') {
if (!supportsNgModelOptions || ngModelOptions === undefined || ngModelOptions.updateOn === undefined || ngModelOptions.updateOn === '') {
ngModelCtrl.$setValidity = function (validationErrorKey, isValid) {

@@ -1293,0 +1321,0 @@ setValidity.call(ngModelCtrl, validationErrorKey, isValid);

/*
* angular-auto-validate - v1.18.14 - 2015-08-23
* angular-auto-validate - v1.19.0 - 2015-10-25
* https://github.com/jonsamwell/angular-auto-validate
* Copyright (c) 2015 Jon Samwell (http://www.jonsamwell.com)
*/
!function(a,b){"use strict";function c(){var a={},c=!0,d=!0,e=!0,f=function(a){var b;return a&&0!==a.length?(b=a.toLowerCase(),a=!("f"===b||"0"===b||"false"===b)):a=!1,a},g=function(a,b){var c;return void 0!==a&&(c=a.attr(b)||a.attr("data-"+b)),c},h=function(a,b){var c;return void 0!==a&&(c=void 0!==a.attr(b)||void 0!==a.attr("data-"+b)),c},i=function(a,b){return f(g(a,b))},j=function(a){return c&&!i(a,"disable-valid-styling")},k=function(a){return d&&!i(a,"disable-invalid-styling")};this.enable=function(a){e=a},this.isEnabled=function(){return e},this.setDefaultElementModifier=function(b){if(void 0===a[b])throw new Error("Element modifier not registered: "+b);this.defaultElementModifier=b},this.registerDomModifier=function(b,c){a[b]=c},this.setErrorMessageResolver=function(a){this.errorMessageResolver=a},this.getErrorMessage=function(a,c){var d;if(void 0===this.errorMessageResolver)throw new Error("Please set an error message resolver via the setErrorMessageResolver function before attempting to resolve an error message.");return h(c,"disable-validation-message")?(d=b.injector(["ng"]).get("$q").defer(),d.resolve(""),d.promise):this.errorMessageResolver(a,c)},this.setValidElementStyling=function(a){c=a},this.setInvalidElementStyling=function(a){d=a},this.getDomModifier=function(b){var c=(void 0!==b?b.attr("element-modifier"):this.defaultElementModifier)||(void 0!==b?b.attr("data-element-modifier"):this.defaultElementModifier)||this.defaultElementModifier;if(void 0===c)throw new Error("Please set a default dom modifier via the setDefaultElementModifier method on the validator class.");return a[c]},this.makeValid=function(a){j(a)?this.getDomModifier(a).makeValid(a):this.makeDefault(a)},this.makeInvalid=function(a,b){k(a)?this.getDomModifier(a).makeInvalid(a,b):this.makeDefault(a)},this.makeDefault=function(a){var b=this.getDomModifier(a);b.makeDefault&&b.makeDefault(a)},this.defaultFormValidationOptions={forceValidation:!1,disabled:!1,validateNonVisibleControls:!1,removeExternalValidationErrorsOnSubmit:!0,validateOnFormSubmit:!1},this.$get=[function(){return this}]}function d(a){var c=function(a){b.forEach(a.find("span"),function(a){a=b.element(a),(a.hasClass("error-msg")||a.hasClass("form-control-feedback")||a.hasClass("control-feedback"))&&a.remove()}),a.removeClass("has-success has-error has-feedback")},d=function(a,b){for(var c,d=a,e=0;10>=e;e+=1){if(void 0!==d&&d.hasClass(b)){c=d;break}void 0!==d&&(d=d.parent())}return c},e=function(a,c){for(var d,f=0;f<a.children.length&&(d=a.children[f],void 0===d||!b.element(d).hasClass(c))&&!(void 0!==d.children&&(d=e(d,c),d.length>0));f+=1);return b.element(d)},f=function(a){return d(a,"form-group")},g=function(a){return e(a,"input-group")},h=function(a,b){a[0].parentNode.insertBefore(b[0],a[0].nextSibling)},i=!1,j=function(a){i=a},k=function(d){var e,j=f(d);if(j){if(c(j),e=g(j[0]),j.addClass("has-success "+(e.length>0?"":"has-feedback")),i){var k='<span class="glyphicon glyphicon-ok form-control-feedback"></span>';e.length>0&&(k=k.replace("form-",""),k='<span class="input-group-addon control-feedback">'+k+"</span"),h(d,b.element(k))}}else a.error("Angular-auto-validate: invalid bs3 form structure elements must be wrapped by a form-group class")},l=function(d,e){var j,k=f(d),l=b.element('<span class="help-block has-error error-msg">'+e+"</span>");if(k){if(c(k),j=g(k[0]),k.addClass("has-error "+(j.length>0?"":"has-feedback")),h(j.length>0?j:d,l),i){var m='<span class="glyphicon glyphicon-remove form-control-feedback"></span>';j.length>0&&(m=m.replace("form-",""),m='<span class="input-group-addon control-feedback">'+m+"</span"),h(d,b.element(m))}}else a.error("Angular-auto-validate: invalid bs3 form structure elements must be wrapped by a form-group class")},m=function(b){var d=f(b);d?c(d):a.error("Angular-auto-validate: invalid bs3 form structure elements must be wrapped by a form-group class")};return{makeValid:k,makeInvalid:l,makeDefault:m,enableValidationStateIcons:j,key:"bs3"}}function e(a){var c=function(c,d,e){d=b.isUndefined(d)?0:d,e=b.isUndefined(e)?!0:e;var f=0;return function(){var b=this,g=arguments;f+=1;var h=function(a){return function(){return a===f?c.apply(b,g):void 0}}(f);return a(h,d,e)}};return{debounce:c}}function f(a,c){var d,e="en-gb",f="js/angular-auto-validate/dist/lang",g=function(a){return d=c.get("{0}/jcs-auto-validate_{1}.json".format(f,a.toLowerCase()))},h=function(a){f=a},i=function(c,f){var h=a.defer();return f=f||g,e=c.toLowerCase(),void 0===b.autoValidate.errorMessages[e]?(d=f(c),d.then(function(a){d=void 0,b.autoValidate.errorMessages[e]=a.data,h.resolve(b.autoValidate.errorMessages[e])},function(a){b.autoValidate.errorMessages[e]={defaultMsg:"Loading culture failed!"},d=null,h.reject(a)})):h.resolve(b.autoValidate.errorMessages[e]),h.promise},j=function(c){var f=a.defer();return c=void 0===c?e:c.toLowerCase(),void 0!==d?d.then(function(){f.resolve(b.autoValidate.errorMessages[c])},function(a){f.reject(a)}):f.resolve(b.autoValidate.errorMessages[c]),f.promise},k=function(a,b){var c;return b&&(a+="-err-type",c=b.attr("ng-"+a),void 0===c&&(c=b.attr("data-ng-"+a)||b.attr(a)),c&&(c=c.replace(/[\W]/g,""))),c},l=function(c,f){var g,h,i,j=a.defer(),m=[];if(void 0!==d)d.then(function(){l(c,f).then(function(a){j.resolve(a)})});else{if(g=b.autoValidate.errorMessages[e][c],i=k(c,f),i&&(g=b.autoValidate.errorMessages[e][i]),void 0===g&&(g=b.autoValidate.errorMessages[e].defaultMsg.format(c)),f&&f.attr)try{h=f.attr("ng-"+c),void 0===h&&(h=f.attr("data-ng-"+c)||f.attr(c)),m.push(h||""),g=g.format(m)}catch(n){}j.resolve(g)}return j.promise};return{setI18nFileRootPath:h,setCulture:i,getErrorMessages:j,resolve:l}}function g(){var a=function(a,c){b.forEach(a.find("small"),function(a){b.element(a).hasClass("error")&&b.element(a).remove()}),c.removeClass("error")},c=function(a){for(var b=a,c=0;3>=c&&(void 0===b||!b.hasClass("columns"));c+=1)void 0!==b&&(b=b.parent());return b},d=function(b){var d=c(b);a(d&&d.length>0?d:b,b)},e=function(d,e){var f,g=c(d);a(g||d,d),d.addClass("error"),g&&(f=b.element('<small class="error">'+e+"</small>"),g.append(f))},f=function(a){d(a)};return{makeValid:d,makeInvalid:e,makeDefault:f,key:"foundation5"}}function h(){var a=function(a){return a[0].offsetWidth>0&&a[0].offsetHeight>0};return{isElementVisible:a}}function i(a,c){var d=["input","textarea","select","form"],e=function(a){return c.isElementVisible(a)},f=function(c){var d,e=b.element(c).controller("form");return d=void 0!==e&&null!==e?e.autoValidateFormOptions:a.defaultFormValidationOptions},g=function(a,b,c){var f,g,h,i=a&&a.length>0;return i&&(f=e(a)||b.validateNonVisibleControls,g=d.indexOf(a[0].nodeName.toLowerCase())>-1||a[0].hasAttribute("register-custom-form-control"),h=b.validateOnFormSubmit===!1||b.validateOnFormSubmit===!0&&c===!0),i&&f&&g&&h},h=function(c,d,e){var h,i=!0,j=e||f(d),k=c.$pristine===!1||j.forceValidation,l=function(a){var c,d=!0;return b.forEach(a,function(a,b){d&&a&&(d=!1,c=b)}),c};return j.disabled===!1&&(j.forceValidation||g(d,j,j.formController.$submitted)&&c&&k)&&(i=!c.$invalid,j.removeExternalValidationErrorsOnSubmit&&c.removeAllExternalValidation&&c.removeAllExternalValidation(),i?a.makeValid(d):(h=l(c.$errors||c.$error),void 0===h?i=!0:a.getErrorMessage(h,d).then(function(b){a.makeInvalid(d,b)}))),i},i=function(b){a.makeDefault(b)},j=function(a){b.forEach(a[0].all||a[0].elements||a[0],function(a){var c,d=b.element(a);c=d.controller("ngModel"),void 0!==c&&("form"===d[0].nodeName.toLowerCase()?j(d):c.$setPristine())})},k=function(a){var c,d=!0,e=a?b.element(a).controller("form"):void 0,i=function(a,c,i){var j,l,m,n;if(a=b.element(a),j=a.controller("ngModel"),void 0!==j&&(c||g(a,i,e.$submitted)))if("form"===a[0].nodeName.toLowerCase())k(a);else{m=f(a),n=m.forceValidation,m.forceValidation=c;try{l=h(j,a,m),d=d&&l}finally{m.forceValidation=n}}};return void 0===a||void 0!==e&&e.autoValidateFormOptions.disabled?void 0!==a:(c=b.copy(e.autoValidateFormOptions),c.forceValidation=!0,b.forEach(a[0].all||a[0].elements||a[0],function(a){i(a,!0,c)}),a[0].customHTMLFormControlsCollection&&b.forEach(a[0].customHTMLFormControlsCollection,function(a){i(a,!0,c)}),d)},l=function(b,c,d){c?a.getErrorMessage(c,b).then(function(c){a.makeInvalid(b,c)}):a.makeInvalid(b,d)};return{setElementValidationError:l,validateElement:h,validateForm:k,resetElement:i,resetForm:j}}function j(a,b){return void 0!==a&&null!==a||void 0===b?"false"!==a:b}function k(a,c,d){var e=a.autoValidateFormOptions=a.autoValidateFormOptions||b.copy(c.defaultFormValidationOptions);e.formController=a,e.forceValidation=!1,e.disabled=!c.isEnabled()||j(d.disableDynamicValidation,e.disabled),e.validateNonVisibleControls=j(d.validateNonVisibleControls,e.validateNonVisibleControls),e.validateOnFormSubmit=j(d.validateOnFormSubmit,e.validateOnFormSubmit),e.removeExternalValidationErrorsOnSubmit=void 0===d.removeExternalValidationErrorsOnSubmit?e.removeExternalValidationErrorsOnSubmit:j(d.removeExternalValidationErrorsOnSubmit,e.removeExternalValidationErrorsOnSubmit),c.isEnabled()===!1&&"false"===d.disableDynamicValidation&&(e.disabled=!1)}function l(a){return{restrict:"E",link:function(b,c){function d(){a.resetForm(c),e.$setPristine&&e.$setPristine(),e.$setUntouched&&e.$setUntouched()}var e=c.controller("form");void 0!==e&&e.autoValidateFormOptions&&e.autoValidateFormOptions.disabled===!1&&(c.on("reset",d),b.$on("$destroy",function(){c.off("reset",d)}))}}}function m(){var a=function(a){for(var c=a,d=0;50>=d&&(void 0===c||"form"!==c.nodeName.toLowerCase());d+=1)void 0!==c&&(c=b.element(c).parent()[0]);return c};return{restrict:"A",link:function(b,c){var d=a(c.parent()[0]);d&&(d.customHTMLFormControlsCollection=d.customHTMLFormControlsCollection||[],d.customHTMLFormControlsCollection.push(c[0]))}}}function n(a,b,c){return a[0].compile=function(a,d){var e=b(d.ngSubmit),f="true"===d.ngSubmitForce;return function(a,b){function d(d){a.$apply(function(){void 0!==i&&null!==i&&i.autoValidateFormOptions&&i.autoValidateFormOptions.disabled===!0?e(a,{$event:d}):(void 0===i.$setSubmitted&&(i.$submitted=!0),(c.validateForm(b)||f===!0)&&e(a,{$event:d}))})}function g(){b[0].reset?b[0].reset():c.resetForm(b)}var h,i=b.controller("form");i&&i.autoValidateFormOptions&&(i.autoValidateFormOptions.resetForm=g,void 0!==i.$name&&""!==i.$name&&(h=a.$on("form:"+i.$name+":reset",g))),b.on("submit",d),a.$on("$destroy",function(){b.off("submit",d),h&&h()})}},a}function o(a){a.decorator("ngSubmitDirective",n)}function p(a,b,c,d){a.setErrorMessageResolver(b.resolve),a.registerDomModifier(c.key,c),a.registerDomModifier(d.key,d),a.setDefaultElementModifier(c.key)}b.module("jcs-autoValidate",[]),b.module("jcs-autoValidate").provider("validator",c),d.$inject=["$log"],b.module("jcs-autoValidate").factory("bootstrap3ElementModifier",d),e.$inject=["$timeout"],b.module("jcs-autoValidate").factory("jcs-debounce",e),"format"in a.prototype||(a.prototype.format=function(){var a=arguments;return this.replace(/{(\d+)}/g,function(b,c){return void 0!==typeof a[c]?a[c]:b})}),b.autoValidate=b.autoValidate||{errorMessages:{}},b.autoValidate.errorMessages["en-us"]=b.autoValidate.errorMessages["en-gb"]={defaultMsg:"Please add error message for {0}",email:"Please enter a valid email address",minlength:"Please enter at least {0} characters",maxlength:"You have entered more than the maximum {0} characters",min:"Please enter the minimum number of {0}",max:"Please enter the maximum number of {0}",required:"This field is required",date:"Please enter a valid date",pattern:"Please ensure the entered information adheres to this pattern {0}",number:"Please enter a valid number",url:"Please enter a valid URL in the format of http(s)://www.google.com"},f.$inject=["$q","$http"],b.module("jcs-autoValidate").factory("defaultErrorMessageResolver",f),b.module("jcs-autoValidate").factory("foundation5ElementModifier",g),i.$inject=["validator","jcs-elementUtils"],b.module("jcs-autoValidate").factory("jcs-elementUtils",h),b.module("jcs-autoValidate").factory("validationManager",i),b.module("jcs-autoValidate").directive("form",["validator",function(a){return{restrict:"E",require:"form",priority:9999,compile:function(){return{pre:function(b,c,d,e){k(e,a,d)}}}}}]),b.module("jcs-autoValidate").directive("ngForm",["validator",function(a){return{restrict:"EA",require:"form",priority:9999,compile:function(){return{pre:function(b,c,d,e){k(e,a,d)}}}}}]),l.$inject=["validationManager"],b.module("jcs-autoValidate").directive("form",l),b.module("jcs-autoValidate").directive("registerCustomFormControl",m),n.$inject=["$delegate","$parse","validationManager"],o.$inject=["$provide"],b.module("jcs-autoValidate").config(o),b.module("jcs-autoValidate").config(["$provide",function(a){a.decorator("ngModelDirective",["$timeout","$delegate","validationManager","jcs-debounce",function(a,c,d,e){var f=c[0],g=f.link||f.compile;return f.compile=function(a){var c=b.version.major>=1&&b.version.minor>=3,f=g;return c&&b.isFunction(g)&&(f=g(a)),{pre:function(a,g,h,i){var j=i[0],k=i[1],l=void 0===h.ngModelOptions?void 0:a.$eval(h.ngModelOptions),m=j.$setValidity,n=j.$setPristine,o=e.debounce(function(){var a=void 0!==k&&null!==k?k.autoValidateFormOptions:void 0;d.validateElement(j,g,a)},100);return void 0===h.formnovalidate&&void 0!==k&&null!==k&&k.autoValidateFormOptions&&k.autoValidateFormOptions.disabled===!1&&(c||void 0===l||void 0===l.updateOn||""===l.updateOn?j.$setValidity=function(a,b){m.call(j,a,b),o()}:(g.on(l.updateOn,function(){o()}),a.$on("$destroy",function(){g.off(l.updateOn)})),j.$setPristine=function(){n.call(j),d.resetElement(g)},j.autoValidated=!0),j.setExternalValidation=function(a,b,c){if(c){var e=j.$error||j.$errors;e[a]=!1}j.externalErrors=j.externalErrors||{},j.externalErrors[a]=!1,d.setElementValidationError(g,a,b)},j.removeExternalValidation=function(a,b){if(b){var c=j.$error||j.$errors;delete c[a]}j.externalErrors&&delete j.externalErrors[a],d.resetElement(g)},j.removeAllExternalValidation=function(){if(j.externalErrors){var a=j.$error||j.$errors;b.forEach(j.externalErrors,function(b,c){delete a[c]}),j.externalErrors={},d.resetElement(g)}},k&&(k.setExternalValidation=function(a,b,c,d){var e=!1;return k[a]&&(k[a].setExternalValidation(b,c,d),e=!0),e},k.removeExternalValidation=function(a,b,c,d){var e=!1;return k[a]&&(k[a].removeExternalValidation(b,d),e=!0),e}),f.pre?f.pre.apply(this,arguments):this},post:function(a,b,c,d){return f.post?f.post.apply(this,arguments):f.apply(this,arguments)}}},c}])}]),p.$inject=["validator","defaultErrorMessageResolver","bootstrap3ElementModifier","foundation5ElementModifier"],b.module("jcs-autoValidate").run(p)}(String,angular);
!function(a,b){"use strict";function c(){var a={},c=!0,d=!0,e=!0,f=function(a){var b;return a&&0!==a.length?(b=a.toLowerCase(),a=!("f"===b||"0"===b||"false"===b)):a=!1,a},g=function(a,b){var c;return void 0!==a&&(c=a.attr(b)||a.attr("data-"+b)),c},h=function(a,b){var c;return void 0!==a&&(c=void 0!==a.attr(b)||void 0!==a.attr("data-"+b)),c},i=function(a,b){return f(g(a,b))},j=function(a){return c&&!i(a,"disable-valid-styling")},k=function(a){return!i(a,"disable-auto-validate")},l=function(a){return d&&!i(a,"disable-invalid-styling")};this.enable=function(a){e=a},this.isEnabled=function(){return e},this.setDefaultElementModifier=function(b){if(void 0===a[b])throw new Error("Element modifier not registered: "+b);this.defaultElementModifier=b},this.registerDomModifier=function(b,c){a[b]=c},this.setErrorMessageResolver=function(a){this.errorMessageResolver=a},this.getErrorMessage=function(a,c){var d;if(void 0===this.errorMessageResolver)throw new Error("Please set an error message resolver via the setErrorMessageResolver function before attempting to resolve an error message.");return h(c,"disable-validation-message")?(d=b.injector(["ng"]).get("$q").defer(),d.resolve(""),d.promise):this.errorMessageResolver(a,c)},this.setValidElementStyling=function(a){c=a},this.setInvalidElementStyling=function(a){d=a},this.getDomModifier=function(b){var c=(void 0!==b?b.attr("element-modifier"):this.defaultElementModifier)||(void 0!==b?b.attr("data-element-modifier"):this.defaultElementModifier)||this.defaultElementModifier;if(void 0===c)throw new Error("Please set a default dom modifier via the setDefaultElementModifier method on the validator class.");return a[c]},this.makeValid=function(a){k(a)&&(j(a)?this.getDomModifier(a).makeValid(a):this.makeDefault(a))},this.makeInvalid=function(a,b){k(a)&&(l(a)?this.getDomModifier(a).makeInvalid(a,b):this.makeDefault(a))},this.makeDefault=function(a){if(k(a)){var b=this.getDomModifier(a);b.makeDefault&&b.makeDefault(a)}},this.defaultFormValidationOptions={forceValidation:!1,disabled:!1,validateNonVisibleControls:!1,removeExternalValidationErrorsOnSubmit:!0,validateOnFormSubmit:!1},this.$get=[function(){return this}]}function d(a){var c=function(a){b.forEach(a.find("span"),function(a){a=b.element(a),(a.hasClass("error-msg")||a.hasClass("form-control-feedback")||a.hasClass("control-feedback"))&&a.remove()}),a.removeClass("has-success has-error has-feedback")},d=function(a,b){for(var c,d=a,e=0;10>=e;e+=1){if(void 0!==d&&d.hasClass(b)){c=d;break}void 0!==d&&(d=d.parent())}return c},e=function(a,c){for(var d,f=0;f<a.children.length&&(d=a.children[f],void 0===d||!b.element(d).hasClass(c))&&!(void 0!==d.children&&(d=e(d,c),d.length>0));f+=1);return b.element(d)},f=function(a){return d(a,"form-group")},g=function(a){return e(a,"input-group")},h=function(a,b){a[0].parentNode.insertBefore(b[0],a[0].nextSibling)},i=!1,j=function(a){i=a},k=function(d){var e,j=f(d);if(j){if(c(j),e=g(j[0]),j.addClass("has-success "+(e.length>0||i===!1?"":"has-feedback")),i){var k='<span class="glyphicon glyphicon-ok form-control-feedback"></span>';e.length>0&&(k=k.replace("form-",""),k='<span class="input-group-addon control-feedback">'+k+"</span"),h(d,b.element(k))}}else a.error("Angular-auto-validate: invalid bs3 form structure elements must be wrapped by a form-group class")},l=function(d,e){var j,k=f(d),l=b.element('<span class="help-block has-error error-msg">'+e+"</span>");if(k){if(c(k),j=g(k[0]),k.addClass("has-error "+(j.length>0||i===!1?"":"has-feedback")),h(j.length>0?j:m(d),l),i){var n='<span class="glyphicon glyphicon-remove form-control-feedback"></span>';j.length>0&&(n=n.replace("form-",""),n='<span class="input-group-addon control-feedback">'+n+"</span"),h(m(d),b.element(n))}}else a.error("Angular-auto-validate: invalid bs3 form structure elements must be wrapped by a form-group class")},m=function(a){var b=a,c=a[0].type?a[0].type.toLowerCase():"";return"checkbox"!==c&&"radio"!==c||"label"!==a.parent()[0].nodeName.toLowerCase()||(b=a.parent()),b},n=function(b){var d=f(b);d?c(d):a.error("Angular-auto-validate: invalid bs3 form structure elements must be wrapped by a form-group class")};return{makeValid:k,makeInvalid:l,makeDefault:n,enableValidationStateIcons:j,key:"bs3"}}function e(a){var c=function(c,d,e){d=b.isUndefined(d)?0:d,e=b.isUndefined(e)?!0:e;var f=0;return function(){var b=this,g=arguments;f+=1;var h=function(a){return function(){return a===f?c.apply(b,g):void 0}}(f);return a(h,d,e)}};return{debounce:c}}function f(a,c){var d,e="default",f="js/angular-auto-validate/dist/lang",g=function(a){return d=c.get("{0}/jcs-auto-validate_{1}.json".format(f,a.toLowerCase()))},h=function(a){f=a},i=function(c,f){var h=a.defer();return f=f||g,e=c.toLowerCase(),void 0===b.autoValidate.errorMessages[e]?(d=f(c),d.then(function(a){d=void 0,b.autoValidate.errorMessages[e]=a.data,h.resolve(b.autoValidate.errorMessages[e])},function(a){b.autoValidate.errorMessages[e]={defaultMsg:"Loading culture failed!"},d=null,h.reject(a)})):h.resolve(b.autoValidate.errorMessages[e]),h.promise},j=function(c){var f=a.defer();return c=void 0===c?e:c.toLowerCase(),void 0!==d?d.then(function(){f.resolve(b.autoValidate.errorMessages[c])},function(a){f.reject(a)}):f.resolve(b.autoValidate.errorMessages[c]),f.promise},k=function(a,b){var c;return b&&(a+="-err-type",c=b.attr("ng-"+a),void 0===c&&(c=b.attr("data-ng-"+a)||b.attr(a)),c&&(c=c.replace(/[\W]/g,""))),c},l=function(c,f){var g,h,i,j=a.defer(),m=[];if(void 0!==d)d.then(function(){l(c,f).then(function(a){j.resolve(a)})});else{if(g=b.autoValidate.errorMessages[e][c],i=k(c,f),i&&(g=b.autoValidate.errorMessages[e][i]),void 0===g&&void 0!==i?g=b.autoValidate.errorMessages[e].defaultMsg.format(i):void 0===g&&(g=b.autoValidate.errorMessages[e].defaultMsg.format(c)),f&&f.attr)try{h=f.attr("ng-"+c),void 0===h&&(h=f.attr("data-ng-"+c)||f.attr(c)),m.push(h||""),g=g.format(m)}catch(n){}j.resolve(g)}return j.promise};return{setI18nFileRootPath:h,setCulture:i,getErrorMessages:j,resolve:l}}function g(){var a=function(a,c){b.forEach(a.find("small"),function(a){b.element(a).hasClass("error")&&b.element(a).remove()}),c.removeClass("error")},c=function(a){for(var b=a,c=0;3>=c&&(void 0===b||!b.hasClass("columns")&&!b.hasClass("column"));c+=1)void 0!==b&&(b=b.parent());return b},d=function(b){var d=c(b);a(d&&d.length>0?d:b,b)},e=function(d,e){var f,g=c(d);a(g||d,d),d.addClass("error"),g&&(f=b.element('<small class="error">'+e+"</small>"),g.append(f))},f=function(a){d(a)};return{makeValid:d,makeInvalid:e,makeDefault:f,key:"foundation5"}}function h(){var a=function(a){return a[0].offsetWidth>0&&a[0].offsetHeight>0};return{isElementVisible:a}}function i(a,c){var d=["input","textarea","select","form"],e=function(a){return c.isElementVisible(a)},f=function(c){var d,e=b.element(c).controller("form");return d=void 0!==e&&null!==e?e.autoValidateFormOptions:a.defaultFormValidationOptions},g=function(a,b,c){var f,g,h,i=a&&a.length>0,j=i&&"#comment"===a[0].nodeName.toLowerCase();return i&&j===!1&&(f=e(a)||b.validateNonVisibleControls,g=d.indexOf(a[0].nodeName.toLowerCase())>-1||a[0].hasAttribute("register-custom-form-control"),h=b.validateOnFormSubmit===!1||b.validateOnFormSubmit===!0&&c===!0),i&&!j&&f&&g&&h},h=function(c,d,e){var h,i=!0,j=e||f(d),k=c.$pristine===!1||j.forceValidation,l=function(a){var c,d=!0;return b.forEach(a,function(a,b){d&&a&&(d=!1,c=b)}),c};return j.disabled===!1&&(j.forceValidation||g(d,j,j.getFormController().$submitted)&&c&&k)&&(i=!c.$invalid,j.removeExternalValidationErrorsOnSubmit&&c.removeAllExternalValidation&&c.removeAllExternalValidation(),i?a.makeValid(d):(h=l(c.$errors||c.$error),void 0===h?i=!0:a.getErrorMessage(h,d).then(function(b){a.makeInvalid(d,b)}))),i},i=function(b){a.makeDefault(b)},j=function(a){b.forEach(a[0].all||a[0].elements||a[0],function(a){var c,d=b.element(a);c=d.controller("ngModel"),void 0!==c&&("form"===d[0].nodeName.toLowerCase()?j(d):c.$setPristine())})},k=function(a){var c,d=!0,e=a?b.element(a).controller("form"):void 0,i=function(a,c,i){var j,l,m,n;if(a=b.element(a),j=a.controller("ngModel"),void 0!==j&&(c||g(a,i,e.$submitted)))if("form"===a[0].nodeName.toLowerCase())k(a);else{m=f(a),n=m.forceValidation,m.forceValidation=c;try{l=h(j,a,m),d=d&&l}finally{m.forceValidation=n}}};return void 0===a||void 0!==e&&e.autoValidateFormOptions.disabled?void 0!==a:(c=b.copy(e.autoValidateFormOptions),c.forceValidation=!0,b.forEach(a[0].elements||a[0].all||a[0],function(a){i(a,!0,c)}),a[0].customHTMLFormControlsCollection&&b.forEach(a[0].customHTMLFormControlsCollection,function(a){i(a,!0,c)}),d)},l=function(b,c,d){c?a.getErrorMessage(c,b).then(function(c){a.makeInvalid(b,c)}):a.makeInvalid(b,d)};return{setElementValidationError:l,validateElement:h,validateForm:k,resetElement:i,resetForm:j}}function j(a,b){return void 0!==a&&null!==a||void 0===b?"false"!==a:b}function k(a,c,d){var e=a.autoValidateFormOptions=a.autoValidateFormOptions||b.copy(c.defaultFormValidationOptions);e.getFormController=function(){return a},e.forceValidation=!1,e.disabled=!c.isEnabled()||j(d.disableDynamicValidation,e.disabled),e.validateNonVisibleControls=j(d.validateNonVisibleControls,e.validateNonVisibleControls),e.validateOnFormSubmit=j(d.validateOnFormSubmit,e.validateOnFormSubmit),e.removeExternalValidationErrorsOnSubmit=void 0===d.removeExternalValidationErrorsOnSubmit?e.removeExternalValidationErrorsOnSubmit:j(d.removeExternalValidationErrorsOnSubmit,e.removeExternalValidationErrorsOnSubmit),c.isEnabled()===!1&&"false"===d.disableDynamicValidation&&(e.disabled=!1)}function l(a){return{restrict:"E",link:function(b,c){function d(){a.resetForm(c),e.$setPristine&&e.$setPristine(),e.$setUntouched&&e.$setUntouched()}var e=c.controller("form");void 0!==e&&e.autoValidateFormOptions&&e.autoValidateFormOptions.disabled===!1&&(c.on("reset",d),b.$on("$destroy",function(){c.off("reset",d)}))}}}function m(){var a=function(a){for(var c=a,d=0;50>=d&&(void 0===c||"form"!==c.nodeName.toLowerCase());d+=1)void 0!==c&&(c=b.element(c).parent()[0]);return c};return{restrict:"A",link:function(b,c){var d=a(c.parent()[0]);d&&(d.customHTMLFormControlsCollection=d.customHTMLFormControlsCollection||[],d.customHTMLFormControlsCollection.push(c[0]))}}}function n(a,b,c){return a[0].compile=function(a,d){var e=b(d.ngSubmit),f="true"===d.ngSubmitForce;return function(a,b){function d(d){a.$apply(function(){void 0!==i&&null!==i&&i.autoValidateFormOptions&&i.autoValidateFormOptions.disabled===!0?e(a,{$event:d}):(void 0===i.$setSubmitted&&(i.$submitted=!0),(c.validateForm(b)||f===!0)&&e(a,{$event:d}))})}function g(){b[0].reset?b[0].reset():c.resetForm(b)}var h,i=b.controller("form");i&&i.autoValidateFormOptions&&(i.autoValidateFormOptions.resetForm=g,void 0!==i.$name&&""!==i.$name&&(h=a.$on("form:"+i.$name+":reset",g))),b.on("submit",d),a.$on("$destroy",function(){b.off("submit",d),h&&h()})}},a}function o(a){a.decorator("ngSubmitDirective",n)}function p(a,b,c,d){a.setErrorMessageResolver(b.resolve),a.registerDomModifier(c.key,c),a.registerDomModifier(d.key,d),a.setDefaultElementModifier(c.key)}b.module("jcs-autoValidate",[]),b.module("jcs-autoValidate").provider("validator",c),d.$inject=["$log"],b.module("jcs-autoValidate").factory("bootstrap3ElementModifier",d),e.$inject=["$timeout"],b.module("jcs-autoValidate").factory("jcs-debounce",e),"format"in a.prototype||(a.prototype.format=function(){var a=arguments;return this.replace(/{(\d+)}/g,function(b,c){return void 0!==typeof a[c]?a[c]:b})}),b.autoValidate=b.autoValidate||{errorMessages:{}},b.autoValidate.errorMessages["default"]={defaultMsg:"Please add error message for {0}",email:"Please enter a valid email address",minlength:"Please enter at least {0} characters",maxlength:"You have entered more than the maximum {0} characters",min:"Please enter the minimum number of {0}",max:"Please enter the maximum number of {0}",required:"This field is required",date:"Please enter a valid date",pattern:"Please ensure the entered information adheres to this pattern {0}",number:"Please enter a valid number",url:"Please enter a valid URL in the format of http(s)://www.google.com"},f.$inject=["$q","$http"],b.module("jcs-autoValidate").factory("defaultErrorMessageResolver",f),b.module("jcs-autoValidate").factory("foundation5ElementModifier",g),i.$inject=["validator","jcs-elementUtils"],b.module("jcs-autoValidate").factory("jcs-elementUtils",h),b.module("jcs-autoValidate").factory("validationManager",i),b.module("jcs-autoValidate").directive("form",["validator",function(a){return{restrict:"E",require:"form",priority:9999,compile:function(){return{pre:function(b,c,d,e){k(e,a,d)}}}}}]),b.module("jcs-autoValidate").directive("ngForm",["validator",function(a){return{restrict:"EA",require:"form",priority:9999,compile:function(){return{pre:function(b,c,d,e){k(e,a,d)}}}}}]),l.$inject=["validationManager"],b.module("jcs-autoValidate").directive("form",l),b.module("jcs-autoValidate").directive("registerCustomFormControl",m),n.$inject=["$delegate","$parse","validationManager"],o.$inject=["$provide"],b.module("jcs-autoValidate").config(o),b.module("jcs-autoValidate").config(["$provide",function(a){a.decorator("ngModelDirective",["$timeout","$delegate","validationManager","jcs-debounce",function(a,c,d,e){var f=c[0],g=f.link||f.compile;return f.compile=function(a){var c=b.version.major>=1&&b.version.minor>=3,f=g;return c&&b.isFunction(g)&&(f=g(a)),{pre:function(a,g,h,i){var j=i[0],k=i[1],l=void 0===h.ngModelOptions?void 0:a.$eval(h.ngModelOptions),m=j.$setValidity,n=j.$setPristine,o=e.debounce(function(){var a=void 0!==k&&null!==k?k.autoValidateFormOptions:void 0;d.validateElement(j,g,a)},100);return void 0===h.formnovalidate&&void 0!==k&&null!==k&&k.autoValidateFormOptions&&k.autoValidateFormOptions.disabled===!1&&(c&&void 0!==l&&void 0!==l.updateOn&&""!==l.updateOn?(g.on(l.updateOn,function(){o()}),a.$on("$destroy",function(){g.off(l.updateOn)})):j.$setValidity=function(a,b){m.call(j,a,b),o()},j.$setPristine=function(){n.call(j),d.resetElement(g)},j.autoValidated=!0),j.setExternalValidation=function(a,b,c){if(c){var e=j.$error||j.$errors;e[a]=!1}j.externalErrors=j.externalErrors||{},j.externalErrors[a]=!1,d.setElementValidationError(g,a,b)},j.removeExternalValidation=function(a,b){if(b){var c=j.$error||j.$errors;delete c[a]}j.externalErrors&&delete j.externalErrors[a],d.resetElement(g)},j.removeAllExternalValidation=function(){if(j.externalErrors){var a=j.$error||j.$errors;b.forEach(j.externalErrors,function(b,c){delete a[c]}),j.externalErrors={},d.resetElement(g)}},k&&(k.setExternalValidation=function(a,b,c,d){var e=!1;return k[a]&&(k[a].setExternalValidation(b,c,d),e=!0),e},k.removeExternalValidation=function(a,b,c,d){var e=!1;return k[a]&&(k[a].removeExternalValidation(b,d),e=!0),e}),f.pre?f.pre.apply(this,arguments):this},post:function(a,b,c,d){return f.post?f.post.apply(this,arguments):f.apply(this,arguments)}}},c}])}]),p.$inject=["validator","defaultErrorMessageResolver","bootstrap3ElementModifier","foundation5ElementModifier"],b.module("jcs-autoValidate").run(p)}(String,angular);
{
"defaultMsg": "Bitte eine Fehlermeldung für {0} hinzufügen.",
"email": "Bitte eine gültige EMail-Adresse eingeben.",
"email": "Bitte eine gültige E-Mail-Adresse eingeben.",
"minlength": "Bitte mindestens {0} Zeichen eingeben.",

@@ -8,3 +8,3 @@ "maxlength": "Es wurden mehr Zeichen als zulässig eingegeben (maximal {0}).",

"max": "Bitte eine Zahl von maximal {0} eingeben.",
"required": "Hier wird eine Eigabe erwartet.",
"required": "Dieses Feld bitte ausfüllen.",
"date": "Bitte ein gültiges Datum eingeben.",

@@ -14,2 +14,2 @@ "pattern": "Die Eingabe sollte diesem Muster entsprechen: {0}",

"url": "Bitte eine gültige URL in diesem Format eingeben: http(s)://www.google.com"
}
}
{
"name": "angular-auto-validate",
"version": "1.18.14",
"version": "1.19.0",
"description": "An automatic validation module for AngularJS which gets rid of excess html in favour of dynamic element modification to notify the user of validation errors",

@@ -5,0 +5,0 @@ "main": "angular-auto-validate.min.js",

@@ -37,3 +37,3 @@ angular.module('jcs-autoValidate').config(['$provide',

frmCtrl.autoValidateFormOptions.disabled === false)) {
if (supportsNgModelOptions || ngModelOptions === undefined || ngModelOptions.updateOn === undefined || ngModelOptions.updateOn === '') {
if (!supportsNgModelOptions || ngModelOptions === undefined || ngModelOptions.updateOn === undefined || ngModelOptions.updateOn === '') {
ngModelCtrl.$setValidity = function (validationErrorKey, isValid) {

@@ -40,0 +40,0 @@ setValidity.call(ngModelCtrl, validationErrorKey, isValid);

@@ -11,3 +11,7 @@ function parseBooleanAttributeValue(val, defaultValue) {

var opts = ctrl.autoValidateFormOptions = ctrl.autoValidateFormOptions || angular.copy(validator.defaultFormValidationOptions);
opts.formController = ctrl;
// needed to stop circular ref in json serialisation
opts.getFormController = function () {
return ctrl;
};
opts.forceValidation = false;

@@ -14,0 +18,0 @@ opts.disabled = !validator.isEnabled() || parseBooleanAttributeValue(attrs.disableDynamicValidation, opts.disabled);

{
"defaultMsg": "Bitte eine Fehlermeldung für {0} hinzufügen.",
"email": "Bitte eine gültige EMail-Adresse eingeben.",
"email": "Bitte eine gültige E-Mail-Adresse eingeben.",
"minlength": "Bitte mindestens {0} Zeichen eingeben.",

@@ -8,3 +8,3 @@ "maxlength": "Es wurden mehr Zeichen als zulässig eingegeben (maximal {0}).",

"max": "Bitte eine Zahl von maximal {0} eingeben.",
"required": "Hier wird eine Eigabe erwartet.",
"required": "Dieses Feld bitte ausfüllen.",
"date": "Bitte ein gültiges Datum eingeben.",

@@ -14,2 +14,2 @@ "pattern": "Die Eingabe sollte diesem Muster entsprechen: {0}",

"url": "Bitte eine gültige URL in diesem Format eingeben: http(s)://www.google.com"
}
}

@@ -47,2 +47,6 @@ function ValidatorFn() {

autoValidateEnabledOnControl = function (el) {
return !getBooleanAttributeValue(el, 'disable-auto-validate');
},
invalidElementStylingEnabled = function (el) {

@@ -249,6 +253,8 @@ return enableInvalidElementStyling && !getBooleanAttributeValue(el, 'disable-invalid-styling');

this.makeValid = function (el) {
if (validElementStylingEnabled(el)) {
this.getDomModifier(el).makeValid(el);
} else {
this.makeDefault(el);
if (autoValidateEnabledOnControl(el)) {
if (validElementStylingEnabled(el)) {
this.getDomModifier(el).makeValid(el);
} else {
this.makeDefault(el);
}
}

@@ -258,6 +264,8 @@ };

this.makeInvalid = function (el, errorMsg) {
if (invalidElementStylingEnabled(el)) {
this.getDomModifier(el).makeInvalid(el, errorMsg);
} else {
this.makeDefault(el);
if (autoValidateEnabledOnControl(el)) {
if (invalidElementStylingEnabled(el)) {
this.getDomModifier(el).makeInvalid(el, errorMsg);
} else {
this.makeDefault(el);
}
}

@@ -267,5 +275,7 @@ };

this.makeDefault = function (el) {
var dm = this.getDomModifier(el);
if (dm.makeDefault) {
dm.makeDefault(el);
if (autoValidateEnabledOnControl(el)) {
var dm = this.getDomModifier(el);
if (dm.makeDefault) {
dm.makeDefault(el);
}
}

@@ -272,0 +282,0 @@ };

@@ -98,3 +98,3 @@ function Bootstrap3ElementModifierFn($log) {

inputGroupEl = findInputGroupElement(frmGroupEl[0]);
frmGroupEl.addClass('has-success ' + (inputGroupEl.length > 0 ? '' : 'has-feedback'));
frmGroupEl.addClass('has-success ' + (inputGroupEl.length > 0 || addValidationStateIcons === false ? '' : 'has-feedback'));
if (addValidationStateIcons) {

@@ -134,4 +134,4 @@ var iconElText = '<span class="glyphicon glyphicon-ok form-control-feedback"></span>';

inputGroupEl = findInputGroupElement(frmGroupEl[0]);
frmGroupEl.addClass('has-error ' + (inputGroupEl.length > 0 ? '' : 'has-feedback'));
insertAfter(inputGroupEl.length > 0 ? inputGroupEl : el, helpTextEl);
frmGroupEl.addClass('has-error ' + (inputGroupEl.length > 0 || addValidationStateIcons === false ? '' : 'has-feedback'));
insertAfter(inputGroupEl.length > 0 ? inputGroupEl : getCorrectElementToPlaceErrorElementAfter(el), helpTextEl);
if (addValidationStateIcons) {

@@ -144,3 +144,3 @@ var iconElText = '<span class="glyphicon glyphicon-remove form-control-feedback"></span>';

insertAfter(el, angular.element(iconElText));
insertAfter(getCorrectElementToPlaceErrorElementAfter(el), angular.element(iconElText));
}

@@ -152,2 +152,13 @@ } else {

getCorrectElementToPlaceErrorElementAfter = function (el) {
var correctEl = el,
elType = el[0].type ? el[0].type.toLowerCase() : '';
if ((elType === 'checkbox' || elType === 'radio') && el.parent()[0].nodeName.toLowerCase() === 'label') {
correctEl = el.parent();
}
return correctEl;
},
/**

@@ -154,0 +165,0 @@ * @ngdoc function

@@ -17,3 +17,3 @@ /**

angular.autoValidate.errorMessages['en-us'] = angular.autoValidate.errorMessages['en-gb'] = {
angular.autoValidate.errorMessages['default'] = {
defaultMsg: 'Please add error message for {0}',

@@ -33,3 +33,3 @@ email: 'Please enter a valid email address',

function DefaultErrorMessageResolverFn($q, $http) {
var currentCulture = 'en-gb',
var currentCulture = 'default',

@@ -166,3 +166,5 @@ i18nFileRootPath = 'js/angular-auto-validate/dist/lang',

if (errMsg === undefined) {
if (errMsg === undefined && messageTypeOverride !== undefined) {
errMsg = angular.autoValidate.errorMessages[currentCulture].defaultMsg.format(messageTypeOverride);
} else if (errMsg === undefined) {
errMsg = angular.autoValidate.errorMessages[currentCulture].defaultMsg.format(errorType);

@@ -169,0 +171,0 @@ }

@@ -14,3 +14,3 @@ function Foundation5ElementModifierFn() {

for (var i = 0; i <= 3; i += 1) {
if (parent !== undefined && parent.hasClass('columns')) {
if (parent !== undefined && (parent.hasClass('columns') || parent.hasClass('column'))) {
break;

@@ -17,0 +17,0 @@ } else if (parent !== undefined) {

@@ -32,3 +32,3 @@ function ElementUtilsFn() {

/**
* Only validate if the element is present, it is visible
* Only validate if the element is present, it is visible, if it is not a comment,
* it is either a valid user input control (input, select, textare, form) or

@@ -42,2 +42,3 @@ * it is a custom control register by the developer.

var elementExists = el && el.length > 0,
isElementAComment = elementExists && el[0].nodeName.toLowerCase() === '#comment',
correctVisibilityToValidate,

@@ -47,3 +48,3 @@ correctTypeToValidate,

if (elementExists) {
if (elementExists && isElementAComment === false) {
correctVisibilityToValidate = elementIsVisible(el) || formOptions.validateNonVisibleControls;

@@ -56,3 +57,3 @@ correctTypeToValidate = elementTypesToValidate.indexOf(el[0].nodeName.toLowerCase()) > -1 ||

return elementExists && correctVisibilityToValidate && correctTypeToValidate && correctPhaseToValidate;
return elementExists && !isElementAComment && correctVisibilityToValidate && correctTypeToValidate && correctPhaseToValidate;

@@ -97,3 +98,3 @@ },

if ((frmOptions.forceValidation ||
(shouldValidateElement(el, frmOptions, frmOptions.formController.$submitted) &&
(shouldValidateElement(el, frmOptions, frmOptions.getFormController().$submitted) &&
modelCtrl &&

@@ -188,3 +189,3 @@ needsValidation))) {

// Firefox in the elements and chrome as a child iterator
angular.forEach((frmElement[0].all || frmElement[0].elements) || frmElement[0], function (ctrlElement) {
angular.forEach((frmElement[0].elements || frmElement[0].all) || frmElement[0], function (ctrlElement) {
processElement(ctrlElement, true, clonedOptions);

@@ -191,0 +192,0 @@ });

@@ -130,4 +130,10 @@ (function (document, angular, sinon) {

});
it('should be serializable', function () {
compileElement('<form name="test"><input ng-model="name" required /></form>');
expect(angular.toJson(element.controller('form'))).to.not.equal(undefined);
});
});
});
}(document, angular, sinon));

@@ -189,2 +189,7 @@ (function (angular, sinon) {

it('should not call makeValid on the dom modifier if the element has disable-auto-validate attribute', function () {
validator.makeValid(angular.element('<input type="text" disable-auto-validate="true"/>'));
expect(makeValidInvocationCount).to.equal(0);
});
it('should not call makeValid on the dom modifier if enableValidElementStyling is false', function () {

@@ -250,2 +255,7 @@ validator.setValidElementStyling(false);

it('should call makeInvalid on the dom modifier if the element has disabled invalid element styling', function () {
validator.makeInvalid(angular.element('<input type="text" disable-invalid-styling="false"/>'));
expect(makeInvalidInvocationCount).to.equal(1);
});
it('should call makeDefault on the dom modifier if the element has disabled invalid element styling', function () {

@@ -252,0 +262,0 @@ sandbox.stub(validator, 'makeDefault');

@@ -50,3 +50,3 @@ (function (angular, sinon) {

var element = angular.element('<div class="form-group has-success"><input type="text"/></div>');
bootstrap3ElementModifier.enableValidationStateIcons(true);
bootstrap3ElementModifier.makeInvalid(element);

@@ -78,2 +78,14 @@

});
it('should handle checkbox with a label correctly', function () {
var element = angular.element('<div class="form-group"><label>' +
'<input id="el5" type="checkbox" class="form-control" required="required" ng-model="model.hasEmail">Label Value</label></div>');
bootstrap3ElementModifier.enableValidationStateIcons(true);
bootstrap3ElementModifier.makeInvalid(element.find('#el5'));
$rootScope.$apply();
expect(element[0].outerHTML).to.equal('<div class="form-group has-error has-feedback"><label>' +
'<input id="el5" type="checkbox" class="form-control" required="required" ng-model="model.hasEmail">Label Value</label>' +
'<span class="glyphicon glyphicon-remove form-control-feedback"></span><span class="help-block has-error error-msg">undefined</span></div>');
});
});

@@ -84,2 +96,3 @@

var element = angular.element('<div class="form-group has-error"><input type="text"/></div>');
bootstrap3ElementModifier.enableValidationStateIcons(true);

@@ -103,12 +116,22 @@ bootstrap3ElementModifier.makeValid(element);

it('should remove the .error-msg element', function () {
it('should add the has-feedback class', function () {
var element = angular.element('<div class="form-group"><div class="col-sm-10">' +
'<input id="el2" type="email" class="form-control" required="required" ng-model="model.email"><span class="help-block error-msg">help text</span></div></div>');
'<input id="el3" type="email" class="form-control" required="required" ng-model="model.email"><span class="help-block error-msg">help text</span></div></div>');
bootstrap3ElementModifier.enableValidationStateIcons(true);
bootstrap3ElementModifier.makeValid(element.find('#el2'));
bootstrap3ElementModifier.makeValid(element.find('#el3'));
expect(element.find('.help-block').length).to.equal(0);
expect(element.hasClass('has-feedback')).to.equal(true);
});
it('should not add the has-feedback class', function () {
var element = angular.element('<div class="form-group"><div class="col-sm-10">' +
'<input id="el4" type="email" class="form-control" required="required" ng-model="model.email"><span class="help-block error-msg">help text</span></div></div>');
bootstrap3ElementModifier.enableValidationStateIcons(false);
bootstrap3ElementModifier.makeValid(element.find('#el4'));
expect(element.hasClass('has-feedback')).to.equal(false);
});
});

@@ -115,0 +138,0 @@ });

@@ -151,6 +151,9 @@ (function (angular, sinon) {

loadingFn = function () {
var defer = $q.defer();
loadingFnCalled = true;
defer.resolve({});
return defer.promise;
};
defaultErrorMessageResolver.setCulture('en-gb', loadingFn).then(function () {
defaultErrorMessageResolver.setCulture('default', loadingFn).then(function () {
expect(loadingFnCalled).to.equal(false);

@@ -157,0 +160,0 @@ done();

@@ -43,2 +43,9 @@ (function (angular, sinon) {

it('should remove the error class from the parent element with .column class', function () {
var element = angular.element('<div class="column error"><input type="text" /></div>');
foundation5ElementModifier.makeDefault(element);
expect(element.hasClass('error')).to.equal(false);
});
it('should remove the small.error element from the parent element with .columns class', function () {

@@ -45,0 +52,0 @@ var element = angular.element('<div class="columns error"><input type="text" /><small class="error">error text</small></div>');

@@ -22,2 +22,3 @@ (function (angular, sinon) {

getDefaultFormOptions = function () {
var internalFormController = {};
return {

@@ -28,3 +29,6 @@ forceValidation: false,

validateOnFormSubmit: false,
formController: {}
internalFormController: internalFormController,
getFormController: function () {
return internalFormController;
}
};

@@ -149,3 +153,3 @@ };

var formOptions = getDefaultFormOptions();
formOptions.formController.$submitted = false;
formOptions.internalFormController.$submitted = false;
formOptions.validateOnFormSubmit = true;

@@ -167,3 +171,3 @@

var formOptions = getDefaultFormOptions();
formOptions.formController.$submitted = true;
formOptions.internalFormController.$submitted = true;
formOptions.validateOnFormSubmit = true;

@@ -170,0 +174,0 @@

Sorry, the diff of this file is not supported yet