FesaComponents
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.

En esta pagina