From 35ceadea3b46fa9e12c22c51821721c602e30433 Mon Sep 17 00:00:00 2001 From: wulff007 Date: Sat, 13 Jul 2024 10:03:34 +0300 Subject: [PATCH] warn message leave with unsaved changes --- package.json | 2 +- src/components/UserRoleSelect.vue | 1 + src/locales/en.json | 3 +- src/locales/ru.json | 3 +- src/pages/Main.vue | 1 - src/pages/PageView.vue | 28 +++++++++++----- src/pages/UserSettings.vue | 6 +--- src/pages/configuration/DataSourceEdit.vue | 37 +++++++++++++++------- src/pages/configuration/FunctionEdit.vue | 16 +++++++++- src/pages/configuration/PageDesigner.vue | 19 +++++++++-- src/pages/configuration/ReportEdit.vue | 13 +++++++- 11 files changed, 96 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 7142538..805b56c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tabbled-web", "private": false, - "version": "0.5.19", + "version": "0.5.20", "license": "MIT", "scripts": { "dev": "vite", diff --git a/src/components/UserRoleSelect.vue b/src/components/UserRoleSelect.vue index d29a02a..d964c71 100644 --- a/src/components/UserRoleSelect.vue +++ b/src/components/UserRoleSelect.vue @@ -33,6 +33,7 @@ let roles = ref([]) const changed = (val) => { + console.log(val) value.value = val; emit('update:modelValue', value.value) } diff --git a/src/locales/en.json b/src/locales/en.json index 3388303..899fdfe 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -174,5 +174,6 @@ "newPasswordRepeat": "New password repeat", "currentPassword": "Current password", "newPasswordNotEqual": "New passwords is not equal", - "uploaded": "Uploaded" + "uploaded": "Uploaded", + "leaveWithoutSavingWarn": "Do you really want to leave? you have unsaved changes!" } \ No newline at end of file diff --git a/src/locales/ru.json b/src/locales/ru.json index 90fe2fa..9193092 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -173,5 +173,6 @@ "newPasswordRepeat": "Пароль (подтверждение)", "currentPassword": "Текущий пароль", "newPasswordNotEqual": "Пароли не совпадают", - "uploaded": "Загружен" + "uploaded": "Загружен", + "leaveWithoutSavingWarn": "Данные изменены, хотите выйти без сохранения?" } \ No newline at end of file diff --git a/src/pages/Main.vue b/src/pages/Main.vue index 920f0bc..1e3c6d5 100644 --- a/src/pages/Main.vue +++ b/src/pages/Main.vue @@ -209,7 +209,6 @@ const currentPageTitle: ComputedRef = computed((): string => { }) onMounted(() => { - console.log('Main mounted') favicon.value = window['env']['appFavicon'] ? window['env']['appFavicon'] : "/favicon.png" title.value = window['env']['appTitle'] ? window['env']['appTitle'] : "Tabbled" mainViewHeight.value = mainContainer.value.$el.clientHeight diff --git a/src/pages/PageView.vue b/src/pages/PageView.vue index ffb4f02..83e77f2 100644 --- a/src/pages/PageView.vue +++ b/src/pages/PageView.vue @@ -74,7 +74,7 @@ import _ from 'lodash' import {onMounted, watch, ref} from "vue"; import {ScreenSize, PageConfigInterface, PositionElementInterface, ElementInterface} from "../model/page"; -import {useRouter, useRoute} from 'vue-router'; +import {useRouter, useRoute, onBeforeRouteLeave} from 'vue-router'; import {usePageScriptHelper, usePageHeader} from "../services/page.service"; import {CompiledFunc, compileScript} from "../services/compiler"; import {ElMessage} from "element-plus"; @@ -117,6 +117,8 @@ let visibleElements = ref([]) for(let i = 0; i < 12; i++) visibleElements.value.push([]) let selected = ref([]) let canUpdate = ref(false) +let isChanged = ref(false) +let isLoading = ref(false) const props = defineProps<{ pageConfig: PageConfigInterface, @@ -179,13 +181,14 @@ async function save() { await editDataSource.updateById(editEntity.value.id, editEntity.value) } await updateRevision() - isSaving = false + isChanged.value = false await setViewed() ElMessage.success(t('saved')) }catch (e) { ElMessage.error(e.toString()) console.error(e) + } finally { isSaving = false } } @@ -239,12 +242,6 @@ function getValue(el: ElementInterface | any) { return undefined } -function getVisible(el) { - console.log('getVisible', el) - return true -} - - async function processVisibleAllElements() { for(let i in elements.value) { @@ -266,6 +263,7 @@ async function processVisible(element: ElementInterface | any) { async function setValue(el:ElementInterface | any, value: any) { //console.log(el, value) + if (isEditPage.value) { if (!editEntity.value) return false @@ -282,6 +280,7 @@ async function setValue(el:ElementInterface | any, value: any) { } async function setEntityValue(alias, value) { + isChanged.value = true editEntity.value[alias] = value let fSetValue = await editDataSource.getFieldByAlias(alias).setValueFunc() @@ -299,6 +298,7 @@ function getField(el:ElementInterface | any) { async function cancel() { + isChanged.value = false router.back(); } @@ -480,6 +480,9 @@ async function init() { } await processVisibleAllElements() + + isLoading.value = false + isChanged.value = false } function processElements(elements): ElementInterface[] { @@ -616,6 +619,15 @@ function getGridElementStyle(layout: {[key in ScreenSize]: PositionElementInterf return style; } +onBeforeRouteLeave(() => { + if (isChanged.value) { + const answer = window.confirm(t('leaveWithoutSavingWarn')) + if (!answer) return false + } + return true +}) + +