react-form-manage 1.0.6-beta.2 → 1.0.6-beta.3

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.
@@ -6,15 +6,15 @@ import { getAllNoneObjStringPath } from "../utils/obj.util";
6
6
 
7
7
  export interface FormInstance {
8
8
  formName: string;
9
- resetFields?: any;
10
- submit?: any;
11
- submitAsync?: any;
12
- setFieldValue?: any;
13
- setFieldValues?: any;
14
- getFieldValue?: any;
15
- getFieldValues?: any;
16
- getFieldErrors?: any;
17
- setFieldFocus?: any;
9
+ resetFields: (values?: any) => void;
10
+ submit: (values?: any) => void;
11
+ submitAsync: (values?: any) => Promise<any>;
12
+ setFieldValue: (name: string, value: any, options?: any) => void;
13
+ setFieldValues: (values: Record<string, any>, options?: any) => void;
14
+ getFieldValue: (name: string) => any;
15
+ getFieldValues: (names?: string[]) => Array<{ name: string; value: any }>;
16
+ getFieldErrors: () => Record<string, any>;
17
+ setFieldFocus: (name: string) => void;
18
18
  }
19
19
 
20
20
  interface ListenerItem {
@@ -48,311 +48,313 @@ interface FormStoreState {
48
48
  // methods (loose typed for incremental migration)
49
49
  [key: string]: any;
50
50
  }
51
- export const useFormStore = create<FormStoreState>((storeSet: any, storeGet: any) => ({
52
- forms: {},
53
- initialValues: {},
54
- formStates: {},
55
- cacheData: {},
56
- formInstances: [],
57
- submitHistory: {},
58
- setData(formName, name, value) {
59
- return storeSet(
60
- produce<any>((state: any) => {
61
- const oldValues = state.forms;
62
- set(oldValues, `${formName}.${name}`, value);
63
- }),
64
- );
65
- },
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
+ },
66
94
 
67
- getCacheData(formName) {
68
- return get(storeGet(), `cacheData.${formName}`);
69
- },
95
+ getFormItemValue(formName, name) {
96
+ return get(storeGet().forms?.[formName], name);
97
+ },
70
98
 
71
- setCacheData(formName, name, value) {
72
- return storeSet(
73
- produce<any>((state: any) => {
74
- const oldValues = state.cacheData;
75
- set(oldValues, `${formName}.${name}`, value);
76
- }),
77
- );
78
- },
99
+ getFormValues(formName) {
100
+ return storeGet().forms?.[formName];
101
+ },
79
102
 
80
- clearCacheData(formName) {
81
- return storeSet(
82
- produce<any>((state: any) => {
83
- const oldValues = state.cacheData;
103
+ clearFormValues(formName) {
104
+ return storeSet(
105
+ produce<any>((state: any) => {
106
+ const oldValues = state.forms;
84
107
 
85
- if (formName) {
86
- set(oldValues, formName, {});
87
- } else {
88
- set(oldValues, "", {});
89
- }
90
- }),
91
- );
92
- },
108
+ // console.log("Clear form values", formName);
93
109
 
94
- getFormItemValue(formName, name) {
95
- return get(storeGet().forms?.[formName], name);
96
- },
110
+ unset(oldValues, formName);
97
111
 
98
- getFormValues(formName) {
99
- return storeGet().forms?.[formName];
100
- },
112
+ // console.log(JSON.parse(JSON.stringify(oldValues)));
113
+ }),
114
+ );
115
+ },
101
116
 
102
- clearFormValues(formName) {
103
- return storeSet(
104
- produce<any>((state: any) => {
105
- const oldValues = state.forms;
117
+ clearFormInitialValues(formName) {
118
+ return storeSet(
119
+ produce<any>((state: any) => {
120
+ const oldValues = state.initialValues;
106
121
 
107
- // console.log("Clear form values", formName);
122
+ // console.log("Clear form initial values", formName);
108
123
 
109
- unset(oldValues, formName);
124
+ unset(oldValues, formName);
110
125
 
111
- // console.log(JSON.parse(JSON.stringify(oldValues)));
112
- }),
113
- );
114
- },
126
+ // console.log(JSON.parse(JSON.stringify(oldValues)));
127
+ }),
128
+ );
129
+ },
115
130
 
116
- clearFormInitialValues(formName) {
117
- return storeSet(
118
- produce<any>((state: any) => {
119
- const oldValues = state.initialValues;
131
+ clearObjKeyItem(formName, name) {
132
+ return storeSet(
133
+ produce<any>((state: any) => {
134
+ const oldValues = state.forms;
120
135
 
121
- // console.log("Clear form initial values", formName);
136
+ // console.log("Clear item value", formName, name);
122
137
 
123
- unset(oldValues, formName);
138
+ unset(oldValues, `${formName}.${name}`);
124
139
 
125
- // console.log(JSON.parse(JSON.stringify(oldValues)));
126
- }),
127
- );
128
- },
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;
129
148
 
130
- clearObjKeyItem(formName, name) {
131
- return storeSet(
132
- produce<any>((state: any) => {
133
- const oldValues = state.forms;
149
+ console.log("Clear item array value", formName, name);
134
150
 
135
- // console.log("Clear item value", formName, name);
151
+ const arrPath = name.split(".").slice(0, -1).join(".");
136
152
 
137
- unset(oldValues, `${formName}.${name}`);
153
+ const elPath = Number(name.split(".").slice(-1).join(""));
138
154
 
139
- // console.log(JSON.parse(JSON.stringify(oldValues)));
140
- }),
141
- );
142
- },
143
- clearArrItem(formName, name) {
144
- return storeSet(
145
- produce<any>((state: any) => {
146
- const oldValues = state.forms;
147
-
148
- console.log("Clear item array value", formName, name);
149
-
150
- const arrPath = name.split(".").slice(0, -1).join(".");
151
-
152
- const elPath = Number(name.split(".").slice(-1).join(""));
153
-
154
- const getArrItem = get(oldValues, `${formName}.${arrPath}`);
155
-
156
- if (isNumber(elPath)) {
157
- getArrItem.splice(elPath, 1);
158
- }
159
-
160
- // console.log(JSON.parse(JSON.stringify(oldValues)));
161
- }),
162
- );
163
- },
164
-
165
- setFormState({ formName, isInitied, submitState }) {
166
- return storeSet(
167
- produce<any>((state: any) => {
168
- const oldValues = state.formStates;
169
- const getFormState = get(storeGet().formStates, formName);
170
-
171
- if (isNil(getFormState)) {
172
- set(oldValues, formName, { isInitied, submitState });
173
- } else {
174
- if (!isNil(isInitied)) {
175
- set(oldValues, `${formName}.isInitied`, isInitied);
176
- }
155
+ const getArrItem = get(oldValues, `${formName}.${arrPath}`);
177
156
 
178
- if (!isNil(submitState)) {
179
- set(oldValues, `${formName}.submitState`, submitState);
157
+ if (isNumber(elPath)) {
158
+ getArrItem.splice(elPath, 1);
180
159
  }
181
- }
182
- }),
183
- );
184
- },
185
-
186
- clearFormState(formName) {
187
- return storeSet(
188
- produce<any>((state: any) => {
189
- const oldValues = state.formStates;
190
-
191
- // console.log("Clear form state", formName);
192
-
193
- unset(oldValues, formName);
194
-
195
- // console.log(JSON.parse(JSON.stringify(oldValues)));
196
- }),
197
- );
198
- },
199
-
200
- getFormState(formName) {
201
- return get(storeGet(), `formStates.${formName}`);
202
- },
203
-
204
- setFormInitData(formName, initValues) {
205
- return storeSet(
206
- produce<any>((state: any) => {
207
- const oldValues = state.initialValues;
208
- const listInitPath = getAllNoneObjStringPath(initValues);
209
-
210
- // console.log({ listInitPath, initValues });
211
160
 
212
- listInitPath.forEach((k) => {
213
- if (get(initValues, k)) {
214
- // console.log("init form data values: ", k, get(initValues, k));
215
- set(oldValues, `${formName}.${k}`, get(initValues, k));
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
+ }
216
182
  }
217
- });
218
- }),
219
- );
220
- },
221
-
222
- getInitData(formName, name) {
223
- return get(storeGet().initialValues, `${formName}.${name}`);
224
- },
225
-
226
- setInitData(formName, name, value) {
227
- return storeSet(
228
- produce<any>((state: any) => {
229
- const oldValues = state.initialValues;
230
- // console.log("Inner init: ", `${formName}.${name}`, value);
231
- set(oldValues, `${formName}.${name}`, value);
232
- }),
233
- );
234
- },
235
-
236
- setFormInstance({
237
- formName,
238
- resetFields,
239
- submit,
240
- submitAsync,
241
- setFieldValue,
242
- setFieldValues,
243
- getFieldValue,
244
- getFieldValues,
245
- getFieldErrors,
246
- setFieldFocus,
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,
247
248
  }) {
248
- return storeSet(
249
- produce<any>((state: any) => {
250
- const storeListeners = state.formInstances;
251
- const findListenerIndex = storeListeners.findIndex(
252
- (l) => l.formName === formName,
253
- );
254
- if (findListenerIndex > -1) {
255
- if (!isNil(resetFields)) {
256
- storeListeners[findListenerIndex].resetFields = resetFields;
257
- }
258
- if (!isNil(submit)) {
259
- storeListeners[findListenerIndex].submit = submit;
260
- }
261
- if (!isNil(setFieldFocus)) {
262
- storeListeners[findListenerIndex].setFieldFocus = setFieldFocus;
263
- }
264
- if (!isNil(submitAsync)) {
265
- storeListeners[findListenerIndex].submitAsync = submitAsync;
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;
266
290
  }
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
+ );
267
314
 
268
- if (!isNil(setFieldValue)) {
269
- storeListeners[findListenerIndex].setFieldValue = setFieldValue;
270
- }
315
+ // console.log("Find item for revoke: ", findListenerIndex, formItemId);
271
316
 
272
- if (!isNil(setFieldValues)) {
273
- storeListeners[findListenerIndex].setFieldValues = setFieldValues;
274
- }
317
+ if (findInstanceIndex > -1) {
318
+ // const listenersInfo = cloneDeep(instances[findInstanceIndex]);
275
319
 
276
- if (!isNil(getFieldValue)) {
277
- storeListeners[findListenerIndex].getFieldValue = getFieldValue;
278
- }
320
+ instances.splice(findInstanceIndex, 1);
279
321
 
280
- if (!isNil(getFieldValues)) {
281
- storeListeners[findListenerIndex].getFieldValues = getFieldValues;
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
+ // );
282
331
  }
283
-
284
- if (!isNil(getFieldErrors)) {
285
- storeListeners[findListenerIndex].getFieldErrors = getFieldErrors;
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]);
286
351
  }
287
-
288
- return;
289
- }
290
- storeListeners.push({
291
- formName,
292
- resetFields,
293
- submit,
294
- submitAsync,
295
- setFieldValue,
296
- setFieldValues,
297
- getFieldValue,
298
- getFieldValues,
299
- getFieldErrors,
300
- setFieldFocus,
301
- });
302
- }),
303
- );
304
- },
305
- revokeFormInstance({ formName }) {
306
- return storeSet(
307
- produce<any>((state: any) => {
308
- const instances = state.formInstances;
309
-
310
- const findInstanceIndex = instances.findIndex(
311
- (l) => l.formName == formName,
312
- );
313
-
314
- // console.log("Find item for revoke: ", findListenerIndex, formItemId);
315
-
316
- if (findInstanceIndex > -1) {
317
- // const listenersInfo = cloneDeep(instances[findInstanceIndex]);
318
-
319
- instances.splice(findInstanceIndex, 1);
320
-
321
- // onAfterRevoke(
322
- // listenersInfo,
323
- // instances.filter(
324
- // (l) =>
325
- // l.name === listenersInfo.name &&
326
- // l.formName === listenersInfo.formName &&
327
- // l.formItemId !== listenersInfo.formItemId
328
- // )
329
- // );
330
- }
331
- }),
332
- );
333
- },
334
-
335
- getCurrentSubmit(formName) {
336
- return last(get(storeGet().submitHistory, formName)) || null;
337
- },
338
- getSubmitHistory(formName) {
339
- return get(storeGet().submitHistory, formName);
340
- },
341
- setSubmitHistory(formName, submitData) {
342
- return storeSet(
343
- produce<any>((state: any) => {
344
- const oldValues = get(state.submitHistory, formName);
345
- if (oldValues) {
346
- oldValues.push(submitData);
347
- oldValues.splice(0, oldValues.length - 3);
348
- } else {
349
- set(state.submitHistory, formName, [submitData]);
350
- }
351
- console.log("Submit history: ", formName);
352
- }),
353
- );
354
- },
355
- }));
352
+ console.log("Submit history: ", formName);
353
+ }),
354
+ );
355
+ },
356
+ }),
357
+ );
356
358
 
