AddResourceComponent.razor 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. @using RackPeek.Domain.Resources
  2. @typeparam TResource where TResource : RackPeek.Domain.Resources.Resource
  3. @inject IAddResourceUseCase<TResource> AddResource
  4. <div class="border border-zinc-800 rounded p-4 bg-zinc-900"
  5. data-testid=@($"add-{ResourceTypeLower}-root")>
  6. <div class="text-zinc-100 mb-3"
  7. data-testid=@($"add-{ResourceTypeLower}-title")>
  8. Add @ResourceType
  9. </div>
  10. <div class="flex gap-2"
  11. data-testid=@($"add-{ResourceTypeLower}-form")>
  12. <input
  13. 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"
  14. placeholder="@Placeholder"
  15. @bind="_name"
  16. @bind:event="oninput"
  17. data-testid=@($"add-{ResourceTypeLower}-input")/>
  18. <button
  19. class="px-4 py-2 text-sm rounded bg-zinc-800 hover:bg-zinc-700 text-zinc-100 disabled:opacity-50"
  20. disabled="@_isSubmitting"
  21. @onclick="CreateAsync"
  22. data-testid=@($"add-{ResourceTypeLower}-button")>
  23. add
  24. </button>
  25. </div>
  26. @if (_error is not null)
  27. {
  28. <div class="mt-2 text-sm text-red-400"
  29. data-testid=@($"add-{ResourceTypeLower}-error")>
  30. @_error
  31. </div>
  32. }
  33. </div>
  34. @code {
  35. private string ResourceTypeLower => Resource.GetKind<TResource>().ToLower();
  36. private string ResourceType => Resource.GetKind<TResource>();
  37. [Parameter] public EventCallback<string> OnCreated { get; set; }
  38. [Parameter] public string? Placeholder { get; set; }
  39. [Parameter] public string? RunsOn { get; set; }
  40. private string _name = string.Empty;
  41. private string? _error;
  42. private bool _isSubmitting;
  43. private async Task CreateAsync()
  44. {
  45. _error = null;
  46. if (string.IsNullOrWhiteSpace(_name))
  47. {
  48. _error = "name is required";
  49. return;
  50. }
  51. try
  52. {
  53. _isSubmitting = true;
  54. var name = _name.Trim();
  55. await AddResource.ExecuteAsync(name, RunsOn);
  56. _name = string.Empty;
  57. await OnCreated.InvokeAsync(name);
  58. }
  59. catch (Exception ex)
  60. {
  61. _error = ex.Message;
  62. }
  63. finally
  64. {
  65. _isSubmitting = false;
  66. }
  67. }
  68. }