feat(测试计划): 测试计划详情-双击功能用例详情里富文本内容打开弹窗&样式细节
This commit is contained in:
parent
29de7455a3
commit
8eaadd7bc3
|
@ -44,6 +44,7 @@
|
||||||
v-model:model-value="record.executeResult"
|
v-model:model-value="record.executeResult"
|
||||||
:placeholder="t('common.pleaseSelect')"
|
:placeholder="t('common.pleaseSelect')"
|
||||||
class="param-input w-full"
|
class="param-input w-full"
|
||||||
|
allow-clear
|
||||||
>
|
>
|
||||||
<template #label>
|
<template #label>
|
||||||
<span class="text-[var(--color-text-2)]"><ExecuteResult :execute-result="record.executeResult" /></span>
|
<span class="text-[var(--color-text-2)]"><ExecuteResult :execute-result="record.executeResult" /></span>
|
||||||
|
|
|
@ -590,7 +590,7 @@
|
||||||
step: item.desc,
|
step: item.desc,
|
||||||
expected: item.result,
|
expected: item.result,
|
||||||
actualResult: item.actualResult ?? '',
|
actualResult: item.actualResult ?? '',
|
||||||
executeResult: item.executeResult ?? 'PASSED',
|
executeResult: item.executeResult,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<a-form ref="formRef" :model="form">
|
<a-form :model="form">
|
||||||
<a-form-item field="lastExecResult" class="mb-[8px]">
|
<a-form-item field="lastExecResult" class="mb-[8px]">
|
||||||
<a-radio-group v-model:model-value="form.lastExecResult" @change="clearContent">
|
<a-radio-group v-model:model-value="form.lastExecResult" @change="clearContent">
|
||||||
<a-radio v-for="item in executionResultList" :key="item.key" :value="item.key">
|
<a-radio v-for="item in executionResultList" :key="item.key" :value="item.key">
|
||||||
|
@ -12,9 +12,15 @@
|
||||||
<MsRichText
|
<MsRichText
|
||||||
v-model:raw="form.content"
|
v-model:raw="form.content"
|
||||||
v-model:commentIds="form.commentIds"
|
v-model:commentIds="form.commentIds"
|
||||||
|
v-model:filedIds="form.planCommentFileIds"
|
||||||
:upload-image="handleUploadImage"
|
:upload-image="handleUploadImage"
|
||||||
:preview-url="PreviewEditorImageUrl"
|
:preview-url="PreviewEditorImageUrl"
|
||||||
class="w-full"
|
class="w-full"
|
||||||
|
:placeholder="
|
||||||
|
props.isDblclickPlaceholder
|
||||||
|
? t('testPlan.featureCase.richTextDblclickPlaceholder')
|
||||||
|
: t('editor.placeholder')
|
||||||
|
"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
@ -22,26 +28,28 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from 'vue';
|
|
||||||
import { FormInstance } from '@arco-design/web-vue';
|
|
||||||
|
|
||||||
import MsRichText from '@/components/pure/ms-rich-text/MsRichText.vue';
|
import MsRichText from '@/components/pure/ms-rich-text/MsRichText.vue';
|
||||||
import ExecuteResult from '@/components/business/ms-case-associate/executeResult.vue';
|
import ExecuteResult from '@/components/business/ms-case-associate/executeResult.vue';
|
||||||
|
|
||||||
import { editorUploadFile } from '@/api/modules/case-management/featureCase';
|
import { editorUploadFile } from '@/api/modules/case-management/featureCase';
|
||||||
import { PreviewEditorImageUrl } from '@/api/requrls/case-management/featureCase';
|
import { PreviewEditorImageUrl } from '@/api/requrls/case-management/featureCase';
|
||||||
import { defaultExecuteForm } from '@/config/testPlan';
|
import { defaultExecuteForm } from '@/config/testPlan';
|
||||||
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
|
|
||||||
import type { ExecuteFeatureCaseFormParams } from '@/models/testPlan/testPlan';
|
import type { ExecuteFeatureCaseFormParams } from '@/models/testPlan/testPlan';
|
||||||
import { LastExecuteResults } from '@/enums/caseEnum';
|
import { LastExecuteResults } from '@/enums/caseEnum';
|
||||||
|
|
||||||
import { executionResultMap } from '@/views/case-management/caseManagementFeature/components/utils';
|
import { executionResultMap } from '@/views/case-management/caseManagementFeature/components/utils';
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
isDblclickPlaceholder?: boolean;
|
||||||
|
}>();
|
||||||
|
|
||||||
const form = defineModel<ExecuteFeatureCaseFormParams>('form', {
|
const form = defineModel<ExecuteFeatureCaseFormParams>('form', {
|
||||||
required: true,
|
required: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
const formRef = ref<FormInstance>();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const executionResultList = computed(() =>
|
const executionResultList = computed(() =>
|
||||||
Object.values(executionResultMap).filter((item) => item.key !== LastExecuteResults.PENDING)
|
Object.values(executionResultMap).filter((item) => item.key !== LastExecuteResults.PENDING)
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<ExecuteForm v-model:form="form" />
|
<ExecuteForm v-model:form="form" is-dblclick-placeholder class="execute-form" />
|
||||||
<!-- TODO: 双击富文本内容打开弹窗 -->
|
|
||||||
<a-button
|
<a-button
|
||||||
type="primary"
|
type="primary"
|
||||||
class="mt-[12px]"
|
class="mt-[12px]"
|
||||||
|
@ -29,6 +28,7 @@
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, ref } from 'vue';
|
import { computed, ref } from 'vue';
|
||||||
|
import { useEventListener } from '@vueuse/core';
|
||||||
import { Message } from '@arco-design/web-vue';
|
import { Message } from '@arco-design/web-vue';
|
||||||
|
|
||||||
import ExecuteForm from '@/views/test-plan/testPlan/detail/featureCase/components/executeForm.vue';
|
import ExecuteForm from '@/views/test-plan/testPlan/detail/featureCase/components/executeForm.vue';
|
||||||
|
@ -66,6 +66,16 @@
|
||||||
(form.value.content === '' || form.value.content?.trim() === '<p style=""></p>')
|
(form.value.content === '' || form.value.content?.trim() === '<p style=""></p>')
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 双击富文本内容打开弹窗
|
||||||
|
onMounted(() => {
|
||||||
|
nextTick(() => {
|
||||||
|
const editorContent = document.querySelector('.execute-form')?.querySelector('.editor-content');
|
||||||
|
useEventListener(editorContent, 'dblclick', () => {
|
||||||
|
modalVisible.value = true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => props.stepExecutionResult,
|
() => props.stepExecutionResult,
|
||||||
() => {
|
() => {
|
||||||
|
@ -81,6 +91,13 @@
|
||||||
{ deep: true }
|
{ deep: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => props.id,
|
||||||
|
() => {
|
||||||
|
form.value = { ...defaultExecuteForm };
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
// 提交执行
|
// 提交执行
|
||||||
async function submit() {
|
async function submit() {
|
||||||
try {
|
try {
|
||||||
|
@ -90,9 +107,8 @@
|
||||||
caseId: props.caseId,
|
caseId: props.caseId,
|
||||||
testPlanId: props.testPlanId,
|
testPlanId: props.testPlanId,
|
||||||
id: props.id,
|
id: props.id,
|
||||||
lastExecResult: form.value.lastExecResult,
|
...form.value,
|
||||||
stepsExecResult: JSON.stringify(props.stepExecutionResult) ?? '',
|
stepsExecResult: JSON.stringify(props.stepExecutionResult) ?? '',
|
||||||
content: form.value.content,
|
|
||||||
notifier: form.value?.commentIds?.join(';'),
|
notifier: form.value?.commentIds?.join(';'),
|
||||||
};
|
};
|
||||||
await runFeatureCase(params);
|
await runFeatureCase(params);
|
||||||
|
@ -108,3 +124,9 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.execute-form :deep(.rich-wrapper) .halo-rich-text-editor .ProseMirror {
|
||||||
|
height: 58px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
@ -45,7 +45,6 @@
|
||||||
</div>
|
</div>
|
||||||
<MsEmpty v-if="caseList.length === 0" />
|
<MsEmpty v-if="caseList.length === 0" />
|
||||||
</div>
|
</div>
|
||||||
<!-- TODO 样式 -->
|
|
||||||
<MsPagination
|
<MsPagination
|
||||||
v-model:page-size="pageNation.pageSize"
|
v-model:page-size="pageNation.pageSize"
|
||||||
v-model:current="pageNation.current"
|
v-model:current="pageNation.current"
|
||||||
|
@ -85,8 +84,18 @@
|
||||||
class="relative mx-[16px] border-b"
|
class="relative mx-[16px] border-b"
|
||||||
/>
|
/>
|
||||||
<div :class="[' flex-1', activeTab !== 'detail' ? 'tab-content' : 'overflow-hidden']">
|
<div :class="[' flex-1', activeTab !== 'detail' ? 'tab-content' : 'overflow-hidden']">
|
||||||
<!-- TODO: 属性的样式 -->
|
<MsDescription v-if="activeTab === 'baseInfo'" :descriptions="descriptions" :column="2">
|
||||||
<MsDescription v-if="activeTab === 'baseInfo'" :descriptions="descriptions" :column="2" />
|
<template #value="{ item }">
|
||||||
|
<template v-if="item.key === 'reviewStatus'">
|
||||||
|
<MsIcon
|
||||||
|
:type="statusIconMap[item.value as keyof typeof statusIconMap]?.icon || ''"
|
||||||
|
class="mr-1"
|
||||||
|
:class="[statusIconMap[item.value as keyof typeof statusIconMap].color]"
|
||||||
|
></MsIcon>
|
||||||
|
<span>{{ statusIconMap[item.value as keyof typeof statusIconMap]?.statusText || '' }} </span>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</MsDescription>
|
||||||
<div v-else-if="activeTab === 'detail'" class="align-content-start flex h-full flex-col">
|
<div v-else-if="activeTab === 'detail'" class="align-content-start flex h-full flex-col">
|
||||||
<CaseTabDetail ref="caseTabDetailRef" is-test-plan :form="caseDetail" />
|
<CaseTabDetail ref="caseTabDetailRef" is-test-plan :form="caseDetail" />
|
||||||
<!-- 开始执行 -->
|
<!-- 开始执行 -->
|
||||||
|
@ -160,7 +169,11 @@
|
||||||
import { LastExecuteResults } from '@/enums/caseEnum';
|
import { LastExecuteResults } from '@/enums/caseEnum';
|
||||||
import { CaseManagementRouteEnum } from '@/enums/routeEnum';
|
import { CaseManagementRouteEnum } from '@/enums/routeEnum';
|
||||||
|
|
||||||
import { executionResultMap, getCustomField } from '@/views/case-management/caseManagementFeature/components/utils';
|
import {
|
||||||
|
executionResultMap,
|
||||||
|
getCustomField,
|
||||||
|
statusIconMap,
|
||||||
|
} from '@/views/case-management/caseManagementFeature/components/utils';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
@ -280,6 +293,7 @@
|
||||||
{
|
{
|
||||||
label: t('caseManagement.featureCase.reviewResult'),
|
label: t('caseManagement.featureCase.reviewResult'),
|
||||||
value: res.reviewStatus,
|
value: res.reviewStatus,
|
||||||
|
key: 'reviewStatus',
|
||||||
},
|
},
|
||||||
// 解析用例模板的自定义字段
|
// 解析用例模板的自定义字段
|
||||||
...res.customFields.map((e: Record<string, any>) => {
|
...res.customFields.map((e: Record<string, any>) => {
|
||||||
|
|
|
@ -101,4 +101,5 @@ export default {
|
||||||
'After cancellation, it will affect the statistics related to the test plan',
|
'After cancellation, it will affect the statistics related to the test plan',
|
||||||
'testPlan.featureCase.batchDisassociateTipContent':
|
'testPlan.featureCase.batchDisassociateTipContent':
|
||||||
' After cancellation, associate again, and the execution result is unexecuted',
|
' After cancellation, associate again, and the execution result is unexecuted',
|
||||||
|
'testPlan.featureCase.richTextDblclickPlaceholder': 'Double click for quick input',
|
||||||
};
|
};
|
||||||
|
|
|
@ -98,4 +98,5 @@ export default {
|
||||||
'testPlan.featureCase.disassociateTipContent': '取消后,影响测试计划相关统计',
|
'testPlan.featureCase.disassociateTipContent': '取消后,影响测试计划相关统计',
|
||||||
'testPlan.featureCase.batchDisassociateTipContent': '取消后,再次关联,执行结果为:未执行',
|
'testPlan.featureCase.batchDisassociateTipContent': '取消后,再次关联,执行结果为:未执行',
|
||||||
'testPlan.featureCase.startExecution': '开始执行',
|
'testPlan.featureCase.startExecution': '开始执行',
|
||||||
|
'testPlan.featureCase.richTextDblclickPlaceholder': '双击可快速输入',
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue