HardwareTreePage.razor 6.0 KB

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