UpsCardComponent.razor 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. @using RackPeek.Domain.Resources.Hardware.UpsUnits
  2. @using RackPeek.Domain.Resources.Models
  3. @using Shared.Rcl.Modals
  4. @inject UpdateUpsUseCase UpdateUpsUseCase
  5. @inject GetUpsUnitUseCase GetUpsUseCase
  6. @inject DeleteUpsUseCase DeleteUseCase
  7. <div class="border border-zinc-800 rounded p-4 bg-zinc-900">
  8. <div class="flex justify-between items-center mb-3">
  9. <div class="text-zinc-100 hover:text-emerald-300">
  10. <NavLink href="@($"/resources/hardware/{Ups.Name}")" class="block">
  11. @Ups.Name
  12. </NavLink>
  13. </div>
  14. <div class="flex gap-3 text-xs">
  15. @if (!_isEditing)
  16. {
  17. <button class="text-zinc-400 hover:text-zinc-200"
  18. @onclick="BeginEdit">
  19. Edit
  20. </button>
  21. <button class="text-red-400 hover:text-red-300 transition"
  22. title="Delete UPS"
  23. @onclick="ConfirmDelete">
  24. Delete
  25. </button>
  26. }
  27. else
  28. {
  29. <button class="text-emerald-400 hover:text-emerald-300"
  30. @onclick="Save">
  31. Save
  32. </button>
  33. <button class="text-zinc-500 hover:text-zinc-300"
  34. @onclick="Cancel">
  35. Cancel
  36. </button>
  37. }
  38. </div>
  39. </div>
  40. <div class="grid grid-cols-1 md:grid-cols-2 gap-3 text-sm">
  41. <!-- Model -->
  42. <div>
  43. <div class="text-zinc-400 mb-1">Model</div>
  44. @if (_isEditing)
  45. {
  46. <input class="input"
  47. @bind="_edit.Model"/>
  48. }
  49. else if (!string.IsNullOrWhiteSpace(Ups.Model))
  50. {
  51. <div class="text-zinc-300">@Ups.Model</div>
  52. }
  53. </div>
  54. <!-- Capacity -->
  55. <div>
  56. <div class="text-zinc-400 mb-1">Capacity</div>
  57. @if (_isEditing)
  58. {
  59. <input type="number"
  60. class="input"
  61. @bind="_edit.Va"/>
  62. }
  63. else if (Ups.Va is not null)
  64. {
  65. <div class="text-zinc-300">@Ups.Va VA</div>
  66. }
  67. </div>
  68. </div>
  69. </div>
  70. <ConfirmModal
  71. IsOpen="_confirmDeleteOpen"
  72. IsOpenChanged="v => _confirmDeleteOpen = v"
  73. Title="Delete UPS"
  74. ConfirmText="Delete"
  75. ConfirmClass="bg-red-600 hover:bg-red-500"
  76. OnConfirm="DeleteUps">
  77. Are you sure you want to delete <strong>@Ups.Name</strong>?
  78. </ConfirmModal>
  79. @code {
  80. [Parameter][EditorRequired] public Ups Ups { get; set; } = default!;
  81. [Parameter] public EventCallback<string> OnDeleted { get; set; }
  82. bool _isEditing;
  83. bool _confirmDeleteOpen;
  84. UpsEditModel _edit = new();
  85. void BeginEdit()
  86. {
  87. _edit = UpsEditModel.From(Ups);
  88. _isEditing = true;
  89. }
  90. async Task Save()
  91. {
  92. _isEditing = false;
  93. await UpdateUpsUseCase.ExecuteAsync(
  94. Ups.Name,
  95. _edit.Model,
  96. _edit.Va);
  97. Ups = await GetUpsUseCase.ExecuteAsync(Ups.Name);
  98. }
  99. void Cancel()
  100. {
  101. _isEditing = false;
  102. }
  103. void ConfirmDelete()
  104. {
  105. _confirmDeleteOpen = true;
  106. }
  107. async Task DeleteUps()
  108. {
  109. _confirmDeleteOpen = false;
  110. await DeleteUseCase.ExecuteAsync(Ups.Name);
  111. if (OnDeleted.HasDelegate)
  112. await OnDeleted.InvokeAsync(Ups.Name);
  113. }
  114. public class UpsEditModel
  115. {
  116. public string? Model { get; set; }
  117. public int? Va { get; set; }
  118. public static UpsEditModel From(Ups ups)
  119. {
  120. return new UpsEditModel
  121. {
  122. Model = ups.Model,
  123. Va = ups.Va
  124. };
  125. }
  126. }
  127. }