feat(项目管理): 菜单管理页面重构

This commit is contained in:
RubyLiu 2023-10-13 18:36:55 +08:00 committed by 刘瑞斌
parent baee47946f
commit 9a00d86d56
8 changed files with 323 additions and 108 deletions

View File

@ -5,4 +5,4 @@
**/*.svg
**/*.sh
src/auto-imports.js
src/auto-import.d.ts

View File

@ -4,6 +4,7 @@ import type {
MenuTableListItem,
MenuTableListParams,
MenuTableConfigItem,
PoolOption,
} from '@/models/projectManagement/menuManagement';
import { MenuEnum } from '@/enums/commonEnum';
@ -20,6 +21,30 @@ export async function postTabletList(params: TableQueryParams): Promise<CommonLi
return Promise.resolve(result);
}
// 获取资源池
export async function getPoolOptions(projectId: string, type: MenuEnum) {
let suffix = '';
if (type === MenuEnum.apiTest) {
suffix = 'api';
}
if (type === MenuEnum.uiTest) {
suffix = 'ui';
}
return MSR.get<PoolOption[]>({ url: `/project/application/${suffix}/resource/pool/${projectId}` });
}
// 获取审核人
export async function getAuditorOptions(projectId: string, type: MenuEnum) {
let suffix = '';
if (type === MenuEnum.loadTest) {
suffix = 'performance-test';
}
if (type === MenuEnum.apiTest) {
suffix = 'api';
}
return MSR.get<PoolOption[]>({ url: `/project/application/${suffix}/user/${projectId}` });
}
export function postUpdateMenu(data: MenuTableListParams) {
let suffix = '';
switch (data.type) {
@ -73,5 +98,5 @@ export function getConfigByMenuItem(data: MenuTableListParams) {
suffix = 'performance-test';
break;
}
return MSR.post<MenuTableConfigItem[]>({ url: `${Url.getConfigByMenuTypeUrl}${suffix}`, data });
return MSR.post<MenuTableConfigItem>({ url: `${Url.getConfigByMenuTypeUrl}${suffix}`, data });
}

View File

@ -5,73 +5,61 @@
// Generated by unplugin-auto-import
export {}
declare global {
const EffectScope: typeof import('vue')['EffectScope'];
const computed: typeof import('vue')['computed'];
const createApp: typeof import('vue')['createApp'];
const customRef: typeof import('vue')['customRef'];
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'];
const defineComponent: typeof import('vue')['defineComponent'];
const effectScope: typeof import('vue')['effectScope'];
const getCurrentInstance: typeof import('vue')['getCurrentInstance'];
const getCurrentScope: typeof import('vue')['getCurrentScope'];
const h: typeof import('vue')['h'];
const inject: typeof import('vue')['inject'];
const isProxy: typeof import('vue')['isProxy'];
const isReactive: typeof import('vue')['isReactive'];
const isReadonly: typeof import('vue')['isReadonly'];
const isRef: typeof import('vue')['isRef'];
const markRaw: typeof import('vue')['markRaw'];
const nextTick: typeof import('vue')['nextTick'];
const onActivated: typeof import('vue')['onActivated'];
const onBeforeMount: typeof import('vue')['onBeforeMount'];
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'];
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'];
const onDeactivated: typeof import('vue')['onDeactivated'];
const onErrorCaptured: typeof import('vue')['onErrorCaptured'];
const onMounted: typeof import('vue')['onMounted'];
const onRenderTracked: typeof import('vue')['onRenderTracked'];
const onRenderTriggered: typeof import('vue')['onRenderTriggered'];
const onScopeDispose: typeof import('vue')['onScopeDispose'];
const onServerPrefetch: typeof import('vue')['onServerPrefetch'];
const onUnmounted: typeof import('vue')['onUnmounted'];
const onUpdated: typeof import('vue')['onUpdated'];
const provide: typeof import('vue')['provide'];
const reactive: typeof import('vue')['reactive'];
const readonly: typeof import('vue')['readonly'];
const ref: typeof import('vue')['ref'];
const resolveComponent: typeof import('vue')['resolveComponent'];
const shallowReactive: typeof import('vue')['shallowReactive'];
const shallowReadonly: typeof import('vue')['shallowReadonly'];
const shallowRef: typeof import('vue')['shallowRef'];
const toRaw: typeof import('vue')['toRaw'];
const toRef: typeof import('vue')['toRef'];
const toRefs: typeof import('vue')['toRefs'];
const toValue: typeof import('vue')['toValue'];
const triggerRef: typeof import('vue')['triggerRef'];
const unref: typeof import('vue')['unref'];
const useAttrs: typeof import('vue')['useAttrs'];
const useCssModule: typeof import('vue')['useCssModule'];
const useCssVars: typeof import('vue')['useCssVars'];
const useSlots: typeof import('vue')['useSlots'];
const watch: typeof import('vue')['watch'];
const watchEffect: typeof import('vue')['watchEffect'];
const watchPostEffect: typeof import('vue')['watchPostEffect'];
const watchSyncEffect: typeof import('vue')['watchSyncEffect'];
const EffectScope: typeof import('vue')['EffectScope']
const computed: typeof import('vue')['computed']
const createApp: typeof import('vue')['createApp']
const customRef: typeof import('vue')['customRef']
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
const defineComponent: typeof import('vue')['defineComponent']
const effectScope: typeof import('vue')['effectScope']
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
const getCurrentScope: typeof import('vue')['getCurrentScope']
const h: typeof import('vue')['h']
const inject: typeof import('vue')['inject']
const isProxy: typeof import('vue')['isProxy']
const isReactive: typeof import('vue')['isReactive']
const isReadonly: typeof import('vue')['isReadonly']
const isRef: typeof import('vue')['isRef']
const markRaw: typeof import('vue')['markRaw']
const nextTick: typeof import('vue')['nextTick']
const onActivated: typeof import('vue')['onActivated']
const onBeforeMount: typeof import('vue')['onBeforeMount']
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
const onDeactivated: typeof import('vue')['onDeactivated']
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
const onMounted: typeof import('vue')['onMounted']
const onRenderTracked: typeof import('vue')['onRenderTracked']
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
const onScopeDispose: typeof import('vue')['onScopeDispose']
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
const onUnmounted: typeof import('vue')['onUnmounted']
const onUpdated: typeof import('vue')['onUpdated']
const provide: typeof import('vue')['provide']
const reactive: typeof import('vue')['reactive']
const readonly: typeof import('vue')['readonly']
const ref: typeof import('vue')['ref']
const resolveComponent: typeof import('vue')['resolveComponent']
const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly']
const shallowRef: typeof import('vue')['shallowRef']
const toRaw: typeof import('vue')['toRaw']
const toRef: typeof import('vue')['toRef']
const toRefs: typeof import('vue')['toRefs']
const toValue: typeof import('vue')['toValue']
const triggerRef: typeof import('vue')['triggerRef']
const unref: typeof import('vue')['unref']
const useAttrs: typeof import('vue')['useAttrs']
const useCssModule: typeof import('vue')['useCssModule']
const useCssVars: typeof import('vue')['useCssVars']
const useSlots: typeof import('vue')['useSlots']
const watch: typeof import('vue')['watch']
const watchEffect: typeof import('vue')['watchEffect']
const watchPostEffect: typeof import('vue')['watchPostEffect']
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
}
// for type re-export
declare global {
// @ts-ignore
export type {
Component,
ComponentPublicInstance,
ComputedRef,
ExtractDefaultPropTypes,
ExtractPropTypes,
ExtractPublicPropTypes,
InjectionKey,
PropType,
Ref,
VNode,
WritableComputedRef,
} from 'vue';
export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
}

View File

@ -210,7 +210,6 @@
noDisable?: boolean;
showSetting?: boolean;
columns: MsTableColumn;
expandedKeys?: string[];
spanMethod?: (params: { record: TableData; rowIndex: number; columnIndex: number }) => void;
}>();
const emit = defineEmits<{
@ -221,7 +220,7 @@
(e: 'rowSelectChange', key: string): void;
(e: 'selectAllChange', value: SelectAllEnum): void;
(e: 'sorterChange', value: { [key: string]: string }): void;
(e: 'expand', record: TableData): void;
(e: 'expand', record: TableData): void | Promise<any>;
(e: 'clearSelector'): void;
}>();
const attrs = useAttrs();

