UNPKG

ag-grid

Version:

Advanced Javascript Datagrid. Supports raw Javascript, AngularJS 1.x, AngularJS 2.0 and Web Components

135 lines (117 loc) 6.51 kB
/// <reference path="columnController.ts" /> /// <reference path="gridOptionsWrapper.ts" /> /// <reference path="logger.ts" /> /// <reference path="events.ts" /> /// <reference path="eventService.ts" /> module ag.grid { export class MasterSlaveService { private gridOptionsWrapper: GridOptionsWrapper; private columnController: ColumnController; private gridPanel: GridPanel; private logger: Logger; private eventService: EventService; // flag to mark if we are consuming. to avoid cyclic events (ie slave firing back to master // while processing a master event) we mark this if consuming an event, and if we are, then // we don't fire back any events. private consuming = false; public init(gridOptionsWrapper: GridOptionsWrapper, columnController: ColumnController, gridPanel: GridPanel, loggerFactory: LoggerFactory, eventService: EventService) { this.gridOptionsWrapper = gridOptionsWrapper; this.columnController = columnController; this.gridPanel = gridPanel; this.eventService = eventService; this.logger = loggerFactory.create('MasterSlaveService'); eventService.addEventListener(Events.EVENT_COLUMN_MOVED, this.fireColumnEvent.bind(this)); eventService.addEventListener(Events.EVENT_COLUMN_VISIBLE, this.fireColumnEvent.bind(this)); eventService.addEventListener(Events.EVENT_COLUMN_GROUP_OPENED, this.fireColumnEvent.bind(this)); eventService.addEventListener(Events.EVENT_COLUMN_RESIZED, this.fireColumnEvent.bind(this)); eventService.addEventListener(Events.EVENT_COLUMN_PINNED_COUNT_CHANGED, this.fireColumnEvent.bind(this)); } // common logic across all the fire methods private fireEvent(callback: (slaveService: MasterSlaveService)=>void): void { // if we are already consuming, then we are acting on an event from a master, // so we don't cause a cyclic firing of events if (this.consuming) { return; } // iterate through the slave grids, and pass each slave service to the callback var slaveGrids = this.gridOptionsWrapper.getSlaveGrids(); if (slaveGrids) { slaveGrids.forEach( (slaveGridOptions: GridOptions) => { if (slaveGridOptions.api) { var slaveService = slaveGridOptions.api.__getMasterSlaveService(); callback(slaveService); } }); } } // common logic across all consume methods. very little common logic, however extracting // guarantees consistency across the methods. private onEvent(callback: ()=>void): void { this.consuming = true; callback(); this.consuming = false; } private fireColumnEvent(event: ColumnChangeEvent): void { this.fireEvent( (slaveService: MasterSlaveService)=> { slaveService.onColumnEvent(event); }); } public fireHorizontalScrollEvent(horizontalScroll: number): void { this.fireEvent( (slaveService: MasterSlaveService)=> { slaveService.onScrollEvent(horizontalScroll); }); } public onScrollEvent(horizontalScroll: number): void { this.onEvent(()=> { this.gridPanel.setHorizontalScrollPosition(horizontalScroll); }); } public onColumnEvent(event: ColumnChangeEvent): void { this.onEvent(() => { // the column in the even is from the master grid. need to // look up the equivalent from this (slave) grid var masterColumn = event.getColumn(); var slaveColumn: Column; if (masterColumn) { slaveColumn = this.columnController.getColumn(masterColumn.colId); } // if event was with respect to a master column, that is not present in this // grid, then we ignore the event if (masterColumn && !slaveColumn) { return; } // likewise for column group var masterColumnGroup = event.getColumnGroup(); var slaveColumnGroup: ColumnGroup; if (masterColumnGroup) { slaveColumnGroup = this.columnController.getColumnGroup(masterColumnGroup.name); } if (masterColumnGroup && !slaveColumnGroup) { return; } switch (event.getType()) { case Events.EVENT_COLUMN_MOVED: this.logger.log('onColumnEvent-> processing '+event+' fromIndex = '+ event.getFromIndex() + ', toIndex = ' + event.getToIndex()); this.columnController.moveColumn(event.getFromIndex(), event.getToIndex()); break; case Events.EVENT_COLUMN_VISIBLE: this.logger.log('onColumnEvent-> processing '+event+' visible = '+ masterColumn.visible); this.columnController.setColumnVisible(slaveColumn, masterColumn.visible); break; case Events.EVENT_COLUMN_GROUP_OPENED: this.logger.log('onColumnEvent-> processing '+event+' expanded = '+ masterColumnGroup.expanded); this.columnController.columnGroupOpened(slaveColumnGroup, masterColumnGroup.expanded); break; case Events.EVENT_COLUMN_RESIZED: this.logger.log('onColumnEvent-> processing '+event+' actualWidth = '+ masterColumn.actualWidth); this.columnController.setColumnWidth(slaveColumn, masterColumn.actualWidth); break; case Events.EVENT_COLUMN_PINNED_COUNT_CHANGED: this.logger.log('onColumnEvent-> processing '+event); this.columnController.setPinnedColumnCount(event.getPinnedColumnCount()); break; } }); } } }