fix: correção multi filtros
This commit is contained in:
parent
1de1031fbc
commit
ab348845ea
|
|
@ -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">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue