AddSystemComponent.razor 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. @using RackPeek.Domain.Resources.SystemResources
  2. @using RackPeek.Domain.Resources.SystemResources.UseCases
  3. @inject IAddResourceUseCase<SystemResource> AddSystemResource
  4. @inject NavigationManager Nav
  5. <div class="border border-zinc-800 rounded p-4 bg-zinc-900">
  6. <div class="text-zinc-100 mb-3">
  7. Add system
  8. </div>
  9. <div class="flex gap-2">
  10. <input
  11. class="flex-1 bg-zinc-950 border border-zinc-800 rounded px-3 py-2 text-sm text-zinc-200 placeholder-zinc-600 focus:outline-none focus:border-zinc-600"
  12. placeholder="system resource name"
  13. @bind="_name"
  14. @bind:event="oninput"/>
  15. <button
  16. class="px-4 py-2 text-sm rounded bg-zinc-800 hover:bg-zinc-700 text-zinc-100 disabled:opacity-50"
  17. disabled="@_isSubmitting"
  18. @onclick="CreateAsync">
  19. add
  20. </button>
  21. </div>
  22. @if (_error is not null)
  23. {
  24. <div class="mt-2 text-sm text-red-400">
  25. @_error
  26. </div>
  27. }
  28. </div>
  29. @code {
  30. [Parameter] public EventCallback<string> OnCreated { get; set; }
  31. [Parameter] public string? RunsOn { get; set; }
  32. private string _name = string.Empty;
  33. private string? _error;
  34. private bool _isSubmitting;
  35. private async Task CreateAsync()
  36. {
  37. _error = null;
  38. if (string.IsNullOrWhiteSpace(_name))
  39. {
  40. _error = "name is required";
  41. return;
  42. }
  43. try
  44. {
  45. _isSubmitting = true;
  46. var name = _name.Trim();
  47. await AddSystemResource.ExecuteAsync(name, RunsOn);
  48. _name = string.Empty;
  49. await OnCreated.InvokeAsync(name);
  50. Nav.NavigateTo($"resources/systems/{name}");
  51. }
  52. catch (Exception ex)
  53. {
  54. _error = ex.Message;
  55. }
  56. finally
  57. {
  58. _isSubmitting = false;
  59. }
  60. }
  61. }