diff --git a/src/components/Widgets/Term/index.vue b/src/components/Widgets/Term/index.vue index e15cf9ce6..365b88869 100644 --- a/src/components/Widgets/Term/index.vue +++ b/src/components/Widgets/Term/index.vue @@ -12,7 +12,7 @@ type="default" @click="item.callback()" > - + @@ -37,7 +37,8 @@ export default { }, xtermConfig: { type: Object, - default: () => {} + default: () => { + } } }, data() { @@ -56,21 +57,21 @@ export default { toolbar: [ { tip: this.$tc('ops.ScrollToTop'), - icon: 'fa fa-arrow-up', + icon: 'arrow-up', callback: () => { this.xterm.scrollToTop() } }, { tip: this.$tc('ops.ScrollToBottom'), - icon: 'fa fa-arrow-down', + icon: 'arrow-down', callback: () => { this.xterm.scrollToBottom() } }, { tip: this.$tc('ops.ClearScreen'), - icon: 'fa fa-refresh', + icon: 'refresh', callback: () => { this.xterm.reset() } diff --git a/src/i18n/langs/en.json b/src/i18n/langs/en.json index 214922669..fbbcb491c 100644 --- a/src/i18n/langs/en.json +++ b/src/i18n/langs/en.json @@ -1180,7 +1180,10 @@ "Transfer": "Transfer", "UploadDir": "Upload Directory", "RequiredUploadFile": "Please upload files!", - "DuplicateFileExists": "Duplicate file exists" + "DuplicateFileExists": "Duplicate file exists", + "NoFiles": "No Files", + "uploadFileLthHelpText": "Only files smaller than 200MB can be uploaded", + "FileSizeExceedsLimit": "File size exceeds limit" }, "perms": { "": "", diff --git a/src/i18n/langs/ja.json b/src/i18n/langs/ja.json index ead79b89d..0ed456e7b 100644 --- a/src/i18n/langs/ja.json +++ b/src/i18n/langs/ja.json @@ -1178,7 +1178,10 @@ "Transfer": "ファイルを転送する", "UploadDir": "アップロードディレクトリ", "RequiredUploadFile": "ファイルをアップロードしてください!", - "DuplicateFileExists": "重複したファイルが存在する" + "DuplicateFileExists": "重複したファイルが存在する", + "NoFiles": "まだファイルがありません", + "uploadFileLthHelpText": "200MB 未満のファイルのみアップロードできます", + "FileSizeExceedsLimit": "ファイルサイズが制限を超えています" }, "perms": { "": "", diff --git a/src/i18n/langs/zh.json b/src/i18n/langs/zh.json index b76e47cc6..11b4f2445 100644 --- a/src/i18n/langs/zh.json +++ b/src/i18n/langs/zh.json @@ -1167,7 +1167,10 @@ "Transfer": "传输", "UploadDir": "上传目录", "RequiredUploadFile": "请上传文件!", - "DuplicateFileExists": "存在同名文件" + "DuplicateFileExists": "存在同名文件", + "NoFiles": "暂无文件", + "uploadFileLthHelpText": "只能上传小于200MB文件", + "FileSizeExceedsLimit": "文件大小超出限制" }, "perms": { "": "", diff --git a/src/icons/svg/arrow-down.svg b/src/icons/svg/arrow-down.svg new file mode 100644 index 000000000..bbe1a1e25 --- /dev/null +++ b/src/icons/svg/arrow-down.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/icons/svg/arrow-up.svg b/src/icons/svg/arrow-up.svg new file mode 100644 index 000000000..fd4ccc299 --- /dev/null +++ b/src/icons/svg/arrow-up.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/utils/common.js b/src/utils/common.js index 0af50a3de..98fcf0e1a 100644 --- a/src/utils/common.js +++ b/src/utils/common.js @@ -407,4 +407,12 @@ export const pageScroll = _.throttle((id) => { } }, 200) +export function formatFileSize(bytes) { + if (bytes === 0) return '0 Bytes' + const k = 1024 + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'] + const i = Math.floor(Math.log(bytes) / Math.log(k)) + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] +} + export { BASE_URL } diff --git a/src/views/ops/File/index.vue b/src/views/ops/File/index.vue index bc6c844b9..20b1286ac 100644 --- a/src/views/ops/File/index.vue +++ b/src/views/ops/File/index.vue @@ -55,6 +55,10 @@
{{ $t('common.imExport.dragUploadFileInfo') }}
+
+ + {{ $t('ops.uploadFileLthHelpText') }} + @@ -94,6 +98,7 @@ import { TreeTable } from '@/components' import Term from '@/components/Widgets/Term' import Page from '@/layout/components/Page' import { createJob, getJob, getTaskDetail, JobUploadFile } from '@/api/ops' +import { formatFileSize } from '@/utils/common' export default { name: 'BulkTransfer', @@ -197,6 +202,7 @@ export default { mounted() { this.enableWS() this.initData() + this.handleFileList(null, []) }, methods: { async initData() { @@ -294,7 +300,7 @@ export default { return { hosts, nodes } }, truncateFileName(fullName) { - const maxLength = 140 // 显示的最大字符数 + const maxLength = 130 // 显示的最大字符数 if (fullName.length <= maxLength) { return fullName } @@ -302,14 +308,28 @@ export default { const secondPart = fullName.slice(-maxLength / 2) return firstPart + '...' + secondPart }, - renderSameFile(file, fileList) { + handleFileList(file, fileList) { const filenameList = fileList.map((file) => file.name) const filenameCount = _.countBy(filenameList) - // 找出同名文件 this.$nextTick(() => { + const emptyFileTip = document.getElementsByClassName('empty-file-tip') + if (emptyFileTip.length > 0) { + emptyFileTip[0].style = 'display:none' + } const fileElementList = document.getElementsByClassName('el-upload-list__item-name') if (fileElementList && fileElementList.length > 0) { for (const ele of fileElementList) { + // 显示文件大小 + if (file.name === ele.outerText) { + ele.insertAdjacentHTML('beforeend', + `${formatFileSize(file.size)}`) + } + // 文件大小超出限制 + if (file.size > 200 * 1024 * 1024) { + this.$message.error(this.$tc('ops.FileSizeExceedsLimit')) + ele.style = 'background-color:var(--color-danger)' + } + // 同名文件提示 if (filenameCount[ele.outerText] > 1) { this.$message.error(this.$tc('ops.DuplicateFileExists')) ele.style = 'background-color:var(--color-danger)' @@ -317,13 +337,18 @@ export default { ele.style = '' } } + } else { + const emptyFileElementList = document.getElementsByClassName('el-upload-list--text')[0] + const text = this.$tc('ops.NoFiles') + emptyFileElementList.insertAdjacentHTML('afterbegin', + `
${text}
`) } }) }, onFileChange(file, fileList) { file.name = this.truncateFileName(file.name) this.files = fileList - this.renderSameFile(file, fileList) + this.handleFileList(file, fileList) }, execute() { const { hosts, nodes } = this.getSelectedNodesAndHosts() @@ -469,11 +494,9 @@ export default { list-style: none; width: 100%; height: 180px; - } - - > > > .el-upload-list:not(:empty) { border: 1px dashed #d9d9d9; overflow-y: auto; + font-weight: 500; } }