react-form-manage 1.0.8-beta.14 → 1.0.8-beta.16
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/dist/hooks/useFormItemControl.js +8 -7
- package/dist/providers/Form.d.ts +0 -6
- package/dist/providers/Form.js +1 -13
- package/dist/stores/formStore.js +13 -11
- package/dist/test/TestListener.d.ts +3 -0
- package/dist/test/TestListener.js +17 -0
- package/package.json +1 -1
- package/src/App.tsx +2 -34
- package/src/components/Form/FormItem.tsx +0 -1
- package/src/hooks/useFormItemControl.ts +9 -8
- package/src/index.ts +5 -6
- package/src/providers/Form.tsx +0 -22
- package/src/stores/formStore.ts +280 -278
- package/src/test/TestListener.tsx +21 -0
|
@@ -295,6 +295,14 @@ function useFormItemControl({ formName, form, name, initialValue, formItemId, ru
|
|
|
295
295
|
onReset
|
|
296
296
|
});
|
|
297
297
|
}
|
|
298
|
+
return () => {
|
|
299
|
+
if (listener) {
|
|
300
|
+
setCleanUpStack({
|
|
301
|
+
name: listener.name,
|
|
302
|
+
itemKey: listener.formItemId
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
};
|
|
298
306
|
}, []);
|
|
299
307
|
useEffect(() => {
|
|
300
308
|
if (listener) {
|
|
@@ -317,13 +325,6 @@ function useFormItemControl({ formName, form, name, initialValue, formItemId, ru
|
|
|
317
325
|
onChange(getNewDataFromCache);
|
|
318
326
|
}
|
|
319
327
|
}, [name, formName || (form == null ? void 0 : form.formName) || (contextForm == null ? void 0 : contextForm.formName)]);
|
|
320
|
-
useEffect(() => {
|
|
321
|
-
return () => {
|
|
322
|
-
setCleanUpStack({
|
|
323
|
-
itemKey: formItemId
|
|
324
|
-
});
|
|
325
|
-
};
|
|
326
|
-
}, []);
|
|
327
328
|
useEffect(() => {
|
|
328
329
|
}, [submitState]);
|
|
329
330
|
return {
|
package/dist/providers/Form.d.ts
CHANGED
|
@@ -22,9 +22,6 @@ declare namespace Form {
|
|
|
22
22
|
var useSubmitDataWatch: typeof import("./Form").useSubmitDataWatch;
|
|
23
23
|
var useFormStateWatch: <T = any>(formNameOrFormInstance?: string | PublicFormInstance<T>) => any;
|
|
24
24
|
var useFormItemStateWatch: <T = any>(nameOrFormItemId: string, formNameOrFormInstance?: string | PublicFormInstance<T>) => UseFormItemStateWatchReturn;
|
|
25
|
-
var useWatchFormListeners: <T = any>(formNameOrFormInstance?: string | PublicFormInstance<T>) => {
|
|
26
|
-
listeners: import("../stores/formStore").ListenerItem[];
|
|
27
|
-
};
|
|
28
25
|
}
|
|
29
26
|
export default Form;
|
|
30
27
|
export declare function useFormContext(): any;
|
|
@@ -37,6 +34,3 @@ export declare function useSubmitDataWatch<T = any>({ formNameOrFormInstance, tr
|
|
|
37
34
|
}): T | undefined;
|
|
38
35
|
export declare const useFormStateWatch: <T = any>(formNameOrFormInstance?: string | PublicFormInstance<T>) => any;
|
|
39
36
|
export declare const useFormItemStateWatch: <T = any>(nameOrFormItemId: string, formNameOrFormInstance?: string | PublicFormInstance<T>) => UseFormItemStateWatchReturn;
|
|
40
|
-
export declare const useWatchFormListeners: <T = any>(formNameOrFormInstance?: string | PublicFormInstance<T>) => {
|
|
41
|
-
listeners: import("../stores/formStore").ListenerItem[];
|
|
42
|
-
};
|
package/dist/providers/Form.js
CHANGED
|
@@ -311,22 +311,11 @@ const useFormItemStateWatch = (nameOrFormItemId, formNameOrFormInstance) => {
|
|
|
311
311
|
errors: (listener == null ? void 0 : listener.internalErrors) || []
|
|
312
312
|
};
|
|
313
313
|
};
|
|
314
|
-
const useWatchFormListeners = (formNameOrFormInstance) => {
|
|
315
|
-
const [formInstance] = useForm(formNameOrFormInstance);
|
|
316
|
-
const listeners = useFormStore(useShallow((state) => {
|
|
317
|
-
const allListeners = state.listeners;
|
|
318
|
-
return {
|
|
319
|
-
listeners: allListeners.filter((l) => !isNil(formNameOrFormInstance) ? true : l.formName === (formInstance == null ? void 0 : formInstance.formName))
|
|
320
|
-
};
|
|
321
|
-
}));
|
|
322
|
-
return listeners;
|
|
323
|
-
};
|
|
324
314
|
Form.useForm = useForm;
|
|
325
315
|
Form.useWatch = useWatch;
|
|
326
316
|
Form.useSubmitDataWatch = useSubmitDataWatch;
|
|
327
317
|
Form.useFormStateWatch = useFormStateWatch;
|
|
328
318
|
Form.useFormItemStateWatch = useFormItemStateWatch;
|
|
329
|
-
Form.useWatchFormListeners = useWatchFormListeners;
|
|
330
319
|
export {
|
|
331
320
|
FormContext,
|
|
332
321
|
Form as default,
|
|
@@ -335,6 +324,5 @@ export {
|
|
|
335
324
|
useFormItemStateWatch,
|
|
336
325
|
useFormStateWatch,
|
|
337
326
|
useSubmitDataWatch,
|
|
338
|
-
useWatch
|
|
339
|
-
useWatchFormListeners
|
|
327
|
+
useWatch
|
|
340
328
|
};
|
package/dist/stores/formStore.js
CHANGED
|
@@ -237,17 +237,19 @@ const createListenersSlice = (storeSet, storeGet, api) => ({
|
|
|
237
237
|
}
|
|
238
238
|
return;
|
|
239
239
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
240
|
+
if (name && formName) {
|
|
241
|
+
storeListeners.push({
|
|
242
|
+
name,
|
|
243
|
+
formName,
|
|
244
|
+
isTouched: Boolean(isTouched),
|
|
245
|
+
isDirty: Boolean(isDirty),
|
|
246
|
+
formItemId,
|
|
247
|
+
internalErrors,
|
|
248
|
+
onChange,
|
|
249
|
+
onReset,
|
|
250
|
+
isInitied: Boolean(isInitied)
|
|
251
|
+
});
|
|
252
|
+
}
|
|
251
253
|
}));
|
|
252
254
|
},
|
|
253
255
|
revokeListener(formItemId, onAfterRevoke) {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cloneDeep } from "lodash";
|
|
3
|
+
import { useEffect } from "react";
|
|
4
|
+
import { useShallow } from "zustand/react/shallow";
|
|
5
|
+
import { useFormStore } from "../stores/formStore";
|
|
6
|
+
function TestListener({}) {
|
|
7
|
+
const { listeners } = useFormStore(useShallow((state) => ({
|
|
8
|
+
listeners: state.listeners
|
|
9
|
+
})));
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
}, [listeners]);
|
|
12
|
+
return _jsx("div", { children: "TestListener" });
|
|
13
|
+
}
|
|
14
|
+
var stdin_default = TestListener;
|
|
15
|
+
export {
|
|
16
|
+
stdin_default as default
|
|
17
|
+
};
|
package/package.json
CHANGED
package/src/App.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Checkbox
|
|
1
|
+
import { Checkbox } from "@mui/material";
|
|
2
2
|
import { Button, Input } from "antd";
|
|
3
3
|
import { motion } from "framer-motion";
|
|
4
4
|
import { useEffect } from "react";
|
|
@@ -8,7 +8,6 @@ import InputWrapper from "./components/Form/InputWrapper";
|
|
|
8
8
|
import Form, { useForm } from "./providers/Form";
|
|
9
9
|
|
|
10
10
|
import { Form as AntdForm } from "antd";
|
|
11
|
-
import { useToggle } from "minh-custom-hooks-release";
|
|
12
11
|
|
|
13
12
|
function TestFormWatch() {
|
|
14
13
|
const watchValue = Form.useWatch("numericCode");
|
|
@@ -16,37 +15,9 @@ function TestFormWatch() {
|
|
|
16
15
|
return <div>TestFormWatch</div>;
|
|
17
16
|
}
|
|
18
17
|
|
|
19
|
-
function TestMuiDialog({
|
|
20
|
-
open,
|
|
21
|
-
onClose,
|
|
22
|
-
}: {
|
|
23
|
-
open: boolean;
|
|
24
|
-
onClose: () => void;
|
|
25
|
-
}) {
|
|
26
|
-
return (
|
|
27
|
-
<Dialog open={open} onClose={onClose}>
|
|
28
|
-
<DialogContent>
|
|
29
|
-
{" "}
|
|
30
|
-
<Form
|
|
31
|
-
onFinish={(values) => {
|
|
32
|
-
console.log("Mui Dialog Form Values: ", values);
|
|
33
|
-
}}
|
|
34
|
-
formName="ADD_FORM"
|
|
35
|
-
>
|
|
36
|
-
<FormItem name="oooo">
|
|
37
|
-
<TextField />
|
|
38
|
-
</FormItem>
|
|
39
|
-
|
|
40
|
-
<Button htmlType="submit">Submit</Button>
|
|
41
|
-
</Form>
|
|
42
|
-
</DialogContent>
|
|
43
|
-
</Dialog>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
18
|
const App = () => {
|
|
48
19
|
const [form] = useForm("form1");
|
|
49
|
-
|
|
20
|
+
|
|
50
21
|
const watchCheckBox = Form.useWatch("checkControlledAfterInit", "form1");
|
|
51
22
|
|
|
52
23
|
useEffect(() => {
|
|
@@ -209,9 +180,6 @@ const App = () => {
|
|
|
209
180
|
Reset
|
|
210
181
|
</Button>
|
|
211
182
|
</Form>
|
|
212
|
-
|
|
213
|
-
<Button onClick={toggle}>Toggle Dialog</Button>
|
|
214
|
-
<TestMuiDialog onClose={toggle} open={open} />
|
|
215
183
|
</div>
|
|
216
184
|
);
|
|
217
185
|
};
|
|
@@ -561,6 +561,15 @@ export default function useFormItemControl<T = any>({
|
|
|
561
561
|
});
|
|
562
562
|
}
|
|
563
563
|
|
|
564
|
+
return () => {
|
|
565
|
+
if (listener) {
|
|
566
|
+
setCleanUpStack({
|
|
567
|
+
name: listener.name,
|
|
568
|
+
itemKey: listener.formItemId,
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
};
|
|
572
|
+
|
|
564
573
|
// return () => {
|
|
565
574
|
// console.log("Revoke listener", listener);
|
|
566
575
|
|
|
@@ -596,14 +605,6 @@ export default function useFormItemControl<T = any>({
|
|
|
596
605
|
}
|
|
597
606
|
}, [name, formName || form?.formName || contextForm?.formName]);
|
|
598
607
|
|
|
599
|
-
useEffect(() => {
|
|
600
|
-
return () => {
|
|
601
|
-
setCleanUpStack({
|
|
602
|
-
itemKey: formItemId,
|
|
603
|
-
});
|
|
604
|
-
};
|
|
605
|
-
}, []);
|
|
606
|
-
|
|
607
608
|
useEffect(() => {
|
|
608
609
|
console.log("Submit state changed in useFormItemControl: ", submitState);
|
|
609
610
|
}, [submitState]);
|
package/src/index.ts
CHANGED
|
@@ -18,12 +18,11 @@ import InputWrapper, { type InputWrapperProps } from "./components/Form/InputWra
|
|
|
18
18
|
|
|
19
19
|
import useFormItemControl from "./hooks/useFormItemControl";
|
|
20
20
|
import useFormListControl from "./hooks/useFormListControl";
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
type
|
|
25
|
-
type
|
|
26
|
-
type CleanUpItem
|
|
21
|
+
import {
|
|
22
|
+
useFormStore,
|
|
23
|
+
type FormInstance,
|
|
24
|
+
type ListenerItem,
|
|
25
|
+
type CleanUpItem,
|
|
27
26
|
} from "./stores/formStore";
|
|
28
27
|
|
|
29
28
|
export {
|
package/src/providers/Form.tsx
CHANGED
|
@@ -509,30 +509,8 @@ export const useFormItemStateWatch = <T = any,>(
|
|
|
509
509
|
};
|
|
510
510
|
};
|
|
511
511
|
|
|
512
|
-
export const useWatchFormListeners = <T = any,>(
|
|
513
|
-
formNameOrFormInstance?: string | PublicFormInstance<T>,
|
|
514
|
-
) => {
|
|
515
|
-
const [formInstance] = useForm<T>(formNameOrFormInstance as any);
|
|
516
|
-
|
|
517
|
-
const listeners = useFormStore(
|
|
518
|
-
useShallow((state) => {
|
|
519
|
-
const allListeners = state.listeners;
|
|
520
|
-
return {
|
|
521
|
-
listeners: allListeners.filter((l) =>
|
|
522
|
-
!isNil(formNameOrFormInstance)
|
|
523
|
-
? true
|
|
524
|
-
: l.formName === formInstance?.formName,
|
|
525
|
-
),
|
|
526
|
-
};
|
|
527
|
-
}),
|
|
528
|
-
);
|
|
529
|
-
|
|
530
|
-
return listeners;
|
|
531
|
-
};
|
|
532
|
-
|
|
533
512
|
Form.useForm = useForm;
|
|
534
513
|
Form.useWatch = useWatch;
|
|
535
514
|
Form.useSubmitDataWatch = useSubmitDataWatch;
|
|
536
515
|
Form.useFormStateWatch = useFormStateWatch;
|
|
537
516
|
Form.useFormItemStateWatch = useFormItemStateWatch;
|
|
538
|
-
Form.useWatchFormListeners = useWatchFormListeners;
|
package/src/stores/formStore.ts
CHANGED
|
@@ -51,8 +51,6 @@ interface FormStoreState {
|
|
|
51
51
|
// methods (loose typed for incremental migration)
|
|
52
52
|
[key: string]: any;
|
|
53
53
|
}
|
|
54
|
-
|
|
55
|
-
// Combined store containing all form-related state
|
|
56
54
|
// Form Store Slice
|
|
57
55
|
const createFormStoreSlice = (storeSet: any, storeGet: any, api: any) => ({
|
|
58
56
|
forms: {},
|
|
@@ -61,310 +59,310 @@ const createFormStoreSlice = (storeSet: any, storeGet: any, api: any) => ({
|
|
|
61
59
|
cacheData: {},
|
|
62
60
|
formInstances: [],
|
|
63
61
|
submitHistory: {},
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (formName) {
|
|
92
|
-
set(oldValues, formName, {});
|
|
93
|
-
} else {
|
|
94
|
-
set(oldValues, "", {});
|
|
95
|
-
}
|
|
96
|
-
}),
|
|
97
|
-
);
|
|
98
|
-
},
|
|
62
|
+
setData(formName, name, value) {
|
|
63
|
+
return storeSet(
|
|
64
|
+
produce<any>((state: any) => {
|
|
65
|
+
const oldValues = state.forms;
|
|
66
|
+
set(oldValues, `${formName}.${name}`, value);
|
|
67
|
+
}),
|
|
68
|
+
);
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
getCacheData(formName) {
|
|
72
|
+
return get(storeGet(), `cacheData.${formName}`);
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
setCacheData(formName, name, value) {
|
|
76
|
+
return storeSet(
|
|
77
|
+
produce<any>((state: any) => {
|
|
78
|
+
const oldValues = state.cacheData;
|
|
79
|
+
set(oldValues, `${formName}.${name}`, value);
|
|
80
|
+
}),
|
|
81
|
+
);
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
clearCacheData(formName) {
|
|
85
|
+
return storeSet(
|
|
86
|
+
produce<any>((state: any) => {
|
|
87
|
+
const oldValues = state.cacheData;
|
|
99
88
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
89
|
+
if (formName) {
|
|
90
|
+
set(oldValues, formName, {});
|
|
91
|
+
} else {
|
|
92
|
+
set(oldValues, "", {});
|
|
93
|
+
}
|
|
94
|
+
}),
|
|
95
|
+
);
|
|
96
|
+
},
|
|
103
97
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
98
|
+
getFormItemValue(formName, name) {
|
|
99
|
+
return get(storeGet().forms?.[formName], name);
|
|
100
|
+
},
|
|
107
101
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const oldValues = state.forms;
|
|
102
|
+
getFormValues(formName) {
|
|
103
|
+
return storeGet().forms?.[formName];
|
|
104
|
+
},
|
|
112
105
|
|
|
113
|
-
|
|
106
|
+
clearFormValues(formName) {
|
|
107
|
+
return storeSet(
|
|
108
|
+
produce<any>((state: any) => {
|
|
109
|
+
const oldValues = state.forms;
|
|
110
|
+
|
|
111
|
+
// console.log("Clear form values", formName);
|
|
112
|
+
|
|
113
|
+
unset(oldValues, formName);
|
|
114
|
+
|
|
115
|
+
// console.log(JSON.parse(JSON.stringify(oldValues)));
|
|
116
|
+
}),
|
|
117
|
+
);
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
clearFormInitialValues(formName) {
|
|
121
|
+
return storeSet(
|
|
122
|
+
produce<any>((state: any) => {
|
|
123
|
+
const oldValues = state.initialValues;
|
|
114
124
|
|
|
115
|
-
|
|
125
|
+
// console.log("Clear form initial values", formName);
|
|
116
126
|
|
|
117
|
-
|
|
118
|
-
}),
|
|
119
|
-
);
|
|
120
|
-
},
|
|
127
|
+
unset(oldValues, formName);
|
|
121
128
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
129
|
+
// console.log(JSON.parse(JSON.stringify(oldValues)));
|
|
130
|
+
}),
|
|
131
|
+
);
|
|
132
|
+
},
|
|
126
133
|
|
|
127
|
-
|
|
134
|
+
clearObjKeyItem(formName, name) {
|
|
135
|
+
return storeSet(
|
|
136
|
+
produce<any>((state: any) => {
|
|
137
|
+
const oldValues = state.forms;
|
|
128
138
|
|
|
129
|
-
|
|
139
|
+
// console.log("Clear item value", formName, name);
|
|
130
140
|
|
|
131
|
-
|
|
132
|
-
}),
|
|
133
|
-
);
|
|
134
|
-
},
|
|
141
|
+
unset(oldValues, `${formName}.${name}`);
|
|
135
142
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
143
|
+
// console.log(JSON.parse(JSON.stringify(oldValues)));
|
|
144
|
+
}),
|
|
145
|
+
);
|
|
146
|
+
},
|
|
147
|
+
clearArrItem(formName, name) {
|
|
148
|
+
return storeSet(
|
|
149
|
+
produce<any>((state: any) => {
|
|
150
|
+
const oldValues = state.forms;
|
|
140
151
|
|
|
141
|
-
|
|
152
|
+
console.log("Clear item array value", formName, name);
|
|
142
153
|
|
|
143
|
-
|
|
154
|
+
const arrPath = name.split(".").slice(0, -1).join(".");
|
|
144
155
|
|
|
145
|
-
|
|
146
|
-
}),
|
|
147
|
-
);
|
|
148
|
-
},
|
|
149
|
-
clearArrItem(formName, name) {
|
|
150
|
-
return storeSet(
|
|
151
|
-
produce<any>((state: any) => {
|
|
152
|
-
const oldValues = state.forms;
|
|
156
|
+
const elPath = Number(name.split(".").slice(-1).join(""));
|
|
153
157
|
|
|
154
|
-
|
|
158
|
+
const getArrItem = get(oldValues, `${formName}.${arrPath}`);
|
|
155
159
|
|
|
156
|
-
|
|
160
|
+
if (isNumber(elPath)) {
|
|
161
|
+
getArrItem.splice(elPath, 1);
|
|
162
|
+
}
|
|
157
163
|
|
|
158
|
-
|
|
164
|
+
// console.log(JSON.parse(JSON.stringify(oldValues)));
|
|
165
|
+
}),
|
|
166
|
+
);
|
|
167
|
+
},
|
|
159
168
|
|
|
160
|
-
|
|
169
|
+
setFormState({ formName, isInitied, submitState }) {
|
|
170
|
+
return storeSet(
|
|
171
|
+
produce<any>((state: any) => {
|
|
172
|
+
const oldValues = state.formStates;
|
|
173
|
+
const getFormState = get(storeGet().formStates, formName);
|
|
161
174
|
|
|
162
|
-
|
|
163
|
-
|
|
175
|
+
if (isNil(getFormState)) {
|
|
176
|
+
set(oldValues, formName, { isInitied, submitState });
|
|
177
|
+
} else {
|
|
178
|
+
if (!isNil(isInitied)) {
|
|
179
|
+
set(oldValues, `${formName}.isInitied`, isInitied);
|
|
164
180
|
}
|
|
165
181
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
);
|
|
169
|
-
},
|
|
170
|
-
|
|
171
|
-
setFormState({ formName, isInitied, submitState }) {
|
|
172
|
-
return storeSet(
|
|
173
|
-
produce<any>((state: any) => {
|
|
174
|
-
const oldValues = state.formStates;
|
|
175
|
-
const getFormState = get(storeGet().formStates, formName);
|
|
176
|
-
|
|
177
|
-
if (isNil(getFormState)) {
|
|
178
|
-
set(oldValues, formName, { isInitied, submitState });
|
|
179
|
-
} else {
|
|
180
|
-
if (!isNil(isInitied)) {
|
|
181
|
-
set(oldValues, `${formName}.isInitied`, isInitied);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (!isNil(submitState)) {
|
|
185
|
-
set(oldValues, `${formName}.submitState`, submitState);
|
|
186
|
-
}
|
|
182
|
+
if (!isNil(submitState)) {
|
|
183
|
+
set(oldValues, `${formName}.submitState`, submitState);
|
|
187
184
|
}
|
|
188
|
-
}
|
|
189
|
-
)
|
|
190
|
-
|
|
185
|
+
}
|
|
186
|
+
}),
|
|
187
|
+
);
|
|
188
|
+
},
|
|
191
189
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
190
|
+
clearFormState(formName) {
|
|
191
|
+
return storeSet(
|
|
192
|
+
produce<any>((state: any) => {
|
|
193
|
+
const oldValues = state.formStates;
|
|
196
194
|
|
|
197
|
-
|
|
195
|
+
// console.log("Clear form state", formName);
|
|
198
196
|
|
|
199
|
-
|
|
197
|
+
unset(oldValues, formName);
|
|
200
198
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
199
|
+
// console.log(JSON.parse(JSON.stringify(oldValues)));
|
|
200
|
+
}),
|
|
201
|
+
);
|
|
202
|
+
},
|
|
205
203
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
204
|
+
getFormState(formName) {
|
|
205
|
+
return get(storeGet(), `formStates.${formName}`);
|
|
206
|
+
},
|
|
209
207
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
208
|
+
setFormInitData(formName, initValues) {
|
|
209
|
+
return storeSet(
|
|
210
|
+
produce<any>((state: any) => {
|
|
211
|
+
const oldValues = state.initialValues;
|
|
212
|
+
const listInitPath = getAllNoneObjStringPath(initValues);
|
|
215
213
|
|
|
216
|
-
|
|
214
|
+
// console.log({ listInitPath, initValues });
|
|
217
215
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
if (!isNil(setFieldValue)) {
|
|
275
|
-
storeListeners[findListenerIndex].setFieldValue = setFieldValue;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
if (!isNil(setFieldValues)) {
|
|
279
|
-
storeListeners[findListenerIndex].setFieldValues = setFieldValues;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
if (!isNil(getFieldValue)) {
|
|
283
|
-
storeListeners[findListenerIndex].getFieldValue = getFieldValue;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
if (!isNil(getFieldValues)) {
|
|
287
|
-
storeListeners[findListenerIndex].getFieldValues = getFieldValues;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
if (!isNil(getFieldErrors)) {
|
|
291
|
-
storeListeners[findListenerIndex].getFieldErrors = getFieldErrors;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
return;
|
|
216
|
+
listInitPath.forEach((k) => {
|
|
217
|
+
if (get(initValues, k)) {
|
|
218
|
+
// console.log("init form data values: ", k, get(initValues, k));
|
|
219
|
+
set(oldValues, `${formName}.${k}`, get(initValues, k));
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}),
|
|
223
|
+
);
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
getInitData(formName, name) {
|
|
227
|
+
return get(storeGet().initialValues, `${formName}.${name}`);
|
|
228
|
+
},
|
|
229
|
+
|
|
230
|
+
setInitData(formName, name, value) {
|
|
231
|
+
return storeSet(
|
|
232
|
+
produce<any>((state: any) => {
|
|
233
|
+
const oldValues = state.initialValues;
|
|
234
|
+
console.log("Inner init: ", `${formName}.${name}`, value);
|
|
235
|
+
set(oldValues, `${formName}.${name}`, value);
|
|
236
|
+
}),
|
|
237
|
+
);
|
|
238
|
+
},
|
|
239
|
+
|
|
240
|
+
setFormInstance({
|
|
241
|
+
formName,
|
|
242
|
+
resetFields,
|
|
243
|
+
submit,
|
|
244
|
+
submitAsync,
|
|
245
|
+
setFieldValue,
|
|
246
|
+
setFieldValues,
|
|
247
|
+
getFieldValue,
|
|
248
|
+
getFieldValues,
|
|
249
|
+
getFieldErrors,
|
|
250
|
+
setFieldFocus,
|
|
251
|
+
}) {
|
|
252
|
+
return storeSet(
|
|
253
|
+
produce<any>((state: any) => {
|
|
254
|
+
const storeListeners = state.formInstances;
|
|
255
|
+
const findListenerIndex = storeListeners.findIndex(
|
|
256
|
+
(l) => l.formName === formName,
|
|
257
|
+
);
|
|
258
|
+
if (findListenerIndex > -1) {
|
|
259
|
+
if (!isNil(resetFields)) {
|
|
260
|
+
storeListeners[findListenerIndex].resetFields = resetFields;
|
|
261
|
+
}
|
|
262
|
+
if (!isNil(submit)) {
|
|
263
|
+
storeListeners[findListenerIndex].submit = submit;
|
|
264
|
+
}
|
|
265
|
+
if (!isNil(setFieldFocus)) {
|
|
266
|
+
storeListeners[findListenerIndex].setFieldFocus = setFieldFocus;
|
|
267
|
+
}
|
|
268
|
+
if (!isNil(submitAsync)) {
|
|
269
|
+
storeListeners[findListenerIndex].submitAsync = submitAsync;
|
|
295
270
|
}
|
|
296
|
-
storeListeners.push({
|
|
297
|
-
formName,
|
|
298
|
-
resetFields,
|
|
299
|
-
submit,
|
|
300
|
-
submitAsync,
|
|
301
|
-
setFieldValue,
|
|
302
|
-
setFieldValues,
|
|
303
|
-
getFieldValue,
|
|
304
|
-
getFieldValues,
|
|
305
|
-
getFieldErrors,
|
|
306
|
-
setFieldFocus,
|
|
307
|
-
});
|
|
308
|
-
}),
|
|
309
|
-
);
|
|
310
|
-
},
|
|
311
|
-
revokeFormInstance({ formName }) {
|
|
312
|
-
return storeSet(
|
|
313
|
-
produce<any>((state: any) => {
|
|
314
|
-
const instances = state.formInstances;
|
|
315
|
-
|
|
316
|
-
const findInstanceIndex = instances.findIndex(
|
|
317
|
-
(l) => l.formName == formName,
|
|
318
|
-
);
|
|
319
271
|
|
|
320
|
-
|
|
272
|
+
if (!isNil(setFieldValue)) {
|
|
273
|
+
storeListeners[findListenerIndex].setFieldValue = setFieldValue;
|
|
274
|
+
}
|
|
321
275
|
|
|
322
|
-
if (
|
|
323
|
-
|
|
276
|
+
if (!isNil(setFieldValues)) {
|
|
277
|
+
storeListeners[findListenerIndex].setFieldValues = setFieldValues;
|
|
278
|
+
}
|
|
324
279
|
|
|
325
|
-
|
|
280
|
+
if (!isNil(getFieldValue)) {
|
|
281
|
+
storeListeners[findListenerIndex].getFieldValue = getFieldValue;
|
|
282
|
+
}
|
|
326
283
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
// instances.filter(
|
|
330
|
-
// (l) =>
|
|
331
|
-
// l.name === listenersInfo.name &&
|
|
332
|
-
// l.formName === listenersInfo.formName &&
|
|
333
|
-
// l.formItemId !== listenersInfo.formItemId
|
|
334
|
-
// )
|
|
335
|
-
// );
|
|
284
|
+
if (!isNil(getFieldValues)) {
|
|
285
|
+
storeListeners[findListenerIndex].getFieldValues = getFieldValues;
|
|
336
286
|
}
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
getCurrentSubmit(formName) {
|
|
342
|
-
return last(get(storeGet().submitHistory, formName)) || null;
|
|
343
|
-
},
|
|
344
|
-
getSubmitHistory(formName) {
|
|
345
|
-
return get(storeGet().submitHistory, formName);
|
|
346
|
-
},
|
|
347
|
-
setSubmitHistory(formName, submitData) {
|
|
348
|
-
return storeSet(
|
|
349
|
-
produce<any>((state: any) => {
|
|
350
|
-
const oldValues = get(state.submitHistory, formName);
|
|
351
|
-
if (oldValues) {
|
|
352
|
-
oldValues.push(submitData);
|
|
353
|
-
oldValues.splice(0, oldValues.length - 3);
|
|
354
|
-
} else {
|
|
355
|
-
set(state.submitHistory, formName, [submitData]);
|
|
287
|
+
|
|
288
|
+
if (!isNil(getFieldErrors)) {
|
|
289
|
+
storeListeners[findListenerIndex].getFieldErrors = getFieldErrors;
|
|
356
290
|
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
291
|
+
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
storeListeners.push({
|
|
295
|
+
formName,
|
|
296
|
+
resetFields,
|
|
297
|
+
submit,
|
|
298
|
+
submitAsync,
|
|
299
|
+
setFieldValue,
|
|
300
|
+
setFieldValues,
|
|
301
|
+
getFieldValue,
|
|
302
|
+
getFieldValues,
|
|
303
|
+
getFieldErrors,
|
|
304
|
+
setFieldFocus,
|
|
305
|
+
});
|
|
306
|
+
}),
|
|
307
|
+
);
|
|
308
|
+
},
|
|
309
|
+
revokeFormInstance({ formName }) {
|
|
310
|
+
return storeSet(
|
|
311
|
+
produce<any>((state: any) => {
|
|
312
|
+
const instances = state.formInstances;
|
|
313
|
+
|
|
314
|
+
const findInstanceIndex = instances.findIndex(
|
|
315
|
+
(l) => l.formName == formName,
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
// console.log("Find item for revoke: ", findListenerIndex, formItemId);
|
|
319
|
+
|
|
320
|
+
if (findInstanceIndex > -1) {
|
|
321
|
+
// const listenersInfo = cloneDeep(instances[findInstanceIndex]);
|
|
322
|
+
|
|
323
|
+
instances.splice(findInstanceIndex, 1);
|
|
324
|
+
|
|
325
|
+
// onAfterRevoke(
|
|
326
|
+
// listenersInfo,
|
|
327
|
+
// instances.filter(
|
|
328
|
+
// (l) =>
|
|
329
|
+
// l.name === listenersInfo.name &&
|
|
330
|
+
// l.formName === listenersInfo.formName &&
|
|
331
|
+
// l.formItemId !== listenersInfo.formItemId
|
|
332
|
+
// )
|
|
333
|
+
// );
|
|
334
|
+
}
|
|
335
|
+
}),
|
|
336
|
+
);
|
|
337
|
+
},
|
|
338
|
+
|
|
339
|
+
getCurrentSubmit(formName) {
|
|
340
|
+
return last(get(storeGet().submitHistory, formName)) || null;
|
|
341
|
+
},
|
|
342
|
+
getSubmitHistory(formName) {
|
|
343
|
+
return get(storeGet().submitHistory, formName);
|
|
344
|
+
},
|
|
345
|
+
setSubmitHistory(formName, submitData) {
|
|
346
|
+
return storeSet(
|
|
347
|
+
produce<any>((state: any) => {
|
|
348
|
+
const oldValues = get(state.submitHistory, formName);
|
|
349
|
+
if (oldValues) {
|
|
350
|
+
oldValues.push(submitData);
|
|
351
|
+
oldValues.splice(0, oldValues.length - 3);
|
|
352
|
+
} else {
|
|
353
|
+
set(state.submitHistory, formName, [submitData]);
|
|
354
|
+
}
|
|
355
|
+
console.log("Submit history: ", formName);
|
|
356
|
+
}),
|
|
357
|
+
);
|
|
358
|
+
},
|
|
361
359
|
});
|
|
362
360
|
|
|
363
361
|
// Listeners Slice
|
|
364
362
|
const createListenersSlice = (storeSet: any, storeGet: any, api: any) => ({
|
|
365
363
|
listeners: [],
|
|
366
|
-
getListener(formItemId
|
|
367
|
-
return storeGet().listeners.find((l
|
|
364
|
+
getListener(formItemId) {
|
|
365
|
+
return storeGet().listeners.find((l) => l.formItemId === formItemId);
|
|
368
366
|
},
|
|
369
367
|
getListeners() {
|
|
370
368
|
return storeGet().listeners;
|
|
@@ -381,7 +379,7 @@ const createListenersSlice = (storeSet: any, storeGet: any, api: any) => ({
|
|
|
381
379
|
onFocus,
|
|
382
380
|
emitFocus,
|
|
383
381
|
isInitied,
|
|
384
|
-
}
|
|
382
|
+
}) {
|
|
385
383
|
return storeSet(
|
|
386
384
|
produce<any>((state: any) => {
|
|
387
385
|
const storeListeners = state.listeners;
|
|
@@ -424,21 +422,23 @@ const createListenersSlice = (storeSet: any, storeGet: any, api: any) => ({
|
|
|
424
422
|
|
|
425
423
|
return;
|
|
426
424
|
}
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
425
|
+
if (name && formName) {
|
|
426
|
+
storeListeners.push({
|
|
427
|
+
name,
|
|
428
|
+
formName,
|
|
429
|
+
isTouched: Boolean(isTouched),
|
|
430
|
+
isDirty: Boolean(isDirty),
|
|
431
|
+
formItemId,
|
|
432
|
+
internalErrors,
|
|
433
|
+
onChange,
|
|
434
|
+
onReset,
|
|
435
|
+
isInitied: Boolean(isInitied),
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
438
|
}),
|
|
439
439
|
);
|
|
440
440
|
},
|
|
441
|
-
revokeListener(formItemId
|
|
441
|
+
revokeListener(formItemId, onAfterRevoke) {
|
|
442
442
|
return storeSet(
|
|
443
443
|
produce<any>((state: any) => {
|
|
444
444
|
const storeListeners = state.listeners;
|
|
@@ -447,6 +447,8 @@ const createListenersSlice = (storeSet: any, storeGet: any, api: any) => ({
|
|
|
447
447
|
(l: any) => l.formItemId == formItemId,
|
|
448
448
|
);
|
|
449
449
|
|
|
450
|
+
// console.log("Find item for revoke: ", findListenerIndex, formItemId);
|
|
451
|
+
|
|
450
452
|
if (findListenerIndex > -1) {
|
|
451
453
|
const listenersInfo = cloneDeep(storeListeners[findListenerIndex]);
|
|
452
454
|
|
|
@@ -470,7 +472,7 @@ const createListenersSlice = (storeSet: any, storeGet: any, api: any) => ({
|
|
|
470
472
|
// CleanUp Slice
|
|
471
473
|
const createCleanUpSlice = (storeSet: any, storeGet: any, api: any) => ({
|
|
472
474
|
cleanUpStack: [],
|
|
473
|
-
setCleanUpStack({ name, type, itemKey, formName }
|
|
475
|
+
setCleanUpStack({ name, type, itemKey, formName }) {
|
|
474
476
|
return storeSet(
|
|
475
477
|
produce<any>((state: any) => {
|
|
476
478
|
const oldValues = state.cleanUpStack;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { cloneDeep } from "lodash";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import { useShallow } from "zustand/react/shallow";
|
|
4
|
+
import { useFormStore } from "../stores/formStore";
|
|
5
|
+
|
|
6
|
+
type Props = {};
|
|
7
|
+
|
|
8
|
+
function TestListener({}: Props) {
|
|
9
|
+
const { listeners } = useFormStore(
|
|
10
|
+
useShallow((state) => ({
|
|
11
|
+
listeners: state.listeners,
|
|
12
|
+
})),
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
console.log("Listeners updated: ", cloneDeep(listeners));
|
|
17
|
+
}, [listeners]);
|
|
18
|
+
return <div>TestListener</div>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default TestListener;
|