Files
homebox/frontend/components/App/QuickMenuModal.vue
Tonya d4e28e6f3b Upgrade frontend deps, including nuxt (#982)
* feat: begin upgrading deps, still very buggy

* feat: progress

* feat: sort all type issues

* fix: sort type issues

* fix: import sonner styles

* fix: nuxt is the enemy

* fix: try sorting issue with workflows

* fix: update vitest config for dynamic import of path and defineConfig

* fix: add missing import

* fix: add time out to try and fix issues

* fix: add ui:ci:preview task for frontend build in CI mode

* fix: i was silly

* feat: add go:ci:with-frontend task for CI mode and remove ui:ci:preview from e2e workflow

* fix: update baseURL in Playwright config for local testing to use port 7745

* fix: update E2E_BASE_URL and remove wait for timeout in login test for smoother execution
2025-09-04 09:00:25 +01:00

102 lines
3.1 KiB
Vue

<script setup lang="ts">
import { useI18n } from "vue-i18n";
import { DialogID, type NoParamDialogIDs, type OptionalDialogIDs } from "@/components/ui/dialog-provider/utils";
import {
CommandDialog,
CommandEmpty,
CommandGroup,
CommandInput,
CommandItem,
CommandList,
CommandSeparator,
} from "~/components/ui/command";
import { Shortcut } from "~/components/ui/shortcut";
import { useDialog, useDialogHotkey } from "~/components/ui/dialog-provider";
export type QuickMenuAction =
| { text: string; href: string; type: "navigate" }
| { text: string; dialogId: NoParamDialogIDs | OptionalDialogIDs; shortcut: string; type: "create" };
const props = defineProps({
actions: {
type: Array as PropType<QuickMenuAction[]>,
required: false,
default: () => [],
},
});
const { t } = useI18n();
const { closeDialog, openDialog } = useDialog();
useDialogHotkey(DialogID.QuickMenu, { code: "Backquote", ctrl: true });
</script>
<template>
<CommandDialog :dialog-id="DialogID.QuickMenu">
<CommandInput
:placeholder="t('components.quick_menu.shortcut_hint')"
@keydown="
(e: KeyboardEvent) => {
const item = props.actions.filter(item => 'shortcut' in item).find(item => item.shortcut === e.key);
if (item) {
e.preventDefault();
openDialog(item.dialogId as NoParamDialogIDs);
}
// if esc is pressed, close the dialog
if (e.key === 'Escape') {
e.preventDefault();
closeDialog(DialogID.QuickMenu);
}
}
"
/>
<CommandList>
<CommandSeparator />
<CommandEmpty>{{ t("components.quick_menu.no_results") }}</CommandEmpty>
<CommandGroup :heading="t('global.create')">
<CommandItem
v-for="(create, i) in props.actions.filter(item => item.type === 'create')"
:key="`$global.create_${i + 1}`"
:value="create.text"
@select="
e => {
e.preventDefault();
openDialog(create.dialogId as NoParamDialogIDs);
}
"
>
{{ create.text }}
<Shortcut v-if="'shortcut' in create" class="ml-auto" size="sm" :keys="[create.shortcut]" />
</CommandItem>
</CommandGroup>
<CommandSeparator />
<CommandGroup :heading="t('global.navigate')">
<CommandItem
v-for="(navigate, i) in props.actions.filter(item => item.type === 'navigate')"
:key="navigate.text"
:value="`global.navigate_${i + 1}`"
@select="
() => {
closeDialog(DialogID.QuickMenu);
navigateTo(navigate.href);
}
"
>
{{ navigate.text }}
</CommandItem>
<CommandItem
value="scanner"
@select="
() => {
closeDialog(DialogID.QuickMenu);
openDialog(DialogID.Scanner);
}
"
>
{{ t("menu.scanner") }}
</CommandItem>
</CommandGroup>
</CommandList>
</CommandDialog>
</template>