@forge-form/angular 1.0.0 → 1.1.1
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/README.md
CHANGED
|
@@ -73,6 +73,18 @@ export class UserFormComponent {
|
|
|
73
73
|
}
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
+
### Reading live value and validity
|
|
77
|
+
|
|
78
|
+
`FormRendererComponent` exposes `value` and `valid` signals, readable via a
|
|
79
|
+
template reference variable without waiting for submit:
|
|
80
|
+
|
|
81
|
+
```html
|
|
82
|
+
<forge-form-angular #userForm [schema]="schema" (formSubmit)="onSubmit($event)" />
|
|
83
|
+
|
|
84
|
+
<pre>{{ userForm.value() | json }}</pre>
|
|
85
|
+
<span>Valid: {{ userForm.valid() }}</span>
|
|
86
|
+
```
|
|
87
|
+
|
|
76
88
|
## Styling
|
|
77
89
|
|
|
78
90
|
The package ships SCSS files. Import them once in your global stylesheet to get
|
|
@@ -87,6 +99,10 @@ the default layout and theme:
|
|
|
87
99
|
To enable the default theme, set `theme: 'default'` in the schema's `options`.
|
|
88
100
|
You can also skip the theme and style the `forge-*` CSS classes yourself.
|
|
89
101
|
|
|
102
|
+
Invalid, touched/dirty controls get an error class so you can style them even
|
|
103
|
+
without the default theme: `forge-form-input-error` on text/number/select
|
|
104
|
+
inputs, `forge-form-checkbox-error` on checkboxes.
|
|
105
|
+
|
|
90
106
|
## Schema reference
|
|
91
107
|
|
|
92
108
|
### `FormSchema`
|
|
@@ -96,7 +112,16 @@ You can also skip the theme and style the `forge-*` CSS classes yourself.
|
|
|
96
112
|
| `controls` | `(GroupFieldSchema \| ControlSchema)[]` | Top-level controls and groups. |
|
|
97
113
|
| `id` | `string` | Optional form id. |
|
|
98
114
|
| `updateOn` | `'change' \| 'blur' \| 'submit'` | When control values/validation update. |
|
|
99
|
-
| `options` | `FormOptions` | Layout
|
|
115
|
+
| `options` | `FormOptions` | Layout, theme, and submit button. |
|
|
116
|
+
|
|
117
|
+
### `FormOptions`
|
|
118
|
+
|
|
119
|
+
| Property | Type | Description |
|
|
120
|
+
| ------------------- | --------------------- | ------------------------------------------------------------------------------ |
|
|
121
|
+
| `orientation` | `'column' \| 'row'` | Layout of top-level controls. |
|
|
122
|
+
| `labelOrientation` | `'column' \| 'row'` | Default label placement, overridable per control. |
|
|
123
|
+
| `theme` | `'none' \| 'default'`| Activates the bundled default theme. |
|
|
124
|
+
| `hideSubmitButton` | `boolean` | Hides the built-in submit button, e.g. to provide your own outside the form. |
|
|
100
125
|
|
|
101
126
|
### Control types
|
|
102
127
|
|
|
@@ -3,8 +3,8 @@ import { InjectionToken, Inject, Injectable, inject, input, DestroyRef, signal,
|
|
|
3
3
|
import * as i1 from '@angular/forms';
|
|
4
4
|
import { ReactiveFormsModule, FormControl, FormGroup, Validators } from '@angular/forms';
|
|
5
5
|
import { NgComponentOutlet } from '@angular/common';
|
|
6
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
7
6
|
import { distinctUntilChanged, debounceTime } from 'rxjs';
|
|
7
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
8
|
|
|
9
9
|
const RENDERERS = new InjectionToken('RENDERERS');
|
|
10
10
|
class RendererRegistry {
|
|
@@ -297,6 +297,7 @@ class FormService {
|
|
|
297
297
|
formBuilder = inject(FormBuilderService);
|
|
298
298
|
form = signal(null, ...(ngDevMode ? [{ debugName: "form" }] : []));
|
|
299
299
|
value = signal(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
300
|
+
valid = signal(false, ...(ngDevMode ? [{ debugName: "valid" }] : []));
|
|
300
301
|
disabledByVisibility = new Set();
|
|
301
302
|
valueChangesSubscription;
|
|
302
303
|
init(formSchema) {
|
|
@@ -306,9 +307,14 @@ class FormService {
|
|
|
306
307
|
this.valueChangesSubscription?.unsubscribe();
|
|
307
308
|
const form = this.formBuilder.buildForm(formSchema);
|
|
308
309
|
this.form.set(form);
|
|
310
|
+
this.value.set(form.value);
|
|
311
|
+
this.valid.set(form.valid);
|
|
309
312
|
this.valueChangesSubscription = this.form()
|
|
310
313
|
.valueChanges.pipe(distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))
|
|
311
|
-
.subscribe(() =>
|
|
314
|
+
.subscribe(() => {
|
|
315
|
+
this.value.set(this.form().value);
|
|
316
|
+
this.valid.set(this.form().valid);
|
|
317
|
+
});
|
|
312
318
|
}
|
|
313
319
|
applyVisibility(controlSchema, visible, clearOnHide) {
|
|
314
320
|
const visibilitySchema = controlSchema.visibility;
|
|
@@ -379,6 +385,7 @@ class FormFieldComponent {
|
|
|
379
385
|
this.formOptions?.labelOrientation ??
|
|
380
386
|
ORIENTATION_OPTIONS.column, ...(ngDevMode ? [{ debugName: "labelOrientation" }] : []));
|
|
381
387
|
valueChanges = signal(null, ...(ngDevMode ? [{ debugName: "valueChanges" }] : []));
|
|
388
|
+
isValid = signal(false, ...(ngDevMode ? [{ debugName: "isValid" }] : []));
|
|
382
389
|
shouldApplyDelay = computed(() => this.controlSchema().updateOn === UPDATE_ON.change &&
|
|
383
390
|
this.controlSchema().type !== 'checkbox', ...(ngDevMode ? [{ debugName: "shouldApplyDelay" }] : []));
|
|
384
391
|
visibilityResolved = computed(() => {
|
|
@@ -412,9 +419,13 @@ class FormFieldComponent {
|
|
|
412
419
|
}
|
|
413
420
|
ngOnInit() {
|
|
414
421
|
debouncedValueChanges(this.control().valueChanges, this.shouldApplyDelay() ? this.VALUE_CHANGE_DELAY : 0, this.destroyRef).subscribe((value) => this.valueChanges.set(value));
|
|
422
|
+
this.isValid.set(this.control().valid);
|
|
423
|
+
this.control()
|
|
424
|
+
.statusChanges.pipe(distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))
|
|
425
|
+
.subscribe(() => this.isValid.set(this.control().valid));
|
|
415
426
|
}
|
|
416
427
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
417
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: FormFieldComponent, isStandalone: true, selector: "forge-form-field", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, controlSchema: { classPropertyName: "controlSchema", publicName: "controlSchema", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if (showControl()) {\r\n <div\r\n data-test=\"forge-form-field-container\"\r\n [class]=\"\r\n 'forge-form-field-container forge-form-field-container--' +\r\n labelOrientation()\r\n \"\r\n [style.width]=\"controlSchema().options?.width || 'auto'\">\r\n @if (controlSchema().label) {\r\n <span class=\"forge-form-field-label\" data-test=\"forge-form-field-label\">\r\n {{ controlSchema().label }}\r\n </span>\r\n }\r\n\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n componentType();\r\n inputs: {\r\n control: control(),\r\n controlSchema: controlSchema(),\r\n }\r\n \" />\r\n\r\n <forge-form-hint-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n\r\n <forge-form-error-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n </div>\r\n}\r\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: ErrorRendererComponent, selector: "forge-form-error-renderer", inputs: ["control", "controlSchema"] }, { kind: "component", type: HintRendererComponent, selector: "forge-form-hint-renderer", inputs: ["control", "controlSchema"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
428
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: FormFieldComponent, isStandalone: true, selector: "forge-form-field", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, controlSchema: { classPropertyName: "controlSchema", publicName: "controlSchema", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if (showControl()) {\r\n <div\r\n data-test=\"forge-form-field-container\"\r\n [class]=\"\r\n 'forge-form-field-container forge-form-field-container--' +\r\n labelOrientation()\r\n \"\r\n [style.width]=\"controlSchema().options?.width || 'auto'\">\r\n @if (controlSchema().label) {\r\n <span class=\"forge-form-field-label\" data-test=\"forge-form-field-label\">\r\n {{ controlSchema().label }}\r\n </span>\r\n }\r\n\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n componentType();\r\n inputs: {\r\n control: control(),\r\n controlSchema: controlSchema(),\r\n isValid: isValid(),\r\n }\r\n \" />\r\n\r\n <forge-form-hint-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n\r\n <forge-form-error-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n </div>\r\n}\r\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: ErrorRendererComponent, selector: "forge-form-error-renderer", inputs: ["control", "controlSchema"] }, { kind: "component", type: HintRendererComponent, selector: "forge-form-hint-renderer", inputs: ["control", "controlSchema"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
418
429
|
}
|
|
419
430
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FormFieldComponent, decorators: [{
|
|
420
431
|
type: Component,
|
|
@@ -423,16 +434,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
423
434
|
NgComponentOutlet,
|
|
424
435
|
ErrorRendererComponent,
|
|
425
436
|
HintRendererComponent,
|
|
426
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showControl()) {\r\n <div\r\n data-test=\"forge-form-field-container\"\r\n [class]=\"\r\n 'forge-form-field-container forge-form-field-container--' +\r\n labelOrientation()\r\n \"\r\n [style.width]=\"controlSchema().options?.width || 'auto'\">\r\n @if (controlSchema().label) {\r\n <span class=\"forge-form-field-label\" data-test=\"forge-form-field-label\">\r\n {{ controlSchema().label }}\r\n </span>\r\n }\r\n\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n componentType();\r\n inputs: {\r\n control: control(),\r\n controlSchema: controlSchema(),\r\n }\r\n \" />\r\n\r\n <forge-form-hint-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n\r\n <forge-form-error-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n </div>\r\n}\r\n" }]
|
|
437
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showControl()) {\r\n <div\r\n data-test=\"forge-form-field-container\"\r\n [class]=\"\r\n 'forge-form-field-container forge-form-field-container--' +\r\n labelOrientation()\r\n \"\r\n [style.width]=\"controlSchema().options?.width || 'auto'\">\r\n @if (controlSchema().label) {\r\n <span class=\"forge-form-field-label\" data-test=\"forge-form-field-label\">\r\n {{ controlSchema().label }}\r\n </span>\r\n }\r\n\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n componentType();\r\n inputs: {\r\n control: control(),\r\n controlSchema: controlSchema(),\r\n isValid: isValid(),\r\n }\r\n \" />\r\n\r\n <forge-form-hint-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n\r\n <forge-form-error-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n </div>\r\n}\r\n" }]
|
|
427
438
|
}], ctorParameters: () => [], propDecorators: { control: [{ type: i0.Input, args: [{ isSignal: true, alias: "control", required: true }] }], controlSchema: [{ type: i0.Input, args: [{ isSignal: true, alias: "controlSchema", required: true }] }] } });
|
|
428
439
|
|
|
429
440
|
class TextRendererComponent {
|
|
430
441
|
control;
|
|
431
442
|
controlSchema;
|
|
443
|
+
isValid;
|
|
432
444
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: TextRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
433
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: TextRendererComponent, isStandalone: true, selector: "forge-form-text-renderer", inputs: { control: "control", controlSchema: "controlSchema" }, ngImport: i0, template: `
|
|
445
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: TextRendererComponent, isStandalone: true, selector: "forge-form-text-renderer", inputs: { control: "control", controlSchema: "controlSchema", isValid: "isValid" }, ngImport: i0, template: `
|
|
434
446
|
<input
|
|
435
447
|
class="forge-form-input"
|
|
448
|
+
[class.forge-form-input-error]="!isValid && control.touched"
|
|
436
449
|
data-test="text-input"
|
|
437
450
|
[attr.id]="controlSchema.controlName"
|
|
438
451
|
[formControl]="control"
|
|
@@ -446,6 +459,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
446
459
|
template: `
|
|
447
460
|
<input
|
|
448
461
|
class="forge-form-input"
|
|
462
|
+
[class.forge-form-input-error]="!isValid && control.touched"
|
|
449
463
|
data-test="text-input"
|
|
450
464
|
[attr.id]="controlSchema.controlName"
|
|
451
465
|
[formControl]="control"
|
|
@@ -458,15 +472,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
458
472
|
type: Input
|
|
459
473
|
}], controlSchema: [{
|
|
460
474
|
type: Input
|
|
475
|
+
}], isValid: [{
|
|
476
|
+
type: Input
|
|
461
477
|
}] } });
|
|
462
478
|
|
|
463
479
|
class NumberRendererComponent {
|
|
464
480
|
control;
|
|
465
481
|
controlSchema;
|
|
482
|
+
isValid;
|
|
466
483
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: NumberRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
467
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: NumberRendererComponent, isStandalone: true, selector: "forge-form-number-renderer", inputs: { control: "control", controlSchema: "controlSchema" }, ngImport: i0, template: `
|
|
484
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: NumberRendererComponent, isStandalone: true, selector: "forge-form-number-renderer", inputs: { control: "control", controlSchema: "controlSchema", isValid: "isValid" }, ngImport: i0, template: `
|
|
468
485
|
<input
|
|
469
486
|
class="forge-form-input"
|
|
487
|
+
[class.forge-form-input-error]="!isValid && control.touched"
|
|
470
488
|
data-test="number-input"
|
|
471
489
|
type="number"
|
|
472
490
|
[attr.id]="controlSchema.controlName"
|
|
@@ -483,6 +501,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
483
501
|
template: `
|
|
484
502
|
<input
|
|
485
503
|
class="forge-form-input"
|
|
504
|
+
[class.forge-form-input-error]="!isValid && control.touched"
|
|
486
505
|
data-test="number-input"
|
|
487
506
|
type="number"
|
|
488
507
|
[attr.id]="controlSchema.controlName"
|
|
@@ -498,15 +517,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
498
517
|
type: Input
|
|
499
518
|
}], controlSchema: [{
|
|
500
519
|
type: Input
|
|
520
|
+
}], isValid: [{
|
|
521
|
+
type: Input
|
|
501
522
|
}] } });
|
|
502
523
|
|
|
503
524
|
class CheckboxRendererComponent {
|
|
504
525
|
control;
|
|
505
526
|
controlSchema;
|
|
527
|
+
isValid;
|
|
506
528
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CheckboxRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
507
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: CheckboxRendererComponent, isStandalone: true, selector: "forge-form-checkbox-renderer", inputs: { control: "control", controlSchema: "controlSchema" }, ngImport: i0, template: `
|
|
529
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: CheckboxRendererComponent, isStandalone: true, selector: "forge-form-checkbox-renderer", inputs: { control: "control", controlSchema: "controlSchema", isValid: "isValid" }, ngImport: i0, template: `
|
|
508
530
|
<input
|
|
509
531
|
class="forge-form-checkbox"
|
|
532
|
+
[class.forge-form-checkbox-error]="!isValid && control.dirty"
|
|
510
533
|
data-test="checkbox-input"
|
|
511
534
|
type="checkbox"
|
|
512
535
|
[attr.id]="controlSchema.controlName"
|
|
@@ -520,6 +543,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
520
543
|
template: `
|
|
521
544
|
<input
|
|
522
545
|
class="forge-form-checkbox"
|
|
546
|
+
[class.forge-form-checkbox-error]="!isValid && control.dirty"
|
|
523
547
|
data-test="checkbox-input"
|
|
524
548
|
type="checkbox"
|
|
525
549
|
[attr.id]="controlSchema.controlName"
|
|
@@ -532,15 +556,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
532
556
|
type: Input
|
|
533
557
|
}], controlSchema: [{
|
|
534
558
|
type: Input
|
|
559
|
+
}], isValid: [{
|
|
560
|
+
type: Input
|
|
535
561
|
}] } });
|
|
536
562
|
|
|
537
563
|
class SelectRendererComponent {
|
|
538
564
|
control;
|
|
539
565
|
controlSchema;
|
|
566
|
+
isValid;
|
|
540
567
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: SelectRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
541
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: SelectRendererComponent, isStandalone: true, selector: "forge-form-select-renderer", inputs: { control: "control", controlSchema: "controlSchema" }, ngImport: i0, template: `
|
|
568
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: SelectRendererComponent, isStandalone: true, selector: "forge-form-select-renderer", inputs: { control: "control", controlSchema: "controlSchema", isValid: "isValid" }, ngImport: i0, template: `
|
|
542
569
|
<select
|
|
543
570
|
class="forge-form-select"
|
|
571
|
+
[class.forge-form-input-error]="!isValid && control.touched"
|
|
544
572
|
data-test="select-input"
|
|
545
573
|
[attr.id]="controlSchema.controlName"
|
|
546
574
|
[formControl]="control">
|
|
@@ -565,6 +593,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
565
593
|
template: `
|
|
566
594
|
<select
|
|
567
595
|
class="forge-form-select"
|
|
596
|
+
[class.forge-form-input-error]="!isValid && control.touched"
|
|
568
597
|
data-test="select-input"
|
|
569
598
|
[attr.id]="controlSchema.controlName"
|
|
570
599
|
[formControl]="control">
|
|
@@ -588,6 +617,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
588
617
|
type: Input
|
|
589
618
|
}], controlSchema: [{
|
|
590
619
|
type: Input
|
|
620
|
+
}], isValid: [{
|
|
621
|
+
type: Input
|
|
591
622
|
}] } });
|
|
592
623
|
|
|
593
624
|
class GroupRendererComponent {
|
|
@@ -677,6 +708,8 @@ class FormRendererComponent {
|
|
|
677
708
|
formSubmit = output();
|
|
678
709
|
THEMES = THEMES;
|
|
679
710
|
formSignal = this.formService.form;
|
|
711
|
+
value = computed(() => this.formService.value(), ...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
712
|
+
valid = computed(() => this.formService.valid(), ...(ngDevMode ? [{ debugName: "valid" }] : []));
|
|
680
713
|
constructor() {
|
|
681
714
|
effect(() => {
|
|
682
715
|
this.formService.init(this.schema());
|
|
@@ -738,7 +771,7 @@ class FormRendererComponent {
|
|
|
738
771
|
multi: true,
|
|
739
772
|
},
|
|
740
773
|
{ provide: DEFAULT_ERROR_FALLBACK, useValue: 'Invalid field', multi: true },
|
|
741
|
-
], ngImport: i0, template: "@if (!!formSignal()) {\r\n <form\r\n [class]=\"'forge-form forge-form--' + schema().options?.orientation\"\r\n [class.forge-theme-default]=\"schema().options?.theme === THEMES.default\"\r\n [formGroup]=\"formSignal()!\"\r\n (ngSubmit)=\"onSubmit()\"\r\n data-test=\"form\">\r\n @for (subjectSchema of schema().controls; track subjectSchema) {\r\n @if (subjectSchema.type === 'group') {\r\n <forge-form-group-renderer\r\n data-test=\"group-renderer\"\r\n [form]=\"formSignal()!\"\r\n [schema]=\"subjectSchema\" />\r\n } @else {\r\n <forge-form-field\r\n data-test=\"form-field\"\r\n [controlSchema]=\"subjectSchema\"\r\n [control]=\"formSignal()!.get(subjectSchema.controlName)!\" />\r\n }\r\n }\r\n\r\n <button\r\n
|
|
774
|
+
], ngImport: i0, template: "@if (!!formSignal()) {\r\n <form\r\n [class]=\"'forge-form forge-form--' + schema().options?.orientation\"\r\n [class.forge-theme-default]=\"schema().options?.theme === THEMES.default\"\r\n [formGroup]=\"formSignal()!\"\r\n (ngSubmit)=\"onSubmit()\"\r\n data-test=\"form\">\r\n @for (subjectSchema of schema().controls; track subjectSchema) {\r\n @if (subjectSchema.type === 'group') {\r\n <forge-form-group-renderer\r\n data-test=\"group-renderer\"\r\n [form]=\"formSignal()!\"\r\n [schema]=\"subjectSchema\" />\r\n } @else {\r\n <forge-form-field\r\n data-test=\"form-field\"\r\n [controlSchema]=\"subjectSchema\"\r\n [control]=\"formSignal()!.get(subjectSchema.controlName)!\" />\r\n }\r\n }\r\n\r\n @if (!schema().options?.hideSubmitButton) {\r\n <button\r\n class=\"forge-form-button\"\r\n [disabled]=\"!formSignal()?.valid\"\r\n data-test=\"submit-button\"\r\n type=\"submit\">\r\n Submit\r\n </button>\r\n }\r\n </form>\r\n}\r\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FormFieldComponent, selector: "forge-form-field", inputs: ["control", "controlSchema"] }, { kind: "component", type: GroupRendererComponent, selector: "forge-form-group-renderer", inputs: ["form", "schema"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
742
775
|
}
|
|
743
776
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: FormRendererComponent, decorators: [{
|
|
744
777
|
type: Component,
|
|
@@ -789,7 +822,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
789
822
|
multi: true,
|
|
790
823
|
},
|
|
791
824
|
{ provide: DEFAULT_ERROR_FALLBACK, useValue: 'Invalid field', multi: true },
|
|
792
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!!formSignal()) {\r\n <form\r\n [class]=\"'forge-form forge-form--' + schema().options?.orientation\"\r\n [class.forge-theme-default]=\"schema().options?.theme === THEMES.default\"\r\n [formGroup]=\"formSignal()!\"\r\n (ngSubmit)=\"onSubmit()\"\r\n data-test=\"form\">\r\n @for (subjectSchema of schema().controls; track subjectSchema) {\r\n @if (subjectSchema.type === 'group') {\r\n <forge-form-group-renderer\r\n data-test=\"group-renderer\"\r\n [form]=\"formSignal()!\"\r\n [schema]=\"subjectSchema\" />\r\n } @else {\r\n <forge-form-field\r\n data-test=\"form-field\"\r\n [controlSchema]=\"subjectSchema\"\r\n [control]=\"formSignal()!.get(subjectSchema.controlName)!\" />\r\n }\r\n }\r\n\r\n <button\r\n
|
|
825
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!!formSignal()) {\r\n <form\r\n [class]=\"'forge-form forge-form--' + schema().options?.orientation\"\r\n [class.forge-theme-default]=\"schema().options?.theme === THEMES.default\"\r\n [formGroup]=\"formSignal()!\"\r\n (ngSubmit)=\"onSubmit()\"\r\n data-test=\"form\">\r\n @for (subjectSchema of schema().controls; track subjectSchema) {\r\n @if (subjectSchema.type === 'group') {\r\n <forge-form-group-renderer\r\n data-test=\"group-renderer\"\r\n [form]=\"formSignal()!\"\r\n [schema]=\"subjectSchema\" />\r\n } @else {\r\n <forge-form-field\r\n data-test=\"form-field\"\r\n [controlSchema]=\"subjectSchema\"\r\n [control]=\"formSignal()!.get(subjectSchema.controlName)!\" />\r\n }\r\n }\r\n\r\n @if (!schema().options?.hideSubmitButton) {\r\n <button\r\n class=\"forge-form-button\"\r\n [disabled]=\"!formSignal()?.valid\"\r\n data-test=\"submit-button\"\r\n type=\"submit\">\r\n Submit\r\n </button>\r\n }\r\n </form>\r\n}\r\n" }]
|
|
793
826
|
}], ctorParameters: () => [], propDecorators: { schema: [{ type: i0.Input, args: [{ isSignal: true, alias: "schema", required: true }] }], formSubmit: [{ type: i0.Output, args: ["formSubmit"] }] } });
|
|
794
827
|
|
|
795
828
|
class FormFieldContextComponent {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forge-form-angular.mjs","sources":["../../../projects/forge-form-angular/src/lib/engine/renderer-template-registry/renderer-template.registry.ts","../../../projects/forge-form-angular/src/lib/schema/form-options-token.ts","../../../projects/forge-form-angular/src/lib/schema/form-options.model.ts","../../../projects/forge-form-angular/src/lib/utils/debouncedSignal.ts","../../../projects/forge-form-angular/src/lib/schema/update-on.model.ts","../../../projects/forge-form-angular/src/lib/engine/validators/validator-schema.model.ts","../../../projects/forge-form-angular/src/lib/engine/error-messages/error-messages.registry.ts","../../../projects/forge-form-angular/src/lib/engine/error-messages/error-messages.service.ts","../../../projects/forge-form-angular/src/lib/engine/error-renderer/error-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/error-renderer/error-renderer.component.html","../../../projects/forge-form-angular/src/lib/engine/hint-messages/hint-messages.service.ts","../../../projects/forge-form-angular/src/lib/engine/hint-renderer/hint-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/hint-renderer/hint-renderer.component.html","../../../projects/forge-form-angular/src/lib/services/form-builder.service.ts","../../../projects/forge-form-angular/src/lib/schema/visibility.model.ts","../../../projects/forge-form-angular/src/lib/engine/form-renderer/form.service.ts","../../../projects/forge-form-angular/src/lib/engine/form-field/form-field.component.ts","../../../projects/forge-form-angular/src/lib/engine/form-field/form-field.component.html","../../../projects/forge-form-angular/src/lib/engine/form-field-renderers/text-field-renderer/text-field-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/form-field-renderers/number-field-renderer/number-field-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/form-field-renderers/checkbox-field-renderer/checkbox-field-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/form-field-renderers/select-field-renderer/select-field-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/group-renderer/group-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/group-renderer/group-renderer.component.html","../../../projects/forge-form-angular/src/lib/engine/form-renderer/form-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/form-renderer/form-renderer.component.html","../../../projects/forge-form-angular/src/lib/engine/form-field/form-field-context.component.ts","../../../projects/forge-form-angular/src/lib/engine/validators/validator-helpers.ts","../../../projects/forge-form-angular/src/lib/engine/hint-messages/hint-messages.model.ts","../../../projects/forge-form-angular/src/public-api.ts","../../../projects/forge-form-angular/src/forge-form-angular.ts"],"sourcesContent":["import { Inject, Injectable, InjectionToken, Type } from '@angular/core';\r\nimport { FieldRenderer } from '../../schema/form-control.model';\r\n\r\nexport interface RendererDef {\r\n type: string;\r\n component: Type<FieldRenderer>;\r\n}\r\n\r\nexport const RENDERERS = new InjectionToken<RendererDef[]>('RENDERERS');\r\n\r\n@Injectable()\r\nexport class RendererRegistry {\r\n private map = new Map<string, Type<FieldRenderer>>();\r\n\r\n // eslint-disable-next-line @angular-eslint/prefer-inject\r\n constructor(@Inject(RENDERERS) renderers: RendererDef[][] = []) {\r\n renderers.flat().forEach((r) => {\r\n this.map.set(r.type, r.component);\r\n });\r\n }\r\n\r\n get(type: string): Type<FieldRenderer> {\r\n const cmp = this.map.get(type);\r\n if (!cmp) {\r\n throw new Error(`No renderer for type: ${type}`);\r\n }\r\n return cmp;\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { FormOptions } from './form-options.model';\r\n\r\nexport const FORM_OPTIONS = new InjectionToken<FormOptions>('FORM_OPTIONS');\r\n","export const ORIENTATION_OPTIONS = {\r\n row: 'row',\r\n column: 'column',\r\n} as const;\r\nexport type OrientationOption =\r\n (typeof ORIENTATION_OPTIONS)[keyof typeof ORIENTATION_OPTIONS];\r\n\r\nexport const THEMES = {\r\n none: 'none',\r\n default: 'default',\r\n} as const;\r\nexport type ThemeOption = (typeof THEMES)[keyof typeof THEMES];\r\n\r\ninterface BaseFormOptions {\r\n orientation?: OrientationOption;\r\n labelOrientation?: OrientationOption;\r\n}\r\n\r\nexport interface FormOptions extends BaseFormOptions {\r\n theme?: ThemeOption;\r\n}\r\n\r\nexport type ElementFormOptions = BaseFormOptions;\r\n\r\nexport interface FormFieldOptions extends BaseFormOptions {\r\n width?: number | string;\r\n}\r\n","import { DestroyRef } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { debounceTime, distinctUntilChanged, Observable } from 'rxjs';\r\n\r\nexport const debouncedValueChanges = <T>(\r\n valueChanges: Observable<T>,\r\n time = 0,\r\n destroyRef: DestroyRef,\r\n) =>\r\n valueChanges.pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(destroyRef),\r\n debounceTime(time),\r\n );\r\n","export const UPDATE_ON = {\r\n change: 'change',\r\n blur: 'blur',\r\n submit: 'submit',\r\n} as const;\r\nexport type UpdateOn = (typeof UPDATE_ON)[keyof typeof UPDATE_ON];\r\n","import { AbstractControl, ValidationErrors } from '@angular/forms';\r\nimport { ErrorMessageContent } from '../error-messages/error-messages.model';\r\n\r\nexport type ValidatorSchema =\r\n | RequiredValidatorSchema\r\n | MinLengthValidatorSchema\r\n | MaxLengthValidatorSchema\r\n | MinValidatorSchema\r\n | MaxValidatorSchema\r\n | CustomValidatorSchema;\r\n\r\nexport const VALIDATOR_TYPES = {\r\n required: 'required',\r\n minlength: 'minlength',\r\n maxlength: 'maxlength',\r\n min: 'min',\r\n max: 'max',\r\n custom: 'custom',\r\n} as const;\r\nexport type ValidatorType =\r\n (typeof VALIDATOR_TYPES)[keyof typeof VALIDATOR_TYPES];\r\n\r\nexport interface BaseValidatorSchema {\r\n type: ValidatorType;\r\n errorMessage?: ErrorMessageContent;\r\n}\r\n\r\nexport interface RequiredValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.required;\r\n}\r\n\r\nexport interface MinLengthValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.minlength;\r\n value: number;\r\n}\r\n\r\nexport interface MaxLengthValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.maxlength;\r\n value: number;\r\n}\r\n\r\nexport interface MinValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.min;\r\n value: number;\r\n}\r\n\r\nexport interface MaxValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.max;\r\n value: number;\r\n}\r\n\r\nexport interface CustomValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.custom;\r\n key: string;\r\n fn: ValidatorFunction;\r\n}\r\n\r\nexport type ValidatorFunction = (\r\n control: AbstractControl,\r\n) => ValidationErrors | null;\r\n","import { Inject, Injectable, InjectionToken } from '@angular/core';\r\nimport {\r\n VALIDATOR_TYPES,\r\n ValidatorType,\r\n} from '../validators/validator-schema.model';\r\nimport { ErrorMessage, ErrorMessageContent } from './error-messages.model';\r\n\r\nexport const ERROR_MESSAGES = new InjectionToken<ErrorMessage[]>(\r\n 'ERROR_MESSAGES',\r\n);\r\n\r\nexport const DEFAULT_ERROR_FALLBACK = new InjectionToken<string>(\r\n 'DEFAULT_ERROR_FALLBACK',\r\n);\r\n\r\nexport const DEFAULT_ERROR_MESSAGES: ErrorMessage[] = [\r\n {\r\n type: VALIDATOR_TYPES.required,\r\n message: () => 'This field is required',\r\n },\r\n {\r\n type: VALIDATOR_TYPES.minlength,\r\n message: (err) => `Minimum length is ${err['requiredLength']}`,\r\n },\r\n {\r\n type: VALIDATOR_TYPES.maxlength,\r\n message: (err) => `Maximum length is ${err['requiredLength']}`,\r\n },\r\n {\r\n type: VALIDATOR_TYPES.min,\r\n message: (err) => `Minimum value is ${err['min']}`,\r\n },\r\n {\r\n type: VALIDATOR_TYPES.max,\r\n message: (err) => `Maximum value is ${err['max']}`,\r\n },\r\n];\r\n\r\n@Injectable()\r\nexport class ErrorMessageRegistry {\r\n private map = new Map<ValidatorType, ErrorMessageContent>();\r\n\r\n // eslint-disable-next-line @angular-eslint/prefer-inject\r\n constructor(@Inject(ERROR_MESSAGES) defs: ErrorMessage[][] = []) {\r\n defs.flat().forEach((def) => {\r\n this.map.set(def.type, def.message);\r\n });\r\n }\r\n\r\n get(type: ValidatorType): ErrorMessageContent | null {\r\n return this.map.get(type) ?? null;\r\n }\r\n}\r\n","import { inject, Injectable, Type } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport {\r\n CustomValidatorSchema,\r\n VALIDATOR_TYPES,\r\n ValidatorSchema,\r\n} from '../validators/validator-schema.model';\r\nimport {\r\n DEFAULT_ERROR_FALLBACK,\r\n ErrorMessageRegistry,\r\n} from './error-messages.registry';\r\nimport { ErrorMessageContent } from './error-messages.model';\r\nimport { ValidationError } from '@angular/forms/signals';\r\n\r\nexport type ResolvedError =\r\n | { type: 'text'; message: string }\r\n | {\r\n type: 'component';\r\n component: Type<unknown>;\r\n inputs?: Record<string, unknown>;\r\n };\r\n\r\n@Injectable()\r\nexport class ErrorMessageService {\r\n private readonly registry = inject(ErrorMessageRegistry);\r\n private readonly defaultFallback = inject(DEFAULT_ERROR_FALLBACK);\r\n\r\n getErrors(\r\n control: AbstractControl,\r\n validators: ValidatorSchema[],\r\n ): ResolvedError[] {\r\n if (!control.errors) return [];\r\n\r\n return Object.entries(control.errors).map(([errorKey, errorValue]) => {\r\n const validatorSchema = this.getValidatorSchema(errorKey, validators);\r\n\r\n const content =\r\n validatorSchema?.errorMessage ??\r\n this.registry.get(errorKey as ValidatorSchema['type']);\r\n\r\n if (!content) {\r\n return { type: 'text', message: this.defaultFallback };\r\n }\r\n\r\n return this.resolveContent(content, errorValue);\r\n });\r\n }\r\n\r\n private getValidatorSchema(\r\n errorKey: ValidatorSchema['type'] | CustomValidatorSchema['key'],\r\n validators: ValidatorSchema[],\r\n ): ValidatorSchema | undefined {\r\n return validators.find((validator) =>\r\n validator.type !== VALIDATOR_TYPES.custom\r\n ? validator.type === errorKey\r\n : validator.key === errorKey,\r\n );\r\n }\r\n\r\n private resolveContent(\r\n content: ErrorMessageContent,\r\n errorValue: ValidationError,\r\n ): ResolvedError {\r\n if (typeof content === 'string') {\r\n return { type: 'text', message: content };\r\n }\r\n\r\n if (typeof content === 'function') {\r\n return { type: 'text', message: content(errorValue) };\r\n }\r\n\r\n return {\r\n type: 'component',\r\n component: content.component,\r\n inputs: content.inputs?.(errorValue),\r\n };\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n inject,\r\n OnInit,\r\n DestroyRef,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n ReactiveFormsModule,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport { ControlSchema } from '../../schema/form-control.model';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { distinctUntilChanged } from 'rxjs';\r\nimport { ErrorMessageService } from '../error-messages/error-messages.service';\r\nimport { ErrorMessageRegistry } from '../error-messages/error-messages.registry';\r\nimport { NgComponentOutlet } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'forge-form-error-renderer',\r\n templateUrl: './error-renderer.component.html',\r\n imports: [ReactiveFormsModule, NgComponentOutlet],\r\n providers: [ErrorMessageService, ErrorMessageRegistry],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ErrorRendererComponent implements OnInit {\r\n control = input.required<AbstractControl>();\r\n controlSchema = input.required<ControlSchema>();\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly errorMessageService = inject(ErrorMessageService);\r\n\r\n controlErrors = signal<ValidationErrors | null>(null);\r\n resolvedErrors = computed(() => {\r\n const errors = this.controlErrors();\r\n\r\n return !!errors && !!this.controlSchema().validators\r\n ? this.errorMessageService.getErrors(\r\n this.control(),\r\n this.controlSchema().validators!,\r\n )\r\n : null;\r\n });\r\n\r\n ngOnInit(): void {\r\n this.control()\r\n .statusChanges.pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => this.controlErrors.set(this.control().errors));\r\n }\r\n}\r\n","@for (resolvedError of resolvedErrors(); track resolvedError) {\r\n @if (resolvedError.type === 'text') {\r\n <span class=\"forge-form-error\" data-test=\"error-text\">\r\n {{ resolvedError.message }}\r\n </span>\r\n }\r\n\r\n @if (resolvedError.type === 'component') {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n resolvedError.component;\r\n inputs: {\r\n ...resolvedError.inputs,\r\n }\r\n \" />\r\n }\r\n}\r\n","import { Injectable, Type } from '@angular/core';\r\nimport { HintMessage } from './hint-messages.model';\r\n\r\nexport type ResolvedHint =\r\n | { type: 'text'; message: string }\r\n | {\r\n type: 'component';\r\n component: Type<unknown>;\r\n inputs?: Record<string, unknown>;\r\n };\r\n\r\n@Injectable()\r\nexport class HintMessageService {\r\n getHint(hint: HintMessage | undefined): ResolvedHint | undefined {\r\n if (!hint) return undefined;\r\n\r\n return hint instanceof Object && 'component' in hint\r\n ? {\r\n type: 'component',\r\n component: hint.component,\r\n inputs: hint.inputs,\r\n }\r\n : { type: 'text', message: hint };\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n inject,\r\n OnInit,\r\n DestroyRef,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n ReactiveFormsModule,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport { ControlSchema } from '../../schema/form-control.model';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { distinctUntilChanged } from 'rxjs';\r\nimport { NgComponentOutlet } from '@angular/common';\r\nimport { HintMessageService } from '../hint-messages/hint-messages.service';\r\n\r\n@Component({\r\n selector: 'forge-form-hint-renderer',\r\n templateUrl: './hint-renderer.component.html',\r\n imports: [ReactiveFormsModule, NgComponentOutlet],\r\n providers: [HintMessageService],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class HintRendererComponent implements OnInit {\r\n control = input.required<AbstractControl>();\r\n controlSchema = input.required<ControlSchema>();\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly hintMessageService = inject(HintMessageService);\r\n\r\n controlErrors = signal<ValidationErrors | null>(null);\r\n controlValue = signal<unknown>(null);\r\n resolvedHint = computed(() => {\r\n const errors = this.controlErrors();\r\n\r\n return !errors && !!this.controlSchema().hint\r\n ? this.hintMessageService.getHint(this.controlSchema().hint)\r\n : null;\r\n });\r\n\r\n mergedInputs = computed(() => {\r\n const hint = this.resolvedHint();\r\n\r\n if (!hint || hint.type !== 'component') {\r\n return {};\r\n }\r\n\r\n return {\r\n control: this.control(),\r\n controlValue: this.controlValue(),\r\n controlErrors: this.controlErrors(),\r\n controlSchema: this.controlSchema(),\r\n ...hint.inputs,\r\n };\r\n });\r\n\r\n ngOnInit(): void {\r\n this.controlValue.set(this.control().value);\r\n\r\n this.control()\r\n .valueChanges.pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((value) => {\r\n this.controlValue.set(value);\r\n });\r\n\r\n this.control()\r\n .statusChanges.pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => this.controlErrors.set(this.control().errors));\r\n }\r\n}\r\n","@if (resolvedHint(); as hint) {\r\n @if (hint.type === 'text') {\r\n <span class=\"forge-form-hint\" data-test=\"hint-text\">\r\n {{ hint.message }}\r\n </span>\r\n }\r\n\r\n @if (hint.type === 'component') {\r\n <ng-container *ngComponentOutlet=\"hint.component; inputs: mergedInputs()\" />\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { FormSchema, GroupFieldSchema } from '../schema/form-schema.model';\r\nimport {\r\n FormControl,\r\n FormGroup,\r\n Validators,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport { ControlSchema } from '../schema/form-control.model';\r\nimport {\r\n VALIDATOR_TYPES,\r\n ValidatorSchema,\r\n} from '../engine/validators/validator-schema.model';\r\n\r\n@Injectable()\r\nexport class FormBuilderService {\r\n buildForm(schema: FormSchema): FormGroup {\r\n const controls: Record<string, FormControl> = {};\r\n\r\n const collectControls = (node: FormSchema | GroupFieldSchema) => {\r\n for (const item of node.controls) {\r\n if (this.isGroupFieldSchema(item)) {\r\n collectControls(item);\r\n } else {\r\n controls[item.controlName] = new FormControl(\r\n item.initialValue ?? null,\r\n {\r\n updateOn: item.updateOn ?? schema.updateOn,\r\n validators: this.mapSchemaValidators(item.validators),\r\n },\r\n );\r\n }\r\n }\r\n };\r\n\r\n collectControls(schema);\r\n return new FormGroup(controls, { updateOn: schema.updateOn });\r\n }\r\n\r\n private mapSchemaValidators(\r\n validators?: ValidatorSchema[],\r\n ): ValidatorFn[] | null {\r\n if (!validators?.length) {\r\n return null;\r\n }\r\n\r\n return validators.map((validator) => {\r\n switch (validator.type) {\r\n case VALIDATOR_TYPES.required:\r\n return Validators.required;\r\n case VALIDATOR_TYPES.minlength:\r\n return Validators.minLength(validator.value);\r\n case VALIDATOR_TYPES.maxlength:\r\n return Validators.maxLength(validator.value);\r\n case VALIDATOR_TYPES.min:\r\n return Validators.min(validator.value);\r\n case VALIDATOR_TYPES.max:\r\n return Validators.max(validator.value);\r\n case VALIDATOR_TYPES.custom:\r\n return validator.fn;\r\n default:\r\n return () => null;\r\n }\r\n });\r\n }\r\n\r\n private isGroupFieldSchema(\r\n obj: GroupFieldSchema | ControlSchema,\r\n ): obj is GroupFieldSchema {\r\n return 'controls' in obj;\r\n }\r\n}\r\n","import { AbstractControl, FormGroup } from '@angular/forms';\r\n\r\nexport interface VisibilitySchema {\r\n fn: VisibilityFunction;\r\n behavior: VisibilityBehavior;\r\n clearOnHide?: boolean;\r\n}\r\n\r\nexport type VisibilityFunction = (control: VisibilityContext) => boolean;\r\n\r\nexport const VISIBILITY_BEHAVIORS = {\r\n hide: 'hide',\r\n disable: 'disable',\r\n} as const;\r\nexport type VisibilityBehavior =\r\n (typeof VISIBILITY_BEHAVIORS)[keyof typeof VISIBILITY_BEHAVIORS];\r\n\r\nexport interface VisibilityContext {\r\n value: unknown;\r\n form: FormGroup;\r\n control: AbstractControl;\r\n}\r\n","import { DestroyRef, inject, Injectable, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { distinctUntilChanged, Subscription } from 'rxjs';\r\nimport {\r\n BaseControlSchema,\r\n ControlSchema,\r\n} from '../../schema/form-control.model';\r\nimport { FormSchema } from '../../schema/form-schema.model';\r\nimport { FormBuilderService } from '../../services/form-builder.service';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { VISIBILITY_BEHAVIORS } from '../../schema/visibility.model';\r\n\r\n@Injectable()\r\nexport class FormService<TModel> {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly formBuilder = inject(FormBuilderService);\r\n\r\n form = signal<FormGroup | null>(null);\r\n value = signal<TModel | null>(null);\r\n\r\n private disabledByVisibility = new Set<string>();\r\n private valueChangesSubscription?: Subscription;\r\n\r\n init(formSchema: FormSchema): void {\r\n if (!formSchema) {\r\n return;\r\n }\r\n\r\n this.valueChangesSubscription?.unsubscribe();\r\n\r\n const form = this.formBuilder.buildForm(formSchema);\r\n this.form.set(form);\r\n\r\n this.valueChangesSubscription = this.form()!\r\n .valueChanges.pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => this.value.set(this.form()!.value));\r\n }\r\n\r\n applyVisibility(\r\n controlSchema: ControlSchema,\r\n visible: boolean,\r\n clearOnHide: boolean,\r\n ): void {\r\n const visibilitySchema = controlSchema.visibility;\r\n\r\n if (!visibilitySchema) {\r\n return;\r\n }\r\n\r\n if (visibilitySchema.behavior === VISIBILITY_BEHAVIORS.disable) {\r\n if (visible) {\r\n this.disableControlByVisibility(controlSchema.controlName, clearOnHide);\r\n } else {\r\n this.enableControlByVisibility(controlSchema.controlName);\r\n }\r\n }\r\n }\r\n\r\n private getControl(controlName: BaseControlSchema['controlName']) {\r\n if (!this.form()) {\r\n console.error(\"Couldn't get control. Form is not initialized!\");\r\n return null;\r\n }\r\n\r\n const control = this.form()!.get(controlName);\r\n\r\n if (!control) {\r\n console.error(\r\n `Couldn't get control. Control with name \"${controlName}\" not found!`,\r\n );\r\n return null;\r\n }\r\n return control;\r\n }\r\n\r\n private disableControlByVisibility(\r\n controlName: BaseControlSchema['controlName'],\r\n clearOnHide?: boolean,\r\n ): void {\r\n const control = this.getControl(controlName);\r\n if (!control) return;\r\n\r\n if (clearOnHide && !this.disabledByVisibility.has(controlName)) {\r\n control.reset(null, { emitEvent: false });\r\n }\r\n\r\n if (control.enabled) {\r\n control.disable({ emitEvent: false });\r\n this.disabledByVisibility.add(controlName);\r\n }\r\n }\r\n\r\n private enableControlByVisibility(\r\n controlName: BaseControlSchema['controlName'],\r\n ): void {\r\n const control = this.getControl(controlName);\r\n if (!control) return;\r\n\r\n if (this.disabledByVisibility.has(controlName)) {\r\n control.enable({ emitEvent: false });\r\n this.disabledByVisibility.delete(controlName);\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n inject,\r\n computed,\r\n OnInit,\r\n signal,\r\n DestroyRef,\r\n effect,\r\n} from '@angular/core';\r\nimport { NgComponentOutlet } from '@angular/common';\r\nimport { AbstractControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { ControlSchema } from '../../schema/form-control.model';\r\nimport { RendererRegistry } from '../renderer-template-registry/renderer-template.registry';\r\nimport { FORM_OPTIONS } from '../../schema/form-options-token';\r\nimport { ORIENTATION_OPTIONS } from '../../schema/form-options.model';\r\nimport { debouncedValueChanges } from '../../utils/debouncedSignal';\r\nimport { UPDATE_ON } from '../../schema/update-on.model';\r\nimport { ErrorRendererComponent } from '../error-renderer/error-renderer.component';\r\nimport { HintRendererComponent } from '../hint-renderer/hint-renderer.component';\r\nimport { FormService } from '../form-renderer/form.service';\r\nimport { VISIBILITY_BEHAVIORS } from '../../schema/visibility.model';\r\n\r\n@Component({\r\n selector: 'forge-form-field',\r\n templateUrl: './form-field.component.html',\r\n imports: [\r\n ReactiveFormsModule,\r\n NgComponentOutlet,\r\n ErrorRendererComponent,\r\n HintRendererComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormFieldComponent<TModel> implements OnInit {\r\n readonly control = input.required<AbstractControl>();\r\n readonly controlSchema = input.required<ControlSchema>();\r\n\r\n readonly VALUE_CHANGE_DELAY = 300;\r\n private readonly registry = inject(RendererRegistry);\r\n private readonly formOptions = inject(FORM_OPTIONS, { optional: true });\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly formService = inject(FormService<TModel>);\r\n\r\n private wasVisible = true;\r\n\r\n readonly formSignal = this.formService.form;\r\n\r\n componentType = computed(() => this.registry.get(this.controlSchema().type));\r\n\r\n labelOrientation = computed(\r\n () =>\r\n this.controlSchema().options?.labelOrientation ??\r\n this.formOptions?.labelOrientation ??\r\n ORIENTATION_OPTIONS.column,\r\n );\r\n\r\n valueChanges = signal(null);\r\n\r\n shouldApplyDelay = computed(\r\n () =>\r\n this.controlSchema().updateOn === UPDATE_ON.change &&\r\n this.controlSchema().type !== 'checkbox',\r\n );\r\n\r\n visibilityResolved = computed(() => {\r\n const visibilitySchema = this.controlSchema().visibility;\r\n const formValue = this.formService.value();\r\n const visible = visibilitySchema?.fn({\r\n value: formValue,\r\n form: this.formSignal()!,\r\n control: this.control(),\r\n });\r\n\r\n return visibilitySchema ? visible : true;\r\n });\r\n\r\n showControl = computed(() => {\r\n const visibilitySchema = this.controlSchema().visibility;\r\n\r\n return (\r\n (!this.visibilityResolved() &&\r\n visibilitySchema?.behavior === VISIBILITY_BEHAVIORS.hide) ||\r\n !visibilitySchema ||\r\n visibilitySchema?.behavior !== VISIBILITY_BEHAVIORS.hide\r\n );\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const visibilitySchema = this.controlSchema().visibility;\r\n const visible = !!this.visibilityResolved();\r\n const becameHidden = this.wasVisible && !visible;\r\n\r\n if (!visibilitySchema) {\r\n return;\r\n }\r\n\r\n this.formService.applyVisibility(\r\n this.controlSchema(),\r\n visible,\r\n becameHidden && !!visibilitySchema.clearOnHide,\r\n );\r\n\r\n this.wasVisible = !!visible;\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n debouncedValueChanges(\r\n this.control().valueChanges,\r\n this.shouldApplyDelay() ? this.VALUE_CHANGE_DELAY : 0,\r\n this.destroyRef,\r\n ).subscribe((value) => this.valueChanges.set(value));\r\n }\r\n}\r\n","@if (showControl()) {\r\n <div\r\n data-test=\"forge-form-field-container\"\r\n [class]=\"\r\n 'forge-form-field-container forge-form-field-container--' +\r\n labelOrientation()\r\n \"\r\n [style.width]=\"controlSchema().options?.width || 'auto'\">\r\n @if (controlSchema().label) {\r\n <span class=\"forge-form-field-label\" data-test=\"forge-form-field-label\">\r\n {{ controlSchema().label }}\r\n </span>\r\n }\r\n\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n componentType();\r\n inputs: {\r\n control: control(),\r\n controlSchema: controlSchema(),\r\n }\r\n \" />\r\n\r\n <forge-form-hint-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n\r\n <forge-form-error-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n </div>\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport {\r\n FieldRenderer,\r\n TextControlSchema,\r\n} from '../../../schema/form-control.model';\r\n\r\n@Component({\r\n selector: 'forge-form-text-renderer',\r\n template: `\r\n <input\r\n class=\"forge-form-input\"\r\n data-test=\"text-input\"\r\n [attr.id]=\"controlSchema.controlName\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"controlSchema.placeholder || controlSchema.label\" />\r\n `,\r\n standalone: true,\r\n imports: [ReactiveFormsModule],\r\n})\r\nexport class TextRendererComponent implements FieldRenderer<TextControlSchema> {\r\n @Input() control!: FormControl;\r\n @Input() controlSchema!: TextControlSchema;\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport {\r\n FieldRenderer,\r\n NumberControlSchema,\r\n} from '../../../schema/form-control.model';\r\n\r\n@Component({\r\n selector: 'forge-form-number-renderer',\r\n template: `\r\n <input\r\n class=\"forge-form-input\"\r\n data-test=\"number-input\"\r\n type=\"number\"\r\n [attr.id]=\"controlSchema.controlName\"\r\n [formControl]=\"control\"\r\n [attr.min]=\"controlSchema.min\"\r\n [attr.max]=\"controlSchema.max\"\r\n [placeholder]=\"controlSchema.placeholder || controlSchema.label\" />\r\n `,\r\n standalone: true,\r\n imports: [ReactiveFormsModule],\r\n})\r\nexport class NumberRendererComponent implements FieldRenderer<NumberControlSchema> {\r\n @Input() control!: FormControl;\r\n @Input() controlSchema!: NumberControlSchema;\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport {\r\n FieldRenderer,\r\n CheckboxControlSchema,\r\n} from '../../../schema/form-control.model';\r\n\r\n@Component({\r\n selector: 'forge-form-checkbox-renderer',\r\n template: `\r\n <input\r\n class=\"forge-form-checkbox\"\r\n data-test=\"checkbox-input\"\r\n type=\"checkbox\"\r\n [attr.id]=\"controlSchema.controlName\"\r\n [formControl]=\"control\" />\r\n `,\r\n standalone: true,\r\n imports: [ReactiveFormsModule],\r\n})\r\nexport class CheckboxRendererComponent implements FieldRenderer<CheckboxControlSchema> {\r\n @Input() control!: FormControl;\r\n @Input() controlSchema!: CheckboxControlSchema;\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport {\r\n FieldRenderer,\r\n SelectControlSchema,\r\n} from '../../../schema/form-control.model';\r\n\r\n@Component({\r\n selector: 'forge-form-select-renderer',\r\n template: `\r\n <select\r\n class=\"forge-form-select\"\r\n data-test=\"select-input\"\r\n [attr.id]=\"controlSchema.controlName\"\r\n [formControl]=\"control\">\r\n @if (controlSchema.placeholder || controlSchema.label) {\r\n <option data-test=\"select-placeholder\" [ngValue]=\"null\" disabled>\r\n {{ controlSchema.placeholder || controlSchema.label }}\r\n </option>\r\n }\r\n\r\n @for (option of controlSchema.items; track option.value) {\r\n <option data-test=\"select-option\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </option>\r\n }\r\n </select>\r\n `,\r\n standalone: true,\r\n imports: [ReactiveFormsModule],\r\n})\r\nexport class SelectRendererComponent implements FieldRenderer<SelectControlSchema> {\r\n @Input() control!: FormControl;\r\n @Input() controlSchema!: SelectControlSchema;\r\n}\r\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { GroupFieldSchema } from '../../schema/form-schema.model';\r\nimport { FormBuilderService } from '../../services/form-builder.service';\r\nimport { FormFieldComponent } from '../form-field/form-field.component';\r\nimport {\r\n RendererRegistry,\r\n RENDERERS,\r\n} from '../renderer-template-registry/renderer-template.registry';\r\nimport { TextRendererComponent } from '../form-field-renderers/text-field-renderer/text-field-renderer.component';\r\nimport { NumberRendererComponent } from '../form-field-renderers/number-field-renderer/number-field-renderer.component';\r\nimport { CheckboxRendererComponent } from '../form-field-renderers/checkbox-field-renderer/checkbox-field-renderer.component';\r\nimport { SelectRendererComponent } from '../form-field-renderers/select-field-renderer/select-field-renderer.component';\r\n\r\n@Component({\r\n selector: 'forge-form-group-renderer',\r\n templateUrl: './group-renderer.component.html',\r\n imports: [ReactiveFormsModule, FormFieldComponent],\r\n providers: [\r\n FormBuilderService,\r\n RendererRegistry,\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'text',\r\n component: TextRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'number',\r\n component: NumberRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'checkbox',\r\n component: CheckboxRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'select',\r\n component: SelectRendererComponent,\r\n },\r\n },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class GroupRendererComponent {\r\n form = input.required<FormGroup>();\r\n schema = input.required<GroupFieldSchema>();\r\n}\r\n","<div\r\n data-test=\"group-container\"\r\n [class]=\"\r\n 'forge-form-group forge-form-group--' + schema().options?.orientation\r\n \">\r\n @for (subjectSchema of schema().controls; track subjectSchema) {\r\n @if (subjectSchema.type === 'group') {\r\n <forge-form-group-renderer\r\n data-test=\"nested-group\"\r\n [form]=\"form()\"\r\n [schema]=\"subjectSchema\" />\r\n } @else {\r\n <forge-form-field\r\n data-test=\"group-field\"\r\n [controlSchema]=\"subjectSchema\"\r\n [control]=\"form().get(subjectSchema.controlName)!\" />\r\n }\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n effect,\r\n inject,\r\n output,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { FormSchema } from '../../schema/form-schema.model';\r\nimport { FormFieldComponent } from '../form-field/form-field.component';\r\nimport {\r\n RendererRegistry,\r\n RENDERERS,\r\n} from '../renderer-template-registry/renderer-template.registry';\r\nimport { TextRendererComponent } from '../form-field-renderers/text-field-renderer/text-field-renderer.component';\r\nimport { NumberRendererComponent } from '../form-field-renderers/number-field-renderer/number-field-renderer.component';\r\nimport { CheckboxRendererComponent } from '../form-field-renderers/checkbox-field-renderer/checkbox-field-renderer.component';\r\nimport { SelectRendererComponent } from '../form-field-renderers/select-field-renderer/select-field-renderer.component';\r\nimport { GroupRendererComponent } from '../group-renderer/group-renderer.component';\r\nimport { FORM_OPTIONS } from '../../schema/form-options-token';\r\nimport {\r\n DEFAULT_ERROR_FALLBACK,\r\n DEFAULT_ERROR_MESSAGES,\r\n ERROR_MESSAGES,\r\n} from '../error-messages/error-messages.registry';\r\nimport { FormService } from './form.service';\r\nimport { FormBuilderService } from '../../services/form-builder.service';\r\nimport { THEMES } from '../../schema/form-options.model';\r\n\r\n@Component({\r\n selector: 'forge-form-angular',\r\n templateUrl: './form-renderer.component.html',\r\n imports: [ReactiveFormsModule, FormFieldComponent, GroupRendererComponent],\r\n providers: [\r\n FormBuilderService,\r\n RendererRegistry,\r\n FormService,\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'text',\r\n component: TextRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'number',\r\n component: NumberRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'checkbox',\r\n component: CheckboxRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'select',\r\n component: SelectRendererComponent,\r\n },\r\n },\r\n {\r\n provide: FORM_OPTIONS,\r\n useFactory: (component: FormRendererComponent<unknown>) =>\r\n component.schema().options,\r\n deps: [FormRendererComponent],\r\n },\r\n {\r\n provide: ERROR_MESSAGES,\r\n useValue: DEFAULT_ERROR_MESSAGES,\r\n multi: true,\r\n },\r\n { provide: DEFAULT_ERROR_FALLBACK, useValue: 'Invalid field', multi: true },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormRendererComponent<TModel> {\r\n private readonly formService = inject(FormService<TModel>);\r\n\r\n readonly schema = input.required<FormSchema>();\r\n readonly formSubmit = output<TModel>();\r\n\r\n readonly THEMES = THEMES;\r\n\r\n readonly formSignal = this.formService.form;\r\n\r\n constructor() {\r\n effect(() => {\r\n this.formService.init(this.schema());\r\n });\r\n }\r\n\r\n getControl(name: string): FormControl {\r\n return this.formSignal()!.get(name) as FormControl;\r\n }\r\n\r\n onSubmit() {\r\n if (this.formSignal()!.valid) {\r\n this.formSubmit.emit(this.formSignal()!.value);\r\n }\r\n }\r\n}\r\n","@if (!!formSignal()) {\r\n <form\r\n [class]=\"'forge-form forge-form--' + schema().options?.orientation\"\r\n [class.forge-theme-default]=\"schema().options?.theme === THEMES.default\"\r\n [formGroup]=\"formSignal()!\"\r\n (ngSubmit)=\"onSubmit()\"\r\n data-test=\"form\">\r\n @for (subjectSchema of schema().controls; track subjectSchema) {\r\n @if (subjectSchema.type === 'group') {\r\n <forge-form-group-renderer\r\n data-test=\"group-renderer\"\r\n [form]=\"formSignal()!\"\r\n [schema]=\"subjectSchema\" />\r\n } @else {\r\n <forge-form-field\r\n data-test=\"form-field\"\r\n [controlSchema]=\"subjectSchema\"\r\n [control]=\"formSignal()!.get(subjectSchema.controlName)!\" />\r\n }\r\n }\r\n\r\n <button\r\n class=\"forge-form-button\"\r\n [disabled]=\"!formSignal()?.valid\"\r\n data-test=\"submit-button\"\r\n type=\"submit\">\r\n Submit\r\n </button>\r\n </form>\r\n}\r\n","import { Directive, input } from '@angular/core';\r\nimport { AbstractControl, ValidationErrors } from '@angular/forms';\r\n\r\n@Directive()\r\nexport abstract class FormFieldContextComponent<T = unknown> {\r\n control = input.required<AbstractControl<T>>();\r\n controlValue = input.required<T>();\r\n controlErrors = input<ValidationErrors | null>(null);\r\n controlSchema = input.required<unknown>();\r\n}\r\n","import { ErrorMessageContent } from '../error-messages/error-messages.model';\r\nimport {\r\n ValidatorSchema,\r\n ValidatorFunction,\r\n VALIDATOR_TYPES,\r\n} from './validator-schema.model';\r\n\r\nexport interface ValidatorCredentials {\r\n value?: number | string;\r\n key?: string;\r\n fn?: ValidatorFunction;\r\n errorMessage?: ErrorMessageContent;\r\n}\r\n\r\nexport const required = (\r\n credentials?: ValidatorCredentials,\r\n): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.required,\r\n errorMessage: credentials?.errorMessage,\r\n});\r\n\r\nexport const minLength = ({\r\n value,\r\n errorMessage,\r\n}: ValidatorCredentials): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.minlength,\r\n value: +value!,\r\n errorMessage,\r\n});\r\n\r\nexport const maxLength = ({\r\n value,\r\n errorMessage,\r\n}: ValidatorCredentials): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.maxlength,\r\n value: +value!,\r\n errorMessage,\r\n});\r\n\r\nexport const min = ({\r\n value,\r\n errorMessage,\r\n}: ValidatorCredentials): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.min,\r\n value: +value!,\r\n errorMessage,\r\n});\r\n\r\nexport const max = ({\r\n value,\r\n errorMessage,\r\n}: ValidatorCredentials): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.max,\r\n value: +value!,\r\n errorMessage,\r\n});\r\n\r\nexport const customValidator = ({\r\n key,\r\n fn,\r\n errorMessage,\r\n}: ValidatorCredentials): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.custom,\r\n key: key ?? '',\r\n fn: fn ?? (() => null),\r\n errorMessage,\r\n});\r\n","import { Signal, Type } from '@angular/core';\r\nimport { AbstractControl, ValidationErrors } from '@angular/forms';\r\n\r\nexport const HINT_TYPES = {\r\n text: 'text',\r\n custom: 'custom',\r\n} as const;\r\nexport type HintType = (typeof HINT_TYPES)[keyof typeof HINT_TYPES];\r\n\r\nexport type HintMessage = string | HintComponentDef;\r\n\r\nexport interface HintComponentDef {\r\n component: Type<unknown>;\r\n inputs?: Record<string, unknown>;\r\n}\r\n\r\nexport interface HintContext {\r\n control: AbstractControl;\r\n value: Signal<unknown>;\r\n errors: Signal<ValidationErrors | null>;\r\n}\r\n","/*\r\n * Public API Surface of @forge-form/angular\r\n */\r\n\r\n// Main entry component\r\nexport { FormRendererComponent } from './lib/engine/form-renderer/form-renderer.component';\r\n\r\n// Base class for custom hint / error components\r\nexport { FormFieldContextComponent } from './lib/engine/form-field/form-field-context.component';\r\n\r\n// Schema models\r\nexport type {\r\n FormSchema,\r\n GroupFieldSchema,\r\n} from './lib/schema/form-schema.model';\r\nexport type {\r\n ControlSchema,\r\n BaseElementSchema,\r\n BaseControlSchema,\r\n TextControlSchema,\r\n NumberControlSchema,\r\n CheckboxControlSchema,\r\n SelectControlSchema,\r\n SelectOption,\r\n FieldRenderer,\r\n} from './lib/schema/form-control.model';\r\nexport { ORIENTATION_OPTIONS, THEMES } from './lib/schema/form-options.model';\r\nexport type {\r\n OrientationOption,\r\n ThemeOption,\r\n FormOptions,\r\n ElementFormOptions,\r\n FormFieldOptions,\r\n} from './lib/schema/form-options.model';\r\nexport { UPDATE_ON } from './lib/schema/update-on.model';\r\nexport type { UpdateOn } from './lib/schema/update-on.model';\r\nexport { VISIBILITY_BEHAVIORS } from './lib/schema/visibility.model';\r\nexport type {\r\n VisibilitySchema,\r\n VisibilityFunction,\r\n VisibilityBehavior,\r\n VisibilityContext,\r\n} from './lib/schema/visibility.model';\r\n\r\n// Dependency-injection tokens & extension points\r\nexport { FORM_OPTIONS } from './lib/schema/form-options-token';\r\nexport {\r\n RENDERERS,\r\n RendererRegistry,\r\n} from './lib/engine/renderer-template-registry/renderer-template.registry';\r\nexport type { RendererDef } from './lib/engine/renderer-template-registry/renderer-template.registry';\r\n\r\n// Validators\r\nexport {\r\n required,\r\n minLength,\r\n maxLength,\r\n min,\r\n max,\r\n customValidator,\r\n} from './lib/engine/validators/validator-helpers';\r\nexport type { ValidatorCredentials } from './lib/engine/validators/validator-helpers';\r\nexport { VALIDATOR_TYPES } from './lib/engine/validators/validator-schema.model';\r\nexport type {\r\n ValidatorSchema,\r\n ValidatorType,\r\n ValidatorFunction,\r\n BaseValidatorSchema,\r\n RequiredValidatorSchema,\r\n MinLengthValidatorSchema,\r\n MaxLengthValidatorSchema,\r\n MinValidatorSchema,\r\n MaxValidatorSchema,\r\n CustomValidatorSchema,\r\n} from './lib/engine/validators/validator-schema.model';\r\n\r\n// Error messages\r\nexport {\r\n ERROR_MESSAGES,\r\n DEFAULT_ERROR_FALLBACK,\r\n DEFAULT_ERROR_MESSAGES,\r\n} from './lib/engine/error-messages/error-messages.registry';\r\nexport type {\r\n ErrorMessage,\r\n ErrorMessageContent,\r\n ErrorComponentDef,\r\n} from './lib/engine/error-messages/error-messages.model';\r\n\r\n// Hint messages\r\nexport { HINT_TYPES } from './lib/engine/hint-messages/hint-messages.model';\r\nexport type {\r\n HintMessage,\r\n HintComponentDef,\r\n HintContext,\r\n HintType,\r\n} from './lib/engine/hint-messages/hint-messages.model';\r\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":"forge-form-angular.mjs","sources":["../../../projects/forge-form-angular/src/lib/engine/renderer-template-registry/renderer-template.registry.ts","../../../projects/forge-form-angular/src/lib/schema/form-options-token.ts","../../../projects/forge-form-angular/src/lib/schema/form-options.model.ts","../../../projects/forge-form-angular/src/lib/utils/debouncedSignal.ts","../../../projects/forge-form-angular/src/lib/schema/update-on.model.ts","../../../projects/forge-form-angular/src/lib/engine/validators/validator-schema.model.ts","../../../projects/forge-form-angular/src/lib/engine/error-messages/error-messages.registry.ts","../../../projects/forge-form-angular/src/lib/engine/error-messages/error-messages.service.ts","../../../projects/forge-form-angular/src/lib/engine/error-renderer/error-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/error-renderer/error-renderer.component.html","../../../projects/forge-form-angular/src/lib/engine/hint-messages/hint-messages.service.ts","../../../projects/forge-form-angular/src/lib/engine/hint-renderer/hint-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/hint-renderer/hint-renderer.component.html","../../../projects/forge-form-angular/src/lib/services/form-builder.service.ts","../../../projects/forge-form-angular/src/lib/schema/visibility.model.ts","../../../projects/forge-form-angular/src/lib/engine/form-renderer/form.service.ts","../../../projects/forge-form-angular/src/lib/engine/form-field/form-field.component.ts","../../../projects/forge-form-angular/src/lib/engine/form-field/form-field.component.html","../../../projects/forge-form-angular/src/lib/engine/form-field-renderers/text-field-renderer/text-field-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/form-field-renderers/number-field-renderer/number-field-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/form-field-renderers/checkbox-field-renderer/checkbox-field-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/form-field-renderers/select-field-renderer/select-field-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/group-renderer/group-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/group-renderer/group-renderer.component.html","../../../projects/forge-form-angular/src/lib/engine/form-renderer/form-renderer.component.ts","../../../projects/forge-form-angular/src/lib/engine/form-renderer/form-renderer.component.html","../../../projects/forge-form-angular/src/lib/engine/form-field/form-field-context.component.ts","../../../projects/forge-form-angular/src/lib/engine/validators/validator-helpers.ts","../../../projects/forge-form-angular/src/lib/engine/hint-messages/hint-messages.model.ts","../../../projects/forge-form-angular/src/public-api.ts","../../../projects/forge-form-angular/src/forge-form-angular.ts"],"sourcesContent":["import { Inject, Injectable, InjectionToken, Type } from '@angular/core';\r\nimport { FieldRenderer } from '../../schema/form-control.model';\r\n\r\nexport interface RendererDef {\r\n type: string;\r\n component: Type<FieldRenderer>;\r\n}\r\n\r\nexport const RENDERERS = new InjectionToken<RendererDef[]>('RENDERERS');\r\n\r\n@Injectable()\r\nexport class RendererRegistry {\r\n private map = new Map<string, Type<FieldRenderer>>();\r\n\r\n // eslint-disable-next-line @angular-eslint/prefer-inject\r\n constructor(@Inject(RENDERERS) renderers: RendererDef[][] = []) {\r\n renderers.flat().forEach((r) => {\r\n this.map.set(r.type, r.component);\r\n });\r\n }\r\n\r\n get(type: string): Type<FieldRenderer> {\r\n const cmp = this.map.get(type);\r\n if (!cmp) {\r\n throw new Error(`No renderer for type: ${type}`);\r\n }\r\n return cmp;\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { FormOptions } from './form-options.model';\r\n\r\nexport const FORM_OPTIONS = new InjectionToken<FormOptions>('FORM_OPTIONS');\r\n","export const ORIENTATION_OPTIONS = {\r\n row: 'row',\r\n column: 'column',\r\n} as const;\r\nexport type OrientationOption =\r\n (typeof ORIENTATION_OPTIONS)[keyof typeof ORIENTATION_OPTIONS];\r\n\r\nexport const THEMES = {\r\n none: 'none',\r\n default: 'default',\r\n} as const;\r\nexport type ThemeOption = (typeof THEMES)[keyof typeof THEMES];\r\n\r\ninterface BaseFormOptions {\r\n orientation?: OrientationOption;\r\n labelOrientation?: OrientationOption;\r\n}\r\n\r\nexport interface FormOptions extends BaseFormOptions {\r\n theme?: ThemeOption;\r\n hideSubmitButton?: boolean;\r\n}\r\n\r\nexport type ElementFormOptions = BaseFormOptions;\r\n\r\nexport interface FormFieldOptions extends BaseFormOptions {\r\n width?: number | string;\r\n}\r\n","import { DestroyRef } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { debounceTime, distinctUntilChanged, Observable } from 'rxjs';\r\n\r\nexport const debouncedValueChanges = <T>(\r\n valueChanges: Observable<T>,\r\n time = 0,\r\n destroyRef: DestroyRef,\r\n) =>\r\n valueChanges.pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(destroyRef),\r\n debounceTime(time),\r\n );\r\n","export const UPDATE_ON = {\r\n change: 'change',\r\n blur: 'blur',\r\n submit: 'submit',\r\n} as const;\r\nexport type UpdateOn = (typeof UPDATE_ON)[keyof typeof UPDATE_ON];\r\n","import { AbstractControl, ValidationErrors } from '@angular/forms';\r\nimport { ErrorMessageContent } from '../error-messages/error-messages.model';\r\n\r\nexport type ValidatorSchema =\r\n | RequiredValidatorSchema\r\n | MinLengthValidatorSchema\r\n | MaxLengthValidatorSchema\r\n | MinValidatorSchema\r\n | MaxValidatorSchema\r\n | CustomValidatorSchema;\r\n\r\nexport const VALIDATOR_TYPES = {\r\n required: 'required',\r\n minlength: 'minlength',\r\n maxlength: 'maxlength',\r\n min: 'min',\r\n max: 'max',\r\n custom: 'custom',\r\n} as const;\r\nexport type ValidatorType =\r\n (typeof VALIDATOR_TYPES)[keyof typeof VALIDATOR_TYPES];\r\n\r\nexport interface BaseValidatorSchema {\r\n type: ValidatorType;\r\n errorMessage?: ErrorMessageContent;\r\n}\r\n\r\nexport interface RequiredValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.required;\r\n}\r\n\r\nexport interface MinLengthValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.minlength;\r\n value: number;\r\n}\r\n\r\nexport interface MaxLengthValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.maxlength;\r\n value: number;\r\n}\r\n\r\nexport interface MinValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.min;\r\n value: number;\r\n}\r\n\r\nexport interface MaxValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.max;\r\n value: number;\r\n}\r\n\r\nexport interface CustomValidatorSchema extends BaseValidatorSchema {\r\n type: typeof VALIDATOR_TYPES.custom;\r\n key: string;\r\n fn: ValidatorFunction;\r\n}\r\n\r\nexport type ValidatorFunction = (\r\n control: AbstractControl,\r\n) => ValidationErrors | null;\r\n","import { Inject, Injectable, InjectionToken } from '@angular/core';\r\nimport {\r\n VALIDATOR_TYPES,\r\n ValidatorType,\r\n} from '../validators/validator-schema.model';\r\nimport { ErrorMessage, ErrorMessageContent } from './error-messages.model';\r\n\r\nexport const ERROR_MESSAGES = new InjectionToken<ErrorMessage[]>(\r\n 'ERROR_MESSAGES',\r\n);\r\n\r\nexport const DEFAULT_ERROR_FALLBACK = new InjectionToken<string>(\r\n 'DEFAULT_ERROR_FALLBACK',\r\n);\r\n\r\nexport const DEFAULT_ERROR_MESSAGES: ErrorMessage[] = [\r\n {\r\n type: VALIDATOR_TYPES.required,\r\n message: () => 'This field is required',\r\n },\r\n {\r\n type: VALIDATOR_TYPES.minlength,\r\n message: (err) => `Minimum length is ${err['requiredLength']}`,\r\n },\r\n {\r\n type: VALIDATOR_TYPES.maxlength,\r\n message: (err) => `Maximum length is ${err['requiredLength']}`,\r\n },\r\n {\r\n type: VALIDATOR_TYPES.min,\r\n message: (err) => `Minimum value is ${err['min']}`,\r\n },\r\n {\r\n type: VALIDATOR_TYPES.max,\r\n message: (err) => `Maximum value is ${err['max']}`,\r\n },\r\n];\r\n\r\n@Injectable()\r\nexport class ErrorMessageRegistry {\r\n private map = new Map<ValidatorType, ErrorMessageContent>();\r\n\r\n // eslint-disable-next-line @angular-eslint/prefer-inject\r\n constructor(@Inject(ERROR_MESSAGES) defs: ErrorMessage[][] = []) {\r\n defs.flat().forEach((def) => {\r\n this.map.set(def.type, def.message);\r\n });\r\n }\r\n\r\n get(type: ValidatorType): ErrorMessageContent | null {\r\n return this.map.get(type) ?? null;\r\n }\r\n}\r\n","import { inject, Injectable, Type } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport {\r\n CustomValidatorSchema,\r\n VALIDATOR_TYPES,\r\n ValidatorSchema,\r\n} from '../validators/validator-schema.model';\r\nimport {\r\n DEFAULT_ERROR_FALLBACK,\r\n ErrorMessageRegistry,\r\n} from './error-messages.registry';\r\nimport { ErrorMessageContent } from './error-messages.model';\r\nimport { ValidationError } from '@angular/forms/signals';\r\n\r\nexport type ResolvedError =\r\n | { type: 'text'; message: string }\r\n | {\r\n type: 'component';\r\n component: Type<unknown>;\r\n inputs?: Record<string, unknown>;\r\n };\r\n\r\n@Injectable()\r\nexport class ErrorMessageService {\r\n private readonly registry = inject(ErrorMessageRegistry);\r\n private readonly defaultFallback = inject(DEFAULT_ERROR_FALLBACK);\r\n\r\n getErrors(\r\n control: AbstractControl,\r\n validators: ValidatorSchema[],\r\n ): ResolvedError[] {\r\n if (!control.errors) return [];\r\n\r\n return Object.entries(control.errors).map(([errorKey, errorValue]) => {\r\n const validatorSchema = this.getValidatorSchema(errorKey, validators);\r\n\r\n const content =\r\n validatorSchema?.errorMessage ??\r\n this.registry.get(errorKey as ValidatorSchema['type']);\r\n\r\n if (!content) {\r\n return { type: 'text', message: this.defaultFallback };\r\n }\r\n\r\n return this.resolveContent(content, errorValue);\r\n });\r\n }\r\n\r\n private getValidatorSchema(\r\n errorKey: ValidatorSchema['type'] | CustomValidatorSchema['key'],\r\n validators: ValidatorSchema[],\r\n ): ValidatorSchema | undefined {\r\n return validators.find((validator) =>\r\n validator.type !== VALIDATOR_TYPES.custom\r\n ? validator.type === errorKey\r\n : validator.key === errorKey,\r\n );\r\n }\r\n\r\n private resolveContent(\r\n content: ErrorMessageContent,\r\n errorValue: ValidationError,\r\n ): ResolvedError {\r\n if (typeof content === 'string') {\r\n return { type: 'text', message: content };\r\n }\r\n\r\n if (typeof content === 'function') {\r\n return { type: 'text', message: content(errorValue) };\r\n }\r\n\r\n return {\r\n type: 'component',\r\n component: content.component,\r\n inputs: content.inputs?.(errorValue),\r\n };\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n inject,\r\n OnInit,\r\n DestroyRef,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n ReactiveFormsModule,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport { ControlSchema } from '../../schema/form-control.model';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { distinctUntilChanged } from 'rxjs';\r\nimport { ErrorMessageService } from '../error-messages/error-messages.service';\r\nimport { ErrorMessageRegistry } from '../error-messages/error-messages.registry';\r\nimport { NgComponentOutlet } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'forge-form-error-renderer',\r\n templateUrl: './error-renderer.component.html',\r\n imports: [ReactiveFormsModule, NgComponentOutlet],\r\n providers: [ErrorMessageService, ErrorMessageRegistry],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ErrorRendererComponent implements OnInit {\r\n control = input.required<AbstractControl>();\r\n controlSchema = input.required<ControlSchema>();\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly errorMessageService = inject(ErrorMessageService);\r\n\r\n controlErrors = signal<ValidationErrors | null>(null);\r\n resolvedErrors = computed(() => {\r\n const errors = this.controlErrors();\r\n\r\n return !!errors && !!this.controlSchema().validators\r\n ? this.errorMessageService.getErrors(\r\n this.control(),\r\n this.controlSchema().validators!,\r\n )\r\n : null;\r\n });\r\n\r\n ngOnInit(): void {\r\n this.control()\r\n .statusChanges.pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => this.controlErrors.set(this.control().errors));\r\n }\r\n}\r\n","@for (resolvedError of resolvedErrors(); track resolvedError) {\r\n @if (resolvedError.type === 'text') {\r\n <span class=\"forge-form-error\" data-test=\"error-text\">\r\n {{ resolvedError.message }}\r\n </span>\r\n }\r\n\r\n @if (resolvedError.type === 'component') {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n resolvedError.component;\r\n inputs: {\r\n ...resolvedError.inputs,\r\n }\r\n \" />\r\n }\r\n}\r\n","import { Injectable, Type } from '@angular/core';\r\nimport { HintMessage } from './hint-messages.model';\r\n\r\nexport type ResolvedHint =\r\n | { type: 'text'; message: string }\r\n | {\r\n type: 'component';\r\n component: Type<unknown>;\r\n inputs?: Record<string, unknown>;\r\n };\r\n\r\n@Injectable()\r\nexport class HintMessageService {\r\n getHint(hint: HintMessage | undefined): ResolvedHint | undefined {\r\n if (!hint) return undefined;\r\n\r\n return hint instanceof Object && 'component' in hint\r\n ? {\r\n type: 'component',\r\n component: hint.component,\r\n inputs: hint.inputs,\r\n }\r\n : { type: 'text', message: hint };\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n inject,\r\n OnInit,\r\n DestroyRef,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n ReactiveFormsModule,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport { ControlSchema } from '../../schema/form-control.model';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { distinctUntilChanged } from 'rxjs';\r\nimport { NgComponentOutlet } from '@angular/common';\r\nimport { HintMessageService } from '../hint-messages/hint-messages.service';\r\n\r\n@Component({\r\n selector: 'forge-form-hint-renderer',\r\n templateUrl: './hint-renderer.component.html',\r\n imports: [ReactiveFormsModule, NgComponentOutlet],\r\n providers: [HintMessageService],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class HintRendererComponent implements OnInit {\r\n control = input.required<AbstractControl>();\r\n controlSchema = input.required<ControlSchema>();\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly hintMessageService = inject(HintMessageService);\r\n\r\n controlErrors = signal<ValidationErrors | null>(null);\r\n controlValue = signal<unknown>(null);\r\n resolvedHint = computed(() => {\r\n const errors = this.controlErrors();\r\n\r\n return !errors && !!this.controlSchema().hint\r\n ? this.hintMessageService.getHint(this.controlSchema().hint)\r\n : null;\r\n });\r\n\r\n mergedInputs = computed(() => {\r\n const hint = this.resolvedHint();\r\n\r\n if (!hint || hint.type !== 'component') {\r\n return {};\r\n }\r\n\r\n return {\r\n control: this.control(),\r\n controlValue: this.controlValue(),\r\n controlErrors: this.controlErrors(),\r\n controlSchema: this.controlSchema(),\r\n ...hint.inputs,\r\n };\r\n });\r\n\r\n ngOnInit(): void {\r\n this.controlValue.set(this.control().value);\r\n\r\n this.control()\r\n .valueChanges.pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((value) => {\r\n this.controlValue.set(value);\r\n });\r\n\r\n this.control()\r\n .statusChanges.pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => this.controlErrors.set(this.control().errors));\r\n }\r\n}\r\n","@if (resolvedHint(); as hint) {\r\n @if (hint.type === 'text') {\r\n <span class=\"forge-form-hint\" data-test=\"hint-text\">\r\n {{ hint.message }}\r\n </span>\r\n }\r\n\r\n @if (hint.type === 'component') {\r\n <ng-container *ngComponentOutlet=\"hint.component; inputs: mergedInputs()\" />\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { FormSchema, GroupFieldSchema } from '../schema/form-schema.model';\r\nimport {\r\n FormControl,\r\n FormGroup,\r\n Validators,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport { ControlSchema } from '../schema/form-control.model';\r\nimport {\r\n VALIDATOR_TYPES,\r\n ValidatorSchema,\r\n} from '../engine/validators/validator-schema.model';\r\n\r\n@Injectable()\r\nexport class FormBuilderService {\r\n buildForm(schema: FormSchema): FormGroup {\r\n const controls: Record<string, FormControl> = {};\r\n\r\n const collectControls = (node: FormSchema | GroupFieldSchema) => {\r\n for (const item of node.controls) {\r\n if (this.isGroupFieldSchema(item)) {\r\n collectControls(item);\r\n } else {\r\n controls[item.controlName] = new FormControl(\r\n item.initialValue ?? null,\r\n {\r\n updateOn: item.updateOn ?? schema.updateOn,\r\n validators: this.mapSchemaValidators(item.validators),\r\n },\r\n );\r\n }\r\n }\r\n };\r\n\r\n collectControls(schema);\r\n return new FormGroup(controls, { updateOn: schema.updateOn });\r\n }\r\n\r\n private mapSchemaValidators(\r\n validators?: ValidatorSchema[],\r\n ): ValidatorFn[] | null {\r\n if (!validators?.length) {\r\n return null;\r\n }\r\n\r\n return validators.map((validator) => {\r\n switch (validator.type) {\r\n case VALIDATOR_TYPES.required:\r\n return Validators.required;\r\n case VALIDATOR_TYPES.minlength:\r\n return Validators.minLength(validator.value);\r\n case VALIDATOR_TYPES.maxlength:\r\n return Validators.maxLength(validator.value);\r\n case VALIDATOR_TYPES.min:\r\n return Validators.min(validator.value);\r\n case VALIDATOR_TYPES.max:\r\n return Validators.max(validator.value);\r\n case VALIDATOR_TYPES.custom:\r\n return validator.fn;\r\n default:\r\n return () => null;\r\n }\r\n });\r\n }\r\n\r\n private isGroupFieldSchema(\r\n obj: GroupFieldSchema | ControlSchema,\r\n ): obj is GroupFieldSchema {\r\n return 'controls' in obj;\r\n }\r\n}\r\n","import { AbstractControl, FormGroup } from '@angular/forms';\r\n\r\nexport interface VisibilitySchema {\r\n fn: VisibilityFunction;\r\n behavior: VisibilityBehavior;\r\n clearOnHide?: boolean;\r\n}\r\n\r\nexport type VisibilityFunction = (control: VisibilityContext) => boolean;\r\n\r\nexport const VISIBILITY_BEHAVIORS = {\r\n hide: 'hide',\r\n disable: 'disable',\r\n} as const;\r\nexport type VisibilityBehavior =\r\n (typeof VISIBILITY_BEHAVIORS)[keyof typeof VISIBILITY_BEHAVIORS];\r\n\r\nexport interface VisibilityContext {\r\n value: unknown;\r\n form: FormGroup;\r\n control: AbstractControl;\r\n}\r\n","import { DestroyRef, inject, Injectable, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { distinctUntilChanged, Subscription } from 'rxjs';\r\nimport {\r\n BaseControlSchema,\r\n ControlSchema,\r\n} from '../../schema/form-control.model';\r\nimport { FormSchema } from '../../schema/form-schema.model';\r\nimport { FormBuilderService } from '../../services/form-builder.service';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { VISIBILITY_BEHAVIORS } from '../../schema/visibility.model';\r\n\r\n@Injectable()\r\nexport class FormService<TModel> {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly formBuilder = inject(FormBuilderService);\r\n\r\n form = signal<FormGroup | null>(null);\r\n value = signal<TModel | null>(null);\r\n valid = signal<boolean>(false);\r\n\r\n private disabledByVisibility = new Set<string>();\r\n private valueChangesSubscription?: Subscription;\r\n\r\n init(formSchema: FormSchema): void {\r\n if (!formSchema) {\r\n return;\r\n }\r\n\r\n this.valueChangesSubscription?.unsubscribe();\r\n\r\n const form = this.formBuilder.buildForm(formSchema);\r\n this.form.set(form);\r\n this.value.set(form.value);\r\n this.valid.set(form.valid);\r\n\r\n this.valueChangesSubscription = this.form()!\r\n .valueChanges.pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => {\r\n this.value.set(this.form()!.value);\r\n this.valid.set(this.form()!.valid);\r\n });\r\n }\r\n\r\n applyVisibility(\r\n controlSchema: ControlSchema,\r\n visible: boolean,\r\n clearOnHide: boolean,\r\n ): void {\r\n const visibilitySchema = controlSchema.visibility;\r\n\r\n if (!visibilitySchema) {\r\n return;\r\n }\r\n\r\n if (visibilitySchema.behavior === VISIBILITY_BEHAVIORS.disable) {\r\n if (visible) {\r\n this.disableControlByVisibility(controlSchema.controlName, clearOnHide);\r\n } else {\r\n this.enableControlByVisibility(controlSchema.controlName);\r\n }\r\n }\r\n }\r\n\r\n private getControl(controlName: BaseControlSchema['controlName']) {\r\n if (!this.form()) {\r\n console.error(\"Couldn't get control. Form is not initialized!\");\r\n return null;\r\n }\r\n\r\n const control = this.form()!.get(controlName);\r\n\r\n if (!control) {\r\n console.error(\r\n `Couldn't get control. Control with name \"${controlName}\" not found!`,\r\n );\r\n return null;\r\n }\r\n return control;\r\n }\r\n\r\n private disableControlByVisibility(\r\n controlName: BaseControlSchema['controlName'],\r\n clearOnHide?: boolean,\r\n ): void {\r\n const control = this.getControl(controlName);\r\n if (!control) return;\r\n\r\n if (clearOnHide && !this.disabledByVisibility.has(controlName)) {\r\n control.reset(null, { emitEvent: false });\r\n }\r\n\r\n if (control.enabled) {\r\n control.disable({ emitEvent: false });\r\n this.disabledByVisibility.add(controlName);\r\n }\r\n }\r\n\r\n private enableControlByVisibility(\r\n controlName: BaseControlSchema['controlName'],\r\n ): void {\r\n const control = this.getControl(controlName);\r\n if (!control) return;\r\n\r\n if (this.disabledByVisibility.has(controlName)) {\r\n control.enable({ emitEvent: false });\r\n this.disabledByVisibility.delete(controlName);\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n inject,\r\n computed,\r\n OnInit,\r\n signal,\r\n DestroyRef,\r\n effect,\r\n} from '@angular/core';\r\nimport { NgComponentOutlet } from '@angular/common';\r\nimport { AbstractControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { distinctUntilChanged } from 'rxjs';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ControlSchema } from '../../schema/form-control.model';\r\nimport { RendererRegistry } from '../renderer-template-registry/renderer-template.registry';\r\nimport { FORM_OPTIONS } from '../../schema/form-options-token';\r\nimport { ORIENTATION_OPTIONS } from '../../schema/form-options.model';\r\nimport { debouncedValueChanges } from '../../utils/debouncedSignal';\r\nimport { UPDATE_ON } from '../../schema/update-on.model';\r\nimport { ErrorRendererComponent } from '../error-renderer/error-renderer.component';\r\nimport { HintRendererComponent } from '../hint-renderer/hint-renderer.component';\r\nimport { FormService } from '../form-renderer/form.service';\r\nimport { VISIBILITY_BEHAVIORS } from '../../schema/visibility.model';\r\n\r\n@Component({\r\n selector: 'forge-form-field',\r\n templateUrl: './form-field.component.html',\r\n imports: [\r\n ReactiveFormsModule,\r\n NgComponentOutlet,\r\n ErrorRendererComponent,\r\n HintRendererComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormFieldComponent<TModel> implements OnInit {\r\n readonly control = input.required<AbstractControl>();\r\n readonly controlSchema = input.required<ControlSchema>();\r\n\r\n readonly VALUE_CHANGE_DELAY = 300;\r\n private readonly registry = inject(RendererRegistry);\r\n private readonly formOptions = inject(FORM_OPTIONS, { optional: true });\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly formService = inject(FormService<TModel>);\r\n\r\n private wasVisible = true;\r\n\r\n readonly formSignal = this.formService.form;\r\n\r\n componentType = computed(() => this.registry.get(this.controlSchema().type));\r\n\r\n labelOrientation = computed(\r\n () =>\r\n this.controlSchema().options?.labelOrientation ??\r\n this.formOptions?.labelOrientation ??\r\n ORIENTATION_OPTIONS.column,\r\n );\r\n\r\n valueChanges = signal(null);\r\n isValid = signal(false);\r\n\r\n shouldApplyDelay = computed(\r\n () =>\r\n this.controlSchema().updateOn === UPDATE_ON.change &&\r\n this.controlSchema().type !== 'checkbox',\r\n );\r\n\r\n visibilityResolved = computed(() => {\r\n const visibilitySchema = this.controlSchema().visibility;\r\n const formValue = this.formService.value();\r\n const visible = visibilitySchema?.fn({\r\n value: formValue,\r\n form: this.formSignal()!,\r\n control: this.control(),\r\n });\r\n\r\n return visibilitySchema ? visible : true;\r\n });\r\n\r\n showControl = computed(() => {\r\n const visibilitySchema = this.controlSchema().visibility;\r\n\r\n return (\r\n (!this.visibilityResolved() &&\r\n visibilitySchema?.behavior === VISIBILITY_BEHAVIORS.hide) ||\r\n !visibilitySchema ||\r\n visibilitySchema?.behavior !== VISIBILITY_BEHAVIORS.hide\r\n );\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const visibilitySchema = this.controlSchema().visibility;\r\n const visible = !!this.visibilityResolved();\r\n const becameHidden = this.wasVisible && !visible;\r\n\r\n if (!visibilitySchema) {\r\n return;\r\n }\r\n\r\n this.formService.applyVisibility(\r\n this.controlSchema(),\r\n visible,\r\n becameHidden && !!visibilitySchema.clearOnHide,\r\n );\r\n\r\n this.wasVisible = !!visible;\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n debouncedValueChanges(\r\n this.control().valueChanges,\r\n this.shouldApplyDelay() ? this.VALUE_CHANGE_DELAY : 0,\r\n this.destroyRef,\r\n ).subscribe((value) => this.valueChanges.set(value));\r\n\r\n this.isValid.set(this.control().valid);\r\n this.control()\r\n .statusChanges.pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => this.isValid.set(this.control().valid));\r\n }\r\n}\r\n","@if (showControl()) {\r\n <div\r\n data-test=\"forge-form-field-container\"\r\n [class]=\"\r\n 'forge-form-field-container forge-form-field-container--' +\r\n labelOrientation()\r\n \"\r\n [style.width]=\"controlSchema().options?.width || 'auto'\">\r\n @if (controlSchema().label) {\r\n <span class=\"forge-form-field-label\" data-test=\"forge-form-field-label\">\r\n {{ controlSchema().label }}\r\n </span>\r\n }\r\n\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n componentType();\r\n inputs: {\r\n control: control(),\r\n controlSchema: controlSchema(),\r\n isValid: isValid(),\r\n }\r\n \" />\r\n\r\n <forge-form-hint-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n\r\n <forge-form-error-renderer\r\n [control]=\"control()\"\r\n [controlSchema]=\"controlSchema()\" />\r\n </div>\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport {\r\n FieldRenderer,\r\n TextControlSchema,\r\n} from '../../../schema/form-control.model';\r\n\r\n@Component({\r\n selector: 'forge-form-text-renderer',\r\n template: `\r\n <input\r\n class=\"forge-form-input\"\r\n [class.forge-form-input-error]=\"!isValid && control.touched\"\r\n data-test=\"text-input\"\r\n [attr.id]=\"controlSchema.controlName\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"controlSchema.placeholder || controlSchema.label\" />\r\n `,\r\n standalone: true,\r\n imports: [ReactiveFormsModule],\r\n})\r\nexport class TextRendererComponent implements FieldRenderer<TextControlSchema> {\r\n @Input() control!: FormControl;\r\n @Input() controlSchema!: TextControlSchema;\r\n @Input() isValid!: boolean;\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport {\r\n FieldRenderer,\r\n NumberControlSchema,\r\n} from '../../../schema/form-control.model';\r\n\r\n@Component({\r\n selector: 'forge-form-number-renderer',\r\n template: `\r\n <input\r\n class=\"forge-form-input\"\r\n [class.forge-form-input-error]=\"!isValid && control.touched\"\r\n data-test=\"number-input\"\r\n type=\"number\"\r\n [attr.id]=\"controlSchema.controlName\"\r\n [formControl]=\"control\"\r\n [attr.min]=\"controlSchema.min\"\r\n [attr.max]=\"controlSchema.max\"\r\n [placeholder]=\"controlSchema.placeholder || controlSchema.label\" />\r\n `,\r\n standalone: true,\r\n imports: [ReactiveFormsModule],\r\n})\r\nexport class NumberRendererComponent implements FieldRenderer<NumberControlSchema> {\r\n @Input() control!: FormControl;\r\n @Input() controlSchema!: NumberControlSchema;\r\n @Input() isValid!: boolean;\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport {\r\n FieldRenderer,\r\n CheckboxControlSchema,\r\n} from '../../../schema/form-control.model';\r\n\r\n@Component({\r\n selector: 'forge-form-checkbox-renderer',\r\n template: `\r\n <input\r\n class=\"forge-form-checkbox\"\r\n [class.forge-form-checkbox-error]=\"!isValid && control.dirty\"\r\n data-test=\"checkbox-input\"\r\n type=\"checkbox\"\r\n [attr.id]=\"controlSchema.controlName\"\r\n [formControl]=\"control\" />\r\n `,\r\n standalone: true,\r\n imports: [ReactiveFormsModule],\r\n})\r\nexport class CheckboxRendererComponent implements FieldRenderer<CheckboxControlSchema> {\r\n @Input() control!: FormControl;\r\n @Input() controlSchema!: CheckboxControlSchema;\r\n @Input() isValid!: boolean;\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport {\r\n FieldRenderer,\r\n SelectControlSchema,\r\n} from '../../../schema/form-control.model';\r\n\r\n@Component({\r\n selector: 'forge-form-select-renderer',\r\n template: `\r\n <select\r\n class=\"forge-form-select\"\r\n [class.forge-form-input-error]=\"!isValid && control.touched\"\r\n data-test=\"select-input\"\r\n [attr.id]=\"controlSchema.controlName\"\r\n [formControl]=\"control\">\r\n @if (controlSchema.placeholder || controlSchema.label) {\r\n <option data-test=\"select-placeholder\" [ngValue]=\"null\" disabled>\r\n {{ controlSchema.placeholder || controlSchema.label }}\r\n </option>\r\n }\r\n\r\n @for (option of controlSchema.items; track option.value) {\r\n <option data-test=\"select-option\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </option>\r\n }\r\n </select>\r\n `,\r\n standalone: true,\r\n imports: [ReactiveFormsModule],\r\n})\r\nexport class SelectRendererComponent implements FieldRenderer<SelectControlSchema> {\r\n @Input() control!: FormControl;\r\n @Input() controlSchema!: SelectControlSchema;\r\n @Input() isValid!: boolean;\r\n}\r\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { GroupFieldSchema } from '../../schema/form-schema.model';\r\nimport { FormBuilderService } from '../../services/form-builder.service';\r\nimport { FormFieldComponent } from '../form-field/form-field.component';\r\nimport {\r\n RendererRegistry,\r\n RENDERERS,\r\n} from '../renderer-template-registry/renderer-template.registry';\r\nimport { TextRendererComponent } from '../form-field-renderers/text-field-renderer/text-field-renderer.component';\r\nimport { NumberRendererComponent } from '../form-field-renderers/number-field-renderer/number-field-renderer.component';\r\nimport { CheckboxRendererComponent } from '../form-field-renderers/checkbox-field-renderer/checkbox-field-renderer.component';\r\nimport { SelectRendererComponent } from '../form-field-renderers/select-field-renderer/select-field-renderer.component';\r\n\r\n@Component({\r\n selector: 'forge-form-group-renderer',\r\n templateUrl: './group-renderer.component.html',\r\n imports: [ReactiveFormsModule, FormFieldComponent],\r\n providers: [\r\n FormBuilderService,\r\n RendererRegistry,\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'text',\r\n component: TextRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'number',\r\n component: NumberRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'checkbox',\r\n component: CheckboxRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'select',\r\n component: SelectRendererComponent,\r\n },\r\n },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class GroupRendererComponent {\r\n form = input.required<FormGroup>();\r\n schema = input.required<GroupFieldSchema>();\r\n}\r\n","<div\r\n data-test=\"group-container\"\r\n [class]=\"\r\n 'forge-form-group forge-form-group--' + schema().options?.orientation\r\n \">\r\n @for (subjectSchema of schema().controls; track subjectSchema) {\r\n @if (subjectSchema.type === 'group') {\r\n <forge-form-group-renderer\r\n data-test=\"nested-group\"\r\n [form]=\"form()\"\r\n [schema]=\"subjectSchema\" />\r\n } @else {\r\n <forge-form-field\r\n data-test=\"group-field\"\r\n [controlSchema]=\"subjectSchema\"\r\n [control]=\"form().get(subjectSchema.controlName)!\" />\r\n }\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n effect,\r\n inject,\r\n output,\r\n computed,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { FormSchema } from '../../schema/form-schema.model';\r\nimport { FormFieldComponent } from '../form-field/form-field.component';\r\nimport {\r\n RendererRegistry,\r\n RENDERERS,\r\n} from '../renderer-template-registry/renderer-template.registry';\r\nimport { TextRendererComponent } from '../form-field-renderers/text-field-renderer/text-field-renderer.component';\r\nimport { NumberRendererComponent } from '../form-field-renderers/number-field-renderer/number-field-renderer.component';\r\nimport { CheckboxRendererComponent } from '../form-field-renderers/checkbox-field-renderer/checkbox-field-renderer.component';\r\nimport { SelectRendererComponent } from '../form-field-renderers/select-field-renderer/select-field-renderer.component';\r\nimport { GroupRendererComponent } from '../group-renderer/group-renderer.component';\r\nimport { FORM_OPTIONS } from '../../schema/form-options-token';\r\nimport {\r\n DEFAULT_ERROR_FALLBACK,\r\n DEFAULT_ERROR_MESSAGES,\r\n ERROR_MESSAGES,\r\n} from '../error-messages/error-messages.registry';\r\nimport { FormService } from './form.service';\r\nimport { FormBuilderService } from '../../services/form-builder.service';\r\nimport { THEMES } from '../../schema/form-options.model';\r\n\r\n@Component({\r\n selector: 'forge-form-angular',\r\n templateUrl: './form-renderer.component.html',\r\n imports: [ReactiveFormsModule, FormFieldComponent, GroupRendererComponent],\r\n providers: [\r\n FormBuilderService,\r\n RendererRegistry,\r\n FormService,\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'text',\r\n component: TextRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'number',\r\n component: NumberRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'checkbox',\r\n component: CheckboxRendererComponent,\r\n },\r\n },\r\n {\r\n provide: RENDERERS,\r\n multi: true,\r\n useValue: {\r\n type: 'select',\r\n component: SelectRendererComponent,\r\n },\r\n },\r\n {\r\n provide: FORM_OPTIONS,\r\n useFactory: (component: FormRendererComponent<unknown>) =>\r\n component.schema().options,\r\n deps: [FormRendererComponent],\r\n },\r\n {\r\n provide: ERROR_MESSAGES,\r\n useValue: DEFAULT_ERROR_MESSAGES,\r\n multi: true,\r\n },\r\n { provide: DEFAULT_ERROR_FALLBACK, useValue: 'Invalid field', multi: true },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormRendererComponent<TModel> {\r\n private readonly formService = inject(FormService<TModel>);\r\n\r\n readonly schema = input.required<FormSchema>();\r\n readonly formSubmit = output<TModel>();\r\n\r\n readonly THEMES = THEMES;\r\n\r\n readonly formSignal = this.formService.form;\r\n\r\n value = computed(() => this.formService.value());\r\n valid = computed(() => this.formService.valid());\r\n\r\n constructor() {\r\n effect(() => {\r\n this.formService.init(this.schema());\r\n });\r\n }\r\n\r\n getControl(name: string): FormControl {\r\n return this.formSignal()!.get(name) as FormControl;\r\n }\r\n\r\n onSubmit() {\r\n if (this.formSignal()!.valid) {\r\n this.formSubmit.emit(this.formSignal()!.value);\r\n }\r\n }\r\n}\r\n","@if (!!formSignal()) {\r\n <form\r\n [class]=\"'forge-form forge-form--' + schema().options?.orientation\"\r\n [class.forge-theme-default]=\"schema().options?.theme === THEMES.default\"\r\n [formGroup]=\"formSignal()!\"\r\n (ngSubmit)=\"onSubmit()\"\r\n data-test=\"form\">\r\n @for (subjectSchema of schema().controls; track subjectSchema) {\r\n @if (subjectSchema.type === 'group') {\r\n <forge-form-group-renderer\r\n data-test=\"group-renderer\"\r\n [form]=\"formSignal()!\"\r\n [schema]=\"subjectSchema\" />\r\n } @else {\r\n <forge-form-field\r\n data-test=\"form-field\"\r\n [controlSchema]=\"subjectSchema\"\r\n [control]=\"formSignal()!.get(subjectSchema.controlName)!\" />\r\n }\r\n }\r\n\r\n @if (!schema().options?.hideSubmitButton) {\r\n <button\r\n class=\"forge-form-button\"\r\n [disabled]=\"!formSignal()?.valid\"\r\n data-test=\"submit-button\"\r\n type=\"submit\">\r\n Submit\r\n </button>\r\n }\r\n </form>\r\n}\r\n","import { Directive, input } from '@angular/core';\r\nimport { AbstractControl, ValidationErrors } from '@angular/forms';\r\n\r\n@Directive()\r\nexport abstract class FormFieldContextComponent<T = unknown> {\r\n control = input.required<AbstractControl<T>>();\r\n controlValue = input.required<T>();\r\n controlErrors = input<ValidationErrors | null>(null);\r\n controlSchema = input.required<unknown>();\r\n}\r\n","import { ErrorMessageContent } from '../error-messages/error-messages.model';\r\nimport {\r\n ValidatorSchema,\r\n ValidatorFunction,\r\n VALIDATOR_TYPES,\r\n} from './validator-schema.model';\r\n\r\nexport interface ValidatorCredentials {\r\n value?: number | string;\r\n key?: string;\r\n fn?: ValidatorFunction;\r\n errorMessage?: ErrorMessageContent;\r\n}\r\n\r\nexport const required = (\r\n credentials?: ValidatorCredentials,\r\n): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.required,\r\n errorMessage: credentials?.errorMessage,\r\n});\r\n\r\nexport const minLength = ({\r\n value,\r\n errorMessage,\r\n}: ValidatorCredentials): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.minlength,\r\n value: +value!,\r\n errorMessage,\r\n});\r\n\r\nexport const maxLength = ({\r\n value,\r\n errorMessage,\r\n}: ValidatorCredentials): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.maxlength,\r\n value: +value!,\r\n errorMessage,\r\n});\r\n\r\nexport const min = ({\r\n value,\r\n errorMessage,\r\n}: ValidatorCredentials): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.min,\r\n value: +value!,\r\n errorMessage,\r\n});\r\n\r\nexport const max = ({\r\n value,\r\n errorMessage,\r\n}: ValidatorCredentials): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.max,\r\n value: +value!,\r\n errorMessage,\r\n});\r\n\r\nexport const customValidator = ({\r\n key,\r\n fn,\r\n errorMessage,\r\n}: ValidatorCredentials): ValidatorSchema => ({\r\n type: VALIDATOR_TYPES.custom,\r\n key: key ?? '',\r\n fn: fn ?? (() => null),\r\n errorMessage,\r\n});\r\n","import { Signal, Type } from '@angular/core';\r\nimport { AbstractControl, ValidationErrors } from '@angular/forms';\r\n\r\nexport const HINT_TYPES = {\r\n text: 'text',\r\n custom: 'custom',\r\n} as const;\r\nexport type HintType = (typeof HINT_TYPES)[keyof typeof HINT_TYPES];\r\n\r\nexport type HintMessage = string | HintComponentDef;\r\n\r\nexport interface HintComponentDef {\r\n component: Type<unknown>;\r\n inputs?: Record<string, unknown>;\r\n}\r\n\r\nexport interface HintContext {\r\n control: AbstractControl;\r\n value: Signal<unknown>;\r\n errors: Signal<ValidationErrors | null>;\r\n}\r\n","/*\r\n * Public API Surface of @forge-form/angular\r\n */\r\n\r\n// Main entry component\r\nexport { FormRendererComponent } from './lib/engine/form-renderer/form-renderer.component';\r\n\r\n// Base class for custom hint / error components\r\nexport { FormFieldContextComponent } from './lib/engine/form-field/form-field-context.component';\r\n\r\n// Schema models\r\nexport type {\r\n FormSchema,\r\n GroupFieldSchema,\r\n} from './lib/schema/form-schema.model';\r\nexport type {\r\n ControlSchema,\r\n BaseElementSchema,\r\n BaseControlSchema,\r\n TextControlSchema,\r\n NumberControlSchema,\r\n CheckboxControlSchema,\r\n SelectControlSchema,\r\n SelectOption,\r\n FieldRenderer,\r\n} from './lib/schema/form-control.model';\r\nexport { ORIENTATION_OPTIONS, THEMES } from './lib/schema/form-options.model';\r\nexport type {\r\n OrientationOption,\r\n ThemeOption,\r\n FormOptions,\r\n ElementFormOptions,\r\n FormFieldOptions,\r\n} from './lib/schema/form-options.model';\r\nexport { UPDATE_ON } from './lib/schema/update-on.model';\r\nexport type { UpdateOn } from './lib/schema/update-on.model';\r\nexport { VISIBILITY_BEHAVIORS } from './lib/schema/visibility.model';\r\nexport type {\r\n VisibilitySchema,\r\n VisibilityFunction,\r\n VisibilityBehavior,\r\n VisibilityContext,\r\n} from './lib/schema/visibility.model';\r\n\r\n// Dependency-injection tokens & extension points\r\nexport { FORM_OPTIONS } from './lib/schema/form-options-token';\r\nexport {\r\n RENDERERS,\r\n RendererRegistry,\r\n} from './lib/engine/renderer-template-registry/renderer-template.registry';\r\nexport type { RendererDef } from './lib/engine/renderer-template-registry/renderer-template.registry';\r\n\r\n// Validators\r\nexport {\r\n required,\r\n minLength,\r\n maxLength,\r\n min,\r\n max,\r\n customValidator,\r\n} from './lib/engine/validators/validator-helpers';\r\nexport type { ValidatorCredentials } from './lib/engine/validators/validator-helpers';\r\nexport { VALIDATOR_TYPES } from './lib/engine/validators/validator-schema.model';\r\nexport type {\r\n ValidatorSchema,\r\n ValidatorType,\r\n ValidatorFunction,\r\n BaseValidatorSchema,\r\n RequiredValidatorSchema,\r\n MinLengthValidatorSchema,\r\n MaxLengthValidatorSchema,\r\n MinValidatorSchema,\r\n MaxValidatorSchema,\r\n CustomValidatorSchema,\r\n} from './lib/engine/validators/validator-schema.model';\r\n\r\n// Error messages\r\nexport {\r\n ERROR_MESSAGES,\r\n DEFAULT_ERROR_FALLBACK,\r\n DEFAULT_ERROR_MESSAGES,\r\n} from './lib/engine/error-messages/error-messages.registry';\r\nexport type {\r\n ErrorMessage,\r\n ErrorMessageContent,\r\n ErrorComponentDef,\r\n} from './lib/engine/error-messages/error-messages.model';\r\n\r\n// Hint messages\r\nexport { HINT_TYPES } from './lib/engine/hint-messages/hint-messages.model';\r\nexport type {\r\n HintMessage,\r\n HintComponentDef,\r\n HintContext,\r\n HintType,\r\n} from './lib/engine/hint-messages/hint-messages.model';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forge-form/angular",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Schema-driven, signal-based reactive form engine for Angular.",
|
|
5
5
|
"author": "Marcin Spasinski",
|
|
6
6
|
"license": "MIT",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "git",
|
|
9
9
|
"url": "https://github.com/mspas/forge-form"
|
|
10
10
|
},
|
|
11
|
-
"homepage": "https://
|
|
11
|
+
"homepage": "https://forgeform.dev",
|
|
12
12
|
"bugs": {
|
|
13
13
|
"url": "https://github.com/mspas/forge-form/issues"
|
|
14
14
|
},
|
|
@@ -4,12 +4,20 @@
|
|
|
4
4
|
--forge-gap-small: 0.5rem;
|
|
5
5
|
--forge-gap-medium: 0.75rem;
|
|
6
6
|
|
|
7
|
+
--forge-checkbox-margin-left: 0.25rem;
|
|
8
|
+
--forge-checkbox-margin-right: 0.25rem;
|
|
9
|
+
|
|
10
|
+
--forge-border-width: 0.1rem;
|
|
7
11
|
--forge-border-radius: 0.25rem;
|
|
8
12
|
|
|
9
|
-
--forge-color-
|
|
13
|
+
--forge-color-font: #202020;
|
|
10
14
|
--forge-color-border: rgba(32, 32, 32, 0.5);
|
|
11
15
|
--forge-color-disabled: #b6b6b6;
|
|
12
16
|
--forge-color-error: #b60000;
|
|
17
|
+
--forge-color-checkbox-bg: #ffffff;
|
|
18
|
+
--forge-color-button-bg: #ffffff;
|
|
19
|
+
|
|
20
|
+
--forge-checkbox-size: 1.2em;
|
|
13
21
|
|
|
14
22
|
&.forge-form {
|
|
15
23
|
font-family: Montserrat, sans-serif;
|
|
@@ -31,13 +39,13 @@
|
|
|
31
39
|
}
|
|
32
40
|
|
|
33
41
|
.forge-form-field-label {
|
|
34
|
-
color: var(--forge-color-
|
|
42
|
+
color: var(--forge-color-font);
|
|
35
43
|
font-weight: 600;
|
|
36
44
|
}
|
|
37
45
|
|
|
38
46
|
.forge-form-hint {
|
|
39
47
|
font-size: 12px;
|
|
40
|
-
color: var(--forge-color-
|
|
48
|
+
color: var(--forge-color-font);
|
|
41
49
|
}
|
|
42
50
|
|
|
43
51
|
.forge-form-error {
|
|
@@ -51,14 +59,57 @@
|
|
|
51
59
|
border: 1px solid var(--forge-color-border);
|
|
52
60
|
border-radius: var(--forge-border-radius);
|
|
53
61
|
padding: 0.5rem 0.75rem;
|
|
62
|
+
|
|
63
|
+
&-error {
|
|
64
|
+
border-color: var(--forge-color-error);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.forge-form-checkbox {
|
|
69
|
+
display: flex;
|
|
70
|
+
justify-content: center;
|
|
71
|
+
align-items: center;
|
|
72
|
+
cursor: pointer;
|
|
73
|
+
appearance: none;
|
|
74
|
+
background-color: var(--forge-color-checkbox-bg);
|
|
75
|
+
margin-block: 0;
|
|
76
|
+
margin-inline: var(--forge-checkbox-margin-left)
|
|
77
|
+
var(--forge-checkbox-margin-right);
|
|
78
|
+
color: var(--forge-color-border);
|
|
79
|
+
width: var(--forge-checkbox-size);
|
|
80
|
+
height: var(--forge-checkbox-size);
|
|
81
|
+
border: var(--forge-border-width) solid var(--forge-color-border);
|
|
82
|
+
border-radius: var(--forge-border-radius);
|
|
83
|
+
transform: translateY(-0.075em);
|
|
84
|
+
|
|
85
|
+
&::before {
|
|
86
|
+
content: '';
|
|
87
|
+
width: calc(var(--forge-checkbox-size) * 0.5);
|
|
88
|
+
height: calc(var(--forge-checkbox-size) * 0.5);
|
|
89
|
+
transform: scale(0);
|
|
90
|
+
transition: 120ms transform ease-in-out;
|
|
91
|
+
box-shadow: inset 1em 1em var(--forge-color-font);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
&:checked::before {
|
|
95
|
+
transform: scale(1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.forge-form-checkbox-error {
|
|
100
|
+
border-color: var(--forge-color-error);
|
|
101
|
+
|
|
102
|
+
&::before {
|
|
103
|
+
box-shadow: inset 1em 1em var(--forge-color-error);
|
|
104
|
+
}
|
|
54
105
|
}
|
|
55
106
|
|
|
56
107
|
.forge-form-button {
|
|
57
108
|
padding: 0.5rem 1rem;
|
|
58
|
-
border: 1px solid var(--forge-color-
|
|
109
|
+
border: 1px solid var(--forge-color-font);
|
|
59
110
|
border-radius: var(--forge-border-radius);
|
|
60
|
-
background-color:
|
|
61
|
-
color: var(--forge-color-
|
|
111
|
+
background-color: var(--forge-color-button-bg);
|
|
112
|
+
color: var(--forge-color-font);
|
|
62
113
|
font-weight: 600;
|
|
63
114
|
cursor: pointer;
|
|
64
115
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as _angular_forms from '@angular/forms';
|
|
2
2
|
import { ValidationErrors, AbstractControl, FormGroup, FormControl } from '@angular/forms';
|
|
3
|
-
import * as
|
|
3
|
+
import * as _angular_core from '@angular/core';
|
|
4
4
|
import { Type, Signal, InjectionToken } from '@angular/core';
|
|
5
5
|
|
|
6
6
|
type ErrorMessageContent = string | ((error: ValidationErrors) => string) | ErrorComponentDef;
|
|
@@ -76,6 +76,7 @@ interface BaseFormOptions {
|
|
|
76
76
|
}
|
|
77
77
|
interface FormOptions extends BaseFormOptions {
|
|
78
78
|
theme?: ThemeOption;
|
|
79
|
+
hideSubmitButton?: boolean;
|
|
79
80
|
}
|
|
80
81
|
type ElementFormOptions = BaseFormOptions;
|
|
81
82
|
interface FormFieldOptions extends BaseFormOptions {
|
|
@@ -170,27 +171,29 @@ interface FormSchema {
|
|
|
170
171
|
|
|
171
172
|
declare class FormRendererComponent<TModel> {
|
|
172
173
|
private readonly formService;
|
|
173
|
-
readonly schema:
|
|
174
|
-
readonly formSubmit:
|
|
174
|
+
readonly schema: _angular_core.InputSignal<FormSchema>;
|
|
175
|
+
readonly formSubmit: _angular_core.OutputEmitterRef<TModel>;
|
|
175
176
|
readonly THEMES: {
|
|
176
177
|
readonly none: "none";
|
|
177
178
|
readonly default: "default";
|
|
178
179
|
};
|
|
179
|
-
readonly formSignal:
|
|
180
|
+
readonly formSignal: _angular_core.WritableSignal<_angular_forms.FormGroup<any> | null>;
|
|
181
|
+
value: _angular_core.Signal<any>;
|
|
182
|
+
valid: _angular_core.Signal<boolean>;
|
|
180
183
|
constructor();
|
|
181
184
|
getControl(name: string): FormControl;
|
|
182
185
|
onSubmit(): void;
|
|
183
|
-
static ɵfac:
|
|
184
|
-
static ɵcmp:
|
|
186
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormRendererComponent<any>, never>;
|
|
187
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormRendererComponent<any>, "forge-form-angular", never, { "schema": { "alias": "schema"; "required": true; "isSignal": true; }; }, { "formSubmit": "formSubmit"; }, never, never, true, never>;
|
|
185
188
|
}
|
|
186
189
|
|
|
187
190
|
declare abstract class FormFieldContextComponent<T = unknown> {
|
|
188
|
-
control:
|
|
189
|
-
controlValue:
|
|
190
|
-
controlErrors:
|
|
191
|
-
controlSchema:
|
|
192
|
-
static ɵfac:
|
|
193
|
-
static ɵdir:
|
|
191
|
+
control: _angular_core.InputSignal<AbstractControl<T, T, any>>;
|
|
192
|
+
controlValue: _angular_core.InputSignal<T>;
|
|
193
|
+
controlErrors: _angular_core.InputSignal<ValidationErrors | null>;
|
|
194
|
+
controlSchema: _angular_core.InputSignal<unknown>;
|
|
195
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormFieldContextComponent<any>, never>;
|
|
196
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FormFieldContextComponent<any>, never, never, { "control": { "alias": "control"; "required": true; "isSignal": true; }; "controlValue": { "alias": "controlValue"; "required": true; "isSignal": true; }; "controlErrors": { "alias": "controlErrors"; "required": false; "isSignal": true; }; "controlSchema": { "alias": "controlSchema"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
194
197
|
}
|
|
195
198
|
|
|
196
199
|
declare const FORM_OPTIONS: InjectionToken<FormOptions>;
|
|
@@ -204,8 +207,8 @@ declare class RendererRegistry {
|
|
|
204
207
|
private map;
|
|
205
208
|
constructor(renderers?: RendererDef[][]);
|
|
206
209
|
get(type: string): Type<FieldRenderer>;
|
|
207
|
-
static ɵfac:
|
|
208
|
-
static ɵprov:
|
|
210
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<RendererRegistry, never>;
|
|
211
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<RendererRegistry>;
|
|
209
212
|
}
|
|
210
213
|
|
|
211
214
|
interface ValidatorCredentials {
|