From 97df12f8a71d572dfb5b28b3c430a2426e7d762f Mon Sep 17 00:00:00 2001 From: Baobhan Sith <80159437+Heavrnl@users.noreply.github.com> Date: Tue, 13 May 2025 19:35:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E6=A0=8F=E6=8E=92=E5=BA=8F=E9=94=99=E4=B9=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/TerminalTabBar.vue | 4 ++ .../stores/session/actions/sessionActions.ts | 1 + .../frontend/src/stores/session/getters.ts | 47 ++++++++++++++++--- packages/frontend/src/stores/session/types.ts | 1 + 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/packages/frontend/src/components/TerminalTabBar.vue b/packages/frontend/src/components/TerminalTabBar.vue index 309a45b..02236ce 100644 --- a/packages/frontend/src/components/TerminalTabBar.vue +++ b/packages/frontend/src/components/TerminalTabBar.vue @@ -293,6 +293,10 @@ onBeforeUnmount(() => { const handleSessionsUpdate = (newSessions: SessionTabInfoWithStatus[]) => { // v-model handles updating draggableSessions.value automatically emit('update:sessions', newSessions); + // 保存用户自定义顺序到本地存储 + const sessionOrder = newSessions.map(session => session.sessionId); + localStorage.setItem('sessionOrder', JSON.stringify(sessionOrder)); + console.log('[TabBar] 已保存用户自定义标签顺序到本地存储'); }; const toggleHeader = () => { if (isWorkspaceRoute.value) { diff --git a/packages/frontend/src/stores/session/actions/sessionActions.ts b/packages/frontend/src/stores/session/actions/sessionActions.ts index 7775749..c4b1602 100644 --- a/packages/frontend/src/stores/session/actions/sessionActions.ts +++ b/packages/frontend/src/stores/session/actions/sessionActions.ts @@ -64,6 +64,7 @@ export const openNewSession = ( activeEditorTabId: ref(null), commandInputContent: ref(''), isMarkedForSuspend: false, + createdAt: Date.now(), disposables: [], }; diff --git a/packages/frontend/src/stores/session/getters.ts b/packages/frontend/src/stores/session/getters.ts index 4fabce3..600ce02 100644 --- a/packages/frontend/src/stores/session/getters.ts +++ b/packages/frontend/src/stores/session/getters.ts @@ -13,12 +13,47 @@ export const sessionTabs = computed(() => { // 包含状态的标签页信息 export const sessionTabsWithStatus = computed((): SessionTabInfoWithStatus[] => { - return Array.from(sessions.value.values()).map(session => ({ - sessionId: session.sessionId, - connectionName: session.connectionName, - status: session.wsManager.connectionStatus.value, // 从 wsManager 获取状态 - isMarkedForSuspend: session.isMarkedForSuspend, - })); + const sessionOrderStr = localStorage.getItem('sessionOrder'); + let sessionOrder: string[] = []; + if (sessionOrderStr) { + try { + sessionOrder = JSON.parse(sessionOrderStr); + console.log('[SessionGetters] 使用本地存储的用户自定义标签顺序'); + } catch (e) { + console.error('[SessionGetters] 解析本地存储的标签顺序失败:', e); + sessionOrder = []; + } + } + + const sessionList = Array.from(sessions.value.values()); + if (sessionOrder.length > 0) { + // 按照用户自定义顺序排序 + return sessionList + .sort((a, b) => { + const indexA = sessionOrder.indexOf(a.sessionId); + const indexB = sessionOrder.indexOf(b.sessionId); + if (indexA === -1 && indexB === -1) return a.createdAt - b.createdAt; + if (indexA === -1) return 1; + if (indexB === -1) return -1; + return indexA - indexB; + }) + .map(session => ({ + sessionId: session.sessionId, + connectionName: session.connectionName, + status: session.wsManager.connectionStatus.value, // 从 wsManager 获取状态 + isMarkedForSuspend: session.isMarkedForSuspend, + })); + } else { + // 如果没有自定义顺序,则按照创建时间排序 + return sessionList + .sort((a, b) => a.createdAt - b.createdAt) + .map(session => ({ + sessionId: session.sessionId, + connectionName: session.connectionName, + status: session.wsManager.connectionStatus.value, // 从 wsManager 获取状态 + isMarkedForSuspend: session.isMarkedForSuspend, + })); + } }); export const activeSession = computed((): SessionState | null => { diff --git a/packages/frontend/src/stores/session/types.ts b/packages/frontend/src/stores/session/types.ts index dcc6162..c6e6501 100644 --- a/packages/frontend/src/stores/session/types.ts +++ b/packages/frontend/src/stores/session/types.ts @@ -43,6 +43,7 @@ export interface SessionState { commandInputContent: Ref; // 当前会话的命令输入框内容 isResuming?: boolean; // 标记会话是否正在从挂起状态恢复 isMarkedForSuspend?: boolean; // +++ 标记会话是否已被用户请求标记为待挂起 +++ + createdAt: number; // 记录会话创建的时间戳,用于排序 disposables?: (() => void)[]; // 用于存储清理函数,例如取消注册消息处理器 pendingOutput?: string[]; // 用于暂存恢复会话时,在终端实例准备好之前收到的输出 }