|
@@ -0,0 +1,2833 @@
|
|
|
+/*!
|
|
|
+* angular-formly JavaScript Library v0.0.0-semantically-released.0
|
|
|
+*
|
|
|
+* @license MIT (http://license.angular-formly.com)
|
|
|
+*
|
|
|
+* built with ♥ by Astrism <astrisms@gmail.com>, Kent C. Dodds <kent@doddsfamily.us>
|
|
|
+* (ó ì_í)=óò=(ì_í ò)
|
|
|
+*/
|
|
|
+(function webpackUniversalModuleDefinition(root, factory) {
|
|
|
+ if(typeof exports === 'object' && typeof module === 'object')
|
|
|
+ module.exports = factory(require("angular"), require("api-check"));
|
|
|
+ else if(typeof define === 'function' && define.amd)
|
|
|
+ define(["angular", "api-check"], factory);
|
|
|
+ else if(typeof exports === 'object')
|
|
|
+ exports["ngFormly"] = factory(require("angular"), require("api-check"));
|
|
|
+ else
|
|
|
+ root["ngFormly"] = factory(root["angular"], root["apiCheck"]);
|
|
|
+})(this, function(__WEBPACK_EXTERNAL_MODULE_3__, __WEBPACK_EXTERNAL_MODULE_5__) {
|
|
|
+return /******/ (function(modules) { // webpackBootstrap
|
|
|
+/******/ // The module cache
|
|
|
+/******/ var installedModules = {};
|
|
|
+
|
|
|
+/******/ // The require function
|
|
|
+/******/ function __webpack_require__(moduleId) {
|
|
|
+
|
|
|
+/******/ // Check if module is in cache
|
|
|
+/******/ if(installedModules[moduleId])
|
|
|
+/******/ return installedModules[moduleId].exports;
|
|
|
+
|
|
|
+/******/ // Create a new module (and put it into the cache)
|
|
|
+/******/ var module = installedModules[moduleId] = {
|
|
|
+/******/ exports: {},
|
|
|
+/******/ id: moduleId,
|
|
|
+/******/ loaded: false
|
|
|
+/******/ };
|
|
|
+
|
|
|
+/******/ // Execute the module function
|
|
|
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
|
+
|
|
|
+/******/ // Flag the module as loaded
|
|
|
+/******/ module.loaded = true;
|
|
|
+
|
|
|
+/******/ // Return the exports of the module
|
|
|
+/******/ return module.exports;
|
|
|
+/******/ }
|
|
|
+
|
|
|
+
|
|
|
+/******/ // expose the modules object (__webpack_modules__)
|
|
|
+/******/ __webpack_require__.m = modules;
|
|
|
+
|
|
|
+/******/ // expose the module cache
|
|
|
+/******/ __webpack_require__.c = installedModules;
|
|
|
+
|
|
|
+/******/ // __webpack_public_path__
|
|
|
+/******/ __webpack_require__.p = "";
|
|
|
+
|
|
|
+/******/ // Load entry module and return exports
|
|
|
+/******/ return __webpack_require__(0);
|
|
|
+/******/ })
|
|
|
+/************************************************************************/
|
|
|
+/******/ ([
|
|
|
+/* 0 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ var _indexCommon = __webpack_require__(1);
|
|
|
+
|
|
|
+ var _indexCommon2 = _interopRequireDefault(_indexCommon);
|
|
|
+
|
|
|
+ exports['default'] = _indexCommon2['default'];
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 1 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ var _angularFix = __webpack_require__(2);
|
|
|
+
|
|
|
+ var _angularFix2 = _interopRequireDefault(_angularFix);
|
|
|
+
|
|
|
+ var _providersFormlyApiCheck = __webpack_require__(4);
|
|
|
+
|
|
|
+ var _providersFormlyApiCheck2 = _interopRequireDefault(_providersFormlyApiCheck);
|
|
|
+
|
|
|
+ var _otherDocsBaseUrl = __webpack_require__(6);
|
|
|
+
|
|
|
+ var _otherDocsBaseUrl2 = _interopRequireDefault(_otherDocsBaseUrl);
|
|
|
+
|
|
|
+ var _providersFormlyUsability = __webpack_require__(7);
|
|
|
+
|
|
|
+ var _providersFormlyUsability2 = _interopRequireDefault(_providersFormlyUsability);
|
|
|
+
|
|
|
+ var _providersFormlyConfig = __webpack_require__(8);
|
|
|
+
|
|
|
+ var _providersFormlyConfig2 = _interopRequireDefault(_providersFormlyConfig);
|
|
|
+
|
|
|
+ var _providersFormlyValidationMessages = __webpack_require__(10);
|
|
|
+
|
|
|
+ var _providersFormlyValidationMessages2 = _interopRequireDefault(_providersFormlyValidationMessages);
|
|
|
+
|
|
|
+ var _servicesFormlyUtil = __webpack_require__(11);
|
|
|
+
|
|
|
+ var _servicesFormlyUtil2 = _interopRequireDefault(_servicesFormlyUtil);
|
|
|
+
|
|
|
+ var _servicesFormlyWarn = __webpack_require__(12);
|
|
|
+
|
|
|
+ var _servicesFormlyWarn2 = _interopRequireDefault(_servicesFormlyWarn);
|
|
|
+
|
|
|
+ var _directivesFormlyCustomValidation = __webpack_require__(13);
|
|
|
+
|
|
|
+ var _directivesFormlyCustomValidation2 = _interopRequireDefault(_directivesFormlyCustomValidation);
|
|
|
+
|
|
|
+ var _directivesFormlyField = __webpack_require__(14);
|
|
|
+
|
|
|
+ var _directivesFormlyField2 = _interopRequireDefault(_directivesFormlyField);
|
|
|
+
|
|
|
+ var _directivesFormlyFocus = __webpack_require__(15);
|
|
|
+
|
|
|
+ var _directivesFormlyFocus2 = _interopRequireDefault(_directivesFormlyFocus);
|
|
|
+
|
|
|
+ var _directivesFormlyForm = __webpack_require__(16);
|
|
|
+
|
|
|
+ var _directivesFormlyForm2 = _interopRequireDefault(_directivesFormlyForm);
|
|
|
+
|
|
|
+ var _directivesFormlyFormController = __webpack_require__(17);
|
|
|
+
|
|
|
+ var _directivesFormlyFormController2 = _interopRequireDefault(_directivesFormlyFormController);
|
|
|
+
|
|
|
+ var _runFormlyNgModelAttrsManipulator = __webpack_require__(18);
|
|
|
+
|
|
|
+ var _runFormlyNgModelAttrsManipulator2 = _interopRequireDefault(_runFormlyNgModelAttrsManipulator);
|
|
|
+
|
|
|
+ var _runFormlyCustomTags = __webpack_require__(19);
|
|
|
+
|
|
|
+ var _runFormlyCustomTags2 = _interopRequireDefault(_runFormlyCustomTags);
|
|
|
+
|
|
|
+ var ngModuleName = 'formly';
|
|
|
+
|
|
|
+ exports['default'] = ngModuleName;
|
|
|
+
|
|
|
+ var ngModule = _angularFix2['default'].module(ngModuleName, []);
|
|
|
+
|
|
|
+ ngModule.constant('formlyApiCheck', _providersFormlyApiCheck2['default']);
|
|
|
+ ngModule.constant('formlyErrorAndWarningsUrlPrefix', _otherDocsBaseUrl2['default']);
|
|
|
+ ngModule.constant('formlyVersion', ("0.0.0-semantically-released.0")); // <-- webpack variable
|
|
|
+
|
|
|
+ ngModule.provider('formlyUsability', _providersFormlyUsability2['default']);
|
|
|
+ ngModule.provider('formlyConfig', _providersFormlyConfig2['default']);
|
|
|
+
|
|
|
+ ngModule.factory('formlyValidationMessages', _providersFormlyValidationMessages2['default']);
|
|
|
+ ngModule.factory('formlyUtil', _servicesFormlyUtil2['default']);
|
|
|
+ ngModule.factory('formlyWarn', _servicesFormlyWarn2['default']);
|
|
|
+
|
|
|
+ ngModule.directive('formlyCustomValidation', _directivesFormlyCustomValidation2['default']);
|
|
|
+ ngModule.directive('formlyField', _directivesFormlyField2['default']);
|
|
|
+ ngModule.directive('formlyFocus', _directivesFormlyFocus2['default']);
|
|
|
+ ngModule.directive('formlyForm', _directivesFormlyForm2['default']);
|
|
|
+ ngModule.controller('FormlyFormController', _directivesFormlyFormController2['default']);
|
|
|
+
|
|
|
+ ngModule.run(_runFormlyNgModelAttrsManipulator2['default']);
|
|
|
+ ngModule.run(_runFormlyCustomTags2['default']);
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 2 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ // some versions of angular don't export the angular module properly,
|
|
|
+ // so we get it from window in this case.
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+ var angular = __webpack_require__(3);
|
|
|
+
|
|
|
+ /* istanbul ignore next */
|
|
|
+ if (!angular.version) {
|
|
|
+ angular = window.angular;
|
|
|
+ }
|
|
|
+ exports['default'] = angular;
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 3 */
|
|
|
+/***/ function(module, exports) {
|
|
|
+
|
|
|
+ module.exports = __WEBPACK_EXTERNAL_MODULE_3__;
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 4 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ var _angularFix = __webpack_require__(2);
|
|
|
+
|
|
|
+ var _angularFix2 = _interopRequireDefault(_angularFix);
|
|
|
+
|
|
|
+ var _apiCheck = __webpack_require__(5);
|
|
|
+
|
|
|
+ var _apiCheck2 = _interopRequireDefault(_apiCheck);
|
|
|
+
|
|
|
+ var apiCheck = (0, _apiCheck2['default'])({
|
|
|
+ output: {
|
|
|
+ prefix: 'angular-formly:',
|
|
|
+ docsBaseUrl: __webpack_require__(6)
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ function shapeRequiredIfNot(otherProps, propChecker) {
|
|
|
+ if (!_angularFix2['default'].isArray(otherProps)) {
|
|
|
+ otherProps = [otherProps];
|
|
|
+ }
|
|
|
+ var type = 'specified if these are not specified: `' + otherProps.join(', ') + '` (otherwise it\'s optional)';
|
|
|
+
|
|
|
+ function shapeRequiredIfNotDefinition(prop, propName, location, obj) {
|
|
|
+ var propExists = obj && obj.hasOwnProperty(propName);
|
|
|
+ var otherPropsExist = otherProps.some(function (otherProp) {
|
|
|
+ return obj && obj.hasOwnProperty(otherProp);
|
|
|
+ });
|
|
|
+ if (!otherPropsExist && !propExists) {
|
|
|
+ return apiCheck.utils.getError(propName, location, type);
|
|
|
+ } else if (propExists) {
|
|
|
+ return propChecker(prop, propName, location, obj);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ shapeRequiredIfNotDefinition.type = type;
|
|
|
+ return apiCheck.utils.checkerHelpers.setupChecker(shapeRequiredIfNotDefinition);
|
|
|
+ }
|
|
|
+
|
|
|
+ var formlyExpression = apiCheck.oneOfType([apiCheck.string, apiCheck.func]);
|
|
|
+ var specifyWrapperType = apiCheck.typeOrArrayOf(apiCheck.string).nullable;
|
|
|
+
|
|
|
+ var apiCheckProperty = apiCheck.func;
|
|
|
+
|
|
|
+ var apiCheckInstanceProperty = apiCheck.shape.onlyIf('apiCheck', apiCheck.func.withProperties({
|
|
|
+ warn: apiCheck.func,
|
|
|
+ 'throw': apiCheck.func,
|
|
|
+ shape: apiCheck.func
|
|
|
+ }));
|
|
|
+
|
|
|
+ var apiCheckFunctionProperty = apiCheck.shape.onlyIf('apiCheck', apiCheck.oneOf(['throw', 'warn']));
|
|
|
+
|
|
|
+ var formlyWrapperType = apiCheck.shape({
|
|
|
+ name: shapeRequiredIfNot('types', apiCheck.string).optional,
|
|
|
+ template: apiCheck.shape.ifNot('templateUrl', apiCheck.string).optional,
|
|
|
+ templateUrl: apiCheck.shape.ifNot('template', apiCheck.string).optional,
|
|
|
+ types: apiCheck.typeOrArrayOf(apiCheck.string).optional,
|
|
|
+ overwriteOk: apiCheck.bool.optional,
|
|
|
+ apiCheck: apiCheckProperty.optional,
|
|
|
+ apiCheckInstance: apiCheckInstanceProperty.optional,
|
|
|
+ apiCheckFunction: apiCheckFunctionProperty.optional,
|
|
|
+ apiCheckOptions: apiCheck.object.optional
|
|
|
+ }).strict;
|
|
|
+
|
|
|
+ var expressionProperties = apiCheck.objectOf(apiCheck.oneOfType([formlyExpression, apiCheck.shape({
|
|
|
+ expression: formlyExpression,
|
|
|
+ message: formlyExpression.optional
|
|
|
+ }).strict]));
|
|
|
+
|
|
|
+ var modelChecker = apiCheck.oneOfType([apiCheck.string, apiCheck.object]);
|
|
|
+
|
|
|
+ var templateManipulators = apiCheck.shape({
|
|
|
+ preWrapper: apiCheck.arrayOf(apiCheck.func).nullable.optional,
|
|
|
+ postWrapper: apiCheck.arrayOf(apiCheck.func).nullable.optional
|
|
|
+ }).strict.nullable;
|
|
|
+
|
|
|
+ var validatorChecker = apiCheck.objectOf(apiCheck.oneOfType([formlyExpression, apiCheck.shape({
|
|
|
+ expression: formlyExpression,
|
|
|
+ message: formlyExpression.optional
|
|
|
+ }).strict]));
|
|
|
+
|
|
|
+ var watcherChecker = apiCheck.typeOrArrayOf(apiCheck.shape({
|
|
|
+ expression: formlyExpression.optional,
|
|
|
+ listener: formlyExpression.optional,
|
|
|
+ runFieldExpressions: apiCheck.bool.optional
|
|
|
+ }));
|
|
|
+
|
|
|
+ var fieldOptionsApiShape = {
|
|
|
+ $$hashKey: apiCheck.any.optional,
|
|
|
+ type: apiCheck.shape.ifNot(['template', 'templateUrl'], apiCheck.string).optional,
|
|
|
+ template: apiCheck.shape.ifNot(['type', 'templateUrl'], apiCheck.oneOfType([apiCheck.string, apiCheck.func])).optional,
|
|
|
+ templateUrl: apiCheck.shape.ifNot(['type', 'template'], apiCheck.oneOfType([apiCheck.string, apiCheck.func])).optional,
|
|
|
+ key: apiCheck.oneOfType([apiCheck.string, apiCheck.number]).optional,
|
|
|
+ model: modelChecker.optional,
|
|
|
+ originalModel: modelChecker.optional,
|
|
|
+ className: apiCheck.string.optional,
|
|
|
+ id: apiCheck.string.optional,
|
|
|
+ name: apiCheck.string.optional,
|
|
|
+ expressionProperties: expressionProperties.optional,
|
|
|
+ extras: apiCheck.shape({
|
|
|
+ validateOnModelChange: apiCheck.bool.optional,
|
|
|
+ skipNgModelAttrsManipulator: apiCheck.oneOfType([apiCheck.string, apiCheck.bool]).optional
|
|
|
+ }).strict.optional,
|
|
|
+ data: apiCheck.object.optional,
|
|
|
+ templateOptions: apiCheck.object.optional,
|
|
|
+ wrapper: specifyWrapperType.optional,
|
|
|
+ modelOptions: apiCheck.shape({
|
|
|
+ updateOn: apiCheck.string.optional,
|
|
|
+ debounce: apiCheck.oneOfType([apiCheck.objectOf(apiCheck.number), apiCheck.number]).optional,
|
|
|
+ allowInvalid: apiCheck.bool.optional,
|
|
|
+ getterSetter: apiCheck.bool.optional,
|
|
|
+ timezone: apiCheck.string.optional
|
|
|
+ }).optional,
|
|
|
+ watcher: watcherChecker.optional,
|
|
|
+ validators: validatorChecker.optional,
|
|
|
+ asyncValidators: validatorChecker.optional,
|
|
|
+ parsers: apiCheck.arrayOf(formlyExpression).optional,
|
|
|
+ formatters: apiCheck.arrayOf(formlyExpression).optional,
|
|
|
+ noFormControl: apiCheck.bool.optional,
|
|
|
+ hide: apiCheck.bool.optional,
|
|
|
+ hideExpression: formlyExpression.optional,
|
|
|
+ ngModelElAttrs: apiCheck.objectOf(apiCheck.string).optional,
|
|
|
+ ngModelAttrs: apiCheck.objectOf(apiCheck.shape({
|
|
|
+ statement: apiCheck.shape.ifNot(['value', 'attribute', 'bound', 'boolean'], apiCheck.any).optional,
|
|
|
+ value: apiCheck.shape.ifNot('statement', apiCheck.any).optional,
|
|
|
+ attribute: apiCheck.shape.ifNot('statement', apiCheck.any).optional,
|
|
|
+ bound: apiCheck.shape.ifNot('statement', apiCheck.any).optional,
|
|
|
+ boolean: apiCheck.shape.ifNot('statement', apiCheck.any).optional
|
|
|
+ }).strict).optional,
|
|
|
+ elementAttributes: apiCheck.objectOf(apiCheck.string).optional,
|
|
|
+ optionsTypes: apiCheck.typeOrArrayOf(apiCheck.string).optional,
|
|
|
+ link: apiCheck.func.optional,
|
|
|
+ controller: apiCheck.oneOfType([apiCheck.string, apiCheck.func, apiCheck.array]).optional,
|
|
|
+ validation: apiCheck.shape({
|
|
|
+ show: apiCheck.bool.nullable.optional,
|
|
|
+ messages: apiCheck.objectOf(formlyExpression).optional,
|
|
|
+ errorExistsAndShouldBeVisible: apiCheck.bool.optional
|
|
|
+ }).optional,
|
|
|
+ formControl: apiCheck.typeOrArrayOf(apiCheck.object).optional,
|
|
|
+ value: apiCheck.func.optional,
|
|
|
+ runExpressions: apiCheck.func.optional,
|
|
|
+ templateManipulators: templateManipulators.optional,
|
|
|
+ resetModel: apiCheck.func.optional,
|
|
|
+ updateInitialValue: apiCheck.func.optional,
|
|
|
+ initialValue: apiCheck.any.optional,
|
|
|
+ defaultValue: apiCheck.any.optional
|
|
|
+ };
|
|
|
+
|
|
|
+ var formlyFieldOptions = apiCheck.shape(fieldOptionsApiShape).strict;
|
|
|
+
|
|
|
+ var formOptionsApi = apiCheck.shape({
|
|
|
+ formState: apiCheck.object.optional,
|
|
|
+ resetModel: apiCheck.func.optional,
|
|
|
+ updateInitialValue: apiCheck.func.optional,
|
|
|
+ removeChromeAutoComplete: apiCheck.bool.optional,
|
|
|
+ parseKeyArrays: apiCheck.bool.optional,
|
|
|
+ templateManipulators: templateManipulators.optional,
|
|
|
+ manualModelWatcher: apiCheck.oneOfType([apiCheck.bool, apiCheck.func]).optional,
|
|
|
+ watchAllExpressions: apiCheck.bool.optional,
|
|
|
+ wrapper: specifyWrapperType.optional,
|
|
|
+ fieldTransform: apiCheck.oneOfType([apiCheck.func, apiCheck.array]).optional,
|
|
|
+ data: apiCheck.object.optional
|
|
|
+ }).strict;
|
|
|
+
|
|
|
+ var fieldGroup = apiCheck.shape({
|
|
|
+ $$hashKey: apiCheck.any.optional,
|
|
|
+ key: apiCheck.oneOfType([apiCheck.string, apiCheck.number]).optional,
|
|
|
+ // danger. Nested field groups wont get api-checked...
|
|
|
+ fieldGroup: apiCheck.arrayOf(apiCheck.oneOfType([formlyFieldOptions, apiCheck.object])),
|
|
|
+ className: apiCheck.string.optional,
|
|
|
+ options: formOptionsApi.optional,
|
|
|
+ templateOptions: apiCheck.object.optional,
|
|
|
+ wrapper: specifyWrapperType.optional,
|
|
|
+ watcher: watcherChecker.optional,
|
|
|
+ hide: apiCheck.bool.optional,
|
|
|
+ hideExpression: formlyExpression.optional,
|
|
|
+ data: apiCheck.object.optional,
|
|
|
+ model: modelChecker.optional,
|
|
|
+ form: apiCheck.object.optional,
|
|
|
+ elementAttributes: apiCheck.objectOf(apiCheck.string).optional
|
|
|
+ }).strict;
|
|
|
+
|
|
|
+ var typeOptionsDefaultOptions = _angularFix2['default'].copy(fieldOptionsApiShape);
|
|
|
+ typeOptionsDefaultOptions.key = apiCheck.string.optional;
|
|
|
+
|
|
|
+ var formlyTypeOptions = apiCheck.shape({
|
|
|
+ name: apiCheck.string,
|
|
|
+ template: apiCheck.shape.ifNot('templateUrl', apiCheck.oneOfType([apiCheck.string, apiCheck.func])).optional,
|
|
|
+ templateUrl: apiCheck.shape.ifNot('template', apiCheck.oneOfType([apiCheck.string, apiCheck.func])).optional,
|
|
|
+ controller: apiCheck.oneOfType([apiCheck.func, apiCheck.string, apiCheck.array]).optional,
|
|
|
+ link: apiCheck.func.optional,
|
|
|
+ defaultOptions: apiCheck.oneOfType([apiCheck.func, apiCheck.shape(typeOptionsDefaultOptions)]).optional,
|
|
|
+ 'extends': apiCheck.string.optional,
|
|
|
+ wrapper: specifyWrapperType.optional,
|
|
|
+ data: apiCheck.object.optional,
|
|
|
+ apiCheck: apiCheckProperty.optional,
|
|
|
+ apiCheckInstance: apiCheckInstanceProperty.optional,
|
|
|
+ apiCheckFunction: apiCheckFunctionProperty.optional,
|
|
|
+ apiCheckOptions: apiCheck.object.optional,
|
|
|
+ overwriteOk: apiCheck.bool.optional
|
|
|
+ }).strict;
|
|
|
+
|
|
|
+ _angularFix2['default'].extend(apiCheck, {
|
|
|
+ formlyTypeOptions: formlyTypeOptions, formlyFieldOptions: formlyFieldOptions, formlyExpression: formlyExpression, formlyWrapperType: formlyWrapperType, fieldGroup: fieldGroup, formOptionsApi: formOptionsApi
|
|
|
+ });
|
|
|
+
|
|
|
+ exports['default'] = apiCheck;
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 5 */
|
|
|
+/***/ function(module, exports) {
|
|
|
+
|
|
|
+ module.exports = __WEBPACK_EXTERNAL_MODULE_5__;
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 6 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ "use strict";
|
|
|
+
|
|
|
+ Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+ exports["default"] = "https://github.com/formly-js/angular-formly/blob/" + ("0.0.0-semantically-released.0") + "/other/ERRORS_AND_WARNINGS.md#";
|
|
|
+ module.exports = exports["default"];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 7 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ formlyUsability.$inject = ["formlyApiCheck", "formlyErrorAndWarningsUrlPrefix"];
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ var _angularFix = __webpack_require__(2);
|
|
|
+
|
|
|
+ var _angularFix2 = _interopRequireDefault(_angularFix);
|
|
|
+
|
|
|
+ exports['default'] = formlyUsability;
|
|
|
+
|
|
|
+ // @ngInject
|
|
|
+ function formlyUsability(formlyApiCheck, formlyErrorAndWarningsUrlPrefix) {
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ _angularFix2['default'].extend(this, {
|
|
|
+ getFormlyError: getFormlyError,
|
|
|
+ getFieldError: getFieldError,
|
|
|
+ checkWrapper: checkWrapper,
|
|
|
+ checkWrapperTemplate: checkWrapperTemplate,
|
|
|
+ getErrorMessage: getErrorMessage,
|
|
|
+ $get: function $get() {
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ function getFieldError(errorInfoSlug, message, field) {
|
|
|
+ if (arguments.length < 3) {
|
|
|
+ field = message;
|
|
|
+ message = errorInfoSlug;
|
|
|
+ errorInfoSlug = null;
|
|
|
+ }
|
|
|
+ return new Error(getErrorMessage(errorInfoSlug, message) + (' Field definition: ' + _angularFix2['default'].toJson(field)));
|
|
|
+ }
|
|
|
+
|
|
|
+ function getFormlyError(errorInfoSlug, message) {
|
|
|
+ if (!message) {
|
|
|
+ message = errorInfoSlug;
|
|
|
+ errorInfoSlug = null;
|
|
|
+ }
|
|
|
+ return new Error(getErrorMessage(errorInfoSlug, message));
|
|
|
+ }
|
|
|
+
|
|
|
+ function getErrorMessage(errorInfoSlug, message) {
|
|
|
+ var url = '';
|
|
|
+ if (errorInfoSlug !== null) {
|
|
|
+ url = '' + formlyErrorAndWarningsUrlPrefix + errorInfoSlug;
|
|
|
+ }
|
|
|
+ return 'Formly Error: ' + message + '. ' + url;
|
|
|
+ }
|
|
|
+
|
|
|
+ function checkWrapper(wrapper) {
|
|
|
+ formlyApiCheck['throw'](formlyApiCheck.formlyWrapperType, wrapper, {
|
|
|
+ prefix: 'formlyConfig.setWrapper',
|
|
|
+ urlSuffix: 'setwrapper-validation-failed'
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function checkWrapperTemplate(template, additionalInfo) {
|
|
|
+ var formlyTransclude = '<formly-transclude></formly-transclude>';
|
|
|
+ if (template.indexOf(formlyTransclude) === -1) {
|
|
|
+ throw getFormlyError('Template wrapper templates must use "' + formlyTransclude + '" somewhere in them. ' + ('This one does not have "<formly-transclude></formly-transclude>" in it: ' + template) + '\n' + ('Additional information: ' + JSON.stringify(additionalInfo)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 8 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ formlyConfig.$inject = ["formlyUsabilityProvider", "formlyErrorAndWarningsUrlPrefix", "formlyApiCheck"];
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
|
|
|
+
|
|
|
+ var _angularFix = __webpack_require__(2);
|
|
|
+
|
|
|
+ var _angularFix2 = _interopRequireDefault(_angularFix);
|
|
|
+
|
|
|
+ var _otherUtils = __webpack_require__(9);
|
|
|
+
|
|
|
+ var _otherUtils2 = _interopRequireDefault(_otherUtils);
|
|
|
+
|
|
|
+ exports['default'] = formlyConfig;
|
|
|
+
|
|
|
+ // @ngInject
|
|
|
+ function formlyConfig(formlyUsabilityProvider, formlyErrorAndWarningsUrlPrefix, formlyApiCheck) {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ var typeMap = {};
|
|
|
+ var templateWrappersMap = {};
|
|
|
+ var defaultWrapperName = 'default';
|
|
|
+ var _this = this;
|
|
|
+ var getError = formlyUsabilityProvider.getFormlyError;
|
|
|
+
|
|
|
+ _angularFix2['default'].extend(this, {
|
|
|
+ setType: setType,
|
|
|
+ getType: getType,
|
|
|
+ getTypes: getTypes,
|
|
|
+ getTypeHeritage: getTypeHeritage,
|
|
|
+ setWrapper: setWrapper,
|
|
|
+ getWrapper: getWrapper,
|
|
|
+ getWrapperByType: getWrapperByType,
|
|
|
+ removeWrapperByName: removeWrapperByName,
|
|
|
+ removeWrappersForType: removeWrappersForType,
|
|
|
+ disableWarnings: false,
|
|
|
+ extras: {
|
|
|
+ disableNgModelAttrsManipulator: false,
|
|
|
+ fieldTransform: [],
|
|
|
+ ngModelAttrsManipulatorPreferUnbound: false,
|
|
|
+ removeChromeAutoComplete: false,
|
|
|
+ parseKeyArrays: false,
|
|
|
+ defaultHideDirective: 'ng-if',
|
|
|
+ getFieldId: null
|
|
|
+ },
|
|
|
+ templateManipulators: {
|
|
|
+ preWrapper: [],
|
|
|
+ postWrapper: []
|
|
|
+ },
|
|
|
+ $get: function $get() {
|
|
|
+ return _this2;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ function setType(options) {
|
|
|
+ if (_angularFix2['default'].isArray(options)) {
|
|
|
+ var _ret = (function () {
|
|
|
+ var allTypes = [];
|
|
|
+ _angularFix2['default'].forEach(options, function (item) {
|
|
|
+ allTypes.push(setType(item));
|
|
|
+ });
|
|
|
+ return {
|
|
|
+ v: allTypes
|
|
|
+ };
|
|
|
+ })();
|
|
|
+
|
|
|
+ if (typeof _ret === 'object') return _ret.v;
|
|
|
+ } else if (_angularFix2['default'].isObject(options)) {
|
|
|
+ checkType(options);
|
|
|
+ if (options['extends']) {
|
|
|
+ extendTypeOptions(options);
|
|
|
+ }
|
|
|
+ typeMap[options.name] = options;
|
|
|
+ return typeMap[options.name];
|
|
|
+ } else {
|
|
|
+ throw getError('You must provide an object or array for setType. You provided: ' + JSON.stringify(arguments));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function checkType(options) {
|
|
|
+ formlyApiCheck['throw'](formlyApiCheck.formlyTypeOptions, options, {
|
|
|
+ prefix: 'formlyConfig.setType',
|
|
|
+ url: 'settype-validation-failed'
|
|
|
+ });
|
|
|
+ if (!options.overwriteOk) {
|
|
|
+ checkOverwrite(options.name, typeMap, options, 'types');
|
|
|
+ } else {
|
|
|
+ options.overwriteOk = undefined;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function extendTypeOptions(options) {
|
|
|
+ var extendsType = getType(options['extends'], true, options);
|
|
|
+ extendTypeControllerFunction(options, extendsType);
|
|
|
+ extendTypeLinkFunction(options, extendsType);
|
|
|
+ extendTypeDefaultOptions(options, extendsType);
|
|
|
+ _otherUtils2['default'].reverseDeepMerge(options, extendsType);
|
|
|
+ extendTemplate(options, extendsType);
|
|
|
+ }
|
|
|
+
|
|
|
+ function extendTemplate(options, extendsType) {
|
|
|
+ if (options.template && extendsType.templateUrl) {
|
|
|
+ delete options.templateUrl;
|
|
|
+ } else if (options.templateUrl && extendsType.template) {
|
|
|
+ delete options.template;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function extendTypeControllerFunction(options, extendsType) {
|
|
|
+ var extendsCtrl = extendsType.controller;
|
|
|
+ if (!_angularFix2['default'].isDefined(extendsCtrl)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var optionsCtrl = options.controller;
|
|
|
+ if (_angularFix2['default'].isDefined(optionsCtrl)) {
|
|
|
+ options.controller = function ($scope, $controller) {
|
|
|
+ $controller(extendsCtrl, { $scope: $scope });
|
|
|
+ $controller(optionsCtrl, { $scope: $scope });
|
|
|
+ };
|
|
|
+ options.controller.$inject = ['$scope', '$controller'];
|
|
|
+ } else {
|
|
|
+ options.controller = extendsCtrl;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function extendTypeLinkFunction(options, extendsType) {
|
|
|
+ var extendsFn = extendsType.link;
|
|
|
+ if (!_angularFix2['default'].isDefined(extendsFn)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var optionsFn = options.link;
|
|
|
+ if (_angularFix2['default'].isDefined(optionsFn)) {
|
|
|
+ options.link = function () {
|
|
|
+ extendsFn.apply(undefined, arguments);
|
|
|
+ optionsFn.apply(undefined, arguments);
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ options.link = extendsFn;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function extendTypeDefaultOptions(options, extendsType) {
|
|
|
+ var extendsDO = extendsType.defaultOptions;
|
|
|
+ if (!_angularFix2['default'].isDefined(extendsDO)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var optionsDO = options.defaultOptions || {};
|
|
|
+ var optionsDOIsFn = _angularFix2['default'].isFunction(optionsDO);
|
|
|
+ var extendsDOIsFn = _angularFix2['default'].isFunction(extendsDO);
|
|
|
+ if (extendsDOIsFn) {
|
|
|
+ options.defaultOptions = function defaultOptions(opts, scope) {
|
|
|
+ var extendsDefaultOptions = extendsDO(opts, scope);
|
|
|
+ var mergedDefaultOptions = {};
|
|
|
+ _otherUtils2['default'].reverseDeepMerge(mergedDefaultOptions, opts, extendsDefaultOptions);
|
|
|
+ var extenderOptionsDefaultOptions = optionsDO;
|
|
|
+ if (optionsDOIsFn) {
|
|
|
+ extenderOptionsDefaultOptions = extenderOptionsDefaultOptions(mergedDefaultOptions, scope);
|
|
|
+ }
|
|
|
+ _otherUtils2['default'].reverseDeepMerge(extenderOptionsDefaultOptions, extendsDefaultOptions);
|
|
|
+ return extenderOptionsDefaultOptions;
|
|
|
+ };
|
|
|
+ } else if (optionsDOIsFn) {
|
|
|
+ options.defaultOptions = function defaultOptions(opts, scope) {
|
|
|
+ var newDefaultOptions = {};
|
|
|
+ _otherUtils2['default'].reverseDeepMerge(newDefaultOptions, opts, extendsDO);
|
|
|
+ return optionsDO(newDefaultOptions, scope);
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function getType(name, throwError, errorContext) {
|
|
|
+ if (!name) {
|
|
|
+ return undefined;
|
|
|
+ }
|
|
|
+ var type = typeMap[name];
|
|
|
+ if (!type && throwError === true) {
|
|
|
+ throw getError('There is no type by the name of "' + name + '": ' + JSON.stringify(errorContext));
|
|
|
+ } else {
|
|
|
+ return type;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function getTypes() {
|
|
|
+ return typeMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getTypeHeritage(parent) {
|
|
|
+ var heritage = [];
|
|
|
+ var type = parent;
|
|
|
+ if (_angularFix2['default'].isString(type)) {
|
|
|
+ type = getType(parent);
|
|
|
+ }
|
|
|
+ parent = type['extends'];
|
|
|
+ while (parent) {
|
|
|
+ type = getType(parent);
|
|
|
+ heritage.push(type);
|
|
|
+ parent = type['extends'];
|
|
|
+ }
|
|
|
+ return heritage;
|
|
|
+ }
|
|
|
+
|
|
|
+ function setWrapper(_x, _x2) {
|
|
|
+ var _again = true;
|
|
|
+
|
|
|
+ _function: while (_again) {
|
|
|
+ var options = _x,
|
|
|
+ name = _x2;
|
|
|
+ _again = false;
|
|
|
+
|
|
|
+ if (_angularFix2['default'].isArray(options)) {
|
|
|
+ return options.map(function (wrapperOptions) {
|
|
|
+ return setWrapper(wrapperOptions);
|
|
|
+ });
|
|
|
+ } else if (_angularFix2['default'].isObject(options)) {
|
|
|
+ options.types = getOptionsTypes(options);
|
|
|
+ options.name = getOptionsName(options, name);
|
|
|
+ checkWrapperAPI(options);
|
|
|
+ templateWrappersMap[options.name] = options;
|
|
|
+ return options;
|
|
|
+ } else if (_angularFix2['default'].isString(options)) {
|
|
|
+ _x = {
|
|
|
+ template: options,
|
|
|
+ name: name
|
|
|
+ };
|
|
|
+ _x2 = undefined;
|
|
|
+ _again = true;
|
|
|
+ continue _function;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function getOptionsTypes(options) {
|
|
|
+ if (_angularFix2['default'].isString(options.types)) {
|
|
|
+ return [options.types];
|
|
|
+ }
|
|
|
+ if (!_angularFix2['default'].isDefined(options.types)) {
|
|
|
+ return [];
|
|
|
+ } else {
|
|
|
+ return options.types;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function getOptionsName(options, name) {
|
|
|
+ return options.name || name || options.types.join(' ') || defaultWrapperName;
|
|
|
+ }
|
|
|
+
|
|
|
+ function checkWrapperAPI(options) {
|
|
|
+ formlyUsabilityProvider.checkWrapper(options);
|
|
|
+ if (options.template) {
|
|
|
+ formlyUsabilityProvider.checkWrapperTemplate(options.template, options);
|
|
|
+ }
|
|
|
+ if (!options.overwriteOk) {
|
|
|
+ checkOverwrite(options.name, templateWrappersMap, options, 'templateWrappers');
|
|
|
+ } else {
|
|
|
+ delete options.overwriteOk;
|
|
|
+ }
|
|
|
+ checkWrapperTypes(options);
|
|
|
+ }
|
|
|
+
|
|
|
+ function checkWrapperTypes(options) {
|
|
|
+ var shouldThrow = !_angularFix2['default'].isArray(options.types) || !options.types.every(_angularFix2['default'].isString);
|
|
|
+ if (shouldThrow) {
|
|
|
+ throw getError('Attempted to create a template wrapper with types that is not a string or an array of strings');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function checkOverwrite(property, object, newValue, objectName) {
|
|
|
+ if (object.hasOwnProperty(property)) {
|
|
|
+ warn('overwriting-types-or-wrappers', ['Attempting to overwrite ' + property + ' on ' + objectName + ' which is currently', JSON.stringify(object[property]) + ' with ' + JSON.stringify(newValue), 'To supress this warning, specify the property "overwriteOk: true"'].join(' '));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function getWrapper(name) {
|
|
|
+ return templateWrappersMap[name || defaultWrapperName];
|
|
|
+ }
|
|
|
+
|
|
|
+ function getWrapperByType(type) {
|
|
|
+ /* eslint prefer-const:0 */
|
|
|
+ var wrappers = [];
|
|
|
+ for (var _name in templateWrappersMap) {
|
|
|
+ if (templateWrappersMap.hasOwnProperty(_name)) {
|
|
|
+ if (templateWrappersMap[_name].types && templateWrappersMap[_name].types.indexOf(type) !== -1) {
|
|
|
+ wrappers.push(templateWrappersMap[_name]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return wrappers;
|
|
|
+ }
|
|
|
+
|
|
|
+ function removeWrapperByName(name) {
|
|
|
+ var wrapper = templateWrappersMap[name];
|
|
|
+ delete templateWrappersMap[name];
|
|
|
+ return wrapper;
|
|
|
+ }
|
|
|
+
|
|
|
+ function removeWrappersForType(type) {
|
|
|
+ var wrappers = getWrapperByType(type);
|
|
|
+ if (!wrappers) {
|
|
|
+ return undefined;
|
|
|
+ }
|
|
|
+ if (!_angularFix2['default'].isArray(wrappers)) {
|
|
|
+ return removeWrapperByName(wrappers.name);
|
|
|
+ } else {
|
|
|
+ wrappers.forEach(function (wrapper) {
|
|
|
+ return removeWrapperByName(wrapper.name);
|
|
|
+ });
|
|
|
+ return wrappers;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function warn() {
|
|
|
+ if (!_this.disableWarnings && console.warn) {
|
|
|
+ /* eslint no-console:0 */
|
|
|
+ var args = Array.prototype.slice.call(arguments);
|
|
|
+ var warnInfoSlug = args.shift();
|
|
|
+ args.unshift('Formly Warning:');
|
|
|
+ args.push('' + formlyErrorAndWarningsUrlPrefix + warnInfoSlug);
|
|
|
+ console.warn.apply(console, _toConsumableArray(args));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 9 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ var _angularFix = __webpack_require__(2);
|
|
|
+
|
|
|
+ var _angularFix2 = _interopRequireDefault(_angularFix);
|
|
|
+
|
|
|
+ exports['default'] = {
|
|
|
+ containsSelector: containsSelector, containsSpecialChar: containsSpecialChar, formlyEval: formlyEval, getFieldId: getFieldId, reverseDeepMerge: reverseDeepMerge, findByNodeName: findByNodeName,
|
|
|
+ arrayify: arrayify, extendFunction: extendFunction, extendArray: extendArray, startsWith: startsWith, contains: contains
|
|
|
+ };
|
|
|
+
|
|
|
+ function containsSelector(string) {
|
|
|
+ return containsSpecialChar(string, '.') || containsSpecialChar(string, '[') && containsSpecialChar(string, ']');
|
|
|
+ }
|
|
|
+
|
|
|
+ function containsSpecialChar(a, b) {
|
|
|
+ if (!a || !a.indexOf) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return a.indexOf(b) !== -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ function formlyEval(scope, expression, $modelValue, $viewValue, extraLocals) {
|
|
|
+ if (_angularFix2['default'].isFunction(expression)) {
|
|
|
+ return expression($viewValue, $modelValue, scope, extraLocals);
|
|
|
+ } else {
|
|
|
+ return scope.$eval(expression, _angularFix2['default'].extend({ $viewValue: $viewValue, $modelValue: $modelValue }, extraLocals));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function getFieldId(formId, options, index) {
|
|
|
+ if (options.id) {
|
|
|
+ return options.id;
|
|
|
+ }
|
|
|
+ var type = options.type;
|
|
|
+ if (!type && options.template) {
|
|
|
+ type = 'template';
|
|
|
+ } else if (!type && options.templateUrl) {
|
|
|
+ type = 'templateUrl';
|
|
|
+ }
|
|
|
+
|
|
|
+ return [formId, type, options.key, index].join('_');
|
|
|
+ }
|
|
|
+
|
|
|
+ function reverseDeepMerge(dest) {
|
|
|
+ _angularFix2['default'].forEach(arguments, function (src, index) {
|
|
|
+ if (!index) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ _angularFix2['default'].forEach(src, function (val, prop) {
|
|
|
+ if (!_angularFix2['default'].isDefined(dest[prop])) {
|
|
|
+ dest[prop] = _angularFix2['default'].copy(val);
|
|
|
+ } else if (objAndSameType(dest[prop], val)) {
|
|
|
+ reverseDeepMerge(dest[prop], val);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ return dest;
|
|
|
+ }
|
|
|
+
|
|
|
+ function objAndSameType(obj1, obj2) {
|
|
|
+ return _angularFix2['default'].isObject(obj1) && _angularFix2['default'].isObject(obj2) && Object.getPrototypeOf(obj1) === Object.getPrototypeOf(obj2);
|
|
|
+ }
|
|
|
+
|
|
|
+ // recurse down a node tree to find a node with matching nodeName, for custom tags jQuery.find doesn't work in IE8
|
|
|
+ function findByNodeName(el, nodeName) {
|
|
|
+ if (!el.prop) {
|
|
|
+ // not a jQuery or jqLite object -> wrap it
|
|
|
+ el = _angularFix2['default'].element(el);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (el.prop('nodeName') === nodeName.toUpperCase()) {
|
|
|
+ return el;
|
|
|
+ }
|
|
|
+
|
|
|
+ var c = el.children();
|
|
|
+ for (var i = 0; c && i < c.length; i++) {
|
|
|
+ var node = findByNodeName(c[i], nodeName);
|
|
|
+ if (node) {
|
|
|
+ return node;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function arrayify(obj) {
|
|
|
+ if (obj && !_angularFix2['default'].isArray(obj)) {
|
|
|
+ obj = [obj];
|
|
|
+ } else if (!obj) {
|
|
|
+ obj = [];
|
|
|
+ }
|
|
|
+ return obj;
|
|
|
+ }
|
|
|
+
|
|
|
+ function extendFunction() {
|
|
|
+ for (var _len = arguments.length, fns = Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
+ fns[_key] = arguments[_key];
|
|
|
+ }
|
|
|
+
|
|
|
+ return function extendedFunction() {
|
|
|
+ var args = arguments;
|
|
|
+ fns.forEach(function (fn) {
|
|
|
+ return fn.apply(null, args);
|
|
|
+ });
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ function extendArray(primary, secondary, property) {
|
|
|
+ if (property) {
|
|
|
+ primary = primary[property];
|
|
|
+ secondary = secondary[property];
|
|
|
+ }
|
|
|
+ if (secondary && primary) {
|
|
|
+ _angularFix2['default'].forEach(secondary, function (item) {
|
|
|
+ if (primary.indexOf(item) === -1) {
|
|
|
+ primary.push(item);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return primary;
|
|
|
+ } else if (secondary) {
|
|
|
+ return secondary;
|
|
|
+ } else {
|
|
|
+ return primary;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function startsWith(str, search) {
|
|
|
+ if (_angularFix2['default'].isString(str) && _angularFix2['default'].isString(search)) {
|
|
|
+ return str.length >= search.length && str.substring(0, search.length) === search;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function contains(str, search) {
|
|
|
+ if (_angularFix2['default'].isString(str) && _angularFix2['default'].isString(search)) {
|
|
|
+ return str.length >= search.length && str.indexOf(search) !== -1;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 10 */
|
|
|
+/***/ function(module, exports) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+ exports['default'] = formlyValidationMessages;
|
|
|
+
|
|
|
+ // @ngInject
|
|
|
+ function formlyValidationMessages() {
|
|
|
+
|
|
|
+ var validationMessages = {
|
|
|
+ addTemplateOptionValueMessage: addTemplateOptionValueMessage,
|
|
|
+ addStringMessage: addStringMessage,
|
|
|
+ messages: {}
|
|
|
+ };
|
|
|
+
|
|
|
+ return validationMessages;
|
|
|
+
|
|
|
+ function addTemplateOptionValueMessage(name, prop, prefix, suffix, alternate) {
|
|
|
+ validationMessages.messages[name] = templateOptionValue(prop, prefix, suffix, alternate);
|
|
|
+ }
|
|
|
+
|
|
|
+ function addStringMessage(name, string) {
|
|
|
+ validationMessages.messages[name] = function () {
|
|
|
+ return string;
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ function templateOptionValue(prop, prefix, suffix, alternate) {
|
|
|
+ return function getValidationMessage(viewValue, modelValue, scope) {
|
|
|
+ if (typeof scope.options.templateOptions[prop] !== 'undefined') {
|
|
|
+ return prefix + ' ' + scope.options.templateOptions[prop] + ' ' + suffix;
|
|
|
+ } else {
|
|
|
+ return alternate;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 11 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ var _otherUtils = __webpack_require__(9);
|
|
|
+
|
|
|
+ var _otherUtils2 = _interopRequireDefault(_otherUtils);
|
|
|
+
|
|
|
+ exports['default'] = formlyUtil;
|
|
|
+
|
|
|
+ // @ngInject
|
|
|
+ function formlyUtil() {
|
|
|
+ return _otherUtils2['default'];
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 12 */
|
|
|
+/***/ function(module, exports) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ formlyWarn.$inject = ["formlyConfig", "formlyErrorAndWarningsUrlPrefix", "$log"];
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
|
|
|
+
|
|
|
+ exports['default'] = formlyWarn;
|
|
|
+
|
|
|
+ // @ngInject
|
|
|
+ function formlyWarn(formlyConfig, formlyErrorAndWarningsUrlPrefix, $log) {
|
|
|
+ return function warn() {
|
|
|
+ if (!formlyConfig.disableWarnings) {
|
|
|
+ var args = Array.prototype.slice.call(arguments);
|
|
|
+ var warnInfoSlug = args.shift();
|
|
|
+ args.unshift('Formly Warning:');
|
|
|
+ args.push('' + formlyErrorAndWarningsUrlPrefix + warnInfoSlug);
|
|
|
+ $log.warn.apply($log, _toConsumableArray(args));
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 13 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ formlyCustomValidation.$inject = ["formlyUtil"];
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ var _angularFix = __webpack_require__(2);
|
|
|
+
|
|
|
+ var _angularFix2 = _interopRequireDefault(_angularFix);
|
|
|
+
|
|
|
+ exports['default'] = formlyCustomValidation;
|
|
|
+
|
|
|
+ // @ngInject
|
|
|
+ function formlyCustomValidation(formlyUtil) {
|
|
|
+ return {
|
|
|
+ restrict: 'A',
|
|
|
+ require: 'ngModel',
|
|
|
+ link: function formlyCustomValidationLink(scope, el, attrs, ctrl) {
|
|
|
+ var opts = scope.options;
|
|
|
+ opts.validation.messages = opts.validation.messages || {};
|
|
|
+ _angularFix2['default'].forEach(opts.validation.messages, function (message, key) {
|
|
|
+ opts.validation.messages[key] = function () {
|
|
|
+ return formlyUtil.formlyEval(scope, message, ctrl.$modelValue, ctrl.$viewValue);
|
|
|
+ };
|
|
|
+ });
|
|
|
+
|
|
|
+ var useNewValidatorsApi = ctrl.hasOwnProperty('$validators') && !attrs.hasOwnProperty('useParsers');
|
|
|
+ _angularFix2['default'].forEach(opts.validators, _angularFix2['default'].bind(null, addValidatorToPipeline, false));
|
|
|
+ _angularFix2['default'].forEach(opts.asyncValidators, _angularFix2['default'].bind(null, addValidatorToPipeline, true));
|
|
|
+
|
|
|
+ function addValidatorToPipeline(isAsync, validator, name) {
|
|
|
+ setupMessage(validator, name);
|
|
|
+ validator = _angularFix2['default'].isObject(validator) ? validator.expression : validator;
|
|
|
+ if (useNewValidatorsApi) {
|
|
|
+ setupWithValidators(validator, name, isAsync);
|
|
|
+ } else {
|
|
|
+ setupWithParsers(validator, name, isAsync);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function setupMessage(validator, name) {
|
|
|
+ var message = validator.message;
|
|
|
+ if (message) {
|
|
|
+ opts.validation.messages[name] = function () {
|
|
|
+ return formlyUtil.formlyEval(scope, message, ctrl.$modelValue, ctrl.$viewValue);
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function setupWithValidators(validator, name, isAsync) {
|
|
|
+ var validatorCollection = isAsync ? '$asyncValidators' : '$validators';
|
|
|
+
|
|
|
+ ctrl[validatorCollection][name] = function evalValidity(modelValue, viewValue) {
|
|
|
+ return formlyUtil.formlyEval(scope, validator, modelValue, viewValue);
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ function setupWithParsers(validator, name, isAsync) {
|
|
|
+ var inFlightValidator = undefined;
|
|
|
+ ctrl.$parsers.unshift(function evalValidityOfParser(viewValue) {
|
|
|
+ var isValid = formlyUtil.formlyEval(scope, validator, ctrl.$modelValue, viewValue);
|
|
|
+ if (isAsync) {
|
|
|
+ ctrl.$pending = ctrl.$pending || {};
|
|
|
+ ctrl.$pending[name] = true;
|
|
|
+ inFlightValidator = isValid;
|
|
|
+ isValid.then(function () {
|
|
|
+ if (inFlightValidator === isValid) {
|
|
|
+ ctrl.$setValidity(name, true);
|
|
|
+ }
|
|
|
+ })['catch'](function () {
|
|
|
+ if (inFlightValidator === isValid) {
|
|
|
+ ctrl.$setValidity(name, false);
|
|
|
+ }
|
|
|
+ })['finally'](function () {
|
|
|
+ var $pending = ctrl.$pending || {};
|
|
|
+ if (Object.keys($pending).length === 1) {
|
|
|
+ delete ctrl.$pending;
|
|
|
+ } else {
|
|
|
+ delete ctrl.$pending[name];
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ ctrl.$setValidity(name, isValid);
|
|
|
+ }
|
|
|
+ return viewValue;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 14 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ formlyField.$inject = ["$http", "$q", "$compile", "$templateCache", "$interpolate", "formlyConfig", "formlyApiCheck", "formlyUtil", "formlyUsability", "formlyWarn"];
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
|
|
|
+
|
|
|
+ var _angularFix = __webpack_require__(2);
|
|
|
+
|
|
|
+ var _angularFix2 = _interopRequireDefault(_angularFix);
|
|
|
+
|
|
|
+ var _apiCheck = __webpack_require__(5);
|
|
|
+
|
|
|
+ var _apiCheck2 = _interopRequireDefault(_apiCheck);
|
|
|
+
|
|
|
+ exports['default'] = formlyField;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @ngdoc directive
|
|
|
+ * @name formlyField
|
|
|
+ * @restrict AE
|
|
|
+ */
|
|
|
+ // @ngInject
|
|
|
+ function formlyField($http, $q, $compile, $templateCache, $interpolate, formlyConfig, formlyApiCheck, formlyUtil, formlyUsability, formlyWarn) {
|
|
|
+ FormlyFieldController.$inject = ["$scope", "$timeout", "$parse", "$controller", "formlyValidationMessages"];
|
|
|
+ var arrayify = formlyUtil.arrayify;
|
|
|
+
|
|
|
+ return {
|
|
|
+ restrict: 'AE',
|
|
|
+ transclude: true,
|
|
|
+ require: '?^formlyForm',
|
|
|
+ scope: {
|
|
|
+ options: '=',
|
|
|
+ model: '=',
|
|
|
+ originalModel: '=?',
|
|
|
+ formId: '@', // TODO remove formId in a breaking release
|
|
|
+ index: '=?',
|
|
|
+ fields: '=?',
|
|
|
+ formState: '=?',
|
|
|
+ formOptions: '=?',
|
|
|
+ form: '=?' },
|
|
|
+ // TODO require form in a breaking release
|
|
|
+ controller: FormlyFieldController,
|
|
|
+ link: fieldLink
|
|
|
+ };
|
|
|
+
|
|
|
+ // @ngInject
|
|
|
+ function FormlyFieldController($scope, $timeout, $parse, $controller, formlyValidationMessages) {
|
|
|
+ /* eslint max-statements:[2, 37] */
|
|
|
+ if ($scope.options.fieldGroup) {
|
|
|
+ setupFieldGroup();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ var fieldType = getFieldType($scope.options);
|
|
|
+ simplifyLife($scope.options);
|
|
|
+ mergeFieldOptionsWithTypeDefaults($scope.options, fieldType);
|
|
|
+ extendOptionsWithDefaults($scope.options, $scope.index);
|
|
|
+ checkApi($scope.options);
|
|
|
+ // set field id to link labels and fields
|
|
|
+
|
|
|
+ // initalization
|
|
|
+ setFieldIdAndName();
|
|
|
+ setDefaultValue();
|
|
|
+ setInitialValue();
|
|
|
+ runExpressions();
|
|
|
+ watchExpressions();
|
|
|
+ addValidationMessages($scope.options);
|
|
|
+ invokeControllers($scope, $scope.options, fieldType);
|
|
|
+
|
|
|
+ // function definitions
|
|
|
+ function runExpressions() {
|
|
|
+ var deferred = $q.defer();
|
|
|
+ // must run on next tick to make sure that the current value is correct.
|
|
|
+ $timeout(function runExpressionsOnNextTick() {
|
|
|
+ var promises = [];
|
|
|
+ var field = $scope.options;
|
|
|
+ var currentValue = valueGetterSetter();
|
|
|
+ _angularFix2['default'].forEach(field.expressionProperties, function runExpression(expression, prop) {
|
|
|
+ var setter = $parse(prop).assign;
|
|
|
+ var promise = $q.when(formlyUtil.formlyEval($scope, expression, currentValue, currentValue)).then(function setFieldValue(value) {
|
|
|
+ setter(field, value);
|
|
|
+ });
|
|
|
+ promises.push(promise);
|
|
|
+ });
|
|
|
+ $q.all(promises).then(function () {
|
|
|
+ deferred.resolve();
|
|
|
+ });
|
|
|
+ }, 0, false);
|
|
|
+ return deferred.promise;
|
|
|
+ }
|
|
|
+
|
|
|
+ function watchExpressions() {
|
|
|
+ if ($scope.formOptions.watchAllExpressions) {
|
|
|
+ (function () {
|
|
|
+ var field = $scope.options;
|
|
|
+ var currentValue = valueGetterSetter();
|
|
|
+ _angularFix2['default'].forEach(field.expressionProperties, function watchExpression(expression, prop) {
|
|
|
+ var setter = $parse(prop).assign;
|
|
|
+ $scope.$watch(function expressionPropertyWatcher() {
|
|
|
+ return formlyUtil.formlyEval($scope, expression, currentValue, currentValue);
|
|
|
+ }, function expressionPropertyListener(value) {
|
|
|
+ setter(field, value);
|
|
|
+ }, true);
|
|
|
+ });
|
|
|
+ })();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function valueGetterSetter(newVal) {
|
|
|
+ if (!$scope.model || !$scope.options.key) {
|
|
|
+ return undefined;
|
|
|
+ }
|
|
|
+ if (_angularFix2['default'].isDefined(newVal)) {
|
|
|
+ parseSet($scope.options.key, $scope.model, newVal);
|
|
|
+ }
|
|
|
+ return parseGet($scope.options.key, $scope.model);
|
|
|
+ }
|
|
|
+
|
|
|
+ function shouldNotUseParseKey(key) {
|
|
|
+ return _angularFix2['default'].isNumber(key) || !formlyUtil.containsSelector(key);
|
|
|
+ }
|
|
|
+
|
|
|
+ function keyContainsArrays(key) {
|
|
|
+ return (/\[\d{1,}\]/.test(key)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ function deepAssign(obj, prop, value) {
|
|
|
+ if (_angularFix2['default'].isString(prop)) {
|
|
|
+ prop = prop.replace(/\[(\w+)\]/g, '.$1').split('.');
|
|
|
+ }
|
|
|
+
|
|
|
+ if (prop.length > 1) {
|
|
|
+ var e = prop.shift();
|
|
|
+ obj[e] = obj[e] || isNaN(prop[0]) ? {} : [];
|
|
|
+ deepAssign(obj[e], prop, value);
|
|
|
+ } else {
|
|
|
+ obj[prop[0]] = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function parseSet(key, model, newVal) {
|
|
|
+ // If either of these are null/undefined then just return undefined
|
|
|
+ if (!key && key !== 0 || !model) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // If we are working with a number then $parse wont work, default back to the old way for now
|
|
|
+ if (shouldNotUseParseKey(key)) {
|
|
|
+ // TODO: Fix this so we can get several levels instead of just one with properties that are numeric
|
|
|
+ model[key] = newVal;
|
|
|
+ } else if (formlyConfig.extras.parseKeyArrays && keyContainsArrays(key)) {
|
|
|
+ deepAssign($scope.model, key, newVal);
|
|
|
+ } else {
|
|
|
+ var setter = $parse($scope.options.key).assign;
|
|
|
+ if (setter) {
|
|
|
+ setter($scope.model, newVal);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function parseGet(key, model) {
|
|
|
+ // If either of these are null/undefined then just return undefined
|
|
|
+ if (!key && key !== 0 || !model) {
|
|
|
+ return undefined;
|
|
|
+ }
|
|
|
+
|
|
|
+ // If we are working with a number then $parse wont work, default back to the old way for now
|
|
|
+ if (shouldNotUseParseKey(key)) {
|
|
|
+ // TODO: Fix this so we can get several levels instead of just one with properties that are numeric
|
|
|
+ return model[key];
|
|
|
+ } else {
|
|
|
+ return $parse(key)(model);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function simplifyLife(options) {
|
|
|
+ // add a few empty objects (if they don't already exist) so you don't have to undefined check everywhere
|
|
|
+ formlyUtil.reverseDeepMerge(options, {
|
|
|
+ originalModel: options.model,
|
|
|
+ extras: {},
|
|
|
+ data: {},
|
|
|
+ templateOptions: {},
|
|
|
+ validation: {}
|
|
|
+ });
|
|
|
+ // create $scope.to so template authors can reference to instead of $scope.options.templateOptions
|
|
|
+ $scope.to = $scope.options.templateOptions;
|
|
|
+ $scope.formOptions = $scope.formOptions || {};
|
|
|
+ }
|
|
|
+
|
|
|
+ function setFieldIdAndName() {
|
|
|
+ if (_angularFix2['default'].isFunction(formlyConfig.extras.getFieldId)) {
|
|
|
+ $scope.id = formlyConfig.extras.getFieldId($scope.options, $scope.model, $scope);
|
|
|
+ } else {
|
|
|
+ var formName = $scope.form && $scope.form.$name || $scope.formId;
|
|
|
+ $scope.id = formlyUtil.getFieldId(formName, $scope.options, $scope.index);
|
|
|
+ }
|
|
|
+ $scope.options.id = $scope.id;
|
|
|
+ $scope.name = $scope.options.name || $scope.options.id;
|
|
|
+ $scope.options.name = $scope.name;
|
|
|
+ }
|
|
|
+
|
|
|
+ function setDefaultValue() {
|
|
|
+ if (_angularFix2['default'].isDefined($scope.options.defaultValue) && !_angularFix2['default'].isDefined(parseGet($scope.options.key, $scope.model))) {
|
|
|
+ parseSet($scope.options.key, $scope.model, $scope.options.defaultValue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function setInitialValue() {
|
|
|
+ $scope.options.initialValue = $scope.model && parseGet($scope.options.key, $scope.model);
|
|
|
+ }
|
|
|
+
|
|
|
+ function mergeFieldOptionsWithTypeDefaults(options, type) {
|
|
|
+ if (type) {
|
|
|
+ mergeOptions(options, type.defaultOptions);
|
|
|
+ }
|
|
|
+ var properOrder = arrayify(options.optionsTypes).reverse(); // so the right things are overridden
|
|
|
+ _angularFix2['default'].forEach(properOrder, function (typeName) {
|
|
|
+ mergeOptions(options, formlyConfig.getType(typeName, true, options).defaultOptions);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function mergeOptions(options, extraOptions) {
|
|
|
+ if (extraOptions) {
|
|
|
+ if (_angularFix2['default'].isFunction(extraOptions)) {
|
|
|
+ extraOptions = extraOptions(options, $scope);
|
|
|
+ }
|
|
|
+ formlyUtil.reverseDeepMerge(options, extraOptions);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function extendOptionsWithDefaults(options, index) {
|
|
|
+ var key = options.key || index || 0;
|
|
|
+ _angularFix2['default'].extend(options, {
|
|
|
+ // attach the key in case the formly-field directive is used directly
|
|
|
+ key: key,
|
|
|
+ value: options.value || valueGetterSetter,
|
|
|
+ runExpressions: runExpressions,
|
|
|
+ resetModel: resetModel,
|
|
|
+ updateInitialValue: updateInitialValue
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function resetModel() {
|
|
|
+ parseSet($scope.options.key, $scope.model, $scope.options.initialValue);
|
|
|
+ if ($scope.options.formControl) {
|
|
|
+ if (_angularFix2['default'].isArray($scope.options.formControl)) {
|
|
|
+ _angularFix2['default'].forEach($scope.options.formControl, function (formControl) {
|
|
|
+ resetFormControl(formControl, true);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ resetFormControl($scope.options.formControl);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ($scope.form) {
|
|
|
+ $scope.form.$setUntouched && $scope.form.$setUntouched();
|
|
|
+ $scope.form.$setPristine();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function resetFormControl(formControl, isMultiNgModel) {
|
|
|
+ if (!isMultiNgModel) {
|
|
|
+ formControl.$setViewValue(parseGet($scope.options.key, $scope.model));
|
|
|
+ }
|
|
|
+
|
|
|
+ formControl.$render();
|
|
|
+ formControl.$setUntouched && formControl.$setUntouched();
|
|
|
+ formControl.$setPristine();
|
|
|
+
|
|
|
+ // To prevent breaking change requiring a digest to reset $viewModel
|
|
|
+ if (!$scope.$root.$$phase) {
|
|
|
+ $scope.$digest();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function updateInitialValue() {
|
|
|
+ $scope.options.initialValue = parseGet($scope.options.key, $scope.model);
|
|
|
+ }
|
|
|
+
|
|
|
+ function addValidationMessages(options) {
|
|
|
+ options.validation.messages = options.validation.messages || {};
|
|
|
+ _angularFix2['default'].forEach(formlyValidationMessages.messages, function createFunctionForMessage(expression, name) {
|
|
|
+ if (!options.validation.messages[name]) {
|
|
|
+ options.validation.messages[name] = function evaluateMessage(viewValue, modelValue, scope) {
|
|
|
+ return formlyUtil.formlyEval(scope, expression, modelValue, viewValue);
|
|
|
+ };
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function invokeControllers(scope) {
|
|
|
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
|
|
|
+ var type = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
|
|
|
+
|
|
|
+ _angularFix2['default'].forEach([type.controller, options.controller], function (controller) {
|
|
|
+ if (controller) {
|
|
|
+ $controller(controller, { $scope: scope });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function setupFieldGroup() {
|
|
|
+ $scope.options.options = $scope.options.options || {};
|
|
|
+ $scope.options.options.formState = $scope.formState;
|
|
|
+ $scope.to = $scope.options.templateOptions;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // link function
|
|
|
+ function fieldLink(scope, el, attrs, formlyFormCtrl) {
|
|
|
+ if (scope.options.fieldGroup) {
|
|
|
+ setFieldGroupTemplate();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // watch the field model (if exists) if there is no parent formly-form directive (that would watch it instead)
|
|
|
+ if (!formlyFormCtrl && scope.options.model) {
|
|
|
+ scope.$watch('options.model', function () {
|
|
|
+ return scope.options.runExpressions();
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ addAttributes();
|
|
|
+ addClasses();
|
|
|
+
|
|
|
+ var type = getFieldType(scope.options);
|
|
|
+ var args = arguments;
|
|
|
+ var thusly = this;
|
|
|
+ var fieldCount = 0;
|
|
|
+ var fieldManipulators = getManipulators(scope.options, scope.formOptions);
|
|
|
+ getFieldTemplate(scope.options).then(runManipulators(fieldManipulators.preWrapper)).then(transcludeInWrappers(scope.options, scope.formOptions)).then(runManipulators(fieldManipulators.postWrapper)).then(setElementTemplate).then(watchFormControl).then(callLinkFunctions)['catch'](function (error) {
|
|
|
+ formlyWarn('there-was-a-problem-setting-the-template-for-this-field', 'There was a problem setting the template for this field ', scope.options, error);
|
|
|
+ });
|
|
|
+
|
|
|
+ function setFieldGroupTemplate() {
|
|
|
+ checkFieldGroupApi(scope.options);
|
|
|
+ el.addClass('formly-field-group');
|
|
|
+ var extraAttributes = '';
|
|
|
+ if (scope.options.elementAttributes) {
|
|
|
+ extraAttributes = Object.keys(scope.options.elementAttributes).map(function (key) {
|
|
|
+ return key + '="' + scope.options.elementAttributes[key] + '"';
|
|
|
+ }).join(' ');
|
|
|
+ }
|
|
|
+ var modelValue = 'model';
|
|
|
+ scope.options.form = scope.form;
|
|
|
+ if (scope.options.key) {
|
|
|
+ modelValue = 'model[\'' + scope.options.key + '\']';
|
|
|
+ }
|
|
|
+ getTemplate('\n <formly-form model="' + modelValue + '"\n fields="options.fieldGroup"\n options="options.options"\n form="options.form"\n class="' + scope.options.className + '"\n ' + extraAttributes + '\n is-field-group>\n </formly-form>\n ').then(transcludeInWrappers(scope.options, scope.formOptions)).then(setElementTemplate);
|
|
|
+ }
|
|
|
+
|
|
|
+ function addAttributes() {
|
|
|
+ if (scope.options.elementAttributes) {
|
|
|
+ el.attr(scope.options.elementAttributes);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function addClasses() {
|
|
|
+ if (scope.options.className) {
|
|
|
+ el.addClass(scope.options.className);
|
|
|
+ }
|
|
|
+ if (scope.options.type) {
|
|
|
+ el.addClass('formly-field-' + scope.options.type);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function setElementTemplate(templateString) {
|
|
|
+ el.html(asHtml(templateString));
|
|
|
+ $compile(el.contents())(scope);
|
|
|
+ return templateString;
|
|
|
+ }
|
|
|
+
|
|
|
+ function watchFormControl(templateString) {
|
|
|
+ var stopWatchingShowError = _angularFix2['default'].noop;
|
|
|
+ if (scope.options.noFormControl) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var templateEl = _angularFix2['default'].element('<div>' + templateString + '</div>');
|
|
|
+ var ngModelNodes = templateEl[0].querySelectorAll('[ng-model],[data-ng-model]');
|
|
|
+
|
|
|
+ if (ngModelNodes.length) {
|
|
|
+ _angularFix2['default'].forEach(ngModelNodes, function (ngModelNode) {
|
|
|
+ fieldCount++;
|
|
|
+ watchFieldNameOrExistence(ngModelNode.getAttribute('name'));
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function watchFieldNameOrExistence(name) {
|
|
|
+ var nameExpressionRegex = /\{\{(.*?)}}/;
|
|
|
+ var nameExpression = nameExpressionRegex.exec(name);
|
|
|
+ if (nameExpression) {
|
|
|
+ name = $interpolate(name)(scope);
|
|
|
+ }
|
|
|
+ watchFieldExistence(name);
|
|
|
+ }
|
|
|
+
|
|
|
+ function watchFieldExistence(name) {
|
|
|
+ scope.$watch('form["' + name + '"]', function formControlChange(formControl) {
|
|
|
+ if (formControl) {
|
|
|
+ if (fieldCount > 1) {
|
|
|
+ if (!scope.options.formControl) {
|
|
|
+ scope.options.formControl = [];
|
|
|
+ }
|
|
|
+ scope.options.formControl.push(formControl);
|
|
|
+ } else {
|
|
|
+ scope.options.formControl = formControl;
|
|
|
+ }
|
|
|
+ scope.fc = scope.options.formControl; // shortcut for template authors
|
|
|
+ stopWatchingShowError();
|
|
|
+ addShowMessagesWatcher();
|
|
|
+ addParsers();
|
|
|
+ addFormatters();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function addShowMessagesWatcher() {
|
|
|
+ stopWatchingShowError = scope.$watch(function watchShowValidationChange() {
|
|
|
+ var customExpression = formlyConfig.extras.errorExistsAndShouldBeVisibleExpression;
|
|
|
+ var options = scope.options;
|
|
|
+ var formControls = arrayify(scope.fc);
|
|
|
+ if (!formControls.some(function (fc) {
|
|
|
+ return fc.$invalid;
|
|
|
+ })) {
|
|
|
+ return false;
|
|
|
+ } else if (typeof options.validation.show === 'boolean') {
|
|
|
+ return options.validation.show;
|
|
|
+ } else if (customExpression) {
|
|
|
+ return formControls.some(function (fc) {
|
|
|
+ return formlyUtil.formlyEval(scope, customExpression, fc.$modelValue, fc.$viewValue);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ return formControls.some(function (fc) {
|
|
|
+ var noTouchedButDirty = _angularFix2['default'].isUndefined(fc.$touched) && fc.$dirty;
|
|
|
+ return fc.$touched || noTouchedButDirty;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, function onShowValidationChange(show) {
|
|
|
+ scope.options.validation.errorExistsAndShouldBeVisible = show;
|
|
|
+ scope.showError = show; // shortcut for template authors
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function addParsers() {
|
|
|
+ setParsersOrFormatters('parsers');
|
|
|
+ }
|
|
|
+
|
|
|
+ function addFormatters() {
|
|
|
+ setParsersOrFormatters('formatters');
|
|
|
+ var ctrl = scope.fc;
|
|
|
+ var formWasPristine = scope.form.$pristine;
|
|
|
+ if (scope.options.formatters) {
|
|
|
+ (function () {
|
|
|
+ var value = ctrl.$modelValue;
|
|
|
+ ctrl.$formatters.forEach(function (formatter) {
|
|
|
+ value = formatter(value);
|
|
|
+ });
|
|
|
+
|
|
|
+ ctrl.$setViewValue(value);
|
|
|
+ ctrl.$render();
|
|
|
+ ctrl.$setPristine();
|
|
|
+ if (formWasPristine) {
|
|
|
+ scope.form.$setPristine();
|
|
|
+ }
|
|
|
+ })();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function setParsersOrFormatters(which) {
|
|
|
+ var originalThingProp = 'originalParser';
|
|
|
+ if (which === 'formatters') {
|
|
|
+ originalThingProp = 'originalFormatter';
|
|
|
+ }
|
|
|
+
|
|
|
+ // init with type's parsers
|
|
|
+ var things = getThingsFromType(type);
|
|
|
+
|
|
|
+ // get optionsTypes things
|
|
|
+ things = formlyUtil.extendArray(things, getThingsFromOptionsTypes(scope.options.optionsTypes));
|
|
|
+
|
|
|
+ // get field's things
|
|
|
+ things = formlyUtil.extendArray(things, scope.options[which]);
|
|
|
+
|
|
|
+ // convert things into formlyExpression things
|
|
|
+ _angularFix2['default'].forEach(things, function (thing, index) {
|
|
|
+ things[index] = getFormlyExpressionThing(thing);
|
|
|
+ });
|
|
|
+
|
|
|
+ var ngModelCtrls = scope.fc;
|
|
|
+ if (!_angularFix2['default'].isArray(ngModelCtrls)) {
|
|
|
+ ngModelCtrls = [ngModelCtrls];
|
|
|
+ }
|
|
|
+
|
|
|
+ _angularFix2['default'].forEach(ngModelCtrls, function (ngModelCtrl) {
|
|
|
+ var _ngModelCtrl;
|
|
|
+
|
|
|
+ ngModelCtrl['$' + which] = (_ngModelCtrl = ngModelCtrl['$' + which]).concat.apply(_ngModelCtrl, _toConsumableArray(things));
|
|
|
+ });
|
|
|
+
|
|
|
+ function getThingsFromType(theType) {
|
|
|
+ if (!theType) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ if (_angularFix2['default'].isString(theType)) {
|
|
|
+ theType = formlyConfig.getType(theType, true, scope.options);
|
|
|
+ }
|
|
|
+ var typeThings = [];
|
|
|
+
|
|
|
+ // get things from parent
|
|
|
+ if (theType['extends']) {
|
|
|
+ typeThings = formlyUtil.extendArray(typeThings, getThingsFromType(theType['extends']));
|
|
|
+ }
|
|
|
+
|
|
|
+ // get own type's things
|
|
|
+ typeThings = formlyUtil.extendArray(typeThings, getDefaultOptionsProperty(theType, which, []));
|
|
|
+
|
|
|
+ // get things from optionsTypes
|
|
|
+ typeThings = formlyUtil.extendArray(typeThings, getThingsFromOptionsTypes(getDefaultOptionsOptionsTypes(theType)));
|
|
|
+
|
|
|
+ return typeThings;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getThingsFromOptionsTypes() {
|
|
|
+ var optionsTypes = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
|
|
|
+
|
|
|
+ var optionsTypesThings = [];
|
|
|
+ _angularFix2['default'].forEach(_angularFix2['default'].copy(arrayify(optionsTypes)).reverse(), function (optionsTypeName) {
|
|
|
+ optionsTypesThings = formlyUtil.extendArray(optionsTypesThings, getThingsFromType(optionsTypeName));
|
|
|
+ });
|
|
|
+ return optionsTypesThings;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getFormlyExpressionThing(thing) {
|
|
|
+ formlyExpressionParserOrFormatterFunction[originalThingProp] = thing;
|
|
|
+ return formlyExpressionParserOrFormatterFunction;
|
|
|
+
|
|
|
+ function formlyExpressionParserOrFormatterFunction($viewValue) {
|
|
|
+ var $modelValue = scope.options.value();
|
|
|
+ return formlyUtil.formlyEval(scope, thing, $modelValue, $viewValue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function callLinkFunctions() {
|
|
|
+ if (type && type.link) {
|
|
|
+ type.link.apply(thusly, args);
|
|
|
+ }
|
|
|
+ if (scope.options.link) {
|
|
|
+ scope.options.link.apply(thusly, args);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function runManipulators(manipulators) {
|
|
|
+ return function runManipulatorsOnTemplate(templateToManipulate) {
|
|
|
+ var chain = $q.when(templateToManipulate);
|
|
|
+ _angularFix2['default'].forEach(manipulators, function (manipulator) {
|
|
|
+ chain = chain.then(function (template) {
|
|
|
+ return $q.when(manipulator(template, scope.options, scope)).then(function (newTemplate) {
|
|
|
+ return _angularFix2['default'].isString(newTemplate) ? newTemplate : asHtml(newTemplate);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ return chain;
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // sort-of stateless util functions
|
|
|
+ function asHtml(el) {
|
|
|
+ var wrapper = _angularFix2['default'].element('<a></a>');
|
|
|
+ return wrapper.append(el).html();
|
|
|
+ }
|
|
|
+
|
|
|
+ function getFieldType(options) {
|
|
|
+ return options.type && formlyConfig.getType(options.type);
|
|
|
+ }
|
|
|
+
|
|
|
+ function getManipulators(options, formOptions) {
|
|
|
+ var preWrapper = [];
|
|
|
+ var postWrapper = [];
|
|
|
+ addManipulators(options.templateManipulators);
|
|
|
+ addManipulators(formOptions.templateManipulators);
|
|
|
+ addManipulators(formlyConfig.templateManipulators);
|
|
|
+ return { preWrapper: preWrapper, postWrapper: postWrapper };
|
|
|
+
|
|
|
+ function addManipulators(manipulators) {
|
|
|
+ /* eslint-disable */ // it doesn't understand this :-(
|
|
|
+
|
|
|
+ var _ref = manipulators || {};
|
|
|
+
|
|
|
+ var _ref$preWrapper = _ref.preWrapper;
|
|
|
+ var pre = _ref$preWrapper === undefined ? [] : _ref$preWrapper;
|
|
|
+ var _ref$postWrapper = _ref.postWrapper;
|
|
|
+ var post = _ref$postWrapper === undefined ? [] : _ref$postWrapper;
|
|
|
+
|
|
|
+ preWrapper = preWrapper.concat(pre);
|
|
|
+ postWrapper = postWrapper.concat(post);
|
|
|
+ /* eslint-enable */
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function getFieldTemplate(options) {
|
|
|
+ function fromOptionsOrType(key, fieldType) {
|
|
|
+ if (_angularFix2['default'].isDefined(options[key])) {
|
|
|
+ return options[key];
|
|
|
+ } else if (fieldType && _angularFix2['default'].isDefined(fieldType[key])) {
|
|
|
+ return fieldType[key];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var type = formlyConfig.getType(options.type, true, options);
|
|
|
+ var template = fromOptionsOrType('template', type);
|
|
|
+ var templateUrl = fromOptionsOrType('templateUrl', type);
|
|
|
+ if (_angularFix2['default'].isUndefined(template) && !templateUrl) {
|
|
|
+ throw formlyUsability.getFieldError('type-type-has-no-template', 'Type \'' + options.type + '\' has no template. On element:', options);
|
|
|
+ }
|
|
|
+
|
|
|
+ return getTemplate(templateUrl || template, _angularFix2['default'].isUndefined(template), options);
|
|
|
+ }
|
|
|
+
|
|
|
+ function getTemplate(template, isUrl, options) {
|
|
|
+ var templatePromise = undefined;
|
|
|
+ if (_angularFix2['default'].isFunction(template)) {
|
|
|
+ templatePromise = $q.when(template(options));
|
|
|
+ } else {
|
|
|
+ templatePromise = $q.when(template);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!isUrl) {
|
|
|
+ return templatePromise;
|
|
|
+ } else {
|
|
|
+ var _ret3 = (function () {
|
|
|
+ var httpOptions = { cache: $templateCache };
|
|
|
+ return {
|
|
|
+ v: templatePromise.then(function (url) {
|
|
|
+ return $http.get(url, httpOptions);
|
|
|
+ }).then(function (response) {
|
|
|
+ return response.data;
|
|
|
+ })['catch'](function handleErrorGettingATemplate(error) {
|
|
|
+ formlyWarn('problem-loading-template-for-templateurl', 'Problem loading template for ' + template, error);
|
|
|
+ })
|
|
|
+ };
|
|
|
+ })();
|
|
|
+
|
|
|
+ if (typeof _ret3 === 'object') return _ret3.v;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function transcludeInWrappers(options, formOptions) {
|
|
|
+ var wrapper = getWrapperOption(options, formOptions);
|
|
|
+
|
|
|
+ return function transcludeTemplate(template) {
|
|
|
+ if (!wrapper.length) {
|
|
|
+ return $q.when(template);
|
|
|
+ }
|
|
|
+
|
|
|
+ wrapper.forEach(function (aWrapper) {
|
|
|
+ formlyUsability.checkWrapper(aWrapper, options);
|
|
|
+ runApiCheck(aWrapper, options);
|
|
|
+ });
|
|
|
+ var promises = wrapper.map(function (w) {
|
|
|
+ return getTemplate(w.template || w.templateUrl, !w.template);
|
|
|
+ });
|
|
|
+ return $q.all(promises).then(function (wrappersTemplates) {
|
|
|
+ wrappersTemplates.forEach(function (wrapperTemplate, index) {
|
|
|
+ formlyUsability.checkWrapperTemplate(wrapperTemplate, wrapper[index]);
|
|
|
+ });
|
|
|
+ wrappersTemplates.reverse(); // wrapper 0 is wrapped in wrapper 1 and so on...
|
|
|
+ var totalWrapper = wrappersTemplates.shift();
|
|
|
+ wrappersTemplates.forEach(function (wrapperTemplate) {
|
|
|
+ totalWrapper = doTransclusion(totalWrapper, wrapperTemplate);
|
|
|
+ });
|
|
|
+ return doTransclusion(totalWrapper, template);
|
|
|
+ });
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ function doTransclusion(wrapper, template) {
|
|
|
+ var superWrapper = _angularFix2['default'].element('<a></a>'); // this allows people not have to have a single root in wrappers
|
|
|
+ superWrapper.append(wrapper);
|
|
|
+ var transcludeEl = superWrapper.find('formly-transclude');
|
|
|
+ if (!transcludeEl.length) {
|
|
|
+ // try it using our custom find function
|
|
|
+ transcludeEl = formlyUtil.findByNodeName(superWrapper, 'formly-transclude');
|
|
|
+ }
|
|
|
+ transcludeEl.replaceWith(template);
|
|
|
+ return superWrapper.html();
|
|
|
+ }
|
|
|
+
|
|
|
+ function getWrapperOption(options, formOptions) {
|
|
|
+ /* eslint complexity:[2, 6] */
|
|
|
+ var wrapper = options.wrapper;
|
|
|
+ // explicit null means no wrapper
|
|
|
+ if (wrapper === null) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ // nothing specified means use the default wrapper for the type
|
|
|
+ if (!wrapper) {
|
|
|
+ // get all wrappers that specify they apply to this type
|
|
|
+ wrapper = arrayify(formlyConfig.getWrapperByType(options.type));
|
|
|
+ } else {
|
|
|
+ wrapper = arrayify(wrapper).map(formlyConfig.getWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ // get all wrappers for that the type specified that it uses.
|
|
|
+ var type = formlyConfig.getType(options.type, true, options);
|
|
|
+ if (type && type.wrapper) {
|
|
|
+ var typeWrappers = arrayify(type.wrapper).map(formlyConfig.getWrapper);
|
|
|
+ wrapper = wrapper.concat(typeWrappers);
|
|
|
+ }
|
|
|
+
|
|
|
+ // add form wrappers
|
|
|
+ if (formOptions.wrapper) {
|
|
|
+ var formWrappers = arrayify(formOptions.wrapper).map(formlyConfig.getWrapper);
|
|
|
+ wrapper = wrapper.concat(formWrappers);
|
|
|
+ }
|
|
|
+
|
|
|
+ // add the default wrapper last
|
|
|
+ var defaultWrapper = formlyConfig.getWrapper();
|
|
|
+ if (defaultWrapper) {
|
|
|
+ wrapper.push(defaultWrapper);
|
|
|
+ }
|
|
|
+ return wrapper;
|
|
|
+ }
|
|
|
+
|
|
|
+ function checkApi(options) {
|
|
|
+ formlyApiCheck['throw'](formlyApiCheck.formlyFieldOptions, options, {
|
|
|
+ prefix: 'formly-field directive',
|
|
|
+ url: 'formly-field-directive-validation-failed'
|
|
|
+ });
|
|
|
+ // validate with the type
|
|
|
+ var type = options.type && formlyConfig.getType(options.type);
|
|
|
+ if (type) {
|
|
|
+ runApiCheck(type, options, true);
|
|
|
+ }
|
|
|
+ if (options.expressionProperties && options.expressionProperties.hide) {
|
|
|
+ formlyWarn('dont-use-expressionproperties.hide-use-hideexpression-instead', 'You have specified `hide` in `expressionProperties`. Use `hideExpression` instead', options);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function checkFieldGroupApi(options) {
|
|
|
+ formlyApiCheck['throw'](formlyApiCheck.fieldGroup, options, {
|
|
|
+ prefix: 'formly-field directive',
|
|
|
+ url: 'formly-field-directive-validation-failed'
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function runApiCheck(_ref2, options, forType) {
|
|
|
+ var apiCheck = _ref2.apiCheck;
|
|
|
+ var apiCheckInstance = _ref2.apiCheckInstance;
|
|
|
+ var apiCheckFunction = _ref2.apiCheckFunction;
|
|
|
+ var apiCheckOptions = _ref2.apiCheckOptions;
|
|
|
+
|
|
|
+ runApiCheckForType(apiCheck, apiCheckInstance, apiCheckFunction, apiCheckOptions, options);
|
|
|
+ if (forType && options.type) {
|
|
|
+ _angularFix2['default'].forEach(formlyConfig.getTypeHeritage(options.type), function (type) {
|
|
|
+ runApiCheckForType(type.apiCheck, type.apiCheckInstance, type.apiCheckFunction, type.apiCheckOptions, options);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function runApiCheckForType(apiCheck, apiCheckInstance, apiCheckFunction, apiCheckOptions, options) {
|
|
|
+ /* eslint complexity:[2, 9] */
|
|
|
+ if (!apiCheck) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var instance = apiCheckInstance || formlyConfig.extras.apiCheckInstance || formlyApiCheck;
|
|
|
+ if (instance.config.disabled || _apiCheck2['default'].globalConfig.disabled) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var fn = apiCheckFunction || 'warn';
|
|
|
+ // this is the new API
|
|
|
+ var checkerObjects = apiCheck(instance);
|
|
|
+ _angularFix2['default'].forEach(checkerObjects, function (shape, name) {
|
|
|
+ var checker = instance.shape(shape);
|
|
|
+ var checkOptions = _angularFix2['default'].extend({
|
|
|
+ prefix: 'formly-field type ' + options.type + ' for property ' + name,
|
|
|
+ url: formlyApiCheck.config.output.docsBaseUrl + 'formly-field-type-apicheck-failed'
|
|
|
+ }, apiCheckOptions);
|
|
|
+ instance[fn](checker, options[name], checkOptions);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Stateless util functions
|
|
|
+ function getDefaultOptionsOptionsTypes(type) {
|
|
|
+ return getDefaultOptionsProperty(type, 'optionsTypes', []);
|
|
|
+ }
|
|
|
+
|
|
|
+ function getDefaultOptionsProperty(type, prop, defaultValue) {
|
|
|
+ return type.defaultOptions && type.defaultOptions[prop] || defaultValue;
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 15 */
|
|
|
+/***/ function(module, exports) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ formlyFocus.$inject = ["$timeout", "$document"];
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+ exports['default'] = formlyFocus;
|
|
|
+
|
|
|
+ // @ngInject
|
|
|
+ function formlyFocus($timeout, $document) {
|
|
|
+ return {
|
|
|
+ restrict: 'A',
|
|
|
+ link: function formlyFocusLink(scope, element, attrs) {
|
|
|
+ var previousEl = null;
|
|
|
+ var el = element[0];
|
|
|
+ var doc = $document[0];
|
|
|
+ attrs.$observe('formlyFocus', function respondToFocusExpressionChange(value) {
|
|
|
+ /* eslint no-bitwise:0 */ // I know what I'm doing. I promise...
|
|
|
+ if (value === 'true') {
|
|
|
+ $timeout(function setElementFocus() {
|
|
|
+ previousEl = doc.activeElement;
|
|
|
+ el.focus();
|
|
|
+ }, ~ ~attrs.focusWait);
|
|
|
+ } else if (value === 'false') {
|
|
|
+ if (doc.activeElement === el) {
|
|
|
+ el.blur();
|
|
|
+ if (attrs.hasOwnProperty('refocus') && previousEl) {
|
|
|
+ previousEl.focus();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 16 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ formlyForm.$inject = ["formlyUsability", "formlyWarn", "$parse", "formlyConfig", "$interpolate"];
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ var _angularFix = __webpack_require__(2);
|
|
|
+
|
|
|
+ var _angularFix2 = _interopRequireDefault(_angularFix);
|
|
|
+
|
|
|
+ exports['default'] = formlyForm;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @ngdoc directive
|
|
|
+ * @name formlyForm
|
|
|
+ * @restrict AE
|
|
|
+ */
|
|
|
+ // @ngInject
|
|
|
+ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpolate) {
|
|
|
+ var currentFormId = 1;
|
|
|
+ return {
|
|
|
+ restrict: 'AE',
|
|
|
+ template: formlyFormGetTemplate,
|
|
|
+ replace: true,
|
|
|
+ transclude: true,
|
|
|
+ scope: {
|
|
|
+ fields: '=',
|
|
|
+ model: '=',
|
|
|
+ form: '=?',
|
|
|
+ options: '=?'
|
|
|
+ },
|
|
|
+ controller: 'FormlyFormController',
|
|
|
+ link: formlyFormLink
|
|
|
+ };
|
|
|
+
|
|
|
+ function formlyFormGetTemplate(el, attrs) {
|
|
|
+ var rootEl = getRootEl();
|
|
|
+ var fieldRootEl = getFieldRootEl();
|
|
|
+ var formId = 'formly_' + currentFormId++;
|
|
|
+ var parentFormAttributes = '';
|
|
|
+ if (attrs.hasOwnProperty('isFieldGroup') && el.parent().parent().hasClass('formly')) {
|
|
|
+ parentFormAttributes = copyAttributes(el.parent().parent()[0].attributes);
|
|
|
+ }
|
|
|
+ return '\n <' + rootEl + ' class="formly"\n name="' + getFormName() + '"\n role="form" ' + parentFormAttributes + '>\n <' + fieldRootEl + ' formly-field\n ng-repeat="field in fields ' + getTrackBy() + '"\n ' + getHideDirective() + '="!field.hide"\n class="formly-field"\n options="field"\n model="field.model || model"\n original-model="model"\n fields="fields"\n form="theFormlyForm"\n form-id="' + getFormName() + '"\n form-state="options.formState"\n form-options="options"\n index="$index">\n </' + fieldRootEl + '>\n <div ng-transclude class="' + getTranscludeClass() + '"></div>\n </' + rootEl + '>\n ';
|
|
|
+
|
|
|
+ function getRootEl() {
|
|
|
+ return attrs.rootEl || 'ng-form';
|
|
|
+ }
|
|
|
+
|
|
|
+ function getFieldRootEl() {
|
|
|
+ return attrs.fieldRootEl || 'div';
|
|
|
+ }
|
|
|
+
|
|
|
+ function getHideDirective() {
|
|
|
+ return attrs.hideDirective || formlyConfig.extras.defaultHideDirective || 'ng-if';
|
|
|
+ }
|
|
|
+
|
|
|
+ function getTrackBy() {
|
|
|
+ if (!attrs.trackBy) {
|
|
|
+ return '';
|
|
|
+ } else {
|
|
|
+ return 'track by ' + attrs.trackBy;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function getFormName() {
|
|
|
+ var formName = formId;
|
|
|
+ var bindName = attrs.bindName;
|
|
|
+ if (bindName) {
|
|
|
+ if (_angularFix2['default'].version.minor < 3) {
|
|
|
+ throw formlyUsability.getFormlyError('bind-name attribute on formly-form not allowed in < angular 1.3');
|
|
|
+ }
|
|
|
+ // we can do a one-time binding here because we know we're in 1.3.x territory
|
|
|
+ formName = $interpolate.startSymbol() + '::\'formly_\' + ' + bindName + $interpolate.endSymbol();
|
|
|
+ }
|
|
|
+ return formName;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getTranscludeClass() {
|
|
|
+ return attrs.transcludeClass || '';
|
|
|
+ }
|
|
|
+
|
|
|
+ function copyAttributes(attributes) {
|
|
|
+ var excluded = ['model', 'form', 'fields', 'options', 'name', 'role', 'class', 'data-model', 'data-form', 'data-fields', 'data-options', 'data-name'];
|
|
|
+ var arrayAttrs = [];
|
|
|
+ _angularFix2['default'].forEach(attributes, function (_ref) {
|
|
|
+ var nodeName = _ref.nodeName;
|
|
|
+ var value = _ref.value;
|
|
|
+
|
|
|
+ if (nodeName !== 'undefined' && excluded.indexOf(nodeName) === -1) {
|
|
|
+ arrayAttrs.push(toKebabCase(nodeName) + '="' + value + '"');
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return arrayAttrs.join(' ');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function formlyFormLink(scope, el, attrs) {
|
|
|
+ setFormController();
|
|
|
+ fixChromeAutocomplete();
|
|
|
+
|
|
|
+ function setFormController() {
|
|
|
+ var formId = attrs.name;
|
|
|
+ scope.formId = formId;
|
|
|
+ scope.theFormlyForm = scope[formId];
|
|
|
+ if (attrs.form) {
|
|
|
+ var getter = $parse(attrs.form);
|
|
|
+ var setter = getter.assign;
|
|
|
+ var parentForm = getter(scope.$parent);
|
|
|
+ if (parentForm) {
|
|
|
+ scope.theFormlyForm = parentForm;
|
|
|
+ if (scope[formId]) {
|
|
|
+ scope.theFormlyForm.$removeControl(scope[formId]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // this next line is probably one of the more dangerous things that angular-formly does to improve the
|
|
|
+ // API for angular-formly forms. It ensures that the NgModelControllers inside of formly-form will be
|
|
|
+ // attached to the form that is passed to formly-form rather than the one that formly-form creates
|
|
|
+ // this is necessary because it's confusing to have a step between the form you pass in
|
|
|
+ // and the fields in that form. It also is because angular doesn't propagate properties like $submitted down
|
|
|
+ // to children forms :-( This line was added to solve this issue:
|
|
|
+ // https://github.com/formly-js/angular-formly/issues/287
|
|
|
+ // luckily, this is how the formController has been accessed by the NgModelController since angular 1.0.0
|
|
|
+ // so I expect it will remain this way for the life of angular 1.x
|
|
|
+ el.removeData('$formController');
|
|
|
+ } else {
|
|
|
+ setter(scope.$parent, scope[formId]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!scope.theFormlyForm && !formlyConfig.disableWarnings) {
|
|
|
+ /* eslint no-console:0 */
|
|
|
+ formlyWarn('formly-form-has-no-formcontroller', 'Your formly-form does not have a `form` property. Many functions of the form (like validation) may not work', el, scope);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * chrome autocomplete lameness
|
|
|
+ * see https://code.google.com/p/chromium/issues/detail?id=468153#c14
|
|
|
+ * ლ(ಠ益ಠლ) (╯°□°)╯︵ ┻━┻ (◞‸◟;)
|
|
|
+ */
|
|
|
+ function fixChromeAutocomplete() {
|
|
|
+ var global = formlyConfig.extras.removeChromeAutoComplete === true;
|
|
|
+ var offInstance = scope.options && scope.options.removeChromeAutoComplete === false;
|
|
|
+ var onInstance = scope.options && scope.options.removeChromeAutoComplete === true;
|
|
|
+ if (global && !offInstance || onInstance) {
|
|
|
+ var input = document.createElement('input');
|
|
|
+ input.setAttribute('autocomplete', 'address-level4');
|
|
|
+ input.setAttribute('hidden', 'true');
|
|
|
+ el[0].appendChild(input);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // stateless util functions
|
|
|
+ function toKebabCase(string) {
|
|
|
+ if (string) {
|
|
|
+ return string.replace(/([A-Z])/g, function ($1) {
|
|
|
+ return '-' + $1.toLowerCase();
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 17 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ FormlyFormController.$inject = ["formlyUsability", "formlyWarn", "formlyConfig", "$parse", "$scope", "formlyApiCheck", "formlyUtil"];
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+ var _slice = Array.prototype.slice;
|
|
|
+ exports['default'] = FormlyFormController;
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
|
|
|
+
|
|
|
+ var _angularFix = __webpack_require__(2);
|
|
|
+
|
|
|
+ var _angularFix2 = _interopRequireDefault(_angularFix);
|
|
|
+
|
|
|
+ function isFieldGroup(field) {
|
|
|
+ return field && !!field.fieldGroup;
|
|
|
+ }
|
|
|
+
|
|
|
+ // @ngInject
|
|
|
+
|
|
|
+ function FormlyFormController(formlyUsability, formlyWarn, formlyConfig, $parse, $scope, formlyApiCheck, formlyUtil) {
|
|
|
+
|
|
|
+ setupOptions();
|
|
|
+ $scope.model = $scope.model || {};
|
|
|
+ setupFields();
|
|
|
+
|
|
|
+ // watch the model and evaluate watch expressions that depend on it.
|
|
|
+ if (!$scope.options.manualModelWatcher) {
|
|
|
+ $scope.$watch('model', onModelOrFormStateChange, true);
|
|
|
+ } else if (_angularFix2['default'].isFunction($scope.options.manualModelWatcher)) {
|
|
|
+ $scope.$watch($scope.options.manualModelWatcher, onModelOrFormStateChange, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($scope.options.formState) {
|
|
|
+ $scope.$watch('options.formState', onModelOrFormStateChange, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ function onModelOrFormStateChange() {
|
|
|
+ _angularFix2['default'].forEach($scope.fields, runFieldExpressionProperties);
|
|
|
+ }
|
|
|
+
|
|
|
+ function validateFormControl(formControl, promise) {
|
|
|
+ var validate = formControl.$validate;
|
|
|
+ if (promise) {
|
|
|
+ promise.then(function () {
|
|
|
+ return validate.apply(formControl);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ validate();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function runFieldExpressionProperties(field, index) {
|
|
|
+ var model = field.model || $scope.model;
|
|
|
+ var promise = field.runExpressions && field.runExpressions();
|
|
|
+ if (field.hideExpression) {
|
|
|
+ // can't use hide with expressionProperties reliably
|
|
|
+ var val = model[field.key];
|
|
|
+ field.hide = evalCloseToFormlyExpression(field.hideExpression, val, field, index, { model: model });
|
|
|
+ }
|
|
|
+ if (field.extras && field.extras.validateOnModelChange && field.formControl) {
|
|
|
+ if (_angularFix2['default'].isArray(field.formControl)) {
|
|
|
+ _angularFix2['default'].forEach(field.formControl, function (formControl) {
|
|
|
+ validateFormControl(formControl, promise);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ validateFormControl(field.formControl, promise);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function setupFields() {
|
|
|
+ $scope.fields = $scope.fields || [];
|
|
|
+
|
|
|
+ checkDeprecatedOptions($scope.options);
|
|
|
+
|
|
|
+ var fieldTransforms = $scope.options.fieldTransform || formlyConfig.extras.fieldTransform;
|
|
|
+
|
|
|
+ if (!_angularFix2['default'].isArray(fieldTransforms)) {
|
|
|
+ fieldTransforms = [fieldTransforms];
|
|
|
+ }
|
|
|
+
|
|
|
+ _angularFix2['default'].forEach(fieldTransforms, function transformFields(fieldTransform) {
|
|
|
+ if (fieldTransform) {
|
|
|
+ $scope.fields = fieldTransform($scope.fields, $scope.model, $scope.options, $scope.form);
|
|
|
+ if (!$scope.fields) {
|
|
|
+ throw formlyUsability.getFormlyError('fieldTransform must return an array of fields');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ setupModels();
|
|
|
+
|
|
|
+ if ($scope.options.watchAllExpressions) {
|
|
|
+ _angularFix2['default'].forEach($scope.fields, setupHideExpressionWatcher);
|
|
|
+ }
|
|
|
+
|
|
|
+ _angularFix2['default'].forEach($scope.fields, attachKey); // attaches a key based on the index if a key isn't specified
|
|
|
+ _angularFix2['default'].forEach($scope.fields, setupWatchers); // setup watchers for all fields
|
|
|
+ }
|
|
|
+
|
|
|
+ function checkDeprecatedOptions(options) {
|
|
|
+ if (formlyConfig.extras.fieldTransform && _angularFix2['default'].isFunction(formlyConfig.extras.fieldTransform)) {
|
|
|
+ formlyWarn('fieldtransform-as-a-function-deprecated', 'fieldTransform as a function has been deprecated.', 'Attempted for formlyConfig.extras: ' + formlyConfig.extras.fieldTransform.name, formlyConfig.extras);
|
|
|
+ } else if (options.fieldTransform && _angularFix2['default'].isFunction(options.fieldTransform)) {
|
|
|
+ formlyWarn('fieldtransform-as-a-function-deprecated', 'fieldTransform as a function has been deprecated.', 'Attempted for form', options);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function setupOptions() {
|
|
|
+ formlyApiCheck['throw']([formlyApiCheck.formOptionsApi.optional], [$scope.options], { prefix: 'formly-form options check' });
|
|
|
+ $scope.options = $scope.options || {};
|
|
|
+ $scope.options.formState = $scope.options.formState || {};
|
|
|
+
|
|
|
+ _angularFix2['default'].extend($scope.options, {
|
|
|
+ updateInitialValue: updateInitialValue,
|
|
|
+ resetModel: resetModel
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function updateInitialValue() {
|
|
|
+ _angularFix2['default'].forEach($scope.fields, function (field) {
|
|
|
+ if (isFieldGroup(field) && field.options) {
|
|
|
+ field.options.updateInitialValue();
|
|
|
+ } else {
|
|
|
+ field.updateInitialValue();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function resetModel() {
|
|
|
+ _angularFix2['default'].forEach($scope.fields, function (field) {
|
|
|
+ if (isFieldGroup(field) && field.options) {
|
|
|
+ field.options.resetModel();
|
|
|
+ } else if (field.resetModel) {
|
|
|
+ field.resetModel();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function setupModels() {
|
|
|
+ // a set of field models that are already watched (the $scope.model will have its own watcher)
|
|
|
+ var watchedModels = [$scope.model];
|
|
|
+ // we will not set up automatic model watchers if manual mode is set
|
|
|
+ var manualModelWatcher = $scope.options.manualModelWatcher;
|
|
|
+
|
|
|
+ if ($scope.options.formState) {
|
|
|
+ // $scope.options.formState will have its own watcher
|
|
|
+ watchedModels.push($scope.options.formState);
|
|
|
+ }
|
|
|
+
|
|
|
+ _angularFix2['default'].forEach($scope.fields, function (field) {
|
|
|
+ var isNewModel = initModel(field);
|
|
|
+
|
|
|
+ if (field.model && isNewModel && watchedModels.indexOf(field.model) === -1 && !manualModelWatcher) {
|
|
|
+ $scope.$watch(function () {
|
|
|
+ return field.model;
|
|
|
+ }, onModelOrFormStateChange, true);
|
|
|
+ watchedModels.push(field.model);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function setupHideExpressionWatcher(field, index) {
|
|
|
+ if (field.hideExpression) {
|
|
|
+ (function () {
|
|
|
+ // can't use hide with expressionProperties reliably
|
|
|
+ var model = field.model || $scope.model;
|
|
|
+ $scope.$watch(function hideExpressionWatcher() {
|
|
|
+ var val = model[field.key];
|
|
|
+ return evalCloseToFormlyExpression(field.hideExpression, val, field, index, { model: model });
|
|
|
+ }, function (hide) {
|
|
|
+ return field.hide = hide;
|
|
|
+ }, true);
|
|
|
+ })();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function initModel(field) {
|
|
|
+ var isNewModel = true;
|
|
|
+
|
|
|
+ if (_angularFix2['default'].isString(field.model)) {
|
|
|
+ (function () {
|
|
|
+ var expression = field.model;
|
|
|
+
|
|
|
+ isNewModel = !referencesCurrentlyWatchedModel(expression);
|
|
|
+
|
|
|
+ field.model = resolveStringModel(expression);
|
|
|
+
|
|
|
+ $scope.$watch(function () {
|
|
|
+ return resolveStringModel(expression);
|
|
|
+ }, function (model) {
|
|
|
+ return field.model = model;
|
|
|
+ });
|
|
|
+ })();
|
|
|
+ }
|
|
|
+
|
|
|
+ return isNewModel;
|
|
|
+
|
|
|
+ function resolveStringModel(expression) {
|
|
|
+ var index = $scope.fields.indexOf(field);
|
|
|
+ var model = evalCloseToFormlyExpression(expression, undefined, field, index, { model: $scope.model });
|
|
|
+
|
|
|
+ if (!model) {
|
|
|
+ throw formlyUsability.getFieldError('field-model-must-be-initialized', 'Field model must be initialized. When specifying a model as a string for a field, the result of the' + ' expression must have been initialized ahead of time.', field);
|
|
|
+ }
|
|
|
+
|
|
|
+ return model;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function referencesCurrentlyWatchedModel(expression) {
|
|
|
+ return ['model', 'formState'].some(function (item) {
|
|
|
+ return formlyUtil.startsWith(expression, item + '.') || formlyUtil.startsWith(expression, item + '[');
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function attachKey(field, index) {
|
|
|
+ if (!isFieldGroup(field)) {
|
|
|
+ field.key = field.key || index || 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function setupWatchers(field, index) {
|
|
|
+ if (!_angularFix2['default'].isDefined(field.watcher)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var watchers = field.watcher;
|
|
|
+ if (!_angularFix2['default'].isArray(watchers)) {
|
|
|
+ watchers = [watchers];
|
|
|
+ }
|
|
|
+ _angularFix2['default'].forEach(watchers, function setupWatcher(watcher) {
|
|
|
+ if (!_angularFix2['default'].isDefined(watcher.listener) && !watcher.runFieldExpressions) {
|
|
|
+ throw formlyUsability.getFieldError('all-field-watchers-must-have-a-listener', 'All field watchers must have a listener', field);
|
|
|
+ }
|
|
|
+ var watchExpression = getWatchExpression(watcher, field, index);
|
|
|
+ var watchListener = getWatchListener(watcher, field, index);
|
|
|
+
|
|
|
+ var type = watcher.type || '$watch';
|
|
|
+ watcher.stopWatching = $scope[type](watchExpression, watchListener, watcher.watchDeep);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function getWatchExpression(watcher, field, index) {
|
|
|
+ var watchExpression = undefined;
|
|
|
+ if (!_angularFix2['default'].isUndefined(watcher.expression)) {
|
|
|
+ watchExpression = watcher.expression;
|
|
|
+ } else if (field.key) {
|
|
|
+ watchExpression = 'model[\'' + field.key.toString().split('.').join('\'][\'') + '\']';
|
|
|
+ }
|
|
|
+ if (_angularFix2['default'].isFunction(watchExpression)) {
|
|
|
+ (function () {
|
|
|
+ // wrap the field's watch expression so we can call it with the field as the first arg
|
|
|
+ // and the stop function as the last arg as a helper
|
|
|
+ var originalExpression = watchExpression;
|
|
|
+ watchExpression = function formlyWatchExpression() {
|
|
|
+ var args = modifyArgs.apply(undefined, [watcher, index].concat(_slice.call(arguments)));
|
|
|
+ return originalExpression.apply(undefined, _toConsumableArray(args));
|
|
|
+ };
|
|
|
+ watchExpression.displayName = 'Formly Watch Expression for field for ' + field.key;
|
|
|
+ })();
|
|
|
+ } else if (field.model) {
|
|
|
+ watchExpression = $parse(watchExpression).bind(null, $scope, { model: field.model });
|
|
|
+ }
|
|
|
+ return watchExpression;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getWatchListener(watcher, field, index) {
|
|
|
+ var watchListener = watcher.listener;
|
|
|
+ if (_angularFix2['default'].isFunction(watchListener) || watcher.runFieldExpressions) {
|
|
|
+ (function () {
|
|
|
+ // wrap the field's watch listener so we can call it with the field as the first arg
|
|
|
+ // and the stop function as the last arg as a helper
|
|
|
+ var originalListener = watchListener;
|
|
|
+ watchListener = function formlyWatchListener() {
|
|
|
+ var value = undefined;
|
|
|
+ if (originalListener) {
|
|
|
+ var args = modifyArgs.apply(undefined, [watcher, index].concat(_slice.call(arguments)));
|
|
|
+ value = originalListener.apply(undefined, _toConsumableArray(args));
|
|
|
+ }
|
|
|
+ if (watcher.runFieldExpressions) {
|
|
|
+ runFieldExpressionProperties(field, index);
|
|
|
+ }
|
|
|
+ return value;
|
|
|
+ };
|
|
|
+ watchListener.displayName = 'Formly Watch Listener for field for ' + field.key;
|
|
|
+ })();
|
|
|
+ }
|
|
|
+ return watchListener;
|
|
|
+ }
|
|
|
+
|
|
|
+ function modifyArgs(watcher, index) {
|
|
|
+ for (var _len = arguments.length, originalArgs = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
|
|
|
+ originalArgs[_key - 2] = arguments[_key];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [$scope.fields[index]].concat(originalArgs, [watcher.stopWatching]);
|
|
|
+ }
|
|
|
+
|
|
|
+ function evalCloseToFormlyExpression(expression, val, field, index) {
|
|
|
+ var extraLocals = arguments.length <= 4 || arguments[4] === undefined ? {} : arguments[4];
|
|
|
+
|
|
|
+ extraLocals = _angularFix2['default'].extend(getFormlyFieldLikeLocals(field, index), extraLocals);
|
|
|
+ return formlyUtil.formlyEval($scope, expression, val, val, extraLocals);
|
|
|
+ }
|
|
|
+
|
|
|
+ function getFormlyFieldLikeLocals(field, index) {
|
|
|
+ // this makes it closer to what a regular formlyExpression would be
|
|
|
+ return {
|
|
|
+ model: field.model,
|
|
|
+ options: field,
|
|
|
+ index: index,
|
|
|
+ formState: $scope.options.formState,
|
|
|
+ originalModel: $scope.model,
|
|
|
+ formOptions: $scope.options,
|
|
|
+ formId: $scope.formId
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 18 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ addFormlyNgModelAttrsManipulator.$inject = ["formlyConfig", "$interpolate"];
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ var _angularFix = __webpack_require__(2);
|
|
|
+
|
|
|
+ var _angularFix2 = _interopRequireDefault(_angularFix);
|
|
|
+
|
|
|
+ var _otherUtils = __webpack_require__(9);
|
|
|
+
|
|
|
+ exports['default'] = addFormlyNgModelAttrsManipulator;
|
|
|
+
|
|
|
+ // @ngInject
|
|
|
+ function addFormlyNgModelAttrsManipulator(formlyConfig, $interpolate) {
|
|
|
+ if (formlyConfig.extras.disableNgModelAttrsManipulator) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ formlyConfig.templateManipulators.preWrapper.push(ngModelAttrsManipulator);
|
|
|
+
|
|
|
+ function ngModelAttrsManipulator(template, options, scope) {
|
|
|
+ var node = document.createElement('div');
|
|
|
+ var skip = options.extras && options.extras.skipNgModelAttrsManipulator;
|
|
|
+ if (skip === true) {
|
|
|
+ return template;
|
|
|
+ }
|
|
|
+ node.innerHTML = template;
|
|
|
+
|
|
|
+ var modelNodes = getNgModelNodes(node, skip);
|
|
|
+ if (!modelNodes || !modelNodes.length) {
|
|
|
+ return template;
|
|
|
+ }
|
|
|
+
|
|
|
+ addIfNotPresent(modelNodes, 'id', scope.id);
|
|
|
+ addIfNotPresent(modelNodes, 'name', scope.name || scope.id);
|
|
|
+
|
|
|
+ addValidation();
|
|
|
+ alterNgModelAttr();
|
|
|
+ addModelOptions();
|
|
|
+ addTemplateOptionsAttrs();
|
|
|
+ addNgModelElAttrs();
|
|
|
+
|
|
|
+ return node.innerHTML;
|
|
|
+
|
|
|
+ function addValidation() {
|
|
|
+ if (_angularFix2['default'].isDefined(options.validators) || _angularFix2['default'].isDefined(options.validation.messages)) {
|
|
|
+ addIfNotPresent(modelNodes, 'formly-custom-validation', '');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function alterNgModelAttr() {
|
|
|
+ if (isPropertyAccessor(options.key)) {
|
|
|
+ addRegardlessOfPresence(modelNodes, 'ng-model', 'model.' + options.key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function addModelOptions() {
|
|
|
+ if (_angularFix2['default'].isDefined(options.modelOptions)) {
|
|
|
+ addIfNotPresent(modelNodes, 'ng-model-options', 'options.modelOptions');
|
|
|
+ if (options.modelOptions.getterSetter) {
|
|
|
+ addRegardlessOfPresence(modelNodes, 'ng-model', 'options.value');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function addTemplateOptionsAttrs() {
|
|
|
+ if (!options.templateOptions && !options.expressionProperties) {
|
|
|
+ // no need to run these if there are no templateOptions or expressionProperties
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var to = options.templateOptions || {};
|
|
|
+ var ep = options.expressionProperties || {};
|
|
|
+
|
|
|
+ var ngModelAttributes = getBuiltInAttributes();
|
|
|
+
|
|
|
+ // extend with the user's specifications winning
|
|
|
+ _angularFix2['default'].extend(ngModelAttributes, options.ngModelAttrs);
|
|
|
+
|
|
|
+ // Feel free to make this more simple :-)
|
|
|
+ _angularFix2['default'].forEach(ngModelAttributes, function (val, name) {
|
|
|
+ /* eslint complexity:[2, 14] */
|
|
|
+ var attrVal = undefined,
|
|
|
+ attrName = undefined;
|
|
|
+ var ref = 'options.templateOptions[\'' + name + '\']';
|
|
|
+ var toVal = to[name];
|
|
|
+ var epVal = getEpValue(ep, name);
|
|
|
+
|
|
|
+ var inTo = _angularFix2['default'].isDefined(toVal);
|
|
|
+ var inEp = _angularFix2['default'].isDefined(epVal);
|
|
|
+ if (val.value) {
|
|
|
+ // I realize this looks backwards, but it's right, trust me...
|
|
|
+ attrName = val.value;
|
|
|
+ attrVal = name;
|
|
|
+ } else if (val.statement && inTo) {
|
|
|
+ attrName = val.statement;
|
|
|
+ if (_angularFix2['default'].isString(to[name])) {
|
|
|
+ attrVal = '$eval(' + ref + ')';
|
|
|
+ } else if (_angularFix2['default'].isFunction(to[name])) {
|
|
|
+ attrVal = ref + '(model[options.key], options, this, $event)';
|
|
|
+ } else {
|
|
|
+ throw new Error('options.templateOptions.' + name + ' must be a string or function: ' + JSON.stringify(options));
|
|
|
+ }
|
|
|
+ } else if (val.bound && inEp) {
|
|
|
+ attrName = val.bound;
|
|
|
+ attrVal = ref;
|
|
|
+ } else if ((val.attribute || val.boolean) && inEp) {
|
|
|
+ attrName = val.attribute || val.boolean;
|
|
|
+ attrVal = '' + $interpolate.startSymbol() + ref + $interpolate.endSymbol();
|
|
|
+ } else if (val.attribute && inTo) {
|
|
|
+ attrName = val.attribute;
|
|
|
+ attrVal = toVal;
|
|
|
+ } else if (val.boolean) {
|
|
|
+ if (inTo && !inEp && toVal) {
|
|
|
+ attrName = val.boolean;
|
|
|
+ attrVal = true;
|
|
|
+ } else {
|
|
|
+ /* eslint no-empty:0 */
|
|
|
+ // empty to illustrate that a boolean will not be added via val.bound
|
|
|
+ // if you want it added via val.bound, then put it in expressionProperties
|
|
|
+ }
|
|
|
+ } else if (val.bound && inTo) {
|
|
|
+ attrName = val.bound;
|
|
|
+ attrVal = ref;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (_angularFix2['default'].isDefined(attrName) && _angularFix2['default'].isDefined(attrVal)) {
|
|
|
+ addIfNotPresent(modelNodes, attrName, attrVal);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function addNgModelElAttrs() {
|
|
|
+ _angularFix2['default'].forEach(options.ngModelElAttrs, function (val, name) {
|
|
|
+ addRegardlessOfPresence(modelNodes, name, val);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Utility functions
|
|
|
+ function getNgModelNodes(node, skip) {
|
|
|
+ var selectorNot = _angularFix2['default'].isString(skip) ? ':not(' + skip + ')' : '';
|
|
|
+ var skipNot = ':not([formly-skip-ng-model-attrs-manipulator])';
|
|
|
+ var query = '[ng-model]' + selectorNot + skipNot + ', [data-ng-model]' + selectorNot + skipNot;
|
|
|
+ try {
|
|
|
+ return node.querySelectorAll(query);
|
|
|
+ } catch (e) {
|
|
|
+ //this code is needed for IE8, as it does not support the CSS3 ':not' selector
|
|
|
+ //it should be removed when IE8 support is dropped
|
|
|
+ return getNgModelNodesFallback(node, skip);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function getNgModelNodesFallback(node, skip) {
|
|
|
+ var allNgModelNodes = node.querySelectorAll('[ng-model], [data-ng-model]');
|
|
|
+ var matchingNgModelNodes = [];
|
|
|
+
|
|
|
+ //make sure this array is compatible with NodeList type by adding an 'item' function
|
|
|
+ matchingNgModelNodes.item = function (i) {
|
|
|
+ return this[i];
|
|
|
+ };
|
|
|
+
|
|
|
+ for (var i = 0; i < allNgModelNodes.length; i++) {
|
|
|
+ var ngModelNode = allNgModelNodes[i];
|
|
|
+ if (!ngModelNode.hasAttribute('formly-skip-ng-model-attrs-manipulator') && !(_angularFix2['default'].isString(skip) && nodeMatches(ngModelNode, skip))) {
|
|
|
+ matchingNgModelNodes.push(ngModelNode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return matchingNgModelNodes;
|
|
|
+ }
|
|
|
+
|
|
|
+ function nodeMatches(node, selector) {
|
|
|
+ var div = document.createElement('div');
|
|
|
+ div.innerHTML = node.outerHTML;
|
|
|
+ return div.querySelector(selector);
|
|
|
+ }
|
|
|
+
|
|
|
+ function getBuiltInAttributes() {
|
|
|
+ var ngModelAttributes = {
|
|
|
+ focus: {
|
|
|
+ attribute: 'formly-focus'
|
|
|
+ }
|
|
|
+ };
|
|
|
+ var boundOnly = [];
|
|
|
+ var bothBooleanAndBound = ['required', 'disabled'];
|
|
|
+ var bothAttributeAndBound = ['pattern', 'minlength'];
|
|
|
+ var statementOnly = ['change', 'keydown', 'keyup', 'keypress', 'click', 'focus', 'blur'];
|
|
|
+ var attributeOnly = ['placeholder', 'min', 'max', 'step', 'tabindex', 'type'];
|
|
|
+ if (formlyConfig.extras.ngModelAttrsManipulatorPreferUnbound) {
|
|
|
+ bothAttributeAndBound.push('maxlength');
|
|
|
+ } else {
|
|
|
+ boundOnly.push('maxlength');
|
|
|
+ }
|
|
|
+
|
|
|
+ _angularFix2['default'].forEach(boundOnly, function (item) {
|
|
|
+ ngModelAttributes[item] = { bound: 'ng-' + item };
|
|
|
+ });
|
|
|
+
|
|
|
+ _angularFix2['default'].forEach(bothBooleanAndBound, function (item) {
|
|
|
+ ngModelAttributes[item] = { boolean: item, bound: 'ng-' + item };
|
|
|
+ });
|
|
|
+
|
|
|
+ _angularFix2['default'].forEach(bothAttributeAndBound, function (item) {
|
|
|
+ ngModelAttributes[item] = { attribute: item, bound: 'ng-' + item };
|
|
|
+ });
|
|
|
+
|
|
|
+ _angularFix2['default'].forEach(statementOnly, function (item) {
|
|
|
+ var propName = 'on' + item.substr(0, 1).toUpperCase() + item.substr(1);
|
|
|
+ ngModelAttributes[propName] = { statement: 'ng-' + item };
|
|
|
+ });
|
|
|
+
|
|
|
+ _angularFix2['default'].forEach(attributeOnly, function (item) {
|
|
|
+ ngModelAttributes[item] = { attribute: item };
|
|
|
+ });
|
|
|
+ return ngModelAttributes;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getEpValue(ep, name) {
|
|
|
+ return ep['templateOptions.' + name] || ep['templateOptions[\'' + name + '\']'] || ep['templateOptions["' + name + '"]'];
|
|
|
+ }
|
|
|
+
|
|
|
+ function addIfNotPresent(nodes, attr, val) {
|
|
|
+ _angularFix2['default'].forEach(nodes, function (node) {
|
|
|
+ if (!node.getAttribute(attr)) {
|
|
|
+ node.setAttribute(attr, val);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function addRegardlessOfPresence(nodes, attr, val) {
|
|
|
+ _angularFix2['default'].forEach(nodes, function (node) {
|
|
|
+ node.setAttribute(attr, val);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function isPropertyAccessor(key) {
|
|
|
+ return (0, _otherUtils.contains)(key, '.') || (0, _otherUtils.contains)(key, '[') && (0, _otherUtils.contains)(key, ']');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ },
|
|
|
+/* 19 */
|
|
|
+/***/ function(module, exports, __webpack_require__) {
|
|
|
+
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ addCustomTags.$inject = ["$document"];
|
|
|
+ Object.defineProperty(exports, '__esModule', {
|
|
|
+ value: true
|
|
|
+ });
|
|
|
+
|
|
|
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+ var _angularFix = __webpack_require__(2);
|
|
|
+
|
|
|
+ var _angularFix2 = _interopRequireDefault(_angularFix);
|
|
|
+
|
|
|
+ exports['default'] = addCustomTags;
|
|
|
+
|
|
|
+ // @ngInject
|
|
|
+ function addCustomTags($document) {
|
|
|
+ // IE8 check ->
|
|
|
+ // https://msdn.microsoft.com/en-us/library/cc196988(v=vs.85).aspx
|
|
|
+ if ($document && $document.documentMode < 9) {
|
|
|
+ (function () {
|
|
|
+ var document = $document.get(0);
|
|
|
+ // add the custom elements that we need for formly
|
|
|
+ var customElements = ['formly-field', 'formly-form'];
|
|
|
+ _angularFix2['default'].forEach(customElements, function (el) {
|
|
|
+ document.createElement(el);
|
|
|
+ });
|
|
|
+ })();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ module.exports = exports['default'];
|
|
|
+
|
|
|
+/***/ }
|
|
|
+/******/ ])
|
|
|
+});
|
|
|
+;
|