@progress/kendo-angular-common
Version:
Kendo UI for Angular - Utility Package
96 lines (95 loc) • 3.11 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* 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;
};