| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- @using RackPeek.Domain.Resources.Connections
- @using RackPeek.Domain.Resources.SubResources
- @using RackPeek.Domain.UseCases.Ports
- @using Shared.Rcl.Connections
- @typeparam T where T : RackPeek.Domain.Resources.Resource, RackPeek.Domain.Resources.Servers.IPortResource
- @inject IAddPortUseCase<T> AddNicUseCase
- @inject IUpdatePortUseCase<T> UpdateNicUseCase
- @inject IRemovePortUseCase<T> RemoveNicUseCase
- @inject IGetResourceByNameUseCase<T> GetByNameUseCase
- <div data-testid="@($"{BaseTestId}-section")">
- <div class="flex items-center justify-between mb-1 group">
- <div class="text-zinc-400">
- Ports
- <button
- data-testid="@($"{BaseTestId}-add")"
- class="hover:text-emerald-400 group-hover:opacity-100 transition"
- title="Add Port"
- @onclick="OpenAddNic">
- +
- </button>
- </div>
- </div>
- @if (Resource.Ports?.Any() == true)
- {
- @foreach (var nic in Resource.Ports)
- {
- var idx = GetPortIndex(nic);
- <div class="group hover:bg-zinc-800/40 rounded px-1 py-1 space-y-1"
- data-testid="@($"{BaseTestId}-item-{idx}")">
- <div class="flex items-center justify-between text-zinc-300">
- <button
- data-testid="@($"{BaseTestId}-edit-{idx}")"
- class="hover:text-emerald-400 text-sm"
- title="Edit Port Group"
- @onclick="() => OpenEditNic(nic)">
- @nic.Type — @nic.Speed Gbps (@nic.Count ports)
- </button>
- </div>
- <div
- class="pl-1"
- data-testid="@($"{BaseTestId}-ports-{idx}")">
- <PortGroupVisualizer
- ResourceName="@Resource.Name"
- PortGroupIndex="@idx"
- PortGroup="@nic"
- TestIdPrefix="@($"{BaseTestId}-visualizer-{idx}")"
- OnPortClicked="HandlePortClicked"/>
- </div>
- </div>
- }
- }
- </div>
- <PortModal
- IsOpen="@_nicModalOpen"
- IsOpenChanged="v => _nicModalOpen = v"
- Value="@_editingNic"
- OnSubmit="HandleNicSubmit"
- OnDelete="HandleNicDelete"
- TestIdPrefix="@($"{BaseTestId}")"/>
- <PortConnectionModal
- IsOpen="@_connectionModalOpen"
- IsOpenChanged="v => _connectionModalOpen = v"
- SeedPort="@_selectedPort"
- TestIdPrefix="@($"{BaseTestId}")"/>
- @code {
- [Parameter][EditorRequired] public T Resource { get; set; } = default!;
- [Parameter] public EventCallback<T> OnResourceChanged { get; set; }
- [Parameter] public string? TestIdPrefix { get; set; }
- private string BaseTestId =>
- string.IsNullOrWhiteSpace(TestIdPrefix)
- ? "port-group-editor"
- : $"{TestIdPrefix}-port-group";
- bool _nicModalOpen;
- bool _connectionModalOpen;
- int _editingNicIndex;
- Port? _editingNic;
- PortReference? _selectedPort;
- void OpenAddNic()
- {
- _editingNicIndex = -1;
- _editingNic = null;
- _nicModalOpen = true;
- }
- void OpenEditNic(Port nic)
- {
- Resource.Ports ??= new List<Port>();
- _editingNicIndex = Resource.Ports.IndexOf(nic);
- _editingNic = nic;
- _nicModalOpen = true;
- }
- async Task HandleNicSubmit(Port nic)
- {
- Resource.Ports ??= new List<Port>();
- if (_editingNicIndex < 0)
- {
- await AddNicUseCase.ExecuteAsync(
- Resource.Name,
- nic.Type,
- nic.Speed,
- nic.Count);
- }
- else
- {
- await UpdateNicUseCase.ExecuteAsync(
- Resource.Name,
- _editingNicIndex,
- nic.Type,
- nic.Speed,
- nic.Count);
- }
- await RefreshResource();
- }
- async Task HandleNicDelete(Port nic)
- {
- await RemoveNicUseCase.ExecuteAsync(Resource.Name, _editingNicIndex);
- await RefreshResource();
- }
- async Task RefreshResource()
- {
- Resource = await GetByNameUseCase.ExecuteAsync(Resource.Name);
- if (OnResourceChanged.HasDelegate)
- await OnResourceChanged.InvokeAsync(Resource);
- StateHasChanged();
- }
- int GetPortIndex(Port port)
- {
- Resource.Ports ??= new List<Port>();
- return Resource.Ports.IndexOf(port);
- }
- void HandlePortClicked(PortReference port)
- {
- _selectedPort = port;
- _connectionModalOpen = true;
- }
- }
|