HardwareTreePage.razor 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. @page "/hardware/tree"
  2. @using RackPeek.Domain.Resources.Hardware
  3. @inject IHardwareRepository HardwareRepository
  4. <PageTitle>Hardware</PageTitle>
  5. <h1 class="text-lg text-zinc-100"
  6. data-testid="hardware-page-title">
  7. Hardware
  8. </h1>
  9. <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6"
  10. data-testid="hardware-page-root">
  11. <!-- Secondary Navigation -->
  12. <nav class="space-x-6 text-sm mb-4"
  13. data-testid="hardware-subnav">
  14. <NavLink href="servers/list" data-testid="nav-servers">Servers</NavLink>
  15. <NavLink href="switches/list" data-testid="nav-switches">Switches</NavLink>
  16. <NavLink href="firewalls/list" data-testid="nav-firewalls">Firewalls</NavLink>
  17. <NavLink href="routers/list" data-testid="nav-routers">Routers</NavLink>
  18. <NavLink href="accesspoints/list" data-testid="nav-accesspoints">AccessPoints</NavLink>
  19. <NavLink href="ups/list" data-testid="nav-ups">Ups</NavLink>
  20. <NavLink href="desktops/list" data-testid="nav-desktops">Desktops</NavLink>
  21. <NavLink href="laptops/list" data-testid="nav-laptops">Laptops</NavLink>
  22. <NavLink href="other/list" data-testid="nav-other">Other</NavLink>
  23. </nav>
  24. @if (_tree is null)
  25. {
  26. <div class="text-zinc-500"
  27. data-testid="hardware-loading">
  28. loading tree…
  29. </div>
  30. }
  31. else if (_tree.Count == 0)
  32. {
  33. <div class="text-zinc-500"
  34. data-testid="hardware-empty">
  35. no resources found
  36. </div>
  37. }
  38. else
  39. {
  40. <div data-testid="hardware-tree">
  41. @foreach (var group in _tree
  42. .OrderByDescending(h => h.Systems.Count)
  43. .ThenBy(h => h.Kind)
  44. .ThenBy(h => h.HardwareName)
  45. .GroupBy(h => h.Kind))
  46. {
  47. <div class="mb-6"
  48. data-testid=@($"hardware-group-{group.Key}")>
  49. <!-- Hardware Kind Header -->
  50. <div class="text-xs text-zinc-500 uppercase tracking-wider mb-3"
  51. data-testid=@($"hardware-group-title-{group.Key}")>
  52. @group.Key
  53. </div>
  54. <ul class="space-y-4">
  55. @foreach (var hardware in group)
  56. {
  57. <li data-testid=@($"hardware-item-{hardware.HardwareName}")>
  58. <!-- Hardware -->
  59. <NavLink href="@($"resources/hardware/{Uri.EscapeDataString(hardware.HardwareName)}")"
  60. class="block"
  61. data-testid=@($"hardware-link-{hardware.HardwareName}")>
  62. <div class="text-zinc-100 hover:text-emerald-300"
  63. data-testid=@($"hardware-name-{hardware.HardwareName}")>
  64. @hardware.HardwareName
  65. </div>
  66. </NavLink>
  67. @if (hardware.Systems.Any())
  68. {
  69. <ul class="ml-4 mt-2 border-l border-zinc-800 pl-4 space-y-2"
  70. data-testid=@($"system-list-{hardware.HardwareName}")>
  71. @foreach (var system in hardware.Systems
  72. .OrderByDescending(s => s.Services.Count)
  73. .ThenBy(s => s.SystemName))
  74. {
  75. <li data-testid=@($"system-item-{system.SystemName}")>
  76. <!-- System -->
  77. <NavLink
  78. href="@($"resources/systems/{Uri.EscapeDataString(system.SystemName)}")"
  79. class="block"
  80. data-testid=@($"system-link-{system.SystemName}")>
  81. <div class="text-zinc-300 hover:text-emerald-300">
  82. └─ @system.SystemName
  83. </div>
  84. </NavLink>
  85. @if (system.Services.Any())
  86. {
  87. <ul class="ml-4 mt-1 space-y-1"
  88. data-testid=@($"service-list-{system.SystemName}")>
  89. @foreach (var service in system.Services.OrderBy(s => s))
  90. {
  91. <li data-testid=@($"service-item-{service}")>
  92. <NavLink
  93. href="@($"resources/services/{Uri.EscapeDataString(service)}")"
  94. class="block hover:text-emerald-300"
  95. data-testid=@($"service-link-{service}")>
  96. > @service
  97. </NavLink>
  98. </li>
  99. }
  100. </ul>
  101. }
  102. </li>
  103. }
  104. </ul>
  105. }
  106. </li>
  107. }
  108. </ul>
  109. </div>
  110. }
  111. </div>
  112. }
  113. </div>
  114. @code {
  115. private List<HardwareTree>? _tree;
  116. protected override async Task OnInitializedAsync()
  117. {
  118. try
  119. {
  120. _tree = await HardwareRepository.GetTreeAsync();
  121. }
  122. catch (Exception ex)
  123. {
  124. Console.WriteLine(ex.ToString());
  125. throw;
  126. }
  127. }
  128. }