Socket
Socket
Sign inDemoInstall

angular-form-for

Package Overview
Dependencies
Maintainers
1
Versions
61
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

angular-form-for - npm Package Compare versions

Comparing version 1.4.2 to 1.4.3

templates/bootstrap/text-field/_input.html

2

bower.json
{
"name": "angular-form-for",
"version": "1.4.2",
"version": "1.4.3",
"main": [

@@ -5,0 +5,0 @@ "./dist/form-for.css",

@@ -9,2 +9,4 @@ angular.module("formFor.bootstrapTemplates", []).run(["$templateCache", function($templateCache) {$templateCache.put("form-for/templates/checkbox-field.html","<div class=\"field checkbox-field\"\n ng-class=\"{disabled: disable || model.disabled, \'has-error\': model.error}\">\n\n <field-error error=\"model.error\"\n left-aligned=\"true\"\n uid=\"{{model.uid}}-error\">\n </field-error>\n\n <input aria-manager\n id=\"{{model.uid}}\"\n type=\"checkbox\"\n tabindex=\"{{tabIndex}}\"\n ng-model=\"model.bindable\"\n ng-disabled=\"disable || model.disabled\">\n\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n uid=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n help=\"{{help}}\">\n </field-label>\n</div>\n");

$templateCache.put("form-for/templates/submit-button.html","<button ng-class=\"buttonClass || \'btn btn-default\'\"\n ng-disabled=\"disable || model.disabled\"\n tabindex=\"{{tabIndex}}\">\n\n <i ng-if=\"icon\" ng-class=\"icon\"></i>\n\n <span ng-bind-html=\"bindableLabel\"></span>\n</button>\n");
$templateCache.put("form-for/templates/text-field.html","<div class=\"form-group\"\n ng-class=\"{disabled: disable || model.disabled, \'has-error\': model.error}\">\n\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n iud=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n help=\"{{help}}\"\n required=\"{{model.required}}\">\n </field-label>\n\n <field-error error=\"model.error\"\n uid=\"{{model.uid}}-error\">\n </field-error>\n\n <div ng-class=\"{\'input-group\': iconBefore || iconAfter}\">\n <span ng-if=\"iconBefore\" class=\"input-group-addon\"\n ng-click=\"onIconBeforeClick()\">\n <i class=\"text-field-icon\" ng-class=\"iconBefore\"></i>\n </span>\n\n <input aria-manager\n\n ng-if=\"!multiline\"\n id=\"{{model.uid}}\"\n class=\"form-control\"\n ng-disabled=\"disable || model.disabled\"\n\n type=\"{{type}}\"\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n ng-model=\"model.bindable\"\n form-for-debounce=\"{{debounce}}\"\n ng-click=\"onFocus()\" />\n\n <textarea aria-manager\n\n ng-if=\"multiline\"\n id=\"{{model.uid}}\"\n class=\"form-control\"\n ng-disabled=\"disable || model.disabled\"\n\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n ng-model=\"model.bindable\"\n form-for-debounce=\"{{debounce}}\"\n ng-click=\"onFocus()\">\n </textarea>\n\n <span ng-if=\"iconAfter\" class=\"input-group-addon\"\n ng-click=\"onIconAfterClick()\">\n <i class=\"text-field-icon\" ng-class=\"iconAfter\"></i>\n </span>\n </div>\n</div>\n");}]);
$templateCache.put("form-for/templates/text-field.html","<div class=\"form-group\"\n ng-class=\"{disabled: disable || model.disabled, \'has-error\': model.error}\">\n\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n iud=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n help=\"{{help}}\"\n required=\"{{model.required}}\">\n </field-label>\n\n <field-error error=\"model.error\"\n uid=\"{{model.uid}}-error\">\n </field-error>\n\n <div ng-class=\"{\'input-group\': iconBefore || iconAfter}\">\n <span ng-if=\"iconBefore\" class=\"input-group-addon\"\n ng-click=\"onIconBeforeClick()\">\n <i class=\"text-field-icon\" ng-class=\"iconBefore\"></i>\n </span>\n\n <span ng-if=\"!multiline\" ng-include src=\"\'form-for/templates/text-field/_input.html\'\"></span>\n\n <span ng-if=\"multiline\" ng-include src=\"\'form-for/templates/text-field/_textarea.html\'\"></span>\n\n <span ng-if=\"iconAfter\" class=\"input-group-addon\"\n ng-click=\"onIconAfterClick()\">\n <i class=\"text-field-icon\" ng-class=\"iconAfter\"></i>\n </span>\n </div>\n</div>\n");
$templateCache.put("form-for/templates/text-field/_input.html","<input aria-manager\n\n id=\"{{model.uid}}\"\n class=\"form-control\"\n ng-disabled=\"disable || model.disabled\"\n\n type=\"{{type}}\"\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n ng-model=\"model.bindable\"\n form-for-debounce=\"{{debounce}}\"\n ng-click=\"onFocus()\" />\n");
$templateCache.put("form-for/templates/text-field/_textarea.html","<textarea aria-manager\n\n id=\"{{model.uid}}\"\n class=\"form-control\"\n ng-disabled=\"disable || model.disabled\"\n\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n ng-model=\"model.bindable\"\n form-for-debounce=\"{{debounce}}\"\n ng-click=\"onFocus()\">\n</textarea>\n");}]);

@@ -9,2 +9,4 @@ angular.module("formFor.defaultTemplates", []).run(["$templateCache", function($templateCache) {$templateCache.put("form-for/templates/checkbox-field.html","<div class=\"field checkbox-field\"\n ng-class=\"{disabled: disable || model.disabled, \'has-error\': model.error}\">\n\n <field-error error=\"model.error\"\n left-aligned=\"true\"\n uid=\"{{model.uid}}-error\">\n </field-error>\n\n <input aria-manager\n id=\"{{model.uid}}\"\n type=\"checkbox\"\n class=\"field-input\"\n tabindex=\"{{tabIndex}}\"\n ng-model=\"model.bindable\"\n ng-disabled=\"disable || model.disabled\">\n\n <span class=\"checkbox-field-input\" ng-class=\"{\'is-checked\': model.bindable}\"></span>\n\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n uid=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n help=\"{{help}}\">\n </field-label>\n</div>\n");

$templateCache.put("form-for/templates/submit-button.html","<button class=\"submit-button\" ng-class=\"buttonClass\"\n ng-disabled=\"disable || model.disabled\"\n role=\"button\"\n tabindex=\"{{tabIndex}}\">\n\n <i ng-if=\"icon\" class=\"submit-button-icon\" ng-class=\"icon\"></i>\n\n <span ng-bind-html=\"bindableLabel\"></span>\n</button>\n");
$templateCache.put("form-for/templates/text-field.html","<div class=\"field text-field\"\n ng-class=\"{disabled: disable || model.disabled, \'has-error\': model.error}\">\n\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n iud=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n help=\"{{help}}\"\n required=\"{{model.required}}\">\n </field-label>\n\n <field-error error=\"model.error\"\n uid=\"{{model.uid}}-error\">\n </field-error>\n\n <div ng-class=\"{\'text-field-input-wrapper\': iconBefore || iconAfter}\">\n <span ng-if=\"iconBefore\" class=\"text-field-input-icon text-field-input-icon-before\"\n ng-click=\"onIconBeforeClick()\">\n <i class=\"text-field-icon\" ng-class=\"iconBefore\"></i>\n </span>\n\n <input aria-manager\n\n ng-if=\"!multiline\"\n id=\"{{model.uid}}\"\n class=\"text-field-input\"\n ng-class=\"{\'has-icon-before\': iconBefore, \'has-icon-after\': iconAfter}\"\n ng-disabled=\"disable || model.disabled\"\n\n type=\"{{type}}\"\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n ng-model=\"model.bindable\"\n form-for-debounce=\"{{debounce}}\"\n ng-click=\"onFocus()\" />\n\n <textarea aria-manager\n\n ng-if=\"multiline\"\n id=\"{{model.uid}}\"\n class=\"text-field-input\"\n ng-class=\"{\'has-icon-before\': iconBefore, \'has-icon-after\': iconAfter}\"\n ng-disabled=\"disable || model.disabled\"\n\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n ng-model=\"model.bindable\"\n form-for-debounce=\"{{debounce}}\"\n ng-click=\"onFocus()\">\n </textarea>\n\n <span ng-if=\"iconAfter\" class=\"text-field-input-icon text-field-input-icon-after\"\n ng-click=\"onIconAfterClick()\">\n <i class=\"text-field-icon\" ng-class=\"iconAfter\"></i>\n </span>\n </div>\n</div>\n");}]);
$templateCache.put("form-for/templates/text-field.html","<div class=\"field text-field\"\n ng-class=\"{disabled: disable || model.disabled, \'has-error\': model.error}\">\n\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n iud=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n help=\"{{help}}\"\n required=\"{{model.required}}\">\n </field-label>\n\n <field-error error=\"model.error\"\n uid=\"{{model.uid}}-error\">\n </field-error>\n\n <div ng-class=\"{\'text-field-input-wrapper\': iconBefore || iconAfter}\">\n <span ng-if=\"iconBefore\" class=\"text-field-input-icon text-field-input-icon-before\"\n ng-click=\"onIconBeforeClick()\">\n <i class=\"text-field-icon\" ng-class=\"iconBefore\"></i>\n </span>\n\n <span ng-if=\"!multiline\" ng-include src=\"\'form-for/templates/text-field/_input.html\'\"></span>\n\n <span ng-if=\"multiline\" ng-include src=\"\'form-for/templates/text-field/_textarea.html\'\"></span>\n\n <span ng-if=\"iconAfter\" class=\"text-field-input-icon text-field-input-icon-after\"\n ng-click=\"onIconAfterClick()\">\n <i class=\"text-field-icon\" ng-class=\"iconAfter\"></i>\n </span>\n </div>\n</div>\n");
$templateCache.put("form-for/templates/text-field/_input.html","<input aria-manager\n\n id=\"{{model.uid}}\"\n class=\"text-field-input\"\n ng-class=\"{\'has-icon-before\': iconBefore, \'has-icon-after\': iconAfter}\"\n ng-disabled=\"disable || model.disabled\"\n\n type=\"{{type}}\"\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n ng-model=\"model.bindable\"\n form-for-debounce=\"{{debounce}}\"\n ng-click=\"onFocus()\" />\n");
$templateCache.put("form-for/templates/text-field/_textarea.html","<textarea aria-manager\n\n id=\"{{model.uid}}\"\n class=\"text-field-input\"\n ng-class=\"{\'has-icon-before\': iconBefore, \'has-icon-after\': iconAfter}\"\n ng-disabled=\"disable || model.disabled\"\n\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n ng-model=\"model.bindable\"\n form-for-debounce=\"{{debounce}}\"\n ng-click=\"onFocus()\">\n</textarea>\n");}]);

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

