refactor(测试跟踪): 功能用例保存问题优化
This commit is contained in:
parent
258c6147b3
commit
8000f871d3
|
@ -0,0 +1,283 @@
|
||||||
|
<template>
|
||||||
|
<span>
|
||||||
|
<el-select v-if="data.type === 'select' || data.type === 'multipleSelect'"
|
||||||
|
:loading="loading"
|
||||||
|
@click.native="clickPane"
|
||||||
|
:disabled="disabled"
|
||||||
|
:multiple="data.type === 'multipleSelect'"
|
||||||
|
:class="{'ms-select-tag' : data.type === 'multipleSelect'}"
|
||||||
|
@change="handleChange"
|
||||||
|
@clear="handleClear"
|
||||||
|
clearable
|
||||||
|
filterable
|
||||||
|
v-model="data[prop]"
|
||||||
|
:filter-method="data.inputSearch ? handleSelectInput : null"
|
||||||
|
:remote="data.inputSearch"
|
||||||
|
:placeholder="$t('commons.default')">
|
||||||
|
<el-option
|
||||||
|
v-for="(item,index) in data.options ? data.options : []"
|
||||||
|
:key="index"
|
||||||
|
@change="handleChange"
|
||||||
|
:label="getTranslateOption(item)"
|
||||||
|
:value="item.value">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
|
||||||
|
<el-cascader
|
||||||
|
v-else-if="data.type === 'cascadingSelect'"
|
||||||
|
@click.native="clickPane"
|
||||||
|
expand-trigger="hover"
|
||||||
|
@change="handleChange"
|
||||||
|
:props="{label: 'text'}"
|
||||||
|
:options="data.options"
|
||||||
|
v-model="data[prop]">
|
||||||
|
</el-cascader>
|
||||||
|
|
||||||
|
<el-input
|
||||||
|
v-else-if="data.type === 'textarea'"
|
||||||
|
@click.native="clickPane"
|
||||||
|
type="textarea"
|
||||||
|
@change="handleChange"
|
||||||
|
:rows="2"
|
||||||
|
:disabled="disabled"
|
||||||
|
:placeholder="$t('commons.input_content')"
|
||||||
|
class="custom-with"
|
||||||
|
v-model="data[prop]">
|
||||||
|
</el-input>
|
||||||
|
|
||||||
|
<el-checkbox-group
|
||||||
|
v-else-if="data.type === 'checkbox'"
|
||||||
|
@click.native="clickPane"
|
||||||
|
:disabled="disabled"
|
||||||
|
v-model="data[prop]">
|
||||||
|
<el-checkbox v-for="(item, index) in data.options ? data.options : []"
|
||||||
|
:key="index"
|
||||||
|
@change="handleChange"
|
||||||
|
:label="item.value">
|
||||||
|
{{ getTranslateOption(item) }}
|
||||||
|
</el-checkbox>
|
||||||
|
</el-checkbox-group>
|
||||||
|
|
||||||
|
<el-radio
|
||||||
|
v-else-if="data.type === 'radio'"
|
||||||
|
@click.native="clickPane"
|
||||||
|
v-model="data[prop]"
|
||||||
|
:disabled="disabled"
|
||||||
|
v-for="(item,index) in data.options ? data.options : []"
|
||||||
|
:key="index"
|
||||||
|
@change="handleChange"
|
||||||
|
:label="item.value">
|
||||||
|
{{ getTranslateOption(item) }}
|
||||||
|
</el-radio>
|
||||||
|
|
||||||
|
<el-input-number
|
||||||
|
v-else-if="data.type === 'int'"
|
||||||
|
@click.native="clickPane"
|
||||||
|
v-model="data[prop]"
|
||||||
|
:disabled="disabled"
|
||||||
|
@change="handleChange"/>
|
||||||
|
|
||||||
|
<el-input-number
|
||||||
|
v-else-if="data.type === 'float'"
|
||||||
|
@click.native="clickPane"
|
||||||
|
:disabled="disabled"
|
||||||
|
@change="handleChange"
|
||||||
|
v-model="data[prop]" :precision="2" :step="0.1"/>
|
||||||
|
|
||||||
|
<el-date-picker
|
||||||
|
class="custom-with"
|
||||||
|
@click.native="clickPane"
|
||||||
|
@change="handleChange"
|
||||||
|
v-else-if="data.type === 'date' || data.type === 'datetime'"
|
||||||
|
:value-format="data.type === 'date' ? 'yyyy-MM-dd' : 'yyyy-MM-dd HH:mm:ss'"
|
||||||
|
:disabled="disabled"
|
||||||
|
v-model="data[prop]"
|
||||||
|
:type="data.type === 'date' ? 'date' : 'datetime'"
|
||||||
|
:placeholder="$t('commons.select_date')">
|
||||||
|
</el-date-picker>
|
||||||
|
|
||||||
|
<el-select v-else-if="data.type === 'member' || data.type === 'multipleMember'"
|
||||||
|
@click.native="clickPane"
|
||||||
|
:multiple="data.type === 'multipleMember'"
|
||||||
|
:class="{'ms-select-tag' : data.type === 'multipleMember'}"
|
||||||
|
@change="handleChange"
|
||||||
|
clearable
|
||||||
|
:disabled="disabled"
|
||||||
|
filterable
|
||||||
|
v-model="data[prop]"
|
||||||
|
:placeholder="$t('commons.default')">
|
||||||
|
<el-option
|
||||||
|
v-for="(item) in memberOptions"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.name + (item.email ? ' (' + item.email + ')' : '')"
|
||||||
|
:value="item.id">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
|
||||||
|
<ms-input-tag v-else-if="data.type === 'multipleInput'"
|
||||||
|
@click.native="clickPane"
|
||||||
|
@input="handleChange"
|
||||||
|
:read-only="disabled" :currentScenario="data" :prop="prop"/>
|
||||||
|
|
||||||
|
<ms-mark-down-text v-else-if="data.type === 'richText'"
|
||||||
|
@click.native="clickPane"
|
||||||
|
:prop="prop"
|
||||||
|
@change="handleChange"
|
||||||
|
:default-open="defaultOpen"
|
||||||
|
:data="data" :disabled="disabled"/>
|
||||||
|
|
||||||
|
<el-input v-else-if="data.type === 'password'"
|
||||||
|
@click.native="clickPane"
|
||||||
|
v-model="data[prop]"
|
||||||
|
class="custom-with"
|
||||||
|
auto-complete="new-password"
|
||||||
|
show-password
|
||||||
|
:disabled="disabled"
|
||||||
|
@input="handleChange"/>
|
||||||
|
|
||||||
|
<el-input v-else
|
||||||
|
@click.native="clickPane"
|
||||||
|
v-model="data[prop]"
|
||||||
|
class="custom-with"
|
||||||
|
maxlength="450"
|
||||||
|
show-word-limit
|
||||||
|
:disabled="disabled"
|
||||||
|
@input="handleChange"/>
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import MsTableColumn from "../table/MsTableColumn";
|
||||||
|
import MsInputTag from "../MsInputTag";
|
||||||
|
import {getProjectMemberOption} from "../../api/user";
|
||||||
|
import MsMarkDownText from "metersphere-frontend/src/components/MsMarkDownText";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "CustomFiledComponent",
|
||||||
|
components: {MsMarkDownText, MsInputTag, MsTableColumn},
|
||||||
|
props: [
|
||||||
|
'data',
|
||||||
|
'prop',
|
||||||
|
'form',
|
||||||
|
'disabled',
|
||||||
|
'defaultOpen',
|
||||||
|
'isTemplateEdit'
|
||||||
|
],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
memberOptions: [],
|
||||||
|
originOptions: null,
|
||||||
|
loading: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
if (['select', 'multipleSelect', 'checkbox', 'radio'].indexOf(this.data.type) > -1 && this.data.options) {
|
||||||
|
let values = this.data[this.prop];
|
||||||
|
if (['multipleSelect', 'checkbox'].indexOf(this.data.type) > -1) {
|
||||||
|
if (values && values instanceof Array) {
|
||||||
|
for (let i = values.length - 1; i >= 0; i--) {
|
||||||
|
if (!this.data.options.find(item => item.value === values[i])) {
|
||||||
|
// 删除已删除的选项
|
||||||
|
values.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 不是数组类型,改成空数组
|
||||||
|
this.data[this.prop] = [];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!this.data.options.find(item => item.value === values)) {
|
||||||
|
// 没有选项则清空
|
||||||
|
this.data[this.prop] = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.setFormData();
|
||||||
|
if (['member', 'multipleMember'].indexOf(this.data.type) < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
getProjectMemberOption()
|
||||||
|
.then((r) => {
|
||||||
|
this.memberOptions = r.data;
|
||||||
|
if (this.data.name === '责任人' && this.data.system && this.isTemplateEdit) {
|
||||||
|
this.memberOptions.unshift({id: 'CURRENT_USER', name: '创建人', email: ''});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
form() {
|
||||||
|
this.setFormData();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
clickPane(){
|
||||||
|
this.$emit("onClick");
|
||||||
|
},
|
||||||
|
getTranslateOption(item) {
|
||||||
|
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.$forceUpdate();
|
||||||
|
},
|
||||||
|
handleSelectInput(val) {
|
||||||
|
this.loading = true;
|
||||||
|
if (!this.originOptions) {
|
||||||
|
this.originOptions = this.data.options;
|
||||||
|
}
|
||||||
|
if (!val) {
|
||||||
|
// 置空搜索时,恢复回原始选项
|
||||||
|
this.data.options = this.originOptions;
|
||||||
|
}
|
||||||
|
this.$emit('inputSearch', this.data, val);
|
||||||
|
},
|
||||||
|
handleClear() {
|
||||||
|
if (this.originOptions && this.data.inputSearch) {
|
||||||
|
// 置空搜索时,恢复回原始选项
|
||||||
|
this.data.options = this.originOptions;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
stopLoading() {
|
||||||
|
this.loading = false;
|
||||||
|
},
|
||||||
|
setFormData() {
|
||||||
|
if (this.form && this.data && this.data[this.prop]) {
|
||||||
|
this.$set(this.form, this.data.name, this.data[this.prop]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.el-select {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-date-editor.el-input {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-with :deep( .el-input__inner) {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-input--suffix .el-input__inner) {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.ms-select-tag.el-select .el-tag__close.el-icon-close::before) {
|
||||||
|
position: relative;
|
||||||
|
top: -17px;
|
||||||
|
left: -6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.ms-select-tag.el-select span.el-select__tags-text) {
|
||||||
|
max-width: 240px!important;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -264,15 +264,47 @@ i.el-dialog__close.el-icon.el-icon-close:before {
|
||||||
font-size: 17px;
|
font-size: 17px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* el-icon-close
|
el-tag
|
||||||
|
*/
|
||||||
|
|
||||||
|
span.el-tag.el-tag--info.el-tag--mini.el-tag--light {
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
padding: 1px 6px;
|
||||||
|
gap: 4px;
|
||||||
|
height: 24px;
|
||||||
|
background: rgba(31, 35, 41, 0.1);
|
||||||
|
border-radius: 2px;
|
||||||
|
flex: none;
|
||||||
|
flex-grow: 0;
|
||||||
|
font-family: 'PingFang SC';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 22px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.el-tag.el-tag--info.el-tag--mini.el-tag--light span{
|
||||||
|
display: inline-block;
|
||||||
|
max-width: 500px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
color: rgb(31, 35, 41);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* el-tag-icon-close
|
||||||
*/
|
*/
|
||||||
i.el-tag__close.el-icon-close {
|
i.el-tag__close.el-icon-close {
|
||||||
height: 0;
|
height: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-select .el-tag__close.el-icon-close::before {
|
.el-select .el-tag__close.el-icon-close::before {
|
||||||
font-size: 26px;
|
font-size: 28px;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: -7px;
|
top: -7px;
|
||||||
left: -6px;
|
left: -6px;
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-opt-row" v-if="!editable">
|
<div class="header-opt-row" v-if="!editable">
|
||||||
|
<!-- 公共用例库头部按钮展示 -->
|
||||||
<div
|
<div
|
||||||
class="previous-public-row head-opt"
|
class="previous-public-row head-opt"
|
||||||
:class="{'disable-row': isFirstPublic}"
|
:class="{'disable-row': isFirstPublic}"
|
||||||
|
@ -81,6 +82,46 @@
|
||||||
<div v-if="isPublicShow">
|
<div v-if="isPublicShow">
|
||||||
<span class="separator-row">|</span>
|
<span class="separator-row">|</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
class="edit-public-row head-opt"
|
||||||
|
v-if="isPublicShow"
|
||||||
|
@click="editPublicCase"
|
||||||
|
>
|
||||||
|
<div class="icon-row">
|
||||||
|
<img src="/assets/module/figma/icon_edit_outlined.svg" alt="" />
|
||||||
|
</div>
|
||||||
|
<div class="label-row">{{ $t("commons.edit") }}</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="copy-public-row head-opt"
|
||||||
|
v-if="isPublicShow"
|
||||||
|
@click="copyPublicCase"
|
||||||
|
>
|
||||||
|
<div class="icon-row">
|
||||||
|
<img src="/assets/module/figma/icon_copy_outlined.svg" alt="" />
|
||||||
|
</div>
|
||||||
|
<div class="label-row">{{ $t("commons.copy") }}</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="isPublicShow">
|
||||||
|
<span class="separator-row">|</span>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="close-row head-opt"
|
||||||
|
v-if="isPublicShow"
|
||||||
|
@click="closePublicCase"
|
||||||
|
>
|
||||||
|
<span class="el-icon-close"></span>
|
||||||
|
</div>
|
||||||
|
<!-- 功能用例库头部按钮展示 -->
|
||||||
|
<div
|
||||||
|
class="follow-row head-opt" v-if="!isPublicShow"
|
||||||
|
@click="toEdit"
|
||||||
|
>
|
||||||
|
<div class="icon-row">
|
||||||
|
<img src="/assets/module/figma/icon_edit_outlined.svg" alt="" />
|
||||||
|
</div>
|
||||||
|
<div class="label-row">{{ $t("commons.edit") }}</div>
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
class="follow-row head-opt"
|
class="follow-row head-opt"
|
||||||
v-if="!showFollow && !isPublicShow"
|
v-if="!showFollow && !isPublicShow"
|
||||||
|
@ -101,25 +142,17 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="label-row">{{ $t("case.followed") }}</div>
|
<div class="label-row">{{ $t("case.followed") }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
|
||||||
class="follow-row head-opt" v-if="!isPublicShow"
|
|
||||||
@click="toEdit"
|
|
||||||
>
|
|
||||||
<div class="icon-row">
|
|
||||||
<img src="/assets/module/figma/icon_edit_outlined.svg" alt="" />
|
|
||||||
</div>
|
|
||||||
<div class="label-row">{{ $t("commons.edit") }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="more-row head-opt" v-if="!isPublicShow">
|
<div class="more-row head-opt" v-if="!isPublicShow">
|
||||||
<div class="icon-row">
|
<div class="icon-row" @mouseenter="$refs.headMoreOptPopover.doShow()" @mouseleave="$refs.headMoreOptPopover.doClose()">
|
||||||
<img src="/assets/module/figma/icon_more_outlined.svg" alt="" />
|
<img src="/assets/module/figma/icon_more_outlined.svg" alt="" />
|
||||||
</div>
|
</div>
|
||||||
<div class="label-row">
|
<div class="label-row">
|
||||||
<el-popover
|
<el-popover
|
||||||
placement="bottom-start"
|
placement="bottom-end"
|
||||||
trigger="hover"
|
trigger="hover"
|
||||||
popper-class="case-step-item-popover"
|
popper-class="more-opt-item-popover"
|
||||||
:visible-arrow="false"
|
:visible-arrow="false"
|
||||||
|
ref="headMoreOptPopover"
|
||||||
>
|
>
|
||||||
<div class="opt-row">
|
<div class="opt-row">
|
||||||
<div
|
<div
|
||||||
|
@ -161,36 +194,6 @@
|
||||||
</el-popover>
|
</el-popover>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
|
||||||
class="edit-public-row head-opt"
|
|
||||||
v-if="isPublicShow"
|
|
||||||
@click="editPublicCase"
|
|
||||||
>
|
|
||||||
<div class="icon-row">
|
|
||||||
<img src="/assets/module/figma/icon_edit_outlined.svg" alt="" />
|
|
||||||
</div>
|
|
||||||
<div class="label-row">{{ $t("commons.edit") }}</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="copy-public-row head-opt"
|
|
||||||
v-if="isPublicShow"
|
|
||||||
@click="copyPublicCase"
|
|
||||||
>
|
|
||||||
<div class="icon-row">
|
|
||||||
<img src="/assets/module/figma/icon_copy_outlined.svg" alt="" />
|
|
||||||
</div>
|
|
||||||
<div class="label-row">{{ $t("commons.copy") }}</div>
|
|
||||||
</div>
|
|
||||||
<div v-if="isPublicShow">
|
|
||||||
<span class="separator-row">|</span>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="close-row head-opt"
|
|
||||||
v-if="isPublicShow"
|
|
||||||
@click="closePublicCase"
|
|
||||||
>
|
|
||||||
<span class="el-icon-close"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 检测版本 是否不是最新 -->
|
<!-- 检测版本 是否不是最新 -->
|
||||||
|
@ -232,6 +235,7 @@
|
||||||
<el-scrollbar>
|
<el-scrollbar>
|
||||||
<case-base-info
|
<case-base-info
|
||||||
:editable="editable"
|
:editable="editable"
|
||||||
|
:editable-state="editableState"
|
||||||
:case-id="form.id"
|
:case-id="form.id"
|
||||||
:project-id="projectId"
|
:project-id="projectId"
|
||||||
:form="form"
|
:form="form"
|
||||||
|
@ -1222,12 +1226,14 @@ export default {
|
||||||
let param = this.buildParam();
|
let param = this.buildParam();
|
||||||
if (this.validate(param)) {
|
if (this.validate(param)) {
|
||||||
let option = this.getOption(param);
|
let option = this.getOption(param);
|
||||||
|
if (!isAddPublic) {
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
|
}
|
||||||
this.$request(option)
|
this.$request(option)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
if (this.editableState) {
|
if (this.editableState) {
|
||||||
this.editableState = false;
|
// 如果是编辑态保存用例, 则直接reload页面
|
||||||
this.$refs.otherInfo.caseActiveName = 'detail';
|
location.reload();
|
||||||
}
|
}
|
||||||
response = response.data;
|
response = response.data;
|
||||||
// 保存用例后刷新附件
|
// 保存用例后刷新附件
|
||||||
|
@ -1464,9 +1470,7 @@ export default {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.loading = true;
|
|
||||||
testCaseEditFollows(this.form.id, this.form.follows).then(() => {
|
testCaseEditFollows(this.form.id, this.form.follows).then(() => {
|
||||||
this.loading = false;
|
|
||||||
this.$success(this.$t("commons.cancel_follow_success"), false);
|
this.$success(this.$t("commons.cancel_follow_success"), false);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -1476,9 +1480,7 @@ export default {
|
||||||
}
|
}
|
||||||
this.form.follows.push(this.currentUser().id);
|
this.form.follows.push(this.currentUser().id);
|
||||||
|
|
||||||
this.loading = true;
|
|
||||||
testCaseEditFollows(this.form.id, this.form.follows).then(() => {
|
testCaseEditFollows(this.form.id, this.form.follows).then(() => {
|
||||||
this.loading = false;
|
|
||||||
this.$success(this.$t("commons.follow_success"), false);
|
this.$success(this.$t("commons.follow_success"), false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -2266,24 +2268,86 @@ export default {
|
||||||
min-width: 120px !important;
|
min-width: 120px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.case-step-item-popover .sub-opt-row .icon img {
|
.more-opt-item-popover .sub-opt-row .icon img {
|
||||||
width: 14px;
|
width: 15px;
|
||||||
height: 14px;
|
height: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.case-step-item-popover .add-public-row .icon {
|
.more-opt-item-popover .add-public-row .icon {
|
||||||
color: #646a73;
|
color: #646a73;
|
||||||
margin-top: 3px;
|
margin-top: 4px;
|
||||||
}
|
}
|
||||||
.case-step-item-popover .add-public-row .title {
|
.more-opt-item-popover .add-public-row .title {
|
||||||
color: #1f2329;
|
color: #1f2329;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
.case-step-item-popover .add-public-row:hover {
|
.more-opt-item-popover .add-public-row:hover {
|
||||||
background-color: rgba(31, 35, 41, 0.1);
|
background-color: rgba(31, 35, 41, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.case-step-item-popover .split {
|
.more-opt-item-popover {
|
||||||
width: 140px;
|
padding: 0 !important;
|
||||||
|
min-width: 118px !important;
|
||||||
|
}
|
||||||
|
.more-opt-item-popover .opt-row {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.more-opt-item-popover .sub-opt-row {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
height: 32px;
|
||||||
|
margin: 3px 0 4px;
|
||||||
|
line-height: 32px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.more-opt-item-popover .sub-opt-row .icon {
|
||||||
|
margin-left: 13px;
|
||||||
|
margin-right: 9.33px;
|
||||||
|
}
|
||||||
|
.more-opt-item-popover .sub-opt-row .title {
|
||||||
|
font-family: "PingFang SC";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 22px;
|
||||||
|
/* identical to box height, or 157% */
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
letter-spacing: -0.1px;
|
||||||
|
}
|
||||||
|
.more-opt-item-popover .split {
|
||||||
|
width: 170px;
|
||||||
|
height: 1px;
|
||||||
|
background-color: rgba(31, 35, 41, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.more-opt-item-popover .copy-row:hover {
|
||||||
|
background-color: rgba(31, 35, 41, 0.1);;
|
||||||
|
}
|
||||||
|
|
||||||
|
.more-opt-item-popover .copy-row .icon {
|
||||||
|
color: #646a73;
|
||||||
|
}
|
||||||
|
.more-opt-item-popover .copy-row .title {
|
||||||
|
color: #1f2329;
|
||||||
|
}
|
||||||
|
|
||||||
|
.more-opt-item-popover .delete-row:hover {
|
||||||
|
background-color: rgba(31, 35, 41, 0.1)!important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.more-opt-item-popover .delete-row .icon {
|
||||||
|
color: #f54a45;
|
||||||
|
}
|
||||||
|
.more-opt-item-popover .delete-row .title {
|
||||||
|
color: #f54a45;
|
||||||
|
}
|
||||||
|
|
||||||
|
.more-opt-item-popover .delete-row {
|
||||||
|
background-color: transparent;
|
||||||
|
padding: 0;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,7 +1,44 @@
|
||||||
<template>
|
<template>
|
||||||
|
<!-- 功能用例编辑页面右侧基本信息-->
|
||||||
<div v-loading="isloading" class="case-base-info-form">
|
<div v-loading="isloading" class="case-base-info-form">
|
||||||
<el-form ref="caseFrom" :rules="headerRules" :model="form" class="case-padding">
|
<el-form ref="caseFrom" :rules="headerRules" :model="form" class="case-padding">
|
||||||
|
<!-- ID及自定义ID -->
|
||||||
|
<div class="id-row case-wrap" v-if="!editable || isCustomNum">
|
||||||
|
<div class="case-title-wrap">
|
||||||
|
<div class="name title-wrap">ID</div>
|
||||||
|
<div class="required required-item"></div>
|
||||||
|
</div>
|
||||||
|
<div class="side-content">
|
||||||
|
<base-edit-item-component
|
||||||
|
:editable="editable"
|
||||||
|
:auto-save="!readOnly"
|
||||||
|
trigger="hover"
|
||||||
|
:contentObject="{
|
||||||
|
content: isCustomNum ? form.customNum : form.num,
|
||||||
|
contentType: 'INPUT',
|
||||||
|
}"
|
||||||
|
:readonlyHoverEvent="!readOnly"
|
||||||
|
:content-click-event="!readOnly"
|
||||||
|
:model="form"
|
||||||
|
:rules="rules"
|
||||||
|
>
|
||||||
|
<template v-slot:content="{ onClick, hoverEditable }">
|
||||||
|
<div :class="hoverEditable ? 'selectHover' : ''">
|
||||||
|
<el-form-item prop="customNum">
|
||||||
|
<el-input
|
||||||
|
:disabled="readOnly"
|
||||||
|
v-model.trim="form.customNum"
|
||||||
|
size="small"
|
||||||
|
class="ms-case-input"
|
||||||
|
@click.native="onClick"
|
||||||
|
></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</base-edit-item-component>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- 公共用例展示所属项目 -->
|
||||||
<div class="module-row case-wrap" v-if="publicEnable">
|
<div class="module-row case-wrap" v-if="publicEnable">
|
||||||
<div class="case-title-wrap">
|
<div class="case-title-wrap">
|
||||||
<div class="name title-wrap">
|
<div class="name title-wrap">
|
||||||
|
@ -46,8 +83,7 @@
|
||||||
</base-edit-item-component>
|
</base-edit-item-component>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- 用例展示所属模块 -->
|
||||||
<!-- 用例库展示项目,不展示模块 -->
|
|
||||||
<div class="module-row case-wrap" v-else>
|
<div class="module-row case-wrap" v-else>
|
||||||
<div class="case-title-wrap">
|
<div class="case-title-wrap">
|
||||||
<div class="name title-wrap">
|
<div class="name title-wrap">
|
||||||
|
@ -92,9 +128,8 @@
|
||||||
</base-edit-item-component>
|
</base-edit-item-component>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</el-form>
|
</el-form>
|
||||||
<!-- 自定义字段 -->
|
<!-- 自定义字段Form -->
|
||||||
<el-form
|
<el-form
|
||||||
v-if="isFormAlive"
|
v-if="isFormAlive"
|
||||||
:model="customFieldForm"
|
:model="customFieldForm"
|
||||||
|
@ -115,6 +150,7 @@
|
||||||
/>
|
/>
|
||||||
</el-form>
|
</el-form>
|
||||||
<el-form ref="baseCaseFrom" :rules="rules" :model="form" class="case-padding">
|
<el-form ref="baseCaseFrom" :rules="rules" :model="form" class="case-padding">
|
||||||
|
<!-- 版本字段 -->
|
||||||
<div class="version-row case-wrap" v-if="versionEnable && !this.form.id">
|
<div class="version-row case-wrap" v-if="versionEnable && !this.form.id">
|
||||||
<div class="case-title-wrap">
|
<div class="case-title-wrap">
|
||||||
<div class="name title-wrap">{{ $t("commons.version") }}</div>
|
<div class="name title-wrap">{{ $t("commons.version") }}</div>
|
||||||
|
@ -159,41 +195,7 @@
|
||||||
</base-edit-item-component>
|
</base-edit-item-component>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="id-row case-wrap" v-if="!editable || isCustomNum">
|
<!-- 关联需求 -->
|
||||||
<div class="case-title-wrap">
|
|
||||||
<div class="name title-wrap">ID</div>
|
|
||||||
<div class="required required-item"></div>
|
|
||||||
</div>
|
|
||||||
<div class="side-content">
|
|
||||||
<base-edit-item-component
|
|
||||||
:editable="editable"
|
|
||||||
:auto-save="isCustomNum"
|
|
||||||
trigger="hover"
|
|
||||||
:contentObject="{
|
|
||||||
content: isCustomNum ? form.customNum : form.num,
|
|
||||||
contentType: 'INPUT',
|
|
||||||
}"
|
|
||||||
:readonlyHoverEvent="isCustomNum && !readOnly"
|
|
||||||
:content-click-event="isCustomNum && !readOnly"
|
|
||||||
:model="form"
|
|
||||||
:rules="rules"
|
|
||||||
>
|
|
||||||
<template v-slot:content="{ onClick, hoverEditable }">
|
|
||||||
<div :class="hoverEditable ? 'selectHover' : ''">
|
|
||||||
<el-form-item prop="customNum">
|
|
||||||
<el-input
|
|
||||||
:disabled="readOnly"
|
|
||||||
v-model.trim="form.customNum"
|
|
||||||
size="small"
|
|
||||||
class="ms-case-input"
|
|
||||||
@click.native="onClick"
|
|
||||||
></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</base-edit-item-component>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="story-row case-wrap">
|
<div class="story-row case-wrap">
|
||||||
<div class="case-title-wrap">
|
<div class="case-title-wrap">
|
||||||
<div class="name title-wrap">
|
<div class="name title-wrap">
|
||||||
|
@ -253,7 +255,7 @@
|
||||||
</base-edit-item-component>
|
</base-edit-item-component>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 选择了关联需求后展示,并且必填 -->
|
<!-- 需求名称: 选择了关联需求后展示,并且必填 -->
|
||||||
<div class="story-name-row case-wrap" v-if="form.demandId === 'other'">
|
<div class="story-name-row case-wrap" v-if="form.demandId === 'other'">
|
||||||
<div class="case-title-wrap">
|
<div class="case-title-wrap">
|
||||||
<div class="name title-wrap">
|
<div class="name title-wrap">
|
||||||
|
@ -291,6 +293,7 @@
|
||||||
</base-edit-item-component>
|
</base-edit-item-component>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- 标签字段 -->
|
||||||
<div class="tag-row case-wrap">
|
<div class="tag-row case-wrap">
|
||||||
<div class="case-title-wrap">
|
<div class="case-title-wrap">
|
||||||
<div class="name title-wrap">{{ $t("commons.tag") }}</div>
|
<div class="name title-wrap">{{ $t("commons.tag") }}</div>
|
||||||
|
@ -448,6 +451,7 @@ export default {
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
editable: Boolean,
|
editable: Boolean,
|
||||||
|
editableState: Boolean,
|
||||||
form: Object,
|
form: Object,
|
||||||
isFormAlive: Boolean,
|
isFormAlive: Boolean,
|
||||||
isloading: Boolean,
|
isloading: Boolean,
|
||||||
|
@ -468,7 +472,7 @@ export default {
|
||||||
return useStore().currentProjectIsCustomNum;
|
return useStore().currentProjectIsCustomNum;
|
||||||
},
|
},
|
||||||
defaultModuleKey() {
|
defaultModuleKey() {
|
||||||
if (this.editable) {
|
if (this.editable && !this.editableState) {
|
||||||
let defaultNodeKey = '';
|
let defaultNodeKey = '';
|
||||||
if (this.$route.query.createNodeId) {
|
if (this.$route.query.createNodeId) {
|
||||||
defaultNodeKey = this.$route.query.createNodeId;
|
defaultNodeKey = this.$route.query.createNodeId;
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
<template v-slot:content="{ onClick, hoverEditable }">
|
<template v-slot:content="{ onClick, hoverEditable }">
|
||||||
<div :class="hoverEditable ? 'selectHover' : ''">
|
<div :class="hoverEditable ? 'selectHover' : ''">
|
||||||
<el-form-item :prop="item.name">
|
<el-form-item :prop="item.name">
|
||||||
<custom-filed-component
|
<ms-custom-filed-component
|
||||||
:data="item"
|
:data="item"
|
||||||
:form="form"
|
:form="form"
|
||||||
prop="defaultValue"
|
prop="defaultValue"
|
||||||
|
@ -51,13 +51,13 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { SYSTEM_FIELD_NAME_MAP } from "metersphere-frontend/src/utils/table-constants";
|
import { SYSTEM_FIELD_NAME_MAP } from "metersphere-frontend/src/utils/table-constants";
|
||||||
import CustomFiledComponent from "metersphere-frontend/src/components/template/CustomFiledComponent";
|
import MsCustomFiledComponent from "metersphere-frontend/src/components/new-ui/MsCustomFiledComponent";
|
||||||
import { sortCustomFields } from "metersphere-frontend/src/utils/custom_field";
|
import { sortCustomFields } from "metersphere-frontend/src/utils/custom_field";
|
||||||
import BaseEditItemComponent from "../BaseEditItemComponent";
|
import BaseEditItemComponent from "../BaseEditItemComponent";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "CaseCustomFiledFormRow",
|
name: "CaseCustomFiledFormRow",
|
||||||
components: { CustomFiledComponent, BaseEditItemComponent },
|
components: { MsCustomFiledComponent, BaseEditItemComponent },
|
||||||
props: {
|
props: {
|
||||||
rules: Object,
|
rules: Object,
|
||||||
editable: Boolean,
|
editable: Boolean,
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<!-- 基于form组件进行表单验证 -->
|
<!-- 基于form组件进行表单验证 -->
|
||||||
<el-form ref="caseDetailForm" :rules="rules" :model="form">
|
<el-form ref="caseDetailForm" :rules="rules" :model="form">
|
||||||
<!-- case name -->
|
<!-- case name -->
|
||||||
<div class="case-name-row" v-on:keydown.enter.prevent>
|
<div class="case-name-row" v-on:keydown.enter.prevent v-if="editableState">
|
||||||
<div class="case-name case-title-wrap">
|
<div class="case-name case-title-wrap">
|
||||||
<div class="name title-wrap">{{ $t("case.case_name") }}</div>
|
<div class="name title-wrap">{{ $t("case.case_name") }}</div>
|
||||||
<div class="required required-item"></div>
|
<div class="required required-item"></div>
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
<case-detail-component
|
<case-detail-component
|
||||||
:type="type"
|
:type="type"
|
||||||
:case-id="caseId"
|
:case-id="caseId"
|
||||||
|
:editable-state="editableState"
|
||||||
:read-only="readOnly || !editable"
|
:read-only="readOnly || !editable"
|
||||||
:project-id="projectId"
|
:project-id="projectId"
|
||||||
:is-copy="isCopy"
|
:is-copy="isCopy"
|
||||||
|
|
|
@ -91,32 +91,6 @@
|
||||||
</div>
|
</div>
|
||||||
<i slot="reference" class="el-icon-more"></i>
|
<i slot="reference" class="el-icon-more"></i>
|
||||||
</el-popover>
|
</el-popover>
|
||||||
<!-- <el-button
|
|
||||||
type="primary"
|
|
||||||
:disabled="readOnly"
|
|
||||||
icon="el-icon-plus"
|
|
||||||
circle
|
|
||||||
size="mini"
|
|
||||||
@click="handleAddStep(scope.$index, scope.row)"
|
|
||||||
></el-button>
|
|
||||||
<el-button
|
|
||||||
icon="el-icon-document-copy"
|
|
||||||
type="success"
|
|
||||||
:disabled="readOnly"
|
|
||||||
circle
|
|
||||||
size="mini"
|
|
||||||
@click="handleCopyStep(scope.$index, scope.row)"
|
|
||||||
></el-button>
|
|
||||||
<el-button
|
|
||||||
type="danger"
|
|
||||||
icon="el-icon-delete"
|
|
||||||
circle
|
|
||||||
size="mini"
|
|
||||||
@click="handleDeleteStep(scope.$index, scope.row)"
|
|
||||||
:disabled="
|
|
||||||
readOnly || (scope.$index == 0 && form.steps.length <= 1)
|
|
||||||
"
|
|
||||||
></el-button> -->
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
@ -311,10 +285,10 @@ export default {
|
||||||
height: 8px;
|
height: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table-edit-input :deep(.el-textarea__inner:hover) {
|
/*.table-edit-input :deep(.el-textarea__inner:hover) {*/
|
||||||
border-style: solid!important;
|
/* border-style: solid!important;*/
|
||||||
border-color: #783887!important;
|
/* border-color: #783887!important;*/
|
||||||
}
|
/*}*/
|
||||||
|
|
||||||
.table-edit-input :deep(.el-textarea__inner:focus) {
|
.table-edit-input :deep(.el-textarea__inner:focus) {
|
||||||
border-style: solid!important;
|
border-style: solid!important;
|
||||||
|
@ -352,8 +326,7 @@ i.el-icon-more:hover {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
margin-top: 4px;
|
margin: 4px 0 4px;
|
||||||
margin-bottom: 4px;
|
|
||||||
line-height: 32px;
|
line-height: 32px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,7 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
.case-name {
|
.case-name {
|
||||||
height: px2rem(24);
|
height: auto;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-family: "PingFang SC";
|
font-family: "PingFang SC";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
|
|
Loading…
Reference in New Issue