PortGroupEditor.razor 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. @using RackPeek.Domain.Resources.Connections
  2. @using RackPeek.Domain.Resources.SubResources
  3. @using RackPeek.Domain.UseCases.Ports
  4. @using Shared.Rcl.Connections
  5. @typeparam T where T : RackPeek.Domain.Resources.Resource, RackPeek.Domain.Resources.Servers.IPortResource
  6. @inject IAddPortUseCase<T> AddNicUseCase
  7. @inject IUpdatePortUseCase<T> UpdateNicUseCase
  8. @inject IRemovePortUseCase<T> RemoveNicUseCase
  9. @inject IGetResourceByNameUseCase<T> GetByNameUseCase
  10. <div data-testid="@($"{BaseTestId}-section")">
  11. <div class="flex items-center justify-between mb-1 group">
  12. <div class="text-zinc-400">
  13. Ports
  14. <button
  15. data-testid="@($"{BaseTestId}-add")"
  16. class="hover:text-emerald-400 group-hover:opacity-100 transition"
  17. title="Add Port"
  18. @onclick="OpenAddNic">
  19. +
  20. </button>
  21. </div>
  22. </div>
  23. @if (Resource.Ports?.Any() == true)
  24. {
  25. @foreach (var nic in Resource.Ports)
  26. {
  27. var idx = GetPortIndex(nic);
  28. <div class="group hover:bg-zinc-800/40 rounded px-1 py-1 space-y-1"
  29. data-testid="@($"{BaseTestId}-item-{idx}")">
  30. <div class="flex items-center justify-between text-zinc-300">
  31. <button
  32. data-testid="@($"{BaseTestId}-edit-{idx}")"
  33. class="hover:text-emerald-400 text-sm"
  34. title="Edit Port Group"
  35. @onclick="() => OpenEditNic(nic)">
  36. @nic.Type — @nic.Speed Gbps (@nic.Count ports)
  37. </button>
  38. </div>
  39. <div
  40. class="pl-1"
  41. data-testid="@($"{BaseTestId}-ports-{idx}")">
  42. <PortGroupVisualizer
  43. ResourceName="@Resource.Name"
  44. PortGroupIndex="@idx"
  45. PortGroup="@nic"
  46. TestIdPrefix="@($"{BaseTestId}-visualizer-{idx}")"
  47. OnPortClicked="HandlePortClicked"/>
  48. </div>
  49. </div>
  50. }
  51. }
  52. </div>
  53. <PortModal
  54. IsOpen="@_nicModalOpen"
  55. IsOpenChanged="v => _nicModalOpen = v"
  56. Value="@_editingNic"
  57. OnSubmit="HandleNicSubmit"
  58. OnDelete="HandleNicDelete"
  59. TestIdPrefix="@($"{BaseTestId}")"/>
  60. <PortConnectionModal
  61. IsOpen="@_connectionModalOpen"
  62. IsOpenChanged="v => _connectionModalOpen = v"
  63. SeedPort="@_selectedPort"
  64. TestIdPrefix="@($"{BaseTestId}")"/>
  65. @code {
  66. [Parameter][EditorRequired] public T Resource { get; set; } = default!;
  67. [Parameter] public EventCallback<T> OnResourceChanged { get; set; }
  68. [Parameter] public string? TestIdPrefix { get; set; }
  69. private string BaseTestId =>
  70. string.IsNullOrWhiteSpace(TestIdPrefix)
  71. ? "port-group-editor"
  72. : $"{TestIdPrefix}-port-group";
  73. bool _nicModalOpen;
  74. bool _connectionModalOpen;
  75. int _editingNicIndex;
  76. Port? _editingNic;
  77. PortReference? _selectedPort;
  78. void OpenAddNic()
  79. {
  80. _editingNicIndex = -1;
  81. _editingNic = null;
  82. _nicModalOpen = true;
  83. }
  84. void OpenEditNic(Port nic)
  85. {
  86. Resource.Ports ??= new List<Port>();
  87. _editingNicIndex = Resource.Ports.IndexOf(nic);
  88. _editingNic = nic;
  89. _nicModalOpen = true;
  90. }
  91. async Task HandleNicSubmit(Port nic)
  92. {
  93. Resource.Ports ??= new List<Port>();
  94. if (_editingNicIndex < 0)
  95. {
  96. await AddNicUseCase.ExecuteAsync(
  97. Resource.Name,
  98. nic.Type,
  99. nic.Speed,
  100. nic.Count);
  101. }
  102. else
  103. {
  104. await UpdateNicUseCase.ExecuteAsync(
  105. Resource.Name,
  106. _editingNicIndex,
  107. nic.Type,
  108. nic.Speed,
  109. nic.Count);
  110. }
  111. await RefreshResource();
  112. }
  113. async Task HandleNicDelete(Port nic)
  114. {
  115. await RemoveNicUseCase.ExecuteAsync(Resource.Name, _editingNicIndex);
  116. await RefreshResource();
  117. }
  118. async Task RefreshResource()
  119. {
  120. Resource = await GetByNameUseCase.ExecuteAsync(Resource.Name);
  121. if (OnResourceChanged.HasDelegate)
  122. await OnResourceChanged.InvokeAsync(Resource);
  123. StateHasChanged();
  124. }
  125. int GetPortIndex(Port port)
  126. {
  127. Resource.Ports ??= new List<Port>();
  128. return Resource.Ports.IndexOf(port);
  129. }
  130. void HandlePortClicked(PortReference port)
  131. {
  132. _selectedPort = port;
  133. _connectionModalOpen = true;
  134. }
  135. }