| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- @page "/"
- @using RackPeek.Domain.Resources
- @using RackPeek.Domain.Resources.Hardware
- @using RackPeek.Domain.Resources.Services.UseCases
- @using RackPeek.Domain.Resources.SystemResources.UseCases
- @using Shared.Rcl.Components
- @inject GetSystemSummaryUseCase SystemSummaryUseCase
- @inject GetServiceSummaryUseCase ServiceSummaryUseCase
- @inject GetHardwareUseCaseSummary HardwareSummaryUseCase
- <PageTitle>Home</PageTitle>
- <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6">
- @if (_loading)
- {
- <div class="text-zinc-500">loading summary…</div>
- }
- else
- {
- <!-- Totals + Tools -->
- <div class="mb-10 grid grid-cols-1 md:grid-cols-2 gap-6 max-w-4xl">
- <!-- Totals -->
- <div class="border border-zinc-800 rounded-md p-4">
- <div class="text-xs text-zinc-500 uppercase tracking-wider mb-3">
- Totals
- </div>
- <div class="grid grid-cols-2 gap-y-2">
- <div class="hover:text-emerald-300">
- <NavLink href="@("hardware/tree")">→ Hardware</NavLink>
- </div>
- <div class="text-right">@_hardware!.TotalHardware</div>
- <div class="hover:text-emerald-300">
- <NavLink href="@("systems/list")">→ Systems</NavLink>
- </div>
- <div class="text-right">@_system!.TotalSystems</div>
- <div class="hover:text-emerald-300">
- <NavLink href="@("services/list")">→ Services</NavLink>
- </div>
- <div class="text-right">@_service!.TotalServices</div>
- </div>
- </div>
- <!-- Tools -->
- <div class="border border-zinc-800 rounded-md p-4">
- <div class="text-xs text-zinc-500 uppercase tracking-wider mb-3">
- Tools
- </div>
- <ul class="space-y-2 text-sm">
- <li>
- <NavLink href="subnets"
- class="block hover:text-emerald-300"
- data-testid="home-tool-subnets">
- → Subnet Browser
- </NavLink>
- </li>
- <li>
- <NavLink href="cli"
- class="block hover:text-emerald-300"
- data-testid="home-tool-cli">
- → CLI Emulator
- </NavLink>
- </li>
- <li>
- <NavLink href="yaml"
- class="block hover:text-emerald-300"
- data-testid="home-tool-yaml">
- → YAML Editor
- </NavLink>
- </li>
- <li>
- <NavLink href="ansible/inventory"
- class="block hover:text-emerald-300"
- data-testid="home-tool-ansible">
- → Ansible Inventory Generator
- </NavLink>
- </li>
- <li>
- <NavLink href="ssh/export"
- class="block hover:text-emerald-300"
- data-testid="home-tool-ansible">
- → SSH Config Export
- </NavLink>
- </li>
- <li>
- <NavLink href="hosts/export"
- class="block hover:text-emerald-300"
- data-testid="home-tool-ansible">
- → Hosts File Export
- </NavLink>
- </li>
- <li>
- <NavLink href="docs"
- class="block hover:text-emerald-300"
- data-testid="home-tool-docs">
- → Documentation
- </NavLink>
- </li>
- </ul>
- </div>
- </div>
- <div class="space-y-10 mb-10">
- <TagListComponent/>
- </div>
- <div class="space-y-10 mb-10">
- <LabelListComponent/>
- </div>
- <!-- Tree -->
- <div class="space-y-10">
- <!-- Hardware -->
- <div>
- <div class="text-xs text-zinc-500 uppercase tracking-wider mb-3">
- Hardware
- </div>
- <ul class="space-y-2">
- <li class="text-zinc-100">
- ├─ Total (@_hardware!.TotalHardware)
- </li>
- @if (_hardware.HardwareByKind.Any())
- {
- <ul class="ml-4 mt-2 border-l border-zinc-800 pl-4 space-y-1">
- @foreach (var (kind, count) in _hardware.HardwareByKind.OrderByDescending(x => x.Value))
- {
- var pluralKind = Resource.KindToPlural(kind);
- <NavLink href="@($"{Uri.EscapeDataString(pluralKind)}/list")" class="block">
- <li class="text-zinc-500 hover:text-emerald-300">
- └─ @pluralKind (@count)
- </li>
- </NavLink>
- }
- </ul>
- }
- </ul>
- </div>
- <!-- Systems -->
- <div>
- <div class="text-xs text-zinc-500 uppercase tracking-wider mb-3">
- Systems
- </div>
- <ul class="space-y-3">
- <li>
- <div class="text-zinc-100">
- ├─ Total (@_system!.TotalSystems)
- </div>
- @if (_system.SystemsByType.Any())
- {
- <ul class="ml-4 mt-2 border-l border-zinc-800 pl-4 space-y-1">
- <li class="text-zinc-400">Types</li>
- @foreach (var (type, count) in _system.SystemsByType.OrderByDescending(x => x.Value))
- {
- <li class="text-zinc-500 hover:text-emerald-300">
- <NavLink href="@($"systems/list?type={Uri.EscapeDataString(type)}")"
- class="block">
- └─ @type (@count)
- </NavLink>
- </li>
- }
- </ul>
- }
- @if (_system.SystemsByOs.Any())
- {
- <ul class="ml-4 mt-2 border-l border-zinc-800 pl-4 space-y-1">
- <li class="text-zinc-400">Operating Systems</li>
- @foreach (var (os, count) in _system.SystemsByOs.OrderByDescending(x => x.Value))
- {
- <li class="text-zinc-500 hover:text-emerald-300">
- <NavLink href="@($"systems/list?os={Uri.EscapeDataString(os)}")" class="block">
- └─ @os (@count)
- </NavLink>
- </li>
- }
- </ul>
- }
- </li>
- </ul>
- </div>
- <!-- Services -->
- <div>
- <div class="text-xs text-zinc-500 uppercase tracking-wider mb-3">
- Services
- </div>
- <ul>
- <li class="text-zinc-100">
- └─ Total (@_service!.TotalServices)
- </li>
- <li class="ml-4 text-zinc-500">
- └─ IP Addresses (@_service!.TotalIpAddresses)
- </li>
- </ul>
- </div>
- </div>
- }
- </div>
- @code {
- private bool _loading = true;
- private SystemSummary? _system;
- private AllServicesSummary? _service;
- private HardwareSummary? _hardware;
- protected override async Task OnInitializedAsync()
- {
- var systemTask = SystemSummaryUseCase.ExecuteAsync();
- var serviceTask = ServiceSummaryUseCase.ExecuteAsync();
- var hardwareTask = HardwareSummaryUseCase.ExecuteAsync();
- await Task.WhenAll(systemTask, serviceTask, hardwareTask);
- _system = systemTask.Result;
- _service = serviceTask.Result;
- _hardware = hardwareTask.Result;
- _loading = false;
- }
- }
|