From 072e83c3d4f80b666a7636650472d459720893e1 Mon Sep 17 00:00:00 2001 From: Dominik Seeger <dominik.seeger@gmx.net> Date: Tue, 3 Sep 2019 15:03:40 +0200 Subject: [PATCH] added shortkey handler --- .../AnnotatedSubmissionBottomToolbar.vue | 13 ++++++++++ frontend/src/main.ts | 3 ++- frontend/src/util/shortkeys.ts | 26 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 frontend/src/util/shortkeys.ts diff --git a/frontend/src/components/submission_notes/toolbars/AnnotatedSubmissionBottomToolbar.vue b/frontend/src/components/submission_notes/toolbars/AnnotatedSubmissionBottomToolbar.vue index b9765e1f..e7c6459c 100644 --- a/frontend/src/components/submission_notes/toolbars/AnnotatedSubmissionBottomToolbar.vue +++ b/frontend/src/components/submission_notes/toolbars/AnnotatedSubmissionBottomToolbar.vue @@ -18,6 +18,7 @@ <v-flex xs5 class="score-flex"> <span class="mr-2">Score:</span> <input class="score-text-field" + v-shortkey="'numeric'" @shortkey="handleKeypress" id="score-input" type="number" step="0.5" @@ -172,6 +173,18 @@ export default { } else { throw new Error("Can't skip submission when skippable is false for AnnotatedSubmissionBottomToolbar.") } + }, + handleKeypress (event) { + // only handle keypress if nothing is focused + if (document.activeElement.tagName === "BODY") { + if (this.score === undefined) { + this.score = event.key + } + + const scoreInput = document.getElementById('score-input') + scoreInput.scrollIntoView() + scoreInput.focus() + } } } } diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 9d0d5524..3db3c59d 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -9,10 +9,11 @@ import Vuetify from 'vuetify' import Notifications from 'vue-notification' import Clipboard from 'v-clipboard' - import 'vuetify/dist/vuetify.min.css' import 'highlight.js/styles/atom-one-light.css' +import "@/util/shortkeys" + Vue.use(Vuetify) Vue.use(Clipboard) Vue.use(Notifications) diff --git a/frontend/src/util/shortkeys.ts b/frontend/src/util/shortkeys.ts new file mode 100644 index 00000000..a1cf61f5 --- /dev/null +++ b/frontend/src/util/shortkeys.ts @@ -0,0 +1,26 @@ +import Vue from "vue"; + +const shortkeyTypes = { + numeric: (key: string) => { return Number(key) >= 0 && Number(key) <= 9 } +} + +const handlerFunc = (el: any, bind: any) => { + return (event: KeyboardEvent) => { + // handle numeric key press + if (bind.value === "numeric" && shortkeyTypes["numeric"](event.key)) { + const e = new KeyboardEvent('shortkey', { bubbles: false, key: event.key }) + el.dispatchEvent(e) + } + } +} + +// add the v-shortkey directive to Vue +// usage: <tag v-shortkey="<shortkeyType>" @shortkey="<handlerFunc>"></tag> +Vue.directive('shortkey', { + bind: (el, bind) => { + window.addEventListener("keypress", handlerFunc(el, bind)) + }, + unbind: (el, bind) => { + window.removeEventListener("keypress", handlerFunc(el, bind)) + } +}) \ No newline at end of file -- GitLab