feat: 批量编辑支持清空已有标签调整联调

This commit is contained in:
xinxin.wu 2024-10-08 14:32:47 +08:00 committed by Craftsman
parent b0e90384a0
commit ff94d2f49e
18 changed files with 180 additions and 171 deletions

View File

@ -34,3 +34,9 @@ export enum ShapeFlags {
COMPONENT_SHOULD_KEEP_ALIVE = 256, COMPONENT_SHOULD_KEEP_ALIVE = 256,
COMPONENT_KEPT_ALIVE = 512, COMPONENT_KEPT_ALIVE = 512,
} }
export enum TagUpdateTypeEnum {
UPDATE = 'UPDATE',
APPEND = 'APPEND',
CLEAR = 'CLEAR',
}

View File

@ -209,4 +209,6 @@ export default {
'common.copySuccessToClipboard': 'Copied to clipboard', 'common.copySuccessToClipboard': 'Copied to clipboard',
'common.casePriority': 'Case Priority', 'common.casePriority': 'Case Priority',
'common.currentUser': 'Current user', 'common.currentUser': 'Current user',
'common.type': 'Type',
'common.batchUpdate': 'Updated to',
}; };

View File

@ -209,4 +209,6 @@ export default {
'common.copySuccessToClipboard': '已复制到剪切板', 'common.copySuccessToClipboard': '已复制到剪切板',
'common.casePriority': '用例等级', 'common.casePriority': '用例等级',
'common.currentUser': '当前用户', 'common.currentUser': '当前用户',
'common.type': '类型',
'common.batchUpdate': '更新为',
}; };

View File

