Skip to content

feat(ti/proyectos): filtros multi-select + barra reorganizada

Rafael Bautista requested to merge ti into qa
  • Backend (backend/routers/ti.py): el endpoint /dashboard/stats pasa los 8 filtros de Optional[str|int] a list[str|int] = Query(default=[]). Strings se filtran con or_(*[col.ilike(v) ...]) para preservar case-insensitivity; numéricos con col.in_(lista) y extract("year", ...). Nuevo agregado por_empresa para sembrar el filtro Empresa.
  • API typing (portal_ti/lib/ti.api.ts): todos los filtros pasan a string[] / number[]; DashboardStats.por_empresa agregado; getDashboardStats ahora usa paramsSerializer: { indexes: null } para que axios serialice arrays como ?k=a&k=b (formato que FastAPI espera).
  • Nuevo componente portal_ti/components/filters/MultiSelectFilter.tsx (portado de frontend/): trigger con badge de count, dropdown con buscador interno, botones Todos/Limpiar, checkboxes y "Quitar filtro" cuando hay selección. Click-outside cierra.
  • Page (portal_ti/app/sistemas/proyectos/page.tsx):
    • 8 FilterSelect legacy reemplazados por 9 MultiSelectFilter (incluye nuevo filtro Empresa); numéricos (año, etapa) parsean en el onChange.
    • Consumidores del filtro semáforo normalizan como array (.map(s => s.trim().toLowerCase()) + includes) en lugar de .trim() sobre string[] (fix de error de tipos en build).
    • Eliminada la barra de búsqueda general + debounce; el fetch reactiva solo a dashFiltros (clics, no input continuo).
    • Eliminados KpiTotal, chips de buckets y card "Datos sincronizados"; grid de KPIs lg:5 → lg:4.
    • Nueva mini-card "PROYECTOS" a la derecha de la barra de filtros con el total dinámico (icon FolderKanban, tabular-nums).

Merge request reports

Loading