Просмотр исходного кода

Merge pull request #158 from Timmoth/#143-ram-enhancements

#143 ram enhancements
Tim Jones 1 месяц назад
Родитель
Сommit
faaf2e4c02

+ 1 - 1
RackPeek.Domain/Helpers/ThrowIfInvalid.cs

@@ -22,7 +22,7 @@ public static class ThrowIfInvalid
             throw new ValidationException("Model name is too long.");
     }
 
-    public static void RamGb(int? value)
+    public static void RamGb(double? value)
     {
         if (value is null) throw new ValidationException("RAM value must be specified.");
 

+ 1 - 1
RackPeek.Domain/Resources/Desktops/DesktopHardwareReport.cs

@@ -11,7 +11,7 @@ public record DesktopHardwareRow(
     string CpuSummary,
     int TotalCores,
     int TotalThreads,
-    int RamGb,
+    double RamGb,
     int TotalStorageGb,
     int SsdStorageGb,
     int HddStorageGb,

+ 19 - 1
RackPeek.Domain/Resources/Desktops/UpdateDesktopUseCase.cs

@@ -9,7 +9,7 @@ public class UpdateDesktopUseCase(IResourceCollection repository) : IUseCase
     public async Task ExecuteAsync(
         string name,
         string? model = null,
-        int? ramGb = null,
+        double? ramGb = null,
         int? ramMts = null,
         string? notes = null
     )
@@ -39,6 +39,24 @@ public class UpdateDesktopUseCase(IResourceCollection repository) : IUseCase
             desktop.Ram ??= new Ram();
             desktop.Ram.Mts = ramMts.Value;
         }
+        
+        if (desktop.Ram != null)
+        {
+            if (desktop.Ram.Size == 0)
+            {
+                desktop.Ram.Size = null;
+            }
+            
+            if (desktop.Ram.Mts == 0)
+            {
+                desktop.Ram.Mts = null;
+            }
+
+            if (desktop.Ram.Size == null && desktop.Ram.Mts == null)
+            {
+                desktop.Ram = null;
+            }
+        }
 
         if (notes != null) desktop.Notes = notes;
         await repository.UpdateAsync(desktop);

+ 1 - 1
RackPeek.Domain/Resources/Laptops/LaptopHardwareReportUseCase.cs

@@ -63,7 +63,7 @@ public record LaptopHardwareRow(
     string CpuSummary,
     int TotalCores,
     int TotalThreads,
-    int RamGb,
+    double RamGb,
     int TotalStorageGb,
     int SsdStorageGb,
     int HddStorageGb,

+ 20 - 1
RackPeek.Domain/Resources/Laptops/UpdateLaptopUseCase.cs

@@ -9,7 +9,7 @@ public class UpdateLaptopUseCase(IResourceCollection repository) : IUseCase
     public async Task ExecuteAsync(
         string name,
         string? model = null,
-        int? ramGb = null,
+        double? ramGb = null,
         int? ramMts = null,
         string? notes = null
     )
@@ -39,6 +39,25 @@ public class UpdateLaptopUseCase(IResourceCollection repository) : IUseCase
             laptop.Ram ??= new Ram();
             laptop.Ram.Mts = ramMts.Value;
         }
+        
+        if (laptop.Ram != null)
+        {
+            if (laptop.Ram.Size == 0)
+            {
+                laptop.Ram.Size = null;
+            }
+            
+            if (laptop.Ram.Mts == 0)
+            {
+                laptop.Ram.Mts = null;
+            }
+
+            if (laptop.Ram.Size == null && laptop.Ram.Mts == null)
+            {
+                laptop.Ram = null;
+            }
+        }
+
 
         if (notes != null) laptop.Notes = notes;
         await repository.UpdateAsync(laptop);

+ 1 - 1
RackPeek.Domain/Resources/Servers/DescribeServerUseCase.cs

@@ -8,7 +8,7 @@ public record ServerDescription(
     string CpuSummary,
     int TotalCores,
     int TotalThreads,
-    int RamGb,
+    double RamGb,
     int TotalStorageGb,
     int NicPorts,
     bool Ipmi

+ 1 - 1
RackPeek.Domain/Resources/Servers/ServerHardwareReport.cs

@@ -11,7 +11,7 @@ public record ServerHardwareRow(
     string CpuSummary,
     int TotalCores,
     int TotalThreads,
-    int RamGb,
+    double RamGb,
     int TotalStorageGb,
     int SsdStorageGb,
     int HddStorageGb,

+ 19 - 1
RackPeek.Domain/Resources/Servers/UpdateServerUseCase.cs

@@ -8,7 +8,7 @@ public class UpdateServerUseCase(IResourceCollection repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string name,
-        int? ramGb = null,
+        double? ramGb = null,
         int? ramMts = null,
         bool? ipmi = null,
         string? notes = null
@@ -38,6 +38,24 @@ public class UpdateServerUseCase(IResourceCollection repository) : IUseCase
             server.Ram.Mts = ramMts.Value;
         }
 
+        if (server.Ram != null)
+        {
+            if (server.Ram.Size == 0)
+            {
+                server.Ram.Size = null;
+            }
+            
+            if (server.Ram.Mts == 0)
+            {
+                server.Ram.Mts = null;
+            }
+
+            if (server.Ram.Size == null && server.Ram.Mts == null)
+            {
+                server.Ram = null;
+            }
+        }
+
         // ---- IPMI ----
         if (ipmi.HasValue) server.Ipmi = ipmi.Value;
         if (notes != null) server.Notes = notes;

+ 1 - 1
RackPeek.Domain/Resources/SubResources/Ram.cs

@@ -2,6 +2,6 @@ namespace RackPeek.Domain.Resources.SubResources;
 
 public class Ram
 {
-    public int? Size { get; set; }
+    public double? Size { get; set; }
     public int? Mts { get; set; }
 }

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/SystemResource.cs

@@ -21,6 +21,6 @@ public class SystemResource : Resource, IDriveResource
     public string? Type { get; set; }
     public string? Os { get; set; }
     public int? Cores { get; set; }
-    public int? Ram { get; set; }
+    public double? Ram { get; set; }
     public List<Drive>? Drives { get; set; }
 }

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/UseCases/DescribeSystemUseCase.cs

@@ -8,7 +8,7 @@ public record SystemDescription(
     string? Type,
     string? Os,
     int Cores,
-    int RamGb,
+    double RamGb,
     int TotalStorageGb,
     string? RunsOn
 );

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/UseCases/SystemReportUseCase.cs

@@ -11,7 +11,7 @@ public record SystemReportRow(
     string? Type,
     string? Os,
     int Cores,
-    int RamGb,
+    double RamGb,
     int TotalStorageGb,
     string? RunsOn
 );

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/UseCases/UpdateSystemUseCase.cs

@@ -10,7 +10,7 @@ public class UpdateSystemUseCase(IResourceCollection repository) : IUseCase
         string? type = null,
         string? os = null,
         int? cores = null,
-        int? ram = null,
+        double? ram = null,
         string? runsOn = null,
         string? notes = null
     )

+ 42 - 2
Shared.Rcl/Desktops/DesktopCardComponent.razor

@@ -259,6 +259,46 @@
                   OnSubmit="HandleCloneSubmit"
                   TestIdPrefix="desktop-clone"/>
 
+
+<CpuModal IsOpen="@_cpuModalOpen"
+          IsOpenChanged="v => _cpuModalOpen = v"
+          Value="@_editingCpu"
+          OnSubmit="HandleCpuSubmit"
+          OnDelete="HandleCpuDelete" 
+          TestIdPrefix="desktop"/>
+
+
+<RamModal IsOpen="@_isRamModalOpen"
+          IsOpenChanged="v => _isRamModalOpen = v"
+          Value="@Desktop.Ram"
+          OnSubmit="HandleRamSubmit" 
+          TestIdPrefix="desktop"/>
+
+
+<DriveModal IsOpen="@_driveModalOpen"
+            IsOpenChanged="v => _driveModalOpen = v"
+            Value="@_editingDrive"
+            OnSubmit="HandleDriveSubmit"
+            OnDelete="HandleDriveDelete" 
+            TestIdPrefix="desktop"/>
+
+
+<GpuModal IsOpen="@_gpuModalOpen"
+          IsOpenChanged="v => _gpuModalOpen = v"
+          Value="@_editingGpu"
+          OnSubmit="HandleGpuSubmit"
+          OnDelete="HandleGpuDelete" 
+          TestIdPrefix="desktop"/>
+
+
+<NicModal
+    IsOpen="@_nicModalOpen"
+    IsOpenChanged="v => _nicModalOpen = v"
+    Value="@_editingNic"
+    OnSubmit="HandleNicSubmit"
+    OnDelete="HandleNicDelete"
+    TestIdPrefix="desktop-nic"/>
+
 @code {
     [Parameter] [EditorRequired] public Desktop Desktop { get; set; } = default!;
 
@@ -271,10 +311,10 @@
         _isRamModalOpen = true;
     }
 
-    private async Task HandleRamSubmit(Ram value)
+    private async Task HandleRamSubmit(Ram? value)
     {
         _isRamModalOpen = false;
-        await UpdateUseCase.ExecuteAsync(Desktop.Name, Desktop.Model, value.Size, value.Mts);
+        await UpdateUseCase.ExecuteAsync(Desktop.Name, Desktop.Model, value?.Size ?? 0, value?.Mts ?? 0);
         Desktop = await GetByNameUseCase.ExecuteAsync(Desktop.Name);
     }
 

+ 14 - 6
Shared.Rcl/Laptops/LaptopCardComponent.razor

@@ -207,24 +207,32 @@
           IsOpenChanged="v => _cpuModalOpen = v"
           Value="@_editingCpu"
           OnSubmit="HandleCpuSubmit"
-          OnDelete="HandleCpuDelete" />
+          OnDelete="HandleCpuDelete" 
+          TestIdPrefix="laptop"/>
+
 
 <RamModal IsOpen="@_isRamModalOpen"
           IsOpenChanged="v => _isRamModalOpen = v"
           Value="@Laptop.Ram"
-          OnSubmit="HandleRamSubmit" />
+          OnSubmit="HandleRamSubmit" 
+          TestIdPrefix="laptop"/>
+
 
 <DriveModal IsOpen="@_driveModalOpen"
             IsOpenChanged="v => _driveModalOpen = v"
             Value="@_editingDrive"
             OnSubmit="HandleDriveSubmit"
-            OnDelete="HandleDriveDelete" />
+            OnDelete="HandleDriveDelete" 
+            TestIdPrefix="laptop"/>
+
 
 <GpuModal IsOpen="@_gpuModalOpen"
           IsOpenChanged="v => _gpuModalOpen = v"
           Value="@_editingGpu"
           OnSubmit="HandleGpuSubmit"
-          OnDelete="HandleGpuDelete" />
+          OnDelete="HandleGpuDelete" 
+          TestIdPrefix="laptop"/>
+
 
 <ConfirmModal IsOpen="_confirmDeleteOpen"
               IsOpenChanged="v => _confirmDeleteOpen = v"
@@ -266,10 +274,10 @@
         _isRamModalOpen = true;
     }
 
