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,14 +170,21 @@ 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;
// 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 raw = row.getValue(columnId);
const v = raw == null ? "" : String(raw); const v = raw == null ? "" : String(raw);
const op = filter.operator; const op = filter.operator;
const q = (filter.value ?? "").toString(); const q = (filter.value ?? "").toString();
const a = v.toLowerCase(); const a = v.toLowerCase();
const b = q.toLowerCase(); const b = q.toLowerCase();
switch (op) { switch (op) {
case "contains": case "contains":
return a.includes(b); return a.includes(b);
@ -194,11 +201,13 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
default: default:
return true; return true;
} }
});
}, },
}), }),
[] []
); );
const table = useReactTable({ const table = useReactTable({
data, data,
columns, columns,
@ -232,13 +241,23 @@ 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[]> = {};
);
const filters = validConditions.map((c) => ({ conditions.forEach((c) => {
id: c.column, if (
value: { operator: c.operator, value: c.value } 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); setColumnFilters(filters);
@ -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">