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