From d0b9c4f529fdfca3b45448bd5a7890d1718a550c Mon Sep 17 00:00:00 2001 From: iliya Date: Fri, 27 Mar 2026 22:04:44 +0200 Subject: [PATCH] fix(team): settings panel opens below buttons instead of beside them Split ToolApprovalSettingsPanel into ToolApprovalSettingsToggle (inline button) and ToolApprovalSettingsContent (full-width expandable panel). Toggle sits in the actions row, content renders below it inside the popup. --- .../components/team/ToolApprovalSheet.tsx | 14 +- .../dialogs/ToolApprovalSettingsPanel.tsx | 276 +++++++++--------- 2 files changed, 150 insertions(+), 140 deletions(-) diff --git a/src/renderer/components/team/ToolApprovalSheet.tsx b/src/renderer/components/team/ToolApprovalSheet.tsx index b4850dbe..91a4b640 100644 --- a/src/renderer/components/team/ToolApprovalSheet.tsx +++ b/src/renderer/components/team/ToolApprovalSheet.tsx @@ -7,7 +7,10 @@ import { shortenDisplayPath } from '@renderer/utils/pathDisplay'; import { highlightLines } from '@renderer/utils/syntaxHighlighter'; import { AlertTriangle, FileText, Search, Terminal } from 'lucide-react'; -import { ToolApprovalSettingsPanel } from './dialogs/ToolApprovalSettingsPanel'; +import { + ToolApprovalSettingsContent, + ToolApprovalSettingsToggle, +} from './dialogs/ToolApprovalSettingsPanel'; import { FileIcon } from './editor/FileIcon'; import { ToolApprovalDiffPreview } from './ToolApprovalDiffPreview'; @@ -124,6 +127,7 @@ export const ToolApprovalSheet: React.FC = () => { const [disabled, setDisabled] = useState(false); const [error, setError] = useState(null); const [diffExpanded, setDiffExpanded] = useState(false); + const [settingsExpanded, setSettingsExpanded] = useState(false); // Clear error when current approval changes useEffect(() => { @@ -333,10 +337,16 @@ export const ToolApprovalSheet: React.FC = () => { {pendingApprovals.length - 1} pending )} - + setSettingsExpanded((v) => !v)} + /> + {/* Settings expanded content — below actions row */} + + {/* Timeout progress bar */} diff --git a/src/renderer/components/team/dialogs/ToolApprovalSettingsPanel.tsx b/src/renderer/components/team/dialogs/ToolApprovalSettingsPanel.tsx index 9f02438f..802cd6cc 100644 --- a/src/renderer/components/team/dialogs/ToolApprovalSettingsPanel.tsx +++ b/src/renderer/components/team/dialogs/ToolApprovalSettingsPanel.tsx @@ -13,153 +13,153 @@ import { ChevronDown, ChevronRight, Settings } from 'lucide-react'; import type { ToolApprovalTimeoutAction } from '@shared/types'; -export const ToolApprovalSettingsPanel: React.FC = () => { - const [expanded, setExpanded] = useState(false); +export const ToolApprovalSettingsToggle: React.FC<{ expanded: boolean; onToggle: () => void }> = ({ + expanded, + onToggle, +}) => ( + +); + +export const ToolApprovalSettingsContent: React.FC<{ expanded: boolean }> = ({ expanded }) => { const [localSeconds, setLocalSeconds] = useState(''); const settings = useStore((s) => s.toolApprovalSettings); const updateSettings = useStore((s) => s.updateToolApprovalSettings); + if (!expanded) return null; + return ( - <> - {/* Toggle button — rendered inline in parent layout */} - + + void updateSettings({ autoAllowFileEdits: checked === true }) + } + /> + Auto-allow file edits (Edit, Write, NotebookEdit) + - {/* Collapsible panel — full-width, below toggle */} - {expanded && ( -
+ + void updateSettings({ autoAllowSafeBash: checked === true }) + } + /> + Auto-allow safe commands (git, pnpm, npm, ls...) + + + {/* Separator */} +
+ + {/* Timeout section */} +
+ On timeout: + + + {settings.timeoutAction !== 'wait' && ( + <> + after + setLocalSeconds(e.target.value)} + onBlur={() => { + const val = parseInt(localSeconds, 10); + if (!isNaN(val) && val >= 5 && val <= 300) { + void updateSettings({ timeoutSeconds: val }); + } + setLocalSeconds(''); + }} + onKeyDown={(e) => { + if (e.key === 'Enter') { + e.currentTarget.blur(); + } + }} + className="w-14 rounded border px-1.5 py-0.5 text-center text-xs" + style={{ + backgroundColor: 'var(--color-surface-raised)', + borderColor: 'var(--color-border)', + color: 'var(--color-text)', + }} /> - Auto-allow all tools - - - {/* Separator */} -
- - {/* Auto-allow file edits */} - - - {/* Auto-allow safe bash */} - - - {/* Separator */} -
- - {/* Timeout section */} -
- On timeout: - - - {settings.timeoutAction !== 'wait' && ( - <> - after - setLocalSeconds(e.target.value)} - onBlur={() => { - const val = parseInt(localSeconds, 10); - if (!isNaN(val) && val >= 5 && val <= 300) { - void updateSettings({ timeoutSeconds: val }); - } - setLocalSeconds(''); - }} - onKeyDown={(e) => { - if (e.key === 'Enter') { - e.currentTarget.blur(); - } - }} - className="w-14 rounded border px-1.5 py-0.5 text-center text-xs" - style={{ - backgroundColor: 'var(--color-surface-raised)', - borderColor: 'var(--color-border)', - color: 'var(--color-text)', - }} - /> - sec - - )} -
-
- )} - + sec + + )} +
+
); };