igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
887 lines • 109 kB
JavaScript
/**
* @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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