UNPKG

ag-grid

Version:

Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components

98 lines (80 loc) 3.64 kB
import {ColumnGroupChild} from "../../entities/columnGroupChild"; import {Utils as _} from "../../utils"; import {Column} from "../../entities/column"; import {BeanStub} from "../../context/beanStub"; import {Autowired, PostConstruct} from "../../context/context"; import {GridOptionsWrapper} from "../../gridOptionsWrapper"; import {ColumnAnimationService} from "../columnAnimationService"; import {EventService} from "../../eventService"; import {Events} from "../../events"; import {Beans} from "../beans"; export class SetLeftFeature extends BeanStub { private columnOrGroup: ColumnGroupChild; private eCell: HTMLElement; private actualLeft: number; // if we are spanning columns, this tells what columns, // otherwise this is empty private colsSpanning: Column[]; private beans: Beans; constructor(columnOrGroup: ColumnGroupChild, eCell: HTMLElement, beans: Beans, colsSpanning?: Column[]) { super(); this.columnOrGroup = columnOrGroup; this.eCell = eCell; this.colsSpanning = colsSpanning; this.beans = beans; } public setColsSpanning(colsSpanning: Column[]): void { this.colsSpanning = colsSpanning; this.onLeftChanged(); } public getColumnOrGroup(): ColumnGroupChild { if (this.beans.gridOptionsWrapper.isEnableRtl() && this.colsSpanning) { return this.colsSpanning[this.colsSpanning.length-1]; } else { return this.columnOrGroup; } } public init(): void { this.addDestroyableEventListener(this.columnOrGroup, Column.EVENT_LEFT_CHANGED, this.onLeftChanged.bind(this)); this.setLeftFirstTime(); } private setLeftFirstTime(): void { let suppressMoveAnimation = this.beans.gridOptionsWrapper.isSuppressColumnMoveAnimation(); let oldLeftExists = _.exists(this.columnOrGroup.getOldLeft()); let animateColumnMove = this.beans.columnAnimationService.isActive() && oldLeftExists && !suppressMoveAnimation; if (animateColumnMove) { this.animateInLeft(); } else { this.onLeftChanged(); } } private animateInLeft(): void { let left = this.getColumnOrGroup().getLeft(); let oldLeft = this.getColumnOrGroup().getOldLeft(); this.setLeft(oldLeft); // we must keep track of the left we want to set to, as this would otherwise lead to a race // condition, if the user changed the left value many times in one VM turn, then we want to make // make sure the actualLeft we set in the timeout below (in the next VM turn) is the correct left // position. eg if user changes column position twice, then setLeft() below executes twice in next // VM turn, but only one (the correct one) should get applied. this.actualLeft = left; this.beans.columnAnimationService.executeNextVMTurn( () => { // test this left value is the latest one to be applied, and if not, do nothing if (this.actualLeft===left) { this.setLeft(left); } }); } private onLeftChanged(): void { this.actualLeft = this.getColumnOrGroup().getLeft(); this.setLeft(this.actualLeft); } private setLeft(value: number): void { // if the value is null, then that means the column is no longer // displayed. there is logic in the rendering to fade these columns // out, so we don't try and change their left positions. if (_.exists(value)) { this.eCell.style.left = value + 'px'; } } }