| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- @page "/hardware/tree"
- @using RackPeek.Domain.Resources.Hardware
- @inject IHardwareRepository HardwareRepository
- <PageTitle>Hardware</PageTitle>
- <h1 class="text-lg text-zinc-100">
- Hardware
- </h1>
- <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6">
- <nav class="space-x-6 text-sm mb-4">
- <NavLink href="/servers/list" class="hover:text-emerald-400" activeClass="text-emerald-400 font-semibold">
- Servers
- </NavLink>
- <NavLink href="/switches/list" class="hover:text-emerald-400" activeClass="text-emerald-400 font-semibold">
- Switches
- </NavLink>
- <NavLink href="/desktops/list" class="hover:text-emerald-400" activeClass="text-emerald-400 font-semibold">
- Desktops
- </NavLink>
- <NavLink href="/accesspoints/list" class="hover:text-emerald-400" activeClass="text-emerald-400 font-semibold">
- AccessPoints
- </NavLink>
- </nav>
-
- @if (_tree is null)
- {
- <div class="text-zinc-500">loading tree…</div>
- }
- else if (_tree.Count == 0)
- {
- <div class="text-zinc-500">no resources found</div>
- }
- else
- {
- @foreach (var group in _tree
- .OrderBy(h => h.Kind)
- .ThenBy(h => h.HardwareName)
- .GroupBy(h => h.Kind))
- {
- <!-- Hardware Kind Header -->
- <div class="mb-6">
- <div class="text-xs text-zinc-500 uppercase tracking-wider mb-3">
- @group.Key
- </div>
- <ul class="space-y-4">
- @foreach (var hardware in group)
- {
- <li>
- <!-- Hardware -->
- <NavLink href="@($"/resources/hardware/{hardware.HardwareName}")" class="block">
-
- @if (hardware.Systems.Any())
- {
- <div class="text-zinc-100">
- @hardware.HardwareName (@hardware.Systems.Count / @hardware.Systems.Sum(s => s.Services.Count))
- </div>
- }
- else
- {
- <div class="text-zinc-100">
- @hardware.HardwareName
- </div>
- }
-
- </NavLink>
- @if (hardware.Systems.Any())
- {
- <ul class="ml-4 mt-2 border-l border-zinc-800 pl-4 space-y-2">
- @foreach (var system in hardware.Systems.OrderBy(s => s.SystemName))
- {
- <li>
- <!-- System -->
- <NavLink href="@($"/resources/systems/{system.SystemName}")" class="block">
- @if (system.Services.Any())
- {
- <div class="text-zinc-300">
- └─ @system.SystemName (@system.Services.Count)
- </div>
- }
- else
- {
- <div class="text-zinc-300">
- └─ @system.SystemName
- </div>
- }
-
- </NavLink>
- @if (system.Services.Any())
- {
- <ul class="ml-4 mt-1 space-y-1">
- @foreach (var service in system.Services.OrderBy(s => s))
- {
- <NavLink href="@($"/resources/services/{service}")"
- class="block">
- <li class="text-zinc-500">
- > @service
- </li>
- </NavLink>
- }
- </ul>
- }
- </li>
- }
- </ul>
- }
- </li>
- }
- </ul>
- </div>
- }
- }
- </div>
- @code {
- private List<HardwareTree>? _tree;
- protected override async Task OnInitializedAsync()
- {
- _tree = await HardwareRepository.GetTreeAsync();
- }
- }
|