vue3-calendar-component
Version:
A comprehensive Vue 3 Calendar component with Vuetify 3, TypeScript, and advanced features
244 lines • 7.68 kB
TypeScript
import { Dayjs } from 'dayjs';
import { CalendarLocale } from './i18n';
export * from './i18n';
export interface GlobalSettings {
/**
* Global configuration for the calendar component.
* This configuration will be merged with the default calendar configuration.
*/
calendarConfig: Partial<CalendarConfig>;
/**
* Locale for the calendar component.
*/
locale: CalendarLocale;
}
interface CalendarComponentPropsBase {
config: CalendarConfig;
/**
* If set to true, drag and drop will be disabled
*/
readOnly?: boolean;
}
/**
* Interface shared across all calendar components.
* This interface defines the common properties that can be used to configure the calendar.
*/
export interface CalendarConfig {
firstDayOfWeek?: WeekDay;
/**
* Controls how the time grid in the week and day views is subdivided.
* This defines the duration of each time row in minutes.
* @example `30` for 30 minutes, `60` for 1 hour, etc
*/
timeSlotDuration?: number;
/**
* The lower bound of the time grid in the week and day views.
* This defines the earliest time that can be displayed in the calendar.
* @example "08:00" for 8 AM or "20:00" for 8 PM
*/
minTime?: string;
/**
* The upper bound of the time grid in the week and day views.
* This defines the latest time that can be displayed in the calendar.
* @example "18:00" for 6 PM or "23:59" for 11:59 PM
*/
maxTime?: string;
/**
* Whether to show week numbers in the calendar.
* If true, week numbers will be displayed in the month and week view.
*/
showWeekNumbers?: boolean;
/**
* Whether to show the time grid in the week and day views.
* If set to false, the gridlines and times will be hidden.
*/
showTimeGrid?: boolean;
timeGridDivisions?: number;
}
export interface ViewProps extends CalendarComponentPropsBase {
events: CalendarEventInternal[];
currentDate: Dayjs;
containerHeight?: number;
}
export interface CalendarComponentProps extends CalendarComponentPropsBase {
events?: CalendarEvent[];
view?: CalendarView;
currentDate?: string | Date | Dayjs;
filters?: FilterOptions;
/**
* Callback to notify the app that the date range has changed and thus new events should be loaded.
* This is useful for lazy loading events when the user navigates to a different date range
*/
lazyLoad?: LazyLoadHandler;
}
export interface CalendarFiltersProps {
filters: FilterOptions;
}
export interface CalendarToolbarButtonsProps {
currentDate: Dayjs;
currentView: CalendarView;
loading?: boolean;
}
export interface MonthEventViewProps extends CalendarComponentPropsBase {
event: CalendarEventInternal;
day: Dayjs;
handleEventClick: EventClickHandler;
handleDragStart: (event: CalendarEventInternal, target: EventTarget) => void;
}
export interface WeekEventViewProps extends CalendarComponentPropsBase {
event: CalendarEventInternal;
day: Dayjs;
dynamicTimeSlots: DynamicTimeSlots;
handleEventClick: EventClickHandler;
handleDragStart: (event: CalendarEventInternal, target: EventTarget) => void;
}
export interface DayEventViewProps extends CalendarComponentPropsBase {
event: CalendarEventInternal;
day: Dayjs;
dynamicTimeSlots: DynamicTimeSlots;
handleEventClick: EventClickHandler;
handleDragStart: (event: CalendarEventInternal, target: EventTarget) => void;
}
export type WeekViewProps = ViewProps;
export type MonthViewProps = ViewProps;
export type DayViewProps = ViewProps;
export type AgendaViewProps = ViewProps;
export interface SharedCalendarEmits {
(e: 'event-click', data: EventClickData): void;
(e: 'event-drop', data: EventDropData): void;
(e: 'date-click', data: DateClickData): void;
}
export interface CalendarComponentEmits extends SharedCalendarEmits {
(e: 'view-change', data: ViewChangeData): void;
(e: 'date-change', data: DateChangeData): void;
}
export type MonthViewEmits = SharedCalendarEmits;
export type WeekViewEmits = SharedCalendarEmits;
export interface DayViewEmits extends SharedCalendarEmits {
(e: 'time-slot-click', data: TimeSlotClickData): void;
}
export interface CalendarFiltersEmits {
(e: 'filters-change', data: FiltersChangeData): void;
}
export interface CalendarToolbarEmits {
(e: 'view-change', data: ViewChangeData): void;
(e: 'date-change', data: DateChangeData): void;
(e: 'navigate-previous'): void;
(e: 'navigate-next'): void;
(e: 'navigate-today'): void;
}
export type WeekDay = 'sunday' | 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday';
export type CalendarView = 'month' | 'week' | 'day' | 'agenda';
export type EventStatus = 'open' | 'planned' | 'completed' | 'overdue' | 'cancelled';
export interface CalendarEvent {
id: string;
title: string;
start: string | Date | any;
end?: string | Date | any;
allDay?: boolean;
color?: string;
backgroundColor?: string;
borderColor?: string;
textColor?: string;
icon?: string;
status?: EventStatus;
subtitle?: string;
description?: string;
location?: string;
recurring?: RecurringRule;
data?: Record<string, any>;
}
export interface RecurringRule {
frequency: 'daily' | 'weekly' | 'monthly' | 'yearly';
interval?: number;
count?: number;
until?: string | Date | any;
byDay?: number[];
byMonth?: number[];
}
export interface CalendarEventInternal extends CalendarEvent {
startDate: Dayjs;
endDate: Dayjs;
isAllDay: boolean;
}
export interface TimeSlot {
hour: number;
minute: number;
label: string;
}
export interface CalendarDay {
date: Date;
events: CalendarEventInternal[];
isCurrentMonth: boolean;
isToday: boolean;
isWeekend: boolean;
}
export interface CalendarWeek {
days: CalendarDay[];
weekNumber: number;
}
export interface CalendarMonth {
weeks: CalendarWeek[];
name: string;
year: number;
month: number;
}
export interface DateRangeData {
start: Date;
end: Date;
}
export interface FilterOptions {
search?: string;
statuses?: EventStatus[];
dateRange?: DateRangeData;
customFilter?: (event: CalendarEventInternal) => boolean;
}
export interface LazyLoadData {
start: Date;
end: Date;
view: CalendarView;
}
export interface DateClickData {
date: Dayjs;
nativeEvent: MouseEvent;
}
export interface EventClickData {
event: CalendarEventInternal;
nativeEvent: MouseEvent;
}
export interface EventDropData {
event: CalendarEventInternal;
newStart: Date;
newEnd: Date;
oldStart: Date;
oldEnd: Date;
}
export interface TimeSlotClickData {
date: Dayjs;
slot: TimeSlot;
}
export interface ViewChangeData {
newView: CalendarView;
oldView: CalendarView;
currentDate: Dayjs;
}
export interface DateChangeData {
newDate: Dayjs;
oldDate: Dayjs;
}
export interface FiltersChangeData {
filters: FilterOptions;
}
export type EventClickHandler = (data: EventClickData) => void;
export type EventDropHandler = (data: EventDropData) => void | Promise<void>;
export type DateClickHandler = (data: DateClickData) => void;
export type LazyLoadHandler = (data: LazyLoadData) => CalendarEvent[] | Promise<CalendarEvent[]>;
export type ViewChangeHandler = (data: ViewChangeData) => void;
export type DateChangeHandler = (data: DateChangeData) => void;
export interface DynamicTimeSlots {
height: number;
numberOfSlots: number;
minTime: number;
maxTime: number;
}
//# sourceMappingURL=index.d.ts.map