@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
834 lines • 141 kB
JavaScript
import { __decorate, __extends } from "tslib";
import { IgxGridNavigationService } from '../grid-navigation.service';
import { first } from 'rxjs/operators';
import { isIE } from '../../core/utils';
import { FilterMode } from '../common/enums';
import { Injectable } from '@angular/core';
var IgxHierarchicalGridNavigationService = /** @class */ (function (_super) {
__extends(IgxHierarchicalGridNavigationService, _super);
function IgxHierarchicalGridNavigationService() {
return _super !== null && _super.apply(this, arguments) || this;
}
IgxHierarchicalGridNavigationService.prototype.getCellSelector = function (visibleIndex, isSummary) {
if (isSummary === void 0) { isSummary = false; }
return isSummary ? 'igx-grid-summary-cell' : 'igx-hierarchical-grid-cell';
};
IgxHierarchicalGridNavigationService.prototype.getRowSelector = function () {
return 'igx-hierarchical-grid-row';
};
IgxHierarchicalGridNavigationService.prototype.getRowByIndex = function (index) {
var row = _super.prototype.getRowByIndex.call(this, index);
return row;
};
IgxHierarchicalGridNavigationService.prototype.getChildContainer = function (grid) {
var currGrid = grid || this.grid;
return currGrid.nativeElement.parentNode.parentNode.parentNode;
};
IgxHierarchicalGridNavigationService.prototype.getChildGridRowContainer = function (grid) {
var currGrid = grid || this.grid;
return currGrid.nativeElement.parentNode.parentNode;
};
IgxHierarchicalGridNavigationService.prototype.getChildGrid = function (childGridID, grid) {
var cgrid = grid.hgridAPI.getChildGrids(true).filter(function (g) { return g.id === childGridID; })[0];
return cgrid;
};
IgxHierarchicalGridNavigationService.prototype._isScrolledToBottom = function (grid) {
var scrollTop = grid.verticalScrollContainer.scrollPosition;
var scrollHeight = grid.verticalScrollContainer.getScroll().scrollHeight;
return scrollHeight === 0 || Math.round(scrollTop + grid.verticalScrollContainer.igxForContainerSize) === scrollHeight;
};
IgxHierarchicalGridNavigationService.prototype.getIsChildAtIndex = function (index) {
return this.grid.isChildGridRecord(this.grid.dataView[index]);
};
IgxHierarchicalGridNavigationService.prototype.getCellElementByVisibleIndex = function (rowIndex, visibleColumnIndex, isSummary) {
if (isSummary === void 0) { isSummary = false; }
var cellSelector = this.getCellSelector(visibleColumnIndex, isSummary);
if (isSummary) {
var summaryRow = this.grid.summariesRowList.toArray()[0].nativeElement;
return summaryRow.querySelector(cellSelector + "[data-visibleIndex=\"" + visibleColumnIndex + "\"]");
}
var row = this.getRowByIndex(rowIndex);
return row.querySelector(cellSelector + "[data-rowindex=\"" + rowIndex + "\"][data-visibleIndex=\"" + visibleColumnIndex + "\"]");
};
IgxHierarchicalGridNavigationService.prototype.navigateUp = function (rowElement, selectedNode) {
var _this = this;
if (selectedNode.isSummaryRow) {
return;
}
var prevElem = rowElement.previousElementSibling;
var visibleColumnIndex = selectedNode.column;
var currentRowIndex = selectedNode.row;
if (prevElem) {
var nodeName = prevElem.children[0].nodeName.toLowerCase();
var isElemChildGrid = nodeName.toLowerCase() === 'igx-child-grid-row';
if (isElemChildGrid) {
this.focusPrevChild(prevElem, visibleColumnIndex, this.grid);
}
else {
if (this.grid.parent !== null) {
// currently navigating in child grid
this._navigateUpInChild(rowElement, currentRowIndex, visibleColumnIndex);
}
else {
_super.prototype.navigateUp.call(this, rowElement, selectedNode);
}
}
}
else if (currentRowIndex !== 0) {
// handle scenario when prev item is child grid but is not yet in view
var isPrevChildGrid = this.getIsChildAtIndex(currentRowIndex - 1);
if (!isPrevChildGrid) {
_super.prototype.navigateUp.call(this, rowElement, selectedNode);
}
else {
this.scrollGrid(this.grid, -rowElement.offsetHeight, function () {
rowElement = _this.getRowByIndex(currentRowIndex);
_this.navigateUp(rowElement, selectedNode);
});
}
}
else if (this.grid.parent !== null &&
currentRowIndex === 0) {
// move to prev row in sibling layout or parent
this.focusPrev(visibleColumnIndex);
}
};
IgxHierarchicalGridNavigationService.prototype.navigateDown = function (rowElement, selectedNode) {
if (selectedNode.isSummaryRow) {
return;
}
var nextElem = rowElement.nextElementSibling;
var visibleColumnIndex = selectedNode.column;
var currentRowIndex = selectedNode.row;
if (nextElem) {
// next elem is in DOM
var nodeName = nextElem.children[0].nodeName.toLowerCase();
var isNextElemChildGrid = nodeName.toLowerCase() === 'igx-child-grid-row';
if (isNextElemChildGrid) {
this.focusNextChild(nextElem, visibleColumnIndex, this.grid);
}
else {
if (this.grid.parent !== null) {
// currently navigating in child grid
this._navigateDownInChild(rowElement, currentRowIndex, visibleColumnIndex);
}
else {
_super.prototype.navigateDown.call(this, rowElement, selectedNode);
}
}
}
else if (currentRowIndex !== this.grid.dataView.length - 1) {
// scroll next in view
_super.prototype.navigateDown.call(this, rowElement, selectedNode);
}
else if (this.grid.parent !== null &&
currentRowIndex === this.grid.dataView.length - 1) {
// move to next row in sibling layout or in parent
this.focusNext(visibleColumnIndex);
}
};
IgxHierarchicalGridNavigationService.prototype.navigateTop = function (visibleColumnIndex) {
var _this = this;
if (this.grid.parent !== null) {
// navigating in child
var childContainer = this.grid.nativeElement.parentNode.parentNode;
var diff = childContainer.getBoundingClientRect().top - this.grid.rootGrid.tbody.nativeElement.getBoundingClientRect().top;
var topIsVisible = diff >= 0;
var scrollable = this.getNextScrollable(this.grid);
if (!topIsVisible) {
this.scrollGrid(scrollable.grid, diff, function () { return _super.prototype.navigateTop.call(_this, visibleColumnIndex); });
}
else {
_super.prototype.navigateTop.call(this, visibleColumnIndex);
}
}
else {
_super.prototype.navigateTop.call(this, visibleColumnIndex);
}
};
IgxHierarchicalGridNavigationService.prototype.navigateBottom = function (visibleColumnIndex) {
var _this = this;
// handle scenario where last index is child grid
// in that case focus cell in last data row
var lastIndex = this.grid.dataView.length - 1;
if (this.getIsChildAtIndex(lastIndex)) {
var targetIndex_1 = lastIndex - 1;
var scrTopPosition = this.grid.verticalScrollContainer.getScrollForIndex(targetIndex_1, true);
var verticalScrollTop = this.grid.verticalScrollContainer.scrollPosition;
var cellSelector_1 = this.getCellSelector(visibleColumnIndex);
if (verticalScrollTop === scrTopPosition) {
var cells = this.getRowByIndex(targetIndex_1).querySelectorAll(cellSelector_1 + "[data-visibleIndex=\"" + visibleColumnIndex + "\"]");
cells[cells.length - 1].focus();
}
else {
this.scrollGrid(this.grid, scrTopPosition - verticalScrollTop, function () {
var cells = _this.getRowByIndex(targetIndex_1).querySelectorAll(cellSelector_1 + "[data-visibleIndex=\"" + visibleColumnIndex + "\"]");
if (cells.length > 0) {
cells[cells.length - 1].focus();
}
});
}
}
else if (this.grid.parent !== null) {
var childContainer = this.grid.nativeElement.parentNode.parentNode;
var diff = childContainer.getBoundingClientRect().bottom - this.grid.rootGrid.tbody.nativeElement.getBoundingClientRect().bottom;
var endIsVisible = diff < 0;
var scrollable = this.getNextScrollableDown(this.grid);
if (!endIsVisible) {
this.scrollGrid(scrollable.grid, diff, function () { return _super.prototype.navigateBottom.call(_this, visibleColumnIndex); });
}
else {
_super.prototype.navigateBottom.call(this, visibleColumnIndex);
}
}
else {
_super.prototype.navigateBottom.call(this, visibleColumnIndex);
}
};
IgxHierarchicalGridNavigationService.prototype.goToLastCell = function () {
var _this = this;
// handle scenario where last index is child grid
// in that case focus last cell in last data row
var lastIndex = this.grid.dataView.length - 1;
if (this.getIsChildAtIndex(lastIndex)) {
var targetIndex_2 = lastIndex - 1;
var scrTopPosition = this.grid.verticalScrollContainer.getScrollForIndex(targetIndex_2, true);
var verticalScrollTop = this.grid.verticalScrollContainer.scrollPosition;
if (verticalScrollTop === scrTopPosition) {
this.onKeydownEnd(targetIndex_2);
}
else {
this.scrollGrid(this.grid, scrTopPosition - verticalScrollTop, function () {
_this.onKeydownEnd(targetIndex_2);
});
}
}
else {
_super.prototype.goToLastCell.call(this);
}
};
IgxHierarchicalGridNavigationService.prototype.onKeydownEnd = function (rowIndex, isSummary) {
var _this = this;
if (isSummary === void 0) { isSummary = false; }
if (this.grid.parent && !isSummary) {
// handle scenario where last child row might not be in view
// parent should scroll to child grid end
var childContainer = this.grid.nativeElement.parentNode.parentNode;
var diffBottom = childContainer.getBoundingClientRect().bottom - this.grid.rootGrid.nativeElement.getBoundingClientRect().bottom;
var row = this.grid.getRowByIndex(rowIndex).element.nativeElement;
var rowBottom = row.getBoundingClientRect().bottom;
var rowIsVisible = rowBottom <= this.grid.rootGrid.tbody.nativeElement.getBoundingClientRect().bottom;
var gridTop = this._getMaxTop(this.grid);
var diffTop = row.getBoundingClientRect().bottom -
row.offsetHeight - gridTop;
var endIsVisible = diffBottom <= 0;
var topVisible = diffTop >= 0;
if (!endIsVisible && !rowIsVisible) {
this.scrollGrid(this.grid.parent, diffBottom, function () { return _super.prototype.onKeydownEnd.call(_this, rowIndex); });
}
else if (!topVisible) {
var scrGrid = this.grid.verticalScrollContainer.scrollPosition !== 0 ? this.grid :
this.getNextScrollable(this.grid).grid;
var topGrid = scrGrid.tbody.nativeElement.getBoundingClientRect().top >
this.grid.rootGrid.tbody.nativeElement.getBoundingClientRect().top ? scrGrid : this.grid.rootGrid;
this.scrollGrid(topGrid, diffTop, function () { return _super.prototype.onKeydownEnd.call(_this, rowIndex); });
}
else {
_super.prototype.onKeydownEnd.call(this, rowIndex, isSummary);
}
}
else {
_super.prototype.onKeydownEnd.call(this, rowIndex, isSummary);
}
};
IgxHierarchicalGridNavigationService.prototype.goToFirstCell = function () {
var _this = this;
var verticalScroll = this.grid.verticalScrollContainer.getScroll();
var horizontalScroll = this.grid.dataRowList.first.virtDirRow.getScroll();
if (verticalScroll.scrollTop === 0 && this.grid.parent) {
// scroll parent so that current child is in view
if (!horizontalScroll.clientWidth || parseInt(horizontalScroll.scrollLeft, 10) <= 1 || this.grid.pinnedColumns.length) {
this.navigateTop(0);
}
else {
this.horizontalScroll(this.grid.dataRowList.first.index).scrollTo(0);
this.grid.parentVirtDir.onChunkLoad
.pipe(first())
.subscribe(function () {
_this.navigateTop(0);
});
}
}
else {
_super.prototype.goToFirstCell.call(this);
}
};
IgxHierarchicalGridNavigationService.prototype.performTab = function (currentRowEl, selectedNode) {
var _this = this;
if (this.grid.rowInEditMode) {
_super.prototype.performTab.call(this, currentRowEl, selectedNode);
return;
}
var rowIndex = selectedNode.row;
var visibleColumnIndex = selectedNode.column;
var isSummaryRow = selectedNode.isSummaryRow;
var summaryRows = this.grid.summariesRowList.toArray();
var hasSummaries = summaryRows.length > 0;
var isLastDataRow = rowIndex === this.grid.dataView.length - 1;
var nextIsDataRow = this.grid.dataRowList.find(function (row) { return row.index === rowIndex + 1; });
var isLastColumn = this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex === visibleColumnIndex;
var isLastSummaryRow = hasSummaries && isSummaryRow;
var nextIndex = rowIndex + 1;
var virt = this.grid.verticalScrollContainer;
var isNextChild = nextIndex <= virt.igxForOf.length - 1 &&
this.grid.isChildGridRecord(virt.igxForOf[nextIndex]);
if (!nextIsDataRow && !(isLastDataRow && hasSummaries) && isLastColumn && !isSummaryRow) {
// navigating in child, next is not summary
var childContainer = this.getChildGridRowContainer();
var nextIsSiblingChild = this.grid.parent ? !!childContainer.nextElementSibling : false;
if (nextIsSiblingChild) {
this.focusNextChildDOMElem(childContainer, this.grid.parent);
}
else if (isNextChild) {
var isInView = virt.state.startIndex + virt.state.chunkSize > nextIndex;
if (!isInView) {
this.scrollGrid(this.grid, 'next', function () {
_this.focusNextChildDOMElem(currentRowEl, _this.grid);
});
}
else {
this.focusNextChildDOMElem(currentRowEl, this.grid);
}
}
else if (this.grid.parent && this.grid.parent.summariesRowList.length > 0) {
this._navigateToNextParentRow(currentRowEl);
}
else {
this.navigateDown(currentRowEl, { row: rowIndex, column: 0 });
}
}
else if (isLastSummaryRow && isLastColumn && this.grid.parent) {
this._navigateToNextParentRow(currentRowEl);
}
else if (isLastDataRow && hasSummaries && isLastColumn && this.grid.parent) {
// navigating in child rows, next is child grid's summary row
this.focusNextRow(summaryRows[0].nativeElement, 0, this.grid.parent, true);
}
else {
_super.prototype.performTab.call(this, currentRowEl, selectedNode);
}
};
IgxHierarchicalGridNavigationService.prototype._navigateToNextParentRow = function (currentRowEl) {
// next is parent summary or next parent row
var parent = this.grid.parent;
var parentHasSummary = parent.summariesRowList.length > 0;
var parentRowIndex = parseInt(this.getClosestElemByTag(currentRowEl, 'igx-child-grid-row').parentNode.getAttribute('data-rowindex'), 10);
var isLastRowInParent = parent.dataView.length - 1 === parentRowIndex;
// check if next is sibling
var childRowContainer = this.getChildGridRowContainer(this.grid);
var nextIsSiblingChild = !!childRowContainer.nextElementSibling;
if (isLastRowInParent && parentHasSummary && !nextIsSiblingChild) {
// next is parent summary
var parentSummary = parent.summariesRowList.first.nativeElement;
parent.navigation.focusNextRow(parentSummary, 0, parent, true);
}
else {
// next is sibling or parent
this.focusNext(0);
}
};
IgxHierarchicalGridNavigationService.prototype.focusNextChildDOMElem = function (currentRowEl, grid) {
var gridElem = currentRowEl.nextElementSibling.querySelector('igx-hierarchical-grid');
var childGridID = gridElem.getAttribute('id');
var childGrid = this.getChildGrid(childGridID, grid);
if (childGrid.allowFiltering && childGrid.filterMode === FilterMode.quickFilter) {
childGrid.navigation.moveFocusToFilterCell(true);
return;
}
this.focusNextChild(currentRowEl.nextElementSibling, 0, grid);
};
IgxHierarchicalGridNavigationService.prototype.navigatePrevFilterCell = function (column, eventArgs) {
if (column.visibleIndex === 0 && this.grid.parent) {
eventArgs.preventDefault();
var targetGrid = this.grid.parent;
var prevSiblingChild = this.getChildGridRowContainer().previousElementSibling;
if (prevSiblingChild) {
var gridElem = prevSiblingChild.querySelectorAll('igx-hierarchical-grid')[0];
targetGrid = this.getChildGrid(gridElem.getAttribute('id'), this.grid.parent);
}
this.focusPrev(targetGrid.unpinnedColumns[targetGrid.unpinnedColumns.length - 1].visibleIndex);
}
else {
_super.prototype.navigatePrevFilterCell.call(this, column, eventArgs);
}
};
IgxHierarchicalGridNavigationService.prototype.navigateNextFilterCell = function (column, eventArgs) {
var cols = this.grid.filteringService.unpinnedFilterableColumns;
var nextFilterableIndex = cols.indexOf(column) + 1;
if (nextFilterableIndex >= this.grid.filteringService.unpinnedFilterableColumns.length) {
// next is not filter cell
var dataRows = this.grid.rowList.toArray();
var hasRows = dataRows.length !== 0;
var summaryRows = this.grid.summariesRowList.toArray();
var hasSummaries = summaryRows.length > 0 && summaryRows[0].summaryCells.length > 0;
if (hasRows) {
this.focusNextRow(dataRows[0].nativeElement, 0, this.grid, false);
}
else if (hasSummaries) {
this.focusNextRow(summaryRows[0].nativeElement, 0, this.grid, true);
}
else {
this.focusNext(0);
}
eventArgs.preventDefault();
}
else {
_super.prototype.navigateNextFilterCell.call(this, column, eventArgs);
}
};
IgxHierarchicalGridNavigationService.prototype.performShiftTabKey = function (currentRowEl, selectedNode) {
var _this = this;
if (this.grid.rowInEditMode) {
_super.prototype.performShiftTabKey.call(this, currentRowEl, selectedNode);
return;
}
var rowIndex = selectedNode.row;
var visibleColumnIndex = selectedNode.column;
var isSummary = selectedNode.isSummaryRow;
if (visibleColumnIndex === 0 && rowIndex === 0 && this.grid.parent && !isSummary) {
if (this.grid.allowFiltering && this.grid.filterMode === FilterMode.quickFilter) {
this.moveFocusToFilterCell();
}
else {
var prevSiblingChild = this.getChildGridRowContainer().previousElementSibling;
if (prevSiblingChild) {
var gridElem = prevSiblingChild.querySelectorAll('igx-hierarchical-grid')[0];
this.performShiftTabIntoChild(gridElem, currentRowEl, rowIndex);
}
else {
var selNode = {
row: rowIndex,
column: this.grid.parent.unpinnedColumns[this.grid.parent.unpinnedColumns.length - 1].visibleIndex
};
this.navigateUp(currentRowEl, selNode);
}
}
}
else if (visibleColumnIndex === 0 && currentRowEl.previousElementSibling &&
currentRowEl.previousElementSibling.children[0].tagName.toLowerCase() === 'igx-child-grid-row') {
var gridElem = this.getLastGridElem(currentRowEl.previousElementSibling);
this.performShiftTabIntoChild(gridElem, currentRowEl, rowIndex);
}
else if (visibleColumnIndex === 0 && isSummary) {
var lastRowIndex_1 = this.grid.dataView.length - 1;
if (lastRowIndex_1 === -1) {
// no child data
if (this.grid.allowFiltering && this.grid.filterMode === FilterMode.quickFilter) {
this.moveFocusToFilterCell();
}
else {
var selNode = {
row: rowIndex,
column: this.grid.parent.unpinnedColumns[this.grid.parent.unpinnedColumns.length - 1].visibleIndex
};
this.navigateUp(currentRowEl, selNode);
}
}
else if (!this.getIsChildAtIndex(lastRowIndex_1)) {
_super.prototype.goToLastCell.call(this);
}
else {
var scrTopPosition = this.grid.verticalScrollContainer.getScrollForIndex(lastRowIndex_1, true);
var verticalScrollTop = this.grid.verticalScrollContainer.scrollPosition;
if (verticalScrollTop === scrTopPosition || isNaN(scrTopPosition)) {
var closestChild = this.getLastGridElem(this.grid.getRowByIndex(lastRowIndex_1).nativeElement.parentElement);
this.performShiftTabIntoChild(closestChild, currentRowEl, rowIndex);
}
else {
this.scrollGrid(this.grid, scrTopPosition - verticalScrollTop, function () {
var closestChild = _this.getLastGridElem(_this.grid.getRowByIndex(lastRowIndex_1).nativeElement.parentElement);
_this.performShiftTabIntoChild(closestChild, currentRowEl, rowIndex);
});
}
}
}
else {
_super.prototype.performShiftTabKey.call(this, currentRowEl, selectedNode);
}
};
IgxHierarchicalGridNavigationService.prototype.getFocusableGrid = function () {
return (isIE() && this.grid.rootGrid) ? this.grid.rootGrid : this.grid;
};
IgxHierarchicalGridNavigationService.prototype.getLastGridElem = function (trContainer) {
var children = trContainer.children;
var closestChild = children[children.length - 1].children[0].children[0];
return closestChild;
};
IgxHierarchicalGridNavigationService.prototype.performShiftTabIntoChild = function (gridElem, currentRowEl, rowIndex) {
var childGridID = gridElem.getAttribute('id');
var childGrid = this.getChildGrid(childGridID, this.grid) || this.getChildGrid(childGridID, this.grid.parent);
var lastIndex = childGrid.unpinnedColumns[childGrid.unpinnedColumns.length - 1].visibleIndex;
var summaryRows = childGrid.summariesRowList.toArray();
if (summaryRows.length > 0 && summaryRows[0].summaryCells.length > 0) {
// move focus to last summary row cell
var summaryRow = summaryRows[0].nativeElement;
this.focusPrevRow(summaryRow, lastIndex, childGrid, true, true);
}
else if (childGrid.rowList.toArray().length === 0 &&
childGrid.allowFiltering && childGrid.filterMode === FilterMode.quickFilter) {
// move to filter cell
childGrid.navigation.moveFocusToFilterCell();
}
else if (childGrid.rowList.length === 0) {
// move to prev child or parent row
var prevChild = this.getSibling(childGrid);
if (prevChild) {
this.performShiftTabIntoChild(prevChild, currentRowEl, rowIndex);
}
else {
var selNode = {
row: rowIndex,
column: this.grid.unpinnedColumns[this.grid.unpinnedColumns.length - 1].visibleIndex
};
this.navigateUp(currentRowEl, selNode);
}
}
else {
// move to prev cell
childGrid.navigation.goToLastCell();
}
};
IgxHierarchicalGridNavigationService.prototype.getSibling = function (childGrid) {
var prevChildRow = childGrid.childRow.nativeElement.previousElementSibling;
if (prevChildRow) {
return prevChildRow.children[0].children[0];
}
return null;
};
IgxHierarchicalGridNavigationService.prototype.focusNextChild = function (elem, visibleColumnIndex, grid) {
var _this = this;
var gridElem = elem.querySelector('igx-hierarchical-grid');
var childGridID = gridElem.getAttribute('id');
var childGrid = this.getChildGrid(childGridID, grid);
if (childGrid.rowList.toArray().length === 0) {
this.focusNext(visibleColumnIndex, childGrid);
return;
}
// Update column index since the next child can have in general less columns than visibleColumnIndex value.
var lastCellIndex = childGrid.unpinnedColumns[childGrid.unpinnedColumns.length - 1].visibleIndex;
visibleColumnIndex = Math.min(lastCellIndex, visibleColumnIndex);
if (childGrid.verticalScrollContainer.state.startIndex !== 0) {
// scroll to top
this.scrollGrid(childGrid, 'top', function () { return _this.focusNextRow(elem, visibleColumnIndex, childGrid); });
}
else {
this.focusNextRow(elem, visibleColumnIndex, childGrid);
}
};
IgxHierarchicalGridNavigationService.prototype.focusPrevChild = function (elem, visibleColumnIndex, grid) {
var _this = this;
var grids = [];
var gridElems = Array.from(elem.querySelectorAll('igx-hierarchical-grid'));
var childLevel = grid.childLayoutList.first.level;
gridElems.forEach(function (hg) {
var parentRow = _this.getClosestElemByTag(hg, 'igx-child-grid-row');
if (parentRow && parseInt(parentRow.getAttribute('data-level'), 10) === childLevel) {
grids.push(hg);
}
});
var gridElem = grids[grids.length - 1];
var childGridID = gridElem.getAttribute('id');
var childGrid = this.getChildGrid(childGridID, grid);
if (childGrid.rowList.toArray().length === 0) {
this.focusPrev(visibleColumnIndex, childGrid);
return;
}
// Update column index since the previous child can have in general less columns than visibleColumnIndex value.
var lastCellIndex = childGrid.unpinnedColumns[childGrid.unpinnedColumns.length - 1].visibleIndex;
visibleColumnIndex = Math.min(lastCellIndex, visibleColumnIndex);
var isScrolledToBottom = this._isScrolledToBottom(childGrid);
var lastIndex = childGrid.dataView.length - 1;
if (!isScrolledToBottom) {
// scroll to end
this.scrollGrid(childGrid, 'bottom', function () { return _this.focusPrevChild(elem, visibleColumnIndex, grid); });
}
else {
var lastRowInChild = childGrid.getRowByIndex(lastIndex);
var isChildGrid = lastRowInChild.nativeElement.nodeName.toLowerCase() === 'igx-child-grid-row';
if (isChildGrid) {
this.focusPrevChild(lastRowInChild.nativeElement.parentNode, visibleColumnIndex, childGrid);
}
else {
this.focusPrevRow(lastRowInChild.nativeElement, visibleColumnIndex, childGrid, true);
}
}
};
IgxHierarchicalGridNavigationService.prototype.focusPrev = function (visibleColumnIndex, grid) {
var _this = this;
var currGrid = grid || this.grid;
var parentContainer = this.getChildContainer(currGrid);
var childRowContainer = this.getChildGridRowContainer(currGrid);
var prevIsSiblingChild = !!childRowContainer.previousElementSibling;
var prev = childRowContainer.previousElementSibling || parentContainer.previousElementSibling;
if (prev) {
if (prevIsSiblingChild) {
this.focusPrevChild(prev, visibleColumnIndex, currGrid.parent);
}
else {
this.focusPrevRow(prev, visibleColumnIndex, currGrid.parent);
}
}
else {
this.scrollGrid(currGrid.parent, 'prev', function () {
parentContainer = _this.getChildContainer(grid);
childRowContainer = _this.getChildGridRowContainer(grid);
prev = childRowContainer.previousElementSibling || parentContainer.previousElementSibling;
if (prevIsSiblingChild) {
_this.focusPrevChild(prev, visibleColumnIndex, currGrid.parent);
}
else {
_this.focusPrevRow(prev, visibleColumnIndex, currGrid.parent);
}
});
}
};
IgxHierarchicalGridNavigationService.prototype.getNextParentInfo = function (grid) {
// find next parent that is not at bottom
var currGrid = grid.parent;
var nextElem = this.getChildContainer(grid).nextElementSibling;
while (!nextElem && currGrid.parent !== null) {
nextElem = this.getChildContainer(currGrid).nextElementSibling;
currGrid = currGrid.parent;
}
return { grid: currGrid, nextElement: nextElem };
};
IgxHierarchicalGridNavigationService.prototype.getNextScrollable = function (grid) {
var currGrid = grid.parent;
if (!currGrid) {
return { grid: grid, prev: null };
}
var nonScrollable = currGrid.verticalScrollContainer.scrollPosition === 0;
var prev = grid;
while (nonScrollable && currGrid.parent !== null) {
prev = currGrid;
currGrid = currGrid.parent;
nonScrollable = currGrid.verticalScrollContainer.scrollPosition === 0;
}
return { grid: currGrid, prev: prev };
};
IgxHierarchicalGridNavigationService.prototype.focusNext = function (visibleColumnIndex, grid) {
var _this = this;
var currGrid = grid || this.grid;
var parentInfo = this.getNextParentInfo(currGrid);
var nextParentGrid = parentInfo.grid;
var nextParentElem = parentInfo.nextElement;
var childRowContainer = this.getChildGridRowContainer(currGrid);
var nextIsSiblingChild = !!childRowContainer.nextElementSibling;
var next = childRowContainer.nextElementSibling || nextParentElem;
var verticalScroll = nextParentGrid.verticalScrollContainer.getScroll();
var parentState = nextParentGrid.verticalScrollContainer.state;
var atLastChunk = parentState.startIndex + parentState.chunkSize ===
nextParentGrid.dataView.length;
if (next) {
if (nextIsSiblingChild) {
this.focusNextChild(next, visibleColumnIndex, nextParentGrid);
}
else {
this.focusNextRow(next, visibleColumnIndex, grid || nextParentGrid);
}
}
else if (verticalScroll.scrollTop !==
verticalScroll.scrollHeight - nextParentGrid.verticalScrollContainer.igxForContainerSize && !atLastChunk) {
this.scrollGrid(nextParentGrid, 'next', function () {
nextParentElem = parentInfo.nextElement;
childRowContainer = _this.getChildGridRowContainer();
next = childRowContainer.nextElementSibling || nextParentElem;
if (next && nextIsSiblingChild) {
_this.focusNextChild(next, visibleColumnIndex, nextParentGrid);
}
else if (next) {
_this.focusNextRow(next, visibleColumnIndex, grid || nextParentGrid);
}
});
}
};
IgxHierarchicalGridNavigationService.prototype.getNextScrollableDown = function (grid) {
var currGrid = grid.parent;
if (!currGrid) {
return { grid: grid, prev: null };
}
var scrollTop = currGrid.verticalScrollContainer.scrollPosition;
var scrollHeight = currGrid.verticalScrollContainer.getScroll().scrollHeight;
var nonScrollable = scrollHeight === 0 ||
Math.round(scrollTop + currGrid.verticalScrollContainer.igxForContainerSize) === scrollHeight;
var prev = grid;
while (nonScrollable && currGrid.parent !== null) {
prev = currGrid;
currGrid = currGrid.parent;
scrollTop = currGrid.verticalScrollContainer.scrollPosition;
scrollHeight = currGrid.verticalScrollContainer.getScroll().scrollHeight;
nonScrollable = scrollHeight === 0 ||
Math.round(scrollTop + currGrid.verticalScrollContainer.igxForContainerSize) === scrollHeight;
}
return { grid: currGrid, prev: prev };
};
IgxHierarchicalGridNavigationService.prototype._getMinBottom = function (grid) {
var currGrid = grid;
var bottom = currGrid.tbody.nativeElement.getBoundingClientRect().bottom;
while (currGrid.parent) {
currGrid = currGrid.parent;
bottom = Math.min(bottom, currGrid.tbody.nativeElement.getBoundingClientRect().bottom);
}
return bottom;
};
IgxHierarchicalGridNavigationService.prototype._getMaxTop = function (grid) {
var currGrid = grid;
var top = currGrid.tbody.nativeElement.getBoundingClientRect().top;
while (currGrid.parent) {
currGrid = currGrid.parent;
top = Math.max(top, currGrid.tbody.nativeElement.getBoundingClientRect().top);
}
return top;
};
IgxHierarchicalGridNavigationService.prototype.focusNextRow = function (elem, visibleColumnIndex, grid, isSummary) {
var cellSelector = this.getCellSelector(visibleColumnIndex, isSummary);
if (grid.navigation.isColumnFullyVisible(visibleColumnIndex)) {
var cell_1 = elem.querySelector(cellSelector + "[data-visibleIndex=\"" + visibleColumnIndex + "\"]");
var closestScrollableGrid = this.getNextScrollableDown(grid).grid;
// const diff = cell.getBoundingClientRect().bottom - grid.rootGrid.tbody.nativeElement.getBoundingClientRect().bottom;
var gridBottom = this._getMinBottom(grid);
var diff = cell_1.getBoundingClientRect().bottom - gridBottom;
var inView = diff <= 0;
var scrollTop = closestScrollableGrid.verticalScrollContainer.scrollPosition;
var scrollHeight = closestScrollableGrid.verticalScrollContainer.getScroll().scrollHeight;
var canScroll = !(scrollHeight === 0 ||
Math.round(scrollTop + closestScrollableGrid.verticalScrollContainer.igxForContainerSize) === scrollHeight);
if (!inView && canScroll) {
this.scrollGrid(closestScrollableGrid, diff, function () { return cell_1.focus({ preventScroll: true }); });
}
else {
cell_1.focus({ preventScroll: true });
}
}
else {
var cellElem = elem.querySelector("" + cellSelector);
var rowIndex = parseInt(cellElem.getAttribute('data-rowindex'), 10);
grid.navigation.performHorizontalScrollToCell(rowIndex, visibleColumnIndex);
}
};
IgxHierarchicalGridNavigationService.prototype.focusPrevRow = function (elem, visibleColumnIndex, grid, inChild, isSummary) {
var _this = this;
if (grid.navigation.isColumnFullyVisible(visibleColumnIndex)) {
var cellSelector_2 = this.getCellSelector(visibleColumnIndex, isSummary);
var cells = elem.querySelectorAll(cellSelector_2 + "[data-visibleIndex=\"" + visibleColumnIndex + "\"]");
var cell_2 = cells[cells.length - 1];
var rIndex_1 = parseInt(elem.getAttribute('data-rowindex'), 10);
var scrGrid = grid.verticalScrollContainer.scrollPosition !== 0 ? grid :
this.getNextScrollable(grid).grid;
var topGrid = scrGrid.tbody.nativeElement.getBoundingClientRect().top >
grid.rootGrid.tbody.nativeElement.getBoundingClientRect().top ? scrGrid : grid.rootGrid;
var gridTop = this._getMaxTop(grid);
var scrTop = scrGrid.verticalScrollContainer.scrollPosition;
var diff = cell_2.getBoundingClientRect().bottom -
cell_2.offsetHeight - gridTop;
if (scrTop !== 0 && diff < 0 && !inChild) {
this.scrollGrid(scrGrid, diff, function () {
var el = !isSummary ? grid.navigation.getRowByIndex(rIndex_1) : elem;
cell_2 = el.querySelectorAll(cellSelector_2 + "[data-visibleIndex=\"" + visibleColumnIndex + "\"]")[0];
cell_2.focus({ preventScroll: true });
});
}
else if (diff < 0 && inChild) {
this.scrollGrid(topGrid, diff, function () {
cell_2.focus({ preventScroll: true });
});
}
else {
cell_2.focus({ preventScroll: true });
}
}
else {
this.horizontalScrollGridToIndex(grid, visibleColumnIndex, function () {
_this.focusPrevRow(elem, visibleColumnIndex, grid, inChild, isSummary);
});
}
};
IgxHierarchicalGridNavigationService.prototype.horizontalScrollGridToIndex = function (grid, visibleColumnIndex, callBackFunc) {
var unpinnedIndex = this.getColumnUnpinnedIndex(visibleColumnIndex);
grid.parentVirtDir.onChunkLoad
.pipe(first())
.subscribe(callBackFunc);
if (grid.dataRowList.length > 0) {
grid.dataRowList.first.virtDirRow.scrollTo(unpinnedIndex);
}
else {
grid.headerContainer.scrollTo(unpinnedIndex);
}
};
IgxHierarchicalGridNavigationService.prototype.scrollGrid = function (grid, target, callBackFunc) {
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
requestAnimationFrame(function () {
if (typeof target === 'number') {
grid.verticalScrollContainer.addScrollTop(target);
}
else {
switch (target) {
case 'top':
grid.verticalScrollContainer.scrollTo(0);
break;
case 'bottom':
grid.verticalScrollContainer.scrollTo(grid.dataView.length - 1);
break;
case 'next':
grid.verticalScrollContainer.scrollNext();
break;
case 'prev':
grid.verticalScrollContainer.scrollPrev();
break;
}
}
grid.verticalScrollContainer.onChunkLoad
.pipe(first())
.subscribe(callBackFunc);
});
};
IgxHierarchicalGridNavigationService.prototype._navigateUpInChild = function (rowElement, currentRowIndex, visibleColumnIndex) {
var _this = this;
var prevElem = rowElement.previousElementSibling;
var scrollable = this.getNextScrollable(this.grid);
var grid = scrollable.grid;
var scrTop = grid.verticalScrollContainer.scrollPosition;
var containerTop = scrollable.prev.nativeElement.parentNode.parentNode.parentNode.parentNode;
var top = parseInt(containerTop.style.top, 10);
if (scrTop !== 0 && top < 0) {
this.scrollGrid(grid, -prevElem.offsetHeight, function () { return _super.prototype.navigateUp.call(_this, rowElement, { row: currentRowIndex, column: visibleColumnIndex }); });
}
else {
_super.prototype.navigateUp.call(this, rowElement, { row: currentRowIndex, column: visibleColumnIndex });
}
};
IgxHierarchicalGridNavigationService.prototype._navigateDownInChild = function (rowElement, currentRowIndex, visibleColumnIndex) {
var _this = this;
var nextElem = rowElement.nextElementSibling;
var childContainer = this.grid.nativeElement.parentNode.parentNode;
var diff = childContainer.getBoundingClientRect().bottom - this.grid.rootGrid.nativeElement.getBoundingClientRect().bottom;
var endIsVisible = diff < 0;
var scrollable = this.getNextScrollableDown(this.grid);
var grid = scrollable.grid;
if (!endIsVisible) {
this.scrollGrid(grid, nextElem.offsetHeight, function () { return _super.prototype.navigateDown.call(_this, rowElement, { row: currentRowIndex, column: visibleColumnIndex }); });
}
else {
_super.prototype.navigateDown.call(this, rowElement, { row: currentRowIndex, column: visibleColumnIndex });
}
};
IgxHierarchicalGridNavigationService.prototype.getNextRowByIndex = function (nextIndex) {
return this.grid.dataRowList.find(function (element) { return element.index === nextIndex; }).element.nativeElement;
};
IgxHierarchicalGridNavigationService = __decorate([
Injectable()
], IgxHierarchicalGridNavigationService);
return IgxHierarchicalGridNavigationService;
}(IgxGridNavigationService));
export { IgxHierarchicalGridNavigationService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2hpY2FsLWdyaWQtbmF2aWdhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9oaWVyYXJjaGljYWwtZ3JpZC1uYXZpZ2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0M7SUFBMEQsd0RBQXdCO0lBQWxGOztJQWd4QkEsQ0FBQztJQTd3QmEsOERBQWUsR0FBekIsVUFBMEIsWUFBcUIsRUFBRSxTQUFpQjtRQUFqQiwwQkFBQSxFQUFBLGlCQUFpQjtRQUM5RCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDO0lBQzlFLENBQUM7SUFFUyw2REFBYyxHQUF4QjtRQUNJLE9BQU8sMkJBQTJCLENBQUM7SUFDdkMsQ0FBQztJQUVTLDREQUFhLEdBQXZCLFVBQXdCLEtBQUs7UUFDekIsSUFBTSxHQUFHLEdBQUcsaUJBQU0sYUFBYSxZQUFDLEtBQUssQ0FBUSxDQUFDO1FBQzlDLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGdFQUFpQixHQUF6QixVQUEwQixJQUFLO1FBQzNCLElBQU0sUUFBUSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ25DLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FB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