Last active
July 19, 2016 14:17
-
-
Save pseudo-su/8db7d245ef21beb1f430080b76950fe9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*! | |
* 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, | |
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, | |
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, 34] */ | |
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 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 { | |
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(validate); | |
} 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']; | |
/***/ } | |
/******/ ]) | |
}); | |
; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment