ag-grid-enterprise
Version:
ag-Grid Enterprise Features
376 lines (303 loc) • 12.7 kB
text/typescript
import {
_,
AgCheckbox,
Autowired,
Column,
ColumnController,
Component,
Context,
CssClassApplier,
DragAndDropService,
DragSource,
DragSourceType,
Events,
EventService,
GridOptionsWrapper,
OriginalColumnGroup,
PostConstruct,
RefSelector,
TouchListener,
Utils
} from "ag-grid-community/main";
import {BaseColumnItem} from "./primaryColsPanel";
export class ToolPanelColumnGroupComp extends Component implements BaseColumnItem {
private static TEMPLATE =
`<div class="ag-column-tool-panel-column-group">
<span id="eColumnGroupIcons" class="ag-column-group-icons">
<span id="eGroupOpenedIcon" class="ag-column-group-closed-icon"></span>
<span id="eGroupClosedIcon" class="ag-column-group-opened-icon"></span>
</span>
<ag-checkbox ref="cbSelect" (change)="onCheckboxChanged" class="ag-column-select-checkbox"></ag-checkbox>
<span class="ag-column-drag" ref="eDragHandle"></span>
<span id="eText" class="ag-column-tool-panel-column-group" (click)="onLabelClicked"></span>
</div>`;
private gridOptionsWrapper: GridOptionsWrapper;
private columnController: ColumnController;
private context: Context;
private dragAndDropService: DragAndDropService;
private eventService: EventService;
private cbSelect: AgCheckbox;
private eDragHandle: HTMLElement;
private columnGroup: OriginalColumnGroup;
private expanded: boolean;
private columnDept: number;
private eGroupClosedIcon: HTMLElement;
private eGroupOpenedIcon: HTMLElement;
private expandedCallback: () => void;
private allowDragging: boolean;
private displayName: string;
private processingColumnStateChange = false;
private selectionCallback: (selected: boolean) => void;
constructor(columnGroup: OriginalColumnGroup, columnDept: number, expandedCallback: () => void, allowDragging: boolean, expandByDefault: boolean) {
super();
this.columnGroup = columnGroup;
this.columnDept = columnDept;
this.expandedCallback = expandedCallback;
this.allowDragging = allowDragging;
this.expanded = expandByDefault;
}
public init(): void {
this.setTemplate(ToolPanelColumnGroupComp.TEMPLATE);
this.instantiate(this.context);
let eText = this.queryForHtmlElement('#eText');
// this.displayName = this.columnGroup.getColGroupDef() ? this.columnGroup.getColGroupDef().headerName : null;
this.displayName = this.columnController.getDisplayNameForOriginalColumnGroup(null, this.columnGroup, 'toolPanel');
if (Utils.missing(this.displayName)) {
this.displayName = '>>';
}
eText.innerHTML = this.displayName;
this.setupExpandContract();
this.addCssClass('ag-toolpanel-indent-' + this.columnDept);
this.addDestroyableEventListener(this.eventService, Events.EVENT_COLUMN_PIVOT_MODE_CHANGED, this.onColumnStateChanged.bind(this));
this.setOpenClosedIcons();
this.setupDragging();
this.onColumnStateChanged();
this.addVisibilityListenersToAllChildren();
CssClassApplier.addToolPanelClassesFromColDef(this.columnGroup.getColGroupDef(), this.getGui(), this.gridOptionsWrapper, null, this.columnGroup);
}
private addVisibilityListenersToAllChildren(): void {
this.columnGroup.getLeafColumns().forEach(column => {
this.addDestroyableEventListener(column, Column.EVENT_VISIBLE_CHANGED, this.onColumnStateChanged.bind(this));
this.addDestroyableEventListener(column, Column.EVENT_VALUE_CHANGED, this.onColumnStateChanged.bind(this));
this.addDestroyableEventListener(column, Column.EVENT_PIVOT_CHANGED, this.onColumnStateChanged.bind(this));
this.addDestroyableEventListener(column, Column.EVENT_ROW_GROUP_CHANGED, this.onColumnStateChanged.bind(this));
});
}
private setupDragging(): void {
if (!this.allowDragging) {
_.setVisible(this.eDragHandle, false);
return;
}
let dragSource: DragSource = {
type: DragSourceType.ToolPanel,
eElement: this.eDragHandle,
dragItemName: this.displayName,
dragItemCallback: () => this.createDragItem()
};
this.dragAndDropService.addDragSource(dragSource, true);
this.addDestroyFunc(() => this.dragAndDropService.removeDragSource(dragSource));
}
private createDragItem() {
let visibleState: { [key: string]: boolean } = {};
this.columnGroup.getLeafColumns().forEach(col => {
visibleState[col.getId()] = col.isVisible();
});
return {
columns: this.columnGroup.getLeafColumns(),
visibleState: visibleState
};
}
private setupExpandContract(): void {
this.eGroupClosedIcon = this.queryForHtmlElement('#eGroupClosedIcon');
this.eGroupOpenedIcon = this.queryForHtmlElement('#eGroupOpenedIcon');
this.eGroupClosedIcon.appendChild(Utils.createIcon('columnSelectClosed', this.gridOptionsWrapper, null));
this.eGroupOpenedIcon.appendChild(Utils.createIcon('columnSelectOpen', this.gridOptionsWrapper, null));
this.addDestroyableEventListener(this.eGroupClosedIcon, 'click', this.onExpandOrContractClicked.bind(this));
this.addDestroyableEventListener(this.eGroupOpenedIcon, 'click', this.onExpandOrContractClicked.bind(this));
let eColumnGroupIcons = this.queryForHtmlElement('#eColumnGroupIcons');
let touchListener = new TouchListener(eColumnGroupIcons, true);
this.addDestroyableEventListener(touchListener, TouchListener.EVENT_TAP, this.onExpandOrContractClicked.bind(this));
this.addDestroyFunc(touchListener.destroy.bind(touchListener));
}
private onLabelClicked(): void {
let nextState = !this.cbSelect.isSelected();
this.onChangeCommon(nextState);
}
private onCheckboxChanged(event: any): void {
this.onChangeCommon(event.selected);
}
private onChangeCommon(nextState: boolean): void {
if (this.processingColumnStateChange) {
return;
}
let childColumns = this.columnGroup.getLeafColumns();
if (this.columnController.isPivotMode()) {
if (nextState) {
this.actionCheckedReduce(childColumns);
} else {
this.actionUnCheckedReduce(childColumns);
}
} else {
let allowedColumns = childColumns.filter(c => !c.isLockVisible());
this.columnController.setColumnsVisible(allowedColumns, nextState, "toolPanelUi");
}
if (this.selectionCallback) {
this.selectionCallback(this.isSelected());
}
}
private actionUnCheckedReduce(columns: Column[]): void {
let columnsToUnPivot: Column[] = [];
let columnsToUnValue: Column[] = [];
let columnsToUnGroup: Column[] = [];
columns.forEach(column => {
if (column.isPivotActive()) {
columnsToUnPivot.push(column);
}
if (column.isRowGroupActive()) {
columnsToUnGroup.push(column);
}
if (column.isValueActive()) {
columnsToUnValue.push(column);
}
});
if (columnsToUnPivot.length > 0) {
this.columnController.removePivotColumns(columnsToUnPivot, "toolPanelUi");
}
if (columnsToUnGroup.length > 0) {
this.columnController.removeRowGroupColumns(columnsToUnGroup, "toolPanelUi");
}
if (columnsToUnValue.length > 0) {
this.columnController.removeValueColumns(columnsToUnValue, "toolPanelUi");
}
}
private actionCheckedReduce(columns: Column[]): void {
let columnsToAggregate: Column[] = [];
let columnsToGroup: Column[] = [];
let columnsToPivot: Column[] = [];
columns.forEach(column => {
// don't change any column that's already got a function active
if (column.isAnyFunctionActive()) {
return;
}
if (column.isAllowValue()) {
columnsToAggregate.push(column);
} else if (column.isAllowRowGroup()) {
columnsToGroup.push(column);
} else if (column.isAllowRowGroup()) {
columnsToPivot.push(column);
}
});
if (columnsToAggregate.length > 0) {
this.columnController.addValueColumns(columnsToAggregate, "toolPanelUi");
}
if (columnsToGroup.length > 0) {
this.columnController.addRowGroupColumns(columnsToGroup, "toolPanelUi");
}
if (columnsToPivot.length > 0) {
this.columnController.addPivotColumns(columnsToPivot, "toolPanelUi");
}
}
private onColumnStateChanged(): void {
let selectedValue = this.workOutSelectedValue();
let readOnlyValue = this.workOutReadOnlyValue();
this.processingColumnStateChange = true;
this.cbSelect.setSelected(selectedValue);
if (this.selectionCallback) {
this.selectionCallback(this.isSelected());
}
this.cbSelect.setReadOnly(readOnlyValue);
this.processingColumnStateChange = false;
}
private workOutReadOnlyValue(): boolean {
let pivotMode = this.columnController.isPivotMode();
let colsThatCanAction = 0;
this.columnGroup.getLeafColumns().forEach(col => {
if (pivotMode) {
if (col.isAnyFunctionAllowed()) {
colsThatCanAction++;
}
} else {
if (!col.isLockVisible()) {
colsThatCanAction++;
}
}
});
return colsThatCanAction === 0;
}
private workOutSelectedValue(): boolean {
let pivotMode = this.columnController.isPivotMode();
let visibleChildCount = 0;
let hiddenChildCount = 0;
this.columnGroup.getLeafColumns().forEach((column: Column) => {
// ignore lock visible columns
if (column.isLockVisible()) {
return;
}
if (this.isColumnVisible(column, pivotMode)) {
visibleChildCount++;
} else {
hiddenChildCount++;
}
});
let selectedValue: boolean;
if (visibleChildCount > 0 && hiddenChildCount > 0) {
selectedValue = false;
} else if (visibleChildCount > 0) {
selectedValue = true;
} else {
selectedValue = false;
}
return selectedValue;
}
private isColumnVisible(column: Column, pivotMode: boolean): boolean {
if (pivotMode) {
let pivoted = column.isPivotActive();
let grouped = column.isRowGroupActive();
let aggregated = column.isValueActive();
return pivoted || grouped || aggregated;
} else {
return column.isVisible();
}
}
private onExpandOrContractClicked(): void {
this.expanded = !this.expanded;
this.setOpenClosedIcons();
this.expandedCallback();
}
private setOpenClosedIcons(): void {
let folderOpen = this.expanded;
Utils.setVisible(this.eGroupClosedIcon, !folderOpen);
Utils.setVisible(this.eGroupOpenedIcon, folderOpen);
}
public isExpanded(): boolean {
return this.expanded;
}
public getDisplayName(): string {
return this.displayName;
}
public onSelectAllChanged(value: boolean): void {
if (
(value && !this.cbSelect.isSelected()) ||
(!value && this.cbSelect.isSelected())
) {
if (!this.cbSelect.isReadOnly()) {
this.cbSelect.toggle();
}
}
}
public isSelected(): boolean {
return this.cbSelect.isSelected();
}
public isSelectable(): boolean {
return !this.cbSelect.isReadOnly();
}
public isExpandable(): boolean {
return true;
}
public setExpanded(value: boolean): void {
if (this.expanded !== value) {
this.onExpandOrContractClicked();
}
}
}