From 02b3ee053dbe52315259541f66469e8bac33e8cb Mon Sep 17 00:00:00 2001 From: Vantz Stockwell Date: Tue, 24 Mar 2026 21:30:20 -0400 Subject: [PATCH] feat: connection status indicators + draggable tab reordering Status indicators: - Session.status field tracks connected/disconnected state - Listens for ssh:close and ssh:exit backend events - Tab dot turns red when connection drops (green=SSH, blue=RDP, red=dead) Draggable tabs: - HTML5 drag-and-drop on tab buttons - Blue left-border indicator shows drop target - moveSession() in store reorders the sessions array Co-Authored-By: Claude Opus 4.6 (1M context) --- src/components/session/TabBadge.vue | 11 +++++---- src/components/session/TabBar.vue | 36 ++++++++++++++++++++++++++++- src/stores/session.store.ts | 28 ++++++++++++++++++++++ 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/components/session/TabBadge.vue b/src/components/session/TabBadge.vue index 221b3db..f1a6158 100644 --- a/src/components/session/TabBadge.vue +++ b/src/components/session/TabBadge.vue @@ -36,12 +36,15 @@ const props = defineProps<{ username?: string; /** Raw tags from the connection record. */ tags?: string[]; + /** Connection status — drives the dot colour. */ + status?: "connected" | "disconnected"; }>(); -/** Green for SSH, blue for RDP. */ -const protocolDotClass = computed(() => - props.protocol === "ssh" ? "bg-[#3fb950]" : "bg-[#1f6feb]", -); +/** Green=connected SSH, blue=connected RDP, red=disconnected. */ +const protocolDotClass = computed(() => { + if (props.status === "disconnected") return "bg-[#f85149]"; + return props.protocol === "ssh" ? "bg-[#3fb950]" : "bg-[#1f6feb]"; +}); /** True when the session is running as root or Administrator. */ const isRoot = computed(() => { diff --git a/src/components/session/TabBar.vue b/src/components/session/TabBar.vue index 3dacf66..ae8855a 100644 --- a/src/components/session/TabBar.vue +++ b/src/components/session/TabBar.vue @@ -3,22 +3,30 @@