fix(测试跟踪): 使用第三方缺陷模板,存在同名字段,无法保存
【[测试跟踪] github#24685MS集成Jira,缺陷模板选择【使用jira缺陷模板】,MS读取的Jira缺陷模板中有错误:非必填项变为必填项,并且缺陷无法保存】https://www.tapd.cn/55049933/bugtrace/bugs/view?bug_id=1155049933001026618
This commit is contained in:
parent
cdbdcb931c
commit
0fb0e8c786
|
@ -4,7 +4,7 @@
|
|||
<span class="custom-item" v-for="(item, j) in sortCustomFields" :key="j">
|
||||
<span v-if="j >= (i - 1)*3 && j < (i - 1)*3+3">
|
||||
<el-col :span="8" v-if="item.type !== 'richText'">
|
||||
<el-form-item :label="item.system ? $t(systemNameMap[item.name]) : item.name" :prop="item.name"
|
||||
<el-form-item :label="item.system ? $t(systemNameMap[item.name]) : item.name" :prop="item[formProp]"
|
||||
:label-width="formLabelWidth">
|
||||
<custom-filed-component
|
||||
prop="defaultValue"
|
||||
|
@ -12,6 +12,7 @@
|
|||
:form="form"
|
||||
:default-open="defaultOpen"
|
||||
:disabled="isPublic"
|
||||
:form-prop="formProp"
|
||||
@inputSearch="handleInputSearch"
|
||||
ref="customFiled"
|
||||
/>
|
||||
|
@ -21,12 +22,13 @@
|
|||
<el-col :span="24">
|
||||
<el-form-item
|
||||
:label="item.system ? $t(systemNameMap[item.name]) : item.name"
|
||||
:prop="item.name"
|
||||
:prop="item[formProp]"
|
||||
:default-open="defaultOpen"
|
||||
:label-width="formLabelWidth">
|
||||
<custom-filed-component
|
||||
:data="item"
|
||||
:form="form"
|
||||
:form-prop="formProp"
|
||||
prop="defaultValue"
|
||||
@inputSearch="handleInputSearch"
|
||||
ref="customFiled"/>
|
||||
|
@ -59,7 +61,11 @@ export default {
|
|||
type: Boolean,
|
||||
default() {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
},
|
||||
formProp: {
|
||||
type: String,
|
||||
default: 'name'
|
||||
},
|
||||
defaultOpen: {
|
||||
type: String,
|
||||
|
|
|
@ -161,14 +161,18 @@ import {OPTION_LABEL_PREFIX} from "../../utils/tableUtils";
|
|||
export default {
|
||||
name: "CustomFiledComponent",
|
||||
components: {MsMarkDownText, MsInputTag, MsTableColumn},
|
||||
props: [
|
||||
'data',
|
||||
'prop',
|
||||
'form',
|
||||
'disabled',
|
||||
'defaultOpen',
|
||||
'isTemplateEdit'
|
||||
],
|
||||
props: {
|
||||
data: Object,
|
||||
prop: String,
|
||||
form: Object,
|
||||
disabled: Boolean,
|
||||
defaultOpen: String,
|
||||
isTemplateEdit: Boolean,
|
||||
formProp: {
|
||||
type: String,
|
||||
default: 'name'
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
memberOptions: [],
|
||||
|
@ -223,10 +227,10 @@ export default {
|
|||
return item.system ? this.$t(item.text) : item.text;
|
||||
},
|
||||
handleChange() {
|
||||
if (this.form) {
|
||||
this.$set(this.form, this.data.name, this.data[this.prop]);
|
||||
}
|
||||
this.$emit('change', this.data.name);
|
||||
|
||||
this.setFormData();
|
||||
|
||||
this.$emit('change', this.data[this.formProp]);
|
||||
this.$forceUpdate();
|
||||
if (this.data.inputSearch) {
|
||||
// 将选项的选项名保存在 optionLabel 中
|
||||
|
@ -285,7 +289,7 @@ export default {
|
|||
},
|
||||
setFormData() {
|
||||
if (this.form && this.data && this.data[this.prop]) {
|
||||
this.$set(this.form, this.data.name, this.data[this.prop]);
|
||||
this.$set(this.form, this.data[this.formProp], this.data[this.prop]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -111,6 +111,111 @@ export function parseCustomField(data, template, rules, oldFields) {
|
|||
return customFieldForm;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* 原本的 parseCustomField form 的 key 是字段名,这里改成 ID,jira 存在相同字段名的情况
|
||||
* 设置默认值,添加自定义校验
|
||||
* @param data 原表单值
|
||||
* @param template 模板
|
||||
* @param rules 自定义表单的校验规则
|
||||
* @param oldFields 用于兼容旧版本数据
|
||||
*/
|
||||
export function parseCustomFieldForId(data, template, rules, oldFields) {
|
||||
let hasOldData = false;
|
||||
if (!data.fields) {
|
||||
// 旧数据
|
||||
hasOldData = true;
|
||||
data.fields = [];
|
||||
}
|
||||
|
||||
let customFieldForm = {};
|
||||
|
||||
// 设置页面显示的默认值
|
||||
template.customFields.forEach((item) => {
|
||||
if (item.defaultValue && !item.hasParse) {
|
||||
let val = item.defaultValue;
|
||||
try {
|
||||
val = JSON.parse(item.defaultValue);
|
||||
} catch (e) {
|
||||
//
|
||||
}
|
||||
if (
|
||||
item.name === "责任人" &&
|
||||
item.system &&
|
||||
val &&
|
||||
val === "CURRENT_USER"
|
||||
) {
|
||||
val = '';
|
||||
const {id, userGroups} = getCurrentUser();
|
||||
if (userGroups) {
|
||||
// CURRENT_USER是否是当前项目下的成员
|
||||
let index = userGroups.findIndex(ug => ug.sourceId === getCurrentProjectID());
|
||||
if (index !== -1) {
|
||||
val = id;
|
||||
}
|
||||
}
|
||||
}
|
||||
setDefaultValue(item, val);
|
||||
}
|
||||
|
||||
// 添加自定义字段必填校验
|
||||
if (item.required) {
|
||||
let msg =
|
||||
(item.system ? i18n.t(SYSTEM_FIELD_NAME_MAP[item.name]) : item.name) +
|
||||
i18n.t("commons.cannot_be_null");
|
||||
if (rules) {
|
||||
rules[item.id] = [{ required: true, message: msg, trigger: "blur" }];
|
||||
}
|
||||
}
|
||||
|
||||
if (hasOldData && oldFields) {
|
||||
// 兼容旧数据
|
||||
for (const key of oldFields.keys()) {
|
||||
if (item.name === key) {
|
||||
if (oldFields.get(key)) {
|
||||
setDefaultValue(item, oldFields.get(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将保存的值赋值给template
|
||||
if (data.fields instanceof Array) {
|
||||
for (let i = 0; i < data.fields.length; i++) {
|
||||
let customField = data.fields[i];
|
||||
if (customField.id === item.id) {
|
||||
try {
|
||||
if (item.type === "textarea" || item.type === "richText") {
|
||||
setDefaultValue(item, customField.textValue);
|
||||
} else {
|
||||
setDefaultValue(item, customField.value);
|
||||
}
|
||||
parseCustomFieldOptionLabel(customField, item);
|
||||
item.isEdit = true;
|
||||
} catch (e) {
|
||||
console.error("JSON parse custom field value error.", e);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (data.fields instanceof Object) {
|
||||
// todo
|
||||
// 兼容旧的存储方式
|
||||
for (const key in data.fields) {
|
||||
if (item.name === key) {
|
||||
if (data.fields[key]) {
|
||||
setDefaultValue(item, JSON.parse(data.fields[key]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
customFieldForm[item.id] = item.defaultValue;
|
||||
});
|
||||
|
||||
return customFieldForm;
|
||||
}
|
||||
|
||||
export function isMultipleField(type) {
|
||||
if (type.startsWith('multiple') || type === 'checkbox') {
|
||||
return true;
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
:default-open="richTextDefaultOpen"
|
||||
:form-label-width="formLabelWidth"
|
||||
:issue-template="issueTemplate"
|
||||
form-prop="id"
|
||||
@inputSearch="handleInputSearch"
|
||||
ref="customFieldItem"
|
||||
/>
|
||||
|
@ -188,7 +189,7 @@
|
|||
import TemplateComponentEditHeader from "@/business/plan/view/comonents/report/TemplateComponentEditHeader";
|
||||
import MsFormDivider from "metersphere-frontend/src/components/MsFormDivider";
|
||||
import FormRichTextItem from "metersphere-frontend/src/components/FormRichTextItem";
|
||||
import {buildCustomFields, parseCustomField} from "metersphere-frontend/src/utils/custom_field";
|
||||
import {buildCustomFields, parseCustomField, parseCustomFieldForId} from "metersphere-frontend/src/utils/custom_field";
|
||||
import CustomFiledComponent from "metersphere-frontend/src/components/template/CustomFiledComponent";
|
||||
import TestCaseIssueList from "@/business/issue/TestCaseIssueList";
|
||||
import IssueEditDetail from "@/business/issue/IssueEditDetail";
|
||||
|
@ -495,7 +496,7 @@ export default {
|
|||
this.form.creator = getCurrentUserId();
|
||||
}
|
||||
}
|
||||
this.customFieldForm = parseCustomField(this.form, this.issueTemplate, this.customFieldRules);
|
||||
this.customFieldForm = parseCustomFieldForId(this.form, this.issueTemplate, this.customFieldRules);
|
||||
this.comments = [];
|
||||
this.$nextTick(() => {
|
||||
if (this.$refs.testCaseIssueList) {
|
||||
|
|
Loading…
Reference in New Issue