// ======================================== // Terminal Dashboard Page (V2) // ======================================== // Terminal-first layout with fixed session sidebar + floating panels + right file sidebar. // Left sidebar: SessionGroupTree (always visible) // Main area: TerminalGrid (tmux-style split panes) // Right sidebar: FileSidebarPanel (file tree, resizable) // Top: DashboardToolbar with panel toggles and layout presets // Floating panels: Issues, Queue, Inspector, Execution Monitor (overlay, mutually exclusive) // Fullscreen mode: Uses global isImmersiveMode to hide app chrome (Header + Sidebar) import { useState, useCallback } from 'react'; import { useIntl } from 'react-intl'; import { Allotment } from 'allotment'; import 'allotment/dist/style.css'; import { AssociationHighlightProvider } from '@/components/terminal-dashboard/AssociationHighlight'; import { DashboardToolbar, type PanelId } from '@/components/terminal-dashboard/DashboardToolbar'; import { TerminalGrid } from '@/components/terminal-dashboard/TerminalGrid'; import { FloatingPanel } from '@/components/terminal-dashboard/FloatingPanel'; import { SessionGroupTree } from '@/components/terminal-dashboard/SessionGroupTree'; import { IssuePanel } from '@/components/terminal-dashboard/IssuePanel'; import { QueuePanel } from '@/components/terminal-dashboard/QueuePanel'; import { InspectorContent } from '@/components/terminal-dashboard/BottomInspector'; import { ExecutionMonitorPanel } from '@/components/terminal-dashboard/ExecutionMonitorPanel'; import { FileSidebarPanel } from '@/components/terminal-dashboard/FileSidebarPanel'; import { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore'; import { useAppStore, selectIsImmersiveMode } from '@/stores/appStore'; import { useConfigStore } from '@/stores/configStore'; // ========== Main Page Component ========== export function TerminalDashboardPage() { const { formatMessage } = useIntl(); const [activePanel, setActivePanel] = useState(null); const [isFileSidebarOpen, setIsFileSidebarOpen] = useState(true); const [isSessionSidebarOpen, setIsSessionSidebarOpen] = useState(true); const projectPath = useWorkflowStore(selectProjectPath); // Feature flags for panel visibility const featureFlags = useConfigStore((s) => s.featureFlags); // Use global immersive mode state (only affects AppShell chrome) const isImmersiveMode = useAppStore(selectIsImmersiveMode); const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode); const togglePanel = useCallback((panelId: PanelId) => { setActivePanel((prev) => (prev === panelId ? null : panelId)); }, []); const closePanel = useCallback(() => { setActivePanel(null); }, []); return (
{/* Global toolbar */} setIsFileSidebarOpen((prev) => !prev)} isSessionSidebarOpen={isSessionSidebarOpen} onToggleSessionSidebar={() => setIsSessionSidebarOpen((prev) => !prev)} isFullscreen={isImmersiveMode} onToggleFullscreen={toggleImmersiveMode} /> {/* Main content with three-column layout */}
{/* Session sidebar (controlled by local state, not immersive mode) */} {isSessionSidebarOpen && (
)} {/* Terminal grid (flexible) */} {/* File sidebar (controlled by local state, not immersive mode) */} {isFileSidebarOpen && ( setIsFileSidebarOpen(false)} /> )}
{/* Floating panels (always available) */} {featureFlags.dashboardQueuePanelEnabled && ( )} {featureFlags.dashboardInspectorEnabled && ( )} {featureFlags.dashboardExecutionMonitorEnabled && ( )}
); } export default TerminalDashboardPage;