Files
fusion/packages/dashboard/app/utils/nodeProjectAssignment.ts
Fusion eed16abacb feat(FN-3509): document node mapping availability UI in dashboard guide
Documents the node mapping availability UI in the dashboard guide.

Fusion-Task-Id: FN-3509
2026-05-08 18:44:16 -07:00

56 lines
2.0 KiB
TypeScript

import type { NodeInfo, ProjectInfoWithSource, ProjectNodeAvailability } from "../api";
function isNonEmptyString(value: unknown): value is string {
return typeof value === "string" && value.trim().length > 0;
}
export function getNodeMappingsForProject(project: ProjectInfoWithSource): ProjectNodeAvailability[] {
const mappings = project.nodeMappings ?? [];
return mappings
.filter((mapping) => isNonEmptyString(mapping.nodeId) && isNonEmptyString(mapping.path))
.map((mapping) => ({
nodeId: mapping.nodeId,
nodeName: mapping.nodeName,
path: mapping.path,
available: mapping.available !== false,
}));
}
export function getAvailableNodeMappingsForNode(
project: ProjectInfoWithSource,
node: NodeInfo,
): ProjectNodeAvailability[] {
return getNodeMappingsForProject(project).filter(
(mapping) => mapping.nodeId === node.id && mapping.available,
);
}
export function isProjectAvailableOnNode(project: ProjectInfoWithSource, node: NodeInfo): boolean {
return getAvailableNodeMappingsForNode(project, node).length > 0;
}
export function getProjectsForNode(projects: ProjectInfoWithSource[], node: NodeInfo): ProjectInfoWithSource[] {
return projects.filter((project) => isProjectAvailableOnNode(project, node));
}
export function getProjectCountForNode(projects: ProjectInfoWithSource[], node: NodeInfo): number {
return getProjectsForNode(projects, node).length;
}
export function resolveNodeDisplayName(
nodeId: string,
mapping: ProjectNodeAvailability | undefined,
nodes: NodeInfo[],
project: ProjectInfoWithSource,
): string {
const nodeMatch = nodes.find((node) => node.id === nodeId);
if (nodeMatch?.name) return nodeMatch.name;
if (mapping?.nodeName) return mapping.nodeName;
if (project._sourceNodeName) return project._sourceNodeName;
return nodeId;
}
export function getUnassignedProjectCount(projects: ProjectInfoWithSource[]): number {
return projects.filter((project) => getNodeMappingsForProject(project).length === 0).length;
}