View File

@ -21,14 +21,17 @@
const { t } = useI18n();
const props = defineProps<{ modelValue: string }>();
const props = defineProps<{ modelValue?: string; defaultValue?: string }>();
const emit = defineEmits<{
(e: 'update:modelValue', value: string): void;
(e: 'change', value: string): void;
}>();
function parseValue(v: string) {
function parseValue(v?: string) {
// 使
if (!v) {
return { type: 'H', value: undefined, max: Number.MAX_VALUE };
}
const match = v.match(/^(\d+)([MYHD])$/);
if (match) {
const value = parseInt(match[1], 10); //
@ -51,7 +54,7 @@
//
return { type: 'H', value: undefined, max: Number.MAX_VALUE };
}
const current = reactive(parseValue(props.modelValue));
const current = reactive(parseValue(props.modelValue || props.defaultValue));
const handleBlur = () => {
const result = current.value ? `${current.value}${current.type}` : '';

View File

@ -1,9 +1,7 @@
import { MenuEnum } from '@/enums/commonEnum';
export interface MenuTableConfigItem {
projectId: string;
type: string;
typeValue: string;
[key: string]: any;
}
export interface MenuTableListItem {
module: string;
@ -17,3 +15,7 @@ export interface MenuTableListParams {
type?: MenuEnum;
typeValue?: boolean;
}
export interface PoolOption {
id: string;
name: string;
}

View File

@ -4,6 +4,8 @@ export default {
'可根据使用场景配置各功能开关关闭后,将隐藏功能入口,成员无法访问该功能和数据;已产生的数据不够此规则影响;再次开启时,即恢复至关闭前状态',
'project.menu.name': '菜单名称',
'project.menu.description': '描述',
'project.menu.pleaseConfig': '请配置',
'project.menu.count': '条',
'project.menu.WORKSTATION_SYNC_RULE': '接口测试待更新同步规则',
'project.menu.TEST_PLAN_CLEAN_REPORT': '报告保留时间范围',
@ -24,8 +26,8 @@ export default {
'project.menu.CASE_PUBLIC': '公共用例库',
'project.menu.CASE_RE_REVIEW': '重新提审',
'project.menu.CASE_ENABLE': '关联需求',
'project.menu.ISSUE_SYNC': '同步缺陷',
'project.menu.CASE_RELATED': '关联需求',
'project.menu.BUG_SYNC': '同步缺陷',
'project.menu.CRON_EXPRESSION': '同步频率',
'project.menu.SYNC_ENABLE': '状态',
'project.menu.MECHANISM': '接口测试待更新同步规则',

View File

@ -7,7 +7,7 @@
</div>
</a-tooltip>
</div>
<MsBaseTable class="mt-[16px]" v-bind="propsRes" v-on="propsEvent" @expand="expandChange">
<MsBaseTable class="mt-[16px]" v-bind="propsRes" @expand="expandChange" v-on="propsEvent">
<template #module="{ record }">
<div v-if="record.children">
<MsIcon class="text-[var(--color-text-4)]" :type="getMenuIcon(record.module)" />
@ -22,6 +22,7 @@
<a-switch
v-else-if="showEnableConfigList.includes(record.type)"
v-model="record.moduleEnable"
:default-checked="defaultChecked.includes(record.type)"
@change="handleMenuStatusChange(record)"
/>
</template>
@ -32,13 +33,13 @@
</div>
<div v-if="record.type === 'TEST_PLAN_CLEAN_REPORT'">
<!-- 测试计划 报告保留时间范围 -->
<MsTimeSelectorVue v-model="record.typeValue" />
<MsTimeSelectorVue v-model="allValueMap['TEST_PLAN_CLEAN_REPORT']" />
</div>
<div v-if="record.type === 'TEST_PLAN_SHARE_REPORT'">
<!-- 测试计划 报告链接有效期 -->
<MsTimeSelectorVue v-model="record.typeValue" />
<MsTimeSelectorVue v-model="allValueMap['TEST_PLAN_SHARE_REPORT']" />
</div>
<div v-if="record.type === 'ISSUE_SYNC'">
<div v-if="record.type === 'BUG_SYNC'">
<!-- 缺陷同步 -->
<span>{{ t('project.menu.row2') }}</span>
<div class="ml-[8px] text-[rgb(var(--primary-7))]" @click="showDefectDrawer">{{ t('project.menu.sd') }}</div>
@ -47,7 +48,7 @@
<!-- 用例 公共用例库 -->
{{ t('project.menu.row3') }}
</div>
<div v-if="record.type === 'CASE_ENABLE'" class="flex flex-row">
<div v-if="record.type === 'CASE_RELATED'" class="flex flex-row">
<!-- 用例 关联需求 -->
<div>{{ t('project.menu.row4') }}</div>
<div class="ml-[8px] text-[rgb(var(--primary-7))]" @click="showDefectDrawer">{{ t('project.menu.rr') }}</div>
@ -61,15 +62,20 @@
{{ t('project.menu.row6') }}
</div>
<div v-if="record.type === 'API_CLEAN_REPORT'">
<MsTimeSelectorVue v-model="record.typeValue" />
<MsTimeSelectorVue v-model="allValueMap['API_CLEAN_REPORT']" />
</div>
<div v-if="record.type === 'API_SHARE_REPORT'">
<!--接口测试 报告链接有效期 -->
<MsTimeSelectorVue v-model="record.typeValue" />
<MsTimeSelectorVue v-model="allValueMap['API_SHARE_REPORT']" />
</div>
<div v-if="record.type === 'API_RESOURCE_POOL'" class="flex flex-row items-center">
<!--接口测试 执行资源池 -->
<a-select v-model="record.typeValue" />
<a-select
v-model="allValueMap['API_RESOURCE_POOL']"
:field-names="{ label: 'name', value: 'id' }"
:options="apiPoolOption"
class="w-[120px]"
/>
<a-tooltip :content="t('project.menu.manageTip')" position="bl">
<div>
<MsIcon class="ml-[4px] text-[var(--color-text-4)]" type="icon-icon-maybe_outlined" />
@ -78,7 +84,12 @@
</div>
<div v-if="record.type === 'API_SCRIPT_REVIEWER'" class="flex flex-row items-center">
<!--接口测试 脚本审核 -->
<a-select v-model="record.typeValue" />
<a-select
v-model="allValueMap['API_SCRIPT_REVIEWER']"
:field-names="{ label: 'name', value: 'id' }"
:options="apiAuditorOption"
class="w-[120px]"
/>
<a-tooltip :content="t('project.menu.manageTip')" position="bl">
<div>
<MsIcon class="ml-[4px] text-[var(--color-text-4)]" type="icon-icon-maybe_outlined" />
@ -87,7 +98,18 @@
</div>
<div v-if="record.type === 'API_ERROR_REPORT_RULE'" class="flex w-[100%] flex-row items-center">
<!--接口测试 误报规则 -->
<a-select v-model="record.typeValue" class="w-[120px]" />
<div class="error-report">
<a-input
v-model="allValueMap['API_ERROR_REPORT_RULE']"
class="w-[120px]"
disabled
:placeholder="t('project.menu.pleaseConfig')"
>
<template #append>
<div>{{ t('project.menu.count') }}</div>
</template>
</a-input>
</div>
<div class="ml-[8px] text-[rgb(var(--primary-7))]" @click="showDefectDrawer">{{ t('project.menu.far') }}</div>
<a-tooltip :content="t('project.menu.manageTip')" position="bl">
<div>
@ -106,7 +128,12 @@
</div>
<div v-if="record.type === 'UI_RESOURCE_POOL'" class="flex flex-row items-center">
<!--UI 执行资源池 -->
<a-select v-model="record.typeValue" class="w-[120px]" />
<a-select
v-model="record.typeValue"
:field-names="{ label: 'name', value: 'id' }"
:options="uiPoolOption"
class="w-[120px]"
/>
<a-tooltip :content="t('project.menu.manageTip')" position="bl">
<div>
<MsIcon class="ml-[4px] text-[var(--color-text-4)]" type="icon-icon-maybe_outlined" />
@ -115,15 +142,27 @@
</div>
<div v-if="record.type === 'PERFORMANCE_TEST_CLEAN_REPORT'">
<!--性能测试 报告保留时间范围 -->
<MsTimeSelectorVue v-model="record.typeValue" />
<MsTimeSelectorVue
v-model="allValueMap['PERFORMANCE_TEST_CLEAN_REPORT']"
:field-names="{ label: 'name', value: 'id' }"
:default-value="defaultValueMap['PERFORMANCE_TEST_CLEAN_REPORT']"
/>
</div>
<div v-if="record.type === 'PERFORMANCE_TEST_SHARE_REPORT'">
<!--UI 报告链接有效期 -->
<MsTimeSelectorVue v-model="record.typeValue" />
<MsTimeSelectorVue
v-model="allValueMap['PERFORMANCE_TEST_SHARE_REPORT']"
:default-value="defaultValueMap['PERFORMANCE_TEST_SHARE_REPORT']"
/>
</div>
<div v-if="record.type === 'PERFORMANCE_TEST_SCRIPT_REVIEWER'" class="flex flex-row items-center">
<!--UI 脚本审核 -->
<a-select v-model="record.typeValue" class="w-[120px]" />
<a-select
v-model="allValueMap['PERFORMANCE_TEST_SCRIPT_REVIEWER']"
:field-names="{ label: 'name', value: 'id' }"
:options="performanceAuditorOption"
class="w-[120px]"
/>
<a-tooltip :content="t('project.menu.manageTip')" position="bl">
<div>
<MsIcon class="ml-[4px] text-[var(--color-text-4)]" type="icon-icon-maybe_outlined" />
@ -134,7 +173,7 @@
</MsBaseTable>
<MsDrawer
v-model:visible="defectDrawerVisible"
:title="t('project.menu.ISSUE_SYNC')"
:title="t('project.menu.BUG_SYNC')"
:destroy-on-close="true"
:closable="true"
:mask-closable="false"
@ -155,9 +194,15 @@
import useTable from '@/components/pure/ms-table/useTable';
import MsIcon from '@/components/pure/ms-icon-font/index.vue';
import { MsTableColumn } from '@/components/pure/ms-table/type';
import { postTabletList, postUpdateMenu, getConfigByMenuItem } from '@/api/modules/project-management/menuManagement';
import {
postTabletList,
postUpdateMenu,
getConfigByMenuItem,
getPoolOptions,
getAuditorOptions,
} from '@/api/modules/project-management/menuManagement';
import { useAppStore } from '@/store';
import { MenuTableListItem } from '@/models/projectManagement/menuManagement';
import { MenuTableConfigItem, MenuTableListItem, PoolOption } from '@/models/projectManagement/menuManagement';
import { MenuEnum } from '@/enums/commonEnum';
import { Message, TableData } from '@arco-design/web-vue';
import MsTimeSelectorVue from '@/components/pure/ms-time-selector/MsTimeSelector.vue';
@ -168,10 +213,17 @@
const currentProjectId = computed(() => appStore.currentProjectId);
const { t } = useI18n();
const defectDrawerVisible = ref(false);
const apiPoolOption = ref<PoolOption[]>([]);
const uiPoolOption = ref<PoolOption[]>([]);
const apiAuditorOption = ref<PoolOption[]>([]);
const performanceAuditorOption = ref<PoolOption[]>([]);
const expandedKeys = ref<string[]>([]);
//
const showEnableConfigList = [
'WORKSTATION_SYNC_RULE',
'ISSUE_SYNC',
'BUG_SYNC',
'CASE_PUBLIC',
'CASE_RE_REVIEW',
'CASE_RELATED',
@ -179,6 +231,26 @@
'API_SYNC_CASE',
'PERFORMANCE_TEST_SCRIPT_REVIEWER',
];
//
const defaultChecked = [
'WORKSTATION_SYNC_RULE',
'CASE_RELATED',
'CASE_RE_REVIEW',
'PERFORMANCE_TEST_SCRIPT_REVIEWER',
];
//
const defaultValueMap = {
TEST_PLAN_CLEAN_REPORT: '30D',
TEST_PLAN_SHARE_REPORT: '30D',
API_CLEAN_REPORT: '30D',
API_SHARE_REPORT: '30D',
UI_CLEAN_REPORT: '30D',
UI_SHARE_REPORT: '30D',
PERFORMANCE_TEST_CLEAN_REPORT: '30D',
PERFORMANCE_TEST_SHARE_REPORT: '30D',
};
const allValueMap = ref<MenuTableConfigItem>(defaultValueMap);
const columns: MsTableColumn = [
{
@ -202,6 +274,109 @@
},
];
const getChildren = (record: MenuTableListItem) => {
let children: MenuTableConfigItem[] = [];
switch (record.module) {
case MenuEnum.workstation: {
children = [
{
type: 'WORKSTATION_SYNC_RULE', //
},
];
break;
}
case MenuEnum.testPlan: {
children = [
{
type: 'TEST_PLAN_CLEAN_REPORT', //
},
{
type: 'TEST_PLAN_SHARE_REPORT', //
},
];
break;
}
case MenuEnum.bugManagement: {
children = [
{
type: 'BUG_SYNC', //
typeEnable: 'BUG_SYNC_SYNC_ENABLE', //
},
];
break;
}
case MenuEnum.caseManagement: {
children = [
{
type: 'CASE_PUBLIC', //
},
{
type: 'CASE_RE_REVIEW', //
},
{
type: 'CASE_RELATED',
typeEnable: 'CASE_RELATED_CASE_ENABLE', //
},
];
break;
}
case MenuEnum.apiTest: {
children = [
{
type: 'API_URL_REPEATABLE', // URL
},
{
type: 'API_CLEAN_REPORT', //
},
{
type: 'API_SHARE_REPORT', //
},
{
type: 'API_RESOURCE_POOL', //
},
{
type: 'API_SCRIPT_REVIEWER', //
},
{
type: 'API_ERROR_REPORT_RULE', //
},
{
type: 'API_SYNC_CASE', //
},
];
break;
}
case MenuEnum.uiTest: {
children = [
{
type: 'UI_CLEAN_REPORT', //
},
{
type: 'UI_SHARE_REPORT', //
},
{
type: 'UI_RESOURCE_POOL', //
},
];
break;
}
default: {
children = [
{
type: 'PERFORMANCE_TEST_CLEAN_REPORT', //
},
{
type: 'PERFORMANCE_TEST_SHARE_REPORT', //
},
{
type: 'PERFORMANCE_TEST_SCRIPT_REVIEWER', //
},
];
}
}
return children;
};
const { propsRes, propsEvent, loadList, setLoadListParams } = useTable(
postTabletList,
{
@ -214,12 +389,42 @@
showExpand: true,
emptyDataShowLine: false,
},
(item) => ({
...item,
children: [],
})
(item) => {
const children = getChildren(item);
return { ...item, children };
}
);
const expandChange = async (record: TableData) => {
try {
if (expandedKeys.value.includes(record.module)) {
//
expandedKeys.value = expandedKeys.value.filter((item) => item !== record.module);
return;
}
expandedKeys.value = [...expandedKeys.value, record.module];
const resultObj = await getConfigByMenuItem({
projectId: currentProjectId.value,
type: record.module as MenuEnum,
});
allValueMap.value = { ...allValueMap.value, ...resultObj };
if (record.module === MenuEnum.apiTest && !apiPoolOption.value.length) {
apiPoolOption.value = await getPoolOptions(currentProjectId.value, record.module);
}
if (record.module === MenuEnum.uiTest && !uiPoolOption.value.length) {
uiPoolOption.value = await getPoolOptions(currentProjectId.value, record.module);
}
if (record.module === MenuEnum.apiTest && !apiAuditorOption.value.length) {
apiAuditorOption.value = await getAuditorOptions(currentProjectId.value, record.module);
}
if (record.module === MenuEnum.loadTest && !performanceAuditorOption.value.length) {
performanceAuditorOption.value = await getAuditorOptions(currentProjectId.value, record.module);
}
} catch (e) {
// eslint-disable-next-line no-console
console.log(e);
}
};
const getMenuIcon = (type: MenuEnum) => {
switch (type) {
case MenuEnum.workstation:
@ -256,15 +461,6 @@
await loadList();
};
const expandChange = async (record: TableData) => {
if (record.children && record.children.length > 0) {
//
return false;
}
record.children =
(await getConfigByMenuItem({ projectId: currentProjectId.value, type: record.module as MenuEnum })) || [];
};
const showDefectDrawer = () => {
defectDrawerVisible.value = true;
};