@refinedev/react-hook-form 5.0.1 → 5.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,3 +1,419 @@
1
1
  "use client"
2
- var pe=Object.create;var M=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var Fe=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var E=(e,t)=>M(e,"name",{value:t,configurable:!0});var ye=(e,t)=>{for(var s in t)M(e,s,{get:t[s],enumerable:!0})},te=(e,t,s,S)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of me(t))!Re.call(e,i)&&i!==s&&M(e,i,{get:()=>t[i],enumerable:!(S=ce(t,i))||S.enumerable});return e};var P=(e,t,s)=>(s=e!=null?pe(Fe(e)):{},te(t||!e||!e.__esModule?M(s,"default",{value:e,enumerable:!0}):s,e)),Ee=e=>te(M({},"__esModule",{value:!0}),e);var xe={};ye(xe,{useForm:()=>j,useModalForm:()=>de,useStepsForm:()=>ne});module.exports=Ee(xe);var Y=require("react"),re=P(require("lodash/get")),se=P(require("lodash/has")),ae=require("react-hook-form"),x=require("@refinedev/core");var j=E(({refineCoreProps:e,warnWhenUnsavedChanges:t,disableServerSideValidation:s=!1,...S}={})=>{let{options:i}=(0,x.useRefineContext)(),g=(i==null?void 0:i.disableServerSideValidation)||s,Q=(0,x.useTranslate)(),{warnWhenUnsavedChanges:k,setWarnWhen:V}=(0,x.useWarnAboutChange)(),D=t??k,B=(0,ae.useForm)({...S}),{watch:c,setValue:U,getValues:m,handleSubmit:l,setError:h}=B,b=(0,x.useForm)({...e,onMutationError:(r,p,a)=>{var y,R;if(g){(y=e==null?void 0:e.onMutationError)==null||y.call(e,r,p,a);return}let o=r==null?void 0:r.errors;for(let w in o){if(!Object.keys((0,x.flattenObjectKeys)(p)).includes(w))continue;let d=o[w],f="";Array.isArray(d)&&(f=d.join(" ")),typeof d=="string"&&(f=d),typeof d=="boolean"&&d&&(f="Field is not valid."),typeof d=="object"&&"key"in d&&(f=Q(d.key,d.message)),h(w,{message:f})}(R=e==null?void 0:e.onMutationError)==null||R.call(e,r,p,a)}}),{query:F,onFinish:u,formLoading:v,onFinishAutoSave:$}=b;(0,Y.useEffect)(()=>{var a;let r=(a=F==null?void 0:F.data)==null?void 0:a.data;if(!r)return;Object.keys((0,x.flattenObjectKeys)(m())).forEach(o=>{let y=(0,se.default)(r,o),R=(0,re.default)(r,o);y&&U(o,R)})},[F==null?void 0:F.data,U,m]),(0,Y.useEffect)(()=>{let r=c((p,{type:a})=>{a==="change"&&A(p)});return()=>r.unsubscribe()},[c]);let A=E(r=>{var p,a;if(D&&V(!0),(p=e==null?void 0:e.autoSave)!=null&&p.enabled){V(!1);let o=((a=e.autoSave)==null?void 0:a.onFinish)??(y=>y);return $(o(r)).catch(y=>y)}return r},"onValuesChange"),C=E((r,p)=>async a=>(V(!1),l(r,p)(a)),"handleSubmit");return{...B,handleSubmit:C,refineCore:b,saveButtonProps:{disabled:v,onClick:r=>{C(p=>u(p).catch(()=>{}),()=>!1)(r)}}}},"useForm");var K=require("react"),oe=P(require("lodash/get"));var ne=E(({stepsProps:e,...t}={})=>{let{defaultStep:s=0,isBackValidate:S=!1}=e??{},[i,g]=(0,K.useState)(s),Q=j({...t}),{trigger:k,getValues:V,setValue:D,formState:{dirtyFields:B},refineCore:{query:c}}=Q;(0,K.useEffect)(()=>{var b;let l=(b=c==null?void 0:c.data)==null?void 0:b.data;if(!l)return;let h=Object.keys(V());Object.entries(l).forEach(([F,u])=>{let v=F;h.includes(v)&&((0,oe.default)(B,v)||D(v,u))})},[c==null?void 0:c.data,i,D,V]);let U=E(l=>{let h=l;l<0&&(h=0),g(h)},"go");return{...Q,steps:{currentStep:i,gotoStep:E(async l=>{if(l===i)return;if(l<i&&!S){U(l);return}await k()&&U(l)},"gotoStep")}}},"useStepsForm");var z=require("react"),T=require("@refinedev/core");var W=P(require("react"));var de=E(({modalProps:e,refineCoreProps:t,syncWithLocation:s,...S}={})=>{var _,L;let i=(0,T.useInvalidate)(),[g,Q]=W.default.useState(!1),k=(0,T.useTranslate)(),{resource:V,action:D}=t??{},{resource:B,identifier:c}=(0,T.useResourceParams)({resource:V}),{action:U}=(0,T.useResourceParams)({resource:V,action:D}),m=(0,T.useParsed)(),l=(0,T.useGo)(),h=(0,T.useUserFriendlyName)(),b=D??U??"",F=!(typeof s=="object"&&(s==null?void 0:s.syncId)===!1),u=typeof s=="object"&&"key"in s?s.key:B&&b&&s?`modal-${c}-${b}`:void 0,{defaultVisible:v=!1,autoSubmitClose:$=!0,autoResetForm:A=!0,autoResetFormWhenClose:C=!0}=e??{},N=j({refineCoreProps:{...t,meta:{...u?{[u]:void 0}:{},...t==null?void 0:t.meta}},...S}),{reset:r,refineCore:{onFinish:p,id:a,setId:o,autoSaveProps:y,query:R},saveButtonProps:w,handleSubmit:J}=N,{visible:d,show:f,close:I}=(0,T.useModal)({defaultVisible:v});W.default.useEffect(()=>{var H;if(!d||!((H=R==null?void 0:R.data)!=null&&H.data))return;let n=R.data.data;n&&r(n,{...!C&&{keepDirtyValues:!0}})},[d,(_=R==null?void 0:R.data)==null?void 0:_.data,C]),W.default.useEffect(()=>{var n,H,G,q;if(g===!1&&u){let O=(H=(n=m==null?void 0:m.params)==null?void 0:n[u])==null?void 0:H.open;if(typeof O=="boolean"?O&&f():typeof O=="string"&&O==="true"&&f(),F){let ee=(q=(G=m==null?void 0:m.params)==null?void 0:G[u])==null?void 0:q.id;ee&&(o==null||o(ee))}Q(!0)}},[u,m,F,o]),W.default.useEffect(()=>{var n;g===!0&&(d&&u?l({query:{[u]:{...(n=m==null?void 0:m.params)==null?void 0:n[u],open:!0,...F&&a&&{id:a}}},options:{keepQuery:!0},type:"replace"}):u&&!d&&l({query:{[u]:void 0},options:{keepQuery:!0},type:"replace"}))},[a,d,f,u,F]);let X=E(async n=>{await p(n),$&&I(),A&&r()},"submit"),{warnWhen:Z,setWarnWhen:Te}=(0,T.useWarnAboutChange)(),ie=(0,z.useCallback)(()=>{var n;if(y.status==="success"&&((n=t==null?void 0:t.autoSave)!=null&&n.invalidateOnClose)&&i({id:a,invalidates:t.invalidates||["list","many","detail"],dataProviderName:t.dataProviderName,resource:c}),Z)if(window.confirm(k("warnWhenUnsavedChanges","Are you sure you want to leave? You have unsaved changes.")))Te(!1);else return;o==null||o(void 0),I(),C&&r()},[Z,y.status]),ue=(0,z.useCallback)(n=>{typeof n<"u"&&(o==null||o(n)),(!(b==="edit"||b==="clone")||(typeof n<"u"||typeof a<"u"))&&f()},[a]),le=k(`${c}.titles.${D}`,void 0,`${h(`${D} ${((L=B==null?void 0:B.meta)==null?void 0:L.label)??c}`,"singular")}`);return{modal:{submit:X,close:ie,show:ue,visible:d,title:le},...N,saveButtonProps:{...w,onClick:n=>J(X)(n)}}},"useModalForm");
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+
31
+ // src/index.ts
32
+ var src_exports = {};
33
+ __export(src_exports, {
34
+ useForm: () => useForm,
35
+ useModalForm: () => useModalForm,
36
+ useStepsForm: () => useStepsForm
37
+ });
38
+ module.exports = __toCommonJS(src_exports);
39
+
40
+ // src/useForm/index.ts
41
+ var import_react = require("react");
42
+ var import_get = __toESM(require("lodash/get"));
43
+ var import_has = __toESM(require("lodash/has"));
44
+ var import_react_hook_form = require("react-hook-form");
45
+ var import_core = require("@refinedev/core");
46
+ var useForm = /* @__PURE__ */ __name(({
47
+ refineCoreProps,
48
+ warnWhenUnsavedChanges: warnWhenUnsavedChangesProp,
49
+ disableServerSideValidation: disableServerSideValidationProp = false,
50
+ ...rest
51
+ } = {}) => {
52
+ const { options } = (0, import_core.useRefineContext)();
53
+ const disableServerSideValidation = (options == null ? void 0 : options.disableServerSideValidation) || disableServerSideValidationProp;
54
+ const translate = (0, import_core.useTranslate)();
55
+ const { warnWhenUnsavedChanges: warnWhenUnsavedChangesRefine, setWarnWhen } = (0, import_core.useWarnAboutChange)();
56
+ const warnWhenUnsavedChanges = warnWhenUnsavedChangesProp ?? warnWhenUnsavedChangesRefine;
57
+ const useHookFormResult = (0, import_react_hook_form.useForm)({
58
+ ...rest
59
+ });
60
+ const {
61
+ watch,
62
+ setValue,
63
+ getValues,
64
+ handleSubmit: handleSubmitReactHookForm,
65
+ setError
66
+ } = useHookFormResult;
67
+ const useFormCoreResult = (0, import_core.useForm)({
68
+ ...refineCoreProps,
69
+ onMutationError: (error, _variables, _context) => {
70
+ var _a, _b;
71
+ if (disableServerSideValidation) {
72
+ (_a = refineCoreProps == null ? void 0 : refineCoreProps.onMutationError) == null ? void 0 : _a.call(refineCoreProps, error, _variables, _context);
73
+ return;
74
+ }
75
+ const errors = error == null ? void 0 : error.errors;
76
+ for (const key in errors) {
77
+ const isKeyInVariables = Object.keys(
78
+ (0, import_core.flattenObjectKeys)(_variables)
79
+ ).includes(key);
80
+ if (!isKeyInVariables) {
81
+ continue;
82
+ }
83
+ const fieldError = errors[key];
84
+ let newError = "";
85
+ if (Array.isArray(fieldError)) {
86
+ newError = fieldError.join(" ");
87
+ }
88
+ if (typeof fieldError === "string") {
89
+ newError = fieldError;
90
+ }
91
+ if (typeof fieldError === "boolean" && fieldError) {
92
+ newError = "Field is not valid.";
93
+ }
94
+ if (typeof fieldError === "object" && "key" in fieldError) {
95
+ const translatedMessage = translate(
96
+ fieldError.key,
97
+ fieldError.message
98
+ );
99
+ newError = translatedMessage;
100
+ }
101
+ setError(key, {
102
+ message: newError
103
+ });
104
+ }
105
+ (_b = refineCoreProps == null ? void 0 : refineCoreProps.onMutationError) == null ? void 0 : _b.call(refineCoreProps, error, _variables, _context);
106
+ }
107
+ });
108
+ const { query, onFinish, formLoading, onFinishAutoSave } = useFormCoreResult;
109
+ (0, import_react.useEffect)(() => {
110
+ var _a;
111
+ const data = (_a = query == null ? void 0 : query.data) == null ? void 0 : _a.data;
112
+ if (!data)
113
+ return;
114
+ const registeredFields = Object.keys((0, import_core.flattenObjectKeys)(getValues()));
115
+ registeredFields.forEach((path) => {
116
+ const hasValue = (0, import_has.default)(data, path);
117
+ const dataValue = (0, import_get.default)(data, path);
118
+ if (hasValue) {
119
+ setValue(path, dataValue);
120
+ }
121
+ });
122
+ }, [query == null ? void 0 : query.data, setValue, getValues]);
123
+ (0, import_react.useEffect)(() => {
124
+ const subscription = watch((values, { type }) => {
125
+ if (type === "change") {
126
+ onValuesChange(values);
127
+ }
128
+ });
129
+ return () => subscription.unsubscribe();
130
+ }, [watch]);
131
+ const onValuesChange = /* @__PURE__ */ __name((changeValues) => {
132
+ var _a, _b;
133
+ if (warnWhenUnsavedChanges) {
134
+ setWarnWhen(true);
135
+ }
136
+ if ((_a = refineCoreProps == null ? void 0 : refineCoreProps.autoSave) == null ? void 0 : _a.enabled) {
137
+ setWarnWhen(false);
138
+ const onFinishProps = ((_b = refineCoreProps.autoSave) == null ? void 0 : _b.onFinish) ?? ((values) => values);
139
+ return onFinishAutoSave(onFinishProps(changeValues)).catch(
140
+ (error) => error
141
+ );
142
+ }
143
+ return changeValues;
144
+ }, "onValuesChange");
145
+ const handleSubmit = /* @__PURE__ */ __name((onValid, onInvalid) => async (e) => {
146
+ setWarnWhen(false);
147
+ return handleSubmitReactHookForm(onValid, onInvalid)(e);
148
+ }, "handleSubmit");
149
+ const saveButtonProps = {
150
+ disabled: formLoading,
151
+ onClick: (e) => {
152
+ handleSubmit(
153
+ (v) => onFinish(v).catch(() => {
154
+ }),
155
+ () => false
156
+ )(e);
157
+ }
158
+ };
159
+ return {
160
+ ...useHookFormResult,
161
+ handleSubmit,
162
+ refineCore: useFormCoreResult,
163
+ saveButtonProps
164
+ };
165
+ }, "useForm");
166
+
167
+ // src/useStepsForm/index.ts
168
+ var import_react2 = require("react");
169
+ var import_get2 = __toESM(require("lodash/get"));
170
+ var useStepsForm = /* @__PURE__ */ __name(({
171
+ stepsProps,
172
+ ...rest
173
+ } = {}) => {
174
+ const { defaultStep = 0, isBackValidate = false } = stepsProps ?? {};
175
+ const [current, setCurrent] = (0, import_react2.useState)(defaultStep);
176
+ const useHookFormResult = useForm({
177
+ ...rest
178
+ });
179
+ const {
180
+ trigger,
181
+ getValues,
182
+ setValue,
183
+ formState: { dirtyFields },
184
+ refineCore: { query }
185
+ } = useHookFormResult;
186
+ (0, import_react2.useEffect)(() => {
187
+ var _a;
188
+ const data = (_a = query == null ? void 0 : query.data) == null ? void 0 : _a.data;
189
+ if (!data)
190
+ return;
191
+ const registeredFields = Object.keys(getValues());
192
+ Object.entries(data).forEach(([key, value]) => {
193
+ const name = key;
194
+ if (registeredFields.includes(name)) {
195
+ if (!(0, import_get2.default)(dirtyFields, name)) {
196
+ setValue(name, value);
197
+ }
198
+ }
199
+ });
200
+ }, [query == null ? void 0 : query.data, current, setValue, getValues]);
201
+ const go = /* @__PURE__ */ __name((step) => {
202
+ let targetStep = step;
203
+ if (step < 0) {
204
+ targetStep = 0;
205
+ }
206
+ setCurrent(targetStep);
207
+ }, "go");
208
+ const gotoStep = /* @__PURE__ */ __name(async (step) => {
209
+ if (step === current) {
210
+ return;
211
+ }
212
+ if (step < current && !isBackValidate) {
213
+ go(step);
214
+ return;
215
+ }
216
+ const isValid = await trigger();
217
+ if (isValid) {
218
+ go(step);
219
+ }
220
+ }, "gotoStep");
221
+ return {
222
+ ...useHookFormResult,
223
+ steps: {
224
+ currentStep: current,
225
+ gotoStep
226
+ }
227
+ };
228
+ }, "useStepsForm");
229
+
230
+ // src/useModalForm/index.ts
231
+ var import_react3 = require("react");
232
+ var import_core2 = require("@refinedev/core");
233
+ var import_react4 = __toESM(require("react"));
234
+ var useModalForm = /* @__PURE__ */ __name(({
235
+ modalProps,
236
+ refineCoreProps,
237
+ syncWithLocation,
238
+ ...rest
239
+ } = {}) => {
240
+ var _a, _b;
241
+ const invalidate = (0, import_core2.useInvalidate)();
242
+ const [initiallySynced, setInitiallySynced] = import_react4.default.useState(false);
243
+ const translate = (0, import_core2.useTranslate)();
244
+ const { resource: resourceProp, action: actionProp } = refineCoreProps ?? {};
245
+ const { resource, identifier } = (0, import_core2.useResourceParams)({
246
+ resource: resourceProp
247
+ });
248
+ const { action: actionFromParams } = (0, import_core2.useResourceParams)({
249
+ resource: resourceProp,
250
+ action: actionProp
251
+ });
252
+ const parsed = (0, import_core2.useParsed)();
253
+ const go = (0, import_core2.useGo)();
254
+ const getUserFriendlyName = (0, import_core2.useUserFriendlyName)();
255
+ const action = actionProp ?? actionFromParams ?? "";
256
+ const syncingId = !(typeof syncWithLocation === "object" && (syncWithLocation == null ? void 0 : syncWithLocation.syncId) === false);
257
+ const syncWithLocationKey = typeof syncWithLocation === "object" && "key" in syncWithLocation ? syncWithLocation.key : resource && action && syncWithLocation ? `modal-${identifier}-${action}` : void 0;
258
+ const {
259
+ defaultVisible = false,
260
+ autoSubmitClose = true,
261
+ autoResetForm = true,
262
+ autoResetFormWhenClose = true
263
+ } = modalProps ?? {};
264
+ const useHookFormResult = useForm({
265
+ refineCoreProps: {
266
+ ...refineCoreProps,
267
+ meta: {
268
+ ...syncWithLocationKey ? { [syncWithLocationKey]: void 0 } : {},
269
+ ...refineCoreProps == null ? void 0 : refineCoreProps.meta
270
+ }
271
+ },
272
+ ...rest
273
+ });
274
+ const {
275
+ reset,
276
+ refineCore: { onFinish, id, setId, autoSaveProps, query },
277
+ saveButtonProps,
278
+ handleSubmit
279
+ } = useHookFormResult;
280
+ const { visible, show, close } = (0, import_core2.useModal)({
281
+ defaultVisible
282
+ });
283
+ import_react4.default.useEffect(() => {
284
+ var _a2;
285
+ if (!visible || !((_a2 = query == null ? void 0 : query.data) == null ? void 0 : _a2.data))
286
+ return;
287
+ const formData = query.data.data;
288
+ if (!formData)
289
+ return;
290
+ reset(formData, {
291
+ ...!autoResetFormWhenClose && {
292
+ keepDirtyValues: true
293
+ }
294
+ });
295
+ }, [visible, (_a = query == null ? void 0 : query.data) == null ? void 0 : _a.data, autoResetFormWhenClose]);
296
+ import_react4.default.useEffect(() => {
297
+ var _a2, _b2, _c, _d;
298
+ if (initiallySynced === false && syncWithLocationKey) {
299
+ const openStatus = (_b2 = (_a2 = parsed == null ? void 0 : parsed.params) == null ? void 0 : _a2[syncWithLocationKey]) == null ? void 0 : _b2.open;
300
+ if (typeof openStatus === "boolean") {
301
+ if (openStatus) {
302
+ show();
303
+ }
304
+ } else if (typeof openStatus === "string") {
305
+ if (openStatus === "true") {
306
+ show();
307
+ }
308
+ }
309
+ if (syncingId) {
310
+ const idFromParams = (_d = (_c = parsed == null ? void 0 : parsed.params) == null ? void 0 : _c[syncWithLocationKey]) == null ? void 0 : _d.id;
311
+ if (idFromParams) {
312
+ setId == null ? void 0 : setId(idFromParams);
313
+ }
314
+ }
315
+ setInitiallySynced(true);
316
+ }
317
+ }, [syncWithLocationKey, parsed, syncingId, setId]);
318
+ import_react4.default.useEffect(() => {
319
+ var _a2;
320
+ if (initiallySynced === true) {
321
+ if (visible && syncWithLocationKey) {
322
+ go({
323
+ query: {
324
+ [syncWithLocationKey]: {
325
+ ...(_a2 = parsed == null ? void 0 : parsed.params) == null ? void 0 : _a2[syncWithLocationKey],
326
+ open: true,
327
+ ...syncingId && id && { id }
328
+ }
329
+ },
330
+ options: { keepQuery: true },
331
+ type: "replace"
332
+ });
333
+ } else if (syncWithLocationKey && !visible) {
334
+ go({
335
+ query: {
336
+ [syncWithLocationKey]: void 0
337
+ },
338
+ options: { keepQuery: true },
339
+ type: "replace"
340
+ });
341
+ }
342
+ }
343
+ }, [id, visible, show, syncWithLocationKey, syncingId]);
344
+ const submit = /* @__PURE__ */ __name(async (values) => {
345
+ await onFinish(values);
346
+ if (autoSubmitClose) {
347
+ close();
348
+ }
349
+ if (autoResetForm) {
350
+ reset();
351
+ }
352
+ }, "submit");
353
+ const { warnWhen, setWarnWhen } = (0, import_core2.useWarnAboutChange)();
354
+ const handleClose = (0, import_react3.useCallback)(() => {
355
+ var _a2;
356
+ if (autoSaveProps.status === "success" && ((_a2 = refineCoreProps == null ? void 0 : refineCoreProps.autoSave) == null ? void 0 : _a2.invalidateOnClose)) {
357
+ invalidate({
358
+ id,
359
+ invalidates: refineCoreProps.invalidates || ["list", "many", "detail"],
360
+ dataProviderName: refineCoreProps.dataProviderName,
361
+ resource: identifier
362
+ });
363
+ }
364
+ if (warnWhen) {
365
+ const warnWhenConfirm = window.confirm(
366
+ translate(
367
+ "warnWhenUnsavedChanges",
368
+ "Are you sure you want to leave? You have unsaved changes."
369
+ )
370
+ );
371
+ if (warnWhenConfirm) {
372
+ setWarnWhen(false);
373
+ } else {
374
+ return;
375
+ }
376
+ }
377
+ setId == null ? void 0 : setId(void 0);
378
+ close();
379
+ if (autoResetFormWhenClose) {
380
+ reset();
381
+ }
382
+ }, [warnWhen, autoSaveProps.status]);
383
+ const handleShow = (0, import_react3.useCallback)(
384
+ (showId) => {
385
+ if (typeof showId !== "undefined") {
386
+ setId == null ? void 0 : setId(showId);
387
+ }
388
+ const needsIdToOpen = action === "edit" || action === "clone";
389
+ const hasId = typeof showId !== "undefined" || typeof id !== "undefined";
390
+ if (needsIdToOpen ? hasId : true) {
391
+ show();
392
+ }
393
+ },
394
+ [id, action, setId, show]
395
+ );
396
+ const title = translate(
397
+ `${identifier}.titles.${actionProp}`,
398
+ void 0,
399
+ `${getUserFriendlyName(
400
+ `${actionProp} ${((_b = resource == null ? void 0 : resource.meta) == null ? void 0 : _b.label) ?? identifier}`,
401
+ "singular"
402
+ )}`
403
+ );
404
+ return {
405
+ modal: {
406
+ submit,
407
+ close: handleClose,
408
+ show: handleShow,
409
+ visible,
410
+ title
411
+ },
412
+ ...useHookFormResult,
413
+ saveButtonProps: {
414
+ ...saveButtonProps,
415
+ onClick: (e) => handleSubmit(submit)(e)
416
+ }
417
+ };
418
+ }, "useModalForm");
3
419
  //# sourceMappingURL=index.cjs.map
