UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

729 lines (728 loc) • 34.9 kB
/** * DevExtreme (ui/grid_core/ui.grid_core.column_fixing.js) * Version: 18.1.3 * Build date: Tue May 15 2018 * * Copyright (c) 2012 - 2018 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ "use strict"; var $ = require("../../core/renderer"), eventsEngine = require("../../events/core/events_engine"), browser = require("../../core/utils/browser"), isDefined = require("../../core/utils/type").isDefined, extend = require("../../core/utils/extend").extend, each = require("../../core/utils/iterator").each, wheelEvent = require("../../events/core/wheel"), messageLocalization = require("../../localization/message"), gridCoreUtils = require("../grid_core/ui.grid_core.utils"); var CONTENT_CLASS = "content", CONTENT_FIXED_CLASS = "content-fixed", MASTER_DETAIL_CELL_CLASS = "dx-master-detail-cell", FIRST_CELL_CLASS = "dx-first-cell", LAST_CELL_CLASS = "dx-last-cell", HOVER_STATE_CLASS = "dx-state-hover", FIXED_COL_CLASS = "dx-col-fixed", FIXED_COLUMNS_CLASS = "dx-fixed-columns", POINTER_EVENTS_TARGET_CLASS = "dx-pointer-events-target", POINTER_EVENTS_NONE_CLASS = "dx-pointer-events-none", getTransparentColumnIndex = function(fixedColumns) { var transparentColumnIndex = -1; each(fixedColumns, function(index, column) { if ("transparent" === column.command) { transparentColumnIndex = index; return false } }); return transparentColumnIndex }, normalizeColumnWidths = function(fixedColumns, widths, fixedWidths) { var i, fixedColumnIndex = 0; if (fixedColumns && widths && fixedWidths) { for (i = 0; i < fixedColumns.length; i++) { if ("transparent" === fixedColumns[i].command) { fixedColumnIndex += fixedColumns[i].colspan } else { if (widths[fixedColumnIndex] < fixedWidths[i]) { widths[fixedColumnIndex] = fixedWidths[i] } fixedColumnIndex++ } } } return widths }; var baseFixedColumns = { init: function() { this.callBase(); this._isFixedTableRendering = false; this._isFixedColumns = false }, _createCol: function(column) { return this.callBase(column).toggleClass(FIXED_COL_CLASS, !!(this._isFixedTableRendering && (column.fixed || column.command && "transparent" !== column.command))) }, _renderTable: function(options) { var $fixedTable, $table, that = this, fixedColumns = that.getFixedColumns(); that._isFixedColumns = !!fixedColumns.length; $table = that.callBase(options); if (that._isFixedColumns) { that._isFixedTableRendering = true; $fixedTable = that._createTable(fixedColumns); that._renderRows($fixedTable, extend({}, options, { columns: fixedColumns })); that._updateContent($fixedTable, options && options.change); that._isFixedTableRendering = false } else { that._fixedTableElement && that._fixedTableElement.remove(); that._fixedTableElement = null } return $table }, _createCell: function(options) { var fixedColumns, prevFixedColumn, transparentColumnIndex, that = this, column = options.column, columnCommand = column && column.command, rowType = options.rowType, $cell = that.callBase.apply(that, arguments); if (that._isFixedTableRendering || "filter" === rowType) { fixedColumns = that.getFixedColumns(); transparentColumnIndex = getTransparentColumnIndex(fixedColumns); prevFixedColumn = fixedColumns[transparentColumnIndex - 1] } if (that._isFixedTableRendering) { if ("transparent" === columnCommand) { $cell.addClass(POINTER_EVENTS_NONE_CLASS).toggleClass(FIRST_CELL_CLASS, 0 === transparentColumnIndex || prevFixedColumn && "expand" === prevFixedColumn.command).toggleClass(LAST_CELL_CLASS, fixedColumns.length && transparentColumnIndex === fixedColumns.length - 1).html("freeSpace" !== rowType ? "&nbsp;" : "") } } else { if ("filter" === rowType) { $cell.toggleClass(FIRST_CELL_CLASS, options.columnIndex === transparentColumnIndex) } } return $cell }, _wrapTableInScrollContainer: function() { var $scrollContainer = this.callBase.apply(this, arguments); if (this._isFixedTableRendering) { $scrollContainer.addClass(this.addWidgetPrefix(CONTENT_FIXED_CLASS) + " " + POINTER_EVENTS_TARGET_CLASS) } return $scrollContainer }, _renderCellContent: function($cell, options) { var columns, isEmptyCell, transparentColumnIndex, alignByFixedColumnCellCount, that = this, column = options.column; if (!that._isFixedTableRendering && that._isFixedColumns) { isEmptyCell = column.fixed || column.command; if ("group" === options.rowType && isDefined(column.groupIndex)) { isEmptyCell = false; if (options.row.summaryCells && options.row.summaryCells.length) { columns = that._columnsController.getVisibleColumns(); alignByFixedColumnCellCount = that._getAlignByColumnCellCount ? that._getAlignByColumnCellCount(column.colspan, { columns: columns, row: options.row, isFixed: true }) : 0; if (alignByFixedColumnCellCount > 0) { transparentColumnIndex = getTransparentColumnIndex(that._columnsController.getFixedColumns()); isEmptyCell = columns.length - alignByFixedColumnCellCount < transparentColumnIndex } } } if (isEmptyCell && (that.option("legacyRendering") || "detail" === column.command)) { $cell.html("&nbsp;").addClass(column.cssClass); return } } if ("transparent" !== column.command) { that.callBase($cell, options) } }, _getCellElementsCore: function(rowIndex) { var fixedColumns, fixedColumnIndex, fixedCellElements, that = this, cellElements = that.callBase(rowIndex), index = "columnHeadersView" === that.name ? rowIndex : void 0; if (that._fixedTableElement && cellElements) { fixedColumns = that.getFixedColumns(index); fixedCellElements = that._getRowElements(that._fixedTableElement).eq(rowIndex).children("td"); each(fixedColumns, function(columnIndex, column) { if ("transparent" === column.command) { if (fixedCellElements.eq(columnIndex).hasClass(MASTER_DETAIL_CELL_CLASS)) { cellElements[columnIndex] = fixedCellElements.get(columnIndex) || cellElements[columnIndex] } } else { fixedColumnIndex = that._columnsController.getVisibleIndex(column.index, index); cellElements[fixedColumnIndex] = fixedCellElements.get(columnIndex) || cellElements[fixedColumnIndex] } }) } return cellElements }, getColumnWidths: function() { var fixedWidths, that = this, result = that.callBase(), fixedColumns = that.getFixedColumns(); if (that._fixedTableElement && result.length) { fixedWidths = that.callBase(that._fixedTableElement) } return normalizeColumnWidths(fixedColumns, result, fixedWidths) }, _getTableElement: function() { var tableElement = this._isFixedTableRendering ? this._fixedTableElement : this.callBase(); return tableElement }, _setTableElement: function(tableElement) { if (this._isFixedTableRendering) { this._fixedTableElement = tableElement.addClass(POINTER_EVENTS_NONE_CLASS) } else { this.callBase(tableElement) } }, getColumns: function(rowIndex, $tableElement) { $tableElement = $tableElement || this._getTableElement(); if (this._isFixedTableRendering || $tableElement && $tableElement.closest("table").parent("." + this.addWidgetPrefix(CONTENT_FIXED_CLASS)).length) { return this.getFixedColumns(rowIndex) } return this.callBase(rowIndex, $tableElement) }, getRowIndex: function($row) { var $fixedTable = this._fixedTableElement; if ($fixedTable && $fixedTable.find($row).length) { return this._getRowElements($fixedTable).index($row) } return this.callBase($row) }, getTableElements: function() { var result = this.callBase.apply(this, arguments); if (this._fixedTableElement) { result = result.add(this._fixedTableElement) } return result }, getFixedColumns: function(rowIndex) { return this._columnsController.getFixedColumns(rowIndex) }, getFixedColumnsOffset: function() { var $transparentColumn, positionTransparentColumn, offset = { left: 0, right: 0 }; if (this._fixedTableElement) { $transparentColumn = this.getTransparentColumnElement(); positionTransparentColumn = $transparentColumn.position(); offset = { left: positionTransparentColumn.left, right: this.element().outerWidth(true) - ($transparentColumn.outerWidth(true) + positionTransparentColumn.left) } } return offset }, getTransparentColumnElement: function() { return this._fixedTableElement && this._fixedTableElement.find("." + POINTER_EVENTS_NONE_CLASS).first() }, getFixedTableElement: function() { return this._fixedTableElement }, isFixedColumns: function() { return this._isFixedColumns }, _resizeCore: function() { this.callBase(); this.synchronizeRows() }, setColumnWidths: function(widths) { var columns, useVisibleColumns = false; this.callBase.apply(this, arguments); if (this._fixedTableElement) { if (this.option("legacyRendering")) { useVisibleColumns = widths && widths.length && !this.isScrollbarVisible(true) } else { useVisibleColumns = widths && widths.filter(function(width) { return "auto" === width }).length } if (useVisibleColumns) { columns = this._columnsController.getVisibleColumns() } this.callBase(widths, this._fixedTableElement, columns, true) } if (widths && widths.length && isDefined(this._columnsController.getVisibleColumns()[0].visibleWidth)) { this.synchronizeRows() } }, _createColGroup: function(columns) { if (!this.option("legacyRendering") && this._isFixedTableRendering && !this.option("columnAutoWidth")) { var visibleColumns = this._columnsController.getVisibleColumns(); var useVisibleColumns = visibleColumns.filter(function(column) { return !column.width }).length; if (useVisibleColumns) { columns = visibleColumns } } return this.callBase(columns) }, _getClientHeight: function(element) { var boundingClientRectElement = element.getBoundingClientRect && element.getBoundingClientRect(); return boundingClientRectElement && boundingClientRectElement.height ? boundingClientRectElement.height : element.clientHeight }, synchronizeRows: function() { var rowHeight, fixedRowHeight, rowIndex, heightTable, heightFixedTable, $rowElements, $fixedRowElements, that = this, rowHeights = [], fixedRowHeights = []; if (that._isFixedColumns && that._tableElement && that._fixedTableElement) { heightTable = that._getClientHeight(that._tableElement.get(0)); heightFixedTable = that._getClientHeight(that._fixedTableElement.get(0)); $rowElements = that._getRowElements(that._tableElement); $fixedRowElements = that._getRowElements(that._fixedTableElement); if (heightTable !== heightFixedTable) { $rowElements.css("height", ""); $fixedRowElements.css("height", ""); for (rowIndex = 0; rowIndex < $rowElements.length; rowIndex++) { rowHeights.push(that._getClientHeight($rowElements.get(rowIndex))); fixedRowHeights.push(that._getClientHeight($fixedRowElements.get(rowIndex))) } for (rowIndex = 0; rowIndex < $rowElements.length; rowIndex++) { rowHeight = rowHeights[rowIndex]; fixedRowHeight = fixedRowHeights[rowIndex]; if (rowHeight > fixedRowHeight) { $fixedRowElements.eq(rowIndex).css("height", rowHeight) } else { if (rowHeight < fixedRowHeight) { $rowElements.eq(rowIndex).css("height", fixedRowHeight) } } } } } } }; var ColumnHeadersViewFixedColumnsExtender = extend({}, baseFixedColumns, { _getRowVisibleColumns: function(rowIndex) { if (this._isFixedTableRendering) { return this.getFixedColumns(rowIndex) } return this.callBase(rowIndex) }, getContextMenuItems: function(options) { var onItemClick, that = this, column = options.column, columnFixingOptions = that.option("columnFixing"), items = that.callBase(options); if (options.row && "header" === options.row.rowType) { if (column && column.allowFixing) { onItemClick = function(params) { switch (params.itemData.value) { case "none": that._columnsController.columnOption(column.index, "fixed", false); break; case "left": that._columnsController.columnOption(column.index, { fixed: true, fixedPosition: "left" }); break; case "right": that._columnsController.columnOption(column.index, { fixed: true, fixedPosition: "right" }) } }; items = items || []; items.push({ text: columnFixingOptions.texts.fix, beginGroup: true, items: [{ text: columnFixingOptions.texts.leftPosition, value: "left", disabled: column.fixed && (!column.fixedPosition || "left" === column.fixedPosition), onItemClick: onItemClick }, { text: columnFixingOptions.texts.rightPosition, value: "right", disabled: column.fixed && "right" === column.fixedPosition, onItemClick: onItemClick }] }, { text: columnFixingOptions.texts.unfix, value: "none", disabled: !column.fixed, onItemClick: onItemClick }) } } return items }, setScrollerSpacing: function(width) { var that = this, rtlEnabled = that.option("rtlEnabled"); that.callBase(width); that.element().children("." + this.addWidgetPrefix(CONTENT_FIXED_CLASS)).css(rtlEnabled ? { paddingLeft: width } : { paddingRight: width }) }, getFixedColumnElements: function(rowIndex) { var columnElements, transparentColumnIndex, $transparentColumnElement, that = this; if (isDefined(rowIndex)) { return this._fixedTableElement && this._getRowElements(this._fixedTableElement).eq(rowIndex).children() } columnElements = that.getColumnElements(); $transparentColumnElement = that.getTransparentColumnElement(); if (columnElements && $transparentColumnElement && $transparentColumnElement.length) { transparentColumnIndex = getTransparentColumnIndex(that.getFixedColumns()); columnElements.splice(transparentColumnIndex, $transparentColumnElement.get(0).colSpan, $transparentColumnElement.get(0)) } return columnElements }, getColumnWidths: function() { var fixedWidths, that = this, result = that.callBase(), $fixedColumnElements = that.getFixedColumnElements(), fixedColumns = that.getFixedColumns(); if (that._fixedTableElement) { if ($fixedColumnElements && $fixedColumnElements.length) { fixedWidths = that._getWidths($fixedColumnElements) } else { fixedWidths = that.callBase(that._fixedTableElement) } } return normalizeColumnWidths(fixedColumns, result, fixedWidths) } }); var RowsViewFixedColumnsExtender = extend({}, baseFixedColumns, { _detachHoverEvents: function() { this._fixedTableElement && eventsEngine.off(this._fixedTableElement, "mouseover mouseout", ".dx-data-row"); this._tableElement && eventsEngine.off(this._tableElement, "mouseover mouseout", ".dx-data-row") }, _attachHoverEvents: function() { var that = this, attachHoverEvent = function($table) { eventsEngine.on($table, "mouseover mouseout", ".dx-data-row", that.createAction(function(args) { var event = args.event, rowIndex = that.getRowIndex($(event.target).closest(".dx-row")), isHover = "mouseover" === event.type; if (rowIndex >= 0) { that._tableElement && that._getRowElements(that._tableElement).eq(rowIndex).toggleClass(HOVER_STATE_CLASS, isHover); that._fixedTableElement && that._getRowElements(that._fixedTableElement).eq(rowIndex).toggleClass(HOVER_STATE_CLASS, isHover) } })) }; if (that._fixedTableElement && that._tableElement) { attachHoverEvent(that._fixedTableElement); attachHoverEvent(that._tableElement) } }, _findContentElement: function() { var $content, scrollable, scrollTop, that = this, contentClass = that.addWidgetPrefix(CONTENT_CLASS), element = that.element(); if (element && that._isFixedTableRendering) { $content = element.children("." + contentClass); scrollable = that.getScrollable(); if (!$content.length && scrollable) { $content = $("<div>").addClass(contentClass); eventsEngine.on($content, "scroll", function(e) { scrollTop = $(e.target).scrollTop(); if (scrollTop) { $(e.target).scrollTop(0); scrollable.scrollTo({ y: that._scrollTop + scrollTop }) } }); eventsEngine.on($content, wheelEvent.name, function(e) { if (scrollable) { scrollTop = scrollable.scrollTop(); scrollable.scrollTo({ y: scrollTop - e.delta }); if (scrollable.scrollTop() > 0 && scrollable.scrollTop() + scrollable.clientHeight() < scrollable.scrollHeight() + that.getScrollbarWidth()) { return false } } }); $content.appendTo(element) } return $content } return that.callBase() }, _updateBottomLoading: function() { if (!this._isFixedTableRendering) { this.callBase() } }, _updateScrollable: function() { this.callBase(); var scrollable = this.getScrollable(), scrollTop = scrollable && scrollable.scrollOffset().top; this._updateFixedTablePosition(-scrollTop) }, _renderContent: function(contentElement, tableElement) { if (this._isFixedTableRendering) { return contentElement.empty().addClass(this.addWidgetPrefix(CONTENT_CLASS) + " " + this.addWidgetPrefix(CONTENT_FIXED_CLASS) + " " + POINTER_EVENTS_TARGET_CLASS).append(tableElement) } return this.callBase(contentElement, tableElement) }, _getGroupCellOptions: function(options) { if (this._isFixedTableRendering) { return this.callBase(extend({}, options, { columns: this._columnsController.getVisibleColumns() })) } return this.callBase(options) }, _renderGroupSummaryCells: function($row, options) { if (this._isFixedTableRendering) { this.callBase($row, extend({}, options, { columns: this._columnsController.getVisibleColumns() })) } else { this.callBase($row, options) } }, _hasAlignByColumnSummaryItems: function(columnIndex, options) { var result = this.callBase.apply(this, arguments), column = options.columns[columnIndex]; if (options.isFixed) { return column.fixed && (result || "right" === column.fixedPosition) || "edit" === column.command } return result && !column.fixed }, _renderGroupSummaryCellsCore: function($groupCell, options, groupCellColSpan, alignByColumnCellCount) { var startColumnIndex, transparentColumnIndex, alignByFixedColumnCellCount; if (this._isFixedTableRendering) { options.isFixed = true; alignByFixedColumnCellCount = this._getAlignByColumnCellCount(groupCellColSpan, options); options.isFixed = false; startColumnIndex = options.columns.length - alignByFixedColumnCellCount; options = extend({}, options, { columns: this.getFixedColumns() }); transparentColumnIndex = getTransparentColumnIndex(options.columns); if (startColumnIndex < transparentColumnIndex) { alignByFixedColumnCellCount -= options.columns[transparentColumnIndex].colspan - 1 || 0; groupCellColSpan -= options.columns[transparentColumnIndex].colspan - 1 || 0 } else { if (alignByColumnCellCount > 0) { if (browser.mozilla) { $groupCell.css("display", "none") } else { $groupCell.css("visibility", "hidden") } } } alignByColumnCellCount = alignByFixedColumnCellCount } this.callBase($groupCell, options, groupCellColSpan, alignByColumnCellCount) }, _getSummaryCellIndex: function(columnIndex, columns) { var transparentColumnIndex; if (this._isFixedTableRendering) { transparentColumnIndex = getTransparentColumnIndex(columns); if (columnIndex > transparentColumnIndex) { columnIndex += columns[transparentColumnIndex].colspan - 1 } return columnIndex } return this.callBase.apply(this, arguments) }, _renderCore: function(change) { this._detachHoverEvents(); this.callBase(change); var isFixedColumns = this._isFixedColumns; this.element().toggleClass(FIXED_COLUMNS_CLASS, isFixedColumns); if (this.option("hoverStateEnabled") && isFixedColumns) { this._attachHoverEvents() } }, setRowsOpacity: function(columnIndex, value) { this.callBase(columnIndex, value); var $rows = this._getRowElements(this._fixedTableElement); this._setRowsOpacityCore($rows, this.getFixedColumns(), columnIndex, value) }, optionChanged: function(args) { var that = this; that.callBase(args); if ("hoverStateEnabled" === args.name && that._isFixedColumns) { args.value ? this._attachHoverEvents() : this._detachHoverEvents() } }, getCellIndex: function($cell) { var columns, $fixedTable = this._fixedTableElement, cellIndex = 0; if ($fixedTable && $fixedTable.find($cell).length) { columns = this.getFixedColumns(); each(columns, function(index, column) { if (index === $cell[0].cellIndex) { return false } if (column.colspan) { cellIndex += column.colspan; return } cellIndex++ }); return cellIndex } return this.callBase.apply(this, arguments) }, _updateFixedTablePosition: function(scrollTop) { if (this._fixedTableElement && this._tableElement) { var editorFactory = this.getController("editorFactory"), $focusedElement = editorFactory.focus(), dataController = this._dataController, offset = dataController.getContentOffset ? dataController.getContentOffset() : 0; this._fixedTableElement.css("top", scrollTop + offset); if ($focusedElement) { editorFactory.focus($focusedElement) } } }, setScrollerSpacing: function(vWidth, hWidth) { var styles, that = this; var $fixedContent = that.element().children("." + this.addWidgetPrefix(CONTENT_FIXED_CLASS)); if ($fixedContent.length) { styles = that.option("rtlEnabled") ? { marginLeft: vWidth } : { marginRight: vWidth }; styles.marginBottom = hWidth; $fixedContent.css(styles) } }, _handleScroll: function(e) { this._updateFixedTablePosition(-e.scrollOffset.top); this.callBase(e) }, _updateContentPosition: function(isRender) { this.callBase.apply(this, arguments); if (!isRender) { this._updateFixedTablePosition(-this._scrollTop) } }, _afterRowPrepared: function(e) { if (this._isFixedTableRendering) { return } this.callBase(e) } }); var FooterViewFixedColumnsExtender = baseFixedColumns; module.exports = { defaultOptions: function() { return { columnFixing: { enabled: false, texts: { fix: messageLocalization.format("dxDataGrid-columnFixingFix"), unfix: messageLocalization.format("dxDataGrid-columnFixingUnfix"), leftPosition: messageLocalization.format("dxDataGrid-columnFixingLeftPosition"), rightPosition: messageLocalization.format("dxDataGrid-columnFixingRightPosition") } } } }, extenders: { views: { columnHeadersView: ColumnHeadersViewFixedColumnsExtender, rowsView: RowsViewFixedColumnsExtender, footerView: FooterViewFixedColumnsExtender }, controllers: function() { var normalizeColumnIndicesByPoints = function(columns, fixedColumns, pointsByColumns) { var transparentColumnIndex = getTransparentColumnIndex(fixedColumns), correctIndex = columns.length - fixedColumns.length; each(pointsByColumns, function(_, point) { if (point.index > transparentColumnIndex) { point.columnIndex += correctIndex; point.index += correctIndex } }); return pointsByColumns }; return { draggingHeader: { _generatePointsByColumns: function(options) { var pointsByColumns, visibleColumns = options.columns, targetDraggingPanel = options.targetDraggingPanel; if (targetDraggingPanel && "headers" === targetDraggingPanel.getName() && targetDraggingPanel.isFixedColumns()) { if (options.sourceColumn.fixed) { if (!options.rowIndex) { options.columnElements = targetDraggingPanel.getFixedColumnElements(0) } options.columns = targetDraggingPanel.getFixedColumns(options.rowIndex); pointsByColumns = this.callBase(options); normalizeColumnIndicesByPoints(visibleColumns, options.columns, pointsByColumns); return pointsByColumns } } return this.callBase(options) }, _pointCreated: function(point, columns, location, sourceColumn) { var boundingRect, result = this.callBase.apply(this, arguments), $transparentColumn = this._columnHeadersView.getTransparentColumnElement(); if (!result && "headers" === location && $transparentColumn && $transparentColumn.length) { boundingRect = $transparentColumn.get(0).getBoundingClientRect(); if (sourceColumn && sourceColumn.fixed) { return "right" === sourceColumn.fixedPosition ? point.x < boundingRect.right : point.x > boundingRect.left } else { return point.x < boundingRect.left || point.x > boundingRect.right } } return result } }, columnsResizer: { _generatePointsByColumns: function() { var that = this, columnsController = that._columnsController, columns = columnsController && that._columnsController.getVisibleColumns(), fixedColumns = columnsController && that._columnsController.getFixedColumns(), cells = that._columnHeadersView.getFixedColumnElements(), pointsByFixedColumns = []; that.callBase(); if (cells && cells.length > 0) { pointsByFixedColumns = gridCoreUtils.getPointsByColumns(cells, function(point) { return that._pointCreated(point, cells.length, fixedColumns) }); that._pointsByFixedColumns = normalizeColumnIndicesByPoints(columns, fixedColumns, pointsByFixedColumns) } }, _pointCreated: function(point, cellsLength, columns) { var currentColumn, nextColumn, isWidgetResizingMode = "widget" === this.option("columnResizingMode"); if (point.index > 0 && point.index < cellsLength) { currentColumn = columns[point.columnIndex - 1] || {}; nextColumn = columns[point.columnIndex] || {}; if (currentColumn.fixed || nextColumn.fixed) { point.columnIndex -= 1; return !((currentColumn.allowResizing || "transparent" === currentColumn.command) && (isWidgetResizingMode || nextColumn.allowResizing || "transparent" === nextColumn.command)) } } return this.callBase.apply(this, arguments) }, _getTargetPoint: function(pointsByColumns, currentX, deltaX) { var boundingRect, $transparentColumn = this._columnHeadersView.getTransparentColumnElement(); if ($transparentColumn && $transparentColumn.length) { boundingRect = $transparentColumn.get(0).getBoundingClientRect(); if (currentX <= boundingRect.left || currentX >= boundingRect.right) { return this.callBase(this._pointsByFixedColumns, currentX, deltaX) } } return this.callBase(pointsByColumns, currentX, deltaX) } }, keyboardNavigation: { _scrollToElement: function($element) { var focusedView = this.getFocusedView(); this.callBase($element, focusedView && focusedView.getFixedColumnsOffset()) } } } }() } };