@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
542 lines • 103 kB
JavaScript
import { __decorate } from "tslib";
import { Injectable } from '@angular/core';
import { first } from 'rxjs/operators';
import { IgxGridNavigationService } from './grid-navigation.service';
export var NavigationDirection;
(function (NavigationDirection) {
NavigationDirection["horizontal"] = "horizontal";
NavigationDirection["vertical"] = "vertical";
})(NavigationDirection || (NavigationDirection = {}));
/** @hidden */
let IgxGridMRLNavigationService = class IgxGridMRLNavigationService extends IgxGridNavigationService {
/**
* @hidden
* @internal
*/
setStartNavigationCell(colStart, rowStart, dir) {
this.startNavigationCell = {
colStart: colStart,
rowStart: rowStart,
direction: dir
};
}
applyNavigationCell(colStart, rowStart, navDirection) {
const oppositeDir = navDirection === NavigationDirection.vertical ?
NavigationDirection.horizontal : NavigationDirection.vertical;
if (this.startNavigationCell && this.startNavigationCell.direction !== navDirection) {
this.startNavigationCell.direction = oppositeDir;
}
else {
this.setStartNavigationCell(colStart, rowStart, oppositeDir);
}
return navDirection === NavigationDirection.vertical ?
this.startNavigationCell.colStart : this.startNavigationCell.rowStart;
}
navigateUp(rowElement, selectedNode) {
this.focusCellUpFromLayout(rowElement, selectedNode);
}
navigateDown(rowElement, selectedNode) {
this.focusCellDownFromLayout(rowElement, selectedNode);
}
isColumnRightEdgeVisible(visibleColumnIndex) {
const column = this.grid.columnList.filter(c => !c.columnGroup).find((col) => col.visibleIndex === visibleColumnIndex);
const forOfDir = this.grid.headerContainer;
const horizontalScroll = forOfDir.getScroll();
if (!horizontalScroll.clientWidth || (column && column.pinned)) {
return true;
}
else if (column) {
if (this.isParentColumnFullyVisible(column)) {
return true;
}
const scrollPos = this.getChildColumnScrollPositions(visibleColumnIndex);
return this.displayContainerWidth >= scrollPos.rightScroll - this.displayContainerScrollLeft &&
this.displayContainerScrollLeft <= scrollPos.leftScroll;
}
return false;
}
isParentColumnFullyVisible(parent) {
const forOfDir = this.grid.dataRowList.length > 0 ? this.grid.dataRowList.first.virtDirRow : this.grid.headerContainer;
const horizontalScroll = forOfDir.getScroll();
if (!horizontalScroll.clientWidth || parent.pinned) {
return true;
}
const index = forOfDir.igxForOf.indexOf(parent);
return this.displayContainerWidth >= forOfDir.getColumnScrollLeft(index + 1) - this.displayContainerScrollLeft &&
this.displayContainerScrollLeft <= forOfDir.getColumnScrollLeft(index);
}
isColumnLeftEdgeVisible(visibleColumnIndex) {
const forOfDir = this.grid.headerContainer;
const horizontalScroll = forOfDir.getScroll();
const column = this.grid.columnList.filter(c => !c.columnGroup).find((col) => col.visibleIndex === visibleColumnIndex);
if (!horizontalScroll.clientWidth || column.pinned) {
return true;
}
if (this.isParentColumnFullyVisible(column)) {
return true;
}
const scrollPos = this.getChildColumnScrollPositions(visibleColumnIndex);
return this.displayContainerScrollLeft <= scrollPos.leftScroll;
}
onKeydownArrowRight(element, selectedNode) {
this.focusNextCellFromLayout(element, selectedNode);
}
onKeydownArrowLeft(element, selectedNode) {
this.focusPrevCellFromLayout(element, selectedNode);
}
get gridOrderedColumns() {
return [...this.grid.pinnedColumns, ...this.grid.unpinnedColumns].filter(c => !c.columnGroup)
.sort((a, b) => a.visibleIndex - b.visibleIndex);
}
performTab(currentRowEl, selectedNode) {
const visibleColumnIndex = selectedNode.layout ? selectedNode.layout.columnVisibleIndex : 0;
const nextElementColumn = this.grid.columns.find(x => !x.columnGroup && x.visibleIndex === visibleColumnIndex + 1);
const rowIndex = selectedNode.row;
const row = this.grid.getRowByIndex(rowIndex);
this._moveFocusToCell(currentRowEl, nextElementColumn, row, selectedNode, 'next');
if (nextElementColumn) {
this.setStartNavigationCell(nextElementColumn.colStart, nextElementColumn.rowStart, null);
}
}
_moveFocusToCell(currentRowEl, nextElementColumn, row, selectedNode, dir) {
if (nextElementColumn && row.cells) {
let nextCell = row.cells.find(currCell => currCell.column === nextElementColumn);
const isVisible = this.isColumnRightEdgeVisible(nextElementColumn.visibleIndex);
if (!nextCell || !isVisible) {
this.grid.nativeElement.focus({ preventScroll: true });
const cb = () => {
nextCell = row.cells.find(currCell => currCell.column === nextElementColumn);
if (this.grid.rowEditable && this.isRowInEditMode(row.index)) {
if (dir === 'next') {
this.moveNextEditable(row.index, selectedNode.layout.columnVisibleIndex);
}
else {
this.movePreviousEditable(row.index, selectedNode.layout.columnVisibleIndex);
}
return;
}
this._focusCell(nextCell.nativeElement);
};
this.performHorizontalScrollToCell(row.index, nextElementColumn.visibleIndex, false, cb);
}
else {
if (this.grid.rowEditable && this.isRowInEditMode(row.index)) {
if (dir === 'next') {
this.moveNextEditable(row.index, selectedNode.layout.columnVisibleIndex);
}
else {
this.movePreviousEditable(row.index, selectedNode.layout.columnVisibleIndex);
}
return;
}
this._focusCell(nextCell.nativeElement);
}
}
else {
// end of layout reached
if (this.isRowInEditMode(row.index)) {
// TODO: make gridAPI visible for internal use and remove cast to any
this.grid.gridAPI.submit_value();
if (dir === 'next') {
this.grid.rowEditTabs.first.element.nativeElement.focus();
}
else {
this.grid.rowEditTabs.last.element.nativeElement.focus();
}
return;
}
if (dir === 'next') {
super.navigateDown(currentRowEl, { row: row.index, column: 0 });
}
else {
let lastVisibleIndex = 0;
this.grid.unpinnedColumns.forEach((col) => {
lastVisibleIndex = Math.max(lastVisibleIndex, col.visibleIndex);
});
super.navigateUp(currentRowEl, { row: row.index, column: lastVisibleIndex });
}
}
}
performShiftTabKey(currentRowEl, selectedNode) {
const visibleColumnIndex = selectedNode.layout ? selectedNode.layout.columnVisibleIndex : 0;
const rowIndex = selectedNode.row;
const row = this.grid.getRowByIndex(rowIndex);
const prevElementColumn = this.grid.columns.find(x => !x.columnGroup && x.visibleIndex === visibleColumnIndex - 1 && !x.hidden);
this._moveFocusToCell(currentRowEl, prevElementColumn, row, selectedNode, 'prev');
if (prevElementColumn) {
this.setStartNavigationCell(prevElementColumn.colStart, prevElementColumn.rowStart, null);
}
}
focusCellUpFromLayout(rowElement, selectedNode) {
const isNonDataRow = rowElement.tagName.toLowerCase() === 'igx-grid-groupby-row' || this._isDetailRecordAt(selectedNode.row);
const currentRowStart = selectedNode.layout ? selectedNode.layout.rowStart : 1;
const currentColStart = this.applyNavigationCell(selectedNode.layout ? selectedNode.layout.colStart : 1, currentRowStart, NavigationDirection.vertical);
const parentIndex = selectedNode.column;
const columnLayout = this.grid.columns.find(x => x.columnLayout && x.visibleIndex === parentIndex);
let movePrev;
// check if element up is from the same layout
let upperElementColumn = columnLayout.children.find(c => (c.rowEnd === currentRowStart || c.rowStart + c.gridRowSpan === currentRowStart) &&
c.colStart <= currentColStart &&
(currentColStart < c.colEnd || currentColStart < c.colStart + c.gridColumnSpan));
if (isNonDataRow || !upperElementColumn) {
// no prev row in current row layout, go to next row last rowstart
const layoutRowEnd = this.grid.multiRowLayoutRowSize + 1;
upperElementColumn = columnLayout.children.find(c => (c.rowEnd === layoutRowEnd || c.rowStart + c.gridRowSpan === layoutRowEnd) &&
c.colStart <= currentColStart &&
(currentColStart < c.colEnd || currentColStart < c.colStart + c.gridColumnSpan));
movePrev = true;
}
const rowIndex = movePrev ? selectedNode.row - 1 : selectedNode.row;
if (rowIndex < 0) {
// end of rows reached.
return;
}
let prevRow;
const cb = () => {
prevRow = this.grid.getRowByIndex(rowIndex);
if (prevRow && prevRow.cells) {
this._focusCell(upperElementColumn.cells.find((c) => c.rowIndex === prevRow.index).nativeElement);
}
else if (prevRow) {
prevRow.nativeElement.focus({ preventScroll: true });
}
else {
const prevElem = this.getRowByIndex(rowIndex, '');
prevElem.focus({ preventScroll: true });
}
};
if (this.shouldPerformVerticalScroll(rowIndex, upperElementColumn.visibleIndex)) {
this.grid.nativeElement.focus({ preventScroll: true });
this.performVerticalScrollToCell(rowIndex, upperElementColumn.visibleIndex, cb);
}
else {
cb();
}
}
focusCellDownFromLayout(rowElement, selectedNode) {
const isNonDataRow = rowElement.tagName.toLowerCase() === 'igx-grid-groupby-row' || this._isDetailRecordAt(selectedNode.row);
const parentIndex = selectedNode.column;
const columnLayout = this.grid.columns.find(x => x.columnLayout && x.visibleIndex === parentIndex);
const currentRowEnd = selectedNode.layout ? selectedNode.layout.rowEnd || selectedNode.layout.rowStart + 1 : 2;
const currentColStart = this.applyNavigationCell(selectedNode.layout ? selectedNode.layout.colStart : 1, selectedNode.layout ? selectedNode.layout.rowStart : 1, NavigationDirection.vertical);
let moveNext;
// check if element down is from the same layout
let nextElementColumn = columnLayout.children.find(c => c.rowStart === currentRowEnd &&
c.colStart <= currentColStart &&
(currentColStart < c.colEnd || currentColStart < c.colStart + c.gridColumnSpan));
if (isNonDataRow || !nextElementColumn) {
// no next row in current row layout, go to next row first rowstart
nextElementColumn = columnLayout.children.find(c => c.rowStart === 1 &&
c.colStart <= currentColStart &&
(currentColStart < c.colEnd || currentColStart < c.colStart + c.gridColumnSpan));
moveNext = true;
}
const rowIndex = moveNext ? selectedNode.row + 1 : selectedNode.row;
if (rowIndex > this.grid.dataView.length - 1) {
// end of rows reached.
return;
}
let nextRow;
const cb = () => {
nextRow = this.grid.getRowByIndex(rowIndex);
if (nextRow && nextRow.cells) {
this._focusCell(nextElementColumn.cells.find((c) => c.rowIndex === nextRow.index).nativeElement);
}
else if (nextRow) {
nextRow.nativeElement.focus({ preventScroll: true });
}
else {
const nextElem = this.getRowByIndex(rowIndex, '');
nextElem.focus({ preventScroll: true });
}
};
if (this.shouldPerformVerticalScroll(rowIndex, nextElementColumn.visibleIndex)) {
this.grid.nativeElement.focus({ preventScroll: true });
this.performVerticalScrollToCell(rowIndex, nextElementColumn.visibleIndex, cb);
}
else {
cb();
}
}
focusNextCellFromLayout(cellElement, selectedNode) {
const parentIndex = selectedNode.column;
let columnLayout = this.grid.columns.find(x => x.columnLayout && x.visibleIndex === parentIndex);
const currentColEnd = selectedNode.layout.colEnd || selectedNode.layout.colStart + 1;
const currentRowStart = this.applyNavigationCell(selectedNode.layout.colStart, selectedNode.layout.rowStart, NavigationDirection.horizontal);
const rowIndex = selectedNode.row;
// check if next element is from the same layout
let nextElementColumn = columnLayout.children.find(c => c.colStart === currentColEnd &&
c.rowStart <= currentRowStart &&
(currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan));
if (!nextElementColumn) {
// no next column in current layout, search for next layout
columnLayout = this.grid.columns.find(c => c.columnLayout && !c.hidden && c.visibleIndex === columnLayout.visibleIndex + 1);
if (!columnLayout) {
// reached the end
return null;
}
// next element is from the next layout
nextElementColumn = columnLayout.children.find(c => c.colStart === 1 &&
c.rowStart <= currentRowStart &&
(currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan));
}
const cb = () => {
const nextElement = nextElementColumn.cells.find((c) => c.rowIndex === rowIndex).nativeElement;
this._focusCell(nextElement);
};
if (!this.isColumnRightEdgeVisible(nextElementColumn.visibleIndex)) {
this.grid.nativeElement.focus({ preventScroll: true });
this.performHorizontalScrollToCell(rowIndex, nextElementColumn.visibleIndex, false, cb);
}
else {
cb();
}
}
focusPrevCellFromLayout(cellElement, selectedNode) {
const parentIndex = selectedNode.column;
let columnLayout = this.grid.columns.find(x => x.columnLayout && x.visibleIndex === parentIndex);
const currentColStart = selectedNode.layout.colStart;
const currentRowStart = this.applyNavigationCell(currentColStart, selectedNode.layout.rowStart, NavigationDirection.horizontal);
const rowIndex = selectedNode.row;
// check previous element is from the same layout
let prevElementColumn = columnLayout.children
.find(c => (c.colEnd === currentColStart || c.colStart + c.gridColumnSpan === currentColStart) &&
c.rowStart <= currentRowStart &&
(currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan));
if (!prevElementColumn) {
// no prev column in current layout, seacrh for prev layout
columnLayout = this.grid.columns.find(c => c.columnLayout && !c.hidden && c.visibleIndex === columnLayout.visibleIndex - 1);
if (!columnLayout) {
// reached the end
return null;
}
const layoutSize = columnLayout.getInitialChildColumnSizes(columnLayout.children).length;
// first element is from the next layout
prevElementColumn = columnLayout.children
.find(c => (c.colEnd === layoutSize + 1 || c.colStart + c.gridColumnSpan === layoutSize + 1) &&
c.rowStart <= currentRowStart &&
(currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan));
}
const cb = () => {
const prevElement = prevElementColumn.cells.find((c) => c.rowIndex === rowIndex).nativeElement;
this._focusCell(prevElement);
};
if (!this.isColumnLeftEdgeVisible(prevElementColumn.visibleIndex)) {
this.grid.nativeElement.focus({ preventScroll: true });
this.performHorizontalScrollToCell(rowIndex, prevElementColumn.visibleIndex, false, cb);
}
else {
cb();
}
}
onKeydownEnd(rowIndex, isSummary = false, cellRowStart) {
const layouts = this.grid.columns.filter(c => c.columnLayout && !c.hidden).sort((a, b) => a.visibleIndex - b.visibleIndex);
const lastLayout = layouts[layouts.length - 1];
const lastLayoutChildren = lastLayout.children;
const layoutSize = lastLayout.getInitialChildColumnSizes(lastLayoutChildren).length;
const currentRowStart = this.applyNavigationCell(this.startNavigationCell ? this.startNavigationCell.colStart : 1, cellRowStart || this.grid.multiRowLayoutRowSize, NavigationDirection.horizontal);
const nextElementColumn = lastLayout.children.find(c => (c.colEnd === layoutSize + 1 || c.colStart + c.gridColumnSpan === layoutSize + 1) &&
c.rowStart <= currentRowStart &&
(currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan));
const indexInLayout = lastLayoutChildren.toArray().indexOf(nextElementColumn);
const rowList = isSummary ? this.grid.summariesRowList : this.grid.dataRowList;
let rowElement = rowList.find((row) => row.index === rowIndex);
if (!rowElement) {
return;
}
rowElement = rowElement.nativeElement;
if (!this.isColumnRightEdgeVisible(nextElementColumn.visibleIndex)) {
this.grid.nativeElement.focus({ preventScroll: true });
const cb = () => {
const allBlocks = rowElement.querySelectorAll(this.getColumnLayoutSelector());
const cell = allBlocks[allBlocks.length - 1].children[indexInLayout];
this._focusCell(cell);
};
this.performHorizontalScrollToCell(rowIndex, nextElementColumn.visibleIndex, false, cb);
return;
}
else {
const allBlocks = rowElement.querySelectorAll(this.getColumnLayoutSelector());
const cell = allBlocks[allBlocks.length - 1].children[indexInLayout];
this._focusCell(cell);
}
}
onKeydownHome(rowIndex, isSummary = false, cellRowStart = 1) {
const firstLayout = this.grid.columns.filter(c => c.columnLayout && !c.hidden)[0];
const lastLayoutChildren = firstLayout.children.toArray();
const currentRowStart = this.applyNavigationCell(this.startNavigationCell ? this.startNavigationCell.colStart : 1, cellRowStart, NavigationDirection.horizontal);
const nextElementColumn = firstLayout.children.find(c => c.colStart === 1 &&
c.rowStart <= currentRowStart &&
(currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan));
const indexInLayout = lastLayoutChildren.indexOf(nextElementColumn);
const rowList = isSummary ? this.grid.summariesRowList : this.grid.dataRowList;
let rowElement = rowList.find((row) => row.index === rowIndex);
if (!rowElement) {
return;
}
rowElement = rowElement.nativeElement;
if (!this.isColumnLeftEdgeVisible(nextElementColumn.visibleIndex)) {
this.grid.nativeElement.focus({ preventScroll: true });
const cb = () => {
const allBlocks = rowElement.querySelectorAll(this.getColumnLayoutSelector());
const cell = allBlocks[0].children[indexInLayout];
this._focusCell(cell);
};
this.performHorizontalScrollToCell(rowIndex, nextElementColumn.visibleIndex, false, cb);
return;
}
else {
const allBlocks = rowElement.querySelectorAll(this.getColumnLayoutSelector());
const cell = allBlocks[0].children[indexInLayout];
this._focusCell(cell);
}
}
getColumnLayoutSelector() {
return '.igx-grid__mrl-block';
}
getChildColumnScrollPositions(visibleColIndex) {
const forOfDir = this.grid.dataRowList.length > 0 ? this.grid.dataRowList.first.virtDirRow : this.grid.headerContainer;
const targetCol = this.getColunmByVisibleIndex(visibleColIndex);
const parent = targetCol.parent;
const parentVIndex = forOfDir.igxForOf.indexOf(parent);
let leftScroll = forOfDir.getColumnScrollLeft(parentVIndex), rightScroll = 0;
// caculate offset from parent based on target column colStart and colEnd and the resolved child column sizes.
const childSizes = parent.getFilledChildColumnSizes(parent.children);
const colStart = targetCol.colStart || 1;
const colEnd = targetCol.colEnd || colStart + 1;
for (let i = 1; i < colStart; i++) {
leftScroll += parseInt(childSizes[i - 1], 10);
}
rightScroll += leftScroll;
for (let j = colStart; j < colEnd; j++) {
rightScroll += parseInt(childSizes[j - 1], 10);
}
return { leftScroll, rightScroll };
}
getColunmByVisibleIndex(visibleColIndex) {
visibleColIndex = visibleColIndex < 0 ? 0 : visibleColIndex;
return this.grid.columnList.find((col) => !col.columnLayout && col.visibleIndex === visibleColIndex);
}
shouldPerformVerticalScroll(rowIndex, visibleColumnIndex) {
if (this._isGroupRecordAt(rowIndex) || this._isDetailRecordAt(rowIndex)) {
return super.shouldPerformVerticalScroll(rowIndex, visibleColumnIndex);
}
if (!super.shouldPerformVerticalScroll(rowIndex, visibleColumnIndex)) {
return false;
}
const targetRow = this.grid.summariesRowList.filter(s => s.index !== 0)
.concat(this.grid.rowList.toArray()).find(r => r.index === rowIndex);
const scrollTop = Math.abs(this.grid.verticalScrollContainer.getScroll().scrollTop);
const containerHeight = this.grid.calcHeight ? Math.ceil(this.grid.calcHeight) : 0;
const scrollPos = this.getVerticalScrollPositions(rowIndex, visibleColumnIndex);
if (!targetRow || targetRow.nativeElement.offsetTop + scrollPos.topOffset < Math.abs(this.verticalDCTopOffset)
|| containerHeight && containerHeight < scrollPos.rowBottom - scrollTop) {
return true;
}
else {
return false;
}
}
get verticalDCTopOffset() {
return parseInt(this.grid.verticalScrollContainer.dc.instance._viewContainer.element.nativeElement.style.top, 10);
}
_isGroupRecordAt(rowIndex) {
const record = this.grid.dataView[rowIndex];
return record.records && record.records.length;
}
_isDetailRecordAt(rowIndex) {
const record = this.grid.dataView[rowIndex];
return this.grid.isDetailRecord(record);
}
performVerticalScrollToCell(rowIndex, visibleColumnIndex, cb) {
if (this._isGroupRecordAt(rowIndex) || this._isDetailRecordAt(rowIndex)) {
return super.performVerticalScrollToCell(rowIndex, visibleColumnIndex, cb);
}
const containerHeight = this.grid.calcHeight ? Math.ceil(this.grid.calcHeight) : 0;
const scrollTop = Math.abs(this.grid.verticalScrollContainer.getScroll().scrollTop);
const scrollPos = this.getVerticalScrollPositions(rowIndex, visibleColumnIndex);
const targetRow = this.grid.summariesRowList.filter(s => s.index !== 0)
.concat(this.grid.rowList.toArray()).find(r => r.index === rowIndex);
const isPrevious = (scrollTop > scrollPos.rowTop) && (!targetRow ||
targetRow.nativeElement.offsetTop + scrollPos.topOffset < Math.abs(this.verticalDCTopOffset));
const scrollAmount = isPrevious ? scrollPos.rowTop : Math.abs(scrollTop + containerHeight - scrollPos.rowBottom);
this.grid.verticalScrollContainer.onChunkLoad
.pipe(first()).subscribe(() => {
cb();
});
if (isPrevious) {
this.grid.verticalScrollContainer.scrollPosition = scrollAmount;
}
else {
this.grid.verticalScrollContainer.addScrollTop(scrollAmount);
}
}
getVerticalScrollPositions(rowIndex, visibleColIndex) {
const targetCol = this.getColunmByVisibleIndex(visibleColIndex);
const topOffset = (targetCol.rowStart - 1) * this.grid.defaultRowHeight;
const rowTop = this.grid.verticalScrollContainer.sizesCache[rowIndex] + topOffset;
const rowBottom = rowTop + (this.grid.defaultRowHeight * targetCol.gridRowSpan);
return { rowTop, rowBottom, topOffset };
}
performHorizontalScrollToCell(rowIndex, visibleColumnIndex, isSummary = false, cb) {
const scrollPos = this.getChildColumnScrollPositions(visibleColumnIndex);
const hScroll = this.horizontalScroll(rowIndex);
this.grid.parentVirtDir.onChunkLoad
.pipe(first())
.subscribe(() => {
if (cb) {
cb();
}
else {
this._focusCell(this.getCellElementByVisibleIndex(rowIndex, visibleColumnIndex, isSummary));
}
});
const isPrevItem = hScroll.getScroll().scrollLeft > scrollPos.leftScroll;
const containerSize = parseInt(hScroll.igxForContainerSize, 10);
const nextScroll = isPrevItem ? scrollPos.leftScroll : scrollPos.rightScroll - containerSize;
hScroll.scrollPosition = nextScroll;
}
_focusCell(cellElem) {
// in case of variable row heights in mrl grid make sure cell is really in view after it has been rendered.
const gridBoundingClientRect = this.grid.tbody.nativeElement.getBoundingClientRect();
const diffTop = cellElem.getBoundingClientRect().top - gridBoundingClientRect.top;
const diffBottom = cellElem.getBoundingClientRect().bottom - gridBoundingClientRect.bottom;
if (diffTop < 0) {
// cell is above grid top - not visible
this.grid.nativeElement.focus({ preventScroll: true });
this.grid.verticalScrollContainer.onChunkLoad
.pipe(first())
.subscribe(() => {
cellElem.focus({ preventScroll: true });
});
this.grid.verticalScrollContainer.addScrollTop(diffTop);
}
else if (diffBottom > 0) {
// cell is below grid bottom - not visible
this.grid.nativeElement.focus({ preventScroll: true });
this.grid.verticalScrollContainer.onChunkLoad
.pipe(first())
.subscribe(() => {
cellElem.focus({ preventScroll: true });
});
this.grid.verticalScrollContainer.addScrollTop(diffBottom);
}
else {
// cell is visible
cellElem.focus({ preventScroll: true });
}
}
goToFirstCell() {
this.startNavigationCell = null;
super.goToFirstCell();
}
goToLastCell() {
this.startNavigationCell = null;
super.goToLastCell();
}
};
IgxGridMRLNavigationService = __decorate([
Injectable()
], IgxGridMRLNavigationService);
export { IgxGridMRLNavigationService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1tcmwtbmF2aWdhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9ncmlkLW1ybC1uYXZpZ2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBVXJFLE1BQU0sQ0FBTixJQUFZLG1CQUdYO0FBSEQsV0FBWSxtQkFBbUI7SUFDM0IsZ0RBQXlCLENBQUE7SUFDekIsNENBQXFCLENBQUE7QUFDekIsQ0FBQyxFQUhXLG1CQUFtQixLQUFuQixtQkFBbUIsUUFHOUI7QUFHRCxjQUFjO0FBRWQsSUFBYSwyQkFBMkIsR0FBeEMsTUFBYSwyQkFBNEIsU0FBUSx3QkFBd0I7SUFNckU7OztPQUdHO0lBQ0ksc0JBQXNCLENBQUMsUUFBZ0IsRUFBRSxRQUFnQixFQUFFLEdBQXdCO1FBQ3RGLElBQUksQ0FBQyxtQkFBbUIsR0FBRztZQUN2QixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixTQUFTLEVBQUUsR0FBRztTQUNqQixDQUFDO0lBQ04sQ0FBQztJQUVPLG1CQUFtQixDQUFDLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRSxZQUFpQztRQUM3RixNQUFNLFdBQVcsR0FBRyxZQUFZLEtBQUssbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0QsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7UUFDbEUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsS0FBSyxZQUFZLEVBQUU7WUFDakYsSUFBSSxDQUFD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