UNPKG

@catull/igniteui-angular

Version:

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

834 lines 141 kB
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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