From 16cace76c08a1d65f4dd161191dd6d4fff7991bb Mon Sep 17 00:00:00 2001 From: Corknut Date: Sun, 12 Jan 2025 20:46:31 -0500 Subject: [PATCH 01/13] Fixed create modal shortcuts (shift 1, 2, or 3) --- frontend/layouts/default.vue | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/frontend/layouts/default.vue b/frontend/layouts/default.vue index 065199d1..d1c6b099 100644 --- a/frontend/layouts/default.vue +++ b/frontend/layouts/default.vue @@ -68,7 +68,7 @@ @@ -143,9 +143,14 @@ const displayOutdatedWarning = computed(() => !isDev && !hasHiddenLatest.value && isOutdated.value); + const activeElement = useActiveElement(); const keys = useMagicKeys({ aliasMap: { "⌃": "control_", + "Shift+": "ShiftLeft_", + "!": "ShiftLeft_digit1", + "@": "ShiftLeft_digit2", + "#": "ShiftLeft_digit3", }, }); @@ -171,7 +176,7 @@ { id: 0, name: computed(() => t("menu.create_item")), - shortcut: "⌃1", + shortcut: "!", action: () => { modals.item = true; }, @@ -179,7 +184,7 @@ { id: 1, name: computed(() => t("menu.create_location")), - shortcut: "⌃2", + shortcut: "@", action: () => { modals.location = true; }, @@ -187,7 +192,7 @@ { id: 2, name: computed(() => t("menu.create_label")), - shortcut: "⌃3", + shortcut: "#", action: () => { modals.label = true; }, @@ -195,9 +200,12 @@ ]; dropdown.forEach(option => { - if (option.shortcut) { - whenever(keys[option.shortcut], () => { - option.action(); + if (option?.shortcut) { + const shortcutKeycode = option.shortcut.replace(/([0-9])/, "digit$&"); + whenever(keys[shortcutKeycode], () => { + if (activeElement.value?.tagName === "BODY") { + option.action(); + } }); } }); From 690ebbf951178912ad5de03f14a147b40cc21e5c Mon Sep 17 00:00:00 2001 From: Corknut Date: Sun, 12 Jan 2025 21:19:23 -0500 Subject: [PATCH 02/13] Autofocus on name fields in create modals --- frontend/components/Item/CreateModal.vue | 28 +++++++++++--------- frontend/components/Label/CreateModal.vue | 9 ++++--- frontend/components/Location/CreateModal.vue | 9 ++++--- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/frontend/components/Item/CreateModal.vue b/frontend/components/Item/CreateModal.vue index 5d01462b..e8043cc6 100644 --- a/frontend/components/Item/CreateModal.vue +++ b/frontend/components/Item/CreateModal.vue @@ -141,20 +141,24 @@ } } - whenever( + watch( () => modal.value, - () => { - focused.value = true; - - if (locationId.value) { - const found = locations.value.find(l => l.id === locationId.value); - if (found) { - form.location = found; + (open) => { + if (open) { + useTimeoutFn(() => { focused.value = true }, 50); + + if (locationId.value) { + const found = locations.value.find(l => l.id === locationId.value); + if (found) { + form.location = found; + } } - } - - if (labelId.value) { - form.labels = labels.value.filter(l => l.id === labelId.value); + + if (labelId.value) { + form.labels = labels.value.filter(l => l.id === labelId.value); + } + } else { + focused.value = false; } } ); diff --git a/frontend/components/Label/CreateModal.vue b/frontend/components/Label/CreateModal.vue index 89d74354..d26bfb30 100644 --- a/frontend/components/Label/CreateModal.vue +++ b/frontend/components/Label/CreateModal.vue @@ -64,10 +64,13 @@ loading.value = false; } - whenever( + watch( () => modal.value, - () => { - focused.value = true; + (open) => { + if (open) + useTimeoutFn(() => { focused.value = true}, 50); + else + focused.value = false; } ); diff --git a/frontend/components/Location/CreateModal.vue b/frontend/components/Location/CreateModal.vue index 0552194a..f85e6617 100644 --- a/frontend/components/Location/CreateModal.vue +++ b/frontend/components/Location/CreateModal.vue @@ -59,10 +59,13 @@ parent: null as LocationSummary | null, }); - whenever( + watch( () => modal.value, - () => { - focused.value = true; + (open) => { + if (open) + useTimeoutFn(() => { focused.value = true}, 50); + else + focused.value = false; } ); From 448b3f00350cd5dada22536f0bcc664236700a3d Mon Sep 17 00:00:00 2001 From: Corknut Date: Sun, 12 Jan 2025 21:42:31 -0500 Subject: [PATCH 03/13] Made clicking outside to close modals optional --- frontend/components/Base/Modal.vue | 12 +++++++++--- frontend/components/global/QuickMenu/Modal.vue | 2 +- frontend/layouts/default.vue | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/frontend/components/Base/Modal.vue b/frontend/components/Base/Modal.vue index 6939f929..98e1db80 100644 --- a/frontend/components/Base/Modal.vue +++ b/frontend/components/Base/Modal.vue @@ -41,6 +41,10 @@ type: Boolean, default: true, }, + clickOutsideToClose: { + type: Boolean, + default: false, + } }); const modalBox = ref(); @@ -51,9 +55,11 @@ } } - onClickOutside(modalBox, () => { - close(); - }); + if (props.clickOutsideToClose) { + onClickOutside(modalBox, () => { + close(); + }); + } function close() { if (props.readonly) { diff --git a/frontend/components/global/QuickMenu/Modal.vue b/frontend/components/global/QuickMenu/Modal.vue index 5d094260..acf87797 100644 --- a/frontend/components/global/QuickMenu/Modal.vue +++ b/frontend/components/global/QuickMenu/Modal.vue @@ -1,5 +1,5 @@ @@ -28,7 +23,6 @@ }); const modal = useVModel(props, "modelValue"); - const selectedAction = ref(); const inputBox = ref({ focused: false, revealActions: () => {} }); @@ -37,7 +31,6 @@ }, 50).start; const onModalClose = () => { - selectedAction.value = undefined; inputBox.value.focused = false; }; @@ -51,8 +44,4 @@ modal.value = false; useTimeoutFn(action.action, 100).start(); } - - watch(selectedAction, action => { - if (action) invokeAction(action); - }); From 60bbe25a8ead93cc1d79ce9a580f9b2f43e57207 Mon Sep 17 00:00:00 2001 From: Corknut Date: Sun, 19 Jan 2025 20:58:41 -0500 Subject: [PATCH 09/13] Fix lint warning --- frontend/components/Form/Multiselect.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/components/Form/Multiselect.vue b/frontend/components/Form/Multiselect.vue index e5420a40..ad67c644 100644 --- a/frontend/components/Form/Multiselect.vue +++ b/frontend/components/Form/Multiselect.vue @@ -6,7 +6,7 @@