@using System.Linq @using System.Text.Json @using Domain.Dtos.Stock @inject IToastService Toast @if (Visible && Expedition is not null) {
Expedición @Expedition.Expeditionnumber
@if (!string.IsNullOrWhiteSpace(Expedition.StatusLabel)) { @Expedition.StatusLabel }
@if (activeTab == 0) {
Número
@Expedition.Expeditionnumber
Fecha
@Expedition.Issuedate.ToString("yyyy-MM-dd")
Ubicación
@Expedition.LocationName
Estado
@Expedition.StatusLabel
Paciente
@GetPatient(Expedition.ExtrainfoJson)
Médico
@GetProfessional(Expedition.ExtrainfoJson)
Hospital
@GetInstitution(Expedition.ExtrainfoJson)
Fecha de cirugía
@GetSurgeryDateShort(Expedition.ExtrainfoJson)
@Expedition.Observations
@if (!string.IsNullOrWhiteSpace(Expedition.ExtrainfoJson)) {
@Expedition.ExtrainfoJson
}
} else {
@if (Loading && Expedition?.Items is null) { } else if (PagedItems?.Any() == true) { @foreach (var it in PagedItems!) { } } else { }
Código Producto Cant. Lote Serie Vence Ubicación
Cargando ítems...
@it.FactoryCode @it.ProductName @it.Quantity @it.Batch @it.Serial @(it.Expiration?.ToString("yyyy-MM-dd")) @it.LocationName
Sin ítems
@if (TotalItems > 0) { Página @itemsPage de @ItemsTotalPages — @TotalItems ítem(s) }
}
} @code { // Parámetros [Parameter] public ExpeditionDto? Expedition { get; set; } [Parameter] public bool Visible { get; set; } [Parameter] public EventCallback VisibleChanged { get; set; } [Parameter] public EventCallback<(int Id, string Number)> ExportPdfRequested { get; set; } [Parameter] public bool Loading { get; set; } // Estado local private int activeTab = 0; private int itemsPage = 1; private int itemsPageSize = 10; private int? lastExpeditionId; protected override void OnParametersSet() { if (Expedition?.Id != lastExpeditionId) { lastExpeditionId = Expedition?.Id; itemsPage = 1; // reset de página al cambiar de expedición activeTab = 0; // opcional: volver a "Datos" } } private void SetTab(int tab) => activeTab = tab; // Paginación de ítems private int TotalItems => Expedition?.Items?.Count ?? 0; private int ItemsTotalPages => TotalItems == 0 ? 1 : (int)Math.Ceiling(TotalItems / (double)itemsPageSize); private IEnumerable PagedItems => Expedition?.Items? .Skip((itemsPage - 1) * itemsPageSize) .Take(itemsPageSize) ?? Enumerable.Empty(); private void PrevItemsPage() { if (itemsPage <= 1) return; itemsPage--; } private void NextItemsPage() { if (itemsPage >= ItemsTotalPages) return; itemsPage++; } private void ChangeItemsPageSize(string? value) { if (int.TryParse(value, out var newSize) && newSize > 0) { itemsPageSize = newSize; itemsPage = 1; } } // Acciones private async Task RequestExportPdf() { if (Expedition is null) return; await ExportPdfRequested.InvokeAsync((Expedition.Id, Expedition.Expeditionnumber)); } private async Task Close() { await VisibleChanged.InvokeAsync(false); } // Snapshot helpers (case-insensitive y tolerantes a null) private static string? GetProfessional(string? json) => TryGetString(json, "Professional"); private static string? GetInstitution(string? json) => TryGetString(json, "Institution"); private static string? GetPatient(string? json) => TryGetString(json, "Patient"); private static string? GetSurgeryDateShort(string? json) => TryGetDate(json, "SurgeryDate")?.ToString("yyyy-MM-dd"); private static string? TryGetString(string? json, string propName) { if (string.IsNullOrWhiteSpace(json)) return null; try { using var doc = JsonDocument.Parse(json); var root = doc.RootElement; if (root.ValueKind != JsonValueKind.Object) return null; foreach (var p in root.EnumerateObject()) { if (string.Equals(p.Name, propName, StringComparison.OrdinalIgnoreCase) && p.Value.ValueKind == JsonValueKind.String) return p.Value.GetString(); } return null; } catch { return null; } } private static DateTime? TryGetDate(string? json, string propName) { var s = TryGetString(json, propName); if (string.IsNullOrWhiteSpace(s)) return null; if (DateTime.TryParse(s, out var dt)) return dt; return null; } // UI helpers private static string GetStatusBadgeClass(string? status) { if (string.IsNullOrWhiteSpace(status)) return "bg-secondary"; return status switch { "Emitida" => "bg-secondary", "En tránsito" => "bg-info", "En destino" => "bg-primary", "Retorno" => "bg-warning text-dark", "Cerrada" => "bg-success", "Anulada" => "bg-danger", _ => "bg-secondary" }; } private void OnItemsPageSizeChanged() { if (itemsPageSize <= 0) itemsPageSize = 10; // por las dudas itemsPage = 1; // resetea a la primera página // No hace falta nada más: PagedItems se recalcula y Blazor re-renderiza. } }