@@ -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":["src_exports","__export","useForm","useModalForm","useStepsForm","__toCommonJS","import_react","import_get","import_has","import_react_hook_form","import_core","useForm","__name","refineCoreProps","warnWhenUnsavedChangesProp","disableServerSideValidationProp","rest","options","disableServerSideValidation","translate","warnWhenUnsavedChangesRefine","setWarnWhen","warnWhenUnsavedChanges","useHookFormResult","useHookForm","watch","setValue","getValues","handleSubmitReactHookForm","setError","useFormCoreResult","useFormCore","error","_variables","_context","_a","_b","errors","key","fieldError","newError","query","onFinish","formLoading","onFinishAutoSave","data","path","hasValue","has","dataValue","get","subscription","values","type","onValuesChange","changeValues","onFinishProps","handleSubmit","onValid","onInvalid","e","v","import_react","import_get","useStepsForm","__name","stepsProps","rest","defaultStep","isBackValidate","current","setCurrent","useHookFormResult","useForm","trigger","getValues","setValue","dirtyFields","query","_a","data","registeredFields","key","value","name","get","go","step","targetStep","import_react","import_core","import_react","useModalForm","__name","modalProps","refineCoreProps","syncWithLocation","rest","_a","_b","invalidate","initiallySynced","setInitiallySynced","React","translate","resourceProp","actionProp","resource","identifier","actionFromParams","parsed","go","getUserFriendlyName","action","syncingId","syncWithLocationKey","defaultVisible","autoSubmitClose","autoResetForm","autoResetFormWhenClose","useHookFormResult","useForm","reset","onFinish","id","setId","autoSaveProps","query","saveButtonProps","handleSubmit","visible","show","close","formData","_c","_d","openStatus","idFromParams","submit","values","warnWhen","setWarnWhen","handleClose","handleShow","showId","title","e"]}
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, 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","useFormCore","has","get","import_react","import_get","get","import_react","import_core","import_react","React","_a","_b"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,406 @@
1
1
  "use client"
