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 4.0.6 to 4.1.0

2

bower.json
{
"name": "angular-form-for",
"version": "4.0.6",
"version": "4.1.0",
"main": [

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

# Changelog
## 4.1.0
Added `labelClass` to each form elements as well as a global default `FormForConfiguration.setLabelClass`.
Also changed the behavior for pattern validations so that falsy values aren't validated.
## 4.0.6

@@ -4,0 +8,0 @@ Default help icon can be overidden with `FormForConfiguration.setHelpIcon`.

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

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 name=\"{{attribute}}\"\n type=\"checkbox\"\n tabindex=\"{{tabIndex}}\"\n ng-model=\"model.bindable\"\n ng-disabled=\"disable || model.disabled\"\n ng-change=\"changed()\">\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");
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 name=\"{{attribute}}\"\n type=\"checkbox\"\n tabindex=\"{{tabIndex}}\"\n ng-model=\"model.bindable\"\n ng-disabled=\"disable || model.disabled\"\n ng-change=\"changed()\">\n\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n uid=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n label-class=\"{{labelClass}}\"\n help=\"{{help}}\">\n </field-label>\n</div>\n");
$templateCache.put("form-for/templates/collection-label.html","<div class=\"collection-label\" ng-class=\"{\'text-danger\': 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\" ng-bind=\"model.error\"></small>\n</div>\n");
$templateCache.put("form-for/templates/field-error.html","<p ng-if=\"error\"\n id=\"{{uid}}\"\n class=\"text-danger\"\n ng-bind=\"error\">\n</p>\n");
$templateCache.put("form-for/templates/field-label.html","<label id=\"{{uid}}\"\n for=\"{{inputUid}}\">\n\n <span ng-bind-html=\"bindableLabel\"></span>\n\n <span ng-if=\"help\">\n <span ng-if=\"helpIcon\" class=\"{{helpIcon}}\"\n popover=\"{{help}}\"\n popover-trigger=\"mouseenter\"\n popover-placement=\"right\"></span>\n\n <span ng-if=\"!helpIcon\" class=\"fa fa-question-circle\"\n popover=\"{{help}}\"\n popover-trigger=\"mouseenter\"\n popover-placement=\"right\"></span>\n </span>\n\n <span class=\"label label-default\" ng-if=\"requiredLabel\" ng-bind=\"requiredLabel\"></span>\n</label>\n");
$templateCache.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-label ng-if=\"label\"\n uid=\"{{uid}}-label\"\n label=\"{{label}}\"\n help=\"{{help}}\">\n </field-label>\n\n <field-error ng-if=\"!hideErrorMessage\"\n error=\"model.error\"\n left-aligned=\"true\"\n uid=\"{{uid}}-error\">\n </field-error>\n\n <div ng-repeat=\"option in options track by $index\">\n <label>\n <input aria-manager\n id=\"{{uid}}-{{$index}}\"\n type=\"radio\"\n name=\"{{attribute}}\"\n tabindex=\"{{tabIndex}}\"\n ng-model=\"model.bindable\"\n ng-value=\"option[valueAttribute]\"\n ng-disabled=\"disable || model.disabled\">\n\n {{option[labelAttribute]}}\n </label>\n </div>\n</span>\n");
$templateCache.put("form-for/templates/select-field.html","<div class=\"form-group\"\n ng-class=\"{ \'disabled\': disable || model.disabled,\n \'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 <!-- Binding to the \'multiple\' attribute is not supported, even with ng-attr-multiple.\n This means that single and multiple select menus need to be defined separately.\n For ease of customization, they\'re also separated into their own partials. -->\n\n <span ng-if=\"multiple\"\n ng-include\n src=\"\'form-for/templates/select-field/_multi-select.html\'\"></span>\n\n <span ng-if=\"!multiple\"\n ng-include\n src=\"\'form-for/templates/select-field/_select.html\'\"></span>\n</div>\n");
$templateCache.put("form-for/templates/field-label.html","<label id=\"{{uid}}\"\n for=\"{{inputUid}}\"\n ng-class=\"[labelClass]\">\n\n <span ng-bind-html=\"bindableLabel\"></span>\n\n <span ng-if=\"help\">\n <span ng-if=\"helpIcon\" class=\"{{helpIcon}}\"\n popover=\"{{help}}\"\n popover-trigger=\"mouseenter\"\n popover-placement=\"right\"></span>\n\n <span ng-if=\"!helpIcon\" class=\"fa fa-question-circle\"\n popover=\"{{help}}\"\n popover-trigger=\"mouseenter\"\n popover-placement=\"right\"></span>\n </span>\n\n <span class=\"label label-default\" ng-if=\"requiredLabel\" ng-bind=\"requiredLabel\"></span>\n</label>\n");
$templateCache.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-label ng-if=\"label\"\n uid=\"{{uid}}-label\"\n label=\"{{label}}\"\n label-class=\"{{labelClass}}\"\n help=\"{{help}}\">\n </field-label>\n\n <field-error ng-if=\"!hideErrorMessage\"\n error=\"model.error\"\n left-aligned=\"true\"\n uid=\"{{uid}}-error\">\n </field-error>\n\n <div ng-repeat=\"option in options track by $index\">\n <label>\n <input aria-manager\n id=\"{{uid}}-{{$index}}\"\n type=\"radio\"\n name=\"{{attribute}}\"\n tabindex=\"{{tabIndex}}\"\n ng-model=\"model.bindable\"\n ng-value=\"option[valueAttribute]\"\n ng-disabled=\"disable || model.disabled\">\n\n {{option[labelAttribute]}}\n </label>\n </div>\n</span>\n");
$templateCache.put("form-for/templates/select-field.html","<div class=\"form-group\"\n ng-class=\"{ \'disabled\': disable || model.disabled,\n \'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 label-class=\"{{labelClass}}\"\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 <!-- Binding to the \'multiple\' attribute is not supported, even with ng-attr-multiple.\n This means that single and multiple select menus need to be defined separately.\n For ease of customization, they\'re also separated into their own partials. -->\n\n <span ng-if=\"multiple\"\n ng-include\n src=\"\'form-for/templates/select-field/_multi-select.html\'\"></span>\n\n <span ng-if=\"!multiple\"\n ng-include\n src=\"\'form-for/templates/select-field/_select.html\'\"></span>\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 aria-label=\"bindableLabel\"\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 <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/type-ahead-field.html","<div class=\"form-group\"\n ng-class=\"{ \'disabled\': disable || model.disabled,\n \'has-error\': model.error }\">\n\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid + \'-filter\'}}\"\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 <!-- Filtered dropdowns use a type-ahead style component -->\n <div class=\"input-group\">\n <input aria-manager\n id=\"{{model.uid}}-filter\"\n name=\"{{attribute}}\"\n class=\"form-control filter-text-input\"\n type=\"text\"\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n form-for-debounce=\"{{debounce}}\"\n ng-disabled=\"disable || model.disabled\"\n ng-model=\"scopeBuster.filter\"\n ng-click=\"filterTextClick($event)\"\n ng-focus=\"open()\"\n ng-keydown=\"keyDown($event)\">\n\n <ul ng-if=\"options.length\" class=\"dropdown-menu\" ng-class=\"{show: isOpen}\">\n <li ng-repeat=\"option in filteredOptions\"\n ng-class=\"{active: option === selectedOption || $index === mouseOverIndex}\">\n\n <a ng-bind=\"option[labelAttribute]\"\n ng-click=\"selectOption(option)\"\n ng-mouseenter=\"mouseOver($index)\">\n </a>\n </li>\n </ul>\n\n <span class=\"input-group-addon\" ng-click=\"setFilterFocus()\">\n <i class=\"caret\"></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 label-class=\"{{labelClass}}\"\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/type-ahead-field.html","<div class=\"form-group\"\n ng-class=\"{ \'disabled\': disable || model.disabled,\n \'has-error\': model.error }\">\n\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid + \'-filter\'}}\"\n iud=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n label-class=\"{{labelClass}}\"\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 <!-- Filtered dropdowns use a type-ahead style component -->\n <div class=\"input-group\">\n <input aria-manager\n id=\"{{model.uid}}-filter\"\n name=\"{{attribute}}\"\n class=\"form-control filter-text-input\"\n type=\"text\"\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n form-for-debounce=\"{{debounce}}\"\n ng-disabled=\"disable || model.disabled\"\n ng-model=\"scopeBuster.filter\"\n ng-click=\"filterTextClick($event)\"\n ng-focus=\"open()\"\n ng-keydown=\"keyDown($event)\">\n\n <ul ng-if=\"options.length\" class=\"dropdown-menu\" ng-class=\"{show: isOpen}\">\n <li ng-repeat=\"option in filteredOptions\"\n ng-class=\"{active: option === selectedOption || $index === mouseOverIndex}\">\n\n <a ng-bind=\"option[labelAttribute]\"\n ng-click=\"selectOption(option)\"\n ng-mouseenter=\"mouseOver($index)\">\n </a>\n </li>\n </ul>\n\n <span class=\"input-group-addon\" ng-click=\"setFilterFocus()\">\n <i class=\"caret\"></i>\n </span>\n </div>\n</div>\n");
$templateCache.put("form-for/templates/select-field/_multi-select.html","<select aria-manager multiple\n id=\"{{model.uid}}\"\n name=\"{{attribute}}\"\n class=\"form-control\"\n tabindex=\"{{tabIndex}}\"\n ng-disabled=\"disable || model.disabled\"\n ng-model=\"model.bindable\"\n ng-options=\"option[valueAttribute] as option[labelAttribute] for option in bindableOptions\">\n</select>");

@@ -11,0 +11,0 @@ $templateCache.put("form-for/templates/select-field/_select.html","<select aria-manager\n id=\"{{model.uid}}\"\n name=\"{{attribute}}\"\n class=\"form-control\"\n tabindex=\"{{tabIndex}}\"\n ng-disabled=\"disable || model.disabled\"\n ng-model=\"model.bindable\"\n ng-options=\"option[valueAttribute] as option[labelAttribute] for option in bindableOptions\">\n</select>");

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