-    private async Task HandleRamSubmit(Ram value)
+    private async Task HandleRamSubmit(Ram? value)
     {
         _isRamModalOpen = false;
-        await UpdateUseCase.ExecuteAsync(Laptop.Name, Laptop.Model, value.Size, value.Mts, Laptop.Notes);
+        await UpdateUseCase.ExecuteAsync(Laptop.Name, Laptop.Model, value?.Size ?? 0, value?.Mts ?? 0, Laptop.Notes);
         Laptop = await GetByNameUseCase.ExecuteAsync(Laptop.Name);
     }
 

+ 24 - 3
Shared.Rcl/Modals/RamModal.razor

@@ -70,7 +70,19 @@
                 <div class="flex justify-between items-center mt-5"
                      data-testid="@($"{BaseTestId}-actions")">
 
-                    <span></span>
+                    @if (IsEdit)
+                    {
+                        <button type="button"
+                                class="text-red-400 hover:text-red-300 text-sm"
+                                data-testid="@($"{BaseTestId}-clear")"
+                                @onclick="HandleClear">
+                            Clear RAM
+                        </button>
+                    }
+                    else
+                    {
+                        <span></span>
+                    }
 
                     <div class="flex gap-2">
 
@@ -90,6 +102,7 @@
                     </div>
                 </div>
 
