UNPKG

kea-react

Version:

Componentes comunes de react

70 lines (60 loc) 2.38 kB
import { GridColumnFilter } from "../simpleGrid/tiposFiltros"; import rangoFechasFilter = require("./rangoFechas"); import valorUnicoFilter = require("./valorUnico"); import busquedaTexto = require("./busquedaTexto"); type DataType = "date" | "fewValues" | "manyValues" | "numericRange" | "allEqual" | "empty"; /**Selecciona un filtro basado en la información de la columna */ function getDataType(data: any[], getData: (item: any) => any): DataType { if(data.length == 0) return "empty"; const distinctData = new Set(); let distinctNumberCount = 0; let distinctStringCount = 0; const manyMax = 20; //Tratamos de tomar una muestra de este tamaño: const sampleSize = 1000; const step = Math.round(Math.max(data.length / sampleSize, 1)); let isAllEquals = true; const firstData = getData(data[0]); for (let i = 0; i < data.length; i += step) { const value = getData(data[i]); if (value instanceof Date) { return "date"; } else { const newValue = !distinctData.has(value) if (newValue) { //El valor nunca ha aparecido antes const type = typeof (data[i]); if (type == "number") distinctNumberCount++; else distinctStringCount++; } } if (distinctNumberCount > manyMax && distinctStringCount == 0) { return "numericRange"; } else if (distinctStringCount > manyMax) { return "manyValues" } distinctData.add(value); if (value != firstData) { isAllEquals = false; } } return isAllEquals ? "allEqual" : "fewValues"; } /**Selecciona un tipo de filtro basado en la información de la columna */ export function getAutoFiltro(data: any[], getData: (item: any) => any): GridColumnFilter<{}> | undefined { const dataType = getDataType(data, getData); switch (dataType) { case "allEqual": return valorUnicoFilter.filtro; case "date": return rangoFechasFilter.filtro; case "numericRange": case "fewValues": return valorUnicoFilter.filtro; case "manyValues": return busquedaTexto.filtro; } }