@ng-modular-forms/core 0.8.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -9
- package/fesm2022/ng-modular-forms-core.mjs +101 -6
- package/fesm2022/ng-modular-forms-core.mjs.map +1 -1
- package/lib/form-hydrator.d.ts +5 -2
- package/lib/form-orchestrator.d.ts +2 -2
- package/lib/form-serializer.d.ts +2 -1
- package/lib/types.d.ts +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -52,13 +52,28 @@ npm install @ng-modular-forms/core
|
|
|
52
52
|
npm install @ng-modular-forms/material
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
+
## Styles Setup
|
|
56
|
+
Add the corresponding styles to your application's angular.json file under the styles array. Only include the files for the packages you are actively using:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
"styles": [
|
|
60
|
+
"src/styles.css",
|
|
61
|
+
|
|
62
|
+
// Required ONLY if using @ng-modular-forms/core native controls
|
|
63
|
+
"node_modules/@ng-modular-forms/core/styles/form-controls.css",
|
|
64
|
+
|
|
65
|
+
// Required ONLY if using @ng-modular-forms/material
|
|
66
|
+
"node_modules/@ng-modular-forms/material/styles/form-controls.css"
|
|
67
|
+
]
|
|
68
|
+
```
|
|
69
|
+
|
|
55
70
|
## Core Primitives
|
|
56
71
|
|
|
57
72
|
### FormOrchestrator
|
|
58
73
|
|
|
59
74
|
Coordinates form structure and lifecycle.
|
|
60
75
|
|
|
61
|
-
```
|
|
76
|
+
```typescript
|
|
62
77
|
import {
|
|
63
78
|
FormOrchestrator, FormHydrator, FormSerializer
|
|
64
79
|
} from '@ng-modular-forms/core';
|
|
@@ -114,7 +129,7 @@ export class ExampleComponent extends FormOrchestrator {
|
|
|
114
129
|
```
|
|
115
130
|
|
|
116
131
|
Optional component for Section A to house the form controls.
|
|
117
|
-
```
|
|
132
|
+
```typescript
|
|
118
133
|
import { InputTextComponent } from '@ng-modular-forms/core';
|
|
119
134
|
|
|
120
135
|
@Component({
|
|
@@ -136,7 +151,7 @@ export class SectionAComponent {
|
|
|
136
151
|
|
|
137
152
|
Encapsulates cross-field reactive behavior. Keeps UI logic out of the component.
|
|
138
153
|
|
|
139
|
-
```
|
|
154
|
+
```typescript
|
|
140
155
|
import { Subscription } from 'rxjs';
|
|
141
156
|
import { FormHandlerBase } from '@ng-modular-forms/core';
|
|
142
157
|
|
|
@@ -177,7 +192,7 @@ export class SectionAHandler extends FormHandlerBase<Controls> {
|
|
|
177
192
|
|
|
178
193
|
Handles transformations between API and form. `FormHydrator` and `FormSerializer` will call these automatically.
|
|
179
194
|
|
|
180
|
-
```
|
|
195
|
+
```typescript
|
|
181
196
|
import { FormMapperBase, getControlValue } from '@ng-modular-forms/core';
|
|
182
197
|
|
|
183
198
|
export class SectionAMapper extends FormMapperBase<
|
|
@@ -240,7 +255,7 @@ This helps centralize API ↔ form transformations and reduces repetitive patchi
|
|
|
240
255
|
Patches form controls from a model.
|
|
241
256
|
|
|
242
257
|
Standalone usage:
|
|
243
|
-
```
|
|
258
|
+
```typescript
|
|
244
259
|
import { FormHydrator } from '@ng-modular-forms/core';
|
|
245
260
|
|
|
246
261
|
@Component({...})
|
|
@@ -258,7 +273,7 @@ export class ExampleComponent {
|
|
|
258
273
|
```
|
|
259
274
|
|
|
260
275
|
FormOrchestrator usage:
|
|
261
|
-
```
|
|
276
|
+
```typescript
|
|
262
277
|
import {
|
|
263
278
|
FormOrchestrator, FormHydrator, FormSerializer
|
|
264
279
|
} from '@ng-modular-forms/core';
|
|
@@ -288,7 +303,7 @@ export class ExampleComponent extends FormOrchestrator {
|
|
|
288
303
|
Serializes form controls to a model.
|
|
289
304
|
|
|
290
305
|
Standalone usage:
|
|
291
|
-
```
|
|
306
|
+
```typescript
|
|
292
307
|
import { FormSerializer } from '@ng-modular-forms/core';
|
|
293
308
|
|
|
294
309
|
@Component({...})
|
|
@@ -311,7 +326,7 @@ export class ExampleComponent {
|
|
|
311
326
|
```
|
|
312
327
|
|
|
313
328
|
FormOrchestrator usage:
|
|
314
|
-
```
|
|
329
|
+
```typescript
|
|
315
330
|
import {
|
|
316
331
|
FormOrchestrator, FormHydrator, FormSerializer
|
|
317
332
|
} from '@ng-modular-forms/core';
|
|
@@ -341,7 +356,7 @@ export class ExampleComponent extends FormOrchestrator {
|
|
|
341
356
|
|
|
342
357
|
## Input Component Example (No Orchestration)
|
|
343
358
|
|
|
344
|
-
```
|
|
359
|
+
```typescript
|
|
345
360
|
import {
|
|
346
361
|
InputTextComponent, InputCurrencyComponent
|
|
347
362
|
} from '@ng-modular-forms/core';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i2 from '@angular/forms';
|
|
2
|
-
import { NgControl, Validators, TouchedChangeEvent, ReactiveFormsModule, FormGroup } from '@angular/forms';
|
|
2
|
+
import { NgControl, Validators, TouchedChangeEvent, ReactiveFormsModule, FormArray, FormGroup, FormControl } from '@angular/forms';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
4
|
import { viewChild, input, computed, booleanAttribute, signal, inject, ChangeDetectorRef, DestroyRef, ElementRef, Directive, ChangeDetectionStrategy, Component, effect, Injectable } from '@angular/core';
|
|
5
5
|
import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
|
|
@@ -1596,11 +1596,20 @@ function isRecord(value) {
|
|
|
1596
1596
|
|
|
1597
1597
|
class FormHydrator {
|
|
1598
1598
|
hydrate(form, model, registry = {}) {
|
|
1599
|
+
if (form instanceof FormArray) {
|
|
1600
|
+
this.hydrateFormArray(form, model, registry);
|
|
1601
|
+
return;
|
|
1602
|
+
}
|
|
1599
1603
|
Object.entries(form.controls).forEach(([key, control]) => {
|
|
1600
|
-
if (!(key in model))
|
|
1604
|
+
if (!(key in model)) {
|
|
1601
1605
|
return;
|
|
1606
|
+
}
|
|
1602
1607
|
const mapFn = registry[key]?.fromModel;
|
|
1603
|
-
const value = model
|
|
1608
|
+
const value = model[key];
|
|
1609
|
+
if (control instanceof FormArray) {
|
|
1610
|
+
this.hydrateFormArray(control, value, registry);
|
|
1611
|
+
return;
|
|
1612
|
+
}
|
|
1604
1613
|
if (control instanceof FormGroup) {
|
|
1605
1614
|
if (mapFn) {
|
|
1606
1615
|
const mapped = mapFn(value);
|
|
@@ -1609,13 +1618,70 @@ class FormHydrator {
|
|
|
1609
1618
|
}
|
|
1610
1619
|
}
|
|
1611
1620
|
else {
|
|
1612
|
-
this.hydrate(control,
|
|
1621
|
+
this.hydrate(control, value ?? {}, registry);
|
|
1613
1622
|
}
|
|
1614
1623
|
return;
|
|
1615
1624
|
}
|
|
1616
1625
|
control.patchValue(value, { emitEvent: false });
|
|
1617
1626
|
});
|
|
1618
1627
|
}
|
|
1628
|
+
hydrateFormArray(formArray, model, registry) {
|
|
1629
|
+
const values = Array.isArray(model) ? model : [];
|
|
1630
|
+
if (values.length === 0) {
|
|
1631
|
+
formArray.clear();
|
|
1632
|
+
return;
|
|
1633
|
+
}
|
|
1634
|
+
if (formArray.length === 0) {
|
|
1635
|
+
formArray.push(this.createControlFromModel(values[0]));
|
|
1636
|
+
}
|
|
1637
|
+
while (formArray.length > values.length) {
|
|
1638
|
+
formArray.removeAt(formArray.length - 1);
|
|
1639
|
+
}
|
|
1640
|
+
while (formArray.length < values.length) {
|
|
1641
|
+
const template = formArray.at(formArray.length - 1);
|
|
1642
|
+
formArray.push(this.cloneControl(template));
|
|
1643
|
+
}
|
|
1644
|
+
values.forEach((item, index) => {
|
|
1645
|
+
const child = formArray.at(index);
|
|
1646
|
+
if (child instanceof FormGroup && isRecord(item)) {
|
|
1647
|
+
this.hydrate(child, item, registry);
|
|
1648
|
+
}
|
|
1649
|
+
else if (child instanceof FormArray && Array.isArray(item)) {
|
|
1650
|
+
this.hydrate(child, item, registry);
|
|
1651
|
+
}
|
|
1652
|
+
else {
|
|
1653
|
+
child.patchValue(item, { emitEvent: false });
|
|
1654
|
+
}
|
|
1655
|
+
});
|
|
1656
|
+
}
|
|
1657
|
+
createControlFromModel(value) {
|
|
1658
|
+
if (Array.isArray(value)) {
|
|
1659
|
+
return new FormArray(value.map((item) => this.createControlFromModel(item)));
|
|
1660
|
+
}
|
|
1661
|
+
if (isRecord(value)) {
|
|
1662
|
+
return new FormGroup(Object.fromEntries(Object.keys(value).map((key) => [key, new FormControl(null)])));
|
|
1663
|
+
}
|
|
1664
|
+
return new FormControl(null);
|
|
1665
|
+
}
|
|
1666
|
+
cloneControl(control) {
|
|
1667
|
+
if (control instanceof FormControl) {
|
|
1668
|
+
return new FormControl(null, control.validator, control.asyncValidator);
|
|
1669
|
+
}
|
|
1670
|
+
if (control instanceof FormGroup) {
|
|
1671
|
+
return new FormGroup(Object.fromEntries(Object.entries(control.controls).map(([key, child]) => [
|
|
1672
|
+
key,
|
|
1673
|
+
this.cloneControl(child),
|
|
1674
|
+
])), {
|
|
1675
|
+
validators: control.validator,
|
|
1676
|
+
asyncValidators: control.asyncValidator,
|
|
1677
|
+
updateOn: control.updateOn,
|
|
1678
|
+
});
|
|
1679
|
+
}
|
|
1680
|
+
return new FormArray(control.controls.map((child) => this.cloneControl(child)), {
|
|
1681
|
+
validators: control.validator,
|
|
1682
|
+
asyncValidators: control.asyncValidator,
|
|
1683
|
+
});
|
|
1684
|
+
}
|
|
1619
1685
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormHydrator, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1620
1686
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormHydrator, providedIn: 'root' });
|
|
1621
1687
|
}
|
|
@@ -1626,16 +1692,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
|
|
|
1626
1692
|
|
|
1627
1693
|
class FormSerializer {
|
|
1628
1694
|
toRequest(form, registry = {}, options) {
|
|
1695
|
+
if (form instanceof FormArray) {
|
|
1696
|
+
return form.controls.map((control) => {
|
|
1697
|
+
if (control instanceof FormControl) {
|
|
1698
|
+
return control.value;
|
|
1699
|
+
}
|
|
1700
|
+
if (control instanceof FormGroup) {
|
|
1701
|
+
return this.toRequest(control, registry, options);
|
|
1702
|
+
}
|
|
1703
|
+
if (control instanceof FormArray) {
|
|
1704
|
+
return this.toRequest(control, registry, options);
|
|
1705
|
+
}
|
|
1706
|
+
return null;
|
|
1707
|
+
});
|
|
1708
|
+
}
|
|
1629
1709
|
const result = {};
|
|
1630
1710
|
Object.entries(form.controls).forEach(([key, control]) => {
|
|
1631
1711
|
const mapFn = registry[key]?.toRequest;
|
|
1712
|
+
if (control instanceof FormControl) {
|
|
1713
|
+
result[key] = control.value;
|
|
1714
|
+
return;
|
|
1715
|
+
}
|
|
1632
1716
|
if (control instanceof FormGroup) {
|
|
1633
1717
|
result[key] = mapFn
|
|
1634
1718
|
? mapFn(control.value, options)
|
|
1635
1719
|
: this.toRequest(control, registry, options);
|
|
1636
1720
|
return;
|
|
1637
1721
|
}
|
|
1638
|
-
|
|
1722
|
+
if (control instanceof FormArray) {
|
|
1723
|
+
result[key] = mapFn
|
|
1724
|
+
? mapFn(control.value, options)
|
|
1725
|
+
: this.toRequest(control, registry, options);
|
|
1726
|
+
return;
|
|
1727
|
+
}
|
|
1639
1728
|
});
|
|
1640
1729
|
return result;
|
|
1641
1730
|
}
|
|
@@ -1687,6 +1776,7 @@ class FormOrchestrator extends FormMapperBase {
|
|
|
1687
1776
|
}
|
|
1688
1777
|
addHandlerToRegistry(handler) {
|
|
1689
1778
|
this._handlerRegistry.set([...this._handlerRegistry(), handler]);
|
|
1779
|
+
this.addReactiveLogic(handler.getReactiveLogic(this.form()));
|
|
1690
1780
|
}
|
|
1691
1781
|
addReactiveLogic(subscription) {
|
|
1692
1782
|
this._logicSubscription.add(subscription);
|
|
@@ -1705,10 +1795,15 @@ class FormOrchestrator extends FormMapperBase {
|
|
|
1705
1795
|
return;
|
|
1706
1796
|
const mapper = registry[key];
|
|
1707
1797
|
const value = model[key];
|
|
1798
|
+
if (control instanceof FormControl) {
|
|
1799
|
+
const mapped = mapper ? mapper.fromModel(value) : value;
|
|
1800
|
+
control.setValue(mapped, { emitEvent: false });
|
|
1801
|
+
return;
|
|
1802
|
+
}
|
|
1708
1803
|
if (control instanceof FormGroup) {
|
|
1709
1804
|
const mapped = mapper ? mapper.fromModel(value) : value;
|
|
1710
1805
|
if (isRecord(mapped)) {
|
|
1711
|
-
this.hydrator.hydrate(control, mapped);
|
|
1806
|
+
this.hydrator.hydrate(control, mapped, registry);
|
|
1712
1807
|
}
|
|
1713
1808
|
}
|
|
1714
1809
|
});
|
|
@@ -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/number-utils.ts","../../../projects/core/src/lib/form-utils.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/currency.behavior.ts","../../../projects/core/src/lib/behavior/lookup/lookup.behavior.ts","../../../projects/core/src/lib/behavior/text/text.behavior.ts","../../../projects/core/src/lib/controls/form-field/form-field.component.ts","../../../projects/core/src/lib/controls/currency/currency.component.ts","../../../projects/core/src/lib/controls/datepicker/datepicker.component.ts","../../../projects/core/src/lib/controls/lookup/lookup.component.ts","../../../projects/core/src/lib/controls/number/number.component.ts","../../../projects/core/src/lib/controls/select/select.component.ts","../../../projects/core/src/lib/controls/text/text.component.ts","../../../projects/core/src/lib/controls/textarea/textarea.component.ts","../../../projects/core/src/lib/controls/timepicker/timepicker.component.ts","../../../projects/core/src/lib/type-guards.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 ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge, startWith } from 'rxjs';\n\ntype ControlValue<T> = T | null;\n\n@Directive()\nexport abstract class FormControlBase<TValue> implements ControlValueAccessor {\n static nextId = 0;\n\n readonly focusableElement = viewChild<\n ElementRef<HTMLElement> | { focus: () => void; blur: () => void }\n >('focusable');\n\n readonly id = input<string>(`nmf-form-control-${FormControlBase.nextId++}`);\n readonly label = input<string>('');\n readonly loading = input<boolean>(false);\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n readonly autocompleteAttr = input<string | null>(null);\n readonly _classList = input<string | string[]>('', { alias: 'classList' });\n\n readonly classList = computed(() => {\n const classList = this._classList();\n\n if (Array.isArray(classList)) {\n return classList.filter((className) => !!className.trim());\n }\n\n return classList.split(/\\s+/).filter((className) => className.length > 0);\n });\n\n readonly _disabledByInput = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n alias: 'disabledOverride',\n });\n readonly _disabledByCva = signal(false);\n\n readonly cdr = inject(ChangeDetectorRef);\n readonly destroyRef = inject(DestroyRef);\n readonly ngControl = inject(NgControl, {\n optional: true,\n });\n\n private _focused = signal(false);\n\n private _value: TValue | 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 protected onChange: (value: TValue | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n get value(): TValue | null {\n return this._value;\n }\n\n get control(): FormControl<ControlValue<TValue>> {\n return this.ngControl?.control as FormControl<ControlValue<TValue>>;\n }\n\n get focused(): boolean {\n return this._focused();\n }\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n ngOnInit() {\n const control = this.control;\n if (!control) return;\n\n merge(control.statusChanges, control.valueChanges)\n .pipe(startWith(null), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.onControlStateChange();\n });\n\n control.events\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (event instanceof TouchedChangeEvent) {\n this.onControlStateChange();\n }\n });\n }\n\n protected onControlStateChange(): void {\n const control = this.control;\n if (!control) {\n return;\n }\n\n this.hasErrors.set(control.invalid && control.touched);\n this.isRequired.set(control.hasValidator(Validators.required) ?? false);\n\n this.cdr.markForCheck();\n }\n\n writeValue(value: TValue | null): void {\n this._value = value;\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: (value: TValue | 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 focus(): void {\n const target = this.focusableElement();\n if (!target) return;\n\n // Type guard check for native ElementRef wrapper\n if (target instanceof ElementRef) {\n target.nativeElement.focus();\n }\n // Type guard check for a custom component instance with executable methods\n else if ('focus' in target && typeof target.focus === 'function') {\n target.focus();\n }\n }\n\n blur(): void {\n const target = this.focusableElement();\n if (!target) return;\n\n if (target instanceof ElementRef) {\n target.nativeElement.blur();\n } else if ('blur' in target && typeof target.blur === 'function') {\n target.blur();\n }\n }\n\n onFocusIn(): void {\n if (this.focused) {\n return;\n }\n this._focused.set(true);\n }\n\n onFocusOut(): void {\n //this.control?.markAsTouched();\n this._focused.set(false);\n this.onTouched();\n }\n\n protected errorMessage(): string | null {\n const control = this.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","export 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 type { FormControl, FormGroup } from '@angular/forms';\nimport { parseNumber } from './number-utils';\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","import type { FormControl, FormGroup } from '@angular/forms';\nimport type { Observable, Subscription } from 'rxjs';\nimport { getControl } from '../form-utils';\n\nexport abstract class FormHandlerBase<\n TControls extends Record<string, FormControl<unknown>>,\n> {\n private _form!: FormGroup;\n\n abstract getReactiveLogic(form: FormGroup): Subscription;\n\n public initializeForm(form: FormGroup): void {\n this._form = form;\n }\n\n public getControl<TKey extends keyof TControls>(key: TKey): TControls[TKey] {\n const control = getControl(String(key), this._form);\n\n if (!control) {\n throw new Error(`Control \"${String(key)}\" not found.`);\n }\n\n return control as TControls[TKey];\n }\n\n public valueChangesOf<TKey extends keyof TControls>(\n key: TKey,\n ): Observable<TControls[TKey]['value']> {\n return this.getControl(key).valueChanges;\n }\n}\n","export abstract class FormMapperBase<\n TIn = unknown,\n TOut = TIn,\n TForm = TIn,\n TOptions extends object = object,\n> {\n public fromModel(model: TIn): TForm {\n return structuredClone(model) as unknown as TForm;\n }\n\n public toRequest(formValue: TForm, _options?: TOptions): 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';\nimport {\n LookupBehaviorOptions,\n LookupOption,\n LookupStatus,\n} from '../../controls/lookup/lookup.types';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n take,\n catchError,\n EMPTY,\n Subject,\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n merge,\n of,\n startWith,\n switchMap,\n tap,\n Observable,\n} from 'rxjs';\n\nexport class LookupBehavior<TOption> {\n private readonly _status = signal<LookupStatus>('default');\n private readonly _options = signal<LookupOption<TOption>[]>([]);\n private readonly _selectedOption = signal<LookupOption<TOption> | null>(null);\n\n public readonly status = this._status.asReadonly();\n public readonly options = this._options.asReadonly();\n public readonly selectedOption = this._selectedOption.asReadonly();\n\n /*\n * Emits when the options have been updated. Ensures Material autocomplete updates its\n */\n public readonly optionsUpdated$ = new Subject<void>();\n\n public filteredOptions!: Observable<LookupOption<TOption>[]>;\n\n private bOptions!: LookupBehaviorOptions<TOption>;\n\n constructor(bOptions: LookupBehaviorOptions<TOption>) {\n this.bOptions = bOptions;\n }\n\n setSelectedOption(value: LookupOption<TOption> | null): void {\n this._selectedOption.set(value);\n }\n\n selectOption(event: Event | undefined, option: LookupOption<TOption>): void {\n event?.stopPropagation();\n\n const compare = this.bOptions.resolvers.compare() ?? undefined;\n\n const selected = this.options().find((o) =>\n compare ? compare(o.value, option.value) : o.value === option.value,\n );\n if (!selected) {\n return;\n }\n\n this.setSelectedOption(selected);\n }\n\n clearSelectedOption(): void {\n this.setSelectedOption(null);\n this.optionsUpdated$.next();\n }\n\n selectedMatchedOption(value: TOption | null): void {\n const { destroyRef, resolvers } = this.bOptions;\n\n const compare = resolvers.compare() ?? undefined;\n const label = resolvers.label() ?? undefined;\n const labelAsync = resolvers.labelAsync() ?? undefined;\n\n const match =\n this._options().find((o) =>\n compare ? compare(o.value, value as TOption) : o.value === value,\n ) ?? null;\n\n if (match) {\n this._selectedOption.set(match);\n return;\n }\n\n if (value === null) {\n this._selectedOption.set(null);\n return;\n }\n\n if (labelAsync) {\n this._status.set('loading');\n\n labelAsync(value)\n .pipe(\n take(1),\n catchError(() => {\n this._status.set('error');\n return EMPTY;\n }),\n takeUntilDestroyed(destroyRef),\n )\n .subscribe((label) => {\n this._selectedOption.set({\n value,\n label,\n });\n this._status.set('default');\n });\n return;\n }\n\n if (label) {\n this._selectedOption.set({\n value: value as TOption,\n label: label(value),\n });\n return;\n }\n }\n\n updateOptions(results: LookupOption<TOption>[], status?: LookupStatus): void {\n this._status.set(status ?? 'default');\n this._options.set(results);\n this.optionsUpdated$.next();\n }\n\n filterOptions(\n name: string,\n results: LookupOption<TOption>[],\n ): LookupOption<TOption>[] {\n const filterValue = name.toLowerCase();\n return results.filter(\n (option) =>\n option.label.toLowerCase().includes(filterValue) ||\n String(option.value).includes(filterValue),\n );\n }\n\n setupFilteredOptions(\n source: Observable<unknown>,\n searchQuery: unknown,\n ): void {\n this.filteredOptions = merge(source, this.optionsUpdated$).pipe(\n startWith(''),\n map(() => {\n const options = this.options();\n let value = searchQuery;\n\n if (typeof searchQuery === 'function') {\n value = searchQuery();\n }\n\n if (typeof value !== 'string') {\n return this.options().slice();\n }\n\n return value ? this.filterOptions(value, options) : options.slice();\n }),\n );\n }\n\n setupOptionsProvider(\n source: Observable<string | null>,\n debounceDelay: number,\n searchThreshold: number,\n ): void {\n const { destroyRef, resolvers } = this.bOptions;\n\n const search = resolvers.search() ?? undefined;\n\n if (!search) {\n return;\n }\n\n source.pipe(takeUntilDestroyed(destroyRef)).subscribe((value) => {\n if (!value || value.length < searchThreshold) {\n this.updateOptions([]);\n }\n });\n\n source\n .pipe(\n debounceTime(debounceDelay),\n distinctUntilChanged((a, b) => a === b),\n filter(() => this.selectedOption() == null),\n filter(\n (q): q is string =>\n typeof q === 'string' && q.length >= searchThreshold,\n ),\n tap(() => this.updateOptions([], 'loading')),\n switchMap((query) =>\n search(query).pipe(\n catchError(() => {\n this._status.set('error');\n return of(null);\n }),\n ),\n ),\n takeUntilDestroyed(destroyRef),\n )\n .subscribe((response) => {\n if (!response) {\n return;\n }\n const status = response.length ? 'default' : 'empty';\n this.updateOptions(response, status);\n });\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 input,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'nmf-form-field',\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 <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n @if (hint()) {\n <p class=\"nmf-hint\">\n {{ hint() }}\n </p>\n }\n\n <p class=\"nmf-hint\" [class.error]=\"hasErrors()\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class FormFieldComponent {\n label = input<string>();\n isRequired = input<boolean>();\n loading = input<boolean>();\n hint = input<string | null>();\n errorMessage = input<string | null>();\n\n hasErrors = computed(() => this.errorMessage() != null);\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/currency.behavior';\nimport { formatNumber, parseNumber } from '../../number-utils';\nimport { FormFieldComponent } from '../form-field/form-field.component';\n\n@Component({\n selector: 'nmf-currency',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\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 #focusable\n type=\"text\"\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 [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n </div>\n </nmf-form-field>\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 { FormFieldComponent } from '../form-field/form-field.component';\nimport { FormControlBase } from '../../base/form-control-base';\n\n@Component({\n selector: 'nmf-datepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <input\n #focusable\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 [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n </nmf-form-field>\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 computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n signal,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { AsyncPipe, CommonModule } from '@angular/common';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\nimport { FormControlBase } from '../../base/form-control-base';\nimport { LookupOption, LookupStatus } from './lookup.types';\nimport { FormFieldComponent } from '../form-field/form-field.component';\nimport { LookupBehavior } from '../../behavior/lookup/lookup.behavior';\n\n@Component({\n selector: 'nmf-lookup',\n exportAs: 'nmfLookup',\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent, AsyncPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [hint]=\"behavior.status() === 'empty' ? emptyOptionsLabel() : null\"\n [isRequired]=\"isRequired()\"\n [loading]=\"behavior.status() === 'loading' || loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <div class=\"nmf-input-wrapper\" [style.position]=\"'relative'\">\n @if ({ options: behavior.filteredOptions | async }; as stream) {\n <input\n #focusable\n type=\"text\"\n class=\"nmf-input\"\n [attr.list]=\"id + '-options'\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [style.cursor]=\"\n behavior.selectedOption() != null ? 'not-allowed' : 'text'\n \"\n [id]=\"id()\"\n [name]=\"name()\"\n [value]=\"displayLabel()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [readonly]=\"behavior.selectedOption() != null\"\n [placeholder]=\"placeholder()\"\n [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onFocusOut()\"\n (focus)=\"onFocusIn()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event, stream.options)\"\n />\n\n @if (isOpen() && stream.options && stream.options.length > 0) {\n <ul\n class=\"nmf-options-list\"\n [class.upward]=\"openUpwards()\"\n (pointerdown)=\"setOptionsInteraction(true)\"\n (pointerup)=\"setOptionsInteraction(false)\"\n >\n @for (option of stream.options; track option; let i = $index) {\n <li\n [class.selected]=\"behavior.selectedOption() == option\"\n [class.active]=\"activeIndex() === i\"\n (click)=\"selectOption($event, option)\"\n >\n {{\n displayWith() ? displayWith()!(option.value) : option.label\n }}\n </li>\n }\n </ul>\n }\n\n @if (behavior.selectedOption() && !disabled()) {\n <button\n class=\"nmf-clear-button\"\n type=\"button\"\n aria-label=\"Clear selection\"\n (click)=\"clearSelectedOption()\"\n >\n X\n </button>\n }\n }\n </div>\n </nmf-form-field>\n `,\n})\nexport class InputLookupComponent<TOption>\n extends FormControlBase<TOption>\n implements OnDestroy\n{\n override readonly autocompleteAttr = input<string | null>('off');\n\n /*\n * Static options to display in the dropdown. This is for synchronous sources.\n */\n optionsSource = input<LookupOption<TOption>[]>([]);\n\n /*\n * Must return a cancellable observable. This is for asynchronous sources (API calls, etc).\n */\n optionsProvider =\n input<(query: string | null) => Observable<LookupOption<TOption>[]>>();\n\n /*\n * When using a synchronous options source, or an asynchronous provider that returns an object where the shape is known,\n * this function is used to determine the display value.\n */\n displayWith = input<(value: TOption | null) => string>();\n\n /*\n * Used to determine the display value asynchronously when using primitive types for form values\n * eg: countryCode instead of Country itself.\n *\n * If not provided, the raw value will be used. Only needed for patching/hydrating the form.\n */\n displayProvider = input<(value: TOption | null) => Observable<string>>();\n\n /*\n * Used to compare options during selection if object equality is not sufficient.\n */\n compareWith = input<(a: TOption, b: TOption) => boolean>();\n\n /*\n * The provided hint will be displayed when asynchronous lookup is empty.\n */\n emptyOptionsLabel = input<string>('No results found');\n\n /*\n * Search will be debounced by this many milliseconds.\n */\n debounceTime = input<number>(500);\n\n /*\n * Search will not be triggered until the user has typed at least this many characters.\n */\n searchThreshold = input<number>(2);\n\n private readonly _activeIndex = signal(-1);\n\n public readonly activeIndex = this._activeIndex.asReadonly();\n\n private readonly _searchQuery = signal('');\n private readonly _isInteractingWithOptions = signal(false);\n\n private readonly _searchQuery$ = toObservable(this._searchQuery);\n\n readonly isOpen = signal(false);\n readonly openUpwards = signal(false);\n\n public readonly displayLabel = computed(() => {\n const selected = this.behavior.selectedOption();\n if (selected) {\n return selected.label;\n }\n return this._searchQuery();\n });\n\n inputElement = inject(ElementRef<HTMLInputElement>);\n\n behavior: LookupBehavior<TOption>;\n\n constructor() {\n super();\n\n this.behavior = new LookupBehavior<TOption>({\n destroyRef: this.destroyRef,\n resolvers: {\n compare: this.compareWith,\n label: this.displayWith,\n labelAsync: this.displayProvider,\n search: this.optionsProvider,\n },\n });\n\n effect(() => {\n const currentOptions = this.optionsSource() ?? [];\n this.updateOptions(currentOptions);\n });\n\n effect(() => {\n const selectedOption = this.behavior.selectedOption();\n this.onChange(selectedOption?.value ?? null);\n });\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n\n this.behavior.setupFilteredOptions(this._searchQuery$, this._searchQuery);\n this.behavior.setupOptionsProvider(this._searchQuery$, 500, 2);\n }\n\n override writeValue(value: TOption | null): void {\n super.writeValue(value);\n this.behavior.selectedMatchedOption(value);\n }\n\n override onFocusOut(): void {\n super.onFocusOut();\n\n if (this._isInteractingWithOptions()) {\n return;\n }\n\n this.isOpen.set(false);\n }\n\n override onFocusIn(): void {\n super.onFocusIn();\n if (!this.behavior.selectedOption()) {\n this.calculateDropdownPosition();\n this.isOpen.set(true);\n }\n }\n\n ngOnDestroy(): void {\n this.behavior.optionsUpdated$.complete();\n }\n\n onInput(event: Event): void {\n this._searchQuery.set((event.target as HTMLInputElement).value);\n }\n\n selectOption(event: Event, option: LookupOption<TOption>): void {\n this.behavior.selectOption(event, option);\n\n this._isInteractingWithOptions.set(false);\n this.isOpen.set(false);\n }\n\n resetActiveIndex(): void {\n this._activeIndex.set(-1);\n }\n\n setOptionsInteraction(state: boolean): void {\n this._isInteractingWithOptions.set(state);\n }\n\n updateOptions(results: LookupOption<TOption>[], status?: LookupStatus): void {\n this.behavior.updateOptions(results, status);\n this.resetActiveIndex();\n }\n\n clearSelectedOption(): void {\n this._searchQuery.set('');\n this.behavior.clearSelectedOption();\n this.focus();\n }\n\n onKeyDown(\n event: KeyboardEvent,\n currentOptions: LookupOption<TOption>[] | null,\n ): void {\n if (!this.isOpen() || !currentOptions || currentOptions.length === 0) {\n if (event.key === 'ArrowDown') {\n this.calculateDropdownPosition();\n this.isOpen.set(true);\n event.preventDefault();\n }\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this._activeIndex.update((prev) =>\n prev + 1 >= currentOptions.length ? 0 : prev + 1,\n );\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this._activeIndex.update((prev) =>\n prev - 1 < 0 ? currentOptions.length - 1 : prev - 1,\n );\n break;\n\n case 'Enter':\n event.preventDefault();\n if (\n this._activeIndex() >= 0 &&\n this._activeIndex() < currentOptions.length\n ) {\n this.selectOption(event, currentOptions[this._activeIndex()]);\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.isOpen.set(false);\n this.resetActiveIndex();\n break;\n\n case 'Backspace':\n case 'Delete':\n if (this.behavior.selectedOption() !== null) {\n event.preventDefault();\n this.clearSelectedOption();\n }\n break;\n }\n }\n\n private calculateDropdownPosition(): void {\n const rect = this.inputElement.nativeElement.getBoundingClientRect();\n\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n this.openUpwards.set(spaceBelow < 225 && spaceAbove > spaceBelow);\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 { FormFieldComponent } from '../form-field/form-field.component';\nimport { FormControlBase } from '../../base/form-control-base';\nimport { TextBehavior } from '../../behavior/text/text.behavior';\nimport { CurrencyBehavior } from '../../behavior/currency/currency.behavior';\nimport { parseNumber, formatNumber } from '../../number-utils';\n\n@Component({\n selector: 'nmf-number',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <input\n #focusable\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [type]=\"formatValue() ? 'text' : 'number'\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n </nmf-form-field>\n `,\n})\nexport class InputNumberComponent extends FormControlBase<\n string | number | null\n> {\n formatValue = 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.formatValue() && 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 { FormFieldComponent } from '../form-field/form-field.component';\nimport { FormControlBase } from '../../base/form-control-base';\n\nexport interface SelectOption {\n value: string | number;\n label: string | number;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'nmf-select',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <div class=\"select-wrapper\" [class.disabled]=\"disabled()\">\n <select\n #focusable\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [value]=\"value ?? ''\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (change)=\"handleChange($event)\"\n >\n <!-- Empty option -->\n <option [value]=\"''\" [disabled]=\"!allowEmptyOptionSelection()\">\n {{ emptyOptionLabel() }}\n </option>\n\n <!-- Options -->\n @for (option of options(); track option.value) {\n <option [value]=\"option.value\" [disabled]=\"option.disabled\">\n {{ option.label }}\n </option>\n }\n </select>\n </div>\n </nmf-form-field>\n `,\n})\nexport class InputSelectComponent extends FormControlBase<\n string | number | null\n> {\n options = input<SelectOption[]>([]);\n emptyOptionLabel = input<string>('Select an option');\n allowEmptyOptionSelection = input<boolean>(false);\n\n handleChange(event: Event): void {\n if (this._disabledByCva()) return;\n\n const input = event.target as HTMLSelectElement;\n this.onChange(input.value || null);\n }\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/text.behavior';\nimport { FormFieldComponent } from '../form-field/form-field.component';\n\n@Component({\n selector: 'nmf-text',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <div class=\"nmf-input-wrapper\">\n <input\n #focusable\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 [value]=\"value\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\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 </nmf-form-field>\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 onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLInputElement;\n this.onChange(input.value);\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';\nimport { FormFieldComponent } from '../form-field/form-field.component';\n\n@Component({\n selector: 'nmf-textarea',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <textarea\n #focusable\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 [value]=\"value\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n ></textarea>\n </nmf-form-field>\n `,\n})\nexport class InputTextareaComponent extends FormControlBase<string | null> {\n rows = input<number>(5);\n cols = input<number>(5);\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLTextAreaElement;\n this.onChange(input.value);\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 { FormFieldComponent } from '../form-field/form-field.component';\nimport { FormControlBase } from '../../base/form-control-base';\n\n@Component({\n selector: 'nmf-timepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <input\n #focusable\n type=\"time\"\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 [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n </nmf-form-field>\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","export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { isRecord } from './type-guards';\nimport type { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormHydrator {\n hydrate<TModel extends Record<string, unknown>>(\n form: FormGroup,\n model: TModel,\n registry: MapperRegistry = {},\n ) {\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 const mapped = mapFn(value);\n\n if (isRecord(mapped)) {\n control.patchValue(mapped, { emitEvent: false });\n }\n } else {\n this.hydrate(\n control,\n (value ?? {}) as Record<string, unknown>,\n registry,\n );\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 type { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormSerializer {\n toRequest<TOptions extends object = object>(\n form: FormGroup,\n registry: MapperRegistry = {},\n options?: TOptions,\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\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, options)\n : this.toRequest(control, registry, options);\n return;\n }\n\n result[key] = control.value;\n });\n\n return result;\n }\n}\n","import { FormControl, 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 type {\n FormHandlerRegistry,\n FormOrchestratorOptions,\n FormStatus,\n MapperRegistry,\n} from './types';\nimport { isRecord } from './type-guards';\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<TControls extends Record<string, FormControl>>(\n handler: FormHandlerBase<TControls>,\n ) {\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<TModel extends object>(model: TModel) {\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 as Record<string, unknown>)[key];\n\n if (control instanceof FormGroup) {\n const mapped = mapper ? mapper.fromModel(value) : value;\n\n if (isRecord(mapped)) {\n this.hydrator.hydrate(control, mapped);\n }\n }\n });\n }\n\n public buildRequest<TOptions extends object>(\n options?: TOptions,\n ): Record<string, unknown> {\n return this.serializer.toRequest<TOptions>(\n this.form(),\n this.mapperRegistry(),\n options,\n );\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/currency.behavior';\nexport * from './lib/behavior/lookup/lookup.behavior';\nexport * from './lib/behavior/text/text.behavior';\n\nexport * from './lib/controls/currency/currency.component';\nexport * from './lib/controls/datepicker/datepicker.component';\nexport * from './lib/controls/lookup/lookup.component';\nexport * from './lib/controls/lookup/lookup.types';\nexport * from './lib/controls/number/number.component';\nexport * from './lib/controls/select/select.component';\nexport * from './lib/controls/text/text.component';\nexport * from './lib/controls/textarea/textarea.component';\nexport * from './lib/controls/timepicker/timepicker.component';\n\nexport * from './lib/form-hydrator';\nexport * from './lib/form-orchestrator';\nexport * from './lib/form-serializer';\nexport * from './lib/form-utils';\nexport * from './lib/number-utils';\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/number-utils.ts","../../../projects/core/src/lib/form-utils.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/currency.behavior.ts","../../../projects/core/src/lib/behavior/lookup/lookup.behavior.ts","../../../projects/core/src/lib/behavior/text/text.behavior.ts","../../../projects/core/src/lib/controls/form-field/form-field.component.ts","../../../projects/core/src/lib/controls/currency/currency.component.ts","../../../projects/core/src/lib/controls/datepicker/datepicker.component.ts","../../../projects/core/src/lib/controls/lookup/lookup.component.ts","../../../projects/core/src/lib/controls/number/number.component.ts","../../../projects/core/src/lib/controls/select/select.component.ts","../../../projects/core/src/lib/controls/text/text.component.ts","../../../projects/core/src/lib/controls/textarea/textarea.component.ts","../../../projects/core/src/lib/controls/timepicker/timepicker.component.ts","../../../projects/core/src/lib/type-guards.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 ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge, startWith } from 'rxjs';\n\ntype ControlValue<T> = T | null;\n\n@Directive()\nexport abstract class FormControlBase<TValue> implements ControlValueAccessor {\n static nextId = 0;\n\n readonly focusableElement = viewChild<\n ElementRef<HTMLElement> | { focus: () => void; blur: () => void }\n >('focusable');\n\n readonly id = input<string>(`nmf-form-control-${FormControlBase.nextId++}`);\n readonly label = input<string>('');\n readonly loading = input<boolean>(false);\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n readonly autocompleteAttr = input<string | null>(null);\n readonly _classList = input<string | string[]>('', { alias: 'classList' });\n\n readonly classList = computed(() => {\n const classList = this._classList();\n\n if (Array.isArray(classList)) {\n return classList.filter((className) => !!className.trim());\n }\n\n return classList.split(/\\s+/).filter((className) => className.length > 0);\n });\n\n readonly _disabledByInput = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n alias: 'disabledOverride',\n });\n readonly _disabledByCva = signal(false);\n\n readonly cdr = inject(ChangeDetectorRef);\n readonly destroyRef = inject(DestroyRef);\n readonly ngControl = inject(NgControl, {\n optional: true,\n });\n\n private _focused = signal(false);\n\n private _value: TValue | 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 protected onChange: (value: TValue | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n get value(): TValue | null {\n return this._value;\n }\n\n get control(): FormControl<ControlValue<TValue>> {\n return this.ngControl?.control as FormControl<ControlValue<TValue>>;\n }\n\n get focused(): boolean {\n return this._focused();\n }\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n ngOnInit() {\n const control = this.control;\n if (!control) return;\n\n merge(control.statusChanges, control.valueChanges)\n .pipe(startWith(null), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.onControlStateChange();\n });\n\n control.events\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (event instanceof TouchedChangeEvent) {\n this.onControlStateChange();\n }\n });\n }\n\n protected onControlStateChange(): void {\n const control = this.control;\n if (!control) {\n return;\n }\n\n this.hasErrors.set(control.invalid && control.touched);\n this.isRequired.set(control.hasValidator(Validators.required) ?? false);\n\n this.cdr.markForCheck();\n }\n\n writeValue(value: TValue | null): void {\n this._value = value;\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: (value: TValue | 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 focus(): void {\n const target = this.focusableElement();\n if (!target) return;\n\n // Type guard check for native ElementRef wrapper\n if (target instanceof ElementRef) {\n target.nativeElement.focus();\n }\n // Type guard check for a custom component instance with executable methods\n else if ('focus' in target && typeof target.focus === 'function') {\n target.focus();\n }\n }\n\n blur(): void {\n const target = this.focusableElement();\n if (!target) return;\n\n if (target instanceof ElementRef) {\n target.nativeElement.blur();\n } else if ('blur' in target && typeof target.blur === 'function') {\n target.blur();\n }\n }\n\n onFocusIn(): void {\n if (this.focused) {\n return;\n }\n this._focused.set(true);\n }\n\n onFocusOut(): void {\n //this.control?.markAsTouched();\n this._focused.set(false);\n this.onTouched();\n }\n\n protected errorMessage(): string | null {\n const control = this.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","export 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 type { FormControl, FormGroup } from '@angular/forms';\nimport { parseNumber } from './number-utils';\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","import type { FormControl, FormGroup } from '@angular/forms';\nimport type { Observable, Subscription } from 'rxjs';\nimport { getControl } from '../form-utils';\n\nexport abstract class FormHandlerBase<\n TControls extends Record<string, FormControl<unknown>>,\n> {\n private _form!: FormGroup;\n\n abstract getReactiveLogic(form: FormGroup): Subscription;\n\n public initializeForm(form: FormGroup): void {\n this._form = form;\n }\n\n public getControl<TKey extends keyof TControls>(key: TKey): TControls[TKey] {\n const control = getControl(String(key), this._form);\n\n if (!control) {\n throw new Error(`Control \"${String(key)}\" not found.`);\n }\n\n return control as TControls[TKey];\n }\n\n public valueChangesOf<TKey extends keyof TControls>(\n key: TKey,\n ): Observable<TControls[TKey]['value']> {\n return this.getControl(key).valueChanges;\n }\n}\n","export abstract class FormMapperBase<\n TIn = unknown,\n TOut = TIn,\n TForm = TIn,\n TOptions extends object = object,\n> {\n public fromModel(model: TIn): TForm {\n return structuredClone(model) as unknown as TForm;\n }\n\n public toRequest(formValue: TForm, _options?: TOptions): 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';\nimport {\n LookupBehaviorOptions,\n LookupOption,\n LookupStatus,\n} from '../../controls/lookup/lookup.types';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n take,\n catchError,\n EMPTY,\n Subject,\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n merge,\n of,\n startWith,\n switchMap,\n tap,\n Observable,\n} from 'rxjs';\n\nexport class LookupBehavior<TOption> {\n private readonly _status = signal<LookupStatus>('default');\n private readonly _options = signal<LookupOption<TOption>[]>([]);\n private readonly _selectedOption = signal<LookupOption<TOption> | null>(null);\n\n public readonly status = this._status.asReadonly();\n public readonly options = this._options.asReadonly();\n public readonly selectedOption = this._selectedOption.asReadonly();\n\n /*\n * Emits when the options have been updated. Ensures Material autocomplete updates its\n */\n public readonly optionsUpdated$ = new Subject<void>();\n\n public filteredOptions!: Observable<LookupOption<TOption>[]>;\n\n private bOptions!: LookupBehaviorOptions<TOption>;\n\n constructor(bOptions: LookupBehaviorOptions<TOption>) {\n this.bOptions = bOptions;\n }\n\n setSelectedOption(value: LookupOption<TOption> | null): void {\n this._selectedOption.set(value);\n }\n\n selectOption(event: Event | undefined, option: LookupOption<TOption>): void {\n event?.stopPropagation();\n\n const compare = this.bOptions.resolvers.compare() ?? undefined;\n\n const selected = this.options().find((o) =>\n compare ? compare(o.value, option.value) : o.value === option.value,\n );\n if (!selected) {\n return;\n }\n\n this.setSelectedOption(selected);\n }\n\n clearSelectedOption(): void {\n this.setSelectedOption(null);\n this.optionsUpdated$.next();\n }\n\n selectedMatchedOption(value: TOption | null): void {\n const { destroyRef, resolvers } = this.bOptions;\n\n const compare = resolvers.compare() ?? undefined;\n const label = resolvers.label() ?? undefined;\n const labelAsync = resolvers.labelAsync() ?? undefined;\n\n const match =\n this._options().find((o) =>\n compare ? compare(o.value, value as TOption) : o.value === value,\n ) ?? null;\n\n if (match) {\n this._selectedOption.set(match);\n return;\n }\n\n if (value === null) {\n this._selectedOption.set(null);\n return;\n }\n\n if (labelAsync) {\n this._status.set('loading');\n\n labelAsync(value)\n .pipe(\n take(1),\n catchError(() => {\n this._status.set('error');\n return EMPTY;\n }),\n takeUntilDestroyed(destroyRef),\n )\n .subscribe((label) => {\n this._selectedOption.set({\n value,\n label,\n });\n this._status.set('default');\n });\n return;\n }\n\n if (label) {\n this._selectedOption.set({\n value: value as TOption,\n label: label(value),\n });\n return;\n }\n }\n\n updateOptions(results: LookupOption<TOption>[], status?: LookupStatus): void {\n this._status.set(status ?? 'default');\n this._options.set(results);\n this.optionsUpdated$.next();\n }\n\n filterOptions(\n name: string,\n results: LookupOption<TOption>[],\n ): LookupOption<TOption>[] {\n const filterValue = name.toLowerCase();\n return results.filter(\n (option) =>\n option.label.toLowerCase().includes(filterValue) ||\n String(option.value).includes(filterValue),\n );\n }\n\n setupFilteredOptions(\n source: Observable<unknown>,\n searchQuery: unknown,\n ): void {\n this.filteredOptions = merge(source, this.optionsUpdated$).pipe(\n startWith(''),\n map(() => {\n const options = this.options();\n let value = searchQuery;\n\n if (typeof searchQuery === 'function') {\n value = searchQuery();\n }\n\n if (typeof value !== 'string') {\n return this.options().slice();\n }\n\n return value ? this.filterOptions(value, options) : options.slice();\n }),\n );\n }\n\n setupOptionsProvider(\n source: Observable<string | null>,\n debounceDelay: number,\n searchThreshold: number,\n ): void {\n const { destroyRef, resolvers } = this.bOptions;\n\n const search = resolvers.search() ?? undefined;\n\n if (!search) {\n return;\n }\n\n source.pipe(takeUntilDestroyed(destroyRef)).subscribe((value) => {\n if (!value || value.length < searchThreshold) {\n this.updateOptions([]);\n }\n });\n\n source\n .pipe(\n debounceTime(debounceDelay),\n distinctUntilChanged((a, b) => a === b),\n filter(() => this.selectedOption() == null),\n filter(\n (q): q is string =>\n typeof q === 'string' && q.length >= searchThreshold,\n ),\n tap(() => this.updateOptions([], 'loading')),\n switchMap((query) =>\n search(query).pipe(\n catchError(() => {\n this._status.set('error');\n return of(null);\n }),\n ),\n ),\n takeUntilDestroyed(destroyRef),\n )\n .subscribe((response) => {\n if (!response) {\n return;\n }\n const status = response.length ? 'default' : 'empty';\n this.updateOptions(response, status);\n });\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 input,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'nmf-form-field',\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 <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n @if (hint()) {\n <p class=\"nmf-hint\">\n {{ hint() }}\n </p>\n }\n\n <p class=\"nmf-hint\" [class.error]=\"hasErrors()\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class FormFieldComponent {\n label = input<string>();\n isRequired = input<boolean>();\n loading = input<boolean>();\n hint = input<string | null>();\n errorMessage = input<string | null>();\n\n hasErrors = computed(() => this.errorMessage() != null);\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/currency.behavior';\nimport { formatNumber, parseNumber } from '../../number-utils';\nimport { FormFieldComponent } from '../form-field/form-field.component';\n\n@Component({\n selector: 'nmf-currency',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\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 #focusable\n type=\"text\"\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 [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n </div>\n </nmf-form-field>\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 { FormFieldComponent } from '../form-field/form-field.component';\nimport { FormControlBase } from '../../base/form-control-base';\n\n@Component({\n selector: 'nmf-datepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <input\n #focusable\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 [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n </nmf-form-field>\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 computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n signal,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { AsyncPipe, CommonModule } from '@angular/common';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\nimport { FormControlBase } from '../../base/form-control-base';\nimport { LookupOption, LookupStatus } from './lookup.types';\nimport { FormFieldComponent } from '../form-field/form-field.component';\nimport { LookupBehavior } from '../../behavior/lookup/lookup.behavior';\n\n@Component({\n selector: 'nmf-lookup',\n exportAs: 'nmfLookup',\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent, AsyncPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [hint]=\"behavior.status() === 'empty' ? emptyOptionsLabel() : null\"\n [isRequired]=\"isRequired()\"\n [loading]=\"behavior.status() === 'loading' || loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <div class=\"nmf-input-wrapper\" [style.position]=\"'relative'\">\n @if ({ options: behavior.filteredOptions | async }; as stream) {\n <input\n #focusable\n type=\"text\"\n class=\"nmf-input\"\n [attr.list]=\"id + '-options'\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [style.cursor]=\"\n behavior.selectedOption() != null ? 'not-allowed' : 'text'\n \"\n [id]=\"id()\"\n [name]=\"name()\"\n [value]=\"displayLabel()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [readonly]=\"behavior.selectedOption() != null\"\n [placeholder]=\"placeholder()\"\n [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onFocusOut()\"\n (focus)=\"onFocusIn()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event, stream.options)\"\n />\n\n @if (isOpen() && stream.options && stream.options.length > 0) {\n <ul\n class=\"nmf-options-list\"\n [class.upward]=\"openUpwards()\"\n (pointerdown)=\"setOptionsInteraction(true)\"\n (pointerup)=\"setOptionsInteraction(false)\"\n >\n @for (option of stream.options; track option; let i = $index) {\n <li\n [class.selected]=\"behavior.selectedOption() == option\"\n [class.active]=\"activeIndex() === i\"\n (click)=\"selectOption($event, option)\"\n >\n {{\n displayWith() ? displayWith()!(option.value) : option.label\n }}\n </li>\n }\n </ul>\n }\n\n @if (behavior.selectedOption() && !disabled()) {\n <button\n class=\"nmf-clear-button\"\n type=\"button\"\n aria-label=\"Clear selection\"\n (click)=\"clearSelectedOption()\"\n >\n X\n </button>\n }\n }\n </div>\n </nmf-form-field>\n `,\n})\nexport class InputLookupComponent<TOption>\n extends FormControlBase<TOption>\n implements OnDestroy\n{\n override readonly autocompleteAttr = input<string | null>('off');\n\n /*\n * Static options to display in the dropdown. This is for synchronous sources.\n */\n optionsSource = input<LookupOption<TOption>[]>([]);\n\n /*\n * Must return a cancellable observable. This is for asynchronous sources (API calls, etc).\n */\n optionsProvider =\n input<(query: string | null) => Observable<LookupOption<TOption>[]>>();\n\n /*\n * When using a synchronous options source, or an asynchronous provider that returns an object where the shape is known,\n * this function is used to determine the display value.\n */\n displayWith = input<(value: TOption | null) => string>();\n\n /*\n * Used to determine the display value asynchronously when using primitive types for form values\n * eg: countryCode instead of Country itself.\n *\n * If not provided, the raw value will be used. Only needed for patching/hydrating the form.\n */\n displayProvider = input<(value: TOption | null) => Observable<string>>();\n\n /*\n * Used to compare options during selection if object equality is not sufficient.\n */\n compareWith = input<(a: TOption, b: TOption) => boolean>();\n\n /*\n * The provided hint will be displayed when asynchronous lookup is empty.\n */\n emptyOptionsLabel = input<string>('No results found');\n\n /*\n * Search will be debounced by this many milliseconds.\n */\n debounceTime = input<number>(500);\n\n /*\n * Search will not be triggered until the user has typed at least this many characters.\n */\n searchThreshold = input<number>(2);\n\n private readonly _activeIndex = signal(-1);\n\n public readonly activeIndex = this._activeIndex.asReadonly();\n\n private readonly _searchQuery = signal('');\n private readonly _isInteractingWithOptions = signal(false);\n\n private readonly _searchQuery$ = toObservable(this._searchQuery);\n\n readonly isOpen = signal(false);\n readonly openUpwards = signal(false);\n\n public readonly displayLabel = computed(() => {\n const selected = this.behavior.selectedOption();\n if (selected) {\n return selected.label;\n }\n return this._searchQuery();\n });\n\n inputElement = inject(ElementRef<HTMLInputElement>);\n\n behavior: LookupBehavior<TOption>;\n\n constructor() {\n super();\n\n this.behavior = new LookupBehavior<TOption>({\n destroyRef: this.destroyRef,\n resolvers: {\n compare: this.compareWith,\n label: this.displayWith,\n labelAsync: this.displayProvider,\n search: this.optionsProvider,\n },\n });\n\n effect(() => {\n const currentOptions = this.optionsSource() ?? [];\n this.updateOptions(currentOptions);\n });\n\n effect(() => {\n const selectedOption = this.behavior.selectedOption();\n this.onChange(selectedOption?.value ?? null);\n });\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n\n this.behavior.setupFilteredOptions(this._searchQuery$, this._searchQuery);\n this.behavior.setupOptionsProvider(this._searchQuery$, 500, 2);\n }\n\n override writeValue(value: TOption | null): void {\n super.writeValue(value);\n this.behavior.selectedMatchedOption(value);\n }\n\n override onFocusOut(): void {\n super.onFocusOut();\n\n if (this._isInteractingWithOptions()) {\n return;\n }\n\n this.isOpen.set(false);\n }\n\n override onFocusIn(): void {\n super.onFocusIn();\n if (!this.behavior.selectedOption()) {\n this.calculateDropdownPosition();\n this.isOpen.set(true);\n }\n }\n\n ngOnDestroy(): void {\n this.behavior.optionsUpdated$.complete();\n }\n\n onInput(event: Event): void {\n this._searchQuery.set((event.target as HTMLInputElement).value);\n }\n\n selectOption(event: Event, option: LookupOption<TOption>): void {\n this.behavior.selectOption(event, option);\n\n this._isInteractingWithOptions.set(false);\n this.isOpen.set(false);\n }\n\n resetActiveIndex(): void {\n this._activeIndex.set(-1);\n }\n\n setOptionsInteraction(state: boolean): void {\n this._isInteractingWithOptions.set(state);\n }\n\n updateOptions(results: LookupOption<TOption>[], status?: LookupStatus): void {\n this.behavior.updateOptions(results, status);\n this.resetActiveIndex();\n }\n\n clearSelectedOption(): void {\n this._searchQuery.set('');\n this.behavior.clearSelectedOption();\n this.focus();\n }\n\n onKeyDown(\n event: KeyboardEvent,\n currentOptions: LookupOption<TOption>[] | null,\n ): void {\n if (!this.isOpen() || !currentOptions || currentOptions.length === 0) {\n if (event.key === 'ArrowDown') {\n this.calculateDropdownPosition();\n this.isOpen.set(true);\n event.preventDefault();\n }\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this._activeIndex.update((prev) =>\n prev + 1 >= currentOptions.length ? 0 : prev + 1,\n );\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this._activeIndex.update((prev) =>\n prev - 1 < 0 ? currentOptions.length - 1 : prev - 1,\n );\n break;\n\n case 'Enter':\n event.preventDefault();\n if (\n this._activeIndex() >= 0 &&\n this._activeIndex() < currentOptions.length\n ) {\n this.selectOption(event, currentOptions[this._activeIndex()]);\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.isOpen.set(false);\n this.resetActiveIndex();\n break;\n\n case 'Backspace':\n case 'Delete':\n if (this.behavior.selectedOption() !== null) {\n event.preventDefault();\n this.clearSelectedOption();\n }\n break;\n }\n }\n\n private calculateDropdownPosition(): void {\n const rect = this.inputElement.nativeElement.getBoundingClientRect();\n\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n this.openUpwards.set(spaceBelow < 225 && spaceAbove > spaceBelow);\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 { FormFieldComponent } from '../form-field/form-field.component';\nimport { FormControlBase } from '../../base/form-control-base';\nimport { TextBehavior } from '../../behavior/text/text.behavior';\nimport { CurrencyBehavior } from '../../behavior/currency/currency.behavior';\nimport { parseNumber, formatNumber } from '../../number-utils';\n\n@Component({\n selector: 'nmf-number',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <input\n #focusable\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [type]=\"formatValue() ? 'text' : 'number'\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n </nmf-form-field>\n `,\n})\nexport class InputNumberComponent extends FormControlBase<\n string | number | null\n> {\n formatValue = 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.formatValue() && 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 { FormFieldComponent } from '../form-field/form-field.component';\nimport { FormControlBase } from '../../base/form-control-base';\n\nexport interface SelectOption {\n value: string | number;\n label: string | number;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'nmf-select',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <div class=\"select-wrapper\" [class.disabled]=\"disabled()\">\n <select\n #focusable\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [value]=\"value ?? ''\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (change)=\"handleChange($event)\"\n >\n <!-- Empty option -->\n <option [value]=\"''\" [disabled]=\"!allowEmptyOptionSelection()\">\n {{ emptyOptionLabel() }}\n </option>\n\n <!-- Options -->\n @for (option of options(); track option.value) {\n <option [value]=\"option.value\" [disabled]=\"option.disabled\">\n {{ option.label }}\n </option>\n }\n </select>\n </div>\n </nmf-form-field>\n `,\n})\nexport class InputSelectComponent extends FormControlBase<\n string | number | null\n> {\n options = input<SelectOption[]>([]);\n emptyOptionLabel = input<string>('Select an option');\n allowEmptyOptionSelection = input<boolean>(false);\n\n handleChange(event: Event): void {\n if (this._disabledByCva()) return;\n\n const input = event.target as HTMLSelectElement;\n this.onChange(input.value || null);\n }\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/text.behavior';\nimport { FormFieldComponent } from '../form-field/form-field.component';\n\n@Component({\n selector: 'nmf-text',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <div class=\"nmf-input-wrapper\">\n <input\n #focusable\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 [value]=\"value\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\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 </nmf-form-field>\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 onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLInputElement;\n this.onChange(input.value);\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';\nimport { FormFieldComponent } from '../form-field/form-field.component';\n\n@Component({\n selector: 'nmf-textarea',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <textarea\n #focusable\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 [value]=\"value\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n ></textarea>\n </nmf-form-field>\n `,\n})\nexport class InputTextareaComponent extends FormControlBase<string | null> {\n rows = input<number>(5);\n cols = input<number>(5);\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLTextAreaElement;\n this.onChange(input.value);\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 { FormFieldComponent } from '../form-field/form-field.component';\nimport { FormControlBase } from '../../base/form-control-base';\n\n@Component({\n selector: 'nmf-timepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nmf-form-field\n [label]=\"label()\"\n [isRequired]=\"isRequired()\"\n [loading]=\"loading()\"\n [errorMessage]=\"errorMessage()\"\n >\n <input\n #focusable\n type=\"time\"\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 [autocomplete]=\"autocompleteAttr()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n </nmf-form-field>\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","export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { Injectable } from '@angular/core';\nimport { FormArray, FormControl, FormGroup } from '@angular/forms';\nimport { isRecord } from './type-guards';\nimport type { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormHydrator {\n hydrate(\n form: FormGroup | FormArray,\n model: unknown,\n registry: MapperRegistry = {},\n ) {\n if (form instanceof FormArray) {\n this.hydrateFormArray(form, model, registry);\n return;\n }\n\n Object.entries(form.controls).forEach(([key, control]) => {\n if (!(key in (model as Record<string, unknown>))) {\n return;\n }\n\n const mapFn = registry[key]?.fromModel;\n const value = (model as Record<string, unknown>)[key];\n\n if (control instanceof FormArray) {\n this.hydrateFormArray(control, value, registry);\n return;\n }\n\n if (control instanceof FormGroup) {\n if (mapFn) {\n const mapped = mapFn(value);\n\n if (isRecord(mapped)) {\n control.patchValue(mapped, { emitEvent: false });\n }\n } else {\n this.hydrate(control, value ?? {}, registry);\n }\n return;\n }\n\n control.patchValue(value, { emitEvent: false });\n });\n }\n\n private hydrateFormArray(\n formArray: FormArray,\n model: unknown,\n registry: MapperRegistry,\n ) {\n const values = Array.isArray(model) ? model : [];\n\n if (values.length === 0) {\n formArray.clear();\n return;\n }\n\n if (formArray.length === 0) {\n formArray.push(this.createControlFromModel(values[0]));\n }\n\n while (formArray.length > values.length) {\n formArray.removeAt(formArray.length - 1);\n }\n\n while (formArray.length < values.length) {\n const template = formArray.at(formArray.length - 1) as\n | FormControl\n | FormGroup\n | FormArray;\n formArray.push(this.cloneControl(template));\n }\n\n values.forEach((item, index) => {\n const child = formArray.at(index);\n\n if (child instanceof FormGroup && isRecord(item)) {\n this.hydrate(child, item, registry);\n } else if (child instanceof FormArray && Array.isArray(item)) {\n this.hydrate(child, item, registry);\n } else {\n child.patchValue(item, { emitEvent: false });\n }\n });\n }\n\n private createControlFromModel(\n value: unknown,\n ): FormControl | FormGroup | FormArray {\n if (Array.isArray(value)) {\n return new FormArray(\n value.map((item) => this.createControlFromModel(item)),\n );\n }\n\n if (isRecord(value)) {\n return new FormGroup(\n Object.fromEntries(\n Object.keys(value).map((key) => [key, new FormControl(null)]),\n ),\n );\n }\n\n return new FormControl(null);\n }\n\n private cloneControl(\n control: FormControl | FormGroup | FormArray,\n ): FormControl | FormGroup | FormArray {\n if (control instanceof FormControl) {\n return new FormControl(null, control.validator, control.asyncValidator);\n }\n\n if (control instanceof FormGroup) {\n return new FormGroup(\n Object.fromEntries(\n Object.entries(control.controls).map(([key, child]) => [\n key,\n this.cloneControl(child as FormControl | FormGroup | FormArray),\n ]),\n ),\n {\n validators: control.validator,\n asyncValidators: control.asyncValidator,\n updateOn: control.updateOn,\n },\n );\n }\n\n return new FormArray(\n control.controls.map((child) =>\n this.cloneControl(child as FormControl | FormGroup | FormArray),\n ),\n {\n validators: control.validator,\n asyncValidators: control.asyncValidator,\n },\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FormArray, FormControl, FormGroup } from '@angular/forms';\nimport type { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormSerializer {\n toRequest<TOptions extends object = object>(\n form: FormGroup,\n registry?: MapperRegistry,\n options?: TOptions,\n ): Record<string, unknown>;\n\n toRequest<TOptions extends object = object>(\n form: FormArray,\n registry?: MapperRegistry,\n options?: TOptions,\n ): unknown[];\n\n toRequest<TOptions extends object = object>(\n form: FormGroup | FormArray,\n registry: MapperRegistry = {},\n options?: TOptions,\n ): Record<string, unknown> | unknown[] {\n if (form instanceof FormArray) {\n return form.controls.map((control) => {\n if (control instanceof FormControl) {\n return control.value;\n }\n\n if (control instanceof FormGroup) {\n return this.toRequest(control, registry, options);\n }\n\n if (control instanceof FormArray) {\n return this.toRequest(control, registry, options);\n }\n\n return null;\n });\n }\n\n const result: Record<string, unknown> = {};\n\n Object.entries(form.controls).forEach(([key, control]) => {\n const mapFn = registry[key]?.toRequest;\n\n if (control instanceof FormControl) {\n result[key] = control.value;\n return;\n }\n\n if (control instanceof FormGroup) {\n result[key] = mapFn\n ? mapFn(control.value, options)\n : this.toRequest(control, registry, options);\n return;\n }\n\n if (control instanceof FormArray) {\n result[key] = mapFn\n ? mapFn(control.value, options)\n : this.toRequest(control, registry, options);\n return;\n }\n });\n\n return result;\n }\n}\n","import { AbstractControl, FormControl, 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 type {\n FormHandlerRegistry,\n FormOrchestratorOptions,\n FormStatus,\n MapperRegistry,\n} from './types';\nimport { isRecord } from './type-guards';\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<T extends AbstractControl = AbstractControl>(\n key: string,\n ): T {\n return this.form().get(key) as T;\n }\n\n public addHandlerToRegistry<TControls extends Record<string, FormControl>>(\n handler: FormHandlerBase<TControls>,\n ) {\n this._handlerRegistry.set([...this._handlerRegistry(), handler]);\n this.addReactiveLogic(handler.getReactiveLogic(this.form()));\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<TModel extends object>(model: TModel) {\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 as Record<string, unknown>)[key];\n\n if (control instanceof FormControl) {\n const mapped = mapper ? mapper.fromModel(value) : value;\n control.setValue(mapped, { emitEvent: false });\n return;\n }\n\n if (control instanceof FormGroup) {\n const mapped = mapper ? mapper.fromModel(value) : value;\n if (isRecord(mapped)) {\n this.hydrator.hydrate(control, mapped, registry);\n }\n }\n });\n }\n\n public buildRequest<TOptions extends object>(\n options?: TOptions,\n ): Record<string, unknown> {\n return this.serializer.toRequest<TOptions>(\n this.form(),\n this.mapperRegistry(),\n options,\n );\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/currency.behavior';\nexport * from './lib/behavior/lookup/lookup.behavior';\nexport * from './lib/behavior/text/text.behavior';\n\nexport * from './lib/controls/currency/currency.component';\nexport * from './lib/controls/datepicker/datepicker.component';\nexport * from './lib/controls/lookup/lookup.component';\nexport * from './lib/controls/lookup/lookup.types';\nexport * from './lib/controls/number/number.component';\nexport * from './lib/controls/select/select.component';\nexport * from './lib/controls/text/text.component';\nexport * from './lib/controls/textarea/textarea.component';\nexport * from './lib/controls/timepicker/timepicker.component';\n\nexport * from './lib/form-hydrator';\nexport * from './lib/form-orchestrator';\nexport * from './lib/form-serializer';\nexport * from './lib/form-utils';\nexport * from './lib/number-utils';\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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"}
|
package/lib/form-hydrator.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { FormGroup } from '@angular/forms';
|
|
1
|
+
import { FormArray, FormGroup } from '@angular/forms';
|
|
2
2
|
import type { MapperRegistry } from './types';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class FormHydrator {
|
|
5
|
-
hydrate
|
|
5
|
+
hydrate(form: FormGroup | FormArray, model: unknown, registry?: MapperRegistry): void;
|
|
6
|
+
private hydrateFormArray;
|
|
7
|
+
private createControlFromModel;
|
|
8
|
+
private cloneControl;
|
|
6
9
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormHydrator, never>;
|
|
7
10
|
static ɵprov: i0.ɵɵInjectableDeclaration<FormHydrator>;
|
|
8
11
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FormControl, FormGroup } from '@angular/forms';
|
|
1
|
+
import { AbstractControl, FormControl, FormGroup } from '@angular/forms';
|
|
2
2
|
import { OnDestroy } from '@angular/core';
|
|
3
3
|
import { Subscription } from 'rxjs';
|
|
4
4
|
import { FormHandlerBase } from './base/form-handler-base';
|
|
@@ -28,7 +28,7 @@ export declare abstract class FormOrchestrator extends FormMapperBase implements
|
|
|
28
28
|
*/
|
|
29
29
|
orchestrate(options: FormOrchestratorOptions): void;
|
|
30
30
|
setForm(form: FormGroup): void;
|
|
31
|
-
getSubForm(key: string):
|
|
31
|
+
getSubForm<T extends AbstractControl = AbstractControl>(key: string): T;
|
|
32
32
|
addHandlerToRegistry<TControls extends Record<string, FormControl>>(handler: FormHandlerBase<TControls>): void;
|
|
33
33
|
addReactiveLogic(subscription: Subscription): void;
|
|
34
34
|
setStatus(status: FormStatus): void;
|
package/lib/form-serializer.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { FormGroup } from '@angular/forms';
|
|
1
|
+
import { FormArray, FormGroup } from '@angular/forms';
|
|
2
2
|
import type { MapperRegistry } from './types';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class FormSerializer {
|
|
5
5
|
toRequest<TOptions extends object = object>(form: FormGroup, registry?: MapperRegistry, options?: TOptions): Record<string, unknown>;
|
|
6
|
+
toRequest<TOptions extends object = object>(form: FormArray, registry?: MapperRegistry, options?: TOptions): unknown[];
|
|
6
7
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormSerializer, never>;
|
|
7
8
|
static ɵprov: i0.ɵɵInjectableDeclaration<FormSerializer>;
|
|
8
9
|
}
|
package/lib/types.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { FormControl, FormGroup } from '@angular/forms';
|
|
|
2
2
|
import type { FormMapperBase } from './base/form-mapper-base';
|
|
3
3
|
import type { FormHandlerBase } from './base/form-handler-base';
|
|
4
4
|
export type FormStatus = 'idle' | 'submitting' | 'error' | 'success';
|
|
5
|
-
export type MapperRegistry = Record<string, FormMapperBase<unknown
|
|
5
|
+
export type MapperRegistry = Record<string, FormMapperBase<unknown>>;
|
|
6
6
|
export type FormHandlerRegistry = FormHandlerBase<Record<string, FormControl<unknown>>>[];
|
|
7
7
|
export interface FormOrchestratorOptions {
|
|
8
8
|
form: FormGroup;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ng-modular-forms/core",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"description": "Composable Angular reactive form primitives, custom controls, and Material-compatible components for building enterprise-ready, complex typed forms.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|