4
0

ServiceCardComponent.razor 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. @using RackPeek.Domain.Resources.Services
  2. @using RackPeek.Domain.Resources.Services.UseCases
  3. @using RackPeek.Domain.Resources.SystemResources.UseCases
  4. @using RackPeek.Web.Components.Systems
  5. @using RackPeek.Web.Components.Modals
  6. @inject UpdateServiceUseCase UpdateServiceUseCase
  7. @inject GetServiceUseCase GetServiceUseCase
  8. <div class="border border-zinc-800 rounded p-4 bg-zinc-900">
  9. <div class="flex justify-between items-center mb-3">
  10. <div class="text-zinc-100">
  11. @Service.Name
  12. </div>
  13. <div class="flex gap-3 text-xs">
  14. @if (!_isEditing)
  15. {
  16. <button class="text-zinc-400 hover:text-zinc-200"
  17. @onclick="BeginEdit">
  18. Edit
  19. </button>
  20. }
  21. else
  22. {
  23. <button class="text-emerald-400 hover:text-emerald-300"
  24. @onclick="Save">
  25. Save
  26. </button>
  27. <button class="text-zinc-500 hover:text-zinc-300"
  28. @onclick="Cancel">
  29. Cancel
  30. </button>
  31. }
  32. </div>
  33. </div>
  34. <div class="grid grid-cols-1 md:grid-cols-2 gap-3 text-sm">
  35. <!-- IP -->
  36. <div>
  37. <div class="text-zinc-400 mb-1">IP</div>
  38. @if (_isEditing)
  39. {
  40. <input class="input"
  41. @bind="_edit.Ip"/>
  42. }
  43. else if (!string.IsNullOrWhiteSpace(Service.Network?.Ip))
  44. {
  45. <div class="text-zinc-300">@Service.Network!.Ip</div>
  46. }
  47. </div>
  48. <!-- Port -->
  49. <div>
  50. <div class="text-zinc-400 mb-1">Port</div>
  51. @if (_isEditing)
  52. {
  53. <input type="number"
  54. class="input"
  55. @bind="_edit.Port"/>
  56. }
  57. else if (Service.Network?.Port.HasValue == true)
  58. {
  59. <div class="text-zinc-300">@Service.Network.Port</div>
  60. }
  61. </div>
  62. <!-- Protocol -->
  63. <div>
  64. <div class="text-zinc-400 mb-1">Protocol</div>
  65. @if (_isEditing)
  66. {
  67. <input class="input"
  68. @bind="_edit.Protocol"/>
  69. }
  70. else if (!string.IsNullOrWhiteSpace(Service.Network?.Protocol))
  71. {
  72. <div class="text-zinc-300">@Service.Network!.Protocol</div>
  73. }
  74. </div>
  75. <!-- URL -->
  76. <div>
  77. <div class="text-zinc-400 mb-1">URL</div>
  78. @if (_isEditing)
  79. {
  80. <input class="input"
  81. @bind="_edit.Url"/>
  82. }
  83. else if (!string.IsNullOrWhiteSpace(Service.Network?.Url))
  84. {
  85. <a href="@Service.Network!.Url"
  86. target="_blank"
  87. rel="noopener noreferrer"
  88. class="text-emerald-400 hover:underline break-all">
  89. @Service.Network.Url
  90. </a>
  91. }
  92. </div>
  93. <!-- Runs On -->
  94. <div>
  95. <div class="text-zinc-400 mb-1">Runs On</div>
  96. @if (_isEditing)
  97. {
  98. <button
  99. class="hover:text-emerald-400"
  100. title="Edit Runs On"
  101. @onclick="() => _selectParentOpen = true">
  102. @if (!string.IsNullOrWhiteSpace(Service.RunsOn))
  103. {
  104. @($"{Service.RunsOn} +")
  105. }
  106. else
  107. {
  108. @("Edit parent")
  109. }
  110. </button>
  111. }
  112. else if (!string.IsNullOrWhiteSpace(Service.RunsOn))
  113. {
  114. <NavLink href="@($"/resources/systems/{Service.RunsOn}")"
  115. class="text-emerald-400">
  116. @Service.RunsOn
  117. </NavLink>
  118. }
  119. </div>
  120. </div>
  121. </div>
  122. <SystemSelectionModal
  123. IsOpen="@_selectParentOpen"
  124. IsOpenChanged="v => _selectParentOpen = v"
  125. Title="Select a parent"
  126. Value="@SelectedParentName"
  127. OnAccept="HandleParentSelected" />
  128. @code {
  129. [Parameter] [EditorRequired] public Service Service { get; set; } = default!;
  130. [Parameter] public EventCallback<ServiceEditModel> OnSave { get; set; }
  131. private bool _isEditing;
  132. private ServiceEditModel _edit = new();
  133. void BeginEdit()
  134. {
  135. _edit = ServiceEditModel.From(Service);
  136. _isEditing = true;
  137. }
  138. async Task Save()
  139. {
  140. _isEditing = false;
  141. await OnSave.InvokeAsync(_edit);
  142. }
  143. void Cancel()
  144. {
  145. _isEditing = false;
  146. }
  147. bool _selectParentOpen;
  148. string? SelectedParentName;
  149. async Task HandleParentSelected(string? name)
  150. {
  151. SelectedParentName = name;
  152. await UpdateServiceUseCase.ExecuteAsync(
  153. Service.Name,
  154. Service.Network?.Ip,
  155. Service.Network?.Port,
  156. Service.Network?.Protocol,
  157. Service.Network?.Url,
  158. name);
  159. Service = await GetServiceUseCase.ExecuteAsync(Service.Name);
  160. _edit = ServiceEditModel.From(Service);
  161. }
  162. }