react-form-manage 1.0.8-beta.7 → 1.0.8
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/CHANGELOG.md +173 -4
- package/README.md +8 -4
- package/dist/components/Form/FormCleanUp.js +3 -3
- package/dist/components/Form/FormItem.d.ts +10 -4
- package/dist/components/Form/FormItem.js +52 -14
- package/dist/components/Form/FormList.d.ts +2 -2
- package/dist/components/Form/FormList.js +2 -2
- package/dist/constants/form.d.ts +1 -1
- package/dist/hooks/useFormItemControl.d.ts +8 -3
- package/dist/hooks/useFormItemControl.js +64 -28
- package/dist/hooks/useFormListControl.d.ts +2 -1
- package/dist/hooks/useFormListControl.js +85 -19
- package/dist/index.cjs.d.ts +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.esm.d.ts +1 -0
- package/dist/index.js +4 -2
- package/dist/providers/Form.d.ts +15 -2
- package/dist/providers/Form.js +226 -41
- package/dist/stores/formStore.d.ts +44 -4
- package/dist/stores/formStore.js +42 -7
- package/dist/test/CommonTest.d.ts +3 -0
- package/dist/test/CommonTest.js +49 -0
- package/dist/test/TestDialog.d.ts +3 -0
- package/dist/test/TestDialog.js +21 -0
- package/dist/test/TestListener.d.ts +3 -0
- package/dist/test/TestListener.js +17 -0
- package/dist/test/TestNotFormWrapper.d.ts +3 -0
- package/dist/test/TestNotFormWrapper.js +15 -0
- package/dist/test/TestSelect.d.ts +6 -0
- package/dist/test/TestSelect.js +24 -0
- package/dist/test/TestWatchNormalize.d.ts +3 -0
- package/dist/test/TestWatchNormalize.js +23 -0
- package/dist/test/TestWrapperFormItem.d.ts +3 -0
- package/dist/test/TestWrapperFormItem.js +13 -0
- package/dist/test/testSetValue/TestCase10_SetFieldValues_ComplexNested.d.ts +21 -0
- package/dist/test/testSetValue/TestCase10_SetFieldValues_ComplexNested.js +61 -0
- package/dist/test/testSetValue/TestCase1_PlainObjectToPrimitives.d.ts +16 -0
- package/dist/test/testSetValue/TestCase1_PlainObjectToPrimitives.js +18 -0
- package/dist/test/testSetValue/TestCase2_PlainObjectToFormList.d.ts +21 -0
- package/dist/test/testSetValue/TestCase2_PlainObjectToFormList.js +33 -0
- package/dist/test/testSetValue/TestCase3_ArrayNonListenerToPrimitives.d.ts +21 -0
- package/dist/test/testSetValue/TestCase3_ArrayNonListenerToPrimitives.js +26 -0
- package/dist/test/testSetValue/TestCase4_PlainObjectRemovedFields.d.ts +20 -0
- package/dist/test/testSetValue/TestCase4_PlainObjectRemovedFields.js +32 -0
- package/dist/test/testSetValue/TestCase5_FormListRemovedItems.d.ts +22 -0
- package/dist/test/testSetValue/TestCase5_FormListRemovedItems.js +29 -0
- package/dist/test/testSetValue/TestCase6_NestedFormListRemoved.d.ts +28 -0
- package/dist/test/testSetValue/TestCase6_NestedFormListRemoved.js +36 -0
- package/dist/test/testSetValue/TestCase7_SetFieldValues_MixedStructure.d.ts +17 -0
- package/dist/test/testSetValue/TestCase7_SetFieldValues_MixedStructure.js +33 -0
- package/dist/test/testSetValue/TestCase8_SetFieldValues_NestedObject.d.ts +27 -0
- package/dist/test/testSetValue/TestCase8_SetFieldValues_NestedObject.js +57 -0
- package/dist/test/testSetValue/TestCase9_SetFieldValues_MultipleArrays.d.ts +25 -0
- package/dist/test/testSetValue/TestCase9_SetFieldValues_MultipleArrays.js +46 -0
- package/dist/test/testSetValue/index.d.ts +2 -0
- package/dist/test/testSetValue/index.js +28 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/public.d.ts +1 -1
- package/dist/utils/obj.util.d.ts +29 -1
- package/dist/utils/obj.util.js +59 -5
- package/package.json +2 -1
- package/src/App.tsx +39 -156
- package/src/DEEP_TRIGGER_LOGIC.md +573 -0
- package/src/components/Form/FormCleanUp.tsx +4 -8
- package/src/components/Form/FormItem.tsx +174 -57
- package/src/components/Form/FormList.tsx +17 -4
- package/src/constants/form.ts +1 -1
- package/src/hooks/useFormItemControl.ts +78 -32
- package/src/hooks/useFormListControl.ts +133 -43
- package/src/index.ts +25 -13
- package/src/main.tsx +6 -1
- package/src/providers/Form.tsx +454 -26
- package/src/stores/formStore.ts +363 -283
- package/src/test/CommonTest.tsx +177 -0
- package/src/test/TestDialog.tsx +52 -0
- package/src/test/TestListener.tsx +21 -0
- package/src/test/TestNotFormWrapper.tsx +43 -0
- package/src/test/TestSelect.tsx +38 -0
- package/src/test/TestWatchNormalize.tsx +32 -0
- package/src/test/TestWrapperFormItem.tsx +34 -0
- package/src/test/testSetValue/TestCase10_SetFieldValues_ComplexNested.tsx +203 -0
- package/src/test/testSetValue/TestCase1_PlainObjectToPrimitives.tsx +72 -0
- package/src/test/testSetValue/TestCase2_PlainObjectToFormList.tsx +114 -0
- package/src/test/testSetValue/TestCase3_ArrayNonListenerToPrimitives.tsx +99 -0
- package/src/test/testSetValue/TestCase4_PlainObjectRemovedFields.tsx +112 -0
- package/src/test/testSetValue/TestCase5_FormListRemovedItems.tsx +119 -0
- package/src/test/testSetValue/TestCase6_NestedFormListRemoved.tsx +185 -0
- package/src/test/testSetValue/TestCase7_SetFieldValues_MixedStructure.tsx +110 -0
- package/src/test/testSetValue/TestCase8_SetFieldValues_NestedObject.tsx +162 -0
- package/src/test/testSetValue/TestCase9_SetFieldValues_MultipleArrays.tsx +169 -0
- package/src/test/testSetValue/index.tsx +100 -0
- package/src/types/index.ts +1 -1
- package/src/types/public.ts +1 -1
- package/src/utils/obj.util.ts +153 -13
package/src/stores/formStore.ts
CHANGED
|
@@ -3,11 +3,26 @@ import { cloneDeep, get, isNil, isNumber, last, set, unset } from "lodash";
|
|
|
3
3
|
import { v4 } from "uuid";
|
|
4
4
|
import { create } from "zustand";
|
|
5
5
|
import { getAllNoneObjStringPath } from "../utils/obj.util";
|
|
6
|
+
type ListenerFormItemType = "normal" | "array";
|
|
7
|
+
|
|
8
|
+
export interface SubmitProps<T = any> {
|
|
9
|
+
externalFinishCallback?: (values: T, allValues?: any) => void | Promise<void>;
|
|
10
|
+
externalRejectCallback?: (errorFields: any[]) => void | Promise<void>;
|
|
11
|
+
externalFinallyCallback?: (result: {
|
|
12
|
+
errorsField: any[];
|
|
13
|
+
values: T;
|
|
14
|
+
withUnRegisteredValues: any;
|
|
15
|
+
}) => void | Promise<void>;
|
|
16
|
+
callBothFinish?: boolean;
|
|
17
|
+
callBothReject?: boolean;
|
|
18
|
+
callBothFinally?: boolean;
|
|
19
|
+
collectHiddenFields?: boolean;
|
|
20
|
+
}
|
|
6
21
|
|
|
7
|
-
export interface FormInstance {
|
|
22
|
+
export interface FormInstance<T = any> {
|
|
8
23
|
formName: string;
|
|
9
24
|
resetFields: (values?: any) => void;
|
|
10
|
-
submit: (
|
|
25
|
+
submit: (props?: SubmitProps<T>) => void;
|
|
11
26
|
submitAsync: (values?: any) => Promise<any>;
|
|
12
27
|
setFieldValue: (name: string, value: any, options?: any) => void;
|
|
13
28
|
setFieldValues: (values: Record<string, any>, options?: any) => void;
|
|
@@ -17,20 +32,25 @@ export interface FormInstance {
|
|
|
17
32
|
setFieldFocus: (name: string) => void;
|
|
18
33
|
}
|
|
19
34
|
|
|
20
|
-
interface ListenerItem {
|
|
35
|
+
export interface ListenerItem {
|
|
21
36
|
name?: string;
|
|
22
37
|
formName?: string;
|
|
23
38
|
isTouched?: boolean;
|
|
24
39
|
isDirty?: boolean;
|
|
25
40
|
formItemId?: string;
|
|
26
41
|
internalErrors?: any;
|
|
42
|
+
onArrayChange?: any;
|
|
27
43
|
onChange?: any;
|
|
28
44
|
onReset?: any;
|
|
29
45
|
onFocus?: any;
|
|
30
46
|
emitFocus?: any;
|
|
47
|
+
isInitied?: boolean;
|
|
48
|
+
type?: ListenerFormItemType;
|
|
49
|
+
hidden?: boolean;
|
|
50
|
+
collectOnHidden?: boolean;
|
|
31
51
|
}
|
|
32
52
|
|
|
33
|
-
interface CleanUpItem {
|
|
53
|
+
export interface CleanUpItem {
|
|
34
54
|
name?: string;
|
|
35
55
|
type?: string;
|
|
36
56
|
key: string;
|
|
@@ -45,109 +65,134 @@ interface FormStoreState {
|
|
|
45
65
|
cacheData: Record<string, any>;
|
|
46
66
|
formInstances: FormInstance[];
|
|
47
67
|
submitHistory: Record<string, any[]>;
|
|
68
|
+
listeners: ListenerItem[];
|
|
69
|
+
cleanUpStack: CleanUpItem[];
|
|
48
70
|
// methods (loose typed for incremental migration)
|
|
49
71
|
[key: string]: any;
|
|
50
72
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
clearCacheData(formName) {
|
|
82
|
-
return storeSet(
|
|
83
|
-
produce<any>((state: any) => {
|
|
84
|
-
const oldValues = state.cacheData;
|
|
85
|
-
|
|
86
|
-
if (formName) {
|
|
87
|
-
set(oldValues, formName, {});
|
|
88
|
-
} else {
|
|
89
|
-
set(oldValues, "", {});
|
|
90
|
-
}
|
|
91
|
-
}),
|
|
92
|
-
);
|
|
93
|
-
},
|
|
73
|
+
// Form Store Slice
|
|
74
|
+
const createFormStoreSlice = (storeSet: any, storeGet: any, api: any) => ({
|
|
75
|
+
forms: {},
|
|
76
|
+
initialValues: {},
|
|
77
|
+
formStates: {},
|
|
78
|
+
cacheData: {},
|
|
79
|
+
formInstances: [],
|
|
80
|
+
submitHistory: {},
|
|
81
|
+
setData(formName, name, value) {
|
|
82
|
+
return storeSet(
|
|
83
|
+
produce<any>((state: any) => {
|
|
84
|
+
const oldValues = state.forms;
|
|
85
|
+
set(oldValues, `${formName}.${name}`, value);
|
|
86
|
+
}),
|
|
87
|
+
);
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
getCacheData(formName) {
|
|
91
|
+
return get(storeGet(), `cacheData.${formName}`);
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
setCacheData(formName, name, value) {
|
|
95
|
+
return storeSet(
|
|
96
|
+
produce<any>((state: any) => {
|
|
97
|
+
const oldValues = state.cacheData;
|
|
98
|
+
set(oldValues, `${formName}.${name}`, value);
|
|
99
|
+
}),
|
|
100
|
+
);
|
|
101
|
+
},
|
|
94
102
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
103
|
+
clearCacheData(formName) {
|
|
104
|
+
return storeSet(
|
|
105
|
+
produce<any>((state: any) => {
|
|
106
|
+
const oldValues = state.cacheData;
|
|
98
107
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
108
|
+
if (formName) {
|
|
109
|
+
set(oldValues, formName, {});
|
|
110
|
+
} else {
|
|
111
|
+
set(oldValues, "", {});
|
|
112
|
+
}
|
|
113
|
+
}),
|
|
114
|
+
);
|
|
115
|
+
},
|
|
102
116
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const oldValues = state.forms;
|
|
117
|
+
getFormItemValue(formName, name) {
|
|
118
|
+
return get(storeGet().forms?.[formName], name);
|
|
119
|
+
},
|
|
107
120
|
|
|
108
|
-
|
|
121
|
+
getFormValues(formName) {
|
|
122
|
+
return storeGet().forms?.[formName];
|
|
123
|
+
},
|
|
109
124
|
|
|
110
|
-
|
|
125
|
+
clearFormValues(formName) {
|
|
126
|
+
return storeSet(
|
|
127
|
+
produce<any>((state: any) => {
|
|
128
|
+
const oldValues = state.forms;
|
|
111
129
|
|
|
112
|
-
|
|
113
|
-
}),
|
|
114
|
-
);
|
|
115
|
-
},
|
|
130
|
+
// console.log("Clear form values", formName);
|
|
116
131
|
|
|
117
|
-
|
|
118
|
-
return storeSet(
|
|
119
|
-
produce<any>((state: any) => {
|
|
120
|
-
const oldValues = state.initialValues;
|
|
132
|
+
unset(oldValues, formName);
|
|
121
133
|
|
|
122
|
-
|
|
134
|
+
// console.log(JSON.parse(JSON.stringify(oldValues)));
|
|
135
|
+
}),
|
|
136
|
+
);
|
|
137
|
+
},
|
|
123
138
|
|
|
124
|
-
|
|
139
|
+
clearFormInitialValues(formName) {
|
|
140
|
+
return storeSet(
|
|
141
|
+
produce<any>((state: any) => {
|
|
142
|
+
const oldValues = state.initialValues;
|
|
125
143
|
|
|
126
|
-
|
|
127
|
-
}),
|
|
128
|
-
);
|
|
129
|
-
},
|
|
144
|
+
// console.log("Clear form initial values", formName);
|
|
130
145
|
|
|
131
|
-
|
|
132
|
-
return storeSet(
|
|
133
|
-
produce<any>((state: any) => {
|
|
134
|
-
const oldValues = state.forms;
|
|
146
|
+
unset(oldValues, formName);
|
|
135
147
|
|
|
136
|
-
|
|
148
|
+
// console.log(JSON.parse(JSON.stringify(oldValues)));
|
|
149
|
+
}),
|
|
150
|
+
);
|
|
151
|
+
},
|
|
137
152
|
|
|
138
|
-
|
|
153
|
+
clearObjKeyItem(formName, name) {
|
|
154
|
+
return storeSet(
|
|
155
|
+
produce<any>((state: any) => {
|
|
156
|
+
const oldValues = state.forms;
|
|
139
157
|
|
|
140
|
-
|
|
141
|
-
}),
|
|
142
|
-
);
|
|
143
|
-
},
|
|
144
|
-
clearArrItem(formName, name) {
|
|
145
|
-
return storeSet(
|
|
146
|
-
produce<any>((state: any) => {
|
|
147
|
-
const oldValues = state.forms;
|
|
158
|
+
// console.log("Clear item value", formName, name);
|
|
148
159
|
|
|
149
|
-
|
|
160
|
+
unset(oldValues, `${formName}.${name}`);
|
|
150
161
|
|
|
162
|
+
// console.log(JSON.parse(JSON.stringify(oldValues)));
|
|
163
|
+
}),
|
|
164
|
+
);
|
|
165
|
+
},
|
|
166
|
+
clearArrItem(formName, name) {
|
|
167
|
+
return storeSet(
|
|
168
|
+
produce<any>((state: any) => {
|
|
169
|
+
const oldValues = state.forms;
|
|
170
|
+
|
|
171
|
+
console.log("Clear item array value", formName, name);
|
|
172
|
+
|
|
173
|
+
const arrPath = name.split(".").slice(0, -1).join(".");
|
|
174
|
+
|
|
175
|
+
const elPath = Number(name.split(".").slice(-1).join(""));
|
|
176
|
+
|
|
177
|
+
const getArrItem = get(oldValues, `${formName}.${arrPath}`);
|
|
178
|
+
|
|
179
|
+
if (isNumber(elPath)) {
|
|
180
|
+
getArrItem.splice(elPath, 1);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// console.log(JSON.parse(JSON.stringify(oldValues)));
|
|
184
|
+
}),
|
|
185
|
+
);
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
clearArrItems(clearItems: { formName: string; name: string }[]) {
|
|
189
|
+
return storeSet(
|
|
190
|
+
produce<any>((state: any) => {
|
|
191
|
+
const oldValues = state.forms;
|
|
192
|
+
|
|
193
|
+
console.log("Clear item array values: ", clearItems);
|
|
194
|
+
|
|
195
|
+
clearItems.forEach(({ formName, name }) => {
|
|
151
196
|
const arrPath = name.split(".").slice(0, -1).join(".");
|
|
152
197
|
|
|
153
198
|
const elPath = Number(name.split(".").slice(-1).join(""));
|
|
@@ -157,207 +202,208 @@ export const useFormStore = create<FormStoreState>(
|
|
|
157
202
|
if (isNumber(elPath)) {
|
|
158
203
|
getArrItem.splice(elPath, 1);
|
|
159
204
|
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
// console.log(JSON.parse(JSON.stringify(oldValues)));
|
|
208
|
+
}),
|
|
209
|
+
);
|
|
210
|
+
},
|
|
160
211
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
)
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if (isNil(getFormState)) {
|
|
173
|
-
set(oldValues, formName, { isInitied, submitState });
|
|
174
|
-
} else {
|
|
175
|
-
if (!isNil(isInitied)) {
|
|
176
|
-
set(oldValues, `${formName}.isInitied`, isInitied);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
if (!isNil(submitState)) {
|
|
180
|
-
set(oldValues, `${formName}.submitState`, submitState);
|
|
181
|
-
}
|
|
212
|
+
setFormState({ formName, isInitied, submitState }) {
|
|
213
|
+
return storeSet(
|
|
214
|
+
produce<any>((state: any) => {
|
|
215
|
+
const oldValues = state.formStates;
|
|
216
|
+
const getFormState = get(storeGet().formStates, formName);
|
|
217
|
+
|
|
218
|
+
if (isNil(getFormState)) {
|
|
219
|
+
set(oldValues, formName, { isInitied, submitState });
|
|
220
|
+
} else {
|
|
221
|
+
if (!isNil(isInitied)) {
|
|
222
|
+
set(oldValues, `${formName}.isInitied`, isInitied);
|
|
182
223
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
if (!isNil(setFieldValues)) {
|
|
274
|
-
storeListeners[findListenerIndex].setFieldValues = setFieldValues;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
if (!isNil(getFieldValue)) {
|
|
278
|
-
storeListeners[findListenerIndex].getFieldValue = getFieldValue;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
if (!isNil(getFieldValues)) {
|
|
282
|
-
storeListeners[findListenerIndex].getFieldValues = getFieldValues;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
if (!isNil(getFieldErrors)) {
|
|
286
|
-
storeListeners[findListenerIndex].getFieldErrors = getFieldErrors;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
return;
|
|
224
|
+
|
|
225
|
+
if (!isNil(submitState)) {
|
|
226
|
+
set(oldValues, `${formName}.submitState`, submitState);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}),
|
|
230
|
+
);
|
|
231
|
+
},
|
|
232
|
+
|
|
233
|
+
clearFormState(formName) {
|
|
234
|
+
return storeSet(
|
|
235
|
+
produce<any>((state: any) => {
|
|
236
|
+
const oldValues = state.formStates;
|
|
237
|
+
|
|
238
|
+
// console.log("Clear form state", formName);
|
|
239
|
+
|
|
240
|
+
unset(oldValues, formName);
|
|
241
|
+
|
|
242
|
+
// console.log(JSON.parse(JSON.stringify(oldValues)));
|
|
243
|
+
}),
|
|
244
|
+
);
|
|
245
|
+
},
|
|
246
|
+
|
|
247
|
+
getFormState(formName) {
|
|
248
|
+
return get(storeGet(), `formStates.${formName}`);
|
|
249
|
+
},
|
|
250
|
+
|
|
251
|
+
setFormInitData(formName, initValues) {
|
|
252
|
+
return storeSet(
|
|
253
|
+
produce<any>((state: any) => {
|
|
254
|
+
const oldValues = state.initialValues;
|
|
255
|
+
const listInitPath = getAllNoneObjStringPath(initValues);
|
|
256
|
+
|
|
257
|
+
// console.log({ listInitPath, initValues });
|
|
258
|
+
|
|
259
|
+
listInitPath.forEach((k) => {
|
|
260
|
+
if (get(initValues, k)) {
|
|
261
|
+
// console.log("init form data values: ", k, get(initValues, k));
|
|
262
|
+
set(oldValues, `${formName}.${k}`, get(initValues, k));
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}),
|
|
266
|
+
);
|
|
267
|
+
},
|
|
268
|
+
|
|
269
|
+
getInitData(formName, name) {
|
|
270
|
+
return get(storeGet().initialValues, `${formName}.${name}`);
|
|
271
|
+
},
|
|
272
|
+
|
|
273
|
+
setInitData(formName, name, value) {
|
|
274
|
+
return storeSet(
|
|
275
|
+
produce<any>((state: any) => {
|
|
276
|
+
const oldValues = state.initialValues;
|
|
277
|
+
console.log("Inner init: ", `${formName}.${name}`, value);
|
|
278
|
+
set(oldValues, `${formName}.${name}`, value);
|
|
279
|
+
}),
|
|
280
|
+
);
|
|
281
|
+
},
|
|
282
|
+
|
|
283
|
+
setFormInstance({
|
|
284
|
+
formName,
|
|
285
|
+
resetFields,
|
|
286
|
+
submit,
|
|
287
|
+
submitAsync,
|
|
288
|
+
setFieldValue,
|
|
289
|
+
setFieldValues,
|
|
290
|
+
getFieldValue,
|
|
291
|
+
getFieldValues,
|
|
292
|
+
getFieldErrors,
|
|
293
|
+
setFieldFocus,
|
|
294
|
+
}) {
|
|
295
|
+
return storeSet(
|
|
296
|
+
produce<any>((state: any) => {
|
|
297
|
+
const storeListeners = state.formInstances;
|
|
298
|
+
const findListenerIndex = storeListeners.findIndex(
|
|
299
|
+
(l) => l.formName === formName,
|
|
300
|
+
);
|
|
301
|
+
if (findListenerIndex > -1) {
|
|
302
|
+
if (!isNil(resetFields)) {
|
|
303
|
+
storeListeners[findListenerIndex].resetFields = resetFields;
|
|
304
|
+
}
|
|
305
|
+
if (!isNil(submit)) {
|
|
306
|
+
storeListeners[findListenerIndex].submit = submit;
|
|
307
|
+
}
|
|
308
|
+
if (!isNil(setFieldFocus)) {
|
|
309
|
+
storeListeners[findListenerIndex].setFieldFocus = setFieldFocus;
|
|
310
|
+
}
|
|
311
|
+
if (!isNil(submitAsync)) {
|
|
312
|
+
storeListeners[findListenerIndex].submitAsync = submitAsync;
|
|
290
313
|
}
|
|
291
|
-
storeListeners.push({
|
|
292
|
-
formName,
|
|
293
|
-
resetFields,
|
|
294
|
-
submit,
|
|
295
|
-
submitAsync,
|
|
296
|
-
setFieldValue,
|
|
297
|
-
setFieldValues,
|
|
298
|
-
getFieldValue,
|
|
299
|
-
getFieldValues,
|
|
300
|
-
getFieldErrors,
|
|
301
|
-
setFieldFocus,
|
|
302
|
-
});
|
|
303
|
-
}),
|
|
304
|
-
);
|
|
305
|
-
},
|
|
306
|
-
revokeFormInstance({ formName }) {
|
|
307
|
-
return storeSet(
|
|
308
|
-
produce<any>((state: any) => {
|
|
309
|
-
const instances = state.formInstances;
|
|
310
|
-
|
|
311
|
-
const findInstanceIndex = instances.findIndex(
|
|
312
|
-
(l) => l.formName == formName,
|
|
313
|
-
);
|
|
314
314
|
|
|
315
|
-
|
|
315
|
+
if (!isNil(setFieldValue)) {
|
|
316
|
+
storeListeners[findListenerIndex].setFieldValue = setFieldValue;
|
|
317
|
+
}
|
|
316
318
|
|
|
317
|
-
if (
|
|
318
|
-
|
|
319
|
+
if (!isNil(setFieldValues)) {
|
|
320
|
+
storeListeners[findListenerIndex].setFieldValues = setFieldValues;
|
|
321
|
+
}
|
|
319
322
|
|
|
320
|
-
|
|
323
|
+
if (!isNil(getFieldValue)) {
|
|
324
|
+
storeListeners[findListenerIndex].getFieldValue = getFieldValue;
|
|
325
|
+
}
|
|
321
326
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
// instances.filter(
|
|
325
|
-
// (l) =>
|
|
326
|
-
// l.name === listenersInfo.name &&
|
|
327
|
-
// l.formName === listenersInfo.formName &&
|
|
328
|
-
// l.formItemId !== listenersInfo.formItemId
|
|
329
|
-
// )
|
|
330
|
-
// );
|
|
327
|
+
if (!isNil(getFieldValues)) {
|
|
328
|
+
storeListeners[findListenerIndex].getFieldValues = getFieldValues;
|
|
331
329
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
getCurrentSubmit(formName) {
|
|
337
|
-
return last(get(storeGet().submitHistory, formName)) || null;
|
|
338
|
-
},
|
|
339
|
-
getSubmitHistory(formName) {
|
|
340
|
-
return get(storeGet().submitHistory, formName);
|
|
341
|
-
},
|
|
342
|
-
setSubmitHistory(formName, submitData) {
|
|
343
|
-
return storeSet(
|
|
344
|
-
produce<any>((state: any) => {
|
|
345
|
-
const oldValues = get(state.submitHistory, formName);
|
|
346
|
-
if (oldValues) {
|
|
347
|
-
oldValues.push(submitData);
|
|
348
|
-
oldValues.splice(0, oldValues.length - 3);
|
|
349
|
-
} else {
|
|
350
|
-
set(state.submitHistory, formName, [submitData]);
|
|
330
|
+
|
|
331
|
+
if (!isNil(getFieldErrors)) {
|
|
332
|
+
storeListeners[findListenerIndex].getFieldErrors = getFieldErrors;
|
|
351
333
|
}
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
334
|
+
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
storeListeners.push({
|
|
338
|
+
formName,
|
|
339
|
+
resetFields,
|
|
340
|
+
submit,
|
|
341
|
+
submitAsync,
|
|
342
|
+
setFieldValue,
|
|
343
|
+
setFieldValues,
|
|
344
|
+
getFieldValue,
|
|
345
|
+
getFieldValues,
|
|
346
|
+
getFieldErrors,
|
|
347
|
+
setFieldFocus,
|
|
348
|
+
});
|
|
349
|
+
}),
|
|
350
|
+
);
|
|
351
|
+
},
|
|
352
|
+
revokeFormInstance({ formName }) {
|
|
353
|
+
return storeSet(
|
|
354
|
+
produce<any>((state: any) => {
|
|
355
|
+
const instances = state.formInstances;
|
|
356
|
+
|
|
357
|
+
const findInstanceIndex = instances.findIndex(
|
|
358
|
+
(l) => l.formName == formName,
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
// console.log("Find item for revoke: ", findListenerIndex, formItemId);
|
|
362
|
+
|
|
363
|
+
if (findInstanceIndex > -1) {
|
|
364
|
+
// const listenersInfo = cloneDeep(instances[findInstanceIndex]);
|
|
365
|
+
|
|
366
|
+
instances.splice(findInstanceIndex, 1);
|
|
367
|
+
|
|
368
|
+
// onAfterRevoke(
|
|
369
|
+
// listenersInfo,
|
|
370
|
+
// instances.filter(
|
|
371
|
+
// (l) =>
|
|
372
|
+
// l.name === listenersInfo.name &&
|
|
373
|
+
// l.formName === listenersInfo.formName &&
|
|
374
|
+
// l.formItemId !== listenersInfo.formItemId
|
|
375
|
+
// )
|
|
376
|
+
// );
|
|
377
|
+
}
|
|
378
|
+
}),
|
|
379
|
+
);
|
|
380
|
+
},
|
|
381
|
+
|
|
382
|
+
getCurrentSubmit(formName) {
|
|
383
|
+
return last(get(storeGet().submitHistory, formName)) || null;
|
|
384
|
+
},
|
|
385
|
+
getSubmitHistory(formName) {
|
|
386
|
+
return get(storeGet().submitHistory, formName);
|
|
387
|
+
},
|
|
388
|
+
setSubmitHistory(formName, submitData) {
|
|
389
|
+
return storeSet(
|
|
390
|
+
produce<any>((state: any) => {
|
|
391
|
+
const oldValues = get(state.submitHistory, formName);
|
|
392
|
+
if (oldValues) {
|
|
393
|
+
oldValues.push(submitData);
|
|
394
|
+
oldValues.splice(0, oldValues.length - 3);
|
|
395
|
+
} else {
|
|
396
|
+
set(state.submitHistory, formName, [submitData]);
|
|
397
|
+
}
|
|
398
|
+
console.log("Submit history: ", formName);
|
|
399
|
+
}),
|
|
400
|
+
);
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
// Listeners Slice
|
|
405
|
+
const createListenersSlice = (storeSet: any, storeGet: any, api: any) => ({
|
|
406
|
+
listeners: [] as ListenerItem[],
|
|
361
407
|
getListener(formItemId) {
|
|
362
408
|
return storeGet().listeners.find((l) => l.formItemId === formItemId);
|
|
363
409
|
},
|
|
@@ -376,7 +422,11 @@ export const useFormListeners = create<any>((storeSet: any, storeGet: any) => ({
|
|
|
376
422
|
onFocus,
|
|
377
423
|
emitFocus,
|
|
378
424
|
isInitied,
|
|
379
|
-
|
|
425
|
+
type,
|
|
426
|
+
onArrayChange,
|
|
427
|
+
hidden,
|
|
428
|
+
collectOnHidden,
|
|
429
|
+
}: Partial<ListenerItem> & { formItemId: string }) {
|
|
380
430
|
return storeSet(
|
|
381
431
|
produce<any>((state: any) => {
|
|
382
432
|
const storeListeners = state.listeners;
|
|
@@ -417,6 +467,18 @@ export const useFormListeners = create<any>((storeSet: any, storeGet: any) => ({
|
|
|
417
467
|
storeListeners[findListenerIndex].isInitied = isInitied;
|
|
418
468
|
}
|
|
419
469
|
|
|
470
|
+
if (!isNil(onArrayChange)) {
|
|
471
|
+
storeListeners[findListenerIndex].onArrayChange = onArrayChange;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
if (!isNil(hidden)) {
|
|
475
|
+
storeListeners[findListenerIndex].hidden = hidden;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
if (!isNil(collectOnHidden)) {
|
|
479
|
+
storeListeners[findListenerIndex].collectOnHidden = collectOnHidden;
|
|
480
|
+
}
|
|
481
|
+
|
|
420
482
|
return;
|
|
421
483
|
}
|
|
422
484
|
storeListeners.push({
|
|
@@ -429,6 +491,12 @@ export const useFormListeners = create<any>((storeSet: any, storeGet: any) => ({
|
|
|
429
491
|
onChange,
|
|
430
492
|
onReset,
|
|
431
493
|
isInitied: Boolean(isInitied),
|
|
494
|
+
type: type || "normal",
|
|
495
|
+
onArrayChange,
|
|
496
|
+
onFocus,
|
|
497
|
+
emitFocus,
|
|
498
|
+
hidden: Boolean(hidden),
|
|
499
|
+
collectOnHidden,
|
|
432
500
|
});
|
|
433
501
|
}),
|
|
434
502
|
);
|
|
@@ -462,9 +530,10 @@ export const useFormListeners = create<any>((storeSet: any, storeGet: any) => ({
|
|
|
462
530
|
}),
|
|
463
531
|
);
|
|
464
532
|
},
|
|
465
|
-
})
|
|
533
|
+
});
|
|
466
534
|
|
|
467
|
-
|
|
535
|
+
// CleanUp Slice
|
|
536
|
+
const createCleanUpSlice = (storeSet: any, storeGet: any, api: any) => ({
|
|
468
537
|
cleanUpStack: [],
|
|
469
538
|
setCleanUpStack({ name, type, itemKey, formName }) {
|
|
470
539
|
return storeSet(
|
|
@@ -482,4 +551,15 @@ export const useFormCleanUp = create<any>((storeSet: any) => ({
|
|
|
482
551
|
}),
|
|
483
552
|
);
|
|
484
553
|
},
|
|
554
|
+
});
|
|
555
|
+
|
|
556
|
+
// Combined Store
|
|
557
|
+
export const useFormStore = create<FormStoreState>((...a) => ({
|
|
558
|
+
...createFormStoreSlice(...a),
|
|
559
|
+
...createListenersSlice(...a),
|
|
560
|
+
...createCleanUpSlice(...a),
|
|
485
561
|
}));
|
|
562
|
+
|
|
563
|
+
// Deprecated exports - use useFormStore instead
|
|
564
|
+
export const useFormListeners = useFormStore;
|
|
565
|
+
export const useFormCleanUp = useFormStore;
|