HardwareTreePage.razor 6.1 KB

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