Files
homebox/frontend/components/App/QuickMenuModal.vue
Tonya cbaf483788 migrate pages to shadcn (#628)
* feat: migrate tools page and label generator to shadcn

* chore: lint issues

* feat: also do profile page

* feat: shadcn 404 page

* feat: login page shadcn

* fix: daisyui ironically breaks the z height for the login page

* feat: componentise the language selector and add it to the login page

* feat: use nuxtlink

* feat: card and table made more shadcn

* feat: shadcn statscard

* chore: lint

* feat: shadcn labelchip and locationcard

* feat: shadcn locations page

* refactor: remove unused new item page

* chore: lint

* feat: shadcn item card

* fix: wrapping of location and lint

* feat: ctrl enter in text area in form submits form

* feat: begin shadcn locations page and remove pageqrcode comp in favour of integrating it into labelmaker

* chore: lint + remove unused code

* fix: remove uneeded margin

* feat: shadcn labels page and fix some issues with location

* feat: shadcn scanner

* chore: lint

* feat: begin shadcning item pages

* feat: shadcn maintenance page

* feat: begin shadcn search page

* fix: quick switch blurry text and crashing page when switching + incorrect z height for create menu

* feat: finish shadcn search page

* chore: lint

* feat: shadcn edit item page

* fix: quickmenumodal bug

* feat: shadcn item details page

* feat: remove all non-color related daisyui classes

* fix: type error

* fix: quick menu modal again :(
2025-04-20 08:58:03 +01:00

90 lines
2.6 KiB
Vue

<script setup lang="ts">
import { useI18n } from "vue-i18n";
import {
CommandDialog,
CommandInput,
CommandList,
CommandEmpty,
CommandGroup,
CommandItem,
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: string; shortcut: string; type: "create" };
const props = defineProps({
actions: {
type: Array as PropType<QuickMenuAction[]>,
required: false,
default: () => [],
},
});
const { t } = useI18n();
const { closeDialog, openDialog } = useDialog();
useDialogHotkey("quick-menu", { code: "Backquote", ctrl: true });
</script>
<template>
<CommandDialog dialog-id="quick-menu">
<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);
}
// if esc is pressed, close the dialog
if (e.key === 'Escape') {
e.preventDefault();
closeDialog('quick-menu');
}
}
"
/>
<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);
}
"
>
{{ 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('quick-menu');
navigateTo(navigate.href);
}
"
>
{{ navigate.text }}
</CommandItem>
</CommandGroup>
</CommandList>
</CommandDialog>
</template>