Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
de13d7866a
|
@ -0,0 +1,21 @@
|
|||
package io.metersphere.commons.utils;
|
||||
|
||||
import io.metersphere.controller.request.OrderRequest;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ServiceUtils {
|
||||
|
||||
public static List<OrderRequest> getDefaultOrder(List<OrderRequest> orders) {
|
||||
if (orders == null || orders.size() < 1) {
|
||||
OrderRequest orderRequest = new OrderRequest();
|
||||
orderRequest.setName("update_time");
|
||||
orderRequest.setType("desc");
|
||||
orders = new ArrayList<>();
|
||||
orders.add(orderRequest);
|
||||
return orders;
|
||||
}
|
||||
return orders;
|
||||
}
|
||||
}
|
|
@ -10,7 +10,9 @@ import io.metersphere.commons.exception.MSException;
|
|||
import io.metersphere.commons.user.SessionUser;
|
||||
import io.metersphere.commons.utils.BeanUtils;
|
||||
import io.metersphere.commons.utils.LogUtil;
|
||||
import io.metersphere.commons.utils.ServiceUtils;
|
||||
import io.metersphere.commons.utils.SessionUtils;
|
||||
import io.metersphere.controller.request.OrderRequest;
|
||||
import io.metersphere.excel.domain.ExcelErrData;
|
||||
import io.metersphere.excel.domain.ExcelResponse;
|
||||
import io.metersphere.excel.domain.TestCaseExcelData;
|
||||
|
@ -101,6 +103,7 @@ public class TestCaseService {
|
|||
}
|
||||
|
||||
public List<TestCaseDTO> listTestCase(QueryTestCaseRequest request) {
|
||||
request.setOrders(ServiceUtils.getDefaultOrder(request.getOrders()));
|
||||
return extTestCaseMapper.list(request);
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,9 @@ import io.metersphere.base.mapper.ext.ExtTestPlanTestCaseMapper;
|
|||
import io.metersphere.commons.constants.TestPlanTestCaseStatus;
|
||||
import io.metersphere.commons.user.SessionUser;
|
||||
import io.metersphere.commons.utils.BeanUtils;
|
||||
import io.metersphere.commons.utils.ServiceUtils;
|
||||
import io.metersphere.commons.utils.SessionUtils;
|
||||
import io.metersphere.controller.request.OrderRequest;
|
||||
import io.metersphere.controller.request.member.QueryMemberRequest;
|
||||
import io.metersphere.service.UserService;
|
||||
import io.metersphere.track.dto.TestPlanCaseDTO;
|
||||
|
@ -41,6 +43,7 @@ public class TestPlanTestCaseService {
|
|||
ExtTestPlanTestCaseMapper extTestPlanTestCaseMapper;
|
||||
|
||||
public List<TestPlanCaseDTO> list(QueryTestPlanCaseRequest request) {
|
||||
request.setOrders(ServiceUtils.getDefaultOrder(request.getOrders()));
|
||||
List<TestPlanCaseDTO> list = extTestPlanTestCaseMapper.list(request);
|
||||
QueryMemberRequest queryMemberRequest = new QueryMemberRequest();
|
||||
queryMemberRequest.setWorkspaceId(SessionUtils.getCurrentWorkspaceId());
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
INSERT INTO user (id, name, email, password, status, create_time, update_time, language, last_workspace_id, last_organization_id, phone)
|
||||
VALUES ('admin', 'Administrator', 'admin@fit2cloud.com', md5('fit2cloud'), '1', 1582597567455, 1582597567455, null, '', null, null);
|
||||
VALUES ('admin', 'Administrator', 'admin@metersphere.io', md5('metersphere'), '1', 1582597567455, 1582597567455, null, '', null, null);
|
||||
|
||||
INSERT INTO user_role (id, user_id, role_id, source_id, create_time, update_time)
|
||||
VALUES (uuid(), 'admin', 'admin', '1', 1581576575948, 1581576575948);
|
||||
|
@ -18,4 +18,4 @@ VALUES ('test_viewer', 'Viewer', NULL, NULL, 1581576575948, 1581576575948);
|
|||
INSERT INTO test_case_report_template (id, name, content)
|
||||
VALUES (uuid(), 'default', '{\"components\": [1,2,3,4,5]}');
|
||||
INSERT INTO system_parameter (param_key, param_value, type, sort)
|
||||
VALUES ('default.language', 'zh_CN', 'text', 5);
|
||||
VALUES ('default.language', 'zh_CN', 'text', 5);
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
<template>
|
||||
<span>
|
||||
<slot name="front"></slot>
|
||||
<ms-table-operator-button :tip="$t('commons.edit')" icon="el-icon-edit" @exec="editClick" @click.stop="editClickStop"/>
|
||||
<ms-table-operator-button :tip="tip1" icon="el-icon-edit" @exec="editClick" @click.stop="editClickStop"/>
|
||||
<slot name="middle"></slot>
|
||||
<ms-table-operator-button :tip="$t('commons.delete')" icon="el-icon-delete" type="danger" @exec="deleteClick" @click.stop="deleteClickStop"/>
|
||||
<ms-table-operator-button :tip="tip2" icon="el-icon-delete" type="danger" @exec="deleteClick" @click.stop="deleteClickStop"/>
|
||||
<slot name="behind"></slot>
|
||||
<!--
|
||||
<ms-table-operator-button :tip="$t('commons.remove')" icon="el-icon-s-fold" type="danger" @exec="removeClick" @click.stop="removeClickStop"/>
|
||||
-->
|
||||
</span>
|
||||
|
||||
</template>
|
||||
|
@ -17,6 +14,20 @@
|
|||
export default {
|
||||
name: "MsTableOperator",
|
||||
components: {MsTableOperatorButton},
|
||||
props: {
|
||||
tip1: {
|
||||
type: String,
|
||||
default() {
|
||||
return this.$t('commons.edit');
|
||||
}
|
||||
},
|
||||
tip2: {
|
||||
type: String,
|
||||
default() {
|
||||
return this.$t('commons.delete');
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
editClick() {
|
||||
this.$emit('editClick');
|
||||
|
@ -29,13 +40,7 @@
|
|||
},
|
||||
deleteClickStop() {
|
||||
this.$emit('deleteClickStop');
|
||||
},
|
||||
/* removeClick(){
|
||||
this.$emit('removeClick');
|
||||
},
|
||||
removeClickStop(){
|
||||
this.$emit('removeClickStop')
|
||||
}*/
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
</el-table-column>
|
||||
<el-table-column>
|
||||
<template v-slot:default="scope">
|
||||
<ms-table-operator @editClick="edit(scope.row)" @deleteClick="del(scope.row)"/>
|
||||
<ms-table-operator :tip2="$t('commons.remove')" @editClick="edit(scope.row)" @deleteClick="del(scope.row)"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
@ -27,25 +27,30 @@
|
|||
<el-dialog :title="$t('member.create')" :visible.sync="createVisible" width="30%" :destroy-on-close="true"
|
||||
@close="handleClose">
|
||||
<el-form :model="form" ref="form" :rules="rules" label-position="right" label-width="100px" size="small">
|
||||
<el-form-item :label="$t('commons.member')" prop="userIds">
|
||||
<el-select v-model="form.userIds" multiple :placeholder="$t('member.please_choose_member')"
|
||||
class="select-width">
|
||||
<el-option
|
||||
v-for="item in form.userList"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id">
|
||||
<span class="org-member-name">{{ item.name }}</span>
|
||||
<span class="org-member-email">{{ item.email }}</span>
|
||||
</el-option>
|
||||
</el-select>
|
||||
<el-form-item :label="$t('commons.member')" prop="memberSign" :rules="{required: true, message: $t('member.input_id_or_email'), trigger: 'change'}">
|
||||
<el-autocomplete
|
||||
class="input-with-autocomplete"
|
||||
v-model="form.memberSign"
|
||||
:placeholder="$t('member.input_id_or_email')"
|
||||
:trigger-on-focus="false"
|
||||
:fetch-suggestions="querySearch"
|
||||
size="small"
|
||||
highlight-first-item
|
||||
value-key="email"
|
||||
@select="handleSelect"
|
||||
>
|
||||
<template v-slot:default="scope">
|
||||
<span class="org-member-name">{{scope.item.id}}</span>
|
||||
<span class="org-member-email">{{scope.item.email}}</span>
|
||||
</template>
|
||||
</el-autocomplete>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('commons.role')" prop="roleIds">
|
||||
<el-select v-model="form.roleIds" multiple :placeholder="$t('role.please_choose_role')" class="select-width">
|
||||
<el-option
|
||||
v-for="item in form.roles"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:label="$t('role.' + item.id)"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
|
@ -113,6 +118,7 @@
|
|||
result: {},
|
||||
createVisible: false,
|
||||
updateVisible: false,
|
||||
userList: [],
|
||||
form: {},
|
||||
queryPath: "/user/org/member/list",
|
||||
condition: {},
|
||||
|
@ -185,17 +191,17 @@
|
|||
});
|
||||
},
|
||||
del(row) {
|
||||
this.$confirm(this.$t('member.delete_confirm'), '', {
|
||||
this.$confirm(this.$t('member.remove_member'), '', {
|
||||
confirmButtonText: this.$t('commons.confirm'),
|
||||
cancelButtonText: this.$t('commons.cancel'),
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
this.result = this.$get('/user/org/member/delete/' + this.currentUser().lastOrganizationId + '/' + row.id, () => {
|
||||
this.$success(this.$t('commons.delete_success'));
|
||||
this.$success(this.$t('commons.remove_success'));
|
||||
this.initTableData();
|
||||
});
|
||||
}).catch(() => {
|
||||
this.$info(this.$t('commons.delete_cancel'))
|
||||
this.$info(this.$t('commons.remove_cancel'))
|
||||
});
|
||||
},
|
||||
create() {
|
||||
|
@ -205,9 +211,9 @@
|
|||
return false;
|
||||
}
|
||||
this.form = {};
|
||||
this.createVisible = true;
|
||||
this.result = this.$get('/user/besideorg/list/' + this.currentUser().lastOrganizationId, response => {
|
||||
this.createVisible = true;
|
||||
this.$set(this.form, "userList", response.data);
|
||||
this.userList = response.data;
|
||||
});
|
||||
this.result = this.$get('/role/list/org', response => {
|
||||
this.$set(this.form, "roles", response.data);
|
||||
|
@ -217,12 +223,24 @@
|
|||
this.$refs[formName].validate((valid) => {
|
||||
let orgId = this.currentUser().lastOrganizationId;
|
||||
if (valid) {
|
||||
let userIds = [];
|
||||
let userId = this.form.userId;
|
||||
let email = this.form.memberSign;
|
||||
let member = this.userList.find(user => user.id === email || user.email === email);
|
||||
if (!member) {
|
||||
this.$warning(this.$t('member.no_such_user'));
|
||||
return false;
|
||||
} else {
|
||||
userId = member.id;
|
||||
}
|
||||
userIds.push(userId);
|
||||
let param = {
|
||||
userIds: this.form.userIds,
|
||||
userIds: userIds,
|
||||
roleIds: this.form.roleIds,
|
||||
organizationId: orgId
|
||||
};
|
||||
this.result = this.$post("user/org/member/add", param, () => {
|
||||
this.$success(this.$t('commons.save_success'));
|
||||
this.initTableData();
|
||||
this.createVisible = false;
|
||||
})
|
||||
|
@ -230,6 +248,20 @@
|
|||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
querySearch(queryString, cb) {
|
||||
var userList = this.userList;
|
||||
var results = queryString ? userList.filter(this.createFilter(queryString)) : userList;
|
||||
// 调用 callback 返回建议列表的数据
|
||||
cb(results);
|
||||
},
|
||||
createFilter(queryString) {
|
||||
return (user) => {
|
||||
return (user.email.indexOf(queryString.toLowerCase()) === 0 || user.id.indexOf(queryString.toLowerCase()) === 0);
|
||||
};
|
||||
},
|
||||
handleSelect(item) {
|
||||
this.$set(this.form, "userId", item.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -247,7 +279,12 @@
|
|||
font-size: 13px;
|
||||
}
|
||||
|
||||
.input-with-autocomplete {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.select-width {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
@ -56,11 +56,7 @@
|
|||
</el-table-column>
|
||||
<el-table-column :label="$t('commons.operating')">
|
||||
<template v-slot:default="scope">
|
||||
<!--<ms-table-operator @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>-->
|
||||
<ms-table-operator-button :tip="$t('commons.edit')" icon="el-icon-edit" @exec="editMember(scope.row)"/>
|
||||
<ms-table-operator-button :tip="$t('commons.remove')" icon="el-icon-delete" type="danger"
|
||||
@exec="delMember(scope.row)"/>
|
||||
|
||||
<ms-table-operator :tip2="$t('commons.remove')" @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
@ -75,18 +71,23 @@
|
|||
@close="closeFunc">
|
||||
<el-form :model="memberForm" ref="form" :rules="wsMemberRule" label-position="right" label-width="100px"
|
||||
size="small">
|
||||
<el-form-item :label="$t('commons.member')" prop="userIds">
|
||||
<el-select v-model="memberForm.userIds" multiple :placeholder="$t('member.please_choose_member')"
|
||||
class="select-width">
|
||||
<el-option
|
||||
v-for="item in memberForm.userList"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id">
|
||||
<span class="ws-member-name">{{ item.name }}</span>
|
||||
<span class="ws-member-email">{{ item.email }}</span>
|
||||
</el-option>
|
||||
</el-select>
|
||||
<el-form-item :label="$t('commons.member')" prop="memberSign" :rules="{required: true, message: $t('member.input_id_or_email'), trigger: 'change'}">
|
||||
<el-autocomplete
|
||||
class="input-with-autocomplete"
|
||||
v-model="memberForm.memberSign"
|
||||
:placeholder="$t('member.input_id_or_email')"
|
||||
:trigger-on-focus="false"
|
||||
:fetch-suggestions="querySearch"
|
||||
size="small"
|
||||
highlight-first-item
|
||||
value-key="email"
|
||||
@select="handleSelect"
|
||||
>
|
||||
<template v-slot:default="scope">
|
||||
<span class="ws-member-name">{{scope.item.id}}</span>
|
||||
<span class="ws-member-email">{{scope.item.email}}</span>
|
||||
</template>
|
||||
</el-autocomplete>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('commons.role')" prop="roleIds">
|
||||
<el-select v-model="memberForm.roleIds" multiple :placeholder="$t('role.please_choose_role')"
|
||||
|
@ -94,7 +95,7 @@
|
|||
<el-option
|
||||
v-for="item in memberForm.roles"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:label="$t('role.' + item.id)"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
|
@ -256,7 +257,7 @@
|
|||
this.dialogWsMemberAddVisible = true;
|
||||
this.memberForm = {};
|
||||
this.result = this.$get('/user/list/', response => {
|
||||
this.$set(this.memberForm, "userList", response.data);
|
||||
this.userList = response.data;
|
||||
});
|
||||
this.result = this.$get('/role/list/test', response => {
|
||||
this.$set(this.memberForm, "roles", response.data);
|
||||
|
@ -315,12 +316,24 @@
|
|||
submitForm(formName) {
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
let userIds = [];
|
||||
let userId = this.memberForm.userId;
|
||||
let email = this.memberForm.memberSign;
|
||||
let member = this.userList.find(user => user.id === email || user.email === email);
|
||||
if (!member) {
|
||||
this.$warning(this.$t('member.no_such_user'));
|
||||
return false;
|
||||
} else {
|
||||
userId = member.id;
|
||||
}
|
||||
userIds.push(userId);
|
||||
let param = {
|
||||
userIds: this.memberForm.userIds,
|
||||
userIds: userIds,
|
||||
roleIds: this.memberForm.roleIds,
|
||||
workspaceId: this.currentWorkspaceRow.id
|
||||
};
|
||||
this.result = this.$post("user/ws/member/add", param, () => {
|
||||
this.$success(this.$t('commons.save_success'));
|
||||
this.cellClick(this.currentWorkspaceRow);
|
||||
this.dialogWsMemberAddVisible = false;
|
||||
})
|
||||
|
@ -371,6 +384,20 @@
|
|||
buildPagePath(path) {
|
||||
return path + "/" + this.dialogCurrentPage + "/" + this.dialogPageSize;
|
||||
},
|
||||
querySearch(queryString, cb) {
|
||||
var userList = this.userList;
|
||||
var results = queryString ? userList.filter(this.createFilter(queryString)) : userList;
|
||||
// 调用 callback 返回建议列表的数据
|
||||
cb(results);
|
||||
},
|
||||
createFilter(queryString) {
|
||||
return (user) => {
|
||||
return (user.email.indexOf(queryString.toLowerCase()) === 0 || user.id.indexOf(queryString.toLowerCase()) === 0);
|
||||
};
|
||||
},
|
||||
handleSelect(item) {
|
||||
this.$set(this.form, "userId", item.id);
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -382,6 +409,7 @@
|
|||
condition: {},
|
||||
dialogCondition: {},
|
||||
items: [],
|
||||
userList: [],
|
||||
currentPage: 1,
|
||||
pageSize: 5,
|
||||
total: 0,
|
||||
|
@ -449,5 +477,9 @@
|
|||
padding: 0px;
|
||||
}
|
||||
|
||||
.input-with-autocomplete {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
|
|
|
@ -42,15 +42,7 @@
|
|||
</el-table-column>
|
||||
<el-table-column :label="$t('commons.operating')">
|
||||
<template v-slot:default="scope">
|
||||
<!--<ms-table-operator @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>-->
|
||||
<ms-table-operator-button :tip="$t('commons.edit')" icon="el-icon-edit" @exec="editMember(scope.row)"/>
|
||||
<ms-table-operator-button :tip="$t('commons.remove')" icon="el-icon-delete" type="danger"
|
||||
@exec="delMember(scope.row)"/>
|
||||
|
||||
|
||||
<!--<el-tooltip class="item" effect="dark" :content="$t('commons.remove')" placement="bottom">
|
||||
<el-button :icon="el-icon-remove-outline">下边</el-button>
|
||||
</el-tooltip>-->
|
||||
<ms-table-operator :tip2="$t('commons.remove')" @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
|
|
@ -100,10 +100,7 @@
|
|||
</el-table-column>
|
||||
<el-table-column :label="$t('commons.operating')">
|
||||
<template v-slot:default="scope">
|
||||
<!--<ms-table-operator @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>-->
|
||||
<ms-table-operator-button :tip="$t('commons.edit')" icon="el-icon-edit" @exec="editMember(scope.row)"/>
|
||||
<ms-table-operator-button :tip="$t('commons.remove')" icon="el-icon-delete" type="danger"
|
||||
@exec="delMember(scope.row)"/>
|
||||
<ms-table-operator :tip2="$t('commons.remove')" @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
</el-table-column>
|
||||
<el-table-column>
|
||||
<template v-slot:default="scope">
|
||||
<ms-table-operator @editClick="edit(scope.row)" @deleteClick="del(scope.row)"
|
||||
<ms-table-operator :tip2="$t('commons.remove')" @editClick="edit(scope.row)" @deleteClick="del(scope.row)"
|
||||
v-permission="['test_manager']"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
@ -28,25 +28,30 @@
|
|||
<el-dialog :title="$t('member.create')" :visible.sync="createVisible" width="30%" :destroy-on-close="true"
|
||||
@close="handleClose">
|
||||
<el-form :model="form" ref="form" :rules="rules" label-position="right" label-width="100px" size="small">
|
||||
<el-form-item :label="$t('commons.member')" prop="userIds">
|
||||
<el-select v-model="form.userIds" multiple :placeholder="$t('member.please_choose_member')"
|
||||
class="select-width">
|
||||
<el-option
|
||||
v-for="item in form.userList"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id">
|
||||
<span class="workspace-member-name">{{ item.name }}</span>
|
||||
<span class="workspace-member-email">{{ item.email }}</span>
|
||||
</el-option>
|
||||
</el-select>
|
||||
<el-form-item :label="$t('commons.member')" prop="memberSign" :rules="{required: true, message: $t('member.input_id_or_email'), trigger: 'change'}">
|
||||
<el-autocomplete
|
||||
class="input-with-autocomplete"
|
||||
v-model="form.memberSign"
|
||||
:placeholder="$t('member.input_id_or_email')"
|
||||
:trigger-on-focus="false"
|
||||
:fetch-suggestions="querySearch"
|
||||
size="small"
|
||||
highlight-first-item
|
||||
value-key="email"
|
||||
@select="handleSelect"
|
||||
>
|
||||
<template v-slot:default="scope">
|
||||
<span class="workspace-member-name">{{scope.item.id}}</span>
|
||||
<span class="workspace-member-email">{{scope.item.email}}</span>
|
||||
</template>
|
||||
</el-autocomplete>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('commons.role')" prop="roleIds">
|
||||
<el-select v-model="form.roleIds" multiple :placeholder="$t('role.please_choose_role')" class="select-width">
|
||||
<el-option
|
||||
v-for="item in form.roles"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:label="$t('role.' + item.id)"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
|
@ -116,6 +121,7 @@
|
|||
queryPath: "/user/ws/member/list",
|
||||
condition: {},
|
||||
tableData: [],
|
||||
userList: [],
|
||||
rules: {
|
||||
userIds: [
|
||||
{required: true, message: this.$t('member.please_choose_member'), trigger: ['blur']}
|
||||
|
@ -168,17 +174,17 @@
|
|||
this.form = {};
|
||||
},
|
||||
del(row) {
|
||||
this.$confirm(this.$t('member.delete_confirm'), '', {
|
||||
this.$confirm(this.$t('member.remove_member'), '', {
|
||||
confirmButtonText: this.$t('commons.confirm'),
|
||||
cancelButtonText: this.$t('commons.cancel'),
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
this.result = this.$get('/user/ws/member/delete/' + this.currentUser().lastWorkspaceId + '/' + row.id,() => {
|
||||
this.$success(this.$t('commons.delete_success'));
|
||||
this.$success(this.$t('commons.remove_success'));
|
||||
this.initTableData();
|
||||
});
|
||||
}).catch(() => {
|
||||
this.$info(this.$t('commons.delete_cancel'));
|
||||
this.$info(this.$t('commons.remove_cancel'));
|
||||
});
|
||||
},
|
||||
edit(row) {
|
||||
|
@ -219,7 +225,7 @@
|
|||
}
|
||||
this.$post('/user/org/member/list/all', param, response => {
|
||||
this.createVisible = true;
|
||||
this.$set(this.form, "userList", response.data);
|
||||
this.userList = response.data;
|
||||
})
|
||||
this.result = this.$get('/role/list/test', response => {
|
||||
this.$set(this.form, "roles", response.data);
|
||||
|
@ -228,17 +234,43 @@
|
|||
submitForm(formName) {
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
let userIds = [];
|
||||
let userId = this.form.userId;
|
||||
let email = this.form.memberSign;
|
||||
let member = this.userList.find(user => user.id === email || user.email === email);
|
||||
if (!member) {
|
||||
this.$warning(this.$t('member.no_such_user'));
|
||||
return false;
|
||||
} else {
|
||||
userId = member.id;
|
||||
}
|
||||
userIds.push(userId);
|
||||
let param = {
|
||||
userIds: this.form.userIds,
|
||||
userIds: userIds,
|
||||
roleIds: this.form.roleIds,
|
||||
workspaceId: this.currentUser().lastWorkspaceId
|
||||
};
|
||||
this.result = this.$post("user/ws/member/add", param, () => {
|
||||
this.$success(this.$t('commons.save_success'));
|
||||
this.initTableData();
|
||||
this.createVisible = false;
|
||||
})
|
||||
}
|
||||
});
|
||||
},
|
||||
querySearch(queryString, cb) {
|
||||
var userList = this.userList;
|
||||
var results = queryString ? userList.filter(this.createFilter(queryString)) : userList;
|
||||
// 调用 callback 返回建议列表的数据
|
||||
cb(results);
|
||||
},
|
||||
createFilter(queryString) {
|
||||
return (user) => {
|
||||
return (user.email.indexOf(queryString.toLowerCase()) === 0 || user.id.indexOf(queryString.toLowerCase()) === 0);
|
||||
};
|
||||
},
|
||||
handleSelect(item) {
|
||||
this.$set(this.form, "userId", item.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -264,4 +296,8 @@
|
|||
font-size: 13px;
|
||||
}
|
||||
|
||||
.input-with-autocomplete {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
@ -86,7 +86,7 @@
|
|||
</el-row>
|
||||
<el-row type="flex" justify="center" style="margin-top: 10px;">
|
||||
<el-col :span="20">
|
||||
<el-form-item>
|
||||
<el-form-item prop="prerequisite">
|
||||
<el-input :disabled="readOnly" v-model="form.prerequisite"
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 2, maxRows: 4}"
|
||||
|
@ -233,6 +233,7 @@
|
|||
priority :[{required: true, message: this.$t('test_track.case.input_priority'), trigger: 'change'}],
|
||||
type :[{required: true, message: this.$t('test_track.case.input_type'), trigger: 'change'}],
|
||||
method :[{required: true, message: this.$t('test_track.case.input_method'), trigger: 'change'}],
|
||||
prerequisite :[{ max: 300, message: this.$t('test_track.length_less_than') + '300', trigger: 'blur'}],
|
||||
remark :[{ max: 300, message: this.$t('test_track.length_less_than') + '300', trigger: 'blur'}]
|
||||
},
|
||||
formLabelWidth: "120px",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<home-base-component v-loading>
|
||||
<home-base-component :title="$t('test_track.home.my_plan')" v-loading>
|
||||
<el-table
|
||||
:data="tableData"
|
||||
@row-click="intoPlan"
|
||||
|
|
|
@ -217,7 +217,7 @@
|
|||
statusChange(status) {
|
||||
this.testCase.status = status;
|
||||
},
|
||||
saveCase(isContinuous) {
|
||||
saveCase() {
|
||||
let param = {};
|
||||
param.id = this.testCase.id;
|
||||
param.status = this.testCase.status;
|
||||
|
@ -238,22 +238,14 @@
|
|||
param.results = JSON.stringify(param.results);
|
||||
param.issues = JSON.stringify(this.testCase.issues);
|
||||
this.$post('/test/plan/case/edit', param, () => {
|
||||
if (isContinuous) {
|
||||
this.updateTestCases(param);
|
||||
return;
|
||||
}
|
||||
this.$refs.drawer.closeDrawer();
|
||||
this.$success(this.$t('commons.save_success'));
|
||||
this.$emit('refresh');
|
||||
});
|
||||
},
|
||||
handleNext() {
|
||||
this.saveCase(true);
|
||||
this.index++;
|
||||
this.getTestCase(this.index);
|
||||
},
|
||||
handlePre() {
|
||||
this.saveCase(true);
|
||||
this.index--;
|
||||
this.getTestCase(this.index);
|
||||
},
|
||||
|
|
|
@ -19,12 +19,12 @@
|
|||
<el-col :span="12">
|
||||
<span>{{$t('report.test_start_time')}}:</span>
|
||||
<span v-if="!isReport">{{reportInfo.startTime}}</span>
|
||||
<el-date-picker v-if="isReport" size="mini" type="date" :placeholder="$t('test_track.commons.select_date')" v-model="reportInfo.startTime"/>
|
||||
<el-date-picker v-if="isReport" size="mini" type="date" :placeholder="$t('commons.select_date')" v-model="reportInfo.startTime"/>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<span>{{$t('report.test_end_time')}}:</span>
|
||||
<span v-if="!isReport">{{reportInfo.endTime}}</span>
|
||||
<el-date-picker v-if="isReport" size="mini" type="date" :placeholder="$t('test_track.commons.select_date')" v-model="reportInfo.endTime"/>
|
||||
<el-date-picker v-if="isReport" size="mini" type="date" :placeholder="$t('commons.select_date')" v-model="reportInfo.endTime"/>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ export default {
|
|||
}
|
||||
return response;
|
||||
}, error => {
|
||||
return Promise.reject(error);
|
||||
return Promise.reject(this.$t('commons.tips'));
|
||||
});
|
||||
|
||||
function then(success, response, result) {
|
||||
|
|
|
@ -89,8 +89,9 @@ export default {
|
|||
'weeks_6': 'Sat',
|
||||
'test_unit': 'tests',
|
||||
'remove': 'Remove',
|
||||
'remove_cancel': 'Remove Failed',
|
||||
'remove_success': 'Remove Success'
|
||||
'remove_cancel': 'Remove Cancel',
|
||||
'remove_success': 'Remove Success',
|
||||
'tips': 'The authentication information has expired, please login again'
|
||||
},
|
||||
workspace: {
|
||||
'create': 'Create Workspace',
|
||||
|
@ -146,7 +147,9 @@ export default {
|
|||
'password_format_is_incorrect': 'Password format is incorrect (At least 8-16 characters, at least 1 uppercase letter, 1 lowercase letter and 1 number)',
|
||||
'old_password': 'Old Password',
|
||||
'new_password': 'New Password',
|
||||
'remove_member': 'Are you sure you want to remove this member'
|
||||
'remove_member': 'Are you sure you want to remove this member',
|
||||
'input_id_or_email': 'Please enter user ID, or user Email',
|
||||
'no_such_user': 'Without this user information, please enter the correct user ID or user Email!',
|
||||
},
|
||||
user: {
|
||||
'create': 'Create',
|
||||
|
|
|
@ -88,8 +88,9 @@ export default {
|
|||
'port_cannot_be_empty': '端口号不能为空',
|
||||
'account_cannot_be_empty': '帐户不能为空',
|
||||
'remove': '移除',
|
||||
'remove_cancel': '移除失败',
|
||||
'remove_success': '移除成功'
|
||||
'remove_cancel': '移除取消',
|
||||
'remove_success': '移除成功',
|
||||
'tips': '认证信息已过期,请重新登录'
|
||||
},
|
||||
workspace: {
|
||||
'create': '创建工作空间',
|
||||
|
@ -144,7 +145,9 @@ export default {
|
|||
'password_format_is_incorrect': '密码格式不正确(至少8-16个字符,至少1个大写字母,1个小写字母和1个数字)',
|
||||
'old_password': '旧密码',
|
||||
'new_password': '新密码',
|
||||
'remove_member': '确定要移除该成员吗'
|
||||
'remove_member': '确定要移除该成员吗',
|
||||
'input_id_or_email': '请输入用户 ID, 或者 用户邮箱',
|
||||
'no_such_user': '无此用户信息, 请输入正确的用户 ID 或者 用户邮箱!',
|
||||
},
|
||||
user: {
|
||||
'create': '创建用户',
|
||||
|
|
|
@ -80,6 +80,17 @@ export default {
|
|||
'weeks_5': '周五',
|
||||
'weeks_6': '周六',
|
||||
'test_unit': '測試',
|
||||
'system_parameter_setting': '系統參數設置',
|
||||
'connection_successful': '連接成功',
|
||||
'connection_failed': '連接失敗',
|
||||
'save_failed': '保存失敗',
|
||||
'host_cannot_be_empty': '主機不能為空',
|
||||
'port_cannot_be_empty': '埠號不能為空',
|
||||
'account_cannot_be_empty': '帳戶不能為空',
|
||||
'remove': '移除',
|
||||
'remove_cancel': '移除取消',
|
||||
'remove_success': '移除成功',
|
||||
'tips': '认認證資訊已過期,請重新登入'
|
||||
},
|
||||
workspace: {
|
||||
'create': '創建工作空間',
|
||||
|
@ -134,6 +145,9 @@ export default {
|
|||
'password_format_is_incorrect': '密碼格式不正確(至少8-16個字符,至少1個大寫字母,1個小寫字母和1個數字)',
|
||||
'old_password': '舊密碼',
|
||||
'new_password': '新密碼',
|
||||
'remove_member': '確定要移除該成員嗎',
|
||||
'input_id_or_email': '請輸入用戶 ID, 或者 用戶郵箱',
|
||||
'no_such_user': '無此用戶信息, 請輸入正確的用戶 ID 或者 用戶郵箱!',
|
||||
},
|
||||
user: {
|
||||
'create': '創建用戶',
|
||||
|
@ -493,6 +507,17 @@ export default {
|
|||
'status_change_success': '狀態修改成功!',
|
||||
'status_change_failed': '狀態修改失敗, 校驗不通過!',
|
||||
},
|
||||
system_parameter_setting: {
|
||||
'mailbox_service_settings': '郵件服務設定',
|
||||
'test_connection': '測試連結',
|
||||
'SMTP_host': 'SMTP主機',
|
||||
'SMTP_port': 'SMTP埠',
|
||||
'SMTP_account': 'SMTP帳戶',
|
||||
'SMTP_password': 'SMTP密碼',
|
||||
'SSL': '開啟SSL(如果SMTP埠是465,通常需要啟用SSL)',
|
||||
'TLS': '開啟TLS(如果SMTP埠是587,通常需要啟用TLS)',
|
||||
'SMTP': '是否匿名 SMTP',
|
||||
},
|
||||
i18n: {
|
||||
'home': '首頁'
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue