refactor: 租户套餐菜单替换为新版

This commit is contained in:
dap 2025-01-06 14:44:56 +08:00
parent e554106eb9
commit 2bf317c617

View File

@ -1,23 +1,24 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, ref } from 'vue'; import type { MenuOption } from '#/api/system/menu/model';
import { computed, nextTick, ref } from 'vue';
import { useVbenDrawer } from '@vben/common-ui'; import { useVbenDrawer } from '@vben/common-ui';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
import { cloneDeep, eachTree, listToTree } from '@vben/utils'; import { cloneDeep, eachTree } from '@vben/utils';
import { omit } from 'lodash-es'; import { omit } from 'lodash-es';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { menuList, tenantPackageMenuTreeSelect } from '#/api/system/menu'; import { menuTreeSelect, tenantPackageMenuTreeSelect } from '#/api/system/menu';
import { import {
packageAdd, packageAdd,
packageInfo, packageInfo,
packageUpdate, packageUpdate,
} from '#/api/system/tenant-package'; } from '#/api/system/tenant-package';
import { TreeSelectPanel } from '#/components/tree'; import { MenuSelectTable } from '#/components/tree';
import { drawerSchema } from './data'; import { drawerSchema } from './data';
import TreeItem from './tree-item';
const emit = defineEmits<{ reload: [] }>(); const emit = defineEmits<{ reload: [] }>();
@ -36,25 +37,34 @@ const [BasicForm, formApi] = useVbenForm({
wrapperClass: 'grid-cols-2', wrapperClass: 'grid-cols-2',
}); });
async function setupMenuTreeSelect(id?: number | string) { const menuTree = ref<MenuOption[]>([]);
async function setupMenuTree(id?: number | string) {
if (id) { if (id) {
const resp = await tenantPackageMenuTreeSelect(id); const resp = await tenantPackageMenuTreeSelect(id);
const menus = resp.menus;
// i18n
eachTree(menus, (node) => {
node.label = $t(node.label);
});
//
menuTree.value = resp.menus;
// keysmenu menu
await nextTick();
await formApi.setFieldValue('menuIds', resp.checkedKeys); await formApi.setFieldValue('menuIds', resp.checkedKeys);
} else {
const resp = await menuTreeSelect();
// i18n
eachTree(resp, (node) => {
node.label = $t(node.label);
});
//
menuTree.value = resp;
// keysmenu menu
await nextTick();
await formApi.setFieldValue('menuIds', []);
} }
} }
const menuTree = ref<any[]>([]);
async function setupMenuTree() {
const resp = await menuList();
const treeData = listToTree(resp, { id: 'menuId' });
// i18n
eachTree(treeData, (node) => {
node.menuName = $t(node.menuName);
});
//
menuTree.value = treeData;
}
const [BasicDrawer, drawerApi] = useVbenDrawer({ const [BasicDrawer, drawerApi] = useVbenDrawer({
onCancel: handleCancel, onCancel: handleCancel,
onConfirm: handleConfirm, onConfirm: handleConfirm,
@ -72,20 +82,14 @@ const [BasicDrawer, drawerApi] = useVbenDrawer({
// setupMenuTreeSelect // setupMenuTreeSelect
await formApi.setValues(omit(record, ['menuIds'])); await formApi.setValues(omit(record, ['menuIds']));
} }
/** // init record watchrecord
* 加载菜单树和已勾选菜单 await setupMenuTree(id);
*/
await Promise.all([setupMenuTree(), setupMenuTreeSelect(id)]);
drawerApi.drawerLoading(false); drawerApi.drawerLoading(false);
}, },
}); });
/** const menuSelectRef = ref<InstanceType<typeof MenuSelectTable>>();
* 这里拿到的是一个数组ref
*/
const menuSelectRef = ref();
async function handleConfirm() { async function handleConfirm() {
try { try {
drawerApi.drawerLoading(true); drawerApi.drawerLoading(true);
@ -94,7 +98,7 @@ async function handleConfirm() {
return; return;
} }
// //
const menuIds = menuSelectRef.value?.[0]?.getCheckedKeys() ?? []; const menuIds = menuSelectRef.value?.getCheckedKeys?.() ?? [];
// formApi.getValuesreadonlycloneDeep // formApi.getValuesreadonlycloneDeep
const data = cloneDeep(await formApi.getValues()); const data = cloneDeep(await formApi.getValues());
data.menuIds = menuIds; data.menuIds = menuIds;
@ -123,22 +127,19 @@ function handleMenuCheckStrictlyChange(value: boolean) {
</script> </script>
<template> <template>
<BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]"> <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[800px]">
<BasicForm> <BasicForm>
<template #menuIds="slotProps"> <template #menuIds="slotProps">
<TreeSelectPanel <div class="h-[600px] w-full">
ref="menuSelectRef" <!-- check-strictly为readonly 不能通过v-model绑定 -->
v-bind="slotProps" <MenuSelectTable
:check-strictly="formApi.form.values.menuCheckStrictly" ref="menuSelectRef"
:expand-all-on-init="false" :checked-keys="slotProps.value"
:field-names="{ title: 'menuName', key: 'menuId' }" :association="formApi.form.values.menuCheckStrictly"
:tree-data="menuTree" :menus="menuTree"
@check-strictly-change="handleMenuCheckStrictlyChange" @update:association="handleMenuCheckStrictlyChange"
> />
<template #title="data"> </div>
<TreeItem :data="data" />
</template>
</TreeSelectPanel>
</template> </template>
</BasicForm> </BasicForm>
</BasicDrawer> </BasicDrawer>