<template> <q-expansion-item v-if="isGranted(entry)" clickable :label="getTitle(entry)" :icon="entry.icon" expand-separator > <q-list class="q-ml-lg"> <div v-for="child in entry.children" :key="child.link"> <q-item v-if="isGranted(child)" clickable :to="{ name: child.link }"> <q-menu context-menu> <q-btn v-close-popup label="Verknüpfung erstellen" dense @click="addShortCut(child)" /> </q-menu> <q-item-section avatar> <q-icon :name="child.icon" /> </q-item-section> <q-item-section> <q-item-label> {{ getTitle(child) }} </q-item-label> </q-item-section> </q-item> </div> </q-list> </q-expansion-item> </template> <script lang="ts"> import { defineComponent, PropType } from 'vue'; import { FG_Plugin } from '@flaschengeist/types'; import { useMainStore } from 'app/api'; export default defineComponent({ name: 'EssentialExpansionLink', components: {}, props: { entry: { type: Object as PropType<FG_Plugin.MenuLink>, required: true, }, }, emits: { addShortCut: (val: FG_Plugin.MenuLink) => val.link, }, setup(props, { emit }) { const store = useMainStore(); function isGranted(val: FG_Plugin.MenuLink) { return !val.permissions || val.permissions.every((p) => store.permissions.includes(p)); } function getTitle(entry: FG_Plugin.MenuLink) { return typeof entry.title === 'function' ? entry.title() : entry.title; } function addShortCut(val: FG_Plugin.MenuLink) { emit('addShortCut', val); } return { isGranted, getTitle, addShortCut }; }, }); </script>