TagPage.razor 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. @page "/tags/{TagName}"
  2. @using RackPeek.Domain.Persistence
  3. @using RackPeek.Domain.Resources
  4. @using RackPeek.Domain.Resources.SystemResources
  5. @inject IResourceCollection ResourceRepository
  6. <PageTitle>Tag: @TagName</PageTitle>
  7. <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6 space-y-6"
  8. data-testid="tag-page-root">
  9. <!-- Header -->
  10. <div class="space-y-2">
  11. <h1 class="text-lg text-zinc-100"
  12. data-testid="tag-page-title">
  13. Tag: <span class="text-emerald-400">@TagName</span>
  14. </h1>
  15. </div>
  16. @if (_resources is null)
  17. {
  18. <div class="text-zinc-500">loading resources…</div>
  19. }
  20. else if (_resources.Count == 0)
  21. {
  22. <div class="text-zinc-500"
  23. data-testid="tag-page-empty">
  24. no resources found for this tag
  25. </div>
  26. }
  27. else
  28. {
  29. <div class="space-y-3"
  30. data-testid="tag-page-list">
  31. @foreach (var resource in _resources.OrderBy(r => r.Name))
  32. {
  33. <div class="border border-zinc-800 rounded p-3 bg-zinc-900 hover:border-emerald-700 transition"
  34. data-testid=@($"tag-page-item-{resource.Name.Replace(" ", "-")}")>
  35. <NavLink href="@GetResourceUrl(resource)"
  36. class="block hover:text-emerald-300">
  37. <div class="flex justify-between items-center">
  38. <div class="text-zinc-100">
  39. @resource.Name
  40. </div>
  41. <div class="text-xs text-zinc-500 uppercase tracking-wide">
  42. @resource.Kind
  43. </div>
  44. </div>
  45. </NavLink>
  46. </div>
  47. }
  48. </div>
  49. }
  50. </div>
  51. @code {
  52. [Parameter] public string TagName { get; set; } = string.Empty;
  53. private IReadOnlyList<Resource>? _resources;
  54. protected override async Task OnParametersSetAsync()
  55. {
  56. var decoded = Uri.UnescapeDataString(TagName);
  57. _resources = await ResourceRepository.GetByTagAsync(decoded);
  58. }
  59. private string GetResourceUrl(Resource resource)
  60. {
  61. if (resource.Kind == SystemResource.KindLabel)
  62. {
  63. return $"resources/systems/{Uri.EscapeDataString(resource.Name)}";
  64. }
  65. if (resource.Kind == Service.KindLabel)
  66. {
  67. return $"resources/services/{Uri.EscapeDataString(resource.Name)}";
  68. }
  69. return $"resources/hardware/{Uri.EscapeDataString(resource.Name)}";
  70. }
  71. }