angular.module("formFor.defaultTemplates", []).run(["$templateCache", function($templateCache) {$templateCache.put("form-for/templates/checkbox-field.html","<div class=\"form-for-field\" ng-class=\"{\'invalid\': model.error}\">\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 name=\"{{attribute}}\"\n type=\"checkbox\"\n tabindex=\"{{tabIndex}}\"\n ng-model=\"model.bindable\"\n ng-checked=\"checked\"\n ng-disabled=\"disable || model.disabled\"\n ng-change=\"changed()\">\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");
angular.module("formFor.defaultTemplates", []).run(["$templateCache", function($templateCache) {$templateCache.put("form-for/templates/checkbox-field.html","<div class=\"form-for-field\" ng-class=\"{\'invalid\': model.error}\">\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 name=\"{{attribute}}\"\n type=\"checkbox\"\n tabindex=\"{{tabIndex}}\"\n ng-model=\"model.bindable\"\n ng-checked=\"checked\"\n ng-disabled=\"disable || model.disabled\"\n ng-change=\"changed()\">\n\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n uid=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n label-class=\"{{labelClass}}\"\n help=\"{{help}}\">\n </field-label>\n</div>\n");
$templateCache.put("form-for/templates/collection-label.html","<div class=\"collection-label\">\n <field-label ng-if=\"label\"\n label=\"{{label}}\"\n help=\"{{help}}\"\n required=\"{{model.required}}\">\n </field-label>\n\n <small field-error error=\"model.error\" left-aligned=\"true\"></small>\n</div>\n");
$templateCache.put("form-for/templates/field-error.html","<p ng-if=\"error\"\n id=\"{{uid}}\"\n class=\"field-error\" ng-class=\"{\'left-aligned\': leftAligned}\"\n ng-bind=\"error\">\n</p>\n");
$templateCache.put("form-for/templates/field-label.html","<label id=\"{{uid}}\" for=\"{{inputUid}}\" class=\"field-label\">\n <span ng-bind-html=\"bindableLabel\"></span>\n\n <span ng-if=\"help\">\n <span ng-if=\"helpIcon\" class=\"{{helpIcon}}\"\n popover=\"{{help}}\"\n popover-trigger=\"mouseenter\"\n popover-placement=\"right\"></span>\n\n <span ng-if=\"!helpIcon\" class=\"form-for-tooltip\">\n <div class=\"form-for-tooltip-icon\">?</div>\n <div class=\"form-for-tooltip-popover\" ng-bind=\"help\"></div>\n </span>\n </span>\n\n <span ng-if=\"requiredLabel\" class=\"field-label-required-label\" ng-bind=\"requiredLabel\"></span>\n</label>\n");
$templateCache.put("form-for/templates/radio-field.html","<div class=\"form-for-field\" ng-class=\"{\'invalid\': model.error}\">\n <field-label ng-if=\"label\"\n input-uid=\"{{uid}}\"\n label=\"{{label}}\"\n help=\"{{help}}\">\n </field-label>\n\n <field-error error=\"model.error\"\n left-aligned=\"true\"\n uid=\"{{uid}}-error\">\n </field-error>\n\n <label ng-repeat=\"option in options track by $index\">\n <input aria-manager\n id=\"{{uid}}-{{$index}}\"\n type=\"radio\"\n name=\"{{attribute}}\"\n tabindex=\"{{tabIndex}}\"\n ng-model=\"model.bindable\"\n ng-value=\"option[valueAttribute]\"\n ng-disabled=\"disable || model.disabled\">\n\n <span>\n {{option[labelAttribute]}}\n </span>\n </label>\n</div>");
$templateCache.put("form-for/templates/select-field.html","<div class=\"form-for-field with-icon-after\" ng-class=\"{\'invalid\': model.error}\">\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 uid=\"{{model.uid}}-error\" error=\"model.error\"></field-error>\n\n <!-- Binding to the \'multiple\' attribute is not supported, even with ng-attr-multiple.\n This means that single and multiple select menus need to be defined separately.\n For ease of customization, they\'re also separated into their own partials. -->\n\n <span ng-if=\"multiple\"\n ng-include\n src=\"\'form-for/templates/select-field/_multi-select.html\'\"></span>\n\n <span ng-if=\"!multiple\"\n ng-include\n src=\"\'form-for/templates/select-field/_select.html\'\"></span>\n</div>\n");
$templateCache.put("form-for/templates/field-label.html","<label id=\"{{uid}}\" for=\"{{inputUid}}\" class=\"field-label\" ng-class=\"[labelClass]\">\n <span ng-bind-html=\"bindableLabel\"></span>\n\n <span ng-if=\"help\">\n <span ng-if=\"helpIcon\" class=\"{{helpIcon}}\"\n popover=\"{{help}}\"\n popover-trigger=\"mouseenter\"\n popover-placement=\"right\"></span>\n\n <span ng-if=\"!helpIcon\" class=\"form-for-tooltip\">\n <div class=\"form-for-tooltip-icon\">?</div>\n <div class=\"form-for-tooltip-popover\" ng-bind=\"help\"></div>\n </span>\n </span>\n\n <span ng-if=\"requiredLabel\" class=\"field-label-required-label\" ng-bind=\"requiredLabel\"></span>\n</label>\n");
$templateCache.put("form-for/templates/radio-field.html","<div class=\"form-for-field\" ng-class=\"{\'invalid\': model.error}\">\n <field-label ng-if=\"label\"\n input-uid=\"{{uid}}\"\n label=\"{{label}}\"\n label-class=\"{{labelClass}}\"\n help=\"{{help}}\">\n </field-label>\n\n <field-error error=\"model.error\"\n left-aligned=\"true\"\n uid=\"{{uid}}-error\">\n </field-error>\n\n <label ng-repeat=\"option in options track by $index\">\n <input aria-manager\n id=\"{{uid}}-{{$index}}\"\n type=\"radio\"\n name=\"{{attribute}}\"\n tabindex=\"{{tabIndex}}\"\n ng-model=\"model.bindable\"\n ng-value=\"option[valueAttribute]\"\n ng-disabled=\"disable || model.disabled\">\n\n <span>\n {{option[labelAttribute]}}\n </span>\n </label>\n</div>");
$templateCache.put("form-for/templates/select-field.html","<div class=\"form-for-field with-icon-after\" ng-class=\"{\'invalid\': model.error}\">\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n iud=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n label-class=\"{{labelClass}}\"\n help=\"{{help}}\"\n required=\"{{model.required}}\">\n </field-label>\n\n <field-error uid=\"{{model.uid}}-error\" error=\"model.error\"></field-error>\n\n <!-- Binding to the \'multiple\' attribute is not supported, even with ng-attr-multiple.\n This means that single and multiple select menus need to be defined separately.\n For ease of customization, they\'re also separated into their own partials. -->\n\n <span ng-if=\"multiple\"\n ng-include\n src=\"\'form-for/templates/select-field/_multi-select.html\'\"></span>\n\n <span ng-if=\"!multiple\"\n ng-include\n src=\"\'form-for/templates/select-field/_select.html\'\"></span>\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 aria-label=\"bindableLabel\"\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=\"form-for-field\" ng-class=\"{ \'invalid\': model.error, \'with-icon-after\': iconAfter, \'with-icon-before\': iconBefore }\">\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 uid=\"{{model.uid}}-error\" error=\"model.error\"></field-error>\n\n <!-- <input> and <textarea> rendered as partials to allow for easier overrides -->\n <span ng-if=\"!multiline\" ng-include src=\"\'form-for/templates/text-field/_input.html\'\"></span>\n <span ng-if=\"multiline\" ng-include src=\"\'form-for/templates/text-field/_textarea.html\'\"></span>\n\n <i class=\"form-for-input-icon-left\"\n ng-class=\"iconBefore\"\n ng-click=\"onIconBeforeClick()\"></i>\n\n <i class=\"form-for-input-icon-right\"\n ng-class=\"iconAfter\"\n ng-click=\"onIconAfterClick()\"></i>\n</div>\n");
$templateCache.put("form-for/templates/type-ahead-field.html","<div class=\"form-for-field with-icon-after\" ng-class=\"{\'invalid\': model.error}\">\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid + \'-filter\'}}\"\n iud=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n help=\"{{help}}\"\n required=\"{{model.required}}\">\n </field-label>\n\n <field-error uid=\"{{model.uid}}-error\" error=\"model.error\"></field-error>\n\n <!-- Filtered dropdowns use a type-ahead style component -->\n <input aria-manager\n id=\"{{model.uid}}-filter\"\n name=\"{{attribute}}\"\n type=\"search\"\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n form-for-debounce=\"{{debounce}}\"\n ng-disabled=\"disable || model.disabled\"\n ng-model=\"scopeBuster.filter\"\n ng-click=\"filterTextClick($event)\"\n ng-focus=\"open()\"\n ng-keydown=\"keyDown($event)\">\n\n <ul ng-if=\"options.length\">\n <li ng-repeat=\"option in filteredOptions\"\n ng-class=\"{ \'form-for-typeahead-list-item-active\': option === selectedOption,\n \'form-for-typeahead-list-item-hover\': $index === mouseOverIndex}\"\n ng-bind=\"option[labelAttribute]\"\n ng-mousedown=\"selectOption(option)\"\n ng-mouseenter=\"mouseOver($index)\">\n </li>\n </ul>\n\n <i class=\"form-for-input-icon-right fa fa-search\"\n ng-click=\"setFilterFocus()\"></i>\n</div>\n");
$templateCache.put("form-for/templates/text-field.html","<div class=\"form-for-field\" ng-class=\"{ \'invalid\': model.error, \'with-icon-after\': iconAfter, \'with-icon-before\': iconBefore }\">\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n iud=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n label-class=\"{{labelClass}}\"\n help=\"{{help}}\"\n required=\"{{model.required}}\">\n </field-label>\n\n <field-error uid=\"{{model.uid}}-error\" error=\"model.error\"></field-error>\n\n <!-- <input> and <textarea> rendered as partials to allow for easier overrides -->\n <span ng-if=\"!multiline\" ng-include src=\"\'form-for/templates/text-field/_input.html\'\"></span>\n <span ng-if=\"multiline\" ng-include src=\"\'form-for/templates/text-field/_textarea.html\'\"></span>\n\n <i class=\"form-for-input-icon-left\"\n ng-class=\"iconBefore\"\n ng-click=\"onIconBeforeClick()\"></i>\n\n <i class=\"form-for-input-icon-right\"\n ng-class=\"iconAfter\"\n ng-click=\"onIconAfterClick()\"></i>\n</div>\n");
$templateCache.put("form-for/templates/type-ahead-field.html","<div class=\"form-for-field with-icon-after\" ng-class=\"{\'invalid\': model.error}\">\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid + \'-filter\'}}\"\n iud=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n label-class=\"{{labelClass}}\"\n help=\"{{help}}\"\n required=\"{{model.required}}\">\n </field-label>\n\n <field-error uid=\"{{model.uid}}-error\" error=\"model.error\"></field-error>\n\n <!-- Filtered dropdowns use a type-ahead style component -->\n <input aria-manager\n id=\"{{model.uid}}-filter\"\n name=\"{{attribute}}\"\n type=\"search\"\n tabindex=\"{{tabIndex}}\"\n placeholder=\"{{placeholder}}\"\n form-for-debounce=\"{{debounce}}\"\n ng-disabled=\"disable || model.disabled\"\n ng-model=\"scopeBuster.filter\"\n ng-click=\"filterTextClick($event)\"\n ng-focus=\"open()\"\n ng-keydown=\"keyDown($event)\">\n\n <ul ng-if=\"options.length\">\n <li ng-repeat=\"option in filteredOptions\"\n ng-class=\"{ \'form-for-typeahead-list-item-active\': option === selectedOption,\n \'form-for-typeahead-list-item-hover\': $index === mouseOverIndex}\"\n ng-bind=\"option[labelAttribute]\"\n ng-mousedown=\"selectOption(option)\"\n ng-mouseenter=\"mouseOver($index)\">\n </li>\n </ul>\n\n <i class=\"form-for-input-icon-right fa fa-search\"\n ng-click=\"setFilterFocus()\"></i>\n</div>\n");
$templateCache.put("form-for/templates/select-field/_multi-select.html","<select aria-manager multiple\n id=\"{{model.uid}}\"\n name=\"{{attribute}}\"\n class=\"select-field-select\"\n tabindex=\"{{tabIndex}}\"\n ng-disabled=\"disable || model.disabled\"\n ng-model=\"model.bindable\"\n ng-options=\"option[valueAttribute] as option[labelAttribute] for option in bindableOptions\">\n</select>\n\n<i class=\"form-for-select-arrows\"></i>");

@@ -11,0 +11,0 @@ $templateCache.put("form-for/templates/select-field/_select.html","<select aria-manager\n id=\"{{model.uid}}\"\n name=\"{{attribute}}\"\n class=\"select-field-select\"\n tabindex=\"{{tabIndex}}\"\n ng-disabled=\"disable || model.disabled\"\n ng-model=\"model.bindable\"\n ng-options=\"option[valueAttribute] as option[labelAttribute] for option in bindableOptions\">\n</select>\n\n<i class=\"form-for-select-arrows\"></i>");

angular.module("formFor.materialTemplates", []).run(["$templateCache", function($templateCache) {$templateCache.put("form-for/templates/checkbox-field.html","<md-input-container>\n <md-checkbox class=\"md-primary\"\n aria-label=\"{{label}}\"\n ng-disabled=\"disable || model.disabled\"\n ng-model=\"model.bindable\">\n\n {{label}}\n </md-checkbox>\n\n <field-error error=\"model.error\"\n left-aligned=\"true\"\n uid=\"{{model.uid}}-error\">\n </field-error>\n</md-input-container>");
$templateCache.put("form-for/templates/collection-label.html","<div>\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\" ng-bind=\"model.error\"></small>\n</div>\n");
$templateCache.put("form-for/templates/field-error.html","<div ng-if=\"error\"\n id=\"{{uid}}\"\n class=\"text-danger\"\n ng-bind=\"error\"\n ng-message>\n</div>\n");
$templateCache.put("form-for/templates/field-label.html","<label ng-bind=\"label\">\n <md-tooltip ng-if=\"help\"\n md-direction=\"{{attributes.direction || \'right\'}}\">\n {{help}}\n </md-tooltip>\n</label>");
$templateCache.put("form-for/templates/radio-field.html","<md-radio-group ng-model=\"model.bindable\">\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 <md-radio-button ng-repeat=\"option in options\"\n ng-disabled=\"disable || model.disabled\"\n ng-value=\"option[valueAttribute]\"\n tabindex=\"{{tabIndex}}\">\n {{option[labelAttribute]}}\n </md-radio-button>\n\n <field-error ng-if=\"!hideErrorMessage\"\n error=\"model.error\"\n uid=\"{{uid}}-error\">\n </field-error>\n</md-radio-group>");
$templateCache.put("form-for/templates/field-label.html","<label ng-bind=\"label\" ng-class=\"[labelClass]\">\n <md-tooltip ng-if=\"help\"\n md-direction=\"{{attributes.direction || \'right\'}}\">\n {{help}}\n </md-tooltip>\n</label>");
$templateCache.put("form-for/templates/radio-field.html","<md-radio-group ng-model=\"model.bindable\">\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n iud=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n label-class=\"{{labelClass}}\"\n help=\"{{help}}\"\n required=\"{{model.required}}\">\n </field-label>\n\n <md-radio-button ng-repeat=\"option in options\"\n ng-disabled=\"disable || model.disabled\"\n ng-value=\"option[valueAttribute]\"\n tabindex=\"{{tabIndex}}\">\n {{option[labelAttribute]}}\n </md-radio-button>\n\n <field-error ng-if=\"!hideErrorMessage\"\n error=\"model.error\"\n uid=\"{{uid}}-error\">\n </field-error>\n</md-radio-group>");
$templateCache.put("form-for/templates/select-field.html","<div>\n <label ng-if=\"label\"\n ng-bind=\"label\"></label>\n\n <md-input-container>\n <md-select ng-if=\"multiple\"\n ng-model=\"model.bindable\"\n ng-disabled=\"disable || model.disabled\"\n placeholder=\"{{placeholder}}\"\n md-autoselect=\"!preventDefaultOption\"\n multiple>\n\n <md-option ng-repeat=\"option in bindableOptions\"\n ng-value=\"option[valueAttribute]\">\n {{option[labelAttribute]}}\n </md-option>\n </md-select>\n\n <md-select ng-if=\"!multiple\"\n ng-model=\"model.bindable\"\n ng-disabled=\"disable || model.disabled\"\n placeholder=\"{{placeholder}}\"\n md-autoselect=\"!preventDefaultOption\">\n\n <md-option ng-repeat=\"option in bindableOptions\"\n ng-value=\"option[valueAttribute]\">\n {{option[labelAttribute]}}\n </md-option>\n </md-select>\n\n <field-error error=\"model.error\"\n uid=\"{{model.uid}}-error\">\n </field-error>\n </md-input-container>\n</div>");
$templateCache.put("form-for/templates/submit-button.html","<md-button tabindex=\"{{tabIndex}}\"\n ng-bind-html=\"bindableLabel\"\n aria-label=\"bindableLabel\"\n ng-disabled=\"disable || model.disabled\">\n</md-button>");
$templateCache.put("form-for/templates/text-field.html","<md-input-container>\n <label ng-if=\"label\"\n ng-bind=\"label\"></label>\n\n <input ng-if=\"!multiline\"\n aria-manager\n id=\"{{model.uid}}\"\n name=\"{{attribute}}\"\n type=\"{{type}}\"\n tabindex=\"{{tabIndex}}\"\n ng-model=\"model.bindable\"\n ng-disabled=\"disable || model.disabled\"\n ng-click=\"onFocus()\"\n ng-blur=\"onBlur()\" />\n\n <textarea ng-if=\"multiline\"\n aria-manageraria-manager\n id=\"{{model.uid}}\"\n name=\"{{attribute}}\"\n class=\"form-control\"\n ng-disabled=\"disable || model.disabled\"\n tabindex=\"{{tabIndex}}\"\n rows=\"{{rows}}\"\n ng-model=\"model.bindable\"\n ng-click=\"onFocus()\"\n ng-blur=\"onBlur()\">\n </textarea>\n\n <field-error ng-messages\n uid=\"{{model.uid}}-error\"\n error=\"model.error\"></field-error>\n</md-input-container>");
$templateCache.put("form-for/templates/type-ahead-field.html","<span>\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 <md-autocomplete\n ng-disabled=\"disable || model.disabled\"\n md-selected-item=\"selectedOption\"\n md-search-text=\"scopeBuster.filter\"\n md-search-text-change=\"searchTextChange(scopeBuster.filter)\"\n md-selected-item-change=\"selectOption(option)\"\n md-items=\"option in filteredOptions\"\n md-item-text=\"option[labelAttribute]\"\n placeholder=\"{{placeholder}}\">\n\n <md-item-template>\n <span md-highlight-text=\"scopeBuster.filter\">\n {{option[labelAttribute]}}\n </span>\n </md-item-template>\n\n <md-not-found>\n No matches found for \"{{scopeBuster.filter}}\".\n </md-not-found>\n </md-autocomplete>\n\n <field-error error=\"model.error\"\n uid=\"{{model.uid}}-error\">\n </field-error>\n</span>");}]);
$templateCache.put("form-for/templates/type-ahead-field.html","<span>\n <field-label ng-if=\"label\"\n input-uid=\"{{model.uid}}\"\n iud=\"{{model.uid}}-label\"\n label=\"{{label}}\"\n label-class=\"{{labelClass}}\"\n help=\"{{help}}\"\n required=\"{{model.required}}\">\n </field-label>\n\n <md-autocomplete\n ng-disabled=\"disable || model.disabled\"\n md-selected-item=\"selectedOption\"\n md-search-text=\"scopeBuster.filter\"\n md-search-text-change=\"searchTextChange(scopeBuster.filter)\"\n md-selected-item-change=\"selectOption(option)\"\n md-items=\"option in filteredOptions\"\n md-item-text=\"option[labelAttribute]\"\n placeholder=\"{{placeholder}}\">\n\n <md-item-template>\n <span md-highlight-text=\"scopeBuster.filter\">\n {{option[labelAttribute]}}\n </span>\n </md-item-template>\n\n <md-not-found>\n No matches found for \"{{scopeBuster.filter}}\".\n </md-not-found>\n </md-autocomplete>\n\n <field-error error=\"model.error\"\n uid=\"{{model.uid}}-error\">\n </field-error>\n</span>");}]);

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

angular.module("formFor",[]);var formFor;!function(e){var t=function(){function e(){this.restrict="A"}return e.prototype.link=function(e,t,i){e.$watch("model.uid",function(e){i.$set("ariaDescribedby",e+"-error"),i.$set("ariaLabelledby",e+"-label")}),e.$watch("model.error",function(e){i.$set("ariaInvalid",!!e)})},e.prototype.link.$inject=["$scope","$element","$attributes"],e}();e.AriaManager=t,angular.module("formFor").directive("ariaManager",function(){return new t})}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function t(){this.autoGenerateLabels=!1,this.autoTrimValues=!1,this.defaultDebounceDuration=500,this.defaultSubmitComplete=angular.noop,this.defaultSubmitError=angular.noop,this.defaultValidationFailed=angular.noop,this.helpIcon=null,this.requiredLabel=null,this.validationFailedForCustomMessage_="Failed custom validation",this.validationFailedForEmailTypeMessage_="Invalid email format",this.validationFailedForIntegerTypeMessage_="Must be an integer",this.validationFailedForMaxCollectionSizeMessage_="Must be fewer than {{num}} items",this.validationFailedForMaximumMessage_="Must be no more than {{num}}",this.validationFailedForMaxLengthMessage_="Must be fewer than {{num}} characters",this.validationFailedForMinimumMessage_="Must be at least {{num}}",this.validationFailedForMinCollectionSizeMessage_="Must at least {{num}} items",this.validationFailedForMinLengthMessage_="Must be at least {{num}} characters",this.validationFailedForNegativeTypeMessage_="Must be negative",this.validationFailedForNonNegativeTypeMessage_="Must be non-negative",this.validationFailedForNumericTypeMessage_="Must be numeric",this.validationFailedForPatternMessage_="Invalid format",this.validationFailedForPositiveTypeMessage_="Must be positive",this.validationFailedForRequiredMessage_="Required field"}return t.prototype.disableAutoLabels=function(){this.autoGenerateLabels=!1},t.prototype.enableAutoLabels=function(){this.autoGenerateLabels=!0},t.prototype.disableAutoTrimValues=function(){this.autoTrimValues=!1},t.prototype.enableAutoTrimValues=function(){this.autoTrimValues=!0},t.prototype.getFailedValidationMessage=function(t){switch(t){case e.ValidationFailureType.CUSTOM:return this.validationFailedForCustomMessage_;case e.ValidationFailureType.COLLECTION_MAX_SIZE:return this.validationFailedForMaxCollectionSizeMessage_;case e.ValidationFailureType.COLLECTION_MIN_SIZE:return this.validationFailedForMinCollectionSizeMessage_;case e.ValidationFailureType.MINIMUM:return this.validationFailedForMinimumMessage_;case e.ValidationFailureType.MAX_LENGTH:return this.validationFailedForMaxLengthMessage_;case e.ValidationFailureType.MAXIMUM:return this.validationFailedForMaximumMessage_;case e.ValidationFailureType.MIN_LENGTH:return this.validationFailedForMinLengthMessage_;case e.ValidationFailureType.PATTERN:return this.validationFailedForPatternMessage_;case e.ValidationFailureType.REQUIRED:return this.validationFailedForRequiredMessage_;case e.ValidationFailureType.TYPE_EMAIL:return this.validationFailedForEmailTypeMessage_;case e.ValidationFailureType.TYPE_INTEGER:return this.validationFailedForIntegerTypeMessage_;case e.ValidationFailureType.TYPE_NEGATIVE:return this.validationFailedForNegativeTypeMessage_;case e.ValidationFailureType.TYPE_NON_NEGATIVE:return this.validationFailedForNonNegativeTypeMessage_;case e.ValidationFailureType.TYPE_NUMERIC:return this.validationFailedForNumericTypeMessage_;case e.ValidationFailureType.TYPE_POSITIVE:return this.validationFailedForPositiveTypeMessage_}},t.prototype.setDefaultDebounceDuration=function(e){this.defaultDebounceDuration=e},t.prototype.setDefaultSubmitComplete=function(e){this.defaultSubmitComplete=e},t.prototype.setDefaultSubmitError=function(e){this.defaultSubmitError=e},t.prototype.setDefaultValidationFailed=function(e){this.defaultValidationFailed=e},t.prototype.setHelpIcon=function(e){this.helpIcon=e},t.prototype.setRequiredLabel=function(e){this.requiredLabel=e},t.prototype.setValidationFailedForCustomMessage=function(e){this.validationFailedForCustomMessage_=e},t.prototype.setValidationFailedForMaxCollectionSizeMessage=function(e){this.validationFailedForMaxCollectionSizeMessage_=e},t.prototype.setValidationFailedForMaximumMessage=function(e){this.validationFailedForMaximumMessage_=e},t.prototype.setValidationFailedForMaxLengthMessage=function(e){this.validationFailedForMaxLengthMessage_=e},t.prototype.setValidationFailedForMinCollectionSizeMessage=function(e){this.validationFailedForMaxCollectionSizeMessage_=e},t.prototype.setValidationFailedForMinimumMessage=function(e){this.validationFailedForMinimumMessage_=e},t.prototype.setValidationFailedForMinLengthMessage=function(e){this.validationFailedForMinLengthMessage_=e},t.prototype.setValidationFailedForPatternMessage=function(e){this.validationFailedForPatternMessage_=e},t.prototype.setValidationFailedForRequiredMessage=function(e){this.validationFailedForRequiredMessage_=e},t.prototype.setValidationFailedForEmailTypeMessage=function(e){this.validationFailedForEmailTypeMessage_=e},t.prototype.setValidationFailedForIntegerTypeMessage=function(e){this.validationFailedForIntegerTypeMessage_=e},t.prototype.setValidationFailedForNegativeTypeMessage=function(e){this.validationFailedForNegativeTypeMessage_=e},t.prototype.setValidationFailedForNonNegativeTypeMessage=function(e){this.validationFailedForNonNegativeTypeMessage_=e},t.prototype.setValidationFailedForNumericTypeMessage=function(e){this.validationFailedForNumericTypeMessage_=e},t.prototype.setValidationFailedForPositiveTypeMessage=function(e){this.validationFailedForPositiveTypeMessage_=e},t}();e.FormForConfiguration=t,angular.module("formFor").service("FormForConfiguration",function(){return new t})}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function t(e){this.formForConfiguration_=e}return t.prototype.manageLabel=function(t,i,r){i.hasOwnProperty("label")&&i.$observe("label",function(e){t.label=e}),this.formForConfiguration_.autoGenerateLabels&&(t.label=e.StringUtil.humanize(r?t.value:t.attribute))},t.prototype.manageFieldRegistration=function(e,t,i){e.$watch("attribute",function(r,o){e.model&&i.unregisterFormField(o),e.model=i.registerFormField(e.attribute),t.uid&&(e.model.uid=t.uid)}),e.$on("$destroy",function(){i.unregisterFormField(e.attribute)})},t}();e.FieldHelper=t,angular.module("formFor").service("FieldHelper",["FormForConfiguration",function(e){return new t(e)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r=function(){function e(e,r){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/checkbox-field.html",this.scope={attribute:"@",disable:"=",help:"@?",changed:"@?"},t=e,i=r}return e.$inject=["$log","fieldHelper"],e.prototype.link=function(e,r,o,n){return e.attribute?(e.tabIndex=o.tabIndex||0,e.toggle=function(){e.disable||e.model.disabled||(e.model.bindable=!e.model.bindable)},i.manageLabel(e,o,!1),void i.manageFieldRegistration(e,o,n)):void t.error('Missing required field "attribute"')},e.prototype.link.$inject=["$scope","$element","$attributes","formForController"],e}();e.CheckboxFieldDirective=r,angular.module("formFor").directive("checkboxField",["$log","FieldHelper",function(e,t){return new r(e,t)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i=function(){function e(e){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/collection-label.html",this.scope={attribute:"@",help:"@?",label:"@"},t=e}return e.$inject=["$sce"],e.prototype.link=function(e,i,r,o){e.$watch("label",function(i){e.bindableLabel=t.trustAsHtml(i)}),e.model=o.registerCollectionLabel(e.attribute)},e.prototype.link.$inject=["$scope","$element","$attributes","formForController"],e}();e.CollectionLabelDirective=i,angular.module("formFor").directive("collectionLabel",["$sce",function(e){return new i(e)}])}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(){this.restrict="EA",this.templateUrl="form-for/templates/field-error.html",this.scope={error:"=",leftAligned:"@?",uid:"@"}}return e.prototype.link=function(){},e.prototype.link.$inject=["$scope"],e}();e.FieldErrorDirective=t,angular.module("formFor").directive("fieldError",function(){return new t})}(formFor||(formFor={}));var formFor;!function(e){var t,i,r=function(){function e(e,r){this.replace=!0,this.restrict="EA",this.templateUrl="form-for/templates/field-label.html",this.scope={inputUid:"@",help:"@?",label:"@",required:"@?",uid:"@"},t=e,i=r}return e.$inject=["$sce","formForConfiguration"],e.prototype.link=function(e,r,o){e.attributes=o,e.helpIcon=i.helpIcon,e.$watch("label",function(i){e.bindableLabel=t.trustAsHtml(i)}),e.$watch("required",function(t){e.requiredLabel=e.$eval(t)?i.requiredLabel:null})},e.prototype.link.$inject=["$scope","$element","$attributes"],e}();e.FieldLabelDirective=r,angular.module("formFor").directive("fieldLabel",["$sce","FormForConfiguration",function(e,t){return new r(e,t)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r=function(){function r(r,o){this.require="formFor",this.restrict="A",t=r,i=new e.NestedObjectHelper(o)}return r.$inject=["$compile","$parse"],r.prototype.link=function(r,o,n,a){var l;n.formForBuilder?l=r.$eval(n.formForBuilder):n.validationRules?l=r.$eval(n.validationRules):n.$service&&(l=r.$eval(n.$service.validationRules));for(var s=i.flattenObjectKeys(l),u="",d=0,c=s.length;c>d;d++){var f=s[d],p=i.readAttribute(l,f);if(p&&p.hasOwnProperty("inputType")){var m,F=p.help||"",h=p.label||"",b="",v=p.uid||"",g=h?'label="'+h+'"':"";switch(p.hasOwnProperty("placeholder")&&(b='placeholder="'+p.placeholder+'"'),p.inputType){case e.BuilderFieldType.CHECKBOX:u+='<checkbox-field attribute="'+f+'"\n help="'+F+'"\n '+g+'\n uid="'+v+'">\n </checkbox-field>';break;case e.BuilderFieldType.RADIO:m=JSON.stringify(p.values).replace(/"/g,"&quot;"),u+='<radio-field attribute="'+f+'"\n '+g+'\n options="'+m+'"\n uid="'+v+'">\n </radio-field>';break;case e.BuilderFieldType.SELECT:m=JSON.stringify(p.values).replace(/"/g,"&quot;"),u+='<select-field attribute="'+f+'"\n '+(p.allowBlank?"allow-blank":"")+"\n "+(p.enableFiltering?"enable-filtering":"")+'\n help="'+F+'"\n '+g+'\n multiple="'+!!p.multipleSelection+'"\n options="'+m+'"\n '+b+'\n uid="'+v+'"\n value-attribute="'+(p.valueAttribute||"")+'">\n </select-field>';break;case e.BuilderFieldType.NUMBER:case e.BuilderFieldType.PASSWORD:case e.BuilderFieldType.TEXT:var b;p.hasOwnProperty("placeholder")&&(b='placeholder="'+p.placeholder+'"'),u+='<text-field attribute="'+f+'"\n '+g+'\n help="'+F+'"\n ng-attr-multiline="'+!!p.multiline+'"\n '+b+'\n rows="'+(p.rows||"")+'"\n type="'+p.inputType+'"\n uid="'+v+'">\n </text-field>'}}}0===o.find("input[type=button], button, submit-button").length&&(u+='<submit-button label="Submit"></submit-button>');var y=t(u),_=y(r,void 0,{transcludeControllers:a});o.prepend(_)},r.prototype.link.$inject=["$scope","$element","$attributes","formForController"],r}();e.FormForBuilderDirective=r,angular.module("formFor").directive("formForBuilder",["$compile","$parse",function(e,t){return new r(e,t)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r,o,n=function(){function e(e,n,a,l){this.priority=99,this.require="ngModel",this.restrict="A",this.scope={formForDebounce:"@"},t=e,i=n,r=a,o=l}return e.$inject=["$log","$sniffer","$timeout","formForConfiguration"],e.prototype.link=function(e,n,a,l){if("radio"===a.type||"checkbox"===a.type)return void t.warn("formForDebounce should only be used with <input type=text> and <textarea> elements");var s=a.formForDebounce,u=o.defaultDebounceDuration;void 0!==s&&("false"===s.toString()?u=!1:(s=parseInt(s),angular.isNumber(s)&&!isNaN(s)&&(u=s))),i.hasEvent("input")?n.off("input"):(n.off("keydown"),i.hasEvent("paste")&&n.off("paste"));var d;if(u!==!1){var c=function(){r.cancel(d),d=r(function(){e.$apply(function(){l.$setViewValue(n.val())})},u)};i.hasEvent("input")?n.on("input",c):(n.on("keydown",c),i.hasEvent("paste")&&n.on("paste",c))}n.on("blur",function(){e.$apply(function(){l.$setViewValue(n.val())})}),e.$on("$destroy",function(){d&&r.cancel(d)})},e.prototype.link.$inject=["$scope","$element","$attributes","ngModelController"],e}();e.FormForDebounceDirective=n,angular.module("formFor").directive("formForDebounce",["$log","$sniffer","$timeout","FormForConfiguration",function(e,t,i,r){return new n(e,t,i,r)}])}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(e){this.$parse_=e}return e.prototype.flattenAttribute=function(e){return e.replace(/\[([^\]]+)\]\.{0,1}/g,"___$1___").replace(/\./g,"___")},e.prototype.flattenObjectKeys=function(e){for(var t=[],i=[{object:e,prefix:null}];;){if(0===i.length)break;var r=i.pop(),o=Array.isArray(r.object),n=r.prefix?r.prefix+(o?"[":"."):"",a=o?"]":"";if("object"==typeof r.object)for(var l in r.object){var s=n+l+a,u=r.object[l];t.push(s),i.push({object:u,prefix:s})}}return t},e.prototype.readAttribute=function(e,t){return this.$parse_(t)(e)},e.prototype.writeAttribute=function(e,t,i){this.initializeArraysAndObjectsForParse_(e,t),this.$parse_(t).assign(e,i)},e.prototype.initializeArraysAndObjectsForParse_=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 n=t.substr(i).match(/([0-9]+)\]\./);if(n){var a=parseInt(n[1]);o[a]||(o[a]={})}i++}},e}();e.NestedObjectHelper=t}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(e){this.$q_=e}return e.prototype.all=function(e){return this.$q_.all(e)},e.prototype.defer=function(){return this.$q_.defer()},e.prototype.resolve=function(e){var t=this.$q_.defer();return t.resolve(e),t.promise},e.prototype.reject=function(e){return this.$q_.reject(e)},e.prototype.waitForAll=function(e){function t(e,t){o.hasOwnProperty(e)||(o[e]=t,n--),i()}function i(){0===n&&(a?r.reject(o):r.resolve(o))}var r=this.$q_.defer(),o={},n=0,a=!1;return angular.forEach(e,function(e,i){n++,e.then(function(e){t(i,e)},function(e){a=!0,t(i,e)})}),i(),r.promise},e.prototype.when=function(e){return this.$q_.when(e)},e}();e.PromiseUtils=t}(formFor||(formFor={}));var formFor;!function(e){function t(t,i,r,o,n,a){var l=new e.NestedObjectHelper(i),s=new e.PromiseUtils(r);return t.registerCollectionLabel=function(e){var t=l.flattenAttribute(e),i={error:null,required:n.isCollectionRequired(e,o.$validationRuleset)};o.collectionLabels[t]=i;var r=!1;return o.$watch("formFor."+e+".length",function(){r?o.validateOn&&"change"!==o.validateOn||n.validateCollection(o.formFor,e,o.$validationRuleset).then(function(){o.formForStateHelper.setFieldError(t,null)},function(e){o.formForStateHelper.setFieldError(t,e)}):r=!0}),i},t.registerFormField=function(r){if(!r)throw Error('Invalid field name "'+r+'" provided.');var s=l.flattenAttribute(r);if(o.fields.hasOwnProperty(s))throw Error('Field "'+r+'" has already been registered. Field names must be unique.');var u={bindable:null,disabled:o.disable,error:null,pristine:!0,required:n.isFieldRequired(r,o.$validationRuleset),uid:e.FormForGUID.create()},d={bindableWrapper:u,fieldName:r,formForStateHelper:o.formForStateHelper,unwatchers:[]};o.fields[s]=d;var c=i(r),f=c.assign;d.unwatchers.push(o.$watch("fields."+s+".bindableWrapper.bindable",function(e,t){(e||e!=t)&&(a.autoTrimValues&&"string"==typeof e&&(e=e.trim()),f(o.formFor,e))}));var p;return d.unwatchers.push(o.$watch("formFor."+r,function(e,i){(e!==d.bindableWrapper.bindable||void 0===i&&""===e||void 0===e)&&(p=!1),d.bindableWrapper.bindable=e,o.validateOn&&"change"!==o.validateOn||t.validateField(r),p||(p=!0,o.formForStateHelper.setFieldHasBeenModified(s,!1)),d.bindableWrapper.pristine=!o.formForStateHelper.hasFieldBeenModified(s)})),u},t.registerSubmitButton=function(){var e={disabled:!1};return o.buttons.push(e),e},t.resetErrors=function(){for(var e in o.fields)o.formForStateHelper.getFieldError(e)&&(o.formForStateHelper.setFieldHasBeenModified(e,!1),o.fields[e].bindableWrapper.pristine=!0);o.formForStateHelper.setFormSubmitted(!1),o.formForStateHelper.resetFieldErrors()},t.resetField=function(e){var t=l.flattenAttribute(e);o.formForStateHelper.getFieldError(t)&&(o.formForStateHelper.setFieldHasBeenModified(t,!1),o.fields[t].bindableWrapper.pristine=!0),o.formForStateHelper.setFieldError(t,null)},t.resetFields=function(){t.resetErrors()},t.setFieldError=function(e,t){var i=l.flattenAttribute(e);o.formForStateHelper.setFieldHasBeenModified(i,!0),o.formForStateHelper.setFieldError(i,t)},t.unregisterFormField=function(e){var t=l.flattenAttribute(e);angular.forEach(o.fields[t].unwatchers,function(e){e()}),delete o.fields[t]},t.updateCollectionErrors=function(e){angular.forEach(o.collectionLabels,function(t,i){var r=l.readAttribute(e,i);o.formForStateHelper.setFieldError(i,r)})},t.updateFieldErrors=function(e){angular.forEach(o.fields,function(t,i){var r=l.readAttribute(e,t.fieldName);o.formForStateHelper.setFieldError(i,r)})},t.validateField=function(e){var t=l.flattenAttribute(e);o.formForStateHelper.setFieldHasBeenModified(t,!0),o.$validationRuleset&&n.validateField(o.formFor,e,o.$validationRuleset).then(function(){o.formForStateHelper.setFieldError(t,null)},function(e){o.formForStateHelper.setFieldError(t,e)})},t.validateForm=function(e){t.updateCollectionErrors({}),t.updateFieldErrors({});var i,r;if(o.$validationRuleset){var a=[];angular.forEach(o.fields,function(e){a.push(e.fieldName)}),r=n.validateFields(o.formFor,a,o.$validationRuleset),r.then(angular.noop,t.updateFieldErrors),a=[],angular.forEach(o.collectionLabels,function(e,t){a.push(t)}),i=n.validateFields(o.formFor,a,o.$validationRuleset),i.then(angular.noop,t.updateCollectionErrors)}else i=s.resolve(),r=s.resolve();var u=s.defer();return s.waitForAll([i,r]).then(u.resolve,function(t){angular.isArray(t[0])&&0===t[0].length&&t.splice(0,1),e&&angular.forEach(t,function(e){var t=l.flattenObjectKeys(e);angular.forEach(t,function(t){var i=l.readAttribute(e,t);if(i){var r=l.flattenAttribute(t);o.formForStateHelper.setFieldHasBeenModified(r,!0)}})}),u.reject(t)}),u.promise},t}e.createFormForController=t}(formFor||(formFor={}));var formFor;!function(e){var t,i,r,o,n,a,l,s=function(){function s(s){this.require="form",this.restrict="A",this.scope={controller:"=?",disable:"=?",formFor:"=",service:"@",submitComplete:"&?",submitError:"&?",submitWith:"&?",valid:"=?",validateOn:"=?",validationFailed:"&?",validationRules:"=?"},t=s,i=s.get("$log"),r=s.get("$parse"),o=s.get("$sce"),n=s.get("FormForConfiguration"),a=s.get("ModelValidator"),l=new e.PromiseUtils(s.get("$q"))}return s.$inject=["$injector"],s.prototype.controller=function(s){s.formFor||i.error('The form data object specified by <form form-for=""> is null or undefined.'),s.fields={},s.collectionLabels={},s.buttons=[],s.controller=s.controller||{},s.service&&(s.$service=t.get(s.service)),s.validationRules?s.$validationRuleset=s.validationRules:s.$service&&(s.$validationRuleset=s.$service.validationRules),e.createFormForController(this,r,l,s,a,n),s.controller&&angular.copy(this,s.controller),s.$watch("disable",function(e){angular.forEach(s.fields,function(t){t.bindableWrapper.disabled=e}),angular.forEach(s.buttons,function(t){t.disabled=e})}),s.formForStateHelper=new e.FormForStateHelper(r,s),s.$watch("formForStateHelper.watchable",function(){var e=s.formForStateHelper.hasFormBeenSubmitted();angular.forEach(s.fields,function(t,i){if(e||s.formForStateHelper.hasFieldBeenModified(i)){var r=s.formForStateHelper.getFieldError(i);t.bindableWrapper.error=r?o.trustAsHtml(r):null}else t.bindableWrapper.error=null}),angular.forEach(s.collectionLabels,function(e,t){var i=s.formForStateHelper.getFieldError(t);e.error=i?o.trustAsHtml(i):null})})},s.prototype.controller.$inject=["$scope"],s.prototype.link=function(e,t,i){t.on("submit",function(){e.formForStateHelper.setFormSubmitted(!0),e.disable=!0;var t;return t="manual"===e.validateOn?l.resolve():e.controller.validateForm(),t.then(function(){var t;t=i.submitWith?e.submitWith({data:e.formFor}):e.$service&&e.$service.submit?e.$service.submit(e.formFor):l.reject("No submit function provided"),t||(t=l.reject("Submit function did not return a promise")),t.then(function(t){i.submitComplete?e.submitComplete({data:t}):n.defaultSubmitComplete(t)},function(t){angular.isObject(t)&&"manual"!==e.validateOn&&(e.controller.updateCollectionErrors(t),e.controller.updateFieldErrors(t)),i.submitError?e.submitError({error:t}):n.defaultSubmitError(t)}),t["finally"](function(){e.disable=!1})},function(t){e.disable=!1,i.validationFailed?e.validationFailed():n.defaultValidationFailed(t)}),!1})},s.prototype.link.$inject=["$scope","$element","$attributes"],s}();e.FormForDirective=s,angular.module("formFor").directive("formFor",["$injector",function(e){return new s(e)}])}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(){}return e.create=function(){return("0000"+(Math.random()*Math.pow(36,4)<<0).toString(36)).slice(-4)},e}();e.FormForGUID=t}(formFor||(formFor={}));var formFor;!function(e){var t,i,r=function(){function r(r,o){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/radio-field.html",this.scope={attribute:"@",disable:"=",help:"@?",options:"=",value:"@"},i=new e.FieldHelper(o),t=r}return r.$inject=["$log","FormForConfiguration"],r.prototype.link=function(r,o,n,a){return r.attribute?(r.labelAttribute=n.labelAttribute||"label",r.valueAttribute=n.valueAttribute||"value",i.manageFieldRegistration(r,n,a),r.uid=n.uid||e.FormForGUID.create(),i.manageLabel(r,n,!0),r.tabIndex=n.tabIndex||0,r.click=function(){!r.disable&&!r.model.disabled},r.$watch("model",function(e){r.model=e}),r.$watch("disable",function(e){r.disable=e}),void r.$watch("model.disabled",function(e){r.model&&(r.model.disabled=e)})):void t.error('Missing required field "attribute"')},r.prototype.link.$inject=["$scope","$element","$attributes","formForController"],r}();e.RadioFieldDirective=r,angular.module("formFor").directive("radioField",["$log","FormForConfiguration",function(e,t){return new r(e,t)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r,o,n=10,a=function(){function e(e,n,a,l){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/select-field.html",this.scope={attribute:"@",disable:"=",help:"@?",multiple:"=?",options:"="},t=e,i=n,r=a,o=l}return e.$inject=["$document","$log","$timeout","fieldHelper"],e.prototype.link=function(e,a,l,s){if(!e.attribute)return void i.error('Missing required field "attribute"');e.allowBlank=l.hasOwnProperty("allowBlank"),e.preventDefaultOption=l.hasOwnProperty("preventDefaultOption"),e.labelAttribute=l.labelAttribute||"label",e.valueAttribute=l.valueAttribute||"value",e.placeholder=l.hasOwnProperty("placeholder")?l.placeholder:"Select",e.tabIndex=l.tabIndex||0,e.scopeBuster={},o.manageLabel(e,l,!1),o.manageFieldRegistration(e,l,s),e.close=function(){r(function(){e.isOpen=!1})},e.open=function(){e.disable||e.model.disabled||r(function(){e.isOpen=!0})},e.bindableOptions=[],e.emptyOption={},e.emptyOption[e.labelAttribute]=e.placeholder,e.emptyOption[e.valueAttribute]=void 0,e.selectOption=function(t){e.model.bindable=t&&t[e.valueAttribute]};var u=function(){var t=e.options&&e.options.length;e.model.bindable||e.allowBlank||e.preventDefaultOption||!t||e.selectOption(e.options[0]),(null===e.model.bindable||void 0===e.model.bindable||""===e.model.bindable)&&(e.model.bindable=void 0),e.bindableOptions.splice(0),(!e.model.bindable||e.allowBlank)&&e.bindableOptions.push(e.emptyOption),e.bindableOptions.push.apply(e.bindableOptions,e.options),e.model.bindable&&(e.emptyOption[e.labelAttribute]="")};r(function(){e.$watch("model.bindable",u),e.$watch("options.length",u)});var d,c=function(){e.close()};e.$watch("isOpen",function(){d&&r.cancel(d),d=r(function(){d=null,e.isOpen?t.on("click",c):t.off("click",c)},n)}),e.$on("$destroy",function(){t.off("click",c)}),e.mouseOver=function(t){e.mouseOverIndex=t,e.mouseOverOption=t>=0?e.options[t]:null},e.keyDown=function(t){switch(t.keyCode){case 27:e.close();break;case 13:e.isOpen?(e.selectOption(e.mouseOverOption),e.close()):e.open(),t.preventDefault();break;case 38:e.isOpen?e.mouseOver(e.mouseOverIndex>0?e.mouseOverIndex-1:e.options.length-1):e.open();break;case 40:e.isOpen?e.mouseOver(e.mouseOverIndex<e.options.length-1?e.mouseOverIndex+1:0):e.open();break;case 9:case 16:e.close();break;default:e.open()}}},e.prototype.link.$inject=["$scope","$element","$attributes","formForController"],e}();e.SelectFieldDirective=a,angular.module("formFor").directive("selectField",["$document","$log","$timeout","FieldHelper",function(e,t,i,r){return new a(e,t,i,r)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i=function(){function e(e){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/submit-button.html",this.scope={disable:"=",icon:"@",label:"@"},t=e}return e.$inject=["$sce"],e.prototype.link=function(e,i,r,o){e.buttonClass=r.buttonClass,e.tabIndex=r.tabIndex||0,e.$watch("label",function(i){e.bindableLabel=t.trustAsHtml(i)}),e.model=o.registerSubmitButton(e)},e.prototype.link.$inject=["$scope","$element","$attributes","formForController"],e}();e.SubmitButtonDirective=i,angular.module("formFor").directive("submitButton",["$sce",function(e){return new i(e)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r,o=function(){function e(e,o,n){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/text-field.html",this.scope={attribute:"@",debounce:"@?",disable:"=",focused:"&?",blurred:"&?",help:"@?",iconAfterClicked:"&?",iconBeforeClicked:"&?",placeholder:"@?",rows:"=?"},t=e,i=o,r=n}return e.$inject=["$log","$timeout","fieldHelper"],e.prototype.link=function(e,o,n,a){if(!e.attribute)return void t.error('Missing required field "attribute"');if(e.attributes=n,e.rows=e.rows||3,e.type=n.type||"text",e.multiline=n.hasOwnProperty("multiline")&&"false"!==n.multiline,e.tabIndex=n.tabIndex||0,n.hasOwnProperty("autofocus")&&i(function(){o.find(e.multiline?"textarea":"input")[0].focus()}),r.manageLabel(e,n,!1),r.manageFieldRegistration(e,n,a),n.iconAfter){var l=function(){if(e.model){var t="{"===n.iconAfter.charAt(0)?e.$eval(n.iconAfter):n.iconAfter;e.iconAfter=angular.isObject(t)?e.model.error?t.invalid:e.model.pristine?t.pristine:t.valid:t}};n.$observe("iconAfter",l),e.$watch("model.error",l),e.$watch("model.pristine",l)}if(n.iconBefore){var s=function(){if(e.model){var t="{"===n.iconBefore.charAt(0)?e.$eval(n.iconBefore):n.iconBefore;e.iconBefore=angular.isObject(t)?e.model.error?t.invalid:e.model.pristine?t.pristine:t.valid:t}};n.$observe("iconBefore",s),e.$watch("model.error",s),e.$watch("model.pristine",s)}e.onIconAfterClick=function(){e.hasOwnProperty("iconAfterClicked")&&e.iconAfterClicked()},e.onIconBeforeClick=function(){e.hasOwnProperty("iconBeforeClicked")&&e.iconBeforeClicked()},e.onFocus=function(){e.hasOwnProperty("focused")&&e.focused()},e.onBlur=function(){e.hasOwnProperty("blurred")&&e.blurred()}},e}();e.TextFieldDirective=o,angular.module("formFor").directive("textField",["$log","$timeout","FieldHelper",function(e,t,i){return new o(e,t,i)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r,o,n=10,a=function(){function e(e,n,a,l){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/type-ahead-field.html",this.scope={attribute:"@",debounce:"@?",disable:"=",filterDebounce:"@?",filterTextChanged:"&?",help:"@?",options:"="},t=e,i=n,r=a,o=l}return e.$inject=["$document","$log","$timeout","fieldHelper"],e.prototype.link=function(e,a,l,s){if(!e.attribute)return void i.error('Missing required field "attribute"');e.labelAttribute=l.labelAttribute||"label",e.valueAttribute=l.valueAttribute||"value",e.placeholder=l.hasOwnProperty("placeholder")?l.placeholder:"Select",e.tabIndex=l.tabIndex||0,e.scopeBuster={filter:""},o.manageLabel(e,l,!1),o.manageFieldRegistration(e,l,s);var u,d=function(){if(!u){var e=a.find("input");e.length&&(u=e[0])}u&&r(u.focus.bind(u))};e.close=function(){r(function(){e.isOpen=!1})},e.open=function(){e.disable||e.model.disabled||r(function(){e.isOpen=!0})},e.filteredOptions=[];var c=function(e){return"string"==typeof e?e.toLowerCase():""},f=function(){var t=e.options||[];if(e.filteredOptions.splice(0),e.scopeBuster.filter){var i=c(e.scopeBuster.filter);angular.forEach(t,function(t){var r=c(t[e.labelAttribute]).indexOf(i);r>=0&&e.filteredOptions.push(t)})}else angular.copy(t,e.filteredOptions)};e.searchTextChange=function(){},e.$watch("scopeBuster.filter",f),e.$watch("options.length",f);var p=function(t){t.ignoreFor!==e.model.uid&&e.close()};e.filterTextClick=function(t){e.isOpen&&(t.ignoreFor=e.model.uid)};var m;e.$watch("isOpen",function(){m&&r.cancel(m),m=r(function(){m=null,e.isOpen?t.on("click",p):t.off("click",p)},n)}),e.$on("$destroy",function(){t.off("click",p)}),e.setFilterFocus=function(){d()},e.mouseOver=function(t){e.mouseOverIndex=t,e.mouseOverOption=t>=0?e.filteredOptions[t]:null},e.selectOption=function(t){e.model.bindable=t&&t[e.valueAttribute],e.scopeBuster.filter=t&&t[e.labelAttribute]};var F=function(){e.model.bindable&&e.options&&e.options.forEach(function(t){e.model.bindable===t[e.valueAttribute]&&(e.scopeBuster.filter=t[e.labelAttribute])})};e.$watch("model.bindable",F),e.$watch("options.length",F),e.keyDown=function(t){switch(t.keyCode){case 27:e.close();break;case 13:e.isOpen?(e.selectOption(e.mouseOverOption),e.close()):e.open(),t.preventDefault();break;case 38:e.isOpen?e.mouseOver(e.mouseOverIndex>0?e.mouseOverIndex-1:e.filteredOptions.length-1):e.open();break;case 40:e.isOpen?e.mouseOver(e.mouseOverIndex<e.filteredOptions.length-1?e.mouseOverIndex+1:0):e.open();break;case 9:case 16:e.close();break;default:e.open()}},e.$watchCollection("[isOpen, filteredOptions.length]",function(){e.mouseOver(-1),e.isOpen&&d()}),e.filterTextChanged instanceof Function&&e.$watch("scopeBuster.filter",function(t){e.filterTextChanged({text:t})})},e.prototype.link.$inject=["$scope","$element","$attributes","formForController"],e}();e.TypeAheadFieldDirective=a,angular.module("formFor").directive("typeAheadField",["$document","$log","$timeout","FieldHelper",function(e,t,i,r){return new a(e,t,i,r)}])}(formFor||(formFor={}));var formFor;!function(e){!function(e){e[e.CHECKBOX="checkbox"]="CHECKBOX",e[e.NUMBER="number"]="NUMBER",e[e.PASSWORD="password"]="PASSWORD",e[e.RADIO="radio"]="RADIO",e[e.SELECT="select"]="SELECT",e[e.TEXT="text"]="TEXT"}(e.BuilderFieldType||(e.BuilderFieldType={}));e.BuilderFieldType}(formFor||(formFor={}));var formFor;!function(e){!function(e){e[e.COLLECTION_MAX_SIZE="COLLECTION_MAX_SIZE"]="COLLECTION_MAX_SIZE",e[e.COLLECTION_MIN_SIZE="COLLECTION_MIN_SIZE"]="COLLECTION_MIN_SIZE",e[e.CUSTOM="CUSTOM"]="CUSTOM",e[e.MAXIMUM="MAXIMUM"]="MAXIMUM",e[e.MAX_LENGTH="MAX_LENGTH"]="MAX_LENGTH",e[e.MINIMUM="MINIMUM"]="MINIMUM",e[e.MIN_LENGTH="MIN_LENGTH"]="MIN_LENGTH",e[e.PATTERN="PATTERN"]="PATTERN",
e[e.REQUIRED="REQUIRED_FIELD"]="REQUIRED",e[e.TYPE_EMAIL="TYPE_EMAIL"]="TYPE_EMAIL",e[e.TYPE_INTEGER="TYPE_INTEGER"]="TYPE_INTEGER",e[e.TYPE_NEGATIVE="TYPE_NEGATIVE"]="TYPE_NEGATIVE",e[e.TYPE_NON_NEGATIVE="TYPE_NON_NEGATIVE"]="TYPE_NON_NEGATIVE",e[e.TYPE_NUMERIC="TYPE_NUMERIC"]="TYPE_NUMERIC",e[e.TYPE_POSITIVE="TYPE_POSITIVE"]="TYPE_POSITIVE"}(e.ValidationFailureType||(e.ValidationFailureType={}));e.ValidationFailureType}(formFor||(formFor={}));var formFor;!function(e){!function(e){e[e.EMAIL="email"]="EMAIL",e[e.INTEGER="integer"]="INTEGER",e[e.NEGATIVE="negative"]="NEGATIVE",e[e.NON_NEGATIVE="nonNegative"]="NON_NEGATIVE",e[e.NUMBER="number"]="NUMBER",e[e.POSITIVE="positive"]="POSITIVE"}(e.ValidationFieldType||(e.ValidationFieldType={}));e.ValidationFieldType}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(){}return e}();e.BindableFieldWrapper=t}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function t(t,i,r,o){this.$interpolate_=t,this.formForConfiguration_=o,this.nestedObjectHelper_=new e.NestedObjectHelper(i),this.promiseUtils_=new e.PromiseUtils(r)}return t.prototype.isCollectionRequired=function(e,t){var i=this.getRulesFor_(e,t);return i&&i.collection&&i.collection.min?angular.isObject(i.collection.min)?i.collection.min.rule>0:i.collection.min>0:!1},t.prototype.isFieldRequired=function(e,t){var i=this.getRulesFor_(e,t);return i&&i.required?angular.isObject(i.required)?i.required.rule:!!i.required:!1},t.prototype.validateAll=function(e,t){var i=this.nestedObjectHelper_.flattenObjectKeys(e);return this.validateFields(e,i,t)},t.prototype.validateCollection=function(e,t,i){var r=this.getRulesFor_(t,i),o=this.nestedObjectHelper_.readAttribute(e,t);return r&&r.collection?(o=o||[],this.validateCollectionMinLength_(o,r.collection)||this.validateCollectionMaxLength_(o,r.collection)||this.promiseUtils_.resolve()):this.promiseUtils_.resolve()},t.prototype.validateField=function(e,t,i){var r=this.getRulesFor_(t,i),o=this.nestedObjectHelper_.readAttribute(e,t);return r?((void 0===o||null===o)&&(o=""),this.validateFieldRequired_(o,r)||this.validateFieldMinimum_(o,r)||this.validateFieldMinLength_(o,r)||this.validateFieldMaximum_(o,r)||this.validateFieldMaxLength_(o,r)||this.validateFieldType_(o,r)||this.validateFieldPattern_(o,r)||this.validateFieldCustom_(o,e,r)||this.promiseUtils_.resolve()):this.promiseUtils_.resolve()},t.prototype.validateFields=function(e,t,i){var r=this,o=this.promiseUtils_.defer(),n=[],a={};return angular.forEach(t,function(t){var o=r.getRulesFor_(t,i);if(o){var l;l=o.collection?r.validateCollection(e,t,i):r.validateField(e,t,i),l.then(angular.noop,function(e){r.nestedObjectHelper_.writeAttribute(a,t,e)}),n.push(l)}},this),this.promiseUtils_.waitForAll(n).then(o.resolve,function(){o.reject(a)}),o.promise},t.prototype.getRulesFor_=function(e,t){var i=e.replace(/\[[^\]]+\]/g,".collection.fields");return this.nestedObjectHelper_.readAttribute(t,i)},t.prototype.getFieldTypeFailureMessage_=function(e,t){return angular.isObject(e.type)?e.type.message:this.formForConfiguration_.getFailedValidationMessage(t)},t.isConsideredNumeric_=function(e,t){return e&&!isNaN(t)},t.prototype.validateCollectionMinLength_=function(t,i){if(i.min){var r=angular.isObject(i.min)?i.min.rule:i.min;if(t.length<r){var o;return o=angular.isObject(i.min)?i.min.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.COLLECTION_MIN_SIZE))({num:r}),this.promiseUtils_.reject(o)}}return null},t.prototype.validateCollectionMaxLength_=function(t,i){if(i.max){var r=angular.isObject(i.max)?i.max.rule:i.max;if(t.length>r){var o;return o=angular.isObject(i.max)?i.max.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.COLLECTION_MAX_SIZE))({num:r}),this.promiseUtils_.reject(o)}}return null},t.prototype.validateFieldCustom_=function(t,i,r){var o=this;if(r.custom){var n,a;angular.isFunction(r.custom)?(n=this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.CUSTOM),a=r.custom):(n=r.custom.message,a=r.custom.rule);try{var l=a(t,i)}catch(s){return this.promiseUtils_.reject(s.message||n)}return angular.isObject(l)&&angular.isFunction(l.then)?l.then(function(e){return o.promiseUtils_.resolve(e)},function(e){return o.promiseUtils_.reject(e||n)}):l?this.promiseUtils_.resolve(l):this.promiseUtils_.reject(n)}return null},t.prototype.validateFieldMaximum_=function(t,i){if(i.maximum){var r=t.toString(),o=Number(t),n=angular.isObject(i.maximum)?i.maximum.rule:i.maximum;if(r&&!isNaN(o)&&o>n){var a;return a=angular.isObject(i.maximum)?i.maximum.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.MAXIMUM))({num:n}),this.promiseUtils_.reject(a)}}return null},t.prototype.validateFieldMaxLength_=function(t,i){if(i.maxlength){var r=angular.isObject(i.maxlength)?i.maxlength.rule:i.maxlength;if(t.length>r){var o;return o=angular.isObject(i.maxlength)?i.maxlength.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.MAX_LENGTH))({num:r}),this.promiseUtils_.reject(o)}}return null},t.prototype.validateFieldMinimum_=function(t,i){if(i.minimum){var r=t.toString(),o=Number(t),n=angular.isObject(i.minimum)?i.minimum.rule:i.minimum;if(r&&!isNaN(o)&&n>o){var a;return a=angular.isObject(i.minimum)?i.minimum.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.MINIMUM))({num:n}),this.promiseUtils_.reject(a)}}return null},t.prototype.validateFieldMinLength_=function(t,i){if(i.minlength){var r=angular.isObject(i.minlength)?i.minlength.rule:i.minlength;if(t&&t.length<r){var o;return o=angular.isObject(i.minlength)?i.minlength.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.MIN_LENGTH))({num:r}),this.promiseUtils_.reject(o)}}return null},t.prototype.validateFieldRequired_=function(t,i){if(i.required){var r=angular.isObject(i.required)?i.required.rule:i.required,o=t.toString().replace(/\s+$/,""),n=Number(t);if(r&&!o&&!n){var a;return a=angular.isObject(i.required)?i.required.message:this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.REQUIRED),this.promiseUtils_.reject(a)}}return null},t.prototype.validateFieldPattern_=function(t,i){if(i.pattern){var r=i.pattern instanceof RegExp,o=r?i.pattern:i.pattern.rule;if(!o.exec(t)){var n=r?this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.PATTERN):i.pattern.message;return this.promiseUtils_.reject(n)}}return null},t.prototype.validateFieldType_=function(i,r){if(r.type){var o=angular.isObject(r.type)?r.type.rule:r.type,n=i.toString(),a=Number(i);if(o)for(var l=o.split(" "),s=0,u=l.length;u>s;s++){var d=l[s];switch(d){case e.ValidationFieldType.INTEGER:if(n&&(isNaN(a)||a%1!==0))return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_INTEGER));break;case e.ValidationFieldType.NUMBER:if(n&&isNaN(a))return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_NUMERIC));break;case e.ValidationFieldType.NEGATIVE:if(t.isConsideredNumeric_(n,a)&&a>=0)return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_NEGATIVE));break;case e.ValidationFieldType.NON_NEGATIVE:if(t.isConsideredNumeric_(n,a)&&0>a)return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_NON_NEGATIVE));break;case e.ValidationFieldType.POSITIVE:if(t.isConsideredNumeric_(n,a)&&0>=a)return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_POSITIVE));break;case e.ValidationFieldType.EMAIL:if(n&&!n.match(/^.+@.+\..+$/))return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_EMAIL))}}}return null},t}();e.ModelValidator=t,angular.module("formFor").service("ModelValidator",["$interpolate","$parse","$q","FormForConfiguration",function(e,i,r,o){return new t(e,i,r,o)}])}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function t(t,i){this.formForScope_=i,this.nestedObjectHelper_=new e.NestedObjectHelper(t),this.formForScope_.fieldNameToErrorMap=i.fieldNameToErrorMap||{},this.formForScope_.valid=!0,this.fieldNameToModifiedStateMap_={},this.formSubmitted_=!1,this.fieldNameToErrorMap_={},this.watchable=0}return t.prototype.getFieldError=function(e){return this.nestedObjectHelper_.readAttribute(this.formForScope_.fieldNameToErrorMap,e)},t.prototype.hasFieldBeenModified=function(e){return this.nestedObjectHelper_.readAttribute(this.fieldNameToModifiedStateMap_,e)},t.prototype.hasFormBeenSubmitted=function(){return this.formSubmitted_},t.prototype.isFormInvalid=function(){return!this.isFormValid()},t.prototype.isFormValid=function(){for(var e in this.fieldNameToErrorMap_)return!1;return!0},t.prototype.resetFieldErrors=function(){this.formForScope_.fieldNameToErrorMap={}},t.prototype.setFieldError=function(e,t){var i=this.nestedObjectHelper_.flattenAttribute(e);this.nestedObjectHelper_.writeAttribute(this.formForScope_.fieldNameToErrorMap,e,t),t?this.fieldNameToErrorMap_[i]=t:delete this.fieldNameToErrorMap_[i],this.formForScope_.valid=this.isFormValid(),this.watchable++},t.prototype.setFieldHasBeenModified=function(e,t){this.nestedObjectHelper_.writeAttribute(this.fieldNameToModifiedStateMap_,e,t),this.watchable++},t.prototype.setFormSubmitted=function(e){this.formSubmitted_=e,this.watchable++},t}();e.FormForStateHelper=t}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(){}return e.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)):""},e}();e.StringUtil=t}(formFor||(formFor={}));
angular.module("formFor",[]);var formFor;!function(e){var t=function(){function e(){this.restrict="A"}return e.prototype.link=function(e,t,i){e.$watch("model.uid",function(e){i.$set("ariaDescribedby",e+"-error"),i.$set("ariaLabelledby",e+"-label")}),e.$watch("model.error",function(e){i.$set("ariaInvalid",!!e)})},e.prototype.link.$inject=["$scope","$element","$attributes"],e}();e.AriaManager=t,angular.module("formFor").directive("ariaManager",function(){return new t})}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function t(){this.autoGenerateLabels=!1,this.autoTrimValues=!1,this.defaultDebounceDuration=500,this.defaultSubmitComplete=angular.noop,this.defaultSubmitError=angular.noop,this.defaultValidationFailed=angular.noop,this.helpIcon=null,this.labelClass=null,this.requiredLabel=null,this.validationFailedForCustomMessage_="Failed custom validation",this.validationFailedForEmailTypeMessage_="Invalid email format",this.validationFailedForIntegerTypeMessage_="Must be an integer",this.validationFailedForMaxCollectionSizeMessage_="Must be fewer than {{num}} items",this.validationFailedForMaximumMessage_="Must be no more than {{num}}",this.validationFailedForMaxLengthMessage_="Must be fewer than {{num}} characters",this.validationFailedForMinimumMessage_="Must be at least {{num}}",this.validationFailedForMinCollectionSizeMessage_="Must at least {{num}} items",this.validationFailedForMinLengthMessage_="Must be at least {{num}} characters",this.validationFailedForNegativeTypeMessage_="Must be negative",this.validationFailedForNonNegativeTypeMessage_="Must be non-negative",this.validationFailedForNumericTypeMessage_="Must be numeric",this.validationFailedForPatternMessage_="Invalid format",this.validationFailedForPositiveTypeMessage_="Must be positive",this.validationFailedForRequiredMessage_="Required field"}return t.prototype.disableAutoLabels=function(){this.autoGenerateLabels=!1},t.prototype.enableAutoLabels=function(){this.autoGenerateLabels=!0},t.prototype.disableAutoTrimValues=function(){this.autoTrimValues=!1},t.prototype.enableAutoTrimValues=function(){this.autoTrimValues=!0},t.prototype.getFailedValidationMessage=function(t){switch(t){case e.ValidationFailureType.CUSTOM:return this.validationFailedForCustomMessage_;case e.ValidationFailureType.COLLECTION_MAX_SIZE:return this.validationFailedForMaxCollectionSizeMessage_;case e.ValidationFailureType.COLLECTION_MIN_SIZE:return this.validationFailedForMinCollectionSizeMessage_;case e.ValidationFailureType.MINIMUM:return this.validationFailedForMinimumMessage_;case e.ValidationFailureType.MAX_LENGTH:return this.validationFailedForMaxLengthMessage_;case e.ValidationFailureType.MAXIMUM:return this.validationFailedForMaximumMessage_;case e.ValidationFailureType.MIN_LENGTH:return this.validationFailedForMinLengthMessage_;case e.ValidationFailureType.PATTERN:return this.validationFailedForPatternMessage_;case e.ValidationFailureType.REQUIRED:return this.validationFailedForRequiredMessage_;case e.ValidationFailureType.TYPE_EMAIL:return this.validationFailedForEmailTypeMessage_;case e.ValidationFailureType.TYPE_INTEGER:return this.validationFailedForIntegerTypeMessage_;case e.ValidationFailureType.TYPE_NEGATIVE:return this.validationFailedForNegativeTypeMessage_;case e.ValidationFailureType.TYPE_NON_NEGATIVE:return this.validationFailedForNonNegativeTypeMessage_;case e.ValidationFailureType.TYPE_NUMERIC:return this.validationFailedForNumericTypeMessage_;case e.ValidationFailureType.TYPE_POSITIVE:return this.validationFailedForPositiveTypeMessage_}},t.prototype.setDefaultDebounceDuration=function(e){this.defaultDebounceDuration=e},t.prototype.setDefaultSubmitComplete=function(e){this.defaultSubmitComplete=e},t.prototype.setDefaultSubmitError=function(e){this.defaultSubmitError=e},t.prototype.setDefaultValidationFailed=function(e){this.defaultValidationFailed=e},t.prototype.setHelpIcon=function(e){this.helpIcon=e},t.prototype.setLabelClass=function(e){this.labelClass=e},t.prototype.setRequiredLabel=function(e){this.requiredLabel=e},t.prototype.setValidationFailedForCustomMessage=function(e){this.validationFailedForCustomMessage_=e},t.prototype.setValidationFailedForMaxCollectionSizeMessage=function(e){this.validationFailedForMaxCollectionSizeMessage_=e},t.prototype.setValidationFailedForMaximumMessage=function(e){this.validationFailedForMaximumMessage_=e},t.prototype.setValidationFailedForMaxLengthMessage=function(e){this.validationFailedForMaxLengthMessage_=e},t.prototype.setValidationFailedForMinCollectionSizeMessage=function(e){this.validationFailedForMaxCollectionSizeMessage_=e},t.prototype.setValidationFailedForMinimumMessage=function(e){this.validationFailedForMinimumMessage_=e},t.prototype.setValidationFailedForMinLengthMessage=function(e){this.validationFailedForMinLengthMessage_=e},t.prototype.setValidationFailedForPatternMessage=function(e){this.validationFailedForPatternMessage_=e},t.prototype.setValidationFailedForRequiredMessage=function(e){this.validationFailedForRequiredMessage_=e},t.prototype.setValidationFailedForEmailTypeMessage=function(e){this.validationFailedForEmailTypeMessage_=e},t.prototype.setValidationFailedForIntegerTypeMessage=function(e){this.validationFailedForIntegerTypeMessage_=e},t.prototype.setValidationFailedForNegativeTypeMessage=function(e){this.validationFailedForNegativeTypeMessage_=e},t.prototype.setValidationFailedForNonNegativeTypeMessage=function(e){this.validationFailedForNonNegativeTypeMessage_=e},t.prototype.setValidationFailedForNumericTypeMessage=function(e){this.validationFailedForNumericTypeMessage_=e},t.prototype.setValidationFailedForPositiveTypeMessage=function(e){this.validationFailedForPositiveTypeMessage_=e},t}();e.FormForConfiguration=t,angular.module("formFor").service("FormForConfiguration",function(){return new t})}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function t(e){this.formForConfiguration_=e}return t.prototype.manageLabel=function(t,i,r){this.formForConfiguration_.autoGenerateLabels&&(t.label=e.StringUtil.humanize(r?t.value:t.attribute)),this.formForConfiguration_.labelClass&&(t.labelClass=this.formForConfiguration_.labelClass),i.hasOwnProperty("label")&&i.$observe("label",function(e){t.label=e}),i.hasOwnProperty("labelClass")&&i.$observe("labelClass",function(e){t.labelClass=e})},t.prototype.manageFieldRegistration=function(e,t,i){e.$watch("attribute",function(r,o){e.model&&i.unregisterFormField(o),e.model=i.registerFormField(e.attribute),t.uid&&(e.model.uid=t.uid)}),e.$on("$destroy",function(){i.unregisterFormField(e.attribute)})},t}();e.FieldHelper=t,angular.module("formFor").service("FieldHelper",["FormForConfiguration",function(e){return new t(e)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r=function(){function e(e,r){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/checkbox-field.html",this.scope={attribute:"@",disable:"=",help:"@?",changed:"@?"},t=e,i=r}return e.$inject=["$log","fieldHelper"],e.prototype.link=function(e,r,o,n){return e.attribute?(e.tabIndex=o.tabIndex||0,e.toggle=function(){e.disable||e.model.disabled||(e.model.bindable=!e.model.bindable)},i.manageLabel(e,o,!1),void i.manageFieldRegistration(e,o,n)):void t.error('Missing required field "attribute"')},e.prototype.link.$inject=["$scope","$element","$attributes","formForController"],e}();e.CheckboxFieldDirective=r,angular.module("formFor").directive("checkboxField",["$log","FieldHelper",function(e,t){return new r(e,t)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i=function(){function e(e){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/collection-label.html",this.scope={attribute:"@",help:"@?",label:"@"},t=e}return e.$inject=["$sce"],e.prototype.link=function(e,i,r,o){e.$watch("label",function(i){e.bindableLabel=t.trustAsHtml(i)}),e.model=o.registerCollectionLabel(e.attribute)},e.prototype.link.$inject=["$scope","$element","$attributes","formForController"],e}();e.CollectionLabelDirective=i,angular.module("formFor").directive("collectionLabel",["$sce",function(e){return new i(e)}])}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(){this.restrict="EA",this.templateUrl="form-for/templates/field-error.html",this.scope={error:"=",leftAligned:"@?",uid:"@"}}return e.prototype.link=function(){},e.prototype.link.$inject=["$scope"],e}();e.FieldErrorDirective=t,angular.module("formFor").directive("fieldError",function(){return new t})}(formFor||(formFor={}));var formFor;!function(e){var t,i,r=function(){function e(e,r){this.replace=!0,this.restrict="EA",this.templateUrl="form-for/templates/field-label.html",this.scope={inputUid:"@",help:"@?",label:"@",labelClass:"@?",required:"@?",uid:"@"},t=e,i=r}return e.$inject=["$sce","formForConfiguration"],e.prototype.link=function(e,r,o){e.attributes=o,e.helpIcon=i.helpIcon,e.$watch("label",function(i){e.bindableLabel=t.trustAsHtml(i)}),e.$watch("required",function(t){e.requiredLabel=e.$eval(t)?i.requiredLabel:null})},e.prototype.link.$inject=["$scope","$element","$attributes"],e}();e.FieldLabelDirective=r,angular.module("formFor").directive("fieldLabel",["$sce","FormForConfiguration",function(e,t){return new r(e,t)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r=function(){function r(r,o){this.require="formFor",this.restrict="A",t=r,i=new e.NestedObjectHelper(o)}return r.$inject=["$compile","$parse"],r.prototype.link=function(r,o,n,a){var l;n.formForBuilder?l=r.$eval(n.formForBuilder):n.validationRules?l=r.$eval(n.validationRules):n.$service&&(l=r.$eval(n.$service.validationRules));for(var s=i.flattenObjectKeys(l),u="",d=0,c=s.length;c>d;d++){var f=s[d],p=i.readAttribute(l,f);if(p&&p.hasOwnProperty("inputType")){var m,F=p.help||"",h=p.label||"",b="",v=p.uid||"",g=h?'label="'+h+'"':"";switch(p.hasOwnProperty("placeholder")&&(b='placeholder="'+p.placeholder+'"'),p.inputType){case e.BuilderFieldType.CHECKBOX:u+='<checkbox-field attribute="'+f+'"\n help="'+F+'"\n '+g+'\n uid="'+v+'">\n </checkbox-field>';break;case e.BuilderFieldType.RADIO:m=JSON.stringify(p.values).replace(/"/g,"&quot;"),u+='<radio-field attribute="'+f+'"\n '+g+'\n options="'+m+'"\n uid="'+v+'">\n </radio-field>';break;case e.BuilderFieldType.SELECT:m=JSON.stringify(p.values).replace(/"/g,"&quot;"),u+='<select-field attribute="'+f+'"\n '+(p.allowBlank?"allow-blank":"")+"\n "+(p.enableFiltering?"enable-filtering":"")+'\n help="'+F+'"\n '+g+'\n multiple="'+!!p.multipleSelection+'"\n options="'+m+'"\n '+b+'\n uid="'+v+'"\n value-attribute="'+(p.valueAttribute||"")+'">\n </select-field>';break;case e.BuilderFieldType.NUMBER:case e.BuilderFieldType.PASSWORD:case e.BuilderFieldType.TEXT:var b;p.hasOwnProperty("placeholder")&&(b='placeholder="'+p.placeholder+'"'),u+='<text-field attribute="'+f+'"\n '+g+'\n help="'+F+'"\n ng-attr-multiline="'+!!p.multiline+'"\n '+b+'\n rows="'+(p.rows||"")+'"\n type="'+p.inputType+'"\n uid="'+v+'">\n </text-field>'}}}0===o.find("input[type=button], button, submit-button").length&&(u+='<submit-button label="Submit"></submit-button>');var y=t(u),_=y(r,void 0,{transcludeControllers:a});o.prepend(_)},r.prototype.link.$inject=["$scope","$element","$attributes","formForController"],r}();e.FormForBuilderDirective=r,angular.module("formFor").directive("formForBuilder",["$compile","$parse",function(e,t){return new r(e,t)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r,o,n=function(){function e(e,n,a,l){this.priority=99,this.require="ngModel",this.restrict="A",this.scope={formForDebounce:"@"},t=e,i=n,r=a,o=l}return e.$inject=["$log","$sniffer","$timeout","formForConfiguration"],e.prototype.link=function(e,n,a,l){if("radio"===a.type||"checkbox"===a.type)return void t.warn("formForDebounce should only be used with <input type=text> and <textarea> elements");var s=a.formForDebounce,u=o.defaultDebounceDuration;void 0!==s&&("false"===s.toString()?u=!1:(s=parseInt(s),angular.isNumber(s)&&!isNaN(s)&&(u=s))),i.hasEvent("input")?n.off("input"):(n.off("keydown"),i.hasEvent("paste")&&n.off("paste"));var d;if(u!==!1){var c=function(){r.cancel(d),d=r(function(){e.$apply(function(){l.$setViewValue(n.val())})},u)};i.hasEvent("input")?n.on("input",c):(n.on("keydown",c),i.hasEvent("paste")&&n.on("paste",c))}n.on("blur",function(){e.$apply(function(){l.$setViewValue(n.val())})}),e.$on("$destroy",function(){d&&r.cancel(d)})},e.prototype.link.$inject=["$scope","$element","$attributes","ngModelController"],e}();e.FormForDebounceDirective=n,angular.module("formFor").directive("formForDebounce",["$log","$sniffer","$timeout","FormForConfiguration",function(e,t,i,r){return new n(e,t,i,r)}])}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(e){this.$parse_=e}return e.prototype.flattenAttribute=function(e){return e.replace(/\[([^\]]+)\]\.{0,1}/g,"___$1___").replace(/\./g,"___")},e.prototype.flattenObjectKeys=function(e){for(var t=[],i=[{object:e,prefix:null}];;){if(0===i.length)break;var r=i.pop(),o=Array.isArray(r.object),n=r.prefix?r.prefix+(o?"[":"."):"",a=o?"]":"";if("object"==typeof r.object)for(var l in r.object){var s=n+l+a,u=r.object[l];t.push(s),i.push({object:u,prefix:s})}}return t},e.prototype.readAttribute=function(e,t){return this.$parse_(t)(e)},e.prototype.writeAttribute=function(e,t,i){this.initializeArraysAndObjectsForParse_(e,t),this.$parse_(t).assign(e,i)},e.prototype.initializeArraysAndObjectsForParse_=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 n=t.substr(i).match(/([0-9]+)\]\./);if(n){var a=parseInt(n[1]);o[a]||(o[a]={})}i++}},e}();e.NestedObjectHelper=t}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(e){this.$q_=e}return e.prototype.all=function(e){return this.$q_.all(e)},e.prototype.defer=function(){return this.$q_.defer()},e.prototype.resolve=function(e){var t=this.$q_.defer();return t.resolve(e),t.promise},e.prototype.reject=function(e){return this.$q_.reject(e)},e.prototype.waitForAll=function(e){function t(e,t){o.hasOwnProperty(e)||(o[e]=t,n--),i()}function i(){0===n&&(a?r.reject(o):r.resolve(o))}var r=this.$q_.defer(),o={},n=0,a=!1;return angular.forEach(e,function(e,i){n++,e.then(function(e){t(i,e)},function(e){a=!0,t(i,e)})}),i(),r.promise},e.prototype.when=function(e){return this.$q_.when(e)},e}();e.PromiseUtils=t}(formFor||(formFor={}));var formFor;!function(e){function t(t,i,r,o,n,a){var l=new e.NestedObjectHelper(i),s=new e.PromiseUtils(r);return t.registerCollectionLabel=function(e){var t=l.flattenAttribute(e),i={error:null,required:n.isCollectionRequired(e,o.$validationRuleset)};o.collectionLabels[t]=i;var r=!1;return o.$watch("formFor."+e+".length",function(){r?o.validateOn&&"change"!==o.validateOn||n.validateCollection(o.formFor,e,o.$validationRuleset).then(function(){o.formForStateHelper.setFieldError(t,null)},function(e){o.formForStateHelper.setFieldError(t,e)}):r=!0}),i},t.registerFormField=function(r){if(!r)throw Error('Invalid field name "'+r+'" provided.');var s=l.flattenAttribute(r);if(o.fields.hasOwnProperty(s))throw Error('Field "'+r+'" has already been registered. Field names must be unique.');var u={bindable:null,disabled:o.disable,error:null,pristine:!0,required:n.isFieldRequired(r,o.$validationRuleset),uid:e.FormForGUID.create()},d={bindableWrapper:u,fieldName:r,formForStateHelper:o.formForStateHelper,unwatchers:[]};o.fields[s]=d;var c=i(r),f=c.assign;d.unwatchers.push(o.$watch("fields."+s+".bindableWrapper.bindable",function(e,t){(e||e!=t)&&(a.autoTrimValues&&"string"==typeof e&&(e=e.trim()),f(o.formFor,e))}));var p;return d.unwatchers.push(o.$watch("formFor."+r,function(e,i){(e!==d.bindableWrapper.bindable||void 0===i&&""===e||void 0===e)&&(p=!1),d.bindableWrapper.bindable=e,o.validateOn&&"change"!==o.validateOn||t.validateField(r),p||(p=!0,o.formForStateHelper.setFieldHasBeenModified(s,!1)),d.bindableWrapper.pristine=!o.formForStateHelper.hasFieldBeenModified(s)})),u},t.registerSubmitButton=function(){var e={disabled:!1};return o.buttons.push(e),e},t.resetErrors=function(){for(var e in o.fields)o.formForStateHelper.getFieldError(e)&&(o.formForStateHelper.setFieldHasBeenModified(e,!1),o.fields[e].bindableWrapper.pristine=!0);o.formForStateHelper.setFormSubmitted(!1),o.formForStateHelper.resetFieldErrors()},t.resetField=function(e){var t=l.flattenAttribute(e);o.formForStateHelper.getFieldError(t)&&(o.formForStateHelper.setFieldHasBeenModified(t,!1),o.fields[t].bindableWrapper.pristine=!0),o.formForStateHelper.setFieldError(t,null)},t.resetFields=function(){t.resetErrors()},t.setFieldError=function(e,t){var i=l.flattenAttribute(e);o.formForStateHelper.setFieldHasBeenModified(i,!0),o.formForStateHelper.setFieldError(i,t)},t.unregisterFormField=function(e){var t=l.flattenAttribute(e);angular.forEach(o.fields[t].unwatchers,function(e){e()}),delete o.fields[t]},t.updateCollectionErrors=function(e){angular.forEach(o.collectionLabels,function(t,i){var r=l.readAttribute(e,i);o.formForStateHelper.setFieldError(i,r)})},t.updateFieldErrors=function(e){angular.forEach(o.fields,function(t,i){var r=l.readAttribute(e,t.fieldName);o.formForStateHelper.setFieldError(i,r)})},t.validateField=function(e){var t=l.flattenAttribute(e);o.formForStateHelper.setFieldHasBeenModified(t,!0),o.$validationRuleset&&n.validateField(o.formFor,e,o.$validationRuleset).then(function(){o.formForStateHelper.setFieldError(t,null)},function(e){o.formForStateHelper.setFieldError(t,e)})},t.validateForm=function(e){t.updateCollectionErrors({}),t.updateFieldErrors({});var i,r;if(o.$validationRuleset){var a=[];angular.forEach(o.fields,function(e){a.push(e.fieldName)}),r=n.validateFields(o.formFor,a,o.$validationRuleset),r.then(angular.noop,t.updateFieldErrors),a=[],angular.forEach(o.collectionLabels,function(e,t){a.push(t)}),i=n.validateFields(o.formFor,a,o.$validationRuleset),i.then(angular.noop,t.updateCollectionErrors)}else i=s.resolve(),r=s.resolve();var u=s.defer();return s.waitForAll([i,r]).then(u.resolve,function(t){angular.isArray(t[0])&&0===t[0].length&&t.splice(0,1),e&&angular.forEach(t,function(e){var t=l.flattenObjectKeys(e);angular.forEach(t,function(t){var i=l.readAttribute(e,t);if(i){var r=l.flattenAttribute(t);o.formForStateHelper.setFieldHasBeenModified(r,!0)}})}),u.reject(t)}),u.promise},t}e.createFormForController=t}(formFor||(formFor={}));var formFor;!function(e){var t,i,r,o,n,a,l,s=function(){function s(s){this.require="form",this.restrict="A",this.scope={controller:"=?",disable:"=?",formFor:"=",service:"@",submitComplete:"&?",submitError:"&?",submitWith:"&?",valid:"=?",validateOn:"=?",validationFailed:"&?",validationRules:"=?"},t=s,i=s.get("$log"),r=s.get("$parse"),o=s.get("$sce"),n=s.get("FormForConfiguration"),a=s.get("ModelValidator"),l=new e.PromiseUtils(s.get("$q"))}return s.$inject=["$injector"],s.prototype.controller=function(s){s.formFor||i.error('The form data object specified by <form form-for=""> is null or undefined.'),s.fields={},s.collectionLabels={},s.buttons=[],s.controller=s.controller||{},s.service&&(s.$service=t.get(s.service)),s.validationRules?s.$validationRuleset=s.validationRules:s.$service&&(s.$validationRuleset=s.$service.validationRules),e.createFormForController(this,r,l,s,a,n),s.controller&&angular.copy(this,s.controller),s.$watch("disable",function(e){angular.forEach(s.fields,function(t){t.bindableWrapper.disabled=e}),angular.forEach(s.buttons,function(t){t.disabled=e})}),s.formForStateHelper=new e.FormForStateHelper(r,s),s.$watch("formForStateHelper.watchable",function(){var e=s.formForStateHelper.hasFormBeenSubmitted();angular.forEach(s.fields,function(t,i){if(e||s.formForStateHelper.hasFieldBeenModified(i)){var r=s.formForStateHelper.getFieldError(i);t.bindableWrapper.error=r?o.trustAsHtml(r):null}else t.bindableWrapper.error=null}),angular.forEach(s.collectionLabels,function(e,t){var i=s.formForStateHelper.getFieldError(t);e.error=i?o.trustAsHtml(i):null})})},s.prototype.controller.$inject=["$scope"],s.prototype.link=function(e,t,i){t.on("submit",function(){e.formForStateHelper.setFormSubmitted(!0),e.disable=!0;var t;return t="manual"===e.validateOn?l.resolve():e.controller.validateForm(),t.then(function(){var t;t=i.submitWith?e.submitWith({data:e.formFor}):e.$service&&e.$service.submit?e.$service.submit(e.formFor):l.reject("No submit function provided"),t||(t=l.reject("Submit function did not return a promise")),t.then(function(t){i.submitComplete?e.submitComplete({data:t}):n.defaultSubmitComplete(t)},function(t){angular.isObject(t)&&"manual"!==e.validateOn&&(e.controller.updateCollectionErrors(t),e.controller.updateFieldErrors(t)),i.submitError?e.submitError({error:t}):n.defaultSubmitError(t)}),t["finally"](function(){e.disable=!1})},function(t){e.disable=!1,i.validationFailed?e.validationFailed():n.defaultValidationFailed(t)}),!1})},s.prototype.link.$inject=["$scope","$element","$attributes"],s}();e.FormForDirective=s,angular.module("formFor").directive("formFor",["$injector",function(e){return new s(e)}])}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(){}return e.create=function(){return("0000"+(Math.random()*Math.pow(36,4)<<0).toString(36)).slice(-4)},e}();e.FormForGUID=t}(formFor||(formFor={}));var formFor;!function(e){var t,i,r=function(){function r(r,o){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/radio-field.html",this.scope={attribute:"@",disable:"=",help:"@?",options:"=",value:"@"},i=new e.FieldHelper(o),t=r}return r.$inject=["$log","FormForConfiguration"],r.prototype.link=function(r,o,n,a){return r.attribute?(r.labelAttribute=n.labelAttribute||"label",r.valueAttribute=n.valueAttribute||"value",i.manageFieldRegistration(r,n,a),r.uid=n.uid||e.FormForGUID.create(),i.manageLabel(r,n,!0),r.tabIndex=n.tabIndex||0,r.click=function(){!r.disable&&!r.model.disabled},r.$watch("model",function(e){r.model=e}),r.$watch("disable",function(e){r.disable=e}),void r.$watch("model.disabled",function(e){r.model&&(r.model.disabled=e)})):void t.error('Missing required field "attribute"')},r.prototype.link.$inject=["$scope","$element","$attributes","formForController"],r}();e.RadioFieldDirective=r,angular.module("formFor").directive("radioField",["$log","FormForConfiguration",function(e,t){return new r(e,t)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r,o,n=10,a=function(){function e(e,n,a,l){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/select-field.html",this.scope={attribute:"@",disable:"=",help:"@?",multiple:"=?",options:"="},t=e,i=n,r=a,o=l}return e.$inject=["$document","$log","$timeout","fieldHelper"],e.prototype.link=function(e,a,l,s){if(!e.attribute)return void i.error('Missing required field "attribute"');e.allowBlank=l.hasOwnProperty("allowBlank"),e.preventDefaultOption=l.hasOwnProperty("preventDefaultOption"),e.labelAttribute=l.labelAttribute||"label",e.valueAttribute=l.valueAttribute||"value",e.placeholder=l.hasOwnProperty("placeholder")?l.placeholder:"Select",e.tabIndex=l.tabIndex||0,e.scopeBuster={},o.manageLabel(e,l,!1),o.manageFieldRegistration(e,l,s),e.close=function(){r(function(){e.isOpen=!1})},e.open=function(){e.disable||e.model.disabled||r(function(){e.isOpen=!0})},e.bindableOptions=[],e.emptyOption={},e.emptyOption[e.labelAttribute]=e.placeholder,e.emptyOption[e.valueAttribute]=void 0,e.selectOption=function(t){e.model.bindable=t&&t[e.valueAttribute]};var u=function(){var t=e.options&&e.options.length;e.model.bindable||e.allowBlank||e.preventDefaultOption||!t||e.selectOption(e.options[0]),(null===e.model.bindable||void 0===e.model.bindable||""===e.model.bindable)&&(e.model.bindable=void 0),e.bindableOptions.splice(0),(!e.model.bindable||e.allowBlank)&&e.bindableOptions.push(e.emptyOption),e.bindableOptions.push.apply(e.bindableOptions,e.options),e.model.bindable&&(e.emptyOption[e.labelAttribute]="")};r(function(){e.$watch("model.bindable",u),e.$watch("options.length",u)});var d,c=function(){e.close()};e.$watch("isOpen",function(){d&&r.cancel(d),d=r(function(){d=null,e.isOpen?t.on("click",c):t.off("click",c)},n)}),e.$on("$destroy",function(){t.off("click",c)}),e.mouseOver=function(t){e.mouseOverIndex=t,e.mouseOverOption=t>=0?e.options[t]:null},e.keyDown=function(t){switch(t.keyCode){case 27:e.close();break;case 13:e.isOpen?(e.selectOption(e.mouseOverOption),e.close()):e.open(),t.preventDefault();break;case 38:e.isOpen?e.mouseOver(e.mouseOverIndex>0?e.mouseOverIndex-1:e.options.length-1):e.open();break;case 40:e.isOpen?e.mouseOver(e.mouseOverIndex<e.options.length-1?e.mouseOverIndex+1:0):e.open();break;case 9:case 16:e.close();break;default:e.open()}}},e.prototype.link.$inject=["$scope","$element","$attributes","formForController"],e}();e.SelectFieldDirective=a,angular.module("formFor").directive("selectField",["$document","$log","$timeout","FieldHelper",function(e,t,i,r){return new a(e,t,i,r)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i=function(){function e(e){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/submit-button.html",this.scope={disable:"=",icon:"@",label:"@"},t=e}return e.$inject=["$sce"],e.prototype.link=function(e,i,r,o){e.buttonClass=r.buttonClass,e.tabIndex=r.tabIndex||0,e.$watch("label",function(i){e.bindableLabel=t.trustAsHtml(i)}),e.model=o.registerSubmitButton(e)},e.prototype.link.$inject=["$scope","$element","$attributes","formForController"],e}();e.SubmitButtonDirective=i,angular.module("formFor").directive("submitButton",["$sce",function(e){return new i(e)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r,o=function(){function e(e,o,n){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/text-field.html",this.scope={attribute:"@",debounce:"@?",disable:"=",focused:"&?",blurred:"&?",help:"@?",iconAfterClicked:"&?",iconBeforeClicked:"&?",placeholder:"@?",rows:"=?"},t=e,i=o,r=n}return e.$inject=["$log","$timeout","fieldHelper"],e.prototype.link=function(e,o,n,a){if(!e.attribute)return void t.error('Missing required field "attribute"');if(e.attributes=n,e.rows=e.rows||3,e.type=n.type||"text",e.multiline=n.hasOwnProperty("multiline")&&"false"!==n.multiline,e.tabIndex=n.tabIndex||0,n.hasOwnProperty("autofocus")&&i(function(){o.find(e.multiline?"textarea":"input")[0].focus()}),r.manageLabel(e,n,!1),r.manageFieldRegistration(e,n,a),n.iconAfter){var l=function(){if(e.model){var t="{"===n.iconAfter.charAt(0)?e.$eval(n.iconAfter):n.iconAfter;e.iconAfter=angular.isObject(t)?e.model.error?t.invalid:e.model.pristine?t.pristine:t.valid:t}};n.$observe("iconAfter",l),e.$watch("model.error",l),e.$watch("model.pristine",l)}if(n.iconBefore){var s=function(){if(e.model){var t="{"===n.iconBefore.charAt(0)?e.$eval(n.iconBefore):n.iconBefore;e.iconBefore=angular.isObject(t)?e.model.error?t.invalid:e.model.pristine?t.pristine:t.valid:t}};n.$observe("iconBefore",s),e.$watch("model.error",s),e.$watch("model.pristine",s)}e.onIconAfterClick=function(){e.hasOwnProperty("iconAfterClicked")&&e.iconAfterClicked()},e.onIconBeforeClick=function(){e.hasOwnProperty("iconBeforeClicked")&&e.iconBeforeClicked()},e.onFocus=function(){e.hasOwnProperty("focused")&&e.focused()},e.onBlur=function(){e.hasOwnProperty("blurred")&&e.blurred()}},e}();e.TextFieldDirective=o,angular.module("formFor").directive("textField",["$log","$timeout","FieldHelper",function(e,t,i){return new o(e,t,i)}])}(formFor||(formFor={}));var formFor;!function(e){var t,i,r,o,n=10,a=function(){function e(e,n,a,l){this.require="^formFor",this.restrict="EA",this.templateUrl="form-for/templates/type-ahead-field.html",this.scope={attribute:"@",debounce:"@?",disable:"=",filterDebounce:"@?",filterTextChanged:"&?",help:"@?",options:"="},t=e,i=n,r=a,o=l}return e.$inject=["$document","$log","$timeout","fieldHelper"],e.prototype.link=function(e,a,l,s){if(!e.attribute)return void i.error('Missing required field "attribute"');e.labelAttribute=l.labelAttribute||"label",e.valueAttribute=l.valueAttribute||"value",e.placeholder=l.hasOwnProperty("placeholder")?l.placeholder:"Select",e.tabIndex=l.tabIndex||0,e.scopeBuster={filter:""},o.manageLabel(e,l,!1),o.manageFieldRegistration(e,l,s);var u,d=function(){if(!u){var e=a.find("input");e.length&&(u=e[0])}u&&r(u.focus.bind(u))};e.close=function(){r(function(){e.isOpen=!1})},e.open=function(){e.disable||e.model.disabled||r(function(){e.isOpen=!0})},e.filteredOptions=[];var c=function(e){return"string"==typeof e?e.toLowerCase():""},f=function(){var t=e.options||[];if(e.filteredOptions.splice(0),e.scopeBuster.filter){var i=c(e.scopeBuster.filter);angular.forEach(t,function(t){var r=c(t[e.labelAttribute]).indexOf(i);r>=0&&e.filteredOptions.push(t)})}else angular.copy(t,e.filteredOptions)};e.searchTextChange=function(){},e.$watch("scopeBuster.filter",f),e.$watch("options.length",f);var p=function(t){t.ignoreFor!==e.model.uid&&e.close()};e.filterTextClick=function(t){e.isOpen&&(t.ignoreFor=e.model.uid)};var m;e.$watch("isOpen",function(){m&&r.cancel(m),m=r(function(){m=null,e.isOpen?t.on("click",p):t.off("click",p)},n)}),e.$on("$destroy",function(){t.off("click",p)}),e.setFilterFocus=function(){d()},e.mouseOver=function(t){e.mouseOverIndex=t,e.mouseOverOption=t>=0?e.filteredOptions[t]:null},e.selectOption=function(t){e.model.bindable=t&&t[e.valueAttribute],e.scopeBuster.filter=t&&t[e.labelAttribute]};var F=function(){e.model.bindable&&e.options&&e.options.forEach(function(t){e.model.bindable===t[e.valueAttribute]&&(e.scopeBuster.filter=t[e.labelAttribute])})};e.$watch("model.bindable",F),e.$watch("options.length",F),e.keyDown=function(t){switch(t.keyCode){case 27:e.close();break;case 13:e.isOpen?(e.selectOption(e.mouseOverOption),e.close()):e.open(),t.preventDefault();break;case 38:e.isOpen?e.mouseOver(e.mouseOverIndex>0?e.mouseOverIndex-1:e.filteredOptions.length-1):e.open();break;case 40:e.isOpen?e.mouseOver(e.mouseOverIndex<e.filteredOptions.length-1?e.mouseOverIndex+1:0):e.open();break;case 9:case 16:e.close();break;default:e.open()}},e.$watchCollection("[isOpen, filteredOptions.length]",function(){e.mouseOver(-1),e.isOpen&&d()}),e.filterTextChanged instanceof Function&&e.$watch("scopeBuster.filter",function(t){e.filterTextChanged({text:t})})},e.prototype.link.$inject=["$scope","$element","$attributes","formForController"],e}();e.TypeAheadFieldDirective=a,angular.module("formFor").directive("typeAheadField",["$document","$log","$timeout","FieldHelper",function(e,t,i,r){return new a(e,t,i,r)}])}(formFor||(formFor={}));var formFor;!function(e){!function(e){e[e.CHECKBOX="checkbox"]="CHECKBOX",e[e.NUMBER="number"]="NUMBER",e[e.PASSWORD="password"]="PASSWORD",e[e.RADIO="radio"]="RADIO",e[e.SELECT="select"]="SELECT",e[e.TEXT="text"]="TEXT"}(e.BuilderFieldType||(e.BuilderFieldType={}));e.BuilderFieldType}(formFor||(formFor={}));var formFor;!function(e){!function(e){e[e.COLLECTION_MAX_SIZE="COLLECTION_MAX_SIZE"]="COLLECTION_MAX_SIZE",e[e.COLLECTION_MIN_SIZE="COLLECTION_MIN_SIZE"]="COLLECTION_MIN_SIZE",
e[e.CUSTOM="CUSTOM"]="CUSTOM",e[e.MAXIMUM="MAXIMUM"]="MAXIMUM",e[e.MAX_LENGTH="MAX_LENGTH"]="MAX_LENGTH",e[e.MINIMUM="MINIMUM"]="MINIMUM",e[e.MIN_LENGTH="MIN_LENGTH"]="MIN_LENGTH",e[e.PATTERN="PATTERN"]="PATTERN",e[e.REQUIRED="REQUIRED_FIELD"]="REQUIRED",e[e.TYPE_EMAIL="TYPE_EMAIL"]="TYPE_EMAIL",e[e.TYPE_INTEGER="TYPE_INTEGER"]="TYPE_INTEGER",e[e.TYPE_NEGATIVE="TYPE_NEGATIVE"]="TYPE_NEGATIVE",e[e.TYPE_NON_NEGATIVE="TYPE_NON_NEGATIVE"]="TYPE_NON_NEGATIVE",e[e.TYPE_NUMERIC="TYPE_NUMERIC"]="TYPE_NUMERIC",e[e.TYPE_POSITIVE="TYPE_POSITIVE"]="TYPE_POSITIVE"}(e.ValidationFailureType||(e.ValidationFailureType={}));e.ValidationFailureType}(formFor||(formFor={}));var formFor;!function(e){!function(e){e[e.EMAIL="email"]="EMAIL",e[e.INTEGER="integer"]="INTEGER",e[e.NEGATIVE="negative"]="NEGATIVE",e[e.NON_NEGATIVE="nonNegative"]="NON_NEGATIVE",e[e.NUMBER="number"]="NUMBER",e[e.POSITIVE="positive"]="POSITIVE"}(e.ValidationFieldType||(e.ValidationFieldType={}));e.ValidationFieldType}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(){}return e}();e.BindableFieldWrapper=t}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function t(t,i,r,o){this.$interpolate_=t,this.formForConfiguration_=o,this.nestedObjectHelper_=new e.NestedObjectHelper(i),this.promiseUtils_=new e.PromiseUtils(r)}return t.prototype.isCollectionRequired=function(e,t){var i=this.getRulesFor_(e,t);return i&&i.collection&&i.collection.min?angular.isObject(i.collection.min)?i.collection.min.rule>0:i.collection.min>0:!1},t.prototype.isFieldRequired=function(e,t){var i=this.getRulesFor_(e,t);return i&&i.required?angular.isObject(i.required)?i.required.rule:!!i.required:!1},t.prototype.validateAll=function(e,t){var i=this.nestedObjectHelper_.flattenObjectKeys(e);return this.validateFields(e,i,t)},t.prototype.validateCollection=function(e,t,i){var r=this.getRulesFor_(t,i),o=this.nestedObjectHelper_.readAttribute(e,t);return r&&r.collection?(o=o||[],this.validateCollectionMinLength_(o,r.collection)||this.validateCollectionMaxLength_(o,r.collection)||this.promiseUtils_.resolve()):this.promiseUtils_.resolve()},t.prototype.validateField=function(e,t,i){var r=this.getRulesFor_(t,i),o=this.nestedObjectHelper_.readAttribute(e,t);return r?((void 0===o||null===o)&&(o=""),this.validateFieldRequired_(o,r)||this.validateFieldMinimum_(o,r)||this.validateFieldMinLength_(o,r)||this.validateFieldMaximum_(o,r)||this.validateFieldMaxLength_(o,r)||this.validateFieldType_(o,r)||this.validateFieldPattern_(o,r)||this.validateFieldCustom_(o,e,r)||this.promiseUtils_.resolve()):this.promiseUtils_.resolve()},t.prototype.validateFields=function(e,t,i){var r=this,o=this.promiseUtils_.defer(),n=[],a={};return angular.forEach(t,function(t){var o=r.getRulesFor_(t,i);if(o){var l;l=o.collection?r.validateCollection(e,t,i):r.validateField(e,t,i),l.then(angular.noop,function(e){r.nestedObjectHelper_.writeAttribute(a,t,e)}),n.push(l)}},this),this.promiseUtils_.waitForAll(n).then(o.resolve,function(){o.reject(a)}),o.promise},t.prototype.getRulesFor_=function(e,t){var i=e.replace(/\[[^\]]+\]/g,".collection.fields");return this.nestedObjectHelper_.readAttribute(t,i)},t.prototype.getFieldTypeFailureMessage_=function(e,t){return angular.isObject(e.type)?e.type.message:this.formForConfiguration_.getFailedValidationMessage(t)},t.isConsideredNumeric_=function(e,t){return e&&!isNaN(t)},t.prototype.validateCollectionMinLength_=function(t,i){if(i.min){var r=angular.isObject(i.min)?i.min.rule:i.min;if(t.length<r){var o;return o=angular.isObject(i.min)?i.min.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.COLLECTION_MIN_SIZE))({num:r}),this.promiseUtils_.reject(o)}}return null},t.prototype.validateCollectionMaxLength_=function(t,i){if(i.max){var r=angular.isObject(i.max)?i.max.rule:i.max;if(t.length>r){var o;return o=angular.isObject(i.max)?i.max.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.COLLECTION_MAX_SIZE))({num:r}),this.promiseUtils_.reject(o)}}return null},t.prototype.validateFieldCustom_=function(t,i,r){var o=this;if(r.custom){var n,a;angular.isFunction(r.custom)?(n=this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.CUSTOM),a=r.custom):(n=r.custom.message,a=r.custom.rule);try{var l=a(t,i)}catch(s){return this.promiseUtils_.reject(s.message||n)}return angular.isObject(l)&&angular.isFunction(l.then)?l.then(function(e){return o.promiseUtils_.resolve(e)},function(e){return o.promiseUtils_.reject(e||n)}):l?this.promiseUtils_.resolve(l):this.promiseUtils_.reject(n)}return null},t.prototype.validateFieldMaximum_=function(t,i){if(i.maximum){var r=t.toString(),o=Number(t),n=angular.isObject(i.maximum)?i.maximum.rule:i.maximum;if(r&&!isNaN(o)&&o>n){var a;return a=angular.isObject(i.maximum)?i.maximum.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.MAXIMUM))({num:n}),this.promiseUtils_.reject(a)}}return null},t.prototype.validateFieldMaxLength_=function(t,i){if(i.maxlength){var r=angular.isObject(i.maxlength)?i.maxlength.rule:i.maxlength;if(t.length>r){var o;return o=angular.isObject(i.maxlength)?i.maxlength.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.MAX_LENGTH))({num:r}),this.promiseUtils_.reject(o)}}return null},t.prototype.validateFieldMinimum_=function(t,i){if(i.minimum){var r=t.toString(),o=Number(t),n=angular.isObject(i.minimum)?i.minimum.rule:i.minimum;if(r&&!isNaN(o)&&n>o){var a;return a=angular.isObject(i.minimum)?i.minimum.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.MINIMUM))({num:n}),this.promiseUtils_.reject(a)}}return null},t.prototype.validateFieldMinLength_=function(t,i){if(i.minlength){var r=angular.isObject(i.minlength)?i.minlength.rule:i.minlength;if(t&&t.length<r){var o;return o=angular.isObject(i.minlength)?i.minlength.message:this.$interpolate_(this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.MIN_LENGTH))({num:r}),this.promiseUtils_.reject(o)}}return null},t.prototype.validateFieldRequired_=function(t,i){if(i.required){var r=angular.isObject(i.required)?i.required.rule:i.required,o=t.toString().replace(/\s+$/,""),n=Number(t);if(r&&!o&&!n){var a;return a=angular.isObject(i.required)?i.required.message:this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.REQUIRED),this.promiseUtils_.reject(a)}}return null},t.prototype.validateFieldPattern_=function(t,i){if(i.pattern){var r=i.pattern instanceof RegExp,o=r?i.pattern:i.pattern.rule;if(t&&!o.exec(t)){var n=r?this.formForConfiguration_.getFailedValidationMessage(e.ValidationFailureType.PATTERN):i.pattern.message;return this.promiseUtils_.reject(n)}}return null},t.prototype.validateFieldType_=function(i,r){if(r.type){var o=angular.isObject(r.type)?r.type.rule:r.type,n=i.toString(),a=Number(i);if(o)for(var l=o.split(" "),s=0,u=l.length;u>s;s++){var d=l[s];switch(d){case e.ValidationFieldType.INTEGER:if(n&&(isNaN(a)||a%1!==0))return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_INTEGER));break;case e.ValidationFieldType.NUMBER:if(n&&isNaN(a))return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_NUMERIC));break;case e.ValidationFieldType.NEGATIVE:if(t.isConsideredNumeric_(n,a)&&a>=0)return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_NEGATIVE));break;case e.ValidationFieldType.NON_NEGATIVE:if(t.isConsideredNumeric_(n,a)&&0>a)return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_NON_NEGATIVE));break;case e.ValidationFieldType.POSITIVE:if(t.isConsideredNumeric_(n,a)&&0>=a)return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_POSITIVE));break;case e.ValidationFieldType.EMAIL:if(n&&!n.match(/^.+@.+\..+$/))return this.promiseUtils_.reject(this.getFieldTypeFailureMessage_(r,e.ValidationFailureType.TYPE_EMAIL))}}}return null},t}();e.ModelValidator=t,angular.module("formFor").service("ModelValidator",["$interpolate","$parse","$q","FormForConfiguration",function(e,i,r,o){return new t(e,i,r,o)}])}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function t(t,i){this.formForScope_=i,this.nestedObjectHelper_=new e.NestedObjectHelper(t),this.formForScope_.fieldNameToErrorMap=i.fieldNameToErrorMap||{},this.formForScope_.valid=!0,this.fieldNameToModifiedStateMap_={},this.formSubmitted_=!1,this.fieldNameToErrorMap_={},this.watchable=0}return t.prototype.getFieldError=function(e){return this.nestedObjectHelper_.readAttribute(this.formForScope_.fieldNameToErrorMap,e)},t.prototype.hasFieldBeenModified=function(e){return this.nestedObjectHelper_.readAttribute(this.fieldNameToModifiedStateMap_,e)},t.prototype.hasFormBeenSubmitted=function(){return this.formSubmitted_},t.prototype.isFormInvalid=function(){return!this.isFormValid()},t.prototype.isFormValid=function(){for(var e in this.fieldNameToErrorMap_)return!1;return!0},t.prototype.resetFieldErrors=function(){this.formForScope_.fieldNameToErrorMap={}},t.prototype.setFieldError=function(e,t){var i=this.nestedObjectHelper_.flattenAttribute(e);this.nestedObjectHelper_.writeAttribute(this.formForScope_.fieldNameToErrorMap,e,t),t?this.fieldNameToErrorMap_[i]=t:delete this.fieldNameToErrorMap_[i],this.formForScope_.valid=this.isFormValid(),this.watchable++},t.prototype.setFieldHasBeenModified=function(e,t){this.nestedObjectHelper_.writeAttribute(this.fieldNameToModifiedStateMap_,e,t),this.watchable++},t.prototype.setFormSubmitted=function(e){this.formSubmitted_=e,this.watchable++},t}();e.FormForStateHelper=t}(formFor||(formFor={}));var formFor;!function(e){var t=function(){function e(){}return e.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)):""},e}();e.StringUtil=t}(formFor||(formFor={}));
//# sourceMappingURL=form-for.min.js.map
{
"name": "angular-form-for",
"version": "4.0.6",
"version": "4.1.0",
"description": "Set of Angular directives to simplify creating and validating HTML forms.",

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

@@ -43,2 +43,7 @@ /// <reference path="../services/field-helper.ts" />

/**
* Optional class-name for field <label>.
*/
labelClass?:string;
/**
* Shared between formFor and CheckboxField directives.

@@ -45,0 +50,0 @@ */

@@ -44,2 +44,7 @@ /// <reference path="../services/form-for-configuration.ts" />

/**
* Optional class-name for <label>.
*/
labelClass?:string;
/**
* Optional attribute specifies that this field is a required field.

@@ -81,2 +86,3 @@ * If a required label has been provided, this component displays that value for required fields.

label: '@',
labelClass: '@?',
required: '@?',

@@ -83,0 +89,0 @@ uid: '@'

@@ -54,2 +54,7 @@ /// <reference path="../services/field-helper.ts" />

/**
* Optional class-name for field <label>.
*/
labelClass?:string;
/**
* Optional override for label key in options array.

@@ -56,0 +61,0 @@ * Defaults to "label".

@@ -76,2 +76,7 @@ /// <reference path="../services/field-helper.ts" />

/**
* Optional class-name for field <label>.
*/
labelClass?:string;
/**
* Shared between formFor and SelectField directives.

@@ -78,0 +83,0 @@ */

@@ -87,2 +87,7 @@ /// <reference path="../services/field-helper.ts" />

/**
* Optional class-name for field <label>.
*/
labelClass?:string;
/**
* Data shared between formFor and textField directives.

@@ -89,0 +94,0 @@ */

@@ -86,2 +86,7 @@ /// <reference path="../services/field-helper.ts" />

/**
* Optional class-name for field <label>.
*/
labelClass?:string;
/**
* Shared between formFor and TypeAheadField directives.

@@ -88,0 +93,0 @@ */

@@ -27,2 +27,14 @@ /// <reference path="form-for-configuration.ts" />

manageLabel($scope:ng.IScope, $attributes:ng.IAttributes, humanizeValueAttribute:boolean):void {
if (this.formForConfiguration_.autoGenerateLabels) {
$scope['label'] =
humanizeValueAttribute ?
StringUtil.humanize($scope['value']) :
StringUtil.humanize($scope['attribute']);
}
if (this.formForConfiguration_.labelClass) {
$scope['labelClass'] =
this.formForConfiguration_.labelClass;
}
if ($attributes.hasOwnProperty('label')) {

@@ -34,7 +46,6 @@ $attributes.$observe('label', function (label) {

if (this.formForConfiguration_.autoGenerateLabels) {
$scope['label'] =
humanizeValueAttribute ?
StringUtil.humanize($scope['value']) :
StringUtil.humanize($scope['attribute']);
if ($attributes.hasOwnProperty('labelClass')) {
$attributes.$observe('labelClass', function (labelClass) {
$scope['labelClass'] = labelClass;
});
}

@@ -41,0 +52,0 @@ }

@@ -18,2 +18,3 @@ /// <reference path="../../definitions/angular.d.ts" />

public helpIcon:string = null;
public labelClass:string = null;
public requiredLabel:string = null;

@@ -160,3 +161,11 @@

/**
* Global class-name for field <label>s.
*/
public setLabelClass(value:string):void {
this.labelClass = value;
}
/**
* Sets a default label to be displayed beside each text and select input for required attributes only.

@@ -163,0 +172,0 @@ */

@@ -468,3 +468,3 @@ /// <reference path="../../definitions/angular.d.ts" />

if (!regExp.exec(value)) {
if (value && !regExp.exec(value)) {
var failureMessage:string = isRegExp ?

@@ -471,0 +471,0 @@ this.formForConfiguration_.getFailedValidationMessage(ValidationFailureType.PATTERN) :

@@ -324,2 +324,11 @@ describe('ModelValidator', function() {

it('should not reject null or undefined value', function () {
expect(ModelValidator.validateField({number: null}, 'number', model.rules)).toBeResolved();
expect(ModelValidator.validateField({number: undefined}, 'number', model.rules)).toBeResolved();
});
it('should not reject an empty string', function () {
expect(ModelValidator.validateField({number: ''}, 'number', model.rules)).toBeResolved();
});
it('number should accept numeric input', function() {

@@ -513,7 +522,11 @@ expect(ModelValidator.validateField({number: 123}, 'number', model.rules)).toBeResolved();

it('should reject a null or undefined value', function() {
expect(ModelValidator.validateField({patternField: null}, 'patternField', model.rules)).toBeRejected();
expect(ModelValidator.validateField({patternField: undefined}, 'patternField', model.rules)).toBeRejected();
it('should not reject null or undefined value', function () {
expect(ModelValidator.validateField({patternField: null}, 'patternField', model.rules)).toBeResolved();
expect(ModelValidator.validateField({patternField: undefined}, 'patternField', model.rules)).toBeResolved();
});
it('should not reject an empty string', function () {
expect(ModelValidator.validateField({patternField: ''}, 'patternField', model.rules)).toBeResolved();
});
it('should reject strings not matching the specified pattern', function() {

@@ -520,0 +533,0 @@ expect(ModelValidator.validateField({patternField: 'abc'}, 'patternField', model.rules)).toBeRejected();

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

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 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 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 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 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