@clr/angular
Version:
Angular components for Clarity
108 lines • 16.9 kB
JavaScript
/*
* Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
* This software is released under MIT license.
* The full license information can be found in LICENSE in the root directory of this project.
*/
import { Keys } from '../../../utils/enums/keys.enum';
import { DefaultKeyNavigationStrategy } from './key-navigation-strategies/default';
import { ExpandedColumnsRowKeyNavigationStrategy } from './key-navigation-strategies/expanded-columns-row';
import { ExpandedRowKeyNavigationStrategy } from './key-navigation-strategies/expanded-row';
export class KeyNavigationUtils {
constructor(host, config) {
this.host = host;
this.config = config;
}
get grid() {
return this.host?.querySelector(this.config.keyGrid);
}
get rows() {
return this.host?.querySelectorAll(this.config.keyGridRows);
}
get cells() {
return this.host?.querySelectorAll(this.config.keyGridCells);
}
get currentCellCoordinates() {
const currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
const currentRow = currentCell ? currentCell.closest(this.config.keyGridRows) : null;
const coordinates = {
x: currentRow && currentCell
? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
: 0,
y: currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0,
};
return coordinates;
}
get itemsPerPage() {
return Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.rows[0].clientHeight) - 1 || 0;
}
getNextItemCoordinate(e) {
const currentCellCoords = this.currentCellCoordinates;
const strategy = this.getNavStrategy(currentCellCoords);
const inlineStart = this.host.dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft;
const inlineEnd = this.host.dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight;
switch (e.key) {
case Keys.ArrowUp:
return strategy.keyUp(currentCellCoords);
case Keys.ArrowDown:
return strategy.keyDown(currentCellCoords);
case inlineStart:
return strategy.keyLeft(currentCellCoords);
case inlineEnd:
return strategy.keyRight(currentCellCoords);
case Keys.Home:
return strategy.keyHome(currentCellCoords, e.ctrlKey);
case Keys.End:
return strategy.keyEnd(currentCellCoords, e.ctrlKey);
case Keys.PageUp:
return strategy.keyPageUp(currentCellCoords);
case Keys.PageDown:
return strategy.keyPageDown(currentCellCoords);
default:
return currentCellCoords;
}
}
getCellsForRow(index) {
return this.rows[index].querySelectorAll(this.config.keyGridCells);
}
isExpandedRow(index) {
const selectedElement = this.rows[index].querySelector('.datagrid-row-detail');
return selectedElement ? selectedElement.style.display !== 'none' : false;
}
isDetailsRow(index) {
return this.rows[index].classList.contains('datagrid-row-detail');
}
isRowReplaced(index) {
return !!this.rows[index].closest('clr-dg-row.datagrid-row-replaced');
}
isSingleCellExpandedRow(index) {
return this.rows[index]?.querySelectorAll(this.config.keyGridCells).length === 1;
}
actionCellCount(index) {
return this.actionCellsAsArray(index).length;
}
actionCellsAsArray(index) {
return Array.from(this.rows[index].querySelectorAll('.datagrid-row-sticky .datagrid-cell, .datagrid-row-sticky .datagrid-column'));
}
isActionCell(cellCoords) {
return !!this.actionCellsAsArray(cellCoords.y)[cellCoords.x];
}
createNextCellCoords(cellCoords) {
return {
x: cellCoords.x,
y: cellCoords.y,
};
}
getNavStrategy(currentCellCoords) {
switch (true) {
case this.isSingleCellExpandedRow(currentCellCoords.y):
return new ExpandedRowKeyNavigationStrategy(this);
case this.isDetailsRow(currentCellCoords.y):
case this.isExpandedRow(currentCellCoords.y):
return new ExpandedColumnsRowKeyNavigationStrategy(this);
default:
return new DefaultKeyNavigationStrategy(this);
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LW5hdmlnYXRpb24tdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyL3NyYy9kYXRhL2RhdGFncmlkL3V0aWxzL2tleS1uYXZpZ2F0aW9uLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR3RELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzNHLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTVGLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFBbUIsSUFBaUIsRUFBUyxNQUErQjtRQUF6RCxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBeUI7SUFBRyxDQUFDO0lBRWhGLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUE0QixDQUFDO0lBQ3pGLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQTRCLENBQUM7SUFDMUYsQ0FBQztJQUVELElBQUksc0JBQXNCO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUss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SSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyw0RUFBNEUsQ0FBQyxDQUNoSCxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVksQ0FBQyxVQUEyQjtRQUN0QyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsVUFBMkI7UUFDOUMsT0FBTztZQUNMLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNmLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxpQkFBa0M7UUFDdkQsUUFBUSxJQUFJLEVBQUU7WUFDWixLQUFLLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELE9BQU8sSUFBSSxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRCxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxJQUFJLHVDQUF1QyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNEO2dCQUNFLE9BQU8sSUFBSSw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqRDtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAyNSBCcm9hZGNvbS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoZSB0ZXJtIFwiQnJvYWRjb21cIiByZWZlcnMgdG8gQnJvYWRjb20gSW5jLiBhbmQvb3IgaXRzIHN1YnNpZGlhcmllcy5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgS2V5cyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2VudW1zL2tleXMuZW51bSc7XG5pbXBvcnQgeyBLZXlOYXZpZ2F0aW9uR3JpZFN0cmF0ZWd5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9rZXktbmF2LWdyaWQtc3RyYXRlZ3kuaW50ZXJmYWNlJztcbmltcG9ydCB7IENlbGxDb29yZGluYXRlcywgS2V5TmF2aWdhdGlvbkdyaWRDb25maWcgfSBmcm9tICcuL2tleS1uYXZpZ2F0aW9uLWdyaWQuY29udHJvbGxlcic7XG5pbXBvcnQgeyBEZWZhdWx0S2V5TmF2aWdhdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9rZXktbmF2aWdhdGlvbi1zdHJhdGVnaWVzL2RlZmF1bHQnO1xuaW1wb3J0IHsgRXhwYW5kZWRDb2x1bW5zUm93S2V5TmF2aWdhdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9rZXktbmF2aWdhdGlvbi1zdHJhdGVnaWVzL2V4cGFuZGVkLWNvbHVtbnMtcm93JztcbmltcG9ydCB7IEV4cGFuZGVkUm93S2V5TmF2aWdhdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9rZXktbmF2aWdhdGlvbi1zdHJhdGVnaWVzL2V4cGFuZGVkLXJvdyc7XG5cbmV4cG9ydCBjbGFzcyBLZXlOYXZpZ2F0aW9uVXRpbHMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaG9zdDogSFRNTEVsZW1lbnQsIHB1YmxpYyBjb25maWc6IEtleU5hdmlnYXRpb25HcmlkQ29uZmlnKSB7fVxuXG4gIGdldCBncmlkKCkge1xuICAgIHJldHVybiB0aGlzLmhvc3Q/LnF1ZXJ5U2VsZWN0b3IodGhpcy5jb25maWcua2V5R3JpZCk7XG4gIH1cblxuICBnZXQgcm93cygpIHtcbiAgICByZXR1cm4gdGhpcy5ob3N0Py5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuY29uZmlnLmtleUdyaWRSb3dzKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PjtcbiAgfVxuXG4gIGdldCBjZWxscygpIHtcbiAgICByZXR1cm4gdGhpcy5ob3N0Py5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuY29uZmlnLmtleUdyaWRDZWxscykgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD47XG4gIH1cblxuICBnZXQgY3VycmVudENlbGxDb29yZGluYXRlcygpIHtcbiAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRoaXMuY2VsbHMgPyBBcnJheS5mcm9tKHRoaXMuY2VsbHMpLmZpbmQoaSA9PiBpLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSA9PT0gJzAnKSA6IG51bGw7XG4gICAgY29uc3QgY3VycmVudFJvdzogSFRNTEVsZW1lbnQgPSBjdXJyZW50Q2VsbCA/IGN1cnJlbnRDZWxsLmNsb3Nlc3QodGhpcy5jb25maWcua2V5R3JpZFJvd3MpIDogbnVsbDtcblxuICAgIGNvbnN0IGNvb3JkaW5hdGVzOiBDZWxsQ29vcmRpbmF0ZXMgPSB7XG4gICAgICB4OlxuICAgICAgICBjdXJyZW50Um93ICYmIGN1cnJlbnRDZWxsXG4gICAgICAgICAgPyBBcnJheS5mcm9tKGN1cnJlbnRSb3cucXVlcnlTZWxlY3RvckFsbCh0aGlzLmNvbmZpZy5rZXlHcmlkQ2VsbHMpKS5pbmRleE9mKGN1cnJlbnRDZWxsKVxuICAgICAgICAgIDogMCxcbiAgICAgIHk6IGN1cnJlbnRSb3cgJiYgY3VycmVudENlbGwgJiYgdGhpcy5yb3dzID8gQXJyYXkuZnJvbSh0aGlzLnJvd3MpLmluZGV4T2YoY3VycmVudFJvdykgOiAwLFxuICAgIH07XG5cbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gIH1cblxuICBnZXQgaXRlbXNQZXJQYWdlKCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMuaG9zdD8ucXVlcnlTZWxlY3RvcignLmRhdGFncmlkJykuY2xpZW50SGVpZ2h0IC8gdGhpcy5yb3dzWzBdLmNsaWVudEhlaWdodCkgLSAxIHx8IDA7XG4gIH1cblxuICBnZXROZXh0SXRlbUNvb3JkaW5hdGUoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGN1cnJlbnRDZWxsQ29vcmRzID0gdGhpcy5jdXJyZW50Q2VsbENvb3JkaW5hdGVzO1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5nZXROYXZTdHJhdGVneShjdXJyZW50Q2VsbENvb3Jkcyk7XG5cbiAgICBjb25zdCBpbmxpbmVTdGFydCA9IHRoaXMuaG9zdC5kaXIgPT09ICdydGwnID8gS2V5cy5BcnJvd1JpZ2h0IDogS2V5cy5BcnJvd0xlZnQ7XG4gICAgY29uc3QgaW5saW5lRW5kID0gdGhpcy5ob3N0LmRpciA9PT0gJ3J0bCcgPyBLZXlzLkFycm93TGVmdCA6IEtleXMuQXJyb3dSaWdodDtcblxuICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgIGNhc2UgS2V5cy5BcnJvd1VwOlxuICAgICAgICByZXR1cm4gc3RyYXRlZ3kua2V5VXAoY3VycmVudENlbGxDb29yZHMpO1xuICAgICAgY2FzZSBLZXlzLkFycm93RG93bjpcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LmtleURvd24oY3VycmVudENlbGxDb29yZHMpO1xuICAgICAgY2FzZSBpbmxpbmVTdGFydDpcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LmtleUxlZnQoY3VycmVudENlbGxDb29yZHMpO1xuICAgICAgY2FzZSBpbmxpbmVFbmQ6XG4gICAgICAgIHJldHVybiBzdHJhdGVneS5rZXlSaWdodChjdXJyZW50Q2VsbENvb3Jkcyk7XG4gICAgICBjYXNlIEtleXMuSG9tZTpcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LmtleUhvbWUoY3VycmVudENlbGxDb29yZHMsIGUuY3RybEtleSk7XG4gICAgICBjYXNlIEtleXMuRW5kOlxuICAgICAgICByZXR1cm4gc3RyYXRlZ3kua2V5RW5kKGN1cnJlbnRDZWxsQ29vcmRzLCBlLmN0cmxLZXkpO1xuICAgICAgY2FzZSBLZXlzLlBhZ2VVcDpcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LmtleVBhZ2VVcChjdXJyZW50Q2VsbENvb3Jkcyk7XG4gICAgICBjYXNlIEtleXMuUGFnZURvd246XG4gICAgICAgIHJldHVybiBzdHJhdGVneS5rZXlQYWdlRG93bihjdXJyZW50Q2VsbENvb3Jkcyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gY3VycmVudENlbGxDb29yZHM7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2VsbHNGb3JSb3coaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnJvd3NbaW5kZXhdLnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5jb25maWcua2V5R3JpZENlbGxzKTtcbiAgfVxuXG4gIGlzRXhwYW5kZWRSb3coaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudDogSFRNTEVsZW1lbnQgPSB0aGlzLnJvd3NbaW5kZXhdLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhZ3JpZC1yb3ctZGV0YWlsJyk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50ID8gc2VsZWN0ZWRFbGVtZW50LnN0eWxlLmRpc3BsYXkgIT09ICdub25lJyA6IGZhbHNlO1xuICB9XG5cbiAgaXNEZXRhaWxzUm93KGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzW2luZGV4XS5jbGFzc0xpc3QuY29udGFpbnMoJ2RhdGFncmlkLXJvdy1kZXRhaWwnKTtcbiAgfVxuXG4gIGlzUm93UmVwbGFjZWQoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiAhIXRoaXMucm93c1tpbmRleF0uY2xvc2VzdCgnY2xyLWRnLXJvdy5kYXRhZ3JpZC1yb3ctcmVwbGFjZWQnKTtcbiAgfVxuXG4gIGlzU2luZ2xlQ2VsbEV4cGFuZGVkUm93KGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzW2luZGV4XT8ucXVlcnlTZWxlY3RvckFsbCh0aGlzLmNvbmZpZy5rZXlHcmlkQ2VsbHMpLmxlbmd0aCA9PT0gMTtcbiAgfVxuXG4gIGFjdGlvbkNlbGxDb3VudChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9uQ2VsbHNBc0FycmF5KGluZGV4KS5sZW5ndGg7XG4gIH1cblxuICBhY3Rpb25DZWxsc0FzQXJyYXkoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgdGhpcy5yb3dzW2luZGV4XS5xdWVyeVNlbGVjdG9yQWxsKCcuZGF0YWdyaWQtcm93LXN0aWNreSAuZGF0YWdyaWQtY2VsbCwgLmRhdGFncmlkLXJvdy1zdGlja3kgLmRhdGFncmlkLWNvbHVtbicpXG4gICAgKTtcbiAgfVxuXG4gIGlzQWN0aW9uQ2VsbChjZWxsQ29vcmRzOiBDZWxsQ29vcmRpbmF0ZXMpIHtcbiAgICByZXR1cm4gISF0aGlzLmFjdGlvbkNlbGxzQXNBcnJheShjZWxsQ29vcmRzLnkpW2NlbGxDb29yZHMueF07XG4gIH1cblxuICBjcmVhdGVOZXh0Q2VsbENvb3JkcyhjZWxsQ29vcmRzOiBDZWxsQ29vcmRpbmF0ZXMpOiBDZWxsQ29vcmRpbmF0ZXMge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBjZWxsQ29vcmRzLngsXG4gICAgICB5OiBjZWxsQ29vcmRzLnksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TmF2U3RyYXRlZ3koY3VycmVudENlbGxDb29yZHM6IENlbGxDb29yZGluYXRlcyk6IEtleU5hdmlnYXRpb25HcmlkU3RyYXRlZ3lJbnRlcmZhY2Uge1xuICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgY2FzZSB0aGlzLmlzU2luZ2xlQ2VsbEV4cGFuZGVkUm93KGN1cnJlbnRDZWxsQ29vcmRzLnkpOlxuICAgICAgICByZXR1cm4gbmV3IEV4cGFuZGVkUm93S2V5TmF2aWdhdGlvblN0cmF0ZWd5KHRoaXMpO1xuICAgICAgY2FzZSB0aGlzLmlzRGV0YWlsc1JvdyhjdXJyZW50Q2VsbENvb3Jkcy55KTpcbiAgICAgIGNhc2UgdGhpcy5pc0V4cGFuZGVkUm93KGN1cnJlbnRDZWxsQ29vcmRzLnkpOlxuICAgICAgICByZXR1cm4gbmV3IEV4cGFuZGVkQ29sdW1uc1Jvd0tleU5hdmlnYXRpb25TdHJhdGVneSh0aGlzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEtleU5hdmlnYXRpb25TdHJhdGVneSh0aGlzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==