import type { TopologyTreeFolderItem, TopologyTreeViewItem } from "../../types"; import { useI18n } from "../../i18n"; import { WORLD_MAP_ENABLED } from "./constants"; import { displayViewName, folderNeCount, formatNeCount, isManualRootMapFolder, isRegionCanvasFolder, isUmeStructuralFolder, isUmeSyncedSubRegion, isUmeWorldNavFolder, isWorldDrillFolder, isWorldFlatViewName, regionDisplayName, } from "./treeUtils"; import { ChevronIcon, CloseIcon, LayerGlyph, PencilIcon, RegionGlyph, } from "./topologyIcons"; export type TopologyTreeNavFolderProps = { folder: TopologyTreeFolderItem; depth: number; treeRootId: string; expandedIds: Record; mapId: string; worldViewId: string; selectedFolderId: string; hotBrowseKey: string; dirty: boolean; onToggleExpand: (folderId: string, nextOpen: boolean) => void; onHotBrowseKey: (key: string) => void; onClearHotBrowseKey: (key: string) => void; onWorldFocusClear: () => void; goUmeWorldNav: () => void; goRegion: (folderId: string) => void; goCanvas: (viewId: string, folderId: string) => void; promptRenameRegion: (folderId: string, name: string) => void; promptRenameMap: (viewId: string, name: string) => void; renameRegionPending: boolean; renameMapPending: boolean; onDeleteFolder: (folderId: string) => void; deleteFolderPending: boolean; onDeleteMap: (viewId: string) => void; }; function ViewRow({ v, folder, umeNav, mapId, dirty, hotBrowseKey, renameMapPending, onHotBrowseKey, onClearHotBrowseKey, onWorldFocusClear, goCanvas, promptRenameMap, onDeleteMap, }: { v: TopologyTreeViewItem; folder: TopologyTreeFolderItem; umeNav: boolean; mapId: string; dirty: boolean; hotBrowseKey: string; renameMapPending: boolean; onHotBrowseKey: (key: string) => void; onClearHotBrowseKey: (key: string) => void; onWorldFocusClear: () => void; goCanvas: (viewId: string, folderId: string) => void; promptRenameMap: (viewId: string, name: string) => void; onDeleteMap: (viewId: string) => void; }) { const { t } = useI18n(); const isPhysical = String(v.kind) === "physical"; const viewHot = hotBrowseKey === `view:${v.id}`; const viewActive = mapId === v.id; return (
  • onHotBrowseKey(`view:${v.id}`)} onMouseLeave={() => onClearHotBrowseKey(`view:${v.id}`)} >
  • ); } export function TopologyTreeNavFolder({ folder, depth, treeRootId, expandedIds, mapId, worldViewId, selectedFolderId, hotBrowseKey, dirty, onToggleExpand, onHotBrowseKey, onClearHotBrowseKey, onWorldFocusClear, goUmeWorldNav, goRegion, goCanvas, promptRenameRegion, promptRenameMap, renameRegionPending, renameMapPending, onDeleteFolder, deleteFolderPending, onDeleteMap, }: TopologyTreeNavFolderProps) { const { t } = useI18n(); const kids = folder.children || []; const containerFolder = folder.external_ref === "ume:world" || folder.name === "UME World"; const drillFolder = isWorldDrillFolder(folder); const umeNav = isUmeWorldNavFolder(folder); const canvasRegion = isRegionCanvasFolder(folder, treeRootId); const visibleViews = ( canvasRegion ? (folder.views || []).filter((v) => String(v.kind) !== "physical") : containerFolder ? (folder.views || []).filter((v) => isWorldFlatViewName(v.name)) : folder.views || [] ).filter((v) => WORLD_MAP_ENABLED || !isWorldFlatViewName(v.name)); const hasKids = kids.length > 0 || visibleViews.length > 0; const open = Boolean(expandedIds[folder.id]); const viewActiveUnder = (folder.views || []).some((v) => v.id === mapId) || (drillFolder && Boolean(worldViewId) && mapId === worldViewId); const isSelected = selectedFolderId === folder.id; const focused = viewActiveUnder || (isSelected && Boolean(mapId)); const regionActive = isSelected && !mapId; const hot = hotBrowseKey === `region:${folder.id}`; const canRenameFolder = !isUmeStructuralFolder(folder) && (!folder.is_system || isManualRootMapFolder(folder)); const canDeleteFolder = !isUmeStructuralFolder(folder) && !isManualRootMapFolder(folder) && (!folder.is_system || isUmeSyncedSubRegion(folder)); return (
  • onHotBrowseKey(`region:${folder.id}`)} onMouseLeave={() => onClearHotBrowseKey(`region:${folder.id}`)} > {canRenameFolder || canDeleteFolder ? (
    {canRenameFolder ? ( ) : null} {canDeleteFolder ? ( ) : null}
    ) : null}
    {open ? ( ) : null}
  • ); }