UNPKG

@progress/kendo-angular-common

Version:

Kendo UI for Angular - Utility Package

96 lines (95 loc) 3.11 kB
/**----------------------------------------------------------------------------------------- * Copyright © 2025 Progress Software Corporation. All rights reserved. * Licensed under commercial license. See LICENSE.md in the project root for more information *-------------------------------------------------------------------------------------------*/ import { Keys } from "../enums"; /** * @hidden * * Maps keyCode values (65-90) to Keys enum values (KeyA-KeyZ). * Used to handle letter keys correctly across different keyboard layouts. */ const keyCodeToKeysMap = { 65: Keys.KeyA, 66: Keys.KeyB, 67: Keys.KeyC, 68: Keys.KeyD, 69: Keys.KeyE, 70: Keys.KeyF, 71: Keys.KeyG, 72: Keys.KeyH, 73: Keys.KeyI, 74: Keys.KeyJ, 75: Keys.KeyK, 76: Keys.KeyL, 77: Keys.KeyM, 78: Keys.KeyN, 79: Keys.KeyO, 80: Keys.KeyP, 81: Keys.KeyQ, 82: Keys.KeyR, 83: Keys.KeyS, 84: Keys.KeyT, 85: Keys.KeyU, 86: Keys.KeyV, 87: Keys.KeyW, 88: Keys.KeyX, 89: Keys.KeyY, 90: Keys.KeyZ }; /** * @hidden * * Normalizes keyboard events to ensure consistent key handling across different keyboard layouts. * * This function addresses the following scenarios: * 1. On some keyboards, PageUp/Down, Home/End, and arrow keys are mapped to Numpad keys * 2. For letter keys (KeyA-KeyZ), checks the deprecated keyCode property to handle non-QWERTY layouts * (e.g., AZERTY, QWERTZ) where event.code may not match the expected letter * * @param event - The keyboard event to normalize * @returns The normalized key code string (e.g., 'KeyA', 'ArrowDown', 'Enter') * * @example * // On an AZERTY layout, pressing Ctrl+A (where 'A' is physically at 'Q' position) * // event.code = 'KeyQ', event.keyCode = 65 * const code = normalizeKeys(event); // Returns 'KeyA' */ export const normalizeKeys = (event) => { const keyCode = event.keyCode; if (keyCode >= 65 && keyCode <= 90) { const normalizedKey = keyCodeToKeysMap[keyCode]; if (normalizedKey) { return normalizedKey; } } // Handle numpad keys that may be mapped to navigation keys if (event.code === Keys.Numpad1 && event.key === Keys.End) { return Keys.End; } if (event.code === Keys.Numpad2 && event.key === Keys.ArrowDown) { return Keys.ArrowDown; } if (event.code === Keys.Numpad3 && event.key === Keys.PageDown) { return Keys.PageDown; } if (event.code === Keys.Numpad4 && event.key === Keys.ArrowLeft) { return Keys.ArrowLeft; } if (event.code === Keys.Numpad6 && event.key === Keys.ArrowRight) { return Keys.ArrowRight; } if (event.code === Keys.Numpad7 && event.key === Keys.Home) { return Keys.Home; } if (event.code === Keys.Numpad8 && event.key === Keys.ArrowUp) { return Keys.ArrowUp; } if (event.code === Keys.Numpad9 && event.key === Keys.PageUp) { return Keys.PageUp; } if (event.code === Keys.NumpadEnter) { return Keys.Enter; } return event.code; };