357
359
  export const useFormListeners = create<any>((storeSet: any, storeGet: any) => ({
358
360
  listeners: [],
@@ -1,15 +1,43 @@
1
1
  export type FormValues<T = any> = T;
2
2
 
3
+ export interface ValidationRule<T = any, TValues = any> {
4
+ name?: string;
5
+ message: string;
6
+ handler?: (value: T, formValues: TValues) => boolean | Promise<boolean>;
7
+ required?: boolean;
8
+ min?: number;
9
+ max?: number;
10
+ minLength?: number;
11
+ maxLength?: number;
12
+ isPassword?: boolean;
13
+ isUsername?: boolean;
14
+ isPhoneNumber?: boolean;
15
+ isStringNumber?: boolean;
16
+ isPositiveStringNumber?: boolean;
17
+ isPositiveIntegerStringNumber?: boolean;
18
+ isEmail?: boolean;
19
+ isVietnameseName?: boolean;
20
+ isNoSpaceStringAndNumber?: boolean;
21
+ isStringAndNumber?: boolean;
22
+ isNoSpaceOnlyAlphabetStringAndNumber?: boolean;
23
+ isOnlyAlphabetStringAndNumber?: boolean;
24
+ isNoSpaceAlphabetString?: boolean;
25
+ pattern?: RegExp;
26
+ }
27
+
3
28
  export interface PublicFormInstance<T = any> {
4
29
  formName: string;
5
- resetFields?: (values?: Partial<T>) => void;
6
- submit?: (values?: T) => void;
7
- submitAsync?: (values?: T) => Promise<any>;
8
- setFieldValue?: (name: keyof T & string, value: any) => void;
9
- setFieldValues?: (values: Partial<T>) => void;
10
- getFieldValue?: (name: keyof T & string) => any;
11
- getFieldValues?: () => T;
12
- getFieldErrors?: () => Record<string, any>;
30
+ resetFields: (values?: Partial<T>) => void;
31
+ submit: (values?: T) => void;
32
+ submitAsync: (values?: T) => Promise<any>;
33
+ setFieldValue: (name: keyof T & string, value: any, options?: any) => void;
34
+ setFieldValues: (values: Partial<T>, options?: any) => void;
35
+ getFieldValue: (name: keyof T & string) => any;
36
+ getFieldValues: (
37
+ names?: Array<keyof T & string>,
38
+ ) => Array<{ name: string; value: any }>;
39
+ getFieldErrors: () => Record<string, any>;
40
+ setFieldFocus: (name: keyof T & string) => void;
13
41
  }
14
42
 
15
43
  export interface UseFormItemProps<T = any> {
@@ -18,7 +46,7 @@ export interface UseFormItemProps<T = any> {
18
46
  name?: keyof T & string;
19
47
  initialValue?: any;
20
48
  formItemId?: string;
21
- rules?: any[];
49
+ rules?: ValidationRule<any, T>[];
22
50
  }
23
51
 
24
52
  export interface UseFormItemReturn<T = any> {