UNPKG

igniteui-angular

Version:

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

887 lines • 109 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; import { FilterMode } from './grid-base.component'; import { first } from 'rxjs/operators'; import { IgxGridGroupByRowComponent } from './grid/groupby-row.component'; /** @enum {string} */ const MoveDirection = { LEFT: 'left', RIGHT: 'right', }; /** * @hidden */ export class IgxGridNavigationService { /** * @return {?} */ get displayContainerWidth() { return parseInt(this.grid.parentVirtDir.dc.instance._viewContainer.element.nativeElement.offsetWidth, 10); } /** * @return {?} */ get displayContainerScrollLeft() { return parseInt(this.grid.parentVirtDir.getHorizontalScroll().scrollLeft, 10); } /** * @return {?} */ get verticalDisplayContainerElement() { return this.grid.verticalScrollContainer.dc.instance._viewContainer.element.nativeElement; } /** * @param {?} rowIndex * @return {?} */ horizontalScroll(rowIndex) { /** @type {?} */ let rowComp = this.grid.dataRowList.find((row) => row.index === rowIndex) ? 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; } /** * @param {?} visibleColumnIndex * @return {?} */ getColumnUnpinnedIndex(visibleColumnIndex) { /** @type {?} */ 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; } /** * @param {?} visibleColumnIndex * @return {?} */ isColumnFullyVisible(visibleColumnIndex) { /** @type {?} */ let forOfDir; if (this.grid.dataRowList.length > 0) { forOfDir = this.grid.dataRowList.first.virtDirRow; } else { forOfDir = this.grid.headerContainer; } /** @type {?} */ const horizontalScroll = forOfDir.getHorizontalScroll(); if (!horizontalScroll.clientWidth || this.grid.columnList.filter(c => !c.columnGroup).find((column) => column.visibleIndex === visibleColumnIndex).pinned) { return true; } /** @type {?} */ const index = this.getColumnUnpinnedIndex(visibleColumnIndex); return this.displayContainerWidth >= forOfDir.getColumnScrollLeft(index + 1) - this.displayContainerScrollLeft; } /** * @param {?} visibleColumnIndex * @return {?} */ isColumnLeftFullyVisible(visibleColumnIndex) { /** @type {?} */ let forOfDir; if (this.grid.dataRowList.length > 0) { forOfDir = this.grid.dataRowList.first.virtDirRow; } else { forOfDir = this.grid.headerContainer; } /** @type {?} */ const horizontalScroll = forOfDir.getHorizontalScroll(); if (!horizontalScroll.clientWidth || this.grid.columnList.filter(c => !c.columnGroup).find((column) => column.visibleIndex === visibleColumnIndex).pinned) { return true; } /** @type {?} */ const index = this.getColumnUnpinnedIndex(visibleColumnIndex); return this.displayContainerScrollLeft <= forOfDir.getColumnScrollLeft(index); } /** * @return {?} */ get gridOrderedColumns() { return [...this.grid.pinnedColumns, ...this.grid.unpinnedColumns].filter(c => !c.columnGroup); } /** * @param {?} rowIndex * @return {?} */ isRowInEditMode(rowIndex) { return this.grid.rowEditable && (this.grid.rowInEditMode && this.grid.rowInEditMode.index === rowIndex); } /** * @param {?} visibleColumnIndex * @return {?} */ isColumnEditable(visibleColumnIndex) { /** @type {?} */ const column = this.gridOrderedColumns.find(c => c.visibleIndex === visibleColumnIndex); return column ? column.editable : false; } /** * @param {?} direction * @param {?} visibleColumnIndex * @return {?} */ findNextEditable(direction, visibleColumnIndex) { /** @type {?} */ const gridColumns = this.gridOrderedColumns; if (direction === MoveDirection.LEFT) { return gridColumns.splice(0, visibleColumnIndex + 1).reverse().findIndex(e => e.editable); } else if (direction === MoveDirection.RIGHT) { return gridColumns.splice(visibleColumnIndex, gridColumns.length - 1).findIndex(e => e.editable); } } /** * @param {?} rowIndex * @param {?} visibleColumnIndex * @param {?=} isSummary * @return {?} */ getCellElementByVisibleIndex(rowIndex, visibleColumnIndex, isSummary = false) { /** @type {?} */ const cellSelector = this.getCellSelector(visibleColumnIndex, isSummary); return this.grid.nativeElement.querySelector(`${cellSelector}[data-rowindex="${rowIndex}"][data-visibleIndex="${visibleColumnIndex}"]`); } /** * @param {?} element * @param {?} rowIndex * @param {?} visibleColumnIndex * @param {?=} isSummary * @return {?} */ onKeydownArrowRight(element, rowIndex, visibleColumnIndex, isSummary = false) { if (this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex === visibleColumnIndex) { return; } if (this.isColumnFullyVisible(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.isColumnLeftFullyVisible(visibleColumnIndex + 1)) { element.nextElementSibling.firstElementChild.focus({ preventScroll: true }); } else { this.grid.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); } } /** * @param {?} element * @param {?} rowIndex * @param {?} visibleColumnIndex * @param {?=} isSummary * @return {?} */ onKeydownArrowLeft(element, rowIndex, visibleColumnIndex, isSummary = false) { if (visibleColumnIndex === 0) { return; } /** @type {?} */ const index = this.getColumnUnpinnedIndex(visibleColumnIndex - 1); if (!element.previousElementSibling && this.grid.pinnedColumns.length && index === -1) { element.parentNode.previousElementSibling.focus({ preventScroll: true }); } else if (!this.isColumnLeftFullyVisible(visibleColumnIndex - 1)) { this.performHorizontalScrollToCell(rowIndex, visibleColumnIndex - 1, isSummary); } else { element.previousElementSibling.focus({ preventScroll: true }); } } /** * @param {?} rowIndex * @param {?} visibleColumnIndex * @return {?} */ movePreviousEditable(rowIndex, visibleColumnIndex) { /** @type {?} */ const addedIndex = this.isColumnEditable(visibleColumnIndex - 1) ? 0 : this.findNextEditable(MoveDirection.LEFT, visibleColumnIndex - 1); if (addedIndex === -1) { this.grid.rowEditTabs.last.element.nativeElement.focus(); return; } /** @type {?} */ const editableIndex = visibleColumnIndex - 1 - addedIndex; if (this.getColumnUnpinnedIndex(editableIndex) === -1 && this.grid.pinnedColumns.length) { // if target is NOT pinned and there are pinned columns // since addedIndex !== -1, there will always be a target this.getCellElementByVisibleIndex(rowIndex, editableIndex).focus(); } else if (!this.isColumnLeftFullyVisible(editableIndex)) { // if not fully visible, perform scroll this.performHorizontalScrollToCell(rowIndex, editableIndex); } else { this.getCellElementByVisibleIndex(rowIndex, editableIndex).focus(); // if fully visible, just focus } } /** * @param {?} element * @param {?} rowIndex * @param {?} visibleColumnIndex * @return {?} */ moveNextEditable(element, rowIndex, visibleColumnIndex) { /** @type {?} */ let addedIndex = 0; addedIndex = this.isColumnEditable(visibleColumnIndex + 1) ? 0 : this.findNextEditable(MoveDirection.RIGHT, visibleColumnIndex + 1); if (addedIndex === -1 && this.grid.rowEditTabs) { // no previous edit column -> go to RE buttons this.grid.rowEditTabs.first.element.nativeElement.focus(); return; } /** @type {?} */ const editableIndex = visibleColumnIndex + 1 + addedIndex; if (this.isColumnFullyVisible(editableIndex)) { // If column is fully visible if (element.classList.contains('igx-grid__td--pinned-last')) { // If this is pinned if (this.isColumnLeftFullyVisible(editableIndex)) { // If next column is fully visible LEFT this.getCellElementByVisibleIndex(rowIndex, editableIndex).focus(); // focus } else { // if NOT fully visible, perform scroll this.performHorizontalScrollToCell(rowIndex, editableIndex); } } else { // cell is next cell this.getCellElementByVisibleIndex(rowIndex, editableIndex).focus(); } } else { this.performHorizontalScrollToCell(rowIndex, editableIndex); } } /** * @param {?} rowIndex * @param {?=} isSummary * @return {?} */ onKeydownHome(rowIndex, isSummary = false) { /** @type {?} */ const rowList = isSummary ? this.grid.summariesRowList : this.grid.dataRowList; /** @type {?} */ let rowElement = rowList.find((row) => row.index === rowIndex); /** @type {?} */ const cellSelector = this.getCellSelector(0, isSummary); if (!rowElement) { return; } rowElement = rowElement.nativeElement; /** @type {?} */ let firstCell = rowElement.querySelector(cellSelector); if (this.grid.pinnedColumns.length || this.displayContainerScrollLeft === 0) { firstCell.focus({ preventScroll: true }); } else { this.grid.nativeElement.focus({ preventScroll: true }); this.grid.parentVirtDir.onChunkLoad .pipe(first()) .subscribe(() => { firstCell = rowElement.querySelector(cellSelector); firstCell.focus({ preventScroll: true }); }); this.horizontalScroll(rowIndex).scrollTo(0); } } /** * @param {?} rowIndex * @param {?=} isSummary * @return {?} */ onKeydownEnd(rowIndex, isSummary = false) { /** @type {?} */ const index = this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex; /** @type {?} */ const rowList = isSummary ? this.grid.summariesRowList : this.grid.dataRowList; /** @type {?} */ let rowElement = rowList.find((row) => row.index === rowIndex); if (!rowElement) { return; } rowElement = rowElement.nativeElement; if (this.isColumnFullyVisible(index)) { /** @type {?} */ const allCells = rowElement.querySelectorAll(this.getCellSelector(-1, isSummary)); allCells[allCells.length - 1].focus({ preventScroll: true }); } else { this.grid.nativeElement.focus({ preventScroll: true }); this.grid.parentVirtDir.onChunkLoad .pipe(first()) .subscribe(() => { /** @type {?} */ const allCells = rowElement.querySelectorAll(this.getCellSelector(-1, isSummary)); allCells[allCells.length - 1].focus({ preventScroll: true }); }); this.horizontalScroll(rowIndex).scrollTo(this.getColumnUnpinnedIndex(index)); } } /** * @param {?} visibleColumnIndex * @return {?} */ navigateTop(visibleColumnIndex) { /** @type {?} */ const verticalScroll = this.grid.verticalScrollContainer.getVerticalScroll(); /** @type {?} */ const cellSelector = this.getCellSelector(visibleColumnIndex); if (verticalScroll.scrollTop === 0) { /** @type {?} */ const cells = this.grid.nativeElement.querySelectorAll(`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`); cells[0].focus(); } else { this.grid.nativeElement.focus({ preventScroll: true }); this.grid.verticalScrollContainer.scrollTo(0); this.grid.verticalScrollContainer.onChunkLoad .pipe(first()).subscribe(() => { /** @type {?} */ const cells = this.grid.nativeElement.querySelectorAll(`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`); if (cells.length > 0) { cells[0].focus(); } }); } } /** * @param {?} visibleColumnIndex * @return {?} */ navigateBottom(visibleColumnIndex) { /** @type {?} */ const verticalScroll = this.grid.verticalScrollContainer.getVerticalScroll(); /** @type {?} */ const cellSelector = this.getCellSelector(visibleColumnIndex); if (verticalScroll.scrollHeight === 0 || verticalScroll.scrollTop === verticalScroll.scrollHeight - this.grid.verticalScrollContainer.igxForContainerSize) { /** @type {?} */ const cells = this.grid.nativeElement.querySelectorAll(`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`); cells[cells.length - 1].focus(); } else { this.grid.nativeElement.focus({ preventScroll: true }); this.grid.verticalScrollContainer.scrollTo(this.grid.verticalScrollContainer.igxForOf.length - 1); this.grid.verticalScrollContainer.onChunkLoad .pipe(first()).subscribe(() => { /** @type {?} */ const cells = this.grid.nativeElement.querySelectorAll(`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`); if (cells.length > 0) { cells[cells.length - 1].focus(); } }); } } /** * @param {?} rowElement * @param {?} currentRowIndex * @param {?} visibleColumnIndex * @return {?} */ navigateUp(rowElement, currentRowIndex, visibleColumnIndex) { if (currentRowIndex === 0) { return; } /** @type {?} */ const containerTopOffset = parseInt(this.verticalDisplayContainerElement.style.top, 10); if (!rowElement.previousElementSibling || rowElement.previousElementSibling.offsetTop < Math.abs(containerTopOffset)) { this.grid.nativeElement.focus({ preventScroll: true }); this.grid.verticalScrollContainer.scrollTo(currentRowIndex - 1); this.grid.verticalScrollContainer.onChunkLoad .pipe(first()) .subscribe(() => { /** @type {?} */ const tag = rowElement.tagName.toLowerCase(); /** @type {?} */ const rowSelector = this.getRowSelector(); if (tag === rowSelector || tag === 'igx-grid-summary-row') { rowElement = this.getRowByIndex(currentRowIndex, tag); } else { rowElement = this.grid.nativeElement.querySelector(`igx-grid-groupby-row[data-rowindex="${currentRowIndex}"]`); } this.focusPreviousElement(rowElement, visibleColumnIndex); }); } else { this.focusPreviousElement(rowElement, visibleColumnIndex); } } /** * @protected * @param {?} currentRowEl * @param {?} visibleColumnIndex * @return {?} */ focusPreviousElement(currentRowEl, visibleColumnIndex) { this.focusElem(currentRowEl.previousElementSibling, visibleColumnIndex); } /** * @param {?} rowElement * @param {?} currentRowIndex * @param {?} visibleColumnIndex * @return {?} */ navigateDown(rowElement, currentRowIndex, visibleColumnIndex) { if (currentRowIndex === this.grid.verticalScrollContainer.igxForOf.length - 1 || (currentRowIndex === 0 && rowElement.tagName.toLowerCase() === 'igx-grid-summary-row')) { // check if this is rootSummary row return; } /** @type {?} */ const rowHeight = this.grid.verticalScrollContainer.getSizeAt(currentRowIndex + 1); /** @type {?} */ const containerHeight = this.grid.calcHeight ? Math.ceil(this.grid.calcHeight) : 0; /** @type {?} */ const targetEndTopOffset = rowElement.nextElementSibling ? rowElement.nextElementSibling.offsetTop + rowHeight + parseInt(this.verticalDisplayContainerElement.style.top, 10) : containerHeight + rowHeight; this.grid.nativeElement.focus({ preventScroll: true }); if (containerHeight && containerHeight < targetEndTopOffset) { /** @type {?} */ 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); } } /** * @protected * @param {?} rowElement * @param {?} visibleColumnIndex * @return {?} */ focusElem(rowElement, visibleColumnIndex) { if (rowElement.tagName.toLowerCase() === 'igx-grid-groupby-row') { rowElement.focus(); } else { /** @type {?} */ const isSummaryRow = rowElement.tagName.toLowerCase() === 'igx-grid-summary-row'; if (this.isColumnFullyVisible(visibleColumnIndex) && this.isColumnLeftFullyVisible(visibleColumnIndex)) { /** @type {?} */ const cellSelector = this.getCellSelector(visibleColumnIndex, isSummaryRow); /** @type {?} */ const cell = rowElement.querySelector(`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`); if (cell) { cell.focus(); } return cell; } this.grid.nativeElement.focus({ preventScroll: true }); this.performHorizontalScrollToCell(parseInt(rowElement.getAttribute('data-rowindex'), 10), visibleColumnIndex, isSummaryRow); } } /** * @protected * @param {?} rowElement * @param {?} visibleColumnIndex * @return {?} */ focusNextElement(rowElement, visibleColumnIndex) { return this.focusElem(rowElement.nextElementSibling, visibleColumnIndex); } /** * @return {?} */ goToFirstCell() { /** @type {?} */ const verticalScroll = this.grid.verticalScrollContainer.getVerticalScroll(); /** @type {?} */ const horizontalScroll = this.grid.dataRowList.first.virtDirRow.getHorizontalScroll(); if (verticalScroll.scrollTop === 0) { this.onKeydownHome(this.grid.dataRowList.first.index); } else { if (!horizontalScroll.clientWidth || parseInt(horizontalScroll.scrollLeft, 10) <= 1 || this.grid.pinnedColumns.length) { this.navigateTop(0); } else { this.grid.nativeElement.focus({ preventScroll: true }); this.horizontalScroll(this.grid.dataRowList.first.index).scrollTo(0); this.grid.parentVirtDir.onChunkLoad .pipe(first()) .subscribe(() => { this.navigateTop(0); }); } } } /** * @return {?} */ goToLastCell() { /** @type {?} */ const verticalScroll = this.grid.verticalScrollContainer.getVerticalScroll(); if (verticalScroll.scrollHeight === 0 || verticalScroll.scrollTop === verticalScroll.scrollHeight - this.grid.verticalScrollContainer.igxForContainerSize) { /** @type {?} */ const rows = this.getAllRows(); /** @type {?} */ const rowIndex = parseInt(rows[rows.length - 1].getAttribute('data-rowIndex'), 10); this.onKeydownEnd(rowIndex); } else { this.grid.nativeElement.focus({ preventScroll: true }); this.grid.verticalScrollContainer.scrollTo(this.grid.verticalScrollContainer.igxForOf.length - 1); this.grid.verticalScrollContainer.onChunkLoad .pipe(first()).subscribe(() => { /** @type {?} */ const rows = this.getAllRows(); if (rows.length > 0) { /** @type {?} */ const rowIndex = parseInt(rows[rows.length - 1].getAttribute('data-rowIndex'), 10); this.onKeydownEnd(rowIndex); } }); } } /** * @return {?} */ goToLastBodyElement() { /** @type {?} */ const verticalScroll = this.grid.verticalScrollContainer.getVerticalScroll(); if (verticalScroll.scrollHeight === 0 || verticalScroll.scrollTop === verticalScroll.scrollHeight - this.grid.verticalScrollContainer.igxForContainerSize) { /** @type {?} */ const rowIndex = this.grid.verticalScrollContainer.igxForOf.length - 1; /** @type {?} */ const row = this.grid.nativeElement.querySelector(`[data-rowindex="${rowIndex}"]`); if (row && row.tagName.toLowerCase() === 'igx-grid-groupby-row') { row.focus(); return; } /** @type {?} */ const isSummary = (row && row.tagName.toLowerCase() === 'igx-grid-summary-row') ? true : false; this.onKeydownEnd(rowIndex, isSummary); } else { this.grid.verticalScrollContainer.scrollTo(this.grid.verticalScrollContainer.igxForOf.length - 1); this.grid.verticalScrollContainer.onChunkLoad .pipe(first()).subscribe(() => { /** @type {?} */ const rowIndex = this.grid.verticalScrollContainer.igxForOf.length - 1; /** @type {?} */ const row = this.grid.nativeElement.querySelector(`[data-rowindex="${rowIndex}"]`); if (row && row.tagName.toLowerCase() === 'igx-grid-groupby-row') { row.focus(); return; } /** @type {?} */ const isSummary = (row && row.tagName.toLowerCase() === 'igx-grid-summary-row') ? true : false; this.onKeydownEnd(rowIndex, isSummary); }); } } /** * @param {?} currentRowEl * @param {?} rowIndex * @param {?} visibleColumnIndex * @param {?=} isSummaryRow * @return {?} */ performTab(currentRowEl, rowIndex, visibleColumnIndex, isSummaryRow = false) { if (isSummaryRow && rowIndex === 0 && this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex === visibleColumnIndex) { return; } if (this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex === visibleColumnIndex) { if (this.isRowInEditMode(rowIndex)) { this.grid.rowEditTabs.first.element.nativeElement.focus(); return; } /** @type {?} */ 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.verticalScrollContainer.igxForOf.length - 1 && this.grid.rootSummariesEnabled) { this.onKeydownHome(0, true); return; } if (rowEl) { this.navigateDown(currentRowEl, rowIndex, 0); } } else { /** @type {?} */ const cell = this.getCellElementByVisibleIndex(rowIndex, visibleColumnIndex, isSummaryRow); if (cell) { if (this.grid.rowEditable && this.isRowInEditMode(rowIndex)) { this.moveNextEditable(cell, rowIndex, visibleColumnIndex); return; } this.onKeydownArrowRight(cell, rowIndex, visibleColumnIndex, isSummaryRow); } } } /** * @param {?=} toStart * @return {?} */ moveFocusToFilterCell(toStart) { if (this.grid.filteringService.isFilterRowVisible) { this.grid.filteringService.focusFilterRowCloseButton(); return; } /** @type {?} */ const columns = this.grid.filteringService.unpinnedFilterableColumns; /** @type {?} */ const targetIndex = toStart ? 0 : columns.length - 1; /** @type {?} */ const visibleIndex = columns[targetIndex].visibleIndex; /** @type {?} */ const isVisible = toStart ? this.isColumnLeftFullyVisible(visibleIndex) : this.isColumnFullyVisible(visibleIndex); if (isVisible) { this.grid.filteringService.focusFilterCellChip(columns[targetIndex], false); } else { this.grid.filteringService.scrollToFilterCell(columns[targetIndex], false); } } /** * @param {?} column * @param {?} eventArgs * @return {?} */ navigatePrevFilterCell(column, eventArgs) { /** @type {?} */ const cols = this.grid.filteringService.unpinnedFilterableColumns; /** @type {?} */ const prevFilterableIndex = cols.indexOf(column) - 1; /** @type {?} */ const visibleIndex = column.visibleIndex; if (visibleIndex === 0 || prevFilterableIndex < 0) { // prev is not filter cell /** @type {?} */ const firstFiltarableCol = this.getFirstPinnedFilterableColumn(); if (!firstFiltarableCol || column === firstFiltarableCol) { eventArgs.preventDefault(); } return; } /** @type {?} */ const prevColumn = cols[prevFilterableIndex]; /** @type {?} */ const prevVisibleIndex = prevColumn.visibleIndex; if (prevFilterableIndex >= 0 && visibleIndex > 0 && !this.isColumnLeftFullyVisible(prevVisibleIndex) && !column.pinned) { eventArgs.preventDefault(); this.grid.filteringService.scrollToFilterCell(prevColumn, false); } } /** * @param {?} eventArgs * @return {?} */ 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(); } /** * @param {?} column * @param {?} eventArgs * @return {?} */ navigateNextFilterCell(column, eventArgs) { /** @type {?} */ const cols = this.grid.filteringService.unpinnedFilterableColumns; /** @type {?} */ const nextFilterableIndex = cols.indexOf(column) + 1; if (nextFilterableIndex >= this.grid.filteringService.unpinnedFilterableColumns.length) { // next is not filter cell this.navigateFirstCellIfPossible(eventArgs); return; } /** @type {?} */ const nextColumn = cols[nextFilterableIndex]; /** @type {?} */ const nextVisibleIndex = nextColumn.visibleIndex; if (!column.pinned && !this.isColumnFullyVisible(nextVisibleIndex)) { eventArgs.preventDefault(); this.grid.filteringService.scrollToFilterCell(nextColumn, true); } else if (column === this.getLastPinnedFilterableColumn() && !this.isColumnFullyVisible(nextVisibleIndex)) { this.grid.filteringService.scrollToFilterCell(nextColumn, false); eventArgs.stopPropagation(); } } /** * @private * @return {?} */ getLastPinnedFilterableColumn() { /** @type {?} */ const pinnedFilterableColums = this.grid.pinnedColumns.filter(col => !(col.columnGroup) && col.filterable); return pinnedFilterableColums[pinnedFilterableColums.length - 1]; } /** * @private * @return {?} */ getFirstPinnedFilterableColumn() { return this.grid.pinnedColumns.filter(col => !(col.columnGroup) && col.filterable)[0]; } /** * @param {?} currentRowEl * @param {?} rowIndex * @param {?} visibleColumnIndex * @param {?=} isSummary * @return {?} */ performShiftTabKey(currentRowEl, rowIndex, visibleColumnIndex, isSummary = false) { if (isSummary && rowIndex === 0 && visibleColumnIndex === 0 && this.grid.rowList.length) { this.goToLastBodyElement(); return; } if (visibleColumnIndex === 0) { if (this.isRowInEditMode(rowIndex)) { this.grid.rowEditTabs.last.element.nativeElement.focus(); return; } if (rowIndex === 0 && this.grid.allowFiltering && this.grid.filterMode === FilterMode.quickFilter) { this.moveFocusToFilterCell(); } else { this.navigateUp(currentRowEl, rowIndex, this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex); } } else { /** @type {?} */ const cell = this.getCellElementByVisibleIndex(rowIndex, visibleColumnIndex, isSummary); if (cell) { if (this.grid.rowEditable && this.isRowInEditMode(rowIndex)) { this.movePreviousEditable(rowIndex, visibleColumnIndex); return; } this.onKeydownArrowLeft(cell, rowIndex, visibleColumnIndex, isSummary); } } } /** * @param {?} targetRowIndex * @return {?} */ shouldPerformVerticalScroll(targetRowIndex) { /** @type {?} */ const containerTopOffset = parseInt(this.verticalDisplayContainerElement.style.top, 10); /** @type {?} */ const targetRow = this.grid.summariesRowList.filter(s => s.index !== 0) .concat(this.grid.rowList.toArray()).find(r => r.index === targetRowIndex); /** @type {?} */ const rowHeight = this.grid.verticalScrollContainer.getSizeAt(targetRowIndex); /** @type {?} */ const containerHeight = this.grid.calcHeight ? Math.ceil(this.grid.calcHeight) : 0; /** @type {?} */ const targetEndTopOffset = targetRow ? targetRow.nativeElement.offsetTop + rowHeight + containerTopOffset : containerHeight + rowHeight; if (!targetRow || targetRow.nativeElement.offsetTop < Math.abs(containerTopOffset) || containerHeight && containerHeight < targetEndTopOffset) { return true; } else { return false; } } /** * @private * @param {?} rowIndex * @param {?} visibleColumnIndex * @param {?=} isSummary * @return {?} */ performHorizontalScrollToCell(rowIndex, visibleColumnIndex, isSummary = false) { /** @type {?} */ const unpinnedIndex = this.getColumnUnpinnedIndex(visibleColumnIndex); this.grid.nativeElement.focus({ preventScroll: true }); this.grid.parentVirtDir.onChunkLoad .pipe(first()) .subscribe(() => { this.getCellElementByVisibleIndex(rowIndex, visibleColumnIndex, isSummary).focus({ preventScroll: true }); }); this.horizontalScroll(rowIndex).scrollTo(unpinnedIndex); } /** * @protected * @param {?} index * @param {?=} selector * @return {?} */ getRowByIndex(index, selector = this.getRowSelector()) { return this.grid.nativeElement.querySelector(`${selector}[data-rowindex="${index}"]`); } /** * @protected * @param {?} nextIndex * @return {?} */ getNextRowByIndex(nextIndex) { return this.grid.tbody.nativeElement.querySelector(`[data-rowindex="${nextIndex}"]`); } /** * @private * @return {?} */ getAllRows() { /** @type {?} */ const selector = this.getRowSelector(); return this.grid.nativeElement.querySelectorAll(selector); } /** * @protected * @param {?=} visibleIndex * @param {?=} isSummary * @return {?} */ getCellSelector(visibleIndex, isSummary = false) { return isSummary ? 'igx-grid-summary-cell' : 'igx-grid-cell'; } /** * @protected * @return {?} */ getRowSelector() { return 'igx-grid-row'; } } IgxGridNavigationService.decorators = [ { type: Injectable } ]; if (false) { /** @type {?} */ IgxGridNavigationService.prototype.grid; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1uYXZpZ2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2dyaWRzL2dyaWQtbmF2aWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBd0IsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7SUFHdEUsTUFBTyxNQUFNO0lBQ2IsT0FBUSxPQUFPOzs7OztBQUtuQixNQUFNLE9BQU8sd0JBQXdCOzs7O0lBR2pDLElBQUkscUJBQXFCO1FBQ3JCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlHLENBQUM7Ozs7SUFFRCxJQUFJLDBCQUEwQjtRQUMxQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDOzs7O0lBRUQsSUFBSSwrQkFBK0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFDOUYsQ0FBQzs7Ozs7SUFFTSxnQkFBZ0IsQ0FBQyxRQUFROztZQUN4QixPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFF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