solid-hook-form 1.9.4 → 1.10.0
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/main.d.ts +15 -7
- package/dist/main.js +34 -6
- package/dist/main.jsx +39 -8
- package/package.json +1 -1
package/dist/main.d.ts
CHANGED
|
@@ -36,6 +36,7 @@ type RegisterReturn<F extends FormValues> = {
|
|
|
36
36
|
ref(ref: Ref): void;
|
|
37
37
|
onInput(event: Event | unknown): void;
|
|
38
38
|
onChange(event: Event | unknown): void;
|
|
39
|
+
onBlur(event: FocusEvent | unknown): void;
|
|
39
40
|
};
|
|
40
41
|
type Register<F extends FormValues> = (name: Path<F>, options?: Rules<F, Path<F>>) => RegisterReturn<F>;
|
|
41
42
|
|
|
@@ -65,18 +66,24 @@ type ControllerProps<F extends FormValues> = {
|
|
|
65
66
|
render(arg: UseControllerReturn<F>): JSXElement;
|
|
66
67
|
};
|
|
67
68
|
|
|
69
|
+
type TouchedFields<F extends FormValues = FormValues> = Partial<Record<Path<F>, boolean>>;
|
|
70
|
+
|
|
68
71
|
type FormValues = Record<string, any>;
|
|
69
72
|
type GetValues<F extends FormValues> = {
|
|
70
73
|
(): F;
|
|
71
74
|
<N extends FieldPath<F>>(name: N): FieldPathValue<F, N>;
|
|
72
75
|
};
|
|
73
76
|
type SetValue<F extends FormValues> = (name: Path<F>, value: FieldPathValue<F, Path<F>>) => void;
|
|
74
|
-
type
|
|
75
|
-
type
|
|
76
|
-
type
|
|
77
|
+
type SubmitHandler<F extends FormValues> = (values: F) => void;
|
|
78
|
+
type SubmitErrorHandler<F extends FormValues> = (errors: FieldErrors<F>) => void;
|
|
79
|
+
type HandleSubmit<F extends FormValues> = (onSubmit: SubmitHandler<F>, onError?: SubmitErrorHandler<F>) => (event: SubmitEvent) => void;
|
|
80
|
+
type ResetOptions = {
|
|
81
|
+
keepTouched?: boolean;
|
|
82
|
+
};
|
|
83
|
+
type Reset<F extends FormValues> = (newDefaultValues?: Partial<F>, options?: ResetOptions) => void;
|
|
77
84
|
type CreateFormArg<F extends FormValues> = {
|
|
78
85
|
defaultValues: F;
|
|
79
|
-
mode?: "onChange" | "onSubmit";
|
|
86
|
+
mode?: "onChange" | "onSubmit" | "onBlur";
|
|
80
87
|
resolver?: Resolver<F>;
|
|
81
88
|
};
|
|
82
89
|
type CreateFormReturn<F extends FormValues = FormValues> = {
|
|
@@ -84,6 +91,7 @@ type CreateFormReturn<F extends FormValues = FormValues> = {
|
|
|
84
91
|
formState: {
|
|
85
92
|
errors: Accessor<FieldErrors<F>>;
|
|
86
93
|
isValid: Accessor<boolean>;
|
|
94
|
+
touchedFields: Accessor<TouchedFields<F>>;
|
|
87
95
|
};
|
|
88
96
|
values: Accessor<F>;
|
|
89
97
|
errors: Accessor<FieldErrors<F>>;
|
|
@@ -91,8 +99,8 @@ type CreateFormReturn<F extends FormValues = FormValues> = {
|
|
|
91
99
|
register: Register<F>;
|
|
92
100
|
getValues: GetValues<F>;
|
|
93
101
|
setValue: SetValue<F>;
|
|
94
|
-
onSubmit:
|
|
95
|
-
handleSubmit:
|
|
102
|
+
onSubmit: HandleSubmit<F>;
|
|
103
|
+
handleSubmit: HandleSubmit<F>;
|
|
96
104
|
reset: Reset<F>;
|
|
97
105
|
};
|
|
98
106
|
type CreateForm = <F extends FormValues>(arg?: CreateFormArg<F>) => CreateFormReturn<F>;
|
|
@@ -114,4 +122,4 @@ declare const get: (object: any, path: string, defaultValue?: unknown) => any;
|
|
|
114
122
|
|
|
115
123
|
declare const set: (object: FormValues, path: string, value: unknown) => void;
|
|
116
124
|
|
|
117
|
-
export { type Control, Controller, type CreateFormArg, type CreateFormReturn, type FieldError, type FieldErrors, FormProvider, type FormValues, type Rules, type UseControllerArg, type UseControllerReturn, createForm, get, set, useController, createForm as useForm, useFormContext };
|
|
125
|
+
export { type Control, Controller, type CreateFormArg, type CreateFormReturn, type FieldError, type FieldErrors, FormProvider, type FormValues, type Rules, type SubmitErrorHandler, type SubmitHandler, type UseControllerArg, type UseControllerReturn, createForm, get, set, useController, createForm as useForm, useFormContext };
|
package/dist/main.js
CHANGED
|
@@ -213,6 +213,23 @@ var getResolverFields = (fields) => {
|
|
|
213
213
|
return acc;
|
|
214
214
|
}, {});
|
|
215
215
|
};
|
|
216
|
+
var createTouched = () => {
|
|
217
|
+
const [touchedFields, setTouchedFields] = createSignal({});
|
|
218
|
+
const addTouched = (name) => {
|
|
219
|
+
setTouchedFields((prev) => {
|
|
220
|
+
const newState = { ...prev };
|
|
221
|
+
set(newState, name, true);
|
|
222
|
+
return newState;
|
|
223
|
+
});
|
|
224
|
+
};
|
|
225
|
+
const resetTouched = (keepTouched) => {
|
|
226
|
+
if (keepTouched) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
setTouchedFields({});
|
|
230
|
+
};
|
|
231
|
+
return { touchedFields, addTouched, resetTouched };
|
|
232
|
+
};
|
|
216
233
|
|
|
217
234
|
// src/create_form.ts
|
|
218
235
|
var createForm = (arg = { defaultValues: {} }) => {
|
|
@@ -221,6 +238,7 @@ var createForm = (arg = { defaultValues: {} }) => {
|
|
|
221
238
|
const { rules, addRule, getRule } = createRules();
|
|
222
239
|
const [values, setValues] = createSignal(defaultValues);
|
|
223
240
|
const { errors, appendError, removeError, resetErrors, getError } = createErrors();
|
|
241
|
+
const { touchedFields, addTouched, resetTouched } = createTouched();
|
|
224
242
|
const isValid = createMemo(() => {
|
|
225
243
|
return !Object.keys(errors()).length;
|
|
226
244
|
});
|
|
@@ -306,6 +324,12 @@ var createForm = (arg = { defaultValues: {} }) => {
|
|
|
306
324
|
onFieldChange(event, name);
|
|
307
325
|
}
|
|
308
326
|
},
|
|
327
|
+
onBlur(event) {
|
|
328
|
+
if (mode === "onBlur") {
|
|
329
|
+
onFieldChange(event, name);
|
|
330
|
+
}
|
|
331
|
+
addTouched(name);
|
|
332
|
+
},
|
|
309
333
|
ref(element) {
|
|
310
334
|
const field = getField(name);
|
|
311
335
|
if (field) {
|
|
@@ -340,23 +364,26 @@ var createForm = (arg = { defaultValues: {} }) => {
|
|
|
340
364
|
setFieldValue(field, value);
|
|
341
365
|
}
|
|
342
366
|
};
|
|
343
|
-
const
|
|
367
|
+
const handleSubmit = (onSubmit, onError) => {
|
|
344
368
|
return async (event) => {
|
|
345
369
|
event.preventDefault();
|
|
346
370
|
await validateAllFields();
|
|
347
371
|
if (isValid()) {
|
|
348
|
-
|
|
372
|
+
onSubmit(getValues());
|
|
373
|
+
return;
|
|
349
374
|
}
|
|
375
|
+
onError?.(errors());
|
|
350
376
|
focusFirstError();
|
|
351
377
|
};
|
|
352
378
|
};
|
|
353
|
-
const reset = (newDefaultValues = {}) => {
|
|
379
|
+
const reset = (newDefaultValues = {}, options = {}) => {
|
|
354
380
|
const newValues = {
|
|
355
381
|
...structuredClone(defaultValues),
|
|
356
382
|
...newDefaultValues
|
|
357
383
|
};
|
|
358
384
|
setValues(() => newValues);
|
|
359
385
|
resetErrors();
|
|
386
|
+
resetTouched(options.keepTouched);
|
|
360
387
|
Object.entries(fields).forEach(([name, field]) => {
|
|
361
388
|
if (field) {
|
|
362
389
|
setFieldValue(field, get(newValues, name));
|
|
@@ -367,7 +394,8 @@ var createForm = (arg = { defaultValues: {} }) => {
|
|
|
367
394
|
control,
|
|
368
395
|
formState: {
|
|
369
396
|
errors,
|
|
370
|
-
isValid
|
|
397
|
+
isValid,
|
|
398
|
+
touchedFields
|
|
371
399
|
},
|
|
372
400
|
values,
|
|
373
401
|
errors,
|
|
@@ -375,8 +403,8 @@ var createForm = (arg = { defaultValues: {} }) => {
|
|
|
375
403
|
register,
|
|
376
404
|
getValues,
|
|
377
405
|
setValue,
|
|
378
|
-
onSubmit,
|
|
379
|
-
handleSubmit
|
|
406
|
+
onSubmit: handleSubmit,
|
|
407
|
+
handleSubmit,
|
|
380
408
|
reset
|
|
381
409
|
};
|
|
382
410
|
};
|
package/dist/main.jsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/create_form.ts
|
|
2
|
-
import { createMemo, createSignal as
|
|
2
|
+
import { createMemo, createSignal as createSignal3 } from "solid-js";
|
|
3
3
|
|
|
4
4
|
// src/logic/get_value.ts
|
|
5
5
|
var getFieldValue = (event) => {
|
|
@@ -215,13 +215,34 @@ var getResolverFields = (fields) => {
|
|
|
215
215
|
}, {});
|
|
216
216
|
};
|
|
217
217
|
|
|
218
|
+
// src/logic/create_touched.ts
|
|
219
|
+
import { createSignal as createSignal2 } from "solid-js";
|
|
220
|
+
var createTouched = () => {
|
|
221
|
+
const [touchedFields, setTouchedFields] = createSignal2({});
|
|
222
|
+
const addTouched = (name) => {
|
|
223
|
+
setTouchedFields((prev) => {
|
|
224
|
+
const newState = { ...prev };
|
|
225
|
+
set(newState, name, true);
|
|
226
|
+
return newState;
|
|
227
|
+
});
|
|
228
|
+
};
|
|
229
|
+
const resetTouched = (keepTouched) => {
|
|
230
|
+
if (keepTouched) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
setTouchedFields({});
|
|
234
|
+
};
|
|
235
|
+
return { touchedFields, addTouched, resetTouched };
|
|
236
|
+
};
|
|
237
|
+
|
|
218
238
|
// src/create_form.ts
|
|
219
239
|
var createForm = (arg = { defaultValues: {} }) => {
|
|
220
240
|
const { defaultValues, mode = "onChange", resolver } = arg;
|
|
221
241
|
const { fields, getField, setField } = createFields();
|
|
222
242
|
const { rules, addRule, getRule } = createRules();
|
|
223
|
-
const [values, setValues] =
|
|
243
|
+
const [values, setValues] = createSignal3(defaultValues);
|
|
224
244
|
const { errors, appendError, removeError, resetErrors, getError } = createErrors();
|
|
245
|
+
const { touchedFields, addTouched, resetTouched } = createTouched();
|
|
225
246
|
const isValid = createMemo(() => {
|
|
226
247
|
return !Object.keys(errors()).length;
|
|
227
248
|
});
|
|
@@ -307,6 +328,12 @@ var createForm = (arg = { defaultValues: {} }) => {
|
|
|
307
328
|
onFieldChange(event, name);
|
|
308
329
|
}
|
|
309
330
|
},
|
|
331
|
+
onBlur(event) {
|
|
332
|
+
if (mode === "onBlur") {
|
|
333
|
+
onFieldChange(event, name);
|
|
334
|
+
}
|
|
335
|
+
addTouched(name);
|
|
336
|
+
},
|
|
310
337
|
ref(element) {
|
|
311
338
|
const field = getField(name);
|
|
312
339
|
if (field) {
|
|
@@ -341,23 +368,26 @@ var createForm = (arg = { defaultValues: {} }) => {
|
|
|
341
368
|
setFieldValue(field, value);
|
|
342
369
|
}
|
|
343
370
|
};
|
|
344
|
-
const
|
|
371
|
+
const handleSubmit = (onSubmit, onError) => {
|
|
345
372
|
return async (event) => {
|
|
346
373
|
event.preventDefault();
|
|
347
374
|
await validateAllFields();
|
|
348
375
|
if (isValid()) {
|
|
349
|
-
|
|
376
|
+
onSubmit(getValues());
|
|
377
|
+
return;
|
|
350
378
|
}
|
|
379
|
+
onError?.(errors());
|
|
351
380
|
focusFirstError();
|
|
352
381
|
};
|
|
353
382
|
};
|
|
354
|
-
const reset = (newDefaultValues = {}) => {
|
|
383
|
+
const reset = (newDefaultValues = {}, options = {}) => {
|
|
355
384
|
const newValues = {
|
|
356
385
|
...structuredClone(defaultValues),
|
|
357
386
|
...newDefaultValues
|
|
358
387
|
};
|
|
359
388
|
setValues(() => newValues);
|
|
360
389
|
resetErrors();
|
|
390
|
+
resetTouched(options.keepTouched);
|
|
361
391
|
Object.entries(fields).forEach(([name, field]) => {
|
|
362
392
|
if (field) {
|
|
363
393
|
setFieldValue(field, get(newValues, name));
|
|
@@ -368,7 +398,8 @@ var createForm = (arg = { defaultValues: {} }) => {
|
|
|
368
398
|
control,
|
|
369
399
|
formState: {
|
|
370
400
|
errors,
|
|
371
|
-
isValid
|
|
401
|
+
isValid,
|
|
402
|
+
touchedFields
|
|
372
403
|
},
|
|
373
404
|
values,
|
|
374
405
|
errors,
|
|
@@ -376,8 +407,8 @@ var createForm = (arg = { defaultValues: {} }) => {
|
|
|
376
407
|
register,
|
|
377
408
|
getValues,
|
|
378
409
|
setValue,
|
|
379
|
-
onSubmit,
|
|
380
|
-
handleSubmit
|
|
410
|
+
onSubmit: handleSubmit,
|
|
411
|
+
handleSubmit,
|
|
381
412
|
reset
|
|
382
413
|
};
|
|
383
414
|
};
|