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.
Files changed (94) hide show
  1. package/CHANGELOG.md +173 -4
  2. package/README.md +8 -4
  3. package/dist/components/Form/FormCleanUp.js +3 -3
  4. package/dist/components/Form/FormItem.d.ts +10 -4
  5. package/dist/components/Form/FormItem.js +52 -14
  6. package/dist/components/Form/FormList.d.ts +2 -2
  7. package/dist/components/Form/FormList.js +2 -2
  8. package/dist/constants/form.d.ts +1 -1
  9. package/dist/hooks/useFormItemControl.d.ts +8 -3
  10. package/dist/hooks/useFormItemControl.js +64 -28
  11. package/dist/hooks/useFormListControl.d.ts +2 -1
  12. package/dist/hooks/useFormListControl.js +85 -19
  13. package/dist/index.cjs.d.ts +1 -0
  14. package/dist/index.d.ts +4 -3
  15. package/dist/index.esm.d.ts +1 -0
  16. package/dist/index.js +4 -2
  17. package/dist/providers/Form.d.ts +15 -2
  18. package/dist/providers/Form.js +226 -41
  19. package/dist/stores/formStore.d.ts +44 -4
  20. package/dist/stores/formStore.js +42 -7
  21. package/dist/test/CommonTest.d.ts +3 -0
  22. package/dist/test/CommonTest.js +49 -0
  23. package/dist/test/TestDialog.d.ts +3 -0
  24. package/dist/test/TestDialog.js +21 -0
  25. package/dist/test/TestListener.d.ts +3 -0
  26. package/dist/test/TestListener.js +17 -0
  27. package/dist/test/TestNotFormWrapper.d.ts +3 -0
  28. package/dist/test/TestNotFormWrapper.js +15 -0
  29. package/dist/test/TestSelect.d.ts +6 -0
  30. package/dist/test/TestSelect.js +24 -0
  31. package/dist/test/TestWatchNormalize.d.ts +3 -0
  32. package/dist/test/TestWatchNormalize.js +23 -0
  33. package/dist/test/TestWrapperFormItem.d.ts +3 -0
  34. package/dist/test/TestWrapperFormItem.js +13 -0
  35. package/dist/test/testSetValue/TestCase10_SetFieldValues_ComplexNested.d.ts +21 -0
  36. package/dist/test/testSetValue/TestCase10_SetFieldValues_ComplexNested.js +61 -0
  37. package/dist/test/testSetValue/TestCase1_PlainObjectToPrimitives.d.ts +16 -0
  38. package/dist/test/testSetValue/TestCase1_PlainObjectToPrimitives.js +18 -0
  39. package/dist/test/testSetValue/TestCase2_PlainObjectToFormList.d.ts +21 -0
  40. package/dist/test/testSetValue/TestCase2_PlainObjectToFormList.js +33 -0
  41. package/dist/test/testSetValue/TestCase3_ArrayNonListenerToPrimitives.d.ts +21 -0
  42. package/dist/test/testSetValue/TestCase3_ArrayNonListenerToPrimitives.js +26 -0
  43. package/dist/test/testSetValue/TestCase4_PlainObjectRemovedFields.d.ts +20 -0
  44. package/dist/test/testSetValue/TestCase4_PlainObjectRemovedFields.js +32 -0
  45. package/dist/test/testSetValue/TestCase5_FormListRemovedItems.d.ts +22 -0
  46. package/dist/test/testSetValue/TestCase5_FormListRemovedItems.js +29 -0
  47. package/dist/test/testSetValue/TestCase6_NestedFormListRemoved.d.ts +28 -0
  48. package/dist/test/testSetValue/TestCase6_NestedFormListRemoved.js +36 -0
  49. package/dist/test/testSetValue/TestCase7_SetFieldValues_MixedStructure.d.ts +17 -0
  50. package/dist/test/testSetValue/TestCase7_SetFieldValues_MixedStructure.js +33 -0
  51. package/dist/test/testSetValue/TestCase8_SetFieldValues_NestedObject.d.ts +27 -0
  52. package/dist/test/testSetValue/TestCase8_SetFieldValues_NestedObject.js +57 -0
  53. package/dist/test/testSetValue/TestCase9_SetFieldValues_MultipleArrays.d.ts +25 -0
  54. package/dist/test/testSetValue/TestCase9_SetFieldValues_MultipleArrays.js +46 -0
  55. package/dist/test/testSetValue/index.d.ts +2 -0
  56. package/dist/test/testSetValue/index.js +28 -0
  57. package/dist/types/index.d.ts +1 -1
  58. package/dist/types/public.d.ts +1 -1
  59. package/dist/utils/obj.util.d.ts +29 -1
  60. package/dist/utils/obj.util.js +59 -5
  61. package/package.json +2 -1
  62. package/src/App.tsx +39 -156
  63. package/src/DEEP_TRIGGER_LOGIC.md +573 -0
  64. package/src/components/Form/FormCleanUp.tsx +4 -8
  65. package/src/components/Form/FormItem.tsx +174 -57
  66. package/src/components/Form/FormList.tsx +17 -4
  67. package/src/constants/form.ts +1 -1
  68. package/src/hooks/useFormItemControl.ts +78 -32
  69. package/src/hooks/useFormListControl.ts +133 -43
  70. package/src/index.ts +25 -13
  71. package/src/main.tsx +6 -1
  72. package/src/providers/Form.tsx +454 -26
  73. package/src/stores/formStore.ts +363 -283
  74. package/src/test/CommonTest.tsx +177 -0
  75. package/src/test/TestDialog.tsx +52 -0
  76. package/src/test/TestListener.tsx +21 -0
  77. package/src/test/TestNotFormWrapper.tsx +43 -0
  78. package/src/test/TestSelect.tsx +38 -0
  79. package/src/test/TestWatchNormalize.tsx +32 -0
  80. package/src/test/TestWrapperFormItem.tsx +34 -0
  81. package/src/test/testSetValue/TestCase10_SetFieldValues_ComplexNested.tsx +203 -0
  82. package/src/test/testSetValue/TestCase1_PlainObjectToPrimitives.tsx +72 -0
  83. package/src/test/testSetValue/TestCase2_PlainObjectToFormList.tsx +114 -0
  84. package/src/test/testSetValue/TestCase3_ArrayNonListenerToPrimitives.tsx +99 -0
  85. package/src/test/testSetValue/TestCase4_PlainObjectRemovedFields.tsx +112 -0
  86. package/src/test/testSetValue/TestCase5_FormListRemovedItems.tsx +119 -0
  87. package/src/test/testSetValue/TestCase6_NestedFormListRemoved.tsx +185 -0
  88. package/src/test/testSetValue/TestCase7_SetFieldValues_MixedStructure.tsx +110 -0
  89. package/src/test/testSetValue/TestCase8_SetFieldValues_NestedObject.tsx +162 -0
  90. package/src/test/testSetValue/TestCase9_SetFieldValues_MultipleArrays.tsx +169 -0
  91. package/src/test/testSetValue/index.tsx +100 -0
  92. package/src/types/index.ts +1 -1
  93. package/src/types/public.ts +1 -1
  94. package/src/utils/obj.util.ts +153 -13
