From c51ff4e755f009ca0bc8e935a92c04e583c4ee8a Mon Sep 17 00:00:00 2001 From: Jake Mannens Date: Tue, 17 Mar 2026 03:04:36 +1100 Subject: Initial commit --- wwwroot/js/dialog.js | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ wwwroot/js/keyboard.js | 57 ++++++++++++++++++++++++++++++++++++ wwwroot/js/mobile.js | 7 +++++ 3 files changed, 142 insertions(+) create mode 100644 wwwroot/js/dialog.js create mode 100644 wwwroot/js/keyboard.js create mode 100644 wwwroot/js/mobile.js (limited to 'wwwroot/js') diff --git a/wwwroot/js/dialog.js b/wwwroot/js/dialog.js new file mode 100644 index 0000000..418962f --- /dev/null +++ b/wwwroot/js/dialog.js @@ -0,0 +1,78 @@ +function dialogMouseDown(e) { + bumpDialog(e.currentTarget); +} + +function dialogTitleMouseDown(e) { + e = e || window.event; + e.preventDefault(); + var element = e.currentTarget.parentElement; + var ds = element.dataset; + ds.lastX = e.clientX; + ds.lastY = e.clientY; + + window.dragDialog = element; + document.onmouseup = dragMouseUp; + document.onmousemove = dragMouseMove; +} + +function dragMouseUp() { + window.dragDialog = null; + document.onmouseup = null; + document.onmousemove = null; +} + +function dragMouseMove(e) { + e = e || window.event; + e.preventDefault(); + var element = window.dragDialog; + var ds = element.dataset; + deltaX = ds.lastX - e.clientX; + deltaY = ds.lastY - e.clientY; + ds.lastX = e.clientX; + ds.lastY = e.clientY; + element.style.left = (element.offsetLeft - deltaX) + 'px'; + element.style.top = (element.offsetTop - deltaY) + 'px'; +} + +function setDialogVisibility(element, visible) { + if(visible) { + element.style.left = null; + element.style.top = null; + element.style.opacity = 1; + element.style.visibility = 'visible'; + bumpDialog(element); + + var input = element.querySelector('input[type="text"]'); + if(input) { + setTimeout(() => input.focus(), 100); + } + } else { + element.style.opacity = 0; + element.style.visibility = 'hidden'; + } +} + +function bumpDialog(element) { + var dialogs = Array + .from(document.querySelectorAll('div.dialog')) + .map(e => ({ zIndex: parseInt(e.style.zIndex), element: e })) + .sort((a, b) => a.zIndex - b.zIndex) + .map(d => d.element) + .filter(e => e != element); + + dialogs.push(element); + + var z = 900; + for(var d of dialogs) + d.style.zIndex = z++; +} + +function dialogAddObjectReference(element, dialogObject) { + if(!window.dialogObjects) + window.dialogObjects = [] + + window.dialogObjects.push({ + element: element, + dialogObject: dialogObject + }); +} 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 diff --git a/wwwroot/js/mobile.js b/wwwroot/js/mobile.js new file mode 100644 index 0000000..0af11cc --- /dev/null +++ b/wwwroot/js/mobile.js @@ -0,0 +1,7 @@ +function hideMobileMenu() { + document.getElementsByTagName('body')[0].classList.remove('mobile-menu-visible'); +} + +function toggleMobileMenu() { + document.getElementsByTagName('body')[0].classList.toggle('mobile-menu-visible'); +} -- cgit v1.3