summaryrefslogtreecommitdiff
path: root/Server/wwwroot/js
diff options
context:
space:
mode:
Diffstat (limited to 'Server/wwwroot/js')
-rw-r--r--Server/wwwroot/js/dialog.js78
-rw-r--r--Server/wwwroot/js/keyboard.js57
-rw-r--r--Server/wwwroot/js/mobile.js7
3 files changed, 142 insertions, 0 deletions
diff --git a/Server/wwwroot/js/dialog.js b/Server/wwwroot/js/dialog.js
new file mode 100644
index 0000000..418962f
--- /dev/null
+++ b/Server/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/Server/wwwroot/js/keyboard.js b/Server/wwwroot/js/keyboard.js
new file mode 100644
index 0000000..8b46639
--- /dev/null
+++ b/Server/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/Server/wwwroot/js/mobile.js b/Server/wwwroot/js/mobile.js
new file mode 100644
index 0000000..0af11cc
--- /dev/null
+++ b/Server/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');
+}