summaryrefslogtreecommitdiff
path: root/wwwroot/js/keyboard.js
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2026-03-17 03:04:36 +1100
committerJake Mannens <jake@asger.xyz>2026-06-07 12:32:37 +1000
commitc51ff4e755f009ca0bc8e935a92c04e583c4ee8a (patch)
tree0a9a311c5404a96495df1047e613dc3aea3d0f15 /wwwroot/js/keyboard.js
Initial commit
Diffstat (limited to 'wwwroot/js/keyboard.js')
-rw-r--r--wwwroot/js/keyboard.js57
1 files changed, 57 insertions, 0 deletions
diff --git a/wwwroot/js/keyboard.js b/wwwroot/js/keyboard.js
new file mode 100644
index 0000000..8b46639
--- /dev/null
+++ b/wwwroot/js/keyboard.js
@@ -0,0 +1,57 @@
+async function keyDownHandler(e) {
+ function isDialogChild(e) {
+ while(e = e.parentElement)
+ if(e.tagName == 'DIV' && e.classList.contains('dialog'))
+ return true;
+ return false;
+ }
+
+ var tag = document.activeElement.tagName;
+ if((tag == 'INPUT' || (tag == 'TEXTAREA' && e.ctrlKey)) && e.key == 'Enter') {
+ var element = document.activeElement;
+ while(element = element.parentElement) {
+ if(element.tagName == 'FORM') {
+ element
+ .querySelectorAll('input,textarea')
+ .forEach(e => e.dispatchEvent(new Event('change')));
+ element.requestSubmit();
+ e.preventDefault();
+ return;
+ }
+ }
+ }
+
+ if((tag == 'INPUT' || tag == 'TEXTAREA') && e.key != 'Escape')
+ return;
+
+ var element = Array.from(document.querySelectorAll('div.dialog'))
+ .filter(e => e.style.visibility == 'visible')
+ .map(e => ({ element: e, zIndex: parseInt(e.style.zIndex) }))
+ .sort((a, b) => b.zIndex - a.zIndex)
+ .map(e => e.element)[0];
+
+ if(element) {
+ await window.dialogObjects
+ .find(d => d.element == element)
+ .dialogObject
+ .invokeMethodAsync('KeyHandler', e.key);
+ e.preventDefault();
+ return;
+ }
+
+ var button = Array.from(document.getElementsByTagName('button'))
+ .filter(b => typeof(b.dataset.keyboardShortcut) == 'string')
+ .filter(b => !isDialogChild(b))
+ .find(b => b.dataset.keyboardShortcut == e.key);
+
+ if(!e.ctrlKey && button) {
+ button.click();
+ e.preventDefault();
+ return;
+ }
+
+ if(typeof pageKeyDownHandler == 'function')
+ pageKeyDownHandler(e);
+}
+
+window.onload = () => document.onkeydown = keyDownHandler; \ No newline at end of file