@ngxs/form-plugin 3.8.2-dev.master-414599c → 3.8.2-dev.master-9f0fcb0

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ngxs/form-plugin",
3
3
  "description": "form plugin for @ngxs/store",
4
- "version": "3.8.2-dev.master-414599c",
4
+ "version": "3.8.2-dev.master-9f0fcb0",
5
5
  "sideEffects": false,
6
6
  "peerDependencies": {
7
7
  "@angular/core": ">=12.0.0 <18.0.0",
@@ -9,11 +9,7 @@
9
9
  "@ngxs/store": "^3.8.2 || ^3.8.2-dev",
10
10
  "rxjs": ">=6.5.5"
11
11
  },
12
- "module": "fesm2015/ngxs-form-plugin.mjs",
13
- "es2020": "fesm2020/ngxs-form-plugin.mjs",
14
- "esm2020": "esm2020/ngxs-form-plugin.mjs",
15
- "fesm2020": "fesm2020/ngxs-form-plugin.mjs",
16
- "fesm2015": "fesm2015/ngxs-form-plugin.mjs",
12
+ "module": "fesm2022/ngxs-form-plugin.mjs",
17
13
  "typings": "index.d.ts",
18
14
  "exports": {
19
15
  "./package.json": {
@@ -21,11 +17,9 @@
21
17
  },
22
18
  ".": {
23
19
  "types": "./index.d.ts",
24
- "esm2020": "./esm2020/ngxs-form-plugin.mjs",
25
- "es2020": "./fesm2020/ngxs-form-plugin.mjs",
26
- "es2015": "./fesm2015/ngxs-form-plugin.mjs",
27
- "node": "./fesm2015/ngxs-form-plugin.mjs",
28
- "default": "./fesm2020/ngxs-form-plugin.mjs"
20
+ "esm2022": "./esm2022/ngxs-form-plugin.mjs",
21
+ "esm": "./esm2022/ngxs-form-plugin.mjs",
22
+ "default": "./fesm2022/ngxs-form-plugin.mjs"
29
23
  }
30
24
  },
