diff --git a/addons/web/static/src/core/hotkeys/hotkey_service.js b/addons/web/static/src/core/hotkeys/hotkey_service.js index 81ae0cdbf064e4cade8cd3ec91ba15a9b99073f8..01dadc6b8893a72c79d38ec4ec11648608bb3417 100644 --- a/addons/web/static/src/core/hotkeys/hotkey_service.js +++ b/addons/web/static/src/core/hotkeys/hotkey_service.js @@ -55,6 +55,13 @@ export const hotkeyService = { return; } + if (event.code && event.code.indexOf("Numpad") === 0 && /^\d$/.test(event.key)) { + // Ignore all number keys from the Keypad because of a certain input method + // of (advance-)ASCII characters on Windows OS: ALT+[numerical code from keypad] + // See https://support.microsoft.com/en-us/office/insert-ascii-or-unicode-latin-based-symbols-and-characters-d13f58d3-7bcb-44a7-a4d5-972ee12e50e0#bm1 + return; + } + const hotkey = getActiveHotkey(event); // Do not dispatch if UI is blocked diff --git a/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js b/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js index ce732b920a434b3d0e850478e54b59f3669792bd..93648e8e23153181a3cee35e224fdee98075672f 100644 --- a/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js +++ b/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js @@ -672,3 +672,22 @@ QUnit.test("protects editable elements: can bypassEditableProtection", async (as "the callback still gets called even if triggered from an editable" ); }); + +QUnit.test("ignore numpad keys", async (assert) => { + assert.expect(3); + + const key = '1'; + + env.services.hotkey.add(`alt+${key}`, () => assert.step(key)); + await nextTick(); + + let keydown = new KeyboardEvent("keydown", { key, code: "Numpad1", altKey: true }); + window.dispatchEvent(keydown); + await nextTick(); + assert.verifySteps([]); + + keydown = new KeyboardEvent("keydown", { key: '&', code: "Digit1", altKey: true }); + window.dispatchEvent(keydown); + await nextTick(); + assert.verifySteps(['1']); +});