@ng-modular-forms/core 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, ChangeDetectorRef,
|
|
2
|
+
import { inject, ChangeDetectorRef, input, HostBinding, Optional, Self, Directive, signal, computed } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/forms';
|
|
4
4
|
import { FormGroup, FormGroupDirective, Validators } from '@angular/forms';
|
|
5
5
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
@@ -14,12 +14,27 @@ class FormControlValueAccessor {
|
|
|
14
14
|
ngControl;
|
|
15
15
|
elementRef;
|
|
16
16
|
cdr = inject(ChangeDetectorRef);
|
|
17
|
-
name;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
formControlName;
|
|
17
|
+
_name = input('', { alias: 'name' });
|
|
18
|
+
_placeholder = input('', { alias: 'placeholder' });
|
|
19
|
+
_required = input(false, { alias: 'required' });
|
|
20
|
+
_disabled = input(false, { alias: 'disabled' });
|
|
21
|
+
_readonly = input(false, { alias: 'readonly' });
|
|
22
|
+
formControlName = input('');
|
|
23
|
+
get name() {
|
|
24
|
+
return this._name();
|
|
25
|
+
}
|
|
26
|
+
get placeholder() {
|
|
27
|
+
return this._placeholder();
|
|
28
|
+
}
|
|
29
|
+
get required() {
|
|
30
|
+
return this._required();
|
|
31
|
+
}
|
|
32
|
+
get disabled() {
|
|
33
|
+
return this._disabled();
|
|
34
|
+
}
|
|
35
|
+
get readonly() {
|
|
36
|
+
return this._readonly();
|
|
37
|
+
}
|
|
23
38
|
static nextId = 0;
|
|
24
39
|
id = `nmf-form-control-${FormControlValueAccessor.nextId++}`;
|
|
25
40
|
_value = null;
|
|
@@ -49,7 +64,7 @@ class FormControlValueAccessor {
|
|
|
49
64
|
this.onTouched = fn;
|
|
50
65
|
}
|
|
51
66
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: FormControlValueAccessor, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
52
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "
|
|
67
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.21", type: FormControlValueAccessor, isStandalone: true, inputs: { _name: { classPropertyName: "_name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, _placeholder: { classPropertyName: "_placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, _required: { classPropertyName: "_required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, _disabled: { classPropertyName: "_disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, _readonly: { classPropertyName: "_readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, formControlName: { classPropertyName: "formControlName", publicName: "formControlName", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "this.id" } }, ngImport: i0 });
|
|
53
68
|
}
|
|
54
69
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: FormControlValueAccessor, decorators: [{
|
|
55
70
|
type: Directive
|
|
@@ -57,26 +72,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
57
72
|
type: Optional
|
|
58
73
|
}, {
|
|
59
74
|
type: Self
|
|
60
|
-
}] }, { type: i0.ElementRef }], propDecorators: {
|
|
61
|
-
type: Input
|
|
62
|
-
}], placeholder: [{
|
|
63
|
-
type: Input
|
|
64
|
-
}], required: [{
|
|
65
|
-
type: Input
|
|
66
|
-
}], disabled: [{
|
|
67
|
-
type: Input
|
|
68
|
-
}], readonly: [{
|
|
69
|
-
type: Input
|
|
70
|
-
}], formControlName: [{
|
|
71
|
-
type: Input
|
|
72
|
-
}], id: [{
|
|
75
|
+
}] }, { type: i0.ElementRef }], propDecorators: { id: [{
|
|
73
76
|
type: HostBinding
|
|
74
77
|
}] } });
|
|
75
78
|
|
|
76
79
|
class FormControlBase extends FormControlValueAccessor {
|
|
77
|
-
label;
|
|
78
|
-
classList = [];
|
|
79
|
-
loading = false;
|
|
80
|
+
label = input('');
|
|
81
|
+
classList = input([]);
|
|
82
|
+
loading = input(false);
|
|
80
83
|
_form = signal(new FormGroup({}));
|
|
81
84
|
_controlName = signal('');
|
|
82
85
|
form = this._form.asReadonly();
|
|
@@ -87,7 +90,7 @@ class FormControlBase extends FormControlValueAccessor {
|
|
|
87
90
|
host: true,
|
|
88
91
|
});
|
|
89
92
|
ngOnInit() {
|
|
90
|
-
const controlName = this.formControlName ?? 'default';
|
|
93
|
+
const controlName = this.formControlName() ?? 'default';
|
|
91
94
|
const form = this.parentFormGroup?.form;
|
|
92
95
|
if (!form) {
|
|
93
96
|
throw new Error(`FormGroupDirective not found. Ensure component is used inside a form group`);
|
|
@@ -135,17 +138,11 @@ class FormControlBase extends FormControlValueAccessor {
|
|
|
135
138
|
}
|
|
136
139
|
}
|
|
137
140
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: FormControlBase, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
138
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "
|
|
141
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.21", type: FormControlBase, isStandalone: true, inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, classList: { classPropertyName: "classList", publicName: "classList", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0 });
|
|
139
142
|
}
|
|
140
143
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: FormControlBase, decorators: [{
|
|
141
144
|
type: Directive
|
|
142
|
-
}]
|
|
143
|
-
type: Input
|
|
144
|
-
}], classList: [{
|
|
145
|
-
type: Input
|
|
146
|
-
}], loading: [{
|
|
147
|
-
type: Input
|
|
148
|
-
}] } });
|
|
145
|
+
}] });
|
|
149
146
|
|
|
150
147
|
function getControl(controlName, form) {
|
|
151
148
|
if (!form) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-modular-forms-core.mjs","sources":["../../../projects/core/src/lib/form-control-value-assessor.ts","../../../projects/core/src/lib/form-control-base.ts","../../../projects/core/src/lib/form.util.ts","../../../projects/core/src/lib/form-handler-base.ts","../../../projects/core/src/lib/form-mapper-base.ts","../../../projects/core/src/lib/form-orchestrator-base.ts","../../../projects/core/src/public-api.ts","../../../projects/core/src/ng-modular-forms-core.ts"],"sourcesContent":["import {\r\n Directive,\r\n ElementRef,\r\n Input,\r\n HostBinding,\r\n Optional,\r\n Self,\r\n inject,\r\n ChangeDetectorRef,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\r\n\r\n/**\r\n * Base implementation for custom form controls that integrate with Angular Reactive Forms (ControlValueAccessor)\r\n *\r\n * NOTE: This class is UI-layer only and should not be used in form orchestration logic.\r\n */\r\n\r\n@Directive()\r\nexport abstract class FormControlValueAccessor<\r\n T,\r\n> implements ControlValueAccessor {\r\n protected readonly cdr = inject(ChangeDetectorRef);\r\n\r\n @Input() name!: string;\r\n @Input() placeholder: string = '';\r\n @Input() required = false;\r\n @Input() disabled = false;\r\n @Input() readonly = false;\r\n\r\n @Input() formControlName?: string;\r\n\r\n static nextId = 0;\r\n\r\n @HostBinding()\r\n id = `nmf-form-control-${FormControlValueAccessor.nextId++}`;\r\n\r\n _value: T | null = null;\r\n\r\n get value(): T | null {\r\n return this._value;\r\n }\r\n\r\n set value(val: T | null) {\r\n this._value = val;\r\n }\r\n\r\n onChange = (_value: T) => {};\r\n onTouched = () => {};\r\n\r\n constructor(\r\n @Optional() @Self() public ngControl: NgControl,\r\n protected elementRef: ElementRef<HTMLElement>,\r\n ) {\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n writeValue(value: T): void {\r\n this._value = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: T) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n}\r\n","import {\r\n FormControl,\r\n FormGroup,\r\n FormGroupDirective,\r\n Validators,\r\n} from '@angular/forms';\r\nimport {\r\n computed,\r\n Directive,\r\n inject,\r\n Input,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormControlValueAccessor } from './form-control-value-assessor';\r\n\r\n@Directive()\r\nexport abstract class FormControlBase<T>\r\n extends FormControlValueAccessor<T>\r\n implements OnInit\r\n{\r\n @Input() label!: string;\r\n\r\n @Input() classList: string[] = [];\r\n\r\n @Input() loading: boolean = false;\r\n\r\n protected _form = signal<FormGroup>(new FormGroup({}));\r\n protected _controlName = signal<string>('');\r\n\r\n readonly form = this._form.asReadonly();\r\n readonly controlName = this._controlName.asReadonly();\r\n\r\n readonly control = computed(\r\n () => this._form().get(this._controlName()) as FormControl,\r\n );\r\n\r\n private parentFormGroup = inject(FormGroupDirective, {\r\n optional: true,\r\n host: true,\r\n });\r\n\r\n ngOnInit() {\r\n const controlName = this.formControlName ?? 'default';\r\n const form = this.parentFormGroup?.form;\r\n\r\n if (!form) {\r\n throw new Error(\r\n `FormGroupDirective not found. Ensure component is used inside a form group`,\r\n );\r\n }\r\n\r\n this._form.set(form);\r\n this._controlName.set(controlName);\r\n\r\n const control = form.get(controlName);\r\n\r\n if (!control) {\r\n throw new Error(\r\n `FormControl '${controlName}' not found in parent FormGroup`,\r\n );\r\n }\r\n\r\n control.statusChanges\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(() => this.cdr.markForCheck());\r\n }\r\n\r\n protected isRequired(): boolean {\r\n const control = this._form()?.get(this._controlName());\r\n return !!control && control.hasValidator(Validators.required);\r\n }\r\n\r\n protected serverError = computed(\r\n () => this.form()?.errors?.['server'] as string | undefined,\r\n );\r\n\r\n protected getErrorMessage(): string {\r\n const control = this._form()?.get(this._controlName());\r\n\r\n if (!control || !control.errors || !control.touched) return '';\r\n\r\n const firstKey = Object.keys(control.errors)[0];\r\n const error = control.errors[firstKey];\r\n\r\n switch (firstKey) {\r\n case 'required':\r\n return 'This field is required';\r\n case 'minlength':\r\n return `Minimum length is ${error.requiredLength}`;\r\n case 'maxlength':\r\n return `Maximum length is ${error.requiredLength}`;\r\n case 'min':\r\n return `Minimum value is ${error.min}`;\r\n case 'max':\r\n return `Maximum value is ${error.max}`;\r\n case 'email':\r\n return 'Invalid email address';\r\n case 'pattern':\r\n return 'Invalid format';\r\n case 'server':\r\n return error;\r\n default:\r\n return 'Invalid value';\r\n }\r\n }\r\n}\r\n","import { FormControl, FormGroup } from '@angular/forms';\r\n\r\nexport function getControl<T = unknown>(controlName: string, form: FormGroup) {\r\n if (!form) {\r\n throw new Error(\r\n `Missing form instance while getting the control of \"${controlName}\"`,\r\n );\r\n }\r\n\r\n const control = form.get(controlName) as FormControl<T>;\r\n if (!control) {\r\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\r\n }\r\n\r\n return control;\r\n}\r\n\r\nexport function getControlValue<T = unknown>(\r\n controlName: string,\r\n form: FormGroup,\r\n): T | null;\r\n\r\nexport function getControlValue(\r\n controlName: string,\r\n form: FormGroup,\r\n): number | null;\r\n\r\nexport function getControlValue<T = unknown>(\r\n controlName: string,\r\n form: FormGroup,\r\n): T | null {\r\n const control = getControl<T>(controlName, form);\r\n if (!control) {\r\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\r\n }\r\n\r\n const value = control.getRawValue();\r\n if (value === '') {\r\n return null;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const cleaned = value.replace(/,/g, '');\r\n\r\n if (!Number.isNaN(Number(cleaned))) {\r\n return parseCurrency(value) as T;\r\n }\r\n }\r\n\r\n return value;\r\n}\r\n\r\nexport function parseCurrency(\r\n currencyString: string | number | null | undefined,\r\n): number {\r\n if (currencyString == null) {\r\n return 0;\r\n }\r\n\r\n if (typeof currencyString === 'number') {\r\n return currencyString;\r\n }\r\n\r\n return Number(currencyString.replace(/[^0-9.-]/g, ''));\r\n}\r\n","import { FormControl, FormGroup } from '@angular/forms';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { getControl } from './form.util';\r\n\r\nexport abstract class FormHandlerBase<ControlNames extends string = string> {\r\n abstract getReactiveLogic(form?: FormGroup): Subscription;\r\n\r\n protected registeredControls: Record<string, FormControl> = {};\r\n\r\n /**\r\n * Registers form controls for later reactive access.\r\n */\r\n registerControls(form: FormGroup, controlNames: ControlNames[]): void {\r\n controlNames.forEach((cn) => {\r\n const control = getControl(cn.replace(/_/g, '.'), form);\r\n\r\n if (!control) {\r\n throw new Error(\r\n `Failed to register control with name: \"${cn}\" in form group: \"${form}\"`,\r\n );\r\n }\r\n\r\n const key = cn as ControlNames;\r\n this.registeredControls[key] = control;\r\n });\r\n }\r\n\r\n valueChangesOf<T>(key: ControlNames): Observable<T> {\r\n if (!this.registeredControls[key]) {\r\n throw new Error(\r\n `Control with name: \"${key}\" not found. Ensure it is registered in registerControls(...)`,\r\n );\r\n }\r\n\r\n return this.registeredControls[key].valueChanges as Observable<T>;\r\n }\r\n}\r\n","import { FormGroup } from '@angular/forms';\r\n\r\nexport abstract class FormMapperBase<\r\n TModelIn = unknown,\r\n TModelOut = unknown,\r\n TFormModel = unknown,\r\n TStore = Record<string, unknown>,\r\n> {\r\n /**\r\n * Maps form state + external store into an API request payload.\r\n */\r\n abstract buildRequest(form: FormGroup, store: TStore): Partial<TModelOut>;\r\n\r\n /**\r\n * Transforms a domain/API model into a form-compatible structure.\r\n */\r\n abstract transformFromModel(model: TModelIn): TFormModel;\r\n\r\n patchForm(\r\n form: FormGroup,\r\n data: TFormModel,\r\n _context: TStore,\r\n emitEvent: boolean = false,\r\n ): void {\r\n form.patchValue(\r\n {\r\n ...(data as Record<string, unknown>),\r\n },\r\n { emitEvent },\r\n );\r\n }\r\n\r\n patchFromModel(form: FormGroup, model: TModelIn, store: TStore): void {\r\n const formModel = this.transformFromModel(model);\r\n this.patchForm(form, formModel, store);\r\n }\r\n}\r\n","import { FormGroup } from '@angular/forms';\r\nimport { Directive, OnDestroy, signal } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { FormHandlerBase } from './form-handler-base';\r\n\r\nexport type FormStatus = 'idle' | 'submitting' | 'error' | 'success';\r\n\r\ntype FormHandlerRegistry = Record<string, FormHandlerBase<string>>;\r\n\r\ninterface FormOrchestratorOptions {\r\n mainHandler?: FormHandlerBase<string> | null;\r\n subHandlers?: FormHandlerRegistry;\r\n}\r\n\r\n@Directive()\r\nexport abstract class FormOrchestratorBase implements OnDestroy {\r\n private _form = signal<FormGroup>(new FormGroup({}));\r\n\r\n private _mainHandler = signal<FormHandlerBase<string> | null>(null);\r\n private _subHandlers = signal<FormHandlerRegistry>({});\r\n\r\n private _status = signal<FormStatus>('idle');\r\n private _errorMessage = signal<string | null>(null);\r\n\r\n private _loadedHandlers = signal<number>(0);\r\n private _allHandlersLoaded = signal<boolean>(false);\r\n\r\n private _logicSubscription = new Subscription();\r\n\r\n public readonly form = this._form.asReadonly();\r\n public readonly mainHandler = this._mainHandler.asReadonly();\r\n public readonly subHandlers = this._subHandlers.asReadonly();\r\n public readonly status = this._status.asReadonly();\r\n public readonly errorMessage = this._errorMessage.asReadonly();\r\n\r\n /**\r\n * Initializes orchestration state.\r\n * Must be called before any subform registration or handler execution.\r\n */\r\n public initialize(\r\n form: FormGroup,\r\n formOrchestratorOptions?: FormOrchestratorOptions,\r\n ) {\r\n const { mainHandler, subHandlers = {} } = formOrchestratorOptions ?? {};\r\n\r\n this._form.set(form);\r\n this._mainHandler.set(mainHandler ?? null);\r\n this._subHandlers.set(subHandlers);\r\n this._loadedHandlers.set(0);\r\n\r\n const subHandlerCount = Object.keys(this.subHandlers());\r\n if (subHandlerCount.length === 0) {\r\n this.loadMainHandler();\r\n }\r\n }\r\n\r\n public setForm(form: FormGroup) {\r\n this._form.set(form);\r\n }\r\n\r\n public getHandler(key: string): FormHandlerBase<string> | undefined {\r\n return this.subHandlers()[key];\r\n }\r\n\r\n public setHandler(key: string, handler: FormHandlerBase<string>) {\r\n this._subHandlers.set({\r\n ...this._subHandlers(),\r\n [key]: handler,\r\n });\r\n }\r\n\r\n public addReactiveLogic(subscription: Subscription) {\r\n this._logicSubscription.add(subscription);\r\n }\r\n\r\n public setStatus(status: FormStatus) {\r\n this._status.set(status);\r\n }\r\n\r\n public setErrorMessage(message: string | null) {\r\n this._errorMessage.set(message);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._logicSubscription.unsubscribe();\r\n }\r\n\r\n /**\r\n * Registers a subform into the main form tree and coordinates handler execution.\r\n *\r\n * IMPORTANT:\r\n * - Handler execution is gated until all registered subhandlers are ready.\r\n * - Calling order matters; this is lifecycle-sensitive orchestration logic.\r\n */\r\n onSubformReady(\r\n subform: FormGroup,\r\n groupName: string,\r\n nestGroups: boolean = false,\r\n ): void {\r\n if (nestGroups) {\r\n this.form().setControl(groupName, subform);\r\n } else {\r\n const keys = Object.keys(subform.controls);\r\n keys.forEach((key) => {\r\n this.form().setControl(key, subform.get(key));\r\n });\r\n }\r\n\r\n // Prevent duplicate main handler execution when all subhandlers already resolved\r\n if (this._allHandlersLoaded()) {\r\n return;\r\n }\r\n\r\n const subformHandler = this.subHandlers()[groupName];\r\n\r\n if (subformHandler) {\r\n this._loadedHandlers.set(this._loadedHandlers() + 1);\r\n this.addReactiveLogic(subformHandler.getReactiveLogic());\r\n }\r\n\r\n const totalSubHandlers = Object.keys(this.subHandlers()).length;\r\n const allSubHandlersLoaded = this._loadedHandlers() === totalSubHandlers;\r\n\r\n if (allSubHandlersLoaded && this.mainHandler()) {\r\n this.loadMainHandler();\r\n }\r\n }\r\n\r\n private loadMainHandler() {\r\n if (!this.mainHandler()) return;\r\n\r\n this.addReactiveLogic(this.mainHandler()!.getReactiveLogic(this.form()));\r\n this._allHandlersLoaded.set(true);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of core\r\n */\r\n\r\nexport * from './lib/form-control-value-assessor';\r\nexport * from './lib/form-control-base';\r\nexport * from './lib/form-handler-base';\r\nexport * from './lib/form-mapper-base';\r\nexport * from './lib/form-orchestrator-base';\r\nexport * from './lib/form.util';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-modular-forms-core.mjs","sources":["../../../projects/core/src/lib/form-control-value-assessor.ts","../../../projects/core/src/lib/form-control-base.ts","../../../projects/core/src/lib/form.util.ts","../../../projects/core/src/lib/form-handler-base.ts","../../../projects/core/src/lib/form-mapper-base.ts","../../../projects/core/src/lib/form-orchestrator-base.ts","../../../projects/core/src/public-api.ts","../../../projects/core/src/ng-modular-forms-core.ts"],"sourcesContent":["import {\r\n Directive,\r\n ElementRef,\r\n HostBinding,\r\n Optional,\r\n Self,\r\n inject,\r\n ChangeDetectorRef,\r\n input,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\r\n\r\n/**\r\n * Base implementation for custom form controls that integrate with Angular Reactive Forms (ControlValueAccessor)\r\n *\r\n * NOTE: This class is UI-layer only and should not be used in form orchestration logic.\r\n */\r\n\r\n@Directive()\r\nexport abstract class FormControlValueAccessor<\r\n T,\r\n> implements ControlValueAccessor {\r\n protected readonly cdr = inject(ChangeDetectorRef);\r\n\r\n protected readonly _name = input<string>('', { alias: 'name' });\r\n protected readonly _placeholder = input<string>('', { alias: 'placeholder' });\r\n protected readonly _required = input<boolean>(false, { alias: 'required' });\r\n protected readonly _disabled = input<boolean>(false, { alias: 'disabled' });\r\n protected readonly _readonly = input<boolean>(false, { alias: 'readonly' });\r\n\r\n protected readonly formControlName = input<string>('');\r\n\r\n get name(): string {\r\n return this._name();\r\n }\r\n\r\n get placeholder(): string {\r\n return this._placeholder();\r\n }\r\n\r\n get required(): boolean {\r\n return this._required();\r\n }\r\n\r\n get disabled(): boolean {\r\n return this._disabled();\r\n }\r\n\r\n get readonly(): boolean {\r\n return this._readonly();\r\n }\r\n\r\n static nextId = 0;\r\n\r\n @HostBinding()\r\n id = `nmf-form-control-${FormControlValueAccessor.nextId++}`;\r\n\r\n _value: T | null = null;\r\n\r\n get value(): T | null {\r\n return this._value;\r\n }\r\n\r\n set value(val: T | null) {\r\n this._value = val;\r\n }\r\n\r\n onChange = (_value: T) => {};\r\n onTouched = () => {};\r\n\r\n constructor(\r\n @Optional() @Self() public ngControl: NgControl,\r\n protected elementRef: ElementRef<HTMLElement>,\r\n ) {\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n writeValue(value: T): void {\r\n this._value = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: T) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n}\r\n","import {\r\n FormControl,\r\n FormGroup,\r\n FormGroupDirective,\r\n Validators,\r\n} from '@angular/forms';\r\nimport {\r\n computed,\r\n Directive,\r\n inject,\r\n input,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormControlValueAccessor } from './form-control-value-assessor';\r\n\r\n@Directive()\r\nexport abstract class FormControlBase<T>\r\n extends FormControlValueAccessor<T>\r\n implements OnInit\r\n{\r\n label = input<string>('');\r\n classList = input<string[]>([]);\r\n loading = input<boolean>(false);\r\n\r\n protected _form = signal<FormGroup>(new FormGroup({}));\r\n protected _controlName = signal<string>('');\r\n\r\n readonly form = this._form.asReadonly();\r\n readonly controlName = this._controlName.asReadonly();\r\n\r\n readonly control = computed(\r\n () => this._form().get(this._controlName()) as FormControl,\r\n );\r\n\r\n private parentFormGroup = inject(FormGroupDirective, {\r\n optional: true,\r\n host: true,\r\n });\r\n\r\n ngOnInit() {\r\n const controlName = this.formControlName() ?? 'default';\r\n const form = this.parentFormGroup?.form;\r\n\r\n if (!form) {\r\n throw new Error(\r\n `FormGroupDirective not found. Ensure component is used inside a form group`,\r\n );\r\n }\r\n\r\n this._form.set(form);\r\n this._controlName.set(controlName);\r\n\r\n const control = form.get(controlName);\r\n\r\n if (!control) {\r\n throw new Error(\r\n `FormControl '${controlName}' not found in parent FormGroup`,\r\n );\r\n }\r\n\r\n control.statusChanges\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(() => this.cdr.markForCheck());\r\n }\r\n\r\n protected isRequired(): boolean {\r\n const control = this._form()?.get(this._controlName());\r\n return !!control && control.hasValidator(Validators.required);\r\n }\r\n\r\n protected serverError = computed(\r\n () => this.form()?.errors?.['server'] as string | undefined,\r\n );\r\n\r\n protected getErrorMessage(): string {\r\n const control = this._form()?.get(this._controlName());\r\n\r\n if (!control || !control.errors || !control.touched) return '';\r\n\r\n const firstKey = Object.keys(control.errors)[0];\r\n const error = control.errors[firstKey];\r\n\r\n switch (firstKey) {\r\n case 'required':\r\n return 'This field is required';\r\n case 'minlength':\r\n return `Minimum length is ${error.requiredLength}`;\r\n case 'maxlength':\r\n return `Maximum length is ${error.requiredLength}`;\r\n case 'min':\r\n return `Minimum value is ${error.min}`;\r\n case 'max':\r\n return `Maximum value is ${error.max}`;\r\n case 'email':\r\n return 'Invalid email address';\r\n case 'pattern':\r\n return 'Invalid format';\r\n case 'server':\r\n return error;\r\n default:\r\n return 'Invalid value';\r\n }\r\n }\r\n}\r\n","import { FormControl, FormGroup } from '@angular/forms';\r\n\r\nexport function getControl<T = unknown>(controlName: string, form: FormGroup) {\r\n if (!form) {\r\n throw new Error(\r\n `Missing form instance while getting the control of \"${controlName}\"`,\r\n );\r\n }\r\n\r\n const control = form.get(controlName) as FormControl<T>;\r\n if (!control) {\r\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\r\n }\r\n\r\n return control;\r\n}\r\n\r\nexport function getControlValue<T = unknown>(\r\n controlName: string,\r\n form: FormGroup,\r\n): T | null;\r\n\r\nexport function getControlValue(\r\n controlName: string,\r\n form: FormGroup,\r\n): number | null;\r\n\r\nexport function getControlValue<T = unknown>(\r\n controlName: string,\r\n form: FormGroup,\r\n): T | null {\r\n const control = getControl<T>(controlName, form);\r\n if (!control) {\r\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\r\n }\r\n\r\n const value = control.getRawValue();\r\n if (value === '') {\r\n return null;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const cleaned = value.replace(/,/g, '');\r\n\r\n if (!Number.isNaN(Number(cleaned))) {\r\n return parseCurrency(value) as T;\r\n }\r\n }\r\n\r\n return value;\r\n}\r\n\r\nexport function parseCurrency(\r\n currencyString: string | number | null | undefined,\r\n): number {\r\n if (currencyString == null) {\r\n return 0;\r\n }\r\n\r\n if (typeof currencyString === 'number') {\r\n return currencyString;\r\n }\r\n\r\n return Number(currencyString.replace(/[^0-9.-]/g, ''));\r\n}\r\n","import { FormControl, FormGroup } from '@angular/forms';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { getControl } from './form.util';\r\n\r\nexport abstract class FormHandlerBase<ControlNames extends string = string> {\r\n abstract getReactiveLogic(form?: FormGroup): Subscription;\r\n\r\n protected registeredControls: Record<string, FormControl> = {};\r\n\r\n /**\r\n * Registers form controls for later reactive access.\r\n */\r\n registerControls(form: FormGroup, controlNames: ControlNames[]): void {\r\n controlNames.forEach((cn) => {\r\n const control = getControl(cn.replace(/_/g, '.'), form);\r\n\r\n if (!control) {\r\n throw new Error(\r\n `Failed to register control with name: \"${cn}\" in form group: \"${form}\"`,\r\n );\r\n }\r\n\r\n const key = cn as ControlNames;\r\n this.registeredControls[key] = control;\r\n });\r\n }\r\n\r\n valueChangesOf<T>(key: ControlNames): Observable<T> {\r\n if (!this.registeredControls[key]) {\r\n throw new Error(\r\n `Control with name: \"${key}\" not found. Ensure it is registered in registerControls(...)`,\r\n );\r\n }\r\n\r\n return this.registeredControls[key].valueChanges as Observable<T>;\r\n }\r\n}\r\n","import { FormGroup } from '@angular/forms';\r\n\r\nexport abstract class FormMapperBase<\r\n TModelIn = unknown,\r\n TModelOut = unknown,\r\n TFormModel = unknown,\r\n TStore = Record<string, unknown>,\r\n> {\r\n /**\r\n * Maps form state + external store into an API request payload.\r\n */\r\n abstract buildRequest(form: FormGroup, store: TStore): Partial<TModelOut>;\r\n\r\n /**\r\n * Transforms a domain/API model into a form-compatible structure.\r\n */\r\n abstract transformFromModel(model: TModelIn): TFormModel;\r\n\r\n patchForm(\r\n form: FormGroup,\r\n data: TFormModel,\r\n _context: TStore,\r\n emitEvent: boolean = false,\r\n ): void {\r\n form.patchValue(\r\n {\r\n ...(data as Record<string, unknown>),\r\n },\r\n { emitEvent },\r\n );\r\n }\r\n\r\n patchFromModel(form: FormGroup, model: TModelIn, store: TStore): void {\r\n const formModel = this.transformFromModel(model);\r\n this.patchForm(form, formModel, store);\r\n }\r\n}\r\n","import { FormGroup } from '@angular/forms';\r\nimport { Directive, OnDestroy, signal } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { FormHandlerBase } from './form-handler-base';\r\n\r\nexport type FormStatus = 'idle' | 'submitting' | 'error' | 'success';\r\n\r\ntype FormHandlerRegistry = Record<string, FormHandlerBase<string>>;\r\n\r\ninterface FormOrchestratorOptions {\r\n mainHandler?: FormHandlerBase<string> | null;\r\n subHandlers?: FormHandlerRegistry;\r\n}\r\n\r\n@Directive()\r\nexport abstract class FormOrchestratorBase implements OnDestroy {\r\n private _form = signal<FormGroup>(new FormGroup({}));\r\n\r\n private _mainHandler = signal<FormHandlerBase<string> | null>(null);\r\n private _subHandlers = signal<FormHandlerRegistry>({});\r\n\r\n private _status = signal<FormStatus>('idle');\r\n private _errorMessage = signal<string | null>(null);\r\n\r\n private _loadedHandlers = signal<number>(0);\r\n private _allHandlersLoaded = signal<boolean>(false);\r\n\r\n private _logicSubscription = new Subscription();\r\n\r\n public readonly form = this._form.asReadonly();\r\n public readonly mainHandler = this._mainHandler.asReadonly();\r\n public readonly subHandlers = this._subHandlers.asReadonly();\r\n public readonly status = this._status.asReadonly();\r\n public readonly errorMessage = this._errorMessage.asReadonly();\r\n\r\n /**\r\n * Initializes orchestration state.\r\n * Must be called before any subform registration or handler execution.\r\n */\r\n public initialize(\r\n form: FormGroup,\r\n formOrchestratorOptions?: FormOrchestratorOptions,\r\n ) {\r\n const { mainHandler, subHandlers = {} } = formOrchestratorOptions ?? {};\r\n\r\n this._form.set(form);\r\n this._mainHandler.set(mainHandler ?? null);\r\n this._subHandlers.set(subHandlers);\r\n this._loadedHandlers.set(0);\r\n\r\n const subHandlerCount = Object.keys(this.subHandlers());\r\n if (subHandlerCount.length === 0) {\r\n this.loadMainHandler();\r\n }\r\n }\r\n\r\n public setForm(form: FormGroup) {\r\n this._form.set(form);\r\n }\r\n\r\n public getHandler(key: string): FormHandlerBase<string> | undefined {\r\n return this.subHandlers()[key];\r\n }\r\n\r\n public setHandler(key: string, handler: FormHandlerBase<string>) {\r\n this._subHandlers.set({\r\n ...this._subHandlers(),\r\n [key]: handler,\r\n });\r\n }\r\n\r\n public addReactiveLogic(subscription: Subscription) {\r\n this._logicSubscription.add(subscription);\r\n }\r\n\r\n public setStatus(status: FormStatus) {\r\n this._status.set(status);\r\n }\r\n\r\n public setErrorMessage(message: string | null) {\r\n this._errorMessage.set(message);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._logicSubscription.unsubscribe();\r\n }\r\n\r\n /**\r\n * Registers a subform into the main form tree and coordinates handler execution.\r\n *\r\n * IMPORTANT:\r\n * - Handler execution is gated until all registered subhandlers are ready.\r\n * - Calling order matters; this is lifecycle-sensitive orchestration logic.\r\n */\r\n onSubformReady(\r\n subform: FormGroup,\r\n groupName: string,\r\n nestGroups: boolean = false,\r\n ): void {\r\n if (nestGroups) {\r\n this.form().setControl(groupName, subform);\r\n } else {\r\n const keys = Object.keys(subform.controls);\r\n keys.forEach((key) => {\r\n this.form().setControl(key, subform.get(key));\r\n });\r\n }\r\n\r\n // Prevent duplicate main handler execution when all subhandlers already resolved\r\n if (this._allHandlersLoaded()) {\r\n return;\r\n }\r\n\r\n const subformHandler = this.subHandlers()[groupName];\r\n\r\n if (subformHandler) {\r\n this._loadedHandlers.set(this._loadedHandlers() + 1);\r\n this.addReactiveLogic(subformHandler.getReactiveLogic());\r\n }\r\n\r\n const totalSubHandlers = Object.keys(this.subHandlers()).length;\r\n const allSubHandlersLoaded = this._loadedHandlers() === totalSubHandlers;\r\n\r\n if (allSubHandlersLoaded && this.mainHandler()) {\r\n this.loadMainHandler();\r\n }\r\n }\r\n\r\n private loadMainHandler() {\r\n if (!this.mainHandler()) return;\r\n\r\n this.addReactiveLogic(this.mainHandler()!.getReactiveLogic(this.form()));\r\n this._allHandlersLoaded.set(true);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of core\r\n */\r\n\r\nexport * from './lib/form-control-value-assessor';\r\nexport * from './lib/form-control-base';\r\nexport * from './lib/form-handler-base';\r\nexport * from './lib/form-mapper-base';\r\nexport * from './lib/form-orchestrator-base';\r\nexport * from './lib/form.util';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,9 @@ import { OnInit } from '@angular/core';
|
|
|
3
3
|
import { FormControlValueAccessor } from './form-control-value-assessor';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare abstract class FormControlBase<T> extends FormControlValueAccessor<T> implements OnInit {
|
|
6
|
-
label: string
|
|
7
|
-
classList: string[]
|
|
8
|
-
loading: boolean
|
|
6
|
+
label: import("@angular/core").InputSignal<string>;
|
|
7
|
+
classList: import("@angular/core").InputSignal<string[]>;
|
|
8
|
+
loading: import("@angular/core").InputSignal<boolean>;
|
|
9
9
|
protected _form: import("@angular/core").WritableSignal<FormGroup<any>>;
|
|
10
10
|
protected _controlName: import("@angular/core").WritableSignal<string>;
|
|
11
11
|
readonly form: import("@angular/core").Signal<FormGroup<any>>;
|
|
@@ -17,5 +17,5 @@ export declare abstract class FormControlBase<T> extends FormControlValueAccesso
|
|
|
17
17
|
protected serverError: import("@angular/core").Signal<string | undefined>;
|
|
18
18
|
protected getErrorMessage(): string;
|
|
19
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormControlBase<any>, never>;
|
|
20
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlBase<any>, never, never, { "label": { "alias": "label"; "required": false; }; "classList": { "alias": "classList"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; }, {}, never, never, true, never>;
|
|
20
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlBase<any>, never, never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "classList": { "alias": "classList"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
21
21
|
}
|
|
@@ -10,12 +10,17 @@ export declare abstract class FormControlValueAccessor<T> implements ControlValu
|
|
|
10
10
|
ngControl: NgControl;
|
|
11
11
|
protected elementRef: ElementRef<HTMLElement>;
|
|
12
12
|
protected readonly cdr: ChangeDetectorRef;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
readonly: boolean
|
|
18
|
-
formControlName
|
|
13
|
+
protected readonly _name: import("@angular/core").InputSignal<string>;
|
|
14
|
+
protected readonly _placeholder: import("@angular/core").InputSignal<string>;
|
|
15
|
+
protected readonly _required: import("@angular/core").InputSignal<boolean>;
|
|
16
|
+
protected readonly _disabled: import("@angular/core").InputSignal<boolean>;
|
|
17
|
+
protected readonly _readonly: import("@angular/core").InputSignal<boolean>;
|
|
18
|
+
protected readonly formControlName: import("@angular/core").InputSignal<string>;
|
|
19
|
+
get name(): string;
|
|
20
|
+
get placeholder(): string;
|
|
21
|
+
get required(): boolean;
|
|
22
|
+
get disabled(): boolean;
|
|
23
|
+
get readonly(): boolean;
|
|
19
24
|
static nextId: number;
|
|
20
25
|
id: string;
|
|
21
26
|
_value: T | null;
|
|
@@ -28,5 +33,5 @@ export declare abstract class FormControlValueAccessor<T> implements ControlValu
|
|
|
28
33
|
registerOnChange(fn: (value: T) => void): void;
|
|
29
34
|
registerOnTouched(fn: () => void): void;
|
|
30
35
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormControlValueAccessor<any>, [{ optional: true; self: true; }, null]>;
|
|
31
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlValueAccessor<any>, never, never, { "
|
|
36
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlValueAccessor<any>, never, never, { "_name": { "alias": "name"; "required": false; "isSignal": true; }; "_placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "_required": { "alias": "required"; "required": false; "isSignal": true; }; "_disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "_readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "formControlName": { "alias": "formControlName"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
32
37
|
}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ng-modular-forms/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@angular/core": ">=
|
|
6
|
-
"@angular/common": ">=
|
|
7
|
-
"@angular/forms": ">=
|
|
8
|
-
"rxjs": ">=7
|
|
5
|
+
"@angular/core": ">=19.0.0 <22.0.0",
|
|
6
|
+
"@angular/common": ">=19.0.0 <22.0.0",
|
|
7
|
+
"@angular/forms": ">=19.0.0 <22.0.0",
|
|
8
|
+
"rxjs": ">=7 <8"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"tslib": "^2.6.0"
|