|
1 | 1 | <script lang="ts"> |
2 | | - import { resolve } from '$app/paths'; |
3 | | - import { goto, beforeNavigate } from '$app/navigation'; |
4 | 2 | import { onMount, onDestroy } from 'svelte'; |
5 | 3 | import { config } from '$lib/configuration.svelte'; |
6 | 4 | import Content from '$lib/components/Content.svelte'; |
7 | 5 | import Modal from '$lib/components/Modal.svelte'; |
8 | 6 | import AdvancedFiltering from '$lib/components/explorer/advanced/AdvancedFiltering.svelte'; |
9 | 7 | import { panelOpen } from '$lib/stores/SidePanel'; |
| 8 | + import { createUnsavedGuard } from '$lib/utilities/UnsavedGuard.svelte'; |
10 | 9 |
|
11 | 10 | interface Props { |
12 | 11 | backUrl: string; |
|
16 | 15 | const { backUrl, backTitle }: Props = $props(); |
17 | 16 |
|
18 | 17 | let advancedFilteringRef: ReturnType<typeof AdvancedFiltering>; |
19 | | - let showUnsavedModal = $state(false); |
20 | | - let bypassGuard = false; |
| 18 | + const guard = createUnsavedGuard(() => advancedFilteringRef?.hasUnsavedChanges() ?? false); |
21 | 19 |
|
22 | 20 | onMount(() => { |
23 | 21 | $panelOpen = false; |
|
27 | 25 | $panelOpen = true; |
28 | 26 | }); |
29 | 27 |
|
30 | | - beforeNavigate(({ cancel }) => { |
31 | | - if (!bypassGuard && advancedFilteringRef?.hasUnsavedChanges()) { |
32 | | - cancel(); |
33 | | - showUnsavedModal = true; |
34 | | - } |
35 | | - }); |
36 | | -
|
37 | 28 | function applyChanges() { |
38 | 29 | advancedFilteringRef?.applyChanges(); |
39 | 30 | } |
40 | 31 |
|
41 | 32 | function handleCancel() { |
42 | | - showUnsavedModal = false; |
| 33 | + guard.take(); |
43 | 34 | } |
44 | 35 |
|
45 | 36 | function handleDiscard() { |
46 | | - showUnsavedModal = false; |
47 | | - bypassGuard = true; |
48 | | - goto(resolve(backUrl as '/')); |
| 37 | + guard.take(); |
| 38 | + guard.navigate(backUrl); |
49 | 39 | } |
50 | 40 |
|
51 | 41 | function handleModalApply() { |
52 | | - showUnsavedModal = false; |
| 42 | + guard.take(); |
53 | 43 | advancedFilteringRef?.applyChanges(); |
54 | 44 | } |
55 | | -
|
56 | | - function handleBeforeUnload(event: BeforeUnloadEvent) { |
57 | | - if (advancedFilteringRef?.hasUnsavedChanges()) { |
58 | | - event.preventDefault(); |
59 | | - } |
60 | | - } |
61 | 45 | </script> |
62 | 46 |
|
63 | | -<svelte:window onbeforeunload={handleBeforeUnload} /> |
64 | | - |
65 | 47 | <svelte:head> |
66 | 48 | <title>{config.branding.applicationName} | Advanced Query Builder</title> |
67 | 49 | </svelte:head> |
68 | 50 |
|
69 | | -<Modal bind:open={showUnsavedModal} title="Unsaved Changes" closeable={true} onclose={handleCancel}> |
| 51 | +<Modal bind:open={guard.open} title="Unsaved Changes" closeable={true} onclose={handleCancel}> |
70 | 52 | <p class="mb-6">You have unsaved changes to your filters. What would you like to do?</p> |
71 | 53 | <footer class="flex justify-end gap-2"> |
72 | 54 | <button class="btn border preset-tonal-error" onclick={handleDiscard}>Discard Changes</button> |
|
0 commit comments