|
|
@@ -4,82 +4,79 @@
|
|
|
@using RackPeek.Domain.UseCases.Drives
|
|
|
@using RackPeek.Domain.UseCases.Gpus
|
|
|
@using RackPeek.Domain.UseCases.Nics
|
|
|
-@inject IGetAllResourcesByKindUseCase<Desktop> GetAllUseCase
|
|
|
@inject IGetResourceByNameUseCase<Desktop> GetByNameUseCase
|
|
|
-
|
|
|
-@inject UpdateDesktopUseCase UpdateDesktopUseCase
|
|
|
-@inject IDeleteResourceUseCase<Desktop> DeleteDesktopUseCase
|
|
|
-
|
|
|
+@inject UpdateDesktopUseCase UpdateUseCase
|
|
|
+@inject IDeleteResourceUseCase<Desktop> DeleteUseCase
|
|
|
@inject IAddCpuUseCase<Desktop> AddCpuUseCase
|
|
|
@inject IUpdateCpuUseCase<Desktop> UpdateCpuUseCase
|
|
|
@inject IRemoveCpuUseCase<Desktop> RemoveCpuUseCase
|
|
|
-
|
|
|
@inject IAddDriveUseCase<Desktop> AddDriveUseCase
|
|
|
@inject IUpdateDriveUseCase<Desktop> UpdateDriveUseCase
|
|
|
@inject IRemoveDriveUseCase<Desktop> RemoveDriveUseCase
|
|
|
-
|
|
|
@inject IAddNicUseCase<Desktop> AddNicUseCase
|
|
|
@inject IUpdateNicUseCase<Desktop> UpdateNicUseCase
|
|
|
@inject IRemoveNicUseCase<Desktop> RemoveNicUseCase
|
|
|
-
|
|
|
@inject IAddGpuUseCase<Desktop> AddGpuUseCase
|
|
|
@inject IUpdateGpuUseCase<Desktop> UpdateGpuUseCase
|
|
|
@inject IRemoveGpuUseCase<Desktop> RemoveGpuUseCase
|
|
|
@inject ICloneResourceUseCase<Desktop> CloneUseCase
|
|
|
-
|
|
|
@inject IRenameResourceUseCase<Desktop> RenameUseCase
|
|
|
@inject NavigationManager Nav
|
|
|
|
|
|
-<div class="border border-zinc-800 rounded p-4 bg-zinc-900">
|
|
|
+<div class="border border-zinc-800 rounded p-4 bg-zinc-900"
|
|
|
+ data-testid=@($"desktop-item-{Desktop.Name.Replace(" ", "-")}")>
|
|
|
+
|
|
|
<div class="flex justify-between items-center mb-3">
|
|
|
+
|
|
|
<div class="text-zinc-100 hover:text-emerald-300">
|
|
|
- <NavLink href="@($"resources/hardware/{Desktop.Name}")" class="block">
|
|
|
+ <NavLink href="@($"resources/hardware/{Desktop.Name}")"
|
|
|
+ class="block"
|
|
|
+ data-testid="open-desktop-link">
|
|
|
@Desktop.Name
|
|
|
</NavLink>
|
|
|
</div>
|
|
|
|
|
|
- <div class="flex justify-between items-center mb-3">
|
|
|
+ <div class="flex items-center gap-2">
|
|
|
+
|
|
|
@if (!string.IsNullOrWhiteSpace(Desktop.Model))
|
|
|
{
|
|
|
- <span class="text-xs text-zinc-400">
|
|
|
+ <span class="text-xs text-zinc-400"
|
|
|
+ data-testid="desktop-model-badge">
|
|
|
@Desktop.Model
|
|
|
</span>
|
|
|
}
|
|
|
- <div class="flex items-center gap-2">
|
|
|
- <button class="text-xs text-blue-400 hover:text-blue-300 transition"
|
|
|
- title="Rename service"
|
|
|
- @onclick="OpenRename">
|
|
|
- Rename
|
|
|
- </button>
|
|
|
- <button
|
|
|
+
|
|
|
+ <button data-testid="rename-desktop-button"
|
|
|
+ class="text-xs text-blue-400 hover:text-blue-300 transition"
|
|
|
+ @onclick="OpenRename">
|
|
|
+ Rename
|
|
|
+ </button>
|
|
|
+
|
|
|
+ <button data-testid="clone-desktop-button"
|
|
|
class="text-xs text-emerald-400 hover:text-emerald-300 transition"
|
|
|
- title="Clone service"
|
|
|
@onclick="OpenClone">
|
|
|
- Clone
|
|
|
- </button>
|
|
|
- <button
|
|
|
+ Clone
|
|
|
+ </button>
|
|
|
+
|
|
|
+ <button data-testid="delete-desktop-button"
|
|
|
class="text-xs text-red-400 hover:text-red-300 transition"
|
|
|
- title="Delete server"
|
|
|
@onclick="ConfirmDelete">
|
|
|
- Delete
|
|
|
- </button>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
+ Delete
|
|
|
+ </button>
|
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-3 text-sm">
|
|
|
|
|
|
<!-- CPU -->
|
|
|
- <div>
|
|
|
+ <div data-testid="desktop-cpu-section">
|
|
|
<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 data-testid="add-cpu-button"
|
|
|
+ class="hover:text-emerald-400 transition"
|
|
|
+ @onclick="OpenAddCpu">
|
|
|
+
|
|
|
</button>
|
|
|
</div>
|
|
|
@@ -89,12 +86,10 @@
|
|
|
{
|
|
|
@foreach (var cpu in Desktop.Cpus)
|
|
|
{
|
|
|
- <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)">
|
|
|
+ <div class="flex items-center justify-between text-zinc-300 group hover:bg-zinc-800/40 rounded px-1 py-0.5">
|
|
|
+ <button data-testid=@($"edit-cpu-{cpu.ToString().Replace(" ", "-")}")
|
|
|
+ class="hover:text-emerald-400"
|
|
|
+ @onclick="() => OpenEditCpu(cpu)">
|
|
|
@cpu.Model — @cpu.Cores cores / @cpu.Threads threads
|
|
|
</button>
|
|
|
</div>
|
|
|
@@ -103,24 +98,22 @@
|
|
|
</div>
|
|
|
|
|
|
<!-- RAM -->
|
|
|
- <div>
|
|
|
+ <div data-testid="desktop-ram-section">
|
|
|
<div class="text-zinc-400 mb-1">
|
|
|
RAM
|
|
|
- <button
|
|
|
- class="hover:text-emerald-400 transition"
|
|
|
- title="Edit RAM"
|
|
|
- @onclick="EditRam">
|
|
|
+ <button data-testid="edit-ram-button"
|
|
|
+ class="hover:text-emerald-400 transition"
|
|
|
+ @onclick="EditRam">
|
|
|
+
|
|
|
</button>
|
|
|
</div>
|
|
|
|
|
|
@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">
|
|
|
+ <div class="flex items-center justify-between text-zinc-300 group hover:bg-zinc-800/40 rounded px-1 py-0.5">
|
|
|
+ <button data-testid="ram-value-button"
|
|
|
+ class="hover:text-emerald-400"
|
|
|
+ @onclick="EditRam">
|
|
|
@($"{Desktop.Ram.Size} GB {Desktop.Ram.Mts} MT/s")
|
|
|
</button>
|
|
|
</div>
|
|
|
@@ -128,14 +121,13 @@
|
|
|
</div>
|
|
|
|
|
|
<!-- Drives -->
|
|
|
- <div>
|
|
|
+ <div data-testid="desktop-drive-section">
|
|
|
<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 data-testid="add-drive-button"
|
|
|
+ class="hover:text-emerald-400 transition"
|
|
|
+ @onclick="OpenAddDrive">
|
|
|
+
|
|
|
</button>
|
|
|
</div>
|
|
|
@@ -145,11 +137,10 @@
|
|
|
{
|
|
|
@foreach (var drive in Desktop.Drives)
|
|
|
{
|
|
|
- <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)">
|
|
|
+ <div class="flex items-center justify-between text-zinc-300 group hover:bg-zinc-800/40 rounded px-1 py-0.5">
|
|
|
+ <button data-testid=@($"edit-drive-{drive.Type}-{drive.Size}")
|
|
|
+ class="hover:text-emerald-400"
|
|
|
+ @onclick="() => OpenEditDrive(drive)">
|
|
|
@drive.Type — @drive.Size GB
|
|
|
</button>
|
|
|
</div>
|
|
|
@@ -158,14 +149,13 @@
|
|
|
</div>
|
|
|
|
|
|
<!-- NICs -->
|
|
|
- <div>
|
|
|
+ <div data-testid="desktop-nic-section">
|
|
|
<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 data-testid="add-nic-button"
|
|
|
+ class="hover:text-emerald-400 transition"
|
|
|
+ @onclick="OpenAddNic">
|
|
|
+
|
|
|
</button>
|
|
|
</div>
|
|
|
@@ -175,11 +165,10 @@
|
|
|
{
|
|
|
@foreach (var nic in Desktop.Nics)
|
|
|
{
|
|
|
- <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)">
|
|
|
+ <div class="flex items-center justify-between text-zinc-300 group hover:bg-zinc-800/40 rounded px-1 py-0.5">
|
|
|
+ <button data-testid=@($"edit-nic-{nic.Type}-{nic.Speed}")
|
|
|
+ class="hover:text-emerald-400"
|
|
|
+ @onclick="() => OpenEditNic(nic)">
|
|
|
@nic.Type — @nic.Speed Gbps (@nic.Ports ports)
|
|
|
</button>
|
|
|
</div>
|
|
|
@@ -188,14 +177,13 @@
|
|
|
</div>
|
|
|
|
|
|
<!-- GPUs -->
|
|
|
- <div>
|
|
|
+ <div data-testid="desktop-gpu-section">
|
|
|
<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 data-testid="add-gpu-button"
|
|
|
+ class="hover:text-emerald-400 transition"
|
|
|
+ @onclick="OpenAddGpu">
|
|
|
+
|
|
|
</button>
|
|
|
</div>
|
|
|
@@ -205,11 +193,10 @@
|
|
|
{
|
|
|
@foreach (var gpu in Desktop.Gpus)
|
|
|
{
|
|
|
- <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)">
|
|
|
+ <div class="flex items-center justify-between text-zinc-300 group hover:bg-zinc-800/40 rounded px-1 py-0.5">
|
|
|
+ <button data-testid=@($"edit-gpu-{gpu.Model}-{gpu.Vram}")
|
|
|
+ class="hover:text-emerald-400"
|
|
|
+ @onclick="() => OpenEditGpu(gpu)">
|
|
|
@gpu.Model — @gpu.Vram GB VRAM
|
|
|
</button>
|
|
|
</div>
|
|
|
@@ -221,89 +208,54 @@
|
|
|
|
|
|
</div>
|
|
|
|
|
|
- <div class="md:col-span-2">
|
|
|
+ <div class="md:col-span-2" data-testid="desktop-notes-section">
|
|
|
<div class="text-zinc-400 mb-1">Notes</div>
|
|
|
|
|
|
@if (!_editingNotes)
|
|
|
{
|
|
|
- <MarkdownViewer
|
|
|
- Value="@Desktop.Notes"
|
|
|
- ShowEditButton="true"
|
|
|
- OnEdit="BeginNotesEdit"/>
|
|
|
+ <MarkdownViewer Value="@Desktop.Notes"
|
|
|
+ ShowEditButton="true"
|
|
|
+ OnEdit="BeginNotesEdit"
|
|
|
+ TestIdPrefix="desktop-notes-viewer"/>
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- <MarkdownEditor
|
|
|
- @bind-Value="_notesDraft"
|
|
|
- ShowActionButtons="true"
|
|
|
- OnSave="SaveNotes"
|
|
|
- OnCancel="CancelNotesEdit"/>
|
|
|
+ <MarkdownEditor @bind-Value="_notesDraft"
|
|
|
+ ShowActionButtons="true"
|
|
|
+ OnSave="SaveNotes"
|
|
|
+ OnCancel="CancelNotesEdit"
|
|
|
+ TestIdPrefix="desktop-notes-editor"/>
|
|
|
}
|
|
|
</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"
|
|
|
- TestIdPrefix="Desktop">
|
|
|
+
|
|
|
+<ConfirmModal IsOpen="_confirmDeleteOpen"
|
|
|
+ IsOpenChanged="v => _confirmDeleteOpen = v"
|
|
|
+ Title="Delete desktop"
|
|
|
+ ConfirmText="Delete"
|
|
|
+ ConfirmClass="bg-red-600 hover:bg-red-500"
|
|
|
+ OnConfirm="DeleteServer"
|
|
|
+ TestIdPrefix="Desktop">
|
|
|
Are you sure you want to delete <strong>@Desktop.Name</strong>?
|
|
|
- <br/>
|
|
|
- This will detach all dependent systems.
|
|
|
</ConfirmModal>
|
|
|
-<StringValueModal
|
|
|
- IsOpen="_renameOpen"
|
|
|
- IsOpenChanged="v => _renameOpen = v"
|
|
|
- Title="Rename desktop"
|
|
|
- Description="Enter a new name for this desktop"
|
|
|
- Label="New desktop name"
|
|
|
- Value="@Desktop.Name"
|
|
|
- OnSubmit="HandleRenameSubmit"/>
|
|
|
-<StringValueModal
|
|
|
- IsOpen="_cloneOpen"
|
|
|
- IsOpenChanged="v => _cloneOpen = v"
|
|
|
- Title="Clone resource"
|
|
|
- Description="Enter a name for the cloned resource"
|
|
|
- Label="New resource name"
|
|
|
- Value="@($"{Desktop.Name}-copy")"
|
|
|
- OnSubmit="HandleCloneSubmit"/>
|
|
|
+
|
|
|
+<StringValueModal IsOpen="_renameOpen"
|
|
|
+ IsOpenChanged="v => _renameOpen = v"
|
|
|
+ Title="Rename desktop"
|
|
|
+ Description="Enter a new name for this desktop"
|
|
|
+ Label="New desktop name"
|
|
|
+ Value="@Desktop.Name"
|
|
|
+ OnSubmit="HandleRenameSubmit"
|
|
|
+ TestIdPrefix="desktop-rename"/>
|
|
|
+
|
|
|
+<StringValueModal IsOpen="_cloneOpen"
|
|
|
+ IsOpenChanged="v => _cloneOpen = v"
|
|
|
+ Title="Clone resource"
|
|
|
+ Description="Enter a name for the cloned resource"
|
|
|
+ Label="New resource name"
|
|
|
+ Value="@($"{Desktop.Name}-copy")"
|
|
|
+ OnSubmit="HandleCloneSubmit"
|
|
|
+ TestIdPrefix="desktop-clone"/>
|
|
|
|
|
|
@code {
|
|
|
[Parameter] [EditorRequired] public Desktop Desktop { get; set; } = default!;
|
|
|
@@ -320,7 +272,7 @@
|
|
|
private async Task HandleRamSubmit(Ram value)
|
|
|
{
|
|
|
_isRamModalOpen = false;
|
|
|
- await UpdateDesktopUseCase.ExecuteAsync(Desktop.Name, Desktop.Model, value.Size, value.Mts);
|
|
|
+ await UpdateUseCase.ExecuteAsync(Desktop.Name, Desktop.Model, value.Size, value.Mts);
|
|
|
Desktop = await GetByNameUseCase.ExecuteAsync(Desktop.Name);
|
|
|
}
|
|
|
|
|
|
@@ -541,7 +493,7 @@
|
|
|
{
|
|
|
_confirmDeleteOpen = false;
|
|
|
|
|
|
- await DeleteDesktopUseCase.ExecuteAsync(Desktop.Name);
|
|
|
+ await DeleteUseCase.ExecuteAsync(Desktop.Name);
|
|
|
|
|
|
if (OnDeleted.HasDelegate)
|
|
|
await OnDeleted.InvokeAsync(Desktop.Name);
|
|
|
@@ -605,7 +557,7 @@
|
|
|
{
|
|
|
_editingNotes = false;
|
|
|
|
|
|
- await UpdateDesktopUseCase.ExecuteAsync(
|
|
|
+ await UpdateUseCase.ExecuteAsync(
|
|
|
Desktop.Name,
|
|
|
Desktop.Model,
|
|
|
Desktop.Ram?.Size,
|