@ -199,6 +199,7 @@ export interface ApiDefinitionBatchUpdateParams extends ApiDefinitionBatchParams
versionId?: string; versionId?: string;
tags?: string[]; tags?: string[];
customField?: Record<string, any>; customField?: Record<string, any>;
clear?: boolean; // 是否清空标签
} }
// 批量移动定义参数 // 批量移动定义参数
export interface ApiDefinitionBatchMoveParams extends ApiDefinitionBatchParams { export interface ApiDefinitionBatchMoveParams extends ApiDefinitionBatchParams {
@ -355,6 +356,7 @@ export interface ApiCaseBatchEditParams extends ApiCaseBatchParams {
environmentId?: string; environmentId?: string;
type: string; type: string;
append?: boolean; append?: boolean;
clear?: boolean;
} }
// 添加用例参数 // 添加用例参数
export interface AddApiCaseParams extends ExecuteRequestParams { export interface AddApiCaseParams extends ExecuteRequestParams {

View File

@ -92,4 +92,5 @@ export interface BatchEditMockParams extends BatchApiParams {
append: boolean; // 是否追加 append: boolean; // 是否追加
enable: boolean; // 是否启用 enable: boolean; // 是否启用
protocols: string[]; // 协议集合 protocols: string[]; // 协议集合
clear?: boolean; // 是否清空标签
} }

View File

@ -136,8 +136,20 @@
</a-form-item> </a-form-item>
<a-form-item <a-form-item
v-if="batchForm.attr === 'tags'" v-if="batchForm.attr === 'tags'"
:class="`${selectedTagType === TagUpdateTypeEnum.CLEAR ? 'mb-0' : 'mb-[16px]'}`"
field="type"
:label="t('common.type')"
>
<a-radio-group v-model:model-value="selectedTagType" size="small">
<a-radio :value="TagUpdateTypeEnum.UPDATE"> {{ t('common.update') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.APPEND"> {{ t('caseManagement.featureCase.appendTag') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.CLEAR">{{ t('common.clear') }}</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item
v-if="batchForm.attr === 'tags' && selectedTagType !== TagUpdateTypeEnum.CLEAR"
field="values" field="values"
:label="t('apiTestManagement.batchUpdate')" :label="t('common.batchUpdate')"
:validate-trigger="['blur', 'input']" :validate-trigger="['blur', 'input']"
:rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]" :rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]"
asterisk-position="end" asterisk-position="end"
@ -155,9 +167,9 @@
<div class="text-[12px] leading-[20px] text-[var(--color-text-4)]">{{ t('ms.tagsInput.tagLimitTip') }}</div> <div class="text-[12px] leading-[20px] text-[var(--color-text-4)]">{{ t('ms.tagsInput.tagLimitTip') }}</div>
</a-form-item> </a-form-item>
<a-form-item <a-form-item
v-else v-if="batchForm.attr !== 'tags' && selectedTagType !== TagUpdateTypeEnum.CLEAR"
field="value" field="value"
:label="t('apiTestManagement.batchUpdate')" :label="t('common.batchUpdate')"
:rules="[{ required: true, message: t('apiTestManagement.valueRequired') }]" :rules="[{ required: true, message: t('apiTestManagement.valueRequired') }]"
asterisk-position="end" asterisk-position="end"
class="mb-0" class="mb-0"
@ -176,26 +188,7 @@
</a-form-item> </a-form-item>
</a-form> </a-form>
<template #footer> <template #footer>
<div class="flex" :class="[batchForm.attr === 'tags' ? 'justify-between' : 'justify-end']"> <div class="flex justify-end">
<div
v-if="batchForm.attr === 'tags'"
class="flex flex-row items-center justify-center"
style="padding-top: 10px"
>
<a-switch v-model="batchForm.append" class="mr-1" size="small" type="line" />
<span class="flex items-center">
<span class="mr-1">{{ t('caseManagement.featureCase.appendTag') }}</span>
<span class="mt-[2px]">
<a-tooltip>
<IconQuestionCircle class="h-[16px] w-[16px] text-[rgb(var(--primary-5))]" />
<template #content>
<div>{{ t('caseManagement.featureCase.enableTags') }}</div>
<div>{{ t('caseManagement.featureCase.closeTags') }}</div>
</template>
</a-tooltip>
</span>
</span>
</div>
<div class="flex justify-end"> <div class="flex justify-end">
<a-button type="secondary" :disabled="batchUpdateLoading" @click="cancelBatch"> <a-button type="secondary" :disabled="batchUpdateLoading" @click="cancelBatch">
{{ t('common.cancel') }} {{ t('common.cancel') }}
@ -335,6 +328,7 @@
import { FilterType, ViewTypeEnum } from '@/enums/advancedFilterEnum'; import { FilterType, ViewTypeEnum } from '@/enums/advancedFilterEnum';
import { RequestDefinitionStatus, RequestExportFormat, RequestMethods } from '@/enums/apiEnum'; import { RequestDefinitionStatus, RequestExportFormat, RequestMethods } from '@/enums/apiEnum';
import { CacheTabTypeEnum } from '@/enums/cacheTabEnum'; import { CacheTabTypeEnum } from '@/enums/cacheTabEnum';
import { TagUpdateTypeEnum } from '@/enums/commonEnum';
import { TableKeyEnum } from '@/enums/tableEnum'; import { TableKeyEnum } from '@/enums/tableEnum';
import { FilterRemoteMethodsEnum, FilterSlotNameEnum } from '@/enums/tableFilterEnum'; import { FilterRemoteMethodsEnum, FilterSlotNameEnum } from '@/enums/tableFilterEnum';
@ -558,6 +552,7 @@
width: operationWidth(215, hasOperationPermission.value ? 200 : 50), width: operationWidth(215, hasOperationPermission.value ? 200 : 50),
}, },
]; ];
const selectedTagType = ref<TagUpdateTypeEnum>(TagUpdateTypeEnum.UPDATE);
function initFilterColumn() { function initFilterColumn() {
columns = columns.map((item) => { columns = columns.map((item) => {
@ -998,7 +993,8 @@
excludeIds: batchParams.value?.excludeIds || [], excludeIds: batchParams.value?.excludeIds || [],
...batchConditionParams, ...batchConditionParams,
type: batchForm.value.attr, type: batchForm.value.attr,
append: batchForm.value.append, append: selectedTagType.value === TagUpdateTypeEnum.APPEND,
clear: selectedTagType.value === TagUpdateTypeEnum.CLEAR,
[batchForm.value.attr]: batchForm.value.attr === 'tags' ? batchForm.value.values : batchForm.value.value, [batchForm.value.attr]: batchForm.value.attr === 'tags' ? batchForm.value.values : batchForm.value.value,
}); });
Message.success(t('common.updateSuccess')); Message.success(t('common.updateSuccess'));

View File

@ -209,10 +209,22 @@
</a-form-item> </a-form-item>
<a-form-item <a-form-item
v-if="batchForm.attr === 'tags'" v-if="batchForm.attr === 'tags'"
:class="`${selectedTagType === TagUpdateTypeEnum.CLEAR ? 'mb-0' : 'mb-[16px]'}`"
field="type"
:label="t('common.type')"
>
<a-radio-group v-model:model-value="selectedTagType" size="small">
<a-radio :value="TagUpdateTypeEnum.UPDATE"> {{ t('common.update') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.APPEND"> {{ t('caseManagement.featureCase.appendTag') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.CLEAR">{{ t('common.clear') }}</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item
v-if="batchForm.attr === 'tags' && selectedTagType !== TagUpdateTypeEnum.CLEAR"
field="values" field="values"
:label="t('apiTestManagement.batchUpdate')" :label="t('common.batchUpdate')"
:validate-trigger="['blur', 'input']" :validate-trigger="['blur', 'input']"
:rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]" :rules="[{ required: false, message: t('common.inputPleaseEnterTags') }]"
asterisk-position="end" asterisk-position="end"
class="mb-0" class="mb-0"
required required
@ -228,9 +240,9 @@
<div class="text-[12px] leading-[20px] text-[var(--color-text-4)]">{{ t('ms.tagsInput.tagLimitTip') }}</div> <div class="text-[12px] leading-[20px] text-[var(--color-text-4)]">{{ t('ms.tagsInput.tagLimitTip') }}</div>
</a-form-item> </a-form-item>
<a-form-item <a-form-item
v-else v-if="batchForm.attr !== 'tags'"
field="value" field="value"
:label="t('apiTestManagement.batchUpdate')" :label="t('common.batchUpdate')"
:rules="[{ required: true, message: t('apiTestManagement.valueRequired') }]" :rules="[{ required: true, message: t('apiTestManagement.valueRequired') }]"
asterisk-position="end" asterisk-position="end"
class="mb-0" class="mb-0"
@ -243,26 +255,7 @@
</a-form-item> </a-form-item>
</a-form> </a-form>
<template #footer> <template #footer>
<div class="flex" :class="[batchForm.attr === 'tags' ? 'justify-between' : 'justify-end']"> <div class="flex justify-end">
<div
v-if="batchForm.attr === 'tags'"
class="flex flex-row items-center justify-center"
style="padding-top: 10px"
>
<a-switch v-model="batchForm.append" class="mr-1" size="small" type="line" />
<span class="flex items-center">
<span class="mr-1">{{ t('caseManagement.featureCase.appendTag') }}</span>
<span class="mt-[2px]">
<a-tooltip>
<IconQuestionCircle class="h-[16px] w-[16px] text-[rgb(var(--primary-5))]" />
<template #content>
<div>{{ t('caseManagement.featureCase.enableTags') }}</div>
<div>{{ t('caseManagement.featureCase.closeTags') }}</div>
</template>
</a-tooltip>
</span>
</span>
</div>
<div class="flex justify-end"> <div class="flex justify-end">
<a-button type="secondary" :disabled="batchEditLoading" @click="cancelBatchEdit"> <a-button type="secondary" :disabled="batchEditLoading" @click="cancelBatchEdit">
{{ t('common.cancel') }} {{ t('common.cancel') }}
@ -370,6 +363,7 @@
import { DragSortParams } from '@/models/common'; import { DragSortParams } from '@/models/common';
import { RequestCaseStatus } from '@/enums/apiEnum'; import { RequestCaseStatus } from '@/enums/apiEnum';
import { CacheTabTypeEnum } from '@/enums/cacheTabEnum'; import { CacheTabTypeEnum } from '@/enums/cacheTabEnum';
import { TagUpdateTypeEnum } from '@/enums/commonEnum';
import { ReportEnum, ReportStatus } from '@/enums/reportEnum'; import { ReportEnum, ReportStatus } from '@/enums/reportEnum';
import { TableKeyEnum } from '@/enums/tableEnum'; import { TableKeyEnum } from '@/enums/tableEnum';
import { FilterRemoteMethodsEnum, FilterSlotNameEnum } from '@/enums/tableFilterEnum'; import { FilterRemoteMethodsEnum, FilterSlotNameEnum } from '@/enums/tableFilterEnum';
@ -855,6 +849,8 @@
append: false, append: false,
}; };
} }
const selectedTagType = ref<TagUpdateTypeEnum>(TagUpdateTypeEnum.UPDATE);
function handleBatchEditCase() { function handleBatchEditCase() {
batchFormRef.value?.validate(async (errors) => { batchFormRef.value?.validate(async (errors) => {
if (!errors) { if (!errors) {
@ -867,7 +863,8 @@
excludeIds: batchParams.value?.excludeIds || [], excludeIds: batchParams.value?.excludeIds || [],
...batchConditionParams, ...batchConditionParams,
type: batchForm.value.attr.charAt(0).toUpperCase() + batchForm.value.attr.slice(1), // type: batchForm.value.attr.charAt(0).toUpperCase() + batchForm.value.attr.slice(1), //
append: batchForm.value.append, append: selectedTagType.value === TagUpdateTypeEnum.APPEND,
clear: selectedTagType.value === TagUpdateTypeEnum.CLEAR,
[batchForm.value.attr]: batchForm.value.attr === 'tags' ? batchForm.value.values : batchForm.value.value, [batchForm.value.attr]: batchForm.value.attr === 'tags' ? batchForm.value.values : batchForm.value.value,
}); });
Message.success(t('common.updateSuccess')); Message.success(t('common.updateSuccess'));

View File

@ -122,8 +122,20 @@
</a-form-item> </a-form-item>
<a-form-item <a-form-item
v-if="batchForm.attr === 'Tags'" v-if="batchForm.attr === 'Tags'"
:class="`${selectedTagType === TagUpdateTypeEnum.CLEAR ? 'mb-0' : 'mb-[16px]'}`"
field="type"
:label="t('common.type')"
>
<a-radio-group v-model:model-value="selectedTagType" size="small">
<a-radio :value="TagUpdateTypeEnum.UPDATE"> {{ t('common.update') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.APPEND"> {{ t('caseManagement.featureCase.appendTag') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.CLEAR">{{ t('common.clear') }}</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item
v-if="batchForm.attr === 'Tags' && selectedTagType !== TagUpdateTypeEnum.CLEAR"
field="values" field="values"
:label="t('apiTestManagement.batchUpdate')" :label="t('common.batchUpdate')"
:validate-trigger="['blur', 'input']" :validate-trigger="['blur', 'input']"
:rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]" :rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]"
asterisk-position="end" asterisk-position="end"
@ -141,9 +153,9 @@
<div class="text-[12px] leading-[20px] text-[var(--color-text-4)]">{{ t('ms.tagsInput.tagLimitTip') }}</div> <div class="text-[12px] leading-[20px] text-[var(--color-text-4)]">{{ t('ms.tagsInput.tagLimitTip') }}</div>
</a-form-item> </a-form-item>
<a-form-item <a-form-item
v-else v-if="batchForm.attr !== 'Tags'"
field="value" field="value"
:label="t('apiTestManagement.batchUpdate')" :label="t('common.batchUpdate')"
:rules="[{ required: true, message: t('apiTestManagement.valueRequired') }]" :rules="[{ required: true, message: t('apiTestManagement.valueRequired') }]"
asterisk-position="end" asterisk-position="end"
class="mb-0" class="mb-0"
@ -159,26 +171,7 @@
</a-form-item> </a-form-item>
</a-form> </a-form>
<template #footer> <template #footer>
<div class="flex" :class="[batchForm.attr === 'Tags' ? 'justify-between' : 'justify-end']"> <div class="flex justify-end">
<div
v-if="batchForm.attr === 'Tags'"
class="flex flex-row items-center justify-center"
style="padding-top: 10px"
>
<a-switch v-model="batchForm.append" class="mr-1" size="small" type="line" />
<span class="flex items-center">
<span class="mr-1">{{ t('caseManagement.featureCase.appendTag') }}</span>
<span class="mt-[2px]">
<a-tooltip>
<IconQuestionCircle class="h-[16px] w-[16px] text-[rgb(var(--primary-5))]" />
<template #content>
<div>{{ t('caseManagement.featureCase.enableTags') }}</div>
<div>{{ t('caseManagement.featureCase.closeTags') }}</div>
</template>
</a-tooltip>
</span>
</span>
</div>
<div class="flex justify-end"> <div class="flex justify-end">
<a-button type="secondary" :disabled="batchUpdateLoading" @click="cancelBatch"> <a-button type="secondary" :disabled="batchUpdateLoading" @click="cancelBatch">
{{ t('common.cancel') }} {{ t('common.cancel') }}
@ -238,6 +231,7 @@
import { MockDetail } from '@/models/apiTest/mock'; import { MockDetail } from '@/models/apiTest/mock';
import { RequestComposition } from '@/enums/apiEnum'; import { RequestComposition } from '@/enums/apiEnum';
import { CacheTabTypeEnum } from '@/enums/cacheTabEnum'; import { CacheTabTypeEnum } from '@/enums/cacheTabEnum';
import { TagUpdateTypeEnum } from '@/enums/commonEnum';
import { TableKeyEnum } from '@/enums/tableEnum'; import { TableKeyEnum } from '@/enums/tableEnum';
defineOptions({ defineOptions({
@ -568,6 +562,7 @@
const showBatchModal = ref(false); const showBatchModal = ref(false);
const batchUpdateLoading = ref(false); const batchUpdateLoading = ref(false);
const batchFormRef = ref<FormInstance>(); const batchFormRef = ref<FormInstance>();
const batchForm = ref({ const batchForm = ref({
attr: 'Status' as 'Status' | 'Tags', attr: 'Status' as 'Status' | 'Tags',
@ -596,6 +591,7 @@
append: false, append: false,
}; };
} }
const selectedTagType = ref<TagUpdateTypeEnum>(TagUpdateTypeEnum.UPDATE);
function batchUpdate() { function batchUpdate() {
batchFormRef.value?.validate(async (errors) => { batchFormRef.value?.validate(async (errors) => {
@ -612,10 +608,11 @@
projectId: appStore.currentProjectId, projectId: appStore.currentProjectId,
moduleIds: await getModuleIds(), moduleIds: await getModuleIds(),
type: batchForm.value.attr, type: batchForm.value.attr,
append: batchForm.value.append, append: selectedTagType.value === TagUpdateTypeEnum.APPEND,
tags: batchForm.value.attr === 'Tags' ? batchForm.value.values : [], tags: batchForm.value.attr === 'Tags' ? batchForm.value.values : [],
enable: batchForm.value.attr === 'Status' ? batchForm.value.value : false, enable: batchForm.value.attr === 'Status' ? batchForm.value.value : false,
protocols: props.selectedProtocols, protocols: props.selectedProtocols,
clear: selectedTagType.value === TagUpdateTypeEnum.CLEAR,
}); });
Message.success(t('common.updateSuccess')); Message.success(t('common.updateSuccess'));
cancelBatch(); cancelBatch();

View File

@ -57,7 +57,6 @@ export default {
'apiTestManagement.batchModalSubTitle': '(Selected {count} APIs)', 'apiTestManagement.batchModalSubTitle': '(Selected {count} APIs)',
'apiTestManagement.chooseAttr': 'Choose Attribute', 'apiTestManagement.chooseAttr': 'Choose Attribute',
'apiTestManagement.attrRequired': 'Attribute cannot be empty', 'apiTestManagement.attrRequired': 'Attribute cannot be empty',
'apiTestManagement.batchUpdate': 'Batch Update to',
'apiTestManagement.valueRequired': 'Value cannot be empty', 'apiTestManagement.valueRequired': 'Value cannot be empty',
'apiTestManagement.envRequired': 'Environment value cannot be empty', 'apiTestManagement.envRequired': 'Environment value cannot be empty',
'apiTestManagement.reportNameRequired': 'Report name cannot be empty', 'apiTestManagement.reportNameRequired': 'Report name cannot be empty',

View File

@ -56,7 +56,6 @@ export default {
'apiTestManagement.batchModalSubTitle': '(已选 {count} 个接口)', 'apiTestManagement.batchModalSubTitle': '(已选 {count} 个接口)',
'apiTestManagement.chooseAttr': '选择属性', 'apiTestManagement.chooseAttr': '选择属性',
'apiTestManagement.attrRequired': '属性不能为空', 'apiTestManagement.attrRequired': '属性不能为空',
'apiTestManagement.batchUpdate': '批量更新为',
'apiTestManagement.valueRequired': '属性值不能为空', 'apiTestManagement.valueRequired': '属性值不能为空',
'apiTestManagement.envRequired': '环境值不能为空', 'apiTestManagement.envRequired': '环境值不能为空',
'apiTestManagement.reportNameRequired': '报告名称不能为空', 'apiTestManagement.reportNameRequired': '报告名称不能为空',

View File

@ -336,8 +336,20 @@
</a-form-item> </a-form-item>
<a-form-item <a-form-item
v-if="batchForm.attr === 'Tags'" v-if="batchForm.attr === 'Tags'"
:class="`${selectedTagType === TagUpdateTypeEnum.CLEAR ? 'mb-0' : 'mb-[16px]'}`"
field="type"
:label="t('common.type')"
>
<a-radio-group v-model:model-value="selectedTagType" size="small">
<a-radio :value="TagUpdateTypeEnum.UPDATE"> {{ t('common.update') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.APPEND"> {{ t('caseManagement.featureCase.appendTag') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.CLEAR">{{ t('common.clear') }}</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item
v-if="batchForm.attr === 'Tags' && selectedTagType !== TagUpdateTypeEnum.CLEAR"
field="values" field="values"
:label="t('api_scenario.table.batchUpdate')" :label="t('common.batchUpdate')"
:validate-trigger="['blur', 'input']" :validate-trigger="['blur', 'input']"
:rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]" :rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]"
asterisk-position="end" asterisk-position="end"
@ -357,7 +369,7 @@
<a-form-item <a-form-item
v-else-if="batchForm.attr === 'Priority'" v-else-if="batchForm.attr === 'Priority'"
field="value" field="value"
:label="t('api_scenario.table.batchUpdate')" :label="t('common.batchUpdate')"
:rules="[{ required: true, message: t('api_scenario.table.valueRequired') }]" :rules="[{ required: true, message: t('api_scenario.table.valueRequired') }]"
asterisk-position="end" asterisk-position="end"
class="mb-0" class="mb-0"
@ -371,7 +383,7 @@
<a-form-item <a-form-item
v-else-if="batchForm.attr === 'Environment'" v-else-if="batchForm.attr === 'Environment'"
field="value" field="value"
:label="t('api_scenario.table.batchUpdate')" :label="t('common.batchUpdate')"
:rules="[{ required: true, message: t('api_scenario.table.valueRequired') }]" :rules="[{ required: true, message: t('api_scenario.table.valueRequired') }]"
asterisk-position="end" asterisk-position="end"
class="mb-0" class="mb-0"
@ -383,9 +395,9 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item <a-form-item
v-else v-else-if="batchForm.attr !== 'Tags'"
field="value" field="value"
:label="t('api_scenario.table.batchUpdate')" :label="t('common.batchUpdate')"
:rules="[{ required: true, message: t('api_scenario.table.valueRequired') }]" :rules="[{ required: true, message: t('api_scenario.table.valueRequired') }]"
asterisk-position="end" asterisk-position="end"
class="mb-0" class="mb-0"
@ -398,26 +410,7 @@
</a-form-item> </a-form-item>
</a-form> </a-form>
<template #footer> <template #footer>
<div class="flex" :class="[batchForm.attr === 'Tags' ? 'justify-between' : 'justify-end']"> <div class="flex justify-end">
<div
v-if="batchForm.attr === 'Tags'"
class="flex flex-row items-center justify-center"
style="padding-top: 10px"
>
<a-switch v-model="batchForm.append" class="mr-1" size="small" type="line" />
<span class="flex items-center">
<span class="mr-1">{{ t('caseManagement.featureCase.appendTag') }}</span>
<span class="mt-[2px]">
<a-tooltip>
<IconQuestionCircle class="h-[16px] w-[16px] text-[rgb(var(--primary-5))]" />
<template #content>
<div>{{ t('caseManagement.featureCase.enableTags') }}</div>
<div>{{ t('caseManagement.featureCase.closeTags') }}</div>
</template>
</a-tooltip>
</span>
</span>
</div>
<div class="flex justify-end"> <div class="flex justify-end">
<a-button type="secondary" :disabled="batchUpdateLoading" @click="cancelBatch"> <a-button type="secondary" :disabled="batchUpdateLoading" @click="cancelBatch">
{{ t('common.cancel') }} {{ t('common.cancel') }}
@ -429,7 +422,6 @@
</div> </div>
</template> </template>
</a-modal> </a-modal>
<!-- </MsDialog>-->
<a-modal <a-modal
v-model:visible="moveModalVisible" v-model:visible="moveModalVisible"
title-align="start" title-align="start"
@ -543,6 +535,7 @@
import { ResourcePoolItem } from '@/models/setting/resourcePool'; import { ResourcePoolItem } from '@/models/setting/resourcePool';
import { ApiScenarioStatus } from '@/enums/apiEnum'; import { ApiScenarioStatus } from '@/enums/apiEnum';
import { CacheTabTypeEnum } from '@/enums/cacheTabEnum'; import { CacheTabTypeEnum } from '@/enums/cacheTabEnum';
import { TagUpdateTypeEnum } from '@/enums/commonEnum';
import { ReportEnum, ReportStatus } from '@/enums/reportEnum'; import { ReportEnum, ReportStatus } from '@/enums/reportEnum';
import { TableKeyEnum } from '@/enums/tableEnum'; import { TableKeyEnum } from '@/enums/tableEnum';
import { FilterRemoteMethodsEnum, FilterSlotNameEnum } from '@/enums/tableFilterEnum'; import { FilterRemoteMethodsEnum, FilterSlotNameEnum } from '@/enums/tableFilterEnum';
@ -1146,6 +1139,7 @@
const showBatchModal = ref(false); const showBatchModal = ref(false);
const batchUpdateLoading = ref(false); const batchUpdateLoading = ref(false);
const selectedTagType = ref<TagUpdateTypeEnum>(TagUpdateTypeEnum.UPDATE);
const batchFormRef = ref<FormInstance>(); const batchFormRef = ref<FormInstance>();
@ -1227,9 +1221,10 @@
priority: '', priority: '',
status: '', status: '',
tags: [], tags: [],
append: batchForm.value.append, append: selectedTagType.value === TagUpdateTypeEnum.APPEND,
grouped: false, grouped: false,
envId: '', envId: '',
clear: selectedTagType.value === TagUpdateTypeEnum.CLEAR,
}; };
if (batchForm.value.attr === 'Priority') { if (batchForm.value.attr === 'Priority') {

View File

@ -60,7 +60,6 @@ export default {
'api_scenario.table.batchModalSubTitle': '(Selected {count} scenarios)', 'api_scenario.table.batchModalSubTitle': '(Selected {count} scenarios)',
'api_scenario.table.chooseAttr': 'Choose Attribute', 'api_scenario.table.chooseAttr': 'Choose Attribute',
'api_scenario.table.attrRequired': 'Attribute cannot be empty', 'api_scenario.table.attrRequired': 'Attribute cannot be empty',
'api_scenario.table.batchUpdate': 'Batch Update to',
'api_scenario.table.valueRequired': 'Attribute value cannot be empty', 'api_scenario.table.valueRequired': 'Attribute value cannot be empty',
'api_scenario.table.deleteScenarioTipTitle': 'Confirm Delete {name}?', 'api_scenario.table.deleteScenarioTipTitle': 'Confirm Delete {name}?',
'api_scenario.table.batchDeleteScenarioTip': 'Confirm delete {count} selected scenarios?', 'api_scenario.table.batchDeleteScenarioTip': 'Confirm delete {count} selected scenarios?',

View File

@ -70,7 +70,6 @@ export default {
'api_scenario.table.batchModalSubTitle': '(已选 {count} 条场景)', 'api_scenario.table.batchModalSubTitle': '(已选 {count} 条场景)',
'api_scenario.table.chooseAttr': '选择属性', 'api_scenario.table.chooseAttr': '选择属性',
'api_scenario.table.attrRequired': '属性不能为空', 'api_scenario.table.attrRequired': '属性不能为空',
'api_scenario.table.batchUpdate': '批量更新为',
'api_scenario.table.valueRequired': '属性值不能为空', 'api_scenario.table.valueRequired': '属性值不能为空',
'api_scenario.table.deleteScenarioTipTitle': '确认删除 {name} 吗?', 'api_scenario.table.deleteScenarioTipTitle': '确认删除 {name} 吗?',
'api_scenario.table.batchDeleteScenarioTip': '确认删除已选中的 {count} 条场景吗?', 'api_scenario.table.batchDeleteScenarioTip': '确认删除已选中的 {count} 条场景吗?',

View File

@ -24,7 +24,7 @@
> >
<a-select <a-select
v-model:model-value="form.attribute" v-model:model-value="form.attribute"
:place-holder="t('common.pleaseSelect')" :placeholder="t('common.pleaseSelect')"
@change="handleAttributeChange" @change="handleAttributeChange"
> >
<a-optgroup :label="t('bugManagement.batchUpdate.systemFiled')"> <a-optgroup :label="t('bugManagement.batchUpdate.systemFiled')">
@ -52,6 +52,7 @@
v-model:model-value="form.inputValue" v-model:model-value="form.inputValue"
:place-holder="t('common.pleaseSelect')" :place-holder="t('common.pleaseSelect')"
:disabled="!form.attribute" :disabled="!form.attribute"
:placeholder="t('common.pleaseSelect')"
> >
<a-option v-for="item in customFiledOption" :key="item.value" :value="item.value"> <a-option v-for="item in customFiledOption" :key="item.value" :value="item.value">
{{ item.text }} {{ item.text }}
@ -59,6 +60,31 @@
</a-select> </a-select>
</template> </template>
</a-form-item> </a-form-item>
<div v-else-if="valueMode === 'tags'">
<a-form-item class="mb-[16px]" field="type" :label="t('common.type')">
<a-radio-group v-model:model-value="selectedTagType" size="small">
<a-radio :value="TagUpdateTypeEnum.UPDATE"> {{ t('common.update') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.APPEND"> {{ t('caseManagement.featureCase.appendTag') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.CLEAR">{{ t('common.clear') }}</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item
v-if="valueMode === 'tags' && selectedTagType !== TagUpdateTypeEnum.CLEAR"
field="value"
:validate-trigger="['blur', 'input']"
:label="t('common.batchUpdate')"
asterisk-position="end"
:rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]"
>
<MsTagsInput
v-model:modelValue="form.value"
allow-clear
empty-priority-highest
:disabled="!form.attribute"
/>
<div class="text-[12px] leading-[20px] text-[var(--color-text-4)]">{{ t('ms.tagsInput.tagLimitTip') }}</div>
</a-form-item>
</div>
<a-form-item <a-form-item
v-else v-else
field="value" field="value"
@ -67,11 +93,7 @@
:validate-trigger="['blur', 'input']" :validate-trigger="['blur', 'input']"
:rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]" :rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]"
> >
<template v-if="valueMode === 'tags'"> <template v-if="valueMode === 'user_selector'">
<MsTagsInput v-model:modelValue="form.value" empty-priority-highest :disabled="!form.attribute" />
<div class="text-[12px] leading-[20px] text-[var(--color-text-4)]">{{ t('ms.tagsInput.tagLimitTip') }}</div>
</template>
<template v-else-if="valueMode === 'user_selector'">
<MsUserSelector <MsUserSelector
v-model:model-value="form.value" v-model:model-value="form.value"
:type="UserRequestTypeEnum.PROJECT_PERMISSION_MEMBER" :type="UserRequestTypeEnum.PROJECT_PERMISSION_MEMBER"
@ -90,31 +112,15 @@
</a-form> </a-form>
</div> </div>
<template #footer> <template #footer>
<div class="flex flex-row items-center justify-between"> <div class="flex flex-row items-center justify-end">
<div> <div class="flex flex-row gap-[8px]">
<div v-if="showAppend" class="flex flex-row items-center gap-[4px]"> <a-button type="secondary" :loading="loading" @click="handleCancel">
<a-switch v-model:model-value="form.append" size="small" type="line" />
<span class="text-[var(--color-text-1)]">{{ t('bugManagement.batchUpdate.appendLabel') }}</span>
<a-tooltip position="top">
<template #content>
<div>{{ t('bugManagement.batchUpdate.openAppend') }}</div>
<div>{{ t('bugManagement.batchUpdate.closeAppend') }}</div>
</template>
<MsIcon
type="icon-icon-maybe_outlined"
class="text-[var(--color-text-4)] hover:text-[rgb(var(--primary-5))]"
/>
</a-tooltip>
</div>
</div>
<div class="flex flex-row gap-[8px]"
><a-button type="secondary" :loading="loading" @click="handleCancel">
{{ t('common.cancel') }} {{ t('common.cancel') }}
</a-button> </a-button>
<a-button type="primary" :loading="loading" @click="handleConfirm"> <a-button type="primary" :loading="loading" @click="handleConfirm">
{{ t('common.update') }} {{ t('common.update') }}
</a-button></div </a-button>
> </div>
</div> </div>
</template> </template>
</a-modal> </a-modal>
@ -136,6 +142,7 @@
import type { BugBatchUpdateFiledType } from '@/models/bug-management'; import type { BugBatchUpdateFiledType } from '@/models/bug-management';
import { BugBatchUpdateFiledForm, BugEditCustomField } from '@/models/bug-management'; import { BugBatchUpdateFiledForm, BugEditCustomField } from '@/models/bug-management';
import { SelectValue } from '@/models/projectManagement/menuManagement'; import { SelectValue } from '@/models/projectManagement/menuManagement';
import { TagUpdateTypeEnum } from '@/enums/commonEnum';
const { t } = useI18n(); const { t } = useI18n();
const props = defineProps<{ const props = defineProps<{
@ -185,6 +192,7 @@
form.value = []; form.value = [];
form.inputValue = ''; form.inputValue = '';
form.append = false; form.append = false;
valueMode.value = 'single_select';
}; };
const handleCancel = () => { const handleCancel = () => {
@ -222,6 +230,7 @@
} }
} }
}; };
const selectedTagType = ref<TagUpdateTypeEnum>(TagUpdateTypeEnum.UPDATE);
const handleConfirm = () => { const handleConfirm = () => {
formRef.value?.validate(async (errors: undefined | Record<string, ValidatedError>) => { formRef.value?.validate(async (errors: undefined | Record<string, ValidatedError>) => {
@ -232,7 +241,8 @@
...props.selectParam, ...props.selectParam,
projectId: appStore.currentProjectId, projectId: appStore.currentProjectId,
[form.attribute]: form.value || form.inputValue, [form.attribute]: form.value || form.inputValue,
append: form.append, append: selectedTagType.value === TagUpdateTypeEnum.APPEND,
clear: selectedTagType.value === TagUpdateTypeEnum.CLEAR,
}; };
await updateBatchBug(tmpObj); await updateBatchBug(tmpObj);
Message.success(t('common.updateSuccess')); Message.success(t('common.updateSuccess'));

View File

@ -7,12 +7,6 @@
:confirm="confirmHandler" :confirm="confirmHandler"
:close="closeHandler" :close="closeHandler"
unmount-on-close unmount-on-close
:switch-props="{
switchName: t('caseManagement.featureCase.appendTag'),
switchTooltip: t('caseManagement.featureCase.enableTags'),
showSwitch: form.selectedAttrsId === 'systemTags' ? true : false,
enable: form.append,
}"
> >
<div class="form"> <div class="form">
<a-form ref="formRef" :model="form" layout="vertical"> <a-form ref="formRef" :model="form" layout="vertical">
@ -31,9 +25,21 @@
</a-form-item> </a-form-item>
<a-form-item <a-form-item
v-if="form.selectedAttrsId === 'systemTags'" v-if="form.selectedAttrsId === 'systemTags'"
class="mb-[16px]"
field="type"
:label="t('common.type')"
>
<a-radio-group v-model:model-value="selectedTagType" size="small">
<a-radio :value="TagUpdateTypeEnum.UPDATE"> {{ t('common.update') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.APPEND"> {{ t('caseManagement.featureCase.appendTag') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.CLEAR">{{ t('common.clear') }}</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item
v-if="form.selectedAttrsId === 'systemTags' && selectedTagType !== TagUpdateTypeEnum.CLEAR"
field="tags" field="tags"
:validate-trigger="['blur', 'input']" :validate-trigger="['blur', 'input']"
:label="t('caseManagement.featureCase.batchUpdate')" :label="t('common.batchUpdate')"
asterisk-position="end" asterisk-position="end"
:rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]" :rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]"
> >
@ -42,7 +48,7 @@
</a-form-item> </a-form-item>
<MsFormCreate <MsFormCreate
v-else v-if="form.selectedAttrsId !== 'systemTags' && selectedTagType !== TagUpdateTypeEnum.CLEAR"
ref="formCreateRef" ref="formCreateRef"
v-model:api="fApi" v-model:api="fApi"
v-model:form-item="formItem" v-model:form-item="formItem"
@ -69,6 +75,7 @@
import type { CustomAttributes } from '@/models/caseManagement/featureCase'; import type { CustomAttributes } from '@/models/caseManagement/featureCase';
import { TableQueryParams } from '@/models/common'; import { TableQueryParams } from '@/models/common';
import { TagUpdateTypeEnum } from '@/enums/commonEnum';
import Message from '@arco-design/web-vue/es/message'; import Message from '@arco-design/web-vue/es/message';
@ -98,11 +105,12 @@
const form = ref({ ...initForm }); const form = ref({ ...initForm });
const formRef = ref<FormInstance | null>(null); const formRef = ref<FormInstance | null>(null);
const selectedTagType = ref<TagUpdateTypeEnum>(TagUpdateTypeEnum.UPDATE);
const initDefaultForm: FormItem = { const initDefaultForm: FormItem = {
type: 'SELECT', type: 'SELECT',
name: 'name', name: 'name',
label: 'caseManagement.featureCase.batchUpdate', label: 'common.batchUpdate',
value: '', value: '',
options: [], options: [],
props: { props: {
@ -151,7 +159,7 @@
return { return {
type: val, type: val,
name: item.fieldId, name: item.fieldId,
label: 'caseManagement.featureCase.batchUpdate', label: 'common.batchUpdate',
value: formValue, value: formValue,
options: item.options, options: item.options,
props: { props: {
@ -173,7 +181,7 @@
form.value.tags = []; form.value.tags = [];
} }
async function confirmHandler(enable: boolean | undefined) { async function confirmHandler() {
await formRef.value?.validate().then(async (error) => { await formRef.value?.validate().then(async (error) => {
if (!error) { if (!error) {
try { try {
@ -191,13 +199,14 @@
selectAll: !!selectAll, selectAll: !!selectAll,
excludeIds: excludeIds || [], excludeIds: excludeIds || [],
projectId: currentProjectId.value, projectId: currentProjectId.value,
append: enable as boolean, append: selectedTagType.value === TagUpdateTypeEnum.APPEND,
tags: form.value.tags, tags: form.value.tags,
moduleIds: props.activeFolder === 'all' ? [] : [props.activeFolder, ...props.offspringIds], moduleIds: props.activeFolder === 'all' ? [] : [props.activeFolder, ...props.offspringIds],
customField: form.value.selectedAttrsId === 'systemTags' ? {} : customField, customField: form.value.selectedAttrsId === 'systemTags' ? {} : customField,
condition: { condition: {
...props.condition, ...props.condition,
}, },
clear: selectedTagType.value === TagUpdateTypeEnum.CLEAR,
}; };
await batchEditAttrs(params); await batchEditAttrs(params);
Message.success(t('caseManagement.featureCase.editSuccess')); Message.success(t('caseManagement.featureCase.editSuccess'));

View File

@ -83,11 +83,10 @@ export default {
'caseManagement.featureCase.tags': 'Tags', 'caseManagement.featureCase.tags': 'Tags',
'caseManagement.featureCase.enableTags': `On: adds a label`, 'caseManagement.featureCase.enableTags': `On: adds a label`,
'caseManagement.featureCase.closeTags': 'Off: overwrites an existing label', 'caseManagement.featureCase.closeTags': 'Off: overwrites an existing label',
'caseManagement.featureCase.appendTag': 'appendTag', 'caseManagement.featureCase.appendTag': 'append',
'caseManagement.featureCase.batchEdit': 'Batch editing ({number} use cases selected)', 'caseManagement.featureCase.batchEdit': 'Batch editing ({number} use cases selected)',
'caseManagement.featureCase.selectAttrs': 'select attributes', 'caseManagement.featureCase.selectAttrs': 'select attributes',
'caseManagement.featureCase.selectAttrsNotNull': 'Attributes not be null', 'caseManagement.featureCase.selectAttrsNotNull': 'Attributes not be null',
'caseManagement.featureCase.batchUpdate': 'Batch update to',
'caseManagement.featureCase.batchDelete': 'Are you sure to delete the use case {number} ?', 'caseManagement.featureCase.batchDelete': 'Are you sure to delete the use case {number} ?',
'caseManagement.featureCase.batchDeleteCompleted': 'Are you sure to completed delete the use case {number} ?', 'caseManagement.featureCase.batchDeleteCompleted': 'Are you sure to completed delete the use case {number} ?',
'caseManagement.featureCase.batchMoveTitle': 'Batch Move', 'caseManagement.featureCase.batchMoveTitle': 'Batch Move',

View File

@ -83,11 +83,10 @@ export default {
'caseManagement.featureCase.tags': '标签', 'caseManagement.featureCase.tags': '标签',
'caseManagement.featureCase.enableTags': '开启:新增标签', 'caseManagement.featureCase.enableTags': '开启:新增标签',
'caseManagement.featureCase.closeTags': '关闭:覆盖原有标签', 'caseManagement.featureCase.closeTags': '关闭:覆盖原有标签',
'caseManagement.featureCase.appendTag': '追加标签', 'caseManagement.featureCase.appendTag': '追加',
'caseManagement.featureCase.batchEdit': '批量编辑 (已选 { number } 条用例)', 'caseManagement.featureCase.batchEdit': '批量编辑 (已选 { number } 条用例)',
'caseManagement.featureCase.selectAttrs': '选择属性', 'caseManagement.featureCase.selectAttrs': '选择属性',
'caseManagement.featureCase.selectAttrsNotNull': '属性不能为空', 'caseManagement.featureCase.selectAttrsNotNull': '属性不能为空',
'caseManagement.featureCase.batchUpdate': '批量更新为',
'caseManagement.featureCase.batchDelete': '确认删除 {number} 条用例吗?', 'caseManagement.featureCase.batchDelete': '确认删除 {number} 条用例吗?',
'caseManagement.featureCase.batchDeleteCompleted': '确认彻底删除 {number} 条用例吗?', 'caseManagement.featureCase.batchDeleteCompleted': '确认彻底删除 {number} 条用例吗?',
'caseManagement.featureCase.batchMoveTitle': '批量移动', 'caseManagement.featureCase.batchMoveTitle': '批量移动',

View File

@ -25,8 +25,20 @@
</a-form-item> </a-form-item>
<a-form-item <a-form-item
v-if="form.selectedAttrsId === 'tags'" v-if="form.selectedAttrsId === 'tags'"
:class="`${selectedTagType === TagUpdateTypeEnum.CLEAR ? 'mb-0' : 'mb-[16px]'}`"
field="type"
:label="t('common.type')"
>
<a-radio-group v-model:model-value="selectedTagType" size="small">
<a-radio :value="TagUpdateTypeEnum.UPDATE"> {{ t('common.update') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.APPEND"> {{ t('caseManagement.featureCase.appendTag') }}</a-radio>
<a-radio :value="TagUpdateTypeEnum.CLEAR">{{ t('common.clear') }}</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item
v-if="form.selectedAttrsId === 'tags' && selectedTagType !== TagUpdateTypeEnum.CLEAR"
field="tags" field="tags"
:label="t('apiTestManagement.batchUpdate')" :label="t('common.batchUpdate')"
:rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]" :rules="[{ required: true, message: t('common.inputPleaseEnterTags') }]"
asterisk-position="end" asterisk-position="end"
:validate-trigger="['blur', 'input']" :validate-trigger="['blur', 'input']"
@ -37,9 +49,9 @@
<div class="text-[12px] leading-[20px] text-[var(--color-text-4)]">{{ t('ms.tagsInput.tagLimitTip') }}</div> <div class="text-[12px] leading-[20px] text-[var(--color-text-4)]">{{ t('ms.tagsInput.tagLimitTip') }}</div>
</a-form-item> </a-form-item>
<a-form-item <a-form-item
v-else v-if="form.selectedAttrsId !== 'tags'"
field="value" field="value"
:label="t('apiTestManagement.batchUpdate')" :label="t('common.batchUpdate')"
:rules="[{ required: true, message: t('apiTestManagement.valueRequired') }]" :rules="[{ required: true, message: t('apiTestManagement.valueRequired') }]"
asterisk-position="end" asterisk-position="end"
class="mb-0" class="mb-0"
@ -53,26 +65,7 @@
</a-form> </a-form>
<template #footer> <template #footer>
<div class="flex" :class="[form.selectedAttrsId === 'tags' ? 'justify-between' : 'justify-end']"> <div class="flex justify-end">
<div
v-if="form.selectedAttrsId === 'tags'"
class="flex flex-row items-center justify-center"
style="padding-top: 10px"
>
<a-switch v-model="form.append" class="mr-1" size="small" type="line" />
<span class="flex items-center">
<span class="mr-1">{{ t('caseManagement.featureCase.appendTag') }}</span>
<span class="mt-[2px]">
<a-tooltip>
<IconQuestionCircle class="h-[16px] w-[16px] text-[rgb(var(--primary-5))]" />
<template #content>
<div>{{ t('caseManagement.featureCase.enableTags') }}</div>
<div>{{ t('caseManagement.featureCase.closeTags') }}</div>
</template>
</a-tooltip>
</span>
</span>
</div>
<div class="flex justify-end"> <div class="flex justify-end">
<a-button type="secondary" :disabled="batchEditLoading" @click="closeHandler"> <a-button type="secondary" :disabled="batchEditLoading" @click="closeHandler">
{{ t('common.cancel') }} {{ t('common.cancel') }}
@ -99,6 +92,7 @@
import useAppStore from '@/store/modules/app'; import useAppStore from '@/store/modules/app';
import { TableQueryParams } from '@/models/common'; import { TableQueryParams } from '@/models/common';
import { TagUpdateTypeEnum } from '@/enums/commonEnum';
import { testPlanTypeEnum } from '@/enums/testPlanEnum'; import { testPlanTypeEnum } from '@/enums/testPlanEnum';
import Message from '@arco-design/web-vue/es/message'; import Message from '@arco-design/web-vue/es/message';
@ -149,6 +143,8 @@
} }
const batchEditLoading = ref(false); const batchEditLoading = ref(false);
const selectedTagType = ref<TagUpdateTypeEnum>(TagUpdateTypeEnum.UPDATE);
function confirmHandler() { function confirmHandler() {
formRef.value?.validate(async (errors) => { formRef.value?.validate(async (errors) => {
if (!errors) { if (!errors) {
@ -165,8 +161,10 @@
...props.condition, ...props.condition,
}, },
...form.value, ...form.value,
append: selectedTagType.value === TagUpdateTypeEnum.APPEND,
type: props.showType, type: props.showType,
editColumn: 'TAGS', editColumn: 'TAGS',
clear: selectedTagType.value === TagUpdateTypeEnum.CLEAR,
}; };
await batchEditTestPlan(params); await batchEditTestPlan(params);
Message.success(t('caseManagement.featureCase.editSuccess')); Message.success(t('caseManagement.featureCase.editSuccess'));