refactor(@vben/playground): type popup data consumers

This commit is contained in:
Dream
2026-08-05 09:48:27 +08:00
parent 21d9132703
commit 3cbb1e8411
11 changed files with 78 additions and 29 deletions

View File

@@ -7,6 +7,10 @@ defineOptions({
name: 'FormDrawerDemo',
});
interface FormDrawerData {
values?: Record<string, unknown>;
}
const [Form, formApi] = useVbenForm({
schema: [
{
@@ -30,7 +34,7 @@ const [Form, formApi] = useVbenForm({
],
showDefaultActions: false,
});
const [Drawer, drawerApi] = useVbenDrawer({
const [Drawer, drawerApi] = useVbenDrawer<FormDrawerData>({
onCancel() {
drawerApi.close();
},
@@ -40,14 +44,16 @@ const [Drawer, drawerApi] = useVbenDrawer({
},
onOpenChange(isOpen: boolean) {
if (isOpen) {
const { values } = drawerApi.getData<Record<string, any>>();
if (values) {
formApi.setValues(values);
const data = drawerApi.getData();
if (data?.values) {
formApi.setValues(data.values);
}
}
},
title: '内嵌表单示例',
});
defineExpose({ drawerApi });
</script>
<template>
<Drawer>

View File

@@ -5,9 +5,14 @@ import { useVbenDrawer } from '@vben/common-ui';
import { message } from 'antdv-next';
const data = ref();
interface SharedData {
content: string;
payload: string;
}
const [Drawer, drawerApi] = useVbenDrawer({
const data = ref<SharedData>();
const [Drawer, drawerApi] = useVbenDrawer<SharedData>({
onCancel() {
drawerApi.close();
},
@@ -17,10 +22,12 @@ const [Drawer, drawerApi] = useVbenDrawer({
},
onOpenChange(isOpen: boolean) {
if (isOpen) {
data.value = drawerApi.getData<Record<string, any>>();
data.value = drawerApi.getData();
}
},
});
defineExpose({ drawerApi });
</script>
<template>
<Drawer title="数据共享示例">

View File

@@ -9,6 +9,10 @@ defineOptions({
name: 'FormModelDemo',
});
interface FormModalData {
values?: Record<string, unknown>;
}
const [Form, formApi] = useVbenForm({
handleSubmit: onSubmit,
schema: [
@@ -48,7 +52,7 @@ const [Form, formApi] = useVbenForm({
showDefaultActions: false,
});
const [Modal, modalApi] = useVbenModal({
const [Modal, modalApi] = useVbenModal<FormModalData>({
fullscreenButton: false,
onCancel() {
modalApi.close();
@@ -59,15 +63,17 @@ const [Modal, modalApi] = useVbenModal({
},
onOpenChange(isOpen: boolean) {
if (isOpen) {
const { values } = modalApi.getData<Record<string, any>>();
if (values) {
formApi.setValues(values);
const data = modalApi.getData();
if (data?.values) {
formApi.setValues(data.values);
}
}
},
title: '内嵌表单示例',
});
defineExpose({ modalApi });
function onSubmit(values: Record<string, any>) {
message.loading({
content: '正在提交中...',

View File

@@ -5,9 +5,14 @@ import { useVbenModal } from '@vben/common-ui';
import { message } from 'antdv-next';
const data = ref();
interface SharedData {
content: string;
payload: string;
}
const [Modal, modalApi] = useVbenModal({
const data = ref<SharedData>();
const [Modal, modalApi] = useVbenModal<SharedData>({
onCancel() {
modalApi.close();
},
@@ -17,10 +22,12 @@ const [Modal, modalApi] = useVbenModal({
},
onOpenChange(isOpen: boolean) {
if (isOpen) {
data.value = modalApi.getData<Record<string, any>>();
data.value = modalApi.getData();
}
},
});
defineExpose({ modalApi });
</script>
<template>
<Modal title="数据共享示例">

View File

@@ -15,6 +15,11 @@ import { useSchema } from '../data';
const emit = defineEmits(['success']);
const formData = ref<SystemDeptApi.SystemDept>();
type DeptModalData =
| null
| SystemDeptApi.SystemDept
| { pid: SystemDeptApi.SystemDept['pid'] };
const getTitle = computed(() => {
return formData.value?.id
? $t('ui.actionTitle.edit', [$t('system.dept.name')])
@@ -32,7 +37,7 @@ function resetForm() {
formApi.setValues(formData.value || {});
}
const [Modal, modalApi] = useVbenModal({
const [Modal, modalApi] = useVbenModal<DeptModalData>({
async onConfirm() {
const { valid } = await formApi.validate();
if (valid) {
@@ -51,17 +56,22 @@ const [Modal, modalApi] = useVbenModal({
},
onOpenChange(isOpen) {
if (isOpen) {
const data = modalApi.getData<SystemDeptApi.SystemDept>();
const data = modalApi.getData();
if (data) {
if (data.pid === 0) {
data.pid = undefined;
}
formData.value = data;
formApi.setValues(formData.value);
formData.value = 'id' in data ? data : undefined;
formApi.setValues(data);
} else {
formData.value = undefined;
formApi.reset();
}
}
},
});
defineExpose({ modalApi });
</script>
<template>

View File

@@ -32,6 +32,9 @@ const emit = defineEmits<{
const formData = ref<SystemMenuApi.SystemMenu>();
const titleSuffix = ref<string>();
type MenuDrawerData =
| SystemMenuApi.SystemMenu
| { pid?: SystemMenuApi.SystemMenu['pid'] };
type MenuSubmitValues = Omit<SystemMenuApi.SystemMenu, 'children' | 'id'>;
type MenuFormValues = MenuSubmitValues & { linkSrc?: string };
@@ -479,25 +482,29 @@ const [Form, formApi] = useVbenForm({
showDefaultActions: false,
wrapperClass: 'grid-cols-2 gap-x-4',
});
const [Drawer, drawerApi] = useVbenDrawer({
const [Drawer, drawerApi] = useVbenDrawer<MenuDrawerData>({
onConfirm: onSubmit,
async onOpenChange(isOpen) {
if (isOpen) {
const data = drawerApi.getData<SystemMenuApi.SystemMenu>();
if (data) {
const data = drawerApi.getData();
if (data && 'id' in data) {
formData.value = data;
await formApi.setSubmitValues(data);
titleSuffix.value = formData.value.meta?.title
? $t(formData.value.meta.title)
: '';
} else {
formData.value = undefined;
formApi.reset();
await formApi.setValues(data ?? {});
titleSuffix.value = '';
}
}
},
});
defineExpose({ drawerApi });
async function onSubmit() {
const { valid } = await formApi.validate();
if (valid) {

View File

@@ -161,7 +161,7 @@ function onRefresh() {
}
function onCreate() {
formDrawerApi.setData({}).open();
formDrawerApi.setData(null).open();
}
</script>
<template>

View File

@@ -32,7 +32,7 @@ const permissions = ref<DataNode[]>([]);
const loadingPermissions = ref(false);
const id = ref();
const [Drawer, drawerApi] = useVbenDrawer({
const [Drawer, drawerApi] = useVbenDrawer<null | SystemRoleApi.SystemRole>({
async onConfirm() {
const { valid } = await formApi.validate();
if (!valid) return;
@@ -50,7 +50,7 @@ const [Drawer, drawerApi] = useVbenDrawer({
async onOpenChange(isOpen) {
if (isOpen) {
const data = drawerApi.getData<SystemRoleApi.SystemRole>();
const data = drawerApi.getData();
formApi.reset();
if (data) {
@@ -72,6 +72,8 @@ const [Drawer, drawerApi] = useVbenDrawer({
},
});
defineExpose({ drawerApi });
async function loadPermissions() {
loadingPermissions.value = true;
try {

View File

@@ -162,7 +162,7 @@ function onRefresh() {
}
function onCreate() {
formDrawerApi.setData({}).open();
formDrawerApi.setData(null).open();
}
async function loadDeptList() {

View File

@@ -13,13 +13,15 @@ const detailData = ref<SystemUserApi.SystemUser>();
const items = computed(() => useDescriptionItems(detailData.value));
const [Drawer, drawerApi] = useVbenDrawer({
const [Drawer, drawerApi] = useVbenDrawer<SystemUserApi.SystemUser>({
onOpenChange(isOpen) {
if (isOpen) {
detailData.value = drawerApi.getData<SystemUserApi.SystemUser>();
detailData.value = drawerApi.getData();
}
},
});
defineExpose({ drawerApi });
</script>
<template>
<Drawer :footer="false" :title="$t('common.detail')">

View File

@@ -31,7 +31,7 @@ const permissions = ref<DataNode[]>([]);
const loadingPermissions = ref(false);
const id = ref();
const [Drawer, drawerApi] = useVbenDrawer({
const [Drawer, drawerApi] = useVbenDrawer<null | SystemUserApi.SystemUser>({
async onConfirm() {
const { valid } = await formApi.validate();
if (!valid) return;
@@ -49,7 +49,7 @@ const [Drawer, drawerApi] = useVbenDrawer({
async onOpenChange(isOpen) {
if (isOpen) {
const data = drawerApi.getData<SystemUserApi.SystemUser>();
const data = drawerApi.getData();
formApi.reset();
if (data) {
@@ -71,6 +71,8 @@ const [Drawer, drawerApi] = useVbenDrawer({
},
});
defineExpose({ drawerApi });
async function loadPermissions() {
loadingPermissions.value = true;
try {