@@ -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: (values?: any) => void;
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
- export const useFormStore = create<FormStoreState>(
52
- (storeSet: any, storeGet: any) => ({
53
- forms: {},
54
- initialValues: {},
55
- formStates: {},
56
- cacheData: {},
57
- formInstances: [],
58
- submitHistory: {},
59
- setData(formName, name, value) {
60
- return storeSet(
61
- produce<any>((state: any) => {
62
- const oldValues = state.forms;
63
- set(oldValues, `${formName}.${name}`, value);
64
- }),
65
- );
66
- },
67
-
68
- getCacheData(formName) {
69
- return get(storeGet(), `cacheData.${formName}`);
70
- },
71
-
72
- setCacheData(formName, name, value) {
73
- return storeSet(
74
- produce<any>((state: any) => {
75
- const oldValues = state.cacheData;
76
- set(oldValues, `${formName}.${name}`, value);
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
- getFormItemValue(formName, name) {
96
- return get(storeGet().forms?.[formName], name);
97
- },
103
+ clearCacheData(formName) {
104
+ return storeSet(
105
+ produce<any>((state: any) => {
106
+ const oldValues = state.cacheData;
98
107
 
99
- getFormValues(formName) {
100
- return storeGet().forms?.[formName];
101
- },
108
+ if (formName) {
109
+ set(oldValues, formName, {});
110
+ } else {
111
+ set(oldValues, "", {});
112
+ }
113
+ }),
114
+ );
115
+ },
102
116
 
103
- clearFormValues(formName) {
104
- return storeSet(
105
- produce<any>((state: any) => {
106
- const oldValues = state.forms;
117
+ getFormItemValue(formName, name) {
118
+ return get(storeGet().forms?.[formName], name);
119
+ },
107
120
 
108
- // console.log("Clear form values", formName);
121
+ getFormValues(formName) {
122
+ return storeGet().forms?.[formName];
123
+ },
109
124
 
110
- unset(oldValues, formName);
125
+ clearFormValues(formName) {
126
+ return storeSet(
127
+ produce<any>((state: any) => {
128
+ const oldValues = state.forms;
111
129
 
112
- // console.log(JSON.parse(JSON.stringify(oldValues)));
113
- }),
114
- );
115
- },
130
+ // console.log("Clear form values", formName);
116
131
 
117
- clearFormInitialValues(formName) {
118
- return storeSet(
119
- produce<any>((state: any) => {
120
- const oldValues = state.initialValues;
132
+ unset(oldValues, formName);
121
133
 
122
- // console.log("Clear form initial values", formName);
134
+ // console.log(JSON.parse(JSON.stringify(oldValues)));
135
+ }),
136
+ );
137
+ },
123
138
 
124
- unset(oldValues, formName);
139
+ clearFormInitialValues(formName) {
140
+ return storeSet(
141
+ produce<any>((state: any) => {
142
+ const oldValues = state.initialValues;
125
143
 
126
- // console.log(JSON.parse(JSON.stringify(oldValues)));
127
- }),
128
- );
129
- },
144
+ // console.log("Clear form initial values", formName);
130
145
 
131
- clearObjKeyItem(formName, name) {
132
- return storeSet(
133
- produce<any>((state: any) => {
134
- const oldValues = state.forms;
146
+ unset(oldValues, formName);
135
147
 
136
- // console.log("Clear item value", formName, name);
148
+ // console.log(JSON.parse(JSON.stringify(oldValues)));
149
+ }),
150
+ );
151
+ },
137
152
 
138
- unset(oldValues, `${formName}.${name}`);
153
+ clearObjKeyItem(formName, name) {
154
+ return storeSet(
155
+ produce<any>((state: any) => {
156
+ const oldValues = state.forms;
139
157
 
140
- // console.log(JSON.parse(JSON.stringify(oldValues)));
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
- console.log("Clear item array value", formName, name);
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
- // console.log(JSON.parse(JSON.stringify(oldValues)));
162
- }),
163
- );
164
- },
165
-
166
- setFormState({ formName, isInitied, submitState }) {
167
- return storeSet(
168
- produce<any>((state: any) => {
169
- const oldValues = state.formStates;
170
- const getFormState = get(storeGet().formStates, formName);
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
- clearFormState(formName) {
188
- return storeSet(
189
- produce<any>((state: any) => {
190
- const oldValues = state.formStates;
191
-
192
- // console.log("Clear form state", formName);
193
-
194
- unset(oldValues, formName);
195
-
196
- // console.log(JSON.parse(JSON.stringify(oldValues)));
197
- }),
198
- );
199
- },
200
-
201
- getFormState(formName) {
202
- return get(storeGet(), `formStates.${formName}`);
203
- },
204
-
205
- setFormInitData(formName, initValues) {
206
- return storeSet(
207
- produce<any>((state: any) => {
208
- const oldValues = state.initialValues;
209
- const listInitPath = getAllNoneObjStringPath(initValues);
210
-
211
- // console.log({ listInitPath, initValues });
212
-
213
- listInitPath.forEach((k) => {
214
- if (get(initValues, k)) {
215
- // console.log("init form data values: ", k, get(initValues, k));
216
- set(oldValues, `${formName}.${k}`, get(initValues, k));
217
- }
218
- });
219
- }),
220
- );
221
- },
222
-
223
- getInitData(formName, name) {
224
- return get(storeGet().initialValues, `${formName}.${name}`);
225
- },
226
-
227
- setInitData(formName, name, value) {
228
- return storeSet(
229
- produce<any>((state: any) => {
230
- const oldValues = state.initialValues;
231
- console.log("Inner init: ", `${formName}.${name}`, value);
232
- set(oldValues, `${formName}.${name}`, value);
233
- }),
234
- );
235
- },
236
-
237
- setFormInstance({
238
- formName,
239
- resetFields,
240
- submit,
241
- submitAsync,
242
- setFieldValue,
243
- setFieldValues,
244
- getFieldValue,
245
- getFieldValues,
246
- getFieldErrors,
247
- setFieldFocus,
248
- }) {
249
- return storeSet(
250
- produce<any>((state: any) => {
251
- const storeListeners = state.formInstances;
252
- const findListenerIndex = storeListeners.findIndex(
253
- (l) => l.formName === formName,
254
- );
255
- if (findListenerIndex > -1) {
256
- if (!isNil(resetFields)) {
257
- storeListeners[findListenerIndex].resetFields = resetFields;
258
- }
259
- if (!isNil(submit)) {
260
- storeListeners[findListenerIndex].submit = submit;
261
- }
262
- if (!isNil(setFieldFocus)) {
263
- storeListeners[findListenerIndex].setFieldFocus = setFieldFocus;
264
- }
265
- if (!isNil(submitAsync)) {
266
- storeListeners[findListenerIndex].submitAsync = submitAsync;
267
- }
268
-
269
- if (!isNil(setFieldValue)) {
270
- storeListeners[findListenerIndex].setFieldValue = setFieldValue;
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
- // console.log("Find item for revoke: ", findListenerIndex, formItemId);
315
+ if (!isNil(setFieldValue)) {
316
+ storeListeners[findListenerIndex].setFieldValue = setFieldValue;
317
+ }
316
318
 
317
- if (findInstanceIndex > -1) {
318
- // const listenersInfo = cloneDeep(instances[findInstanceIndex]);
319
+ if (!isNil(setFieldValues)) {
320
+ storeListeners[findListenerIndex].setFieldValues = setFieldValues;
321
+ }
319
322
 
320
- instances.splice(findInstanceIndex, 1);
323
+ if (!isNil(getFieldValue)) {
324
+ storeListeners[findListenerIndex].getFieldValue = getFieldValue;
325
+ }
321
326
 
322
- // onAfterRevoke(
323
- // listenersInfo,
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
- console.log("Submit history: ", formName);
353
- }),
354
- );
355
- },
356
- }),
357
- );
358
-
359
- export const useFormListeners = create<any>((storeSet: any, storeGet: any) => ({
360
- listeners: [],
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
- export const useFormCleanUp = create<any>((storeSet: any) => ({
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;