fix: correção multi filtros

This commit is contained in:
Alessandro Gonçaalves 2025-10-20 14:55:53 -03:00
parent 1de1031fbc
commit ab348845ea
1 changed files with 52 additions and 33 deletions

View File

@ -170,34 +170,43 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
const filterFns = React.useMemo( const filterFns = React.useMemo(
() => ({ () => ({
advancedText: (row: any, columnId: string, filter: any) => { advancedText: (row: any, columnId: string, filters: any[]) => {
if (!filter) return true; if (!filters || filters.length === 0) return true;
const raw = row.getValue(columnId);
const v = raw == null ? "" : String(raw); // Se veio um único filtro (objeto), transforma em array
const op = filter.operator; const conds = Array.isArray(filters) ? filters : [filters];
const q = (filter.value ?? "").toString();
const a = v.toLowerCase(); // A coluna deve atender a todas as condições aplicáveis a ela
const b = q.toLowerCase(); return conds.every((filter) => {
switch (op) { const raw = row.getValue(columnId);
case "contains": const v = raw == null ? "" : String(raw);
return a.includes(b); const op = filter.operator;
case "equals": const q = (filter.value ?? "").toString();
return a === b; const a = v.toLowerCase();
case "startsWith": const b = q.toLowerCase();
return a.startsWith(b);
case "endsWith": switch (op) {
return a.endsWith(b); case "contains":
case "empty": return a.includes(b);
return a.length === 0; case "equals":
case "notEmpty": return a === b;
return a.length > 0; case "startsWith":
default: return a.startsWith(b);
return true; case "endsWith":
} return a.endsWith(b);
case "empty":
return a.length === 0;
case "notEmpty":
return a.length > 0;
default:
return true;
}
});
}, },
}), }),
[] []
); );
const table = useReactTable({ const table = useReactTable({
data, data,
@ -232,15 +241,25 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
}, []); }, []);
const applyFilters = () => { const applyFilters = () => {
const validConditions = conditions.filter((c) => // Agrupar múltiplas condições por coluna
c.column && (c.operator === "empty" || c.operator === "notEmpty" || (c.value ?? "") !== "") const grouped: Record<string, any[]> = {};
);
conditions.forEach((c) => {
const filters = validConditions.map((c) => ({ if (
id: c.column, c.column &&
value: { operator: c.operator, value: c.value } (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); setColumnFilters(filters);
setOpen(false); setOpen(false);
}; };
@ -457,7 +476,7 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
</div> </div>
{data.length > 0 && ( {data.length > 0 && (
<div className="mt-6 p-6 bg-gradient-to-r from-blue-50 to-indigo-50 border border-blue-200 rounded-xl shadow-sm"> <div className="mt-1 p-6 bg-gradient-to-r from-blue-50 to-indigo-50 border border-blue-200 rounded-xl shadow-sm">
<div className="flex justify-between items-center"> <div className="flex justify-between items-center">
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
<div className="w-12 h-12 bg-gradient-to-r from-blue-600 to-indigo-600 rounded-lg flex items-center justify-center"> <div className="w-12 h-12 bg-gradient-to-r from-blue-600 to-indigo-600 rounded-lg flex items-center justify-center">