@refinedev/react-hook-form 5.0.2 → 5.0.4
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/index.cjs +81 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +81 -12
- package/dist/index.mjs.map +1 -1
- package/dist/useForm/index.d.cts.map +1 -1
- package/dist/useForm/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/useForm/index.spec.tsx +97 -0
- package/src/useForm/index.ts +118 -21
- package/src/useModalForm/index.spec.ts +54 -0
- package/src/useModalForm/index.ts +1 -1
package/dist/index.cjs
CHANGED
|
@@ -38,7 +38,7 @@ __export(src_exports, {
|
|
|
38
38
|
module.exports = __toCommonJS(src_exports);
|
|
39
39
|
|
|
40
40
|
// src/useForm/index.ts
|
|
41
|
-
var import_react = require("react");
|
|
41
|
+
var import_react = __toESM(require("react"));
|
|
42
42
|
var import_get = __toESM(require("lodash/get"));
|
|
43
43
|
var import_has = __toESM(require("lodash/has"));
|
|
44
44
|
var import_react_hook_form = require("react-hook-form");
|
|
@@ -58,12 +58,17 @@ var useForm = /* @__PURE__ */ __name(({
|
|
|
58
58
|
...rest
|
|
59
59
|
});
|
|
60
60
|
const {
|
|
61
|
+
control,
|
|
61
62
|
watch,
|
|
62
63
|
setValue,
|
|
63
64
|
getValues,
|
|
64
65
|
handleSubmit: handleSubmitReactHookForm,
|
|
65
|
-
setError
|
|
66
|
+
setError,
|
|
67
|
+
formState: { dirtyFields }
|
|
66
68
|
} = useHookFormResult;
|
|
69
|
+
const queryDataRef = import_react.default.useRef(void 0);
|
|
70
|
+
const syncedFieldsRef = import_react.default.useRef(/* @__PURE__ */ new Set());
|
|
71
|
+
const mountedFieldsRef = import_react.default.useRef(/* @__PURE__ */ new Set());
|
|
67
72
|
const useFormCoreResult = (0, import_core.useForm)({
|
|
68
73
|
...refineCoreProps,
|
|
69
74
|
onMutationError: (error, _variables, _context) => {
|
|
@@ -106,19 +111,62 @@ var useForm = /* @__PURE__ */ __name(({
|
|
|
106
111
|
}
|
|
107
112
|
});
|
|
108
113
|
const { query, onFinish, formLoading, onFinishAutoSave } = useFormCoreResult;
|
|
114
|
+
const getMountedFields = /* @__PURE__ */ __name(() => {
|
|
115
|
+
var _a;
|
|
116
|
+
const mounted = ((_a = control._names) == null ? void 0 : _a.mount) ?? /* @__PURE__ */ new Set();
|
|
117
|
+
return new Set(mounted);
|
|
118
|
+
}, "getMountedFields");
|
|
119
|
+
const getRegisteredFields = /* @__PURE__ */ __name(() => {
|
|
120
|
+
const registeredFields = /* @__PURE__ */ new Set();
|
|
121
|
+
const mounted = getMountedFields();
|
|
122
|
+
mounted.forEach((name) => registeredFields.add(name));
|
|
123
|
+
const values = getValues();
|
|
124
|
+
Object.keys((0, import_core.flattenObjectKeys)(values)).forEach((path) => {
|
|
125
|
+
registeredFields.add(path);
|
|
126
|
+
});
|
|
127
|
+
return registeredFields;
|
|
128
|
+
}, "getRegisteredFields");
|
|
129
|
+
const applyValuesToFields = /* @__PURE__ */ __name((fieldNames, data, respectDirty = false) => {
|
|
130
|
+
fieldNames.forEach((path) => {
|
|
131
|
+
if (syncedFieldsRef.current.has(path)) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (respectDirty && (0, import_get.default)(dirtyFields, path)) {
|
|
135
|
+
syncedFieldsRef.current.add(path);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
syncedFieldsRef.current.add(path);
|
|
139
|
+
if ((0, import_has.default)(data, path)) {
|
|
140
|
+
setValue(path, (0, import_get.default)(data, path));
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}, "applyValuesToFields");
|
|
109
144
|
(0, import_react.useEffect)(() => {
|
|
110
145
|
var _a;
|
|
111
146
|
const data = (_a = query == null ? void 0 : query.data) == null ? void 0 : _a.data;
|
|
112
|
-
if (!data)
|
|
147
|
+
if (!data) {
|
|
148
|
+
queryDataRef.current = void 0;
|
|
149
|
+
syncedFieldsRef.current = /* @__PURE__ */ new Set();
|
|
150
|
+
mountedFieldsRef.current = /* @__PURE__ */ new Set();
|
|
113
151
|
return;
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
152
|
+
}
|
|
153
|
+
let isActive = true;
|
|
154
|
+
const applyQueryValues = /* @__PURE__ */ __name(() => {
|
|
155
|
+
if (!isActive)
|
|
156
|
+
return;
|
|
157
|
+
applyValuesToFields(getRegisteredFields(), data, false);
|
|
158
|
+
}, "applyQueryValues");
|
|
159
|
+
queryDataRef.current = data;
|
|
160
|
+
syncedFieldsRef.current = /* @__PURE__ */ new Set();
|
|
161
|
+
mountedFieldsRef.current = getMountedFields();
|
|
162
|
+
if (typeof queueMicrotask === "function") {
|
|
163
|
+
queueMicrotask(applyQueryValues);
|
|
164
|
+
} else {
|
|
165
|
+
Promise.resolve().then(applyQueryValues);
|
|
166
|
+
}
|
|
167
|
+
return () => {
|
|
168
|
+
isActive = false;
|
|
169
|
+
};
|
|
122
170
|
}, [query == null ? void 0 : query.data, setValue, getValues]);
|
|
123
171
|
(0, import_react.useEffect)(() => {
|
|
124
172
|
const subscription = watch((values, { type }) => {
|
|
@@ -128,6 +176,27 @@ var useForm = /* @__PURE__ */ __name(({
|
|
|
128
176
|
});
|
|
129
177
|
return () => subscription.unsubscribe();
|
|
130
178
|
}, [watch]);
|
|
179
|
+
(0, import_react.useEffect)(() => {
|
|
180
|
+
const data = queryDataRef.current;
|
|
181
|
+
if (!data) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const mountedFieldNames = getMountedFields();
|
|
185
|
+
if (!mountedFieldNames.size) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
let hasNewField = false;
|
|
189
|
+
mountedFieldNames.forEach((name) => {
|
|
190
|
+
if (!mountedFieldsRef.current.has(name)) {
|
|
191
|
+
hasNewField = true;
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
if (!hasNewField) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
mountedFieldsRef.current = new Set(mountedFieldNames);
|
|
198
|
+
applyValuesToFields(mountedFieldNames, data, true);
|
|
199
|
+
});
|
|
131
200
|
const onValuesChange = /* @__PURE__ */ __name((changeValues) => {
|
|
132
201
|
var _a, _b;
|
|
133
202
|
if (warnWhenUnsavedChanges) {
|
|
@@ -391,7 +460,7 @@ var useModalForm = /* @__PURE__ */ __name(({
|
|
|
391
460
|
show();
|
|
392
461
|
}
|
|
393
462
|
},
|
|
394
|
-
[id]
|
|
463
|
+
[id, action, setId, show]
|
|
395
464
|
);
|
|
396
465
|
const title = translate(
|
|
397
466
|
`${identifier}.titles.${actionProp}`,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/useForm/index.ts","../src/useStepsForm/index.ts","../src/useModalForm/index.ts"],"sourcesContent":["export { useForm, UseFormProps, UseFormReturnType } from \"./useForm/index.js\";\nexport {\n useStepsForm,\n UseStepsFormProps,\n UseStepsFormReturnType,\n} from \"./useStepsForm/index.js\";\nexport {\n useModalForm,\n UseModalFormProps,\n UseModalFormReturnType,\n} from \"./useModalForm/index.js\";\n","import React, { useEffect } from \"react\";\nimport get from \"lodash/get\";\nimport has from \"lodash/has\";\n\nimport {\n useForm as useHookForm,\n type UseFormProps as UseHookFormProps,\n type UseFormReturn,\n type FieldValues,\n type UseFormHandleSubmit,\n type Path,\n} from \"react-hook-form\";\nimport {\n type BaseRecord,\n type HttpError,\n useForm as useFormCore,\n useWarnAboutChange,\n type UseFormProps as UseFormCoreProps,\n type UseFormReturnType as UseFormReturnTypeCore,\n useTranslate,\n useRefineContext,\n flattenObjectKeys,\n} from \"@refinedev/core\";\n\nexport type UseFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturn<TVariables, TContext> & {\n refineCore: UseFormReturnTypeCore<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >;\n saveButtonProps: {\n disabled: boolean;\n onClick: (e: React.BaseSyntheticEvent) => void;\n };\n};\n\nexport type UseFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = {\n /**\n * Configuration object for the core of the [useForm](/docs/api-reference/core/hooks/useForm/)\n * @type [`UseFormCoreProps<TQueryFnData, TError, TVariables, TData, TResponse, TResponseError>`](/docs/api-reference/core/hooks/useForm/#properties)\n */\n refineCoreProps?: UseFormCoreProps<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >;\n /**\n * When you have unsaved changes and try to leave the current page, **refine** shows a confirmation modal box.\n * @default `false*`\n */\n warnWhenUnsavedChanges?: boolean;\n /**\n * Disables server-side validation\n * @default false\n * @see {@link https://refine.dev/docs/advanced-tutorials/forms/server-side-form-validation/}\n */\n disableServerSideValidation?: boolean;\n} & UseHookFormProps<TVariables, TContext>;\n\nexport const useForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n refineCoreProps,\n warnWhenUnsavedChanges: warnWhenUnsavedChangesProp,\n disableServerSideValidation: disableServerSideValidationProp = false,\n ...rest\n}: UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const { options } = useRefineContext();\n const disableServerSideValidation =\n options?.disableServerSideValidation || disableServerSideValidationProp;\n\n const translate = useTranslate();\n\n const { warnWhenUnsavedChanges: warnWhenUnsavedChangesRefine, setWarnWhen } =\n useWarnAboutChange();\n const warnWhenUnsavedChanges =\n warnWhenUnsavedChangesProp ?? warnWhenUnsavedChangesRefine;\n\n const useHookFormResult = useHookForm<TVariables, TContext>({\n ...rest,\n });\n\n const {\n watch,\n setValue,\n getValues,\n handleSubmit: handleSubmitReactHookForm,\n setError,\n } = useHookFormResult;\n\n const useFormCoreResult = useFormCore<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >({\n ...refineCoreProps,\n onMutationError: (error, _variables, _context) => {\n if (disableServerSideValidation) {\n refineCoreProps?.onMutationError?.(error, _variables, _context);\n return;\n }\n\n const errors = error?.errors;\n\n for (const key in errors) {\n // when the key is not registered in the form, react-hook-form not working\n const isKeyInVariables = Object.keys(\n flattenObjectKeys(_variables),\n ).includes(key);\n\n if (!isKeyInVariables) {\n continue;\n }\n\n const fieldError = errors[key];\n\n let newError = \"\";\n\n if (Array.isArray(fieldError)) {\n newError = fieldError.join(\" \");\n }\n\n if (typeof fieldError === \"string\") {\n newError = fieldError;\n }\n\n if (typeof fieldError === \"boolean\" && fieldError) {\n newError = \"Field is not valid.\";\n }\n\n if (typeof fieldError === \"object\" && \"key\" in fieldError) {\n const translatedMessage = translate(\n fieldError.key,\n fieldError.message,\n );\n\n newError = translatedMessage;\n }\n\n setError(key as Path<TVariables>, {\n message: newError,\n });\n }\n\n refineCoreProps?.onMutationError?.(error, _variables, _context);\n },\n });\n\n const { query, onFinish, formLoading, onFinishAutoSave } = useFormCoreResult;\n\n useEffect(() => {\n const data = query?.data?.data;\n if (!data) return;\n\n /**\n * get registered fields from react-hook-form\n */\n const registeredFields = Object.keys(flattenObjectKeys(getValues()));\n\n /**\n * set values from query result as default values\n */\n registeredFields.forEach((path) => {\n const hasValue = has(data, path);\n const dataValue = get(data, path);\n\n /**\n * set value if the path exists in the query result even if the value is null\n */\n if (hasValue) {\n setValue(path as Path<TVariables>, dataValue);\n }\n });\n }, [query?.data, setValue, getValues]);\n\n useEffect(() => {\n const subscription = watch((values: any, { type }: { type?: any }) => {\n if (type === \"change\") {\n onValuesChange(values);\n }\n });\n return () => subscription.unsubscribe();\n }, [watch]);\n\n const onValuesChange = (changeValues: TVariables) => {\n if (warnWhenUnsavedChanges) {\n setWarnWhen(true);\n }\n\n if (refineCoreProps?.autoSave?.enabled) {\n setWarnWhen(false);\n\n const onFinishProps =\n refineCoreProps.autoSave?.onFinish ?? ((values: TVariables) => values);\n\n return onFinishAutoSave(onFinishProps(changeValues)).catch(\n (error) => error,\n );\n }\n\n return changeValues;\n };\n\n const handleSubmit: UseFormHandleSubmit<TVariables> =\n (onValid, onInvalid) => async (e) => {\n setWarnWhen(false);\n return handleSubmitReactHookForm(onValid, onInvalid)(e);\n };\n\n const saveButtonProps = {\n disabled: formLoading,\n onClick: (e: React.BaseSyntheticEvent) => {\n handleSubmit(\n (v) => onFinish(v).catch(() => {}),\n () => false,\n )(e);\n },\n };\n\n return {\n ...useHookFormResult,\n handleSubmit,\n refineCore: useFormCoreResult,\n saveButtonProps,\n };\n};\n","import { useEffect, useState } from \"react\";\nimport type { FieldValues, Path } from \"react-hook-form\";\nimport type { BaseRecord, HttpError } from \"@refinedev/core\";\nimport get from \"lodash/get\";\n\nimport { useForm, type UseFormProps, type UseFormReturnType } from \"../useForm\";\n\nexport type UseStepsFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n steps: {\n currentStep: number;\n gotoStep: (step: number) => void;\n };\n};\n\nexport type UseStepsFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n /**\n * @description Configuration object for the steps.\n * `defaultStep`: Allows you to set the initial step.\n * \n * `isBackValidate`: Whether to validation the current step when going back.\n * @type `{\n defaultStep?: number;\n isBackValidate?: boolean;\n }`\n * @default `defaultStep = 0` `isBackValidate = false`\n */\n stepsProps?: {\n defaultStep?: number;\n isBackValidate?: boolean;\n };\n};\n\nexport const useStepsForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n stepsProps,\n ...rest\n}: UseStepsFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseStepsFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const { defaultStep = 0, isBackValidate = false } = stepsProps ?? {};\n const [current, setCurrent] = useState(defaultStep);\n\n const useHookFormResult = useForm<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n >({\n ...rest,\n });\n\n const {\n trigger,\n getValues,\n setValue,\n formState: { dirtyFields },\n refineCore: { query },\n } = useHookFormResult;\n\n useEffect(() => {\n const data = query?.data?.data;\n if (!data) return;\n\n const registeredFields = Object.keys(getValues());\n\n Object.entries(data).forEach(([key, value]) => {\n const name = key as Path<TVariables>;\n\n if (registeredFields.includes(name)) {\n if (!get(dirtyFields, name)) {\n setValue(name, value);\n }\n }\n });\n }, [query?.data, current, setValue, getValues]);\n\n const go = (step: number) => {\n let targetStep = step;\n\n if (step < 0) {\n targetStep = 0;\n }\n\n setCurrent(targetStep);\n };\n\n const gotoStep = async (step: number) => {\n if (step === current) {\n return;\n }\n\n if (step < current && !isBackValidate) {\n go(step);\n return;\n }\n\n const isValid = await trigger();\n if (isValid) {\n go(step);\n }\n };\n\n return {\n ...useHookFormResult,\n steps: {\n currentStep: current,\n gotoStep,\n },\n };\n};\n","import { useCallback } from \"react\";\nimport {\n type BaseKey,\n type BaseRecord,\n type FormWithSyncWithLocationParams,\n type HttpError,\n useGo,\n useModal,\n useParsed,\n useUserFriendlyName,\n useTranslate,\n useWarnAboutChange,\n useInvalidate,\n useResourceParams,\n} from \"@refinedev/core\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport { useForm, type UseFormProps, type UseFormReturnType } from \"../useForm\";\nimport React from \"react\";\n\nexport type UseModalFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n modal: {\n submit: (values: TVariables) => void;\n close: () => void;\n show: (id?: BaseKey) => void;\n visible: boolean;\n title: string;\n };\n};\n\nexport type UseModalFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n /**\n * @description Configuration object for the modal.\n * `defaultVisible`: Initial visibility state of the modal.\n *\n * `autoSubmitClose`: Whether the form should be submitted when the modal is closed.\n *\n * `autoResetForm`: Whether the form should be reset when the form is submitted.\n *\n * `autoResetFormWhenClose`: Whether the form should be reset to defaultValues when the modal is closed.\n * @type `{\n defaultVisible?: boolean;\n autoSubmitClose?: boolean;\n autoResetForm?: boolean;\n autoResetFormWhenClose?: boolean;\n }`\n * @default `defaultVisible = false` `autoSubmitClose = true` `autoResetForm = true` `autoResetFormWhenClose = true`\n */\n modalProps?: {\n defaultVisible?: boolean;\n autoSubmitClose?: boolean;\n autoResetForm?: boolean;\n autoResetFormWhenClose?: boolean;\n };\n} & FormWithSyncWithLocationParams;\n\nexport const useModalForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n modalProps,\n refineCoreProps,\n syncWithLocation,\n ...rest\n}: UseModalFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseModalFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const invalidate = useInvalidate();\n const [initiallySynced, setInitiallySynced] = React.useState(false);\n\n const translate = useTranslate();\n\n const { resource: resourceProp, action: actionProp } = refineCoreProps ?? {};\n\n const { resource, identifier } = useResourceParams({\n resource: resourceProp,\n });\n const { action: actionFromParams } = useResourceParams({\n resource: resourceProp,\n action: actionProp,\n });\n\n const parsed = useParsed();\n const go = useGo();\n const getUserFriendlyName = useUserFriendlyName();\n\n const action = actionProp ?? actionFromParams ?? \"\";\n\n const syncingId = !(\n typeof syncWithLocation === \"object\" && syncWithLocation?.syncId === false\n );\n\n const syncWithLocationKey =\n typeof syncWithLocation === \"object\" && \"key\" in syncWithLocation\n ? syncWithLocation.key\n : resource && action && syncWithLocation\n ? `modal-${identifier}-${action}`\n : undefined;\n\n const {\n defaultVisible = false,\n autoSubmitClose = true,\n autoResetForm = true,\n autoResetFormWhenClose = true,\n } = modalProps ?? {};\n\n const useHookFormResult = useForm<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n >({\n refineCoreProps: {\n ...refineCoreProps,\n meta: {\n ...(syncWithLocationKey ? { [syncWithLocationKey]: undefined } : {}),\n ...refineCoreProps?.meta,\n },\n },\n ...rest,\n });\n\n const {\n reset,\n refineCore: { onFinish, id, setId, autoSaveProps, query },\n saveButtonProps,\n handleSubmit,\n } = useHookFormResult;\n\n const { visible, show, close } = useModal({\n defaultVisible,\n });\n\n // compensate for setting of initial form values in useForm since it doesnt track modal visibility\n React.useEffect(() => {\n if (!visible || !query?.data?.data) return;\n\n const formData = query.data.data;\n if (!formData) return;\n\n reset(formData as any, {\n ...(!autoResetFormWhenClose && {\n keepDirtyValues: true,\n }),\n });\n }, [visible, query?.data?.data, autoResetFormWhenClose]);\n\n React.useEffect(() => {\n if (initiallySynced === false && syncWithLocationKey) {\n const openStatus = parsed?.params?.[syncWithLocationKey]?.open;\n if (typeof openStatus === \"boolean\") {\n if (openStatus) {\n show();\n }\n } else if (typeof openStatus === \"string\") {\n if (openStatus === \"true\") {\n show();\n }\n }\n\n if (syncingId) {\n const idFromParams = parsed?.params?.[syncWithLocationKey]?.id;\n if (idFromParams) {\n setId?.(idFromParams);\n }\n }\n\n setInitiallySynced(true);\n }\n }, [syncWithLocationKey, parsed, syncingId, setId]);\n\n React.useEffect(() => {\n if (initiallySynced === true) {\n if (visible && syncWithLocationKey) {\n go({\n query: {\n [syncWithLocationKey]: {\n ...parsed?.params?.[syncWithLocationKey],\n open: true,\n ...(syncingId && id && { id }),\n },\n },\n options: { keepQuery: true },\n type: \"replace\",\n });\n } else if (syncWithLocationKey && !visible) {\n go({\n query: {\n [syncWithLocationKey]: undefined,\n },\n options: { keepQuery: true },\n type: \"replace\",\n });\n }\n }\n }, [id, visible, show, syncWithLocationKey, syncingId]);\n\n const submit = async (values: TVariables) => {\n await onFinish(values);\n\n if (autoSubmitClose) {\n close();\n }\n\n if (autoResetForm) {\n reset();\n }\n };\n\n const { warnWhen, setWarnWhen } = useWarnAboutChange();\n const handleClose = useCallback(() => {\n if (\n autoSaveProps.status === \"success\" &&\n refineCoreProps?.autoSave?.invalidateOnClose\n ) {\n invalidate({\n id,\n invalidates: refineCoreProps.invalidates || [\"list\", \"many\", \"detail\"],\n dataProviderName: refineCoreProps.dataProviderName,\n resource: identifier,\n });\n }\n\n if (warnWhen) {\n const warnWhenConfirm = window.confirm(\n translate(\n \"warnWhenUnsavedChanges\",\n \"Are you sure you want to leave? You have unsaved changes.\",\n ),\n );\n\n if (warnWhenConfirm) {\n setWarnWhen(false);\n } else {\n return;\n }\n }\n\n setId?.(undefined);\n close();\n\n if (autoResetFormWhenClose) {\n reset();\n }\n }, [warnWhen, autoSaveProps.status]);\n\n const handleShow = useCallback(\n (showId?: BaseKey) => {\n if (typeof showId !== \"undefined\") {\n setId?.(showId);\n }\n const needsIdToOpen = action === \"edit\" || action === \"clone\";\n const hasId = typeof showId !== \"undefined\" || typeof id !== \"undefined\";\n if (needsIdToOpen ? hasId : true) {\n show();\n }\n },\n [id],\n );\n\n const title = translate(\n `${identifier}.titles.${actionProp}`,\n undefined,\n `${getUserFriendlyName(\n `${actionProp} ${resource?.meta?.label ?? identifier}`,\n \"singular\",\n )}`,\n );\n\n return {\n modal: {\n submit,\n close: handleClose,\n show: handleShow,\n visible,\n title,\n },\n ...useHookFormResult,\n saveButtonProps: {\n ...saveButtonProps,\n onClick: (e) => handleSubmit(submit)(e),\n },\n };\n};\n"],"mappings":"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","names":["useHookForm","useFormCore","has","get","import_react","import_get","get","import_react","import_core","import_react","React","_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/useForm/index.ts","../src/useStepsForm/index.ts","../src/useModalForm/index.ts"],"sourcesContent":["export { useForm, UseFormProps, UseFormReturnType } from \"./useForm/index.js\";\nexport {\n useStepsForm,\n UseStepsFormProps,\n UseStepsFormReturnType,\n} from \"./useStepsForm/index.js\";\nexport {\n useModalForm,\n UseModalFormProps,\n UseModalFormReturnType,\n} from \"./useModalForm/index.js\";\n","import React, { useEffect } from \"react\";\nimport get from \"lodash/get\";\nimport has from \"lodash/has\";\n\nimport {\n useForm as useHookForm,\n type UseFormProps as UseHookFormProps,\n type UseFormReturn,\n type FieldValues,\n type UseFormHandleSubmit,\n type Path,\n} from \"react-hook-form\";\nimport {\n type BaseRecord,\n type HttpError,\n useForm as useFormCore,\n useWarnAboutChange,\n type UseFormProps as UseFormCoreProps,\n type UseFormReturnType as UseFormReturnTypeCore,\n useTranslate,\n useRefineContext,\n flattenObjectKeys,\n} from \"@refinedev/core\";\n\nexport type UseFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturn<TVariables, TContext> & {\n refineCore: UseFormReturnTypeCore<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >;\n saveButtonProps: {\n disabled: boolean;\n onClick: (e: React.BaseSyntheticEvent) => void;\n };\n};\n\nexport type UseFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = {\n /**\n * Configuration object for the core of the [useForm](/docs/api-reference/core/hooks/useForm/)\n * @type [`UseFormCoreProps<TQueryFnData, TError, TVariables, TData, TResponse, TResponseError>`](/docs/api-reference/core/hooks/useForm/#properties)\n */\n refineCoreProps?: UseFormCoreProps<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >;\n /**\n * When you have unsaved changes and try to leave the current page, **refine** shows a confirmation modal box.\n * @default `false*`\n */\n warnWhenUnsavedChanges?: boolean;\n /**\n * Disables server-side validation\n * @default false\n * @see {@link https://refine.dev/docs/advanced-tutorials/forms/server-side-form-validation/}\n */\n disableServerSideValidation?: boolean;\n} & UseHookFormProps<TVariables, TContext>;\n\nexport const useForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n refineCoreProps,\n warnWhenUnsavedChanges: warnWhenUnsavedChangesProp,\n disableServerSideValidation: disableServerSideValidationProp = false,\n ...rest\n}: UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const { options } = useRefineContext();\n const disableServerSideValidation =\n options?.disableServerSideValidation || disableServerSideValidationProp;\n\n const translate = useTranslate();\n\n const { warnWhenUnsavedChanges: warnWhenUnsavedChangesRefine, setWarnWhen } =\n useWarnAboutChange();\n const warnWhenUnsavedChanges =\n warnWhenUnsavedChangesProp ?? warnWhenUnsavedChangesRefine;\n\n const useHookFormResult = useHookForm<TVariables, TContext>({\n ...rest,\n });\n\n const {\n control,\n watch,\n setValue,\n getValues,\n handleSubmit: handleSubmitReactHookForm,\n setError,\n formState: { dirtyFields },\n } = useHookFormResult;\n\n // Keep query data and sync registered fields as they mount (e.g. Controller), without overriding dirty values.\n const queryDataRef = React.useRef<TData | undefined>(undefined);\n // Track which fields have already been synced to avoid repeated setValue calls.\n const syncedFieldsRef = React.useRef<Set<string>>(new Set());\n // Track mounted field names so late-registered fields can be detected.\n const mountedFieldsRef = React.useRef<Set<string>>(new Set());\n\n const useFormCoreResult = useFormCore<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >({\n ...refineCoreProps,\n onMutationError: (error, _variables, _context) => {\n if (disableServerSideValidation) {\n refineCoreProps?.onMutationError?.(error, _variables, _context);\n return;\n }\n\n const errors = error?.errors;\n\n for (const key in errors) {\n // when the key is not registered in the form, react-hook-form not working\n const isKeyInVariables = Object.keys(\n flattenObjectKeys(_variables),\n ).includes(key);\n\n if (!isKeyInVariables) {\n continue;\n }\n\n const fieldError = errors[key];\n\n let newError = \"\";\n\n if (Array.isArray(fieldError)) {\n newError = fieldError.join(\" \");\n }\n\n if (typeof fieldError === \"string\") {\n newError = fieldError;\n }\n\n if (typeof fieldError === \"boolean\" && fieldError) {\n newError = \"Field is not valid.\";\n }\n\n if (typeof fieldError === \"object\" && \"key\" in fieldError) {\n const translatedMessage = translate(\n fieldError.key,\n fieldError.message,\n );\n\n newError = translatedMessage;\n }\n\n setError(key as Path<TVariables>, {\n message: newError,\n });\n }\n\n refineCoreProps?.onMutationError?.(error, _variables, _context);\n },\n });\n\n const { query, onFinish, formLoading, onFinishAutoSave } = useFormCoreResult;\n\n const getMountedFields = () => {\n const mounted =\n (\n control as {\n _names?: {\n mount?: Set<string>;\n };\n }\n )._names?.mount ?? new Set<string>();\n\n return new Set(mounted);\n };\n\n const getRegisteredFields = () => {\n const registeredFields = new Set<string>();\n const mounted = getMountedFields();\n mounted.forEach((name) => registeredFields.add(name));\n\n const values = getValues();\n Object.keys(flattenObjectKeys(values)).forEach((path) => {\n registeredFields.add(path);\n });\n\n return registeredFields;\n };\n\n const applyValuesToFields = (\n fieldNames: Set<string>,\n data: TData,\n respectDirty = false,\n ) => {\n fieldNames.forEach((path) => {\n if (syncedFieldsRef.current.has(path)) {\n return;\n }\n\n if (respectDirty && get(dirtyFields, path)) {\n syncedFieldsRef.current.add(path);\n return;\n }\n\n syncedFieldsRef.current.add(path);\n\n if (has(data, path)) {\n setValue(path as Path<TVariables>, get(data, path));\n }\n });\n };\n\n // On query load, attempt a first sync after registration effects run.\n useEffect(() => {\n const data = query?.data?.data;\n if (!data) {\n queryDataRef.current = undefined;\n syncedFieldsRef.current = new Set();\n mountedFieldsRef.current = new Set();\n return;\n }\n\n let isActive = true;\n\n const applyQueryValues = () => {\n if (!isActive) return;\n\n applyValuesToFields(getRegisteredFields(), data, false);\n };\n\n queryDataRef.current = data;\n syncedFieldsRef.current = new Set();\n mountedFieldsRef.current = getMountedFields();\n\n // defer until after field registration effects\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(applyQueryValues);\n } else {\n Promise.resolve().then(applyQueryValues);\n }\n\n return () => {\n isActive = false;\n };\n }, [query?.data, setValue, getValues]);\n\n // Re-sync when new fields register; do not override user edits.\n useEffect(() => {\n const subscription = watch((values: any, { type }: { type?: any }) => {\n if (type === \"change\") {\n onValuesChange(values);\n }\n });\n return () => subscription.unsubscribe();\n }, [watch]);\n\n // Detect late-registered fields (e.g. Controller) and sync once they mount.\n // Intentionally no deps: RHF mutates the mount set in place and doesn't notify React,\n // so we check per-render and only apply values when new field names appear.\n useEffect(() => {\n const data = queryDataRef.current;\n if (!data) {\n return;\n }\n\n const mountedFieldNames = getMountedFields();\n if (!mountedFieldNames.size) {\n return;\n }\n\n let hasNewField = false;\n mountedFieldNames.forEach((name) => {\n if (!mountedFieldsRef.current.has(name)) {\n hasNewField = true;\n }\n });\n\n if (!hasNewField) {\n return;\n }\n\n mountedFieldsRef.current = new Set(mountedFieldNames);\n applyValuesToFields(mountedFieldNames, data, true);\n });\n\n const onValuesChange = (changeValues: TVariables) => {\n if (warnWhenUnsavedChanges) {\n setWarnWhen(true);\n }\n\n if (refineCoreProps?.autoSave?.enabled) {\n setWarnWhen(false);\n\n const onFinishProps =\n refineCoreProps.autoSave?.onFinish ?? ((values: TVariables) => values);\n\n return onFinishAutoSave(onFinishProps(changeValues)).catch(\n (error) => error,\n );\n }\n\n return changeValues;\n };\n\n const handleSubmit: UseFormHandleSubmit<TVariables> =\n (onValid, onInvalid) => async (e) => {\n setWarnWhen(false);\n return handleSubmitReactHookForm(onValid, onInvalid)(e);\n };\n\n const saveButtonProps = {\n disabled: formLoading,\n onClick: (e: React.BaseSyntheticEvent) => {\n handleSubmit(\n (v) => onFinish(v).catch(() => {}),\n () => false,\n )(e);\n },\n };\n\n return {\n ...useHookFormResult,\n handleSubmit,\n refineCore: useFormCoreResult,\n saveButtonProps,\n };\n};\n","import { useEffect, useState } from \"react\";\nimport type { FieldValues, Path } from \"react-hook-form\";\nimport type { BaseRecord, HttpError } from \"@refinedev/core\";\nimport get from \"lodash/get\";\n\nimport { useForm, type UseFormProps, type UseFormReturnType } from \"../useForm\";\n\nexport type UseStepsFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n steps: {\n currentStep: number;\n gotoStep: (step: number) => void;\n };\n};\n\nexport type UseStepsFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n /**\n * @description Configuration object for the steps.\n * `defaultStep`: Allows you to set the initial step.\n * \n * `isBackValidate`: Whether to validation the current step when going back.\n * @type `{\n defaultStep?: number;\n isBackValidate?: boolean;\n }`\n * @default `defaultStep = 0` `isBackValidate = false`\n */\n stepsProps?: {\n defaultStep?: number;\n isBackValidate?: boolean;\n };\n};\n\nexport const useStepsForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n stepsProps,\n ...rest\n}: UseStepsFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseStepsFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const { defaultStep = 0, isBackValidate = false } = stepsProps ?? {};\n const [current, setCurrent] = useState(defaultStep);\n\n const useHookFormResult = useForm<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n >({\n ...rest,\n });\n\n const {\n trigger,\n getValues,\n setValue,\n formState: { dirtyFields },\n refineCore: { query },\n } = useHookFormResult;\n\n useEffect(() => {\n const data = query?.data?.data;\n if (!data) return;\n\n const registeredFields = Object.keys(getValues());\n\n Object.entries(data).forEach(([key, value]) => {\n const name = key as Path<TVariables>;\n\n if (registeredFields.includes(name)) {\n if (!get(dirtyFields, name)) {\n setValue(name, value);\n }\n }\n });\n }, [query?.data, current, setValue, getValues]);\n\n const go = (step: number) => {\n let targetStep = step;\n\n if (step < 0) {\n targetStep = 0;\n }\n\n setCurrent(targetStep);\n };\n\n const gotoStep = async (step: number) => {\n if (step === current) {\n return;\n }\n\n if (step < current && !isBackValidate) {\n go(step);\n return;\n }\n\n const isValid = await trigger();\n if (isValid) {\n go(step);\n }\n };\n\n return {\n ...useHookFormResult,\n steps: {\n currentStep: current,\n gotoStep,\n },\n };\n};\n","import { useCallback } from \"react\";\nimport {\n type BaseKey,\n type BaseRecord,\n type FormWithSyncWithLocationParams,\n type HttpError,\n useGo,\n useModal,\n useParsed,\n useUserFriendlyName,\n useTranslate,\n useWarnAboutChange,\n useInvalidate,\n useResourceParams,\n} from \"@refinedev/core\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport { useForm, type UseFormProps, type UseFormReturnType } from \"../useForm\";\nimport React from \"react\";\n\nexport type UseModalFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n modal: {\n submit: (values: TVariables) => void;\n close: () => void;\n show: (id?: BaseKey) => void;\n visible: boolean;\n title: string;\n };\n};\n\nexport type UseModalFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n /**\n * @description Configuration object for the modal.\n * `defaultVisible`: Initial visibility state of the modal.\n *\n * `autoSubmitClose`: Whether the form should be submitted when the modal is closed.\n *\n * `autoResetForm`: Whether the form should be reset when the form is submitted.\n *\n * `autoResetFormWhenClose`: Whether the form should be reset to defaultValues when the modal is closed.\n * @type `{\n defaultVisible?: boolean;\n autoSubmitClose?: boolean;\n autoResetForm?: boolean;\n autoResetFormWhenClose?: boolean;\n }`\n * @default `defaultVisible = false` `autoSubmitClose = true` `autoResetForm = true` `autoResetFormWhenClose = true`\n */\n modalProps?: {\n defaultVisible?: boolean;\n autoSubmitClose?: boolean;\n autoResetForm?: boolean;\n autoResetFormWhenClose?: boolean;\n };\n} & FormWithSyncWithLocationParams;\n\nexport const useModalForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n modalProps,\n refineCoreProps,\n syncWithLocation,\n ...rest\n}: UseModalFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseModalFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const invalidate = useInvalidate();\n const [initiallySynced, setInitiallySynced] = React.useState(false);\n\n const translate = useTranslate();\n\n const { resource: resourceProp, action: actionProp } = refineCoreProps ?? {};\n\n const { resource, identifier } = useResourceParams({\n resource: resourceProp,\n });\n const { action: actionFromParams } = useResourceParams({\n resource: resourceProp,\n action: actionProp,\n });\n\n const parsed = useParsed();\n const go = useGo();\n const getUserFriendlyName = useUserFriendlyName();\n\n const action = actionProp ?? actionFromParams ?? \"\";\n\n const syncingId = !(\n typeof syncWithLocation === \"object\" && syncWithLocation?.syncId === false\n );\n\n const syncWithLocationKey =\n typeof syncWithLocation === \"object\" && \"key\" in syncWithLocation\n ? syncWithLocation.key\n : resource && action && syncWithLocation\n ? `modal-${identifier}-${action}`\n : undefined;\n\n const {\n defaultVisible = false,\n autoSubmitClose = true,\n autoResetForm = true,\n autoResetFormWhenClose = true,\n } = modalProps ?? {};\n\n const useHookFormResult = useForm<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n >({\n refineCoreProps: {\n ...refineCoreProps,\n meta: {\n ...(syncWithLocationKey ? { [syncWithLocationKey]: undefined } : {}),\n ...refineCoreProps?.meta,\n },\n },\n ...rest,\n });\n\n const {\n reset,\n refineCore: { onFinish, id, setId, autoSaveProps, query },\n saveButtonProps,\n handleSubmit,\n } = useHookFormResult;\n\n const { visible, show, close } = useModal({\n defaultVisible,\n });\n\n // compensate for setting of initial form values in useForm since it doesnt track modal visibility\n React.useEffect(() => {\n if (!visible || !query?.data?.data) return;\n\n const formData = query.data.data;\n if (!formData) return;\n\n reset(formData as any, {\n ...(!autoResetFormWhenClose && {\n keepDirtyValues: true,\n }),\n });\n }, [visible, query?.data?.data, autoResetFormWhenClose]);\n\n React.useEffect(() => {\n if (initiallySynced === false && syncWithLocationKey) {\n const openStatus = parsed?.params?.[syncWithLocationKey]?.open;\n if (typeof openStatus === \"boolean\") {\n if (openStatus) {\n show();\n }\n } else if (typeof openStatus === \"string\") {\n if (openStatus === \"true\") {\n show();\n }\n }\n\n if (syncingId) {\n const idFromParams = parsed?.params?.[syncWithLocationKey]?.id;\n if (idFromParams) {\n setId?.(idFromParams);\n }\n }\n\n setInitiallySynced(true);\n }\n }, [syncWithLocationKey, parsed, syncingId, setId]);\n\n React.useEffect(() => {\n if (initiallySynced === true) {\n if (visible && syncWithLocationKey) {\n go({\n query: {\n [syncWithLocationKey]: {\n ...parsed?.params?.[syncWithLocationKey],\n open: true,\n ...(syncingId && id && { id }),\n },\n },\n options: { keepQuery: true },\n type: \"replace\",\n });\n } else if (syncWithLocationKey && !visible) {\n go({\n query: {\n [syncWithLocationKey]: undefined,\n },\n options: { keepQuery: true },\n type: \"replace\",\n });\n }\n }\n }, [id, visible, show, syncWithLocationKey, syncingId]);\n\n const submit = async (values: TVariables) => {\n await onFinish(values);\n\n if (autoSubmitClose) {\n close();\n }\n\n if (autoResetForm) {\n reset();\n }\n };\n\n const { warnWhen, setWarnWhen } = useWarnAboutChange();\n const handleClose = useCallback(() => {\n if (\n autoSaveProps.status === \"success\" &&\n refineCoreProps?.autoSave?.invalidateOnClose\n ) {\n invalidate({\n id,\n invalidates: refineCoreProps.invalidates || [\"list\", \"many\", \"detail\"],\n dataProviderName: refineCoreProps.dataProviderName,\n resource: identifier,\n });\n }\n\n if (warnWhen) {\n const warnWhenConfirm = window.confirm(\n translate(\n \"warnWhenUnsavedChanges\",\n \"Are you sure you want to leave? You have unsaved changes.\",\n ),\n );\n\n if (warnWhenConfirm) {\n setWarnWhen(false);\n } else {\n return;\n }\n }\n\n setId?.(undefined);\n close();\n\n if (autoResetFormWhenClose) {\n reset();\n }\n }, [warnWhen, autoSaveProps.status]);\n\n const handleShow = useCallback(\n (showId?: BaseKey) => {\n if (typeof showId !== \"undefined\") {\n setId?.(showId);\n }\n const needsIdToOpen = action === \"edit\" || action === \"clone\";\n const hasId = typeof showId !== \"undefined\" || typeof id !== \"undefined\";\n if (needsIdToOpen ? hasId : true) {\n show();\n }\n },\n [id, action, setId, show],\n );\n\n const title = translate(\n `${identifier}.titles.${actionProp}`,\n undefined,\n `${getUserFriendlyName(\n `${actionProp} ${resource?.meta?.label ?? identifier}`,\n \"singular\",\n )}`,\n );\n\n return {\n modal: {\n submit,\n close: handleClose,\n show: handleShow,\n visible,\n title,\n },\n ...useHookFormResult,\n saveButtonProps: {\n ...saveButtonProps,\n onClick: (e) => handleSubmit(submit)(e),\n },\n };\n};\n"],"mappings":"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","names":["useHookForm","React","useFormCore","get","has","import_react","import_get","get","import_react","import_core","import_react","React","_a","_b"]}
|
package/dist/index.mjs
CHANGED
|
@@ -3,7 +3,7 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
4
4
|
|
|
5
5
|
// src/useForm/index.ts
|
|
6
|
-
import { useEffect } from "react";
|
|
6
|
+
import React, { useEffect } from "react";
|
|
7
7
|
import get from "lodash-es/get.js";
|
|
8
8
|
import has from "lodash-es/has.js";
|
|
9
9
|
import {
|
|
@@ -31,12 +31,17 @@ var useForm = /* @__PURE__ */ __name(({
|
|
|
31
31
|
...rest
|
|
32
32
|
});
|
|
33
33
|
const {
|
|
34
|
+
control,
|
|
34
35
|
watch,
|
|
35
36
|
setValue,
|
|
36
37
|
getValues,
|
|
37
38
|
handleSubmit: handleSubmitReactHookForm,
|
|
38
|
-
setError
|
|
39
|
+
setError,
|
|
40
|
+
formState: { dirtyFields }
|
|
39
41
|
} = useHookFormResult;
|
|
42
|
+
const queryDataRef = React.useRef(void 0);
|
|
43
|
+
const syncedFieldsRef = React.useRef(/* @__PURE__ */ new Set());
|
|
44
|
+
const mountedFieldsRef = React.useRef(/* @__PURE__ */ new Set());
|
|
40
45
|
const useFormCoreResult = useFormCore({
|
|
41
46
|
...refineCoreProps,
|
|
42
47
|
onMutationError: (error, _variables, _context) => {
|
|
@@ -79,19 +84,62 @@ var useForm = /* @__PURE__ */ __name(({
|
|
|
79
84
|
}
|
|
80
85
|
});
|
|
81
86
|
const { query, onFinish, formLoading, onFinishAutoSave } = useFormCoreResult;
|
|
87
|
+
const getMountedFields = /* @__PURE__ */ __name(() => {
|
|
88
|
+
var _a;
|
|
89
|
+
const mounted = ((_a = control._names) == null ? void 0 : _a.mount) ?? /* @__PURE__ */ new Set();
|
|
90
|
+
return new Set(mounted);
|
|
91
|
+
}, "getMountedFields");
|
|
92
|
+
const getRegisteredFields = /* @__PURE__ */ __name(() => {
|
|
93
|
+
const registeredFields = /* @__PURE__ */ new Set();
|
|
94
|
+
const mounted = getMountedFields();
|
|
95
|
+
mounted.forEach((name) => registeredFields.add(name));
|
|
96
|
+
const values = getValues();
|
|
97
|
+
Object.keys(flattenObjectKeys(values)).forEach((path) => {
|
|
98
|
+
registeredFields.add(path);
|
|
99
|
+
});
|
|
100
|
+
return registeredFields;
|
|
101
|
+
}, "getRegisteredFields");
|
|
102
|
+
const applyValuesToFields = /* @__PURE__ */ __name((fieldNames, data, respectDirty = false) => {
|
|
103
|
+
fieldNames.forEach((path) => {
|
|
104
|
+
if (syncedFieldsRef.current.has(path)) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (respectDirty && get(dirtyFields, path)) {
|
|
108
|
+
syncedFieldsRef.current.add(path);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
syncedFieldsRef.current.add(path);
|
|
112
|
+
if (has(data, path)) {
|
|
113
|
+
setValue(path, get(data, path));
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}, "applyValuesToFields");
|
|
82
117
|
useEffect(() => {
|
|
83
118
|
var _a;
|
|
84
119
|
const data = (_a = query == null ? void 0 : query.data) == null ? void 0 : _a.data;
|
|
85
|
-
if (!data)
|
|
120
|
+
if (!data) {
|
|
121
|
+
queryDataRef.current = void 0;
|
|
122
|
+
syncedFieldsRef.current = /* @__PURE__ */ new Set();
|
|
123
|
+
mountedFieldsRef.current = /* @__PURE__ */ new Set();
|
|
86
124
|
return;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
125
|
+
}
|
|
126
|
+
let isActive = true;
|
|
127
|
+
const applyQueryValues = /* @__PURE__ */ __name(() => {
|
|
128
|
+
if (!isActive)
|
|
129
|
+
return;
|
|
130
|
+
applyValuesToFields(getRegisteredFields(), data, false);
|
|
131
|
+
}, "applyQueryValues");
|
|
132
|
+
queryDataRef.current = data;
|
|
133
|
+
syncedFieldsRef.current = /* @__PURE__ */ new Set();
|
|
134
|
+
mountedFieldsRef.current = getMountedFields();
|
|
135
|
+
if (typeof queueMicrotask === "function") {
|
|
136
|
+
queueMicrotask(applyQueryValues);
|
|
137
|
+
} else {
|
|
138
|
+
Promise.resolve().then(applyQueryValues);
|
|
139
|
+
}
|
|
140
|
+
return () => {
|
|
141
|
+
isActive = false;
|
|
142
|
+
};
|
|
95
143
|
}, [query == null ? void 0 : query.data, setValue, getValues]);
|
|
96
144
|
useEffect(() => {
|
|
97
145
|
const subscription = watch((values, { type }) => {
|
|
@@ -101,6 +149,27 @@ var useForm = /* @__PURE__ */ __name(({
|
|
|
101
149
|
});
|
|
102
150
|
return () => subscription.unsubscribe();
|
|
103
151
|
}, [watch]);
|
|
152
|
+
useEffect(() => {
|
|
153
|
+
const data = queryDataRef.current;
|
|
154
|
+
if (!data) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const mountedFieldNames = getMountedFields();
|
|
158
|
+
if (!mountedFieldNames.size) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
let hasNewField = false;
|
|
162
|
+
mountedFieldNames.forEach((name) => {
|
|
163
|
+
if (!mountedFieldsRef.current.has(name)) {
|
|
164
|
+
hasNewField = true;
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
if (!hasNewField) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
mountedFieldsRef.current = new Set(mountedFieldNames);
|
|
171
|
+
applyValuesToFields(mountedFieldNames, data, true);
|
|
172
|
+
});
|
|
104
173
|
const onValuesChange = /* @__PURE__ */ __name((changeValues) => {
|
|
105
174
|
var _a, _b;
|
|
106
175
|
if (warnWhenUnsavedChanges) {
|
|
@@ -373,7 +442,7 @@ var useModalForm = /* @__PURE__ */ __name(({
|
|
|
373
442
|
show();
|
|
374
443
|
}
|
|
375
444
|
},
|
|
376
|
-
[id]
|
|
445
|
+
[id, action, setId, show]
|
|
377
446
|
);
|
|
378
447
|
const title = translate(
|
|
379
448
|
`${identifier}.titles.${actionProp}`,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useForm/index.ts","../src/useStepsForm/index.ts","../src/useModalForm/index.ts"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport get from \"lodash-es/get.js\";\nimport has from \"lodash-es/has.js\";\n\nimport {\n useForm as useHookForm,\n type UseFormProps as UseHookFormProps,\n type UseFormReturn,\n type FieldValues,\n type UseFormHandleSubmit,\n type Path,\n} from \"react-hook-form\";\nimport {\n type BaseRecord,\n type HttpError,\n useForm as useFormCore,\n useWarnAboutChange,\n type UseFormProps as UseFormCoreProps,\n type UseFormReturnType as UseFormReturnTypeCore,\n useTranslate,\n useRefineContext,\n flattenObjectKeys,\n} from \"@refinedev/core\";\n\nexport type UseFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturn<TVariables, TContext> & {\n refineCore: UseFormReturnTypeCore<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >;\n saveButtonProps: {\n disabled: boolean;\n onClick: (e: React.BaseSyntheticEvent) => void;\n };\n};\n\nexport type UseFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = {\n /**\n * Configuration object for the core of the [useForm](/docs/api-reference/core/hooks/useForm/)\n * @type [`UseFormCoreProps<TQueryFnData, TError, TVariables, TData, TResponse, TResponseError>`](/docs/api-reference/core/hooks/useForm/#properties)\n */\n refineCoreProps?: UseFormCoreProps<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >;\n /**\n * When you have unsaved changes and try to leave the current page, **refine** shows a confirmation modal box.\n * @default `false*`\n */\n warnWhenUnsavedChanges?: boolean;\n /**\n * Disables server-side validation\n * @default false\n * @see {@link https://refine.dev/docs/advanced-tutorials/forms/server-side-form-validation/}\n */\n disableServerSideValidation?: boolean;\n} & UseHookFormProps<TVariables, TContext>;\n\nexport const useForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n refineCoreProps,\n warnWhenUnsavedChanges: warnWhenUnsavedChangesProp,\n disableServerSideValidation: disableServerSideValidationProp = false,\n ...rest\n}: UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const { options } = useRefineContext();\n const disableServerSideValidation =\n options?.disableServerSideValidation || disableServerSideValidationProp;\n\n const translate = useTranslate();\n\n const { warnWhenUnsavedChanges: warnWhenUnsavedChangesRefine, setWarnWhen } =\n useWarnAboutChange();\n const warnWhenUnsavedChanges =\n warnWhenUnsavedChangesProp ?? warnWhenUnsavedChangesRefine;\n\n const useHookFormResult = useHookForm<TVariables, TContext>({\n ...rest,\n });\n\n const {\n watch,\n setValue,\n getValues,\n handleSubmit: handleSubmitReactHookForm,\n setError,\n } = useHookFormResult;\n\n const useFormCoreResult = useFormCore<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >({\n ...refineCoreProps,\n onMutationError: (error, _variables, _context) => {\n if (disableServerSideValidation) {\n refineCoreProps?.onMutationError?.(error, _variables, _context);\n return;\n }\n\n const errors = error?.errors;\n\n for (const key in errors) {\n // when the key is not registered in the form, react-hook-form not working\n const isKeyInVariables = Object.keys(\n flattenObjectKeys(_variables),\n ).includes(key);\n\n if (!isKeyInVariables) {\n continue;\n }\n\n const fieldError = errors[key];\n\n let newError = \"\";\n\n if (Array.isArray(fieldError)) {\n newError = fieldError.join(\" \");\n }\n\n if (typeof fieldError === \"string\") {\n newError = fieldError;\n }\n\n if (typeof fieldError === \"boolean\" && fieldError) {\n newError = \"Field is not valid.\";\n }\n\n if (typeof fieldError === \"object\" && \"key\" in fieldError) {\n const translatedMessage = translate(\n fieldError.key,\n fieldError.message,\n );\n\n newError = translatedMessage;\n }\n\n setError(key as Path<TVariables>, {\n message: newError,\n });\n }\n\n refineCoreProps?.onMutationError?.(error, _variables, _context);\n },\n });\n\n const { query, onFinish, formLoading, onFinishAutoSave } = useFormCoreResult;\n\n useEffect(() => {\n const data = query?.data?.data;\n if (!data) return;\n\n /**\n * get registered fields from react-hook-form\n */\n const registeredFields = Object.keys(flattenObjectKeys(getValues()));\n\n /**\n * set values from query result as default values\n */\n registeredFields.forEach((path) => {\n const hasValue = has(data, path);\n const dataValue = get(data, path);\n\n /**\n * set value if the path exists in the query result even if the value is null\n */\n if (hasValue) {\n setValue(path as Path<TVariables>, dataValue);\n }\n });\n }, [query?.data, setValue, getValues]);\n\n useEffect(() => {\n const subscription = watch((values: any, { type }: { type?: any }) => {\n if (type === \"change\") {\n onValuesChange(values);\n }\n });\n return () => subscription.unsubscribe();\n }, [watch]);\n\n const onValuesChange = (changeValues: TVariables) => {\n if (warnWhenUnsavedChanges) {\n setWarnWhen(true);\n }\n\n if (refineCoreProps?.autoSave?.enabled) {\n setWarnWhen(false);\n\n const onFinishProps =\n refineCoreProps.autoSave?.onFinish ?? ((values: TVariables) => values);\n\n return onFinishAutoSave(onFinishProps(changeValues)).catch(\n (error) => error,\n );\n }\n\n return changeValues;\n };\n\n const handleSubmit: UseFormHandleSubmit<TVariables> =\n (onValid, onInvalid) => async (e) => {\n setWarnWhen(false);\n return handleSubmitReactHookForm(onValid, onInvalid)(e);\n };\n\n const saveButtonProps = {\n disabled: formLoading,\n onClick: (e: React.BaseSyntheticEvent) => {\n handleSubmit(\n (v) => onFinish(v).catch(() => {}),\n () => false,\n )(e);\n },\n };\n\n return {\n ...useHookFormResult,\n handleSubmit,\n refineCore: useFormCoreResult,\n saveButtonProps,\n };\n};\n","import { useEffect, useState } from \"react\";\nimport type { FieldValues, Path } from \"react-hook-form\";\nimport type { BaseRecord, HttpError } from \"@refinedev/core\";\nimport get from \"lodash-es/get.js\";\n\nimport { useForm, type UseFormProps, type UseFormReturnType } from \"../useForm\";\n\nexport type UseStepsFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n steps: {\n currentStep: number;\n gotoStep: (step: number) => void;\n };\n};\n\nexport type UseStepsFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n /**\n * @description Configuration object for the steps.\n * `defaultStep`: Allows you to set the initial step.\n * \n * `isBackValidate`: Whether to validation the current step when going back.\n * @type `{\n defaultStep?: number;\n isBackValidate?: boolean;\n }`\n * @default `defaultStep = 0` `isBackValidate = false`\n */\n stepsProps?: {\n defaultStep?: number;\n isBackValidate?: boolean;\n };\n};\n\nexport const useStepsForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n stepsProps,\n ...rest\n}: UseStepsFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseStepsFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const { defaultStep = 0, isBackValidate = false } = stepsProps ?? {};\n const [current, setCurrent] = useState(defaultStep);\n\n const useHookFormResult = useForm<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n >({\n ...rest,\n });\n\n const {\n trigger,\n getValues,\n setValue,\n formState: { dirtyFields },\n refineCore: { query },\n } = useHookFormResult;\n\n useEffect(() => {\n const data = query?.data?.data;\n if (!data) return;\n\n const registeredFields = Object.keys(getValues());\n\n Object.entries(data).forEach(([key, value]) => {\n const name = key as Path<TVariables>;\n\n if (registeredFields.includes(name)) {\n if (!get(dirtyFields, name)) {\n setValue(name, value);\n }\n }\n });\n }, [query?.data, current, setValue, getValues]);\n\n const go = (step: number) => {\n let targetStep = step;\n\n if (step < 0) {\n targetStep = 0;\n }\n\n setCurrent(targetStep);\n };\n\n const gotoStep = async (step: number) => {\n if (step === current) {\n return;\n }\n\n if (step < current && !isBackValidate) {\n go(step);\n return;\n }\n\n const isValid = await trigger();\n if (isValid) {\n go(step);\n }\n };\n\n return {\n ...useHookFormResult,\n steps: {\n currentStep: current,\n gotoStep,\n },\n };\n};\n","import { useCallback } from \"react\";\nimport {\n type BaseKey,\n type BaseRecord,\n type FormWithSyncWithLocationParams,\n type HttpError,\n useGo,\n useModal,\n useParsed,\n useUserFriendlyName,\n useTranslate,\n useWarnAboutChange,\n useInvalidate,\n useResourceParams,\n} from \"@refinedev/core\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport { useForm, type UseFormProps, type UseFormReturnType } from \"../useForm\";\nimport React from \"react\";\n\nexport type UseModalFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n modal: {\n submit: (values: TVariables) => void;\n close: () => void;\n show: (id?: BaseKey) => void;\n visible: boolean;\n title: string;\n };\n};\n\nexport type UseModalFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n /**\n * @description Configuration object for the modal.\n * `defaultVisible`: Initial visibility state of the modal.\n *\n * `autoSubmitClose`: Whether the form should be submitted when the modal is closed.\n *\n * `autoResetForm`: Whether the form should be reset when the form is submitted.\n *\n * `autoResetFormWhenClose`: Whether the form should be reset to defaultValues when the modal is closed.\n * @type `{\n defaultVisible?: boolean;\n autoSubmitClose?: boolean;\n autoResetForm?: boolean;\n autoResetFormWhenClose?: boolean;\n }`\n * @default `defaultVisible = false` `autoSubmitClose = true` `autoResetForm = true` `autoResetFormWhenClose = true`\n */\n modalProps?: {\n defaultVisible?: boolean;\n autoSubmitClose?: boolean;\n autoResetForm?: boolean;\n autoResetFormWhenClose?: boolean;\n };\n} & FormWithSyncWithLocationParams;\n\nexport const useModalForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n modalProps,\n refineCoreProps,\n syncWithLocation,\n ...rest\n}: UseModalFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseModalFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const invalidate = useInvalidate();\n const [initiallySynced, setInitiallySynced] = React.useState(false);\n\n const translate = useTranslate();\n\n const { resource: resourceProp, action: actionProp } = refineCoreProps ?? {};\n\n const { resource, identifier } = useResourceParams({\n resource: resourceProp,\n });\n const { action: actionFromParams } = useResourceParams({\n resource: resourceProp,\n action: actionProp,\n });\n\n const parsed = useParsed();\n const go = useGo();\n const getUserFriendlyName = useUserFriendlyName();\n\n const action = actionProp ?? actionFromParams ?? \"\";\n\n const syncingId = !(\n typeof syncWithLocation === \"object\" && syncWithLocation?.syncId === false\n );\n\n const syncWithLocationKey =\n typeof syncWithLocation === \"object\" && \"key\" in syncWithLocation\n ? syncWithLocation.key\n : resource && action && syncWithLocation\n ? `modal-${identifier}-${action}`\n : undefined;\n\n const {\n defaultVisible = false,\n autoSubmitClose = true,\n autoResetForm = true,\n autoResetFormWhenClose = true,\n } = modalProps ?? {};\n\n const useHookFormResult = useForm<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n >({\n refineCoreProps: {\n ...refineCoreProps,\n meta: {\n ...(syncWithLocationKey ? { [syncWithLocationKey]: undefined } : {}),\n ...refineCoreProps?.meta,\n },\n },\n ...rest,\n });\n\n const {\n reset,\n refineCore: { onFinish, id, setId, autoSaveProps, query },\n saveButtonProps,\n handleSubmit,\n } = useHookFormResult;\n\n const { visible, show, close } = useModal({\n defaultVisible,\n });\n\n // compensate for setting of initial form values in useForm since it doesnt track modal visibility\n React.useEffect(() => {\n if (!visible || !query?.data?.data) return;\n\n const formData = query.data.data;\n if (!formData) return;\n\n reset(formData as any, {\n ...(!autoResetFormWhenClose && {\n keepDirtyValues: true,\n }),\n });\n }, [visible, query?.data?.data, autoResetFormWhenClose]);\n\n React.useEffect(() => {\n if (initiallySynced === false && syncWithLocationKey) {\n const openStatus = parsed?.params?.[syncWithLocationKey]?.open;\n if (typeof openStatus === \"boolean\") {\n if (openStatus) {\n show();\n }\n } else if (typeof openStatus === \"string\") {\n if (openStatus === \"true\") {\n show();\n }\n }\n\n if (syncingId) {\n const idFromParams = parsed?.params?.[syncWithLocationKey]?.id;\n if (idFromParams) {\n setId?.(idFromParams);\n }\n }\n\n setInitiallySynced(true);\n }\n }, [syncWithLocationKey, parsed, syncingId, setId]);\n\n React.useEffect(() => {\n if (initiallySynced === true) {\n if (visible && syncWithLocationKey) {\n go({\n query: {\n [syncWithLocationKey]: {\n ...parsed?.params?.[syncWithLocationKey],\n open: true,\n ...(syncingId && id && { id }),\n },\n },\n options: { keepQuery: true },\n type: \"replace\",\n });\n } else if (syncWithLocationKey && !visible) {\n go({\n query: {\n [syncWithLocationKey]: undefined,\n },\n options: { keepQuery: true },\n type: \"replace\",\n });\n }\n }\n }, [id, visible, show, syncWithLocationKey, syncingId]);\n\n const submit = async (values: TVariables) => {\n await onFinish(values);\n\n if (autoSubmitClose) {\n close();\n }\n\n if (autoResetForm) {\n reset();\n }\n };\n\n const { warnWhen, setWarnWhen } = useWarnAboutChange();\n const handleClose = useCallback(() => {\n if (\n autoSaveProps.status === \"success\" &&\n refineCoreProps?.autoSave?.invalidateOnClose\n ) {\n invalidate({\n id,\n invalidates: refineCoreProps.invalidates || [\"list\", \"many\", \"detail\"],\n dataProviderName: refineCoreProps.dataProviderName,\n resource: identifier,\n });\n }\n\n if (warnWhen) {\n const warnWhenConfirm = window.confirm(\n translate(\n \"warnWhenUnsavedChanges\",\n \"Are you sure you want to leave? You have unsaved changes.\",\n ),\n );\n\n if (warnWhenConfirm) {\n setWarnWhen(false);\n } else {\n return;\n }\n }\n\n setId?.(undefined);\n close();\n\n if (autoResetFormWhenClose) {\n reset();\n }\n }, [warnWhen, autoSaveProps.status]);\n\n const handleShow = useCallback(\n (showId?: BaseKey) => {\n if (typeof showId !== \"undefined\") {\n setId?.(showId);\n }\n const needsIdToOpen = action === \"edit\" || action === \"clone\";\n const hasId = typeof showId !== \"undefined\" || typeof id !== \"undefined\";\n if (needsIdToOpen ? hasId : true) {\n show();\n }\n },\n [id],\n );\n\n const title = translate(\n `${identifier}.titles.${actionProp}`,\n undefined,\n `${getUserFriendlyName(\n `${actionProp} ${resource?.meta?.label ?? identifier}`,\n \"singular\",\n )}`,\n );\n\n return {\n modal: {\n submit,\n close: handleClose,\n show: handleShow,\n visible,\n title,\n },\n ...useHookFormResult,\n saveButtonProps: {\n ...saveButtonProps,\n onClick: (e) => handleSubmit(submit)(e),\n },\n };\n};\n"],"mappings":"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","names":["useEffect","get","useEffect","get","useTranslate","useWarnAboutChange","React","React","useTranslate","_a","_b","useWarnAboutChange"]}
|
|
1
|
+
{"version":3,"sources":["../src/useForm/index.ts","../src/useStepsForm/index.ts","../src/useModalForm/index.ts"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport get from \"lodash-es/get.js\";\nimport has from \"lodash-es/has.js\";\n\nimport {\n useForm as useHookForm,\n type UseFormProps as UseHookFormProps,\n type UseFormReturn,\n type FieldValues,\n type UseFormHandleSubmit,\n type Path,\n} from \"react-hook-form\";\nimport {\n type BaseRecord,\n type HttpError,\n useForm as useFormCore,\n useWarnAboutChange,\n type UseFormProps as UseFormCoreProps,\n type UseFormReturnType as UseFormReturnTypeCore,\n useTranslate,\n useRefineContext,\n flattenObjectKeys,\n} from \"@refinedev/core\";\n\nexport type UseFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturn<TVariables, TContext> & {\n refineCore: UseFormReturnTypeCore<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >;\n saveButtonProps: {\n disabled: boolean;\n onClick: (e: React.BaseSyntheticEvent) => void;\n };\n};\n\nexport type UseFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = {\n /**\n * Configuration object for the core of the [useForm](/docs/api-reference/core/hooks/useForm/)\n * @type [`UseFormCoreProps<TQueryFnData, TError, TVariables, TData, TResponse, TResponseError>`](/docs/api-reference/core/hooks/useForm/#properties)\n */\n refineCoreProps?: UseFormCoreProps<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >;\n /**\n * When you have unsaved changes and try to leave the current page, **refine** shows a confirmation modal box.\n * @default `false*`\n */\n warnWhenUnsavedChanges?: boolean;\n /**\n * Disables server-side validation\n * @default false\n * @see {@link https://refine.dev/docs/advanced-tutorials/forms/server-side-form-validation/}\n */\n disableServerSideValidation?: boolean;\n} & UseHookFormProps<TVariables, TContext>;\n\nexport const useForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n refineCoreProps,\n warnWhenUnsavedChanges: warnWhenUnsavedChangesProp,\n disableServerSideValidation: disableServerSideValidationProp = false,\n ...rest\n}: UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const { options } = useRefineContext();\n const disableServerSideValidation =\n options?.disableServerSideValidation || disableServerSideValidationProp;\n\n const translate = useTranslate();\n\n const { warnWhenUnsavedChanges: warnWhenUnsavedChangesRefine, setWarnWhen } =\n useWarnAboutChange();\n const warnWhenUnsavedChanges =\n warnWhenUnsavedChangesProp ?? warnWhenUnsavedChangesRefine;\n\n const useHookFormResult = useHookForm<TVariables, TContext>({\n ...rest,\n });\n\n const {\n control,\n watch,\n setValue,\n getValues,\n handleSubmit: handleSubmitReactHookForm,\n setError,\n formState: { dirtyFields },\n } = useHookFormResult;\n\n // Keep query data and sync registered fields as they mount (e.g. Controller), without overriding dirty values.\n const queryDataRef = React.useRef<TData | undefined>(undefined);\n // Track which fields have already been synced to avoid repeated setValue calls.\n const syncedFieldsRef = React.useRef<Set<string>>(new Set());\n // Track mounted field names so late-registered fields can be detected.\n const mountedFieldsRef = React.useRef<Set<string>>(new Set());\n\n const useFormCoreResult = useFormCore<\n TQueryFnData,\n TError,\n TVariables,\n TData,\n TResponse,\n TResponseError\n >({\n ...refineCoreProps,\n onMutationError: (error, _variables, _context) => {\n if (disableServerSideValidation) {\n refineCoreProps?.onMutationError?.(error, _variables, _context);\n return;\n }\n\n const errors = error?.errors;\n\n for (const key in errors) {\n // when the key is not registered in the form, react-hook-form not working\n const isKeyInVariables = Object.keys(\n flattenObjectKeys(_variables),\n ).includes(key);\n\n if (!isKeyInVariables) {\n continue;\n }\n\n const fieldError = errors[key];\n\n let newError = \"\";\n\n if (Array.isArray(fieldError)) {\n newError = fieldError.join(\" \");\n }\n\n if (typeof fieldError === \"string\") {\n newError = fieldError;\n }\n\n if (typeof fieldError === \"boolean\" && fieldError) {\n newError = \"Field is not valid.\";\n }\n\n if (typeof fieldError === \"object\" && \"key\" in fieldError) {\n const translatedMessage = translate(\n fieldError.key,\n fieldError.message,\n );\n\n newError = translatedMessage;\n }\n\n setError(key as Path<TVariables>, {\n message: newError,\n });\n }\n\n refineCoreProps?.onMutationError?.(error, _variables, _context);\n },\n });\n\n const { query, onFinish, formLoading, onFinishAutoSave } = useFormCoreResult;\n\n const getMountedFields = () => {\n const mounted =\n (\n control as {\n _names?: {\n mount?: Set<string>;\n };\n }\n )._names?.mount ?? new Set<string>();\n\n return new Set(mounted);\n };\n\n const getRegisteredFields = () => {\n const registeredFields = new Set<string>();\n const mounted = getMountedFields();\n mounted.forEach((name) => registeredFields.add(name));\n\n const values = getValues();\n Object.keys(flattenObjectKeys(values)).forEach((path) => {\n registeredFields.add(path);\n });\n\n return registeredFields;\n };\n\n const applyValuesToFields = (\n fieldNames: Set<string>,\n data: TData,\n respectDirty = false,\n ) => {\n fieldNames.forEach((path) => {\n if (syncedFieldsRef.current.has(path)) {\n return;\n }\n\n if (respectDirty && get(dirtyFields, path)) {\n syncedFieldsRef.current.add(path);\n return;\n }\n\n syncedFieldsRef.current.add(path);\n\n if (has(data, path)) {\n setValue(path as Path<TVariables>, get(data, path));\n }\n });\n };\n\n // On query load, attempt a first sync after registration effects run.\n useEffect(() => {\n const data = query?.data?.data;\n if (!data) {\n queryDataRef.current = undefined;\n syncedFieldsRef.current = new Set();\n mountedFieldsRef.current = new Set();\n return;\n }\n\n let isActive = true;\n\n const applyQueryValues = () => {\n if (!isActive) return;\n\n applyValuesToFields(getRegisteredFields(), data, false);\n };\n\n queryDataRef.current = data;\n syncedFieldsRef.current = new Set();\n mountedFieldsRef.current = getMountedFields();\n\n // defer until after field registration effects\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(applyQueryValues);\n } else {\n Promise.resolve().then(applyQueryValues);\n }\n\n return () => {\n isActive = false;\n };\n }, [query?.data, setValue, getValues]);\n\n // Re-sync when new fields register; do not override user edits.\n useEffect(() => {\n const subscription = watch((values: any, { type }: { type?: any }) => {\n if (type === \"change\") {\n onValuesChange(values);\n }\n });\n return () => subscription.unsubscribe();\n }, [watch]);\n\n // Detect late-registered fields (e.g. Controller) and sync once they mount.\n // Intentionally no deps: RHF mutates the mount set in place and doesn't notify React,\n // so we check per-render and only apply values when new field names appear.\n useEffect(() => {\n const data = queryDataRef.current;\n if (!data) {\n return;\n }\n\n const mountedFieldNames = getMountedFields();\n if (!mountedFieldNames.size) {\n return;\n }\n\n let hasNewField = false;\n mountedFieldNames.forEach((name) => {\n if (!mountedFieldsRef.current.has(name)) {\n hasNewField = true;\n }\n });\n\n if (!hasNewField) {\n return;\n }\n\n mountedFieldsRef.current = new Set(mountedFieldNames);\n applyValuesToFields(mountedFieldNames, data, true);\n });\n\n const onValuesChange = (changeValues: TVariables) => {\n if (warnWhenUnsavedChanges) {\n setWarnWhen(true);\n }\n\n if (refineCoreProps?.autoSave?.enabled) {\n setWarnWhen(false);\n\n const onFinishProps =\n refineCoreProps.autoSave?.onFinish ?? ((values: TVariables) => values);\n\n return onFinishAutoSave(onFinishProps(changeValues)).catch(\n (error) => error,\n );\n }\n\n return changeValues;\n };\n\n const handleSubmit: UseFormHandleSubmit<TVariables> =\n (onValid, onInvalid) => async (e) => {\n setWarnWhen(false);\n return handleSubmitReactHookForm(onValid, onInvalid)(e);\n };\n\n const saveButtonProps = {\n disabled: formLoading,\n onClick: (e: React.BaseSyntheticEvent) => {\n handleSubmit(\n (v) => onFinish(v).catch(() => {}),\n () => false,\n )(e);\n },\n };\n\n return {\n ...useHookFormResult,\n handleSubmit,\n refineCore: useFormCoreResult,\n saveButtonProps,\n };\n};\n","import { useEffect, useState } from \"react\";\nimport type { FieldValues, Path } from \"react-hook-form\";\nimport type { BaseRecord, HttpError } from \"@refinedev/core\";\nimport get from \"lodash-es/get.js\";\n\nimport { useForm, type UseFormProps, type UseFormReturnType } from \"../useForm\";\n\nexport type UseStepsFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n steps: {\n currentStep: number;\n gotoStep: (step: number) => void;\n };\n};\n\nexport type UseStepsFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n /**\n * @description Configuration object for the steps.\n * `defaultStep`: Allows you to set the initial step.\n * \n * `isBackValidate`: Whether to validation the current step when going back.\n * @type `{\n defaultStep?: number;\n isBackValidate?: boolean;\n }`\n * @default `defaultStep = 0` `isBackValidate = false`\n */\n stepsProps?: {\n defaultStep?: number;\n isBackValidate?: boolean;\n };\n};\n\nexport const useStepsForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n stepsProps,\n ...rest\n}: UseStepsFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseStepsFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const { defaultStep = 0, isBackValidate = false } = stepsProps ?? {};\n const [current, setCurrent] = useState(defaultStep);\n\n const useHookFormResult = useForm<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n >({\n ...rest,\n });\n\n const {\n trigger,\n getValues,\n setValue,\n formState: { dirtyFields },\n refineCore: { query },\n } = useHookFormResult;\n\n useEffect(() => {\n const data = query?.data?.data;\n if (!data) return;\n\n const registeredFields = Object.keys(getValues());\n\n Object.entries(data).forEach(([key, value]) => {\n const name = key as Path<TVariables>;\n\n if (registeredFields.includes(name)) {\n if (!get(dirtyFields, name)) {\n setValue(name, value);\n }\n }\n });\n }, [query?.data, current, setValue, getValues]);\n\n const go = (step: number) => {\n let targetStep = step;\n\n if (step < 0) {\n targetStep = 0;\n }\n\n setCurrent(targetStep);\n };\n\n const gotoStep = async (step: number) => {\n if (step === current) {\n return;\n }\n\n if (step < current && !isBackValidate) {\n go(step);\n return;\n }\n\n const isValid = await trigger();\n if (isValid) {\n go(step);\n }\n };\n\n return {\n ...useHookFormResult,\n steps: {\n currentStep: current,\n gotoStep,\n },\n };\n};\n","import { useCallback } from \"react\";\nimport {\n type BaseKey,\n type BaseRecord,\n type FormWithSyncWithLocationParams,\n type HttpError,\n useGo,\n useModal,\n useParsed,\n useUserFriendlyName,\n useTranslate,\n useWarnAboutChange,\n useInvalidate,\n useResourceParams,\n} from \"@refinedev/core\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport { useForm, type UseFormProps, type UseFormReturnType } from \"../useForm\";\nimport React from \"react\";\n\nexport type UseModalFormReturnType<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n modal: {\n submit: (values: TVariables) => void;\n close: () => void;\n show: (id?: BaseKey) => void;\n visible: boolean;\n title: string;\n };\n};\n\nexport type UseModalFormProps<\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n> = UseFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> & {\n /**\n * @description Configuration object for the modal.\n * `defaultVisible`: Initial visibility state of the modal.\n *\n * `autoSubmitClose`: Whether the form should be submitted when the modal is closed.\n *\n * `autoResetForm`: Whether the form should be reset when the form is submitted.\n *\n * `autoResetFormWhenClose`: Whether the form should be reset to defaultValues when the modal is closed.\n * @type `{\n defaultVisible?: boolean;\n autoSubmitClose?: boolean;\n autoResetForm?: boolean;\n autoResetFormWhenClose?: boolean;\n }`\n * @default `defaultVisible = false` `autoSubmitClose = true` `autoResetForm = true` `autoResetFormWhenClose = true`\n */\n modalProps?: {\n defaultVisible?: boolean;\n autoSubmitClose?: boolean;\n autoResetForm?: boolean;\n autoResetFormWhenClose?: boolean;\n };\n} & FormWithSyncWithLocationParams;\n\nexport const useModalForm = <\n TQueryFnData extends BaseRecord = BaseRecord,\n TError extends HttpError = HttpError,\n TVariables extends FieldValues = FieldValues,\n TContext extends object = {},\n TData extends BaseRecord = TQueryFnData,\n TResponse extends BaseRecord = TData,\n TResponseError extends HttpError = TError,\n>({\n modalProps,\n refineCoreProps,\n syncWithLocation,\n ...rest\n}: UseModalFormProps<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> = {}): UseModalFormReturnType<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n> => {\n const invalidate = useInvalidate();\n const [initiallySynced, setInitiallySynced] = React.useState(false);\n\n const translate = useTranslate();\n\n const { resource: resourceProp, action: actionProp } = refineCoreProps ?? {};\n\n const { resource, identifier } = useResourceParams({\n resource: resourceProp,\n });\n const { action: actionFromParams } = useResourceParams({\n resource: resourceProp,\n action: actionProp,\n });\n\n const parsed = useParsed();\n const go = useGo();\n const getUserFriendlyName = useUserFriendlyName();\n\n const action = actionProp ?? actionFromParams ?? \"\";\n\n const syncingId = !(\n typeof syncWithLocation === \"object\" && syncWithLocation?.syncId === false\n );\n\n const syncWithLocationKey =\n typeof syncWithLocation === \"object\" && \"key\" in syncWithLocation\n ? syncWithLocation.key\n : resource && action && syncWithLocation\n ? `modal-${identifier}-${action}`\n : undefined;\n\n const {\n defaultVisible = false,\n autoSubmitClose = true,\n autoResetForm = true,\n autoResetFormWhenClose = true,\n } = modalProps ?? {};\n\n const useHookFormResult = useForm<\n TQueryFnData,\n TError,\n TVariables,\n TContext,\n TData,\n TResponse,\n TResponseError\n >({\n refineCoreProps: {\n ...refineCoreProps,\n meta: {\n ...(syncWithLocationKey ? { [syncWithLocationKey]: undefined } : {}),\n ...refineCoreProps?.meta,\n },\n },\n ...rest,\n });\n\n const {\n reset,\n refineCore: { onFinish, id, setId, autoSaveProps, query },\n saveButtonProps,\n handleSubmit,\n } = useHookFormResult;\n\n const { visible, show, close } = useModal({\n defaultVisible,\n });\n\n // compensate for setting of initial form values in useForm since it doesnt track modal visibility\n React.useEffect(() => {\n if (!visible || !query?.data?.data) return;\n\n const formData = query.data.data;\n if (!formData) return;\n\n reset(formData as any, {\n ...(!autoResetFormWhenClose && {\n keepDirtyValues: true,\n }),\n });\n }, [visible, query?.data?.data, autoResetFormWhenClose]);\n\n React.useEffect(() => {\n if (initiallySynced === false && syncWithLocationKey) {\n const openStatus = parsed?.params?.[syncWithLocationKey]?.open;\n if (typeof openStatus === \"boolean\") {\n if (openStatus) {\n show();\n }\n } else if (typeof openStatus === \"string\") {\n if (openStatus === \"true\") {\n show();\n }\n }\n\n if (syncingId) {\n const idFromParams = parsed?.params?.[syncWithLocationKey]?.id;\n if (idFromParams) {\n setId?.(idFromParams);\n }\n }\n\n setInitiallySynced(true);\n }\n }, [syncWithLocationKey, parsed, syncingId, setId]);\n\n React.useEffect(() => {\n if (initiallySynced === true) {\n if (visible && syncWithLocationKey) {\n go({\n query: {\n [syncWithLocationKey]: {\n ...parsed?.params?.[syncWithLocationKey],\n open: true,\n ...(syncingId && id && { id }),\n },\n },\n options: { keepQuery: true },\n type: \"replace\",\n });\n } else if (syncWithLocationKey && !visible) {\n go({\n query: {\n [syncWithLocationKey]: undefined,\n },\n options: { keepQuery: true },\n type: \"replace\",\n });\n }\n }\n }, [id, visible, show, syncWithLocationKey, syncingId]);\n\n const submit = async (values: TVariables) => {\n await onFinish(values);\n\n if (autoSubmitClose) {\n close();\n }\n\n if (autoResetForm) {\n reset();\n }\n };\n\n const { warnWhen, setWarnWhen } = useWarnAboutChange();\n const handleClose = useCallback(() => {\n if (\n autoSaveProps.status === \"success\" &&\n refineCoreProps?.autoSave?.invalidateOnClose\n ) {\n invalidate({\n id,\n invalidates: refineCoreProps.invalidates || [\"list\", \"many\", \"detail\"],\n dataProviderName: refineCoreProps.dataProviderName,\n resource: identifier,\n });\n }\n\n if (warnWhen) {\n const warnWhenConfirm = window.confirm(\n translate(\n \"warnWhenUnsavedChanges\",\n \"Are you sure you want to leave? You have unsaved changes.\",\n ),\n );\n\n if (warnWhenConfirm) {\n setWarnWhen(false);\n } else {\n return;\n }\n }\n\n setId?.(undefined);\n close();\n\n if (autoResetFormWhenClose) {\n reset();\n }\n }, [warnWhen, autoSaveProps.status]);\n\n const handleShow = useCallback(\n (showId?: BaseKey) => {\n if (typeof showId !== \"undefined\") {\n setId?.(showId);\n }\n const needsIdToOpen = action === \"edit\" || action === \"clone\";\n const hasId = typeof showId !== \"undefined\" || typeof id !== \"undefined\";\n if (needsIdToOpen ? hasId : true) {\n show();\n }\n },\n [id, action, setId, show],\n );\n\n const title = translate(\n `${identifier}.titles.${actionProp}`,\n undefined,\n `${getUserFriendlyName(\n `${actionProp} ${resource?.meta?.label ?? identifier}`,\n \"singular\",\n )}`,\n );\n\n return {\n modal: {\n submit,\n close: handleClose,\n show: handleShow,\n visible,\n title,\n },\n ...useHookFormResult,\n saveButtonProps: {\n ...saveButtonProps,\n onClick: (e) => handleSubmit(submit)(e),\n },\n };\n};\n"],"mappings":"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","names":["useEffect","get","useEffect","get","useTranslate","useWarnAboutChange","React","React","useTranslate","_a","_b","useWarnAboutChange"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/useForm/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAIzC,OAAO,EAEL,KAAK,YAAY,IAAI,gBAAgB,EACrC,KAAK,aAAa,EAClB,KAAK,WAAW,EAGjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EAGd,KAAK,YAAY,IAAI,gBAAgB,EACrC,KAAK,iBAAiB,IAAI,qBAAqB,EAIhD,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,iBAAiB,CAC3B,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,IACvC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG;IACxC,UAAU,EAAE,qBAAqB,CAC/B,YAAY,EACZ,MAAM,EACN,UAAU,EACV,KAAK,EACL,SAAS,EACT,cAAc,CACf,CAAC;IACF,eAAe,EAAE;QACf,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC;KAChD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,CACtB,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,IACvC;IACF;;;OAGG;IACH,eAAe,CAAC,EAAE,gBAAgB,CAChC,YAAY,EACZ,MAAM,EACN,UAAU,EACV,KAAK,EACL,SAAS,EACT,cAAc,CACf,CAAC;IACF;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC,GAAG,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAE3C,eAAO,MAAM,OAAO,GAClB,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,EACzC,iJAKC,YAAY,CACb,YAAY,EACZ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,CACV,KAAG,iBAAiB,CACxB,YAAY,EACZ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/useForm/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAIzC,OAAO,EAEL,KAAK,YAAY,IAAI,gBAAgB,EACrC,KAAK,aAAa,EAClB,KAAK,WAAW,EAGjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EAGd,KAAK,YAAY,IAAI,gBAAgB,EACrC,KAAK,iBAAiB,IAAI,qBAAqB,EAIhD,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,iBAAiB,CAC3B,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,IACvC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG;IACxC,UAAU,EAAE,qBAAqB,CAC/B,YAAY,EACZ,MAAM,EACN,UAAU,EACV,KAAK,EACL,SAAS,EACT,cAAc,CACf,CAAC;IACF,eAAe,EAAE;QACf,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC;KAChD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,CACtB,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,IACvC;IACF;;;OAGG;IACH,eAAe,CAAC,EAAE,gBAAgB,CAChC,YAAY,EACZ,MAAM,EACN,UAAU,EACV,KAAK,EACL,SAAS,EACT,cAAc,CACf,CAAC;IACF;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC,GAAG,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAE3C,eAAO,MAAM,OAAO,GAClB,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,EACzC,iJAKC,YAAY,CACb,YAAY,EACZ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,CACV,KAAG,iBAAiB,CACxB,YAAY,EACZ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,CAoQf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/useForm/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAIzC,OAAO,EAEL,KAAK,YAAY,IAAI,gBAAgB,EACrC,KAAK,aAAa,EAClB,KAAK,WAAW,EAGjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EAGd,KAAK,YAAY,IAAI,gBAAgB,EACrC,KAAK,iBAAiB,IAAI,qBAAqB,EAIhD,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,iBAAiB,CAC3B,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,IACvC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG;IACxC,UAAU,EAAE,qBAAqB,CAC/B,YAAY,EACZ,MAAM,EACN,UAAU,EACV,KAAK,EACL,SAAS,EACT,cAAc,CACf,CAAC;IACF,eAAe,EAAE;QACf,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC;KAChD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,CACtB,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,IACvC;IACF;;;OAGG;IACH,eAAe,CAAC,EAAE,gBAAgB,CAChC,YAAY,EACZ,MAAM,EACN,UAAU,EACV,KAAK,EACL,SAAS,EACT,cAAc,CACf,CAAC;IACF;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC,GAAG,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAE3C,eAAO,MAAM,OAAO,GAClB,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,EACzC,iJAKC,YAAY,CACb,YAAY,EACZ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,CACV,KAAG,iBAAiB,CACxB,YAAY,EACZ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/useForm/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAIzC,OAAO,EAEL,KAAK,YAAY,IAAI,gBAAgB,EACrC,KAAK,aAAa,EAClB,KAAK,WAAW,EAGjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EAGd,KAAK,YAAY,IAAI,gBAAgB,EACrC,KAAK,iBAAiB,IAAI,qBAAqB,EAIhD,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,iBAAiB,CAC3B,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,IACvC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG;IACxC,UAAU,EAAE,qBAAqB,CAC/B,YAAY,EACZ,MAAM,EACN,UAAU,EACV,KAAK,EACL,SAAS,EACT,cAAc,CACf,CAAC;IACF,eAAe,EAAE;QACf,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC;KAChD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,CACtB,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,IACvC;IACF;;;OAGG;IACH,eAAe,CAAC,EAAE,gBAAgB,CAChC,YAAY,EACZ,MAAM,EACN,UAAU,EACV,KAAK,EACL,SAAS,EACT,cAAc,CACf,CAAC;IACF;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC,GAAG,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAE3C,eAAO,MAAM,OAAO,GAClB,YAAY,SAAS,UAAU,GAAG,UAAU,EAC5C,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,QAAQ,SAAS,MAAM,GAAG,EAAE,EAC5B,KAAK,SAAS,UAAU,GAAG,YAAY,EACvC,SAAS,SAAS,UAAU,GAAG,KAAK,EACpC,cAAc,SAAS,SAAS,GAAG,MAAM,EACzC,iJAKC,YAAY,CACb,YAAY,EACZ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,CACV,KAAG,iBAAiB,CACxB,YAAY,EACZ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,CAoQf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@refinedev/react-hook-form",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "refine offers a React Hook Form adapter that allows you to use the React Hook Form library with refine.",
|
|
6
6
|
"repository": {
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@esbuild-plugins/node-resolve": "^0.1.4",
|
|
40
|
-
"@refinedev/core": "^5.0.
|
|
40
|
+
"@refinedev/core": "^5.0.6",
|
|
41
41
|
"@testing-library/jest-dom": "^6.6.3",
|
|
42
42
|
"@testing-library/react": "^16.3.0",
|
|
43
43
|
"@testing-library/user-event": "^14.6.1",
|
|
@@ -2,8 +2,10 @@ import React from "react";
|
|
|
2
2
|
|
|
3
3
|
import { useForm } from ".";
|
|
4
4
|
import type { IRefineOptions, HttpError } from "@refinedev/core";
|
|
5
|
+
import * as Core from "@refinedev/core";
|
|
5
6
|
import { MockJSONServer, TestWrapper, act, render, waitFor } from "../../test";
|
|
6
7
|
import { Route, Routes } from "react-router";
|
|
8
|
+
import { Controller } from "react-hook-form";
|
|
7
9
|
|
|
8
10
|
interface IPost {
|
|
9
11
|
title: string;
|
|
@@ -11,6 +13,7 @@ interface IPost {
|
|
|
11
13
|
slug: string;
|
|
12
14
|
category: { id: number };
|
|
13
15
|
tags: string[];
|
|
16
|
+
userId?: number;
|
|
14
17
|
}
|
|
15
18
|
|
|
16
19
|
const renderForm = ({
|
|
@@ -232,4 +235,98 @@ describe("useForm hook", () => {
|
|
|
232
235
|
expect(queryByText("Field is not valid.")).not.toBeInTheDocument();
|
|
233
236
|
});
|
|
234
237
|
});
|
|
238
|
+
|
|
239
|
+
it("should sync values for fields registered after query resolves", async () => {
|
|
240
|
+
const useFormCoreSpy = vi.spyOn(Core, "useForm").mockReturnValue({
|
|
241
|
+
query: {
|
|
242
|
+
data: {
|
|
243
|
+
data: {
|
|
244
|
+
id: "1",
|
|
245
|
+
title: "Post 1",
|
|
246
|
+
content: "",
|
|
247
|
+
slug: "",
|
|
248
|
+
category: { id: 1 },
|
|
249
|
+
tags: [],
|
|
250
|
+
userId: 5,
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
onFinish: vi.fn().mockResolvedValue({}),
|
|
255
|
+
onFinishAutoSave: vi.fn().mockResolvedValue({}),
|
|
256
|
+
formLoading: false,
|
|
257
|
+
} as any);
|
|
258
|
+
|
|
259
|
+
try {
|
|
260
|
+
const EditPage = () => {
|
|
261
|
+
const {
|
|
262
|
+
control,
|
|
263
|
+
register,
|
|
264
|
+
refineCore: { query },
|
|
265
|
+
} = useForm<IPost, HttpError, IPost>({
|
|
266
|
+
refineCoreProps: {
|
|
267
|
+
resource: "posts",
|
|
268
|
+
action: "edit",
|
|
269
|
+
id: "1",
|
|
270
|
+
},
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
const [showLateField, setShowLateField] = React.useState(false);
|
|
274
|
+
|
|
275
|
+
return (
|
|
276
|
+
<div>
|
|
277
|
+
<input data-testid="title-field" {...register("title")} />
|
|
278
|
+
<span data-testid="query-user-id">
|
|
279
|
+
{query?.data?.data?.userId ?? ""}
|
|
280
|
+
</span>
|
|
281
|
+
<button
|
|
282
|
+
type="button"
|
|
283
|
+
data-testid="show-late-field"
|
|
284
|
+
onClick={() => setShowLateField(true)}
|
|
285
|
+
>
|
|
286
|
+
show
|
|
287
|
+
</button>
|
|
288
|
+
{showLateField && (
|
|
289
|
+
<Controller
|
|
290
|
+
control={control}
|
|
291
|
+
name="userId"
|
|
292
|
+
render={({ field }) => (
|
|
293
|
+
<input
|
|
294
|
+
data-testid="late-field"
|
|
295
|
+
value={field.value ?? ""}
|
|
296
|
+
onChange={field.onChange}
|
|
297
|
+
/>
|
|
298
|
+
)}
|
|
299
|
+
/>
|
|
300
|
+
)}
|
|
301
|
+
</div>
|
|
302
|
+
);
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
const { findByTestId } = render(
|
|
306
|
+
<Routes>
|
|
307
|
+
<Route path="/" element={<EditPage />} />
|
|
308
|
+
</Routes>,
|
|
309
|
+
{
|
|
310
|
+
wrapper: TestWrapper({}),
|
|
311
|
+
},
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
const queryUserId = await findByTestId("query-user-id");
|
|
315
|
+
|
|
316
|
+
await waitFor(() => {
|
|
317
|
+
expect(queryUserId).toHaveTextContent("5");
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
await act(async () => {
|
|
321
|
+
(await findByTestId("show-late-field")).click();
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
const lateField = await findByTestId("late-field");
|
|
325
|
+
await waitFor(() => {
|
|
326
|
+
expect(lateField).toHaveValue("5");
|
|
327
|
+
});
|
|
328
|
+
} finally {
|
|
329
|
+
useFormCoreSpy.mockRestore();
|
|
330
|
+
}
|
|
331
|
+
});
|
|
235
332
|
});
|
package/src/useForm/index.ts
CHANGED
|
@@ -125,13 +125,22 @@ export const useForm = <
|
|
|
125
125
|
});
|
|
126
126
|
|
|
127
127
|
const {
|
|
128
|
+
control,
|
|
128
129
|
watch,
|
|
129
130
|
setValue,
|
|
130
131
|
getValues,
|
|
131
132
|
handleSubmit: handleSubmitReactHookForm,
|
|
132
133
|
setError,
|
|
134
|
+
formState: { dirtyFields },
|
|
133
135
|
} = useHookFormResult;
|
|
134
136
|
|
|
137
|
+
// Keep query data and sync registered fields as they mount (e.g. Controller), without overriding dirty values.
|
|
138
|
+
const queryDataRef = React.useRef<TData | undefined>(undefined);
|
|
139
|
+
// Track which fields have already been synced to avoid repeated setValue calls.
|
|
140
|
+
const syncedFieldsRef = React.useRef<Set<string>>(new Set());
|
|
141
|
+
// Track mounted field names so late-registered fields can be detected.
|
|
142
|
+
const mountedFieldsRef = React.useRef<Set<string>>(new Set());
|
|
143
|
+
|
|
135
144
|
const useFormCoreResult = useFormCore<
|
|
136
145
|
TQueryFnData,
|
|
137
146
|
TError,
|
|
@@ -195,31 +204,90 @@ export const useForm = <
|
|
|
195
204
|
|
|
196
205
|
const { query, onFinish, formLoading, onFinishAutoSave } = useFormCoreResult;
|
|
197
206
|
|
|
198
|
-
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
207
|
+
const getMountedFields = () => {
|
|
208
|
+
const mounted =
|
|
209
|
+
(
|
|
210
|
+
control as {
|
|
211
|
+
_names?: {
|
|
212
|
+
mount?: Set<string>;
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
)._names?.mount ?? new Set<string>();
|
|
216
|
+
|
|
217
|
+
return new Set(mounted);
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const getRegisteredFields = () => {
|
|
221
|
+
const registeredFields = new Set<string>();
|
|
222
|
+
const mounted = getMountedFields();
|
|
223
|
+
mounted.forEach((name) => registeredFields.add(name));
|
|
224
|
+
|
|
225
|
+
const values = getValues();
|
|
226
|
+
Object.keys(flattenObjectKeys(values)).forEach((path) => {
|
|
227
|
+
registeredFields.add(path);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
return registeredFields;
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
const applyValuesToFields = (
|
|
234
|
+
fieldNames: Set<string>,
|
|
235
|
+
data: TData,
|
|
236
|
+
respectDirty = false,
|
|
237
|
+
) => {
|
|
238
|
+
fieldNames.forEach((path) => {
|
|
239
|
+
if (syncedFieldsRef.current.has(path)) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (respectDirty && get(dirtyFields, path)) {
|
|
244
|
+
syncedFieldsRef.current.add(path);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
syncedFieldsRef.current.add(path);
|
|
249
|
+
|
|
250
|
+
if (has(data, path)) {
|
|
251
|
+
setValue(path as Path<TVariables>, get(data, path));
|
|
219
252
|
}
|
|
220
253
|
});
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
// On query load, attempt a first sync after registration effects run.
|
|
257
|
+
useEffect(() => {
|
|
258
|
+
const data = query?.data?.data;
|
|
259
|
+
if (!data) {
|
|
260
|
+
queryDataRef.current = undefined;
|
|
261
|
+
syncedFieldsRef.current = new Set();
|
|
262
|
+
mountedFieldsRef.current = new Set();
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
let isActive = true;
|
|
267
|
+
|
|
268
|
+
const applyQueryValues = () => {
|
|
269
|
+
if (!isActive) return;
|
|
270
|
+
|
|
271
|
+
applyValuesToFields(getRegisteredFields(), data, false);
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
queryDataRef.current = data;
|
|
275
|
+
syncedFieldsRef.current = new Set();
|
|
276
|
+
mountedFieldsRef.current = getMountedFields();
|
|
277
|
+
|
|
278
|
+
// defer until after field registration effects
|
|
279
|
+
if (typeof queueMicrotask === "function") {
|
|
280
|
+
queueMicrotask(applyQueryValues);
|
|
281
|
+
} else {
|
|
282
|
+
Promise.resolve().then(applyQueryValues);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return () => {
|
|
286
|
+
isActive = false;
|
|
287
|
+
};
|
|
221
288
|
}, [query?.data, setValue, getValues]);
|
|
222
289
|
|
|
290
|
+
// Re-sync when new fields register; do not override user edits.
|
|
223
291
|
useEffect(() => {
|
|
224
292
|
const subscription = watch((values: any, { type }: { type?: any }) => {
|
|
225
293
|
if (type === "change") {
|
|
@@ -229,6 +297,35 @@ export const useForm = <
|
|
|
229
297
|
return () => subscription.unsubscribe();
|
|
230
298
|
}, [watch]);
|
|
231
299
|
|
|
300
|
+
// Detect late-registered fields (e.g. Controller) and sync once they mount.
|
|
301
|
+
// Intentionally no deps: RHF mutates the mount set in place and doesn't notify React,
|
|
302
|
+
// so we check per-render and only apply values when new field names appear.
|
|
303
|
+
useEffect(() => {
|
|
304
|
+
const data = queryDataRef.current;
|
|
305
|
+
if (!data) {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const mountedFieldNames = getMountedFields();
|
|
310
|
+
if (!mountedFieldNames.size) {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
let hasNewField = false;
|
|
315
|
+
mountedFieldNames.forEach((name) => {
|
|
316
|
+
if (!mountedFieldsRef.current.has(name)) {
|
|
317
|
+
hasNewField = true;
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
if (!hasNewField) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
mountedFieldsRef.current = new Set(mountedFieldNames);
|
|
326
|
+
applyValuesToFields(mountedFieldNames, data, true);
|
|
327
|
+
});
|
|
328
|
+
|
|
232
329
|
const onValuesChange = (changeValues: TVariables) => {
|
|
233
330
|
if (warnWhenUnsavedChanges) {
|
|
234
331
|
setWarnWhen(true);
|
|
@@ -387,4 +387,58 @@ describe("useModalForm Hook", () => {
|
|
|
387
387
|
title: "default-title",
|
|
388
388
|
});
|
|
389
389
|
});
|
|
390
|
+
|
|
391
|
+
it("should handle action switching correctly - modal should show after switching from edit to create", async () => {
|
|
392
|
+
// This test reproduces the bug described in the issue
|
|
393
|
+
const { result, rerender } = renderHook(
|
|
394
|
+
({ action }: { action: "create" | "edit" }) =>
|
|
395
|
+
useModalForm({
|
|
396
|
+
refineCoreProps: {
|
|
397
|
+
resource: "posts",
|
|
398
|
+
action,
|
|
399
|
+
},
|
|
400
|
+
}),
|
|
401
|
+
{
|
|
402
|
+
wrapper: TestWrapper({}),
|
|
403
|
+
initialProps: { action: "create" as const },
|
|
404
|
+
},
|
|
405
|
+
);
|
|
406
|
+
|
|
407
|
+
// Step 1: Open create modal - should work
|
|
408
|
+
await act(async () => {
|
|
409
|
+
result.current.modal.show();
|
|
410
|
+
});
|
|
411
|
+
expect(result.current.modal.visible).toBe(true);
|
|
412
|
+
|
|
413
|
+
// Step 2: Close modal
|
|
414
|
+
await act(async () => {
|
|
415
|
+
result.current.modal.close();
|
|
416
|
+
});
|
|
417
|
+
expect(result.current.modal.visible).toBe(false);
|
|
418
|
+
|
|
419
|
+
// Step 3: Switch to edit action
|
|
420
|
+
rerender({ action: "edit" });
|
|
421
|
+
|
|
422
|
+
// Step 4: Open edit modal with ID - should work
|
|
423
|
+
await act(async () => {
|
|
424
|
+
result.current.modal.show("5");
|
|
425
|
+
});
|
|
426
|
+
expect(result.current.modal.visible).toBe(true);
|
|
427
|
+
|
|
428
|
+
// Step 5: Close modal
|
|
429
|
+
await act(async () => {
|
|
430
|
+
result.current.modal.close();
|
|
431
|
+
});
|
|
432
|
+
expect(result.current.modal.visible).toBe(false);
|
|
433
|
+
|
|
434
|
+
// Step 6: Switch back to create action
|
|
435
|
+
rerender({ action: "create" });
|
|
436
|
+
|
|
437
|
+
// Step 7: Try to open create modal again
|
|
438
|
+
await act(async () => {
|
|
439
|
+
result.current.modal.show();
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
expect(result.current.modal.visible).toBe(true);
|
|
443
|
+
});
|
|
390
444
|
});
|