|
@@ -1,85 +1,485 @@
|
|
|
@using RackPeek.Domain.Resources.Hardware.Models
|
|
@using RackPeek.Domain.Resources.Hardware.Models
|
|
|
|
|
+@using RackPeek.Domain.Resources.Hardware.Desktops
|
|
|
|
|
+@using RackPeek.Domain.Resources.Hardware.Desktops.Cpus
|
|
|
|
|
+@using RackPeek.Domain.Resources.Hardware.Desktops.Drives
|
|
|
|
|
+@using RackPeek.Domain.Resources.Hardware.Desktops.Gpus
|
|
|
|
|
+@using RackPeek.Domain.Resources.Hardware.Desktops.Nics
|
|
|
|
|
+@using RackPeek.Web.Components.Modals
|
|
|
|
|
+
|
|
|
|
|
+@inject GetDesktopUseCase GetDesktopUseCase
|
|
|
|
|
+@inject UpdateDesktopUseCase UpdateDesktopUseCase
|
|
|
|
|
+@inject DeleteDesktopUseCase DeleteDesktopUseCase
|
|
|
|
|
+
|
|
|
|
|
+@inject AddDesktopCpuUseCase AddCpuUseCase
|
|
|
|
|
+@inject UpdateDesktopCpuUseCase UpdateCpuUseCase
|
|
|
|
|
+@inject RemoveDesktopCpuUseCase RemoveCpuUseCase
|
|
|
|
|
+
|
|
|
|
|
+@inject AddDesktopDriveUseCase AddDriveUseCase
|
|
|
|
|
+@inject UpdateDesktopDriveUseCase UpdateDriveUseCase
|
|
|
|
|
+@inject RemoveDesktopDriveUseCase RemoveDriveUseCase
|
|
|
|
|
+
|
|
|
|
|
+@inject AddDesktopNicUseCase AddNicUseCase
|
|
|
|
|
+@inject UpdateDesktopNicUseCase UpdateNicUseCase
|
|
|
|
|
+@inject RemoveDesktopNicUseCase RemoveNicUseCase
|
|
|
|
|
+
|
|
|
|
|
+@inject AddDesktopGpuUseCase AddGpuUseCase
|
|
|
|
|
+@inject UpdateDesktopGpuUseCase UpdateGpuUseCase
|
|
|
|
|
+@inject RemoveDesktopGpuUseCase RemoveGpuUseCase
|
|
|
|
|
+
|
|
|
<div class="border border-zinc-800 rounded p-4 bg-zinc-900">
|
|
<div class="border border-zinc-800 rounded p-4 bg-zinc-900">
|
|
|
<div class="flex justify-between items-center mb-3">
|
|
<div class="flex justify-between items-center mb-3">
|
|
|
- <div class="text-zinc-100">
|
|
|
|
|
|
|
+ <div class="text-zinc-100 hover:text-emerald-300">
|
|
|
|
|
+ <NavLink href="@($"/resources/hardware/{Desktop.Name}")" class="block">
|
|
|
|
|
+
|
|
|
@Desktop.Name
|
|
@Desktop.Name
|
|
|
|
|
+ </NavLink>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- @if (!string.IsNullOrWhiteSpace(Desktop.Model))
|
|
|
|
|
- {
|
|
|
|
|
- <span class="text-xs text-zinc-400">
|
|
|
|
|
- @Desktop.Model
|
|
|
|
|
- </span>
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ <div class="flex justify-between items-center mb-3">
|
|
|
|
|
+ @if (!string.IsNullOrWhiteSpace(Desktop.Model))
|
|
|
|
|
+ {
|
|
|
|
|
+ <span class="text-xs text-zinc-400">
|
|
|
|
|
+ @Desktop.Model
|
|
|
|
|
+ </span>
|
|
|
|
|
+ }
|
|
|
|
|
+ <div class="flex items-center gap-2">
|
|
|
|
|
+
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="text-xs text-red-400 hover:text-red-300 transition"
|
|
|
|
|
+ title="Delete server"
|
|
|
|
|
+ @onclick="ConfirmDelete">
|
|
|
|
|
+ Delete
|
|
|
|
|
+ </button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-3 text-sm">
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-3 text-sm">
|
|
|
|
|
|
|
|
- @if (Desktop.Cpus?.Any() == true)
|
|
|
|
|
- {
|
|
|
|
|
- <div>
|
|
|
|
|
- <div class="text-zinc-400 mb-1">CPU</div>
|
|
|
|
|
|
|
+ <!-- CPU -->
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div class="flex items-center justify-between mb-1 group">
|
|
|
|
|
+ <div class="text-zinc-400">
|
|
|
|
|
+ CPU
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="hover:text-emerald-400 transition"
|
|
|
|
|
+ title="Add CPU"
|
|
|
|
|
+ @onclick="OpenAddCpu">
|
|
|
|
|
+ +
|
|
|
|
|
+ </button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ @if (Desktop.Cpus?.Any() == true)
|
|
|
|
|
+ {
|
|
|
@foreach (var cpu in Desktop.Cpus)
|
|
@foreach (var cpu in Desktop.Cpus)
|
|
|
{
|
|
{
|
|
|
- <div class="text-zinc-300">
|
|
|
|
|
- @cpu.Model — @cpu.Cores cores / @cpu.Threads threads
|
|
|
|
|
|
|
+ <div class="flex items-center justify-between text-zinc-300 group hover:bg-zinc-800/40 rounded px-1 py-0.5">
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="hover:text-emerald-400"
|
|
|
|
|
+ title="Edit CPU"
|
|
|
|
|
+ @onclick="() => OpenEditCpu(cpu)">
|
|
|
|
|
+ @cpu.Model — @cpu.Cores cores / @cpu.Threads threads
|
|
|
|
|
+ </button>
|
|
|
</div>
|
|
</div>
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- RAM -->
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div class="text-zinc-400 mb-1">
|
|
|
|
|
+ RAM
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="hover:text-emerald-400 transition"
|
|
|
|
|
+ title="Edit RAM"
|
|
|
|
|
+ @onclick="EditRam">
|
|
|
|
|
+ +
|
|
|
|
|
+ </button>
|
|
|
</div>
|
|
</div>
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- @if (Desktop.Ram is not null)
|
|
|
|
|
- {
|
|
|
|
|
- <div>
|
|
|
|
|
- <div class="text-zinc-400 mb-1">RAM</div>
|
|
|
|
|
- <div class="text-zinc-300">
|
|
|
|
|
- @Desktop.Ram.Size GB @Desktop.Ram.Mts MT/s
|
|
|
|
|
|
|
+ @if (Desktop.Ram is not null)
|
|
|
|
|
+ {
|
|
|
|
|
+ <div class="flex items-center justify-between text-zinc-300 group hover:bg-zinc-800/40 rounded px-1 py-0.5">
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="hover:text-emerald-400"
|
|
|
|
|
+ @onclick="EditRam">
|
|
|
|
|
+ @($"{Desktop.Ram.Size} GB {Desktop.Ram.Mts} MT/s")
|
|
|
|
|
+ </button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ }
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- Drives -->
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div class="flex items-center justify-between mb-1 group">
|
|
|
|
|
+ <div class="text-zinc-400">
|
|
|
|
|
+ Drives
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="hover:text-emerald-400 transition"
|
|
|
|
|
+ title="Add Drive"
|
|
|
|
|
+ @onclick="OpenAddDrive">
|
|
|
|
|
+ +
|
|
|
|
|
+ </button>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- @if (Desktop.Drives?.Any() == true)
|
|
|
|
|
- {
|
|
|
|
|
- <div>
|
|
|
|
|
- <div class="text-zinc-400 mb-1">Drives</div>
|
|
|
|
|
|
|
+ @if (Desktop.Drives?.Any() == true)
|
|
|
|
|
+ {
|
|
|
@foreach (var drive in Desktop.Drives)
|
|
@foreach (var drive in Desktop.Drives)
|
|
|
{
|
|
{
|
|
|
- <div class="text-zinc-300">
|
|
|
|
|
- @drive.Type — @drive.Size GB
|
|
|
|
|
|
|
+ <div class="flex items-center justify-between text-zinc-300 group hover:bg-zinc-800/40 rounded px-1 py-0.5">
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="hover:text-emerald-400"
|
|
|
|
|
+ @onclick="() => OpenEditDrive(drive)">
|
|
|
|
|
+ @drive.Type — @drive.Size GB
|
|
|
|
|
+ </button>
|
|
|
</div>
|
|
</div>
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- NICs -->
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div class="flex items-center justify-between mb-1 group">
|
|
|
|
|
+ <div class="text-zinc-400">
|
|
|
|
|
+ NICs
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="hover:text-emerald-400 transition"
|
|
|
|
|
+ title="Add NIC"
|
|
|
|
|
+ @onclick="OpenAddNic">
|
|
|
|
|
+ +
|
|
|
|
|
+ </button>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- @if (Desktop.Nics?.Any() == true)
|
|
|
|
|
- {
|
|
|
|
|
- <div>
|
|
|
|
|
- <div class="text-zinc-400 mb-1">NICs</div>
|
|
|
|
|
|
|
+ @if (Desktop.Nics?.Any() == true)
|
|
|
|
|
+ {
|
|
|
@foreach (var nic in Desktop.Nics)
|
|
@foreach (var nic in Desktop.Nics)
|
|
|
{
|
|
{
|
|
|
- <div class="text-zinc-300">
|
|
|
|
|
- @nic.Type — @nic.Speed Gbps (@nic.Ports ports)
|
|
|
|
|
|
|
+ <div class="flex items-center justify-between text-zinc-300 group hover:bg-zinc-800/40 rounded px-1 py-0.5">
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="hover:text-emerald-400"
|
|
|
|
|
+ @onclick="() => OpenEditNic(nic)">
|
|
|
|
|
+ @nic.Type — @nic.Speed Gbps (@nic.Ports ports)
|
|
|
|
|
+ </button>
|
|
|
</div>
|
|
</div>
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- GPUs -->
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div class="flex items-center justify-between mb-1 group">
|
|
|
|
|
+ <div class="text-zinc-400">
|
|
|
|
|
+ GPUs
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="hover:text-emerald-400 transition"
|
|
|
|
|
+ title="Add GPU"
|
|
|
|
|
+ @onclick="OpenAddGpu">
|
|
|
|
|
+ +
|
|
|
|
|
+ </button>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- @if (Desktop.Gpus?.Any() == true)
|
|
|
|
|
- {
|
|
|
|
|
- <div>
|
|
|
|
|
- <div class="text-zinc-400 mb-1">GPU</div>
|
|
|
|
|
|
|
+ @if (Desktop.Gpus?.Any() == true)
|
|
|
|
|
+ {
|
|
|
@foreach (var gpu in Desktop.Gpus)
|
|
@foreach (var gpu in Desktop.Gpus)
|
|
|
{
|
|
{
|
|
|
- <div class="text-zinc-300">
|
|
|
|
|
- @gpu.Model — @gpu.Vram GB VRAM
|
|
|
|
|
|
|
+ <div class="flex items-center justify-between text-zinc-300 group hover:bg-zinc-800/40 rounded px-1 py-0.5">
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="hover:text-emerald-400"
|
|
|
|
|
+ @onclick="() => OpenEditGpu(gpu)">
|
|
|
|
|
+ @gpu.Model — @gpu.Vram GB VRAM
|
|
|
|
|
+ </button>
|
|
|
</div>
|
|
</div>
|
|
|
}
|
|
}
|
|
|
- </div>
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ </div>
|
|
|
|
|
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+<CpuModal
|
|
|
|
|
+ IsOpen="@_cpuModalOpen"
|
|
|
|
|
+ IsOpenChanged="v => _cpuModalOpen = v"
|
|
|
|
|
+ Value="@_editingCpu"
|
|
|
|
|
+ OnSubmit="HandleCpuSubmit"
|
|
|
|
|
+ OnDelete="HandleCpuDelete"/>
|
|
|
|
|
+
|
|
|
|
|
+<RamModal
|
|
|
|
|
+ IsOpen="@_isRamModalOpen"
|
|
|
|
|
+ IsOpenChanged="v => _isRamModalOpen = v"
|
|
|
|
|
+ Value="@Desktop.Ram"
|
|
|
|
|
+ OnSubmit="HandleRamSubmit"/>
|
|
|
|
|
+
|
|
|
|
|
+<DriveModal
|
|
|
|
|
+ IsOpen="@_driveModalOpen"
|
|
|
|
|
+ IsOpenChanged="v => _driveModalOpen = v"
|
|
|
|
|
+ Value="@_editingDrive"
|
|
|
|
|
+ OnSubmit="HandleDriveSubmit"
|
|
|
|
|
+ OnDelete="HandleDriveDelete"/>
|
|
|
|
|
+
|
|
|
|
|
+<NicModal
|
|
|
|
|
+ IsOpen="@_nicModalOpen"
|
|
|
|
|
+ IsOpenChanged="v => _nicModalOpen = v"
|
|
|
|
|
+ Value="@_editingNic"
|
|
|
|
|
+ OnSubmit="HandleNicSubmit"
|
|
|
|
|
+ OnDelete="HandleNicDelete" />
|
|
|
|
|
+
|
|
|
|
|
+<GpuModal
|
|
|
|
|
+ IsOpen="@_gpuModalOpen"
|
|
|
|
|
+ IsOpenChanged="v => _gpuModalOpen = v"
|
|
|
|
|
+ Value="@_editingGpu"
|
|
|
|
|
+ OnSubmit="HandleGpuSubmit"
|
|
|
|
|
+ OnDelete="HandleGpuDelete" />
|
|
|
|
|
+
|
|
|
|
|
+<ConfirmModal
|
|
|
|
|
+ IsOpen="_confirmDeleteOpen"
|
|
|
|
|
+ IsOpenChanged="v => _confirmDeleteOpen = v"
|
|
|
|
|
+ Title="Delete server"
|
|
|
|
|
+ ConfirmText="Delete"
|
|
|
|
|
+ ConfirmClass="bg-red-600 hover:bg-red-500"
|
|
|
|
|
+ OnConfirm="DeleteServer">
|
|
|
|
|
+ Are you sure you want to delete <strong>@Desktop.Name</strong>?
|
|
|
|
|
+ <br />
|
|
|
|
|
+ This will detach all dependent systems.
|
|
|
|
|
+</ConfirmModal>
|
|
|
|
|
|
|
|
@code {
|
|
@code {
|
|
|
- [Parameter] [EditorRequired] public Desktop Desktop { get; set; } = default!;
|
|
|
|
|
|
|
+ [Parameter] [EditorRequired]
|
|
|
|
|
+ public Desktop Desktop { get; set; } = default!;
|
|
|
|
|
+
|
|
|
|
|
+ #region RAM
|
|
|
|
|
+ private bool _isRamModalOpen;
|
|
|
|
|
+ private void EditRam()
|
|
|
|
|
+ {
|
|
|
|
|
+ _isRamModalOpen = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private async Task HandleRamSubmit(Ram value)
|
|
|
|
|
+ {
|
|
|
|
|
+ _isRamModalOpen = false;
|
|
|
|
|
+ await UpdateDesktopUseCase.ExecuteAsync(Desktop.Name, Desktop.Model, value.Size, value.Mts);
|
|
|
|
|
+ Desktop = await GetDesktopUseCase.ExecuteAsync(Desktop.Name);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ #endregion
|
|
|
|
|
+
|
|
|
|
|
+ #region CPU
|
|
|
|
|
+ bool _cpuModalOpen;
|
|
|
|
|
+ int _editingCpuIndex;
|
|
|
|
|
+ Cpu? _editingCpu;
|
|
|
|
|
+
|
|
|
|
|
+ void OpenAddCpu()
|
|
|
|
|
+ {
|
|
|
|
|
+ _editingCpuIndex = -1;
|
|
|
|
|
+ _editingCpu = null;
|
|
|
|
|
+ _cpuModalOpen = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void OpenEditCpu(Cpu cpu)
|
|
|
|
|
+ {
|
|
|
|
|
+ _editingCpu = cpu;
|
|
|
|
|
+ Desktop.Cpus ??= new();
|
|
|
|
|
+ _editingCpuIndex = Desktop.Cpus.IndexOf(cpu);;
|
|
|
|
|
+ _cpuModalOpen = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async Task HandleCpuSubmit(Cpu cpu)
|
|
|
|
|
+ {
|
|
|
|
|
+ Desktop.Cpus ??= new();
|
|
|
|
|
+
|
|
|
|
|
+ if (_editingCpuIndex < 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ await AddCpuUseCase.ExecuteAsync(Desktop.Name, cpu.Model, cpu.Cores, cpu.Threads);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ await UpdateCpuUseCase.ExecuteAsync(Desktop.Name, _editingCpuIndex, cpu.Model, cpu.Cores, cpu.Threads);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Desktop = await GetDesktopUseCase.ExecuteAsync(Desktop.Name);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async Task HandleCpuDelete(Cpu cpu)
|
|
|
|
|
+ {
|
|
|
|
|
+ await RemoveCpuUseCase.ExecuteAsync(Desktop.Name, _editingCpuIndex);
|
|
|
|
|
+ Desktop = await GetDesktopUseCase.ExecuteAsync(Desktop.Name);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ #endregion
|
|
|
|
|
+
|
|
|
|
|
+ #region Drives
|
|
|
|
|
+ bool _driveModalOpen;
|
|
|
|
|
+ int _editingDriveIndex;
|
|
|
|
|
+ Drive? _editingDrive;
|
|
|
|
|
+
|
|
|
|
|
+ void OpenAddDrive()
|
|
|
|
|
+ {
|
|
|
|
|
+ _editingDriveIndex = -1;
|
|
|
|
|
+ _editingDrive = null;
|
|
|
|
|
+ _driveModalOpen = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void OpenEditDrive(Drive drive)
|
|
|
|
|
+ {
|
|
|
|
|
+ _editingDrive = drive;
|
|
|
|
|
+ Desktop.Drives ??= new();
|
|
|
|
|
+ _editingDriveIndex = Desktop.Drives.IndexOf(drive);;
|
|
|
|
|
+ _driveModalOpen = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async Task HandleDriveSubmit(Drive drive)
|
|
|
|
|
+ {
|
|
|
|
|
+ Desktop.Drives ??= new();
|
|
|
|
|
+
|
|
|
|
|
+ if (_editingDriveIndex < 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ await AddDriveUseCase.ExecuteAsync(Desktop.Name, drive.Type, drive.Size);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ await UpdateDriveUseCase.ExecuteAsync(Desktop.Name, _editingDriveIndex, drive.Type, drive.Size);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Desktop = await GetDesktopUseCase.ExecuteAsync(Desktop.Name);
|
|
|
|
|
+ StateHasChanged();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async Task HandleDriveDelete(Drive drive)
|
|
|
|
|
+ {
|
|
|
|
|
+ await RemoveDriveUseCase.ExecuteAsync(Desktop.Name, _editingDriveIndex);
|
|
|
|
|
+ Desktop = await GetDesktopUseCase.ExecuteAsync(Desktop.Name);
|
|
|
|
|
+ StateHasChanged();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ #endregion
|
|
|
|
|
+
|
|
|
|
|
+ #region NICs
|
|
|
|
|
+ bool _nicModalOpen;
|
|
|
|
|
+ int _editingNicIndex;
|
|
|
|
|
+ Nic? _editingNic;
|
|
|
|
|
+
|
|
|
|
|
+ void OpenAddNic()
|
|
|
|
|
+ {
|
|
|
|
|
+ _editingNicIndex = -1;
|
|
|
|
|
+ _editingNic = null;
|
|
|
|
|
+ _nicModalOpen = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void OpenEditNic(Nic nic)
|
|
|
|
|
+ {
|
|
|
|
|
+ Desktop.Nics ??= new();
|
|
|
|
|
+ _editingNicIndex = Desktop.Nics.IndexOf(nic);
|
|
|
|
|
+ _editingNic = nic;
|
|
|
|
|
+ _nicModalOpen = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async Task HandleNicSubmit(Nic nic)
|
|
|
|
|
+ {
|
|
|
|
|
+ Desktop.Nics ??= new();
|
|
|
|
|
+
|
|
|
|
|
+ if (_editingNicIndex < 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ await AddNicUseCase.ExecuteAsync(
|
|
|
|
|
+ Desktop.Name,
|
|
|
|
|
+ nic.Type,
|
|
|
|
|
+ nic.Speed,
|
|
|
|
|
+ nic.Ports);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ await UpdateNicUseCase.ExecuteAsync(
|
|
|
|
|
+ Desktop.Name,
|
|
|
|
|
+ _editingNicIndex,
|
|
|
|
|
+ nic.Type,
|
|
|
|
|
+ nic.Speed,
|
|
|
|
|
+ nic.Ports);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Desktop = await GetDesktopUseCase.ExecuteAsync(Desktop.Name);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async Task HandleNicDelete(Nic nic)
|
|
|
|
|
+ {
|
|
|
|
|
+ await RemoveNicUseCase.ExecuteAsync(Desktop.Name, _editingNicIndex);
|
|
|
|
|
+ Desktop = await GetDesktopUseCase.ExecuteAsync(Desktop.Name);
|
|
|
|
|
+ }
|
|
|
|
|
+ #endregion
|
|
|
|
|
+
|
|
|
|
|
+ #region GPUs
|
|
|
|
|
+ bool _gpuModalOpen;
|
|
|
|
|
+ int _editingGpuIndex;
|
|
|
|
|
+ Gpu? _editingGpu;
|
|
|
|
|
+
|
|
|
|
|
+ void OpenAddGpu()
|
|
|
|
|
+ {
|
|
|
|
|
+ _editingGpuIndex = -1;
|
|
|
|
|
+ _editingGpu = null;
|
|
|
|
|
+ _gpuModalOpen = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void OpenEditGpu(Gpu gpu)
|
|
|
|
|
+ {
|
|
|
|
|
+ Desktop.Gpus ??= new();
|
|
|
|
|
+ _editingGpuIndex = Desktop.Gpus.IndexOf(gpu);
|
|
|
|
|
+ _editingGpu = gpu;
|
|
|
|
|
+ _gpuModalOpen = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async Task HandleGpuSubmit(Gpu gpu)
|
|
|
|
|
+ {
|
|
|
|
|
+ Desktop.Gpus ??= new();
|
|
|
|
|
+
|
|
|
|
|
+ if (_editingGpuIndex < 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ await AddGpuUseCase.ExecuteAsync(
|
|
|
|
|
+ Desktop.Name,
|
|
|
|
|
+ gpu.Model,
|
|
|
|
|
+ gpu.Vram);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ await UpdateGpuUseCase.ExecuteAsync(
|
|
|
|
|
+ Desktop.Name,
|
|
|
|
|
+ _editingGpuIndex,
|
|
|
|
|
+ gpu.Model,
|
|
|
|
|
+ gpu.Vram);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Desktop = await GetDesktopUseCase.ExecuteAsync(Desktop.Name);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async Task HandleGpuDelete(Gpu gpu)
|
|
|
|
|
+ {
|
|
|
|
|
+ await RemoveGpuUseCase.ExecuteAsync(Desktop.Name, _editingGpuIndex);
|
|
|
|
|
+ Desktop = await GetDesktopUseCase.ExecuteAsync(Desktop.Name);
|
|
|
|
|
+ }
|
|
|
|
|
+ #endregion
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+@code {
|
|
|
|
|
+ private bool _confirmDeleteOpen;
|
|
|
|
|
+ [Parameter]
|
|
|
|
|
+ public EventCallback<string> OnDeleted { get; set; }
|
|
|
|
|
+
|
|
|
|
|
+ void ConfirmDelete()
|
|
|
|
|
+ {
|
|
|
|
|
+ _confirmDeleteOpen = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async Task DeleteServer()
|
|
|
|
|
+ {
|
|
|
|
|
+ _confirmDeleteOpen = false;
|
|
|
|
|
+
|
|
|
|
|
+ await DeleteDesktopUseCase.ExecuteAsync(Desktop.Name);
|
|
|
|
|
+
|
|
|
|
|
+ if (OnDeleted.HasDelegate)
|
|
|
|
|
+ await OnDeleted.InvokeAsync(Desktop.Name);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|