Skip to content

ScheduleCalendar

메인 캘린더 컴포넌트입니다. Month / Week / Day / List 뷰를 포함합니다.

Props

prop타입기본값필수설명
schedulesSchedule[]표시할 일정 목록 (부모가 scope·CRUD 반영 후 전달)
holidaysHoliday[] | undefined사내 기념일 등 — API 결과와 병합됩니다
fetchPublicHolidaysbooleanfalse공공데이터포털 공휴일 API 자동 조회.
기본 false — 사용하려면 명시적으로 true를 전달하세요.
true이면 date v-model 기준 연도별 1회만 요청합니다.
publicHolidayServiceKeystring | undefined공공데이터포털 인증키 — proxy/BFF 사용 시 생략.
직접 외부 API URL 호출 시에만 전달합니다.
hideToolbarboolean | undefinedtrue이면 뷰 전환 툴바(Month / Week / Day / List)를 숨깁니다.
부모가 v-model:view로 뷰를 직접 제어하는 임베딩 시나리오에서 사용합니다.
scheduleTypeOptionsScheduleTypeOption[] | undefined일정 유형 목록 — 칩·바의 색상과 List 뷰 라벨에 사용됩니다.
기본값은 SCHEDULE_TYPE_OPTIONS (my/team/company 3종).
커스텀 타입을 추가하려면 기본값을 spread 후 항목을 추가하세요:
[...SCHEDULE_TYPE_OPTIONS, { type: 'project', label: '프로젝트', color: '...', backgroundColor: '...' }]
monthWeekCountMonthWeekCount6월간 뷰에 표시할 주(week) 수 — 기본 6(전체 월).
2|3이면 date v-model 기준 선택 날짜가 포함된 주부터 축소 표시합니다.
weekdayLabelsstring[] | undefined월간 뷰 요일 헤더 라벨 (일~토 순서 7개).
명시하면 locale 자동 현지화보다 우선 적용됩니다. 기본 영문 축약형 (SUN~SAT).
startHournumber | undefinedWeek/Day 시간 그리드 시작 시각 (0~23) — 기본 0
endHournumber | undefinedWeek/Day 시간 그리드 종료 시각 (0~23) — 기본 23
localestring | undefinedIntl.DateTimeFormat locale (예: 'ko-KR') — 월간 뷰 요일 헤더, Week/Day 요일 라벨을 자동 현지화합니다.
weekdayLabels를 명시하면 월간 뷰는 그 값이 우선합니다. 브라우저 Intl API 기반이라 zero-dep 유지.
displayTimezonestring | undefined표시 타임존(F4-8) — IANA 타임존 이름(예: 'America/New_York').
미지정 시 브라우저 시스템 타임존(기존 동작, 100% 하위호환).
Month/Week/Day/List의 날짜 배치·시간 위치·"오늘" 판정에 반영됩니다.
v1 제약: 일정 생성(드래그 슬롯 선택)·드래그 이동/리사이즈는 계속 브라우저 로컬 기준입니다(v1.1 예정).
Intl.DateTimeFormat이 인식하지 못하는 이름을 넘기면 개발 모드에서 경고 후 브라우저 로컬로 폴백합니다.

v-model

v-model타입기본값설명
v-model:viewCalendarView"month"현재 뷰 (Month/Week/Day/List)
v-model:dateDatestartOfDay(new Date())현재 선택 날짜
v-model:listFilterDateDate | nullnullList 뷰 날짜 필터 — null이면 필터 없음(선택 월 전체 표시)
v-model:viewScopeViewScope"company"View Option — My / Company 필터
v-model:scheduleTypesstring[] | nullnull일정 유형 필터 — null이면 전체 유형, 빈 배열이면 결과 없음

Emits

emitpayload설명
view-changeCalendarViewChangePayloadMonth/Week/Day/List 탭 클릭
date-selectCalendarDateSelectPayload월간 셀, Week 날짜 헤더 클릭
overflow-clickCalendarOverflowClickPayload월간 +N 클릭
schedule-clickCalendarScheduleClickPayload칩·All Day 바·시간 일정·List 행 클릭
navigateCalendarNavigatePayloadToday·‹›(이전/다음) 버튼 클릭 — Month/Week/Day
list-filter-clearList 뷰 날짜 필터 바 Clear 클릭
query-changeScheduleQueryChangePayloadView Option·Schedule Type·기간 포함 — 부모 API 조회용
time-slot-selectCalendarTimeSlotSelectPayloadWeek/Day 시간 그리드 빈 셀 클릭 — 일정 생성 등에 start/end 전달
schedule-moveCalendarScheduleMovePayloadWeek/Day 시간 그리드 — 드래그로 이벤트 이동 확정
schedule-resizeCalendarScheduleResizePayloadWeek/Day 시간 그리드 — 드래그로 이벤트 end 시각 리사이즈 확정

Slots

상세 slot props 필드는 architecture.md § Scoped Slots 참고.

slotprops 타입설명
#toolbarToolbarSlotProps뷰 전환 UI 전체를 대체합니다. 기본 콘텐츠는 CalendarToolbar(Month/Week/Day/List 탭).
#day-cellDayCellSlotProps월간 셀 내부 콘텐츠(날짜 숫자·이벤트 목록)를 대체합니다. role="gridcell" 셸은 유지됩니다.
#eventEventSlotProps칩·All Day 바·시간 그리드 블록의 표시 콘텐츠를 대체합니다. 클릭/DnD 인터랙션 래퍼는 유지됩니다.
#month-overflow-itemMonthOverflowItemSlotProps월간 +N 팝오버 목록 항목의 콘텐츠를 대체합니다.
#list-cell-noListCellSlotPropsList 뷰 No 컬럼 셀 내부 콘텐츠를 대체합니다. 행 클릭·키보드 인터랙션은 유지됩니다 (REV-A3).
#list-cell-titleListCellSlotPropsList 뷰 Title 컬럼 셀 내부 콘텐츠를 대체합니다.
#list-cell-typeListCellSlotPropsList 뷰 Type 컬럼 셀 내부 콘텐츠를 대체합니다.
#list-cell-participantListCellSlotPropsList 뷰 Participant 컬럼 셀 내부 콘텐츠를 대체합니다.
#list-cell-periodListCellSlotPropsList 뷰 Period 컬럼 셀 내부 콘텐츠를 대체합니다.

이 표는 ScheduleCalendar.vue의 타입에서 vue-component-meta로 자동 생성됩니다(F3-2) — prop/emit/slot을 추가·변경했는데 이 표가 갱신되지 않는 문서 drift를 CI가 차단합니다. 직접 수정하지 말고 pnpm --filter @vuepkg/calendar run docs:api로 재생성하세요.

CalendarView 타입

ts
type CalendarView = 'month' | 'week' | 'day' | 'list'

사용 예

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

const schedules = ref<Schedule[]>([])
const { view, date, calendarListeners } = useScheduleCalendarHost({
  onQueryChange({ range }) {
    // API 호출: range.start ~ range.end 범위 일정 조회
  },
})
</script>

<template>
  <div style="height: 700px;">
    <ScheduleCalendar
      v-model:view="view"
      v-model:date="date"
      :schedules="schedules"
      v-bind="calendarListeners"
    />
  </div>
</template>

Released under the MIT License.