From 3611b26af1d1b5858094e7c82921ec5851abd830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C3=ADbal=20Svarcas?= Date: Tue, 7 Dec 2021 09:33:57 -0300 Subject: [PATCH 1/2] Warn about unsaved changes when modifying CheckGroupInput and ArrayInput --- packages/ra-core/src/form/useWarnWhenUnsavedChanges.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ra-core/src/form/useWarnWhenUnsavedChanges.tsx b/packages/ra-core/src/form/useWarnWhenUnsavedChanges.tsx index c6b9d8d638f..c1bcd336a05 100644 --- a/packages/ra-core/src/form/useWarnWhenUnsavedChanges.tsx +++ b/packages/ra-core/src/form/useWarnWhenUnsavedChanges.tsx @@ -28,7 +28,7 @@ const useWarnWhenUnsavedChanges = ( } const release = history.block(location => { - const isInsideForm = location.pathname.startsWith( + const isInsideForm = history.location.pathname.startsWith( initialLocation.current ); From 85f8b117256ac9aeed519c1db50c2b455d60b15a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C3=ADbal=20Svarcas?= Date: Tue, 7 Dec 2021 11:28:50 -0300 Subject: [PATCH 2/2] Subscribe to and evaluate submitting --- .../src/form/useWarnWhenUnsavedChanges.tsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/ra-core/src/form/useWarnWhenUnsavedChanges.tsx b/packages/ra-core/src/form/useWarnWhenUnsavedChanges.tsx index c1bcd336a05..22c7a32feb5 100644 --- a/packages/ra-core/src/form/useWarnWhenUnsavedChanges.tsx +++ b/packages/ra-core/src/form/useWarnWhenUnsavedChanges.tsx @@ -15,7 +15,7 @@ const useWarnWhenUnsavedChanges = ( ) => { const history = useHistory(); const translate = useTranslate(); - const { pristine, submitSucceeded } = useFormState( + const { pristine, submitSucceeded, submitting } = useFormState( UseFormStateSubscription ); const initialLocation = useRef( @@ -28,11 +28,11 @@ const useWarnWhenUnsavedChanges = ( } const release = history.block(location => { - const isInsideForm = history.location.pathname.startsWith( + const isInsideForm = location.pathname.startsWith( initialLocation.current ); - if (!pristine && !isInsideForm && !submitSucceeded) { + if (!pristine && !isInsideForm && !submitSucceeded && !submitting) { return translate('ra.message.unsaved_changes'); } @@ -44,13 +44,18 @@ const useWarnWhenUnsavedChanges = ( release(); } }; - }, [pristine, enable, history, translate, submitSucceeded]); + }, [pristine, enable, history, translate, submitSucceeded, submitting]); }; const UseFormStateSubscription: UseFormStateParams = { // For some reason, subscribing only to pristine does not rerender when a field become dirty // because it has a defaultValue (not initialValue as setting an initialValue does not make the field dirty) - subscription: { pristine: true, dirtyFields: true, submitSucceeded: true }, + subscription: { + pristine: true, + dirtyFields: true, + submitSucceeded: true, + submitting: true, + }, }; export default useWarnWhenUnsavedChanges;