feat: 批量编辑支持清空已有标签调整联调
This commit is contained in:
parent
b0e90384a0
commit
ff94d2f49e
|
@ -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',
|
||||||
|
}
|
||||||
|
|
|
@ -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',
|
||||||
};
|
};
|
||||||
|
|
|
@ -209,4 +209,6 @@ export default {
|
||||||
'common.copySuccessToClipboard': '已复制到剪切板',
|
'common.copySuccessToClipboard': '已复制到剪切板',
|
||||||
'common.casePriority': '用例等级',
|
'common.casePriority': '用例等级',
|
||||||
'common.currentUser': '当前用户',
|
'common.currentUser': '当前用户',
|
||||||
|
'common.type': '类型',
|
||||||
|
'common.batchUpdate': '更新为',
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -92,4 +92,5 @@ export interface BatchEditMockParams extends BatchApiParams {
|
||||||
append: boolean; // 是否追加
|
append: boolean; // 是否追加
|
||||||
enable: boolean; // 是否启用
|
enable: boolean; // 是否启用
|
||||||
protocols: string[]; // 协议集合
|
protocols: string[]; // 协议集合
|
||||||
|
clear?: boolean; // 是否清空标签
|
||||||
}
|
}
|
||||||
|
|
|
@ -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'));
|
||||||
|
|
|
@ -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'));
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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': '报告名称不能为空',
|
||||||
|
|
|
@ -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') {
|
||||||
|
|
|
@ -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?',
|
||||||
|
|
|
@ -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} 条场景吗?',
|
||||||
|
|
|
@ -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'));
|
||||||
|
|
|
@ -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'));
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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': '批量移动',
|
||||||
|
|
|
@ -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'));
|
||||||
|
|
Loading…
Reference in New Issue