| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- @page "/hardware/tree"
- @using RackPeek.Domain.Resources.Hardware
- @inject IHardwareRepository HardwareRepository
- <PageTitle>Hardware</PageTitle>
- <h1 class="text-lg text-zinc-100"
- data-testid="hardware-page-title">
- Hardware
- </h1>
- <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6"
- data-testid="hardware-page-root">
- <!-- Secondary Navigation -->
- <nav class="space-x-6 text-sm mb-4"
- data-testid="hardware-subnav">
- <NavLink href="servers/list" data-testid="nav-servers">Servers</NavLink>
- <NavLink href="switches/list" data-testid="nav-switches">Switches</NavLink>
- <NavLink href="firewalls/list" data-testid="nav-firewalls">Firewalls</NavLink>
- <NavLink href="routers/list" data-testid="nav-routers">Routers</NavLink>
- <NavLink href="accesspoints/list" data-testid="nav-accesspoints">AccessPoints</NavLink>
- <NavLink href="ups/list" data-testid="nav-ups">Ups</NavLink>
- <NavLink href="desktops/list" data-testid="nav-desktops">Desktops</NavLink>
- <NavLink href="laptops/list" data-testid="nav-laptops">Laptops</NavLink>
- </nav>
- @if (_tree is null)
- {
- <div class="text-zinc-500"
- data-testid="hardware-loading">
- loading tree…
- </div>
- }
- else if (_tree.Count == 0)
- {
- <div class="text-zinc-500"
- data-testid="hardware-empty">
- no resources found
- </div>
- }
- else
- {
- <div data-testid="hardware-tree">
- @foreach (var group in _tree
- .OrderByDescending(h => h.Systems.Count)
- .ThenBy(h => h.Kind)
- .ThenBy(h => h.HardwareName)
- .GroupBy(h => h.Kind))
- {
- <div class="mb-6"
- data-testid=@($"hardware-group-{group.Key}")>
- <!-- Hardware Kind Header -->
- <div class="text-xs text-zinc-500 uppercase tracking-wider mb-3"
- data-testid=@($"hardware-group-title-{group.Key}")>
- @group.Key
- </div>
- <ul class="space-y-4">
- @foreach (var hardware in group)
- {
- <li data-testid=@($"hardware-item-{hardware.HardwareName}")>
- <!-- Hardware -->
- <NavLink href="@($"resources/hardware/{Uri.EscapeDataString(hardware.HardwareName)}")"
- class="block"
- data-testid=@($"hardware-link-{hardware.HardwareName}")>
- <div class="text-zinc-100 hover:text-emerald-300"
- data-testid=@($"hardware-name-{hardware.HardwareName}")>
- @hardware.HardwareName
- </div>
- </NavLink>
- @if (hardware.Systems.Any())
- {
- <ul class="ml-4 mt-2 border-l border-zinc-800 pl-4 space-y-2"
- data-testid=@($"system-list-{hardware.HardwareName}")>
- @foreach (var system in hardware.Systems
- .OrderByDescending(s => s.Services.Count)
- .ThenBy(s => s.SystemName))
- {
- <li data-testid=@($"system-item-{system.SystemName}")>
- <!-- System -->
- <NavLink
- href="@($"resources/systems/{Uri.EscapeDataString(system.SystemName)}")"
- class="block"
- data-testid=@($"system-link-{system.SystemName}")>
- <div class="text-zinc-300 hover:text-emerald-300">
- └─ @system.SystemName
- </div>
- </NavLink>
- @if (system.Services.Any())
- {
- <ul class="ml-4 mt-1 space-y-1"
- data-testid=@($"service-list-{system.SystemName}")>
- @foreach (var service in system.Services.OrderBy(s => s))
- {
- <li data-testid=@($"service-item-{service}")>
- <NavLink
- href="@($"resources/services/{Uri.EscapeDataString(service)}")"
- class="block hover:text-emerald-300"
- data-testid=@($"service-link-{service}")>
- > @service
- </NavLink>
- </li>
- }
- </ul>
- }
- </li>
- }
- </ul>
- }
- </li>
- }
- </ul>
- </div>
- }
- </div>
- }
- </div>
- @code {
- private List<HardwareTree>? _tree;
- protected override async Task OnInitializedAsync()
- {
- try
- {
- _tree = await HardwareRepository.GetTreeAsync();
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.ToString());
- throw;
- }
- }
- }
|