这是基于vue-vben-admin 模板适用于abp Vnext的前端管理项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

153 lines
4.2 KiB

<template>
<BasicModal
@register="registerModal"
@visible-change="handleVisibleChange"
:width="660"
:height="500"
:title="L('Menu:Manage')"
:show-ok-btn="menuTreeRef.length > 0"
@ok="handleSubmit"
>
<Card>
<Form :labelCol="{ span: 4 }" :wrapperCol="{ span: 18 }" layout="horizontal">
<FormItem :label="L('DisplayName:UIFramework')">
<Select v-model:value="frameworkRef" :options="optionsRef" @select="handleSelect" />
</FormItem>
<FormItem :label="L('Menu:SetStartup')">
<TreeSelect
:tree-data="menuTreeRef"
:field-names="{
label: 'displayName',
children: 'children',
value: 'id',
}"
:allow-clear="true"
v-model:value="startupMenuRef"
/>
</FormItem>
<FormItem :label="L('DisplayName:Menus')">
<BasicTree
:checkable="true"
:check-strictly="true"
:clickRowToExpand="true"
:tree-data="menuTreeRef"
:field-names="replaceFields"
:checked-keys="defaultCheckedRef"
@check="handleCheck"
/>
</FormItem>
</Form>
</Card>
</BasicModal>
</template>
<script lang="ts" setup>
import { ref, unref, watch } from 'vue';
import { Card, Form, Select, TreeSelect } from 'ant-design-vue';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { BasicTree } from '/@/components/Tree';
import { getByName } from '/@/api/platform/dataDic';
import { MenuListResult } from '/@/api/platform/model/menuModel';
import { getAll } from '/@/api/platform/menu';
import { listToTree } from '/@/utils/helper/treeHelper';
const FormItem = Form.Item;
const emits = defineEmits(['change', 'change:startup', 'register']);
const props = defineProps({
loading: {
type: Boolean,
default: false,
},
getMenuApi: {
type: Function as PropType<(...args) => Promise<MenuListResult>>,
required: true,
default: new Promise<MenuListResult>((resolve) => {
return resolve({
items: [],
});
}),
},
});
const { L } = useLocalization('AppPlatform');
const identityRef = ref('');
const frameworkRef = ref('');
const startupMenuRef = ref('');
const menuTreeRef = ref<any[]>([]);
const defaultCheckedRef = ref<any[]>([]);
const checkedRef = ref<string[]>([]);
const replaceFields = {
key: 'id',
title: 'displayName',
children: 'children',
value: 'id',
};
const optionsRef = ref<
{
key: string;
label: string;
value: string;
}[]
>([]);
const [registerModal, { changeOkLoading }] = useModalInner((record) => {
identityRef.value = record.identity;
optionsRef.value = [];
frameworkRef.value = '';
startupMenuRef.value = '';
checkedRef.value = [];
defaultCheckedRef.value = [];
menuTreeRef.value = [];
});
watch(
() => unref(props).loading,
(busy) => {
changeOkLoading(busy);
},
);
function handleSelect(value) {
getAll({
filter: '',
sorting: '',
framework: value,
}).then((res) => {
menuTreeRef.value = listToTree(res.items, { id: 'id', pid: 'parentId' });
});
props.getMenuApi(unref(identityRef), value).then((res) => {
checkedRef.value = res.items.map((item) => item.id);
defaultCheckedRef.value = checkedRef.value;
const startupMenu = res.items.find((item) => item.startup);
if (startupMenu) {
startupMenuRef.value = startupMenu.id;
}
});
}
function handleVisibleChange(visible) {
if (visible) {
getByName('UI Framework').then((res) => {
optionsRef.value = res.items.map((item) => {
return {
key: item.id,
label: item.displayName,
value: item.name,
};
});
});
}
}
function handleCheck(checkedKeys) {
checkedRef.value = checkedKeys.checked;
}
function handleSubmit() {
emits('change', unref(identityRef), unref(checkedRef));
if (unref(startupMenuRef)) {
emits('change:startup', unref(identityRef), unref(startupMenuRef));
}
}
</script>