From 07587c0faf7939dc659a04883a96f48fb3de87d2 Mon Sep 17 00:00:00 2001 From: dap <15891557205@163.com> Date: Mon, 7 Apr 2025 19:02:28 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=20=E8=A1=A8=E5=8D=95=E6=9B=B4=E6=96=B0(=E9=9D=9E=E6=9C=80?= =?UTF-8?q?=E7=BB=88=E6=96=B9=E6=A1=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/system/user/user-drawer.vue | 28 +++++++++++++------ .../ui-kit/popup-ui/src/drawer/drawer-api.ts | 4 +-- .../ui-kit/popup-ui/src/drawer/drawer.ts | 4 +-- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/apps/web-antd/src/views/system/user/user-drawer.vue b/apps/web-antd/src/views/system/user/user-drawer.vue index f3ae9e58..afd0fce2 100644 --- a/apps/web-antd/src/views/system/user/user-drawer.vue +++ b/apps/web-antd/src/views/system/user/user-drawer.vue @@ -18,6 +18,7 @@ import { userAdd, userUpdate, } from '#/api/system/user'; +import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup'; import { authScopeOptions } from '#/views/system/role/data'; import { drawerSchema } from './data'; @@ -134,8 +135,15 @@ async function loadDefaultPassword(update: boolean) { } } +const { onBeforeClose, updateInitialized, setSubmitted, resetInitialized } = + useBeforeCloseDiff({ + initializedGetter: defaultFormValueGetter(formApi), + currentGetter: defaultFormValueGetter(formApi), + }); + const [BasicDrawer, drawerApi] = useVbenDrawer({ - onCancel: handleCancel, + onBeforeClose, + onClosed: handleClosed, onConfirm: handleConfirm, async onOpenChange(isOpen) { if (!isOpen) { @@ -149,6 +157,7 @@ const [BasicDrawer, drawerApi] = useVbenDrawer({ return null; } drawerApi.drawerLoading(true); + const { id } = drawerApi.getData() as { id?: number | string }; isUpdate.value = !!id; /** update时 禁用用户名修改 不显示密码框 */ @@ -199,36 +208,39 @@ const [BasicDrawer, drawerApi] = useVbenDrawer({ setupPostOptions(user.deptId), ]); } + await updateInitialized(); + drawerApi.drawerLoading(false); }, }); async function handleConfirm() { try { - drawerApi.drawerLoading(true); + drawerApi.lock(true); const { valid } = await formApi.validate(); if (!valid) { return; } const data = cloneDeep(await formApi.getValues()); await (isUpdate.value ? userUpdate(data) : userAdd(data)); + setSubmitted(); emit('reload'); - await handleCancel(); + drawerApi.close(); } catch (error) { console.error(error); } finally { - drawerApi.drawerLoading(false); + drawerApi.lock(false); } } -async function handleCancel() { - drawerApi.close(); - await formApi.resetForm(); +async function handleClosed() { + formApi.resetForm(); + resetInitialized(); } diff --git a/packages/@core/ui-kit/popup-ui/src/drawer/drawer-api.ts b/packages/@core/ui-kit/popup-ui/src/drawer/drawer-api.ts index 525596e2..d2e7d690 100644 --- a/packages/@core/ui-kit/popup-ui/src/drawer/drawer-api.ts +++ b/packages/@core/ui-kit/popup-ui/src/drawer/drawer-api.ts @@ -88,10 +88,10 @@ export class DrawerApi { /** * 关闭弹窗 */ - close() { + async close() { // 通过 onBeforeClose 钩子函数来判断是否允许关闭弹窗 // 如果 onBeforeClose 返回 false,则不关闭弹窗 - const allowClose = this.api.onBeforeClose?.() ?? true; + const allowClose = (await this.api.onBeforeClose?.()) ?? true; if (allowClose) { this.store.setState((prev) => ({ ...prev, diff --git a/packages/@core/ui-kit/popup-ui/src/drawer/drawer.ts b/packages/@core/ui-kit/popup-ui/src/drawer/drawer.ts index b3ae0fb8..30009a64 100644 --- a/packages/@core/ui-kit/popup-ui/src/drawer/drawer.ts +++ b/packages/@core/ui-kit/popup-ui/src/drawer/drawer.ts @@ -1,6 +1,6 @@ import type { Component, Ref } from 'vue'; -import type { ClassType } from '@vben-core/typings'; +import type { ClassType, MaybePromise } from '@vben-core/typings'; import type { DrawerApi } from './drawer-api'; @@ -151,7 +151,7 @@ export interface DrawerApiOptions extends DrawerState { * 关闭前的回调,返回 false 可以阻止关闭 * @returns */ - onBeforeClose?: () => void; + onBeforeClose?: () => MaybePromise; /** * 点击取消按钮的回调 */