Skip to content

useScheduleCalendarHost

ScheduleCalendar의 emit-only 아키텍처를 위한 핵심 composable입니다. 뷰 상태를 소비자가 소유하고 컴포넌트와 연결합니다.

Vue 컴포넌트 없이 로직만 필요하다면 @vuepkg/calendar/headless에서 동일하게 import할 수 있습니다.

시그니처

ts
function useScheduleCalendarHost(
  options?: UseScheduleCalendarHostOptions
): ScheduleCalendarHostContext

옵션 (UseScheduleCalendarHostOptions)

옵션타입기본값설명
initialViewCalendarView'month'초기 뷰
initialDateDate오늘초기 날짜
initialListFilterDateDate | nullnullList 뷰 필터 초기값
initialViewScopeViewScope'company'View Option 초기값
initialScheduleTypesstring[] | nullnull일정 유형 필터 초기값
onQueryChange(payload) => voidAPI 조회 트리거
onScheduleClick(payload) => void일정 클릭 — 미지정 시 payload.date로 날짜 이동
onOverflowClick(payload) => void+N 클릭 — 미지정 시 팝오버만 표시
onTimeSlotSelect(payload) => void빈 셀 클릭 (일정 생성 UX)
onScheduleMove(payload) => voidDnD 이동 완료
onScheduleResize(payload) => voidDnD 리사이즈 완료

반환값 (ScheduleCalendarHostContext)

타입설명
viewRef<CalendarView>현재 뷰 (v-model:view와 바인딩)
dateRef<Date>선택 날짜 (v-model:date와 바인딩)
listFilterDateRef<Date | null>List 뷰 필터 날짜
viewScopeRef<ViewScope>View Option
scheduleTypesRef<string[] | null>일정 유형 필터
calendarListenersScheduleCalendarHostListenersv-bind로 spread할 이벤트 핸들러 묶음
handlersScheduleCalendarHostHandlers개별 핸들러 (필요시 직접 연결)

사용 예

vue
<script setup lang="ts">
import { ref } from 'vue'
import { useScheduleCalendarHost } from '@vuepkg/calendar'
import type { Schedule } from '@vuepkg/calendar'

const schedules = ref<Schedule[]>([])

const { view, date, viewScope, calendarListeners } = useScheduleCalendarHost({
  initialView: 'week',

  onQueryChange({ view, range, viewScope, scheduleTypes }) {
    // range.start ~ range.end 기간으로 API 호출
    fetchSchedules({ start: range.start, end: range.end, viewScope, scheduleTypes })
      .then((data) => { schedules.value = data })
  },

  onScheduleMove({ schedule, newStart, newEnd }) {
    schedules.value = schedules.value.map((s) =>
      s.id === schedule.id ? { ...s, start: newStart, end: newEnd } : s,
    )
  },

  onScheduleResize({ schedule, newEnd }) {
    schedules.value = schedules.value.map((s) =>
      s.id === schedule.id ? { ...s, end: newEnd } : s,
    )
  },
})
</script>

<template>
  <ScheduleCalendar
    v-model:view="view"
    v-model:date="date"
    v-model:view-scope="viewScope"
    :schedules="schedules"
    v-bind="calendarListeners"
  />
</template>

내장 동작

useScheduleCalendarHost는 다음 동작을 자동으로 처리합니다:

이벤트기본 동작
navigatedate.value 갱신
view-changeview.value 갱신; List→비List 전환 시 listFilterDate 초기화
date-selectdate.value 갱신; week-day-header 클릭 시 view.value = 'day'
list-filter-clearlistFilterDate.value = null
schedule-clickonScheduleClick 미지정 시 payload.date로 날짜 이동

Released under the MIT License.