elk/components/common/dropdown/DropdownItem.vue

78 lines
1.4 KiB
Vue
Raw Permalink Normal View History

2022-11-24 08:34:05 +00:00
<script setup lang="ts">
2023-01-22 09:57:30 +00:00
const props = withDefaults(defineProps<{
is?: string
text?: string
2022-11-24 09:15:58 +00:00
description?: string
2022-11-24 08:34:05 +00:00
icon?: string
2022-11-24 09:15:58 +00:00
checked?: boolean
command?: boolean
2023-01-22 09:57:30 +00:00
}>(), {
is: 'div',
})
2022-11-24 08:34:05 +00:00
const emit = defineEmits(['click'])
2023-01-03 11:58:08 +00:00
const { hide } = useDropdownContext() || {}
2022-11-24 08:34:05 +00:00
const el = ref<HTMLDivElement>()
function handleClick(evt: MouseEvent) {
2022-11-26 05:05:44 +00:00
hide?.()
2022-11-24 08:34:05 +00:00
emit('click', evt)
}
useCommand({
scope: 'Actions',
order: -1,
visible: () => props.command && props.text,
name: () => props.text!,
icon: () => props.icon ?? 'i-ri:question-line',
description: () => props.description,
onActivate() {
const clickEvent = new MouseEvent('click', {
view: window,
bubbles: true,
cancelable: true,
})
el.value?.dispatchEvent(clickEvent)
},
})
2022-11-24 08:34:05 +00:00
</script>
<template>
2023-01-22 09:57:30 +00:00
<component
v-bind="$attrs"
:is="is"
ref="el"
w-full
flex gap-3 items-center cursor-pointer px4 py3
select-none
hover-bg-active
:aria-label="text"
2022-11-24 09:15:58 +00:00
@click="handleClick"
>
2022-11-24 08:34:05 +00:00
<div v-if="icon" :class="icon" />
2022-11-24 09:15:58 +00:00
<div flex="~ col">
2022-11-26 05:05:44 +00:00
<div text-15px>
<slot>
{{ text }}
</slot>
2022-11-24 09:15:58 +00:00
</div>
<div text-3 text-secondary>
2022-11-24 09:15:58 +00:00
<slot name="description">
<p v-if="description">
{{ description }}
</p>
</slot>
</div>
</div>
<div flex-auto />
<div v-if="checked" i-ri:check-line />
2022-11-26 12:58:10 +00:00
<slot name="actions" />
2023-01-22 09:57:30 +00:00
</component>
2022-11-24 08:34:05 +00:00
</template>