-
+
+
+
- {{ scope.row.status | formatStatus}}
+ {{ formatStatus(scope.row.status) }}
-
-
+
+
{
return row.name;
@@ -120,19 +141,35 @@ export default {
this.$fileDownloadPost('/attachment/download', {
name: file.name,
id: file.id,
+ isLocal: file.isLocal
});
},
+ handleUpload(file) {
+ this.$emit("handleDump", file);
+ },
handleDelete(file, index) {
this.$emit("handleDelete", file, index);
},
+ handleUnRelate(file, index) {
+ this.$emit("handleUnRelate", file, index);
+ },
handleCancel(file, index) {
this.$emit("handleCancel", file, index);
},
- },
- filters: {
formatStatus(status) {
if (isNaN(status)) {
- return status === 'success' ? '完成' : status === 'toUpload' ? '待上传' : '失败'
+ switch (status) {
+ case 'success':
+ return this.$t('commons.file_upload_status.success');
+ case 'toUpload':
+ return this.$t('commons.file_upload_status.to_upload');
+ case 'toRelate':
+ return this.$t('commons.file_upload_status.to_relate');
+ case 'expired':
+ return this.$t('commons.file_upload_status.expired');
+ default:
+ return this.$t('commons.file_upload_status.error');
+ }
}
return Math.floor(status * 100 / 100) + "%";
}
@@ -145,6 +182,10 @@ export default {
color: black;
}
+::v-deep .el-progress.row-delete-name .el-progress-bar__innerText {
+ color: lightgrey!important;
+}
+
::v-deep .el-progress-bar__outer,
::v-deep .el-progress-bar__inner {
border-radius: inherit ;
@@ -169,4 +210,14 @@ export default {
.yellow {
color: #E6A23C;
}
+
+.lightgrey {
+ color: lightgrey;
+}
+
+
+
diff --git a/frontend/src/business/components/track/case/components/TestCaseEdit.vue b/frontend/src/business/components/track/case/components/TestCaseEdit.vue
index c3bcdaa810..92e41213d2 100644
--- a/frontend/src/business/components/track/case/components/TestCaseEdit.vue
+++ b/frontend/src/business/components/track/case/components/TestCaseEdit.vue
@@ -742,6 +742,9 @@ export default {
if (this.validate(param)) {
let option = this.getOption(param);
this.result = this.$request(option, (response) => {
+ // 保存用例后刷新附件
+ this.currentTestCaseInfo.isCopy = false;
+ this.$refs.otherInfo.getFileMetaData(response.data.id);
this.$success(this.$t('commons.save_success'));
this.path = "/test/case/edit";
// this.operationType = "edit"
@@ -767,8 +770,6 @@ export default {
if (callback) {
callback(this);
}
- // 保存用例后刷新附件
-
//更新版本
if (hasLicense()) {
this.getVersionHistory();
@@ -810,6 +811,12 @@ export default {
if (this.selectedOtherInfo) {
param.otherInfoConfig = this.selectedOtherInfo;
}
+ if (this.$refs.otherInfo.relateFiles.length > 0) {
+ param.relateFileMetaIds = this.$refs.otherInfo.relateFiles;
+ }
+ if (this.$refs.otherInfo.unRelateFiles.length > 0) {
+ param.unRelateFileMetaIds = this.$refs.otherInfo.unRelateFiles;
+ }
return param;
},
parseOldFields(param) {
diff --git a/frontend/src/business/components/track/case/components/TestCaseEditOtherInfo.vue b/frontend/src/business/components/track/case/components/TestCaseEditOtherInfo.vue
index 249299ef61..fbe5aa083d 100644
--- a/frontend/src/business/components/track/case/components/TestCaseEditOtherInfo.vue
+++ b/frontend/src/business/components/track/case/components/TestCaseEditOtherInfo.vue
@@ -60,23 +60,33 @@
-
-
- {{$t('test_track.case.add_attachment')}}
+
+
+
+
+
+ {{$t('permission.project_file.local_upload')}}
+
+
+ {{ $t('permission.project_file.associated_files') }}
+
+
+
+
{{ $t('test_track.case.upload_tip') }}
-
+
@@ -86,6 +96,8 @@
:is-copy="isCopy"
:is-delete="!isTestPlan"
@handleDelete="handleDelete"
+ @handleUnRelate="handleUnRelate"
+ @handleDump="handleDump"
@handleCancel="handleCancel"/>
@@ -121,6 +133,8 @@
+
+
@@ -137,10 +151,12 @@ import TabPaneCount from "@/business/components/track/plan/view/comonents/report
import {getRelationshipCountCase} from "@/network/testCase";
import TestCaseComment from "@/business/components/track/case/components/TestCaseComment";
import ReviewCommentItem from "@/business/components/track/review/commom/ReviewCommentItem";
-import {byteToSize, getTypeByFileName, hasLicense} from "@/common/js/utils";
+import {byteToSize, getCurrentProjectID, getTypeByFileName, getUUID, hasLicense} from "@/common/js/utils";
import {TokenKey} from "@/common/js/constants";
import axios from "axios";
import {validateAndSetLicense} from "@/business/permission";
+import MsFileMetadataList from "@/business/components/project/menu/file/quote/QuoteFileList";
+import MsFileBatchMove from "@/business/components/project/menu/file/module/FileBatchMove";
export default {
name: "TestCaseEditOtherInfo",
@@ -150,6 +166,8 @@ export default {
TestCaseTestRelate,
TestCaseComment,
ReviewCommentItem,
+ MsFileMetadataList,
+ MsFileBatchMove,
FormRichTextItem, TestCaseIssueRelate, TestCaseAttachment, MsRichText, TestCaseRichText
},
props: ['form', 'labelWidth', 'caseId', 'readOnly', 'projectId', 'isTestPlan', 'planId', 'versionEnable', 'isCopy', 'copyCaseId',
@@ -174,7 +192,10 @@ export default {
},
intervalMap: new Map(),
cancelFileToken: [],
- uploadFiles: []
+ uploadFiles: [],
+ relateFiles: [],
+ unRelateFiles: [],
+ dumpFile: {},
};
},
computed: {
@@ -262,7 +283,8 @@ export default {
progress: this.type === 'add' ? 100 : 0,
status: this.type === 'add' ? 'toUpload' : 0,
creator: user.name,
- type: getTypeByFileName(file.name)
+ type: getTypeByFileName(file.name),
+ isLocal: true
});
if (this.type === 'add') {
@@ -365,7 +387,8 @@ export default {
this.fileList.splice(index, 1);
this.tableData.splice(index, 1);
if (this.type === 'add') {
- this.uploadFiles.splice(index, 1);
+ let delIndex = this.uploadFiles.findIndex(uploadFile => uploadFile.name === file.name)
+ this.uploadFiles.splice(delIndex, 1);
} else {
this.$get('/attachment/delete/testcase/' + file.id , response => {
this.$success(this.$t('commons.delete_success'));
@@ -373,6 +396,36 @@ export default {
});
}
},
+ handleUnRelate(file, index) {
+ // 取消关联
+ this.$alert(this.$t('load_test.unrelated_file_confirm') + file.name + "?", '', {
+ confirmButtonText: this.$t('commons.confirm'),
+ dangerouslyUseHTMLString: true,
+ callback: (action) => {
+ if (action === 'confirm') {
+ let unRelateFileIndex = this.tableData.findIndex(f => f.name === file.name);
+ this.tableData.splice(unRelateFileIndex, 1);
+ if (file.status === 'toRelate') {
+ // 待关联的记录, 直接移除
+ let unRelateId = this.relateFiles.findIndex(f => f === file.id);
+ this.relateFiles.splice(unRelateId, 1);
+ } else {
+ // 已经关联的记录
+ this.unRelateFiles.push(file.id);
+ let data = {'belongType': 'testcase', 'belongId': this.caseId, 'metadataRefIds': this.unRelateFiles};
+ this.$post('/attachment/metadata/unrelated', data, response => {
+ this.$success(this.$t('commons.unrelated_success'));
+ this.getFileMetaData();
+ });
+ }
+ }
+ }
+ });
+ },
+ handleDump(file) {
+ this.$refs.module.init();
+ this.dumpFile = file;
+ },
handleCancel(file, index) {
this.fileList.splice(index, 1);
let cancelToken = this.cancelFileToken.filter(f => f.name === file.name)[0];
@@ -382,13 +435,17 @@ export default {
cancelFile.status = 'error';
},
getFileMetaData(id) {
+ if (this.type === 'edit') {
+ this.relateFiles = [];
+ this.unRelateFiles = [];
+ }
this.$emit("update:isClickAttachmentTab", true);
// 保存用例后传入用例id,刷新文件列表,可以预览和下载
this.fileList = [];
this.tableData = [];
let testCaseId;
if (this.isCopy) {
- testCaseId = this.copyCaseId
+ testCaseId = id ? id : this.copyCaseId
} else {
testCaseId = id ? id : this.caseId;
}
@@ -404,12 +461,61 @@ export default {
this.tableData = JSON.parse(JSON.stringify(files));
this.tableData.map(f => {
f.size = byteToSize(f.size);
- f.status = 'success';
+ f.status = f.isRelatedDeleted ? 'expired' : 'success';
f.progress = 100
});
});
}
},
+ associationFile() {
+ this.$refs.metadataList.open();
+ },
+ checkRows(rows) {
+ let repeatRecord = false;
+ for (let row of rows) {
+ let rowIndex = this.tableData.findIndex(item => item.name === row.name);
+ if (rowIndex >= 0) {
+ this.$error(this.$t('load_test.exist_related_file') + ": " + row.name);
+ repeatRecord = true;
+ break;
+ }
+ }
+ if (!repeatRecord) {
+ if (this.type === 'add') {
+ // 新增
+ rows.forEach(row => {
+ this.relateFiles.push(row.id);
+ this.tableData.push({
+ id: row.id,
+ name: row.name,
+ size: byteToSize(row.size),
+ updateTime: row.createTime,
+ progress: 100,
+ status: 'toRelate',
+ creator: row.createUser,
+ type: row.type,
+ isLocal: false,
+ });
+ })
+ } else {
+ // 编辑
+ let metadataRefIds = [];
+ rows.forEach(row => metadataRefIds.push(row.id));
+ let data = {'belongType': 'testcase', 'belongId': this.caseId, 'metadataRefIds': metadataRefIds};
+ this.$post('/attachment/metadata/relate', data, response => {
+ this.$success(this.$t('commons.relate_success'));
+ this.getFileMetaData();
+ });
+ }
+ }
+ },
+ setModuleId(moduleId) {
+ let data = {id: getUUID(), resourceId: getCurrentProjectID(), moduleId: moduleId,
+ projectId: getCurrentProjectID(), fileName: this.dumpFile.name, attachmentId: this.dumpFile.id};
+ this.$post("/attachment/metadata/dump", data, (response) => {
+ this.$success(this.$t("organization.integration.successful_operation"));
+ });
+ },
getRelatedTest() {
this.$refs.relateTest.initTable();
},
@@ -510,4 +616,45 @@ export default {
.demandInput {
width: 200px;
}
+
+.el-icon-plus {
+ font-size: 16px;
+}
+
+.upload-default {
+ background-color: #fbfdff;
+ border: 1px dashed #c0ccda;
+ border-radius: 6px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 40px;
+ height: 30px;
+ line-height: 32px;
+ vertical-align: top;
+ text-align: center;
+ cursor: pointer;
+ display: inline-block;
+}
+
+.upload-default i {
+ color: #8c939d;
+}
+
+.upload-default:hover {
+ border: 1px dashed #783887;
+}
+
+.testplan-local-upload-tip {
+ display: inline-block;
+ position: relative;
+ left: 25px;
+ top: -5px;
+}
+
+.not-testplan-local-upload-tip {
+ display: inline-block;
+ position: relative;
+ left: 25px;
+ top: 8px;
+}
diff --git a/frontend/src/business/components/track/case/components/TestCaseFile.vue b/frontend/src/business/components/track/case/components/TestCaseFile.vue
index 883964d706..a4b2a91363 100644
--- a/frontend/src/business/components/track/case/components/TestCaseFile.vue
+++ b/frontend/src/business/components/track/case/components/TestCaseFile.vue
@@ -1,10 +1,10 @@
-
-
+
diff --git a/frontend/src/business/components/track/case/components/TestCasePdf.vue b/frontend/src/business/components/track/case/components/TestCasePdf.vue
index 472eaf47bb..ffe9389d20 100644
--- a/frontend/src/business/components/track/case/components/TestCasePdf.vue
+++ b/frontend/src/business/components/track/case/components/TestCasePdf.vue
@@ -10,7 +10,8 @@ export default {
name: "TestCasePdf",
components: {pdf},
props: {
- fileId: String
+ fileId: String,
+ isLocal: Boolean
},
data() {
return {
@@ -21,7 +22,7 @@ export default {
},
mounted() {
this.loading = true;
- this.loadingTask = pdf.createLoadingTask("/attachment/preview/" + this.fileId);
+ this.loadingTask = pdf.createLoadingTask("/attachment/preview/" + this.fileId + "/" + this.isLocal);
this.loadingTask.promise.then(pdf => {
this.numPages = pdf.numPages
this.loading = false;
diff --git a/frontend/src/business/components/track/issue/IssueEditDetail.vue b/frontend/src/business/components/track/issue/IssueEditDetail.vue
index e84975e0de..6bac1202d0 100644
--- a/frontend/src/business/components/track/issue/IssueEditDetail.vue
+++ b/frontend/src/business/components/track/issue/IssueEditDetail.vue
@@ -102,23 +102,33 @@
-
-
- {{$t('test_track.case.add_attachment')}}
+
+
+
+
+
+ {{$t('permission.project_file.local_upload')}}
+
+
+ {{ $t('permission.project_file.associated_files') }}
+
+
+
+
{{ $t('test_track.case.upload_tip') }}
-
+
@@ -128,7 +138,9 @@
:is-delete="isDelete"
:is-copy="type === 'copy'"
@handleDelete="handleDelete"
- @handleCancel="handleCancel"/>
+ @handleCancel="handleCancel"
+ @handleUnRelate="handleUnRelate"
+ @handleDump="handleDump"/>
@@ -170,9 +182,10 @@
+
+
-
@@ -193,7 +206,7 @@ import {
getCurrentProjectID,
getCurrentUser,
getCurrentUserId,
- getCurrentWorkspaceId, getTypeByFileName, hasLicense,
+ getCurrentWorkspaceId, getTypeByFileName, getUUID, hasLicense,
} from "@/common/js/utils";
import {enableThirdPartTemplate, getIssuePartTemplateWithProject, getPlatformTransitions} from "@/network/Issue";
import CustomFiledFormItem from "@/business/components/common/components/form/CustomFiledFormItem";
@@ -204,6 +217,8 @@ import {TokenKey} from "@/common/js/constants";
import {Message} from "element-ui";
import TestCaseAttachment from "@/business/components/track/case/components/TestCaseAttachment";
import axios from "axios";
+import MsFileMetadataList from "@/business/components/project/menu/file/quote/QuoteFileList";
+import MsFileBatchMove from "@/business/components/project/menu/file/module/FileBatchMove";
const {getIssuesById} = require("@/network/Issue");
@@ -222,7 +237,9 @@ export default {
MsMarkDownText,
IssueComment,
ReviewCommentItem,
- TestCaseAttachment
+ TestCaseAttachment,
+ MsFileMetadataList,
+ MsFileBatchMove,
},
data() {
return {
@@ -308,7 +325,10 @@ export default {
readOnly: false,
isDelete: true,
cancelFileToken: [],
- uploadFiles: []
+ uploadFiles: [],
+ relateFiles: [],
+ unRelateFiles: [],
+ dumpFile: {},
};
},
props: {
@@ -362,6 +382,7 @@ export default {
}
},
open(data, type) {
+ this.uploadFiles = [];
this.tabActiveName = 'relateTestCase'
this.showFollow = false;
this.result.loading = true;
@@ -546,8 +567,10 @@ export default {
}
param.withoutTestCaseIssue = this.isMinder;
-
param.thirdPartPlatform = this.enableThirdPartTemplate;
+ if (this.relateFiles.length > 0) {
+ param.relateFileMetaIds = this.relateFiles;
+ }
return param;
},
_save() {
@@ -651,7 +674,8 @@ export default {
progress: this.type === 'add' || this.isCaseEdit? 100 : 0,
status: this.type === 'add' || this.isCaseEdit? 'toUpload' : 0,
creator: user.name,
- type: getTypeByFileName(file.name)
+ type: getTypeByFileName(file.name),
+ isLocal: true
});
if (this.type === 'add' || this.isCaseEdit) {
@@ -753,7 +777,8 @@ export default {
this.fileList.splice(index, 1);
this.tableData.splice(index, 1);
if (this.type === 'add' || this.isCaseEdit) {
- this.uploadFiles.splice(index, 1);
+ let delIndex = this.uploadFiles.findIndex(uploadFile => uploadFile.name === file.name)
+ this.uploadFiles.splice(delIndex, 1);
} else {
this.$get('/attachment/delete/issue/' + file.id , response => {
this.$success(this.$t('commons.delete_success'));
@@ -761,6 +786,38 @@ export default {
});
}
},
+ handleUnRelate(file, index) {
+ // 取消关联
+ this.$alert(this.$t('load_test.unrelated_file_confirm') + file.name + "?", '', {
+ confirmButtonText: this.$t('commons.confirm'),
+ dangerouslyUseHTMLString: true,
+ callback: (action) => {
+ if (action === 'confirm') {
+ let unRelateFileIndex = this.tableData.findIndex(f => f.name === file.name);
+ this.tableData.splice(unRelateFileIndex, 1);
+ if (file.status === 'toRelate') {
+ // 待关联的记录, 直接移除
+ let unRelateId = this.relateFiles.findIndex(f => f === file.id);
+ this.relateFiles.splice(unRelateId, 1);
+ } else {
+ // 已经关联的记录
+ this.unRelateFiles.push(file.id);
+ let data = {'belongType': 'issue', 'belongId': this.issueId, 'metadataRefIds': this.unRelateFiles};
+ this.result.loading = true;
+ this.$post('/attachment/metadata/unrelated', data, response => {
+ this.$success(this.$t('commons.unrelated_success'));
+ this.result.loading = false;
+ this.getFileMetaData(this.issueId);
+ });
+ }
+ }
+ }
+ });
+ },
+ handleDump(file) {
+ this.$refs.module.init();
+ this.dumpFile = file;
+ },
handleCancel(file, index) {
this.fileList.splice(index, 1);
let cancelToken = this.cancelFileToken.filter(f => f.name === file.name)[0];
@@ -769,7 +826,63 @@ export default {
cancelFile.progress = 100;
cancelFile.status = 'error';
},
+ associationFile() {
+ this.$refs.metadataList.open();
+ },
+ checkRows(rows) {
+ let repeatRecord = false;
+ for (let row of rows) {
+ let rowIndex = this.tableData.findIndex(item => item.name === row.name);
+ if (rowIndex >= 0) {
+ this.$error(this.$t('load_test.exist_related_file') + ": " + row.name);
+ repeatRecord = true;
+ break;
+ }
+ }
+ if (!repeatRecord) {
+ if (this.type === 'add') {
+ // 新增
+ rows.forEach(row => {
+ this.relateFiles.push(row.id);
+ this.tableData.push({
+ id: row.id,
+ name: row.name,
+ size: byteToSize(row.size),
+ updateTime: row.createTime,
+ progress: 100,
+ status: 'toRelate',
+ creator: row.createUser,
+ type: row.type,
+ isLocal: false,
+ });
+ })
+ } else {
+ // 编辑
+ let metadataRefIds = [];
+ rows.forEach(row => metadataRefIds.push(row.id));
+ let data = {'belongType': 'issue', 'belongId': this.issueId, 'metadataRefIds': metadataRefIds};
+ this.result.loading = true;
+ this.$post('/attachment/metadata/relate', data, response => {
+ this.$success(this.$t('commons.relate_success'));
+ this.result.loading = false;
+ this.getFileMetaData(this.issueId);
+ });
+ }
+ }
+ },
+ setModuleId(moduleId) {
+ let data = {id: getUUID(), resourceId: getCurrentProjectID(), moduleId: moduleId,
+ projectId: getCurrentProjectID(), fileName: this.dumpFile.name, attachmentId: this.dumpFile.id};
+ this.$post("/attachment/metadata/dump", data, (response) => {
+ this.$success(this.$t("organization.integration.successful_operation"));
+ });
+ },
getFileMetaData(id) {
+ if (this.type === 'edit') {
+ this.uploadFiles = [];
+ this.relateFiles = [];
+ this.unRelateFiles = [];
+ }
// 保存用例后传入用例id,刷新文件列表,可以预览和下载
this.fileList = [];
this.tableData = [];
@@ -838,4 +951,38 @@ export default {
font-size: xx-small;
border-radius: 50%;
}
+
+.el-icon-plus {
+ font-size: 16px;
+}
+
+.upload-default {
+ background-color: #fbfdff;
+ border: 1px dashed #c0ccda;
+ border-radius: 6px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 40px;
+ height: 30px;
+ line-height: 32px;
+ vertical-align: top;
+ text-align: center;
+ cursor: pointer;
+ display: inline-block;
+}
+
+.upload-default i {
+ color: #8c939d;
+}
+
+.upload-default:hover {
+ border: 1px dashed #783887;
+}
+
+.local-upload-tips {
+ display: inline-block;
+ position: relative;
+ left: 25px;
+ top: 8px;
+}
diff --git a/frontend/src/i18n/en-US.js b/frontend/src/i18n/en-US.js
index 2ef61664ed..f4977b2cc0 100644
--- a/frontend/src/i18n/en-US.js
+++ b/frontend/src/i18n/en-US.js
@@ -72,6 +72,8 @@ export default {
warning_module_add: "Tree modules are up to 8 levels deep",
send_success: 'Send successfully',
delete_success: 'Deleted successfully',
+ relate_success: 'Related successfully',
+ unrelated_success: 'Unrelated successfully',
modify_success: 'Modify Success',
copy_success: 'Copy Success',
delete_cancel: 'Deleted Cancel',
@@ -188,6 +190,13 @@ export default {
month: "Month",
year: "Year"
},
+ file_upload_status: {
+ success: 'Success',
+ to_upload: 'To upload',
+ to_relate: 'To be associated',
+ expired: 'Expired',
+ error: 'Error'
+ },
test_unit: 'tests',
remove: 'Remove',
next_level: "Next level",
@@ -1098,6 +1107,7 @@ export default {
related_file_not_found: "No related test file found!",
delete_file_when_uploading: 'The current operation may interrupt the file being uploaded!',
delete_file_confirm: 'Confirm delete file:',
+ unrelated_file_confirm: 'Confirm unrelated file: ',
file_size_out_of_bounds: "File size out of bounds, file name: ",
file_size_limit: "The number of files exceeds the limit!",
delete_file: "The file already exists, please delete the file with the same name first!",
@@ -1160,6 +1170,7 @@ export default {
report_type: 'Report type',
upload_jmx: 'Upload JMX',
exist_jmx: 'Existed Files',
+ exist_related_file: 'Existed Relate Files',
other_resource: 'Resource Files',
upload_file: 'Upload Files',
load_exist_file: 'Load Project Files',
diff --git a/frontend/src/i18n/track/en-US.js b/frontend/src/i18n/track/en-US.js
index bc39dc90df..05347a3c60 100644
--- a/frontend/src/i18n/track/en-US.js
+++ b/frontend/src/i18n/track/en-US.js
@@ -137,7 +137,7 @@ export default {
cancel_relevance_project: "Disassociating the project will also cancel the associated test cases under the project",
img_loading_fail: "Image failed to load",
pdf_loading_fail: "PDF loading failed",
- upload_tip: "file size limit[0-500MB]",
+ upload_tip: "Local upload file size is limited to [0-500MB]",
add_attachment: "Add",
attachment: "Attachment",
upload_time: "Upload Time",
diff --git a/frontend/src/i18n/track/zh-CN.js b/frontend/src/i18n/track/zh-CN.js
index 9690055ea0..828f7ee28d 100644
--- a/frontend/src/i18n/track/zh-CN.js
+++ b/frontend/src/i18n/track/zh-CN.js
@@ -128,7 +128,7 @@ export default {
cancel_relevance_project: "取消项目关联会同时取消该项目下已关联的测试用例",
img_loading_fail: "图片加载失败",
pdf_loading_fail: "PDF加载失败",
- upload_tip: "文件大小限制[0-500MB]",
+ upload_tip: "本地上传, 文件大小限制[0-500MB]",
add_attachment: "添加",
attachment: "附件",
upload_time: "上传时间",
diff --git a/frontend/src/i18n/track/zh-TW.js b/frontend/src/i18n/track/zh-TW.js
index 471eca4372..4ea719a01e 100644
--- a/frontend/src/i18n/track/zh-TW.js
+++ b/frontend/src/i18n/track/zh-TW.js
@@ -128,7 +128,7 @@ export default {
cancel_relevance_project: "取消項目關聯會同時取消該項目下已關聯的測試用例",
img_loading_fail: "圖片加載失敗",
pdf_loading_fail: "PDF加載失敗",
- upload_tip: "文件大小限制[0-500MB]",
+ upload_tip: "本地上傳, 文件大小限制[0-500MB]",
add_attachment: "添加",
attachment: "附件",
upload_time: "上傳時間",
diff --git a/frontend/src/i18n/zh-CN.js b/frontend/src/i18n/zh-CN.js
index 4ce05cfbc7..e85ec5c8ec 100644
--- a/frontend/src/i18n/zh-CN.js
+++ b/frontend/src/i18n/zh-CN.js
@@ -71,6 +71,8 @@ export default {
warning_module_add: "模块树深度最大为8层",
send_success: '发送成功',
delete_success: '删除成功',
+ relate_success: '关联成功',
+ unrelated_success: '取消关联成功',
copy_success: '复制成功',
modify_success: '修改成功',
delete_cancel: '已取消删除',
@@ -182,6 +184,13 @@ export default {
month: "月",
year: "年"
},
+ file_upload_status: {
+ success: '完成',
+ to_upload: '待上传',
+ to_relate: '待关联',
+ expired: '已失效',
+ error: '失败'
+ },
test_unit: '测试',
system_parameter_setting: '系统参数设置',
connection_successful: '连接成功',
@@ -1106,6 +1115,7 @@ export default {
related_file_not_found: "未找到关联的测试文件!",
delete_file_when_uploading: '当前操作可能会中断正在上传的文件!',
delete_file_confirm: '确认删除文件: ',
+ unrelated_file_confirm: '确认取消关联: ',
file_size_limit: "文件个数超出限制!",
file_size_out_of_bounds: "文件大小超出范围, 文件名称: ",
delete_file: "文件已存在,请先删除同名文件!",
@@ -1171,6 +1181,7 @@ export default {
report_type: "报告类型",
upload_jmx: '上传 JMX 文件',
exist_jmx: '已存在的文件',
+ exist_related_file: '已存在的关联文件',
other_resource: '资源文件',
upload_file: '上传新文件',
load_exist_file: '加载文件',
diff --git a/frontend/src/i18n/zh-TW.js b/frontend/src/i18n/zh-TW.js
index aed62918f7..6a5343b751 100644
--- a/frontend/src/i18n/zh-TW.js
+++ b/frontend/src/i18n/zh-TW.js
@@ -70,6 +70,8 @@ export default {
save_success: '保存成功',
send_success: '發送成功',
delete_success: '刪除成功',
+ relate_success: '關聯成功',
+ unrelated_success: '取消關聯成功',
copy_success: '復製成功',
warning_module_add: "模塊樹深度最大為8層",
modify_success: '修改成功',
@@ -182,6 +184,13 @@ export default {
month: "月",
year: "年"
},
+ file_upload_status: {
+ success: '完成',
+ to_upload: '待上傳',
+ to_relate: '待關聯',
+ expired: '已失效',
+ error: '失敗'
+ },
test_unit: '測試',
system_parameter_setting: '系統參數設置',
connection_successful: '連接成功',
@@ -1102,6 +1111,7 @@ export default {
related_file_not_found: "未找到關聯的測試文件!",
delete_file_when_uploading: '當前操作可能會中斷正在上傳的文件!',
delete_file_confirm: '確認刪除文件: ',
+ unrelated_file_confirm: '確認取消關聯: ',
file_size_limit: "文件個數超出限製!",
file_size_out_of_bounds: "文件大小超出範圍, 文件名称: ",
delete_file: "文件已存在,請先刪除同名文件!",
@@ -1167,6 +1177,7 @@ export default {
report_type: "报告类型",
upload_jmx: '上傳 JMX 文件',
exist_jmx: '已存在的文件',
+ exist_related_file: '已存在的關聯文件',
other_resource: '資源文件',
upload_file: '上傳新文件',
load_exist_file: '加載文件',