@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
656 lines • 110 kB
JavaScript
import { __decorate } from "tslib";
import { Injectable } from '@angular/core';
import { first } from 'rxjs/operators';
import { IgxGridGroupByRowComponent } from './grid/groupby-row.component';
import { FilterMode } from './common/enums';
var MoveDirection;
(function (MoveDirection) {
MoveDirection["LEFT"] = "left";
MoveDirection["RIGHT"] = "right";
})(MoveDirection || (MoveDirection = {}));
/** @hidden */
let IgxGridNavigationService = class IgxGridNavigationService {
get displayContainerWidth() {
return Math.round(this.grid.parentVirtDir.dc.instance._viewContainer.element.nativeElement.offsetWidth);
}
get displayContainerScrollLeft() {
return Math.ceil(this.grid.headerContainer.scrollPosition);
}
get verticalDisplayContainerElement() {
return this.grid.verticalScrollContainer.dc.instance._viewContainer.element.nativeElement;
}
horizontalScroll(rowIndex) {
let rowComp = this.grid.dataRowList.find((row) => row.index === rowIndex) || this.grid.dataRowList.first;
if (!rowComp) {
rowComp = this.grid.summariesRowList.find((row) => row.index === rowIndex);
}
return rowComp.virtDirRow;
}
getColumnUnpinnedIndex(visibleColumnIndex) {
const column = this.grid.unpinnedColumns.find((col) => !col.columnGroup && col.visibleIndex === visibleColumnIndex);
return this.grid.pinnedColumns.length ? this.grid.unpinnedColumns.filter((c) => !c.columnGroup).indexOf(column) :
visibleColumnIndex;
}
isColumnFullyVisible(columnIndex) {
return this.isColumnRightEdgeVisible(columnIndex) && this.isColumnLeftEdgeVisible(columnIndex);
}
isColumnRightEdgeVisible(columnIndex) {
const forOfDir = this.forOfDir();
if (this.isColumnPinned(columnIndex, forOfDir)) {
return true;
}
const index = this.getColumnUnpinnedIndex(columnIndex);
return this.displayContainerWidth >= forOfDir.getColumnScrollLeft(index + 1) - this.displayContainerScrollLeft;
}
isColumnLeftEdgeVisible(columnIndex) {
const forOfDir = this.forOfDir();
if (this.isColumnPinned(columnIndex, forOfDir)) {
return true;
}
const index = this.getColumnUnpinnedIndex(columnIndex);
return this.displayContainerScrollLeft <= forOfDir.getColumnScrollLeft(index);
}
forOfDir() {
let forOfDir;
if (this.grid.dataRowList.length > 0) {
forOfDir = this.grid.dataRowList.first.virtDirRow;
}
else {
forOfDir = this.grid.headerContainer;
}
return forOfDir;
}
isColumnPinned(columnIndex, forOfDir) {
const horizontalScroll = forOfDir.getScroll();
const column = this.grid.columnList.filter(c => !c.columnGroup).find((col) => col.visibleIndex === columnIndex);
return (!horizontalScroll.clientWidth || column.pinned);
}
get gridOrderedColumns() {
return [...this.grid.pinnedColumns, ...this.grid.unpinnedColumns].filter(c => !c.columnGroup);
}
isRowInEditMode(rowIndex) {
return this.grid.rowEditable && (this.grid.rowInEditMode && this.grid.rowInEditMode.index === rowIndex);
}
findNextEditable(direction, visibleColumnIndex) {
// go trough all columns in one cycle instead of
// splice().reverse().find()
const gridColumns = this.gridOrderedColumns;
const start = visibleColumnIndex;
let end = 0;
let step = 0;
let result = -1;
if (direction === MoveDirection.LEFT) {
end = 0;
step = -1;
}
else if (direction === MoveDirection.RIGHT) {
end = gridColumns.length - 1;
step = 1;
}
for (let c = start; (c * step) <= end; c += step) {
const column = gridColumns[c];
if (column.editable) {
result = c;
break;
}
}
return result;
}
getCellElementByVisibleIndex(rowIndex, visibleColumnIndex, isSummary = false) {
const cellSelector = this.getCellSelector(visibleColumnIndex, isSummary);
return this.grid.nativeElement.querySelector(`${cellSelector}[data-rowindex="${rowIndex}"][data-visibleIndex="${visibleColumnIndex}"]`);
}
onKeydownArrowRight(element, selectedNode) {
const rowIndex = selectedNode.row;
const visibleColumnIndex = selectedNode.column;
const isSummary = selectedNode.isSummaryRow;
if (this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex === visibleColumnIndex) {
return;
}
if (this.isColumnRightEdgeVisible(visibleColumnIndex + 1)) { // if next column is fully visible or is pinned
if (element.classList.contains('igx-grid__td--pinned-last') || element.classList.contains('igx-grid-summary--pinned-last')) {
if (this.isColumnLeftEdgeVisible(visibleColumnIndex + 1)) {
element.nextElementSibling.firstElementChild.focus({ preventScroll: true });
}
else {
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
this.grid.parentVirtDir.onChunkLoad
.pipe(first())
.subscribe(() => {
element.nextElementSibling.firstElementChild.focus({ preventScroll: true });
});
this.horizontalScroll(rowIndex).scrollTo(0);
}
}
else {
element.nextElementSibling.focus({ preventScroll: true });
}
}
else {
this.performHorizontalScrollToCell(rowIndex, visibleColumnIndex + 1, isSummary);
}
}
onKeydownArrowLeft(element, selectedNode) {
const rowIndex = selectedNode.row;
const visibleColumnIndex = selectedNode.column;
const isSummary = selectedNode.isSummaryRow;
if (visibleColumnIndex === 0) {
return;
}
const index = this.getColumnUnpinnedIndex(visibleColumnIndex - 1);
if (!element.previousElementSibling && this.grid.pinnedColumns.length && index === -1) {
element.parentNode.previousElementSibling.focus({ preventScroll: true });
}
else if (!this.isColumnLeftEdgeVisible(visibleColumnIndex - 1)) {
this.performHorizontalScrollToCell(rowIndex, visibleColumnIndex - 1, isSummary);
}
else {
element.previousElementSibling.focus({ preventScroll: true });
}
}
movePreviousEditable(rowIndex, currentColumnVisibleIndex) {
let prevEditableColumnIndex = this.findNextEditable(MoveDirection.LEFT, currentColumnVisibleIndex - 1);
if (prevEditableColumnIndex === -1) {
if (this.grid.rowEditTabs.length) {
// TODO: make gridAPI visible for internal use and remove cast to any
this.grid.gridAPI.submit_value();
this.grid.rowEditTabs.last.element.nativeElement.focus();
return;
}
else {
// In case when row edit template is empty select last editable cell
prevEditableColumnIndex = this.grid.lastEditableColumnIndex;
}
}
this.focusEditableTarget(rowIndex, prevEditableColumnIndex);
}
moveNextEditable(rowIndex, currentColumnVisibleIndex) {
let nextEditableColumnIndex = this.findNextEditable(MoveDirection.RIGHT, currentColumnVisibleIndex + 1);
if (nextEditableColumnIndex === -1) {
if (this.grid.rowEditTabs.length) {
// TODO: make gridAPI visible for internal use and remove cast to any
this.grid.gridAPI.submit_value();
this.grid.rowEditTabs.first.element.nativeElement.focus();
return;
}
else {
// In case when row edit template is empty select first editable cell
nextEditableColumnIndex = this.grid.firstEditableColumnIndex;
}
}
this.focusEditableTarget(rowIndex, nextEditableColumnIndex);
}
focusEditableTarget(rowIndex, columnIndex) {
if (this.isColumnFullyVisible(columnIndex)) {
this.getCellElementByVisibleIndex(rowIndex, columnIndex).focus();
}
else {
this.performHorizontalScrollToCell(rowIndex, columnIndex);
}
}
onKeydownHome(rowIndex, isSummary = false) {
const rowList = isSummary ? this.grid.summariesRowList : this.grid.dataRowList;
let rowElement = rowList.find((row) => row.index === rowIndex);
const cellSelector = this.getCellSelector(0, isSummary);
if (!rowElement) {
return;
}
rowElement = rowElement.nativeElement;
let firstCell = rowElement.querySelector(cellSelector);
if (this.grid.pinnedColumns.length || this.displayContainerScrollLeft === 0) {
firstCell.focus({ preventScroll: true });
}
else {
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
this.grid.parentVirtDir.onChunkLoad
.pipe(first())
.subscribe(() => {
firstCell = rowElement.querySelector(cellSelector);
firstCell.focus({ preventScroll: true });
});
this.horizontalScroll(rowIndex).scrollTo(0);
}
}
onKeydownEnd(rowIndex, isSummary = false) {
const index = this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex;
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(index)) {
const allCells = rowElement.querySelectorAll(this.getCellSelector(-1, isSummary));
allCells[allCells.length - 1].focus({ preventScroll: true });
}
else {
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
this.grid.parentVirtDir.onChunkLoad
.pipe(first())
.subscribe(() => {
const allCells = rowElement.querySelectorAll(this.getCellSelector(-1, isSummary));
allCells[allCells.length - 1].focus({ preventScroll: true });
});
this.horizontalScroll(rowIndex).scrollTo(this.getColumnUnpinnedIndex(index));
}
}
navigateTop(visibleColumnIndex) {
const verticalScroll = this.grid.verticalScrollContainer.getScroll();
const cellSelector = this.getCellSelector(visibleColumnIndex);
if (verticalScroll.scrollTop === 0) {
const cells = this.grid.nativeElement.querySelectorAll(`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`);
cells[0].focus();
}
else {
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
this.grid.verticalScrollContainer.scrollTo(0);
this.grid.verticalScrollContainer.onChunkLoad
.pipe(first()).subscribe(() => {
const cells = this.grid.nativeElement.querySelectorAll(`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`);
if (cells.length > 0) {
cells[0].focus();
}
});
}
}
navigateBottom(visibleColumnIndex) {
const verticalScroll = this.grid.verticalScrollContainer.getScroll();
const cellSelector = this.getCellSelector(visibleColumnIndex);
if (verticalScroll.scrollHeight === 0 ||
verticalScroll.scrollTop === verticalScroll.scrollHeight - this.grid.verticalScrollContainer.igxForContainerSize) {
const cells = this.grid.nativeElement.querySelectorAll(`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`);
cells[cells.length - 1].focus();
}
else {
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
this.grid.verticalScrollContainer.scrollTo(this.grid.dataView.length - 1);
this.grid.verticalScrollContainer.onChunkLoad
.pipe(first()).subscribe(() => {
const cells = this.grid.nativeElement.querySelectorAll(`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`);
if (cells.length > 0) {
cells[cells.length - 1].focus({ preventScroll: true });
}
});
}
}
navigateUp(rowElement, selectedNode) {
const currentRowIndex = selectedNode.row;
const visibleColumnIndex = selectedNode.column;
if (currentRowIndex === 0) {
return;
}
const containerTopOffset = parseInt(this.verticalDisplayContainerElement.style.top, 10);
if (!rowElement.previousElementSibling ||
rowElement.previousElementSibling.offsetTop < Math.abs(containerTopOffset)) {
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
this.grid.verticalScrollContainer.scrollTo(currentRowIndex - 1);
this.grid.verticalScrollContainer.onChunkLoad
.pipe(first())
.subscribe(() => {
const tag = rowElement.tagName.toLowerCase();
rowElement = this.getRowByIndex(currentRowIndex, tag);
this.focusPreviousElement(rowElement, visibleColumnIndex);
});
}
else {
this.focusPreviousElement(rowElement, visibleColumnIndex);
}
}
focusPreviousElement(currentRowEl, visibleColumnIndex) {
this.focusElem(currentRowEl.previousElementSibling, visibleColumnIndex);
}
navigateDown(rowElement, selectedNode) {
const currentRowIndex = selectedNode.row;
const visibleColumnIndex = selectedNode.column;
if (currentRowIndex === this.grid.dataView.length - 1 ||
(currentRowIndex === 0 && rowElement.tagName.toLowerCase() === 'igx-grid-summary-row')) {
// check if this is rootSummary row
return;
}
const rowHeight = this.grid.verticalScrollContainer.getSizeAt(currentRowIndex + 1);
const containerHeight = this.grid.calcHeight ? Math.ceil(this.grid.calcHeight) : 0;
const targetEndTopOffset = rowElement.nextElementSibling ?
rowElement.nextElementSibling.offsetTop + rowHeight + parseInt(this.verticalDisplayContainerElement.style.top, 10) :
containerHeight + rowHeight;
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
if (containerHeight && containerHeight < targetEndTopOffset) {
const nextIndex = currentRowIndex + 1;
this.grid.verticalScrollContainer.scrollTo(nextIndex);
this.grid.verticalScrollContainer.onChunkLoad
.pipe(first())
.subscribe(() => {
rowElement = this.getNextRowByIndex(nextIndex);
this.focusElem(rowElement, visibleColumnIndex);
});
}
else {
this.focusNextElement(rowElement, visibleColumnIndex);
}
}
focusElem(rowElement, visibleColumnIndex) {
if (rowElement.tagName.toLowerCase() === 'igx-grid-groupby-row' || rowElement.className === 'igx-grid__tr-container') {
rowElement.focus();
}
else {
const isSummaryRow = rowElement.tagName.toLowerCase() === 'igx-grid-summary-row';
if (this.isColumnFullyVisible(visibleColumnIndex)) {
const cellSelector = this.getCellSelector(visibleColumnIndex, isSummaryRow);
const cell = rowElement.querySelector(`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`);
cell.focus();
return cell;
}
this.performHorizontalScrollToCell(parseInt(rowElement.getAttribute('data-rowindex'), 10), visibleColumnIndex, isSummaryRow);
}
}
focusNextElement(rowElement, visibleColumnIndex) {
return this.focusElem(rowElement.nextElementSibling, visibleColumnIndex);
}
goToFirstCell() {
const verticalScroll = this.grid.verticalScrollContainer.getScroll();
if (verticalScroll.scrollTop === 0) {
this.onKeydownHome(this.grid.dataRowList.first.index);
}
else {
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
this.grid.verticalScrollContainer.scrollTo(0);
this.grid.verticalScrollContainer.onChunkLoad
.pipe(first()).subscribe(() => {
this.onKeydownHome(this.grid.dataRowList.first.index);
});
}
}
goToLastCell() {
const verticalScroll = this.grid.verticalScrollContainer.getScroll();
if (verticalScroll.scrollHeight === 0 ||
verticalScroll.scrollTop === verticalScroll.scrollHeight - this.grid.verticalScrollContainer.igxForContainerSize) {
const rows = this.getAllRows();
const rowIndex = parseInt(rows[rows.length - 1].getAttribute('data-rowIndex'), 10);
this.onKeydownEnd(rowIndex);
}
else {
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
this.grid.verticalScrollContainer.scrollTo(this.grid.dataView.length - 1);
this.grid.verticalScrollContainer.onChunkLoad
.pipe(first()).subscribe(() => {
const rows = this.getAllRows();
if (rows.length > 0) {
const rowIndex = parseInt(rows[rows.length - 1].getAttribute('data-rowIndex'), 10);
this.onKeydownEnd(rowIndex);
}
});
}
}
goToLastBodyElement() {
const verticalScroll = this.grid.verticalScrollContainer.getScroll();
if (verticalScroll.scrollHeight === 0 ||
verticalScroll.scrollTop === verticalScroll.scrollHeight - this.grid.verticalScrollContainer.igxForContainerSize) {
const rowIndex = this.grid.dataView.length - 1;
const row = this.grid.nativeElement.querySelector(`[data-rowindex="${rowIndex}"]`);
const isRowTarget = row.tagName.toLowerCase() === 'igx-grid-groupby-row' ||
this.grid.isDetailRecord(this.grid.dataView[rowIndex]);
if (row && isRowTarget) {
row.focus();
return;
}
const isSummary = (row && row.tagName.toLowerCase() === 'igx-grid-summary-row') ? true : false;
this.onKeydownEnd(rowIndex, isSummary);
}
else {
this.grid.verticalScrollContainer.scrollTo(this.grid.dataView.length - 1);
this.grid.verticalScrollContainer.onChunkLoad
.pipe(first()).subscribe(() => {
const rowIndex = this.grid.dataView.length - 1;
const row = this.grid.nativeElement.querySelector(`[data-rowindex="${rowIndex}"]`);
const isRowTarget = row.tagName.toLowerCase() === 'igx-grid-groupby-row' ||
this.grid.isDetailRecord(this.grid.dataView[rowIndex]);
if (row && isRowTarget) {
row.focus();
return;
}
const isSummary = (row && row.tagName.toLowerCase() === 'igx-grid-summary-row') ? true : false;
this.onKeydownEnd(rowIndex, isSummary);
});
}
}
performTab(currentRowEl, selectedNode) {
const rowIndex = selectedNode.row;
const visibleColumnIndex = selectedNode.column;
const isSummaryRow = selectedNode.isSummaryRow;
const nextIsDetailRow = rowIndex + 1 <= this.grid.dataView.length - 1 ?
this.grid.isDetailRecord(this.grid.dataView[rowIndex + 1]) : false;
const isLastColumn = this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex === visibleColumnIndex;
if (isSummaryRow && rowIndex === 0 &&
this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex === visibleColumnIndex) {
return;
}
if (this.isRowInEditMode(rowIndex)) {
this.moveNextEditable(rowIndex, visibleColumnIndex);
return;
}
if (nextIsDetailRow && isLastColumn) {
this.navigateDown(currentRowEl, { row: rowIndex, column: visibleColumnIndex });
return;
}
if (isLastColumn) {
const rowEl = this.grid.rowList.find(row => row.index === rowIndex + 1) ?
this.grid.rowList.find(row => row.index === rowIndex + 1) :
this.grid.summariesRowList.find(row => row.index === rowIndex + 1);
if (rowIndex === this.grid.dataView.length - 1 && this.grid.rootSummariesEnabled) {
this.onKeydownHome(0, true);
return;
}
if (rowEl) {
this.navigateDown(currentRowEl, { row: rowIndex, column: 0 });
}
}
else {
const cell = this.getCellElementByVisibleIndex(rowIndex, visibleColumnIndex, isSummaryRow);
if (cell) {
this.onKeydownArrowRight(cell, selectedNode);
}
}
}
moveFocusToFilterCell(toStart) {
if (this.grid.filteringService.isFilterRowVisible) {
this.grid.filteringService.focusFilterRowCloseButton();
return;
}
const columns = this.grid.filteringService.unpinnedFilterableColumns;
const targetIndex = toStart ? 0 : columns.length - 1;
const visibleIndex = columns[targetIndex].visibleIndex;
const isVisible = toStart ? this.isColumnLeftEdgeVisible(visibleIndex) : this.isColumnRightEdgeVisible(visibleIndex);
if (isVisible) {
this.grid.filteringService.focusFilterCellChip(columns[targetIndex], false);
}
else {
this.grid.filteringService.scrollToFilterCell(columns[targetIndex], false);
}
}
navigatePrevFilterCell(column, eventArgs) {
const cols = this.grid.filteringService.unpinnedFilterableColumns;
const prevFilterableIndex = cols.indexOf(column) - 1;
const visibleIndex = column.visibleIndex;
if (visibleIndex === 0 || prevFilterableIndex < 0) {
// prev is not filter cell
const firstFiltarableCol = this.getFirstPinnedFilterableColumn();
if (!firstFiltarableCol || column === firstFiltarableCol) {
eventArgs.preventDefault();
}
return;
}
const prevColumn = cols[prevFilterableIndex];
const prevVisibleIndex = prevColumn.visibleIndex;
if (prevFilterableIndex >= 0 && visibleIndex > 0 && !this.isColumnLeftEdgeVisible(prevVisibleIndex) && !column.pinned) {
eventArgs.preventDefault();
this.grid.filteringService.scrollToFilterCell(prevColumn, false);
}
}
navigateFirstCellIfPossible(eventArgs) {
if (this.grid.rowList.length > 0) {
if (this.grid.rowList.filter(row => row instanceof IgxGridGroupByRowComponent).length > 0) {
eventArgs.stopPropagation();
return;
}
this.goToFirstCell();
}
else if (this.grid.rootSummariesEnabled) {
this.onKeydownHome(0, true);
}
eventArgs.preventDefault();
}
navigateNextFilterCell(column, eventArgs) {
const cols = this.grid.filteringService.unpinnedFilterableColumns;
const nextFilterableIndex = cols.indexOf(column) + 1;
if (nextFilterableIndex >= this.grid.filteringService.unpinnedFilterableColumns.length) {
// next is not filter cell
this.navigateFirstCellIfPossible(eventArgs);
return;
}
const nextColumn = cols[nextFilterableIndex];
const nextVisibleIndex = nextColumn.visibleIndex;
if (!column.pinned && !this.isColumnRightEdgeVisible(nextVisibleIndex)) {
eventArgs.preventDefault();
this.grid.filteringService.scrollToFilterCell(nextColumn, true);
}
else if (column === this.getLastPinnedFilterableColumn() && !this.isColumnRightEdgeVisible(nextVisibleIndex)) {
this.grid.filteringService.scrollToFilterCell(nextColumn, false);
eventArgs.stopPropagation();
}
}
getLastPinnedFilterableColumn() {
const pinnedFilterableColums = this.grid.pinnedColumns.filter(col => !(col.columnGroup) && col.filterable);
return pinnedFilterableColums[pinnedFilterableColums.length - 1];
}
getFirstPinnedFilterableColumn() {
return this.grid.pinnedColumns.filter(col => !(col.columnGroup) && col.filterable)[0];
}
performShiftTabKey(currentRowEl, selectedNode) {
const rowIndex = selectedNode.row;
const visibleColumnIndex = selectedNode.column;
const isSummary = selectedNode.isSummaryRow;
if (isSummary && rowIndex === 0 && visibleColumnIndex === 0 && this.grid.rowList.length) {
this.goToLastBodyElement();
return;
}
if (this.isRowInEditMode(rowIndex)) {
this.movePreviousEditable(rowIndex, visibleColumnIndex);
return;
}
const prevIsDetailRow = rowIndex > 0 ? this.grid.isDetailRecord(this.grid.dataView[rowIndex - 1]) : false;
if (visibleColumnIndex === 0 && prevIsDetailRow) {
let target = currentRowEl.previousElementSibling;
const applyFocusFunc = () => {
target = this.getRowByIndex(rowIndex - 1, '');
target.focus({ preventScroll: true });
};
if (target) {
applyFocusFunc();
}
else {
this.performVerticalScrollToCell(rowIndex - 1, visibleColumnIndex, () => {
applyFocusFunc();
});
}
return;
}
if (visibleColumnIndex === 0) {
if (rowIndex === 0 && this.grid.allowFiltering && this.grid.filterMode === FilterMode.quickFilter) {
this.moveFocusToFilterCell();
}
else {
this.navigateUp(currentRowEl, {
row: rowIndex,
column: this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex
});
}
}
else {
const cell = this.getCellElementByVisibleIndex(rowIndex, visibleColumnIndex, isSummary);
if (cell) {
this.onKeydownArrowLeft(cell, selectedNode);
}
}
}
shouldPerformVerticalScroll(targetRowIndex, visibleColumnIndex) {
const containerTopOffset = parseInt(this.verticalDisplayContainerElement.style.top, 10);
const targetRow = this.getRowByIndex(targetRowIndex, '');
const rowHeight = this.grid.verticalScrollContainer.getSizeAt(targetRowIndex);
const containerHeight = this.grid.calcHeight ? Math.ceil(this.grid.calcHeight) : 0;
const targetEndTopOffset = targetRow ? targetRow.offsetTop + rowHeight + containerTopOffset :
containerHeight + rowHeight;
if (!targetRow || targetRow.offsetTop < Math.abs(containerTopOffset)
|| containerHeight && containerHeight < targetEndTopOffset) {
return true;
}
else {
return false;
}
}
performVerticalScrollToCell(rowIndex, visibleColIndex, cb) {
this.grid.verticalScrollContainer.scrollTo(rowIndex);
this.grid.verticalScrollContainer.onChunkLoad
.pipe(first()).subscribe(() => {
cb();
});
}
performHorizontalScrollToCell(rowIndex, visibleColumnIndex, isSummary = false, cb) {
const unpinnedIndex = this.getColumnUnpinnedIndex(visibleColumnIndex);
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
this.grid.parentVirtDir.onChunkLoad
.pipe(first())
.subscribe(() => {
if (cb) {
cb();
}
else {
const cellElement = this.getCellElementByVisibleIndex(rowIndex, visibleColumnIndex, isSummary);
if (cellElement) {
cellElement.focus({ preventScroll: true });
}
}
});
this.horizontalScroll(rowIndex).scrollTo(unpinnedIndex);
}
getFocusableGrid() {
return this.grid;
}
getRowByIndex(index, selector = this.getRowSelector()) {
const gridTag = this.grid.nativeElement.tagName.toLocaleLowerCase();
const row = Array.from(this.grid.tbody.nativeElement.querySelectorAll(`${selector}[data-rowindex="${index}"]`))
.find(x => this.getClosestElemByTag(x, gridTag).getAttribute('id') === this.grid.id);
return row;
}
getNextRowByIndex(nextIndex) {
const gridTag = this.grid.nativeElement.tagName.toLocaleLowerCase();
const row = Array.from(this.grid.tbody.nativeElement.querySelectorAll(`[data-rowindex="${nextIndex}"]`)).find(x => this.getClosestElemByTag(x, gridTag).getAttribute('id') === this.grid.id);
return row;
}
getAllRows() {
const selector = this.getRowSelector();
return this.grid.nativeElement.querySelectorAll(selector);
}
getCellSelector(visibleIndex, isSummary = false) {
if (visibleIndex === 0 && this.grid.hasDetails && !isSummary) {
return 'igx-expandable-grid-cell';
}
return isSummary ? 'igx-grid-summary-cell' : 'igx-grid-cell';
}
getRowSelector() {
return 'igx-grid-row';
}
getClosestElemByTag(sourceElem, targetTag) {
let result = sourceElem;
while (result !== null && result.nodeType === 1) {
if (result.tagName.toLowerCase() === targetTag.toLowerCase()) {
return result;
}
result = result.parentNode;
}
return null;
}
};
IgxGridNavigationService = __decorate([
Injectable()
], IgxGridNavigationService);
export { IgxGridNavigationService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1uYXZpZ2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2dyaWRzL2dyaWQtbmF2aWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUkxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsSUFBSyxhQUdKO0FBSEQsV0FBSyxhQUFhO0lBQ2QsOEJBQWEsQ0FBQTtJQUNiLGdDQUFlLENBQUE7QUFDbkIsQ0FBQyxFQUhJLGFBQWEsS0FBYixhQUFhLFFBR2pCO0FBRUQsY0FBYztBQUVkLElBQWEsd0JBQXdCLEdBQXJDLE1BQWEsd0JBQXdCO0lBR2pDLElBQUkscUJBQXFCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFRCxJQUFJLDBCQUEwQjtRQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELElBQUksK0JBQStCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO0lBQzlGLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxRQUFRO1FBQzVCLElBQUksT0FBTyxHQUFH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