UNPKG

@covalent/dynamic-forms

Version:

Teradata UI Platform Dynamic Forms Module

1 lines 76.2 kB
{"version":3,"file":"covalent-dynamic-forms.mjs","sources":["../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-input/dynamic-input.component.ts","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-input/dynamic-input.component.html","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-file-input/dynamic-file-input.component.html","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-file-input/dynamic-file-input.component.ts","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-textarea/dynamic-textarea.component.ts","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-textarea/dynamic-textarea.component.html","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-slide-toggle/dynamic-slide-toggle.component.ts","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-slide-toggle/dynamic-slide-toggle.component.html","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-checkbox/dynamic-checkbox.component.ts","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-checkbox/dynamic-checkbox.component.html","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-slider/dynamic-slider.component.html","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-slider/dynamic-slider.component.ts","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-select/dynamic-select.component.html","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-select/dynamic-select.component.ts","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-datepicker/dynamic-datepicker.component.ts","../../../../libs/angular-dynamic-forms/src/lib/dynamic-elements/dynamic-datepicker/dynamic-datepicker.component.html","../../../../libs/angular-dynamic-forms/src/lib/services/dynamic-forms.service.ts","../../../../libs/angular-dynamic-forms/src/lib/dynamic-element.component.ts","../../../../libs/angular-dynamic-forms/src/lib/dynamic-forms.component.html","../../../../libs/angular-dynamic-forms/src/lib/dynamic-forms.component.ts","../../../../libs/angular-dynamic-forms/src/lib/dynamic-forms.module.ts","../../../../libs/angular-dynamic-forms/src/covalent-dynamic-forms.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, TemplateRef } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\nimport { MatError, MatFormField, MatHint, MatLabel } from '@angular/material/form-field';\nimport { MatInput } from '@angular/material/input';\n\n@Component({\n selector: 'td-dynamic-input',\n styleUrls: ['./dynamic-input.component.scss'],\n templateUrl: './dynamic-input.component.html',\n imports: [CommonModule, ReactiveFormsModule, MatFormField, MatInput, MatLabel, MatError, MatHint],\n})\nexport class TdDynamicInputComponent {\n control!: UntypedFormControl;\n\n label = '';\n\n hint = '';\n\n type!: string;\n\n required = false;\n\n name = '';\n\n min?: number;\n\n max?: number;\n\n minLength?: number;\n\n maxLength?: number;\n\n errorMessageTemplate!: TemplateRef<any>;\n\n placeholder = '';\n}\n","<div class=\"td-dynamic-input-wrapper\">\n <mat-form-field class=\"td-dynamic-input-field\">\n <mat-label>{{ label }}</mat-label>\n <input\n #elementInput\n matInput\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [type]=\"type\"\n [required]=\"required\"\n [name]=\"name\"\n [attr.min]=\"min\"\n [attr.max]=\"max\"\n [attr.minLength]=\"minLength\"\n [attr.maxLength]=\"maxLength\"\n />\n <mat-hint>{{ hint }}</mat-hint>\n <mat-error>\n <ng-template\n [ngTemplateOutlet]=\"errorMessageTemplate\"\n [ngTemplateOutletContext]=\"{\n control: control,\n errors: control.errors\n }\"\n ></ng-template>\n </mat-error>\n </mat-form-field>\n</div>\n","<div class=\"td-dynamic-file-input-wrapper\">\n <mat-form-field\n tdFileDrop\n class=\"td-dynamic-file-input-field\"\n [disabled]=\"control.disabled\"\n (fileDrop)=\"_handlefileDrop($event)\"\n (click)=\"!control.disabled && fileInput.inputElement.click()\"\n (keyup.enter)=\"!control.disabled && fileInput.inputElement.click()\"\n (keyup.delete)=\"fileInput.clear()\"\n (keyup.backspace)=\"fileInput.clear()\"\n >\n <mat-label>{{ label }}</mat-label>\n <input\n matInput\n [value]=\"control.value?.name\"\n [placeholder]=\"placeholder\"\n [name]=\"name\"\n [disabled]=\"control.disabled\"\n readonly\n />\n <mat-hint>{{ hint }}</mat-hint>\n <mat-error>\n <ng-template\n [ngTemplateOutlet]=\"errorMessageTemplate\"\n [ngTemplateOutletContext]=\"{\n control: control,\n errors: control.errors\n }\"\n ></ng-template>\n </mat-error>\n </mat-form-field>\n <button\n mat-icon-button\n *ngIf=\"control.value\"\n (click)=\"fileInput.clear()\"\n (keyup.enter)=\"fileInput.clear()\"\n >\n <mat-icon>cancel</mat-icon>\n </button>\n <td-file-input class=\"td-file-input\" #fileInput [formControl]=\"control\">\n <mat-icon>folder</mat-icon>\n <span>{{ label }}</span>\n </td-file-input>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, TemplateRef } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\nimport { MatError, MatFormField, MatHint, MatLabel } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { CovalentFileModule } from '@covalent/core/file';\n\n@Component({\n selector: 'td-dynamic-file-input',\n styleUrls: ['./dynamic-file-input.component.scss'],\n templateUrl: './dynamic-file-input.component.html',\n imports: [CommonModule, ReactiveFormsModule, MatFormField, MatInput, MatLabel, MatError, MatHint, MatIcon, CovalentFileModule],\n})\nexport class TdDynamicFileInputComponent {\n control!: UntypedFormControl;\n\n required = false;\n\n label = '';\n\n name = '';\n\n hint = '';\n\n errorMessageTemplate!: TemplateRef<any>;\n\n placeholder = '';\n\n _handlefileDrop(value: any): void {\n this.control?.setValue(value);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, TemplateRef } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\nimport { MatError, MatFormField, MatHint, MatLabel } from '@angular/material/form-field';\nimport { MatInput } from '@angular/material/input';\n\n@Component({\n selector: 'td-dynamic-textarea',\n styleUrls: ['./dynamic-textarea.component.scss'],\n templateUrl: './dynamic-textarea.component.html',\n imports: [CommonModule, ReactiveFormsModule, MatInput, MatLabel, MatError, MatHint, MatFormField],\n})\nexport class TdDynamicTextareaComponent {\n control!: UntypedFormControl;\n\n label = '';\n\n hint = '';\n\n name = '';\n\n required = false;\n\n errorMessageTemplate!: TemplateRef<any>;\n\n placeholder = '';\n}\n","<div class=\"td-dynamic-textarea-wrapper\">\n <mat-form-field class=\"td-dynamic-textarea-field\">\n <mat-label>{{ label }}</mat-label>\n <textarea\n #elementInput\n matInput\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [required]=\"required\"\n [name]=\"name\"\n rows=\"4\"\n ></textarea>\n <mat-hint>{{ hint }}</mat-hint>\n <mat-error>\n <ng-template\n [ngTemplateOutlet]=\"errorMessageTemplate\"\n [ngTemplateOutletContext]=\"{\n control: control,\n errors: control.errors\n }\"\n ></ng-template>\n </mat-error>\n </mat-form-field>\n</div>\n","import { Component } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\n\n@Component({\n selector: 'td-dynamic-slide-toggle',\n styleUrls: ['./dynamic-slide-toggle.component.scss'],\n templateUrl: './dynamic-slide-toggle.component.html',\n imports: [ReactiveFormsModule, MatSlideToggle],\n})\nexport class TdDynamicSlideToggleComponent {\n control!: UntypedFormControl;\n\n label = '';\n\n name = '';\n\n hint = '';\n\n required = false;\n}\n","<div class=\"td-dynamic-slide-toggle-wrapper\">\n <mat-slide-toggle\n [formControl]=\"control\"\n [attr.name]=\"name\"\n [required]=\"required\"\n color=\"primary\"\n >\n {{ label }}\n </mat-slide-toggle>\n <span class=\"mat-hint td-dynamic-element-hint\">{{ hint }}</span>\n</div>\n","import { Component } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\nimport { MatCheckbox } from '@angular/material/checkbox';\n\n@Component({\n selector: 'td-dynamic-checkbox',\n styleUrls: ['./dynamic-checkbox.component.scss'],\n templateUrl: './dynamic-checkbox.component.html',\n imports: [ReactiveFormsModule, MatCheckbox],\n})\nexport class TdDynamicCheckboxComponent {\n control!: UntypedFormControl;\n\n label = '';\n\n name = '';\n\n hint = '';\n\n required = false;\n}\n","<div class=\"td-dynamic-checkbox-wrapper\">\n <mat-checkbox [formControl]=\"control\" [name]=\"name\" [required]=\"required\">\n {{ label }}\n </mat-checkbox>\n <span class=\"mat-hint td-dynamic-element-hint\">{{ hint }}</span>\n</div>\n","<div\n class=\"td-dynamic-slider-wrapper mat-form-field mat-form-field-can-float mat-form-field-should-float\"\n>\n <span class=\"mat-form-field-label-wrapper\">\n <label class=\"mat-form-field-label mat-primary td-slider-label\">\n {{ label }}\n <span\n *ngIf=\"required && !control?.disabled\"\n class=\"mat-form-field-required-marker\"\n >*</span\n >\n </label>\n </span>\n <div class=\"td-dynamic-slider-field\">\n <mat-slider\n #slider\n class=\"td-dynamic-slider\"\n thumbLabel\n tickInterval=\"auto\"\n (blur)=\"_handleBlur()\"\n >\n <input\n [attr.name]=\"name\"\n [min]=\"min\"\n [max]=\"max\"\n [formControl]=\"control\"\n [required]=\"required\"\n matSliderThumb\n />\n </mat-slider>\n </div>\n <span class=\"mat-hint td-dynamic-element-hint\">{{ hint }}</span>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, ChangeDetectorRef } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\nimport { MatSlider, MatSliderThumb } from '@angular/material/slider';\n\n@Component({\n selector: 'td-dynamic-slider',\n styleUrls: ['./dynamic-slider.component.scss'],\n templateUrl: './dynamic-slider.component.html',\n imports: [CommonModule, ReactiveFormsModule, MatSlider, MatSliderThumb],\n})\nexport class TdDynamicSliderComponent {\n control!: UntypedFormControl;\n\n label = '';\n\n required = false;\n\n name = '';\n\n hint = '';\n\n min?: number;\n\n max?: number;\n\n constructor(private _changeDetectorRef: ChangeDetectorRef) {}\n\n _handleBlur(): void {\n setTimeout(() => {\n this._changeDetectorRef.markForCheck();\n });\n }\n}\n","<div class=\"td-dynamic-select-wrapper\">\n <mat-form-field class=\"td-dynamic-select-field\">\n <mat-label>{{ label }}</mat-label>\n <mat-select\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [required]=\"required\"\n [attr.name]=\"name\"\n [multiple]=\"multiple\"\n >\n <mat-option\n *ngFor=\"let selection of selections\"\n [value]=\"selection.value ?? selection\"\n >\n {{ selection.label || selection }}\n </mat-option>\n </mat-select>\n <mat-hint>{{ hint }}</mat-hint>\n <mat-error>\n <ng-template\n [ngTemplateOutlet]=\"errorMessageTemplate\"\n [ngTemplateOutletContext]=\"{\n control: control,\n errors: control.errors\n }\"\n ></ng-template>\n </mat-error>\n </mat-form-field>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, TemplateRef } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\nimport { MatError, MatFormField, MatHint, MatLabel } from '@angular/material/form-field';\nimport { MatOption, MatSelect } from '@angular/material/select';\n\n@Component({\n selector: 'td-dynamic-select',\n styleUrls: ['./dynamic-select.component.scss'],\n templateUrl: './dynamic-select.component.html',\n imports: [CommonModule, ReactiveFormsModule, MatFormField, MatSelect, MatOption, MatLabel, MatError, MatHint],\n})\nexport class TdDynamicSelectComponent {\n control!: UntypedFormControl;\n\n label = '';\n\n hint = '';\n\n name = '';\n\n required = false;\n\n selections?: any[];\n\n multiple?: boolean;\n\n errorMessageTemplate!: TemplateRef<any>;\n\n placeholder = '';\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, TemplateRef } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\n\n@Component({\n selector: 'td-dynamic-datepicker',\n styleUrls: ['./dynamic-datepicker.component.scss'],\n templateUrl: './dynamic-datepicker.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatDatepickerModule,\n ],\n})\nexport class TdDynamicDatepickerComponent {\n control!: UntypedFormControl;\n\n label = '';\n\n hint = '';\n\n name = '';\n\n type?: string;\n\n required = false;\n\n min?: number;\n\n max?: number;\n\n errorMessageTemplate!: TemplateRef<any>;\n\n placeholder = '';\n}\n","<div class=\"td-dynamic-datepicker-wrapper\">\n <mat-form-field class=\"td-dynamic-datepicker-field\">\n <mat-label>{{ label }}</mat-label>\n <input\n #elementInput\n matInput\n [matDatepicker]=\"dynamicDatePicker\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [required]=\"required\"\n [name]=\"name\"\n [min]=\"min\"\n [max]=\"max\"\n />\n <mat-hint>{{ hint }}</mat-hint>\n <mat-error>\n <ng-template\n [ngTemplateOutlet]=\"errorMessageTemplate\"\n [ngTemplateOutletContext]=\"{\n control: control,\n errors: control.errors\n }\"\n ></ng-template>\n </mat-error>\n <mat-datepicker-toggle\n matSuffix\n [for]=\"dynamicDatePicker\"\n ></mat-datepicker-toggle>\n <mat-datepicker #dynamicDatePicker></mat-datepicker>\n </mat-form-field>\n</div>\n","import { Injectable, Provider, SkipSelf, Optional, Type } from '@angular/core';\nimport { Validators, ValidatorFn, UntypedFormControl } from '@angular/forms';\n\nimport { TdDynamicInputComponent } from '../dynamic-elements/dynamic-input/dynamic-input.component';\nimport { TdDynamicFileInputComponent } from '../dynamic-elements/dynamic-file-input/dynamic-file-input.component';\nimport { TdDynamicTextareaComponent } from '../dynamic-elements/dynamic-textarea/dynamic-textarea.component';\nimport { TdDynamicSlideToggleComponent } from '../dynamic-elements/dynamic-slide-toggle/dynamic-slide-toggle.component';\nimport { TdDynamicCheckboxComponent } from '../dynamic-elements/dynamic-checkbox/dynamic-checkbox.component';\nimport { TdDynamicSliderComponent } from '../dynamic-elements/dynamic-slider/dynamic-slider.component';\nimport { TdDynamicSelectComponent } from '../dynamic-elements/dynamic-select/dynamic-select.component';\nimport { TdDynamicDatepickerComponent } from '../dynamic-elements/dynamic-datepicker/dynamic-datepicker.component';\n\nexport enum TdDynamicType {\n Text = 'text',\n Boolean = 'boolean',\n Number = 'number',\n Array = 'array',\n Date = 'date',\n}\n\nexport enum TdDynamicElement {\n Input = 'input',\n Datepicker = 'datepicker',\n Password = 'password',\n Textarea = 'textarea',\n Slider = 'slider',\n SlideToggle = 'slide-toggle',\n Checkbox = 'checkbox',\n Select = 'select',\n FileInput = 'file-input',\n}\n\nexport interface ITdDynamicElementValidator {\n validator: ValidatorFn;\n}\n\n// Property values to be set in custom component\nexport interface ITdDynamicElementCustomConfig {\n [name: string]: any;\n}\n\nexport interface ITdDynamicElementConfig {\n label?: string;\n name: string;\n hint?: string;\n type: TdDynamicType | TdDynamicElement | Type<any>;\n required?: boolean;\n disabled?: boolean;\n min?: any;\n max?: any;\n minLength?: any;\n maxLength?: any;\n selections?: string[] | { value: any; label: string }[];\n multiple?: boolean;\n default?: any;\n flex?: number;\n validators?: ITdDynamicElementValidator[];\n customConfig?: ITdDynamicElementCustomConfig;\n placeholder?: string;\n}\n\nexport const DYNAMIC_ELEMENT_NAME_REGEX = /^[^0-9][^@]*$/;\n\n@Injectable()\nexport class TdDynamicFormsService {\n /**\n * Method to validate if the [name] is a proper element name.\n * Throws error if name is not valid.\n */\n validateDynamicElementName(name: string): void {\n if (!DYNAMIC_ELEMENT_NAME_REGEX.test(name)) {\n throw new Error('Dynamic element name: \"${name}\" is not valid.');\n }\n }\n\n /**\n * Gets component to be rendered depending on [TdDynamicElement | TdDynamicType]\n * Throws error if it does not exists or not supported.\n */\n getDynamicElement(\n element: TdDynamicElement | TdDynamicType | Type<any> | undefined\n ): any {\n switch (element) {\n case TdDynamicType.Text:\n case TdDynamicType.Number:\n case TdDynamicElement.Input:\n case TdDynamicElement.Password:\n return TdDynamicInputComponent;\n case TdDynamicElement.Textarea:\n return TdDynamicTextareaComponent;\n case TdDynamicType.Boolean:\n case TdDynamicElement.SlideToggle:\n return TdDynamicSlideToggleComponent;\n case TdDynamicElement.Checkbox:\n return TdDynamicCheckboxComponent;\n case TdDynamicElement.Slider:\n return TdDynamicSliderComponent;\n case TdDynamicType.Array:\n case TdDynamicElement.Select:\n return TdDynamicSelectComponent;\n case TdDynamicElement.FileInput:\n return TdDynamicFileInputComponent;\n case TdDynamicElement.Datepicker:\n case TdDynamicType.Date:\n return TdDynamicDatepickerComponent;\n default:\n throw new Error(\n `Error: type ${element} does not exist or not supported.`\n );\n }\n }\n\n /**\n * Creates form control for element depending [ITdDynamicElementConfig] properties.\n */\n createFormControl(config: ITdDynamicElementConfig): UntypedFormControl {\n const validator = this.createValidators(config);\n return new UntypedFormControl(\n { value: config.default, disabled: config.disabled },\n validator\n );\n }\n\n /**\n * Creates form validationdepending [ITdDynamicElementConfig] properties.\n */\n createValidators(config: ITdDynamicElementConfig): ValidatorFn | null {\n let validator: ValidatorFn | null = null;\n if (config.required) {\n validator = Validators.required;\n }\n if (config.max || config.max === 0) {\n validator = Validators.compose([\n validator,\n Validators.max(parseFloat(config.max)),\n ]);\n }\n if (config.min || config.min === 0) {\n validator = Validators.compose([\n validator,\n Validators.min(parseFloat(config.min)),\n ]);\n }\n if (config.maxLength || config.maxLength === 0) {\n validator = Validators.compose([\n validator,\n Validators.maxLength(parseFloat(config.maxLength)),\n ]);\n }\n if (config.minLength || config.minLength === 0) {\n validator = Validators.compose([\n validator,\n Validators.minLength(parseFloat(config.minLength)),\n ]);\n }\n // Add provided custom validators to the validator function\n if (config.validators) {\n config.validators.forEach(\n (validatorConfig: ITdDynamicElementValidator) => {\n validator = Validators.compose([\n validator,\n validatorConfig.validator,\n ]);\n }\n );\n }\n return validator;\n }\n}\n\nexport function DYNAMIC_FORMS_PROVIDER_FACTORY(\n parent: TdDynamicFormsService\n): TdDynamicFormsService {\n return parent || new TdDynamicFormsService();\n}\n\nexport const DYNAMIC_FORMS_PROVIDER: Provider = {\n // If there is already a service available, use that. Otherwise, provide a new one.\n provide: TdDynamicFormsService,\n deps: [[new Optional(), new SkipSelf(), TdDynamicFormsService]],\n useFactory: DYNAMIC_FORMS_PROVIDER_FACTORY,\n};\n","import {\n Component,\n Directive,\n Input,\n HostBinding,\n OnInit,\n SimpleChanges,\n OnChanges,\n TemplateRef,\n ChangeDetectorRef,\n Type,\n Injector,\n} from '@angular/core';\nimport { ViewChild, ViewContainerRef } from '@angular/core';\nimport { NG_VALUE_ACCESSOR, AbstractControl } from '@angular/forms';\nimport { CdkPortal } from '@angular/cdk/portal';\n\nimport {\n mixinControlValueAccessor,\n IControlValueAccessor,\n} from '@covalent/core/common';\n\nimport {\n TdDynamicElement,\n TdDynamicType,\n TdDynamicFormsService,\n ITdDynamicElementCustomConfig,\n} from './services/dynamic-forms.service';\n\nexport class TdDynamicElementBase {\n constructor(public _changeDetectorRef: ChangeDetectorRef) {}\n}\n\n/* tslint:disable-next-line */\nexport const _TdDynamicElementMixinBase =\n mixinControlValueAccessor(TdDynamicElementBase);\n\n@Directive({ selector: '[tdDynamicFormsError]ng-template' })\nexport class TdDynamicFormsErrorTemplateDirective extends CdkPortal {\n @Input() tdDynamicFormsError?: string;\n constructor(\n public override templateRef: TemplateRef<any>,\n viewContainerRef: ViewContainerRef\n ) {\n super(templateRef, viewContainerRef);\n }\n}\n\n@Directive({\n selector: '[tdDynamicContainer]',\n})\nexport class TdDynamicElementDirective {\n constructor(public viewContainer: ViewContainerRef) {}\n}\n\n@Component({\n providers: [\n TdDynamicFormsService,\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TdDynamicElementComponent,\n multi: true,\n },\n ],\n selector: 'td-dynamic-element',\n template: '<div tdDynamicContainer></div>',\n imports: [TdDynamicElementDirective],\n})\nexport class TdDynamicElementComponent\n extends _TdDynamicElementMixinBase\n implements IControlValueAccessor, OnInit, OnChanges\n{\n private _instance: any;\n\n /**\n * Sets form control of the element.\n */\n @Input() dynamicControl!: AbstractControl;\n\n /**\n * Sets label to be displayed.\n */\n @Input() label = '';\n\n /**\n * Sets hint to be displayed.\n */\n @Input() hint? = '';\n\n /**\n * Sets name to be displayed as attribute.\n */\n @Input() name = '';\n\n /**\n * Sets type or element of element to be rendered.\n * Throws error if does not exist or no supported.\n */\n @Input() type?: TdDynamicElement | TdDynamicType | Type<any>;\n\n /**\n * Sets required validation checkup (if supported by element).\n */\n @Input() required?: boolean | string | undefined;\n\n /**\n * Sets min validation checkup (if supported by element).\n */\n @Input() min?: number;\n\n /**\n * Sets max validation checkup (if supported by element).\n */\n @Input() max?: number;\n\n /**\n * Sets minLength validation checkup (if supported by element).\n */\n @Input() minLength?: number;\n\n /**\n * Sets maxLength validation checkup (if supported by element).\n */\n @Input() maxLength?: number;\n\n /**\n * Sets selections for array elements (if supported by element).\n */\n @Input() selections?: any[];\n\n /**\n * Sets multiple property for array elements (if supported by element).\n */\n @Input() multiple?: boolean;\n\n /**\n * Sets any additional properties on custom component.\n */\n @Input() customConfig?: ITdDynamicElementCustomConfig;\n\n /**\n * Sets error message template so it can be injected into dynamic components.\n */\n @Input() errorMessageTemplate!: TemplateRef<any> | undefined;\n\n /**\n * Sets the placeholder message\n */\n @Input() placeholder? = '';\n\n @ViewChild(TdDynamicElementDirective, { static: true })\n childElement!: TdDynamicElementDirective;\n\n @HostBinding('attr.max')\n get maxAttr(): any {\n return this.max;\n }\n\n @HostBinding('attr.min')\n get minAttr(): any {\n return this.min;\n }\n\n constructor(\n private _injector: Injector,\n private _dynamicFormsService: TdDynamicFormsService,\n _changeDetectorRef: ChangeDetectorRef\n ) {\n super(_changeDetectorRef);\n }\n\n ngOnInit(): void {\n const component: any =\n <any>this.type instanceof Type\n ? this.type\n : this._dynamicFormsService.getDynamicElement(this.type);\n const ref = this.childElement.viewContainer.createComponent(component, {\n injector: this._injector,\n });\n this._instance = ref.instance;\n this._instance.control = this.dynamicControl;\n this._instance.label = this.label;\n this._instance.hint = this.hint;\n this._instance.name = this.name;\n this._instance.type = this.type;\n this._instance.value = this.value;\n this._instance.required = this.required;\n this._instance.min = this.min;\n this._instance.max = this.max;\n this._instance.minLength = this.minLength;\n this._instance.maxLength = this.maxLength;\n this._instance.selections = this.selections;\n this._instance.multiple = this.multiple;\n this._instance.errorMessageTemplate = this.errorMessageTemplate;\n this._instance.placeholder = this.placeholder;\n if (this.customConfig) {\n Object.getOwnPropertyNames(this.customConfig).forEach((name: string) => {\n if (this.customConfig) {\n this._instance[name] = this.customConfig[name];\n }\n });\n }\n }\n\n /**\n * Reassign any inputs that have changed\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (this._instance) {\n for (const prop of Object.keys(changes)) {\n this._instance[prop] = changes[prop].currentValue;\n }\n }\n }\n}\n","<form [formGroup]=\"dynamicForm\" novalidate>\n <div class=\"td-dynamic-form-wrapper\">\n <ng-template let-element ngFor [ngForOf]=\"elements\">\n <div\n class=\"td-dynamic-element-wrapper\"\n [style.max-width.%]=\"element.flex ? element.flex : 100\"\n [style.flex]=\"'1 1 ' + (element.flex ? element.flex : 100) + '%'\"\n [style.-ms-flex]=\"'1 1 ' + (element.flex ? element.flex : 100) + '%'\"\n [style.-webkit-box-flex]=\"1\"\n >\n <td-dynamic-element\n #dynamicElement\n *ngIf=\"dynamicForm.controls[element.name]\"\n [formControlName]=\"element.name\"\n [dynamicControl]=\"dynamicForm.controls[element.name]\"\n [id]=\"element.name\"\n [name]=\"element.name\"\n [label]=\"element.label || element.name\"\n [hint]=\"element.hint\"\n [type]=\"element.type\"\n [required]=\"element.required ?? false\"\n [min]=\"element.min\"\n [max]=\"element.max\"\n [minLength]=\"element.minLength\"\n [maxLength]=\"element.maxLength\"\n [selections]=\"element.selections\"\n [multiple]=\"element.multiple\"\n [customConfig]=\"element.customConfig\"\n [errorMessageTemplate]=\"getErrorTemplateRef(element.name)\"\n [placeholder]=\"element.placeholder\"\n ></td-dynamic-element>\n </div>\n </ng-template>\n </div>\n <ng-content></ng-content>\n</form>\n","import {\n Component,\n Input,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n ContentChildren,\n TemplateRef,\n QueryList,\n AfterContentInit,\n OnDestroy,\n} from '@angular/core';\nimport {\n UntypedFormGroup,\n UntypedFormBuilder,\n AbstractControl,\n ReactiveFormsModule,\n} from '@angular/forms';\n\nimport {\n TdDynamicFormsService,\n ITdDynamicElementConfig,\n} from './services/dynamic-forms.service';\nimport { TdDynamicElementComponent, TdDynamicFormsErrorTemplateDirective } from './dynamic-element.component';\n\nimport { timer, Subject, Observable } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'td-dynamic-forms',\n templateUrl: './dynamic-forms.component.html',\n styleUrls: ['./dynamic-forms.component.scss'],\n imports: [CommonModule, TdDynamicElementComponent, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdDynamicFormsComponent implements AfterContentInit, OnDestroy {\n private _renderedElements: ITdDynamicElementConfig[] = [];\n private _elements!: ITdDynamicElementConfig[];\n private _templateMap: Map<string, TemplateRef<any>> = new Map<\n string,\n TemplateRef<any>\n >();\n private _destroy$: Subject<any> = new Subject();\n private _destroyControl$: Subject<string> = new Subject();\n\n @ContentChildren(TdDynamicFormsErrorTemplateDirective, { descendants: true })\n _errorTemplates!: QueryList<TdDynamicFormsErrorTemplateDirective>;\n dynamicForm!: UntypedFormGroup;\n\n /**\n * elements: ITdDynamicElementConfig[]\n * JS Object that will render the elements depending on its config.\n * [name] property is required.\n */\n @Input()\n set elements(elements: ITdDynamicElementConfig[]) {\n if (elements) {\n this._elements = elements;\n } else {\n this._elements = [];\n }\n this._rerenderElements();\n }\n get elements(): ITdDynamicElementConfig[] {\n return this._renderedElements;\n }\n\n /**\n * Getter property for dynamic [FormGroup].\n */\n get form(): UntypedFormGroup {\n return this.dynamicForm;\n }\n\n /**\n * Getter property for [valid] of dynamic [FormGroup].\n */\n get valid(): boolean {\n if (this.dynamicForm) {\n return this.dynamicForm.valid;\n }\n return false;\n }\n\n /**\n * Getter property for [value] of dynamic [FormGroup].\n */\n get value(): any {\n if (this.dynamicForm) {\n return this.dynamicForm.value;\n }\n return {};\n }\n\n /**\n * Getter property for [errors] of dynamic [FormGroup].\n */\n get errors(): { [name: string]: any } {\n if (this.dynamicForm) {\n const errors: { [name: string]: any } = {};\n for (const name of Object.keys(this.dynamicForm.controls)) {\n errors[name] = this.dynamicForm.controls[name].errors;\n }\n return errors;\n }\n return {};\n }\n\n /**\n * Getter property for [controls] of dynamic [FormGroup].\n */\n get controls(): { [key: string]: AbstractControl } {\n if (this.dynamicForm) {\n return this.dynamicForm.controls;\n }\n return {};\n }\n\n constructor(\n private _formBuilder: UntypedFormBuilder,\n private _dynamicFormsService: TdDynamicFormsService,\n private _changeDetectorRef: ChangeDetectorRef\n ) {\n this.dynamicForm = this._formBuilder.group({});\n }\n\n ngAfterContentInit(): void {\n this._updateErrorTemplates();\n }\n\n ngOnDestroy(): void {\n this._destroy$.next(0);\n this._destroy$.complete();\n this._destroyControl$.complete();\n }\n\n /**\n * Refreshes the form and rerenders all validator/element modifications.\n */\n refresh(): void {\n this._rerenderElements();\n this._updateErrorTemplates();\n }\n\n /**\n * Getter method for error template references\n */\n getErrorTemplateRef(name: string): TemplateRef<any> | undefined {\n return this._templateMap.get(name);\n }\n\n /**\n * Loads error templates and sets them in a map for faster access.\n */\n private _updateErrorTemplates(): void {\n this._templateMap = new Map<string, TemplateRef<any>>();\n for (const errorTemplate of this._errorTemplates.toArray()) {\n this._templateMap.set(\n errorTemplate.tdDynamicFormsError ?? '',\n errorTemplate.templateRef\n );\n }\n }\n\n private _rerenderElements(): void {\n this._clearRemovedElements();\n this._renderedElements = [];\n const duplicates: string[] = [];\n this._elements.forEach((elem: ITdDynamicElementConfig) => {\n this._dynamicFormsService.validateDynamicElementName(elem.name);\n if (duplicates.indexOf(elem.name) > -1) {\n throw new Error(`Dynamic element name: \"${elem.name}\" is duplicated`);\n }\n duplicates.push(elem.name);\n const dynamicElement: AbstractControl | null = this.dynamicForm.get(\n elem.name\n );\n if (!dynamicElement) {\n this.dynamicForm.addControl(\n elem.name,\n this._dynamicFormsService.createFormControl(elem)\n );\n this._subscribeToControlStatusChanges(elem.name);\n } else {\n dynamicElement.setValue(elem.default);\n dynamicElement.markAsPristine();\n dynamicElement.markAsUntouched();\n if (elem.disabled) {\n dynamicElement.disable();\n } else {\n dynamicElement.enable();\n }\n dynamicElement.setValidators(\n this._dynamicFormsService.createValidators(elem)\n );\n }\n // copy objects so they are only changes when calling this method\n this._renderedElements.push(Object.assign({}, elem));\n });\n // call a change detection since the whole form might change\n //this._changeDetectorRef.detectChanges();\n timer(0)\n .toPromise()\n .then(() => {\n // call a markForCheck so elements are rendered correctly in OnPush\n this._changeDetectorRef.markForCheck();\n });\n }\n\n private _clearRemovedElements(): void {\n this._renderedElements = this._renderedElements.filter(\n (renderedElement: ITdDynamicElementConfig) =>\n !this._elements.some(\n (element: ITdDynamicElementConfig) =>\n element.name === renderedElement.name\n )\n );\n // remove elements that were removed from the array\n this._renderedElements.forEach((elem: ITdDynamicElementConfig) => {\n this._destroyControl$.next(elem.name);\n this.dynamicForm.removeControl(elem.name);\n });\n }\n\n // Updates component when manually adding errors to controls\n private _subscribeToControlStatusChanges(elementName: string): void {\n const control: AbstractControl = this.controls[elementName];\n\n const controlDestroyed$: Observable<any> = this._destroyControl$.pipe(\n filter(\n (destroyedElementName: string) => destroyedElementName === elementName\n )\n );\n\n control.statusChanges\n .pipe(takeUntil(this._destroy$), takeUntil(controlDestroyed$))\n .subscribe(() => {\n this._changeDetectorRef.markForCheck();\n });\n }\n}\n","import { NgModule, Type } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\n\nimport { CovalentFileModule } from '@covalent/core/file';\n\nimport { TdDynamicFormsComponent } from './dynamic-forms.component';\nimport {\n TdDynamicElementComponent,\n TdDynamicElementDirective,\n TdDynamicFormsErrorTemplateDirective,\n} from './dynamic-element.component';\nimport { DYNAMIC_FORMS_PROVIDER } from './services/dynamic-forms.service';\n\nimport { TdDynamicInputComponent } from './dynamic-elements/dynamic-input/dynamic-input.component';\nimport { TdDynamicFileInputComponent } from './dynamic-elements/dynamic-file-input/dynamic-file-input.component';\nimport { TdDynamicTextareaComponent } from './dynamic-elements/dynamic-textarea/dynamic-textarea.component';\nimport { TdDynamicSlideToggleComponent } from './dynamic-elements/dynamic-slide-toggle/dynamic-slide-toggle.component';\nimport { TdDynamicCheckboxComponent } from './dynamic-elements/dynamic-checkbox/dynamic-checkbox.component';\nimport { TdDynamicSliderComponent } from './dynamic-elements/dynamic-slider/dynamic-slider.component';\nimport { TdDynamicSelectComponent } from './dynamic-elements/dynamic-select/dynamic-select.component';\nimport { TdDynamicDatepickerComponent } from './dynamic-elements/dynamic-datepicker/dynamic-datepicker.component';\n\nconst TD_DYNAMIC_FORMS: Type<any>[] = [\n TdDynamicFormsComponent,\n TdDynamicElementComponent,\n TdDynamicElementDirective,\n TdDynamicFormsErrorTemplateDirective,\n];\n\nconst TD_DYNAMIC_FORMS_ENTRY_COMPONENTS: Type<any>[] = [\n TdDynamicInputComponent,\n TdDynamicFileInputComponent,\n TdDynamicTextareaComponent,\n TdDynamicSlideToggleComponent,\n TdDynamicCheckboxComponent,\n TdDynamicSliderComponent,\n TdDynamicSelectComponent,\n TdDynamicDatepickerComponent,\n];\n\n@NgModule({\n imports: [\n TdDynamicFormsComponent,\n TdDynamicElementComponent,\n TdDynamicElementDirective,\n TdDynamicFormsErrorTemplateDirective,\n TdDynamicInputComponent,\n TdDynamicFileInputComponent,\n TdDynamicTextareaComponent,\n TdDynamicSlideToggleComponent,\n TdDynamicCheckboxComponent,\n TdDynamicSliderComponent,\n TdDynamicSelectComponent,\n TdDynamicDatepickerComponent,\n ],\n exports: [...TD_DYNAMIC_FORMS, ...TD_DYNAMIC_FORMS_ENTRY_COMPONENTS],\n providers: [DYNAMIC_FORMS_PROVIDER],\n})\nexport class CovalentDynamicFormsModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["_c0","i3","i1.TdDynamicFormsService","i1","i2.TdDynamicFormsService"],"mappings":"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