DataTableRecetas
Filtros
Selects propios fuera del menú facetado y filtros de rango de fechas o montos.
Filtros con selects propios (fuera del menú facetado)
Cuando el diseño pide selects visibles (rol, estado…) en vez del menú de filtros:
const [role, setRole] = useState("all");
const filtersRef = useRef({ role: "all" });
const { updateParams } = useTableSearchParams({ filterKeys: ["role"] });
const fetchFn = useCallback((params: DataTableFetchParams) => {
updateParams(params, { role: filtersRef.current.role }); // URL al día
return getUsersPageAction({ ...params, role: filtersRef.current.role });
}, [updateParams]);
const handleRoleChange = useCallback((value: string) => {
filtersRef.current.role = value; // la ref: el fetchFn corre antes del re-render
setRole(value); // el estado: para pintar el select
void tableRef.current?.resetAndRefetch();
}, []);El par estado + ref no es opcional
resetAndRefetch() dispara el fetchFn inmediatamente, antes de que el nuevo estado llegue
al render. Sin la ref, el fetch usaría el valor anterior.
Filtro de rango de fechas
// 1. En las definiciones del menú
{ key: "issued", title: "Fecha de emisión", type: "dateRange" }
// 2. En la page action
import { parseRangeToken } from "@fesa/components/datatable";
const { from, to } = parseRangeToken(params.issued?.[0]);
if (from || to) {
where.issuedAt = {
...(from ? { gte: new Date(from) } : {}),
...(to ? { lte: new Date(`${to}T23:59:59`) } : {}), // incluir el día final
};
}El valor viaja por la URL como ?issued=2026-01-01..2026-03-31 (cualquiera de los dos extremos puede faltar). type: "numberRange" funciona igual para montos.