diff options
| author | Jake Mannens <jake@asger.xyz> | 2026-03-17 03:04:36 +1100 |
|---|---|---|
| committer | Jake Mannens <jake@asger.xyz> | 2026-06-07 12:32:37 +1000 |
| commit | c51ff4e755f009ca0bc8e935a92c04e583c4ee8a (patch) | |
| tree | 0a9a311c5404a96495df1047e613dc3aea3d0f15 /wwwroot/js/keyboard.js | |
Initial commit
Diffstat (limited to 'wwwroot/js/keyboard.js')
| -rw-r--r-- | wwwroot/js/keyboard.js | 57 |
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 |
