diff --git a/app/src/components/v-dialog/v-dialog.vue b/app/src/components/v-dialog/v-dialog.vue index e2ae999479..08b8529eaf 100644 --- a/app/src/components/v-dialog/v-dialog.vue +++ b/app/src/components/v-dialog/v-dialog.vue @@ -33,10 +33,10 @@ export default defineComponent({ }, setup(props, { emit }) { const dialog = ref(null); - useShortcut('escape', () => { + useShortcut('escape', (event) => { if (_active.value) { emitToggle(); - return true; + event.cancelNext(); } }); diff --git a/app/src/composables/use-shortcut/use-shortcut.ts b/app/src/composables/use-shortcut/use-shortcut.ts index 8427d156b5..b7d8c3b3bc 100644 --- a/app/src/composables/use-shortcut/use-shortcut.ts +++ b/app/src/composables/use-shortcut/use-shortcut.ts @@ -1,7 +1,11 @@ import { onMounted, onUnmounted, Ref, ref } from '@vue/composition-api'; import Vue from 'vue'; -type ShortcutHandler = (event: KeyboardEvent) => void | any | boolean; +type ShortcutHandler = (event: CancelableKeyboardEvent) => void | any | boolean; + +interface CancelableKeyboardEvent extends KeyboardEvent { + cancelNext: () => void; +} const keysdown: Set = new Set([]); const handlers: Record = {}; @@ -42,10 +46,14 @@ function callHandlers(event: KeyboardEvent) { const rest = key.split('+').filter((keySegment) => keysdown.has(keySegment) === false); if (rest.length > 0) return; for (let i = 0; i < value.length; i++) { - const cancel = value[i](event); + let cancel = false; + (event as CancelableKeyboardEvent).cancelNext = () => { + cancel = true; + }; + value[i](event as CancelableKeyboardEvent); - // if the return value is true discontinue going through the queue. - if (typeof cancel === 'boolean' && cancel === true) break; + // if cancelNext is called, discontinue going through the queue. + if (typeof cancel === 'boolean' && cancel) break; } }); }