"use client"; import { Activity, Bell, Bot, CheckCircle2, ChevronDown, ChevronRight, Download, FileText, Keyboard, LogOut, PlayCircle, RefreshCw, ShieldCheck, SlidersHorizontal, UserRound, type LucideIcon } from "lucide-react"; import type { ReactNode } from "react"; import { MAP_COMPACT_RADIUS_CLASS_NAME, MAP_ICON_CELL_RADIUS_CLASS_NAME, MAP_MAJOR_PANEL_RADIUS_CLASS_NAME, MAP_READABLE_RADIUS_CLASS_NAME } from "@/features/map/core/components/map-control-styles"; import { cn } from "@/lib/utils"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger } from "@/shared/ui/dropdown-menu"; import type { WorkbenchAlert, WorkbenchScenario, WorkbenchUser } from "../types"; const scenarioStatusLabels: Record = { active: "运行中", draft: "草案", review: "待复核" }; const menuSurfaceClassName = cn( MAP_MAJOR_PANEL_RADIUS_CLASS_NAME, "glass-menu border p-2 text-slate-900" ); const menuReadableRowClassName = "bg-[var(--glass-readable)] focus:bg-blue-50/95 focus:text-slate-950"; const headerControlButtonClassName = "inline-flex h-8 items-center gap-2 rounded-full border border-transparent bg-transparent text-sm font-semibold text-slate-700 transition-colors hover:bg-white/70 hover:text-blue-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600/20 focus-visible:ring-offset-2 data-[state=open]:bg-white/90 data-[state=open]:text-blue-700"; const headerControlIconClassName = "grid h-5 w-5 shrink-0 place-items-center rounded-full bg-slate-100/80 text-slate-500 transition-colors group-hover:bg-blue-50 group-hover:text-blue-700 group-data-[state=open]:bg-blue-50 group-data-[state=open]:text-blue-700"; export function ScenarioMenu({ open, onOpenChange, scenarios, activeScenarioId, activeScenarioName, onSelectScenario, onPreviewScenario, onCompareScenario, onExportScenarioReport }: { open: boolean; onOpenChange: (open: boolean) => void; scenarios: WorkbenchScenario[]; activeScenarioId: string; activeScenarioName: string; onSelectScenario: (scenarioId: string) => void; onPreviewScenario: () => void; onCompareScenario: () => void; onExportScenarioReport: () => void; }) { return ( 场景列表 { onSelectScenario(nextScenarioId); onOpenChange(false); }} > {scenarios.map((scenario) => ( {scenario.name} {scenarioStatusLabels[scenario.status]} {scenario.description} ))} 场景命令 ); } export function AlertMenu({ open, onOpenChange, alerts, compact = false, conditionFeedVisible, onSelectAlert, onToggleConditionFeed, onAnalyzeAlertsWithAgent }: { open: boolean; onOpenChange: (open: boolean) => void; alerts: WorkbenchAlert[]; compact?: boolean; conditionFeedVisible: boolean; onSelectAlert: (alert: WorkbenchAlert) => void; onToggleConditionFeed: () => void; onAnalyzeAlertsWithAgent: () => void | Promise; }) { const hasAlerts = alerts.length > 0; const latestAlertTime = alerts[0]?.time; return ( 待复核工况
{hasAlerts ? alerts.map((alert) => ( onSelectAlert(alert)} > {alert.description} )) : (
)}
{ onToggleConditionFeed(); onOpenChange(false); }} /> { void onAnalyzeAlertsWithAgent(); onOpenChange(false); }} />
); } export function UserMenu({ open, onOpenChange, user, onRefreshTiles, onShowDataStatus, onShowShortcuts, onExportConfig }: { open: boolean; onOpenChange: (open: boolean) => void; user: WorkbenchUser; onRefreshTiles: () => void; onShowDataStatus: () => void; onShowShortcuts: () => void; onExportConfig: () => void; }) { return ( 会话控制 ); } function AlertQueueSummary({ count, latestAlertTime, conditionFeedVisible }: { count: number; latestAlertTime?: string; conditionFeedVisible: boolean; }) { const hasAlerts = count > 0; return (
{hasAlerts ?

异常处置

{hasAlerts ? `${count} 条需复核${latestAlertTime ? ` · 最近 ${latestAlertTime}` : ""}` : "当前无待复核工况"}

{hasAlerts ? "需复核" : "正常"}
); } function MenuPlainButton({ label, description, disabled = false, onClick }: { label: string; description: string; disabled?: boolean; onClick: () => void; }) { return ( ); } function MenuPrimaryButton({ icon: Icon, label, disabled = false, onClick }: { icon: LucideIcon; label: string; disabled?: boolean; onClick: () => void | Promise; }) { return ( ); } function MenuHeader({ title, meta, tone = "default", icon: Icon }: { title: string; meta: string; tone?: "default" | "warning"; icon?: LucideIcon; }) { return (
{Icon ?

{meta}

{tone === "warning" ?
); } function MenuSectionLabel({ children }: { children: ReactNode }) { return {children}; } function MenuSeparator() { return ; } function MenuAction({ icon: Icon, label, description, tone = "default", onSelect }: { icon: LucideIcon; label: string; description: string; tone?: "default" | "primary" | "warning"; onSelect: () => void; }) { return ( {label} {description} ); }