ag-grid
Version:
Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components
98 lines (80 loc) • 3.64 kB
text/typescript
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';
}
}
}