UNPKG

angular-dynamic-forms-lite

Version:
160 lines 15.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { DynamicGroupController } from "./dynamic-group-controller"; export class GroupFieldFactory { /** * @param {?} parentFieldFactory * @param {?} formBuilder */ constructor(parentFieldFactory, formBuilder) { this.parentFieldFactory = parentFieldFactory; this.formBuilder = formBuilder; } /** * @template M * @param {?} options * @return {?} */ create(options) { const { setting, settings } = options; const [formControl, children] = this.createChildContexts(options); /** @type {?} */ const dynamicController = new DynamicGroupController(formControl, this.parentFieldFactory, setting, settings); /** @type {?} */ const groupFormContext = Object.assign({}, this.parentFieldFactory.resolveComponent(formControl, setting, options.initialValue, dynamicController), { children }); /** @type {?} */ const groupComponent = (/** @type {?} */ (groupFormContext.componentRef.instance)); if (!groupComponent.formRoot) { throw new Error(`Group component ${setting.name} is not a group component. It is missing the 'formRoot' directive.`); } dynamicController.onInit(groupFormContext); return groupFormContext; } /** * @param {?} formRoot * @param {?} root * @return {?} */ render(formRoot, root) { /** @type {?} */ const viewRef = formRoot.viewContainerRef.insert(root.componentRef.hostView); viewRef.detectChanges(); /** @type {?} */ const entries = Object.entries(root.children); entries.forEach((/** * @param {?} __0 * @return {?} */ ([_id, context]) => { /** @type {?} */ const component = (/** @type {?} */ (root.componentRef.instance)); this.parentFieldFactory.render(component.formRoot, context); })); return viewRef; } /** * @param {?} context * @return {?} */ updateChildren(context) { /** @type {?} */ const controlEntires = Object.entries(context.formControl.controls); /** @type {?} */ const entries = Object.entries(context.children); entries.forEach((/** * @param {?} __0 * @return {?} */ ([_id, child]) => { /** @type {?} */ const missingFormControl = controlEntires.find((/** * @param {?} entry * @return {?} */ entry => child.formControl === entry[1])); if (missingFormControl) { context.formControl.setControl(missingFormControl[0], missingFormControl[1]); } })); } /** * @private * @template M * @param {?} options * @return {?} */ createChildContexts(options) { const { setting, settings } = options; if (options.formControl) { /** @type {?} */ const controlEntires = Object.entries(options.formControl.controls); /** @type {?} */ const children = {}; controlEntires.forEach((/** * @param {?} __0 * @return {?} */ ([id, formControl]) => { children[id] = this.parentFieldFactory.create({ formControl, setting: this.getSetting(id, settings), settings }); })); return [options.formControl, children]; } const { initialValue: value } = options; if (typeof value !== "object") { throw new Error(`Value of group ${setting.name} is not an object`); } /** @type {?} */ const children = {}; /** @type {?} */ const formChildren = {}; Object.entries(value).forEach((/** * @param {?} __0 * @return {?} */ ([id, child]) => { children[id] = this.parentFieldFactory.create({ initialValue: child, setting: this.getSetting(id, settings), settings }); formChildren[id] = children[id].formControl; })); /** @type {?} */ const formControl = this.formBuilder.group(formChildren); return [formControl, children]; } /** * @private * @template M * @param {?} id * @param {?} settings * @return {?} */ getSetting(id, settings) { /** @type {?} */ const childSetting = (/** @type {?} */ (settings.get(id))); if (!childSetting) { throw new Error(`Form field '${id}' has no assigned form field setting.`); } return childSetting; } } if (false) { /** * @type {?} * @private */ GroupFieldFactory.prototype.parentFieldFactory; /** * @type {?} * @private */ GroupFieldFactory.prototype.formBuilder; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtZmllbGQtZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItZHluYW1pYy1mb3Jtcy1saXRlLyIsInNvdXJjZXMiOlsibGliL2Zvcm0tZmllbGQvZ3JvdXAvZ3JvdXAtZmllbGQtZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBSUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFPcEUsTUFBTSxPQUFPLGlCQUFpQjs7Ozs7SUFDNUIsWUFBb0Isa0JBQXNDLEVBQVUsV0FBd0I7UUFBeEUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUcsQ0FBQzs7Ozs7O0lBRXpGLE1BQU0sQ0FDWCxPQUF5RTtjQUVuRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPO2NBQy9CLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7O2NBRTNELGlCQUFpQixHQUFHLElBQUksc0JBQXNCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDOztjQUV2RyxnQkFBZ0IscUJBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDekMsV0FBVyxFQUNYLE9BQU8sRUFDUCxPQUFPLENBQUMsWUFBWSxFQUNwQixpQkFBaUIsQ0FDbEIsSUFDRCxRQUFRLEdBQ1Q7O2NBRUssY0FBYyxHQUFHLG1CQUFBLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQTJCO1FBRXhGLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ2IsbUJBQW1CLE9BQU8sQ0FBQyxJQUFJLG9FQUFvRSxDQUNwRyxDQUFDO1NBQ0g7UUFFRCxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FB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a0IsQ0FBQyxNQUFNLENBQUk7Z0JBQy9DLFlBQVksRUFBRSxLQUFLO2dCQUNuQixPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDO2dCQUN0QyxRQUFRO2FBQ1QsQ0FBQyxDQUFDO1lBQ0gsWUFBWSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDOUMsQ0FBQyxFQUFDLENBQUM7O2NBRUcsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUV4RCxPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7Ozs7Ozs7O0lBRU8sVUFBVSxDQUFJLEVBQVUsRUFBRSxRQUEyQjs7Y0FDckQsWUFBWSxHQUFHLG1CQUFBLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQXVCO1FBQzVELElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztTQUMzRTtRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7Q0FDRjs7Ozs7O0lBNUdhLCtDQUE4Qzs7Ozs7SUFBRSx3Q0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEZpZWxkRmFjdG9yeSwgUGFyZW50RmllbGRGYWN0b3J5LCBDcmVhdGVGb3JtQ29udGV4dE9wdGlvbnMgfSBmcm9tIFwiLi4vZmllbGQtZmFjdG9yeVwiO1xuaW1wb3J0IHsgRm9ybUNvbnRleHQgfSBmcm9tIFwiLi4vLi4vZm9ybS9mb3JtLWNvbnRleHRcIjtcbmltcG9ydCB7IEZvcm1Sb290RGlyZWN0aXZlIH0gZnJvbSBcIi4uLy4uL2Zvcm0vZm9ybS1yb290LmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgRHluYW1pY0dyb3VwQ29udHJvbGxlciB9IGZyb20gXCIuL2R5bmFtaWMtZ3JvdXAtY29udHJvbGxlclwiO1xuaW1wb3J0IHsgR3JvdXBGb3JtRmllbGRTZXR0aW5nIH0gZnJvbSBcIi4vZ3JvdXAtZm9ybS1maWVsZC1zZXR0aW5nXCI7XG5pbXBvcnQgeyBGb3JtRmllbGRHcm91cENvbXBvbmVudCB9IGZyb20gXCIuL2Zvcm0tZmllbGQtZ3JvdXAtY29tcG9uZW50XCI7XG5pbXBvcnQgeyBWaWV3UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1GaWVsZFNldHRpbmcgfSBmcm9tIFwiLi4vLi4vZm9ybS1zZXR0aW5ncy9mb3JtLWZpZWxkLXNldHRpbmdcIjtcbmltcG9ydCB7IEZvcm1GaWVsZFNldHRpbmdzIH0gZnJvbSBcIi4uLy4uL2Zvcm0tc2V0dGluZ3MvZm9ybS1maWVsZC1zZXR0aW5nc1wiO1xuXG5leHBvcnQgY2xhc3MgR3JvdXBGaWVsZEZhY3RvcnkgaW1wbGVtZW50cyBGaWVsZEZhY3Rvcnk8Rm9ybUdyb3VwLCBHcm91cEZvcm1GaWVsZFNldHRpbmc8YW55Pj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmVudEZpZWxkRmFjdG9yeTogUGFyZW50RmllbGRGYWN0b3J5LCBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcikge31cblxuICBwdWJsaWMgY3JlYXRlPE0+KFxuICAgIG9wdGlvbnM6IENyZWF0ZUZvcm1Db250ZXh0T3B0aW9uczxNLCBGb3JtR3JvdXAsIEdyb3VwRm9ybUZpZWxkU2V0dGluZzxNPj5cbiAgKTogRm9ybUNvbnRleHQ8TSwgRm9ybUdyb3VwPiB7XG4gICAgY29uc3QgeyBzZXR0aW5nLCBzZXR0aW5ncyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBbZm9ybUNvbnRyb2wsIGNoaWxkcmVuXSA9IHRoaXMuY3JlYXRlQ2hpbGRDb250ZXh0cyhvcHRpb25zKTtcblxuICAgIGNvbnN0IGR5bmFtaWNDb250cm9sbGVyID0gbmV3IER5bmFtaWNHcm91cENvbnRyb2xsZXIoZm9ybUNvbnRyb2wsIHRoaXMucGFyZW50RmllbGRGYWN0b3J5LCBzZXR0aW5nLCBzZXR0aW5ncyk7XG5cbiAgICBjb25zdCBncm91cEZvcm1Db250ZXh0OiBGb3JtQ29udGV4dDxNLCBGb3JtR3JvdXA+ID0ge1xuICAgICAgLi4udGhpcy5wYXJlbnRGaWVsZEZhY3RvcnkucmVzb2x2ZUNvbXBvbmVudDxNLCBGb3JtR3JvdXA+KFxuICAgICAgICBmb3JtQ29udHJvbCxcbiAgICAgICAgc2V0dGluZyxcbiAgICAgICAgb3B0aW9ucy5pbml0aWFsVmFsdWUsXG4gICAgICAgIGR5bmFtaWNDb250cm9sbGVyXG4gICAgICApLFxuICAgICAgY2hpbGRyZW5cbiAgICB9O1xuXG4gICAgY29uc3QgZ3JvdXBDb21wb25lbnQgPSBncm91cEZvcm1Db250ZXh0LmNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBGb3JtRmllbGRHcm91cENvbXBvbmVudDtcblxuICAgIGlmICghZ3JvdXBDb21wb25lbnQuZm9ybVJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEdyb3VwIGNvbXBvbmVudCAke3NldHRpbmcubmFtZX0gaXMgbm90IGEgZ3JvdXAgY29tcG9uZW50LiBJdCBpcyBtaXNzaW5nIHRoZSAnZm9ybVJvb3QnIGRpcmVjdGl2ZS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGR5bmFtaWNDb250cm9sbGVyLm9uSW5pdChncm91cEZvcm1Db250ZXh0KTtcblxuICAgIHJldHVybiBncm91cEZvcm1Db250ZXh0O1xuICB9XG5cbiAgcHVibGljIHJlbmRlcihmb3JtUm9vdDogRm9ybVJvb3REaXJlY3RpdmUsIHJvb3Q6IEZvcm1Db250ZXh0PGFueSwgRm9ybUdyb3VwPik6IFZpZXdSZWYge1xuICAgIGNvbnN0IHZpZXdSZWYgPSBmb3JtUm9vdC52aWV3Q29udGFpbmVyUmVmLmluc2VydChyb290LmNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG4gICAgdmlld1JlZi5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMocm9vdC5jaGlsZHJlbik7XG4gICAgZW50cmllcy5mb3JFYWNoKChbX2lkLCBjb250ZXh0XSkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gcm9vdC5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgRm9ybUZpZWxkR3JvdXBDb21wb25lbnQ7XG4gICAgICB0aGlzLnBhcmVudEZpZWxkRmFjdG9yeS5yZW5kZXIoY29tcG9uZW50LmZvcm1Sb290LCBjb250ZXh0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB2aWV3UmVmO1xuICB9XG5cbiAgdXBkYXRlQ2hpbGRyZW4oY29udGV4dDogRm9ybUNvbnRleHQ8YW55LCBGb3JtR3JvdXA+KTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbEVudGlyZXMgPSBPYmplY3QuZW50cmllcyhjb250ZXh0LmZvcm1Db250cm9sLmNvbnRyb2xzKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhjb250ZXh0LmNoaWxkcmVuKTtcbiAgICBlbnRyaWVzLmZvckVhY2goKFtfaWQsIGNoaWxkXSkgPT4ge1xuICAgICAgY29uc3QgbWlzc2luZ0Zvcm1Db250cm9sID0gY29udHJvbEVudGlyZXMuZmluZChlbnRyeSA9PiBjaGlsZC5mb3JtQ29udHJvbCA9PT0gZW50cnlbMV0pO1xuICAgICAgaWYgKG1pc3NpbmdGb3JtQ29udHJvbCkge1xuICAgICAgICBjb250ZXh0LmZvcm1Db250cm9sLnNldENvbnRyb2wobWlzc2luZ0Zvcm1Db250cm9sWzBdLCBtaXNzaW5nRm9ybUNvbnRyb2xbMV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDaGlsZENvbnRleHRzPE0+KFxuICAgIG9wdGlvbnM6IENyZWF0ZUZvcm1Db250ZXh0T3B0aW9uczxNLCBGb3JtR3JvdXAsIEdyb3VwRm9ybUZpZWxkU2V0dGluZzxNPj5cbiAgKTogW0Zvcm1Hcm91cCwgeyBbaWQ6IHN0cmluZ106IEZvcm1Db250ZXh0PE0+IH1dIHtcbiAgICBjb25zdCB7IHNldHRpbmcsIHNldHRpbmdzIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKG9wdGlvbnMuZm9ybUNvbnRyb2wpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xFbnRpcmVzID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5mb3JtQ29udHJvbC5jb250cm9scyk7XG4gICAgICBjb25zdCBjaGlsZHJlbjogeyBbaWQ6IHN0cmluZ106IEZvcm1Db250ZXh0PE0sIEFic3RyYWN0Q29udHJvbD4gfSA9IHt9O1xuXG4gICAgICBjb250cm9sRW50aXJlcy5mb3JFYWNoKChbaWQsIGZvcm1Db250cm9sXSkgPT4ge1xuICAgICAgICBjaGlsZHJlbltpZF0gPSB0aGlzLnBhcmVudEZpZWxkRmFjdG9yeS5jcmVhdGU8YW55Pih7XG4gICAgICAgICAgZm9ybUNvbnRyb2wsXG4gICAgICAgICAgc2V0dGluZzogdGhpcy5nZXRTZXR0aW5nKGlkLCBzZXR0aW5ncyksXG4gICAgICAgICAgc2V0dGluZ3NcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFtvcHRpb25zLmZvcm1Db250cm9sLCBjaGlsZHJlbl07XG4gICAgfVxuXG4gICAgY29uc3QgeyBpbml0aWFsVmFsdWU6IHZhbHVlIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWx1ZSBvZiBncm91cCAke3NldHRpbmcubmFtZX0gaXMgbm90IGFuIG9iamVjdGApO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkcmVuOiB7IFtpZDogc3RyaW5nXTogRm9ybUNvbnRleHQ8TSwgQWJzdHJhY3RDb250cm9sPiB9ID0ge307XG4gICAgY29uc3QgZm9ybUNoaWxkcmVuOiB7IFtpZDogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sIH0gPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW2lkLCBjaGlsZF0pID0+IHtcbiAgICAgIGNoaWxkcmVuW2lkXSA9IHRoaXMucGFyZW50RmllbGRGYWN0b3J5LmNyZWF0ZTxNPih7XG4gICAgICAgIGluaXRpYWxWYWx1ZTogY2hpbGQsXG4gICAgICAgIHNldHRpbmc6IHRoaXMuZ2V0U2V0dGluZyhpZCwgc2V0dGluZ3MpLFxuICAgICAgICBzZXR0aW5nc1xuICAgICAgfSk7XG4gICAgICBmb3JtQ2hpbGRyZW5baWRdID0gY2hpbGRyZW5baWRdLmZvcm1Db250cm9sO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGZvcm1DaGlsZHJlbik7XG5cbiAgICByZXR1cm4gW2Zvcm1Db250cm9sLCBjaGlsZHJlbl07XG4gIH1cblxuICBwcml2YXRlIGdldFNldHRpbmc8TT4oaWQ6IHN0cmluZywgc2V0dGluZ3M6IEZvcm1GaWVsZFNldHRpbmdzKTogRm9ybUZpZWxkU2V0dGluZzxNPiB7XG4gICAgY29uc3QgY2hpbGRTZXR0aW5nID0gc2V0dGluZ3MuZ2V0KGlkKSBhcyBGb3JtRmllbGRTZXR0aW5nPE0+O1xuICAgIGlmICghY2hpbGRTZXR0aW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcm0gZmllbGQgJyR7aWR9JyBoYXMgbm8gYXNzaWduZWQgZm9ybSBmaWVsZCBzZXR0aW5nLmApO1xuICAgIH1cblxuICAgIHJldHVybiBjaGlsZFNldHRpbmc7XG4gIH1cbn1cbiJdfQ==