import { Bot, Boxes, ChevronRight, DraftingCompass, LoaderCircle, Package } from "lucide-react"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarHeader, SidebarInput, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubItem, SidebarTrigger, useSidebar } from "@/components/ui/sidebar"; import { cn } from "@/lib/utils"; import { RENDER_FORMAT } from "../../lib/workbench/constants"; import { fileKey, listSidebarItems, sidebarLabelForEntry } from "../../lib/workbench/sidebar"; function iconForEntry(entry, sourceFormat, pending) { if (pending) { return LoaderCircle; } if (entry?.kind === "assembly") { return Boxes; } if (sourceFormat === RENDER_FORMAT.DXF) { return DraftingCompass; } if (entry?.kind === "urdf") { return Bot; } return Package; } function FileEntryButton({ entry, depth, selectedKey, onSelectEntry, entrySourceFormat, entryHasMesh, entryHasDxf, entryHasUrdf, nested = false }) { const { isMobile, setOpenMobile } = useSidebar(); const key = fileKey(entry); const active = key === selectedKey; const label = sidebarLabelForEntry(entry); const sourceFormat = entrySourceFormat(entry); const pending = sourceFormat === RENDER_FORMAT.DXF ? !entryHasDxf(entry) : sourceFormat === RENDER_FORMAT.URDF ? !entryHasUrdf(entry) : !entryHasMesh(entry); const EntryIcon = iconForEntry(entry, sourceFormat, pending); const title = [ label, pending ? "pending" : "ready", entry?.kind, String(entry?.source?.path || entry?.step?.path || "") ].filter(Boolean).join(" | "); return ( { onSelectEntry(key); if (isMobile) { setOpenMobile(false); } }} tooltip={label} > {label} ); } function DirectoryNode({ directory, depth, queryActive, expandedDirectoryIds, onToggleDirectory, selectedKey, onSelectEntry, entrySourceFormat, entryHasMesh, entryHasDxf, entryHasUrdf, nested = false }) { const expanded = queryActive || expandedDirectoryIds.has(directory.id); const DirectoryItem = nested ? SidebarMenuSubItem : SidebarMenuItem; return ( { if (queryActive) { event.preventDefault(); return; } onToggleDirectory(directory.id); }} > {directory.name} {listSidebarItems(directory).map((item) => { if (item.type === "directory") { return ( ); } return ( ); })} ); } function SidebarResizeHandle({ onStartResize }) { const { isMobile, state } = useSidebar(); if (isMobile || state !== "expanded") { return null; } return ( ); } export default function FileExplorerSidebar({ previewMode, query, onQueryChange, filteredEntries, catalogEntries, filteredEntriesTree, selectedKey, expandedDirectoryIds, onToggleDirectory, onSelectEntry, entrySourceFormat, entryHasMesh, entryHasDxf, entryHasUrdf, onStartResize }) { if (previewMode) { return null; } const queryActive = query.trim().length > 0; const hasMatches = filteredEntries.length > 0; const hasEntries = catalogEntries.length > 0; return ( CAD Explorer onQueryChange(event.target.value)} aria-label="Search CAD files" className="h-7 text-xs md:text-xs" /> {hasMatches ? ( {listSidebarItems(filteredEntriesTree).map((item) => { if (item.type === "directory") { return ( ); } return ( ); })} ) : hasEntries ? ( No CAD entries match this filter. ) : ( No CAD entries found. )} ); }
No CAD entries match this filter.
No CAD entries found.