/*! * angular-formly JavaScript Library v0.0.0-semantically-released.0 * * @license MIT (http://license.angular-formly.com) * * built with ♥ by Astrism , Kent C. Dodds * (ó ì_í)=óò=(ì_í ò) */ (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 = ''; if (template.indexOf(formlyTransclude) === -1) { throw getFormlyError('Template wrapper templates must use "' + formlyTransclude + '" somewhere in them. ' + ('This one does not have "" 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 \n \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('
' + templateString + '
'); 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(''); 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(''); // 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 \n
\n \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']; /***/ } /******/ ]) }); ;