From 20dd5d6943369cb06fbae413a12e6290ff38c276 Mon Sep 17 00:00:00 2001 From: Leandro Hernan Rojas Date: Tue, 15 Jul 2025 09:26:15 -0300 Subject: [PATCH] Add ProductForm Stock --- .../Pages/Stock/LSProduct.razor | 10 +- .../Pages/Stock/LSProductForm.razor | 216 ++++++++++++++++++ .../Services/Stock/LSProductService.cs | 4 +- 3 files changed, 226 insertions(+), 4 deletions(-) create mode 100644 phronCare.UIBlazor/Pages/Stock/LSProductForm.razor diff --git a/phronCare.UIBlazor/Pages/Stock/LSProduct.razor b/phronCare.UIBlazor/Pages/Stock/LSProduct.razor index bc44b84..3dddb0d 100644 --- a/phronCare.UIBlazor/Pages/Stock/LSProduct.razor +++ b/phronCare.UIBlazor/Pages/Stock/LSProduct.razor @@ -80,9 +80,12 @@ - + @@ -246,7 +249,10 @@ } } - private void Nuevo() => Navigation.NavigateTo("/stock/productimport"); + private void NuevoProducto() => Navigation.NavigateTo("/stock/productform"); + + private void ImportarProductos() => Navigation.NavigateTo("/stock/productimport"); + private void Cancelar() => Navigation.NavigateTo("/DashboardPanel"); private int TotalPaginas => PagedResult is null ? 1 : (int)Math.Ceiling(PagedResult.TotalItems / (double)SearchParams.PageSize); diff --git a/phronCare.UIBlazor/Pages/Stock/LSProductForm.razor b/phronCare.UIBlazor/Pages/Stock/LSProductForm.razor new file mode 100644 index 0000000..fe74f98 --- /dev/null +++ b/phronCare.UIBlazor/Pages/Stock/LSProductForm.razor @@ -0,0 +1,216 @@ +@page "/stock/productform" +@page "/stock/productform/{ProductId:int}" + +@using Domain.Entities +@using phronCare.UIBlazor.Services.Lookups +@using phronCare.UIBlazor.Services.Stock +@using phronCare.UIBlazor.Shared.Modals +@using System.ComponentModel.DataAnnotations +@using Blazored.Typeahead + +@inject NavigationManager Navigation +@inject LSProductService productService +@inject IStockLookUpService lookUpService +@inject IToastService toastService +@inject IModalService modalService + +
+
+

@(ProductId.HasValue ? "Editar producto" : "Nuevo producto")

+
+
+ + + + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + + + + + + +
+
+ + + + + + + +
+
+ +
+
+ + + @item.Nombre + @item.Nombre + + +
+
+ + + @item.Nombre + @item.Nombre + +
+
+ +
+
+
+ + +
+
+
+
+
+ + +
+ +@code { + [Parameter] public int? ProductId { get; set; } + + private ELSProduct product = new(); + private bool isSaving = false; + private ELookUpItem? _selectedDivision; + private ELookUpItem? _selectedUnit; + + private ELSProductDivision? selectedDivision; + private ELSUnitOfMeasure? selectedUnit; + private string returnUrl = "/stock/products"; + + protected override async Task OnInitializedAsync() + { + if (ProductId.HasValue) + { + product = await productService.GetByIdAsync(ProductId.Value) ?? new(); + + // Precargar División + var divisionList = await lookUpService.GetProductDivisionsAsync(""); + _selectedDivision = divisionList.FirstOrDefault(d => d.Id == product.DivisionId); + + // Precargar Unidad + var unitList = await lookUpService.GetUnitsOfMeasureAsync(""); + _selectedUnit = unitList.FirstOrDefault(u => u.Id == product.UnitId); + } + else + { + product = new(); + } + } + private void OnDivisionSelected(ELookUpItem? selected) + { + _selectedDivision = selected; + if (selected != null) + product.DivisionId = selected.Id; + } + private void OnUnitSelected(ELookUpItem? selected) + { + _selectedUnit = selected; + if (selected != null) + product.UnitId = selected.Id; + } + + private async Task HandleValidSubmit() + { + if (string.IsNullOrWhiteSpace(product.FactoryCode) || + string.IsNullOrWhiteSpace(product.Name) || + string.IsNullOrWhiteSpace(product.Descripcion) || + product.ProductType <= 0 || + product.TraceabilityType <= 0 || + _selectedDivision is null || + _selectedUnit is null) + { + toastService.ShowWarning("Por favor complete todos los campos obligatorios antes de guardar."); + return; + } + var modal = modalService.Show("Confirmación", new ModalParameters + { + { "Message", "¿Desea guardar este producto?" } + }); + var result = await modal.Result; + + if (result.Cancelled) return; + + try + { + isSaving = true; + product.DivisionId = _selectedDivision?.Id; + product.UnitId = _selectedUnit?.Id ?? 0; + + HttpResponseMessage response; + if (ProductId.HasValue) + response = await productService.UpdateAsync(product); + else + response = await productService.CreateAsync(product); + + if (response.IsSuccessStatusCode) + { + toastService.ShowSuccess("Producto guardado correctamente."); + Navigation.NavigateTo("/stock/products"); + } + else + { + var error = await response.Content.ReadAsStringAsync(); + toastService.ShowError($"Error: {error}"); + } + } + catch (Exception ex) + { + toastService.ShowError($"Error: {ex.Message}"); + } + finally + { + isSaving = false; + } + } + + private void Cancel() => Navigation.NavigateTo(returnUrl); +} diff --git a/phronCare.UIBlazor/Services/Stock/LSProductService.cs b/phronCare.UIBlazor/Services/Stock/LSProductService.cs index 4104b2e..43424ee 100644 --- a/phronCare.UIBlazor/Services/Stock/LSProductService.cs +++ b/phronCare.UIBlazor/Services/Stock/LSProductService.cs @@ -36,12 +36,12 @@ namespace phronCare.UIBlazor.Services.Stock public async Task CreateAsync(ELSProduct product) { - return await _http.PostAsJsonAsync("/api/LSProduct", product); + return await _http.PostAsJsonAsync("/api/LSProduct/create", product); } public async Task UpdateAsync(ELSProduct product) { - return await _http.PutAsJsonAsync("/api/LSProduct", product); + return await _http.PutAsJsonAsync("/api/LSProduct/update", product); } public async Task DeleteAsync(int id)