@using RackPeek.Domain.Persistence @inject IResourceCollection Repo
@for (var i = 0; i < Levels.Count; i++) { if (i > 0) {
/
}
}
@code { [Parameter] [EditorRequired] public ResourceType ResourceType { get; set; } [Parameter] [EditorRequired] public string ResourceName { get; set; } = default!; private List> Levels { get; } = new(); protected override async Task OnParametersSetAsync() { Levels.Clear(); switch (ResourceType) { case ResourceType.Hardware: AddLevel(new Breadcrumb(ResourceName, $"resources/hardware/{Uri.EscapeDataString(ResourceName)}")); break; case ResourceType.System: await BuildSystem(ResourceName); break; case ResourceType.Service: await BuildService(ResourceName); break; } } private void AddLevel(params Breadcrumb[] items) => Levels.Add(items.ToList()); private void AddLevel(IEnumerable items) { var list = items.ToList(); if (list.Count > 0) Levels.Add(list); } private async Task BuildSystem(string systemName) { var system = await Repo.GetByNameAsync(systemName); var hwParents = (system?.RunsOn ?? new List()) .Where(x => !string.IsNullOrWhiteSpace(x)) .Distinct(StringComparer.OrdinalIgnoreCase) .Select(hw => new Breadcrumb(hw, $"resources/hardware/{Uri.EscapeDataString(hw)}")) .OrderBy(b => b.Label, StringComparer.OrdinalIgnoreCase); AddLevel(hwParents); AddLevel(new Breadcrumb(systemName, $"resources/systems/{Uri.EscapeDataString(systemName)}")); } private async Task BuildService(string serviceName) { var service = await Repo.GetByNameAsync(serviceName); var systemParents = (service?.RunsOn ?? new List()) .Where(x => !string.IsNullOrWhiteSpace(x)) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); var hwSet = new HashSet(StringComparer.OrdinalIgnoreCase); foreach (var sysName in systemParents) { var sys = await Repo.GetByNameAsync(sysName); if (sys?.RunsOn is { Count: > 0 }) { foreach (var hw in sys.RunsOn.Where(x => !string.IsNullOrWhiteSpace(x))) hwSet.Add(hw); } } var hwParents = hwSet .Select(hw => new Breadcrumb(hw, $"resources/hardware/{Uri.EscapeDataString(hw)}")) .OrderBy(b => b.Label, StringComparer.OrdinalIgnoreCase); var sysCrumbs = systemParents .Select(sys => new Breadcrumb(sys, $"resources/systems/{Uri.EscapeDataString(sys)}")) .OrderBy(b => b.Label, StringComparer.OrdinalIgnoreCase); AddLevel(hwParents); AddLevel(sysCrumbs); AddLevel(new Breadcrumb(serviceName, $"resources/services/{Uri.EscapeDataString(serviceName)}")); } public record Breadcrumb(string Label, string Href); }