@tft/crispr-forms 14.0.1 → 14.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/src/lib/crispr-forms.module.mjs +5 -2
- package/esm2020/src/lib/display-field.directive.mjs +53 -0
- package/esm2020/src/lib/field.directive.mjs +1 -1
- package/esm2020/src/lib/form-group-list/form-group-list.component.mjs +9 -3
- package/esm2020/utils/abstracts/crispr-display-field.abstract.mjs +14 -0
- package/esm2020/utils/abstracts/index.mjs +2 -1
- package/esm2020/utils/models/form-group-list.config.mjs +1 -1
- package/fesm2015/tft-crispr-forms-utils.mjs +11 -1
- package/fesm2015/tft-crispr-forms-utils.mjs.map +1 -1
- package/fesm2015/tft-crispr-forms.mjs +62 -3
- package/fesm2015/tft-crispr-forms.mjs.map +1 -1
- package/fesm2020/tft-crispr-forms-utils.mjs +11 -1
- package/fesm2020/tft-crispr-forms-utils.mjs.map +1 -1
- package/fesm2020/tft-crispr-forms.mjs +60 -3
- package/fesm2020/tft-crispr-forms.mjs.map +1 -1
- package/package.json +2 -3
- package/src/lib/crispr-forms.module.d.ts +5 -4
- package/src/lib/display-field.directive.d.ts +23 -0
- package/src/lib/form-group-list/form-group-list.component.d.ts +2 -0
- package/tft-crispr-forms-14.0.2.tgz +0 -0
- package/utils/abstracts/crispr-display-field.abstract.d.ts +22 -0
- package/utils/abstracts/index.d.ts +1 -0
- package/utils/models/form-group-list.config.d.ts +1 -0
- package/tft-crispr-forms-14.0.1.tgz +0 -0
|
@@ -196,6 +196,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImpor
|
|
|
196
196
|
args: ['submitTrigger']
|
|
197
197
|
}] } });
|
|
198
198
|
|
|
199
|
+
class CrisprDisplayFieldDirective {
|
|
200
|
+
constructor(container, cdr) {
|
|
201
|
+
this.container = container;
|
|
202
|
+
this.cdr = cdr;
|
|
203
|
+
}
|
|
204
|
+
set value(value) {
|
|
205
|
+
this._value = value;
|
|
206
|
+
// This is needed to keep the group list from resetting control values to the initial input value
|
|
207
|
+
this.updateComponentValue(value);
|
|
208
|
+
}
|
|
209
|
+
;
|
|
210
|
+
get value() {
|
|
211
|
+
return this._value;
|
|
212
|
+
}
|
|
213
|
+
ngOnInit() {
|
|
214
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
215
|
+
if (this.component) {
|
|
216
|
+
/**
|
|
217
|
+
* create component and set values from config on its instance
|
|
218
|
+
*/
|
|
219
|
+
const componentRef = this.container.createComponent(this.component);
|
|
220
|
+
this.componentInstance = componentRef.instance;
|
|
221
|
+
this.componentInstance.index = this.index;
|
|
222
|
+
this.updateComponentValue(this.value);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
updateComponentValue(value) {
|
|
227
|
+
if (!this.componentInstance)
|
|
228
|
+
return;
|
|
229
|
+
this.componentInstance.value = value;
|
|
230
|
+
this.cdr.detectChanges();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
CrisprDisplayFieldDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: CrisprDisplayFieldDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
234
|
+
CrisprDisplayFieldDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: CrisprDisplayFieldDirective, isStandalone: true, selector: "[crisprDisplayField]", inputs: { group: "group", value: "value", component: "component", index: "index" }, ngImport: i0 });
|
|
235
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: CrisprDisplayFieldDirective, decorators: [{
|
|
236
|
+
type: Directive,
|
|
237
|
+
args: [{
|
|
238
|
+
selector: '[crisprDisplayField]',
|
|
239
|
+
standalone: true
|
|
240
|
+
}]
|
|
241
|
+
}], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { group: [{
|
|
242
|
+
type: Input
|
|
243
|
+
}], value: [{
|
|
244
|
+
type: Input
|
|
245
|
+
}], component: [{
|
|
246
|
+
type: Input
|
|
247
|
+
}], index: [{
|
|
248
|
+
type: Input
|
|
249
|
+
}] } });
|
|
250
|
+
|
|
199
251
|
const defaultConfig = {
|
|
200
252
|
addButtonLabel: 'ADD ITEM',
|
|
201
253
|
minListLength: 1,
|
|
@@ -211,6 +263,7 @@ class FormGroupListComponent extends FormGroupListMixin {
|
|
|
211
263
|
* we can block original values from overwriting form values
|
|
212
264
|
* */
|
|
213
265
|
this.blockValue = false;
|
|
266
|
+
this.selectedIndex = null;
|
|
214
267
|
}
|
|
215
268
|
ngOnInit() {
|
|
216
269
|
super.ngOnInit();
|
|
@@ -253,9 +306,12 @@ class FormGroupListComponent extends FormGroupListMixin {
|
|
|
253
306
|
deleteGroup(index) {
|
|
254
307
|
this.control.removeAt(index);
|
|
255
308
|
}
|
|
309
|
+
clickEditItem(index) {
|
|
310
|
+
this.selectedIndex = index;
|
|
311
|
+
}
|
|
256
312
|
}
|
|
257
313
|
FormGroupListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: FormGroupListComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
258
|
-
FormGroupListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.1", type: FormGroupListComponent, isStandalone: true, selector: "crispr-form-group-list", usesInheritance: true, ngImport: i0, template: "\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [formGroup]=\"group\">\n\n <div [formArrayName]=\"config.controlName\">\n <!-- Don't add trackBy function, it confuses the state of the array -->\n <
|
|
314
|
+
FormGroupListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.1", type: FormGroupListComponent, isStandalone: true, selector: "crispr-form-group-list", usesInheritance: true, ngImport: i0, template: "\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [formGroup]=\"group\">\n\n <div [formArrayName]=\"config.controlName\">\n\n <!-- Don't add trackBy function, it confuses the state of the array -->\n <ng-container *ngFor=\"let itemControl of control?.controls; let i = index; let last = last\">\n <ng-container *ngIf=\"!config.displayItemComponent || i === selectedIndex || (last && selectedIndex ?? true); else display\">\n <!-- TODO: use content projection to allow custom item label component -->\n <div class=\"item-header\">\n <span class=\"mat-h2\"> {{ config.itemLabelBuilder ? config.itemLabelBuilder(i) : 'Item ' + (i + 1) }} </span>\n <button\n mat-icon-button\n type=\"button\"\n *ngIf=\"i + 1 > config.minListLength\">\n <mat-icon (click)=\"clickDelete(i)\">delete</mat-icon>\n </button>\n </div>\n <div\n [formGroup]=\"itemControl\">\n <!-- TODO: if chiplists didn't need to have labels mixed in with their values we could use [value]=\"control.value\" below -->\n <ng-container\n *ngFor=\"let field of config.itemConfig.fields;\"\n crisprField\n [value]=\"blockValue ? null : value && value[i] | initialControlValue : field\"\n [config]=\"field\"\n [group]=\"itemControl\">\n </ng-container>\n </div>\n </ng-container>\n <ng-template #display>\n <div\n class=\"display-field-container\"\n crisprDisplayField\n [component]=\"config.displayItemComponent\"\n [value]=\"itemControl.value\"\n [index]=\"i\">\n <button mat-icon-button (click)=\"clickEditItem(i)\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n </ng-template>\n </ng-container>\n </div>\n <div class=\"group-footer\">\n <button\n type=\"button\"\n class=\"add\"\n mat-raised-button\n [color]=\"config.addButtonColor\"\n (click)=\"clickAdd()\">\n {{config.addItemLabel || config.addButtonLabel}}\n </button>\n </div>\n\n</crispr-field-container>\n", styles: [".item-header{display:flex;justify-content:space-between}.group-footer{display:flex;justify-content:flex-end}.group-footer button.add{margin-bottom:16px}.display-field-container{position:relative}.display-field-container button{position:absolute;top:0;right:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: CrisprFieldDirective, selector: "[crisprField]", inputs: ["config", "group", "value"] }, { kind: "directive", type: CrisprDisplayFieldDirective, selector: "[crisprDisplayField]", inputs: ["group", "value", "component", "index"] }, { kind: "ngmodule", type: CrisprPipesModule }, { kind: "pipe", type: InitialControlValuePipe, name: "initialControlValue" }, { kind: "ngmodule", type: FormValidationHandlerModule }, { kind: "directive", type: i3$1.ControlErrorContainerDirective, selector: "[controlErrorContainer], [formGroup]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
|
|
259
315
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: FormGroupListComponent, decorators: [{
|
|
260
316
|
type: Component,
|
|
261
317
|
args: [{ selector: 'crispr-form-group-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
@@ -265,9 +321,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImpor
|
|
|
265
321
|
FieldContainerComponent,
|
|
266
322
|
ReactiveFormsModule,
|
|
267
323
|
CrisprFieldDirective,
|
|
324
|
+
CrisprDisplayFieldDirective,
|
|
268
325
|
CrisprPipesModule,
|
|
269
326
|
FormValidationHandlerModule
|
|
270
|
-
], template: "\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [formGroup]=\"group\">\n\n <div [formArrayName]=\"config.controlName\">\n <!-- Don't add trackBy function, it confuses the state of the array -->\n <
|
|
327
|
+
], template: "\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [formGroup]=\"group\">\n\n <div [formArrayName]=\"config.controlName\">\n\n <!-- Don't add trackBy function, it confuses the state of the array -->\n <ng-container *ngFor=\"let itemControl of control?.controls; let i = index; let last = last\">\n <ng-container *ngIf=\"!config.displayItemComponent || i === selectedIndex || (last && selectedIndex ?? true); else display\">\n <!-- TODO: use content projection to allow custom item label component -->\n <div class=\"item-header\">\n <span class=\"mat-h2\"> {{ config.itemLabelBuilder ? config.itemLabelBuilder(i) : 'Item ' + (i + 1) }} </span>\n <button\n mat-icon-button\n type=\"button\"\n *ngIf=\"i + 1 > config.minListLength\">\n <mat-icon (click)=\"clickDelete(i)\">delete</mat-icon>\n </button>\n </div>\n <div\n [formGroup]=\"itemControl\">\n <!-- TODO: if chiplists didn't need to have labels mixed in with their values we could use [value]=\"control.value\" below -->\n <ng-container\n *ngFor=\"let field of config.itemConfig.fields;\"\n crisprField\n [value]=\"blockValue ? null : value && value[i] | initialControlValue : field\"\n [config]=\"field\"\n [group]=\"itemControl\">\n </ng-container>\n </div>\n </ng-container>\n <ng-template #display>\n <div\n class=\"display-field-container\"\n crisprDisplayField\n [component]=\"config.displayItemComponent\"\n [value]=\"itemControl.value\"\n [index]=\"i\">\n <button mat-icon-button (click)=\"clickEditItem(i)\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n </ng-template>\n </ng-container>\n </div>\n <div class=\"group-footer\">\n <button\n type=\"button\"\n class=\"add\"\n mat-raised-button\n [color]=\"config.addButtonColor\"\n (click)=\"clickAdd()\">\n {{config.addItemLabel || config.addButtonLabel}}\n </button>\n </div>\n\n</crispr-field-container>\n", styles: [".item-header{display:flex;justify-content:space-between}.group-footer{display:flex;justify-content:flex-end}.group-footer button.add{margin-bottom:16px}.display-field-container{position:relative}.display-field-container button{position:absolute;top:0;right:0}\n"] }]
|
|
271
328
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; } });
|
|
272
329
|
|
|
273
330
|
var index$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -328,6 +385,7 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
328
385
|
SubGroupModule: SubGroupModule
|
|
329
386
|
});
|
|
330
387
|
|
|
388
|
+
/* eslint-disable @nrwl/nx/enforce-module-boundaries */
|
|
331
389
|
class CrisprFormsModule {
|
|
332
390
|
}
|
|
333
391
|
CrisprFormsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: CrisprFormsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
@@ -337,6 +395,7 @@ CrisprFormsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versi
|
|
|
337
395
|
FormGroupListComponent,
|
|
338
396
|
FieldContainerComponent,
|
|
339
397
|
CrisprFieldDirective,
|
|
398
|
+
CrisprDisplayFieldDirective,
|
|
340
399
|
SubGroupModule,
|
|
341
400
|
CrisprPipesModule,
|
|
342
401
|
CrisprFormComponent], exports: [CrisprFormComponent,
|
|
@@ -359,6 +418,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImpor
|
|
|
359
418
|
FormGroupListComponent,
|
|
360
419
|
FieldContainerComponent,
|
|
361
420
|
CrisprFieldDirective,
|
|
421
|
+
CrisprDisplayFieldDirective,
|
|
362
422
|
SubGroupModule,
|
|
363
423
|
CrisprPipesModule,
|
|
364
424
|
CrisprFormComponent
|
|
@@ -366,7 +426,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImpor
|
|
|
366
426
|
exports: [
|
|
367
427
|
CrisprFormComponent,
|
|
368
428
|
FieldContainerComponent,
|
|
369
|
-
// MaterialModule
|
|
370
429
|
]
|
|
371
430
|
}]
|
|
372
431
|
}] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tft-crispr-forms.mjs","sources":["../../../../libs/crispr-forms/src/lib/field-component-map.const.ts","../../../../libs/crispr-forms/src/lib/field.directive.ts","../../../../libs/crispr-forms/src/lib/pipes/initial-control-value.pipe.ts","../../../../libs/crispr-forms/src/lib/pipes/crispr-pipes.module.ts","../../../../libs/crispr-forms/src/lib/form/form.component.ts","../../../../libs/crispr-forms/src/lib/form/form.component.html","../../../../libs/crispr-forms/src/lib/form-group-list/form-group-list.component.ts","../../../../libs/crispr-forms/src/lib/form-group-list/form-group-list.component.html","../../../../libs/crispr-forms/src/lib/sub-group/sub-group.component.ts","../../../../libs/crispr-forms/src/lib/sub-group/sub-group.component.html","../../../../libs/crispr-forms/src/lib/sub-group/sub-group.module.ts","../../../../libs/crispr-forms/src/lib/crispr-forms.module.ts","../../../../libs/crispr-forms/tft-crispr-forms.ts"],"sourcesContent":["/* eslint-disable @nrwl/nx/enforce-module-boundaries */\n// tslint:disable-next-line: max-line-length\nimport type { FormGroupListComponent } from './form-group-list/form-group-list.component';\nimport type { SubGroupComponent } from './sub-group/sub-group.component';\nimport type { HeadingComponent } from '@tft/crispr-forms/ui';\nimport type { ImageUploadFieldComponent } from '@tft/crispr-forms/ui/image-upload-field';\nimport type { DatepickerFieldComponent } from '@tft/crispr-forms/ui/datepicker-field';\nimport type { CheckboxFieldComponent } from '@tft/crispr-forms/ui/checkbox-field';\nimport type { TextareaFieldComponent } from '@tft/crispr-forms/ui/textarea-field';\nimport type { AutocompleteFieldComponent } from '@tft/crispr-forms/ui/autocomplete-field';\nimport type { SelectFieldComponent } from '@tft/crispr-forms/ui/select-field';\nimport type { InputFieldComponent, } from '@tft/crispr-forms/ui/input-field';\nimport type { RadioFieldComponent } from '@tft/crispr-forms/ui/radio-field';\nimport type { FileUploadFieldComponent } from '@tft/crispr-forms/ui/file-upload-field';\nimport type { SliderFieldComponent } from '@tft/crispr-forms/ui/slider-field';\nimport type { DividerComponent } from '@tft/crispr-forms/ui/divider';\nimport type { ButtonComponent } from '@tft/crispr-forms/ui/button';\nimport type { UnitConversionFieldComponent } from '@tft/crispr-forms/ui/unit-conversion-field';\n\nimport type { AutocompleteChiplistFieldComponent } from '@tft/crispr-forms/ui/autocomplete-chiplist-field';\n\nimport { isControlConfig, ControlType } from '@tft/crispr-forms/utils';\n\nexport const FIELD_COMPONENTS = {\n groupList: () => import('./form-group-list').then (({FormGroupListComponent}) => FormGroupListComponent),\n subGroup: () => import('./sub-group').then(({ SubGroupComponent}) => SubGroupComponent),\n button: () => import('@tft/crispr-forms/ui/button').then(({ ButtonComponent}) => ButtonComponent),\n input: () => import('@tft/crispr-forms/ui/input-field').then(({ InputFieldComponent}) => InputFieldComponent),\n select: () => import('@tft/crispr-forms/ui/select-field').then(({ SelectFieldComponent}) => SelectFieldComponent),\n radio: () => import('@tft/crispr-forms/ui/radio-field').then(({ RadioFieldComponent}) => RadioFieldComponent),\n autocomplete: () => import('@tft/crispr-forms/ui/autocomplete-field').then(({ AutocompleteFieldComponent}) => AutocompleteFieldComponent),\n autocompleteChiplist: () => import('@tft/crispr-forms/ui/autocomplete-chiplist-field').then(({ AutocompleteChiplistFieldComponent}) => AutocompleteChiplistFieldComponent),\n textarea: () => import('@tft/crispr-forms/ui/textarea-field').then(({ TextareaFieldComponent}) => TextareaFieldComponent),\n checkbox: () => import('@tft/crispr-forms/ui/checkbox-field').then(({ CheckboxFieldComponent}) => CheckboxFieldComponent),\n slider: () => import('@tft/crispr-forms/ui/slider-field').then(({ SliderFieldComponent}) => SliderFieldComponent),\n datepicker: () => import('@tft/crispr-forms/ui/datepicker-field').then(({ DatepickerFieldComponent}) => DatepickerFieldComponent),\n fileUpload: () => import('@tft/crispr-forms/ui/file-upload-field').then(({ FileUploadFieldComponent}) => FileUploadFieldComponent),\n imageUpload: () => import('@tft/crispr-forms/ui/image-upload-field').then(({ ImageUploadFieldComponent}) => ImageUploadFieldComponent),\n heading: () => import('@tft/crispr-forms/ui').then(({ HeadingComponent}) => HeadingComponent),\n divider: () => import('@tft/crispr-forms/ui/divider').then(({ DividerComponent}) => DividerComponent),\n unitConversion: () => import('@tft/crispr-forms/ui/unit-conversion-field').then(({ UnitConversionFieldComponent}) => UnitConversionFieldComponent)\n};\n\nexport function isControlComponent(component: CrisprFieldComponentType): component is CrisprControlComponentType {\n return component && isControlConfig(component.config) && 'value' in component // || component.config.controlType === ControlType.BUTTON;\n}\n\nexport function isControlOrButtonComponent(component: CrisprFieldComponentType): component is CrisprControlOrButton {\n return isControlComponent(component) || component.config.controlType === ControlType.BUTTON;\n}\n\nexport type CrisprControlOrButton = CrisprControlComponentType | ButtonComponent;\n\nexport type CrisprControlComponentType = InputFieldComponent |\n SelectFieldComponent |\n RadioFieldComponent |\n SubGroupComponent |\n FormGroupListComponent |\n AutocompleteFieldComponent |\n AutocompleteChiplistFieldComponent |\n TextareaFieldComponent |\n CheckboxFieldComponent |\n SliderFieldComponent |\n FileUploadFieldComponent |\n ImageUploadFieldComponent|\n DatepickerFieldComponent |\n UnitConversionFieldComponent;\n\nexport type ComponentKeys = keyof typeof FIELD_COMPONENTS;\n// export type CrisprFieldComponent = FIELD_COMPONENTS[ComponentKeys];\n\nexport type CrisprFieldComponentType = CrisprControlComponentType |\n HeadingComponent |\n DividerComponent |\n ButtonComponent;\n\n","import { Directive, Input, ViewContainerRef, Renderer2, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { CrisprFieldComponentType, FIELD_COMPONENTS, isControlComponent, isControlOrButtonComponent } from './field-component-map.const';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { AnyFieldConfig, ControlValue } from '@tft/crispr-forms/utils';\n\n@Directive({\n selector: '[crisprField]',\n standalone: true\n})\nexport class CrisprFieldDirective implements OnInit {\n\n @Input() config: AnyFieldConfig;\n @Input() group: FormGroup;\n /**\n * value setter updates the control's value as well\n */\n _value: ControlValue | any[]\n @Input() set value(value: ControlValue | any[]) {\n this._value = value;\n // This is needed to keep the group list from resetting control values to the initial input value\n this.updateComponentValue(value);\n };\n get value() {\n return this._value;\n }\n component: CrisprFieldComponentType;\n\n constructor(\n private container: ViewContainerRef,\n private renderer: Renderer2,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit() {\n /**\n * create component and set values from config on its instance\n */\n const component = this.config.component || await FIELD_COMPONENTS[this.config.controlType]();\n const componentRef = this.container.createComponent<CrisprFieldComponentType>(component);\n\n this.component = componentRef.instance;\n this.component.config = this.config;\n if (isControlOrButtonComponent(this.component)) {\n this.component.group = this.group;\n }\n this.updateComponentValue(this.value);\n // adds any config classes to the dynamically generated component\n // doing this here keeps us from having to extend a base component into each field component individually\n if(!this.config.classes) return;\n this.config.classes.forEach((klass) => {\n // check for passing multiple classes in one array element\n if(klass.includes(' ')) {\n throw Error(`Improperly formatted class. '${klass}' cannot contain spaces.`);\n } else {\n this.renderer.addClass(componentRef.location.nativeElement, klass);\n }\n });\n }\n\n updateComponentValue(value: ControlValue | any[]) {\n if(isControlComponent(this.component)) {\n this.component.value = value;\n // SubGroups won't populate without this detectChanges\n this.cdr.detectChanges();\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { ControlValue, AnyFieldConfig, isControlConfig } from '@tft/crispr-forms/utils';\n\n@Pipe({\n name: 'initialControlValue'\n})\nexport class InitialControlValuePipe implements PipeTransform {\n // TODO: does changing any to unknown break anything?\n transform(initialFormValue: {[key: string]: ControlValue | any}, fieldConfig: AnyFieldConfig): unknown {\n return (initialFormValue && isControlConfig(fieldConfig))\n ? initialFormValue[fieldConfig.controlName] || null\n : null;\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { InitialControlValuePipe } from \"./initial-control-value.pipe\";\n\n@NgModule({\n imports: [\n CommonModule\n ],\n exports: [\n InitialControlValuePipe\n ],\n declarations: [\n InitialControlValuePipe\n ]\n})\n\nexport class CrisprPipesModule {\n}\n","import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, OnInit } from '@angular/core';\nimport { ReactiveFormsModule, FormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { CommonModule } from '@angular/common';\nimport { CrisprFieldDirective } from '../field.directive';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport { CrisprPipesModule } from '../pipes/crispr-pipes.module';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { ControlGroupValue, FormConfig, buildFormGroupFromConfig } from '@tft/crispr-forms/utils';\n\n@Component({\n selector: 'crispr-form',\n styleUrls: ['form.component.scss'],\n templateUrl: 'form.component.html',\n // changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n CrisprFieldDirective,\n ReactiveFormsModule,\n FormValidationHandlerModule,\n CrisprPipesModule\n ],\n})\nexport class CrisprFormComponent implements OnInit {\n // if no form has been passed in by consuming component, we create an empty group to build out\n @Input() config: FormConfig;\n @Input() form: FormGroup = new FormGroup({});\n @Input() value: ControlGroupValue = null;\n\n\n @Output() submitted = new EventEmitter<FormGroup>();\n // proxy value and status change events through to consuming component\n @Output() valueChanges: Observable<any> = this.form.valueChanges;\n @Output() statusChanges: Observable<string> = this.form.statusChanges;\n\n @ViewChild('submitTrigger') submitTrigger: ElementRef<HTMLButtonElement>;\n\n ngOnInit() {\n // build out the form, note that we pass in the form as the third argument and the function modifies it\n buildFormGroupFromConfig(this.config, this.value, this.form);\n }\n\n handleSubmit() {\n this.form.markAllAsTouched();\n this.submitted.emit(this.form);\n }\n\n triggerSubmit() {\n this.submitTrigger.nativeElement.click();\n }\n}\n","<form\n class=\"crispr-form\"\n [ngClass]=\"config.classes\"\n [formGroup]=\"form\"\n (ngSubmit)=\"handleSubmit()\"\n [autocomplete]=\"config.autocomplete || 'off'\"\n [errorDictionary]=\"config.errorDictionary\"\n #ngFormElement=\"ngForm\">\n\n <ng-container\n *ngFor=\"let field of config.fields;\"\n crisprField\n [value]=\"value | initialControlValue : field\"\n [config]=\"field\"\n [group]=\"form\">\n </ng-container>\n <!-- Hidden button, programmatically clicked when crispr form triggerSubmit function called.\n Uses a hidden button with type=\"submit\" because it will trigger both native form submit event\n (which the error handler has to listen for) and ngSubmit event -->\n <button #submitTrigger class=\"submit-trigger\" type=\"submit\">\n </button>\n</form>\n","import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\nimport { FormGroup, FormArray } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CrisprFieldDirective } from '../field.directive';\nimport { CrisprPipesModule } from '../pipes/crispr-pipes.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { CrisprFieldComponent, crisprControlMixin, createControlForType, FormGroupListConfig } from '@tft/crispr-forms/utils';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { FieldContainerComponent } from '@tft/crispr-forms/ui';\n\nconst defaultConfig: Partial<FormGroupListConfig> = {\n addButtonLabel: 'ADD ITEM',\n minListLength: 1,\n};\n\nconst FormGroupListMixin = crisprControlMixin<FormGroupListConfig>(CrisprFieldComponent);\n@Component({\n selector: 'crispr-form-group-list',\n templateUrl: './form-group-list.component.html',\n styleUrls: ['./form-group-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n FieldContainerComponent,\n ReactiveFormsModule,\n CrisprFieldDirective,\n CrisprPipesModule,\n FormValidationHandlerModule\n ],\n})\nexport class FormGroupListComponent extends FormGroupListMixin implements OnInit {\n\n defaultConfig = defaultConfig\n group: FormGroup;\n control: FormArray;\n /**\n * By setting this to true when adding/removing items from array,\n * we can block original values from overwriting form values\n * */\n blockValue = false;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit() {\n super.ngOnInit();\n // TODO: this is required to ngFor of controls in template, must be a better way\n }\n\n setControlValue(values: any[]) {\n if(this.control) {\n if(values?.length > 0) {\n // clear any existing values so that new values don't concatenate onto the old\n const currentValues:[] = this.control.value;\n if(currentValues.length) {\n this.control.clear();\n }\n values.forEach(value => this.addGroup(value));\n\n } else if (this.config.displayInitialItem) {\n this.addGroup()\n }\n // needed to ensure new array items render\n setTimeout(() => {\n this.cdr.detectChanges();\n })\n }\n }\n\n clickDelete(index: number) {\n this.blockValue = true;\n this.deleteGroup(index);\n }\n\n clickAdd() {\n this.blockValue = true;\n this.addGroup();\n }\n\n addGroup(value = null) {\n this.control.push(createControlForType(this.config.itemConfig, value));\n // needed to ensure new array items render\n setTimeout(() => {\n this.cdr.detectChanges();\n })\n }\n\n deleteGroup(index: number) {\n this.control.removeAt(index);\n }\n}\n","\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [formGroup]=\"group\">\n\n <div [formArrayName]=\"config.controlName\">\n <!-- Don't add trackBy function, it confuses the state of the array -->\n <div *ngFor=\"let con of control?.controls; let i = index;\">\n <!-- TODO: use content projection to allow custom item label component -->\n <div class=\"item-header\">\n <span class=\"mat-h2\"> {{ config.itemLabelBuilder ? config.itemLabelBuilder(i) : 'Item ' + (i + 1) }} </span>\n <button\n mat-icon-button\n type=\"button\"\n *ngIf=\"i + 1 > config.minListLength\">\n <mat-icon (click)=\"clickDelete(i)\">delete</mat-icon>\n </button>\n </div>\n <div\n [formGroup]=\"con\">\n <!-- TODO: if chiplists didn't need to have labels mixed in with their values we could use [value]=\"control.value\" below -->\n <ng-container\n *ngFor=\"let field of config.itemConfig.fields;\"\n crisprField\n [value]=\"blockValue ? null : value && value[i] | initialControlValue : field\"\n [config]=\"field\"\n [group]=\"con\">\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"group-footer\">\n <button\n type=\"button\"\n class=\"add\"\n mat-raised-button\n [color]=\"config.addButtonColor\"\n (click)=\"clickAdd()\">\n {{config.addItemLabel || config.addButtonLabel}}\n </button>\n </div>\n\n</crispr-field-container>\n","import { Component, OnInit } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { crisprControlMixin, CrisprFieldComponent, SubGroupConfig } from '@tft/crispr-forms/utils';\n\nconst FormGroupMixin = crisprControlMixin<SubGroupConfig>(CrisprFieldComponent);\n\n@Component({\n selector: 'crispr-sub-group',\n templateUrl: './sub-group.component.html',\n styleUrls: ['./sub-group.component.scss'],\n // TODO: child image upload controls aren't getting updated appropriately when in OnPush strategy.\n // We can add cdr to this class, but everything that extends it will need the cdr attached\n // changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SubGroupComponent extends FormGroupMixin implements OnInit {\n group: FormGroup;\n\n ngOnInit() {\n super.ngOnInit();\n }\n}\n","<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n <ng-container\n *ngFor=\"let fieldConfig of config.fields;\"\n crisprField\n [value]=\"value | initialControlValue : fieldConfig\"\n [config]=\"fieldConfig\"\n [group]=\"control\">\n </ng-container>\n</crispr-field-container>\n\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CrisprFieldDirective } from '../field.directive';\nimport { CrisprPipesModule } from '../pipes/crispr-pipes.module';\nimport { SubGroupComponent } from './sub-group.component';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport { FieldContainerComponent } from '@tft/crispr-forms/ui';\n@NgModule({\n imports: [\n CommonModule,\n CrisprFieldDirective,\n FieldContainerComponent,\n CrisprPipesModule,\n // TODO: Does this need to be here?\n FormValidationHandlerModule\n ],\n exports: [\n SubGroupComponent\n ],\n declarations: [\n SubGroupComponent\n ]\n})\n\nexport class SubGroupModule {\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\n// custom modules\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\n\n// components\nimport { CrisprFormComponent } from './form/form.component';\nimport { FormGroupListComponent } from './form-group-list';\n// directives\nimport { CrisprFieldDirective } from './field.directive';\nimport { SubGroupModule } from './sub-group';\nimport { CrisprPipesModule } from './pipes/crispr-pipes.module';\nimport { FieldContainerComponent } from '@tft/crispr-forms/ui';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormValidationHandlerModule,\n FormGroupListComponent,\n FieldContainerComponent,\n CrisprFieldDirective,\n SubGroupModule,\n CrisprPipesModule,\n CrisprFormComponent\n ],\n exports: [\n CrisprFormComponent,\n FieldContainerComponent,\n // MaterialModule\n ]\n})\nexport class CrisprFormsModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i4.InitialControlValuePipe","i2","i4","i6","i2.CrisprFieldDirective"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tft-crispr-forms.mjs","sources":["../../../../libs/crispr-forms/src/lib/field-component-map.const.ts","../../../../libs/crispr-forms/src/lib/field.directive.ts","../../../../libs/crispr-forms/src/lib/pipes/initial-control-value.pipe.ts","../../../../libs/crispr-forms/src/lib/pipes/crispr-pipes.module.ts","../../../../libs/crispr-forms/src/lib/form/form.component.ts","../../../../libs/crispr-forms/src/lib/form/form.component.html","../../../../libs/crispr-forms/src/lib/display-field.directive.ts","../../../../libs/crispr-forms/src/lib/form-group-list/form-group-list.component.ts","../../../../libs/crispr-forms/src/lib/form-group-list/form-group-list.component.html","../../../../libs/crispr-forms/src/lib/sub-group/sub-group.component.ts","../../../../libs/crispr-forms/src/lib/sub-group/sub-group.component.html","../../../../libs/crispr-forms/src/lib/sub-group/sub-group.module.ts","../../../../libs/crispr-forms/src/lib/crispr-forms.module.ts","../../../../libs/crispr-forms/tft-crispr-forms.ts"],"sourcesContent":["/* eslint-disable @nrwl/nx/enforce-module-boundaries */\n// tslint:disable-next-line: max-line-length\nimport type { FormGroupListComponent } from './form-group-list/form-group-list.component';\nimport type { SubGroupComponent } from './sub-group/sub-group.component';\nimport type { HeadingComponent } from '@tft/crispr-forms/ui';\nimport type { ImageUploadFieldComponent } from '@tft/crispr-forms/ui/image-upload-field';\nimport type { DatepickerFieldComponent } from '@tft/crispr-forms/ui/datepicker-field';\nimport type { CheckboxFieldComponent } from '@tft/crispr-forms/ui/checkbox-field';\nimport type { TextareaFieldComponent } from '@tft/crispr-forms/ui/textarea-field';\nimport type { AutocompleteFieldComponent } from '@tft/crispr-forms/ui/autocomplete-field';\nimport type { SelectFieldComponent } from '@tft/crispr-forms/ui/select-field';\nimport type { InputFieldComponent, } from '@tft/crispr-forms/ui/input-field';\nimport type { RadioFieldComponent } from '@tft/crispr-forms/ui/radio-field';\nimport type { FileUploadFieldComponent } from '@tft/crispr-forms/ui/file-upload-field';\nimport type { SliderFieldComponent } from '@tft/crispr-forms/ui/slider-field';\nimport type { DividerComponent } from '@tft/crispr-forms/ui/divider';\nimport type { ButtonComponent } from '@tft/crispr-forms/ui/button';\nimport type { UnitConversionFieldComponent } from '@tft/crispr-forms/ui/unit-conversion-field';\n\nimport type { AutocompleteChiplistFieldComponent } from '@tft/crispr-forms/ui/autocomplete-chiplist-field';\n\nimport { isControlConfig, ControlType } from '@tft/crispr-forms/utils';\n\nexport const FIELD_COMPONENTS = {\n groupList: () => import('./form-group-list').then (({FormGroupListComponent}) => FormGroupListComponent),\n subGroup: () => import('./sub-group').then(({ SubGroupComponent}) => SubGroupComponent),\n button: () => import('@tft/crispr-forms/ui/button').then(({ ButtonComponent}) => ButtonComponent),\n input: () => import('@tft/crispr-forms/ui/input-field').then(({ InputFieldComponent}) => InputFieldComponent),\n select: () => import('@tft/crispr-forms/ui/select-field').then(({ SelectFieldComponent}) => SelectFieldComponent),\n radio: () => import('@tft/crispr-forms/ui/radio-field').then(({ RadioFieldComponent}) => RadioFieldComponent),\n autocomplete: () => import('@tft/crispr-forms/ui/autocomplete-field').then(({ AutocompleteFieldComponent}) => AutocompleteFieldComponent),\n autocompleteChiplist: () => import('@tft/crispr-forms/ui/autocomplete-chiplist-field').then(({ AutocompleteChiplistFieldComponent}) => AutocompleteChiplistFieldComponent),\n textarea: () => import('@tft/crispr-forms/ui/textarea-field').then(({ TextareaFieldComponent}) => TextareaFieldComponent),\n checkbox: () => import('@tft/crispr-forms/ui/checkbox-field').then(({ CheckboxFieldComponent}) => CheckboxFieldComponent),\n slider: () => import('@tft/crispr-forms/ui/slider-field').then(({ SliderFieldComponent}) => SliderFieldComponent),\n datepicker: () => import('@tft/crispr-forms/ui/datepicker-field').then(({ DatepickerFieldComponent}) => DatepickerFieldComponent),\n fileUpload: () => import('@tft/crispr-forms/ui/file-upload-field').then(({ FileUploadFieldComponent}) => FileUploadFieldComponent),\n imageUpload: () => import('@tft/crispr-forms/ui/image-upload-field').then(({ ImageUploadFieldComponent}) => ImageUploadFieldComponent),\n heading: () => import('@tft/crispr-forms/ui').then(({ HeadingComponent}) => HeadingComponent),\n divider: () => import('@tft/crispr-forms/ui/divider').then(({ DividerComponent}) => DividerComponent),\n unitConversion: () => import('@tft/crispr-forms/ui/unit-conversion-field').then(({ UnitConversionFieldComponent}) => UnitConversionFieldComponent)\n};\n\nexport function isControlComponent(component: CrisprFieldComponentType): component is CrisprControlComponentType {\n return component && isControlConfig(component.config) && 'value' in component // || component.config.controlType === ControlType.BUTTON;\n}\n\nexport function isControlOrButtonComponent(component: CrisprFieldComponentType): component is CrisprControlOrButton {\n return isControlComponent(component) || component.config.controlType === ControlType.BUTTON;\n}\n\nexport type CrisprControlOrButton = CrisprControlComponentType | ButtonComponent;\n\nexport type CrisprControlComponentType = InputFieldComponent |\n SelectFieldComponent |\n RadioFieldComponent |\n SubGroupComponent |\n FormGroupListComponent |\n AutocompleteFieldComponent |\n AutocompleteChiplistFieldComponent |\n TextareaFieldComponent |\n CheckboxFieldComponent |\n SliderFieldComponent |\n FileUploadFieldComponent |\n ImageUploadFieldComponent|\n DatepickerFieldComponent |\n UnitConversionFieldComponent;\n\nexport type ComponentKeys = keyof typeof FIELD_COMPONENTS;\n// export type CrisprFieldComponent = FIELD_COMPONENTS[ComponentKeys];\n\nexport type CrisprFieldComponentType = CrisprControlComponentType |\n HeadingComponent |\n DividerComponent |\n ButtonComponent;\n\n","import { Directive, Input, ViewContainerRef, Renderer2, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { CrisprFieldComponentType, FIELD_COMPONENTS, isControlComponent, isControlOrButtonComponent } from './field-component-map.const';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { AnyFieldConfig, ControlValue } from '@tft/crispr-forms/utils';\n\n@Directive({\n selector: '[crisprField]',\n standalone: true\n})\nexport class CrisprFieldDirective implements OnInit {\n\n @Input() config: AnyFieldConfig;\n @Input() group: FormGroup;\n /**\n * value setter updates the control's value as well\n */\n _value: ControlValue | any[]\n @Input() set value(value: ControlValue | any[]) {\n this._value = value;\n // This is needed to keep the group list from resetting control values to the initial input value\n this.updateComponentValue(value);\n };\n get value() {\n return this._value;\n }\n\n component: CrisprFieldComponentType;\n\n constructor(\n private container: ViewContainerRef,\n private renderer: Renderer2,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit() {\n /**\n * create component and set values from config on its instance\n */\n const component = this.config.component || await FIELD_COMPONENTS[this.config.controlType]();\n const componentRef = this.container.createComponent<CrisprFieldComponentType>(component);\n\n this.component = componentRef.instance;\n this.component.config = this.config;\n if (isControlOrButtonComponent(this.component)) {\n this.component.group = this.group;\n }\n this.updateComponentValue(this.value);\n // adds any config classes to the dynamically generated component\n // doing this here keeps us from having to extend a base component into each field component individually\n if(!this.config.classes) return;\n this.config.classes.forEach((klass) => {\n // check for passing multiple classes in one array element\n if(klass.includes(' ')) {\n throw Error(`Improperly formatted class. '${klass}' cannot contain spaces.`);\n } else {\n this.renderer.addClass(componentRef.location.nativeElement, klass);\n }\n });\n }\n\n updateComponentValue(value: ControlValue | any[]) {\n if(isControlComponent(this.component)) {\n this.component.value = value;\n // SubGroups won't populate without this detectChanges\n this.cdr.detectChanges();\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { ControlValue, AnyFieldConfig, isControlConfig } from '@tft/crispr-forms/utils';\n\n@Pipe({\n name: 'initialControlValue'\n})\nexport class InitialControlValuePipe implements PipeTransform {\n // TODO: does changing any to unknown break anything?\n transform(initialFormValue: {[key: string]: ControlValue | any}, fieldConfig: AnyFieldConfig): unknown {\n return (initialFormValue && isControlConfig(fieldConfig))\n ? initialFormValue[fieldConfig.controlName] || null\n : null;\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { InitialControlValuePipe } from \"./initial-control-value.pipe\";\n\n@NgModule({\n imports: [\n CommonModule\n ],\n exports: [\n InitialControlValuePipe\n ],\n declarations: [\n InitialControlValuePipe\n ]\n})\n\nexport class CrisprPipesModule {\n}\n","import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, OnInit } from '@angular/core';\nimport { ReactiveFormsModule, FormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { CommonModule } from '@angular/common';\nimport { CrisprFieldDirective } from '../field.directive';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport { CrisprPipesModule } from '../pipes/crispr-pipes.module';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { ControlGroupValue, FormConfig, buildFormGroupFromConfig } from '@tft/crispr-forms/utils';\n\n@Component({\n selector: 'crispr-form',\n styleUrls: ['form.component.scss'],\n templateUrl: 'form.component.html',\n // changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n CrisprFieldDirective,\n ReactiveFormsModule,\n FormValidationHandlerModule,\n CrisprPipesModule\n ],\n})\nexport class CrisprFormComponent implements OnInit {\n // if no form has been passed in by consuming component, we create an empty group to build out\n @Input() config: FormConfig;\n @Input() form: FormGroup = new FormGroup({});\n @Input() value: ControlGroupValue = null;\n\n\n @Output() submitted = new EventEmitter<FormGroup>();\n // proxy value and status change events through to consuming component\n @Output() valueChanges: Observable<any> = this.form.valueChanges;\n @Output() statusChanges: Observable<string> = this.form.statusChanges;\n\n @ViewChild('submitTrigger') submitTrigger: ElementRef<HTMLButtonElement>;\n\n ngOnInit() {\n // build out the form, note that we pass in the form as the third argument and the function modifies it\n buildFormGroupFromConfig(this.config, this.value, this.form);\n }\n\n handleSubmit() {\n this.form.markAllAsTouched();\n this.submitted.emit(this.form);\n }\n\n triggerSubmit() {\n this.submitTrigger.nativeElement.click();\n }\n}\n","<form\n class=\"crispr-form\"\n [ngClass]=\"config.classes\"\n [formGroup]=\"form\"\n (ngSubmit)=\"handleSubmit()\"\n [autocomplete]=\"config.autocomplete || 'off'\"\n [errorDictionary]=\"config.errorDictionary\"\n #ngFormElement=\"ngForm\">\n\n <ng-container\n *ngFor=\"let field of config.fields;\"\n crisprField\n [value]=\"value | initialControlValue : field\"\n [config]=\"field\"\n [group]=\"form\">\n </ng-container>\n <!-- Hidden button, programmatically clicked when crispr form triggerSubmit function called.\n Uses a hidden button with type=\"submit\" because it will trigger both native form submit event\n (which the error handler has to listen for) and ngSubmit event -->\n <button #submitTrigger class=\"submit-trigger\" type=\"submit\">\n </button>\n</form>\n","import { Directive, Input, ViewContainerRef, OnInit, ChangeDetectorRef, Type } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { ControlValue, CrisprDisplayFieldComponent } from '@tft/crispr-forms/utils';\n\n@Directive({\n selector: '[crisprDisplayField]',\n standalone: true\n})\nexport class CrisprDisplayFieldDirective implements OnInit {\n\n @Input() group: FormGroup;\n /**\n * value setter updates the control's value as well\n */\n _value: ControlValue | any[]\n @Input() set value(value: ControlValue | any[]) {\n this._value = value;\n // This is needed to keep the group list from resetting control values to the initial input value\n this.updateComponentValue(value);\n };\n get value() {\n return this._value;\n }\n\n @Input() private component: Type<CrisprDisplayFieldComponent>;\n\n @Input() index?: number;\n\n private componentInstance: CrisprDisplayFieldComponent;\n\n constructor(\n private container: ViewContainerRef,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit() {\n if (this.component) {\n\n /**\n * create component and set values from config on its instance\n */\n const componentRef = this.container.createComponent(this.component);\n\n this.componentInstance = componentRef.instance;\n this.componentInstance.index = this.index\n this.updateComponentValue(this.value);\n }\n }\n\n updateComponentValue(value: ControlValue | any[]) {\n if(!this.componentInstance) return;\n this.componentInstance.value = value;\n this.cdr.detectChanges();\n }\n}\n","import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\nimport { FormGroup, FormArray } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CrisprFieldDirective } from '../field.directive';\nimport { CrisprPipesModule } from '../pipes/crispr-pipes.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { CrisprFieldComponent, crisprControlMixin, createControlForType, FormGroupListConfig } from '@tft/crispr-forms/utils';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { FieldContainerComponent } from '@tft/crispr-forms/ui';\nimport { CrisprDisplayFieldDirective } from '../display-field.directive';\n\nconst defaultConfig: Partial<FormGroupListConfig> = {\n addButtonLabel: 'ADD ITEM',\n minListLength: 1,\n};\n\nconst FormGroupListMixin = crisprControlMixin<FormGroupListConfig>(CrisprFieldComponent);\n@Component({\n selector: 'crispr-form-group-list',\n templateUrl: './form-group-list.component.html',\n styleUrls: ['./form-group-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n FieldContainerComponent,\n ReactiveFormsModule,\n CrisprFieldDirective,\n CrisprDisplayFieldDirective,\n CrisprPipesModule,\n FormValidationHandlerModule\n ],\n})\nexport class FormGroupListComponent extends FormGroupListMixin implements OnInit {\n\n defaultConfig = defaultConfig\n group: FormGroup;\n control: FormArray;\n /**\n * By setting this to true when adding/removing items from array,\n * we can block original values from overwriting form values\n * */\n blockValue = false;\n\n selectedIndex: number = null;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit() {\n super.ngOnInit();\n // TODO: this is required to ngFor of controls in template, must be a better way\n }\n\n setControlValue(values: any[]) {\n if(this.control) {\n if(values?.length > 0) {\n // clear any existing values so that new values don't concatenate onto the old\n const currentValues:[] = this.control.value;\n if(currentValues.length) {\n this.control.clear();\n }\n values.forEach(value => this.addGroup(value));\n\n } else if (this.config.displayInitialItem) {\n this.addGroup()\n }\n // needed to ensure new array items render\n setTimeout(() => {\n this.cdr.detectChanges();\n })\n }\n }\n\n clickDelete(index: number) {\n this.blockValue = true;\n this.deleteGroup(index);\n }\n\n clickAdd() {\n this.blockValue = true;\n this.addGroup();\n }\n\n addGroup(value = null) {\n this.control.push(createControlForType(this.config.itemConfig, value));\n // needed to ensure new array items render\n setTimeout(() => {\n this.cdr.detectChanges();\n })\n }\n\n deleteGroup(index: number) {\n this.control.removeAt(index);\n }\n\n clickEditItem(index: number) {\n this.selectedIndex = index;\n }\n}\n","\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [formGroup]=\"group\">\n\n <div [formArrayName]=\"config.controlName\">\n\n <!-- Don't add trackBy function, it confuses the state of the array -->\n <ng-container *ngFor=\"let itemControl of control?.controls; let i = index; let last = last\">\n <ng-container *ngIf=\"!config.displayItemComponent || i === selectedIndex || (last && selectedIndex ?? true); else display\">\n <!-- TODO: use content projection to allow custom item label component -->\n <div class=\"item-header\">\n <span class=\"mat-h2\"> {{ config.itemLabelBuilder ? config.itemLabelBuilder(i) : 'Item ' + (i + 1) }} </span>\n <button\n mat-icon-button\n type=\"button\"\n *ngIf=\"i + 1 > config.minListLength\">\n <mat-icon (click)=\"clickDelete(i)\">delete</mat-icon>\n </button>\n </div>\n <div\n [formGroup]=\"itemControl\">\n <!-- TODO: if chiplists didn't need to have labels mixed in with their values we could use [value]=\"control.value\" below -->\n <ng-container\n *ngFor=\"let field of config.itemConfig.fields;\"\n crisprField\n [value]=\"blockValue ? null : value && value[i] | initialControlValue : field\"\n [config]=\"field\"\n [group]=\"itemControl\">\n </ng-container>\n </div>\n </ng-container>\n <ng-template #display>\n <div\n class=\"display-field-container\"\n crisprDisplayField\n [component]=\"config.displayItemComponent\"\n [value]=\"itemControl.value\"\n [index]=\"i\">\n <button mat-icon-button (click)=\"clickEditItem(i)\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n </ng-template>\n </ng-container>\n </div>\n <div class=\"group-footer\">\n <button\n type=\"button\"\n class=\"add\"\n mat-raised-button\n [color]=\"config.addButtonColor\"\n (click)=\"clickAdd()\">\n {{config.addItemLabel || config.addButtonLabel}}\n </button>\n </div>\n\n</crispr-field-container>\n","import { Component, OnInit } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { crisprControlMixin, CrisprFieldComponent, SubGroupConfig } from '@tft/crispr-forms/utils';\n\nconst FormGroupMixin = crisprControlMixin<SubGroupConfig>(CrisprFieldComponent);\n\n@Component({\n selector: 'crispr-sub-group',\n templateUrl: './sub-group.component.html',\n styleUrls: ['./sub-group.component.scss'],\n // TODO: child image upload controls aren't getting updated appropriately when in OnPush strategy.\n // We can add cdr to this class, but everything that extends it will need the cdr attached\n // changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SubGroupComponent extends FormGroupMixin implements OnInit {\n group: FormGroup;\n\n ngOnInit() {\n super.ngOnInit();\n }\n}\n","<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n <ng-container\n *ngFor=\"let fieldConfig of config.fields;\"\n crisprField\n [value]=\"value | initialControlValue : fieldConfig\"\n [config]=\"fieldConfig\"\n [group]=\"control\">\n </ng-container>\n</crispr-field-container>\n\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CrisprFieldDirective } from '../field.directive';\nimport { CrisprPipesModule } from '../pipes/crispr-pipes.module';\nimport { SubGroupComponent } from './sub-group.component';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport { FieldContainerComponent } from '@tft/crispr-forms/ui';\n@NgModule({\n imports: [\n CommonModule,\n CrisprFieldDirective,\n FieldContainerComponent,\n CrisprPipesModule,\n // TODO: Does this need to be here?\n FormValidationHandlerModule\n ],\n exports: [\n SubGroupComponent\n ],\n declarations: [\n SubGroupComponent\n ]\n})\n\nexport class SubGroupModule {\n}\n","/* eslint-disable @nrwl/nx/enforce-module-boundaries */\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\n// custom modules\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\n\n// components\nimport { CrisprFormComponent } from './form/form.component';\nimport { FormGroupListComponent } from './form-group-list';\n// directives\nimport { CrisprFieldDirective } from './field.directive';\nimport { SubGroupModule } from './sub-group';\nimport { CrisprPipesModule } from './pipes/crispr-pipes.module';\nimport { FieldContainerComponent } from '@tft/crispr-forms/ui';\nimport { CrisprDisplayFieldDirective } from './display-field.directive';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormValidationHandlerModule,\n FormGroupListComponent,\n FieldContainerComponent,\n CrisprFieldDirective,\n CrisprDisplayFieldDirective,\n SubGroupModule,\n CrisprPipesModule,\n CrisprFormComponent\n ],\n exports: [\n CrisprFormComponent,\n FieldContainerComponent,\n ]\n})\nexport class CrisprFormsModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i4.InitialControlValuePipe","i6","i2.CrisprFieldDirective"],"mappings":";;;;;;;;;;;;;;;;;;;AAuBO,MAAM,gBAAgB,GAAG;AAC9B,IAAA,SAAS,EAAE,MAAM,uDAA2B,CAAC,IAAI,CAAE,CAAC,EAAC,sBAAsB,EAAC,KAAK,sBAAsB,CAAC;AACxG,IAAA,QAAQ,EAAE,MAAM,qDAAqB,CAAC,IAAI,CAAC,CAAC,EAAE,iBAAiB,EAAC,KAAM,iBAAiB,CAAC;AACxF,IAAA,MAAM,EAAE,MAAM,OAAO,6BAA6B,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,EAAC,KAAM,eAAe,CAAC;AAClG,IAAA,KAAK,EAAE,MAAM,OAAO,kCAAkC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,mBAAmB,EAAC,KAAM,mBAAmB,CAAC;AAC9G,IAAA,MAAM,EAAE,MAAM,OAAO,mCAAmC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,oBAAoB,EAAC,KAAM,oBAAoB,CAAC;AAClH,IAAA,KAAK,EAAE,MAAM,OAAO,kCAAkC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,mBAAmB,EAAC,KAAM,mBAAmB,CAAC;AAC9G,IAAA,YAAY,EAAE,MAAM,OAAO,yCAAyC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,0BAA0B,EAAC,KAAM,0BAA0B,CAAC;AAC1I,IAAA,oBAAoB,EAAE,MAAM,OAAO,kDAAkD,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,kCAAkC,EAAC,KAAM,kCAAkC,CAAC;AAC3K,IAAA,QAAQ,EAAE,MAAM,OAAO,qCAAqC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,sBAAsB,EAAC,KAAM,sBAAsB,CAAC;AAC1H,IAAA,QAAQ,EAAE,MAAM,OAAO,qCAAqC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,sBAAsB,EAAC,KAAM,sBAAsB,CAAC;AAC1H,IAAA,MAAM,EAAE,MAAM,OAAO,mCAAmC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,oBAAoB,EAAC,KAAM,oBAAoB,CAAC;AAClH,IAAA,UAAU,EAAE,MAAM,OAAO,uCAAuC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,wBAAwB,EAAC,KAAM,wBAAwB,CAAC;AAClI,IAAA,UAAU,EAAE,MAAM,OAAO,wCAAwC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,wBAAwB,EAAC,KAAM,wBAAwB,CAAC;AACnI,IAAA,WAAW,EAAE,MAAM,OAAO,yCAAyC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,yBAAyB,EAAC,KAAM,yBAAyB,CAAC;AACvI,IAAA,OAAO,EAAE,MAAM,OAAO,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,gBAAgB,EAAC,KAAM,gBAAgB,CAAC;AAC9F,IAAA,OAAO,EAAE,MAAM,OAAO,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,gBAAgB,EAAC,KAAM,gBAAgB,CAAC;AACtG,IAAA,cAAc,EAAE,MAAM,OAAO,4CAA4C,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,4BAA4B,EAAC,KAAM,4BAA4B,CAAC;CACpJ,CAAC;AAEI,SAAU,kBAAkB,CAAC,SAAmC,EAAA;AACpE,IAAA,OAAO,SAAS,IAAI,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,OAAO,IAAI,SAAS,CAAA;AAC/E,CAAC;AAEK,SAAU,0BAA0B,CAAC,SAAmC,EAAA;AAC5E,IAAA,OAAO,kBAAkB,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,WAAW,KAAK,WAAW,CAAC,MAAM,CAAC;AAC9F;;MCvCa,oBAAoB,CAAA;AAmB/B,IAAA,WAAA,CACU,SAA2B,EAC3B,QAAmB,EACnB,GAAsB,EAAA;AAFtB,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAkB;AAC3B,QAAA,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAW;AACnB,QAAA,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;KAC5B;IAfJ,IAAa,KAAK,CAAC,KAA2B,EAAA;AAC5C,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;AAEpB,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;KAClC;;AACD,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;KACpB;IAUK,QAAQ,GAAA;;AACZ;;AAEG;AACH,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,KAAI,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAA,CAAC;YAC7F,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAA2B,SAAS,CAAC,CAAC;AAEzF,YAAA,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AACpC,YAAA,IAAI,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;gBAC9C,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AACnC,aAAA;AACD,YAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;;AAGtC,YAAA,IAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO;YAChC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;;AAEpC,gBAAA,IAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACtB,oBAAA,MAAM,KAAK,CAAC,CAAA,6BAAA,EAAgC,KAAK,CAAA,wBAAA,CAA0B,CAAC,CAAC;AAC9E,iBAAA;AAAM,qBAAA;AACL,oBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;AACpE,iBAAA;AACH,aAAC,CAAC,CAAC;SACJ,CAAA,CAAA;AAAA,KAAA;AAED,IAAA,oBAAoB,CAAC,KAA2B,EAAA;AAC9C,QAAA,IAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;;AAE7B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AAC1B,SAAA;KACF;;iHAzDU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,UAAU,EAAE,IAAI;iBACjB,CAAA;+JAGU,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAKO,KAAK,EAAA,CAAA;sBAAjB,KAAK;;;MCXK,uBAAuB,CAAA;;IAElC,SAAS,CAAC,gBAAqD,EAAE,WAA2B,EAAA;AAC1F,QAAA,OAAO,CAAC,gBAAgB,IAAI,eAAe,CAAC,WAAW,CAAC;cACpD,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI;cACjD,IAAI,CAAC;KACV;;oHANU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;kHAAvB,uBAAuB,EAAA,IAAA,EAAA,qBAAA,EAAA,CAAA,CAAA;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,qBAAqB;iBAC5B,CAAA;;;MCUY,iBAAiB,CAAA;;8GAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAjB,iBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,EAJ1B,YAAA,EAAA,CAAA,uBAAuB,CANvB,EAAA,OAAA,EAAA,CAAA,YAAY,aAGZ,uBAAuB,CAAA,EAAA,CAAA,CAAA;AAOd,iBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,YAV1B,YAAY,CAAA,EAAA,CAAA,CAAA;2FAUH,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAZ7B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,YAAY;AACb,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,uBAAuB;AACxB,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACZ,uBAAuB;AACxB,qBAAA;iBACF,CAAA;;;MCUY,mBAAmB,CAAA;AAdhC,IAAA,WAAA,GAAA;QAiBW,IAAA,CAAA,IAAI,GAAc,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;AACpC,QAAA,IAAK,CAAA,KAAA,GAAsB,IAAI,CAAC;AAG/B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAa,CAAC;;QAE1C,IAAA,CAAA,YAAY,GAAoB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QACvD,IAAA,CAAA,aAAa,GAAuB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;KAiBvE;IAbC,QAAQ,GAAA;;AAEN,QAAA,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;KAC9D;IAED,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAChC;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;KAC1C;;gHA1BU,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;oGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxBhC,2yBAsBA,EAAA,MAAA,EAAA,CAAA,iCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDLI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,2BAA2B,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAC3B,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,uBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,IAAA,EAAA,CAAA,CAAA;2FAGR,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAd/B,SAAS;+BACE,aAAa,EAAA,UAAA,EAIX,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,oBAAoB;wBACpB,mBAAmB;wBACnB,2BAA2B;wBAC3B,iBAAiB;qBAClB,EAAA,QAAA,EAAA,2yBAAA,EAAA,MAAA,EAAA,CAAA,iCAAA,CAAA,EAAA,CAAA;8BAIQ,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAGI,SAAS,EAAA,CAAA;sBAAlB,MAAM;gBAEG,YAAY,EAAA,CAAA;sBAArB,MAAM;gBACG,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBAEqB,aAAa,EAAA,CAAA;sBAAxC,SAAS;uBAAC,eAAe,CAAA;;;ME3Bf,2BAA2B,CAAA;IAsBtC,WACU,CAAA,SAA2B,EAC3B,GAAsB,EAAA;AADtB,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAkB;AAC3B,QAAA,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;KAC5B;IAlBJ,IAAa,KAAK,CAAC,KAA2B,EAAA;AAC5C,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;AAEpB,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;KAClC;;AACD,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;KACpB;IAaK,QAAQ,GAAA;;YACZ,IAAI,IAAI,CAAC,SAAS,EAAE;AAElB;;AAEG;AACH,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEpE,gBAAA,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC,QAAQ,CAAC;gBAC/C,IAAI,CAAC,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;AACzC,gBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvC,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;AAED,IAAA,oBAAoB,CAAC,KAA2B,EAAA;QAC9C,IAAG,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;AACnC,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,GAAG,KAAK,CAAC;AACrC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;KAC1B;;wHA7CU,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;4GAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAJvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,UAAU,EAAE,IAAI;iBACjB,CAAA;uIAGU,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAKO,KAAK,EAAA,CAAA;sBAAjB,KAAK;gBASW,SAAS,EAAA,CAAA;sBAAzB,KAAK;gBAEG,KAAK,EAAA,CAAA;sBAAb,KAAK;;;ACZR,MAAM,aAAa,GAAiC;AAClD,IAAA,cAAc,EAAE,UAAU;AAC1B,IAAA,aAAa,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,kBAAkB,GAAG,kBAAkB,CAAsB,oBAAoB,CAAC,CAAC;AAmBnF,MAAO,sBAAuB,SAAQ,kBAAkB,CAAA;AAa5D,IAAA,WAAA,CAAoB,GAAsB,EAAA;AACxC,QAAA,KAAK,EAAE,CAAC;AADU,QAAA,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;AAX1C,QAAA,IAAa,CAAA,aAAA,GAAG,aAAa,CAAA;AAG7B;;;AAGK;AACL,QAAA,IAAU,CAAA,UAAA,GAAG,KAAK,CAAC;AAEnB,QAAA,IAAa,CAAA,aAAA,GAAW,IAAI,CAAC;KAI5B;IAED,QAAQ,GAAA;QACN,KAAK,CAAC,QAAQ,EAAE,CAAC;;KAElB;AAED,IAAA,eAAe,CAAC,MAAa,EAAA;QAC3B,IAAG,IAAI,CAAC,OAAO,EAAE;YACf,IAAG,CAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAE,MAAM,IAAG,CAAC,EAAE;;AAErB,gBAAA,MAAM,aAAa,GAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC5C,IAAG,aAAa,CAAC,MAAM,EAAE;AACvB,oBAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;AACtB,iBAAA;AACD,gBAAA,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAE/C,aAAA;AAAM,iBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;gBACzC,IAAI,CAAC,QAAQ,EAAE,CAAA;AAChB,aAAA;;YAED,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AAC3B,aAAC,CAAC,CAAA;AACH,SAAA;KACF;AAED,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;KACzB;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;KACjB;IAED,QAAQ,CAAC,KAAK,GAAG,IAAI,EAAA;AACnB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;;QAEvE,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AAC3B,SAAC,CAAC,CAAA;KACH;AAED,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KAC9B;AAED,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;KAC5B;;mHAlEU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,sBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,yGCvCnC,6pEA2DA,EAAA,MAAA,EAAA,CAAA,uQAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/BI,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,4VACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,uBAAuB,EACvB,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,mbACnB,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,2BAA2B,EAC3B,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,4GACjB,2BAA2B,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,mBAAA,EAAA,IAAA,EAAA,CAAA,CAAA;2FAGlB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAlBlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,mBAGjB,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,eAAe;wBACf,aAAa;wBACb,uBAAuB;wBACvB,mBAAmB;wBACnB,oBAAoB;wBACpB,2BAA2B;wBAC3B,iBAAiB;wBACjB,2BAA2B;qBAC5B,EAAA,QAAA,EAAA,6pEAAA,EAAA,MAAA,EAAA,CAAA,uQAAA,CAAA,EAAA,CAAA;;;;;;;;AE/BH,MAAM,cAAc,GAAG,kBAAkB,CAAiB,oBAAoB,CAAC,CAAC;AAU1E,MAAO,iBAAkB,SAAQ,cAAc,CAAA;IAGnD,QAAQ,GAAA;QACN,KAAK,CAAC,QAAQ,EAAE,CAAC;KAClB;;8GALU,iBAAiB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,iBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,+EChB9B,+TAYA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAF,uBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,IAAA,EAAA,CAAA,CAAA;2FDIa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;+BACE,kBAAkB,EAAA,QAAA,EAAA,+TAAA,EAAA,CAAA;;;MEejB,cAAc,CAAA;;2GAAd,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;4GAAd,cAAc,EAAA,YAAA,EAAA,CAJvB,iBAAiB,CAAA,EAAA,OAAA,EAAA,CAXjB,YAAY;QACZ,oBAAoB;QACpB,uBAAuB;QACvB,iBAAiB;;QAEjB,2BAA2B,aAG3B,iBAAiB,CAAA,EAAA,CAAA,CAAA;AAOR,cAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAfvB,YAAY;QAEZ,uBAAuB;QACvB,iBAAiB;;QAEjB,2BAA2B,CAAA,EAAA,CAAA,CAAA;2FAUlB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAjB1B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,oBAAoB;wBACpB,uBAAuB;wBACvB,iBAAiB;;wBAEjB,2BAA2B;AAC5B,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,iBAAiB;AAClB,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACZ,iBAAiB;AAClB,qBAAA;iBACF,CAAA;;;;;;;;;ACtBD;MAmCa,iBAAiB,CAAA;;8GAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAjB,iBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,YAhB1B,YAAY;QACZ,mBAAmB;QACnB,2BAA2B;QAC3B,sBAAsB;QACtB,uBAAuB;QACvB,oBAAoB;QACpB,2BAA2B;QAC3B,cAAc;QACd,iBAAiB;AACjB,QAAA,mBAAmB,aAGnB,mBAAmB;QACnB,uBAAuB,CAAA,EAAA,CAAA,CAAA;AAGd,iBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,YAhB1B,YAAY;QACZ,mBAAmB;QACnB,2BAA2B;QAC3B,sBAAsB;QACtB,uBAAuB;QAGvB,cAAc;QACd,iBAAiB;QACjB,mBAAmB,CAAA,EAAA,CAAA,CAAA;2FAOV,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAlB7B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,2BAA2B;wBAC3B,sBAAsB;wBACtB,uBAAuB;wBACvB,oBAAoB;wBACpB,2BAA2B;wBAC3B,cAAc;wBACd,iBAAiB;wBACjB,mBAAmB;AACpB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,mBAAmB;wBACnB,uBAAuB;AACxB,qBAAA;iBACF,CAAA;;;AClCD;;AAEG;;;;"}
|
|
@@ -152,6 +152,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImpor
|
|
|
152
152
|
type: Directive
|
|
153
153
|
}] });
|
|
154
154
|
|
|
155
|
+
const CrisprDisplayFieldMixin = crisprControlMixin(CrisprFieldComponent);
|
|
156
|
+
// eslint-disable-next-line @angular-eslint/directive-class-suffix
|
|
157
|
+
class CrisprDisplayFieldComponent extends CrisprDisplayFieldMixin {
|
|
158
|
+
}
|
|
159
|
+
CrisprDisplayFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: CrisprDisplayFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
160
|
+
CrisprDisplayFieldComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: CrisprDisplayFieldComponent, usesInheritance: true, ngImport: i0 });
|
|
161
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: CrisprDisplayFieldComponent, decorators: [{
|
|
162
|
+
type: Directive
|
|
163
|
+
}] });
|
|
164
|
+
|
|
155
165
|
/**
|
|
156
166
|
* Analyze the config and build a form control to spec. Notice we don't use FormBuilder here
|
|
157
167
|
* as we want to keep this function pure.
|
|
@@ -265,5 +275,5 @@ function allowedFileType(matchExp) {
|
|
|
265
275
|
* Generated bundle index. Do not edit.
|
|
266
276
|
*/
|
|
267
277
|
|
|
268
|
-
export { AbstractAutocompleteComponent, ControlType, CrisprFieldComponent, DEFAULT_EMPTY_OPTIONS_MESSAGE, allowedFileExtValidator, allowedFileType, buildFormGroupFromConfig, callOptionsIfFunction, convertBytesToMb, createControlForType, crisprControlMixin, filterOptionsByLabel, isControlConfig, maxFileSizeValidator, observablifyOptions, valueIn };
|
|
278
|
+
export { AbstractAutocompleteComponent, ControlType, CrisprDisplayFieldComponent, CrisprFieldComponent, DEFAULT_EMPTY_OPTIONS_MESSAGE, allowedFileExtValidator, allowedFileType, buildFormGroupFromConfig, callOptionsIfFunction, convertBytesToMb, createControlForType, crisprControlMixin, filterOptionsByLabel, isControlConfig, maxFileSizeValidator, observablifyOptions, valueIn };
|
|
269
279
|
//# sourceMappingURL=tft-crispr-forms-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tft-crispr-forms-utils.mjs","sources":["../../../../libs/crispr-forms/utils/operators/form.operators.ts","../../../../libs/crispr-forms/utils/models/select-field.config.ts","../../../../libs/crispr-forms/utils/models/crispr-field.config.ts","../../../../libs/crispr-forms/utils/models/heading.config.ts","../../../../libs/crispr-forms/utils/abstracts/crispr-control.mixin.ts","../../../../libs/crispr-forms/utils/abstracts/crispr-field.abstract.ts","../../../../libs/crispr-forms/utils/functions/callOptionsIfFunction.ts","../../../../libs/crispr-forms/utils/functions/observablifyOptions.ts","../../../../libs/crispr-forms/utils/abstracts/autocomplete-field.abstract.ts","../../../../libs/crispr-forms/utils/functions/createControlForType.ts","../../../../libs/crispr-forms/utils/functions/isControlConfig.ts","../../../../libs/crispr-forms/utils/functions/buildFormGroupFromConfig.ts","../../../../libs/crispr-forms/utils/functions/filterOptionsByLabel.ts","../../../../libs/crispr-forms/utils/functions/image-compression.helpers.ts","../../../../libs/crispr-forms/utils/tft-crispr-forms-utils.ts"],"sourcesContent":["import { map } from 'rxjs/operators';\n\nexport function valueIn (values: string[]) {\n return map( (value: string) => {\n if (value) {\n return values.some(v => {\n if (isRegex(v)) {\n const trimmedStringForRegex = v.substr(1, v.length - 2);\n const regex = new RegExp(trimmedStringForRegex);\n return regex.test(value);\n } else {\n return v === value;\n }\n });\n } else {\n return false;\n }\n });\n}\n\nfunction isRegex(string: string) {\n return string.startsWith('/') && string.endsWith('/');\n}\n","import { Observable } from 'rxjs';\nimport { FormGroup } from '@angular/forms';\nimport { ControlType, FieldDescriptors, Info, MatFieldProperties, CrisprControlConfig } from './crispr-field.config';\n\nexport interface SelectFieldConfig extends Omit<CrisprControlConfig, 'placeholder'>,\n FieldDescriptors,\n MatFieldProperties {\n controlType: ControlType.SELECT,\n emptyOptionsMessage?: string;\n multiple?: boolean;\n enableToggleAll?: boolean;\n options: OptionsType;\n}\n\nexport type OptionsType = SelectOption[] | Observable<SelectOption[]> | OptionsCallback | Promise<SelectOption[]>;\n\nexport type OptionsCallback = (group?: FormGroup) => OptionsType;\nexport type ReactiveOptionsCallback = (group?: FormGroup) => Observable<SelectOption[]>;\n// tslint:disable-next-line: max-line-length\nexport type AutocompleteOptionsCallback = (group?: FormGroup, searchTerm?: string) => OptionsType;\nexport interface SelectOption {\n label: string;\n value: any;\n imageUrl?: string;\n info?: Info;\n}\n\nexport const DEFAULT_EMPTY_OPTIONS_MESSAGE = 'No Items';\n","import { FormGroup, ValidatorFn } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { TooltipPosition } from '@angular/material/tooltip';\nimport { MatFormFieldAppearance } from '@angular/material/form-field';\n\nimport { ErrorDictionary } from '@tft/form-validation-handler';\n\nimport type {\n SelectFieldConfig,\n HeadingConfig,\n ButtonConfig,\n DatepickerFieldConfig,\n InputFieldConfig,\n CheckboxFieldConfig,\n TextareaFieldConfig,\n AutocompleteFieldConfig,\n FormGroupListConfig,\n AutocompleteChiplistFieldConfig,\n SliderFieldConfig,\n DividerConfig,\n SelectOption,\n RadioFieldConfig,\n ImageUploadFieldConfig,\n FileUploadFieldConfig,\n UnitConversionFieldConfig\n} from '../models';\n\nimport { ThemePalette } from '@angular/material/core';\n\n// export type ControlType = keyof typeof FIELD_COMPONENTS;\nexport enum ControlType {\n AUTOCOMPLETE = 'autocomplete',\n AUTOCOMPLETE_CHIPLIST = 'autocompleteChiplist',\n BUTTON = 'button',\n CHECKBOX = 'checkbox',\n CUSTOM = 'custom',\n DATEPICKER = 'datepicker',\n DIVIDER = 'divider',\n FILE_UPLOAD = 'fileUpload',\n HEADING = 'heading',\n INPUT = 'input',\n IMAGE_UPLOAD = 'imageUpload',\n GROUP_LIST = 'groupList',\n RADIO = 'radio',\n SELECT = 'select',\n SLIDER = 'slider',\n SUB_GROUP = 'subGroup',\n TEXTAREA = 'textarea',\n UNIT_CONVERSION = 'unitConversion',\n}\n\n/**\n * The base interface for all the fields in the form's config\n */\nexport interface CrisprFieldConfig {\n controlType?: ControlType;\n classes?: string[];\n component?: any; // TODO: Define this better\n}\n\ntype RestrictedControlName<M> = M extends null ? string : keyof M;\n/**\n * The base interface for all control configs\n */\nexport interface CrisprControlConfig<M = null> extends CrisprFieldConfig {\n controlName: RestrictedControlName<M>\n controlType: ControlType;\n validators?: ValidatorFn[];\n computeValue?: (group: FormGroup) => Observable<unknown>;\n disabledCallback?: (group: FormGroup) => Observable<boolean>;\n /**\n * Hide the control when disabled\n * @default false\n */\n hideDisabled?: boolean;\n heading?: HeadingConfig;\n hint?: string;\n}\n\n/**\n * Holds properties for control fields that describe field behavior to users\n */\nexport interface FieldDescriptors {\n label: string;\n info?: Info;\n fieldSuffix?: string;\n placeholder?: string;\n}\n\nexport interface MatFieldProperties {\n appearance?: MatFormFieldAppearance;\n color?: ThemePalette;\n}\n\nexport interface Info {\n content: string;\n tooltipPosition?: TooltipPosition;\n iconName?: string;\n}\n\n// TODO: having AnyFieldConfig as the default for C seems redundant and silly\nexport interface AbstractGroupConfig<C extends CrisprFieldConfig = AnyFieldConfig> {\n // this union is needed, it joins any custom config provided by users to our default config options\n fields?: (AnyFieldConfig | C)[];\n}\nexport interface FormConfig<C = AnyFieldConfig> extends AbstractGroupConfig<C> {\n classes?: string[];\n errorDictionary?: ErrorDictionary;\n autoComplete?: string;\n /** @deprecated use autoComplete */\n autocomplete?: string;\n validators?: ValidatorFn[];\n}\n/**\n * Configuration for SubGroup components\n */\nexport interface SubGroupConfig extends CrisprControlConfig, AbstractGroupConfig<any> {\n controlType: ControlType.SUB_GROUP;\n}\n\nexport type AnyFieldConfig = InputFieldConfig\n | SelectFieldConfig\n | RadioFieldConfig\n | FormGroupListConfig\n | SubGroupConfig\n | AutocompleteFieldConfig\n | AutocompleteChiplistFieldConfig\n | TextareaFieldConfig\n | CheckboxFieldConfig\n | DatepickerFieldConfig\n | SliderFieldConfig\n | FileUploadFieldConfig\n | ImageUploadFieldConfig\n | HeadingConfig\n | ButtonConfig\n | DividerConfig\n | UnitConversionFieldConfig;\n // | CustomFieldConfig;\n\n\nexport type ControlValue<T = any> = boolean | string | number | Date | SelectOption | SelectOption[] | ControlGroupValue | T;\n\nexport type ControlGroupValue = {[key: string]: ControlValue};\n","import { FieldDescriptors, CrisprFieldConfig, ControlType } from './crispr-field.config';\n// This is done different from the rest of the fields because\n// when we use the heading inside of a field we don't want to have to\n// pass a controlType\nexport interface HeadingConfig extends\n Omit<CrisprFieldConfig, 'controlType'>,\n Omit<FieldDescriptors, 'placeholder' | 'fieldSuffix'> {\n // controlType is optional here because this component can be used as a crispr field where it needs a ControlType\n // or by a crispr field where it doesn't need a ControlType\n controlType?: ControlType.HEADING;\n typographyClass?: string;\n label: string;\n};\n","import { FormGroup, AbstractControl } from '@angular/forms';\nimport { CrisprControlConfig, ControlValue, ControlType } from '../models/crispr-field.config';\nimport { CrisprFieldComponent } from './crispr-field.abstract';\n\nexport function crisprControlMixin<C extends CrisprControlConfig>(BaseClass: typeof CrisprFieldComponent) {\n return class extends BaseClass<C> {\n config: C;\n group: FormGroup;\n control: AbstractControl;\n\n _value: ControlValue;\n set value(value: ControlValue) {\n this.setControlValue(value);\n this._value = value;\n }\n\n get value() {\n return this._value;\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.control = this.group.get(this.config.controlName);\n this.setControlValue(this.value);\n // setTimeouts are ugly but this seems to be the only way to get the computed field to compute initial values\n setTimeout(()=> {\n this.control.updateValueAndValidity();\n })\n }\n\n setControlValue(value: ControlValue) {\n if(value && this.control && this.config.controlType !== ControlType.SUB_GROUP) {\n this.control.setValue(value)\n }\n }\n }\n}\n","import type {\n CrisprFieldConfig,\n} from '../models';\nimport { OnInit, Directive } from '@angular/core';\n\n@Directive({\n standalone: true\n})\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class CrisprFieldComponent<C extends CrisprFieldConfig> implements OnInit {\n config: C;\n defaultConfig?: Partial<C>\n\n ngOnInit() {\n this.applyDefaultConfig();\n }\n\n applyDefaultConfig() {\n this.config = this.defaultConfig ? {...this.defaultConfig, ...this.config} : this.config;\n }\n}\n\n\n","import { FormGroup } from \"@angular/forms\";\nimport { AutocompleteOptionsCallback, OptionsType } from \"../models\";\n\nexport function callOptionsIfFunction(\n options: OptionsType | AutocompleteOptionsCallback,\n parentGroup?: FormGroup,\n searchString?: string\n): OptionsType {\n return options instanceof Function ? options(parentGroup, searchString) : options;\n}\n","import { FormGroup } from \"@angular/forms\";\nimport { from, isObservable, Observable, of } from \"rxjs\";\nimport { OptionsType, SelectOption } from \"../models\";\nimport { callOptionsIfFunction } from \"./callOptionsIfFunction\";\n\n/**\n * The user can give us select options as an array, a function that resolves to a promise,\n * or an observable. This functions consumes any of those and returns an observable that\n * resolves an array of options\n *\n * @param options the options passed in from the config\n * @param emptyMessageOption the message to display when the array is empty\n */\n export function observablifyOptions(\n options: OptionsType,\n parentGroup: FormGroup,\n searchString?: string,\n): Observable<SelectOption[]> {\n const calledOptions = callOptionsIfFunction(options, parentGroup, searchString);\n // if options are a promise\n const observableOptions = calledOptions instanceof Promise\n // convert to observable\n ? from(calledOptions)\n // if array that isn't empty\n : Array.isArray(calledOptions) && calledOptions.length\n // convert to observable\n ? of(calledOptions)\n // if observable\n : isObservable(calledOptions)\n // return it\n ? calledOptions\n // else an empty array\n : of([]);\n return observableOptions;\n}\n","import { OnInit, Directive } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map, shareReplay, startWith, switchMap } from 'rxjs/operators';\n\nimport { crisprControlMixin } from './crispr-control.mixin';\nimport type { AutocompleteFieldConfig, AutocompleteChiplistFieldConfig, SelectOption } from '../models';\nimport { CrisprFieldComponent } from './crispr-field.abstract';\nimport { observablifyOptions } from '../functions/observablifyOptions';\n\ntype AutocompleteConfigTypes = AutocompleteFieldConfig | AutocompleteChiplistFieldConfig;\n\nconst AbstractAutocompleteFieldMixin = crisprControlMixin<AutocompleteConfigTypes>(CrisprFieldComponent);\n\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport class AbstractAutocompleteComponent<C>\n extends AbstractAutocompleteFieldMixin implements OnInit {\n // we need a separate control for the UI because of the way the material autocomplete chiplist works\n autocompleteInputControl = new FormControl('');\n options$: Observable<SelectOption[]>\n config: AutocompleteConfigTypes & C;\n ngOnInit() {\n super.ngOnInit();\n\n this.group.addControl(this.config.controlName, new FormControl());\n // filter options by the search string using either the default filter function or one passed in through config\n this.options$ = this.autocompleteInputControl.valueChanges.pipe(\n // this is needed to have the options panel to open on focus\n startWith(''),\n debounceTime(this.config.typeDebounceTime),\n map((searchText: string) => typeof searchText === 'string' ? searchText?.trim() : ''),\n distinctUntilChanged(),\n switchMap((searchText: string) => observablifyOptions(this.config.options, this.group, searchText)),\n shareReplay(1),\n );\n }\n}\n","import { FormArray, FormControl } from \"@angular/forms\";\nimport { AnyFieldConfig, ControlType, ControlValue, CrisprControlConfig, FormConfig, FormGroupListConfig } from \"../models\";\nimport { buildFormGroupFromConfig } from \"./buildFormGroupFromConfig\";\n\n/**\n * Analyze the config and build a form control to spec. Notice we don't use FormBuilder here\n * as we want to keep this function pure.\n * @param controlConfig the configuration object for the control to build\n * @param value an initial value to use if passed in\n */\n export function createControlForType(controlConfig: AnyFieldConfig, value: ControlValue = null) {\n // build form control out based on the control type\n const control = controlConfig.controlType === ControlType.SUB_GROUP\n ? buildFormGroupFromConfig(controlConfig as FormConfig, value)\n : controlConfig.controlType === ControlType.GROUP_LIST\n ? new FormArray([], (controlConfig as FormGroupListConfig).validators)\n : new FormControl(\n value || null,\n (controlConfig as CrisprControlConfig).validators\n );\n\n return control;\n}\n","import { CrisprControlConfig, CrisprFieldConfig } from \"../models\";\n\n/**\n * Determines if the field config is for a form control (not a divider, heading or other non-control field)\n * */\n export function isControlConfig(fieldConfig: CrisprFieldConfig): fieldConfig is CrisprControlConfig {\n return 'controlName' in fieldConfig;\n}\n","import { FormGroup } from \"@angular/forms\";\nimport { AnyFieldConfig, FormConfig } from \"../models\";\nimport { createControlForType } from \"./createControlForType\";\nimport { isControlConfig } from \"./isControlConfig\";\n\n/**\n * builds out form group based on config\n * @param config a configuration for a form group\n * @param value an object of initial values to pass in\n * @param group the form group to modify and build out\n */\n export function buildFormGroupFromConfig(config: FormConfig, value = null, group: FormGroup = new FormGroup({}) ) {\n config.fields.forEach( (controlConfig: AnyFieldConfig) => {\n if (isControlConfig(controlConfig)) {\n // then add a control to the group using the controlName from configuration\n const {controlName} = controlConfig;\n if (group.get(controlName)) {\n group.removeControl(controlName);\n }\n // if there's a value object and it has a non-null/undefined value for this field use it.\n // Otherwise, default to null\n const controlValue = (value && value[controlName]) ?? null;\n const control = createControlForType(controlConfig, controlValue)\n group.addControl(controlName, control);\n }\n });\n group.setValidators(config.validators);\n return group;\n}\n","import { SelectOption } from \"../models\";\n\n/**\n * A basic filter function that filters the search string against the label of the options object\n * @param options the array of options to filter\n * @param searchString the string from the input\n */\n export function filterOptionsByLabel(options: SelectOption[], searchString: string) {\n return options.filter(option => {\n return option.label && option.label.toLowerCase().includes(searchString.toLowerCase());\n });\n}\n","import { FormControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\n\nexport function convertBytesToMb( bytes: number): number {\n return bytes/1048576;\n}\n\nexport function maxFileSizeValidator(maxFileSize: number): ValidatorFn {\n return (control: FormControl): ValidationErrors | null => {\n const controlValue = control.value;\n if (!(controlValue instanceof File)) {\n return null;\n }\n const actualFileSize = +convertBytesToMb(controlValue.size).toPrecision(3);\n if (maxFileSize > actualFileSize) return null;\n return {maxFileSize: { maxFileSize, actualFileSize }};\n }\n}\n\nexport function allowedFileExtValidator(allowedFileExtensions: string[], onlyAllowFiles = true): ValidatorFn {\n return (control: FormControl): ValidationErrors | null => {\n const controlValue = control.value;\n const isFile = controlValue instanceof File;\n if (!onlyAllowFiles && !isFile) return null;\n const actualExtension = isFile ? controlValue.name.split('.').pop().toLocaleLowerCase() : 'Not a file';\n const isAllowedExtension = allowedFileExtensions.includes(actualExtension);\n if(isAllowedExtension) {\n return null;\n }\n return {allowedExtension: { allowedFileExtensions, actualExtension }};\n }\n}\n\nexport function allowedFileType(matchExp: string | RegExp): ValidatorFn {\n return (formControl) => {\n const value = (formControl as FormControl).value;\n if (!(value instanceof File)) return null\n const type = value.type;\n const matches = type.match(matchExp)\n if (!type || !matches?.length) {\n return {\n allowedFileType: {\n actualType: type,\n allowedTypeExp: matchExp\n }\n }\n } else {\n return null\n }\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tft-crispr-forms-utils.mjs","sources":["../../../../libs/crispr-forms/utils/operators/form.operators.ts","../../../../libs/crispr-forms/utils/models/select-field.config.ts","../../../../libs/crispr-forms/utils/models/crispr-field.config.ts","../../../../libs/crispr-forms/utils/models/heading.config.ts","../../../../libs/crispr-forms/utils/abstracts/crispr-control.mixin.ts","../../../../libs/crispr-forms/utils/abstracts/crispr-field.abstract.ts","../../../../libs/crispr-forms/utils/functions/callOptionsIfFunction.ts","../../../../libs/crispr-forms/utils/functions/observablifyOptions.ts","../../../../libs/crispr-forms/utils/abstracts/autocomplete-field.abstract.ts","../../../../libs/crispr-forms/utils/abstracts/crispr-display-field.abstract.ts","../../../../libs/crispr-forms/utils/functions/createControlForType.ts","../../../../libs/crispr-forms/utils/functions/isControlConfig.ts","../../../../libs/crispr-forms/utils/functions/buildFormGroupFromConfig.ts","../../../../libs/crispr-forms/utils/functions/filterOptionsByLabel.ts","../../../../libs/crispr-forms/utils/functions/image-compression.helpers.ts","../../../../libs/crispr-forms/utils/tft-crispr-forms-utils.ts"],"sourcesContent":["import { map } from 'rxjs/operators';\n\nexport function valueIn (values: string[]) {\n return map( (value: string) => {\n if (value) {\n return values.some(v => {\n if (isRegex(v)) {\n const trimmedStringForRegex = v.substr(1, v.length - 2);\n const regex = new RegExp(trimmedStringForRegex);\n return regex.test(value);\n } else {\n return v === value;\n }\n });\n } else {\n return false;\n }\n });\n}\n\nfunction isRegex(string: string) {\n return string.startsWith('/') && string.endsWith('/');\n}\n","import { Observable } from 'rxjs';\nimport { FormGroup } from '@angular/forms';\nimport { ControlType, FieldDescriptors, Info, MatFieldProperties, CrisprControlConfig } from './crispr-field.config';\n\nexport interface SelectFieldConfig extends Omit<CrisprControlConfig, 'placeholder'>,\n FieldDescriptors,\n MatFieldProperties {\n controlType: ControlType.SELECT,\n emptyOptionsMessage?: string;\n multiple?: boolean;\n enableToggleAll?: boolean;\n options: OptionsType;\n}\n\nexport type OptionsType = SelectOption[] | Observable<SelectOption[]> | OptionsCallback | Promise<SelectOption[]>;\n\nexport type OptionsCallback = (group?: FormGroup) => OptionsType;\nexport type ReactiveOptionsCallback = (group?: FormGroup) => Observable<SelectOption[]>;\n// tslint:disable-next-line: max-line-length\nexport type AutocompleteOptionsCallback = (group?: FormGroup, searchTerm?: string) => OptionsType;\nexport interface SelectOption {\n label: string;\n value: any;\n imageUrl?: string;\n info?: Info;\n}\n\nexport const DEFAULT_EMPTY_OPTIONS_MESSAGE = 'No Items';\n","import { FormGroup, ValidatorFn } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { TooltipPosition } from '@angular/material/tooltip';\nimport { MatFormFieldAppearance } from '@angular/material/form-field';\n\nimport { ErrorDictionary } from '@tft/form-validation-handler';\n\nimport type {\n SelectFieldConfig,\n HeadingConfig,\n ButtonConfig,\n DatepickerFieldConfig,\n InputFieldConfig,\n CheckboxFieldConfig,\n TextareaFieldConfig,\n AutocompleteFieldConfig,\n FormGroupListConfig,\n AutocompleteChiplistFieldConfig,\n SliderFieldConfig,\n DividerConfig,\n SelectOption,\n RadioFieldConfig,\n ImageUploadFieldConfig,\n FileUploadFieldConfig,\n UnitConversionFieldConfig\n} from '../models';\n\nimport { ThemePalette } from '@angular/material/core';\n\n// export type ControlType = keyof typeof FIELD_COMPONENTS;\nexport enum ControlType {\n AUTOCOMPLETE = 'autocomplete',\n AUTOCOMPLETE_CHIPLIST = 'autocompleteChiplist',\n BUTTON = 'button',\n CHECKBOX = 'checkbox',\n CUSTOM = 'custom',\n DATEPICKER = 'datepicker',\n DIVIDER = 'divider',\n FILE_UPLOAD = 'fileUpload',\n HEADING = 'heading',\n INPUT = 'input',\n IMAGE_UPLOAD = 'imageUpload',\n GROUP_LIST = 'groupList',\n RADIO = 'radio',\n SELECT = 'select',\n SLIDER = 'slider',\n SUB_GROUP = 'subGroup',\n TEXTAREA = 'textarea',\n UNIT_CONVERSION = 'unitConversion',\n}\n\n/**\n * The base interface for all the fields in the form's config\n */\nexport interface CrisprFieldConfig {\n controlType?: ControlType;\n classes?: string[];\n component?: any; // TODO: Define this better\n}\n\ntype RestrictedControlName<M> = M extends null ? string : keyof M;\n/**\n * The base interface for all control configs\n */\nexport interface CrisprControlConfig<M = null> extends CrisprFieldConfig {\n controlName: RestrictedControlName<M>\n controlType: ControlType;\n validators?: ValidatorFn[];\n computeValue?: (group: FormGroup) => Observable<unknown>;\n disabledCallback?: (group: FormGroup) => Observable<boolean>;\n /**\n * Hide the control when disabled\n * @default false\n */\n hideDisabled?: boolean;\n heading?: HeadingConfig;\n hint?: string;\n}\n\n/**\n * Holds properties for control fields that describe field behavior to users\n */\nexport interface FieldDescriptors {\n label: string;\n info?: Info;\n fieldSuffix?: string;\n placeholder?: string;\n}\n\nexport interface MatFieldProperties {\n appearance?: MatFormFieldAppearance;\n color?: ThemePalette;\n}\n\nexport interface Info {\n content: string;\n tooltipPosition?: TooltipPosition;\n iconName?: string;\n}\n\n// TODO: having AnyFieldConfig as the default for C seems redundant and silly\nexport interface AbstractGroupConfig<C extends CrisprFieldConfig = AnyFieldConfig> {\n // this union is needed, it joins any custom config provided by users to our default config options\n fields?: (AnyFieldConfig | C)[];\n}\nexport interface FormConfig<C = AnyFieldConfig> extends AbstractGroupConfig<C> {\n classes?: string[];\n errorDictionary?: ErrorDictionary;\n autoComplete?: string;\n /** @deprecated use autoComplete */\n autocomplete?: string;\n validators?: ValidatorFn[];\n}\n/**\n * Configuration for SubGroup components\n */\nexport interface SubGroupConfig extends CrisprControlConfig, AbstractGroupConfig<any> {\n controlType: ControlType.SUB_GROUP;\n}\n\nexport type AnyFieldConfig = InputFieldConfig\n | SelectFieldConfig\n | RadioFieldConfig\n | FormGroupListConfig\n | SubGroupConfig\n | AutocompleteFieldConfig\n | AutocompleteChiplistFieldConfig\n | TextareaFieldConfig\n | CheckboxFieldConfig\n | DatepickerFieldConfig\n | SliderFieldConfig\n | FileUploadFieldConfig\n | ImageUploadFieldConfig\n | HeadingConfig\n | ButtonConfig\n | DividerConfig\n | UnitConversionFieldConfig;\n // | CustomFieldConfig;\n\n\nexport type ControlValue<T = any> = boolean | string | number | Date | SelectOption | SelectOption[] | ControlGroupValue | T;\n\nexport type ControlGroupValue = {[key: string]: ControlValue};\n","import { FieldDescriptors, CrisprFieldConfig, ControlType } from './crispr-field.config';\n// This is done different from the rest of the fields because\n// when we use the heading inside of a field we don't want to have to\n// pass a controlType\nexport interface HeadingConfig extends\n Omit<CrisprFieldConfig, 'controlType'>,\n Omit<FieldDescriptors, 'placeholder' | 'fieldSuffix'> {\n // controlType is optional here because this component can be used as a crispr field where it needs a ControlType\n // or by a crispr field where it doesn't need a ControlType\n controlType?: ControlType.HEADING;\n typographyClass?: string;\n label: string;\n};\n","import { FormGroup, AbstractControl } from '@angular/forms';\nimport { CrisprControlConfig, ControlValue, ControlType } from '../models/crispr-field.config';\nimport { CrisprFieldComponent } from './crispr-field.abstract';\n\nexport function crisprControlMixin<C extends CrisprControlConfig>(BaseClass: typeof CrisprFieldComponent) {\n return class extends BaseClass<C> {\n config: C;\n group: FormGroup;\n control: AbstractControl;\n\n _value: ControlValue;\n set value(value: ControlValue) {\n this.setControlValue(value);\n this._value = value;\n }\n\n get value() {\n return this._value;\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.control = this.group.get(this.config.controlName);\n this.setControlValue(this.value);\n // setTimeouts are ugly but this seems to be the only way to get the computed field to compute initial values\n setTimeout(()=> {\n this.control.updateValueAndValidity();\n })\n }\n\n setControlValue(value: ControlValue) {\n if(value && this.control && this.config.controlType !== ControlType.SUB_GROUP) {\n this.control.setValue(value)\n }\n }\n }\n}\n","import type {\n CrisprFieldConfig,\n} from '../models';\nimport { OnInit, Directive } from '@angular/core';\n\n@Directive({\n standalone: true\n})\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class CrisprFieldComponent<C extends CrisprFieldConfig> implements OnInit {\n config: C;\n defaultConfig?: Partial<C>\n\n ngOnInit() {\n this.applyDefaultConfig();\n }\n\n applyDefaultConfig() {\n this.config = this.defaultConfig ? {...this.defaultConfig, ...this.config} : this.config;\n }\n}\n\n\n","import { FormGroup } from \"@angular/forms\";\nimport { AutocompleteOptionsCallback, OptionsType } from \"../models\";\n\nexport function callOptionsIfFunction(\n options: OptionsType | AutocompleteOptionsCallback,\n parentGroup?: FormGroup,\n searchString?: string\n): OptionsType {\n return options instanceof Function ? options(parentGroup, searchString) : options;\n}\n","import { FormGroup } from \"@angular/forms\";\nimport { from, isObservable, Observable, of } from \"rxjs\";\nimport { OptionsType, SelectOption } from \"../models\";\nimport { callOptionsIfFunction } from \"./callOptionsIfFunction\";\n\n/**\n * The user can give us select options as an array, a function that resolves to a promise,\n * or an observable. This functions consumes any of those and returns an observable that\n * resolves an array of options\n *\n * @param options the options passed in from the config\n * @param emptyMessageOption the message to display when the array is empty\n */\n export function observablifyOptions(\n options: OptionsType,\n parentGroup: FormGroup,\n searchString?: string,\n): Observable<SelectOption[]> {\n const calledOptions = callOptionsIfFunction(options, parentGroup, searchString);\n // if options are a promise\n const observableOptions = calledOptions instanceof Promise\n // convert to observable\n ? from(calledOptions)\n // if array that isn't empty\n : Array.isArray(calledOptions) && calledOptions.length\n // convert to observable\n ? of(calledOptions)\n // if observable\n : isObservable(calledOptions)\n // return it\n ? calledOptions\n // else an empty array\n : of([]);\n return observableOptions;\n}\n","import { OnInit, Directive } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map, shareReplay, startWith, switchMap } from 'rxjs/operators';\n\nimport { crisprControlMixin } from './crispr-control.mixin';\nimport type { AutocompleteFieldConfig, AutocompleteChiplistFieldConfig, SelectOption } from '../models';\nimport { CrisprFieldComponent } from './crispr-field.abstract';\nimport { observablifyOptions } from '../functions/observablifyOptions';\n\ntype AutocompleteConfigTypes = AutocompleteFieldConfig | AutocompleteChiplistFieldConfig;\n\nconst AbstractAutocompleteFieldMixin = crisprControlMixin<AutocompleteConfigTypes>(CrisprFieldComponent);\n\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport class AbstractAutocompleteComponent<C>\n extends AbstractAutocompleteFieldMixin implements OnInit {\n // we need a separate control for the UI because of the way the material autocomplete chiplist works\n autocompleteInputControl = new FormControl('');\n options$: Observable<SelectOption[]>\n config: AutocompleteConfigTypes & C;\n ngOnInit() {\n super.ngOnInit();\n\n this.group.addControl(this.config.controlName, new FormControl());\n // filter options by the search string using either the default filter function or one passed in through config\n this.options$ = this.autocompleteInputControl.valueChanges.pipe(\n // this is needed to have the options panel to open on focus\n startWith(''),\n debounceTime(this.config.typeDebounceTime),\n map((searchText: string) => typeof searchText === 'string' ? searchText?.trim() : ''),\n distinctUntilChanged(),\n switchMap((searchText: string) => observablifyOptions(this.config.options, this.group, searchText)),\n shareReplay(1),\n );\n }\n}\n","import type {\n CrisprControlConfig,\n} from '../models';\nimport { OnInit, Directive } from '@angular/core';\nimport { CrisprFieldComponent } from './crispr-field.abstract';\nimport { crisprControlMixin } from './crispr-control.mixin';\n\nconst CrisprDisplayFieldMixin = crisprControlMixin<CrisprControlConfig>(CrisprFieldComponent);\n\n\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class CrisprDisplayFieldComponent extends CrisprDisplayFieldMixin implements OnInit {\n index?: number;\n}\n\n\n","import { FormArray, FormControl } from \"@angular/forms\";\nimport { AnyFieldConfig, ControlType, ControlValue, CrisprControlConfig, FormConfig, FormGroupListConfig } from \"../models\";\nimport { buildFormGroupFromConfig } from \"./buildFormGroupFromConfig\";\n\n/**\n * Analyze the config and build a form control to spec. Notice we don't use FormBuilder here\n * as we want to keep this function pure.\n * @param controlConfig the configuration object for the control to build\n * @param value an initial value to use if passed in\n */\n export function createControlForType(controlConfig: AnyFieldConfig, value: ControlValue = null) {\n // build form control out based on the control type\n const control = controlConfig.controlType === ControlType.SUB_GROUP\n ? buildFormGroupFromConfig(controlConfig as FormConfig, value)\n : controlConfig.controlType === ControlType.GROUP_LIST\n ? new FormArray([], (controlConfig as FormGroupListConfig).validators)\n : new FormControl(\n value || null,\n (controlConfig as CrisprControlConfig).validators\n );\n\n return control;\n}\n","import { CrisprControlConfig, CrisprFieldConfig } from \"../models\";\n\n/**\n * Determines if the field config is for a form control (not a divider, heading or other non-control field)\n * */\n export function isControlConfig(fieldConfig: CrisprFieldConfig): fieldConfig is CrisprControlConfig {\n return 'controlName' in fieldConfig;\n}\n","import { FormGroup } from \"@angular/forms\";\nimport { AnyFieldConfig, FormConfig } from \"../models\";\nimport { createControlForType } from \"./createControlForType\";\nimport { isControlConfig } from \"./isControlConfig\";\n\n/**\n * builds out form group based on config\n * @param config a configuration for a form group\n * @param value an object of initial values to pass in\n * @param group the form group to modify and build out\n */\n export function buildFormGroupFromConfig(config: FormConfig, value = null, group: FormGroup = new FormGroup({}) ) {\n config.fields.forEach( (controlConfig: AnyFieldConfig) => {\n if (isControlConfig(controlConfig)) {\n // then add a control to the group using the controlName from configuration\n const {controlName} = controlConfig;\n if (group.get(controlName)) {\n group.removeControl(controlName);\n }\n // if there's a value object and it has a non-null/undefined value for this field use it.\n // Otherwise, default to null\n const controlValue = (value && value[controlName]) ?? null;\n const control = createControlForType(controlConfig, controlValue)\n group.addControl(controlName, control);\n }\n });\n group.setValidators(config.validators);\n return group;\n}\n","import { SelectOption } from \"../models\";\n\n/**\n * A basic filter function that filters the search string against the label of the options object\n * @param options the array of options to filter\n * @param searchString the string from the input\n */\n export function filterOptionsByLabel(options: SelectOption[], searchString: string) {\n return options.filter(option => {\n return option.label && option.label.toLowerCase().includes(searchString.toLowerCase());\n });\n}\n","import { FormControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\n\nexport function convertBytesToMb( bytes: number): number {\n return bytes/1048576;\n}\n\nexport function maxFileSizeValidator(maxFileSize: number): ValidatorFn {\n return (control: FormControl): ValidationErrors | null => {\n const controlValue = control.value;\n if (!(controlValue instanceof File)) {\n return null;\n }\n const actualFileSize = +convertBytesToMb(controlValue.size).toPrecision(3);\n if (maxFileSize > actualFileSize) return null;\n return {maxFileSize: { maxFileSize, actualFileSize }};\n }\n}\n\nexport function allowedFileExtValidator(allowedFileExtensions: string[], onlyAllowFiles = true): ValidatorFn {\n return (control: FormControl): ValidationErrors | null => {\n const controlValue = control.value;\n const isFile = controlValue instanceof File;\n if (!onlyAllowFiles && !isFile) return null;\n const actualExtension = isFile ? controlValue.name.split('.').pop().toLocaleLowerCase() : 'Not a file';\n const isAllowedExtension = allowedFileExtensions.includes(actualExtension);\n if(isAllowedExtension) {\n return null;\n }\n return {allowedExtension: { allowedFileExtensions, actualExtension }};\n }\n}\n\nexport function allowedFileType(matchExp: string | RegExp): ValidatorFn {\n return (formControl) => {\n const value = (formControl as FormControl).value;\n if (!(value instanceof File)) return null\n const type = value.type;\n const matches = type.match(matchExp)\n if (!type || !matches?.length) {\n return {\n allowedFileType: {\n actualType: type,\n allowedTypeExp: matchExp\n }\n }\n } else {\n return null\n }\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|