summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2023-09-08 02:26:32 +1000
committerJake Mannens <jake@asger.xyz>2023-09-08 02:26:32 +1000
commite14e05d13d72c44fcfb011df83f3cfefe768e1fa (patch)
tree74fd88bca6883eb5077867e238bf1f712cec9fa8
parent241c70671e64023a0d84907a765bf8f1e2927735 (diff)
Added framework for routing keyboard events
-rw-r--r--Pages/Component/Dialog.razor19
-rw-r--r--Pages/Upload.razor2
-rw-r--r--Pages/_Host.cshtml1
-rw-r--r--wwwroot/js/dialog.js10
-rw-r--r--wwwroot/js/keyboard.js18
5 files changed, 47 insertions, 3 deletions
diff --git a/Pages/Component/Dialog.razor b/Pages/Component/Dialog.razor
index dbfec49..673ec2f 100644
--- a/Pages/Component/Dialog.razor
+++ b/Pages/Component/Dialog.razor
@@ -48,6 +48,23 @@
public void Show() => Visible = true;
public void Hide() => Visible = false;
+ protected override async void OnAfterRender(bool firstRender) {
+ if(firstRender) {
+ await jsRuntime.InvokeVoidAsync("dialogAddObjectReference", new object[] {
+ dialogDiv,
+ DotNetObjectReference.Create(this)
+ });
+ }
+ }
+
+ [JSInvokable("KeyHandler")]
+ public void KeyHandler(string key) {
+ if(key == "Escape") {
+ Hide();
+ return;
+ }
+ }
+
private string heightStyle =>
- $"{(height is null ? "" : $"max-height:{height};")}";
+ $"{(height is null ? "" : $"max-height:{height};")}";
}
diff --git a/Pages/Upload.razor b/Pages/Upload.razor
index 36555da..7f7980b 100644
--- a/Pages/Upload.razor
+++ b/Pages/Upload.razor
@@ -29,7 +29,6 @@
dropzone.ondrop = function(e) {
e.preventDefault();
fileUpload.files = e.dataTransfer.files;
- console.log('lmao');
uploadForm.submit();
}
@@ -38,7 +37,6 @@
}
fileUpload.onchange = function(e) {
- console.log('epic');
uploadForm.submit();
}
</script>
diff --git a/Pages/_Host.cshtml b/Pages/_Host.cshtml
index 177e2df..69bced8 100644
--- a/Pages/_Host.cshtml
+++ b/Pages/_Host.cshtml
@@ -12,6 +12,7 @@
<link href="/styles/global.css" rel="stylesheet" />
<link href="/favicon.ico" rel="icon" />
<link href="/manifest.webmanifest" rel="manifest" />
+ <script type="text/javascript" src="/js/keyboard.js"></script>
<script type="text/javascript" src="/js/dialog.js"></script>
<component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
</head>
diff --git a/wwwroot/js/dialog.js b/wwwroot/js/dialog.js
index 065014a..418962f 100644
--- a/wwwroot/js/dialog.js
+++ b/wwwroot/js/dialog.js
@@ -66,3 +66,13 @@ function bumpDialog(element) {
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..9d06b75
--- /dev/null
+++ b/wwwroot/js/keyboard.js
@@ -0,0 +1,18 @@
+async function keyDownHandler(e) {
+ e.preventDefault();
+
+ 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);
+ }
+}
+
+window.onload = () => document.onkeydown = keyDownHandler; \ No newline at end of file