Skip to content

Commit 17726f1

Browse files
committed
feat: add ability to disable "There are unsaved changes" popup for the resource
https://web.tracklify.com/project/2b7ZVgE5/AdminForth/1280/cFz46RGr/is-it-possible-to-remove-this-
1 parent 08f6407 commit 17726f1

File tree

5 files changed

+43
-5
lines changed

5 files changed

+43
-5
lines changed

adminforth/documentation/docs/tutorial/03-Customization/07-alert.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,21 @@ You can notify users of important information by displaying an announcement badg
169169
```
170170

171171
Here's what the announcement will look like:
172-
![alt text](image-11.png)
172+
![alt text](image-11.png)
173+
174+
## Disable "There are unsaved changed" popup for resource
175+
176+
By default, when you want to leave create/edit pages with usaved changes, there will be shown an confirmation popup. If you don't like this behaviour, you can disable it for resource:
177+
178+
```ts title='./resources/cusom_resource.ts'
179+
...
180+
181+
options: {
182+
listPageSize: 12,
183+
//diff-add
184+
dontShowWarningAboutUnsavedChanges: true,
185+
...
186+
}
187+
...
188+
189+
```

adminforth/spa/src/utils/utils.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,12 +630,16 @@ export class leaveGuardActiveClass {
630630
}
631631
}
632632

633-
export async function onBeforeRouteLeaveCreateEditViewGuard(initialValues: any, record: any, checkIfWeCanLeavePage: () => boolean, leaveGuardActive: leaveGuardActiveClass): Promise<boolean> {
633+
export async function onBeforeRouteLeaveCreateEditViewGuard(initialValues: any, record: any, checkIfWeCanLeavePage: () => boolean, leaveGuardActive: leaveGuardActiveClass, isActive: { value: boolean }): Promise<void> {
634634

635635
const { confirm } = useAdminforth();
636636
const { t } = useI18n();
637637

638638
onBeforeRouteLeave(async (to, from) => {
639+
if (!isActive.value) {
640+
return true;
641+
}
642+
639643

640644
if (leaveGuardActive.isActive()) {
641645
return false;

adminforth/spa/src/views/CreateView.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ const readonlyColumns = ref([]);
115115
116116
const cancelButtonClicked = ref(false);
117117
const wasSaveSuccessful = ref(false);
118+
const useLeaveGuard = ref( false );
118119
119120
async function onUpdateRecord(newRecord: any) {
120121
record.value = newRecord;
@@ -125,6 +126,9 @@ function checkIfWeCanLeavePage() {
125126
}
126127
127128
function onBeforeUnload(event: BeforeUnloadEvent) {
129+
if (!useLeaveGuard.value) {
130+
return;
131+
}
128132
if (!checkIfWeCanLeavePage()) {
129133
event.preventDefault();
130134
event.returnValue = '';
@@ -140,15 +144,17 @@ onBeforeUnmount(() => {
140144
141145
const leaveGuardActive = new leaveGuardActiveClass();
142146
147+
onBeforeRouteLeaveCreateEditViewGuard(initialValues, record, checkIfWeCanLeavePage, leaveGuardActive, useLeaveGuard);
143148
144-
onBeforeRouteLeaveCreateEditViewGuard(initialValues, record, checkIfWeCanLeavePage, leaveGuardActive);
145149
146150
147151
onBeforeMount(() => {
148152
clearSaveInterceptors(route.params.resourceId as string);
149153
});
150154
151155
onMounted(async () => {
156+
useLeaveGuard.value = coreStore.resource?.options?.dontShowWarningAboutUnsavedChanges !== true;
157+
152158
loading.value = true;
153159
await coreStore.fetchResourceFull({
154160
resourceId: route.params.resourceId as string,

adminforth/spa/src/views/EditView.vue

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,12 @@ const record: Ref<Record<string, any>> = ref({});
104104
const initialRecord = computed(() => coreStore.record);
105105
const wasSaveSuccessful = ref(false);
106106
const cancelButtonClicked = ref(false);
107-
107+
const useLeaveGuard = ref( false );
108+
108109
function onBeforeUnload(event: BeforeUnloadEvent) {
110+
if (!useLeaveGuard.value) {
111+
return;
112+
}
109113
if (!checkIfWeCanLeavePage()) {
110114
event.preventDefault();
111115
event.returnValue = '';
@@ -123,7 +127,7 @@ onBeforeUnmount(() => {
123127
});
124128
125129
const leaveGuardActive = new leaveGuardActiveClass();
126-
onBeforeRouteLeaveCreateEditViewGuard(initialRecord, record, checkIfWeCanLeavePage, leaveGuardActive);
130+
onBeforeRouteLeaveCreateEditViewGuard(initialRecord, record, checkIfWeCanLeavePage, leaveGuardActive, useLeaveGuard);
127131
128132
const resourceFormRef = ref<InstanceType<typeof ResourceForm> | null>(null);
129133
@@ -153,6 +157,7 @@ onBeforeMount(() => {
153157
});
154158
155159
onMounted(async () => {
160+
useLeaveGuard.value = coreStore.resource?.options?.dontShowWarningAboutUnsavedChanges !== true;
156161
loading.value = true;
157162
158163
await coreStore.fetchResourceFull({

adminforth/types/Common.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,12 @@ export interface AdminForthResourceInputCommon {
361361
recordLabel?: (item: any) => string,
362362

363363

364+
/**
365+
* If true, user will not see warning about unsaved changes when tries to leave edit or create page with unsaved changes.
366+
* default is false
367+
*/
368+
dontShowWarningAboutUnsavedChanges?: boolean,
369+
364370
/**
365371
* General options for resource.
366372
*/

0 commit comments

Comments
 (0)