diff --git a/src/app/DRE/analitico.tsx b/src/app/DRE/analitico.tsx index 28bdd1b..93e8352 100644 --- a/src/app/DRE/analitico.tsx +++ b/src/app/DRE/analitico.tsx @@ -170,34 +170,43 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) { const filterFns = React.useMemo( () => ({ - advancedText: (row: any, columnId: string, filter: any) => { - if (!filter) return true; - const raw = row.getValue(columnId); - const v = raw == null ? "" : String(raw); - const op = filter.operator; - const q = (filter.value ?? "").toString(); - const a = v.toLowerCase(); - const b = q.toLowerCase(); - switch (op) { - case "contains": - return a.includes(b); - case "equals": - return a === b; - case "startsWith": - return a.startsWith(b); - case "endsWith": - return a.endsWith(b); - case "empty": - return a.length === 0; - case "notEmpty": - return a.length > 0; - default: - return true; - } + advancedText: (row: any, columnId: string, filters: any[]) => { + if (!filters || filters.length === 0) return true; + + // Se veio um único filtro (objeto), transforma em array + const conds = Array.isArray(filters) ? filters : [filters]; + + // A coluna deve atender a todas as condições aplicáveis a ela + return conds.every((filter) => { + const raw = row.getValue(columnId); + const v = raw == null ? "" : String(raw); + const op = filter.operator; + const q = (filter.value ?? "").toString(); + const a = v.toLowerCase(); + const b = q.toLowerCase(); + + switch (op) { + case "contains": + return a.includes(b); + case "equals": + return a === b; + case "startsWith": + return a.startsWith(b); + case "endsWith": + return a.endsWith(b); + case "empty": + return a.length === 0; + case "notEmpty": + return a.length > 0; + default: + return true; + } + }); }, }), [] ); + const table = useReactTable({ data, @@ -232,15 +241,25 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) { }, []); const applyFilters = () => { - const validConditions = conditions.filter((c) => - c.column && (c.operator === "empty" || c.operator === "notEmpty" || (c.value ?? "") !== "") - ); - - const filters = validConditions.map((c) => ({ - id: c.column, - value: { operator: c.operator, value: c.value } + // Agrupar múltiplas condições por coluna + const grouped: Record = {}; + + conditions.forEach((c) => { + if ( + c.column && + (c.operator === "empty" || c.operator === "notEmpty" || (c.value ?? "") !== "") + ) { + if (!grouped[c.column]) grouped[c.column] = []; + grouped[c.column].push({ operator: c.operator, value: c.value }); + } + }); + + // Converte em formato aceito pelo TanStack + const filters = Object.keys(grouped).map((col) => ({ + id: col, + value: grouped[col], })); - + setColumnFilters(filters); setOpen(false); }; @@ -457,7 +476,7 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) { {data.length > 0 && ( -
+