UNPKG

kea-react

Version:

Componentes comunes de react

90 lines (74 loc) 3.25 kB
import { Grid2Column, ColumnMap } from "./column"; import { DrillDownColumn, Grid2State, DrillDownMap } from "./gridState"; import { Key } from "./baseTypes"; import { mapObject, filterObject } from "keautils"; /**Obtiene la cantidad de columnas originales */ export function getOriginalColumnCount(totalColumns: number, drillDownCount: number) { return totalColumns - drillDownCount; } /**Obtiene todas las columnas efectivas del grid, que son las originales concatenadas con las de drill down*/ export function getEffectiveColumns<TItem, TShared>( originalColumns: ColumnMap, drillDowns: DrillDownMap ): ColumnMap { const drillDownColumns = mapObject(drillDowns, x => drillDownToColumn(originalColumns, x)); return { ...originalColumns, ...drillDownColumns }; } /**Devuelve el nuevo state de un grid despues de una operación de quitar columna */ export function quitarColumna( key: Key, oldValue: Grid2State ) { const newValue: Grid2State = { ...oldValue, drillDowns: filterObject(oldValue.drillDowns, (value, dkey) => dkey != key), mapping: oldValue.mapping.filter(x => x != key) }; return newValue; } /**Devuelve el nuevo state despues de agregar un drilldown * @param column indice de la columna original * @param path ruta del drilldown */ export function addDrilldown(column: Key, path: (string | number)[], oldValue: Grid2State): Grid2State { const last = oldValue.drillDowns; const lastDrillDownCol = last[column]; const originalPath = (lastDrillDownCol && lastDrillDownCol.path) || []; const originalColumn = lastDrillDownCol == null ? column : lastDrillDownCol.columna; const realPath = [... originalPath, ... path]; const newValue: DrillDownColumn = {columna: originalColumn, path: realPath}; const newKey = getDrillDownKey(newValue.columna, newValue.path); //Nuevos valores //Si el drill down ya existe no hay problema ya que simplemente se sustituira por otro drilldown equivalente const drillDowns = { ...last, [newKey]: newValue }; const mapping = [...oldValue.mapping, newKey]; return { ...oldValue, drillDowns, mapping } } /**Convierte un drill down a una columna del grid */ function drillDownToColumn<TItem, TShared>( originalColumns: ColumnMap, drillDown: DrillDownColumn ): Grid2Column<TItem, TShared> { const column = originalColumns[drillDown.columna]; const title = getDrillDownTitle(column.title, drillDown.path); const cell = (row: TItem) => ({ data: getPathData(column.cell(row).data, drillDown.path) }); return { title, cell: cell, key: getDrillDownKey(drillDown.columna, drillDown.path) }; } function getDrillDownKey(column: Key, path: Key[]) { return "_drilldown:" + column + ":" + path.join("/"); } function getDrillDownTitle(colTitle: string, path: (string | number)[]) { return colTitle + "/" + ( path.length <= 2 ? path.join("/") : (".../" + path.slice(2).join("/")) ); } function getPathData(data: {}, path: (string | number)[]) { return path.reduce((data, prop) => data && data[prop], data); }