2
- var re=Object.defineProperty;var R=(t,n)=>re(t,"name",{value:n,configurable:!0});import{useEffect as J}from"react";import se from"lodash-es/get.js";import ae from"lodash-es/has.js";import{useForm as oe}from"react-hook-form";import{useForm as ne,useWarnAboutChange as de,useTranslate as Te,useRefineContext as ie,flattenObjectKeys as X}from"@refinedev/core";var C=R(({refineCoreProps:t,warnWhenUnsavedChanges:n,disableServerSideValidation:c=!1,...Q}={})=>{let{options:y}=ie(),U=(y==null?void 0:y.disableServerSideValidation)||c,v=Te(),{warnWhenUnsavedChanges:H,setWarnWhen:b}=de(),f=n??H,V=oe({...Q}),{watch:u,setValue:B,getValues:l,handleSubmit:T,setError:D}=V,E=ne({...t,onMutationError:(e,i,r)=>{var F,m;if(U){(F=t==null?void 0:t.onMutationError)==null||F.call(t,e,i,r);return}let s=e==null?void 0:e.errors;for(let k in s){if(!Object.keys(X(i)).includes(k))continue;let o=s[k],x="";Array.isArray(o)&&(x=o.join(" ")),typeof o=="string"&&(x=o),typeof o=="boolean"&&o&&(x="Field is not valid."),typeof o=="object"&&"key"in o&&(x=v(o.key,o.message)),D(k,{message:x})}(m=t==null?void 0:t.onMutationError)==null||m.call(t,e,i,r)}}),{query:p,onFinish:d,formLoading:h,onFinishAutoSave:M}=E;J(()=>{var r;let e=(r=p==null?void 0:p.data)==null?void 0:r.data;if(!e)return;Object.keys(X(l())).forEach(s=>{let F=ae(e,s),m=se(e,s);F&&B(s,m)})},[p==null?void 0:p.data,B,l]),J(()=>{let e=u((i,{type:r})=>{r==="change"&&W(i)});return()=>e.unsubscribe()},[u]);let W=R(e=>{var i,r;if(f&&b(!0),(i=t==null?void 0:t.autoSave)!=null&&i.enabled){b(!1);let s=((r=t.autoSave)==null?void 0:r.onFinish)??(F=>F);return M(s(e)).catch(F=>F)}return e},"onValuesChange"),g=R((e,i)=>async r=>(b(!1),T(e,i)(r)),"handleSubmit");return{...V,handleSubmit:g,refineCore:E,saveButtonProps:{disabled:h,onClick:e=>{g(i=>d(i).catch(()=>{}),()=>!1)(e)}}}},"useForm");import{useEffect as ue,useState as le}from"react";import pe from"lodash-es/get.js";var ce=R(({stepsProps:t,...n}={})=>{let{defaultStep:c=0,isBackValidate:Q=!1}=t??{},[y,U]=le(c),v=C({...n}),{trigger:H,getValues:b,setValue:f,formState:{dirtyFields:V},refineCore:{query:u}}=v;ue(()=>{var E;let T=(E=u==null?void 0:u.data)==null?void 0:E.data;if(!T)return;let D=Object.keys(b());Object.entries(T).forEach(([p,d])=>{let h=p;D.includes(h)&&(pe(V,h)||f(h,d))})},[u==null?void 0:u.data,y,f,b]);let B=R(T=>{let D=T;T<0&&(D=0),U(D)},"go");return{...v,steps:{currentStep:y,gotoStep:R(async T=>{if(T===y)return;if(T<y&&!Q){B(T);return}await H()&&B(T)},"gotoStep")}}},"useStepsForm");import{useCallback as Z}from"react";import{useGo as me,useModal as Fe,useParsed as Re,useUserFriendlyName as ye,useTranslate as Ee,useWarnAboutChange as xe,useInvalidate as be,useResourceParams as _}from"@refinedev/core";import w from"react";var fe=R(({modalProps:t,refineCoreProps:n,syncWithLocation:c,...Q}={})=>{var I,G;let y=be(),[U,v]=w.useState(!1),H=Ee(),{resource:b,action:f}=n??{},{resource:V,identifier:u}=_({resource:b}),{action:B}=_({resource:b,action:f}),l=Re(),T=me(),D=ye(),E=f??B??"",p=!(typeof c=="object"&&(c==null?void 0:c.syncId)===!1),d=typeof c=="object"&&"key"in c?c.key:V&&E&&c?`modal-${u}-${E}`:void 0,{defaultVisible:h=!1,autoSubmitClose:M=!0,autoResetForm:W=!0,autoResetFormWhenClose:g=!0}=t??{},O=C({refineCoreProps:{...n,meta:{...d?{[d]:void 0}:{},...n==null?void 0:n.meta}},...Q}),{reset:e,refineCore:{onFinish:i,id:r,setId:s,autoSaveProps:F,query:m},saveButtonProps:k,handleSubmit:$}=O,{visible:o,show:x,close:P}=Fe({defaultVisible:h});w.useEffect(()=>{var S;if(!o||!((S=m==null?void 0:m.data)!=null&&S.data))return;let a=m.data.data;a&&e(a,{...!g&&{keepDirtyValues:!0}})},[o,(I=m==null?void 0:m.data)==null?void 0:I.data,g]),w.useEffect(()=>{var a,S,K,Y;if(U===!1&&d){let j=(S=(a=l==null?void 0:l.params)==null?void 0:a[d])==null?void 0:S.open;if(typeof j=="boolean"?j&&x():typeof j=="string"&&j==="true"&&x(),p){let z=(Y=(K=l==null?void 0:l.params)==null?void 0:K[d])==null?void 0:Y.id;z&&(s==null||s(z))}v(!0)}},[d,l,p,s]),w.useEffect(()=>{var a;U===!0&&(o&&d?T({query:{[d]:{...(a=l==null?void 0:l.params)==null?void 0:a[d],open:!0,...p&&r&&{id:r}}},options:{keepQuery:!0},type:"replace"}):d&&!o&&T({query:{[d]:void 0},options:{keepQuery:!0},type:"replace"}))},[r,o,x,d,p]);let A=R(async a=>{await i(a),M&&P(),W&&e()},"submit"),{warnWhen:N,setWarnWhen:L}=xe(),q=Z(()=>{var a;if(F.status==="success"&&((a=n==null?void 0:n.autoSave)!=null&&a.invalidateOnClose)&&y({id:r,invalidates:n.invalidates||["list","many","detail"],dataProviderName:n.dataProviderName,resource:u}),N)if(window.confirm(H("warnWhenUnsavedChanges","Are you sure you want to leave? You have unsaved changes.")))L(!1);else return;s==null||s(void 0),P(),g&&e()},[N,F.status]),ee=Z(a=>{typeof a<"u"&&(s==null||s(a)),(!(E==="edit"||E==="clone")||(typeof a<"u"||typeof r<"u"))&&x()},[r]),te=H(`${u}.titles.${f}`,void 0,`${D(`${f} ${((G=V==null?void 0:V.meta)==null?void 0:G.label)??u}`,"singular")}`);return{modal:{submit:A,close:q,show:ee,visible:o,title:te},...O,saveButtonProps:{...k,onClick:a=>$(A)(a)}}},"useModalForm");export{C as useForm,fe as useModalForm,ce as useStepsForm};
2
+ var __defProp = Object.defineProperty;
3
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
4
+
5
+ // src/useForm/index.ts
6
+ import { useEffect } from "react";
7
+ import get from "lodash-es/get.js";
8
+ import has from "lodash-es/has.js";
9
+ import {
10
+ useForm as useHookForm
11
+ } from "react-hook-form";
12
+ import {
13
+ useForm as useFormCore,
14
+ useWarnAboutChange,
15
+ useTranslate,
16
+ useRefineContext,
17
+ flattenObjectKeys
18
+ } from "@refinedev/core";
19
+ var useForm = /* @__PURE__ */ __name(({
20
+ refineCoreProps,
21
+ warnWhenUnsavedChanges: warnWhenUnsavedChangesProp,
22
+ disableServerSideValidation: disableServerSideValidationProp = false,
23
+ ...rest
24
+ } = {}) => {
25
+ const { options } = useRefineContext();
26
+ const disableServerSideValidation = (options == null ? void 0 : options.disableServerSideValidation) || disableServerSideValidationProp;
27
+ const translate = useTranslate();
28
+ const { warnWhenUnsavedChanges: warnWhenUnsavedChangesRefine, setWarnWhen } = useWarnAboutChange();
29
+ const warnWhenUnsavedChanges = warnWhenUnsavedChangesProp ?? warnWhenUnsavedChangesRefine;
30
+ const useHookFormResult = useHookForm({
31
+ ...rest
32
+ });
33
+ const {
34
+ watch,
35
+ setValue,
36
+ getValues,
37
+ handleSubmit: handleSubmitReactHookForm,
38
+ setError
39
+ } = useHookFormResult;
40
+ const useFormCoreResult = useFormCore({
41
+ ...refineCoreProps,
42
+ onMutationError: (error, _variables, _context) => {
43
+ var _a, _b;
44
+ if (disableServerSideValidation) {
45
+ (_a = refineCoreProps == null ? void 0 : refineCoreProps.onMutationError) == null ? void 0 : _a.call(refineCoreProps, error, _variables, _context);
46
+ return;
47
+ }
48
+ const errors = error == null ? void 0 : error.errors;
49
+ for (const key in errors) {
50
+ const isKeyInVariables = Object.keys(
51
+ flattenObjectKeys(_variables)
52
+ ).includes(key);
53
+ if (!isKeyInVariables) {
54
+ continue;
55
+ }
56
+ const fieldError = errors[key];
57
+ let newError = "";
58
+ if (Array.isArray(fieldError)) {
59
+ newError = fieldError.join(" ");
60
+ }
61
+ if (typeof fieldError === "string") {
62
+ newError = fieldError;
63
+ }
64
+ if (typeof fieldError === "boolean" && fieldError) {
65
+ newError = "Field is not valid.";
66
+ }
67
+ if (typeof fieldError === "object" && "key" in fieldError) {
68
+ const translatedMessage = translate(
69
+ fieldError.key,
70
+ fieldError.message
71
+ );
72
+ newError = translatedMessage;
73
+ }
74
+ setError(key, {
75
+ message: newError
76
+ });
77
+ }
78
+ (_b = refineCoreProps == null ? void 0 : refineCoreProps.onMutationError) == null ? void 0 : _b.call(refineCoreProps, error, _variables, _context);
79
+ }
80
+ });
81
+ const { query, onFinish, formLoading, onFinishAutoSave } = useFormCoreResult;
82
+ useEffect(() => {
83
+ var _a;
84
+ const data = (_a = query == null ? void 0 : query.data) == null ? void 0 : _a.data;
85
+ if (!data)
86
+ return;
87
+ const registeredFields = Object.keys(flattenObjectKeys(getValues()));
88
+ registeredFields.forEach((path) => {
89
+ const hasValue = has(data, path);
90
+ const dataValue = get(data, path);
91
+ if (hasValue) {
92
+ setValue(path, dataValue);
93
+ }
94
+ });
95
+ }, [query == null ? void 0 : query.data, setValue, getValues]);
96
+ useEffect(() => {
97
+ const subscription = watch((values, { type }) => {
98
+ if (type === "change") {
99
+ onValuesChange(values);
100
+ }
101
+ });
102
+ return () => subscription.unsubscribe();
103
+ }, [watch]);
104
+ const onValuesChange = /* @__PURE__ */ __name((changeValues) => {
105
+ var _a, _b;
106
+ if (warnWhenUnsavedChanges) {
107
+ setWarnWhen(true);
108
+ }
109
+ if ((_a = refineCoreProps == null ? void 0 : refineCoreProps.autoSave) == null ? void 0 : _a.enabled) {
110
+ setWarnWhen(false);
111
+ const onFinishProps = ((_b = refineCoreProps.autoSave) == null ? void 0 : _b.onFinish) ?? ((values) => values);
112
+ return onFinishAutoSave(onFinishProps(changeValues)).catch(
113
+ (error) => error
114
+ );
115
+ }
116
+ return changeValues;
117
+ }, "onValuesChange");
118
+ const handleSubmit = /* @__PURE__ */ __name((onValid, onInvalid) => async (e) => {
119
+ setWarnWhen(false);
120
+ return handleSubmitReactHookForm(onValid, onInvalid)(e);
121
+ }, "handleSubmit");
122
+ const saveButtonProps = {
123
+ disabled: formLoading,
124
+ onClick: (e) => {
125
+ handleSubmit(
126
+ (v) => onFinish(v).catch(() => {
127
+ }),
128
+ () => false
129
+ )(e);
130
+ }
131
+ };
132
+ return {
133
+ ...useHookFormResult,
134
+ handleSubmit,
135
+ refineCore: useFormCoreResult,
136
+ saveButtonProps
137
+ };
138
+ }, "useForm");
139
+
140
+ // src/useStepsForm/index.ts
141
+ import { useEffect as useEffect2, useState } from "react";
142
+ import get2 from "lodash-es/get.js";
143
+ var useStepsForm = /* @__PURE__ */ __name(({
144
+ stepsProps,
145
+ ...rest
146
+ } = {}) => {
147
+ const { defaultStep = 0, isBackValidate = false } = stepsProps ?? {};
148
+ const [current, setCurrent] = useState(defaultStep);
149
+ const useHookFormResult = useForm({
150
+ ...rest
151
+ });
152
+ const {
153
+ trigger,
154
+ getValues,
155
+ setValue,
156
+ formState: { dirtyFields },
157
+ refineCore: { query }
158
+ } = useHookFormResult;
159
+ useEffect2(() => {
160
+ var _a;
161
+ const data = (_a = query == null ? void 0 : query.data) == null ? void 0 : _a.data;
162
+ if (!data)
163
+ return;
164
+ const registeredFields = Object.keys(getValues());
165
+ Object.entries(data).forEach(([key, value]) => {
166
+ const name = key;
167
+ if (registeredFields.includes(name)) {
168
+ if (!get2(dirtyFields, name)) {
169
+ setValue(name, value);
170
+ }
171
+ }
172
+ });
173
+ }, [query == null ? void 0 : query.data, current, setValue, getValues]);
174
+ const go = /* @__PURE__ */ __name((step) => {
175
+ let targetStep = step;
176
+ if (step < 0) {
177
+ targetStep = 0;
178
+ }
179
+ setCurrent(targetStep);
180
+ }, "go");
181
+ const gotoStep = /* @__PURE__ */ __name(async (step) => {
182
+ if (step === current) {
183
+ return;
184
+ }
185
+ if (step < current && !isBackValidate) {
186
+ go(step);
187
+ return;
188
+ }
189
+ const isValid = await trigger();
190
+ if (isValid) {
191
+ go(step);
192
+ }
193
+ }, "gotoStep");
194
+ return {
195
+ ...useHookFormResult,
196
+ steps: {
197
+ currentStep: current,
198
+ gotoStep
199
+ }
200
+ };
201
+ }, "useStepsForm");
202
+
203
+ // src/useModalForm/index.ts
204
+ import { useCallback } from "react";
205
+ import {
206
+ useGo,
207
+ useModal,
208
+ useParsed,
209
+ useUserFriendlyName,
210
+ useTranslate as useTranslate2,
211
+ useWarnAboutChange as useWarnAboutChange2,
212
+ useInvalidate,
213
+ useResourceParams
214
+ } from "@refinedev/core";
215
+ import React2 from "react";
216
+ var useModalForm = /* @__PURE__ */ __name(({
217
+ modalProps,
218
+ refineCoreProps,
219
+ syncWithLocation,
220
+ ...rest
221
+ } = {}) => {
222
+ var _a, _b;
223
+ const invalidate = useInvalidate();
224
+ const [initiallySynced, setInitiallySynced] = React2.useState(false);
225
+ const translate = useTranslate2();
226
+ const { resource: resourceProp, action: actionProp } = refineCoreProps ?? {};
227
+ const { resource, identifier } = useResourceParams({
228
+ resource: resourceProp
229
+ });
230
+ const { action: actionFromParams } = useResourceParams({
231
+ resource: resourceProp,
232
+ action: actionProp
233
+ });
234
+ const parsed = useParsed();
235
+ const go = useGo();
236
+ const getUserFriendlyName = useUserFriendlyName();
237
+ const action = actionProp ?? actionFromParams ?? "";
238
+ const syncingId = !(typeof syncWithLocation === "object" && (syncWithLocation == null ? void 0 : syncWithLocation.syncId) === false);
239
+ const syncWithLocationKey = typeof syncWithLocation === "object" && "key" in syncWithLocation ? syncWithLocation.key : resource && action && syncWithLocation ? `modal-${identifier}-${action}` : void 0;
240
+ const {
241
+ defaultVisible = false,
242
+ autoSubmitClose = true,
243
+ autoResetForm = true,
244
+ autoResetFormWhenClose = true
245
+ } = modalProps ?? {};
246
+ const useHookFormResult = useForm({
247
+ refineCoreProps: {
248
+ ...refineCoreProps,
249
+ meta: {
250
+ ...syncWithLocationKey ? { [syncWithLocationKey]: void 0 } : {},
251
+ ...refineCoreProps == null ? void 0 : refineCoreProps.meta
252
+ }
253
+ },
254
+ ...rest
255
+ });
256
+ const {
257
+ reset,
258
+ refineCore: { onFinish, id, setId, autoSaveProps, query },
259
+ saveButtonProps,
260
+ handleSubmit
261
+ } = useHookFormResult;
262
+ const { visible, show, close } = useModal({
263
+ defaultVisible
264
+ });
265
+ React2.useEffect(() => {
266
+ var _a2;
267
+ if (!visible || !((_a2 = query == null ? void 0 : query.data) == null ? void 0 : _a2.data))
268
+ return;
269
+ const formData = query.data.data;
270
+ if (!formData)
271
+ return;
272
+ reset(formData, {
273
+ ...!autoResetFormWhenClose && {
274
+ keepDirtyValues: true
275
+ }
276
+ });
277
+ }, [visible, (_a = query == null ? void 0 : query.data) == null ? void 0 : _a.data, autoResetFormWhenClose]);
278
+ React2.useEffect(() => {
279
+ var _a2, _b2, _c, _d;
280
+ if (initiallySynced === false && syncWithLocationKey) {
281
+ const openStatus = (_b2 = (_a2 = parsed == null ? void 0 : parsed.params) == null ? void 0 : _a2[syncWithLocationKey]) == null ? void 0 : _b2.open;
282
+ if (typeof openStatus === "boolean") {
283
+ if (openStatus) {
284
+ show();
285
+ }
286
+ } else if (typeof openStatus === "string") {
287
+ if (openStatus === "true") {
288
+ show();
289
+ }
290
+ }
291
+ if (syncingId) {
292
+ const idFromParams = (_d = (_c = parsed == null ? void 0 : parsed.params) == null ? void 0 : _c[syncWithLocationKey]) == null ? void 0 : _d.id;
293
+ if (idFromParams) {
294
+ setId == null ? void 0 : setId(idFromParams);
295
+ }
296
+ }
297
+ setInitiallySynced(true);
298
+ }
299
+ }, [syncWithLocationKey, parsed, syncingId, setId]);
300
+ React2.useEffect(() => {
301
+ var _a2;
302
+ if (initiallySynced === true) {
303
+ if (visible && syncWithLocationKey) {
304
+ go({
305
+ query: {
306
+ [syncWithLocationKey]: {
307
+ ...(_a2 = parsed == null ? void 0 : parsed.params) == null ? void 0 : _a2[syncWithLocationKey],
308
+ open: true,
309
+ ...syncingId && id && { id }
310
+ }
311
+ },
312
+ options: { keepQuery: true },
313
+ type: "replace"
314
+ });
315
+ } else if (syncWithLocationKey && !visible) {
316
+ go({
317
+ query: {
318
+ [syncWithLocationKey]: void 0
319
+ },
320
+ options: { keepQuery: true },
321
+ type: "replace"
322
+ });
323
+ }
324
+ }
325
+ }, [id, visible, show, syncWithLocationKey, syncingId]);
326
+ const submit = /* @__PURE__ */ __name(async (values) => {
327
+ await onFinish(values);
328
+ if (autoSubmitClose) {
329
+ close();
330
+ }
331
+ if (autoResetForm) {
332
+ reset();
333
+ }
334
+ }, "submit");
335
+ const { warnWhen, setWarnWhen } = useWarnAboutChange2();
336
+ const handleClose = useCallback(() => {
337
+ var _a2;
338
+ if (autoSaveProps.status === "success" && ((_a2 = refineCoreProps == null ? void 0 : refineCoreProps.autoSave) == null ? void 0 : _a2.invalidateOnClose)) {
339
+ invalidate({
340
+ id,
341
+ invalidates: refineCoreProps.invalidates || ["list", "many", "detail"],
342
+ dataProviderName: refineCoreProps.dataProviderName,
343
+ resource: identifier
344
+ });
345
+ }
346
+ if (warnWhen) {
347
+ const warnWhenConfirm = window.confirm(
348
+ translate(
349
+ "warnWhenUnsavedChanges",
350
+ "Are you sure you want to leave? You have unsaved changes."
351
+ )
352
+ );
353
+ if (warnWhenConfirm) {
354
+ setWarnWhen(false);
355
+ } else {
356
+ return;
357
+ }
358
+ }
359
+ setId == null ? void 0 : setId(void 0);
360
+ close();
361
+ if (autoResetFormWhenClose) {
362
+ reset();
363
+ }
364
+ }, [warnWhen, autoSaveProps.status]);
365
+ const handleShow = useCallback(
366
+ (showId) => {
367
+ if (typeof showId !== "undefined") {
368
+ setId == null ? void 0 : setId(showId);
369
+ }
370
+ const needsIdToOpen = action === "edit" || action === "clone";
371
+ const hasId = typeof showId !== "undefined" || typeof id !== "undefined";
372
+ if (needsIdToOpen ? hasId : true) {
373
+ show();
374
+ }
375
+ },
376
+ [id, action, setId, show]
377
+ );
378
+ const title = translate(
379
+ `${identifier}.titles.${actionProp}`,
380
+ void 0,
381
+ `${getUserFriendlyName(
382
+ `${actionProp} ${((_b = resource == null ? void 0 : resource.meta) == null ? void 0 : _b.label) ?? identifier}`,
383
+ "singular"
384
+ )}`
385
+ );
386
+ return {
387
+ modal: {
388
+ submit,
389
+ close: handleClose,
390
+ show: handleShow,
391
+ visible,
392
+ title
393
+ },
394
+ ...useHookFormResult,
395
+ saveButtonProps: {
396
+ ...saveButtonProps,
397
+ onClick: (e) => handleSubmit(submit)(e)
398
+ }
399
+ };
400
+ }, "useModalForm");
401
+ export {
402
+ useForm,
403
+ useModalForm,
404
+ useStepsForm
405
+ };
3
406
  //# sourceMappingURL=index.mjs.map
