diff --git a/frontend/src/components/complex-table/index.vue b/frontend/src/components/complex-table/index.vue index 3c56993d6..8530f9cea 100644 --- a/frontend/src/components/complex-table/index.vue +++ b/frontend/src/components/complex-table/index.vue @@ -219,30 +219,30 @@ defineExpose({ closeRightClick, }); -onMounted(() => { - let heightDiff = 320; - let tabHeight = 0; - if (props.heightDiff) { - heightDiff = props.heightDiff; - } - if (globalStore.openMenuTabs) { - tabHeight = 48; - } +function calcHeight() { + let heightDiff = props.heightDiff ?? 320; + let tabHeight = globalStore.openMenuTabs ? 48 : 0; + if (props.height) { tableHeight.value = props.height - tabHeight; } else { tableHeight.value = window.innerHeight - heightDiff - tabHeight; } +} - window.onresize = () => { - return (() => { - if (props.height) { - tableHeight.value = props.height - tabHeight; - } else { - tableHeight.value = window.innerHeight - heightDiff - tabHeight; - } - })(); - }; +onMounted(() => { + calcHeight(); + window.addEventListener('resize', calcHeight); + watch( + () => props.height, + () => { + calcHeight(); + }, + ); +}); + +onBeforeUnmount(() => { + window.removeEventListener('resize', calcHeight); }); diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index a12b840e8..bc0572b04 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -1510,6 +1510,7 @@ const message = { cancelUpload: 'Cancel Upload', cancelUploadHelper: 'Whether to cancel the upload, after cancellation the upload list will be cleared.', keepOneTab: 'Keep at least one tab', + notCanTab: 'Cannot add more tabs', }, ssh: { autoStart: 'Auto start', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index ba5a57e9a..30c8111c5 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -1454,6 +1454,7 @@ const message = { cancelUpload: 'アップロードをキャンセル', cancelUploadHelper: 'アップロードをキャンセルするかどうか、キャンセル後、アップロードリストはクリアされます。', keepOneTab: '少なくとも1つのタブを保持してください', + notCanTab: 'これ以上タブを追加できません', }, ssh: { autoStart: 'オートスタート', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index 34b1de9b7..53c7569f0 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -1439,6 +1439,7 @@ const message = { cancelUpload: '업로드 취소', cancelUploadHelper: '업로드를 취소할지 여부, 취소 후 업로드 목록이 비워집니다.', keepOneTab: '최소한 하나의 탭을 유지하세요', + notCanTab: '더 이상 탭을 추가할 수 없습니다', }, ssh: { autoStart: '자동 시작', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index bb07bbeb8..4105d3782 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -1497,6 +1497,7 @@ const message = { cancelUploadHelper: 'Adakah hendak membatalkan muat naik, selepas pembatalan senarai muat naik akan dikosongkan.', keepOneTab: 'Pastikan sekurang-kurangnya satu tab dikekalkan', + notCanTab: 'Tidak dapat menambah tab lagi', }, ssh: { autoStart: 'Mula automatik', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index a0f8974ba..0a5aea7fb 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -1484,6 +1484,7 @@ const message = { cancelUpload: 'Cancelar Upload', cancelUploadHelper: 'Deseja cancelar o upload, após o cancelamento, a lista de upload será limpa.', keepOneTab: 'Mantenha pelo menos uma aba', + notCanTab: 'Não é possível adicionar mais abas', }, ssh: { autoStart: 'Início automático', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 699299a43..6ef9b819b 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -1485,6 +1485,7 @@ const message = { cancelUpload: 'Отменить загрузку', cancelUploadHelper: 'Отменить загрузку или нет, после отмены список загрузок будет очищен.', keepOneTab: 'Необходимо оставить как минимум одну вкладку', + notCanTab: 'Невозможно добавить больше вкладок', }, ssh: { autoStart: 'Автозапуск', diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index 5dff21d2e..f2107911e 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -1527,6 +1527,7 @@ const message = { cancelUpload: 'Yüklemeyi İptal Et', cancelUploadHelper: 'Yüklemeyi iptal etmek ister misiniz, iptal sonrası yükleme listesi temizlenecektir.', keepOneTab: 'En az bir sekme açık kalmalıdır', + notCanTab: 'Daha fazla sekme eklenemez', }, ssh: { autoStart: 'Otomatik başlat', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 9a20a4dc3..e504a2143 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -1439,6 +1439,7 @@ const message = { cancelUpload: '取消上傳', cancelUploadHelper: '是否取消上傳,取消後將清空上傳列表', keepOneTab: '至少保留一個標籤頁', + notCanTab: '無法新增更多標籤頁', }, ssh: { autoStart: '開機自啟', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index c76044e9d..ccbf62e7d 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -1434,6 +1434,7 @@ const message = { cancelUpload: '取消上传', cancelUploadHelper: '是否取消上传,取消后将清空上传列表', keepOneTab: '至少保留一个标签页', + notCanTab: '不可增加更多的标签页', }, ssh: { autoStart: '开机自启', diff --git a/frontend/src/styles/element-dark.scss b/frontend/src/styles/element-dark.scss index 2f4a51674..eab19414b 100644 --- a/frontend/src/styles/element-dark.scss +++ b/frontend/src/styles/element-dark.scss @@ -155,6 +155,7 @@ html.dark { .el-tabs--card > .el-tabs__header .el-tabs__nav { border: 1px solid var(--panel-main-bg-color-8); + border-bottom: none; } .el-tabs--card > .el-tabs__header .el-tabs__item.is-active { diff --git a/frontend/src/styles/element.scss b/frontend/src/styles/element.scss index dcbbe55da..84ff0b083 100644 --- a/frontend/src/styles/element.scss +++ b/frontend/src/styles/element.scss @@ -257,6 +257,10 @@ html { } } +.el-tabs--card > .el-tabs__header .el-tabs__item.is-active { + border-bottom-color: var(--panel-color-primary) !important; +} + .logo { color: var(--el-color-primary); } diff --git a/frontend/src/views/host/file-management/hooks/searchable.ts b/frontend/src/views/host/file-management/hooks/searchable.ts index 991b59f06..91f4d353a 100644 --- a/frontend/src/views/host/file-management/hooks/searchable.ts +++ b/frontend/src/views/host/file-management/hooks/searchable.ts @@ -53,3 +53,42 @@ export function useSearchableForSelect(paths) { searchableInputBlur, }; } + +export function useMultipleSearchable(paths) { + const searchableStatus = ref(false); + const searchablePath = ref(''); + const searchableInputRefs = ref>({}); + + const setSearchableInputRef = (id: string, el: HTMLInputElement | null) => { + if (el) { + searchableInputRefs.value[id] = el; + } else { + delete searchableInputRefs.value[id]; + } + }; + + watch(searchableStatus, (val) => { + if (val) { + searchablePath.value = paths.value.at(-1)?.url || ''; + nextTick(() => { + const keys = Object.keys(searchableInputRefs.value); + if (keys.length > 0) { + const lastKey = keys[keys.length - 1]; + searchableInputRefs.value[lastKey]?.focus(); + } + }); + } + }); + + const searchableInputBlur = () => { + searchableStatus.value = false; + }; + + return { + searchableStatus, + searchablePath, + searchableInputRefs, + setSearchableInputRef, + searchableInputBlur, + }; +} diff --git a/frontend/src/views/host/file-management/index.vue b/frontend/src/views/host/file-management/index.vue index 0b73efb7d..cc8bb4c08 100644 --- a/frontend/src/views/host/file-management/index.vue +++ b/frontend/src/views/host/file-management/index.vue @@ -1,371 +1,365 @@