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) <noreply@anthropic.com>
This commit is contained in:
2026-07-10 10:25:53 -05:00
parent a8db143339
commit db75d2b97a

View File

@@ -1,6 +1,7 @@
import flet as ft import flet as ft
import threading import threading
from typing import Optional from typing import Optional
from logger_utils import log
class InterfazFlet: class InterfazFlet:
def __init__(self, cliente_sinc=None): def __init__(self, cliente_sinc=None):
@@ -72,66 +73,71 @@ class InterfazFlet:
# ------------------------------------------------------------------ # # ------------------------------------------------------------------ #
def agregar_fila(self, pedimento, factura, remesa, datos_completos, estatus): 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(): async def _do():
# Panel de detalles (oculto inicialmente) try:
campos_relevantes = { # Panel de detalles (oculto inicialmente)
"NumFactura": "Factura", campos_relevantes = {
"Remesa": "Remesa", "NumFactura": "Factura",
"IdProveedor": "ID Proveedor", "Remesa": "Remesa",
"ValorDolares": "Valor Dólares", "IdProveedor": "ID Proveedor",
"PesoBruto": "Peso Bruto", "ValorDolares": "Valor Dólares",
"Transportista": "Transportista", "PesoBruto": "Peso Bruto",
"NumTrailer": "Caja/Trailer", "Transportista": "Transportista",
"Incoterm": "Incoterm", "NumTrailer": "Caja/Trailer",
"Consecutivo": "Folio Interno" "Incoterm": "Incoterm",
} "Consecutivo": "Folio Interno"
}
filas_detalles = [ filas_detalles = [
ft.Row([ ft.Row([
ft.Text(f"{etiqueta}:", weight="bold", width=120, size=12, color=ft.Colors.GREY_700), 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), ft.Text(str(datos_completos.get(clave, "N/A")), size=12, color=ft.Colors.BLUE_700),
], spacing=10) ], spacing=10)
for clave, etiqueta in campos_relevantes.items() for clave, etiqueta in campos_relevantes.items()
] ]
panel_detalles = ft.Container( panel_detalles = ft.Container(
content=ft.Column(filas_detalles, spacing=6), content=ft.Column(filas_detalles, spacing=6),
visible=False, # <-- oculto por defecto visible=False, # <-- oculto por defecto
bgcolor=ft.Colors.BLUE_50, bgcolor=ft.Colors.BLUE_50,
padding=ft.padding.only(left=30, top=10, right=20, bottom=10), padding=ft.padding.only(left=30, top=10, right=20, bottom=10),
border=ft.border.only( border=ft.border.only(
bottom=ft.BorderSide(1, ft.Colors.BLUE_100), bottom=ft.BorderSide(1, ft.Colors.BLUE_100),
left=ft.BorderSide(3, ft.Colors.BLUE_400), # acento visual izquierdo 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): def toggle_detalles(e, p=panel_detalles, i=icono_expand):
p.visible = not p.visible p.visible = not p.visible
i.name = ft.Icons.KEYBOARD_ARROW_UP if p.visible else ft.Icons.KEYBOARD_ARROW_DOWN 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() 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: if self.page:
self.page.run_task(_do) self.page.run_task(_do)