ResourceBreadCrumbComponent.razor 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. @using RackPeek.Domain.Persistence
  2. @inject IResourceCollection Repo
  3. <div class="text-sm text-zinc-300 flex items-stretch gap-3">
  4. @for (var i = 0; i < Levels.Count; i++)
  5. {
  6. if (i > 0)
  7. {
  8. <div class="flex items-center text-zinc-500">/</div>
  9. }
  10. <div class="flex">
  11. <CrumbLevel Items="Levels[i]" />
  12. </div>
  13. }
  14. </div>
  15. @code {
  16. [Parameter] [EditorRequired] public ResourceType ResourceType { get; set; }
  17. [Parameter] [EditorRequired] public string ResourceName { get; set; } = default!;
  18. private List<List<Breadcrumb>> Levels { get; } = new();
  19. protected override async Task OnParametersSetAsync()
  20. {
  21. Levels.Clear();
  22. switch (ResourceType)
  23. {
  24. case ResourceType.Hardware:
  25. AddLevel(new Breadcrumb(ResourceName, $"resources/hardware/{Uri.EscapeDataString(ResourceName)}"));
  26. break;
  27. case ResourceType.System:
  28. await BuildSystem(ResourceName);
  29. break;
  30. case ResourceType.Service:
  31. await BuildService(ResourceName);
  32. break;
  33. }
  34. }
  35. private void AddLevel(params Breadcrumb[] items)
  36. => Levels.Add(items.ToList());
  37. private void AddLevel(IEnumerable<Breadcrumb> items)
  38. {
  39. var list = items.ToList();
  40. if (list.Count > 0)
  41. Levels.Add(list);
  42. }
  43. private async Task BuildSystem(string systemName)
  44. {
  45. var system = await Repo.GetByNameAsync(systemName);
  46. var hwParents = (system?.RunsOn ?? new List<string>())
  47. .Where(x => !string.IsNullOrWhiteSpace(x))
  48. .Distinct(StringComparer.OrdinalIgnoreCase)
  49. .Select(hw => new Breadcrumb(hw, $"resources/hardware/{Uri.EscapeDataString(hw)}"))
  50. .OrderBy(b => b.Label, StringComparer.OrdinalIgnoreCase);
  51. AddLevel(hwParents);
  52. AddLevel(new Breadcrumb(systemName, $"resources/systems/{Uri.EscapeDataString(systemName)}"));
  53. }
  54. private async Task BuildService(string serviceName)
  55. {
  56. var service = await Repo.GetByNameAsync(serviceName);
  57. var systemParents = (service?.RunsOn ?? new List<string>())
  58. .Where(x => !string.IsNullOrWhiteSpace(x))
  59. .Distinct(StringComparer.OrdinalIgnoreCase)
  60. .ToList();
  61. var hwSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
  62. foreach (var sysName in systemParents)
  63. {
  64. var sys = await Repo.GetByNameAsync(sysName);
  65. if (sys?.RunsOn is { Count: > 0 })
  66. {
  67. foreach (var hw in sys.RunsOn.Where(x => !string.IsNullOrWhiteSpace(x)))
  68. hwSet.Add(hw);
  69. }
  70. }
  71. var hwParents = hwSet
  72. .Select(hw => new Breadcrumb(hw, $"resources/hardware/{Uri.EscapeDataString(hw)}"))
  73. .OrderBy(b => b.Label, StringComparer.OrdinalIgnoreCase);
  74. var sysCrumbs = systemParents
  75. .Select(sys => new Breadcrumb(sys, $"resources/systems/{Uri.EscapeDataString(sys)}"))
  76. .OrderBy(b => b.Label, StringComparer.OrdinalIgnoreCase);
  77. AddLevel(hwParents);
  78. AddLevel(sysCrumbs);
  79. AddLevel(new Breadcrumb(serviceName, $"resources/services/{Uri.EscapeDataString(serviceName)}"));
  80. }
  81. public record Breadcrumb(string Label, string Href);
  82. }