Unified environments topology page with ElkSharp SVG layout

Replace 3 fragmented environment views (2 hardcoded stubs + tables component)
and D3.js force-directed map with a single unified topology page at
/environments/overview. The page renders an interactive SVG graph using
ElkSharp compound layout (regions as parent containers, environments as
child nodes, promotion paths as directed edges with gate labels).

Backend: new GET /api/v2/topology/layout endpoint that builds ElkGraph
from topology read model, runs ElkSharp compound layout, returns enriched
positioned nodes and routed edges.

Frontend: topology-graph.component.ts (SVG renderer with zoom/pan/select),
topology-graph-page.component.ts (filter bar + graph + detail side panel).

Deleted: environments-list-page, platform-setup-regions-environments-page,
topology-map-page, topology-regions-environments-page. Routes consolidated
from ~12 paths to 6 with backward-compat redirects.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
master
2026-03-28 17:05:57 +02:00
parent 717316d5a0
commit bf20ffe3d2
21 changed files with 1730 additions and 1966 deletions

View File

@@ -272,6 +272,27 @@ public static class TopologyReadModelEndpoints
.WithSummary("List topology workflows")
.RequireAuthorization(PlatformPolicies.TopologyRead);
topology.MapGet("/layout", async Task<IResult>(
HttpContext context,
PlatformRequestContextResolver resolver,
TopologyLayoutService layoutService,
[AsParameters] TopologyLayoutQuery query,
CancellationToken cancellationToken) =>
{
if (!TryResolveContext(context, resolver, out var requestContext, out var failure))
{
return failure!;
}
var result = await layoutService.GetLayoutAsync(
requestContext!, query, cancellationToken).ConfigureAwait(false);
return Results.Ok(result);
})
.WithName("GetTopologyLayoutV2")
.WithSummary("Get positioned topology layout for SVG rendering")
.RequireAuthorization(PlatformPolicies.TopologyRead);
topology.MapGet("/gate-profiles", async Task<IResult>(
HttpContext context,
PlatformRequestContextResolver resolver,