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,35 +170,44 @@ 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,
columns,
@ -232,13 +241,23 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
}, []);
const applyFilters = () => {
const validConditions = conditions.filter((c) =>
c.column && (c.operator === "empty" || c.operator === "notEmpty" || (c.value ?? "") !== "")
);
// Agrupar múltiplas condições por coluna
const grouped: Record<string, any[]> = {};
const filters = validConditions.map((c) => ({
id: c.column,
value: { operator: c.operator, value: c.value }
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);
@ -457,7 +476,7 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
</div>
{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 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">