Unify manual topology roots with UME World: auto root map, and fix empty UME canvas.

Top-level folders are nav-only with a unique system root map; UI drops custom/extra L2 creates. Batched dock-to-Fabric apply avoids PG lock OOM so World NEs can render, with subtree region counts restored.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-08-07 02:22:58 +08:00
parent edfa3f8756
commit 48b10656d2
9 changed files with 867 additions and 366 deletions

View file

@ -1394,7 +1394,11 @@ const en = {
maps: "Maps",
tree: "Topology tree",
treeLoading: "Loading tree…",
treeHint: "Regions hold maps you create; open a map to edit the canvas.",
graphLoading: "Loading topology…",
graphRefreshing: "Refreshing…",
canvasEmpty: "No NEs on this map yet",
canvasEmptyHint: "Use Add NE, or pick a region that already has devices.",
treeHint: "Top level is a Root (nav only); its unique Root Map is the canvas. Open the root map or a sub-region to edit devices.",
treeSearch: "Search NEs across maps",
treeSearchPh: "Name / IP",
treeSearchEmpty: "No matching NEs",
@ -1402,47 +1406,47 @@ const en = {
treeSearchNotOnMap: "This NE is not placed on any topology map yet",
treeSearchViewCount: "{{count}} map(s)",
treeSearchTruncated: "Showing first 30 of {{total}}",
rootName: "Regions",
selectRegion: "Select a region",
rootName: "Roots",
selectRegion: "Select a root or region",
openMap: "Open map",
openRegion: "Open region",
openRegion: "Open",
kindPhysical: "Physical",
kindCustom: "Custom",
regionNodeHint: "{{count}}P",
layerNodeHint: "{{count}} NE(s)",
layerNodeEmpty: "Click to create & open",
rootCanvasHint: "Pick a region from the left tree.",
regionCanvasHint: "Open a map to edit devices, or create a custom map.",
regionBrowseHint: "Region folder: maps you add. Click to open.",
rootCanvasHint: "Pick a root from the left tree.",
regionCanvasHint: "Open the root map to edit devices; create sub-regions on that canvas.",
regionBrowseHint: "Root folder: unique root map below. Click to open.",
browserTitle: "Topology folder",
browserRegionSub: "{{count}} map(s)",
browserRegionsSub: "{{count}} region(s)",
browserEmptyMaps: "No maps in this region yet.",
browserRegionsSub: "{{count}} item(s)",
browserEmptyMaps: "No root map under this root yet.",
addNe: "Add NE",
backUp: "Back to region",
newRegion: "New region",
newRegionName: "New region",
newRegionPrompt: "Region name",
backUp: "Back",
newRegion: "New root",
newRegionName: "New root",
newRegionPrompt: "Root name",
newSubRegion: "New sub-region",
newSubRegionName: "New sub-region",
newSubRegionPrompt: "Sub-region name",
subRegionNotOnFlat: "The flat world map has no regions. Create sub-regions on World or a lower-level canvas.",
worldMapNoDirectNes: "Cannot add NEs on the world map — add them on a sub-region canvas.",
subRegionNeedParent: "Open a region canvas first, then create a sub-region.",
regionCreated: "Region created",
regionDeleted: "Region deleted",
deleteRegion: "Delete region",
deleteRegionConfirm: "Delete region \"{{name}}\"? Its maps will also be deleted.",
renameRegion: "Rename region",
renameRegionPrompt: "Region name",
regionRenamed: "Region renamed",
collapseRegion: "Collapse region",
expandRegion: "Expand region",
subRegionNeedParent: "Open a root map or region canvas first, then create a sub-region.",
regionCreated: "Created",
regionDeleted: "Deleted",
deleteRegion: "Delete",
deleteRegionConfirm: "Delete \"{{name}}\"? Its maps will also be deleted.",
renameRegion: "Rename",
renameRegionPrompt: "Name",
regionRenamed: "Renamed",
collapseRegion: "Collapse",
expandRegion: "Expand",
newCustom: "Custom map",
newCustomName: "Custom topology",
newCustomPrompt: "Custom map name",
folderHint: "Regions group maps. After creating a region, add a physical or custom map yourself.",
folderHintShort: "Region folder",
folderHint: "Creating a root auto-creates its unique root map. Add sub-regions on that canvas.",
folderHintShort: "Root folder",
outsidePeers: "{{count}} outside peer(s) linked but not on this map",
projectNeighbors: "Project neighbors",
projectedNeighbors: "Projected {{count}} neighbor(s) onto the map",
@ -1467,7 +1471,7 @@ const en = {
renamed: "Topology map renamed",
deleteMap: "Delete map",
deleteMapConfirm: "Delete map \"{{name}}\"? Nodes and edges will be removed.",
emptyMaps: "No regions yet. Create a region first.",
emptyMaps: "No roots yet. Create a root first.",
palette: "NE library",
paletteHint: "Select multiple to add in batch, or drag one onto the canvas",
paletteDragHint: "Drag onto canvas to add",