f7fc54c070
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
31 lines
967 B
TypeScript
31 lines
967 B
TypeScript
import {onBeforeUnmount, onMounted, ref, type Ref} from 'vue'
|
|
|
|
export function useCalendarPopover(rootRef: Ref<HTMLElement | null>) {
|
|
const isOpen = ref(false)
|
|
const viewMode = ref<'days' | 'months' | 'years'>('days')
|
|
|
|
const open = () => {
|
|
isOpen.value = true
|
|
viewMode.value = 'days'
|
|
}
|
|
const close = () => {
|
|
isOpen.value = false
|
|
viewMode.value = 'days'
|
|
}
|
|
const goToHigherView = () => {
|
|
if (viewMode.value === 'days') viewMode.value = 'months'
|
|
else if (viewMode.value === 'months') viewMode.value = 'years'
|
|
// 'years' : niveau le plus haut, no-op
|
|
}
|
|
|
|
const onMouseDown = (event: MouseEvent) => {
|
|
if (!isOpen.value || !rootRef.value) return
|
|
if (!rootRef.value.contains(event.target as Node)) close()
|
|
}
|
|
|
|
onMounted(() => document.addEventListener('mousedown', onMouseDown))
|
|
onBeforeUnmount(() => document.removeEventListener('mousedown', onMouseDown))
|
|
|
|
return {isOpen, viewMode, open, close, goToHigherView}
|
|
}
|