Skip to content

Commit 93c2e98

Browse files
committed
feat: add unsaved changes warning on page leave
1 parent 6f3c9fd commit 93c2e98

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

adminforth/spa/src/views/CreateView.vue

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<BreadcrumbsWithButtons>
1414
<!-- save and cancle -->
15-
<button @click="$router.back()"
15+
<button @click="() => {cancelButtonClicked = true; $router.back()}"
1616
class="af-cancel-button flex items-center py-1 px-3 me-2 text-sm font-medium rounded-default text-lightCreateViewButtonText focus:outline-none bg-lightCreateViewButtonBackground rounded border border-lightCreateViewButtonBorder hover:bg-lightCreateViewButtonBackgroundHover hover:text-lightCreateViewButtonTextHover focus:z-10 focus:ring-4 focus:ring-lightCreateViewButtonFocusRing dark:focus:ring-darkCreateViewButtonFocusRing dark:bg-darkCreateViewButtonBackground dark:text-darkCreateViewButtonText dark:border-darkCreateViewButtonBorder dark:hover:text-darkCreateViewButtonTextHover dark:hover:bg-darkCreateViewButtonBackgroundHover"
1717
>
1818
{{ $t('Cancel') }}
@@ -81,8 +81,8 @@ import SingleSkeletLoader from '@/components/SingleSkeletLoader.vue';
8181
import { useCoreStore } from '@/stores/core';
8282
import { callAdminForthApi, getCustomComponent,checkAcessByAllowedActions, initThreeDotsDropdown, checkShowIf } from '@/utils';
8383
import { IconFloppyDiskSolid } from '@iconify-prerendered/vue-flowbite';
84-
import { onMounted, onBeforeMount, ref, watch, nextTick } from 'vue';
85-
import { useRoute, useRouter } from 'vue-router';
84+
import { onMounted, onBeforeMount, onBeforeUnmount, ref, watch, nextTick } from 'vue';
85+
import { useRoute, useRouter, onBeforeRouteLeave } from 'vue-router';
8686
import { computed } from 'vue';
8787
import { showErrorTost } from '@/composables/useFrontendApi';
8888
import ThreeDotsMenu from '@/components/ThreeDotsMenu.vue';
@@ -113,11 +113,36 @@ const initialValues = ref({});
113113
114114
const readonlyColumns = ref([]);
115115
116+
const cancelButtonClicked = ref(false);
117+
const wasSaveSuccessful = ref(false);
116118
117119
async function onUpdateRecord(newRecord: any) {
118120
record.value = newRecord;
119121
}
120122
123+
function checkIfWeCanLeavePage() {
124+
return cancelButtonClicked.value || JSON.stringify(record.value) === JSON.stringify(initialValues.value);
125+
}
126+
127+
window.addEventListener('beforeunload', (event) => {
128+
if (!checkIfWeCanLeavePage()) {
129+
event.preventDefault();
130+
event.returnValue = '';
131+
}
132+
});
133+
134+
onBeforeUnmount(() => {
135+
window.removeEventListener('beforeunload', () => {});
136+
});
137+
138+
onBeforeRouteLeave((to, from, next) => {
139+
if (!checkIfWeCanLeavePage()) {
140+
const answer = confirm('There are unsaved changes. Are you sure you want to leave this page?');
141+
if (!answer) return next(false);
142+
}
143+
next();
144+
});
145+
121146
onBeforeMount(() => {
122147
clearSaveInterceptors(route.params.resourceId as string);
123148
});

0 commit comments

Comments
 (0)