UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

656 lines 110 kB
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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