angular.module("formFor",[]),angular.module("formFor").directive("ariaManager",function(){return{restrict:"A",link:function(e,t,r){e.$watch("model.uid",function(e){r.$set("ariaDescribedby",e+"-error"),r.$set("ariaLabelledby",e+"-label")}),e.$watch("model.error",function(e){r.$set("ariaInvalid",!!e)})}}}),angular.module("formFor").directive("checkboxField",["$log","FieldHelper",function(e,t){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/checkbox-field.html",scope:{attribute:"@",disable:"=",help:"@?"},link:function(r,i,o,a){if(!r.attribute)return void e.error('Missing required field "attribute"');r.tabIndex=o.tabIndex||0;i.find("input");r.toggle=function(){r.disable||r.model.disabled||(r.model.bindable=!r.model.bindable)},t.manageLabel(r,o),t.manageFieldRegistration(r,a)}}}]),angular.module("formFor").directive("collectionLabel",["$sce","FormForConfiguration",function(e){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/collection-label.html",scope:{attribute:"@",help:"@?",label:"@"},link:function(t,r,i,o){t.$watch("label",function(r){t.bindableLabel=e.trustAsHtml(r)}),t.model=o.registerCollectionLabel(t.attribute)}}}]),angular.module("formFor").directive("fieldError",["$sce","FormForConfiguration",function(){return{restrict:"EA",templateUrl:"form-for/templates/field-error.html",scope:{error:"=",leftAligned:"@?",uid:"@"}}}]),angular.module("formFor").directive("fieldLabel",["$sce","FormForConfiguration",function(e,t){return{restrict:"EA",templateUrl:"form-for/templates/field-label.html",scope:{inputUid:"@",help:"@?",label:"@",required:"@?",uid:"@"},controller:["$scope",function(r){r.$watch("label",function(t){r.bindableLabel=e.trustAsHtml(t)}),r.$watch("required",function(e){r.requiredLabel=r.$eval(e)?t.requiredLabel:null})}]}}]),angular.module("formFor").directive("formForDebounce",["$log","$sniffer","$timeout","FormForConfiguration",function(e,t,r,i){return{restrict:"A",require:"ngModel",priority:99,link:function(o,a,n,l){if("radio"===n.type||"checkbox"===n.type)return void e.warn("formForDebounce should only be used with <input type=text> and <textarea> elements");var u,s=n.formForDebounce,d=i.defaultDebounceDuration;if(void 0!==s&&("false"===s.toString()?d=!1:(s=parseInt(s),angular.isNumber(s)&&!isNaN(s)&&(d=s))),t.hasEvent("input")?a.off("input"):(a.off("keydown"),t.hasEvent("paste")&&a.off("paste")),d!==!1){var c=function(){r.cancel(u),u=r(function(){o.$apply(function(){l.$setViewValue(a.val())})},d)};t.hasEvent("input")?a.on("input",c):(a.on("keydown",c),t.hasEvent("paste")&&a.on("paste",c))}a.on("blur",function(){o.$apply(function(){l.$setViewValue(a.val())})}),o.$on("$destroy",function(){u&&r.cancel(u)})}}}]),angular.module("formFor").directive("formFor",["$injector","$log","$parse","$q","$sce","FormForConfiguration","$FormForStateHelper","$FormForGUID","NestedObjectHelper","ModelValidator",function(e,t,r,i,o,a,n,l,u,s){return{require:"form",restrict:"A",scope:{controller:"=?",disable:"=?",formFor:"=",service:"@",submitComplete:"&?",submitError:"&?",submitWith:"&?",valid:"=?",validationFailed:"&?",validationRules:"=?"},controller:["$scope",function(a){a.formFor||t.error('The form data object specified by <form form-for=""> is null or undefined.'),a.fields={},a.collectionLabels={},a.buttons=[],a.service&&(a.$service=e.get(a.service)),a.$validationRules=a.$service?a.$service.validationRules:a.validationRules;var d=this;d.registerFormField=function(e){if(!e)throw Error('Invalid field name "'+e+'" provided.');var t=u.flattenAttribute(e);if(a.fields.hasOwnProperty(t))throw Error('Field "'+e+'" has already eben registered. Field names must be unique.');var i=(u.readAttribute(a.$validationRules,e),{bindableWrapper:{bindable:null,disabled:a.disable,error:null,pristine:!0,required:s.isFieldRequired(e,a.$validationRules),uid:l.create()},fieldName:e,unwatchers:[],validationAttribute:e.split("[")[0]});a.fields[t]=i;var o=r(e),n=o.assign;i.unwatchers.push(a.$watch("fields."+t+".bindableWrapper.bindable",function(e,t){e!==t&&n(a.formFor,e)}));var c;return i.unwatchers.push(a.$watch("formFor."+e,function(r,o){(r!==i.bindableWrapper.bindable||void 0===o&&""===r||void 0===r)&&(c=!1),i.bindableWrapper.bindable=r,d.validateField(e),c||(c=!0,a.formForStateHelper.setFieldHasBeenModified(t,!1)),i.bindableWrapper.pristine=!a.formForStateHelper.hasFieldBeenModified(t)})),i.bindableWrapper},this.unregisterFormField=function(e){var t=u.flattenAttribute(e);angular.forEach(a.fields[t].unwatchers,function(e){e()}),delete a.fields[t]},d.registerSubmitButton=function(){var e={disabled:!1};return a.buttons.push(e),e},d.registerCollectionLabel=function(e){var t=u.flattenAttribute(e),r={error:null,required:s.isCollectionRequired(e,a.$validationRules)};a.collectionLabels[t]=r;var i=!1;return a.$watch("formFor."+e+".length",function(){i?s.validateCollection(a.formFor,e,a.$validationRules).then(function(){a.formForStateHelper.setFieldError(t,null)},function(e){a.formForStateHelper.setFieldError(t,e)}):i=!0}),r},d.resetField=function(e){var t=u.flattenAttribute(e);a.formForStateHelper.getFieldError(t)&&(a.formForStateHelper.setFieldHasBeenModified(t,!1),a.fields[t].bindableWrapper.pristine=!0),a.formForStateHelper.setFieldError(t,null)},d.resetErrors=function(){for(var e in a.fields)a.formForStateHelper.getFieldError(e)&&(a.formForStateHelper.setFieldHasBeenModified(e,!1),a.fields[e].bindableWrapper.pristine=!0);a.formForStateHelper.setFormSubmitted(!1),a.formForStateHelper.resetFieldErrors()},d.resetFields=d.resetErrors,d.validateField=function(e){{var t=u.flattenAttribute(e);a.fields[t],r(e)(a.formFor)}a.formForStateHelper.setFieldHasBeenModified(t,!0),a.$validationRules&&s.validateField(a.formFor,e,a.$validationRules).then(function(){a.formForStateHelper.setFieldError(t,null)},function(e){a.formForStateHelper.setFieldError(t,e)})},d.validateForm=function(){a.updateCollectionErrors({}),a.updateFieldErrors({});var e,t;if(a.$validationRules){var r=[];angular.forEach(a.fields,function(e){r.push(e.fieldName)}),t=s.validateFields(a.formFor,r,a.$validationRules),t.then(angular.noop,a.updateFieldErrors),r=[],angular.forEach(a.collectionLabels,function(e,t){r.push(t)}),e=s.validateFields(a.formFor,r,a.$validationRules),e.then(angular.noop,a.updateCollectionErrors)}else e=i.resolve(),t=i.resolve();var o=i.defer();return i.waitForAll([e,t]).then(o.resolve,function(e){angular.isArray(e[0])&&0===e[0].length&&e.splice(0,1),o.reject(e)}),o.promise},a.controller=a.controller||{},angular.copy(d,a.controller),a.$watch("disable",function(e){angular.forEach(a.fields,function(t){t.bindableWrapper.disabled=e}),angular.forEach(a.buttons,function(t){t.disabled=e})}),a.formForStateHelper=new n(a),a.$watch("formForStateHelper.watchable",function(){var e=a.formForStateHelper.hasFormBeenSubmitted();angular.forEach(a.fields,function(t,r){if(e||a.formForStateHelper.hasFieldBeenModified(r)){var i=a.formForStateHelper.getFieldError(r);t.bindableWrapper.error=i?o.trustAsHtml(i):null}else t.bindableWrapper.error=null}),angular.forEach(a.collectionLabels,function(e,t){var r=a.formForStateHelper.getFieldError(t);e.error=r?o.trustAsHtml(r):null})}),a.updateCollectionErrors=function(e){angular.forEach(a.collectionLabels,function(t,r){var i=u.readAttribute(e,r);a.formForStateHelper.setFieldError(r,i)})},a.updateFieldErrors=function(e){angular.forEach(a.fields,function(t,r){var i=u.readAttribute(e,t.fieldName);a.formForStateHelper.setFieldError(r,i)})}}],link:function(e,t,r){t.on("submit",function(){return e.formForStateHelper.setFormSubmitted(!0),e.disable=!0,e.controller.validateForm().then(function(){var t;t=r.submitWith?e.submitWith({data:e.formFor}):e.$service&&e.$service.submit?e.$service.submit(e.formFor):i.reject("No submit function provided"),t||(t=i.reject("Submit function did not return a promise")),t.then(function(t){r.submitComplete?e.submitComplete({data:t}):a.defaultSubmitComplete(t)},function(t){angular.isObject(t)&&(e.updateCollectionErrors(t),e.updateFieldErrors(t)),r.submitError?e.submitError({error:t}):a.defaultSubmitError(t)}),t["finally"](function(){e.disable=!1})},function(){e.disable=!1,r.validationFailed?e.validationFailed():a.defaultValidationFailed()}),!1})}}}]),angular.module("formFor").directive("radioField",["$log","$FormForGUID","FieldHelper",function(e,t,r){var i={};return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/radio-field.html",scope:{attribute:"@",disable:"=",help:"@?",value:"@"},link:function(o,a,n,l){if(!o.attribute)return void e.error('Missing required field "attribute"');if(i[o.attribute])o.hideErrorMessage=!0;else{var u={defaultScope:o,scopes:[]};r.manageFieldRegistration(o,l),i[o.attribute]=u}o.uid=t.create();var s=i[o.attribute];s.scopes.push(o),r.manageLabel(o,n),o.tabIndex=n.tabIndex||0;a.find("input");o.click=function(){o.disable||o.model.disabled||(o.model.bindable=o.value)},s.defaultScope.$watch("model",function(e){o.model=e}),s.defaultScope.$watch("disable",function(e){o.disable=e}),s.defaultScope.$watch("model.disabled",function(e){o.model&&(o.model.disabled=e)}),o.$watch("model.bindable",function(e){o.checked=void 0!==e&&null!==e&&void 0!==o.value&&null!==o.value&&e.toString()===o.value.toString()}),o.$on("$destroy",function(){s.scopes.splice(s.scopes.indexOf(o),1),0===s.scopes.length&&delete i[o.attribute]})}}}]),angular.module("formFor").directive("selectField",["$document","$log","$timeout","$window","FieldHelper",function(e,t,r,i,o){var a=10;return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/select-field.html",scope:{attribute:"@",disable:"=",filter:"=?",filterDebounce:"@?",help:"@?",options:"="},link:function(n,l,u,s){if(i=angular.element(i),!n.attribute)return void t.error('Missing required field "attribute"');n.allowBlank=u.hasOwnProperty("allowBlank"),n.enableFiltering=u.hasOwnProperty("enableFiltering"),n.preventDefaultOption=u.hasOwnProperty("preventDefaultOption"),n.labelAttribute=u.labelAttribute||"label",n.valueAttribute=u.valueAttribute||"value",n.placeholder=u.placeholder||"Select",n.tabIndex=u.tabIndex||0,o.manageLabel(n,u),o.manageFieldRegistration(n,s);var d=function(e){var t=e[0];r(t.focus.bind(t))};n.close=function(){r(function(){n.isOpen=!1})},n.open=function(){n.disable||n.model.disabled||r(function(){n.isOpen=!0})},n.emptyOption={},n.emptyOption[n.labelAttribute]="",n.emptyOption[n.valueAttribute]=void 0,n.placeholderOption={},n.placeholderOption[n.labelAttribute]=n.placeholder,n.placeholderOption[n.valueAttribute]=void 0,n.filteredOptions=[];var c=function(e){return e&&e.toLowerCase()},f=function(){var e=n.options||[];if(n.filteredOptions.splice(0),n.enableFiltering&&n.filter){var t=c(n.filter);angular.forEach(e,function(e){var r=c(e[n.labelAttribute]).indexOf(t);r>=0&&n.filteredOptions.push(e)})}else angular.copy(e,n.filteredOptions);n.selectedOption?n.allowBlank&&n.filteredOptions.unshift(n.emptyOption):n.filteredOptions.unshift(n.placeholderOption)};n.$watch("filter",f),n.$watch("options.length",f);var m=function(){var e=n.selectedOption&&n.selectedOption[[n.valueAttribute]];return n.model.bindable===e?void(!n.allowBlank&&!n.preventDefaultOption&&n.options&&n.options.length&&(n.model.bindable=n.options[0][n.valueAttribute])):void 0};n.$watch("model.bindable",m),n.$watch("options.length",m),n.$watch("model.bindable",function(){var e;angular.forEach(n.options,function(t){t[n.valueAttribute]===n.model.bindable&&(e=t)}),n.selectedOption=e,n.selectedOptionLabel=e&&e[n.labelAttribute],n.filter=n.selectedOptionLabel});var p=function(e){e.ignoreFor!==n.model.uid&&n.close()};n.filterTextClick=function(){n.isOpen&&(event.ignoreFor=n.model.uid)};var b;n.$watch("isOpen",function(){b&&r.cancel(b),b=r(function(){b=null,n.isOpen?e.on("click",p):e.off("click",p)},a)}),n.$on("$destroy",function(){e.off("click",p)});{var F=l.find("input");l.find("select")}n.setFilterFocus=function(){d(F)},n.mouseOver=function(e){n.mouseOverIndex=e,n.mouseOverOption=e>=0?n.filteredOptions[e]:null},n.selectOption=function(e){n.model.bindable=e&&e[n.valueAttribute]},n.keyDown=function(e){switch(e.keyCode){case 27:n.close();break;case 13:n.isOpen?(n.selectOption(n.mouseOverOption),n.close()):n.open(),e.preventDefault();break;case 38:n.isOpen?n.mouseOver(n.mouseOverIndex>0?n.mouseOverIndex-1:n.filteredOptions.length-1):n.open();break;case 40:n.isOpen?n.mouseOver(n.mouseOverIndex<n.filteredOptions.length-1?n.mouseOverIndex+1:0):n.open();break;case 9:case 16:n.close();break;default:n.open()}},n.$watchCollection("[isOpen, filteredOptions.length]",function(){n.mouseOver(-1),n.isOpen&&n.enableFiltering&&d(F)})}}}]),angular.module("formFor").directive("submitButton",["$log","$sce",function(e,t){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/submit-button.html",scope:{disable:"=",icon:"@",label:"@"},link:function(e,r,i,o){e.buttonClass=i.buttonClass,e.tabIndex=i.tabIndex||0,e.$watch("label",function(r){e.bindableLabel=t.trustAsHtml(r)}),e.model=o.registerSubmitButton(e)}}}]),angular.module("formFor").directive("textField",["$log","$timeout","FieldHelper",function(e,t,r){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/text-field.html",scope:{attribute:"@",debounce:"@?",disable:"=",focused:"&?",help:"@?",iconAfterClicked:"&?",iconBeforeClicked:"&?",placeholder:"@?"},link:function(i,o,a,n){if(!i.attribute)return void e.error('Missing required field "attribute"');if(i.type=a.type||"text",i.multiline=a.hasOwnProperty("multiline")&&"false"!==a.multiline,i.tabIndex=a.tabIndex||0,a.hasOwnProperty("autofocus")&&t(function(){o.find(i.multiline?"textarea":"input")[0].focus()}),r.manageLabel(i,a),r.manageFieldRegistration(i,n),a.iconAfter){var l=function(){if(i.model){var e="{"===a.iconAfter.charAt(0)?i.$eval(a.iconAfter):a.iconAfter;i.iconAfter=angular.isObject(e)?i.model.error?e.invalid:i.model.pristine?e.pristine:e.valid:e}};a.$observe("iconAfter",l),i.$watch("model.error",l),i.$watch("model.pristine",l)}if(a.iconBefore){var u=function(){if(i.model){var e="{"===a.iconBefore.charAt(0)?i.$eval(a.iconBefore):a.iconBefore;i.iconBefore=angular.isObject(e)?i.model.error?e.invalid:i.model.pristine?e.pristine:e.valid:e}};a.$observe("iconBefore",u),i.$watch("model.error",u),i.$watch("model.pristine",u)}i.onIconAfterClick=function(){a.hasOwnProperty("iconAfterClicked")&&i.iconAfterClicked()},i.onIconBeforeClick=function(){a.hasOwnProperty("iconBeforeClicked")&&i.iconBeforeClicked()},i.onFocus=function(){a.hasOwnProperty("focused")&&i.focused()}}}}]),angular.module("formFor").service("FieldHelper",["FormForConfiguration","StringUtil",function(e,t){this.manageLabel=function(r,i){i.hasOwnProperty("label")&&i.$observe("label",function(e){r.label=e}),e.autoGenerateLabels&&(r.label=t.humanize(r.attribute))},this.manageFieldRegistration=function(e,t){e.$watch("attribute",function(r,i){e.model&&t.unregisterFormField(i),e.model=t.registerFormField(e.attribute)}),e.$on("$destroy",function(){t.unregisterFormField(e.attribute)})}}]),angular.module("formFor").service("FormForConfiguration",function(){return{autoGenerateLabels:!1,defaultDebounceDuration:500,defaultSubmitComplete:angular.noop,defaultSubmitError:angular.noop,defaultValidationFailed:angular.noop,requiredLabel:null,validationFailedForCustomMessage:"Failed custom validation",validationFailedForPatternMessage:"Invalid format",validationFailedForMaxCollectionSizeMessage:"Must be fewer than {{num}} items",validationFailedForMaxLengthMessage:"Must be fewer than {{num}} characters",validationFailedForMinCollectionSizeMessage:"Must at least {{num}} items",validationFailedForMinLengthMessage:"Must be at least {{num}} characters",validationFailedForRequiredMessage:"Required field",validationFailedForEmailTypeMessage:"Invalid email format",validationFailedForIntegerTypeMessage:"Must be an integer",validationFailedForNegativeTypeMessage:"Must be negative",validationFailedForNumericTypeMessage:"Must be numeric",validationFailedForPositiveTypeMessage:"Must be positive",disableAutoLabels:function(){this.autoGenerateLabels=!1},enableAutoLabels:function(){this.autoGenerateLabels=!0},setDefaultDebounceDuration:function(e){this.defaultDebounceDuration=e},setDefaultSubmitComplete:function(e){this.defaultSubmitComplete=e},setDefaultSubmitError:function(e){this.defaultSubmitError=e},setDefaultValidationFailed:function(e){this.defaultValidationFailed=e},setRequiredLabel:function(e){this.requiredLabel=e},setValidationFailedForCustomMessage:function(e){this.validationFailedForCustomMessage=e},setValidationFailedForMaxCollectionSizeMessage:function(e){this.validationFailedForMaxCollectionSizeMessage=e},setValidationFailedForMaxLengthMessage:function(e){this.validationFailedForMaxLengthMessage=e},setValidationFailedForMinCollectionSizeMessage:function(e){this.validationFailedForMaxCollectionSizeMessage=e},setValidationFailedForMinLengthMessage:function(e){this.validationFailedForMinLengthMessage=e},setValidationFailedForPatternMessage:function(e){this.validationFailedForPatternMessage=e},setValidationFailedForRequiredMessage:function(e){this.validationFailedForRequiredMessage=e},setValidationFailedForEmailTypeMessage:function(e){this.validationFailedForEmailTypeMessage=e},setValidationFailedForIntegerTypeMessage:function(e){this.validationFailedForIntegerTypeMessage=e},setValidationFailedForNegativeTypeMessage:function(e){this.validationFailedForNegativeTypeMessage=e},setValidationFailedForNumericTypeMessage:function(e){this.validationFailedForNumericTypeMessage=e},setValidationFailedForPositiveTypeMessage:function(e){this.validationFailedForPositiveTypeMessage=e}}}),angular.module("formFor").service("$FormForGUID",function(){return{create:function(){return("0000"+(Math.random()*Math.pow(36,4)<<0).toString(36)).slice(-4)}}}),angular.module("formFor").factory("$FormForStateHelper",["NestedObjectHelper",function(e){var t=function(e){e.errorMap=e.errorMap||{},e.valid=!0,this.formScope=e,this.fieldNameToModificationMap={},this.formSubmitted=!1,this.shallowErrorMap={},this.watchable=0};return t.prototype.getFieldError=function(t){return e.readAttribute(this.formScope.errorMap,t)},t.prototype.hasFieldBeenModified=function(t){return e.readAttribute(this.fieldNameToModificationMap,t)},t.prototype.hasFormBeenSubmitted=function(){return this.formSubmitted},t.prototype.isFieldValid=function(e){return!getFieldError(e)},t.prototype.isFormInvalid=function(){return!this.isFormValid()},t.prototype.isFormValid=function(){for(var e in this.shallowErrorMap)return!1;return!0},t.prototype.resetFieldErrors=function(){this.formScope.errorMap={}},t.prototype.setFieldError=function(t,r){var i=e.flattenAttribute(t);e.writeAttribute(this.formScope.errorMap,t,r),r?this.shallowErrorMap[i]=r:delete this.shallowErrorMap[i],this.formScope.valid=this.isFormValid(),this.watchable++},t.prototype.setFieldHasBeenModified=function(t,r){e.writeAttribute(this.fieldNameToModificationMap,t,r),this.watchable++},t.prototype.setFormSubmitted=function(e){this.formSubmitted=e,this.watchable++},t}]),angular.module("formFor").service("ModelValidator",["$interpolate","$q","FormForConfiguration","NestedObjectHelper",function(e,t,r,i){return this.$getRulesForFieldName=function(e,t){return t=t.replace(/\[[^\]]+\]/g,".collection.fields"),i.readAttribute(e,t)},this.isCollectionRequired=function(e,t){var r=this.$getRulesForFieldName(t,e);return r&&r.collection&&r.collection.min&&(angular.isObject(r.collection.min)?r.collection.min.rule:r.collection.min)},this.isFieldRequired=function(e,t){var r=this.$getRulesForFieldName(t,e);return r&&r.required&&(angular.isObject(r.required)?r.required.rule:r.required)},this.validateAll=function(e,t){var r=i.flattenObjectKeys(t);return this.validateFields(e,r,t)},this.validateFields=function(e,r,o){var a=t.defer(),n=[],l={};return angular.forEach(r,function(t){var r=this.$getRulesForFieldName(o,t);if(r){var a;a=r.collection?this.validateCollection(e,t,o):this.validateField(e,t,o),a.then(angular.noop,function(e){i.writeAttribute(l,t,e)}),n.push(a)}},this),t.waitForAll(n).then(a.resolve,function(){a.reject(l)}),a.promise},this.validateCollection=function(o,a,n){var l=this.$getRulesForFieldName(n,a),u=i.readAttribute(o,a);if(l&&l.collection){u=u||[];var s=l.collection;if(s.min){var d=angular.isObject(s.min)?s.min.rule:s.min;if(u.length<d)return t.reject(angular.isObject(s.min)?s.min.message:e(r.validationFailedForMinCollectionSizeMessage)({num:d}))}if(s.max){var c=angular.isObject(s.max)?s.max.rule:s.max;if(u.length>c)return t.reject(angular.isObject(s.max)?s.max.message:e(r.validationFailedForMaxCollectionSizeMessage)({num:c}))}}return t.resolve()},this.validateField=function(o,a,n){var l=this.$getRulesForFieldName(n,a),u=i.readAttribute(o,a);if(l){if(u=u||"",l.required){var s=angular.isObject(l.required)?l.required.rule:l.required;if(!!u!==s)return t.reject(angular.isObject(l.required)?l.required.message:r.validationFailedForRequiredMessage)}if(l.minlength){var d=angular.isObject(l.minlength)?l.minlength.rule:l.minlength;if(u.length<d)return t.reject(angular.isObject(l.minlength)?l.minlength.message:e(r.validationFailedForMinLengthMessage)({num:d}))}if(l.maxlength){var c=angular.isObject(l.maxlength)?l.maxlength.rule:l.maxlength;if(u.length>c)return t.reject(angular.isObject(l.maxlength)?l.maxlength.message:e(r.validationFailedForMaxLengthMessage)({num:c}))}if(l.type){var f=angular.isObject(l.type)?l.type.rule:l.type,m=u.toString();if(f.indexOf("integer")>=0&&!m.match(/^\-*[0-9]+$/))return t.reject(angular.isObject(l.type)?l.type.message:r.validationFailedForIntegerTypeMessage);if(f.indexOf("number")>=0&&!m.match(/^\-*[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:r.validationFailedForNumericTypeMessage);if(f.indexOf("negative")>=0&&!m.match(/^\-[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:r.validationFailedForNegativeTypeMessage);if(f.indexOf("positive")>=0&&!m.match(/^[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:r.validationFailedForPositiveTypeMessage);if(f.indexOf("email")>=0&&!m.match(/^[\w\.\+]+@\w+\.\w+$/))return t.reject(angular.isObject(l.type)?l.type.message:r.validationFailedForEmailTypeMessage)}if(l.pattern){var p=l.pattern instanceof RegExp,b=p?l.pattern:l.pattern.rule;if(!b.exec(u))return t.reject(p?r.validationFailedForPatternMessage:l.pattern.message)}if(l.custom){var F=angular.isFunction(l.custom)?r.validationFailedForCustomMessage:l.custom.message,v=angular.isFunction(l.custom)?l.custom:l.custom.rule;try{var g=v(u,o)}catch(h){return t.reject(h.message||F)}return angular.isObject(g)&&angular.isFunction(g.then)?g.then(function(e){return t.resolve(e)},function(e){return t.reject(e||F)}):g?t.resolve(g):t.reject(F)}}return t.resolve()},this}]),angular.module("formFor").service("NestedObjectHelper",["$parse",function(e){return{$createEmptyArrays:function(e,t){for(var r=0;;){if(r=t.indexOf("[",r),0>r)break;var i=t.substr(0,r),o=this.readAttribute(e,i);o||(o=[],this.writeAttribute(e,i,o));var a=t.substr(r).match(/([0-9]+)\]\./);if(a){var n=parseInt(a[1]);o[n]||(o[n]={})}r++}},flattenAttribute:function(e){return e=e.replace(/\[([^\]]+)\]\.{0,1}/g,"___$1___"),e=e.replace(/\./g,"___")},flattenObjectKeys:function(e){for(var t=[],r=[{object:e,prefix:null}];;){if(0===r.length)break;var i=r.pop(),o=i.prefix?i.prefix+".":"";if("object"==typeof i.object)for(var a in i.object){var n=o+a;t.push(n),r.push({object:i.object[a],prefix:n})}}return t},readAttribute:function(t,r){return e(r)(t)},writeAttribute:function(t,r,i){this.$createEmptyArrays(t,r),e(r).assign(t,i)}}}]);var qDecorator=["$delegate",function(e){return e.resolve=function(e){var t=this.defer();return t.resolve(e),t.promise},e.waitForAll=function(e){var t=this.defer(),r=[],i=0,o=!1,a=function(e,t){r.hasOwnProperty(e)||(r[e]=t,i--),n()},n=function(){0===i&&(o?t.reject(r):t.resolve(r))};return angular.forEach(e,function(e,t){i++,e.then(function(e){a(t,e)},function(e){o=!0,a(t,e)})}),n(),t.promise},e}];angular.module("formFor").config(["$provide",function(e){e.decorator("$q",qDecorator)}]),angular.module("formFor").service("StringUtil",function(){this.humanize=function(e){return e?(e=e.replace(/[A-Z]/g,function(e){return" "+e}),e=e.replace(/_([a-z])/g,function(e,t){return" "+t.toUpperCase()}),e=e.replace(/\s+/g," "),e=e.trim(),e=e.charAt(0).toUpperCase()+e.slice(1)):""}});
angular.module("formFor",[]),angular.module("formFor").directive("ariaManager",function(){return{restrict:"A",link:function(e,t,r){e.$watch("model.uid",function(e){r.$set("ariaDescribedby",e+"-error"),r.$set("ariaLabelledby",e+"-label")}),e.$watch("model.error",function(e){r.$set("ariaInvalid",!!e)})}}}),angular.module("formFor").directive("checkboxField",["$log","FieldHelper",function(e,t){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/checkbox-field.html",scope:{attribute:"@",disable:"=",help:"@?"},link:function(r,i,o,a){if(!r.attribute)return void e.error('Missing required field "attribute"');r.tabIndex=o.tabIndex||0;i.find("input");r.toggle=function(){r.disable||r.model.disabled||(r.model.bindable=!r.model.bindable)},t.manageLabel(r,o),t.manageFieldRegistration(r,a)}}}]),angular.module("formFor").directive("collectionLabel",["$sce","FormForConfiguration",function(e){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/collection-label.html",scope:{attribute:"@",help:"@?",label:"@"},link:function(t,r,i,o){t.$watch("label",function(r){t.bindableLabel=e.trustAsHtml(r)}),t.model=o.registerCollectionLabel(t.attribute)}}}]),angular.module("formFor").directive("fieldError",["$sce","FormForConfiguration",function(){return{restrict:"EA",templateUrl:"form-for/templates/field-error.html",scope:{error:"=",leftAligned:"@?",uid:"@"}}}]),angular.module("formFor").directive("fieldLabel",["$sce","FormForConfiguration",function(e,t){return{restrict:"EA",templateUrl:"form-for/templates/field-label.html",scope:{inputUid:"@",help:"@?",label:"@",required:"@?",uid:"@"},controller:["$scope",function(r){r.$watch("label",function(t){r.bindableLabel=e.trustAsHtml(t)}),r.$watch("required",function(e){r.requiredLabel=r.$eval(e)?t.requiredLabel:null})}]}}]),angular.module("formFor").directive("formForDebounce",["$log","$sniffer","$timeout","FormForConfiguration",function(e,t,r,i){return{restrict:"A",require:"ngModel",priority:99,link:function(o,a,n,l){if("radio"===n.type||"checkbox"===n.type)return void e.warn("formForDebounce should only be used with <input type=text> and <textarea> elements");var u,s=n.formForDebounce,d=i.defaultDebounceDuration;if(void 0!==s&&("false"===s.toString()?d=!1:(s=parseInt(s),angular.isNumber(s)&&!isNaN(s)&&(d=s))),t.hasEvent("input")?a.off("input"):(a.off("keydown"),t.hasEvent("paste")&&a.off("paste")),d!==!1){var c=function(){r.cancel(u),u=r(function(){o.$apply(function(){l.$setViewValue(a.val())})},d)};t.hasEvent("input")?a.on("input",c):(a.on("keydown",c),t.hasEvent("paste")&&a.on("paste",c))}a.on("blur",function(){o.$apply(function(){l.$setViewValue(a.val())})}),o.$on("$destroy",function(){u&&r.cancel(u)})}}}]),angular.module("formFor").directive("formFor",["$injector","$log","$parse","$q","$sce","FormForConfiguration","$FormForStateHelper","$FormForGUID","NestedObjectHelper","ModelValidator",function(e,t,r,i,o,a,n,l,u,s){return{require:"form",restrict:"A",scope:{controller:"=?",disable:"=?",formFor:"=",service:"@",submitComplete:"&?",submitError:"&?",submitWith:"&?",valid:"=?",validationFailed:"&?",validationRules:"=?"},controller:["$scope",function(a){a.formFor||t.error('The form data object specified by <form form-for=""> is null or undefined.'),a.fields={},a.collectionLabels={},a.buttons=[],a.service&&(a.$service=e.get(a.service)),a.$validationRules=a.$service?a.$service.validationRules:a.validationRules;var d=this;d.registerFormField=function(e){if(!e)throw Error('Invalid field name "'+e+'" provided.');var t=u.flattenAttribute(e);if(a.fields.hasOwnProperty(t))throw Error('Field "'+e+'" has already eben registered. Field names must be unique.');var i=(u.readAttribute(a.$validationRules,e),{bindableWrapper:{bindable:null,disabled:a.disable,error:null,pristine:!0,required:s.isFieldRequired(e,a.$validationRules),uid:l.create()},fieldName:e,unwatchers:[],validationAttribute:e.split("[")[0]});a.fields[t]=i;var o=r(e),n=o.assign;i.unwatchers.push(a.$watch("fields."+t+".bindableWrapper.bindable",function(e,t){e!==t&&n(a.formFor,e)}));var c;return i.unwatchers.push(a.$watch("formFor."+e,function(r,o){(r!==i.bindableWrapper.bindable||void 0===o&&""===r||void 0===r)&&(c=!1),i.bindableWrapper.bindable=r,d.validateField(e),c||(c=!0,a.formForStateHelper.setFieldHasBeenModified(t,!1)),i.bindableWrapper.pristine=!a.formForStateHelper.hasFieldBeenModified(t)})),i.bindableWrapper},this.unregisterFormField=function(e){var t=u.flattenAttribute(e);angular.forEach(a.fields[t].unwatchers,function(e){e()}),delete a.fields[t]},d.registerSubmitButton=function(){var e={disabled:!1};return a.buttons.push(e),e},d.registerCollectionLabel=function(e){var t=u.flattenAttribute(e),r={error:null,required:s.isCollectionRequired(e,a.$validationRules)};a.collectionLabels[t]=r;var i=!1;return a.$watch("formFor."+e+".length",function(){i?s.validateCollection(a.formFor,e,a.$validationRules).then(function(){a.formForStateHelper.setFieldError(t,null)},function(e){a.formForStateHelper.setFieldError(t,e)}):i=!0}),r},d.resetField=function(e){var t=u.flattenAttribute(e);a.formForStateHelper.getFieldError(t)&&(a.formForStateHelper.setFieldHasBeenModified(t,!1),a.fields[t].bindableWrapper.pristine=!0),a.formForStateHelper.setFieldError(t,null)},d.resetErrors=function(){for(var e in a.fields)a.formForStateHelper.getFieldError(e)&&(a.formForStateHelper.setFieldHasBeenModified(e,!1),a.fields[e].bindableWrapper.pristine=!0);a.formForStateHelper.setFormSubmitted(!1),a.formForStateHelper.resetFieldErrors()},d.resetFields=d.resetErrors,d.validateField=function(e){{var t=u.flattenAttribute(e);a.fields[t],r(e)(a.formFor)}a.formForStateHelper.setFieldHasBeenModified(t,!0),a.$validationRules&&s.validateField(a.formFor,e,a.$validationRules).then(function(){a.formForStateHelper.setFieldError(t,null)},function(e){a.formForStateHelper.setFieldError(t,e)})},d.validateForm=function(){a.updateCollectionErrors({}),a.updateFieldErrors({});var e,t;if(a.$validationRules){var r=[];angular.forEach(a.fields,function(e){r.push(e.fieldName)}),t=s.validateFields(a.formFor,r,a.$validationRules),t.then(angular.noop,a.updateFieldErrors),r=[],angular.forEach(a.collectionLabels,function(e,t){r.push(t)}),e=s.validateFields(a.formFor,r,a.$validationRules),e.then(angular.noop,a.updateCollectionErrors)}else e=i.resolve(),t=i.resolve();var o=i.defer();return i.waitForAll([e,t]).then(o.resolve,function(e){angular.isArray(e[0])&&0===e[0].length&&e.splice(0,1),o.reject(e)}),o.promise},a.controller=a.controller||{},angular.copy(d,a.controller),a.$watch("disable",function(e){angular.forEach(a.fields,function(t){t.bindableWrapper.disabled=e}),angular.forEach(a.buttons,function(t){t.disabled=e})}),a.formForStateHelper=new n(a),a.$watch("formForStateHelper.watchable",function(){var e=a.formForStateHelper.hasFormBeenSubmitted();angular.forEach(a.fields,function(t,r){if(e||a.formForStateHelper.hasFieldBeenModified(r)){var i=a.formForStateHelper.getFieldError(r);t.bindableWrapper.error=i?o.trustAsHtml(i):null}else t.bindableWrapper.error=null}),angular.forEach(a.collectionLabels,function(e,t){var r=a.formForStateHelper.getFieldError(t);e.error=r?o.trustAsHtml(r):null})}),a.updateCollectionErrors=function(e){angular.forEach(a.collectionLabels,function(t,r){var i=u.readAttribute(e,r);a.formForStateHelper.setFieldError(r,i)})},a.updateFieldErrors=function(e){angular.forEach(a.fields,function(t,r){var i=u.readAttribute(e,t.fieldName);a.formForStateHelper.setFieldError(r,i)})}}],link:function(e,t,r){t.on("submit",function(){return e.formForStateHelper.setFormSubmitted(!0),e.disable=!0,e.controller.validateForm().then(function(){var t;t=r.submitWith?e.submitWith({data:e.formFor}):e.$service&&e.$service.submit?e.$service.submit(e.formFor):i.reject("No submit function provided"),t||(t=i.reject("Submit function did not return a promise")),t.then(function(t){r.submitComplete?e.submitComplete({data:t}):a.defaultSubmitComplete(t)},function(t){angular.isObject(t)&&(e.updateCollectionErrors(t),e.updateFieldErrors(t)),r.submitError?e.submitError({error:t}):a.defaultSubmitError(t)}),t["finally"](function(){e.disable=!1})},function(){e.disable=!1,r.validationFailed?e.validationFailed():a.defaultValidationFailed()}),!1})}}}]),angular.module("formFor").directive("radioField",["$log","$FormForGUID","FieldHelper",function(e,t,r){var i={};return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/radio-field.html",scope:{attribute:"@",disable:"=",help:"@?",value:"@"},link:function(o,a,n,l){if(!o.attribute)return void e.error('Missing required field "attribute"');if(i[o.attribute])o.hideErrorMessage=!0;else{var u={defaultScope:o,scopes:[]};r.manageFieldRegistration(o,l),i[o.attribute]=u}o.uid=t.create();var s=i[o.attribute];s.scopes.push(o),r.manageLabel(o,n),o.tabIndex=n.tabIndex||0;a.find("input");o.click=function(){o.disable||o.model.disabled||(o.model.bindable=o.value)},s.defaultScope.$watch("model",function(e){o.model=e}),s.defaultScope.$watch("disable",function(e){o.disable=e}),s.defaultScope.$watch("model.disabled",function(e){o.model&&(o.model.disabled=e)}),o.$watch("model.bindable",function(e){o.checked=void 0!==e&&null!==e&&void 0!==o.value&&null!==o.value&&e.toString()===o.value.toString()}),o.$on("$destroy",function(){s.scopes.splice(s.scopes.indexOf(o),1),0===s.scopes.length&&delete i[o.attribute]})}}}]),angular.module("formFor").directive("selectField",["$document","$log","$timeout","$window","FieldHelper",function(e,t,r,i,o){var a=10;return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/select-field.html",scope:{attribute:"@",disable:"=",filter:"=?",filterDebounce:"@?",help:"@?",options:"="},link:function(n,l,u,s){if(i=angular.element(i),!n.attribute)return void t.error('Missing required field "attribute"');n.allowBlank=u.hasOwnProperty("allowBlank"),n.enableFiltering=u.hasOwnProperty("enableFiltering"),n.preventDefaultOption=u.hasOwnProperty("preventDefaultOption"),n.labelAttribute=u.labelAttribute||"label",n.valueAttribute=u.valueAttribute||"value",n.placeholder=u.placeholder||"Select",n.tabIndex=u.tabIndex||0,o.manageLabel(n,u),o.manageFieldRegistration(n,s);var d=function(e){var t=e[0];r(t.focus.bind(t))};n.close=function(){r(function(){n.isOpen=!1})},n.open=function(){n.disable||n.model.disabled||r(function(){n.isOpen=!0})},n.emptyOption={},n.emptyOption[n.labelAttribute]="",n.emptyOption[n.valueAttribute]=void 0,n.placeholderOption={},n.placeholderOption[n.labelAttribute]=n.placeholder,n.placeholderOption[n.valueAttribute]=void 0,n.filteredOptions=[];var c=function(e){return e&&e.toLowerCase()},f=function(){var e=n.options||[];if(n.filteredOptions.splice(0),n.enableFiltering&&n.filter){var t=c(n.filter);angular.forEach(e,function(e){var r=c(e[n.labelAttribute]).indexOf(t);r>=0&&n.filteredOptions.push(e)})}else angular.copy(e,n.filteredOptions);n.selectedOption?n.allowBlank&&n.filteredOptions.unshift(n.emptyOption):n.filteredOptions.unshift(n.placeholderOption)};n.$watch("filter",f),n.$watch("options.length",f);var m=function(){var e=n.selectedOption&&n.selectedOption[[n.valueAttribute]];return n.model.bindable===e?void(!n.allowBlank&&!n.preventDefaultOption&&n.options&&n.options.length&&(n.model.bindable=n.options[0][n.valueAttribute])):void 0};n.$watch("model.bindable",m),n.$watch("options.length",m),n.$watch("model.bindable",function(){var e;angular.forEach(n.options,function(t){t[n.valueAttribute]===n.model.bindable&&(e=t)}),n.selectedOption=e,n.selectedOptionLabel=e&&e[n.labelAttribute],n.filter=n.selectedOptionLabel});var p=function(e){e.ignoreFor!==n.model.uid&&n.close()};n.filterTextClick=function(){n.isOpen&&(event.ignoreFor=n.model.uid)};var b;n.$watch("isOpen",function(){b&&r.cancel(b),b=r(function(){b=null,n.isOpen?e.on("click",p):e.off("click",p)},a)}),n.$on("$destroy",function(){e.off("click",p)});{var F=l.find("input");l.find("select")}n.setFilterFocus=function(){d(F)},n.mouseOver=function(e){n.mouseOverIndex=e,n.mouseOverOption=e>=0?n.filteredOptions[e]:null},n.selectOption=function(e){n.model.bindable=e&&e[n.valueAttribute]},n.keyDown=function(e){switch(e.keyCode){case 27:n.close();break;case 13:n.isOpen?(n.selectOption(n.mouseOverOption),n.close()):n.open(),e.preventDefault();break;case 38:n.isOpen?n.mouseOver(n.mouseOverIndex>0?n.mouseOverIndex-1:n.filteredOptions.length-1):n.open();break;case 40:n.isOpen?n.mouseOver(n.mouseOverIndex<n.filteredOptions.length-1?n.mouseOverIndex+1:0):n.open();break;case 9:case 16:n.close();break;default:n.open()}},n.$watchCollection("[isOpen, filteredOptions.length]",function(){n.mouseOver(-1),n.isOpen&&n.enableFiltering&&d(F)})}}}]),angular.module("formFor").directive("submitButton",["$log","$sce",function(e,t){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/submit-button.html",scope:{disable:"=",icon:"@",label:"@"},link:function(e,r,i,o){e.buttonClass=i.buttonClass,e.tabIndex=i.tabIndex||0,e.$watch("label",function(r){e.bindableLabel=t.trustAsHtml(r)}),e.model=o.registerSubmitButton(e)}}}]),angular.module("formFor").directive("textField",["$log","$timeout","FieldHelper",function(e,t,r){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/text-field.html",scope:{attribute:"@",debounce:"@?",disable:"=",focused:"&?",help:"@?",iconAfterClicked:"&?",iconBeforeClicked:"&?",placeholder:"@?"},link:function(i,o,a,n){if(!i.attribute)return void e.error('Missing required field "attribute"');if(i.type=a.type||"text",i.multiline=a.hasOwnProperty("multiline")&&"false"!==a.multiline,i.tabIndex=a.tabIndex||0,a.hasOwnProperty("autofocus")&&t(function(){o.find(i.multiline?"textarea":"input")[0].focus()}),r.manageLabel(i,a),r.manageFieldRegistration(i,n),a.iconAfter){var l=function(){if(i.model){var e="{"===a.iconAfter.charAt(0)?i.$eval(a.iconAfter):a.iconAfter;i.iconAfter=angular.isObject(e)?i.model.error?e.invalid:i.model.pristine?e.pristine:e.valid:e}};a.$observe("iconAfter",l),i.$watch("model.error",l),i.$watch("model.pristine",l)}if(a.iconBefore){var u=function(){if(i.model){var e="{"===a.iconBefore.charAt(0)?i.$eval(a.iconBefore):a.iconBefore;i.iconBefore=angular.isObject(e)?i.model.error?e.invalid:i.model.pristine?e.pristine:e.valid:e}};a.$observe("iconBefore",u),i.$watch("model.error",u),i.$watch("model.pristine",u)}i.onIconAfterClick=function(){a.hasOwnProperty("iconAfterClicked")&&i.iconAfterClicked()},i.onIconBeforeClick=function(){a.hasOwnProperty("iconBeforeClicked")&&i.iconBeforeClicked()},i.onFocus=function(){a.hasOwnProperty("focused")&&i.focused()}}}}]),angular.module("formFor").service("FieldHelper",["FormForConfiguration","StringUtil",function(e,t){this.manageLabel=function(r,i){i.hasOwnProperty("label")&&i.$observe("label",function(e){r.label=e}),e.autoGenerateLabels&&(r.label=t.humanize(r.attribute))},this.manageFieldRegistration=function(e,t){e.$watch("attribute",function(r,i){e.model&&t.unregisterFormField(i),e.model=t.registerFormField(e.attribute)}),e.$on("$destroy",function(){t.unregisterFormField(e.attribute)})}}]),angular.module("formFor").service("FormForConfiguration",function(){return{autoGenerateLabels:!1,defaultDebounceDuration:500,defaultSubmitComplete:angular.noop,defaultSubmitError:angular.noop,defaultValidationFailed:angular.noop,requiredLabel:null,validationFailedForCustomMessage:"Failed custom validation",validationFailedForPatternMessage:"Invalid format",validationFailedForMaxCollectionSizeMessage:"Must be fewer than {{num}} items",validationFailedForMaxLengthMessage:"Must be fewer than {{num}} characters",validationFailedForMinCollectionSizeMessage:"Must at least {{num}} items",validationFailedForMinLengthMessage:"Must be at least {{num}} characters",validationFailedForRequiredMessage:"Required field",validationFailedForEmailTypeMessage:"Invalid email format",validationFailedForIntegerTypeMessage:"Must be an integer",validationFailedForNegativeTypeMessage:"Must be negative",validationFailedForNumericTypeMessage:"Must be numeric",validationFailedForPositiveTypeMessage:"Must be positive",disableAutoLabels:function(){this.autoGenerateLabels=!1},enableAutoLabels:function(){this.autoGenerateLabels=!0},setDefaultDebounceDuration:function(e){this.defaultDebounceDuration=e},setDefaultSubmitComplete:function(e){this.defaultSubmitComplete=e},setDefaultSubmitError:function(e){this.defaultSubmitError=e},setDefaultValidationFailed:function(e){this.defaultValidationFailed=e},setRequiredLabel:function(e){this.requiredLabel=e},setValidationFailedForCustomMessage:function(e){this.validationFailedForCustomMessage=e},setValidationFailedForMaxCollectionSizeMessage:function(e){this.validationFailedForMaxCollectionSizeMessage=e},setValidationFailedForMaxLengthMessage:function(e){this.validationFailedForMaxLengthMessage=e},setValidationFailedForMinCollectionSizeMessage:function(e){this.validationFailedForMaxCollectionSizeMessage=e},setValidationFailedForMinLengthMessage:function(e){this.validationFailedForMinLengthMessage=e},setValidationFailedForPatternMessage:function(e){this.validationFailedForPatternMessage=e},setValidationFailedForRequiredMessage:function(e){this.validationFailedForRequiredMessage=e},setValidationFailedForEmailTypeMessage:function(e){this.validationFailedForEmailTypeMessage=e},setValidationFailedForIntegerTypeMessage:function(e){this.validationFailedForIntegerTypeMessage=e},setValidationFailedForNegativeTypeMessage:function(e){this.validationFailedForNegativeTypeMessage=e},setValidationFailedForNumericTypeMessage:function(e){this.validationFailedForNumericTypeMessage=e},setValidationFailedForPositiveTypeMessage:function(e){this.validationFailedForPositiveTypeMessage=e}}}),angular.module("formFor").service("$FormForGUID",function(){return{create:function(){return("0000"+(Math.random()*Math.pow(36,4)<<0).toString(36)).slice(-4)}}}),angular.module("formFor").factory("$FormForStateHelper",["NestedObjectHelper",function(e){var t=function(e){e.errorMap=e.errorMap||{},e.valid=!0,this.formScope=e,this.fieldNameToModificationMap={},this.formSubmitted=!1,this.shallowErrorMap={},this.watchable=0};return t.prototype.getFieldError=function(t){return e.readAttribute(this.formScope.errorMap,t)},t.prototype.hasFieldBeenModified=function(t){return e.readAttribute(this.fieldNameToModificationMap,t)},t.prototype.hasFormBeenSubmitted=function(){return this.formSubmitted},t.prototype.isFieldValid=function(e){return!getFieldError(e)},t.prototype.isFormInvalid=function(){return!this.isFormValid()},t.prototype.isFormValid=function(){for(var e in this.shallowErrorMap)return!1;return!0},t.prototype.resetFieldErrors=function(){this.formScope.errorMap={}},t.prototype.setFieldError=function(t,r){var i=e.flattenAttribute(t);e.writeAttribute(this.formScope.errorMap,t,r),r?this.shallowErrorMap[i]=r:delete this.shallowErrorMap[i],this.formScope.valid=this.isFormValid(),this.watchable++},t.prototype.setFieldHasBeenModified=function(t,r){e.writeAttribute(this.fieldNameToModificationMap,t,r),this.watchable++},t.prototype.setFormSubmitted=function(e){this.formSubmitted=e,this.watchable++},t}]),angular.module("formFor").service("ModelValidator",["$interpolate","$q","FormForConfiguration","NestedObjectHelper",function(e,t,r,i){return this.$getRulesForFieldName=function(e,t){return t=t.replace(/\[[^\]]+\]/g,".collection.fields"),i.readAttribute(e,t)},this.isCollectionRequired=function(e,t){var r=this.$getRulesForFieldName(t,e);return r&&r.collection&&r.collection.min&&(angular.isObject(r.collection.min)?r.collection.min.rule:r.collection.min)},this.isFieldRequired=function(e,t){var r=this.$getRulesForFieldName(t,e);return r&&r.required&&(angular.isObject(r.required)?r.required.rule:r.required)},this.validateAll=function(e,t){var r=i.flattenObjectKeys(t);return this.validateFields(e,r,t)},this.validateFields=function(e,r,o){var a=t.defer(),n=[],l={};return angular.forEach(r,function(t){var r=this.$getRulesForFieldName(o,t);if(r){var a;a=r.collection?this.validateCollection(e,t,o):this.validateField(e,t,o),a.then(angular.noop,function(e){i.writeAttribute(l,t,e)}),n.push(a)}},this),t.waitForAll(n).then(a.resolve,function(){a.reject(l)}),a.promise},this.validateCollection=function(o,a,n){var l=this.$getRulesForFieldName(n,a),u=i.readAttribute(o,a);if(l&&l.collection){u=u||[];var s=l.collection;if(s.min){var d=angular.isObject(s.min)?s.min.rule:s.min;if(u.length<d)return t.reject(angular.isObject(s.min)?s.min.message:e(r.validationFailedForMinCollectionSizeMessage)({num:d}))}if(s.max){var c=angular.isObject(s.max)?s.max.rule:s.max;if(u.length>c)return t.reject(angular.isObject(s.max)?s.max.message:e(r.validationFailedForMaxCollectionSizeMessage)({num:c}))}}return t.resolve()},this.validateField=function(o,a,n){var l=this.$getRulesForFieldName(n,a),u=i.readAttribute(o,a);if(l){if(u=u||"",l.required){var s=angular.isObject(l.required)?l.required.rule:l.required;if(!!u!==s)return t.reject(angular.isObject(l.required)?l.required.message:r.validationFailedForRequiredMessage)}if(l.minlength){var d=angular.isObject(l.minlength)?l.minlength.rule:l.minlength;if(u.length<d)return t.reject(angular.isObject(l.minlength)?l.minlength.message:e(r.validationFailedForMinLengthMessage)({num:d}))}if(l.maxlength){var c=angular.isObject(l.maxlength)?l.maxlength.rule:l.maxlength;if(u.length>c)return t.reject(angular.isObject(l.maxlength)?l.maxlength.message:e(r.validationFailedForMaxLengthMessage)({num:c}))}if(l.type){var f=angular.isObject(l.type)?l.type.rule:l.type,m=u.toString();if(f.indexOf("integer")>=0&&m&&!m.match(/^\-*[0-9]+$/))return t.reject(angular.isObject(l.type)?l.type.message:r.validationFailedForIntegerTypeMessage);if(f.indexOf("number")>=0&&m&&!m.match(/^\-*[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:r.validationFailedForNumericTypeMessage);if(f.indexOf("negative")>=0&&m&&!m.match(/^\-[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:r.validationFailedForNegativeTypeMessage);if(f.indexOf("positive")>=0&&m&&!m.match(/^[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:r.validationFailedForPositiveTypeMessage);if(f.indexOf("email")>=0&&m&&!m.match(/^[\w\.\+]+@\w+\.\w+$/))return t.reject(angular.isObject(l.type)?l.type.message:r.validationFailedForEmailTypeMessage)}if(l.pattern){var p=l.pattern instanceof RegExp,b=p?l.pattern:l.pattern.rule;if(!b.exec(u))return t.reject(p?r.validationFailedForPatternMessage:l.pattern.message)}if(l.custom){var F=angular.isFunction(l.custom)?r.validationFailedForCustomMessage:l.custom.message,v=angular.isFunction(l.custom)?l.custom:l.custom.rule;try{var g=v(u,o)}catch(h){return t.reject(h.message||F)}return angular.isObject(g)&&angular.isFunction(g.then)?g.then(function(e){return t.resolve(e)},function(e){return t.reject(e||F)}):g?t.resolve(g):t.reject(F)}}return t.resolve()},this}]),angular.module("formFor").service("NestedObjectHelper",["$parse",function(e){return{$createEmptyArrays:function(e,t){for(var r=0;;){if(r=t.indexOf("[",r),0>r)break;var i=t.substr(0,r),o=this.readAttribute(e,i);o||(o=[],this.writeAttribute(e,i,o));var a=t.substr(r).match(/([0-9]+)\]\./);if(a){var n=parseInt(a[1]);o[n]||(o[n]={})}r++}},flattenAttribute:function(e){return e=e.replace(/\[([^\]]+)\]\.{0,1}/g,"___$1___"),e=e.replace(/\./g,"___")},flattenObjectKeys:function(e){for(var t=[],r=[{object:e,prefix:null}];;){if(0===r.length)break;var i=r.pop(),o=i.prefix?i.prefix+".":"";if("object"==typeof i.object)for(var a in i.object){var n=o+a;t.push(n),r.push({object:i.object[a],prefix:n})}}return t},readAttribute:function(t,r){return e(r)(t)},writeAttribute:function(t,r,i){this.$createEmptyArrays(t,r),e(r).assign(t,i)}}}]);var qDecorator=["$delegate",function(e){return e.resolve=function(e){var t=this.defer();return t.resolve(e),t.promise},e.waitForAll=function(e){var t=this.defer(),r=[],i=0,o=!1,a=function(e,t){r.hasOwnProperty(e)||(r[e]=t,i--),n()},n=function(){0===i&&(o?t.reject(r):t.resolve(r))};return angular.forEach(e,function(e,t){i++,e.then(function(e){a(t,e)},function(e){o=!0,a(t,e)})}),n(),t.promise},e}];angular.module("formFor").config(["$provide",function(e){e.decorator("$q",qDecorator)}]),angular.module("formFor").service("StringUtil",function(){this.humanize=function(e){return e?(e=e.replace(/[A-Z]/g,function(e){return" "+e}),e=e.replace(/_([a-z])/g,function(e,t){return" "+t.toUpperCase()}),e=e.replace(/\s+/g," "),e=e.trim(),e=e.charAt(0).toUpperCase()+e.slice(1)):""}});
{
"name": "angular-form-for",
"version": "1.4.2",
"version": "1.4.3",
"description": "Set of Angular directives to simplify creating and validating HTML forms.",

@@ -5,0 +5,0 @@ "keywords": [

@@ -22,3 +22,3 @@ # Angular formFor

## Compatibility
## Compatibility and Dependencies

@@ -30,2 +30,4 @@ The current release of *formFor* is compatible with Angular Angular 1.2.

*formFor* does not require third party libraries such as jQuery, lodash, or underscore.
## Installation

@@ -32,0 +34,0 @@

@@ -205,3 +205,3 @@ /**

if (type.indexOf('integer') >= 0 && !stringValue.match(/^\-*[0-9]+$/)) {
if (type.indexOf('integer') >= 0 && stringValue && !stringValue.match(/^\-*[0-9]+$/)) {
return $q.reject(

@@ -213,3 +213,3 @@ angular.isObject(rules.type) ?

if (type.indexOf('number') >= 0 && !stringValue.match(/^\-*[0-9\.]+$/)) {
if (type.indexOf('number') >= 0 && stringValue && !stringValue.match(/^\-*[0-9\.]+$/)) {
return $q.reject(

@@ -221,3 +221,3 @@ angular.isObject(rules.type) ?

if (type.indexOf('negative') >= 0 && !stringValue.match(/^\-[0-9\.]+$/)) {
if (type.indexOf('negative') >= 0 && stringValue && !stringValue.match(/^\-[0-9\.]+$/)) {
return $q.reject(

@@ -229,3 +229,3 @@ angular.isObject(rules.type) ?

if (type.indexOf('positive') >= 0 && !stringValue.match(/^[0-9\.]+$/)) {
if (type.indexOf('positive') >= 0 && stringValue && !stringValue.match(/^[0-9\.]+$/)) {
return $q.reject(

@@ -237,3 +237,3 @@ angular.isObject(rules.type) ?

if (type.indexOf('email') >= 0 && !stringValue.match(/^[\w\.\+]+@\w+\.\w+$/)) {
if (type.indexOf('email') >= 0 && stringValue && !stringValue.match(/^[\w\.\+]+@\w+\.\w+$/)) {
return $q.reject(

@@ -240,0 +240,0 @@ angular.isObject(rules.type) ?

@@ -231,2 +231,8 @@ describe('ModelValidator', function() {

it('number should not require input unless the required flag is also present', function() {
expect(ModelValidator.validateField({number: ''}, 'number', model.rules)).toBeResolved();
expect(ModelValidator.validateField({number: undefined}, 'number', model.rules)).toBeResolved();
expect(ModelValidator.validateField({number: null}, 'number', model.rules)).toBeResolved();
});
it('integer should accept integer input', function() {

@@ -250,2 +256,8 @@ expect(ModelValidator.validateField({integer: 123}, 'integer', model.rules)).toBeResolved();

it('integer should not require input unless the required flag is also present', function() {
expect(ModelValidator.validateField({integer: ''}, 'integer', model.rules)).toBeResolved();
expect(ModelValidator.validateField({integer: undefined}, 'integer', model.rules)).toBeResolved();
expect(ModelValidator.validateField({integer: null}, 'integer', model.rules)).toBeResolved();
});
it('positive should accept positive numeric input', function() {

@@ -265,2 +277,8 @@ expect(ModelValidator.validateField({positive: 123}, 'positive', model.rules)).toBeResolved();

it('positive should not require input unless the required flag is also present', function() {
expect(ModelValidator.validateField({positive: ''}, 'positive', model.rules)).toBeResolved();
expect(ModelValidator.validateField({positive: undefined}, 'positive', model.rules)).toBeResolved();
expect(ModelValidator.validateField({positive: null}, 'positive', model.rules)).toBeResolved();
});
it('negative should accept negative numeric input', function() {

@@ -280,2 +298,8 @@ expect(ModelValidator.validateField({negative: -123}, 'negative', model.rules)).toBeResolved();

it('negative should not require input unless the required flag is also present', function() {
expect(ModelValidator.validateField({negative: ''}, 'negative', model.rules)).toBeResolved();
expect(ModelValidator.validateField({negative: undefined}, 'negative', model.rules)).toBeResolved();
expect(ModelValidator.validateField({negative: null}, 'negative', model.rules)).toBeResolved();
});
it('email should accept email input', function() {

@@ -298,2 +322,8 @@ expect(ModelValidator.validateField({email: 'abc@abc.com'}, 'email', model.rules)).toBeResolved();

it('email should not require input unless the required flag is also present', function() {
expect(ModelValidator.validateField({email: ''}, 'email', model.rules)).toBeResolved();
expect(ModelValidator.validateField({email: undefined}, 'email', model.rules)).toBeResolved();
expect(ModelValidator.validateField({email: null}, 'email', model.rules)).toBeResolved();
});
it('should allow custom error messages for failed email validations', function() {

@@ -303,3 +333,3 @@ model.rules = { email: { type: { rule: 'email', message: 'foobar email' } } };

verifyPromiseRejectedWithMessage(
ModelValidator.validateField({email: null}, 'email', model.rules),
ModelValidator.validateField({email: 'invalid'}, 'email', model.rules),
'foobar email');

@@ -312,3 +342,3 @@ });

verifyPromiseRejectedWithMessage(
ModelValidator.validateField({integer: null}, 'integer', model.rules),
ModelValidator.validateField({integer: 'invalid'}, 'integer', model.rules),
'foobar integer');

@@ -321,3 +351,3 @@ });

verifyPromiseRejectedWithMessage(
ModelValidator.validateField({negative: null}, 'negative', model.rules),
ModelValidator.validateField({negative: 'invalid'}, 'negative', model.rules),
'foobar negative');

@@ -330,3 +360,3 @@ });

verifyPromiseRejectedWithMessage(
ModelValidator.validateField({number: null}, 'number', model.rules),
ModelValidator.validateField({number: 'invalid'}, 'number', model.rules),
'foobar number');

@@ -339,3 +369,3 @@ });

verifyPromiseRejectedWithMessage(
ModelValidator.validateField({positive: null}, 'positive', model.rules),
ModelValidator.validateField({positive: 'invalid'}, 'positive', model.rules),
'foobar positive');

@@ -342,0 +372,0 @@ });

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc