| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- @using RackPeek.Domain.Persistence
- @inject IResourceCollection Repo
- <div class="text-sm text-zinc-300 flex items-stretch gap-3">
- @for (var i = 0; i < Levels.Count; i++)
- {
- if (i > 0)
- {
- <div class="flex items-center text-zinc-500">/</div>
- }
- <div class="flex">
- <CrumbLevel Items="Levels[i]" />
- </div>
- }
- </div>
- @code {
- [Parameter] [EditorRequired] public ResourceType ResourceType { get; set; }
- [Parameter] [EditorRequired] public string ResourceName { get; set; } = default!;
-
- private List<List<Breadcrumb>> 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<Breadcrumb> 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<string>())
- .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<string>())
- .Where(x => !string.IsNullOrWhiteSpace(x))
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .ToList();
-
- var hwSet = new HashSet<string>(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);
- }
|