From db75d2b97ab9bbbfd5a26fa8051c9d6e1d466a43 Mon Sep 17 00:00:00 2001 From: Kevin_Ramirez Date: Fri, 10 Jul 2026 10:25:53 -0500 Subject: [PATCH] fix: registrar errores al pintar filas en la GUI agregar_fila envolvia la construccion de la fila sin manejo de error, y un fallo (p.ej. icons.json ausente) se perdia en silencio dejando la tabla vacia. Se agrega try/except con log y traza de la fila agregada. Co-Authored-By: Claude Opus 4.8 (1M context) --- interfaz.py | 112 +++++++++++++++++++++++++++------------------------- 1 file changed, 59 insertions(+), 53 deletions(-) diff --git a/interfaz.py b/interfaz.py index 353ad57..f301667 100644 --- a/interfaz.py +++ b/interfaz.py @@ -1,6 +1,7 @@ import flet as ft import threading from typing import Optional +from logger_utils import log class InterfazFlet: def __init__(self, cliente_sinc=None): @@ -72,66 +73,71 @@ class InterfazFlet: # ------------------------------------------------------------------ # def agregar_fila(self, pedimento, factura, remesa, datos_completos, estatus): + log.info(f"[UI] agregar_fila llamado (page={'OK' if self.page else 'None'}): pedi={pedimento} fac={factura}") async def _do(): - # Panel de detalles (oculto inicialmente) - campos_relevantes = { - "NumFactura": "Factura", - "Remesa": "Remesa", - "IdProveedor": "ID Proveedor", - "ValorDolares": "Valor Dólares", - "PesoBruto": "Peso Bruto", - "Transportista": "Transportista", - "NumTrailer": "Caja/Trailer", - "Incoterm": "Incoterm", - "Consecutivo": "Folio Interno" - } + try: + # Panel de detalles (oculto inicialmente) + campos_relevantes = { + "NumFactura": "Factura", + "Remesa": "Remesa", + "IdProveedor": "ID Proveedor", + "ValorDolares": "Valor Dólares", + "PesoBruto": "Peso Bruto", + "Transportista": "Transportista", + "NumTrailer": "Caja/Trailer", + "Incoterm": "Incoterm", + "Consecutivo": "Folio Interno" + } - filas_detalles = [ - ft.Row([ - ft.Text(f"{etiqueta}:", weight="bold", width=120, size=12, color=ft.Colors.GREY_700), - ft.Text(str(datos_completos.get(clave, "N/A")), size=12, color=ft.Colors.BLUE_700), - ], spacing=10) - for clave, etiqueta in campos_relevantes.items() - ] + filas_detalles = [ + ft.Row([ + ft.Text(f"{etiqueta}:", weight="bold", width=120, size=12, color=ft.Colors.GREY_700), + ft.Text(str(datos_completos.get(clave, "N/A")), size=12, color=ft.Colors.BLUE_700), + ], spacing=10) + for clave, etiqueta in campos_relevantes.items() + ] - panel_detalles = ft.Container( - content=ft.Column(filas_detalles, spacing=6), - visible=False, # <-- oculto por defecto - bgcolor=ft.Colors.BLUE_50, - padding=ft.padding.only(left=30, top=10, right=20, bottom=10), - border=ft.border.only( - bottom=ft.BorderSide(1, ft.Colors.BLUE_100), - left=ft.BorderSide(3, ft.Colors.BLUE_400), # acento visual izquierdo - ), - ) + panel_detalles = ft.Container( + content=ft.Column(filas_detalles, spacing=6), + visible=False, # <-- oculto por defecto + bgcolor=ft.Colors.BLUE_50, + padding=ft.padding.only(left=30, top=10, right=20, bottom=10), + border=ft.border.only( + bottom=ft.BorderSide(1, ft.Colors.BLUE_100), + left=ft.BorderSide(3, ft.Colors.BLUE_400), # acento visual izquierdo + ), + ) - icono_expand = ft.Icon(ft.Icons.KEYBOARD_ARROW_DOWN, size=16, color=ft.Colors.GREY_400) + icono_expand = ft.Icon(ft.Icons.KEYBOARD_ARROW_DOWN, size=16, color=ft.Colors.GREY_400) - def toggle_detalles(e, p=panel_detalles, i=icono_expand): - p.visible = not p.visible - i.name = ft.Icons.KEYBOARD_ARROW_UP if p.visible else ft.Icons.KEYBOARD_ARROW_DOWN + def toggle_detalles(e, p=panel_detalles, i=icono_expand): + p.visible = not p.visible + i.name = ft.Icons.KEYBOARD_ARROW_UP if p.visible else ft.Icons.KEYBOARD_ARROW_DOWN + self.page.update() + + fila_header = ft.Container( + content=ft.Row([ + ft.Text(pedimento, width=150, size=12, color=ft.Colors.BLACK), + ft.Text(factura, width=120, size=12, color=ft.Colors.BLACK), + ft.Text(remesa, width=80, size=12, color=ft.Colors.BLACK), + ft.Text(estatus, expand=True, size=12, color=ft.Colors.BLUE_700, weight="bold"), + icono_expand, + ]), + padding=ft.padding.symmetric(horizontal=20, vertical=8), + border=ft.border.only(bottom=ft.BorderSide(1, ft.Colors.GREY_100)), + on_click=toggle_detalles, + ink=True, + tooltip="Clic para ver detalles" + ) + + # Agrupamos header + panel en una Column + fila_completa = ft.Column([fila_header, panel_detalles], spacing=0) + self.lista_resultados.controls.append(fila_completa) self.page.update() + log.info(f"[UI] fila agregada OK. Total filas en tabla: {len(self.lista_resultados.controls)}") + except Exception as ex: + log.error(f"[UI] Error en agregar_fila._do: {ex}") - fila_header = ft.Container( - content=ft.Row([ - ft.Text(pedimento, width=150, size=12, color=ft.Colors.BLACK), - ft.Text(factura, width=120, size=12, color=ft.Colors.BLACK), - ft.Text(remesa, width=80, size=12, color=ft.Colors.BLACK), - ft.Text(estatus, expand=True, size=12, color=ft.Colors.BLUE_700, weight="bold"), - icono_expand, - ]), - padding=ft.padding.symmetric(horizontal=20, vertical=8), - border=ft.border.only(bottom=ft.BorderSide(1, ft.Colors.GREY_100)), - on_click=toggle_detalles, - ink=True, - tooltip="Clic para ver detalles" - ) - - # Agrupamos header + panel en una Column - fila_completa = ft.Column([fila_header, panel_detalles], spacing=0) - self.lista_resultados.controls.append(fila_completa) - self.page.update() - if self.page: self.page.run_task(_do)