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.2.6 to 1.2.7

2

bower.json
{
"name": "angular-form-for",
"version": "1.2.6",
"version": "1.2.7",
"main": [

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

angular.module("formFor.templates",[]).run(["$templateCache",function(e){e.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" left-aligned="true"></field-error>\n\n <label>\n <div class="checkbox-field-input" ng-class="{\'is-checked\': model.bindable}"></div>\n\n <input type="checkbox" ng-model="model.bindable"\n class="field-input"\n ng-disabled="disable || model.disabled">\n\n <field-label ng-if="label"\n label="{{label}}"\n help="{{help}}"\n ng-click="toggle()">\n </field-label>\n </label>\n</div>\n'),e.put("form-for/templates/collection-label.html",'<div class="collection-label" ng-class="{\'text-danger field-error\': model.error}">\n <field-label ng-if="label"\n label="{{label}}"\n help="{{help}}"\n required="{{model.required}}">\n </field-label>\n\n <small ng-if="model.error" class="text-danger field-error" ng-bind="model.error"></small>\n</div>\n'),e.put("form-for/templates/field-error.html",'<p ng-if="error" class="text-danger field-error" ng-class="{\'left-aligned\': leftAligned}" ng-bind="error"></p>\n'),e.put("form-for/templates/field-label.html",'<label class="field-label"\n popover="{{help}}"\n popover-trigger="mouseenter"\n popover-placement="right">\n\n <span ng-bind-html="bindableLabel"></span>\n\n <span ng-if="help" class="fa-stack help-icon-stack">\n <i class="fa fa-stack-2x fa-circle help-background-icon"></i>\n <i class="fa fa-stack-1x fa-inverse fa-question help-foreground-icon"></i>\n </span>\n\n <span class="label label-default field-label-required-label" ng-if="requiredLabel" ng-bind="requiredLabel"></span>\n</label>\n'),e.put("form-for/templates/radio-field.html",'<span class="field radio-field"\n ng-class="{disabled: disable || model.disabled, \'has-error\': model.error}">\n\n <field-error error="model.error" left-aligned="true"></field-error>\n\n <label>\n <span class="radio-field-input" ng-class="{\'is-selected\': checked}"\n ng-click="click()"></span>\n\n <input type="radio" ng-model="model.bindable" ng-value="value"\n class="field-input"\n ng-checked="checked"\n ng-disabled="disable || model.disabled">\n\n <field-label ng-if="label"\n label="{{label}}"\n help="{{help}}"\n ng-click="click()">\n </field-label>\n </label>\n</span>\n'),e.put("form-for/templates/select-field.html",'<div class="form-group field select-field"\n ng-class="{disabled: disable || model.disabled, open: isOpen, \'has-error\': model.error}">\n\n <field-label ng-if="label"\n label="{{label}}"\n help="{{help}}"\n required="{{model.required}}">\n </field-label>\n\n <field-error error="model.error"></field-error>\n\n <div class="form-control select-field-toggle-button" ng-class="{open: isOpen}"\n ng-disabled="disable || model.disabled">\n\n <span ng-if="selectedOptionLabel" ng-bind="selectedOptionLabel"></span>\n\n <span ng-if="!selectedOptionLabel">\n <span ng-if="placeholder" ng-bind="placeholder"></span>\n <span ng-if="!placeholder">Select</span>\n </span>\n\n <span class="fa fa-caret-down pull-right select-field-toggle-caret"></span>\n </div>\n\n <div ng-show="isOpen" class="list-group-container">\n <div class="list-group">\n <div ng-show="enableFiltering" class="input-group filter-input-group"\n ng-click="$event.stopPropagation()">\n <input type="text"\n class="form-control text-field-input filter-text-input"\n ng-model="filter"\n ng-keydown="keyDown($event)"\n form-for-debounce="{{filterDebounce}}" />\n\n <span class="input-group-addon input-group-addon-after">\n <i class="fa fa-search text-field-icon"></i>\n </span>\n </div>\n\n <div class="list-group-scrollable">\n <a class="list-group-item"\n ng-repeat="option in filteredOptions"\n ng-value="option[valueAttribute]"\n ng-click="selectOption(option)"\n ng-mouseenter="mouseOver($index)"\n ng-class="{active: option === selectedOption, hover: $index === mouseOverIndex}">\n\n <!-- Bootstrap leaves us no way to style a non-:hover element so we fall back to <strong> -->\n <strong ng-if="$index === mouseOverIndex" ng-bind="option[labelAttribute]"></strong>\n <span ng-if="$index !== mouseOverIndex" ng-bind="option[labelAttribute]"></span>\n <spgn ng-if="!option[labelAttribute]">&nbsp;</spgn> <!-- Gracefully handle empty/null names -->\n </a>\n\n <a ng-if="!options" class="list-group-item">\n <i class="fa fa-circle-o-notch fa-spin"></i>\n Loading...\n </a>\n </div>\n </div>\n </div>\n</div>\n'),e.put("form-for/templates/submit-button.html",'<button class="submit-button" ng-class="buttonClass || \'btn btn-default\'" ng-disabled="disable || model.disabled">\n <i ng-if="icon" class="submit-button-icon" ng-class="icon"></i>\n\n <span ng-bind-html="bindableLabel"></span>\n</button>\n'),e.put("form-for/templates/text-field.html",'<div class="form-group field text-field"\n ng-class="{disabled: disable || model.disabled, \'has-error\': model.error}">\n\n <field-label ng-if="label"\n label="{{label}}"\n help="{{help}}"\n required="{{model.required}}">\n </field-label>\n\n <field-error error="model.error"></field-error>\n\n <div ng-class="{\'input-group\': iconBefore || iconAfter}">\n <span ng-if="iconBefore" class="input-group-addon input-group-addon-before"\n ng-click="onIconBeforeClick()">\n <i class="text-field-icon" ng-class="iconBefore"></i>\n </span>\n\n <input ng-if="!multiline"\n type="{{type}}"\n class="form-control text-field-input"\n ng-class="{\'has-icon-before\': iconBefore, \'has-icon-after\': iconAfter}"\n ng-disabled="disable || model.disabled"\n placeholder="{{placeholder}}"\n ng-model="model.bindable"\n form-for-debounce="{{debounce}}"\n ng-click="onFocus()" />\n\n\n <textarea ng-if="multiline"\n class="form-control text-field-input"\n ng-class="{\'has-icon-before\': iconBefore, \'has-icon-after\': iconAfter}"\n ng-disabled="disable || model.disabled"\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 input-group-addon-after"\n ng-click="onIconAfterClick()">\n <i class="text-field-icon" ng-class="iconAfter"></i>\n </span>\n </div>\n</div>\n'),e.put("form-for/templates/type-ahead-field.html",'<div class="form-group field type-ahead-field"\n ng-class="{disabled: disable || model.disabled, \'has-error\': model.error}">\n\n <field-label ng-if="label"\n label="{{label}}"\n help="{{help}}"\n required="{{model.required}}">\n </field-label>\n\n <field-error error="model.error"></field-error>\n\n <input type="text"\n class="form-control type-ahead-field-input"\n placeholder="{{placeholder}}"\n ng-model="model.selectedOption"\n ng-change="changeHandler()"\n typeahead="option as option[labelAttribute] for option in filteredOptions"\n typeahead-wait-ms="debounce || 1000">\n</div>\n')}]);
angular.module("formFor",["formFor.templates"]),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(i,r,o,a){if(!i.attribute)return void e.error('Missing required field "attribute"');i.label=t.getLabel(o,i.attribute);r.find("input");i.toggle=function(){i.disable||i.model.disabled||(i.model.bindable=!i.model.bindable)},t.manageFieldRegistration(i,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,i,r,o){t.$watch("label",function(i){t.bindableLabel=e.trustAsHtml(i)}),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:"@?"}}}]),angular.module("formFor").directive("fieldLabel",["$sce","FormForConfiguration",function(e,t){return{restrict:"EA",templateUrl:"form-for/templates/field-label.html",scope:{help:"@?",label:"@",required:"@?"},controller:["$scope",function(i){i.$watch("label",function(t){i.bindableLabel=e.trustAsHtml(t)}),i.$watch("required",function(e){i.requiredLabel=i.$eval(e)?t.requiredLabel:null})}]}}]),angular.module("formFor").directive("formForDebounce",["$log","$timeout","FormForConfiguration",function(e,t,i){return{restrict:"A",require:"ngModel",priority:99,link:function(r,o,a,n){if("radio"===a.type||"checkbox"===a.type)return void e.warn("formForDebounce should only be used with <input type=text> and <textarea> elements");var l,u=a.formForDebounce,s=i.defaultDebounceDuration;void 0!==u&&("false"===u.toString()?s=!1:(u=parseInt(u),angular.isNumber(u)&&!isNaN(u)&&(s=u))),o.unbind("input"),s!==!1&&o.bind("input",function(){t.cancel(l),l=t(function(){r.$apply(function(){n.$setViewValue(o.val())})},s)}),o.bind("blur",function(){r.$apply(function(){n.$setViewValue(o.val())})}),r.$on("$destroy",function(){l&&t.cancel(l)})}}}]),angular.module("formFor").directive("formFor",["$injector","$parse","$q","$sce","FormForConfiguration","$FormForStateHelper","NestedObjectHelper","ModelValidator",function(e,t,i,r,o,a,n,l){return{require:"form",restrict:"A",scope:{controller:"=?",disable:"=?",formFor:"=",service:"@",submitComplete:"&?",submitError:"&?",submitWith:"&?",valid:"=?",validationFailed:"&?",validationRules:"=?"},controller:["$scope",function(o){o.collectionNameToErrorMap={},o.fieldNameToErrorMap={},o.fields={},o.collectionLabels={},o.buttons=[],o.service&&(o.$service=e.get(o.service)),o.$validationRules=o.$service?o.$service.validationRules:o.validationRules;var u=this;u.registerFormField=function(e){var i=n.flattenAttribute(e),r=(n.readAttribute(o.$validationRules,e),{bindableWrapper:{bindable:null,disabled:!1,error:null,required:l.isFieldRequired(e,o.$validationRules)},fieldName:e,unwatchers:[],validationAttribute:e.split("[")[0]});o.fields[i]=r;var a=t(e),u=a.assign;r.unwatchers.push(o.$watch("fields."+i+".bindableWrapper.bindable",function(e,t){e!==t&&u(o.formFor,e)}));var s;return r.unwatchers.push(o.$watch("formFor."+e,function(t,n){r.bindableWrapper.bindable=a(o.formFor),s?(void 0!==n||""!==t)&&o.formForStateHelper.setFieldHasBeenModified(i,void 0!==t):s=!0,o.$validationRules&&l.validateField(o.formFor,e,o.$validationRules).then(function(){o.formForStateHelper.setFieldError(i,null)},function(e){o.formForStateHelper.setFieldError(i,e)})})),r.bindableWrapper},this.unregisterFormField=function(e){var t=n.flattenAttribute(e);angular.forEach(o.fields[t].unwatchers,function(e){e()})},u.registerSubmitButton=function(){var e={disabled:!1};return o.buttons.push(e),e},u.registerCollectionLabel=function(e){var t=n.flattenAttribute(e),i={error:null,required:l.isCollectionRequired(e,o.$validationRules)};o.collectionLabels[t]=i;var r=!1;return o.$watch("formFor."+e+".length",function(){r?l.validateCollection(o.formFor,e,o.$validationRules).then(function(){o.formForStateHelper.setFieldError(t,null)},function(e){o.formForStateHelper.setFieldError(t,e)}):r=!0}),i},u.resetErrors=function(){o.formForStateHelper.setFormSubmitted(!1);var e=n.flattenObjectKeys(o.fieldNameToErrorMap);angular.forEach(e,function(){o.formForStateHelper.setFieldHasBeenModified(bindableFieldName,!1)})},u.validateForm=function(){o.updateCollectionErrors({}),o.updateFieldErrors({});var e,t;if(o.$validationRules){var r=[];angular.forEach(o.fields,function(e){r.push(e.fieldName)}),t=l.validateFields(o.formFor,r,o.$validationRules),t.then(angular.noop,o.updateFieldErrors),r=[],angular.forEach(o.collectionLabels,function(e,t){r.push(t)}),e=l.validateFields(o.formFor,r,o.$validationRules),e.then(angular.noop,o.updateCollectionErrors)}else e=i.resolve(),t=i.resolve();var a=i.defer();return i.waitForAll([e,t]).then(a.resolve,function(e){angular.isArray(e[0])&&0===e[0].length&&e.splice(0,1),a.reject(e)}),a.promise},o.controller=o.controller||{},angular.copy(u,o.controller),o.$watch("disable",function(e){angular.forEach(o.fields,function(t){t.bindableWrapper.disabled=e}),angular.forEach(o.buttons,function(t){t.disabled=e})}),o.formForStateHelper=new a(o),o.$watch("formForStateHelper.watchable",function(){var e=o.formForStateHelper.hasFormBeenSubmitted();angular.forEach(o.fields,function(t,i){if(e||o.formForStateHelper.hasFieldBeenModified(i)){var a=o.formForStateHelper.getFieldError(i);t.bindableWrapper.error=a?r.trustAsHtml(a):null}else t.bindableWrapper.error=null}),angular.forEach(o.collectionLabels,function(e,t){var i=o.formForStateHelper.getFieldError(t);e.error=i?r.trustAsHtml(i):null})}),o.updateCollectionErrors=function(e){angular.forEach(o.collectionLabels,function(t,i){var r=n.readAttribute(e,i);o.formForStateHelper.setFieldError(i,r)})},o.updateFieldErrors=function(e){angular.forEach(o.fields,function(t,i){var r=n.readAttribute(e,t.fieldName);o.formForStateHelper.setFieldError(i,r)})}}],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}):o.defaultSubmitComplete(t)},function(t){angular.isObject(t)&&(e.updateCollectionErrors(t),e.updateFieldErrors(t)),r.submitError?e.submitError({error:t}):o.defaultSubmitError(t)}),t["finally"](function(){e.disable=!1})},function(){e.disable=!1,r.validationFailed?e.validationFailed():o.defaultValidationFailed()}),!1})}}}]),angular.module("formFor").directive("radioField",["$log","FieldHelper",function(e,t){var i={};return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/radio-field.html",scope:{attribute:"@",disable:"=",help:"@?",value:"@"},link:function(r,o,a,n){if(!r.attribute)return void e.error('Missing required field "attribute"');if(!i[r.attribute]){var l={defaultScope:r,scopes:[]};t.manageFieldRegistration(r,n),i[r.attribute]=l}var u=i[r.attribute];u.scopes.push(r),r.label=t.getLabel(a,r.value);o.find("input");r.click=function(){r.disable||r.model.disabled||(r.model.bindable=r.value)},u.defaultScope.$watch("model",function(e){r.model=e}),u.defaultScope.$watch("disable",function(e){r.disable=e}),u.defaultScope.$watch("model.disabled",function(e){r.model&&(r.model.disabled=e)}),r.$watch("model.bindable",function(e){r.checked=void 0!==e&&null!==e&&void 0!==r.value&&null!==r.value&&e.toString()===r.value.toString()}),r.$on("$destroy",function(){u.scopes.splice(u.scopes.indexOf(r),1),0===u.scopes.length&&delete i[r.attribute]})}}}]),angular.module("formFor").directive("selectField",["$document","$log","$timeout","FieldHelper",function(e,t,i,r){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/select-field.html",scope:{attribute:"@",disable:"=",filter:"=?",filterDebounce:"@?",help:"@?",options:"=",placeholder:"@?"},link:function(o,a,n,l){if(!o.attribute)return void t.error('Missing required field "attribute"');o.allowBlank=n.hasOwnProperty("allowBlank"),o.enableFiltering=n.hasOwnProperty("enableFiltering"),o.labelAttribute=n.labelAttribute||"label",o.valueAttribute=n.valueAttribute||"value",o.label=r.getLabel(n,o.attribute),r.manageFieldRegistration(o,l),o.emptyOption={},o.filteredOptions=[];var u=function(e){return e&&e.toLowerCase()},s=function(){var e=o.options||[];if(o.filteredOptions.splice(0),o.enableFiltering&&o.filter){var t=u(o.filter);angular.forEach(e,function(e){var i=u(e[o.labelAttribute]).indexOf(t);i>=0&&o.filteredOptions.push(e)})}else angular.copy(e,o.filteredOptions);o.allowBlank&&o.filteredOptions.unshift(o.emptyOption)};o.$watch("filter",s),o.$watch("options.length",s);var d=function(){var e,t=o.selectedOption&&o.selectedOption[[o.valueAttribute]];return o.model.bindable===t?void(!o.allowBlank&&o.options&&o.options.length&&(o.model.bindable=o.options[0][o.valueAttribute])):(angular.forEach(o.options,function(t){t[o.valueAttribute]===o.model.bindable&&(e=t)}),o.selectedOption=e,void(o.selectedOptionLabel=e&&e[o.labelAttribute]))};o.$watch("model.bindable",d),o.$watch("options.length",d),o.$watch("model.bindable",function(e){for(var t,i=0;i<o.filteredOptions.length;i++){var r=o.filteredOptions[i];if(r[o.valueAttribute]===e){t=r;break}}o.selectedOption=t,o.selectedOptionLabel=t&&t[o.labelAttribute]});var c=function(e,t){i(function(){e.one("click",t)},1)},f=function(){e.off("click",p)},m=function(){c(a.find(".select-field-toggle-button"),g)};o.selectOption=function(e){o.model.bindable=e&&e[o.valueAttribute],o.isOpen=!1,f(),m()};var p=function(){o.isOpen=!1,o.$apply(),f(),m()},b=a.find(".list-group-container"),F=a.find(".list-group"),g=function(){if(o.disable||o.model.disabled)return void m();if(o.isOpen=!o.isOpen,o.isOpen){c(e,p);var t=o.model.bindable;i(angular.bind(this,function(){for(var e,i=F.find(".list-group-item"),r=0;r<i.length;r++){var a=i[r],n=$(a).scope().option;if(n&&n[o.valueAttribute]===t){e=a;break}}e&&b.scrollTop($(e).offset().top-$(e).parent().offset().top)}),1)}};m(),o.mouseOver=function(e){o.mouseOverIndex=e,o.mouseOverOption=e>=0?o.filteredOptions[e]:null},o.keyDown=function(e){switch(e.keyCode){case 27:o.isOpen=!1;break;case 13:o.selectOption(o.mouseOverOption),o.isOpen=!1,e.preventDefault(),e.stopPropagation();break;case 38:o.mouseOver(o.mouseOverIndex>0?o.mouseOverIndex-1:o.filteredOptions.length-1);break;case 40:o.mouseOver(o.mouseOverIndex<o.filteredOptions.length-1?o.mouseOverIndex+1:0)}},o.$watchCollection("[isOpen, filteredOptions.length]",function(){o.mouseOver(-1)}),o.$on("$destroy",function(){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,i,r,o){e.buttonClass=r.buttonClass,e.$watch("label",function(i){e.bindableLabel=t.trustAsHtml(i)}),e.model=o.registerSubmitButton(e)}}}]),angular.module("formFor").directive("textField",["$log","$timeout","FieldHelper",function(e,t,i){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/text-field.html",scope:{attribute:"@",debounce:"@?",disable:"=",focused:"&?",help:"@?",iconAfter:"@?",iconAfterClicked:"&?",iconBefore:"@?",iconBeforeClicked:"&?",placeholder:"@?"},link:function(r,o,a,n){return r.attribute?(r.label=i.getLabel(a,r.attribute),r.type=a.type||"text",r.multiline=a.hasOwnProperty("multiline")&&"false"!==a.multiline,a.hasOwnProperty("autofocus")&&t(function(){o.find(r.multiline?"textarea":"input").focus()}),r.onIconAfterClick=function(){a.hasOwnProperty("iconAfterClicked")&&r.iconAfterClicked()},r.onIconBeforeClick=function(){a.hasOwnProperty("iconBeforeClicked")&&r.iconBeforeClicked()},r.onFocus=function(){a.hasOwnProperty("focused")&&r.focused()},void i.manageFieldRegistration(r,n)):void e.error('Missing required field "attribute"')}}}]),angular.module("formFor").directive("typeAheadField",["$log","$filter","$timeout","FieldHelper","FormForConfiguration",function(e,t,i,r,o){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/type-ahead-field.html",scope:{attribute:"@",disable:"=",filter:"=?",help:"@?",options:"=",placeholder:"@?"},link:function(a,n,l,u){if(!a.attribute)return void e.error('Missing required field "attribute"');l.hasOwnProperty("autofocus")&&i(function(){n.find("input").focus()}),a.debounce=l.debounce||o.defaultDebounceDuration,a.labelAttribute=l.labelAttribute||"label",a.valueAttribute=l.valueAttribute||"value",a.filteredOptions=a.options||[],a.changeHandler=function(){a.filter=n.find("input").val()};var s=function(){var e=a.options||[],i={};i[a.labelAttribute]=a.filter,a.filteredOptions=t("filter")(e,i)};a.$watch("filter",s),a.$watch("options",s),a.label=r.getLabel(l,a.attribute),r.manageFieldRegistration(a,u);var d=function(){var e,t=a.model.selectedOption&&a.model.selectedOption[[a.valueAttribute]];a.model.bindable!==t&&(angular.forEach(a.options,function(t){t[a.valueAttribute]===a.model.bindable&&(e=t)}),a.model.selectedOption=e)};a.$watch("model.bindable",d),a.$watch("options",d);var c;a.$watch("model.selectedOption",function(e){return c?void(a.model.bindable=e&&e[a.valueAttribute]):void(c=!0)})}}}]),angular.module("formFor").service("FieldHelper",["FormForConfiguration","StringUtil",function(e,t){this.getLabel=function(i,r){return i.hasOwnProperty("label")?i.label:e.autoGenerateLabels?t.humanize(r):void 0},this.manageFieldRegistration=function(e,t){e.$watch("attribute",function(i,r){e.model&&t.unregisterFormField(r),e.model=t.registerFormField(e.attribute)}),e.$on("$destroy",function(){t.unregisterFormField(e.attribute)})}}]),angular.module("formFor").service("FormForConfiguration",function(){return{autoGenerateLabels:!1,defaultDebounceDuration:1e3,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").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.setFieldError=function(t,i){var r=e.flattenAttribute(t);e.writeAttribute(this.formScope.errorMap,t,i),i?this.shallowErrorMap[r]=i:delete this.shallowErrorMap[r],this.formScope.valid=this.isFormValid(),this.watchable++},t.prototype.setFieldHasBeenModified=function(t,i){e.writeAttribute(this.fieldNameToModificationMap,t,i),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,i,r){return this.$getRulesForFieldName=function(e,t){return t=t.replace(/\[[^\]]+\]/g,".collection.fields"),r.readAttribute(e,t)},this.isCollectionRequired=function(e,t){var i=this.$getRulesForFieldName(t,e);return i&&i.collection&&i.collection.min&&(angular.isObject(i.collection.min)?i.collection.min.rule:i.collection.min)},this.isFieldRequired=function(e,t){var i=this.$getRulesForFieldName(t,e);return i&&i.required&&(angular.isObject(i.required)?i.required.rule:i.required)},this.validateAll=function(e,t){var i=r.flattenObjectKeys(t);return this.validateFields(e,i,t)},this.validateFields=function(e,i,o){var a=t.defer(),n=[],l={};return angular.forEach(i,function(t){var i=this.$getRulesForFieldName(o,t);if(i){var a;a=i.collection?this.validateCollection(e,t,o):this.validateField(e,t,o),a.then(angular.noop,function(e){r.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=r.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(i.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(i.validationFailedForMaxCollectionSizeMessage)({num:c}))}}return t.resolve()},this.validateField=function(o,a,n){var l=this.$getRulesForFieldName(n,a),u=r.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:i.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(i.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(i.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:i.validationFailedForIntegerTypeMessage);if(f.indexOf("number")>=0&&!m.match(/^\-*[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:i.validationFailedForNumericTypeMessage);if(f.indexOf("negative")>=0&&!m.match(/^\-[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:i.validationFailedForNegativeTypeMessage);if(f.indexOf("positive")>=0&&!m.match(/^[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:i.validationFailedForPositiveTypeMessage);if(f.indexOf("email")>=0&&!m.match(/^[\w\.\+]+@\w+\.\w+$/))return t.reject(angular.isObject(l.type)?l.type.message:i.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?i.validationFailedForPatternMessage:l.pattern.message)}if(l.custom){var F=angular.isFunction(l.custom)?i.validationFailedForCustomMessage:l.custom.message,g=angular.isFunction(l.custom)?l.custom:l.custom.rule;try{var v=g(u,o)}catch(h){return t.reject(h.message||F)}return angular.isObject(v)&&angular.isFunction(v.then)?v.then(function(e){return t.resolve(e)},function(e){return t.reject(e||F)}):v?t.resolve(v):t.reject(F)}}return t.resolve()},this}]),angular.module("formFor").service("NestedObjectHelper",["$parse",function(e){return{$createEmptyArrays:function(e,t){for(var i=0;;){if(i=t.indexOf("[",i),0>i)break;var r=t.substr(0,i),o=this.readAttribute(e,r);o||(o=[],this.writeAttribute(e,r,o));var a=t.substr(i).match(/([0-9]+)\]\./);if(a){var n=parseInt(a[1]);o[n]||(o[n]={})}i++}},flattenAttribute:function(e){return e=e.replace(/\[([^\]]+)\]\.{0,1}/g,"___$1___"),e=e.replace(/\./g,"___")},flattenObjectKeys:function(e){for(var t=[],i=[{object:e,prefix:null}];;){if(0===i.length)break;var r=i.pop(),o=r.prefix?r.prefix+".":"";if("object"==typeof r.object)for(var a in r.object){var n=o+a;t.push(n),i.push({object:r.object[a],prefix:n})}}return t},readAttribute:function(t,i){return e(i)(t)},writeAttribute:function(t,i,r){this.$createEmptyArrays(t,i),e(i).assign(t,r)}}}]);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(),i=[],r=0,o=!1,a=function(e,t){i.hasOwnProperty(e)||(i[e]=t,r--),n()},n=function(){0===r&&(o?t.reject(i):t.resolve(i))};return angular.forEach(e,function(e,t){r++,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",["formFor.templates"]),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(i,r,o,a){if(!i.attribute)return void e.error('Missing required field "attribute"');i.label=t.getLabel(o,i.attribute);r.find("input");i.toggle=function(){i.disable||i.model.disabled||(i.model.bindable=!i.model.bindable)},t.manageFieldRegistration(i,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,i,r,o){t.$watch("label",function(i){t.bindableLabel=e.trustAsHtml(i)}),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:"@?"}}}]),angular.module("formFor").directive("fieldLabel",["$sce","FormForConfiguration",function(e,t){return{restrict:"EA",templateUrl:"form-for/templates/field-label.html",scope:{help:"@?",label:"@",required:"@?"},controller:["$scope",function(i){i.$watch("label",function(t){i.bindableLabel=e.trustAsHtml(t)}),i.$watch("required",function(e){i.requiredLabel=i.$eval(e)?t.requiredLabel:null})}]}}]),angular.module("formFor").directive("formForDebounce",["$log","$timeout","FormForConfiguration",function(e,t,i){return{restrict:"A",require:"ngModel",priority:99,link:function(r,o,a,n){if("radio"===a.type||"checkbox"===a.type)return void e.warn("formForDebounce should only be used with <input type=text> and <textarea> elements");var l,u=a.formForDebounce,s=i.defaultDebounceDuration;void 0!==u&&("false"===u.toString()?s=!1:(u=parseInt(u),angular.isNumber(u)&&!isNaN(u)&&(s=u))),o.unbind("input"),s!==!1&&o.bind("input",function(){t.cancel(l),l=t(function(){r.$apply(function(){n.$setViewValue(o.val())})},s)}),o.bind("blur",function(){r.$apply(function(){n.$setViewValue(o.val())})}),r.$on("$destroy",function(){l&&t.cancel(l)})}}}]),angular.module("formFor").directive("formFor",["$injector","$parse","$q","$sce","FormForConfiguration","$FormForStateHelper","NestedObjectHelper","ModelValidator",function(e,t,i,r,o,a,n,l){return{require:"form",restrict:"A",scope:{controller:"=?",disable:"=?",formFor:"=",service:"@",submitComplete:"&?",submitError:"&?",submitWith:"&?",valid:"=?",validationFailed:"&?",validationRules:"=?"},controller:["$scope",function(o){o.collectionNameToErrorMap={},o.fieldNameToErrorMap={},o.fields={},o.collectionLabels={},o.buttons=[],o.service&&(o.$service=e.get(o.service)),o.$validationRules=o.$service?o.$service.validationRules:o.validationRules;var u=this;u.registerFormField=function(e){var i=n.flattenAttribute(e),r=(n.readAttribute(o.$validationRules,e),{bindableWrapper:{bindable:null,disabled:!1,error:null,required:l.isFieldRequired(e,o.$validationRules)},fieldName:e,unwatchers:[],validationAttribute:e.split("[")[0]});o.fields[i]=r;var a=t(e),u=a.assign;r.unwatchers.push(o.$watch("fields."+i+".bindableWrapper.bindable",function(e,t){e!==t&&u(o.formFor,e)}));var s;return r.unwatchers.push(o.$watch("formFor."+e,function(t,n){r.bindableWrapper.bindable=a(o.formFor),s?(void 0!==n||""!==t)&&o.formForStateHelper.setFieldHasBeenModified(i,void 0!==t):s=!0,o.$validationRules&&l.validateField(o.formFor,e,o.$validationRules).then(function(){o.formForStateHelper.setFieldError(i,null)},function(e){o.formForStateHelper.setFieldError(i,e)})})),r.bindableWrapper},this.unregisterFormField=function(e){var t=n.flattenAttribute(e);angular.forEach(o.fields[t].unwatchers,function(e){e()}),delete o.fields[t]},u.registerSubmitButton=function(){var e={disabled:!1};return o.buttons.push(e),e},u.registerCollectionLabel=function(e){var t=n.flattenAttribute(e),i={error:null,required:l.isCollectionRequired(e,o.$validationRules)};o.collectionLabels[t]=i;var r=!1;return o.$watch("formFor."+e+".length",function(){r?l.validateCollection(o.formFor,e,o.$validationRules).then(function(){o.formForStateHelper.setFieldError(t,null)},function(e){o.formForStateHelper.setFieldError(t,e)}):r=!0}),i},u.resetErrors=function(){o.formForStateHelper.setFormSubmitted(!1);var e=n.flattenObjectKeys(o.fieldNameToErrorMap);angular.forEach(e,function(){o.formForStateHelper.setFieldHasBeenModified(bindableFieldName,!1)})},u.validateForm=function(){o.updateCollectionErrors({}),o.updateFieldErrors({});var e,t;if(o.$validationRules){var r=[];angular.forEach(o.fields,function(e){r.push(e.fieldName)}),t=l.validateFields(o.formFor,r,o.$validationRules),t.then(angular.noop,o.updateFieldErrors),r=[],angular.forEach(o.collectionLabels,function(e,t){r.push(t)}),e=l.validateFields(o.formFor,r,o.$validationRules),e.then(angular.noop,o.updateCollectionErrors)}else e=i.resolve(),t=i.resolve();var a=i.defer();return i.waitForAll([e,t]).then(a.resolve,function(e){angular.isArray(e[0])&&0===e[0].length&&e.splice(0,1),a.reject(e)}),a.promise},o.controller=o.controller||{},angular.copy(u,o.controller),o.$watch("disable",function(e){angular.forEach(o.fields,function(t){t.bindableWrapper.disabled=e}),angular.forEach(o.buttons,function(t){t.disabled=e})}),o.formForStateHelper=new a(o),o.$watch("formForStateHelper.watchable",function(){var e=o.formForStateHelper.hasFormBeenSubmitted();angular.forEach(o.fields,function(t,i){if(e||o.formForStateHelper.hasFieldBeenModified(i)){var a=o.formForStateHelper.getFieldError(i);t.bindableWrapper.error=a?r.trustAsHtml(a):null}else t.bindableWrapper.error=null}),angular.forEach(o.collectionLabels,function(e,t){var i=o.formForStateHelper.getFieldError(t);e.error=i?r.trustAsHtml(i):null})}),o.updateCollectionErrors=function(e){angular.forEach(o.collectionLabels,function(t,i){var r=n.readAttribute(e,i);o.formForStateHelper.setFieldError(i,r)})},o.updateFieldErrors=function(e){angular.forEach(o.fields,function(t,i){var r=n.readAttribute(e,t.fieldName);o.formForStateHelper.setFieldError(i,r)})}}],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}):o.defaultSubmitComplete(t)},function(t){angular.isObject(t)&&(e.updateCollectionErrors(t),e.updateFieldErrors(t)),r.submitError?e.submitError({error:t}):o.defaultSubmitError(t)}),t["finally"](function(){e.disable=!1})},function(){e.disable=!1,r.validationFailed?e.validationFailed():o.defaultValidationFailed()}),!1})}}}]),angular.module("formFor").directive("radioField",["$log","FieldHelper",function(e,t){var i={};return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/radio-field.html",scope:{attribute:"@",disable:"=",help:"@?",value:"@"},link:function(r,o,a,n){if(!r.attribute)return void e.error('Missing required field "attribute"');if(!i[r.attribute]){var l={defaultScope:r,scopes:[]};t.manageFieldRegistration(r,n),i[r.attribute]=l}var u=i[r.attribute];u.scopes.push(r),r.label=t.getLabel(a,r.value);o.find("input");r.click=function(){r.disable||r.model.disabled||(r.model.bindable=r.value)},u.defaultScope.$watch("model",function(e){r.model=e}),u.defaultScope.$watch("disable",function(e){r.disable=e}),u.defaultScope.$watch("model.disabled",function(e){r.model&&(r.model.disabled=e)}),r.$watch("model.bindable",function(e){r.checked=void 0!==e&&null!==e&&void 0!==r.value&&null!==r.value&&e.toString()===r.value.toString()}),r.$on("$destroy",function(){u.scopes.splice(u.scopes.indexOf(r),1),0===u.scopes.length&&delete i[r.attribute]})}}}]),angular.module("formFor").directive("selectField",["$document","$log","$timeout","FieldHelper",function(e,t,i,r){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/select-field.html",scope:{attribute:"@",disable:"=",filter:"=?",filterDebounce:"@?",help:"@?",options:"=",placeholder:"@?"},link:function(o,a,n,l){if(!o.attribute)return void t.error('Missing required field "attribute"');o.allowBlank=n.hasOwnProperty("allowBlank"),o.enableFiltering=n.hasOwnProperty("enableFiltering"),o.labelAttribute=n.labelAttribute||"label",o.valueAttribute=n.valueAttribute||"value",o.label=r.getLabel(n,o.attribute),r.manageFieldRegistration(o,l),o.emptyOption={},o.filteredOptions=[];var u=function(e){return e&&e.toLowerCase()},s=function(){var e=o.options||[];if(o.filteredOptions.splice(0),o.enableFiltering&&o.filter){var t=u(o.filter);angular.forEach(e,function(e){var i=u(e[o.labelAttribute]).indexOf(t);i>=0&&o.filteredOptions.push(e)})}else angular.copy(e,o.filteredOptions);o.allowBlank&&o.filteredOptions.unshift(o.emptyOption)};o.$watch("filter",s),o.$watch("options.length",s);var d=function(){var e,t=o.selectedOption&&o.selectedOption[[o.valueAttribute]];return o.model.bindable===t?void(!o.allowBlank&&o.options&&o.options.length&&(o.model.bindable=o.options[0][o.valueAttribute])):(angular.forEach(o.options,function(t){t[o.valueAttribute]===o.model.bindable&&(e=t)}),o.selectedOption=e,void(o.selectedOptionLabel=e&&e[o.labelAttribute]))};o.$watch("model.bindable",d),o.$watch("options.length",d),o.$watch("model.bindable",function(e){for(var t,i=0;i<o.filteredOptions.length;i++){var r=o.filteredOptions[i];if(r[o.valueAttribute]===e){t=r;break}}o.selectedOption=t,o.selectedOptionLabel=t&&t[o.labelAttribute]});var c=function(e,t){i(function(){e.one("click",t)},1)},f=function(){e.off("click",p)},m=function(){c(a.find(".select-field-toggle-button"),g)};o.selectOption=function(e){o.model.bindable=e&&e[o.valueAttribute],o.isOpen=!1,f(),m()};var p=function(){o.isOpen=!1,o.$apply(),f(),m()},b=a.find(".list-group-container"),F=a.find(".list-group"),g=function(){if(o.disable||o.model.disabled)return void m();if(o.isOpen=!o.isOpen,o.isOpen){c(e,p);var t=o.model.bindable;i(angular.bind(this,function(){for(var e,i=F.find(".list-group-item"),r=0;r<i.length;r++){var a=i[r],n=$(a).scope().option;if(n&&n[o.valueAttribute]===t){e=a;break}}e&&b.scrollTop($(e).offset().top-$(e).parent().offset().top)}),1)}};m(),o.mouseOver=function(e){o.mouseOverIndex=e,o.mouseOverOption=e>=0?o.filteredOptions[e]:null},o.keyDown=function(e){switch(e.keyCode){case 27:o.isOpen=!1;break;case 13:o.selectOption(o.mouseOverOption),o.isOpen=!1,e.preventDefault(),e.stopPropagation();break;case 38:o.mouseOver(o.mouseOverIndex>0?o.mouseOverIndex-1:o.filteredOptions.length-1);break;case 40:o.mouseOver(o.mouseOverIndex<o.filteredOptions.length-1?o.mouseOverIndex+1:0)}},o.$watchCollection("[isOpen, filteredOptions.length]",function(){o.mouseOver(-1)}),o.$on("$destroy",function(){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,i,r,o){e.buttonClass=r.buttonClass,e.$watch("label",function(i){e.bindableLabel=t.trustAsHtml(i)}),e.model=o.registerSubmitButton(e)}}}]),angular.module("formFor").directive("textField",["$log","$timeout","FieldHelper",function(e,t,i){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/text-field.html",scope:{attribute:"@",debounce:"@?",disable:"=",focused:"&?",help:"@?",iconAfter:"@?",iconAfterClicked:"&?",iconBefore:"@?",iconBeforeClicked:"&?",placeholder:"@?"},link:function(r,o,a,n){return r.attribute?(r.label=i.getLabel(a,r.attribute),r.type=a.type||"text",r.multiline=a.hasOwnProperty("multiline")&&"false"!==a.multiline,a.hasOwnProperty("autofocus")&&t(function(){o.find(r.multiline?"textarea":"input").focus()}),r.onIconAfterClick=function(){a.hasOwnProperty("iconAfterClicked")&&r.iconAfterClicked()},r.onIconBeforeClick=function(){a.hasOwnProperty("iconBeforeClicked")&&r.iconBeforeClicked()},r.onFocus=function(){a.hasOwnProperty("focused")&&r.focused()},void i.manageFieldRegistration(r,n)):void e.error('Missing required field "attribute"')}}}]),angular.module("formFor").directive("typeAheadField",["$log","$filter","$timeout","FieldHelper","FormForConfiguration",function(e,t,i,r,o){return{require:"^formFor",restrict:"EA",templateUrl:"form-for/templates/type-ahead-field.html",scope:{attribute:"@",disable:"=",filter:"=?",help:"@?",options:"=",placeholder:"@?"},link:function(a,n,l,u){if(!a.attribute)return void e.error('Missing required field "attribute"');l.hasOwnProperty("autofocus")&&i(function(){n.find("input").focus()}),a.debounce=l.debounce||o.defaultDebounceDuration,a.labelAttribute=l.labelAttribute||"label",a.valueAttribute=l.valueAttribute||"value",a.filteredOptions=a.options||[],a.changeHandler=function(){a.filter=n.find("input").val()};var s=function(){var e=a.options||[],i={};i[a.labelAttribute]=a.filter,a.filteredOptions=t("filter")(e,i)};a.$watch("filter",s),a.$watch("options",s),a.label=r.getLabel(l,a.attribute),r.manageFieldRegistration(a,u);var d=function(){var e,t=a.model.selectedOption&&a.model.selectedOption[[a.valueAttribute]];a.model.bindable!==t&&(angular.forEach(a.options,function(t){t[a.valueAttribute]===a.model.bindable&&(e=t)}),a.model.selectedOption=e)};a.$watch("model.bindable",d),a.$watch("options",d);var c;a.$watch("model.selectedOption",function(e){return c?void(a.model.bindable=e&&e[a.valueAttribute]):void(c=!0)})}}}]),angular.module("formFor").service("FieldHelper",["FormForConfiguration","StringUtil",function(e,t){this.getLabel=function(i,r){return i.hasOwnProperty("label")?i.label:e.autoGenerateLabels?t.humanize(r):void 0},this.manageFieldRegistration=function(e,t){e.$watch("attribute",function(i,r){e.model&&t.unregisterFormField(r),e.model=t.registerFormField(e.attribute)}),e.$on("$destroy",function(){t.unregisterFormField(e.attribute)})}}]),angular.module("formFor").service("FormForConfiguration",function(){return{autoGenerateLabels:!1,defaultDebounceDuration:1e3,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").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.setFieldError=function(t,i){var r=e.flattenAttribute(t);e.writeAttribute(this.formScope.errorMap,t,i),i?this.shallowErrorMap[r]=i:delete this.shallowErrorMap[r],this.formScope.valid=this.isFormValid(),this.watchable++},t.prototype.setFieldHasBeenModified=function(t,i){e.writeAttribute(this.fieldNameToModificationMap,t,i),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,i,r){return this.$getRulesForFieldName=function(e,t){return t=t.replace(/\[[^\]]+\]/g,".collection.fields"),r.readAttribute(e,t)},this.isCollectionRequired=function(e,t){var i=this.$getRulesForFieldName(t,e);return i&&i.collection&&i.collection.min&&(angular.isObject(i.collection.min)?i.collection.min.rule:i.collection.min)},this.isFieldRequired=function(e,t){var i=this.$getRulesForFieldName(t,e);return i&&i.required&&(angular.isObject(i.required)?i.required.rule:i.required)},this.validateAll=function(e,t){var i=r.flattenObjectKeys(t);return this.validateFields(e,i,t)},this.validateFields=function(e,i,o){var a=t.defer(),n=[],l={};return angular.forEach(i,function(t){var i=this.$getRulesForFieldName(o,t);if(i){var a;a=i.collection?this.validateCollection(e,t,o):this.validateField(e,t,o),a.then(angular.noop,function(e){r.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=r.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(i.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(i.validationFailedForMaxCollectionSizeMessage)({num:c}))}}return t.resolve()},this.validateField=function(o,a,n){var l=this.$getRulesForFieldName(n,a),u=r.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:i.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(i.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(i.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:i.validationFailedForIntegerTypeMessage);if(f.indexOf("number")>=0&&!m.match(/^\-*[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:i.validationFailedForNumericTypeMessage);if(f.indexOf("negative")>=0&&!m.match(/^\-[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:i.validationFailedForNegativeTypeMessage);if(f.indexOf("positive")>=0&&!m.match(/^[0-9\.]+$/))return t.reject(angular.isObject(l.type)?l.type.message:i.validationFailedForPositiveTypeMessage);if(f.indexOf("email")>=0&&!m.match(/^[\w\.\+]+@\w+\.\w+$/))return t.reject(angular.isObject(l.type)?l.type.message:i.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?i.validationFailedForPatternMessage:l.pattern.message)}if(l.custom){var F=angular.isFunction(l.custom)?i.validationFailedForCustomMessage:l.custom.message,g=angular.isFunction(l.custom)?l.custom:l.custom.rule;try{var v=g(u,o)}catch(h){return t.reject(h.message||F)}return angular.isObject(v)&&angular.isFunction(v.then)?v.then(function(e){return t.resolve(e)},function(e){return t.reject(e||F)}):v?t.resolve(v):t.reject(F)}}return t.resolve()},this}]),angular.module("formFor").service("NestedObjectHelper",["$parse",function(e){return{$createEmptyArrays:function(e,t){for(var i=0;;){if(i=t.indexOf("[",i),0>i)break;var r=t.substr(0,i),o=this.readAttribute(e,r);o||(o=[],this.writeAttribute(e,r,o));var a=t.substr(i).match(/([0-9]+)\]\./);if(a){var n=parseInt(a[1]);o[n]||(o[n]={})}i++}},flattenAttribute:function(e){return e=e.replace(/\[([^\]]+)\]\.{0,1}/g,"___$1___"),e=e.replace(/\./g,"___")},flattenObjectKeys:function(e){for(var t=[],i=[{object:e,prefix:null}];;){if(0===i.length)break;var r=i.pop(),o=r.prefix?r.prefix+".":"";if("object"==typeof r.object)for(var a in r.object){var n=o+a;t.push(n),i.push({object:r.object[a],prefix:n})}}return t},readAttribute:function(t,i){return e(i)(t)},writeAttribute:function(t,i,r){this.$createEmptyArrays(t,i),e(i).assign(t,r)}}}]);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(),i=[],r=0,o=!1,a=function(e,t){i.hasOwnProperty(e)||(i[e]=t,r--),n()},n=function(){0===r&&(o?t.reject(i):t.resolve(i))};return angular.forEach(e,function(e,t){r++,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.2.6",
"version": "1.2.7",
"description": "Set of Angular directives to simplify creating and validating HTML forms.",

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

@@ -193,2 +193,4 @@ /**

});
delete $scope.fields[bindableFieldName];
};

@@ -195,0 +197,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

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

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