From 168a870c025bfef6efdeb46e166e79a16093c157 Mon Sep 17 00:00:00 2001 From: Frédéric Guillot Date: Thu, 10 Aug 2023 19:46:45 -0700 Subject: Move internal packages to an internal folder For reference: https://go.dev/doc/go1.4#internalpackages --- internal/ui/static/js/keyboard_handler.js | 72 +++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 internal/ui/static/js/keyboard_handler.js (limited to 'internal/ui/static/js/keyboard_handler.js') diff --git a/internal/ui/static/js/keyboard_handler.js b/internal/ui/static/js/keyboard_handler.js new file mode 100644 index 00000000..037f9949 --- /dev/null +++ b/internal/ui/static/js/keyboard_handler.js @@ -0,0 +1,72 @@ +class KeyboardHandler { + constructor() { + this.queue = []; + this.shortcuts = {}; + this.triggers = []; + } + + on(combination, callback) { + this.shortcuts[combination] = callback; + this.triggers.push(combination.split(" ")[0]); + } + + listen() { + document.onkeydown = (event) => { + let key = this.getKey(event); + if (this.isEventIgnored(event, key) || this.isModifierKeyDown(event)) { + return; + } + + event.preventDefault(); + this.queue.push(key); + + for (let combination in this.shortcuts) { + let keys = combination.split(" "); + + if (keys.every((value, index) => value === this.queue[index])) { + this.queue = []; + this.shortcuts[combination](event); + return; + } + + if (keys.length === 1 && key === keys[0]) { + this.queue = []; + this.shortcuts[combination](event); + return; + } + } + + if (this.queue.length >= 2) { + this.queue = []; + } + }; + } + + isEventIgnored(event, key) { + return event.target.tagName === "INPUT" || + event.target.tagName === "TEXTAREA" || + (this.queue.length < 1 && !this.triggers.includes(key)); + } + + isModifierKeyDown(event) { + return event.getModifierState("Control") || event.getModifierState("Alt") || event.getModifierState("Meta"); + } + + getKey(event) { + const mapping = { + 'Esc': 'Escape', + 'Up': 'ArrowUp', + 'Down': 'ArrowDown', + 'Left': 'ArrowLeft', + 'Right': 'ArrowRight' + }; + + for (let key in mapping) { + if (mapping.hasOwnProperty(key) && key === event.key) { + return mapping[key]; + } + } + + return event.key; + } +} -- cgit v1.2.3