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