Unify directory NE badges as distinct fabric ids across membership and home.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-08-07 18:16:21 +08:00
parent 3d86bc7594
commit 4b7d13d62b
5 changed files with 188 additions and 162 deletions

View file

@ -297,34 +297,10 @@ function regionDisplayName(
return raw;
}
/** Prefer the folder's primary canvas view (physical / world flat / World drill). */
function primaryTreeView(
folder: TopologyTreeFolderItem | null | undefined,
): TopologyTreeViewItem | null {
if (!folder) return null;
const views = folder.views || [];
if (!views.length) return null;
if (isWorldDrillFolder(folder)) {
return views.find((v) => v.name === "World") || views[0] || null;
}
if (isUmeWorldContainer(folder)) {
return views.find((v) => isWorldFlatViewName(v.name)) || views[0] || null;
}
return views[0] || null;
}
/**
* Directory NE badge from API.
* Manual canvases count view membership (placed NEs); UME World surfaces use inventory.
*/
/** Directory NE badge: API already returns distinct-subtree ne_count. */
function folderNeCount(folder: TopologyTreeFolderItem | null | undefined): number {
if (!folder) return 0;
if (folder.ne_count != null && Number.isFinite(Number(folder.ne_count))) {
return Math.max(0, Math.floor(Number(folder.ne_count) || 0));
}
// Legacy fallback before API ne_count: primary view only (no recursive sum).
const primary = primaryTreeView(folder);
return primary ? Math.max(0, Math.floor(Number(primary.node_count) || 0)) : 0;
return Math.max(0, Math.floor(Number(folder.ne_count) || 0));
}
function formatNeCount(count: number): string {

View file

@ -427,7 +427,7 @@ export type TopologyTreeFolderItem = {
sort_order: number;
is_system: boolean;
external_ref?: string;
/** Real NE inventory under this folder (subtree). Region folders are not NEs. */
/** Distinct fabric NE count in this folder subtree (API). Region icons excluded. */
ne_count?: number;
views: TopologyTreeViewItem[];
children: TopologyTreeFolderItem[];