From a8a3facec8c27e2d4a3ddaae2ac345f5dfe6ceb7 Mon Sep 17 00:00:00 2001 From: r-dev Date: Sat, 4 Apr 2026 16:58:35 +0200 Subject: [PATCH] feat(ui) : create useUnsavedGuard composable for edit page navigation protection --- frontend/app/composables/useUnsavedGuard.ts | 32 +++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 frontend/app/composables/useUnsavedGuard.ts diff --git a/frontend/app/composables/useUnsavedGuard.ts b/frontend/app/composables/useUnsavedGuard.ts new file mode 100644 index 0000000..c3e3195 --- /dev/null +++ b/frontend/app/composables/useUnsavedGuard.ts @@ -0,0 +1,32 @@ +import type { Ref } from 'vue' + +export function useUnsavedGuard(isDirty: Ref) { + const { confirm } = useConfirm() + + function handleBeforeUnload(e: BeforeUnloadEvent) { + if (isDirty.value) { + e.preventDefault() + e.returnValue = '' + } + } + + onMounted(() => { + window.addEventListener('beforeunload', handleBeforeUnload) + }) + + onUnmounted(() => { + window.removeEventListener('beforeunload', handleBeforeUnload) + }) + + onBeforeRouteLeave(async () => { + if (!isDirty.value) return true + const ok = await confirm({ + title: 'Modifications non sauvegardées', + message: 'Vous avez des modifications en cours. Voulez-vous quitter sans sauvegarder ?', + confirmText: 'Quitter sans sauver', + cancelText: 'Rester', + dangerous: true, + }) + return ok + }) +}