ag-grid
Version:
Advanced Javascript Datagrid. Supports raw Javascript, AngularJS 1.x, AngularJS 2.0 and Web Components
197 lines (168 loc) • 8.85 kB
text/typescript
/// <reference path="../svgFactory.ts" />
/// <reference path="../utils.ts" />
/// <reference path="../constants.ts" />
module ag.grid {
var svgFactory = SvgFactory.getInstance();
var utils = Utils;
var constants = Constants;
export function groupCellRendererFactory(gridOptionsWrapper: GridOptionsWrapper,
selectionRendererFactory: SelectionRendererFactory,
expressionService: ExpressionService) {
return function groupCellRenderer(params: any) {
var eGroupCell = document.createElement('span');
var node = params.node;
var cellExpandable = node.group && !node.footer;
if (cellExpandable) {
addExpandAndContract(eGroupCell, params);
}
var checkboxNeeded = params.colDef && params.colDef.cellRenderer && params.colDef.cellRenderer.checkbox && !node.footer;
if (checkboxNeeded) {
var eCheckbox = selectionRendererFactory.createSelectionCheckbox(node, params.rowIndex);
eGroupCell.appendChild(eCheckbox);
}
if (params.colDef && params.colDef.cellRenderer && params.colDef.cellRenderer.innerRenderer) {
createFromInnerRenderer(eGroupCell, params, params.colDef.cellRenderer.innerRenderer);
} else if (node.footer) {
createFooterCell(eGroupCell, params);
} else if (node.group) {
createGroupCell(eGroupCell, params);
} else {
createLeafCell(eGroupCell, params);
}
// only do this if an indent - as this overwrites the padding that
// the theme set, which will make things look 'not aligned' for the
// first group level.
var suppressPadding = params.colDef && params.colDef.cellRenderer
&& params.colDef.cellRenderer.suppressPadding;
if (!suppressPadding && (node.footer || node.level > 0)) {
var paddingFactor: any;
if (params.colDef && params.colDef.cellRenderer && params.colDef.cellRenderer.padding >= 0) {
paddingFactor = params.colDef.cellRenderer.padding;
} else {
paddingFactor = 10;
}
var paddingPx = node.level * paddingFactor;
if (node.footer) {
paddingPx += 10;
} else if (!node.group) {
paddingPx += 5;
}
eGroupCell.style.paddingLeft = paddingPx + 'px';
}
return eGroupCell;
};
function addExpandAndContract(eGroupCell: any, params: any) {
var eExpandIcon = createGroupExpandIcon(true);
var eContractIcon = createGroupExpandIcon(false);
eGroupCell.appendChild(eExpandIcon);
eGroupCell.appendChild(eContractIcon);
eExpandIcon.addEventListener('click', expandOrContract);
eContractIcon.addEventListener('click', expandOrContract);
eGroupCell.addEventListener('dblclick', expandOrContract);
showAndHideExpandAndContract(eExpandIcon, eContractIcon, params.node.expanded);
// if parent cell was passed, then we can listen for when focus is on the cell,
// and then expand / contract as the user hits enter or space-bar
if (params.eGridCell) {
params.eGridCell.addEventListener('keydown', function(event: any) {
if (utils.isKeyPressed(event, constants.KEY_ENTER)) {
expandOrContract();
event.preventDefault();
}
});
}
function expandOrContract() {
expandGroup(eExpandIcon, eContractIcon, params);
}
}
function showAndHideExpandAndContract(eExpandIcon: any, eContractIcon: any, expanded: any) {
utils.setVisible(eExpandIcon, !expanded);
utils.setVisible(eContractIcon, expanded);
}
function createFromInnerRenderer(eGroupCell: any, params: any, renderer: any) {
utils.useRenderer(eGroupCell, renderer, params);
}
function getRefreshFromIndex(params: any) {
if (gridOptionsWrapper.isGroupIncludeFooter()) {
return params.rowIndex;
} else {
return params.rowIndex + 1;
}
}
function expandGroup(eExpandIcon: any, eContractIcon: any, params: any) {
params.node.expanded = !params.node.expanded;
var refreshIndex = getRefreshFromIndex(params);
params.api.onGroupExpandedOrCollapsed(refreshIndex);
showAndHideExpandAndContract(eExpandIcon, eContractIcon, params.node.expanded);
}
function createGroupExpandIcon(expanded: any) {
var eIcon: any;
if (expanded) {
eIcon = utils.createIcon('groupContracted', gridOptionsWrapper, null, svgFactory.createArrowRightSvg);
} else {
eIcon = utils.createIcon('groupExpanded', gridOptionsWrapper, null, svgFactory.createArrowDownSvg);
}
utils.addCssClass(eIcon, 'ag-group-expand');
return eIcon;
}
// creates cell with 'Total {{key}}' for a group
function createFooterCell(eGroupCell: any, params: any) {
var footerValue: string;
var groupName = getGroupName(params);
if (params.colDef && params.colDef.cellRenderer && params.colDef.cellRenderer.footerValueGetter) {
var footerValueGetter = params.colDef.cellRenderer.footerValueGetter;
// params is same as we were given, except we set the value as the item to display
var paramsClone: any = utils.cloneObject(params);
paramsClone.value = groupName;
if (typeof footerValueGetter === 'function') {
footerValue = footerValueGetter(paramsClone);
} else if (typeof footerValueGetter === 'string') {
footerValue = expressionService.evaluate(footerValueGetter, paramsClone);
} else {
console.warn('ag-Grid: footerValueGetter should be either a function or a string (expression)');
}
} else {
footerValue = 'Total ' + groupName;
}
var eText = document.createTextNode(footerValue);
eGroupCell.appendChild(eText);
}
function getGroupName(params: any) {
var cellRenderer = params.colDef.cellRenderer;
if (cellRenderer && cellRenderer.keyMap
&& typeof cellRenderer.keyMap === 'object' && params.colDef.cellRenderer !== null) {
var valueFromMap = cellRenderer.keyMap[params.node.key];
if (valueFromMap) {
return valueFromMap;
} else {
return params.node.key;
}
} else {
return params.node.key;
}
}
// creates cell with '{{key}} ({{childCount}})' for a group
function createGroupCell(eGroupCell: any, params: any) {
var groupName = getGroupName(params);
var colDefOfGroupedCol = params.api.getColumnDef(params.node.field);
if (colDefOfGroupedCol && typeof colDefOfGroupedCol.cellRenderer === 'function') {
params.value = groupName;
utils.useRenderer(eGroupCell, colDefOfGroupedCol.cellRenderer, params);
} else {
eGroupCell.appendChild(document.createTextNode(groupName));
}
// only include the child count if it's included, eg if user doing custom aggregation,
// then this could be left out, or set to -1, ie no child count
var suppressCount = params.colDef.cellRenderer && params.colDef.cellRenderer.suppressCount;
if (!suppressCount && params.node.allChildrenCount >= 0) {
eGroupCell.appendChild(document.createTextNode(" (" + params.node.allChildrenCount + ")"));
}
}
// creates cell with '{{key}} ({{childCount}})' for a group
function createLeafCell(eParent: any, params: any) {
if (params.value) {
var eText = document.createTextNode(' ' + params.value);
eParent.appendChild(eText);
}
}
}
}