angular-dynamic-forms-lite
Version:
Efficient dynamic and customizable Angular 7+ forms.
142 lines • 15 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { DynamicArrayController } from "./dynamic-array-controller";
import { ArrayRenderer } from "./array-renderer";
export class ArrayFieldFactory {
/**
* @param {?} parentFieldFactory
* @param {?} formBuilder
*/
constructor(parentFieldFactory, formBuilder) {
this.parentFieldFactory = parentFieldFactory;
this.formBuilder = formBuilder;
}
/**
* @template M
* @param {?} options
* @return {?}
*/
create(options) {
const { setting } = options;
if (!setting.childSetting) {
throw new Error(`Array ${options.setting.name} needs 'childSetting' as part of its setting.`);
}
const [formControl, children] = this.createChildContexts(options);
/** @type {?} */
const dynamicController = new DynamicArrayController(this.parentFieldFactory);
/** @type {?} */
const arrayComponentContext = Object.assign({}, this.parentFieldFactory.resolveComponent(formControl, setting, options.initialValue, dynamicController), { children });
/** @type {?} */
const arrayComponent = (/** @type {?} */ (arrayComponentContext.componentRef.instance));
if (!arrayComponent.formRoot) {
throw new Error(`Array component ${setting.name} is not an array component. It is missing the 'formRoot' directive.`);
}
// initialize controller after all values and children are resolved
dynamicController.onInit(arrayComponentContext);
return arrayComponentContext;
}
/**
* @param {?} arrayContext
* @return {?}
*/
updateChildren(arrayContext) {
/** @type {?} */
const unchecked = [...arrayContext.formControl.controls];
((/** @type {?} */ (arrayContext.children))).forEach((/**
* @param {?} child
* @param {?} i
* @return {?}
*/
(child, i) => {
if (arrayContext.formControl.controls.indexOf(child.formControl) === -1) {
arrayContext.formControl.insert(i, child.formControl);
}
else {
unchecked.splice(unchecked.indexOf(child.formControl), 1);
}
}));
unchecked.forEach((/**
* @param {?} control
* @return {?}
*/
control => arrayContext.formControl.removeAt(arrayContext.formControl.controls.indexOf(control))));
}
/**
* @param {?} formRoot
* @param {?} arrayContext
* @return {?}
*/
render(formRoot, arrayContext) {
/** @type {?} */
const viewRef = formRoot.viewContainerRef.insert(arrayContext.componentRef.hostView);
viewRef.detectChanges();
/** @type {?} */
const arrayComponent = (/** @type {?} */ (arrayContext.componentRef.instance));
/** @type {?} */
const paginator = ((/** @type {?} */ (arrayContext.setting))).renderStrategy.paginator;
/** @type {?} */
const pageEvent = { pageIndex: paginator.pageIndex, pageSize: paginator.pageSize };
/** @type {?} */
const renderer = new ArrayRenderer(this.parentFieldFactory, arrayComponent.formRoot);
renderer.render(arrayContext, pageEvent);
return viewRef;
}
/**
* @private
* @template M
* @param {?} options
* @return {?}
*/
createChildContexts(options) {
if (options.formControl) {
/** @type {?} */
const children = options.formControl.controls.map((/**
* @param {?} formControl
* @return {?}
*/
formControl => this.parentFieldFactory.create({
formControl,
setting: options.setting.childSetting,
settings: options.settings
})));
return [options.formControl, children];
}
/** @type {?} */
const values = options.initialValue ? options.initialValue : [];
if (!Array.isArray(values)) {
throw new Error(`Value of ${options.setting.name} is not an array.`);
}
/** @type {?} */
const children = values.map((/**
* @param {?} value
* @return {?}
*/
value => this.parentFieldFactory.create({
initialValue: value,
setting: options.setting.childSetting,
settings: options.settings
})));
/** @type {?} */
const formControl = this.formBuilder.array(children.map((/**
* @param {?} context
* @return {?}
*/
context => context.formControl)));
return [formControl, children];
}
}
if (false) {
/**
* @type {?}
* @private
*/
ArrayFieldFactory.prototype.parentFieldFactory;
/**
* @type {?}
* @private
*/
ArrayFieldFactory.prototype.formBuilder;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktZmllbGQtZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItZHluYW1pYy1mb3Jtcy1saXRlLyIsInNvdXJjZXMiOlsibGliL2Zvcm0tZmllbGQvYXJyYXkvYXJyYXktZmllbGQtZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBRUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWpELE1BQU0sT0FBTyxpQkFBaUI7Ozs7O0lBQzVCLFlBQW9CLGtCQUFzQyxFQUFVLFdBQXdCO1FBQXhFLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtJQUFHLENBQUM7Ozs7OztJQUV6RixNQUFNLENBQ1gsT0FBeUU7Y0FFbkUsRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPO1FBRTNCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksK0NBQStDLENBQUMsQ0FBQztTQUMvRjtjQUVLLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7O2NBRTNELGlCQUFpQixHQUFHLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDOztjQUV2RSxxQkFBcUIscUJBQ3RCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDekMsV0FBVyxFQUNYLE9BQU8sRUFDUCxPQUFPLENBQUMsWUFBWSxFQUNwQixpQkFBaUIsQ0FDbEIsSUFDRCxRQUFRLEdBQ1Q7O2NBRUssY0FBYyxHQUFHLG1CQUFBLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQTJCO1FBRTdGLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxF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T0FBTyxDQUFDLElBQUksbUJBQW1CLENBQUMsQ0FBQztTQUN0RTs7Y0FFSyxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUc7Ozs7UUFBQyxLQUFLLENBQUMsRUFBRSxDQUNsQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFNO1lBQ2xDLFlBQVksRUFBRSxLQUFLO1lBQ25CLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVk7WUFDckMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1NBQzNCLENBQUMsRUFDSDs7Y0FFSyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUc7Ozs7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUMsQ0FBQztRQUV4RixPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRjs7Ozs7O0lBbkdhLCtDQUE4Qzs7Ozs7SUFBRSx3Q0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUFycmF5IH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBGaWVsZEZhY3RvcnksIFBhcmVudEZpZWxkRmFjdG9yeSwgQ3JlYXRlRm9ybUNvbnRleHRPcHRpb25zIH0gZnJvbSBcIi4uL2ZpZWxkLWZhY3RvcnlcIjtcbmltcG9ydCB7IER5bmFtaWNBcnJheUNvbnRyb2xsZXIgfSBmcm9tIFwiLi9keW5hbWljLWFycmF5LWNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IEFycmF5Rm9ybUZpZWxkU2V0dGluZyB9IGZyb20gXCIuL2FycmF5LWZvcm0tZmllbGQtc2V0dGluZ1wiO1xuaW1wb3J0IHsgRm9ybUNvbnRleHQgfSBmcm9tIFwiLi4vLi4vZm9ybS9mb3JtLWNvbnRleHRcIjtcbmltcG9ydCB7IEZvcm1Sb290RGlyZWN0aXZlIH0gZnJvbSBcIi4uLy4uL2Zvcm0vZm9ybS1yb290LmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgRm9ybUZpZWxkQXJyYXlDb21wb25lbnQgfSBmcm9tIFwiLi9mb3JtLWZpZWxkLWFycmF5LWNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVmlld1JlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBBcnJheVJlbmRlcmVyIH0gZnJvbSBcIi4vYXJyYXktcmVuZGVyZXJcIjtcblxuZXhwb3J0IGNsYXNzIEFycmF5RmllbGRGYWN0b3J5IGltcGxlbWVudHMgRmllbGRGYWN0b3J5PEZvcm1BcnJheSwgQXJyYXlGb3JtRmllbGRTZXR0aW5nPGFueSwgYW55Pj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmVudEZpZWxkRmFjdG9yeTogUGFyZW50RmllbGRGYWN0b3J5LCBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcikge31cblxuICBwdWJsaWMgY3JlYXRlPE0+KFxuICAgIG9wdGlvbnM6IENyZWF0ZUZvcm1Db250ZXh0T3B0aW9uczxNLCBGb3JtQXJyYXksIEFycmF5Rm9ybUZpZWxkU2V0dGluZzxNPj5cbiAgKTogRm9ybUNvbnRleHQ8TSwgRm9ybUFycmF5PiB7XG4gICAgY29uc3QgeyBzZXR0aW5nIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKCFzZXR0aW5nLmNoaWxkU2V0dGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheSAke29wdGlvbnMuc2V0dGluZy5uYW1lfSBuZWVkcyAnY2hpbGRTZXR0aW5nJyBhcyBwYXJ0IG9mIGl0cyBzZXR0aW5nLmApO1xuICAgIH1cblxuICAgIGNvbnN0IFtmb3JtQ29udHJvbCwgY2hpbGRyZW5dID0gdGhpcy5jcmVhdGVDaGlsZENvbnRleHRzKG9wdGlvbnMpO1xuXG4gICAgY29uc3QgZHluYW1pY0NvbnRyb2xsZXIgPSBuZXcgRHluYW1pY0FycmF5Q29udHJvbGxlcih0aGlzLnBhcmVudEZpZWxkRmFjdG9yeSk7XG5cbiAgICBjb25zdCBhcnJheUNvbXBvbmVudENvbnRleHQgPSB7XG4gICAgICAuLi50aGlzLnBhcmVudEZpZWxkRmFjdG9yeS5yZXNvbHZlQ29tcG9uZW50PE0sIEZvcm1BcnJheT4oXG4gICAgICAgIGZvcm1Db250cm9sLFxuICAgICAgICBzZXR0aW5nLFxuICAgICAgICBvcHRpb25zLmluaXRpYWxWYWx1ZSxcbiAgICAgICAgZHluYW1pY0NvbnRyb2xsZXJcbiAgICAgICksXG4gICAgICBjaGlsZHJlblxuICAgIH07XG5cbiAgICBjb25zdCBhcnJheUNvbXBvbmVudCA9IGFycmF5Q29tcG9uZW50Q29udGV4dC5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgRm9ybUZpZWxkQXJyYXlDb21wb25lbnQ7XG5cbiAgICBpZiAoIWFycmF5Q29tcG9uZW50LmZvcm1Sb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBcnJheSBjb21wb25lbnQgJHtzZXR0aW5nLm5hbWV9IGlzIG5vdCBhbiBhcnJheSBjb21wb25lbnQuIEl0IGlzIG1pc3NpbmcgdGhlICdmb3JtUm9vdCcgZGlyZWN0aXZlLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gaW5pdGlhbGl6ZSBjb250cm9sbGVyIGFmdGVyIGFsbCB2YWx1ZXMgYW5kIGNoaWxkcmVuIGFyZSByZXNvbHZlZFxuICAgIGR5bmFtaWNDb250cm9sbGVyLm9uSW5pdChhcnJheUNvbXBvbmVudENvbnRleHQpO1xuXG4gICAgcmV0dXJuIGFycmF5Q29tcG9uZW50Q29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDaGlsZHJlbihhcnJheUNvbnRleHQ6IEZvcm1Db250ZXh0PGFueSwgRm9ybUFycmF5Pikge1xuICAgIGNvbnN0IHVuY2hlY2tlZCA9IFsuLi5hcnJheUNvbnRleHQuZm9ybUNvbnRyb2wuY29udHJvbHNdO1xuICAgIChhcnJheUNvbnRleHQuY2hpbGRyZW4gYXMgRm9ybUNvbnRleHQ8YW55PltdKS5mb3JFYWNoKChjaGlsZCwgaSkgPT4ge1xuICAgICAgaWYgKGFycmF5Q29udGV4dC5mb3JtQ29udHJvbC5jb250cm9scy5pbmRleE9mKGNoaWxkLmZvcm1Db250cm9sKSA9PT0gLTEpIHtcbiAgICAgICAgYXJyYXlDb250ZXh0LmZvcm1Db250cm9sLmluc2VydChpLCBjaGlsZC5mb3JtQ29udHJvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bmNoZWNrZWQuc3BsaWNlKHVuY2hlY2tlZC5pbmRleE9mKGNoaWxkLmZvcm1Db250cm9sKSwgMSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB1bmNoZWNrZWQuZm9yRWFjaChjb250cm9sID0+IGFycmF5Q29udGV4dC5mb3JtQ29udHJvbC5yZW1vdmVBdChhcnJheUNvbnRleHQuZm9ybUNvbnRyb2wuY29udHJvbHMuaW5kZXhPZihjb250cm9sKSkpO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcihmb3JtUm9vdDogRm9ybVJvb3REaXJlY3RpdmUsIGFycmF5Q29udGV4dDogRm9ybUNvbnRleHQ8YW55LCBGb3JtQXJyYXk+KTogVmlld1JlZiB7XG4gICAgY29uc3Qgdmlld1JlZiA9IGZvcm1Sb290LnZpZXdDb250YWluZXJSZWYuaW5zZXJ0KGFycmF5Q29udGV4dC5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgIHZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgY29uc3QgYXJyYXlDb21wb25lbnQgPSBhcnJheUNvbnRleHQuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIEZvcm1GaWVsZEFycmF5Q29tcG9uZW50O1xuICAgIGNvbnN0IHBhZ2luYXRvciA9IChhcnJheUNvbnRleHQuc2V0dGluZyBhcyBBcnJheUZvcm1GaWVsZFNldHRpbmcpLnJlbmRlclN0cmF0ZWd5LnBhZ2luYXRvcjtcbiAgICBjb25zdCBwYWdlRXZlbnQgPSB7IHBhZ2VJbmRleDogcGFnaW5hdG9yLnBhZ2VJbmRleCwgcGFnZVNpemU6IHBhZ2luYXRvci5wYWdlU2l6ZSB9O1xuXG4gICAgY29uc3QgcmVuZGVyZXIgPSBuZXcgQXJyYXlSZW5kZXJlcih0aGlzLnBhcmVudEZpZWxkRmFjdG9yeSwgYXJyYXlDb21wb25lbnQuZm9ybVJvb3QpO1xuICAgIHJlbmRlcmVyLnJlbmRlcihhcnJheUNvbnRleHQsIHBhZ2VFdmVudCk7XG5cbiAgICByZXR1cm4gdmlld1JlZjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2hpbGRDb250ZXh0czxNPihcbiAgICBvcHRpb25zOiBDcmVhdGVGb3JtQ29udGV4dE9wdGlvbnM8TSwgRm9ybUFycmF5LCBBcnJheUZvcm1GaWVsZFNldHRpbmc8TT4+XG4gICk6IFtGb3JtQXJyYXksIEZvcm1Db250ZXh0PE0+W11dIHtcbiAgICBpZiAob3B0aW9ucy5mb3JtQ29udHJvbCkge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBvcHRpb25zLmZvcm1Db250cm9sLmNvbnRyb2xzLm1hcChmb3JtQ29udHJvbCA9PlxuICAgICAgICB0aGlzLnBhcmVudEZpZWxkRmFjdG9yeS5jcmVhdGU8YW55Pih7XG4gICAgICAgICAgZm9ybUNvbnRyb2wsXG4gICAgICAgICAgc2V0dGluZzogb3B0aW9ucy5zZXR0aW5nLmNoaWxkU2V0dGluZyxcbiAgICAgICAgICBzZXR0aW5nczogb3B0aW9ucy5zZXR0aW5nc1xuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIFtvcHRpb25zLmZvcm1Db250cm9sLCBjaGlsZHJlbl07XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzID0gb3B0aW9ucy5pbml0aWFsVmFsdWUgPyBvcHRpb25zLmluaXRpYWxWYWx1ZSA6IFtdO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsdWUgb2YgJHtvcHRpb25zLnNldHRpbmcubmFtZX0gaXMgbm90IGFuIGFycmF5LmApO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdmFsdWVzLm1hcCh2YWx1ZSA9PlxuICAgICAgdGhpcy5wYXJlbnRGaWVsZEZhY3RvcnkuY3JlYXRlPGFueT4oe1xuICAgICAgICBpbml0aWFsVmFsdWU6IHZhbHVlLFxuICAgICAgICBzZXR0aW5nOiBvcHRpb25zLnNldHRpbmcuY2hpbGRTZXR0aW5nLFxuICAgICAgICBzZXR0aW5nczogb3B0aW9ucy5zZXR0aW5nc1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KGNoaWxkcmVuLm1hcChjb250ZXh0ID0+IGNvbnRleHQuZm9ybUNvbnRyb2wpKTtcblxuICAgIHJldHVybiBbZm9ybUNvbnRyb2wsIGNoaWxkcmVuXTtcbiAgfVxufVxuIl19