import { useState } from "react"; import { Box, CalendarClock, BarChart3, Clock3, Droplets, Eye, EyeOff, FlaskConical, RadioTower, Sparkles, type LucideIcon } from "lucide-react"; import { MAP_ICON_CELL_RADIUS_CLASS_NAME } from "@/features/map/core"; import { cn } from "@/shared/ui/cn"; import type { WorkbenchAlert, WorkbenchAlertDataSource, WorkbenchUser } from "../types"; import type { AnalysisArtifact, ArtifactRequestedView } from "../workspace/workspace-model"; import { AlertMenu, AnalysisViewMenu, UserMenu } from "./workbench-top-bar-menus"; import { compactHeaderTextClassName, headerControlButtonClassName, headerControlIconClassName } from "./workbench-top-bar-styles"; export type WorkbenchTopBarProps = { dataTime: string; modelName: string; activeAnalysisArtifact: AnalysisArtifact | null; alerts: WorkbenchAlert[]; alertDataSource: WorkbenchAlertDataSource; user: WorkbenchUser; conditionFeedVisible: boolean; timelineVisible: boolean; taskTickerAvailable: boolean; taskTickerVisible: boolean; analysisResultsPanelOpen: boolean; peripheralSamplePanelOpen: boolean; devPanelEnabled: boolean; devPanelOpen: boolean; onSelectAlert: (alert: WorkbenchAlert) => void; onToggleConditionFeed: () => void; onToggleTimeline: () => void; onToggleTaskTicker: () => void; onToggleAnalysisResultsPanel: () => void; onTogglePeripheralSamplePanel: () => void; onToggleDevPanel: () => void; onAnalyzeAlertsWithAgent: () => void | Promise; latestAnalysisAvailable: boolean; analysisSplitAvailable: boolean; onOpenLatestAnalysis: () => void; onSetAnalysisView: (view: ArtifactRequestedView) => void; onCloseAnalysisView: () => void; onShowDataStatus: () => void; onRefreshTiles: () => void; onShowShortcuts: () => void; onExportConfig: () => void; onLogout?: () => Promise; }; type HeaderMenuId = "alerts" | "analysis-view" | "compact-alerts" | "user"; export function WorkbenchTopBar({ dataTime, modelName, activeAnalysisArtifact, alerts, alertDataSource, user, conditionFeedVisible, timelineVisible, taskTickerAvailable, taskTickerVisible, analysisResultsPanelOpen, peripheralSamplePanelOpen, devPanelEnabled, devPanelOpen, onSelectAlert, onToggleConditionFeed, onToggleTimeline, onToggleTaskTicker, onToggleAnalysisResultsPanel, onTogglePeripheralSamplePanel, onToggleDevPanel, onAnalyzeAlertsWithAgent, latestAnalysisAvailable, analysisSplitAvailable, onOpenLatestAnalysis, onSetAnalysisView, onCloseAnalysisView, onShowDataStatus, onRefreshTiles, onShowShortcuts, onExportConfig, onLogout }: WorkbenchTopBarProps) { const [openMenu, setOpenMenu] = useState(null); const createMenuOpenChange = (menuId: HeaderMenuId) => (open: boolean) => { setOpenMenu(open ? menuId : null); }; return (

供水 供水管网智能调度系统

调度工作台

{taskTickerAvailable ? : null} {activeAnalysisArtifact ? ( <> onSetAnalysisView("focus")} onShowMapSplit={() => onSetAnalysisView("map_split")} onShowMapOnly={() => onSetAnalysisView("map_only")} onClose={onCloseAnalysisView} /> ) : null}
{latestAnalysisAvailable && !activeAnalysisArtifact ? (
) : null} {devPanelEnabled ? (
) : null}
); } function getAlertSourceLabel(source: WorkbenchAlertDataSource) { if (source === "backend") return "后端运行态"; if (source === "mock") return "工况演示回退"; return "未配置告警源"; } function getAnalysisOriginLabel(origin: AnalysisArtifact["origin"]) { if (origin === "backend") return "后端分析运行"; if (origin === "demo") return "演示成果"; return "Agent 分析"; } function TaskTickerToggle({ available, visible, onToggle }: { available: boolean; visible: boolean; onToggle: () => void; }) { const Icon = visible ? EyeOff : Eye; if (!available) { return null; } return ( ); } function ConditionFeedToggle({ visible, onToggle }: { visible: boolean; onToggle: () => void }) { return ( ); } function TimelineToggle({ visible, compact = false, onToggle }: { visible: boolean; compact?: boolean; onToggle: () => void; }) { return ( ); } function HeaderReadout({ icon: Icon, label, value }: { icon?: LucideIcon; label: string; value: string; }) { return (
{Icon ?
); } function HeaderDivider() { return
; }