kea-react
Version:
Componentes comunes de react
35 lines (30 loc) • 1.76 kB
text/typescript
import { Grid2State } from "./gridState";
import { Grid2Column } from "./column";
import { ObjMap, mapObject, promiseAllObj } from "keautils";
import { filtrarOrdenar, gridColumnToFiltroOrdenColumn, getItemCellData } from "./filtrarOrdenar";
import { CsvRow, toCSV } from "../../grid/csv";
import { stringToBlob } from "../../files";
import { download } from "../../downloadjs";
import { GridCell } from "./baseTypes";
import { cellToText } from "./text";
/**Genera las filas de un CSV */
export async function generateCsvRows<T>(rows: T[] | PromiseLike<T[]>, state: Grid2State, columns: ObjMap<Grid2Column<any, any>>): Promise<CsvRow[]> {
const filtroColumns = promiseAllObj(mapObject(columns, value => gridColumnToFiltroOrdenColumn(rows, value)));
const rowsSync = await rows;
const itemsFiltro = getItemCellData(rowsSync, await filtroColumns);
const filteredData = filtrarOrdenar<T>(itemsFiltro, state.filtroOrden, await filtroColumns).map(x=> x.original);
const exportMap = state.export;
const mappedColumns = exportMap.map(key => columns[key]);
const toCsvCell = (cell: GridCell<any, any>) => cell.string == undefined ? cellToText(cell.data) : cell.string;
const toCsvRow = (row: T) => mappedColumns.map(col => toCsvCell(col.cell(row)));
const csv = filteredData.map(toCsvRow);
const header = mappedColumns.map(x => x.title);
return [header, ...csv];
}
/**Descarga el CSV del grid */
export async function downloadCsv<T>(rows: T[] | PromiseLike<T[]>, state: Grid2State, columns: ObjMap<Grid2Column<any, any>>) {
const data = await generateCsvRows(rows, state, columns);
const str = toCSV(data);
const blob = stringToBlob(str);
download(blob, "Lista.csv");
}