mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-01 19:48:08 +00:00
53 lines
1.7 KiB
Vue
53 lines
1.7 KiB
Vue
<script setup>
|
|
import { isVNode, computed } from 'vue';
|
|
import Icon from 'next/icon/Icon.vue';
|
|
import Policy from 'dashboard/components/policy.vue';
|
|
import { useSidebarContext } from './provider';
|
|
|
|
const props = defineProps({
|
|
label: { type: String, required: true },
|
|
to: { type: [String, Object], required: true },
|
|
icon: { type: [String, Object], default: null },
|
|
active: { type: Boolean, default: false },
|
|
component: { type: Function, default: null },
|
|
});
|
|
|
|
const { resolvePermissions, resolveFeatureFlag } = useSidebarContext();
|
|
|
|
const shouldRenderComponent = computed(() => {
|
|
return typeof props.component === 'function' || isVNode(props.component);
|
|
});
|
|
</script>
|
|
|
|
<!-- eslint-disable-next-line vue/no-root-v-if -->
|
|
<template>
|
|
<Policy
|
|
:permissions="resolvePermissions(to)"
|
|
:feature-flag="resolveFeatureFlag(to)"
|
|
as="li"
|
|
class="py-0.5 ltr:pl-3 rtl:pr-3 rtl:mr-3 ltr:ml-3 relative text-n-slate-11 child-item before:bg-n-slate-4 after:bg-transparent after:border-n-slate-4 before:left-0 rtl:before:right-0"
|
|
>
|
|
<component
|
|
:is="to ? 'router-link' : 'div'"
|
|
:to="to"
|
|
:title="label"
|
|
class="flex h-8 items-center gap-2 px-2 py-1 rounded-lg max-w-[9.438rem] hover:bg-gradient-to-r from-transparent via-n-slate-3/70 to-n-slate-3/70 group"
|
|
:class="{
|
|
'text-n-blue-text bg-n-alpha-2 active': active,
|
|
}"
|
|
>
|
|
<component
|
|
:is="component"
|
|
v-if="shouldRenderComponent"
|
|
:label
|
|
:icon
|
|
:active
|
|
/>
|
|
<template v-else>
|
|
<Icon v-if="icon" :icon="icon" class="size-4 inline-block" />
|
|
<div class="flex-1 truncate min-w-0">{{ label }}</div>
|
|
</template>
|
|
</component>
|
|
</Policy>
|
|
</template>
|