31
25
  "dependencies": {
@@ -24,5 +24,5 @@ export declare class NgxsFormDirective implements OnInit, OnDestroy {
24
24
  private get form();
25
25
  private getStateStream;
26
26
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxsFormDirective, never>;
27
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgxsFormDirective, "[ngxsForm]", never, { "path": "ngxsForm"; "debounce": "ngxsFormDebounce"; "clearDestroy": "ngxsFormClearOnDestroy"; }, {}, never, never, true, never>;
27
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgxsFormDirective, "[ngxsForm]", never, { "path": { "alias": "ngxsForm"; "required": false; }; "debounce": { "alias": "ngxsFormDebounce"; "required": false; }; "clearDestroy": { "alias": "ngxsFormClearOnDestroy"; "required": false; }; }, {}, never, never, true, never>;
28
28
  }
@@ -1,61 +0,0 @@
1
- export class UpdateFormStatus {
2
- constructor(payload) {
3
- this.payload = payload;
4
- }
5
- }
6
- UpdateFormStatus.type = '[Forms] Update Form Status';
7
- export class UpdateFormValue {
8
- constructor(payload) {
9
- this.payload = payload;
10
- }
11
- }
12
- UpdateFormValue.type = '[Forms] Update Form Value';
13
- export class UpdateForm {
14
- constructor(payload) {
15
- this.payload = payload;
16
- }
17
- }
18
- UpdateForm.type = '[Forms] Update Form';
19
- export class UpdateFormDirty {
20
- constructor(payload) {
21
- this.payload = payload;
22
- }
23
- }
24
- UpdateFormDirty.type = '[Forms] Update Form Dirty';
25
- export class SetFormDirty {
26
- constructor(payload) {
27
- this.payload = payload;
28
- }
29
- }
30
- SetFormDirty.type = '[Forms] Set Form Dirty';
31
- export class SetFormPristine {
32
- constructor(payload) {
33
- this.payload = payload;
34
- }
35
- }
36
- SetFormPristine.type = '[Forms] Set Form Pristine';
37
- export class UpdateFormErrors {
38
- constructor(payload) {
39
- this.payload = payload;
40
- }
41
- }
42
- UpdateFormErrors.type = '[Forms] Update Form Errors';
43
- export class SetFormDisabled {
44
- constructor(payload) {
45
- this.payload = payload;
46
- }
47
- }
48
- SetFormDisabled.type = '[Forms] Set Form Disabled';
49
- export class SetFormEnabled {
50
- constructor(payload) {
51
- this.payload = payload;
52
- }
53
- }
54
- SetFormEnabled.type = '[Forms] Set Form Enabled';
55
- export class ResetForm {
56
- constructor(payload) {
57
- this.payload = payload;
58
- }
59
- }
60
- ResetForm.type = '[Forms] Reset Form';
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2Zvcm0tcGx1Z2luL3NyYy9hY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFDUyxPQUdOO1FBSE0sWUFBTyxHQUFQLE9BQU8sQ0FHYjtJQUNBLENBQUM7O0FBUFkscUJBQUksR0FBRyw0QkFBNEIsQ0FBQztBQVV0RCxNQUFNLE9BQU8sZUFBZTtJQUcxQixZQUFtQixPQUE0RDtRQUE1RCxZQUFPLEdBQVAsT0FBTyxDQUFxRDtJQUFHLENBQUM7O0FBRm5FLG9CQUFJLEdBQUcsMkJBQTJCLENBQUM7QUFLckQsTUFBTSxPQUFPLFVBQVU7SUFHckIsWUFDUyxPQU1OO1FBTk0sWUFBTyxHQUFQLE9BQU8sQ0FNYjtJQUNBLENBQUM7O0FBVlksZUFBSSxHQUFHLHFCQUFxQixDQUFDO0FBYS9DLE1BQU0sT0FBTyxlQUFlO0lBRzFCLFlBQW1CLE9BQWdEO1FBQWhELFlBQU8sR0FBUCxPQUFPLENBQXlDO0lBQUcsQ0FBQzs7QUFGdkQsb0JBQUksR0FBRywyQkFBMkIsQ0FBQztBQUtyRCxNQUFNLE9BQU8sWUFBWTtJQUd2QixZQUFtQixPQUFlO1FBQWYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQUFHLENBQUM7O0FBRnRCLGlCQUFJLEdBQUcsd0JBQXdCLENBQUM7QUFLbEQsTUFBTSxPQUFPLGVBQWU7SUFHMUIsWUFBbUIsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFBRyxDQUFDOztBQUZ0QixvQkFBSSxHQUFHLDJCQUEyQixDQUFDO0FBS3JELE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFBbUIsT0FBaUU7UUFBakUsWUFBTyxHQUFQLE9BQU8sQ0FBMEQ7SUFBRyxDQUFDOztBQUZ4RSxxQkFBSSxHQUFHLDRCQUE0QixDQUFDO0FBS3RELE1BQU0sT0FBTyxlQUFlO0lBRzFCLFlBQW1CLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO0lBQUcsQ0FBQzs7QUFGdEIsb0JBQUksR0FBRywyQkFBMkIsQ0FBQztBQUtyRCxNQUFNLE9BQU8sY0FBYztJQUd6QixZQUFtQixPQUFlO1FBQWYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQUFHLENBQUM7O0FBRnRCLG1CQUFJLEdBQUcsMEJBQTBCLENBQUM7QUFLcEQsTUFBTSxPQUFPLFNBQVM7SUFHcEIsWUFBbUIsT0FBc0M7UUFBdEMsWUFBTyxHQUFQLE9BQU8sQ0FBK0I7SUFBRyxDQUFDOztBQUY3QyxjQUFJLEdBQUcsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgVXBkYXRlRm9ybVN0YXR1cyB7XG4gIHN0YXRpYyByZWFkb25seSB0eXBlID0gJ1tGb3Jtc10gVXBkYXRlIEZvcm0gU3RhdHVzJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcGF5bG9hZDoge1xuICAgICAgc3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgICAgcGF0aDogc3RyaW5nO1xuICAgIH1cbiAgKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlRm9ybVZhbHVlIHtcbiAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW0Zvcm1zXSBVcGRhdGUgRm9ybSBWYWx1ZSc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHBheWxvYWQ6IHsgdmFsdWU6IGFueTsgcGF0aDogc3RyaW5nOyBwcm9wZXJ0eVBhdGg/OiBzdHJpbmcgfSkge31cbn1cblxuZXhwb3J0IGNsYXNzIFVwZGF0ZUZvcm0ge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbRm9ybXNdIFVwZGF0ZSBGb3JtJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcGF5bG9hZDoge1xuICAgICAgdmFsdWU6IGFueTtcbiAgICAgIGVycm9yczogeyBbazogc3RyaW5nXTogc3RyaW5nIH0gfCBudWxsO1xuICAgICAgZGlydHk6IGJvb2xlYW4gfCBudWxsO1xuICAgICAgc3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgICAgcGF0aDogc3RyaW5nO1xuICAgIH1cbiAgKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlRm9ybURpcnR5IHtcbiAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW0Zvcm1zXSBVcGRhdGUgRm9ybSBEaXJ0eSc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHBheWxvYWQ6IHsgZGlydHk6IGJvb2xlYW4gfCBudWxsOyBwYXRoOiBzdHJpbmcgfSkge31cbn1cblxuZXhwb3J0IGNsYXNzIFNldEZvcm1EaXJ0eSB7XG4gIHN0YXRpYyByZWFkb25seSB0eXBlID0gJ1tGb3Jtc10gU2V0IEZvcm0gRGlydHknO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXlsb2FkOiBzdHJpbmcpIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRGb3JtUHJpc3RpbmUge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbRm9ybXNdIFNldCBGb3JtIFByaXN0aW5lJztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGF5bG9hZDogc3RyaW5nKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlRm9ybUVycm9ycyB7XG4gIHN0YXRpYyByZWFkb25seSB0eXBlID0gJ1tGb3Jtc10gVXBkYXRlIEZvcm0gRXJyb3JzJztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGF5bG9hZDogeyBlcnJvcnM6IHsgW2s6IHN0cmluZ106IHN0cmluZyB9IHwgbnVsbDsgcGF0aDogc3RyaW5nIH0pIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRGb3JtRGlzYWJsZWQge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbRm9ybXNdIFNldCBGb3JtIERpc2FibGVkJztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGF5bG9hZDogc3RyaW5nKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgU2V0Rm9ybUVuYWJsZWQge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbRm9ybXNdIFNldCBGb3JtIEVuYWJsZWQnO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXlsb2FkOiBzdHJpbmcpIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNldEZvcm0ge1xuICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbRm9ybXNdIFJlc2V0IEZvcm0nO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXlsb2FkOiB7IHBhdGg6IHN0cmluZzsgdmFsdWU/OiBhbnkgfSkge31cbn1cbiJdfQ==
@@ -1,176 +0,0 @@
1
- import { ChangeDetectorRef, Directive, Input } from '@angular/core';
2
- import { FormGroupDirective } from '@angular/forms';
3
- import { Actions, getValue, ofActionDispatched, Store } from '@ngxs/store';
4
- import { ReplaySubject } from 'rxjs';
5
- import { debounceTime, distinctUntilChanged, filter, takeUntil } from 'rxjs/operators';
6
- import { ResetForm, UpdateForm, UpdateFormDirty, UpdateFormErrors, UpdateFormStatus, UpdateFormValue } from './actions';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@ngxs/store";
9
- import * as i2 from "@angular/forms";
10
- export class NgxsFormDirective {
11
- constructor(_actions$, _store, _formGroupDirective, _cd) {
12
- this._actions$ = _actions$;
13
- this._store = _store;
14
- this._formGroupDirective = _formGroupDirective;
15
- this._cd = _cd;
16
- this.path = null;
17
- this._debounce = 100;
18
- this._clearDestroy = false;
19
- this._updating = false;
20
- this._destroy$ = new ReplaySubject(1);
21
- }
22
- set debounce(debounce) {
23
- this._debounce = Number(debounce);
24
- }
25
- get debounce() {
26
- return this._debounce;
27
- }
28
- set clearDestroy(val) {
29
- this._clearDestroy = val != null && `${val}` !== 'false';
30
- }
31
- get clearDestroy() {
32
- return this._clearDestroy;
33
- }
34
- ngOnInit() {
35
- this._actions$
36
- .pipe(ofActionDispatched(ResetForm), filter((action) => action.payload.path === this.path), takeUntil(this._destroy$))
37
- .subscribe(({ payload: { value } }) => {
38
- this.form.reset(value);
39
- this.updateFormStateWithRawValue(true);
40
- this._cd.markForCheck();
41
- });
42
- this.getStateStream(`${this.path}.model`).subscribe(model => {
43
- if (this._updating || !model) {
44
- return;
45
- }
46
- this.form.patchValue(model);
47
- this._cd.markForCheck();
48
- });
49
- this.getStateStream(`${this.path}.dirty`).subscribe(dirty => {
50
- if (this.form.dirty === dirty || typeof dirty !== 'boolean') {
51
- return;
52
- }
53
- if (dirty) {
54
- this.form.markAsDirty();
55
- }
56
- else {
57
- this.form.markAsPristine();
58
- }
59
- this._cd.markForCheck();
60
- });
61
- // On first state change, sync form model, status and dirty with state
62
- this._store
63
- .selectOnce(state => getValue(state, this.path))
64
- .subscribe(() => {
65
- this._store.dispatch([
66
- new UpdateFormValue({
67
- path: this.path,
68
- value: this.form.getRawValue()
69
- }),
70
- new UpdateFormStatus({
71
- path: this.path,
72
- status: this.form.status
73
- }),
74
- new UpdateFormDirty({
75
- path: this.path,
76
- dirty: this.form.dirty
77
- })
78
- ]);
79
- });
80
- this.getStateStream(`${this.path}.disabled`).subscribe(disabled => {
81
- if (this.form.disabled === disabled || typeof disabled !== 'boolean') {
82
- return;
83
- }
84
- if (disabled) {
85
- this.form.disable();
86
- }
87
- else {
88
- this.form.enable();
89
- }
90
- this._cd.markForCheck();
91
- });
92
- this._formGroupDirective
93
- .valueChanges.pipe(distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)), this.debounceChange())
94
- .subscribe(() => {
95
- this.updateFormStateWithRawValue();
96
- });
97
- this._formGroupDirective
98
- .statusChanges.pipe(distinctUntilChanged(), this.debounceChange())
99
- .subscribe((status) => {
100
- this._store.dispatch(new UpdateFormStatus({
101
- status,
102
- path: this.path
103
- }));
104
- });
105
- }
106
- updateFormStateWithRawValue(withFormStatus) {
107
- if (this._updating)
108
- return;
109
- const value = this._formGroupDirective.control.getRawValue();
110
- const actions = [
111
- new UpdateFormValue({
112
- path: this.path,
113
- value
114
- }),
115
- new UpdateFormDirty({
116
- path: this.path,
117
- dirty: this._formGroupDirective.dirty
118
- }),
119
- new UpdateFormErrors({
120
- path: this.path,
121
- errors: this._formGroupDirective.errors
122
- })
123
- ];
124
- if (withFormStatus) {
125
- actions.push(new UpdateFormStatus({
126
- path: this.path,
127
- status: this._formGroupDirective.status
128
- }));
129
- }
130
- this._updating = true;
131
- this._store.dispatch(actions).subscribe({
132
- error: () => (this._updating = false),
133
- complete: () => (this._updating = false)
134
- });
135
- }
136
- ngOnDestroy() {
137
- this._destroy$.next();
138
- if (this.clearDestroy) {
139
- this._store.dispatch(new UpdateForm({
140
- path: this.path,
141
- value: null,
142
- dirty: null,
143
- status: null,
144
- errors: null
145
- }));
146
- }
147
- }
148
- debounceChange() {
149
- const skipDebounceTime = this._formGroupDirective.control.updateOn !== 'change' || this._debounce < 0;
150
- return skipDebounceTime
151
- ? (change) => change.pipe(takeUntil(this._destroy$))
152
- : (change) => change.pipe(debounceTime(this._debounce), takeUntil(this._destroy$));
153
- }
154
- get form() {
155
- return this._formGroupDirective.form;
156
- }
157
- getStateStream(path) {
158
- return this._store.select(state => getValue(state, path)).pipe(takeUntil(this._destroy$));
159
- }
160
- }
161
- /** @nocollapse */ NgxsFormDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsFormDirective, deps: [{ token: i1.Actions }, { token: i1.Store }, { token: i2.FormGroupDirective }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
162
- /** @nocollapse */ NgxsFormDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.4", type: NgxsFormDirective, isStandalone: true, selector: "[ngxsForm]", inputs: { path: ["ngxsForm", "path"], debounce: ["ngxsFormDebounce", "debounce"], clearDestroy: ["ngxsFormClearOnDestroy", "clearDestroy"] }, ngImport: i0 });
163
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsFormDirective, decorators: [{
164
- type: Directive,
165
- args: [{ selector: '[ngxsForm]', standalone: true }]
166
- }], ctorParameters: function () { return [{ type: i1.Actions }, { type: i1.Store }, { type: i2.FormGroupDirective }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { path: [{
167
- type: Input,
168
- args: ['ngxsForm']
169
- }], debounce: [{
170
- type: Input,
171
- args: ['ngxsFormDebounce']
172
- }], clearDestroy: [{
173
- type: Input,
174
- args: ['ngxsFormClearOnDestroy']
175
- }] } });
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZm9ybS1wbHVnaW4vc3JjL2RpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFhLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBYyxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNoQixNQUFNLFdBQVcsQ0FBQzs7OztBQUduQixNQUFNLE9BQU8saUJBQWlCO0lBMEI1QixZQUNVLFNBQWtCLEVBQ2xCLE1BQWEsRUFDYixtQkFBdUMsRUFDdkMsR0FBc0I7UUFIdEIsY0FBUyxHQUFULFNBQVMsQ0FBUztRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFPO1FBQ2Isd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFvQjtRQUN2QyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTVCaEMsU0FBSSxHQUFXLElBQUssQ0FBQztRQVNiLGNBQVMsR0FBRyxHQUFHLENBQUM7UUFTaEIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFdEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVULGNBQVMsR0FBRyxJQUFJLGFBQWEsQ0FBTyxDQUFDLENBQUMsQ0FBQztJQU9yRCxDQUFDO0lBM0JKLElBQ0ksUUFBUSxD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SSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDOztpSUFoTVUsaUJBQWlCO3FIQUFqQixpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFEN0IsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTttTEFHckQsSUFBSTtzQkFESCxLQUFLO3VCQUFDLFVBQVU7Z0JBSWIsUUFBUTtzQkFEWCxLQUFLO3VCQUFDLGtCQUFrQjtnQkFVckIsWUFBWTtzQkFEZixLQUFLO3VCQUFDLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBEaXJlY3RpdmUsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtR3JvdXBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3Rpb25zLCBnZXRWYWx1ZSwgb2ZBY3Rpb25EaXNwYXRjaGVkLCBTdG9yZSB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgUmVzZXRGb3JtLFxuICBVcGRhdGVGb3JtLFxuICBVcGRhdGVGb3JtRGlydHksXG4gIFVwZGF0ZUZvcm1FcnJvcnMsXG4gIFVwZGF0ZUZvcm1TdGF0dXMsXG4gIFVwZGF0ZUZvcm1WYWx1ZVxufSBmcm9tICcuL2FjdGlvbnMnO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmd4c0Zvcm1dJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIE5neHNGb3JtRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoJ25neHNGb3JtJylcbiAgcGF0aDogc3RyaW5nID0gbnVsbCE7XG5cbiAgQElucHV0KCduZ3hzRm9ybURlYm91bmNlJylcbiAgc2V0IGRlYm91bmNlKGRlYm91bmNlOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICB0aGlzLl9kZWJvdW5jZSA9IE51bWJlcihkZWJvdW5jZSk7XG4gIH1cbiAgZ2V0IGRlYm91bmNlKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZTtcbiAgfVxuICBwcml2YXRlIF9kZWJvdW5jZSA9IDEwMDtcblxuICBASW5wdXQoJ25neHNGb3JtQ2xlYXJPbkRlc3Ryb3knKVxuICBzZXQgY2xlYXJEZXN0cm95KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuX2NsZWFyRGVzdHJveSA9IHZhbCAhPSBudWxsICYmIGAke3ZhbH1gICE9PSAnZmFsc2UnO1xuICB9XG4gIGdldCBjbGVhckRlc3Ryb3koKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsZWFyRGVzdHJveTtcbiAgfVxuICBwcml2YXRlIF9jbGVhckRlc3Ryb3kgPSBmYWxzZTtcblxuICBwcml2YXRlIF91cGRhdGluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kkID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfYWN0aW9ucyQ6IEFjdGlvbnMsXG4gICAgcHJpdmF0ZSBfc3RvcmU6IFN0b3JlLFxuICAgIHByaXZhdGUgX2Zvcm1Hcm91cERpcmVjdGl2ZTogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fYWN0aW9ucyRcbiAgICAgIC5waXBlKFxuICAgICAgICBvZkFjdGlvbkRpc3BhdGNoZWQoUmVzZXRGb3JtKSxcbiAgICAgICAgZmlsdGVyKChhY3Rpb246IFJlc2V0Rm9ybSkgPT4gYWN0aW9uLnBheWxvYWQucGF0aCA9PT0gdGhpcy5wYXRoKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoeyBwYXlsb2FkOiB7IHZhbHVlIH0gfTogUmVzZXRGb3JtKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybS5yZXNldCh2YWx1ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybVN0YXRlV2l0aFJhd1ZhbHVlKHRydWUpO1xuICAgICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5nZXRTdGF0ZVN0cmVhbShgJHt0aGlzLnBhdGh9Lm1vZGVsYCkuc3Vic2NyaWJlKG1vZGVsID0+IHtcbiAgICAgIGlmICh0aGlzLl91cGRhdGluZyB8fCAhbW9kZWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShtb2RlbCk7XG4gICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZ2V0U3RhdGVTdHJlYW0oYCR7dGhpcy5wYXRofS5kaXJ0eWApLnN1YnNjcmliZShkaXJ0eSA9PiB7XG4gICAgICBpZiAodGhpcy5mb3JtLmRpcnR5ID09PSBkaXJ0eSB8fCB0eXBlb2YgZGlydHkgIT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJ0eSkge1xuICAgICAgICB0aGlzLmZvcm0ubWFya0FzRGlydHkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIC8vIE9uIGZpcnN0IHN0YXRlIGNoYW5nZSwgc3luYyBmb3JtIG1vZGVsLCBzdGF0dXMgYW5kIGRpcnR5IHdpdGggc3RhdGVcbiAgICB0aGlzLl9zdG9yZVxuICAgICAgLnNlbGVjdE9uY2Uoc3RhdGUgPT4gZ2V0VmFsdWUoc3RhdGUsIHRoaXMucGF0aCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goW1xuICAgICAgICAgIG5ldyBVcGRhdGVGb3JtVmFsdWUoe1xuICAgICAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbmV3IFVwZGF0ZUZvcm1TdGF0dXMoe1xuICAgICAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLmZvcm0uc3RhdHVzXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbmV3IFVwZGF0ZUZvcm1EaXJ0eSh7XG4gICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGgsXG4gICAgICAgICAgICBkaXJ0eTogdGhpcy5mb3JtLmRpcnR5XG4gICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZ2V0U3RhdGVTdHJlYW0oYCR7dGhpcy5wYXRofS5kaXNhYmxlZGApLnN1YnNjcmliZShkaXNhYmxlZCA9PiB7XG4gICAgICBpZiAodGhpcy5mb3JtLmRpc2FibGVkID09PSBkaXNhYmxlZCB8fCB0eXBlb2YgZGlzYWJsZWQgIT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmZvcm0uZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtLmVuYWJsZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2Zvcm1Hcm91cERpcmVjdGl2ZVxuICAgICAgLnZhbHVlQ2hhbmdlcyEucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IEpTT04uc3RyaW5naWZ5KGEpID09PSBKU09OLnN0cmluZ2lmeShiKSksXG4gICAgICAgIHRoaXMuZGVib3VuY2VDaGFuZ2UoKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybVN0YXRlV2l0aFJhd1ZhbHVlKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2Zvcm1Hcm91cERpcmVjdGl2ZVxuICAgICAgLnN0YXR1c0NoYW5nZXMhLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGhpcy5kZWJvdW5jZUNoYW5nZSgpKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdHVzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgICAgbmV3IFVwZGF0ZUZvcm1TdGF0dXMoe1xuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgcGF0aDogdGhpcy5wYXRoXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlRm9ybVN0YXRlV2l0aFJhd1ZhbHVlKHdpdGhGb3JtU3RhdHVzPzogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl91cGRhdGluZykgcmV0dXJuO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9mb3JtR3JvdXBEaXJlY3RpdmUuY29udHJvbC5nZXRSYXdWYWx1ZSgpO1xuXG4gICAgY29uc3QgYWN0aW9uczogYW55W10gPSBbXG4gICAgICBuZXcgVXBkYXRlRm9ybVZhbHVlKHtcbiAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSksXG4gICAgICBuZXcgVXBkYXRlRm9ybURpcnR5KHtcbiAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICBkaXJ0eTogdGhpcy5fZm9ybUdyb3VwRGlyZWN0aXZlLmRpcnR5XG4gICAgICB9KSxcbiAgICAgIG5ldyBVcGRhdGVGb3JtRXJyb3JzKHtcbiAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICBlcnJvcnM6IHRoaXMuX2Zvcm1Hcm91cERpcmVjdGl2ZS5lcnJvcnNcbiAgICAgIH0pXG4gICAgXTtcblxuICAgIGlmICh3aXRoRm9ybVN0YXR1cykge1xuICAgICAgYWN0aW9ucy5wdXNoKFxuICAgICAgICBuZXcgVXBkYXRlRm9ybVN0YXR1cyh7XG4gICAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICAgIHN0YXR1czogdGhpcy5fZm9ybUdyb3VwRGlyZWN0aXZlLnN0YXR1c1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGluZyA9IHRydWU7XG4gICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goYWN0aW9ucykuc3Vic2NyaWJlKHtcbiAgICAgIGVycm9yOiAoKSA9PiAodGhpcy5fdXBkYXRpbmcgPSBmYWxzZSksXG4gICAgICBjb21wbGV0ZTogKCkgPT4gKHRoaXMuX3VwZGF0aW5nID0gZmFsc2UpXG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG5cbiAgICBpZiAodGhpcy5jbGVhckRlc3Ryb3kpIHtcbiAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKFxuICAgICAgICBuZXcgVXBkYXRlRm9ybSh7XG4gICAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgIGRpcnR5OiBudWxsLFxuICAgICAgICAgIHN0YXR1czogbnVsbCxcbiAgICAgICAgICBlcnJvcnM6IG51bGxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZWJvdW5jZUNoYW5nZSgpIHtcbiAgICBjb25zdCBza2lwRGVib3VuY2VUaW1lID1cbiAgICAgIHRoaXMuX2Zvcm1Hcm91cERpcmVjdGl2ZS5jb250cm9sLnVwZGF0ZU9uICE9PSAnY2hhbmdlJyB8fCB0aGlzLl9kZWJvdW5jZSA8IDA7XG5cbiAgICByZXR1cm4gc2tpcERlYm91bmNlVGltZVxuICAgICAgPyAoY2hhbmdlOiBPYnNlcnZhYmxlPGFueT4pID0+IGNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICA6IChjaGFuZ2U6IE9ic2VydmFibGU8YW55PikgPT5cbiAgICAgICAgICBjaGFuZ2UucGlwZShkZWJvdW5jZVRpbWUodGhpcy5fZGVib3VuY2UpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGZvcm0oKTogRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybUdyb3VwRGlyZWN0aXZlLmZvcm07XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXRlU3RyZWFtKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5zZWxlY3Qoc3RhdGUgPT4gZ2V0VmFsdWUoc3RhdGUsIHBhdGgpKS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpO1xuICB9XG59XG4iXX0=
@@ -1,331 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { Injectable, Directive, Input, NgModule, makeEnvironmentProviders } from '@angular/core';
3
- import * as i1 from '@ngxs/store';
4
- import { getActionTypeFromInstance, setValue, getValue, ofActionDispatched, NGXS_PLUGINS, withNgxsPlugin } from '@ngxs/store';
5
- import { ReplaySubject } from 'rxjs';
6
- import { filter, takeUntil, distinctUntilChanged, debounceTime } from 'rxjs/operators';
7
- import * as i2 from '@angular/forms';
8
-
9
- class UpdateFormStatus {
10
- constructor(payload) {
11
- this.payload = payload;
12
- }
13
- }
14
- UpdateFormStatus.type = '[Forms] Update Form Status';
15
- class UpdateFormValue {
16
- constructor(payload) {
17
- this.payload = payload;
18
- }
19
- }
20
- UpdateFormValue.type = '[Forms] Update Form Value';
21
- class UpdateForm {
22
- constructor(payload) {
23
- this.payload = payload;
24
- }
25
- }
26
- UpdateForm.type = '[Forms] Update Form';
27
- class UpdateFormDirty {
28
- constructor(payload) {
29
- this.payload = payload;
30
- }
31
- }
32
- UpdateFormDirty.type = '[Forms] Update Form Dirty';
33
- class SetFormDirty {
34
- constructor(payload) {
35
- this.payload = payload;
36
- }
37
- }
38
- SetFormDirty.type = '[Forms] Set Form Dirty';
39
- class SetFormPristine {
40
- constructor(payload) {
41
- this.payload = payload;
42
- }
43
- }
44
- SetFormPristine.type = '[Forms] Set Form Pristine';
45
- class UpdateFormErrors {
46
- constructor(payload) {
47
- this.payload = payload;
48
- }
49
- }
50
- UpdateFormErrors.type = '[Forms] Update Form Errors';
51
- class SetFormDisabled {
52
- constructor(payload) {
53
- this.payload = payload;
54
- }
55
- }
56
- SetFormDisabled.type = '[Forms] Set Form Disabled';
57
- class SetFormEnabled {
58
- constructor(payload) {
59
- this.payload = payload;
60
- }
61
- }
62
- SetFormEnabled.type = '[Forms] Set Form Enabled';
63
- class ResetForm {
64
- constructor(payload) {
65
- this.payload = payload;
66
- }
67
- }
68
- ResetForm.type = '[Forms] Reset Form';
69
-
70
- class NgxsFormPlugin {
71
- handle(state, event, next) {
72
- const type = getActionTypeFromInstance(event);
73
- let nextState = state;
74
- if (type === UpdateFormValue.type || type === UpdateForm.type || type === ResetForm.type) {
75
- const { value } = event.payload;
76
- const payloadValue = Array.isArray(value)
77
- ? value.slice()
78
- : isObjectLike(value)
79
- ? Object.assign({}, value) : value;
80
- const path = this.joinPathWithPropertyPath(event);
81
- nextState = setValue(nextState, path, payloadValue);
82
- }
83
- if (type === ResetForm.type) {
84
- const model = getValue(nextState, `${event.payload.path}.model`);
85
- nextState = setValue(nextState, `${event.payload.path}`, { model: model });
86
- }
87
- if (type === UpdateFormStatus.type || type === UpdateForm.type) {
88
- nextState = setValue(nextState, `${event.payload.path}.status`, event.payload.status);
89
- }
90
- if (type === UpdateFormErrors.type || type === UpdateForm.type) {
91
- nextState = setValue(nextState, `${event.payload.path}.errors`, Object.assign({}, event.payload.errors));
92
- }
93
- if (type === UpdateFormDirty.type || type === UpdateForm.type) {
94
- nextState = setValue(nextState, `${event.payload.path}.dirty`, event.payload.dirty);
95
- }
96
- if (type === SetFormDirty.type) {
97
- nextState = setValue(nextState, `${event.payload}.dirty`, true);
98
- }
99
- if (type === SetFormPristine.type) {
100
- nextState = setValue(nextState, `${event.payload}.dirty`, false);
101
- }
102
- if (type === SetFormDisabled.type) {
103
- nextState = setValue(nextState, `${event.payload}.disabled`, true);
104
- }
105
- if (type === SetFormEnabled.type) {
106
- nextState = setValue(nextState, `${event.payload}.disabled`, false);
107
- }
108
- return next(nextState, event);
109
- }
110
- joinPathWithPropertyPath({ payload }) {
111
- let path = `${payload.path}.model`;
112
- if (payload.propertyPath) {
113
- path += `.${payload.propertyPath}`;
114
- }
115
- return path;
116
- }
117
- }
118
- /** @nocollapse */ NgxsFormPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsFormPlugin, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
119
- /** @nocollapse */ NgxsFormPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsFormPlugin });
120
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsFormPlugin, decorators: [{
121
- type: Injectable
122
- }] });
123
- function isObjectLike(target) {
124
- return target !== null && typeof target === 'object';
125
- }
126
-
127
- class NgxsFormDirective {
128
- constructor(_actions$, _store, _formGroupDirective, _cd) {
129
- this._actions$ = _actions$;
130
- this._store = _store;
131
- this._formGroupDirective = _formGroupDirective;
132
- this._cd = _cd;
133
- this.path = null;
134
- this._debounce = 100;
135
- this._clearDestroy = false;
136
- this._updating = false;
137
- this._destroy$ = new ReplaySubject(1);
138
- }
139
- set debounce(debounce) {
140
- this._debounce = Number(debounce);
141
- }
142
- get debounce() {
143
- return this._debounce;
144
- }
145
- set clearDestroy(val) {
146
- this._clearDestroy = val != null && `${val}` !== 'false';
147
- }
148
- get clearDestroy() {
149
- return this._clearDestroy;
150
- }
151
- ngOnInit() {
152
- this._actions$
153
- .pipe(ofActionDispatched(ResetForm), filter((action) => action.payload.path === this.path), takeUntil(this._destroy$))
154
- .subscribe(({ payload: { value } }) => {
155
- this.form.reset(value);
156
- this.updateFormStateWithRawValue(true);
157
- this._cd.markForCheck();
158
- });
159
- this.getStateStream(`${this.path}.model`).subscribe(model => {
160
- if (this._updating || !model) {
161
- return;
162
- }
163
- this.form.patchValue(model);
164
- this._cd.markForCheck();
165
- });
166
- this.getStateStream(`${this.path}.dirty`).subscribe(dirty => {
167
- if (this.form.dirty === dirty || typeof dirty !== 'boolean') {
168
- return;
169
- }
170
- if (dirty) {
171
- this.form.markAsDirty();
172
- }
173
- else {
174
- this.form.markAsPristine();
175
- }
176
- this._cd.markForCheck();
177
- });
178
- // On first state change, sync form model, status and dirty with state
179
- this._store
180
- .selectOnce(state => getValue(state, this.path))
181
- .subscribe(() => {
182
- this._store.dispatch([
183
- new UpdateFormValue({
184
- path: this.path,
185
- value: this.form.getRawValue()
186
- }),
187
- new UpdateFormStatus({
188
- path: this.path,
189
- status: this.form.status
190
- }),
191
- new UpdateFormDirty({
192
- path: this.path,
193
- dirty: this.form.dirty
194
- })
195
- ]);
196
- });
197
- this.getStateStream(`${this.path}.disabled`).subscribe(disabled => {
198
- if (this.form.disabled === disabled || typeof disabled !== 'boolean') {
199
- return;
200
- }
201
- if (disabled) {
202
- this.form.disable();
203
- }
204
- else {
205
- this.form.enable();
206
- }
207
- this._cd.markForCheck();
208
- });
209
- this._formGroupDirective
210
- .valueChanges.pipe(distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)), this.debounceChange())
211
- .subscribe(() => {
212
- this.updateFormStateWithRawValue();
213
- });
214
- this._formGroupDirective
215
- .statusChanges.pipe(distinctUntilChanged(), this.debounceChange())
216
- .subscribe((status) => {
217
- this._store.dispatch(new UpdateFormStatus({
218
- status,
219
- path: this.path
220
- }));
221
- });
222
- }
223
- updateFormStateWithRawValue(withFormStatus) {
224
- if (this._updating)
225
- return;
226
- const value = this._formGroupDirective.control.getRawValue();
227
- const actions = [
228
- new UpdateFormValue({
229
- path: this.path,
230
- value
231
- }),
232
- new UpdateFormDirty({
233
- path: this.path,
234
- dirty: this._formGroupDirective.dirty
235
- }),
236
- new UpdateFormErrors({
237
- path: this.path,
238
- errors: this._formGroupDirective.errors
239
- })
240
- ];
241
- if (withFormStatus) {
242
- actions.push(new UpdateFormStatus({
243
- path: this.path,
244
- status: this._formGroupDirective.status
245
- }));
246
- }
247
- this._updating = true;
248
- this._store.dispatch(actions).subscribe({
249
- error: () => (this._updating = false),
250
- complete: () => (this._updating = false)
251
- });
252
- }
253
- ngOnDestroy() {
254
- this._destroy$.next();
255
- if (this.clearDestroy) {
256
- this._store.dispatch(new UpdateForm({
257
- path: this.path,
258
- value: null,
259
- dirty: null,
260
- status: null,
261
- errors: null
262
- }));
263
- }
264
- }
265
- debounceChange() {
266
- const skipDebounceTime = this._formGroupDirective.control.updateOn !== 'change' || this._debounce < 0;
267
- return skipDebounceTime
268
- ? (change) => change.pipe(takeUntil(this._destroy$))
269
- : (change) => change.pipe(debounceTime(this._debounce), takeUntil(this._destroy$));
270
- }
271
- get form() {
272
- return this._formGroupDirective.form;
273
- }
274
- getStateStream(path) {
275
- return this._store.select(state => getValue(state, path)).pipe(takeUntil(this._destroy$));
276
- }
277
- }
278
- /** @nocollapse */ NgxsFormDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsFormDirective, deps: [{ token: i1.Actions }, { token: i1.Store }, { token: i2.FormGroupDirective }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
279
- /** @nocollapse */ NgxsFormDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.4", type: NgxsFormDirective, isStandalone: true, selector: "[ngxsForm]", inputs: { path: ["ngxsForm", "path"], debounce: ["ngxsFormDebounce", "debounce"], clearDestroy: ["ngxsFormClearOnDestroy", "clearDestroy"] }, ngImport: i0 });
280
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsFormDirective, decorators: [{
281
- type: Directive,
282
- args: [{ selector: '[ngxsForm]', standalone: true }]
283
- }], ctorParameters: function () { return [{ type: i1.Actions }, { type: i1.Store }, { type: i2.FormGroupDirective }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { path: [{
284
- type: Input,
285
- args: ['ngxsForm']
286
- }], debounce: [{
287
- type: Input,
288
- args: ['ngxsFormDebounce']
289
- }], clearDestroy: [{
290
- type: Input,
291
- args: ['ngxsFormClearOnDestroy']
292
- }] } });
293
-
294
- class NgxsFormPluginModule {
295
- static forRoot() {
296
- return {
297
- ngModule: NgxsFormPluginModule,
298
- providers: [
299
- {
300
- provide: NGXS_PLUGINS,
301
- useClass: NgxsFormPlugin,
302
- multi: true
303
- }
304
- ]
305
- };
306
- }
307
- }
308
- /** @nocollapse */ NgxsFormPluginModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsFormPluginModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
309
- /** @nocollapse */ NgxsFormPluginModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.4", ngImport: i0, type: NgxsFormPluginModule, imports: [NgxsFormDirective], exports: [NgxsFormDirective] });
310
- /** @nocollapse */ NgxsFormPluginModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsFormPluginModule });
311
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: NgxsFormPluginModule, decorators: [{
312
- type: NgModule,
313
- args: [{
314
- imports: [NgxsFormDirective],
315
- exports: [NgxsFormDirective]
316
- }]
317
- }] });
318
- function withNgxsFormPlugin() {
319
- return makeEnvironmentProviders([withNgxsPlugin(NgxsFormPlugin)]);
320
- }
321
-
322
- /**
323
- * The public api for consumers of @ngxs/form-plugin
324
- */
325
-
326
- /**
327
- * Generated bundle index. Do not edit.
328
- */
329
-
330
- export { NgxsFormDirective, NgxsFormPlugin, NgxsFormPluginModule, ResetForm, SetFormDirty, SetFormDisabled, SetFormEnabled, SetFormPristine, UpdateForm, UpdateFormDirty, UpdateFormErrors, UpdateFormStatus, UpdateFormValue, withNgxsFormPlugin };
331
- //# sourceMappingURL=ngxs-form-plugin.mjs.map