fix: 修复标签栏排序错乱问题

This commit is contained in:
Baobhan Sith
2025-05-13 19:35:05 +08:00
parent 13066c8b71
commit 97df12f8a7
4 changed files with 47 additions and 6 deletions
@@ -293,6 +293,10 @@ onBeforeUnmount(() => {
const handleSessionsUpdate = (newSessions: SessionTabInfoWithStatus[]) => { const handleSessionsUpdate = (newSessions: SessionTabInfoWithStatus[]) => {
// v-model handles updating draggableSessions.value automatically // v-model handles updating draggableSessions.value automatically
emit('update:sessions', newSessions); emit('update:sessions', newSessions);
// 保存用户自定义顺序到本地存储
const sessionOrder = newSessions.map(session => session.sessionId);
localStorage.setItem('sessionOrder', JSON.stringify(sessionOrder));
console.log('[TabBar] 已保存用户自定义标签顺序到本地存储');
}; };
const toggleHeader = () => { const toggleHeader = () => {
if (isWorkspaceRoute.value) { if (isWorkspaceRoute.value) {
@@ -64,6 +64,7 @@ export const openNewSession = (
activeEditorTabId: ref(null), activeEditorTabId: ref(null),
commandInputContent: ref(''), commandInputContent: ref(''),
isMarkedForSuspend: false, isMarkedForSuspend: false,
createdAt: Date.now(),
disposables: [], disposables: [],
}; };
@@ -13,12 +13,47 @@ export const sessionTabs = computed(() => {
// 包含状态的标签页信息 // 包含状态的标签页信息
export const sessionTabsWithStatus = computed((): SessionTabInfoWithStatus[] => { export const sessionTabsWithStatus = computed((): SessionTabInfoWithStatus[] => {
return Array.from(sessions.value.values()).map(session => ({ const sessionOrderStr = localStorage.getItem('sessionOrder');
sessionId: session.sessionId, let sessionOrder: string[] = [];
connectionName: session.connectionName, if (sessionOrderStr) {
status: session.wsManager.connectionStatus.value, // 从 wsManager 获取状态 try {
isMarkedForSuspend: session.isMarkedForSuspend, 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 => { export const activeSession = computed((): SessionState | null => {
@@ -43,6 +43,7 @@ export interface SessionState {
commandInputContent: Ref<string>; // 当前会话的命令输入框内容 commandInputContent: Ref<string>; // 当前会话的命令输入框内容
isResuming?: boolean; // 标记会话是否正在从挂起状态恢复 isResuming?: boolean; // 标记会话是否正在从挂起状态恢复
isMarkedForSuspend?: boolean; // +++ 标记会话是否已被用户请求标记为待挂起 +++ isMarkedForSuspend?: boolean; // +++ 标记会话是否已被用户请求标记为待挂起 +++
createdAt: number; // 记录会话创建的时间戳,用于排序
disposables?: (() => void)[]; // 用于存储清理函数,例如取消注册消息处理器 disposables?: (() => void)[]; // 用于存储清理函数,例如取消注册消息处理器
pendingOutput?: string[]; // 用于暂存恢复会话时,在终端实例准备好之前收到的输出 pendingOutput?: string[]; // 用于暂存恢复会话时,在终端实例准备好之前收到的输出
} }