@page "/stock/products" @using Blazored.Typeahead @using phronCare.UIBlazor.Services.Stock @using phronCare.UIBlazor.Services.Lookups @using Domain.Entities @using Domain.Generics @inject IToastService toastService @inject NavigationManager Navigation @inject LSProductService productService @inject IStockLookUpService lookUpService

Catálogo de Productos Médicos

@item.Nombre @item.Nombre
@item.Nombre @item.Nombre

@if (TablaProductos != null && TablaProductos.Any()) { } else {

No hay resultados.

}
@code { private LSProductSearchParams SearchParams = new() { Page = 1, PageSize = 10 }; private List> TablaProductos = new(); private PagedResult? PagedResult; private int PaginaDeseada = 1; private ELookUpItem? _selectedDivision; private ELookUpItem? _selectedUnit; List botones = new(); private List TableColumns = new() { "Id", "Código Fábrica", "Código Externo", "Código Regulatorio", "Nombre", "Descripción", "División", "Unidad", "Tipo", "Trazabilidad", "Esteriliza" }; protected override async Task OnInitializedAsync() { botones = new List { new PhTable.ButtonOptions { Caption = "", ElementClass = "btn btn-success btn-sm", UrlAction = "/stock/productform/", OnClickAction = async (id) => { if (int.TryParse(id, out var pid)) Navigation.NavigateTo($"/stock/productform/{pid}"); } } }; } private async Task Buscar() { SearchParams.PageSize = 13; SearchParams.Page = 1; await CargarPaginaActual(); } private async Task CargarPaginaActual() { SearchParams.DivisionId = _selectedDivision?.Id; SearchParams.UnitId = _selectedUnit?.Id; PagedResult = await productService.SearchAsync(SearchParams); TablaProductos = PagedResult?.Items.Select(p => new Dictionary { { "Id", p.Id }, { "Código Fábrica", p.FactoryCode }, { "Código Externo", p.ExternalCode?? string.Empty }, { "Código Regulatorio", p.RegulatoryCode?? string.Empty }, { "Nombre", p.Name?? string.Empty }, { "Descripción", p.Descripcion }, { "División", p.Division?.Name ?? "" }, { "Unidad", p.Unit?.Name ?? "" }, { "Tipo", ObtenerTipoProducto(p.ProductType) }, { "Trazabilidad", ObtenerTipoTrazabilidad(p.TraceabilityType) }, { "Esteriliza", p.PlusProcess ? "Sí" : "No" } }).ToList() ?? []; } private void OnDivisionSelected(ELookUpItem item) => _selectedDivision = item; private void OnUnitSelected(ELookUpItem item) => _selectedUnit = item; private string ObtenerTipoProducto(int? tipo) => tipo switch { 1 => "Implantable", 2 => "Instrumental", 3 => "Inyectable", _ => "" }; private string ObtenerTipoTrazabilidad(int? tipo) => tipo switch { 1 => "No aplica", 2 => "Por cantidad", 3 => "Por lote/vencimiento", _ => "" }; private async Task PrimeraPagina() { SearchParams.Page = 1; await CargarPaginaActual(); } private async Task UltimaPagina() { SearchParams.Page = TotalPaginas; await CargarPaginaActual(); } private async Task SiguientePagina() => await CambiarPagina(1); private async Task AnteriorPagina() => await CambiarPagina(-1); private async Task CambiarPagina(int delta) { var nueva = SearchParams.Page + delta; if (nueva >= 1 && nueva <= TotalPaginas) { SearchParams.Page = nueva; await CargarPaginaActual(); } } private async Task IrAPagina() { if (PaginaDeseada >= 1 && PaginaDeseada <= TotalPaginas) { SearchParams.Page = PaginaDeseada; await CargarPaginaActual(); } else { toastService.ShowWarning("Página fuera de rango."); } } private async Task ExportarExcel() { SearchParams.Page = 1; SearchParams.PageSize = int.MaxValue; // Exportar todos los resultados try { await productService.ExportFilteredAsync(SearchParams); toastService.ShowSuccess("Exportación completada."); } catch (Exception ex) { toastService.ShowError($"Error: {ex.Message}"); } } 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); private bool PuedeRetroceder => SearchParams.Page > 1; private bool PuedeAvanzar => PagedResult != null && SearchParams.Page < TotalPaginas; }