ngx-form-signal 1.18.1 → 2.18.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/esm2022/lib/deep-form-signal.mjs +41 -0
- package/esm2022/lib/form-signal.mjs +22 -22
- package/esm2022/lib/helpers/form-controls-signal.mjs +109 -0
- package/esm2022/lib/helpers/form-dirty-signal.mjs +24 -25
- package/esm2022/lib/helpers/form-error-signal.mjs +25 -9
- package/esm2022/lib/helpers/form-snapshot-signal.mjs +1 -7
- package/esm2022/lib/helpers/form-status-signal.mjs +37 -26
- package/esm2022/lib/helpers/form-touched-signal.mjs +23 -26
- package/esm2022/lib/helpers/form-value-signal.mjs +28 -23
- package/esm2022/lib/helpers/handle-stream-signal.mjs +18 -0
- package/esm2022/lib/types/deep-form-signal-type.mjs +2 -0
- package/esm2022/lib/types/form-signal-options.mjs +2 -3
- package/esm2022/lib/types/form-signal-type.mjs +2 -2
- package/esm2022/public-api.mjs +3 -2
- package/fesm2022/ngx-form-signal.mjs +300 -129
- package/fesm2022/ngx-form-signal.mjs.map +1 -1
- package/lib/deep-form-signal.d.ts +10 -0
- package/lib/form-signal.d.ts +6 -4
- package/lib/helpers/form-controls-signal.d.ts +7 -0
- package/lib/helpers/form-dirty-signal.d.ts +3 -5
- package/lib/helpers/form-error-signal.d.ts +3 -4
- package/lib/helpers/form-snapshot-signal.d.ts +2 -1
- package/lib/helpers/form-status-signal.d.ts +2 -5
- package/lib/helpers/form-touched-signal.d.ts +3 -5
- package/lib/helpers/form-value-signal.d.ts +4 -6
- package/lib/helpers/handle-stream-signal.d.ts +8 -0
- package/lib/types/deep-form-signal-type.d.ts +16 -0
- package/lib/types/form-signal-options.d.ts +11 -14
- package/lib/types/form-signal-type.d.ts +14 -21
- package/package.json +7 -5
- package/public-api.d.ts +2 -1
- package/esm2022/lib/types/form-type.mjs +0 -2
- package/lib/types/form-type.d.ts +0 -7
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { assertInInjectionContext, inject, Injector, isSignal, signal, untracked } from '@angular/core';
|
|
2
|
+
import { formSignal } from './form-signal';
|
|
3
|
+
import { buildFormControlsSignal } from './helpers/form-controls-signal';
|
|
4
|
+
import { buildDefaultFormSignalOptions } from './types/form-signal-options';
|
|
5
|
+
/**
|
|
6
|
+
* Takes a reactive form control and subscribes to various events to pull out
|
|
7
|
+
* form states and store them into signals.
|
|
8
|
+
*
|
|
9
|
+
* Creates a formSignal for each nested control inside children groups and arrays.
|
|
10
|
+
* These are made accessible over an additional `controls` property.
|
|
11
|
+
*/
|
|
12
|
+
export function deepFormSignal(form, options = buildDefaultFormSignalOptions()) {
|
|
13
|
+
if (!options.injector) {
|
|
14
|
+
assertInInjectionContext(() => { });
|
|
15
|
+
options.injector = inject(Injector);
|
|
16
|
+
}
|
|
17
|
+
const formAsSignal = (isSignal(form) ? form : signal(form).asReadonly());
|
|
18
|
+
const root = formSignal(formAsSignal, options);
|
|
19
|
+
const controls$ = buildFormControlsSignal(formAsSignal, options);
|
|
20
|
+
const controlProxy = new Proxy(controls$, {
|
|
21
|
+
get(_target, prop, receiver) {
|
|
22
|
+
const snapshot = untracked(() => _target());
|
|
23
|
+
if (!snapshot)
|
|
24
|
+
return null;
|
|
25
|
+
if (Array.isArray(snapshot))
|
|
26
|
+
return snapshot[prop];
|
|
27
|
+
return snapshot?.[prop];
|
|
28
|
+
},
|
|
29
|
+
apply(_target, _thisArg, _args) {
|
|
30
|
+
return _target() ?? null;
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
Object.defineProperty(root, 'controls', {
|
|
34
|
+
get: () => {
|
|
35
|
+
const snapshot = untracked(() => controls$());
|
|
36
|
+
return snapshot ? controlProxy : null;
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
return root;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcC1mb3JtLXNpZ25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtLXNpZ25hbC9zcmMvbGliL2RlZXAtZm9ybS1zaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsNkJBQTZCLEVBQXNDLE1BQU0sNkJBQTZCLENBQUM7QUFFaEg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDM0IsSUFBTyxFQUNQLFVBQTZCLDZCQUE2QixFQUFFO0lBRTVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckIsd0JBQXdCLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkMsT0FBTyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBbUMsQ0FBQztJQUUzRyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRS9DLE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRSxNQUFNLFlBQVksR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUU7UUFDdkMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUTtZQUN4QixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUUzQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUFFLE9BQU8sUUFBUSxDQUFDLElBQXlCLENBQUMsQ0FBQztZQUN4RSxPQUFPLFFBQVEsRUFBRSxDQUFDLElBQWMsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLO1lBQzNCLE9BQU8sT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDO1FBQzVCLENBQUM7S0FDSCxDQUFDLENBQUM7SUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7UUFDckMsR0FBRyxFQUFFLEdBQUcsRUFBRTtZQUNQLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6QyxDQUFDO0tBQ0gsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUF5QixDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQsIGluamVjdCwgSW5qZWN0b3IsIGlzU2lnbmFsLCBTaWduYWwsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZm9ybVNpZ25hbCB9IGZyb20gJy4vZm9ybS1zaWduYWwnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1Db250cm9sc1NpZ25hbCB9IGZyb20gJy4vaGVscGVycy9mb3JtLWNvbnRyb2xzLXNpZ25hbCc7XHJcbmltcG9ydCB7IERlZXBGb3JtU2lnbmFsIH0gZnJvbSAnLi90eXBlcy9kZWVwLWZvcm0tc2lnbmFsLXR5cGUnO1xyXG5pbXBvcnQgeyBidWlsZERlZmF1bHRGb3JtU2lnbmFsT3B0aW9ucywgRm9ybVNpZ25hbElucHV0LCBGb3JtU2lnbmFsT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMvZm9ybS1zaWduYWwtb3B0aW9ucyc7XHJcblxyXG4vKipcclxuICogVGFrZXMgYSByZWFjdGl2ZSBmb3JtIGNvbnRyb2wgYW5kIHN1YnNjcmliZXMgdG8gdmFyaW91cyBldmVudHMgdG8gcHVsbCBvdXRcclxuICogZm9ybSBzdGF0ZXMgYW5kIHN0b3JlIHRoZW0gaW50byBzaWduYWxzLlxyXG4gKlxyXG4gKiBDcmVhdGVzIGEgZm9ybVNpZ25hbCBmb3IgZWFjaCBuZXN0ZWQgY29udHJvbCBpbnNpZGUgY2hpbGRyZW4gZ3JvdXBzIGFuZCBhcnJheXMuXHJcbiAqIFRoZXNlIGFyZSBtYWRlIGFjY2Vzc2libGUgb3ZlciBhbiBhZGRpdGlvbmFsIGBjb250cm9sc2AgcHJvcGVydHkuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVlcEZvcm1TaWduYWw8VCBleHRlbmRzIEZvcm1TaWduYWxJbnB1dD4oXHJcbiAgIGZvcm06IFQsXHJcbiAgIG9wdGlvbnM6IEZvcm1TaWduYWxPcHRpb25zID0gYnVpbGREZWZhdWx0Rm9ybVNpZ25hbE9wdGlvbnMoKVxyXG4pOiBEZWVwRm9ybVNpZ25hbDxUPiB7XHJcbiAgIGlmICghb3B0aW9ucy5pbmplY3Rvcikge1xyXG4gICAgICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQoKCkgPT4ge30pO1xyXG4gICAgICBvcHRpb25zLmluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcclxuICAgfVxyXG5cclxuICAgY29uc3QgZm9ybUFzU2lnbmFsID0gKGlzU2lnbmFsKGZvcm0pID8gZm9ybSA6IHNpZ25hbChmb3JtKS5hc1JlYWRvbmx5KCkpIGFzIFNpZ25hbDxBYnN0cmFjdENvbnRyb2wgfCBudWxsPjtcclxuXHJcbiAgIGNvbnN0IHJvb3QgPSBmb3JtU2lnbmFsKGZvcm1Bc1NpZ25hbCwgb3B0aW9ucyk7XHJcblxyXG4gICBjb25zdCBjb250cm9scyQgPSBidWlsZEZvcm1Db250cm9sc1NpZ25hbChmb3JtQXNTaWduYWwsIG9wdGlvbnMpO1xyXG4gICBjb25zdCBjb250cm9sUHJveHkgPSBuZXcgUHJveHkoY29udHJvbHMkLCB7XHJcbiAgICAgIGdldChfdGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xyXG4gICAgICAgICBjb25zdCBzbmFwc2hvdCA9IHVudHJhY2tlZCgoKSA9PiBfdGFyZ2V0KCkpO1xyXG4gICAgICAgICBpZiAoIXNuYXBzaG90KSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNuYXBzaG90KSkgcmV0dXJuIHNuYXBzaG90W3Byb3AgYXMgdW5rbm93biBhcyBudW1iZXJdO1xyXG4gICAgICAgICByZXR1cm4gc25hcHNob3Q/Lltwcm9wIGFzIHN0cmluZ107XHJcbiAgICAgIH0sXHJcbiAgICAgIGFwcGx5KF90YXJnZXQsIF90aGlzQXJnLCBfYXJncykge1xyXG4gICAgICAgICByZXR1cm4gX3RhcmdldCgpID8/IG51bGw7XHJcbiAgICAgIH0sXHJcbiAgIH0pO1xyXG5cclxuICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3QsICdjb250cm9scycsIHtcclxuICAgICAgZ2V0OiAoKSA9PiB7XHJcbiAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdW50cmFja2VkKCgpID0+IGNvbnRyb2xzJCgpKTtcclxuICAgICAgICAgcmV0dXJuIHNuYXBzaG90ID8gY29udHJvbFByb3h5IDogbnVsbDtcclxuICAgICAgfSxcclxuICAgfSk7XHJcblxyXG4gICByZXR1cm4gcm9vdCBhcyBEZWVwRm9ybVNpZ25hbDxUPjtcclxufVxyXG4iXX0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { assertInInjectionContext, isSignal, signal
|
|
1
|
+
import { assertInInjectionContext, inject, Injector, isSignal, signal } from '@angular/core';
|
|
2
2
|
import { buildFormDirtySignal } from './helpers/form-dirty-signal';
|
|
3
3
|
import { buildFormErrorSignal } from './helpers/form-error-signal';
|
|
4
4
|
import { buildFormSnapshotSignal } from './helpers/form-snapshot-signal';
|
|
@@ -6,23 +6,29 @@ import { buildFormStatusSignal } from './helpers/form-status-signal';
|
|
|
6
6
|
import { buildFormTouchedSignal } from './helpers/form-touched-signal';
|
|
7
7
|
import { buildFormValueSignal } from './helpers/form-value-signal';
|
|
8
8
|
import { buildDefaultFormSignalOptions, } from './types/form-signal-options';
|
|
9
|
+
import { FORM_SIGNAL_FORM_TOKEN } from './types/form-signal-type';
|
|
10
|
+
/**
|
|
11
|
+
* Takes a reactive form control and subscribes to various events to pull out
|
|
12
|
+
* form states and store them into signals.
|
|
13
|
+
*/
|
|
9
14
|
export function formSignal(form, options = buildDefaultFormSignalOptions()) {
|
|
10
|
-
const formAsSignal = isSignal(form) ? form : signal(form);
|
|
11
15
|
if (!options.injector) {
|
|
12
16
|
assertInInjectionContext(() => { });
|
|
17
|
+
options.injector = inject(Injector);
|
|
13
18
|
}
|
|
14
|
-
const
|
|
15
|
-
const {
|
|
16
|
-
const {
|
|
17
|
-
const {
|
|
18
|
-
const
|
|
19
|
+
const formAsSignal = (isSignal(form) ? form : signal(form).asReadonly());
|
|
20
|
+
const { value$, rawValue$ } = buildFormValueSignal(formAsSignal, options);
|
|
21
|
+
const { status$, valid$, invalid$, pending$, disabled$, enabled$ } = buildFormStatusSignal(formAsSignal, options);
|
|
22
|
+
const { touched$, untouched$ } = buildFormTouchedSignal(formAsSignal, options);
|
|
23
|
+
const { dirty$, pristine$ } = buildFormDirtySignal(formAsSignal, options);
|
|
24
|
+
const errors$ = buildFormErrorSignal(formAsSignal, options);
|
|
19
25
|
const formSignals = {
|
|
20
|
-
status: status
|
|
21
|
-
value: value
|
|
22
|
-
rawValue: rawValue
|
|
23
|
-
touched: touched
|
|
26
|
+
status: status$,
|
|
27
|
+
value: value$,
|
|
28
|
+
rawValue: rawValue$,
|
|
29
|
+
touched: touched$,
|
|
24
30
|
untouched: untouched$,
|
|
25
|
-
dirty: dirty
|
|
31
|
+
dirty: dirty$,
|
|
26
32
|
pristine: pristine$,
|
|
27
33
|
valid: valid$,
|
|
28
34
|
invalid: invalid$,
|
|
@@ -30,16 +36,10 @@ export function formSignal(form, options = buildDefaultFormSignalOptions()) {
|
|
|
30
36
|
disabled: disabled$,
|
|
31
37
|
enabled: enabled$,
|
|
32
38
|
errors: errors$,
|
|
33
|
-
|
|
34
|
-
valueChangeSubscription: valueChangeSubscription$.asReadonly(),
|
|
35
|
-
statusChangeSubscription: statusChangeSubscription$.asReadonly(),
|
|
36
|
-
touchedChangeSubscription: touchedChangeSubscription$.asReadonly(),
|
|
37
|
-
dirtyChangeSubscription: dirtyChangeSubscription$.asReadonly(),
|
|
38
|
-
},
|
|
39
|
+
[FORM_SIGNAL_FORM_TOKEN]: formAsSignal,
|
|
39
40
|
};
|
|
40
41
|
const snapshot$ = buildFormSnapshotSignal(formSignals);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return formSignalObj;
|
|
42
|
+
Object.setPrototypeOf(snapshot$, formSignals);
|
|
43
|
+
return snapshot$;
|
|
44
44
|
}
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybS1zaWduYWwvc3JjL2xpYi9mb3JtLXNpZ25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25FLE9BQU8sRUFDSiw2QkFBNkIsR0FJL0IsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsc0JBQXNCLEVBQStCLE1BQU0sMEJBQTBCLENBQUM7QUFFL0Y7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FDdkIsSUFBTyxFQUNQLFVBQTZCLDZCQUE2QixFQUFFO0lBRTVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckIsd0JBQXdCLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkMsT0FBTyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FFOUQsQ0FBQztJQUVWLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsb0JBQW9CLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLHFCQUFxQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsSCxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLHNCQUFzQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLG9CQUFvQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxRSxNQUFNLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFNUQsTUFBTSxXQUFXLEdBQW9EO1FBQ2xFLE1BQU0sRUFBRSxPQUFPO1FBQ2YsS0FBSyxFQUFFLE1BQU07UUFDYixRQUFRLEVBQUUsU0FBUztRQUNuQixPQUFPLEVBQUUsUUFBUTtRQUNqQixTQUFTLEVBQUUsVUFBVTtRQUNyQixLQUFLLEVBQUUsTUFBTTtRQUNiLFFBQVEsRUFBRSxTQUFTO1FBQ25CLEtBQUssRUFBRSxNQUFNO1FBQ2IsT0FBTyxFQUFFLFFBQVE7UUFDakIsT0FBTyxFQUFFLFFBQVE7UUFDakIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsT0FBTyxFQUFFLFFBQVE7UUFDakIsTUFBTSxFQUFFLE9BQU87UUFDZixDQUFDLHNCQUFzQixDQUFDLEVBQUUsWUFBWTtLQUN4QyxDQUFDO0lBRUYsTUFBTSxTQUFTLEdBQUcsdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFOUMsT0FBTyxTQUF1RCxDQUFDO0FBQ2xFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQsIGluamVjdCwgSW5qZWN0b3IsIGlzU2lnbmFsLCBTaWduYWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1EaXJ0eVNpZ25hbCB9IGZyb20gJy4vaGVscGVycy9mb3JtLWRpcnR5LXNpZ25hbCc7XHJcbmltcG9ydCB7IGJ1aWxkRm9ybUVycm9yU2lnbmFsIH0gZnJvbSAnLi9oZWxwZXJzL2Zvcm0tZXJyb3Itc2lnbmFsJztcclxuaW1wb3J0IHsgYnVpbGRGb3JtU25hcHNob3RTaWduYWwgfSBmcm9tICcuL2hlbHBlcnMvZm9ybS1zbmFwc2hvdC1zaWduYWwnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1TdGF0dXNTaWduYWwgfSBmcm9tICcuL2hlbHBlcnMvZm9ybS1zdGF0dXMtc2lnbmFsJztcclxuaW1wb3J0IHsgYnVpbGRGb3JtVG91Y2hlZFNpZ25hbCB9IGZyb20gJy4vaGVscGVycy9mb3JtLXRvdWNoZWQtc2lnbmFsJztcclxuaW1wb3J0IHsgYnVpbGRGb3JtVmFsdWVTaWduYWwgfSBmcm9tICcuL2hlbHBlcnMvZm9ybS12YWx1ZS1zaWduYWwnO1xyXG5pbXBvcnQge1xyXG4gICBidWlsZERlZmF1bHRGb3JtU2lnbmFsT3B0aW9ucyxcclxuICAgRm9ybVNpZ25hbEZvcm0sXHJcbiAgIEZvcm1TaWduYWxJbnB1dCxcclxuICAgRm9ybVNpZ25hbE9wdGlvbnMsXHJcbn0gZnJvbSAnLi90eXBlcy9mb3JtLXNpZ25hbC1vcHRpb25zJztcclxuaW1wb3J0IHsgRk9STV9TSUdOQUxfRk9STV9UT0tFTiwgRm9ybVNpZ25hbCwgRm9ybVNpZ25hbFN0YXRlIH0gZnJvbSAnLi90eXBlcy9mb3JtLXNpZ25hbC10eXBlJztcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhIHJlYWN0aXZlIGZvcm0gY29udHJvbCBhbmQgc3Vic2NyaWJlcyB0byB2YXJpb3VzIGV2ZW50cyB0byBwdWxsIG91dFxyXG4gKiBmb3JtIHN0YXRlcyBhbmQgc3RvcmUgdGhlbSBpbnRvIHNpZ25hbHMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZm9ybVNpZ25hbDxUIGV4dGVuZHMgRm9ybVNpZ25hbElucHV0PihcclxuICAgZm9ybTogVCxcclxuICAgb3B0aW9uczogRm9ybVNpZ25hbE9wdGlvbnMgPSBidWlsZERlZmF1bHRGb3JtU2lnbmFsT3B0aW9ucygpXHJcbik6IEZvcm1TaWduYWw8Tm9uTnVsbGFibGU8Rm9ybVNpZ25hbEZvcm08VD4+PiB7XHJcbiAgIGlmICghb3B0aW9ucy5pbmplY3Rvcikge1xyXG4gICAgICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQoKCkgPT4ge30pO1xyXG4gICAgICBvcHRpb25zLmluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcclxuICAgfVxyXG5cclxuICAgY29uc3QgZm9ybUFzU2lnbmFsID0gKGlzU2lnbmFsKGZvcm0pID8gZm9ybSA6IHNpZ25hbChmb3JtKS5hc1JlYWRvbmx5KCkpIGFzIFNpZ25hbDxOb25OdWxsYWJsZTxcclxuICAgICAgRm9ybVNpZ25hbEZvcm08VD5cclxuICAgPiB8IG51bGw+O1xyXG5cclxuICAgY29uc3QgeyB2YWx1ZSQsIHJhd1ZhbHVlJCB9ID0gYnVpbGRGb3JtVmFsdWVTaWduYWwoZm9ybUFzU2lnbmFsLCBvcHRpb25zKTtcclxuICAgY29uc3QgeyBzdGF0dXMkLCB2YWxpZCQsIGludmFsaWQkLCBwZW5kaW5nJCwgZGlzYWJsZWQkLCBlbmFibGVkJCB9ID0gYnVpbGRGb3JtU3RhdHVzU2lnbmFsKGZvcm1Bc1NpZ25hbCwgb3B0aW9ucyk7XHJcbiAgIGNvbnN0IHsgdG91Y2hlZCQsIHVudG91Y2hlZCQgfSA9IGJ1aWxkRm9ybVRvdWNoZWRTaWduYWwoZm9ybUFzU2lnbmFsLCBvcHRpb25zKTtcclxuICAgY29uc3QgeyBkaXJ0eSQsIHByaXN0aW5lJCB9ID0gYnVpbGRGb3JtRGlydHlTaWduYWwoZm9ybUFzU2lnbmFsLCBvcHRpb25zKTtcclxuICAgY29uc3QgZXJyb3JzJCA9IGJ1aWxkRm9ybUVycm9yU2lnbmFsKGZvcm1Bc1NpZ25hbCwgb3B0aW9ucyk7XHJcblxyXG4gICBjb25zdCBmb3JtU2lnbmFsczogRm9ybVNpZ25hbFN0YXRlPE5vbk51bGxhYmxlPEZvcm1TaWduYWxGb3JtPFQ+Pj4gPSB7XHJcbiAgICAgIHN0YXR1czogc3RhdHVzJCxcclxuICAgICAgdmFsdWU6IHZhbHVlJCxcclxuICAgICAgcmF3VmFsdWU6IHJhd1ZhbHVlJCxcclxuICAgICAgdG91Y2hlZDogdG91Y2hlZCQsXHJcbiAgICAgIHVudG91Y2hlZDogdW50b3VjaGVkJCxcclxuICAgICAgZGlydHk6IGRpcnR5JCxcclxuICAgICAgcHJpc3RpbmU6IHByaXN0aW5lJCxcclxuICAgICAgdmFsaWQ6IHZhbGlkJCxcclxuICAgICAgaW52YWxpZDogaW52YWxpZCQsXHJcbiAgICAgIHBlbmRpbmc6IHBlbmRpbmckLFxyXG4gICAgICBkaXNhYmxlZDogZGlzYWJsZWQkLFxyXG4gICAgICBlbmFibGVkOiBlbmFibGVkJCxcclxuICAgICAgZXJyb3JzOiBlcnJvcnMkLFxyXG4gICAgICBbRk9STV9TSUdOQUxfRk9STV9UT0tFTl06IGZvcm1Bc1NpZ25hbCxcclxuICAgfTtcclxuXHJcbiAgIGNvbnN0IHNuYXBzaG90JCA9IGJ1aWxkRm9ybVNuYXBzaG90U2lnbmFsKGZvcm1TaWduYWxzKTtcclxuICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHNuYXBzaG90JCwgZm9ybVNpZ25hbHMpO1xyXG5cclxuICAgcmV0dXJuIHNuYXBzaG90JCBhcyBGb3JtU2lnbmFsPE5vbk51bGxhYmxlPEZvcm1TaWduYWxGb3JtPFQ+Pj47XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { computed, untracked } from '@angular/core';
|
|
2
|
+
import { deepFormSignal } from '../deep-form-signal';
|
|
3
|
+
import { formSignal } from '../form-signal';
|
|
4
|
+
function buildEagerFormControlsSignal(formAsSignal, options) {
|
|
5
|
+
const eagerRoot = formSignal(formAsSignal, {
|
|
6
|
+
...options,
|
|
7
|
+
eagerNotify: true,
|
|
8
|
+
});
|
|
9
|
+
const eagerValueStatus$ = computed(() => ({
|
|
10
|
+
value: eagerRoot.value(),
|
|
11
|
+
rawValue: eagerRoot.rawValue(),
|
|
12
|
+
status: eagerRoot.status(),
|
|
13
|
+
}), { equal: () => false });
|
|
14
|
+
const controls$ = computed(() => {
|
|
15
|
+
const form = formAsSignal();
|
|
16
|
+
// Recompute controls on status or value change in event of
|
|
17
|
+
// dynamically added/removed controls
|
|
18
|
+
const _ = eagerValueStatus$();
|
|
19
|
+
return untracked(() => {
|
|
20
|
+
if (form && 'controls' in form) {
|
|
21
|
+
return form.controls;
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
});
|
|
25
|
+
}, { equal: () => false });
|
|
26
|
+
return controls$;
|
|
27
|
+
}
|
|
28
|
+
function extractFormInstances(formSignalsContainer) {
|
|
29
|
+
if (formSignalsContainer === null)
|
|
30
|
+
return [];
|
|
31
|
+
if (Array.isArray(formSignalsContainer))
|
|
32
|
+
return [...formSignalsContainer];
|
|
33
|
+
return Object.keys(formSignalsContainer).map((key) => formSignalsContainer[key]);
|
|
34
|
+
}
|
|
35
|
+
function buildFlattenedControlsSignal(eagerControls$) {
|
|
36
|
+
const flattenedControls$ = computed(() => {
|
|
37
|
+
const controls = eagerControls$();
|
|
38
|
+
return extractFormInstances(controls);
|
|
39
|
+
}, {
|
|
40
|
+
equal: (a, b) => {
|
|
41
|
+
const someANotInB = a.some((aItem) => !b.some((bItem) => bItem === aItem));
|
|
42
|
+
const someBNotInA = b.some((bItem) => !a.some((aItem) => aItem === bItem));
|
|
43
|
+
return !someANotInB && !someBNotInA;
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
return flattenedControls$;
|
|
47
|
+
}
|
|
48
|
+
function buildDeepSignalsForControls(flattenedControls$, options) {
|
|
49
|
+
// Using side effect in computed to prevent using effect in reactive context errors
|
|
50
|
+
// https://v20.angular.dev/errors/NG0602
|
|
51
|
+
let lastTrackedControls = [];
|
|
52
|
+
const controlsWithDeepSignals$ = computed(() => {
|
|
53
|
+
const flattenedControls = flattenedControls$();
|
|
54
|
+
return untracked(() => {
|
|
55
|
+
const newTrackedControls = [];
|
|
56
|
+
for (const c of flattenedControls) {
|
|
57
|
+
const match = lastTrackedControls.find((tc) => tc.control === c);
|
|
58
|
+
if (match) {
|
|
59
|
+
newTrackedControls.push(match);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
newTrackedControls.push({
|
|
63
|
+
control: c,
|
|
64
|
+
deepFormSignal: deepFormSignal(c, options),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
lastTrackedControls = newTrackedControls;
|
|
69
|
+
return lastTrackedControls;
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
return controlsWithDeepSignals$;
|
|
73
|
+
}
|
|
74
|
+
function mapDeepSignalsBackToControlSchema(controlsWithDeepSignals$, formAsSignal) {
|
|
75
|
+
const controls$ = computed(() => {
|
|
76
|
+
const form = formAsSignal();
|
|
77
|
+
if (!form || !('controls' in form))
|
|
78
|
+
return null;
|
|
79
|
+
const controls = form.controls;
|
|
80
|
+
if (!controls)
|
|
81
|
+
return null;
|
|
82
|
+
const deepSignals = controlsWithDeepSignals$();
|
|
83
|
+
if (Array.isArray(controls)) {
|
|
84
|
+
return controls.reduce((acc, c) => {
|
|
85
|
+
const match = deepSignals.find((tc) => tc.control === c)?.deepFormSignal;
|
|
86
|
+
if (match) {
|
|
87
|
+
acc.push(match);
|
|
88
|
+
}
|
|
89
|
+
return acc;
|
|
90
|
+
}, []);
|
|
91
|
+
}
|
|
92
|
+
return Object.keys(controls).reduce((acc, cKey) => {
|
|
93
|
+
const match = deepSignals.find((tc) => tc.control === controls[cKey]);
|
|
94
|
+
if (match && match.deepFormSignal) {
|
|
95
|
+
return { ...acc, [cKey]: match.deepFormSignal };
|
|
96
|
+
}
|
|
97
|
+
return acc;
|
|
98
|
+
}, {});
|
|
99
|
+
});
|
|
100
|
+
return controls$;
|
|
101
|
+
}
|
|
102
|
+
export function buildFormControlsSignal(formAsSignal, options) {
|
|
103
|
+
const eagerControls$ = buildEagerFormControlsSignal(formAsSignal, options);
|
|
104
|
+
const flattenedControls$ = buildFlattenedControlsSignal(eagerControls$);
|
|
105
|
+
const controlsWithDeepSignals$ = buildDeepSignalsForControls(flattenedControls$, options);
|
|
106
|
+
const controls$ = mapDeepSignalsBackToControlSchema(controlsWithDeepSignals$, formAsSignal);
|
|
107
|
+
return controls$;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jb250cm9scy1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybS1zaWduYWwvc3JjL2xpYi9oZWxwZXJzL2Zvcm0tY29udHJvbHMtc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFXNUMsU0FBUyw0QkFBNEIsQ0FDbEMsWUFBOEIsRUFDOUIsT0FBMEI7SUFFMUIsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFlBQVksRUFBRTtRQUN4QyxHQUFHLE9BQU87UUFDVixXQUFXLEVBQUUsSUFBSTtLQUNuQixDQUFDLENBQUM7SUFFSCxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FDL0IsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNKLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFO1FBQ3hCLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQzlCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFO0tBQzVCLENBQUMsRUFDRixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FDeEIsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FDdkIsR0FBRyxFQUFFO1FBQ0YsTUFBTSxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFFNUIsMkRBQTJEO1FBQzNELHFDQUFxQztRQUNyQyxNQUFNLENBQUMsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO1FBRTlCLE9BQU8sU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLElBQUksSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzlC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LElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkQsQ0FBQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2QsQ0FBQyxFQUNELEVBRUMsQ0FDSCxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFNBQVMsQ0FBQztBQUNwQixDQUFDO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUNwQyxZQUE4QixFQUM5QixPQUEwQjtJQUUxQixNQUFNLGNBQWMsR0FBRyw0QkFBNEIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0UsTUFBTSxrQkFBa0IsR0FBRyw0QkFBNEIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN4RSxNQUFNLHdCQUF3QixHQUFHLDJCQUEyQixDQUFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFGLE1BQU0sU0FBUyxHQUFHLGlDQUFpQyxDQUFDLHdCQUF3QixFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzVGLE9BQU8sU0FBUyxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgU2lnbmFsLCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBkZWVwRm9ybVNpZ25hbCB9IGZyb20gJy4uL2RlZXAtZm9ybS1zaWduYWwnO1xyXG5pbXBvcnQgeyBmb3JtU2lnbmFsIH0gZnJvbSAnLi4vZm9ybS1zaWduYWwnO1xyXG5pbXBvcnQgeyBEZWVwRm9ybVNpZ25hbCB9IGZyb20gJy4uL3R5cGVzL2RlZXAtZm9ybS1zaWduYWwtdHlwZSc7XHJcbmltcG9ydCB7IEZvcm1TaWduYWxPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvZm9ybS1zaWduYWwtb3B0aW9ucyc7XHJcblxyXG50eXBlIENvbnRyb2xzID1cclxuICAgfCB7XHJcbiAgICAgICAgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sO1xyXG4gICAgIH1cclxuICAgfCBBYnN0cmFjdENvbnRyb2xbXVxyXG4gICB8IG51bGw7XHJcblxyXG5mdW5jdGlvbiBidWlsZEVhZ2VyRm9ybUNvbnRyb2xzU2lnbmFsPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2w8YW55Pj4oXHJcbiAgIGZvcm1Bc1NpZ25hbDogU2lnbmFsPFQgfCBudWxsPixcclxuICAgb3B0aW9uczogRm9ybVNpZ25hbE9wdGlvbnNcclxuKSB7XHJcbiAgIGNvbnN0IGVhZ2VyUm9vdCA9IGZvcm1TaWduYWwoZm9ybUFzU2lnbmFsLCB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGVhZ2VyTm90aWZ5OiB0cnVlLFxyXG4gICB9KTtcclxuXHJcbiAgIGNvbnN0IGVhZ2VyVmFsdWVTdGF0dXMkID0gY29tcHV0ZWQoXHJcbiAgICAgICgpID0+ICh7XHJcbiAgICAgICAgIHZhbHVlOiBlYWdlclJvb3QudmFsdWUoKSxcclxuICAgICAgICAgcmF3VmFsdWU6IGVhZ2VyUm9vdC5yYXdWYWx1ZSgpLFxyXG4gICAgICAgICBzdGF0dXM6IGVhZ2VyUm9vdC5zdGF0dXMoKSxcclxuICAgICAgfSksXHJcbiAgICAgIHsgZXF1YWw6ICgpID0+IGZhbHNlIH1cclxuICAgKTtcclxuXHJcbiAgIGNvbnN0IGNvbnRyb2xzJCA9IGNvbXB1dGVkKFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgIGNvbnN0IGZvcm0gPSBmb3JtQXNTaWduYWwoKTtcclxuXHJcbiAgICAgICAgIC8vIFJlY29tcHV0ZSBjb250cm9scyBvbiBzdGF0dXMgb3IgdmFsdWUgY2hhbmdlIGluIGV2ZW50IG9mXHJcbiAgICAgICAgIC8vIGR5bmFtaWNhbGx5IGFkZGVkL3JlbW92ZWQgY29udHJvbHNcclxuICAgICAgICAgY29uc3QgXyA9IGVhZ2VyVmFsdWVTdGF0dXMkKCk7XHJcblxyXG4gICAgICAgICByZXR1cm4gdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGZvcm0gJiYgJ2NvbnRyb2xzJyBpbiBmb3JtKSB7XHJcbiAgICAgICAgICAgICAgIHJldHVybiBmb3JtLmNvbnRyb2xzIGFzIENvbnRyb2xzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHsgZXF1YWw6ICgpID0+IGZhbHNlIH1cclxuICAgKTtcclxuICAgcmV0dXJuIGNvbnRyb2xzJDtcclxufVxyXG5cclxuZnVuY3Rpb24gZXh0cmFjdEZvcm1JbnN0YW5jZXMoZm9ybVNpZ25hbHNDb250YWluZXI6IENvbnRyb2xzKTogQWJzdHJhY3RDb250cm9sW10ge1xyXG4gICBpZiAoZm9ybVNpZ25hbHNDb250YWluZXIgPT09IG51bGwpIHJldHVybiBbXTtcclxuICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVNpZ25hbHNDb250YWluZXIpKSByZXR1cm4gWy4uLmZvcm1TaWduYWxzQ29udGFpbmVyXTtcclxuICAgcmV0dXJuIE9iamVjdC5rZXlzKGZvcm1TaWduYWxzQ29udGFpbmVyKS5tYXAoKGtleSkgPT4gZm9ybVNpZ25hbHNDb250YWluZXJba2V5XSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJ1aWxkRmxhdHRlbmVkQ29udHJvbHNTaWduYWwoZWFnZXJDb250cm9scyQ6IFNpZ25hbDxDb250cm9scz4pIHtcclxuICAgY29uc3QgZmxhdHRlbmVkQ29udHJvbHMkID0gY29tcHV0ZWQoXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICAgY29uc3QgY29udHJvbHMgPSBlYWdlckNvbnRyb2xzJCgpO1xyXG4gICAgICAgICByZXR1cm4gZXh0cmFjdEZvcm1JbnN0YW5jZXMoY29udHJvbHMpO1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgIGVxdWFsOiAoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzb21lQU5vdEluQiA9IGEuc29tZSgoYUl0ZW0pID0+ICFiLnNvbWUoKGJJdGVtKSA9PiBiSXRlbSA9PT0gYUl0ZW0pKTtcclxuICAgICAgICAgICAgY29uc3Qgc29tZUJOb3RJbkEgPSBiLnNvbWUoKGJJdGVtKSA9PiAhYS5zb21lKChhSXRlbSkgPT4gYUl0ZW0gPT09IGJJdGVtKSk7XHJcbiAgICAgICAgICAgIHJldHVybiAhc29tZUFOb3RJbkIgJiYgIXNvbWVCTm90SW5BO1xyXG4gICAgICAgICB9LFxyXG4gICAgICB9XHJcbiAgICk7XHJcbiAgIHJldHVybiBmbGF0dGVuZWRDb250cm9scyQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJ1aWxkRGVlcFNpZ25hbHNGb3JDb250cm9scyhcclxuICAgZmxhdHRlbmVkQ29udHJvbHMkOiBTaWduYWw8QWJzdHJhY3RDb250cm9sPGFueSwgYW55PltdPixcclxuICAgb3B0aW9uczogRm9ybVNpZ25hbE9wdGlvbnNcclxuKSB7XHJcbiAgIC8vIFVzaW5nIHNpZGUgZWZmZWN0IGluIGNvbXB1dGVkIHRvIHByZXZlbnQgdXNpbmcgZWZmZWN0IGluIHJlYWN0aXZlIGNvbnRleHQgZXJyb3JzXHJcbiAgIC8vIGh0dHBzOi8vdjIwLmFuZ3VsYXIuZGV2L2Vycm9ycy9ORzA2MDJcclxuICAgbGV0IGxhc3RUcmFja2VkQ29udHJvbHM6IHtcclxuICAgICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sPGFueSwgYW55PjtcclxuICAgICAgZGVlcEZvcm1TaWduYWw6IERlZXBGb3JtU2lnbmFsPGFueT47XHJcbiAgIH1bXSA9IFtdO1xyXG4gICBjb25zdCBjb250cm9sc1dpdGhEZWVwU2lnbmFscyQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZsYXR0ZW5lZENvbnRyb2xzID0gZmxhdHRlbmVkQ29udHJvbHMkKCk7XHJcbiAgICAgIHJldHVybiB1bnRyYWNrZWQoKCkgPT4ge1xyXG4gICAgICAgICBjb25zdCBuZXdUcmFja2VkQ29udHJvbHM6IHtcclxuICAgICAgICAgICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sPGFueSwgYW55PjtcclxuICAgICAgICAgICAgZGVlcEZvcm1TaWduYWw6IERlZXBGb3JtU2lnbmFsPGFueT47XHJcbiAgICAgICAgIH1bXSA9IFtdO1xyXG4gICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZmxhdHRlbmVkQ29udHJvbHMpIHtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBsYXN0VHJhY2tlZENvbnRyb2xzLmZpbmQoKHRjKSA9PiB0Yy5jb250cm9sID09PSBjKTtcclxuICAgICAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgIG5ld1RyYWNrZWRDb250cm9scy5wdXNoKG1hdGNoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgbmV3VHJhY2tlZENvbnRyb2xzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBjb250cm9sOiBjLFxyXG4gICAgICAgICAgICAgICAgICBkZWVwRm9ybVNpZ25hbDogZGVlcEZvcm1TaWduYWwoYywgb3B0aW9ucyksXHJcbiAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgIH1cclxuICAgICAgICAgbGFzdFRyYWNrZWRDb250cm9scyA9IG5ld1RyYWNrZWRDb250cm9scztcclxuICAgICAgICAgcmV0dXJuIGxhc3RUcmFja2VkQ29udHJvbHM7XHJcbiAgICAgIH0pO1xyXG4gICB9KTtcclxuICAgcmV0dXJuIGNvbnRyb2xzV2l0aERlZXBTaWduYWxzJDtcclxufVxyXG5cclxuZnVuY3Rpb24gbWFwRGVlcFNpZ25hbHNCYWNrVG9Db250cm9sU2NoZW1hPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2w8YW55Pj4oXHJcbiAgIGNvbnRyb2xzV2l0aERlZXBTaWduYWxzJDogU2lnbmFsPFxyXG4gICAgICB7XHJcbiAgICAgICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDxhbnksIGFueT47XHJcbiAgICAgICAgIGRlZXBGb3JtU2lnbmFsOiBEZWVwRm9ybVNpZ25hbDxhbnk+O1xyXG4gICAgICB9W11cclxuICAgPixcclxuICAgZm9ybUFzU2lnbmFsOiBTaWduYWw8VCB8IG51bGw+XHJcbikge1xyXG4gICBjb25zdCBjb250cm9scyQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZvcm0gPSBmb3JtQXNTaWduYWwoKTtcclxuICAgICAgaWYgKCFmb3JtIHx8ICEoJ2NvbnRyb2xzJyBpbiBmb3JtKSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBjb250cm9scyA9IGZvcm0uY29udHJvbHMgYXMgQ29udHJvbHM7XHJcbiAgICAgIGlmICghY29udHJvbHMpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgY29uc3QgZGVlcFNpZ25hbHMgPSBjb250cm9sc1dpdGhEZWVwU2lnbmFscyQoKTtcclxuXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xzKSkge1xyXG4gICAgICAgICByZXR1cm4gY29udHJvbHMucmVkdWNlKFxyXG4gICAgICAgICAgICAoYWNjLCBjKSA9PiB7XHJcbiAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gZGVlcFNpZ25hbHMuZmluZCgodGMpID0+IHRjLmNvbnRyb2wgPT09IGMpPy5kZWVwRm9ybVNpZ25hbDtcclxuICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICAgIGFjYy5wdXNoKG1hdGNoKTtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBbXSBhcyBEZWVwRm9ybVNpZ25hbDwodHlwZW9mIGNvbnRyb2xzKVtudW1iZXJdPltdXHJcbiAgICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbnRyb2xzKS5yZWR1Y2UoXHJcbiAgICAgICAgIChhY2MsIGNLZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBkZWVwU2lnbmFscy5maW5kKCh0YykgPT4gdGMuY29udHJvbCA9PT0gY29udHJvbHNbY0tleV0pO1xyXG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2guZGVlcEZvcm1TaWduYWwpIHtcclxuICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYWNjLCBbY0tleV06IG1hdGNoLmRlZXBGb3JtU2lnbmFsIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICAgfSxcclxuICAgICAgICAge30gYXMge1xyXG4gICAgICAgICAgICBbeCBpbiBrZXlvZiB0eXBlb2YgY29udHJvbHNdOiBEZWVwRm9ybVNpZ25hbDwodHlwZW9mIGNvbnRyb2xzKVt4XT47XHJcbiAgICAgICAgIH1cclxuICAgICAgKTtcclxuICAgfSk7XHJcblxyXG4gICByZXR1cm4gY29udHJvbHMkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGb3JtQ29udHJvbHNTaWduYWw8VCBleHRlbmRzIEFic3RyYWN0Q29udHJvbDxhbnk+PihcclxuICAgZm9ybUFzU2lnbmFsOiBTaWduYWw8VCB8IG51bGw+LFxyXG4gICBvcHRpb25zOiBGb3JtU2lnbmFsT3B0aW9uc1xyXG4pIHtcclxuICAgY29uc3QgZWFnZXJDb250cm9scyQgPSBidWlsZEVhZ2VyRm9ybUNvbnRyb2xzU2lnbmFsKGZvcm1Bc1NpZ25hbCwgb3B0aW9ucyk7XHJcbiAgIGNvbnN0IGZsYXR0ZW5lZENvbnRyb2xzJCA9IGJ1aWxkRmxhdHRlbmVkQ29udHJvbHNTaWduYWwoZWFnZXJDb250cm9scyQpO1xyXG4gICBjb25zdCBjb250cm9sc1dpdGhEZWVwU2lnbmFscyQgPSBidWlsZERlZXBTaWduYWxzRm9yQ29udHJvbHMoZmxhdHRlbmVkQ29udHJvbHMkLCBvcHRpb25zKTtcclxuICAgY29uc3QgY29udHJvbHMkID0gbWFwRGVlcFNpZ25hbHNCYWNrVG9Db250cm9sU2NoZW1hKGNvbnRyb2xzV2l0aERlZXBTaWduYWxzJCwgZm9ybUFzU2lnbmFsKTtcclxuICAgcmV0dXJuIGNvbnRyb2xzJDtcclxufVxyXG4iXX0=
|
|
@@ -1,30 +1,29 @@
|
|
|
1
|
-
import { computed,
|
|
1
|
+
import { computed, signal } from '@angular/core';
|
|
2
2
|
import { PristineChangeEvent } from '@angular/forms';
|
|
3
|
-
import { filter } from 'rxjs';
|
|
3
|
+
import { filter, map, of } from 'rxjs';
|
|
4
|
+
import { handleStreamSignal } from './handle-stream-signal';
|
|
4
5
|
export function buildFormDirtySignal(formAsSignal, options) {
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
let initDirty = false;
|
|
7
|
+
try {
|
|
8
|
+
// Attempt read of formAsSignal in try catch
|
|
9
|
+
// to prevent input.required errors
|
|
10
|
+
initDirty = formAsSignal()?.dirty ?? false;
|
|
11
|
+
}
|
|
12
|
+
catch { }
|
|
13
|
+
const dirty$ = signal(initDirty, {
|
|
14
|
+
equal: options.eagerNotify ? () => false : undefined,
|
|
7
15
|
});
|
|
8
|
-
const
|
|
9
|
-
|
|
16
|
+
const pristine$ = computed(() => !dirty$(), {
|
|
17
|
+
equal: options.eagerNotify ? () => false : undefined,
|
|
18
|
+
});
|
|
19
|
+
const formStream$ = computed(() => {
|
|
10
20
|
const form = formAsSignal();
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
dirtyChangeSubscription$.set(form?.events
|
|
19
|
-
.pipe(filter((e) => e instanceof PristineChangeEvent))
|
|
20
|
-
.subscribe((e) => {
|
|
21
|
-
setDirty();
|
|
22
|
-
}) ?? null);
|
|
23
|
-
setDirty();
|
|
24
|
-
});
|
|
25
|
-
onCleanup(() => untracked(() => dirtyChangeSubscription$())?.unsubscribe());
|
|
26
|
-
}, { injector: options.injector });
|
|
27
|
-
const pristine$ = computed(() => !dirty$());
|
|
28
|
-
return { dirty$, pristine$, dirtyChangeSubscription$ };
|
|
21
|
+
const dirtyStream = form?.events.pipe(filter((e) => e instanceof PristineChangeEvent), map(() => !!form.dirty));
|
|
22
|
+
return { form, stream: dirtyStream ? dirtyStream : of(false) };
|
|
23
|
+
});
|
|
24
|
+
handleStreamSignal(formStream$, (form) => {
|
|
25
|
+
dirty$.set(!!form?.dirty);
|
|
26
|
+
}, options);
|
|
27
|
+
return { dirty$: dirty$.asReadonly(), pristine$ };
|
|
29
28
|
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1kaXJ0eS1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybS1zaWduYWwvc3JjL2xpYi9oZWxwZXJzL2Zvcm0tZGlydHktc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsTUFBTSxVQUFVLG9CQUFvQixDQUNqQyxZQUE4QixFQUM5QixPQUEwQjtJQUUxQixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDdEIsSUFBSSxDQUFDO1FBQ0YsNENBQTRDO1FBQzVDLG1DQUFtQztRQUNuQyxTQUFTLEdBQUcsWUFBWSxFQUFFLEVBQUUsS0FBSyxJQUFJLEtBQUssQ0FBQztJQUM5QyxDQUFDO0lBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQztJQUVWLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBVSxTQUFTLEVBQUU7UUFDdkMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztLQUN0RCxDQUFDLENBQUM7SUFDSCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUN6QyxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ3RELENBQUMsQ0FBQztJQUVILE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FHekIsR0FBRyxFQUFFO1FBQ0wsTUFBTSxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDNUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLG1CQUFtQixDQUFDLEVBQy9DLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUN6QixDQUFDO1FBQ0YsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBRUgsa0JBQWtCLENBQ2YsV0FBVyxFQUNYLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDTixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQyxFQUNELE9BQU8sQ0FDVCxDQUFDO0lBRUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVkLCBzaWduYWwsIFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFByaXN0aW5lQ2hhbmdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGb3JtU2lnbmFsT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2Zvcm0tc2lnbmFsLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBoYW5kbGVTdHJlYW1TaWduYWwgfSBmcm9tICcuL2hhbmRsZS1zdHJlYW0tc2lnbmFsJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZvcm1EaXJ0eVNpZ25hbDxUIGV4dGVuZHMgQWJzdHJhY3RDb250cm9sPGFueT4+KFxyXG4gICBmb3JtQXNTaWduYWw6IFNpZ25hbDxUIHwgbnVsbD4sXHJcbiAgIG9wdGlvbnM6IEZvcm1TaWduYWxPcHRpb25zXHJcbikge1xyXG4gICBsZXQgaW5pdERpcnR5ID0gZmFsc2U7XHJcbiAgIHRyeSB7XHJcbiAgICAgIC8vIEF0dGVtcHQgcmVhZCBvZiBmb3JtQXNTaWduYWwgaW4gdHJ5IGNhdGNoXHJcbiAgICAgIC8vIHRvIHByZXZlbnQgaW5wdXQucmVxdWlyZWQgZXJyb3JzXHJcbiAgICAgIGluaXREaXJ0eSA9IGZvcm1Bc1NpZ25hbCgpPy5kaXJ0eSA/PyBmYWxzZTtcclxuICAgfSBjYXRjaCB7fVxyXG5cclxuICAgY29uc3QgZGlydHkkID0gc2lnbmFsPGJvb2xlYW4+KGluaXREaXJ0eSwge1xyXG4gICAgICBlcXVhbDogb3B0aW9ucy5lYWdlck5vdGlmeSA/ICgpID0+IGZhbHNlIDogdW5kZWZpbmVkLFxyXG4gICB9KTtcclxuICAgY29uc3QgcHJpc3RpbmUkID0gY29tcHV0ZWQoKCkgPT4gIWRpcnR5JCgpLCB7XHJcbiAgICAgIGVxdWFsOiBvcHRpb25zLmVhZ2VyTm90aWZ5ID8gKCkgPT4gZmFsc2UgOiB1bmRlZmluZWQsXHJcbiAgIH0pO1xyXG5cclxuICAgY29uc3QgZm9ybVN0cmVhbSQgPSBjb21wdXRlZDx7XHJcbiAgICAgIGZvcm06IFQgfCBudWxsO1xyXG4gICAgICBzdHJlYW06IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgIH0+KCgpID0+IHtcclxuICAgICAgY29uc3QgZm9ybSA9IGZvcm1Bc1NpZ25hbCgpO1xyXG4gICAgICBjb25zdCBkaXJ0eVN0cmVhbSA9IGZvcm0/LmV2ZW50cy5waXBlKFxyXG4gICAgICAgICBmaWx0ZXIoKGUpID0+IGUgaW5zdGFuY2VvZiBQcmlzdGluZUNoYW5nZUV2ZW50KSxcclxuICAgICAgICAgbWFwKCgpID0+ICEhZm9ybS5kaXJ0eSlcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHsgZm9ybSwgc3RyZWFtOiBkaXJ0eVN0cmVhbSA/IGRpcnR5U3RyZWFtIDogb2YoZmFsc2UpIH07XHJcbiAgIH0pO1xyXG5cclxuICAgaGFuZGxlU3RyZWFtU2lnbmFsKFxyXG4gICAgICBmb3JtU3RyZWFtJCxcclxuICAgICAgKGZvcm0pID0+IHtcclxuICAgICAgICAgZGlydHkkLnNldCghIWZvcm0/LmRpcnR5KTtcclxuICAgICAgfSxcclxuICAgICAgb3B0aW9uc1xyXG4gICApO1xyXG5cclxuICAgcmV0dXJuIHsgZGlydHkkOiBkaXJ0eSQuYXNSZWFkb25seSgpLCBwcmlzdGluZSQgfTtcclxufVxyXG4iXX0=
|
|
@@ -1,10 +1,26 @@
|
|
|
1
|
-
import { computed,
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { computed, signal } from '@angular/core';
|
|
2
|
+
import { StatusChangeEvent, ValueChangeEvent } from '@angular/forms';
|
|
3
|
+
import { filter, map, of } from 'rxjs';
|
|
4
|
+
import { handleStreamSignal } from './handle-stream-signal';
|
|
5
|
+
export function buildFormErrorSignal(formAsSignal, options) {
|
|
6
|
+
let initErrors = null;
|
|
7
|
+
try {
|
|
8
|
+
// Attempt read of formAsSignal in try catch
|
|
9
|
+
// to prevent input.required errors
|
|
10
|
+
initErrors = formAsSignal()?.errors ?? null;
|
|
11
|
+
}
|
|
12
|
+
catch { }
|
|
13
|
+
const error$ = signal(initErrors, {
|
|
14
|
+
equal: options.eagerNotify ? () => false : undefined,
|
|
15
|
+
});
|
|
16
|
+
const formStream$ = computed(() => {
|
|
17
|
+
const form = formAsSignal();
|
|
18
|
+
const errorStream = form?.events.pipe(filter((e) => e instanceof StatusChangeEvent || e instanceof ValueChangeEvent), map(() => form.errors));
|
|
19
|
+
return { form, stream: errorStream ? errorStream : of(null) };
|
|
20
|
+
});
|
|
21
|
+
handleStreamSignal(formStream$, (form) => {
|
|
22
|
+
error$.set(form?.errors ?? null);
|
|
23
|
+
}, options);
|
|
24
|
+
return error$.asReadonly();
|
|
9
25
|
}
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lcnJvci1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybS1zaWduYWwvc3JjL2xpYi9oZWxwZXJzL2Zvcm0tZXJyb3Itc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBbUIsaUJBQWlCLEVBQW9CLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEcsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVELE1BQU0sVUFBVSxvQkFBb0IsQ0FDakMsWUFBOEIsRUFDOUIsT0FBMEI7SUFFMUIsSUFBSSxVQUFVLEdBQTRCLElBQUksQ0FBQztJQUMvQyxJQUFJLENBQUM7UUFDRiw0Q0FBNEM7UUFDNUMsbUNBQW1DO1FBQ25DLFVBQVUsR0FBRyxZQUFZLEVBQUUsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDO0lBQy9DLENBQUM7SUFBQyxNQUFNLENBQUMsQ0FBQSxDQUFDO0lBRVYsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUEwQixVQUFVLEVBQUU7UUFDeEQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztLQUN0RCxDQUFDLENBQUM7SUFFSCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBR3pCLEdBQUcsRUFBRTtRQUNMLE1BQU0sSUFBSSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0sV0FBVyxHQUFHLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxpQkFBaUIsSUFBSSxDQUFDLFlBQVksZ0JBQWdCLENBQUMsRUFDOUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDeEIsQ0FBQztRQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNqRSxDQUFDLENBQUMsQ0FBQztJQUVILGtCQUFrQixDQUNmLFdBQVcsRUFDWCxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUMsRUFDRCxPQUFPLENBQ1QsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgU2lnbmFsLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBTdGF0dXNDaGFuZ2VFdmVudCwgVmFsaWRhdGlvbkVycm9ycywgVmFsdWVDaGFuZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZvcm1TaWduYWxPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvZm9ybS1zaWduYWwtb3B0aW9ucyc7XHJcbmltcG9ydCB7IGhhbmRsZVN0cmVhbVNpZ25hbCB9IGZyb20gJy4vaGFuZGxlLXN0cmVhbS1zaWduYWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRm9ybUVycm9yU2lnbmFsPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2w8YW55Pj4oXHJcbiAgIGZvcm1Bc1NpZ25hbDogU2lnbmFsPFQgfCBudWxsPixcclxuICAgb3B0aW9uczogRm9ybVNpZ25hbE9wdGlvbnNcclxuKSB7XHJcbiAgIGxldCBpbml0RXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IG51bGw7XHJcbiAgIHRyeSB7XHJcbiAgICAgIC8vIEF0dGVtcHQgcmVhZCBvZiBmb3JtQXNTaWduYWwgaW4gdHJ5IGNhdGNoXHJcbiAgICAgIC8vIHRvIHByZXZlbnQgaW5wdXQucmVxdWlyZWQgZXJyb3JzXHJcbiAgICAgIGluaXRFcnJvcnMgPSBmb3JtQXNTaWduYWwoKT8uZXJyb3JzID8/IG51bGw7XHJcbiAgIH0gY2F0Y2gge31cclxuXHJcbiAgIGNvbnN0IGVycm9yJCA9IHNpZ25hbDxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4oaW5pdEVycm9ycywge1xyXG4gICAgICBlcXVhbDogb3B0aW9ucy5lYWdlck5vdGlmeSA/ICgpID0+IGZhbHNlIDogdW5kZWZpbmVkLFxyXG4gICB9KTtcclxuXHJcbiAgIGNvbnN0IGZvcm1TdHJlYW0kID0gY29tcHV0ZWQ8e1xyXG4gICAgICBmb3JtOiBUIHwgbnVsbDtcclxuICAgICAgc3RyZWFtOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgIH0+KCgpID0+IHtcclxuICAgICAgY29uc3QgZm9ybSA9IGZvcm1Bc1NpZ25hbCgpO1xyXG4gICAgICBjb25zdCBlcnJvclN0cmVhbSA9IGZvcm0/LmV2ZW50cy5waXBlKFxyXG4gICAgICAgICBmaWx0ZXIoKGUpID0+IGUgaW5zdGFuY2VvZiBTdGF0dXNDaGFuZ2VFdmVudCB8fCBlIGluc3RhbmNlb2YgVmFsdWVDaGFuZ2VFdmVudCksXHJcbiAgICAgICAgIG1hcCgoKSA9PiBmb3JtLmVycm9ycylcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHsgZm9ybSwgc3RyZWFtOiBlcnJvclN0cmVhbSA/IGVycm9yU3RyZWFtIDogb2YobnVsbCkgfTtcclxuICAgfSk7XHJcblxyXG4gICBoYW5kbGVTdHJlYW1TaWduYWwoXHJcbiAgICAgIGZvcm1TdHJlYW0kLFxyXG4gICAgICAoZm9ybSkgPT4ge1xyXG4gICAgICAgICBlcnJvciQuc2V0KGZvcm0/LmVycm9ycyA/PyBudWxsKTtcclxuICAgICAgfSxcclxuICAgICAgb3B0aW9uc1xyXG4gICApO1xyXG5cclxuICAgcmV0dXJuIGVycm9yJC5hc1JlYWRvbmx5KCk7XHJcbn1cclxuIl19
|
|
@@ -15,13 +15,7 @@ export function buildFormSnapshotSignal(formSignalState) {
|
|
|
15
15
|
disabled: formSignalState.disabled(),
|
|
16
16
|
enabled: formSignalState.enabled(),
|
|
17
17
|
errors: formSignalState.errors(),
|
|
18
|
-
subscriptions: {
|
|
19
|
-
valueChangeSubscription: formSignalState.subscriptions.valueChangeSubscription(),
|
|
20
|
-
statusChangeSubscription: formSignalState.subscriptions.statusChangeSubscription(),
|
|
21
|
-
touchedChangeSubscription: formSignalState.subscriptions.touchedChangeSubscription(),
|
|
22
|
-
dirtyChangeSubscription: formSignalState.subscriptions.dirtyChangeSubscription(),
|
|
23
|
-
},
|
|
24
18
|
};
|
|
25
19
|
});
|
|
26
20
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zbmFwc2hvdC1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybS1zaWduYWwvc3JjL2xpYi9oZWxwZXJzL2Zvcm0tc25hcHNob3Qtc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJekMsTUFBTSxVQUFVLHVCQUF1QixDQUFpQyxlQUFtQztJQUN4RyxPQUFPLFFBQVEsQ0FBNkIsR0FBRyxFQUFFO1FBQzlDLE9BQU87WUFDSixNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRTtZQUNoQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRTtZQUM5QixRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRTtZQUNwQyxPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUNsQyxTQUFTLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRTtZQUN0QyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRTtZQUM5QixRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRTtZQUNwQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRTtZQUM5QixPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUNsQyxPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUNsQyxRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRTtZQUNwQyxPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUNsQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRTtTQUNsQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGb3JtU2lnbmFsU3RhdGUsIEZvcm1TbmFwc2hvdFNpZ25hbFN0YXRlIH0gZnJvbSAnLi4vdHlwZXMvZm9ybS1zaWduYWwtdHlwZSc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGb3JtU25hcHNob3RTaWduYWw8VCBleHRlbmRzIEFic3RyYWN0Q29udHJvbDxhbnk+Pihmb3JtU2lnbmFsU3RhdGU6IEZvcm1TaWduYWxTdGF0ZTxUPikge1xyXG4gICByZXR1cm4gY29tcHV0ZWQ8Rm9ybVNuYXBzaG90U2lnbmFsU3RhdGU8VD4+KCgpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgc3RhdHVzOiBmb3JtU2lnbmFsU3RhdGUuc3RhdHVzKCksXHJcbiAgICAgICAgIHZhbHVlOiBmb3JtU2lnbmFsU3RhdGUudmFsdWUoKSxcclxuICAgICAgICAgcmF3VmFsdWU6IGZvcm1TaWduYWxTdGF0ZS5yYXdWYWx1ZSgpLFxyXG4gICAgICAgICB0b3VjaGVkOiBmb3JtU2lnbmFsU3RhdGUudG91Y2hlZCgpLFxyXG4gICAgICAgICB1bnRvdWNoZWQ6IGZvcm1TaWduYWxTdGF0ZS51bnRvdWNoZWQoKSxcclxuICAgICAgICAgZGlydHk6IGZvcm1TaWduYWxTdGF0ZS5kaXJ0eSgpLFxyXG4gICAgICAgICBwcmlzdGluZTogZm9ybVNpZ25hbFN0YXRlLnByaXN0aW5lKCksXHJcbiAgICAgICAgIHZhbGlkOiBmb3JtU2lnbmFsU3RhdGUudmFsaWQoKSxcclxuICAgICAgICAgaW52YWxpZDogZm9ybVNpZ25hbFN0YXRlLmludmFsaWQoKSxcclxuICAgICAgICAgcGVuZGluZzogZm9ybVNpZ25hbFN0YXRlLnBlbmRpbmcoKSxcclxuICAgICAgICAgZGlzYWJsZWQ6IGZvcm1TaWduYWxTdGF0ZS5kaXNhYmxlZCgpLFxyXG4gICAgICAgICBlbmFibGVkOiBmb3JtU2lnbmFsU3RhdGUuZW5hYmxlZCgpLFxyXG4gICAgICAgICBlcnJvcnM6IGZvcm1TaWduYWxTdGF0ZS5lcnJvcnMoKSxcclxuICAgICAgfTtcclxuICAgfSk7XHJcbn1cclxuIl19
|
|
@@ -1,29 +1,41 @@
|
|
|
1
|
-
import { computed,
|
|
1
|
+
import { computed, signal } from '@angular/core';
|
|
2
|
+
import { StatusChangeEvent } from '@angular/forms';
|
|
3
|
+
import { filter, map, of } from 'rxjs';
|
|
4
|
+
import { handleStreamSignal } from './handle-stream-signal';
|
|
2
5
|
export function buildFormStatusSignal(formAsSignal, options) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
let initStatus = null;
|
|
7
|
+
try {
|
|
8
|
+
// Attempt read of formAsSignal in try catch
|
|
9
|
+
// to prevent input.required errors
|
|
10
|
+
initStatus = formAsSignal()?.status ?? null;
|
|
11
|
+
}
|
|
12
|
+
catch { }
|
|
13
|
+
const status$ = signal(initStatus, {
|
|
14
|
+
equal: options.eagerNotify ? () => false : undefined,
|
|
15
|
+
});
|
|
16
|
+
const valid$ = computed(() => status$() === 'VALID', {
|
|
17
|
+
equal: options.eagerNotify ? () => false : undefined,
|
|
18
|
+
});
|
|
19
|
+
const invalid$ = computed(() => status$() === 'INVALID', {
|
|
20
|
+
equal: options.eagerNotify ? () => false : undefined,
|
|
21
|
+
});
|
|
22
|
+
const pending$ = computed(() => status$() == 'PENDING', {
|
|
23
|
+
equal: options.eagerNotify ? () => false : undefined,
|
|
24
|
+
});
|
|
25
|
+
const disabled$ = computed(() => status$() === 'DISABLED', {
|
|
26
|
+
equal: options.eagerNotify ? () => false : undefined,
|
|
27
|
+
});
|
|
28
|
+
const enabled$ = computed(() => !disabled$(), {
|
|
29
|
+
equal: options.eagerNotify ? () => false : undefined,
|
|
30
|
+
});
|
|
31
|
+
const formStream$ = computed(() => {
|
|
7
32
|
const form = formAsSignal();
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
statusChangeSubscription$()?.unsubscribe();
|
|
15
|
-
statusChangeSubscription$.set(form?.statusChanges.subscribe(() => {
|
|
16
|
-
setStatus();
|
|
17
|
-
}) ?? null);
|
|
18
|
-
setStatus();
|
|
19
|
-
});
|
|
20
|
-
onCleanup(() => untracked(() => statusChangeSubscription$())?.unsubscribe());
|
|
21
|
-
}, { injector: options.injector });
|
|
22
|
-
const valid$ = computed(() => status$() === 'VALID');
|
|
23
|
-
const invalid$ = computed(() => status$() === 'INVALID');
|
|
24
|
-
const pending$ = computed(() => status$() == 'PENDING');
|
|
25
|
-
const disabled$ = computed(() => status$() === 'DISABLED');
|
|
26
|
-
const enabled$ = computed(() => status$() !== 'DISABLED');
|
|
33
|
+
const statusStream = form?.events.pipe(filter((e) => e instanceof StatusChangeEvent), map(() => form.status));
|
|
34
|
+
return { form, stream: statusStream ? statusStream : of(null) };
|
|
35
|
+
});
|
|
36
|
+
handleStreamSignal(formStream$, (form) => {
|
|
37
|
+
status$.set(form?.status ?? null);
|
|
38
|
+
}, options);
|
|
27
39
|
return {
|
|
28
40
|
status$,
|
|
29
41
|
valid$,
|
|
@@ -31,7 +43,6 @@ export function buildFormStatusSignal(formAsSignal, options) {
|
|
|
31
43
|
pending$,
|
|
32
44
|
disabled$,
|
|
33
45
|
enabled$,
|
|
34
|
-
statusChangeSubscription$,
|
|
35
46
|
};
|
|
36
47
|
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zdGF0dXMtc2lnbmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWZvcm0tc2lnbmFsL3NyYy9saWIvaGVscGVycy9mb3JtLXN0YXR1cy1zaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFzQyxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxNQUFNLFVBQVUscUJBQXFCLENBQ2xDLFlBQThCLEVBQzlCLE9BQTBCO0lBRTFCLElBQUksVUFBVSxHQUE2QixJQUFJLENBQUM7SUFDaEQsSUFBSSxDQUFDO1FBQ0YsNENBQTRDO1FBQzVDLG1DQUFtQztRQUNuQyxVQUFVLEdBQUcsWUFBWSxFQUFFLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQztJQUVWLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBMkIsVUFBVSxFQUFFO1FBQzFELEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDdEQsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLE9BQU8sRUFBRTtRQUNsRCxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ3RELENBQUMsQ0FBQztJQUNILE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQUU7UUFDdEQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztLQUN0RCxDQUFDLENBQUM7SUFDSCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksU0FBUyxFQUFFO1FBQ3JELEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDdEQsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRTtRQUN4RCxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ3RELENBQUMsQ0FBQztJQUNILE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1FBQzNDLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDdEQsQ0FBQyxDQUFDO0lBRUgsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUd6QixHQUFHLEVBQUU7UUFDTCxNQUFNLElBQUksR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUM1QixNQUFNLFlBQVksR0FBRyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FDbkMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksaUJBQWlCLENBQUMsRUFDN0MsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDeEIsQ0FBQztRQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztJQUVILGtCQUFrQixDQUNmLFdBQVcsRUFDWCxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUMsRUFDRCxPQUFPLENBQ1QsQ0FBQztJQUVGLE9BQU87UUFDSixPQUFPO1FBQ1AsTUFBTTtRQUNOLFFBQVE7UUFDUixRQUFRO1FBQ1IsU0FBUztRQUNULFFBQVE7S0FDVixDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVkLCBzaWduYWwsIFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sU3RhdHVzLCBTdGF0dXNDaGFuZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZvcm1TaWduYWxPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvZm9ybS1zaWduYWwtb3B0aW9ucyc7XHJcbmltcG9ydCB7IGhhbmRsZVN0cmVhbVNpZ25hbCB9IGZyb20gJy4vaGFuZGxlLXN0cmVhbS1zaWduYWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRm9ybVN0YXR1c1NpZ25hbDxUIGV4dGVuZHMgQWJzdHJhY3RDb250cm9sPGFueT4+KFxyXG4gICBmb3JtQXNTaWduYWw6IFNpZ25hbDxUIHwgbnVsbD4sXHJcbiAgIG9wdGlvbnM6IEZvcm1TaWduYWxPcHRpb25zXHJcbikge1xyXG4gICBsZXQgaW5pdFN0YXR1czogRm9ybUNvbnRyb2xTdGF0dXMgfCBudWxsID0gbnVsbDtcclxuICAgdHJ5IHtcclxuICAgICAgLy8gQXR0ZW1wdCByZWFkIG9mIGZvcm1Bc1NpZ25hbCBpbiB0cnkgY2F0Y2hcclxuICAgICAgLy8gdG8gcHJldmVudCBpbnB1dC5yZXF1aXJlZCBlcnJvcnNcclxuICAgICAgaW5pdFN0YXR1cyA9IGZvcm1Bc1NpZ25hbCgpPy5zdGF0dXMgPz8gbnVsbDtcclxuICAgfSBjYXRjaCB7fVxyXG5cclxuICAgY29uc3Qgc3RhdHVzJCA9IHNpZ25hbDxGb3JtQ29udHJvbFN0YXR1cyB8IG51bGw+KGluaXRTdGF0dXMsIHtcclxuICAgICAgZXF1YWw6IG9wdGlvbnMuZWFnZXJOb3RpZnkgPyAoKSA9PiBmYWxzZSA6IHVuZGVmaW5lZCxcclxuICAgfSk7XHJcbiAgIGNvbnN0IHZhbGlkJCA9IGNvbXB1dGVkKCgpID0+IHN0YXR1cyQoKSA9PT0gJ1ZBTElEJywge1xyXG4gICAgICBlcXVhbDogb3B0aW9ucy5lYWdlck5vdGlmeSA/ICgpID0+IGZhbHNlIDogdW5kZWZpbmVkLFxyXG4gICB9KTtcclxuICAgY29uc3QgaW52YWxpZCQgPSBjb21wdXRlZCgoKSA9PiBzdGF0dXMkKCkgPT09ICdJTlZBTElEJywge1xyXG4gICAgICBlcXVhbDogb3B0aW9ucy5lYWdlck5vdGlmeSA/ICgpID0+IGZhbHNlIDogdW5kZWZpbmVkLFxyXG4gICB9KTtcclxuICAgY29uc3QgcGVuZGluZyQgPSBjb21wdXRlZCgoKSA9PiBzdGF0dXMkKCkgPT0gJ1BFTkRJTkcnLCB7XHJcbiAgICAgIGVxdWFsOiBvcHRpb25zLmVhZ2VyTm90aWZ5ID8gKCkgPT4gZmFsc2UgOiB1bmRlZmluZWQsXHJcbiAgIH0pO1xyXG4gICBjb25zdCBkaXNhYmxlZCQgPSBjb21wdXRlZCgoKSA9PiBzdGF0dXMkKCkgPT09ICdESVNBQkxFRCcsIHtcclxuICAgICAgZXF1YWw6IG9wdGlvbnMuZWFnZXJOb3RpZnkgPyAoKSA9PiBmYWxzZSA6IHVuZGVmaW5lZCxcclxuICAgfSk7XHJcbiAgIGNvbnN0IGVuYWJsZWQkID0gY29tcHV0ZWQoKCkgPT4gIWRpc2FibGVkJCgpLCB7XHJcbiAgICAgIGVxdWFsOiBvcHRpb25zLmVhZ2VyTm90aWZ5ID8gKCkgPT4gZmFsc2UgOiB1bmRlZmluZWQsXHJcbiAgIH0pO1xyXG5cclxuICAgY29uc3QgZm9ybVN0cmVhbSQgPSBjb21wdXRlZDx7XHJcbiAgICAgIGZvcm06IFQgfCBudWxsO1xyXG4gICAgICBzdHJlYW06IE9ic2VydmFibGU8Rm9ybUNvbnRyb2xTdGF0dXMgfCBudWxsPjtcclxuICAgfT4oKCkgPT4ge1xyXG4gICAgICBjb25zdCBmb3JtID0gZm9ybUFzU2lnbmFsKCk7XHJcbiAgICAgIGNvbnN0IHN0YXR1c1N0cmVhbSA9IGZvcm0/LmV2ZW50cy5waXBlKFxyXG4gICAgICAgICBmaWx0ZXIoKGUpID0+IGUgaW5zdGFuY2VvZiBTdGF0dXNDaGFuZ2VFdmVudCksXHJcbiAgICAgICAgIG1hcCgoKSA9PiBmb3JtLnN0YXR1cylcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHsgZm9ybSwgc3RyZWFtOiBzdGF0dXNTdHJlYW0gPyBzdGF0dXNTdHJlYW0gOiBvZihudWxsKSB9O1xyXG4gICB9KTtcclxuXHJcbiAgIGhhbmRsZVN0cmVhbVNpZ25hbChcclxuICAgICAgZm9ybVN0cmVhbSQsXHJcbiAgICAgIChmb3JtKSA9PiB7XHJcbiAgICAgICAgIHN0YXR1cyQuc2V0KGZvcm0/LnN0YXR1cyA/PyBudWxsKTtcclxuICAgICAgfSxcclxuICAgICAgb3B0aW9uc1xyXG4gICApO1xyXG5cclxuICAgcmV0dXJuIHtcclxuICAgICAgc3RhdHVzJCxcclxuICAgICAgdmFsaWQkLFxyXG4gICAgICBpbnZhbGlkJCxcclxuICAgICAgcGVuZGluZyQsXHJcbiAgICAgIGRpc2FibGVkJCxcclxuICAgICAgZW5hYmxlZCQsXHJcbiAgIH07XHJcbn1cclxuIl19
|
|
@@ -1,32 +1,29 @@
|
|
|
1
|
-
import { computed,
|
|
1
|
+
import { computed, signal } from '@angular/core';
|
|
2
2
|
import { TouchedChangeEvent } from '@angular/forms';
|
|
3
|
-
import { filter } from 'rxjs';
|
|
3
|
+
import { filter, map, of } from 'rxjs';
|
|
4
|
+
import { handleStreamSignal } from './handle-stream-signal';
|
|
4
5
|
export function buildFormTouchedSignal(formAsSignal, options) {
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
let initTouched = false;
|
|
7
|
+
try {
|
|
8
|
+
// Attempt read of formAsSignal in try catch
|
|
9
|
+
// to prevent input.required errors
|
|
10
|
+
initTouched = formAsSignal()?.touched ?? false;
|
|
11
|
+
}
|
|
12
|
+
catch { }
|
|
13
|
+
const touched$ = signal(initTouched, {
|
|
14
|
+
equal: options.eagerNotify ? () => false : undefined,
|
|
7
15
|
});
|
|
8
|
-
const touchedChangeSubscription$ = signal(null);
|
|
9
|
-
const formTouchedChangeEffect = effect((onCleanup) => {
|
|
10
|
-
const form = formAsSignal();
|
|
11
|
-
untracked(() => {
|
|
12
|
-
const setTouched = () => {
|
|
13
|
-
untracked(() => {
|
|
14
|
-
touched$.set(!!form?.touched);
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
|
-
touchedChangeSubscription$()?.unsubscribe();
|
|
18
|
-
touchedChangeSubscription$.set(form?.events
|
|
19
|
-
.pipe(filter((e) => e instanceof TouchedChangeEvent))
|
|
20
|
-
.subscribe((e) => {
|
|
21
|
-
setTouched();
|
|
22
|
-
}) ?? null);
|
|
23
|
-
setTouched();
|
|
24
|
-
});
|
|
25
|
-
onCleanup(() => untracked(() => touchedChangeSubscription$())?.unsubscribe());
|
|
26
|
-
}, { injector: options.injector });
|
|
27
16
|
const untouched$ = computed(() => !touched$(), {
|
|
28
|
-
equal: options.
|
|
17
|
+
equal: options.eagerNotify ? () => false : undefined,
|
|
18
|
+
});
|
|
19
|
+
const formStream$ = computed(() => {
|
|
20
|
+
const form = formAsSignal();
|
|
21
|
+
const touchedStream = form?.events.pipe(filter((e) => e instanceof TouchedChangeEvent), map(() => !!form.touched));
|
|
22
|
+
return { form, stream: touchedStream ? touchedStream : of(false) };
|
|
29
23
|
});
|
|
30
|
-
|
|
24
|
+
handleStreamSignal(formStream$, (form) => {
|
|
25
|
+
touched$.set(!!form?.touched);
|
|
26
|
+
}, options);
|
|
27
|
+
return { touched$: touched$.asReadonly(), untouched$ };
|
|
31
28
|
}
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS10b3VjaGVkLXNpZ25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtLXNpZ25hbC9zcmMvbGliL2hlbHBlcnMvZm9ybS10b3VjaGVkLXNpZ25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQW1CLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVELE1BQU0sVUFBVSxzQkFBc0IsQ0FDbkMsWUFBOEIsRUFDOUIsT0FBMEI7SUFFMUIsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLElBQUksQ0FBQztRQUNGLDRDQUE0QztRQUM1QyxtQ0FBbUM7UUFDbkMsV0FBVyxHQUFHLFlBQVksRUFBRSxFQUFFLE9BQU8sSUFBSSxLQUFLLENBQUM7SUFDbEQsQ0FBQztJQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUM7SUFFVixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQVUsV0FBVyxFQUFFO1FBQzNDLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDdEQsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDNUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztLQUN0RCxDQUFDLENBQUM7SUFFSCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBR3pCLEdBQUcsRUFBRTtRQUNMLE1BQU0sSUFBSSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0sYUFBYSxHQUFHLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxrQkFBa0IsQ0FBQyxFQUM5QyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDM0IsQ0FBQztRQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztJQUVILGtCQUFrQixDQUNmLFdBQVcsRUFDWCxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ04sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUMsRUFDRCxPQUFPLENBQ1QsQ0FBQztJQUVGLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgc2lnbmFsLCBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBUb3VjaGVkQ2hhbmdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGb3JtU2lnbmFsT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2Zvcm0tc2lnbmFsLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBoYW5kbGVTdHJlYW1TaWduYWwgfSBmcm9tICcuL2hhbmRsZS1zdHJlYW0tc2lnbmFsJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZvcm1Ub3VjaGVkU2lnbmFsPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2w8YW55Pj4oXHJcbiAgIGZvcm1Bc1NpZ25hbDogU2lnbmFsPFQgfCBudWxsPixcclxuICAgb3B0aW9uczogRm9ybVNpZ25hbE9wdGlvbnNcclxuKSB7XHJcbiAgIGxldCBpbml0VG91Y2hlZCA9IGZhbHNlO1xyXG4gICB0cnkge1xyXG4gICAgICAvLyBBdHRlbXB0IHJlYWQgb2YgZm9ybUFzU2lnbmFsIGluIHRyeSBjYXRjaFxyXG4gICAgICAvLyB0byBwcmV2ZW50IGlucHV0LnJlcXVpcmVkIGVycm9yc1xyXG4gICAgICBpbml0VG91Y2hlZCA9IGZvcm1Bc1NpZ25hbCgpPy50b3VjaGVkID8/IGZhbHNlO1xyXG4gICB9IGNhdGNoIHt9XHJcblxyXG4gICBjb25zdCB0b3VjaGVkJCA9IHNpZ25hbDxib29sZWFuPihpbml0VG91Y2hlZCwge1xyXG4gICAgICBlcXVhbDogb3B0aW9ucy5lYWdlck5vdGlmeSA/ICgpID0+IGZhbHNlIDogdW5kZWZpbmVkLFxyXG4gICB9KTtcclxuICAgY29uc3QgdW50b3VjaGVkJCA9IGNvbXB1dGVkKCgpID0+ICF0b3VjaGVkJCgpLCB7XHJcbiAgICAgIGVxdWFsOiBvcHRpb25zLmVhZ2VyTm90aWZ5ID8gKCkgPT4gZmFsc2UgOiB1bmRlZmluZWQsXHJcbiAgIH0pO1xyXG5cclxuICAgY29uc3QgZm9ybVN0cmVhbSQgPSBjb21wdXRlZDx7XHJcbiAgICAgIGZvcm06IFQgfCBudWxsO1xyXG4gICAgICBzdHJlYW06IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgIH0+KCgpID0+IHtcclxuICAgICAgY29uc3QgZm9ybSA9IGZvcm1Bc1NpZ25hbCgpO1xyXG4gICAgICBjb25zdCB0b3VjaGVkU3RyZWFtID0gZm9ybT8uZXZlbnRzLnBpcGUoXHJcbiAgICAgICAgIGZpbHRlcigoZSkgPT4gZSBpbnN0YW5jZW9mIFRvdWNoZWRDaGFuZ2VFdmVudCksXHJcbiAgICAgICAgIG1hcCgoKSA9PiAhIWZvcm0udG91Y2hlZClcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHsgZm9ybSwgc3RyZWFtOiB0b3VjaGVkU3RyZWFtID8gdG91Y2hlZFN0cmVhbSA6IG9mKGZhbHNlKSB9O1xyXG4gICB9KTtcclxuXHJcbiAgIGhhbmRsZVN0cmVhbVNpZ25hbChcclxuICAgICAgZm9ybVN0cmVhbSQsXHJcbiAgICAgIChmb3JtKSA9PiB7XHJcbiAgICAgICAgIHRvdWNoZWQkLnNldCghIWZvcm0/LnRvdWNoZWQpO1xyXG4gICAgICB9LFxyXG4gICAgICBvcHRpb25zXHJcbiAgICk7XHJcblxyXG4gICByZXR1cm4geyB0b3VjaGVkJDogdG91Y2hlZCQuYXNSZWFkb25seSgpLCB1bnRvdWNoZWQkIH07XHJcbn1cclxuIl19
|