HardwareTreePage.razor 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. </nav>
  23. @if (_tree is null)
  24. {
  25. <div class="text-zinc-500"
  26. data-testid="hardware-loading">
  27. loading tree…
  28. </div>
  29. }
  30. else if (_tree.Count == 0)
  31. {
  32. <div class="text-zinc-500"
  33. data-testid="hardware-empty">
  34. no resources found
  35. </div>
  36. }
  37. else
  38. {
  39. <div data-testid="hardware-tree">
  40. @foreach (var group in _tree
  41. .OrderByDescending(h => h.Systems.Count)
  42. .ThenBy(h => h.Kind)
  43. .ThenBy(h => h.HardwareName)
  44. .GroupBy(h => h.Kind))
  45. {
  46. <div class="mb-6"
  47. data-testid=@($"hardware-group-{group.Key}")>
  48. <!-- Hardware Kind Header -->
  49. <div class="text-xs text-zinc-500 uppercase tracking-wider mb-3"
  50. data-testid=@($"hardware-group-title-{group.Key}")>
  51. @group.Key
  52. </div>
  53. <ul class="space-y-4">
  54. @foreach (var hardware in group)
  55. {
  56. <li data-testid=@($"hardware-item-{hardware.HardwareName}")>
  57. <!-- Hardware -->
  58. <NavLink href="@($"resources/hardware/{Uri.EscapeDataString(hardware.HardwareName)}")"
  59. class="block"
  60. data-testid=@($"hardware-link-{hardware.HardwareName}")>
  61. <div class="text-zinc-100 hover:text-emerald-300"
  62. data-testid=@($"hardware-name-{hardware.HardwareName}")>
  63. @hardware.HardwareName
  64. </div>
  65. </NavLink>
  66. @if (hardware.Systems.Any())
  67. {
  68. <ul class="ml-4 mt-2 border-l border-zinc-800 pl-4 space-y-2"
  69. data-testid=@($"system-list-{hardware.HardwareName}")>
  70. @foreach (var system in hardware.Systems
  71. .OrderByDescending(s => s.Services.Count)
  72. .ThenBy(s => s.SystemName))
  73. {
  74. <li data-testid=@($"system-item-{system.SystemName}")>
  75. <!-- System -->
  76. <NavLink
  77. href="@($"resources/systems/{Uri.EscapeDataString(system.SystemName)}")"
  78. class="block"
  79. data-testid=@($"system-link-{system.SystemName}")>
  80. <div class="text-zinc-300 hover:text-emerald-300">
  81. └─ @system.SystemName
  82. </div>
  83. </NavLink>
  84. @if (system.Services.Any())
  85. {
  86. <ul class="ml-4 mt-1 space-y-1"
  87. data-testid=@($"service-list-{system.SystemName}")>
  88. @foreach (var service in system.Services.OrderBy(s => s))
  89. {
  90. <li data-testid=@($"service-item-{service}")>
  91. <NavLink
  92. href="@($"resources/services/{Uri.EscapeDataString(service)}")"
  93. class="block hover:text-emerald-300"
  94. data-testid=@($"service-link-{service}")>
  95. > @service
  96. </NavLink>
  97. </li>
  98. }
  99. </ul>
  100. }
  101. </li>
  102. }
  103. </ul>
  104. }
  105. </li>
  106. }
  107. </ul>
  108. </div>
  109. }
  110. </div>
  111. }
  112. </div>
  113. @code {
  114. private List<HardwareTree>? _tree;
  115. protected override async Task OnInitializedAsync()
  116. {
  117. try
  118. {
  119. _tree = await HardwareRepository.GetTreeAsync();
  120. }
  121. catch (Exception ex)
  122. {
  123. Console.WriteLine(ex.ToString());
  124. throw;
  125. }
  126. }
  127. }