@@ -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","has","useHookForm","useFormCore","useWarnAboutChange","useTranslate","useRefineContext","flattenObjectKeys","useForm","__name","refineCoreProps","warnWhenUnsavedChangesProp","disableServerSideValidationProp","rest","options","useRefineContext","disableServerSideValidation","translate","useTranslate","warnWhenUnsavedChangesRefine","setWarnWhen","useWarnAboutChange","warnWhenUnsavedChanges","useHookFormResult","useHookForm","watch","setValue","getValues","handleSubmitReactHookForm","setError","useFormCoreResult","useFormCore","error","_variables","_context","_a","_b","errors","key","flattenObjectKeys","fieldError","newError","query","onFinish","formLoading","onFinishAutoSave","useEffect","data","path","hasValue","has","dataValue","get","subscription","values","type","onValuesChange","changeValues","onFinishProps","handleSubmit","onValid","onInvalid","e","v","useEffect","useState","get","useStepsForm","__name","stepsProps","rest","defaultStep","isBackValidate","current","setCurrent","useState","useHookFormResult","useForm","trigger","getValues","setValue","dirtyFields","query","useEffect","_a","data","registeredFields","key","value","name","get","go","step","targetStep","useCallback","useGo","useModal","useParsed","useUserFriendlyName","useTranslate","useWarnAboutChange","useInvalidate","useResourceParams","React","useModalForm","__name","modalProps","refineCoreProps","syncWithLocation","rest","_a","_b","invalidate","useInvalidate","initiallySynced","setInitiallySynced","React","translate","useTranslate","resourceProp","actionProp","resource","identifier","useResourceParams","actionFromParams","parsed","useParsed","go","useGo","getUserFriendlyName","useUserFriendlyName","action","syncingId","syncWithLocationKey","defaultVisible","autoSubmitClose","autoResetForm","autoResetFormWhenClose","useHookFormResult","useForm","reset","onFinish","id","setId","autoSaveProps","query","saveButtonProps","handleSubmit","visible","show","close","useModal","formData","_c","_d","openStatus","idFromParams","submit","values","warnWhen","setWarnWhen","useWarnAboutChange","handleClose","useCallback","handleShow","showId","title","e"]}
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, 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@refinedev/react-hook-form",
3
- "version": "5.0.1",
3
+ "version": "5.0.3",
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.3",
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",
@@ -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
  });
@@ -309,7 +309,7 @@ export const useModalForm = <
309
309
  show();
310
310
  }
311
311
  },
312
- [id],
312
+ [id, action, setId, show],
313
313
  );
314
314
 
315
315
  const title = translate(