@ng-modular-forms/core 0.6.1 → 0.7.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.
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
import * as i2 from '@angular/forms';
|
|
2
2
|
import { NgControl, FormControl, Validators, TouchedChangeEvent, ReactiveFormsModule, FormGroup } from '@angular/forms';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { inject,
|
|
4
|
+
import { inject, DestroyRef, input, booleanAttribute, signal, computed, Directive, ChangeDetectionStrategy, Component, Injectable } from '@angular/core';
|
|
5
5
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
|
-
import {
|
|
6
|
+
import { merge, startWith, Subscription } from 'rxjs';
|
|
7
7
|
import * as i1 from '@angular/common';
|
|
8
8
|
import { CommonModule } from '@angular/common';
|
|
9
9
|
|
|
10
10
|
class FormControlBase {
|
|
11
|
-
cdr = inject(ChangeDetectorRef);
|
|
12
11
|
destroyRef = inject(DestroyRef);
|
|
13
12
|
static nextId = 0;
|
|
14
|
-
id = input(`nmf-form-control-${FormControlBase.nextId++}
|
|
15
|
-
_id = input(null, { alias: 'id' });
|
|
13
|
+
id = input(`nmf-form-control-${FormControlBase.nextId++}`, { alias: 'id' });
|
|
16
14
|
label = input('');
|
|
17
15
|
classList = input([]);
|
|
18
16
|
loading = input(false);
|
|
@@ -26,71 +24,49 @@ class FormControlBase {
|
|
|
26
24
|
self: true,
|
|
27
25
|
optional: true,
|
|
28
26
|
});
|
|
29
|
-
|
|
27
|
+
standaloneControl = new FormControl(null);
|
|
28
|
+
get formControl() {
|
|
29
|
+
return (this.ngControl?.control ??
|
|
30
|
+
this.standaloneControl);
|
|
31
|
+
}
|
|
30
32
|
disabled = computed(() => this._disabledByInput() || this._disabledByCva());
|
|
31
33
|
isRequired = signal(this.ngControl?.control?.hasValidator(Validators.required) ?? false);
|
|
32
34
|
hasErrors = signal(false);
|
|
33
|
-
changeSub = new Subscription();
|
|
34
35
|
onChange = () => { };
|
|
35
36
|
onTouched = () => { };
|
|
36
37
|
constructor() {
|
|
37
38
|
if (this.ngControl) {
|
|
38
39
|
this.ngControl.valueAccessor = this;
|
|
39
40
|
}
|
|
40
|
-
effect(() => {
|
|
41
|
-
const inputDisabled = this._disabledByInput();
|
|
42
|
-
const cvaDisabled = this._disabledByCva();
|
|
43
|
-
if (inputDisabled || cvaDisabled) {
|
|
44
|
-
this.control.disable({ emitEvent: false });
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
this.control.enable({ emitEvent: true });
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
41
|
}
|
|
51
42
|
ngOnInit() {
|
|
52
|
-
const
|
|
53
|
-
if (!
|
|
43
|
+
const control = this.ngControl?.control;
|
|
44
|
+
if (!control)
|
|
54
45
|
return;
|
|
55
|
-
|
|
46
|
+
merge(control.statusChanges, control.valueChanges)
|
|
56
47
|
.pipe(startWith(null), takeUntilDestroyed(this.destroyRef))
|
|
57
48
|
.subscribe(() => {
|
|
58
|
-
this.
|
|
59
|
-
this.control.
|
|
60
|
-
this.control.updateValueAndValidity({ emitEvent: false });
|
|
61
|
-
this.hasErrors.set(parent.invalid && parent.touched);
|
|
62
|
-
this.isRequired.set(parent.hasValidator(Validators.required) ?? false);
|
|
63
|
-
this.cdr.markForCheck();
|
|
49
|
+
this.hasErrors.set(control.invalid && control.touched);
|
|
50
|
+
this.isRequired.set(control.hasValidator(Validators.required) ?? false);
|
|
64
51
|
});
|
|
65
|
-
|
|
52
|
+
control.events
|
|
66
53
|
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
67
54
|
.subscribe((event) => {
|
|
68
55
|
if (event instanceof TouchedChangeEvent) {
|
|
69
|
-
|
|
70
|
-
this.control.markAsTouched();
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
this.control.markAsUntouched();
|
|
74
|
-
}
|
|
75
|
-
this.hasErrors.set(parent.invalid && parent.touched);
|
|
76
|
-
this.cdr.markForCheck();
|
|
56
|
+
this.hasErrors.set(control.invalid && control.touched);
|
|
77
57
|
}
|
|
78
58
|
});
|
|
79
|
-
parent.valueChanges
|
|
80
|
-
.pipe(startWith(null), takeUntilDestroyed(this.destroyRef))
|
|
81
|
-
.subscribe(() => this.cdr.markForCheck());
|
|
82
59
|
}
|
|
83
60
|
writeValue(value) {
|
|
84
|
-
this.control
|
|
61
|
+
const control = this.ngControl?.control;
|
|
62
|
+
if (!control)
|
|
63
|
+
return;
|
|
64
|
+
if (control.value !== value) {
|
|
65
|
+
control.setValue(value, { emitEvent: false });
|
|
66
|
+
}
|
|
85
67
|
}
|
|
86
68
|
registerOnChange(fn) {
|
|
87
69
|
this.onChange = fn;
|
|
88
|
-
this.changeSub.unsubscribe();
|
|
89
|
-
this.changeSub = this.control.valueChanges
|
|
90
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
91
|
-
.subscribe((v) => {
|
|
92
|
-
fn(v);
|
|
93
|
-
});
|
|
94
70
|
}
|
|
95
71
|
registerOnTouched(fn) {
|
|
96
72
|
this.onTouched = fn;
|
|
@@ -129,7 +105,7 @@ class FormControlBase {
|
|
|
129
105
|
}
|
|
130
106
|
}
|
|
131
107
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: FormControlBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
132
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.21", type: FormControlBase, isStandalone: true, inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null },
|
|
108
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.21", type: FormControlBase, isStandalone: true, inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, classList: { classPropertyName: "classList", publicName: "classList", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, _disabledByInput: { classPropertyName: "_disabledByInput", publicName: "_disabledByInput", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
133
109
|
}
|
|
134
110
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: FormControlBase, decorators: [{
|
|
135
111
|
type: Directive
|
|
@@ -367,11 +343,16 @@ class InputCurrencyComponent extends FormControlBase {
|
|
|
367
343
|
{{ errorMessage() }}
|
|
368
344
|
</p>
|
|
369
345
|
</div>
|
|
370
|
-
`, isInline: true,
|
|
346
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
371
347
|
}
|
|
372
348
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputCurrencyComponent, decorators: [{
|
|
373
349
|
type: Component,
|
|
374
|
-
args: [{
|
|
350
|
+
args: [{
|
|
351
|
+
selector: 'nmf-currency',
|
|
352
|
+
standalone: true,
|
|
353
|
+
imports: [CommonModule, ReactiveFormsModule],
|
|
354
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
355
|
+
template: `
|
|
375
356
|
<div class="nmf-field">
|
|
376
357
|
@if (label()) {
|
|
377
358
|
<label class="nmf-label">
|
|
@@ -427,7 +408,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
427
408
|
{{ errorMessage() }}
|
|
428
409
|
</p>
|
|
429
410
|
</div>
|
|
430
|
-
`,
|
|
411
|
+
`,
|
|
412
|
+
}]
|
|
431
413
|
}] });
|
|
432
414
|
|
|
433
415
|
class InputDatepickerComponent extends FormControlBase {
|
|
@@ -503,11 +485,16 @@ class InputDatepickerComponent extends FormControlBase {
|
|
|
503
485
|
{{ errorMessage() }}
|
|
504
486
|
</p>
|
|
505
487
|
</div>
|
|
506
|
-
`, isInline: true,
|
|
488
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
507
489
|
}
|
|
508
490
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputDatepickerComponent, decorators: [{
|
|
509
491
|
type: Component,
|
|
510
|
-
args: [{
|
|
492
|
+
args: [{
|
|
493
|
+
selector: 'nmf-datepicker',
|
|
494
|
+
standalone: true,
|
|
495
|
+
imports: [CommonModule, ReactiveFormsModule],
|
|
496
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
497
|
+
template: `
|
|
511
498
|
<div class="nmf-field" [class.loading]="loading()">
|
|
512
499
|
@if (label()) {
|
|
513
500
|
<label class="nmf-label">
|
|
@@ -548,7 +535,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
548
535
|
{{ errorMessage() }}
|
|
549
536
|
</p>
|
|
550
537
|
</div>
|
|
551
|
-
`,
|
|
538
|
+
`,
|
|
539
|
+
}]
|
|
552
540
|
}] });
|
|
553
541
|
|
|
554
542
|
class InputNumberComponent extends FormControlBase {
|
|
@@ -621,11 +609,16 @@ class InputNumberComponent extends FormControlBase {
|
|
|
621
609
|
</div>
|
|
622
610
|
}
|
|
623
611
|
</div>
|
|
624
|
-
`, isInline: true,
|
|
612
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
625
613
|
}
|
|
626
614
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputNumberComponent, decorators: [{
|
|
627
615
|
type: Component,
|
|
628
|
-
args: [{
|
|
616
|
+
args: [{
|
|
617
|
+
selector: 'nmf-number',
|
|
618
|
+
standalone: true,
|
|
619
|
+
imports: [CommonModule, ReactiveFormsModule],
|
|
620
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
621
|
+
template: `
|
|
629
622
|
<div class="nmf-field">
|
|
630
623
|
@if (label()) {
|
|
631
624
|
<label class="nmf-label">
|
|
@@ -666,7 +659,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
666
659
|
</div>
|
|
667
660
|
}
|
|
668
661
|
</div>
|
|
669
|
-
`,
|
|
662
|
+
`,
|
|
663
|
+
}]
|
|
670
664
|
}] });
|
|
671
665
|
|
|
672
666
|
class InputSelectComponent extends FormControlBase {
|
|
@@ -684,35 +678,36 @@ class InputSelectComponent extends FormControlBase {
|
|
|
684
678
|
}
|
|
685
679
|
</label>
|
|
686
680
|
}
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
</option>
|
|
701
|
-
|
|
702
|
-
<!-- Options -->
|
|
703
|
-
@for (option of options(); track option.key) {
|
|
704
|
-
<option [ngValue]="option.key" [disabled]="option.disabled">
|
|
705
|
-
{{ option.label }}
|
|
681
|
+
<div class="select-wrapper" [class.disabled]="disabled()">
|
|
682
|
+
<select
|
|
683
|
+
class="nmf-input"
|
|
684
|
+
[ngClass]="classList()"
|
|
685
|
+
[class.error]="hasErrors()"
|
|
686
|
+
[class.disabled]="disabled()"
|
|
687
|
+
[required]="isRequired()"
|
|
688
|
+
[formControl]="formControl"
|
|
689
|
+
(blur)="onTouched()"
|
|
690
|
+
>
|
|
691
|
+
<!-- Empty option -->
|
|
692
|
+
<option [ngValue]="null" disabled>
|
|
693
|
+
{{ emptyOptionLabel() }}
|
|
706
694
|
</option>
|
|
707
|
-
}
|
|
708
695
|
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
696
|
+
<!-- Options -->
|
|
697
|
+
@for (option of options(); track option.key) {
|
|
698
|
+
<option [ngValue]="option.key" [disabled]="option.disabled">
|
|
699
|
+
{{ option.label }}
|
|
700
|
+
</option>
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
<!-- Clear option -->
|
|
704
|
+
@if (clearOptionLabel()) {
|
|
705
|
+
<option [ngValue]="null">
|
|
706
|
+
{{ clearOptionLabel() }}
|
|
707
|
+
</option>
|
|
708
|
+
}
|
|
709
|
+
</select>
|
|
710
|
+
</div>
|
|
716
711
|
|
|
717
712
|
@if (loading()) {
|
|
718
713
|
<div class="nmf-loading">
|
|
@@ -724,11 +719,16 @@ class InputSelectComponent extends FormControlBase {
|
|
|
724
719
|
{{ errorMessage() }}
|
|
725
720
|
</p>
|
|
726
721
|
</div>
|
|
727
|
-
`, isInline: true,
|
|
722
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
728
723
|
}
|
|
729
724
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputSelectComponent, decorators: [{
|
|
730
725
|
type: Component,
|
|
731
|
-
args: [{
|
|
726
|
+
args: [{
|
|
727
|
+
selector: 'nmf-select',
|
|
728
|
+
standalone: true,
|
|
729
|
+
imports: [CommonModule, ReactiveFormsModule],
|
|
730
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
731
|
+
template: `
|
|
732
732
|
<div class="nmf-field" [class.loading]="loading()">
|
|
733
733
|
@if (label()) {
|
|
734
734
|
<label class="nmf-label">
|
|
@@ -738,35 +738,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
738
738
|
}
|
|
739
739
|
</label>
|
|
740
740
|
}
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
</option>
|
|
755
|
-
|
|
756
|
-
<!-- Options -->
|
|
757
|
-
@for (option of options(); track option.key) {
|
|
758
|
-
<option [ngValue]="option.key" [disabled]="option.disabled">
|
|
759
|
-
{{ option.label }}
|
|
741
|
+
<div class="select-wrapper" [class.disabled]="disabled()">
|
|
742
|
+
<select
|
|
743
|
+
class="nmf-input"
|
|
744
|
+
[ngClass]="classList()"
|
|
745
|
+
[class.error]="hasErrors()"
|
|
746
|
+
[class.disabled]="disabled()"
|
|
747
|
+
[required]="isRequired()"
|
|
748
|
+
[formControl]="formControl"
|
|
749
|
+
(blur)="onTouched()"
|
|
750
|
+
>
|
|
751
|
+
<!-- Empty option -->
|
|
752
|
+
<option [ngValue]="null" disabled>
|
|
753
|
+
{{ emptyOptionLabel() }}
|
|
760
754
|
</option>
|
|
761
|
-
}
|
|
762
755
|
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
756
|
+
<!-- Options -->
|
|
757
|
+
@for (option of options(); track option.key) {
|
|
758
|
+
<option [ngValue]="option.key" [disabled]="option.disabled">
|
|
759
|
+
{{ option.label }}
|
|
760
|
+
</option>
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
<!-- Clear option -->
|
|
764
|
+
@if (clearOptionLabel()) {
|
|
765
|
+
<option [ngValue]="null">
|
|
766
|
+
{{ clearOptionLabel() }}
|
|
767
|
+
</option>
|
|
768
|
+
}
|
|
769
|
+
</select>
|
|
770
|
+
</div>
|
|
770
771
|
|
|
771
772
|
@if (loading()) {
|
|
772
773
|
<div class="nmf-loading">
|
|
@@ -778,7 +779,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
778
779
|
{{ errorMessage() }}
|
|
779
780
|
</p>
|
|
780
781
|
</div>
|
|
781
|
-
`,
|
|
782
|
+
`,
|
|
783
|
+
}]
|
|
782
784
|
}] });
|
|
783
785
|
|
|
784
786
|
class InputTextComponent extends FormControlBase {
|
|
@@ -810,16 +812,15 @@ class InputTextComponent extends FormControlBase {
|
|
|
810
812
|
[type]="computedType()"
|
|
811
813
|
[required]="isRequired()"
|
|
812
814
|
[placeholder]="placeholder()"
|
|
813
|
-
[formControl]="
|
|
815
|
+
[formControl]="formControl"
|
|
814
816
|
(blur)="onTouched()"
|
|
815
817
|
/>
|
|
816
818
|
|
|
817
|
-
@if (type() === 'password' && !loading()) {
|
|
819
|
+
@if (type() === 'password' && !loading() && !disabled()) {
|
|
818
820
|
<button
|
|
819
821
|
type="button"
|
|
820
822
|
class="nmf-password-toggle"
|
|
821
823
|
aria-label="Toggle password visibility"
|
|
822
|
-
[disabled]="disabled()"
|
|
823
824
|
(click)="behavior.toggleShowPassword($event)"
|
|
824
825
|
>
|
|
825
826
|
@if (behavior.showPassword()) {
|
|
@@ -878,11 +879,16 @@ class InputTextComponent extends FormControlBase {
|
|
|
878
879
|
/>
|
|
879
880
|
</svg>
|
|
880
881
|
</ng-template>
|
|
881
|
-
`, isInline: true,
|
|
882
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
882
883
|
}
|
|
883
884
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputTextComponent, decorators: [{
|
|
884
885
|
type: Component,
|
|
885
|
-
args: [{
|
|
886
|
+
args: [{
|
|
887
|
+
selector: 'nmf-text',
|
|
888
|
+
standalone: true,
|
|
889
|
+
imports: [CommonModule, ReactiveFormsModule],
|
|
890
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
891
|
+
template: `
|
|
886
892
|
<div class="nmf-field">
|
|
887
893
|
@if (label()) {
|
|
888
894
|
<label class="nmf-label">
|
|
@@ -904,16 +910,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
904
910
|
[type]="computedType()"
|
|
905
911
|
[required]="isRequired()"
|
|
906
912
|
[placeholder]="placeholder()"
|
|
907
|
-
[formControl]="
|
|
913
|
+
[formControl]="formControl"
|
|
908
914
|
(blur)="onTouched()"
|
|
909
915
|
/>
|
|
910
916
|
|
|
911
|
-
@if (type() === 'password' && !loading()) {
|
|
917
|
+
@if (type() === 'password' && !loading() && !disabled()) {
|
|
912
918
|
<button
|
|
913
919
|
type="button"
|
|
914
920
|
class="nmf-password-toggle"
|
|
915
921
|
aria-label="Toggle password visibility"
|
|
916
|
-
[disabled]="disabled()"
|
|
917
922
|
(click)="behavior.toggleShowPassword($event)"
|
|
918
923
|
>
|
|
919
924
|
@if (behavior.showPassword()) {
|
|
@@ -972,7 +977,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
972
977
|
/>
|
|
973
978
|
</svg>
|
|
974
979
|
</ng-template>
|
|
975
|
-
`,
|
|
980
|
+
`,
|
|
981
|
+
}]
|
|
976
982
|
}] });
|
|
977
983
|
|
|
978
984
|
class InputTextareaComponent extends FormControlBase {
|
|
@@ -1000,7 +1006,7 @@ class InputTextareaComponent extends FormControlBase {
|
|
|
1000
1006
|
[cols]="cols()"
|
|
1001
1007
|
[required]="isRequired()"
|
|
1002
1008
|
[placeholder]="placeholder()"
|
|
1003
|
-
[formControl]="
|
|
1009
|
+
[formControl]="formControl"
|
|
1004
1010
|
(blur)="onTouched()"
|
|
1005
1011
|
></textarea>
|
|
1006
1012
|
|
|
@@ -1014,11 +1020,16 @@ class InputTextareaComponent extends FormControlBase {
|
|
|
1014
1020
|
</div>
|
|
1015
1021
|
}
|
|
1016
1022
|
</div>
|
|
1017
|
-
`, isInline: true,
|
|
1023
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1018
1024
|
}
|
|
1019
1025
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputTextareaComponent, decorators: [{
|
|
1020
1026
|
type: Component,
|
|
1021
|
-
args: [{
|
|
1027
|
+
args: [{
|
|
1028
|
+
selector: 'nmf-textarea',
|
|
1029
|
+
standalone: true,
|
|
1030
|
+
imports: [CommonModule, ReactiveFormsModule],
|
|
1031
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1032
|
+
template: `
|
|
1022
1033
|
<div class="nmf-field">
|
|
1023
1034
|
@if (label()) {
|
|
1024
1035
|
<label class="nmf-label">
|
|
@@ -1039,7 +1050,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
1039
1050
|
[cols]="cols()"
|
|
1040
1051
|
[required]="isRequired()"
|
|
1041
1052
|
[placeholder]="placeholder()"
|
|
1042
|
-
[formControl]="
|
|
1053
|
+
[formControl]="formControl"
|
|
1043
1054
|
(blur)="onTouched()"
|
|
1044
1055
|
></textarea>
|
|
1045
1056
|
|
|
@@ -1053,7 +1064,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
1053
1064
|
</div>
|
|
1054
1065
|
}
|
|
1055
1066
|
</div>
|
|
1056
|
-
`,
|
|
1067
|
+
`,
|
|
1068
|
+
}]
|
|
1057
1069
|
}] });
|
|
1058
1070
|
|
|
1059
1071
|
class InputTimepickerComponent extends FormControlBase {
|
|
@@ -1130,11 +1142,16 @@ class InputTimepickerComponent extends FormControlBase {
|
|
|
1130
1142
|
{{ errorMessage() }}
|
|
1131
1143
|
</p>
|
|
1132
1144
|
</div>
|
|
1133
|
-
`, isInline: true,
|
|
1145
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1134
1146
|
}
|
|
1135
1147
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputTimepickerComponent, decorators: [{
|
|
1136
1148
|
type: Component,
|
|
1137
|
-
args: [{
|
|
1149
|
+
args: [{
|
|
1150
|
+
selector: 'nmf-timepicker',
|
|
1151
|
+
standalone: true,
|
|
1152
|
+
imports: [CommonModule, ReactiveFormsModule],
|
|
1153
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1154
|
+
template: `
|
|
1138
1155
|
<div class="nmf-field" [class.loading]="loading()">
|
|
1139
1156
|
@if (label()) {
|
|
1140
1157
|
<label class="nmf-label">
|
|
@@ -1175,7 +1192,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
1175
1192
|
{{ errorMessage() }}
|
|
1176
1193
|
</p>
|
|
1177
1194
|
</div>
|
|
1178
|
-
`,
|
|
1195
|
+
`,
|
|
1196
|
+
}]
|
|
1179
1197
|
}] });
|
|
1180
1198
|
|
|
1181
1199
|
class FormHydrator {
|
|
@@ -1232,12 +1250,12 @@ class FormOrchestrator extends FormMapperBase {
|
|
|
1232
1250
|
hydrator;
|
|
1233
1251
|
serializer;
|
|
1234
1252
|
_form = signal(new FormGroup({}));
|
|
1235
|
-
|
|
1253
|
+
_handlerRegistry = signal([]);
|
|
1236
1254
|
_mapperRegistry = signal({});
|
|
1237
1255
|
_status = signal('idle');
|
|
1238
1256
|
_errorMessage = signal(null);
|
|
1239
1257
|
form = this._form.asReadonly();
|
|
1240
|
-
|
|
1258
|
+
handlerRegistry = this._handlerRegistry.asReadonly();
|
|
1241
1259
|
mapperRegistry = this._mapperRegistry.asReadonly();
|
|
1242
1260
|
status = this._status.asReadonly();
|
|
1243
1261
|
errorMessage = this._errorMessage.asReadonly();
|
|
@@ -1252,11 +1270,11 @@ class FormOrchestrator extends FormMapperBase {
|
|
|
1252
1270
|
* Must be called before any subform registration or handler execution.
|
|
1253
1271
|
*/
|
|
1254
1272
|
orchestrate(options) {
|
|
1255
|
-
const { form,
|
|
1273
|
+
const { form, mapperRegistry = {}, handlerRegistry = [] } = options;
|
|
1256
1274
|
this._form.set(form);
|
|
1257
|
-
this._handlers.set(handlers);
|
|
1258
1275
|
this._mapperRegistry.set(mapperRegistry);
|
|
1259
|
-
|
|
1276
|
+
this._handlerRegistry.set(handlerRegistry);
|
|
1277
|
+
Object.values(this.handlerRegistry()).forEach((handler) => {
|
|
1260
1278
|
this.addReactiveLogic(handler.getReactiveLogic(form));
|
|
1261
1279
|
});
|
|
1262
1280
|
}
|
|
@@ -1266,8 +1284,8 @@ class FormOrchestrator extends FormMapperBase {
|
|
|
1266
1284
|
getSubForm(key) {
|
|
1267
1285
|
return this.form().get(key);
|
|
1268
1286
|
}
|
|
1269
|
-
|
|
1270
|
-
this.
|
|
1287
|
+
addHandlerToRegistry(handler) {
|
|
1288
|
+
this._handlerRegistry.set([...this._handlerRegistry(), handler]);
|
|
1271
1289
|
}
|
|
1272
1290
|
addReactiveLogic(subscription) {
|
|
1273
1291
|
this._logicSubscription.add(subscription);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-modular-forms-core.mjs","sources":["../../../projects/core/src/lib/base/form-control-base.ts","../../../projects/core/src/lib/form-util.ts","../../../projects/core/src/lib/base/form-handler-base.ts","../../../projects/core/src/lib/base/form-mapper-base.ts","../../../projects/core/src/lib/behavior/currency.behavior.ts","../../../projects/core/src/lib/behavior/text.behavior.ts","../../../projects/core/src/lib/input/input-currency.component.ts","../../../projects/core/src/lib/input/input-datepicker.component.ts","../../../projects/core/src/lib/input/input-number.component.ts","../../../projects/core/src/lib/input/input-select.component.ts","../../../projects/core/src/lib/input/input-text.component.ts","../../../projects/core/src/lib/input/input-textarea.component.ts","../../../projects/core/src/lib/input/input-timepicker.component.ts","../../../projects/core/src/lib/form-hydrator.ts","../../../projects/core/src/lib/form-serializer.ts","../../../projects/core/src/lib/form-orchestrator.ts","../../../projects/core/src/public-api.ts","../../../projects/core/src/ng-modular-forms-core.ts"],"sourcesContent":["import {\n ControlValueAccessor,\n FormControl,\n NgControl,\n TouchedChangeEvent,\n Validators,\n} from '@angular/forms';\nimport {\n booleanAttribute,\n ChangeDetectorRef,\n computed,\n DestroyRef,\n Directive,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { startWith, Subscription } from 'rxjs';\n\n@Directive()\nexport abstract class FormControlBase<T> implements ControlValueAccessor {\n protected readonly cdr = inject(ChangeDetectorRef);\n protected readonly destroyRef = inject(DestroyRef);\n\n static nextId = 0;\n\n readonly id = input<string | null>(\n `nmf-form-control-${FormControlBase.nextId++}`,\n );\n\n readonly _id = input<string | null>(null, { alias: 'id' });\n readonly label = input<string>('');\n readonly classList = input<string[]>([]);\n readonly loading = input<boolean>(false);\n\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n readonly _disabledByInput = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n readonly _disabledByCva = signal(false);\n\n readonly ngControl = inject(NgControl, {\n self: true,\n optional: true,\n });\n\n protected readonly control = new FormControl<T | null>(null);\n\n protected readonly disabled = computed(\n () => this._disabledByInput() || this._disabledByCva(),\n );\n\n protected readonly isRequired = signal(\n this.ngControl?.control?.hasValidator(Validators.required) ?? false,\n );\n\n protected readonly hasErrors = signal(false);\n\n private changeSub = new Subscription();\n\n protected onChange: (value: T | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n effect(() => {\n const inputDisabled = this._disabledByInput();\n const cvaDisabled = this._disabledByCva();\n\n if (inputDisabled || cvaDisabled) {\n this.control.disable({ emitEvent: false });\n } else {\n this.control.enable({ emitEvent: true });\n }\n });\n }\n\n ngOnInit() {\n const parent = this.ngControl?.control;\n if (!parent) return;\n\n parent.statusChanges\n .pipe(startWith(null), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.control.setValidators(parent.validator ?? null);\n this.control.setAsyncValidators(parent.asyncValidator ?? null);\n this.control.updateValueAndValidity({ emitEvent: false });\n\n this.hasErrors.set(parent.invalid && parent.touched);\n this.isRequired.set(parent.hasValidator(Validators.required) ?? false);\n\n this.cdr.markForCheck();\n });\n\n parent.events\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (event instanceof TouchedChangeEvent) {\n if (parent.touched) {\n this.control.markAsTouched();\n } else {\n this.control.markAsUntouched();\n }\n this.hasErrors.set(parent.invalid && parent.touched);\n this.cdr.markForCheck();\n }\n });\n\n parent.valueChanges\n .pipe(startWith(null), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.cdr.markForCheck());\n }\n\n writeValue(value: T): void {\n this.control.setValue(value, { emitEvent: false });\n }\n\n registerOnChange(fn: (value: T | null) => void): void {\n this.onChange = fn;\n\n this.changeSub.unsubscribe();\n this.changeSub = this.control.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((v) => {\n fn(v);\n });\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByCva.set(isDisabled);\n }\n\n protected errorMessage(): string | null {\n const control = this.ngControl?.control;\n if (control == null || !control.errors || !control.touched) return null;\n\n const firstKey = Object.keys(control.errors)[0];\n const error = control.errors[firstKey];\n\n switch (firstKey) {\n case 'required':\n return 'This field is required';\n case 'minlength':\n return `Minimum length is ${error.requiredLength}`;\n case 'maxlength':\n return `Maximum length is ${error.requiredLength}`;\n case 'min':\n return `Minimum value is ${error.min}`;\n case 'max':\n return `Maximum value is ${error.max}`;\n case 'email':\n return 'Invalid email address';\n case 'pattern':\n return 'Invalid format';\n case 'custom':\n if (typeof error === 'string') {\n return error;\n }\n return 'Invalid value';\n default:\n return 'Invalid value';\n }\n }\n}\n","import { FormControl, FormGroup } from '@angular/forms';\n\nexport function getControl<T = unknown>(controlName: string, form: FormGroup) {\n if (!form) {\n throw new Error(\n `Missing form instance while getting the control of \"${controlName}\"`,\n );\n }\n\n const control = form.get(controlName) as FormControl<T>;\n if (!control) {\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\n }\n\n return control;\n}\n\nexport function getControlValue<T = unknown>(\n controlName: string,\n form: FormGroup,\n): T | null;\n\nexport function getControlValue(\n controlName: string,\n form: FormGroup,\n): number | null;\n\nexport function getControlValue<T = unknown>(\n controlName: string,\n form: FormGroup,\n): T | null {\n const control = getControl<T>(controlName, form);\n if (!control) {\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\n }\n\n const value = control.getRawValue();\n if (value === '') {\n return null;\n }\n\n if (typeof value === 'string') {\n const cleaned = value.replace(/,/g, '');\n\n if (!Number.isNaN(Number(cleaned))) {\n return parseNumber(value) as T;\n }\n }\n\n return value;\n}\n\nexport function parseNumber(\n input: string | number | null | undefined,\n): number | null {\n if (input == null || input === '') return null;\n\n if (typeof input === 'number') {\n return Number.isFinite(input) ? input : null;\n }\n\n const normalized = input\n .trim()\n .replace(/,/g, '') // remove thousands\n .replace(/(?!^)-/g, ''); // only allow leading '-'\n\n if (normalized === '-' || normalized === '.' || normalized === '-.') {\n return null;\n }\n\n const num = Number(normalized);\n\n return Number.isFinite(num) ? num : null;\n}\n\nexport function formatNumber(\n value: string | number | null,\n locale: string = 'en-US',\n options: Intl.NumberFormatOptions = { maximumFractionDigits: 2 },\n): string | null {\n if (value == null || value === '') {\n return null;\n }\n if (typeof value !== 'string') {\n value = String(value);\n }\n\n value = value.replace(/[^\\d\\-,.]/g, '');\n\n if (value === '') {\n return null;\n }\n\n const isNegative = value.startsWith('-');\n const numericValue = Number(value.replace(/[,$-]/g, ''));\n const formatted = numericValue.toLocaleString(locale, options);\n\n return isNegative ? `-${formatted}` : formatted;\n}\n","import { FormControl, FormGroup } from '@angular/forms';\nimport { Observable, Subscription } from 'rxjs';\nimport { getControl } from '../form-util';\n\nexport abstract class FormHandlerBase<ControlNames extends string = string> {\n abstract getReactiveLogic(form: FormGroup): Subscription;\n\n private registeredControls: Record<string, FormControl> = {};\n\n /**\n * Registers form controls for later reactive access.\n */\n registerControls(form: FormGroup, controlNames: ControlNames[]): void {\n controlNames.forEach((cn) => {\n const control = getControl(cn.replace(/_/g, '.'), form);\n\n if (!control) {\n throw new Error(\n `Failed to register control with name: \"${cn}\" in form group: \"${form}\"`,\n );\n }\n\n const key = cn as ControlNames;\n this.registeredControls[key] = control;\n });\n }\n\n valueChangesOf<T>(key: ControlNames): Observable<T> {\n if (!this.registeredControls[key]) {\n throw new Error(\n `Control with name: \"${key}\" not found. Ensure it is registered in registerControls(...)`,\n );\n }\n\n return this.registeredControls[key].valueChanges as Observable<T>;\n }\n}\n","export abstract class FormMapperBase<TIn = unknown, TOut = TIn, TForm = TIn> {\n public fromModel(model: TIn): TForm {\n return structuredClone(model) as unknown as TForm;\n }\n\n public toRequest(formValue: TForm): TOut {\n return formValue as unknown as TOut;\n }\n}\n","export class CurrencyBehavior {\n blockNonDigitKey(event: KeyboardEvent) {\n const input = event.target as HTMLInputElement;\n const value = input.value;\n\n if (event.ctrlKey || event.metaKey) {\n return;\n }\n\n const allowedKeys = [\n 'Backspace',\n 'Delete',\n 'Tab',\n 'Enter',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n ];\n\n if (allowedKeys.includes(event.key)) {\n return;\n }\n\n const isDigit = /^[0-9]$/.test(event.key);\n if (isDigit) {\n return;\n }\n\n if (event.key === '.') {\n if (value.includes('.')) {\n event.preventDefault();\n }\n return;\n }\n\n if (event.key === ',') {\n event.preventDefault();\n return;\n }\n\n if (event.key === '-') {\n const hasMinus = value.includes('-');\n const isAtStart = input.selectionStart === 0;\n\n if (hasMinus || !isAtStart) {\n event.preventDefault();\n }\n return;\n }\n\n event.preventDefault();\n }\n}\n","import { signal } from '@angular/core';\n\nexport class TextBehavior {\n private _showPassword = signal<boolean>(false);\n\n showPassword = this._showPassword.asReadonly();\n\n toggleShowPassword(event?: MouseEvent): void {\n event?.stopPropagation();\n this._showPassword.set(!this.showPassword());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n signal,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { CurrencyBehavior } from '../behavior/currency.behavior';\nimport { formatNumber, parseNumber } from '../form-util';\n\n@Component({\n selector: 'nmf-currency',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n styleUrls: ['./input-styles.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <div class=\"nmf-input-wrapper nmf-input-prefix\">\n @if (displayValue() != null) {\n <span\n class=\"nmf-prefix\"\n [class.error]=\"hasErrors()\"\n [class.nmf-prefix-disabled]=\"disabled()\"\n [style.color]=\"textColor()\"\n >\n $\n </span>\n }\n\n <input\n type=\"text\"\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [class.nmf-input-with-prefix]=\"displayValue() != null\"\n [style.color]=\"textColor()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n </div>\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputCurrencyComponent extends FormControlBase<number | null> {\n displayValue = signal<string | null>(null);\n\n behavior = new CurrencyBehavior();\n\n override writeValue(value: number | null): void {\n super.writeValue(value);\n this.displayValue.set(value != null ? formatNumber(value) : null);\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n this.behavior.blockNonDigitKey(event);\n }\n\n onInput(event: Event) {\n if (this._disabledByInput()) return;\n\n const rawValue = (event.target as HTMLInputElement).value ?? null;\n const value = parseNumber(rawValue);\n\n this.displayValue.set(value != null ? formatNumber(value) : null);\n\n this.onChange(value);\n }\n\n textColor = computed(() => {\n const value = this.displayValue();\n if (this._disabledByInput() || !value) {\n return 'inherit';\n }\n\n const parsedValue = parseNumber(value);\n const valid = parsedValue != null && parsedValue >= 0;\n\n return valid ? 'inherit' : '#dc6262';\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-datepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n styleUrls: ['./input-styles.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n type=\"date\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [min]=\"formatDate(minDate())\"\n [max]=\"formatDate(maxDate())\"\n [name]=\"name()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputDatepickerComponent extends FormControlBase<Date | null> {\n minDate = input<Date | null>(null);\n maxDate = input<Date | null>(null);\n\n displayValue = signal<string>('');\n\n formatDate(date: Date | null | undefined): string | null {\n if (!date) return null;\n\n // yyyy-MM-dd (required by input[type=\"date\"])\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, '0');\n const dd = String(date.getDate()).padStart(2, '0');\n\n return `${yyyy}-${mm}-${dd}`;\n }\n\n parseDate(value: string): Date | null {\n if (!value) return null;\n const [y, m, d] = value.split('-').map(Number);\n return new Date(y, m - 1, d);\n }\n\n override writeValue(value: Date | null): void {\n super.writeValue(value);\n\n this.displayValue.set(this.formatDate(value) ?? '');\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLInputElement;\n const parsed = this.parseDate(input.value);\n\n this.displayValue.set(this.formatDate(parsed) ?? '');\n\n this.onChange(parsed);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { CurrencyBehavior } from '../behavior/currency.behavior';\nimport { TextBehavior } from '../behavior/text.behavior';\nimport { formatNumber, parseNumber } from '../form-util';\n\n@Component({\n selector: 'nmf-number',\n standalone: true,\n styleUrls: ['./input-styles.css'],\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [type]=\"formatNumberValue() ? 'text' : 'number'\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n\n <ng-content></ng-content>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n `,\n})\nexport class InputNumberComponent extends FormControlBase<\n string | number | null\n> {\n formatNumberValue = input<boolean>(false);\n displayValue = signal<string>('');\n\n behavior = new TextBehavior();\n currencyBehavior = new CurrencyBehavior();\n\n override writeValue(value: string | number | null): void {\n super.writeValue(value);\n this.updateDisplayValue(value);\n }\n\n handleKeyDown(event: KeyboardEvent) {\n this.currencyBehavior.blockNonDigitKey(event);\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const raw = (event.target as HTMLInputElement).value;\n const parsed = parseNumber(raw);\n\n this.updateDisplayValue(parsed);\n\n this.onChange(parsed);\n }\n\n updateDisplayValue(value: string | number | null) {\n if (this.formatNumberValue() && value != null) {\n this.displayValue.set(formatNumber(value) ?? '');\n } else {\n this.displayValue.set(value != null ? String(value) : '');\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\n\nexport interface SelectOption {\n key: string | number;\n label: string | number;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'nmf-select',\n imports: [CommonModule, ReactiveFormsModule],\n styleUrls: ['./input-styles.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <select\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [formControl]=\"control\"\n (blur)=\"onTouched()\"\n >\n <!-- Empty option -->\n <option [ngValue]=\"null\" disabled>\n {{ emptyOptionLabel() }}\n </option>\n\n <!-- Options -->\n @for (option of options(); track option.key) {\n <option [ngValue]=\"option.key\" [disabled]=\"option.disabled\">\n {{ option.label }}\n </option>\n }\n\n <!-- Clear option -->\n @if (clearOptionLabel()) {\n <option [ngValue]=\"null\">\n {{ clearOptionLabel() }}\n </option>\n }\n </select>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputSelectComponent extends FormControlBase<any> {\n options = input<SelectOption[]>([]);\n emptyOptionLabel = input<string>('Select an option');\n clearOptionLabel = input<string | null>('Clear selection');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { TextBehavior } from '../behavior/text.behavior';\n\n@Component({\n selector: 'nmf-text',\n standalone: true,\n styleUrls: ['./input-styles.css'],\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <div class=\"nmf-input-wrapper\">\n <input\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [type]=\"computedType()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [formControl]=\"control\"\n (blur)=\"onTouched()\"\n />\n\n @if (type() === 'password' && !loading()) {\n <button\n type=\"button\"\n class=\"nmf-password-toggle\"\n aria-label=\"Toggle password visibility\"\n [disabled]=\"disabled()\"\n (click)=\"behavior.toggleShowPassword($event)\"\n >\n @if (behavior.showPassword()) {\n <ng-container [ngTemplateOutlet]=\"eyeOffIcon\"></ng-container>\n } @else {\n <ng-container [ngTemplateOutlet]=\"eyeIcon\"></ng-container>\n }\n </button>\n }\n </div>\n\n <ng-content></ng-content>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n\n <ng-template #eyeIcon>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"#e3e3e3\"\n class=\"nmf-icon\"\n >\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path\n d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"\n />\n </svg>\n </ng-template>\n\n <ng-template #eyeOffIcon>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"#e3e3e3\"\n class=\"nmf-icon\"\n >\n <path\n d=\"M0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0z\"\n fill=\"none\"\n />\n <path\n d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"\n />\n </svg>\n </ng-template>\n `,\n})\nexport class InputTextComponent extends FormControlBase<\n string | number | null\n> {\n type = input<\n 'text' | 'number' | 'email' | 'tel' | 'url' | 'password' | 'search'\n >('text');\n\n behavior = new TextBehavior();\n\n computedType = computed(() =>\n this.behavior.showPassword() && this.type() === 'password'\n ? 'text'\n : this.type(),\n );\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-textarea',\n standalone: true,\n styleUrls: ['./input-styles.css'],\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <textarea\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [rows]=\"rows()\"\n [cols]=\"cols()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [formControl]=\"control\"\n (blur)=\"onTouched()\"\n ></textarea>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n `,\n})\nexport class InputTextareaComponent extends FormControlBase<string | null> {\n rows = input<number>(5);\n cols = input<number>(5);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-timepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n styleUrls: ['./input-styles.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n type=\"time\"\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [step]=\"step()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputTimepickerComponent extends FormControlBase<Date | null> {\n // step in seconds: 60 = minutes only, 1 = show seconds\n step = input<number>(60);\n displayValue = signal<string>('');\n\n formatTime(date: Date | null | undefined): string | null {\n if (!date) return null;\n\n const hh = String(date.getHours()).padStart(2, '0');\n const mm = String(date.getMinutes()).padStart(2, '0');\n const ss = String(date.getSeconds()).padStart(2, '0');\n\n return this.step() < 60 ? `${hh}:${mm}:${ss}` : `${hh}:${mm}`;\n }\n\n parseTime(value: string): Date | null {\n if (!value) return null;\n\n const [h, m, s = 0] = value.split(':').map(Number);\n const date = new Date();\n date.setHours(h, m, s, 0);\n return date;\n }\n\n override writeValue(value: Date | null): void {\n super.writeValue(value);\n this.displayValue.set(this.formatTime(value) ?? '');\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLInputElement;\n const parsed = this.parseTime(input.value);\n\n this.displayValue.set(this.formatTime(parsed) ?? '');\n\n this.onChange(parsed);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormHydrator {\n hydrate(form: FormGroup, model: any, registry: MapperRegistry = {}) {\n Object.entries(form.controls).forEach(([key, control]) => {\n if (!(key in model)) return;\n\n const mapFn = registry[key]?.fromModel;\n const value = model?.[key];\n\n if (control instanceof FormGroup) {\n if (mapFn) {\n control.patchValue(mapFn(value), { emitEvent: false });\n } else {\n this.hydrate(control, value, registry);\n }\n return;\n }\n\n control.patchValue(value, { emitEvent: false });\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormSerializer {\n toRequest(form: FormGroup, registry: MapperRegistry = {}) {\n const result: any = {};\n\n Object.entries(form.controls).forEach(([key, control]) => {\n const mapFn = registry[key]?.toRequest;\n\n if (control instanceof FormGroup) {\n result[key] = mapFn\n ? mapFn(control.value)\n : this.toRequest(control, registry);\n return;\n }\n\n result[key] = control.value;\n });\n\n return result;\n }\n}\n","import { FormGroup } from '@angular/forms';\nimport { Directive, OnDestroy, signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { FormHandlerBase } from './base/form-handler-base';\nimport { FormMapperBase } from './base/form-mapper-base';\nimport { FormHydrator } from './form-hydrator';\nimport { FormSerializer } from './form-serializer';\nimport {\n FormHandlerRegistry,\n FormOrchestratorOptions,\n FormStatus,\n MapperRegistry,\n} from './types';\n\n@Directive()\nexport abstract class FormOrchestrator\n extends FormMapperBase\n implements OnDestroy\n{\n private readonly _form = signal<FormGroup>(new FormGroup({}));\n private readonly _handlers = signal<FormHandlerRegistry>([]);\n private readonly _mapperRegistry = signal<MapperRegistry>({});\n private readonly _status = signal<FormStatus>('idle');\n private readonly _errorMessage = signal<string | null>(null);\n\n public readonly form = this._form.asReadonly();\n public readonly handlers = this._handlers.asReadonly();\n public readonly mapperRegistry = this._mapperRegistry.asReadonly();\n public readonly status = this._status.asReadonly();\n public readonly errorMessage = this._errorMessage.asReadonly();\n\n private _logicSubscription = new Subscription();\n\n constructor(\n protected readonly hydrator: FormHydrator,\n protected readonly serializer: FormSerializer,\n ) {\n super();\n }\n\n /**\n * Initializes orchestration state.\n * Must be called before any subform registration or handler execution.\n */\n public orchestrate(options: FormOrchestratorOptions) {\n const { form, handlers = [], mapperRegistry = {} } = options;\n this._form.set(form);\n this._handlers.set(handlers);\n this._mapperRegistry.set(mapperRegistry);\n\n Object.values(this.handlers()).forEach((handler) => {\n this.addReactiveLogic(handler.getReactiveLogic(form));\n });\n }\n\n public setForm(form: FormGroup) {\n this._form.set(form);\n }\n\n public getSubForm(key: string): FormGroup {\n return this.form().get(key) as FormGroup;\n }\n\n public addHandler(handler: FormHandlerBase) {\n this._handlers.set([...this._handlers(), handler]);\n }\n\n public addReactiveLogic(subscription: Subscription) {\n this._logicSubscription.add(subscription);\n }\n\n public setStatus(status: FormStatus) {\n this._status.set(status);\n }\n\n public setErrorMessage(message: string | null) {\n this._errorMessage.set(message);\n }\n\n public hydrateFromModel(model: any) {\n const form = this.form();\n const registry = this.mapperRegistry();\n\n Object.entries(form.controls).forEach(([key, control]) => {\n if (!(key in model)) return;\n\n const mapper = registry[key];\n const value = model?.[key];\n\n if (control instanceof FormGroup) {\n this.hydrator.hydrate(\n control,\n mapper ? mapper.fromModel(value) : value,\n );\n }\n });\n }\n\n public buildRequest(): any {\n return this.serializer.toRequest(this.form(), this.mapperRegistry());\n }\n\n ngOnDestroy(): void {\n this._logicSubscription.unsubscribe();\n }\n}\n","/*\n * Public API Surface of core\n */\n\nexport * from './lib/base/form-control-base';\nexport * from './lib/base/form-handler-base';\nexport * from './lib/base/form-mapper-base';\n\nexport * from './lib/behavior/currency.behavior';\nexport * from './lib/behavior/text.behavior';\n\nexport * from './lib/input/input-currency.component';\nexport * from './lib/input/input-datepicker.component';\nexport * from './lib/input/input-number.component';\nexport * from './lib/input/input-select.component';\nexport * from './lib/input/input-text.component';\nexport * from './lib/input/input-textarea.component';\nexport * from './lib/input/input-timepicker.component';\n\nexport * from './lib/form-hydrator';\nexport * from './lib/form-orchestrator';\nexport * from './lib/form-serializer';\nexport * from './lib/form-util';\nexport * from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.FormHydrator","i2.FormSerializer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-modular-forms-core.mjs","sources":["../../../projects/core/src/lib/base/form-control-base.ts","../../../projects/core/src/lib/form-util.ts","../../../projects/core/src/lib/base/form-handler-base.ts","../../../projects/core/src/lib/base/form-mapper-base.ts","../../../projects/core/src/lib/behavior/currency.behavior.ts","../../../projects/core/src/lib/behavior/text.behavior.ts","../../../projects/core/src/lib/input/input-currency.component.ts","../../../projects/core/src/lib/input/input-datepicker.component.ts","../../../projects/core/src/lib/input/input-number.component.ts","../../../projects/core/src/lib/input/input-select.component.ts","../../../projects/core/src/lib/input/input-text.component.ts","../../../projects/core/src/lib/input/input-textarea.component.ts","../../../projects/core/src/lib/input/input-timepicker.component.ts","../../../projects/core/src/lib/form-hydrator.ts","../../../projects/core/src/lib/form-serializer.ts","../../../projects/core/src/lib/form-orchestrator.ts","../../../projects/core/src/public-api.ts","../../../projects/core/src/ng-modular-forms-core.ts"],"sourcesContent":["import {\n ControlValueAccessor,\n FormControl,\n NgControl,\n TouchedChangeEvent,\n Validators,\n} from '@angular/forms';\nimport {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge, startWith } from 'rxjs';\n\n@Directive()\nexport abstract class FormControlBase<T> implements ControlValueAccessor {\n protected readonly destroyRef = inject(DestroyRef);\n\n static nextId = 0;\n readonly id = input<string | null>(\n `nmf-form-control-${FormControlBase.nextId++}`,\n { alias: 'id' },\n );\n\n readonly label = input<string>('');\n readonly classList = input<string[]>([]);\n readonly loading = input<boolean>(false);\n\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n readonly _disabledByInput = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n readonly _disabledByCva = signal(false);\n\n readonly ngControl = inject(NgControl, {\n self: true,\n optional: true,\n });\n\n protected readonly standaloneControl = new FormControl<T | null>(null);\n\n get formControl(): FormControl<T | null> {\n return (\n (this.ngControl?.control as FormControl<T | null> | null) ??\n this.standaloneControl\n );\n }\n\n protected readonly disabled = computed(\n () => this._disabledByInput() || this._disabledByCva(),\n );\n\n protected readonly isRequired = signal(\n this.ngControl?.control?.hasValidator(Validators.required) ?? false,\n );\n\n protected readonly hasErrors = signal(false);\n\n protected onChange: (value: T | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n ngOnInit() {\n const control = this.ngControl?.control;\n if (!control) return;\n\n merge(control.statusChanges, control.valueChanges)\n .pipe(startWith(null), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.hasErrors.set(control.invalid && control.touched);\n this.isRequired.set(control.hasValidator(Validators.required) ?? false);\n });\n\n control.events\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (event instanceof TouchedChangeEvent) {\n this.hasErrors.set(control.invalid && control.touched);\n }\n });\n }\n\n writeValue(value: T | null): void {\n const control = this.ngControl?.control;\n if (!control) return;\n\n if (control.value !== value) {\n control.setValue(value, { emitEvent: false });\n }\n }\n\n registerOnChange(fn: (value: T | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByCva.set(isDisabled);\n }\n\n protected errorMessage(): string | null {\n const control = this.ngControl?.control;\n if (control == null || !control.errors || !control.touched) return null;\n\n const firstKey = Object.keys(control.errors)[0];\n const error = control.errors[firstKey];\n\n switch (firstKey) {\n case 'required':\n return 'This field is required';\n\n case 'minlength':\n return `Minimum length is ${error.requiredLength}`;\n\n case 'maxlength':\n return `Maximum length is ${error.requiredLength}`;\n\n case 'min':\n return `Minimum value is ${error.min}`;\n\n case 'max':\n return `Maximum value is ${error.max}`;\n\n case 'email':\n return 'Invalid email address';\n\n case 'pattern':\n return 'Invalid format';\n\n case 'custom':\n if (typeof error === 'string') {\n return error;\n }\n return 'Invalid value';\n\n default:\n return 'Invalid value';\n }\n }\n}\n","import { FormControl, FormGroup } from '@angular/forms';\n\nexport function getControl<T = unknown>(controlName: string, form: FormGroup) {\n if (!form) {\n throw new Error(\n `Missing form instance while getting the control of \"${controlName}\"`,\n );\n }\n\n const control = form.get(controlName) as FormControl<T>;\n if (!control) {\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\n }\n\n return control;\n}\n\nexport function getControlValue<T = unknown>(\n controlName: string,\n form: FormGroup,\n): T | null;\n\nexport function getControlValue(\n controlName: string,\n form: FormGroup,\n): number | null;\n\nexport function getControlValue<T = unknown>(\n controlName: string,\n form: FormGroup,\n): T | null {\n const control = getControl<T>(controlName, form);\n if (!control) {\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\n }\n\n const value = control.getRawValue();\n if (value === '') {\n return null;\n }\n\n if (typeof value === 'string') {\n const cleaned = value.replace(/,/g, '');\n\n if (!Number.isNaN(Number(cleaned))) {\n return parseNumber(value) as T;\n }\n }\n\n return value;\n}\n\nexport function parseNumber(\n input: string | number | null | undefined,\n): number | null {\n if (input == null || input === '') return null;\n\n if (typeof input === 'number') {\n return Number.isFinite(input) ? input : null;\n }\n\n const normalized = input\n .trim()\n .replace(/,/g, '') // remove thousands\n .replace(/(?!^)-/g, ''); // only allow leading '-'\n\n if (normalized === '-' || normalized === '.' || normalized === '-.') {\n return null;\n }\n\n const num = Number(normalized);\n\n return Number.isFinite(num) ? num : null;\n}\n\nexport function formatNumber(\n value: string | number | null,\n locale: string = 'en-US',\n options: Intl.NumberFormatOptions = { maximumFractionDigits: 2 },\n): string | null {\n if (value == null || value === '') {\n return null;\n }\n if (typeof value !== 'string') {\n value = String(value);\n }\n\n value = value.replace(/[^\\d\\-,.]/g, '');\n\n if (value === '') {\n return null;\n }\n\n const isNegative = value.startsWith('-');\n const numericValue = Number(value.replace(/[,$-]/g, ''));\n const formatted = numericValue.toLocaleString(locale, options);\n\n return isNegative ? `-${formatted}` : formatted;\n}\n","import { FormControl, FormGroup } from '@angular/forms';\nimport { Observable, Subscription } from 'rxjs';\nimport { getControl } from '../form-util';\n\nexport abstract class FormHandlerBase<ControlNames extends string = string> {\n abstract getReactiveLogic(form: FormGroup): Subscription;\n\n private registeredControls: Record<string, FormControl> = {};\n\n /**\n * Registers form controls for later reactive access.\n */\n public registerControls(form: FormGroup, controlNames: ControlNames[]): void {\n controlNames.forEach((cn) => {\n const control = getControl(cn.replace(/_/g, '.'), form);\n\n if (!control) {\n throw new Error(\n `Failed to register control with name: \"${cn}\" in form group: \"${form}\"`,\n );\n }\n\n const key = cn as ControlNames;\n this.registeredControls[key] = control;\n });\n }\n\n public valueChangesOf<T>(key: ControlNames): Observable<T> {\n if (!this.registeredControls[key]) {\n throw new Error(\n `Control with name: \"${key}\" not found. Ensure it is registered in registerControls(...)`,\n );\n }\n\n return this.registeredControls[key].valueChanges as Observable<T>;\n }\n}\n","export abstract class FormMapperBase<TIn = unknown, TOut = TIn, TForm = TIn> {\n public fromModel(model: TIn): TForm {\n return structuredClone(model) as unknown as TForm;\n }\n\n public toRequest(formValue: TForm): TOut {\n return formValue as unknown as TOut;\n }\n}\n","export class CurrencyBehavior {\n blockNonDigitKey(event: KeyboardEvent) {\n const input = event.target as HTMLInputElement;\n const value = input.value;\n\n if (event.ctrlKey || event.metaKey) {\n return;\n }\n\n const allowedKeys = [\n 'Backspace',\n 'Delete',\n 'Tab',\n 'Enter',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n ];\n\n if (allowedKeys.includes(event.key)) {\n return;\n }\n\n const isDigit = /^[0-9]$/.test(event.key);\n if (isDigit) {\n return;\n }\n\n if (event.key === '.') {\n if (value.includes('.')) {\n event.preventDefault();\n }\n return;\n }\n\n if (event.key === ',') {\n event.preventDefault();\n return;\n }\n\n if (event.key === '-') {\n const hasMinus = value.includes('-');\n const isAtStart = input.selectionStart === 0;\n\n if (hasMinus || !isAtStart) {\n event.preventDefault();\n }\n return;\n }\n\n event.preventDefault();\n }\n}\n","import { signal } from '@angular/core';\n\nexport class TextBehavior {\n private _showPassword = signal<boolean>(false);\n\n showPassword = this._showPassword.asReadonly();\n\n toggleShowPassword(event?: MouseEvent): void {\n event?.stopPropagation();\n this._showPassword.set(!this.showPassword());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n signal,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { CurrencyBehavior } from '../behavior/currency.behavior';\nimport { formatNumber, parseNumber } from '../form-util';\n\n@Component({\n selector: 'nmf-currency',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <div class=\"nmf-input-wrapper nmf-input-prefix\">\n @if (displayValue() != null) {\n <span\n class=\"nmf-prefix\"\n [class.error]=\"hasErrors()\"\n [class.nmf-prefix-disabled]=\"disabled()\"\n [style.color]=\"textColor()\"\n >\n $\n </span>\n }\n\n <input\n type=\"text\"\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [class.nmf-input-with-prefix]=\"displayValue() != null\"\n [style.color]=\"textColor()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n </div>\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputCurrencyComponent extends FormControlBase<number | null> {\n displayValue = signal<string | null>(null);\n\n behavior = new CurrencyBehavior();\n\n override writeValue(value: number | null): void {\n super.writeValue(value);\n this.displayValue.set(value != null ? formatNumber(value) : null);\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n this.behavior.blockNonDigitKey(event);\n }\n\n onInput(event: Event) {\n if (this._disabledByInput()) return;\n\n const rawValue = (event.target as HTMLInputElement).value ?? null;\n const value = parseNumber(rawValue);\n\n this.displayValue.set(value != null ? formatNumber(value) : null);\n\n this.onChange(value);\n }\n\n textColor = computed(() => {\n const value = this.displayValue();\n if (this._disabledByInput() || !value) {\n return 'inherit';\n }\n\n const parsedValue = parseNumber(value);\n const valid = parsedValue != null && parsedValue >= 0;\n\n return valid ? 'inherit' : '#dc6262';\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-datepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n type=\"date\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [min]=\"formatDate(minDate())\"\n [max]=\"formatDate(maxDate())\"\n [name]=\"name()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputDatepickerComponent extends FormControlBase<Date | null> {\n minDate = input<Date | null>(null);\n maxDate = input<Date | null>(null);\n\n displayValue = signal<string>('');\n\n formatDate(date: Date | null | undefined): string | null {\n if (!date) return null;\n\n // yyyy-MM-dd (required by input[type=\"date\"])\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, '0');\n const dd = String(date.getDate()).padStart(2, '0');\n\n return `${yyyy}-${mm}-${dd}`;\n }\n\n parseDate(value: string): Date | null {\n if (!value) return null;\n const [y, m, d] = value.split('-').map(Number);\n return new Date(y, m - 1, d);\n }\n\n override writeValue(value: Date | null): void {\n super.writeValue(value);\n\n this.displayValue.set(this.formatDate(value) ?? '');\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLInputElement;\n const parsed = this.parseDate(input.value);\n\n this.displayValue.set(this.formatDate(parsed) ?? '');\n\n this.onChange(parsed);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { CurrencyBehavior } from '../behavior/currency.behavior';\nimport { TextBehavior } from '../behavior/text.behavior';\nimport { formatNumber, parseNumber } from '../form-util';\n\n@Component({\n selector: 'nmf-number',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [type]=\"formatNumberValue() ? 'text' : 'number'\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n\n <ng-content></ng-content>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n `,\n})\nexport class InputNumberComponent extends FormControlBase<\n string | number | null\n> {\n formatNumberValue = input<boolean>(false);\n displayValue = signal<string>('');\n\n behavior = new TextBehavior();\n currencyBehavior = new CurrencyBehavior();\n\n override writeValue(value: string | number | null): void {\n super.writeValue(value);\n this.updateDisplayValue(value);\n }\n\n handleKeyDown(event: KeyboardEvent) {\n this.currencyBehavior.blockNonDigitKey(event);\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const raw = (event.target as HTMLInputElement).value;\n const parsed = parseNumber(raw);\n\n this.updateDisplayValue(parsed);\n\n this.onChange(parsed);\n }\n\n updateDisplayValue(value: string | number | null) {\n if (this.formatNumberValue() && value != null) {\n this.displayValue.set(formatNumber(value) ?? '');\n } else {\n this.displayValue.set(value != null ? String(value) : '');\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\n\nexport interface SelectOption {\n key: string | number;\n label: string | number;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'nmf-select',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n <div class=\"select-wrapper\" [class.disabled]=\"disabled()\">\n <select\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [formControl]=\"formControl\"\n (blur)=\"onTouched()\"\n >\n <!-- Empty option -->\n <option [ngValue]=\"null\" disabled>\n {{ emptyOptionLabel() }}\n </option>\n\n <!-- Options -->\n @for (option of options(); track option.key) {\n <option [ngValue]=\"option.key\" [disabled]=\"option.disabled\">\n {{ option.label }}\n </option>\n }\n\n <!-- Clear option -->\n @if (clearOptionLabel()) {\n <option [ngValue]=\"null\">\n {{ clearOptionLabel() }}\n </option>\n }\n </select>\n </div>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputSelectComponent extends FormControlBase<any> {\n options = input<SelectOption[]>([]);\n emptyOptionLabel = input<string>('Select an option');\n clearOptionLabel = input<string | null>('Clear selection');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { TextBehavior } from '../behavior/text.behavior';\n\n@Component({\n selector: 'nmf-text',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <div class=\"nmf-input-wrapper\">\n <input\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [type]=\"computedType()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [formControl]=\"formControl\"\n (blur)=\"onTouched()\"\n />\n\n @if (type() === 'password' && !loading() && !disabled()) {\n <button\n type=\"button\"\n class=\"nmf-password-toggle\"\n aria-label=\"Toggle password visibility\"\n (click)=\"behavior.toggleShowPassword($event)\"\n >\n @if (behavior.showPassword()) {\n <ng-container [ngTemplateOutlet]=\"eyeOffIcon\"></ng-container>\n } @else {\n <ng-container [ngTemplateOutlet]=\"eyeIcon\"></ng-container>\n }\n </button>\n }\n </div>\n\n <ng-content></ng-content>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n\n <ng-template #eyeIcon>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"#e3e3e3\"\n class=\"nmf-icon\"\n >\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path\n d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"\n />\n </svg>\n </ng-template>\n\n <ng-template #eyeOffIcon>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"#e3e3e3\"\n class=\"nmf-icon\"\n >\n <path\n d=\"M0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0z\"\n fill=\"none\"\n />\n <path\n d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"\n />\n </svg>\n </ng-template>\n `,\n})\nexport class InputTextComponent extends FormControlBase<\n string | number | null\n> {\n type = input<\n 'text' | 'number' | 'email' | 'tel' | 'url' | 'password' | 'search'\n >('text');\n\n behavior = new TextBehavior();\n\n computedType = computed(() =>\n this.behavior.showPassword() && this.type() === 'password'\n ? 'text'\n : this.type(),\n );\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-textarea',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <textarea\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [rows]=\"rows()\"\n [cols]=\"cols()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [formControl]=\"formControl\"\n (blur)=\"onTouched()\"\n ></textarea>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n `,\n})\nexport class InputTextareaComponent extends FormControlBase<string | null> {\n rows = input<number>(5);\n cols = input<number>(5);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-timepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n type=\"time\"\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [step]=\"step()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputTimepickerComponent extends FormControlBase<Date | null> {\n // step in seconds: 60 = minutes only, 1 = show seconds\n step = input<number>(60);\n displayValue = signal<string>('');\n\n formatTime(date: Date | null | undefined): string | null {\n if (!date) return null;\n\n const hh = String(date.getHours()).padStart(2, '0');\n const mm = String(date.getMinutes()).padStart(2, '0');\n const ss = String(date.getSeconds()).padStart(2, '0');\n\n return this.step() < 60 ? `${hh}:${mm}:${ss}` : `${hh}:${mm}`;\n }\n\n parseTime(value: string): Date | null {\n if (!value) return null;\n\n const [h, m, s = 0] = value.split(':').map(Number);\n const date = new Date();\n date.setHours(h, m, s, 0);\n return date;\n }\n\n override writeValue(value: Date | null): void {\n super.writeValue(value);\n this.displayValue.set(this.formatTime(value) ?? '');\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLInputElement;\n const parsed = this.parseTime(input.value);\n\n this.displayValue.set(this.formatTime(parsed) ?? '');\n\n this.onChange(parsed);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormHydrator {\n hydrate(form: FormGroup, model: any, registry: MapperRegistry = {}) {\n Object.entries(form.controls).forEach(([key, control]) => {\n if (!(key in model)) return;\n\n const mapFn = registry[key]?.fromModel;\n const value = model?.[key];\n\n if (control instanceof FormGroup) {\n if (mapFn) {\n control.patchValue(mapFn(value), { emitEvent: false });\n } else {\n this.hydrate(control, value, registry);\n }\n return;\n }\n\n control.patchValue(value, { emitEvent: false });\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormSerializer {\n toRequest(form: FormGroup, registry: MapperRegistry = {}) {\n const result: any = {};\n\n Object.entries(form.controls).forEach(([key, control]) => {\n const mapFn = registry[key]?.toRequest;\n\n if (control instanceof FormGroup) {\n result[key] = mapFn\n ? mapFn(control.value)\n : this.toRequest(control, registry);\n return;\n }\n\n result[key] = control.value;\n });\n\n return result;\n }\n}\n","import { FormGroup } from '@angular/forms';\nimport { Directive, OnDestroy, signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { FormHandlerBase } from './base/form-handler-base';\nimport { FormMapperBase } from './base/form-mapper-base';\nimport { FormHydrator } from './form-hydrator';\nimport { FormSerializer } from './form-serializer';\nimport {\n FormHandlerRegistry,\n FormOrchestratorOptions,\n FormStatus,\n MapperRegistry,\n} from './types';\n\n@Directive()\nexport abstract class FormOrchestrator\n extends FormMapperBase\n implements OnDestroy\n{\n private readonly _form = signal<FormGroup>(new FormGroup({}));\n private readonly _handlerRegistry = signal<FormHandlerRegistry>([]);\n private readonly _mapperRegistry = signal<MapperRegistry>({});\n private readonly _status = signal<FormStatus>('idle');\n private readonly _errorMessage = signal<string | null>(null);\n\n public readonly form = this._form.asReadonly();\n public readonly handlerRegistry = this._handlerRegistry.asReadonly();\n public readonly mapperRegistry = this._mapperRegistry.asReadonly();\n public readonly status = this._status.asReadonly();\n public readonly errorMessage = this._errorMessage.asReadonly();\n\n private _logicSubscription = new Subscription();\n\n constructor(\n protected readonly hydrator: FormHydrator,\n protected readonly serializer: FormSerializer,\n ) {\n super();\n }\n\n /**\n * Initializes orchestration state.\n * Must be called before any subform registration or handler execution.\n */\n public orchestrate(options: FormOrchestratorOptions) {\n const { form, mapperRegistry = {}, handlerRegistry = [] } = options;\n this._form.set(form);\n this._mapperRegistry.set(mapperRegistry);\n this._handlerRegistry.set(handlerRegistry);\n\n Object.values(this.handlerRegistry()).forEach((handler) => {\n this.addReactiveLogic(handler.getReactiveLogic(form));\n });\n }\n\n public setForm(form: FormGroup) {\n this._form.set(form);\n }\n\n public getSubForm(key: string): FormGroup {\n return this.form().get(key) as FormGroup;\n }\n\n public addHandlerToRegistry(handler: FormHandlerBase) {\n this._handlerRegistry.set([...this._handlerRegistry(), handler]);\n }\n\n public addReactiveLogic(subscription: Subscription) {\n this._logicSubscription.add(subscription);\n }\n\n public setStatus(status: FormStatus) {\n this._status.set(status);\n }\n\n public setErrorMessage(message: string | null) {\n this._errorMessage.set(message);\n }\n\n public hydrateFromModel(model: any) {\n const form = this.form();\n const registry = this.mapperRegistry();\n\n Object.entries(form.controls).forEach(([key, control]) => {\n if (!(key in model)) return;\n\n const mapper = registry[key];\n const value = model?.[key];\n\n if (control instanceof FormGroup) {\n this.hydrator.hydrate(\n control,\n mapper ? mapper.fromModel(value) : value,\n );\n }\n });\n }\n\n public buildRequest(): any {\n return this.serializer.toRequest(this.form(), this.mapperRegistry());\n }\n\n ngOnDestroy(): void {\n this._logicSubscription.unsubscribe();\n }\n}\n","/*\n * Public API Surface of core\n */\n\nexport * from './lib/base/form-control-base';\nexport * from './lib/base/form-handler-base';\nexport * from './lib/base/form-mapper-base';\n\nexport * from './lib/behavior/currency.behavior';\nexport * from './lib/behavior/text.behavior';\n\nexport * from './lib/input/input-currency.component';\nexport * from './lib/input/input-datepicker.component';\nexport * from './lib/input/input-number.component';\nexport * from './lib/input/input-select.component';\nexport * from './lib/input/input-text.component';\nexport * from './lib/input/input-textarea.component';\nexport * from './lib/input/input-timepicker.component';\n\nexport * from './lib/form-hydrator';\nexport * from './lib/form-orchestrator';\nexport * from './lib/form-serializer';\nexport * from './lib/form-util';\nexport * from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.FormHydrator","i2.FormSerializer"],"mappings":"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"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { ControlValueAccessor, FormControl, NgControl } from '@angular/forms';
|
|
2
|
-
import {
|
|
2
|
+
import { DestroyRef } from '@angular/core';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare abstract class FormControlBase<T> implements ControlValueAccessor {
|
|
5
|
-
protected readonly cdr: ChangeDetectorRef;
|
|
6
5
|
protected readonly destroyRef: DestroyRef;
|
|
7
6
|
static nextId: number;
|
|
8
7
|
readonly id: import("@angular/core").InputSignal<string | null>;
|
|
9
|
-
readonly _id: import("@angular/core").InputSignal<string | null>;
|
|
10
8
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
11
9
|
readonly classList: import("@angular/core").InputSignal<string[]>;
|
|
12
10
|
readonly loading: import("@angular/core").InputSignal<boolean>;
|
|
@@ -15,20 +13,20 @@ export declare abstract class FormControlBase<T> implements ControlValueAccessor
|
|
|
15
13
|
readonly _disabledByInput: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
16
14
|
readonly _disabledByCva: import("@angular/core").WritableSignal<boolean>;
|
|
17
15
|
readonly ngControl: NgControl | null;
|
|
18
|
-
protected readonly
|
|
16
|
+
protected readonly standaloneControl: FormControl<T | null>;
|
|
17
|
+
get formControl(): FormControl<T | null>;
|
|
19
18
|
protected readonly disabled: import("@angular/core").Signal<boolean>;
|
|
20
19
|
protected readonly isRequired: import("@angular/core").WritableSignal<boolean>;
|
|
21
20
|
protected readonly hasErrors: import("@angular/core").WritableSignal<boolean>;
|
|
22
|
-
private changeSub;
|
|
23
21
|
protected onChange: (value: T | null) => void;
|
|
24
22
|
protected onTouched: () => void;
|
|
25
23
|
constructor();
|
|
26
24
|
ngOnInit(): void;
|
|
27
|
-
writeValue(value: T): void;
|
|
25
|
+
writeValue(value: T | null): void;
|
|
28
26
|
registerOnChange(fn: (value: T | null) => void): void;
|
|
29
27
|
registerOnTouched(fn: () => void): void;
|
|
30
28
|
setDisabledState(isDisabled: boolean): void;
|
|
31
29
|
protected errorMessage(): string | null;
|
|
32
30
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormControlBase<any>, never>;
|
|
33
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlBase<any>, never, never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "
|
|
31
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlBase<any>, never, never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "classList": { "alias": "classList"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "_disabledByInput": { "alias": "_disabledByInput"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
34
32
|
}
|
|
@@ -11,12 +11,12 @@ export declare abstract class FormOrchestrator extends FormMapperBase implements
|
|
|
11
11
|
protected readonly hydrator: FormHydrator;
|
|
12
12
|
protected readonly serializer: FormSerializer;
|
|
13
13
|
private readonly _form;
|
|
14
|
-
private readonly
|
|
14
|
+
private readonly _handlerRegistry;
|
|
15
15
|
private readonly _mapperRegistry;
|
|
16
16
|
private readonly _status;
|
|
17
17
|
private readonly _errorMessage;
|
|
18
18
|
readonly form: import("@angular/core").Signal<FormGroup<any>>;
|
|
19
|
-
readonly
|
|
19
|
+
readonly handlerRegistry: import("@angular/core").Signal<FormHandlerRegistry>;
|
|
20
20
|
readonly mapperRegistry: import("@angular/core").Signal<MapperRegistry>;
|
|
21
21
|
readonly status: import("@angular/core").Signal<FormStatus>;
|
|
22
22
|
readonly errorMessage: import("@angular/core").Signal<string | null>;
|
|
@@ -29,7 +29,7 @@ export declare abstract class FormOrchestrator extends FormMapperBase implements
|
|
|
29
29
|
orchestrate(options: FormOrchestratorOptions): void;
|
|
30
30
|
setForm(form: FormGroup): void;
|
|
31
31
|
getSubForm(key: string): FormGroup;
|
|
32
|
-
|
|
32
|
+
addHandlerToRegistry(handler: FormHandlerBase): void;
|
|
33
33
|
addReactiveLogic(subscription: Subscription): void;
|
|
34
34
|
setStatus(status: FormStatus): void;
|
|
35
35
|
setErrorMessage(message: string | null): void;
|
package/lib/types.d.ts
CHANGED
|
@@ -6,6 +6,6 @@ export type MapperRegistry = Record<string, FormMapperBase<any, any, any>>;
|
|
|
6
6
|
export type FormHandlerRegistry = FormHandlerBase[];
|
|
7
7
|
export interface FormOrchestratorOptions {
|
|
8
8
|
form: FormGroup;
|
|
9
|
-
handlers?: FormHandlerRegistry;
|
|
10
9
|
mapperRegistry?: MapperRegistry;
|
|
10
|
+
handlerRegistry?: FormHandlerRegistry;
|
|
11
11
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ng-modular-forms/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "Core primitives, behaviors, and input components for orchestrating complex Angular reactive forms.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"input-components",
|
|
16
16
|
"ng-modular-forms"
|
|
17
17
|
],
|
|
18
|
-
"homepage": "https://
|
|
18
|
+
"homepage": "https://ngmf.ronbodnar.com",
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
21
21
|
"url": "https://github.com/ronbodnar/ng-modular-forms.git"
|