SystemsListPage.razor 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. @page "/systems/list"
  2. @using RackPeek.Domain.Persistence
  3. @using RackPeek.Domain.Resources.SystemResources
  4. @using RackPeek.Domain.Resources.SystemResources.UseCases
  5. @inject NavigationManager Nav
  6. <!-- TODO: Get rid of First -->
  7. <ResourcesListComponent TResource="SystemResource"
  8. Title="@PageTitle"
  9. TestId="systems"
  10. Resources="@Systems"
  11. ShouldGroup="true"
  12. GroupBy="@(s => { return s.RunsOn.FirstOrDefault(); })"
  13. OnCreated="NavigateToNewResource">
  14. <ItemTemplate Context="systemResource">
  15. <div data-testid=@($"systems-list-item-{systemResource.Name.Replace(" ", "-")}")>
  16. <SystemCardComponent System="systemResource"
  17. OnSave="UpdateSystem"
  18. OnDeleted="Reload"/>
  19. </div>
  20. </ItemTemplate>
  21. </ResourcesListComponent>
  22. @code {
  23. [Inject] IResourceCollection Repo { get; set; } = default!;
  24. [Inject] ISystemRepository SystemRepo { get; set; } = default!;
  25. [Inject] UpdateSystemUseCase UpdateSystemUseCase { get; set; } = default!;
  26. [Parameter]
  27. [SupplyParameterFromQuery(Name = "type")]
  28. public string? Type { get; set; }
  29. [Parameter]
  30. [SupplyParameterFromQuery(Name = "os")]
  31. public string? Os { get; set; }
  32. public IReadOnlyList<SystemResource> Systems { get; set; } = new List<SystemResource>();
  33. // Computed title that reflects active filters
  34. private string PageTitle
  35. {
  36. get
  37. {
  38. var type = Normalize(Type);
  39. var os = Normalize(Os);
  40. if (string.IsNullOrEmpty(type) && string.IsNullOrEmpty(os))
  41. return "Systems";
  42. var parts = new List<string>();
  43. if (!string.IsNullOrEmpty(type)) parts.Add(type);
  44. if (!string.IsNullOrEmpty(os)) parts.Add(os);
  45. return $"Systems ({string.Join(" / ", parts)})";
  46. }
  47. }
  48. protected override async Task OnInitializedAsync()
  49. {
  50. await Reload();
  51. await base.OnInitializedAsync();
  52. }
  53. protected override async Task OnParametersSetAsync()
  54. {
  55. // If query params change while staying on the page, keep list + title in sync
  56. await Reload();
  57. await base.OnParametersSetAsync();
  58. }
  59. private async Task Reload(string _ = "")
  60. {
  61. var type = Normalize(Type);
  62. var os = Normalize(Os);
  63. if (string.IsNullOrEmpty(type) && string.IsNullOrEmpty(os))
  64. {
  65. Systems = await Repo.GetAllOfTypeAsync<SystemResource>();
  66. }
  67. else
  68. {
  69. Systems = await SystemRepo.GetFilteredAsync(type, os);
  70. }
  71. }
  72. private static string? Normalize(string? s)
  73. {
  74. return string.IsNullOrWhiteSpace(s) ? null : s.Trim();
  75. }
  76. private async Task UpdateSystem(SystemEditModel edit)
  77. {
  78. await UpdateSystemUseCase.ExecuteAsync(
  79. edit.Name,
  80. edit.Type,
  81. edit.Os,
  82. edit.Cores,
  83. edit.Ram,
  84. edit.Ip,
  85. edit.RunsOn,
  86. edit.Notes
  87. );
  88. await Reload();
  89. }
  90. private Task NavigateToNewResource(string name)
  91. {
  92. Nav.NavigateTo($"resources/systems/{Uri.EscapeDataString(name)}");
  93. return Task.CompletedTask;
  94. }
  95. }