kea-react
Version:
Componentes comunes de react
70 lines (60 loc) • 2.38 kB
text/typescript
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;
}
}