From ae52a556d9b2ff7fcd80220fda77b599afbe6d63 Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Fri, 2 Feb 2024 01:07:03 +0800 Subject: [PATCH] =?UTF-8?q?:hammer:=20=E9=87=8D=E6=9E=84=E7=BB=88=E7=AB=AF?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/ErrorMessage.java | 2 + .../handler/TerminalCheckHandler.java | 7 +- .../main/resources/theme/terminal.theme.json | 14 -- .../asset/meta/TerminalThemeGenerator.java | 27 --- orion-ops-ui/src/api/asset/host-terminal.ts | 1 - .../assets/style/host-terminal-layout.less | 28 ++- .../src/store/modules/terminal/index.ts | 39 ++-- .../src/store/modules/terminal/types.ts | 4 +- .../components/layout/layout-header.vue | 35 +++- .../components/layout/main-content.vue | 24 +-- .../components/layout/terminal-panel-view.vue | 17 -- .../components/layout/terminal-panel.vue | 186 ++++++++++++++++++ .../layout/terminal-panels-view.vue | 37 ++++ .../shortcut/terminal-shortcut-setting.vue | 2 +- .../components/xterm/terminal-view.vue | 8 +- .../handler/terminal-panel-manager.ts | 41 ++++ .../terminal/handler/terminal-tab-manager.ts | 8 +- .../src/views/host/terminal/index.vue | 1 - .../host/terminal/types/terminal.const.ts | 16 +- .../host/terminal/types/terminal.type.ts | 35 +++- 20 files changed, 413 insertions(+), 119 deletions(-) delete mode 100644 orion-ops-ui/src/views/host/terminal/components/layout/terminal-panel-view.vue create mode 100644 orion-ops-ui/src/views/host/terminal/components/layout/terminal-panel.vue create mode 100644 orion-ops-ui/src/views/host/terminal/components/layout/terminal-panels-view.vue create mode 100644 orion-ops-ui/src/views/host/terminal/handler/terminal-panel-manager.ts diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ErrorMessage.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ErrorMessage.java index 715e246c..65384894 100644 --- a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ErrorMessage.java +++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/ErrorMessage.java @@ -75,4 +75,6 @@ public interface ErrorMessage { String SESSION_ABSENT = "会话不存在"; + String CONNECT_ERROR = "连接失败"; + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java index 97ca4c11..d2e88174 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalCheckHandler.java @@ -1,5 +1,7 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; +import com.orion.lang.exception.argument.InvalidArgumentException; +import com.orion.lang.utils.Exceptions; import com.orion.lang.utils.collect.Maps; import com.orion.ops.framework.biz.operator.log.core.service.OperatorLogFrameworkService; import com.orion.ops.framework.biz.operator.log.core.uitls.OperatorLogFiller; @@ -79,9 +81,12 @@ public class TerminalCheckHandler extends AbstractTerminalHandler 255) { - c = 255; - } - newColor.append(Strings.leftPad(Integer.toString(c, 16), 2, "0")); - } - return newColor.toString(); - } - } diff --git a/orion-ops-ui/src/api/asset/host-terminal.ts b/orion-ops-ui/src/api/asset/host-terminal.ts index 02543077..cd12c1f1 100644 --- a/orion-ops-ui/src/api/asset/host-terminal.ts +++ b/orion-ops-ui/src/api/asset/host-terminal.ts @@ -4,7 +4,6 @@ import axios from 'axios'; export interface TerminalTheme { name: string; dark: boolean; - headerBackgroundColor: string; schema: TerminalThemeSchema; } diff --git a/orion-ops-ui/src/assets/style/host-terminal-layout.less b/orion-ops-ui/src/assets/style/host-terminal-layout.less index 6f3667fc..959ad1ec 100644 --- a/orion-ops-ui/src/assets/style/host-terminal-layout.less +++ b/orion-ops-ui/src/assets/style/host-terminal-layout.less @@ -1,7 +1,8 @@ // 亮色主题配色常量 body { --color-bg-header: #232323; - --color-bg-sidebar: #F2F3F4; + --color-bg-sidebar: #EBECED; + --color-bg-panel: var(--color-bg-sidebar); --color-bg-content: #FEFEFE; --color-sidebar-icon: #737070; --color-sidebar-icon-bg: #D7D8DB; @@ -11,6 +12,14 @@ body { --color-content-text-1: rgba(0, 0, 0, .8); --color-content-text-2: rgba(0, 0, 0, .85); --color-content-text-3: rgba(0, 0, 0, .95); + --color-bg-panel-tabs: var(--color-bg-panel); + --color-bg-panel-tabs-active: #F9F9F9; + --color-bg-panel-icon-1: #F5F5F5; + --color-bg-panel-bar: #F3F4F5; + --color-panel-text-1: var(--color-content-text-1); + --color-panel-text-2: var(--color-content-text-3); + --color-panel-gradient-start: rgba(218, 218, 218, 1); + --color-panel-gradient-end: rgba(218, 218, 218, 0); --search-bg-focus: rgba(234, 234, 234, .75); --search-bg: rgba(234, 234, 234, .95); --search-color-text: #0E0E0E; @@ -25,6 +34,7 @@ body { body[terminal-theme='dark'] { --color-bg-header: #232323; --color-bg-sidebar: #2C2E31; + --color-bg-panel: var(--color-bg-sidebar); --color-bg-content: #1A1B1C; --color-sidebar-icon: #C3C6C9; --color-sidebar-icon-bg: #3D3E3F; @@ -34,6 +44,14 @@ body[terminal-theme='dark'] { --color-content-text-1: rgba(255, 255, 255, .8); --color-content-text-2: rgba(255, 255, 255, .85); --color-content-text-3: rgba(255, 255, 255, .95); + --color-bg-panel-tabs: var(--color-bg-panel); + --color-bg-panel-tabs-active: #434343; + --color-bg-panel-icon-1: var(--color-bg-panel-tabs-active); + --color-bg-panel-bar: #323538; + --color-panel-text-1: var(--color-content-text-1); + --color-panel-text-2: var(--color-content-text-3); + --color-panel-gradient-start: rgba(38, 38, 38, 1); + --color-panel-gradient-end: rgba(38, 38, 38, 0); --search-bg: rgba(12, 12, 12, .75); --search-bg-focus: rgba(12, 12, 12, .95); --search-color-text: #E0E0E0; @@ -47,14 +65,14 @@ body[terminal-theme='dark'] { // 布局常量 .host-terminal-layout { --header-height: 44px; + --panel-nav-height: 40px; --sidebar-width: 44px; --sidebar-icon-wrapper-size: var(--header-height); --sidebar-icon-size: 32px; --sidebar-icon-font-size: 22px; - - --color-bg-header-icon-1: #434343; - --color-header-tabs-bg: var(--color-bg-header); - --color-header-tabs-bg-hover: #434343; + --color-bg-header-tabs: var(--color-bg-header); + --color-bg-header-tabs-active: #434343; + --color-bg-header-icon-1: var(--color-bg-header-tabs-active); --color-header-text-1: rgba(255, 255, 255, .75); --color-header-text-2: rgba(255, 255, 255, .9); --color-gradient-start: rgba(38, 38, 38, 1); diff --git a/orion-ops-ui/src/store/modules/terminal/index.ts b/orion-ops-ui/src/store/modules/terminal/index.ts index 925dc4d3..2a2871ad 100644 --- a/orion-ops-ui/src/store/modules/terminal/index.ts +++ b/orion-ops-ui/src/store/modules/terminal/index.ts @@ -17,9 +17,10 @@ import { defineStore } from 'pinia'; import { getPreference, updatePreference } from '@/api/user/preference'; import { nextSessionId } from '@/utils'; import { Message } from '@arco-design/web-vue'; -import { TerminalTabs } from '@/views/host/terminal/types/terminal.const'; +import { TerminalPanelTabType, TerminalTabs } from '@/views/host/terminal/types/terminal.const'; import TerminalTabManager from '@/views/host/terminal/handler/terminal-tab-manager'; import TerminalSessionManager from '@/views/host/terminal/handler/terminal-session-manager'; +import TerminalPanelManager from '@/views/host/terminal/handler/terminal-panel-manager'; // 终端偏好项 export const TerminalPreferenceItem = { @@ -63,7 +64,7 @@ export default defineStore('terminal', { }, hosts: {} as AuthorizedHostQueryResponse, tabManager: new TerminalTabManager(TerminalTabs.NEW_CONNECTION), - routerTabManager: [new TerminalTabManager()], + panelManager: new TerminalPanelManager(), sessionManager: new TerminalSessionManager() }), @@ -137,43 +138,57 @@ export default defineStore('terminal', { // 切换到终端面板页面 this.tabManager.openTab(TerminalTabs.TERMINAL_PANEL); // 获取 seq - const tabSeqArr = this.tabManager.items + const seqArr = this.panelManager + .getPanel(panelIndex) + .items .map(s => s.seq) .filter(Boolean) .map(Number); - const nextSeq = tabSeqArr.length - ? Math.max(...tabSeqArr) + 1 + const nextSeq = seqArr.length + ? Math.max(...seqArr) + 1 : 1; - // FIXME // 打开 tab - this.tabManager.openTab({ + this.panelManager.getPanel(panelIndex).openTab({ key: nextSessionId(10), seq: nextSeq, title: `(${nextSeq}) ${record.alias || record.name}`, hostId: record.id, - address: record.address + address: record.address, + icon: 'icon-desktop', + type: TerminalPanelTabType.TERMINAL }); }, // 复制并且打开终端 - openCopyTerminal(hostId: number) { + openCopyTerminal(hostId: number, panelIndex: number = 0) { const host = this.hosts.hostList .find(s => s.id === hostId); if (host) { - this.openTerminal(host); + this.openTerminal(host, panelIndex); } }, // 获取当前终端会话 getCurrentTerminalSession(tips: boolean = true) { + // 获取当前 tab const tab = this.tabManager.getCurrentTab(); - // FIXME - if (!tab || tab.type !== 'TERMINAL') { + if (!tab || tab.key !== TerminalTabs.TERMINAL_PANEL.key) { if (tips) { Message.warning('请切换到终端标签页'); } return; } + // 获取面板会话 + const activeTab = this.panelManager + .getCurrentPanel() + .getCurrentTab(); + if (!activeTab || activeTab.type !== TerminalPanelTabType.TERMINAL) { + if (tips) { + Message.warning('请打开终端'); + } + return; + } + // 获取会话 return this.sessionManager.getSession(tab.key); }, diff --git a/orion-ops-ui/src/store/modules/terminal/types.ts b/orion-ops-ui/src/store/modules/terminal/types.ts index 9dac7a70..87950e3c 100644 --- a/orion-ops-ui/src/store/modules/terminal/types.ts +++ b/orion-ops-ui/src/store/modules/terminal/types.ts @@ -1,4 +1,4 @@ -import type { ITerminalSessionManager, ITerminalTabManager } from '@/views/host/terminal/types/terminal.type'; +import type { ITerminalPanelManager, ITerminalSessionManager, ITerminalTabManager } from '@/views/host/terminal/types/terminal.type'; import type { AuthorizedHostQueryResponse } from '@/api/asset/asset-authorized-data'; import type { TerminalTheme } from '@/api/asset/host-terminal'; @@ -6,7 +6,7 @@ export interface TerminalState { preference: TerminalPreference; hosts: AuthorizedHostQueryResponse; tabManager: ITerminalTabManager; - routerTabManager: Array; + panelManager: ITerminalPanelManager; sessionManager: ITerminalSessionManager; } diff --git a/orion-ops-ui/src/views/host/terminal/components/layout/layout-header.vue b/orion-ops-ui/src/views/host/terminal/components/layout/layout-header.vue index 8f49faeb..4085f459 100644 --- a/orion-ops-ui/src/views/host/terminal/components/layout/layout-header.vue +++ b/orion-ops-ui/src/views/host/terminal/components/layout/layout-header.vue @@ -18,8 +18,17 @@ @tab-click="k => tabManager.clickTab(k as string)" @delete="k => tabManager.deleteTab(k as string)"> + :key="tab.key"> + + + @@ -45,6 +54,7 @@ import { computed } from 'vue'; import { useTerminalStore } from '@/store'; import IconActions from '../layout/icon-actions.vue'; + import DictKeySelector from '@/components/system/dict-key/dict-key-selector.vue'; const { isFullscreen, toggle: toggleFullScreen } = useFullscreen(); const { tabManager } = useTerminalStore(); @@ -118,6 +128,16 @@ } } + .tab-title-wrapper { + display: flex; + align-items: center; + + .tab-title-icon { + font-size: 16px; + margin-right: 4px; + } + } + :deep(.arco-tabs-nav) { height: 100%; @@ -151,7 +171,7 @@ margin: 0; padding: 0; color: var(--color-header-text-1); - background: var(--color-header-tabs-bg); + background: var(--color-bg-header-tabs); position: relative; &:hover { @@ -177,8 +197,9 @@ .arco-tabs-tab-title { padding: 11px 18px; - background: var(--color-header-tabs-bg); - font-size: 12px; + background: var(--color-bg-header-tabs); + font-size: 14px; + height: var(--header-height); display: flex; align-items: center; @@ -213,11 +234,11 @@ } :deep(.arco-tabs-tab-active) { - background: var(--color-header-tabs-bg-hover); + background: var(--color-bg-header-tabs-active); color: var(--color-header-text-2) !important; .arco-tabs-tab-title { - background: var(--color-header-tabs-bg-hover); + background: var(--color-bg-header-tabs-active); } &:hover::after { diff --git a/orion-ops-ui/src/views/host/terminal/components/layout/main-content.vue b/orion-ops-ui/src/views/host/terminal/components/layout/main-content.vue index 6a57ebe1..c6093745 100644 --- a/orion-ops-ui/src/views/host/terminal/components/layout/main-content.vue +++ b/orion-ops-ui/src/views/host/terminal/components/layout/main-content.vue @@ -2,7 +2,8 @@
+ v-model:active-key="tabManager.active" + class="main-tabs"> @@ -16,8 +17,8 @@ - - + + @@ -42,11 +43,11 @@ import TerminalThemeSetting from '../setting/theme/terminal-theme-setting.vue'; import TerminalGeneralSetting from '../setting/general/terminal-general-setting.vue'; import TerminalShortcutSetting from '../setting/shortcut/terminal-shortcut-setting.vue'; - import TerminalPanelView from '@/views/host/terminal/components/layout/terminal-panel-view.vue'; + import TerminalPanelsView from '@/views/host/terminal/components/layout/terminal-panels-view.vue'; const { preference, tabManager, sessionManager } = useTerminalStore(); - // fixme TerminalTabType.TERMINAL + // fixme title逻辑 失焦逻辑 // 监听 tab 修改 watch(() => tabManager.active, (active, before) => { if (before) { @@ -58,11 +59,10 @@ } if (active) { // 获取 activeTab - const activeTab = tabManager.items.find(s => s.key === active); + const activeTab = tabManager.getCurrentTab(); if (!activeTab) { return; } - console.log(activeTab.title); // 修改标题 document.title = activeTab.title; // 终端自动聚焦 @@ -78,8 +78,8 @@ // 处理快捷键逻辑 const handlerKeyboard = (event: Event) => { // 当前页面非 terminal 的时候再触发快捷键 (terminal 有内置逻辑) - if (tabManager.active - && tabManager.items.find(s => s.key === tabManager.active)?.type === 'TerminalTabType.TERMINAL') { + // fixme panel 无数据继续触发 + if (tabManager.getCurrentTab()?.key === TerminalTabs.TERMINAL_PANEL.key) { return; } const e = event as KeyboardEvent; @@ -140,15 +140,15 @@ height: 100%; position: relative; - :deep(.arco-tabs) { + :deep(.main-tabs) { width: 100%; height: 100%; - .arco-tabs-nav { + > .arco-tabs-nav { display: none; } - .arco-tabs-content { + > .arco-tabs-content { padding: 0; width: 100%; height: 100%; diff --git a/orion-ops-ui/src/views/host/terminal/components/layout/terminal-panel-view.vue b/orion-ops-ui/src/views/host/terminal/components/layout/terminal-panel-view.vue deleted file mode 100644 index 8ecffcee..00000000 --- a/orion-ops-ui/src/views/host/terminal/components/layout/terminal-panel-view.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - diff --git a/orion-ops-ui/src/views/host/terminal/components/layout/terminal-panel.vue b/orion-ops-ui/src/views/host/terminal/components/layout/terminal-panel.vue new file mode 100644 index 00000000..5c66befe --- /dev/null +++ b/orion-ops-ui/src/views/host/terminal/components/layout/terminal-panel.vue @@ -0,0 +1,186 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/host/terminal/components/layout/terminal-panels-view.vue b/orion-ops-ui/src/views/host/terminal/components/layout/terminal-panels-view.vue new file mode 100644 index 00000000..5119f50e --- /dev/null +++ b/orion-ops-ui/src/views/host/terminal/components/layout/terminal-panels-view.vue @@ -0,0 +1,37 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/host/terminal/components/setting/shortcut/terminal-shortcut-setting.vue b/orion-ops-ui/src/views/host/terminal/components/setting/shortcut/terminal-shortcut-setting.vue index 25501fd3..c8c0c3fd 100644 --- a/orion-ops-ui/src/views/host/terminal/components/setting/shortcut/terminal-shortcut-setting.vue +++ b/orion-ops-ui/src/views/host/terminal/components/setting/shortcut/terminal-shortcut-setting.vue @@ -21,7 +21,7 @@ @save="savePreference" />
-
+
@@ -161,7 +158,7 @@ .terminal-container { width: 100%; - height: calc(100vh - var(--header-height)); + height: calc(100vh - var(--header-height) - var(--panel-nav-height)); position: relative; } @@ -172,6 +169,7 @@ display: flex; align-items: center; justify-content: space-between; + background: var(--color-bg-panel-bar); &-left, &-right { display: flex; diff --git a/orion-ops-ui/src/views/host/terminal/handler/terminal-panel-manager.ts b/orion-ops-ui/src/views/host/terminal/handler/terminal-panel-manager.ts new file mode 100644 index 00000000..ac551e22 --- /dev/null +++ b/orion-ops-ui/src/views/host/terminal/handler/terminal-panel-manager.ts @@ -0,0 +1,41 @@ +import type { ITerminalPanelManager, TerminalPanelTabItem } from '../types/terminal.type'; +import TerminalTabManager from '../handler/terminal-tab-manager'; + +// 终端面板管理器实现 +export default class TerminalPanelManager implements ITerminalPanelManager { + + // 当前面板 + active: number; + // 面板列表 + panels: Array>; + + constructor() { + this.active = 0; + this.panels = [new TerminalTabManager()]; + } + + // 获取当前面板 + getCurrentPanel(): TerminalTabManager { + return this.panels[this.active]; + } + + // 设置当前面板 + setCurrentPanel(active: number): void { + this.active = active; + }; + + // 获取面板 + getPanel(index: number): TerminalTabManager { + return this.panels[index]; + }; + + // 重置 + reset() { + for (let panel of this.panels) { + panel.clear(); + } + this.active = 0; + this.panels = [new TerminalTabManager()]; + }; + +} diff --git a/orion-ops-ui/src/views/host/terminal/handler/terminal-tab-manager.ts b/orion-ops-ui/src/views/host/terminal/handler/terminal-tab-manager.ts index 9549af0a..19e2b800 100644 --- a/orion-ops-ui/src/views/host/terminal/handler/terminal-tab-manager.ts +++ b/orion-ops-ui/src/views/host/terminal/handler/terminal-tab-manager.ts @@ -1,13 +1,13 @@ import type { ITerminalTabManager, TerminalTabItem } from '../types/terminal.type'; // 终端 tab 管理器实现 -export default class TerminalTabManager implements ITerminalTabManager { +export default class TerminalTabManagerm implements ITerminalTabManager { public active: string; - public items: Array; + public items: Array; - constructor(def: TerminalTabItem | undefined = undefined) { + constructor(def: T | undefined = undefined) { if (def) { this.active = def.key; this.items = [def]; @@ -45,7 +45,7 @@ export default class TerminalTabManager implements ITerminalTabManager { } // 打开 tab - openTab(tab: TerminalTabItem): void { + openTab(tab: T): void { // 不存在则创建 tab if (!this.items.find(s => s.key === tab.key)) { this.items.push(tab); diff --git a/orion-ops-ui/src/views/host/terminal/index.vue b/orion-ops-ui/src/views/host/terminal/index.vue index b90dabf5..05126c3c 100644 --- a/orion-ops-ui/src/views/host/terminal/index.vue +++ b/orion-ops-ui/src/views/host/terminal/index.vue @@ -130,7 +130,6 @@ width: var(--sidebar-width); height: 100%; background: var(--color-bg-sidebar); - border-top: 1px solid var(--color-bg-content); overflow: hidden; } diff --git a/orion-ops-ui/src/views/host/terminal/types/terminal.const.ts b/orion-ops-ui/src/views/host/terminal/types/terminal.const.ts index d243202b..3f64df05 100644 --- a/orion-ops-ui/src/views/host/terminal/types/terminal.const.ts +++ b/orion-ops-ui/src/views/host/terminal/types/terminal.const.ts @@ -52,6 +52,12 @@ export const ExtraSshAuthType = { CUSTOM_IDENTITY: 'CUSTOM_IDENTITY', }; +// 终端面板 tab 类型 +export const TerminalPanelTabType = { + TERMINAL: 'terminal', + SFTP: 'sftp', +}; + // 终端状态 export const TerminalStatus = { // 连接中 @@ -125,7 +131,7 @@ export const ActionBarItems = [ // 终端快捷键操作类型 export const TerminalShortcutType = { - SYSTEM: 1, + TAB: 1, TERMINAL: 2 }; @@ -146,19 +152,19 @@ export const TerminalShortcutItems: Array = [ { item: TerminalShortcutKeys.CHANGE_TO_PREV_TAB, content: '切换为前一个 tab', - type: TerminalShortcutType.SYSTEM + type: TerminalShortcutType.TAB }, { item: TerminalShortcutKeys.CHANGE_TO_NEXT_TAB, content: '切换为后一个 tab', - type: TerminalShortcutType.SYSTEM + type: TerminalShortcutType.TAB }, { item: TerminalShortcutKeys.CLOSE_TAB, content: '关闭当前 tab', - type: TerminalShortcutType.SYSTEM + type: TerminalShortcutType.TAB }, { item: TerminalShortcutKeys.OPEN_NEW_CONNECT_TAB, content: '打开新建连接 tab', - type: TerminalShortcutType.SYSTEM + type: TerminalShortcutType.TAB }, { item: 'openCopyTerminalTab', content: '复制当前终端 tab', diff --git a/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts b/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts index 05c5ffae..71305522 100644 --- a/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts +++ b/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts @@ -12,11 +12,19 @@ import type { HostQueryResponse } from '@/api/asset/host'; export interface TerminalTabItem { key: string; title: string; - icon?: string; + icon: string; [key: string]: unknown; } +// 终端面板 tab 元素 +export interface TerminalPanelTabItem extends TerminalTabItem { + seq: number; + hostId: number; + address: string; + type: string; +} + // sidebar 操作类型 export interface SidebarAction { icon: string; @@ -90,20 +98,20 @@ export interface TerminalDomRef { } // 终端 tab 管理器定义 -export interface ITerminalTabManager { +export interface ITerminalTabManager { // 当前 tab active: string; // 全部 tab - items: Array; + items: Array; // 获取当前 tab - getCurrentTab: () => TerminalTabItem | undefined; + getCurrentTab: () => T | undefined; // 点击 tab clickTab: (key: string) => void; // 删除 tab deleteTab: (key: string) => void; // 打开 tab - openTab: (tab: TerminalTabItem) => void; + openTab: (tab: T) => void; // 切换到前一个 tab changeToPrevTab: () => void; // 切换到后一个 tab @@ -114,6 +122,23 @@ export interface ITerminalTabManager { clear: () => void; } +// 终端面板管理器定义 +export interface ITerminalPanelManager { + // 当前面板 + active: number; + // 面板列表 + panels: Array>; + + // 获取当前面板 + getCurrentPanel: () => ITerminalTabManager; + // 设置当前面板 + setCurrentPanel: (active: number) => void; + // 获取面板 + getPanel: (index: number) => ITerminalTabManager; + // 重置 + reset: () => void; +} + // 终端会话管理器定义 export interface ITerminalSessionManager { // 打开终端会话