+
             </EditForm>
         </div>
     </div>
@@ -101,7 +114,7 @@
 
     [Parameter] public Ram? Value { get; set; }
 
-    [Parameter] public EventCallback<Ram> OnSubmit { get; set; }
+    [Parameter] public EventCallback<Ram?> OnSubmit { get; set; }
 
     [Parameter] public string? TestIdPrefix { get; set; }
 
@@ -127,6 +140,14 @@
                 };
         }
     }
+    
+    private async Task HandleClear()
+    {
+        await OnSubmit.InvokeAsync(null);
+        await Close();
+    }
+
+    
 
     private async Task HandleValidSubmit()
     {
@@ -153,7 +174,7 @@
 
     private class RamFormModel
     {
-        [Range(1, 1024)] public int? Size { get; set; }
+        [Range(0, 1024)] public double? Size { get; set; }
 
         [Range(1, 10000)] public int? Mts { get; set; }
     }

+ 2 - 2
Shared.Rcl/Servers/ServerCardComponent.razor

@@ -348,10 +348,10 @@
         _isRamModalOpen = true;
     }
 
-    private async Task HandleRamSubmit(Ram value)
+    private async Task HandleRamSubmit(Ram? value)
     {
         _isRamModalOpen = false;
-        await UpdateUseCase.ExecuteAsync(Server.Name, value.Size, value.Mts, Server.Ipmi);
+        await UpdateUseCase.ExecuteAsync(Server.Name, value?.Size ?? 0, value?.Mts ?? 0, Server.Ipmi);
         Server = await GetByNameUseCase.ExecuteAsync(Server.Name);
     }
 

+ 1 - 1
Shared.Rcl/Systems/SystemEditModel.cs

@@ -8,7 +8,7 @@ public sealed class SystemEditModel
     public string? Type { get; set; }
     public string? Os { get; set; }
     public int? Cores { get; set; }
-    public int? Ram { get; set; }
+    public double? Ram { get; set; }
     public string? RunsOn { get; set; }
     public string? Notes { get; set; }
 

+ 2 - 2
Tests/Yaml/SystemDeserializationTests.cs

@@ -39,7 +39,7 @@ resources:
     name: home-virtualization-host
     os: proxmox     
     cores: 2
-    ram: 12gb
+    ram: 12.5gb
     drives:
         - size: 2Tb
         - size: 1tb   
@@ -59,7 +59,7 @@ resources:
         Assert.Equal("home-virtualization-host", system.Name);
         Assert.Equal("proxmox", system.Os);
         Assert.Equal(2, system.Cores);
-        Assert.Equal(12, system.Ram);
+        Assert.Equal(12.5, system.Ram);
 
         // Drives
         Assert.NotNull(system.Drives);