From d4d09c3c44d82f487f6d626975a523fbe1274f97 Mon Sep 17 00:00:00 2001 From: Chase McDougall Date: Tue, 27 Jan 2026 10:56:49 -0500 Subject: [PATCH 1/2] fix(desktop): respect preset execution mode when using hotkeys Preset hotkeys (Ctrl+1-9) now correctly execute commands in parallel when the preset's executionMode is set to "parallel", matching the behavior of the dropdown menu. --- .../workspace/$workspaceId/page.tsx | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx index 410abb02656..ca10415bee5 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx @@ -115,23 +115,35 @@ function WorkspacePage() { const { presets } = usePresets(); const renameTab = useTabsStore((s) => s.renameTab); + const addTabWithMultiplePanes = useTabsStore( + (s) => s.addTabWithMultiplePanes, + ); const openTabWithPreset = useCallback( (presetIndex: number) => { const preset = presets[presetIndex]; if (preset) { - const result = addTab(workspaceId, { - initialCommands: preset.commands, - initialCwd: preset.cwd || undefined, - }); + const isParallel = + preset.executionMode === "parallel" && preset.commands.length > 1; + + const { tabId } = isParallel + ? addTabWithMultiplePanes(workspaceId, { + commands: preset.commands, + initialCwd: preset.cwd || undefined, + }) + : addTab(workspaceId, { + initialCommands: preset.commands, + initialCwd: preset.cwd || undefined, + }); + if (preset.name) { - renameTab(result.tabId, preset.name); + renameTab(tabId, preset.name); } } else { addTab(workspaceId); } }, - [presets, workspaceId, addTab, renameTab], + [presets, workspaceId, addTab, addTabWithMultiplePanes, renameTab], ); useAppHotkey("NEW_GROUP", () => addTab(workspaceId), undefined, [ From 3a8e759c0d0ed9562e9a651bcb355d22b4db68b1 Mon Sep 17 00:00:00 2001 From: Chase McDougall Date: Tue, 27 Jan 2026 10:59:49 -0500 Subject: [PATCH 2/2] refactor(desktop): extract openPreset into useTabsWithPresets hook Consolidate preset-opening logic (execution mode handling, tab creation, renaming) into a shared openPreset function to reduce duplication between hotkey handler and dropdown menu. --- .../workspace/$workspaceId/page.tsx | 32 ++++++------------- .../TabsContent/GroupStrip/GroupStrip.tsx | 28 ++-------------- .../stores/tabs/useTabsWithPresets.ts | 26 +++++++++++++++ 3 files changed, 38 insertions(+), 48 deletions(-) diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx index ca10415bee5..a6bbc967c16 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/workspace/$workspaceId/page.tsx @@ -81,8 +81,13 @@ function WorkspacePage() { const activeTabIds = useTabsStore((s) => s.activeTabIds); const tabHistoryStacks = useTabsStore((s) => s.tabHistoryStacks); const focusedPaneIds = useTabsStore((s) => s.focusedPaneIds); - const { addTab, splitPaneAuto, splitPaneVertical, splitPaneHorizontal } = - useTabsWithPresets(); + const { + addTab, + splitPaneAuto, + splitPaneVertical, + splitPaneHorizontal, + openPreset, + } = useTabsWithPresets(); const setActiveTab = useTabsStore((s) => s.setActiveTab); const removePane = useTabsStore((s) => s.removePane); const setFocusedPane = useTabsStore((s) => s.setFocusedPane); @@ -114,36 +119,17 @@ function WorkspacePage() { const focusedPaneId = activeTabId ? focusedPaneIds[activeTabId] : null; const { presets } = usePresets(); - const renameTab = useTabsStore((s) => s.renameTab); - const addTabWithMultiplePanes = useTabsStore( - (s) => s.addTabWithMultiplePanes, - ); const openTabWithPreset = useCallback( (presetIndex: number) => { const preset = presets[presetIndex]; if (preset) { - const isParallel = - preset.executionMode === "parallel" && preset.commands.length > 1; - - const { tabId } = isParallel - ? addTabWithMultiplePanes(workspaceId, { - commands: preset.commands, - initialCwd: preset.cwd || undefined, - }) - : addTab(workspaceId, { - initialCommands: preset.commands, - initialCwd: preset.cwd || undefined, - }); - - if (preset.name) { - renameTab(tabId, preset.name); - } + openPreset(workspaceId, preset); } else { addTab(workspaceId); } }, - [presets, workspaceId, addTab, addTabWithMultiplePanes, renameTab], + [presets, workspaceId, addTab, openPreset], ); useAppHotkey("NEW_GROUP", () => addTab(workspaceId), undefined, [ diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/GroupStrip/GroupStrip.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/GroupStrip/GroupStrip.tsx index 88040db921f..6924e6c9571 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/GroupStrip/GroupStrip.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/GroupStrip/GroupStrip.tsx @@ -1,4 +1,3 @@ -import type { TerminalPreset } from "@superset/local-db"; import { Button } from "@superset/ui/button"; import { DropdownMenu, @@ -41,7 +40,7 @@ export function GroupStrip() { const panes = useTabsStore((s) => s.panes); const activeTabIds = useTabsStore((s) => s.activeTabIds); const tabHistoryStacks = useTabsStore((s) => s.tabHistoryStacks); - const { addTab } = useTabsWithPresets(); + const { addTab, openPreset } = useTabsWithPresets(); const renameTab = useTabsStore((s) => s.renameTab); const removeTab = useTabsStore((s) => s.removeTab); const setActiveTab = useTabsStore((s) => s.setActiveTab); @@ -90,30 +89,9 @@ export function GroupStrip() { addTab(activeWorkspaceId); }; - const addTabWithMultiplePanes = useTabsStore( - (s) => s.addTabWithMultiplePanes, - ); - - const handleSelectPreset = (preset: TerminalPreset) => { + const handleSelectPreset = (preset: Parameters[1]) => { if (!activeWorkspaceId) return; - - const isParallel = - preset.executionMode === "parallel" && preset.commands.length > 1; - - const { tabId } = isParallel - ? addTabWithMultiplePanes(activeWorkspaceId, { - commands: preset.commands, - initialCwd: preset.cwd || undefined, - }) - : addTab(activeWorkspaceId, { - initialCommands: preset.commands, - initialCwd: preset.cwd || undefined, - }); - - if (preset.name) { - renameTab(tabId, preset.name); - } - + openPreset(activeWorkspaceId, preset); setDropdownOpen(false); }; diff --git a/apps/desktop/src/renderer/stores/tabs/useTabsWithPresets.ts b/apps/desktop/src/renderer/stores/tabs/useTabsWithPresets.ts index d27acf01b63..2d082087402 100644 --- a/apps/desktop/src/renderer/stores/tabs/useTabsWithPresets.ts +++ b/apps/desktop/src/renderer/stores/tabs/useTabsWithPresets.ts @@ -1,3 +1,4 @@ +import type { TerminalPreset } from "@superset/local-db"; import { useCallback, useMemo } from "react"; import type { MosaicBranch } from "react-mosaic-component"; import { usePresets } from "renderer/react-query/presets"; @@ -138,12 +139,37 @@ export function useTabsWithPresets() { [storeSplitPaneAuto, defaultPresetOptions], ); + const openPreset = useCallback( + (workspaceId: string, preset: TerminalPreset) => { + const isParallel = + preset.executionMode === "parallel" && preset.commands.length > 1; + + const { tabId } = isParallel + ? storeAddTabWithMultiplePanes(workspaceId, { + commands: preset.commands, + initialCwd: preset.cwd || undefined, + }) + : storeAddTab(workspaceId, { + initialCommands: preset.commands, + initialCwd: preset.cwd || undefined, + }); + + if (preset.name) { + renameTab(tabId, preset.name); + } + + return { tabId }; + }, + [storeAddTab, storeAddTabWithMultiplePanes, renameTab], + ); + return { addTab, addPane, splitPaneVertical, splitPaneHorizontal, splitPaneAuto, + openPreset, defaultPreset, }; }