useCalendarApp ๋ ํผ๋ฐ์ค
useCalendarApp(config: CalendarAppConfig)์ DayFlow ์ฝ์ด๋ฅผ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์ฐ๊ฒฐํด ์ฃผ๋ ํ
์
๋๋ค. ์ค์ ๊ฐ์ฒด ํ๋๋ฅผ ์ ๋ฌํด ๋ทฐ๋ฅผ ๋ฑ๋กํ๊ณ , ์ด๊ธฐ ์ด๋ฒคํธ๋ฅผ ๋ฃ๊ณ , ์ ํ์ UI๋ฅผ ์ผ๊ณ , ์๋ช
์ฃผ๊ธฐ ์ฝ๋ฐฑ์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด ๋ฌธ์์์๋ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์ต์
์ ์ดํด๋ด
๋๋ค.
๋น ๋ฅธ ์์
import {
useCalendarApp,
DayFlowCalendar,
createMonthView,
createWeekView,
ViewType,
} from '@dayflow/react';
import '@dayflow/core/dist/styles.css';
export function TeamCalendar() {
const calendar = useCalendarApp({
views: [createMonthView(), createWeekView()],
defaultView: ViewType.MONTH,
initialDate: new Date(),
events: [],
});
return <DayFlowCalendar calendar={calendar} />;
}<template>
<DayFlowCalendar :calendar="calendar" />
</template>
<script setup>
import { DayFlowCalendar, useCalendarApp } from '@dayflow/vue';
import { createMonthView, createWeekView, ViewType } from '@dayflow/core';
import '@dayflow/core/dist/styles.css';
const calendar = useCalendarApp({
views: [createMonthView(), createWeekView()],
defaultView: ViewType.MONTH,
initialDate: new Date(),
events: [],
});
</script>import { Component } from '@angular/core';
import { createMonthView, createWeekView, ViewType } from '@dayflow/core';
import { DayFlowCalendarModule } from '@dayflow/angular';
import '@dayflow/core/dist/styles.css';
@Component({
selector: 'app-root',
standalone: true,
imports: [DayFlowCalendarModule],
template: `
<dayflow-calendar [calendar]="calendar"></dayflow-calendar>
`
})
export class AppComponent {
calendar = {
views: [createMonthView(), createWeekView()],
defaultView: ViewType.MONTH,
initialDate: new Date(),
events: [],
};
}<script>
import { DayFlowCalendar, useCalendarApp } from '@dayflow/svelte';
import { createMonthView, createWeekView, ViewType } from '@dayflow/core';
import '@dayflow/core/dist/styles.css';
const calendar = useCalendarApp({
views: [createMonthView(), createWeekView()],
defaultView: ViewType.MONTH,
initialDate: new Date(),
events: [],
});
</script>
<DayFlowCalendar {calendar} />์ค์ ํ๋์ ๋ณด๊ธฐ
| ์ต์ | ํ์ | ํ์ ์ฌ๋ถ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|---|---|
views | CalendarView[] | ํ์ | โ | ๋ทฐ ์ ์๋ฅผ ๋ฑ๋กํฉ๋๋ค(์: createMonthView()). ์ต์ ํ๋๋ ์์ด์ผ ํฉ๋๋ค. |
plugins | CalendarPlugin[] | ์ ํ | [] | ์ ํ์ ํ๋ฌ๊ทธ์ธ(๋๋๊ทธ ๋์ฐ๋ฏธ, ๋จ์ถํค ๋ฑ)์ ์ค์นํฉ๋๋ค. ๊ฐ ํ๋ฌ๊ทธ์ธ์ install ์์ ์ ์ฑ ์ธ์คํด์ค๋ฅผ ์ ๋ฌ๋ฐ์ต๋๋ค. |
events | Event[] | ์ ํ | [] | ์ด๊ธฐ ์ด๋ฒคํธ ๋ชฉ๋ก์
๋๋ค. ์ดํ์๋ addEvent/updateEvent๋ก ์ํ๋ฅผ ๋ณ๊ฒฝํ์ธ์. |
callbacks | CalendarCallbacks | ์ ํ | {} | ๋ทฐยท๋ ์งยท์ด๋ฒคํธ๊ฐ ๋ฐ๋ ๋ ์คํ๋๋ ์๋ช ์ฃผ๊ธฐ ํ ์ ๋๋ค. API์ ๋๊ธฐํํ๊ธฐ์ ์ ํฉํฉ๋๋ค. |
defaultView | ViewType | ์ ํ | ViewType.WEEK | ์ฒ์ ๋ก๋๋๋ ๋ทฐ์
๋๋ค. views์ ํฌํจ๋์ด ์์ด์ผ ํฉ๋๋ค. |
initialDate | Date | ์ ํ | new Date() | ์ฒ์ ํฌ์ปค์คํ ๋ ์ง์ ๋๋ค(ํ์ํ ์ ๊ณ์ฐ์ ๊ธฐ์ค์ด๊ธฐ๋ ํฉ๋๋ค). |
timeZone | string | ์ ํ | ์ฌ์ฉ์์ ์์คํ ์๊ฐ๋ | ๋ชจ๋ ๋ทฐ์์ ์ฌ์ฉํ๋ ์ ์ญ ํ์ยทํธ์ง ์๊ฐ๋์ ๋๋ค. |
timeFormat | '12h' | '24h' | ์ ํ | โ | ๋ชจ๋ ๋ทฐยท๊ฒ์ยท์ปดํฌ๋ํธ์ ์ ์ฉ๋๋ ์ ์ญ ์๊ฐ ํ์์ ๋๋ค. ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ทฐ ๋จ์๋ ๊ฒ์ ๋จ์ ์ค์ ์ ๋ฎ์ด์๋๋ค. |
switcherMode | 'buttons' | 'select' | ์ ํ | 'buttons' | ํค๋์ ๋ด์ฅ๋ ๋ทฐ ์ ํ๊ธฐ์ ํ์ ๋ฐฉ์์ ์ ์ดํฉ๋๋ค. |
calendars | CalendarType[] | ์ ํ | [] | ์บ๋ฆฐ๋ ๋ถ๋ฅ(์ ๋ฌด, ๊ฐ์ธ ๋ฑ)๋ฅผ ์์ยทํ์ ์ฌ๋ถ์ ํจ๊ป ๋ฑ๋กํฉ๋๋ค. |
defaultCalendar | string | ์ ํ | ์ฒ์ ํ์๋๋ ์บ๋ฆฐ๋ | ์ ์ด๋ฒคํธ๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ ID์ ๋๋ค. |
theme | ThemeConfig | ์ ํ | { mode: 'light' } | ์ ์ญ ํ ๋ง ๋ชจ๋์ ํ์ ์ ํ ํฐ ์ฌ์ ์๋ฅผ ์ค์ ํฉ๋๋ค. |
locale | string | Locale | ์ ํ | 'en-US' | ๊ตญ์ ํ(i18n)์ ์ฌ์ฉํ ๋ก์ผ์ผ์ ์ค์ ํฉ๋๋ค. ์ธ์ด ์ฝ๋(์: 'ja')๋ Locale ๊ฐ์ฒด๋ฅผ ์ง์ํฉ๋๋ค. |
useEventDetailDialog | boolean | ์ ํ | false | ์ธ๋ผ์ธ ํจ๋ ๋์ ๊ธฐ๋ณธ ๋ชจ๋ฌ ์์ธ ๋ํ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
eventDetailTrigger | 'click' | 'dbClick' | ์ ํ | 'dbClick' | ๋ฐ์คํฌํฑ์์ ์ด๋ฒคํธ ์์ธ๋ฅผ ํ ๋ฒ ํด๋ฆญ์ผ๋ก ์ด์ง ๋๋ธ ํด๋ฆญ์ผ๋ก ์ด์ง ๊ฒฐ์ ํฉ๋๋ค. ํฐ์น ์ ๋ ฅ์์๋ ํญ์ ํ ๋ฒ ํญํ๋ฉด ์ด๋ฆฝ๋๋ค. |
useCalendarHeader | boolean | ์ ํ | true | ๊ธฐ๋ณธ ํค๋๋ฅผ ํ์ํ๊ฑฐ๋(true) ์จ๊น๋๋ค(false). ์ง์ ๋ง๋ ํค๋๋ฅผ ์ฐ๋ ค๋ฉด DayFlowCalendar์ calendarHeader ์ฌ๋กฏ์ ์ฌ์ฉํ์ธ์. |
readOnly | boolean | ReadOnlyConfig | ์ ํ | false | ๋ด์ฅ ํธ์ง UI๋ฅผ ๋นํ์ฑํํฉ๋๋ค. ๋ถ๋ฆฌ์ธ์ด๋ ์ธ๋ถ ์ ์ด์ฉ ์ค์ (๋๋๊ทธ/์กฐํ)์ ์ง์ ํ ์ ์์ต๋๋ค. ์ฝ๋์์ ํธ์ถํ๋ ์ด๋ฒคํธ API๋ ๊ณ์ ๋์ํฉ๋๋ค. |
allDaySortComparator | AllDaySortComparator | ์ ํ | ์บ๋ฆฐ๋ ๊ทธ๋ฃน ์์, ์ฌ๋ฌ ๋ ์ข ์ผ ์ด๋ฒคํธ๊ฐ ๋จผ์ | ๋ชจ๋ ๋ทฐ์์ ์ข ์ผ ์ด๋ฒคํธ ํ์ ์ ๋ ฌ ์์๋ฅผ ์ ์ดํ๋ ์ฌ์ฉ์ ์ ์ ๋น๊ต ํจ์์ ๋๋ค. ์ง์ ํ๋ฉด ๊ธฐ๋ณธ ์ ๋ ฌ์ ์์ ํ ๋์ฒดํฉ๋๋ค. |
์ฃผ์ ์ต์
Views (ํ์)
- ๊ฐ ๋ทฐ๋
{ type, component, config }ํํ์CalendarView๊ฐ์ฒด์ ๋๋ค. - DayFlow๋ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ์ ์๋ฅผ ๋ฐํํ๋ ํฉํ ๋ฆฌ(
createDayView,createWeekView,createMonthView,createAgendaView,createYearView)๋ฅผ ์ ๊ณตํฉ๋๋ค. defaultView๋ ๋ฑ๋ก๋ ๋ทฐ ํ์ ์ค ํ๋์ ์ผ์นํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด๊ธฐํ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Events
- ์ ๋ฌํ ๋ฐฐ์ด์ด ๋ฉ๋ชจ๋ฆฌ์์
CalendarApp.state.events๋ชฉ๋ก์ด ๋ฉ๋๋ค. useCalendarApp์ ์ฑ์ ๋ณ๊ฒฝ์ ๊ฐ์ํ๋ฏ๋กcalendar.addEvent()๋calendar.updateEvent()๋ฅผ ํธ์ถํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ํ๊ฐ ์๋์ผ๋ก ๋๊ธฐํ๋ฉ๋๋ค.- ์ด๋ฒคํธ๊ฐ
Event์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ฅด๋์ง ํ์ธํ์ธ์(start/end๋PlainDate,PlainDateTime,ZonedDateTime์ ๋ฐ์ต๋๋ค).
Plugins
- ํ๋ฌ๊ทธ์ธ์
{ name, install(app), config }ํํ์ด๋ฉฐ ์์ฑ ์ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค. - ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋๋๊ทธ ํธ๋ค๋ฌ, ํค๋ณด๋ ๋จ์ถํค, ๋ถ์ ์ต์ ๋ฒ๋ฅผ ๋ฑ๋กํ๊ฑฐ๋
app.getPlugin(name)์ผ๋ก ์์ฒด API๋ฅผ ๋ ธ์ถํ ์ ์์ต๋๋ค.
Callbacks
callbacks๋ ์ํ๋ฅผ ๋ฐฑ์๋๋ ๋ถ์ ๊ณ์ธต๊ณผ ๋๊ธฐํ๋ ์ํ๋ก ์ ์งํด ์ค๋๋ค:
onViewChange(view)๋ ๋ทฐ ์ ํ์ด ์ฑ๊ณตํ ๋ค์ ํธ์ถ๋ฉ๋๋ค.onDateChange(date)๋ ํฌ์ปค์ค๋ ๋ ์ง๊ฐ ๋ฐ๋ ๋๋ง๋ค ํธ์ถ๋ฉ๋๋ค(์ด๋ ๋๋ ์ ํ).onVisibleRangeChange(start, end, reason)์ ํ์ ์ค์ธ ๋ ์ง ๋ฒ์๊ฐ ๋ฐ๋ ๋ ํธ์ถ๋ฉ๋๋ค. ๋ณ๋ ๊ณ์ฐ ์์ด ๋ ์ ํํ ๋ฒ์๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.onEventCreate(event),onEventUpdate(event),onEventDelete(id)๋ CRUD ์์ ์ ๋์ํฉ๋๋ค. API ๋๊ธฐํ์ ์ ํฉํฉ๋๋ค.onEventDoubleClick(event, e)๋ ๊ธฐ๋ณธ ๋ชจ๋์ธeventDetailTrigger: 'dbClick'์์ ์ด๋ฒคํธ๋ฅผ ๋๋ธ ํด๋ฆญํ ๋ ํธ์ถ๋ฉ๋๋ค. ์ธ๋ถ ํ์ค๋ฒ์ ๊ธฐ์ค์ ์ผ๋กe.currentTarget์ ์ฌ์ฉํ๊ณ , DayFlow ๊ธฐ๋ณธ ์์ธ ํจ๋ยท๋ํ์์๋ฅผ ๋ง์ผ๋ ค๋ฉดfalse๋ฅผ ๋ฐํํ์ธ์.onMoreEventsClick(date)๋ ์ ๋ทฐ์์ "+ X๊ฐ ๋" ๋งํฌ๋ฅผ ํด๋ฆญํ ๋ ํธ์ถ๋ฉ๋๋ค.onCalendarCreate(calendar),onCalendarUpdate(calendar),onCalendarDelete(id)๋ ์บ๋ฆฐ๋ CRUD ์์ ์ ๋์ํฉ๋๋ค.onCalendarMerge(sourceId, targetId)๋ ๋ ์บ๋ฆฐ๋๋ฅผ ๋ณํฉํ ๋ ํธ์ถ๋ฉ๋๋ค(์: "์ ๋ฌด"๋ฅผ "๊ฐ์ธ"์ ํฉ์น๋ ๊ฒฝ์ฐ).onRender()๋ ์บ๋ฆฐ๋๊ฐ ๋ ๋๋ง์ ํ ์ฐจ๋ก ๋ง์ณค์ ๋ ์คํ๋ฉ๋๋ค(๊ณ์ธก์ ์ ์ฉํฉ๋๋ค).
defaultView์ initialDate
defaultView๋ ์ด๊ธฐstate.currentView๋ฅผ ์ ํฉ๋๋ค. ์ง์ ํ์ง ์์ผ๋ฉด DayFlow๊ฐViewType.WEEK๋ก ๋๋์๊ฐ๋ฏ๋ก, ๋ทฐ๊ฐ ํ๋๋ฟ์ธ ์บ๋ฆฐ๋์์๋ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ธ์.initialDate๋state.currentDate์ ๋ด๋ถvisibleMonth๋ฅผ ํจ๊ป ์ด๊ธฐํํฉ๋๋ค. ๋ผ์ฐํ ์ด๋ ์ฌ์ฉ์ ์ค์ ์์ ๋ ์ง๋ฅผ ๊ฐ์ ธ์จ๋ค๋ฉด ์ด ๊ฐ์ ๋ฐ๊พธ์ธ์.
timeZone
timeZone์ ์ผยท์ฃผยท์ยท์์ ๋คยท์ฐ๊ฐ ๋ทฐ์ ๊ธฐ๋ณธ ํ์ ๋ฐ ํธ์ง ์๊ฐ๋๋ฅผ ์ ํฉ๋๋ค.- ์ง์ ํ์ง ์์ผ๋ฉด DayFlow๊ฐ ์ฌ์ฉ์์ ์์คํ ์๊ฐ๋์์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
timeZone์ ๋ฐ๊พธ๋ฉด UI๊ฐ ๋ค์ ๊ณ์ฐ๋์ด ํ์๋์ง๋ง, ๊ทธ ์์ฒด๋ก ์ด๋ฒคํธ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ง๋ ์์ต๋๋ค.- ๋ณ๊ฒฝ์ด ์ ์ฉ๋ ๋ค์๋ ํธ์ง ์ฝ๋ฐฑ์ ์ ๊ทํ๋ ์ด๋ฒคํธ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค. DayFlow๋ ์์ ํ์์ฉ ์๊ฐ๋๋ฅผ ์ ์ฅ ํํ๋ก ๋จ๊ธฐ์ง ์์ต๋๋ค.
- ์ผยท์ฃผ ๋ทฐ์
secondaryTimeZone์ ํ์ ์ ์ฉ ์ฐธ์กฐ ์ถ์ผ ๋ฟ์ด๋ฉฐ, ์ฑ์ ๊ธฐ๋ณธ ์๊ฐ๋๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค.
switcherMode
'buttons': ๊ฐ๋ก ๋ฒํผ ๊ทธ๋ฃน์ผ๋ก ํ์ํฉ๋๋ค. ๋ฐ์คํฌํฑ์ ์ ํฉํฉ๋๋ค.'select': ๋๋กญ๋ค์ด์ผ๋ก ํ์ํฉ๋๋ค. ๊ณต๊ฐ์ด ๋ถ์กฑํ๊ฑฐ๋ ๋ทฐ ํ์ ์ด ๋ง์ ๋ ์ ์ฉํฉ๋๋ค.
calendars์ defaultCalendar
calendars๋ ๊ฐ ์บ๋ฆฐ๋ ํ์ (id,name,colors, ํ์ ์ฌ๋ถ)์ ์ ์ํฉ๋๋ค. ์บ๋ฆฐ๋ ๋ ์ง์คํธ๋ฆฌ๊ฐtheme.mode('light' | 'dark' | 'auto')์ ๋ฐ๋ผ ๋ฐ์ ์์๊ณผ ์ด๋์ด ์์์ ์๋์ผ๋ก ์ ํํฉ๋๋ค.defaultCalendar๋ ์ ์ด๋ฒคํธ๊ฐ ์ด๋ค ์บ๋ฆฐ๋๋ฅผ ์์ํ ์ง ์ ํฉ๋๋ค. ์ง์ ํ์ง ์์ผ๋ฉด ์ฒ์ ํ์๋๋ ์บ๋ฆฐ๋๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
CalendarType์ ์์ฑ:
| ์์ฑ | ํ์ | ํ์ ์ฌ๋ถ | ์ค๋ช |
|---|---|---|---|
id | string | ์ | ๊ณ ์ ์๋ณ์์
๋๋ค(์: 'work', 'personal'). |
name | string | ์ | UI์ ํ์๋๋ ์ด๋ฆ์ ๋๋ค. |
colors | CalendarColors | ์ | ๋ผ์ดํธ ๋ชจ๋ ์์ ์ธํธ์ ๋๋ค(์๋ ์ฐธ๊ณ ). |
darkColors | CalendarColors | ์๋์ค | ๋คํฌ ๋ชจ๋ ์์ ์ธํธ์
๋๋ค. ์ง์ ํ์ง ์์ผ๋ฉด colors๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
description | string | ์๋์ค | ์ฌ๋์ด ์ฝ์ ์ ์๋ ์ ํ์ ์ค๋ช ์ ๋๋ค. |
icon | string | ์๋์ค | ์บ๋ฆฐ๋ ์ด๋ฆ ์์ ํ์ํ ์ด๋ชจ์ง ๋๋ ์์ด์ฝ ์ด๋ฆ์ ๋๋ค. |
isVisible | boolean | ์๋์ค | ์ด ์บ๋ฆฐ๋์ ์ด๋ฒคํธ๋ฅผ ํ์ํ ์ง ์ฌ๋ถ์
๋๋ค. ๊ธฐ๋ณธ๊ฐ์ true์
๋๋ค. |
isDefault | boolean | ์๋์ค | ์ด ์บ๋ฆฐ๋๋ฅผ ์์คํ ๊ธฐ๋ณธ ์บ๋ฆฐ๋๋ก ํ์ํฉ๋๋ค. |
readOnly | boolean | ์๋์ค | ์ด ์บ๋ฆฐ๋์ ์ด๋ฒคํธ์ ๋ํด ๋๋๊ทธยทํฌ๊ธฐ ์กฐ์ ยทํธ์ง UI๋ฅผ ๋นํ์ฑํํฉ๋๋ค. |
source | string | ์๋์ค | ์ถ์ฒ ๋ ์ด๋ธ์
๋๋ค(์: 'Google Calendar', 'iCloud'). |
subscription | { url, status, meta? } | ์๋์ค | ICS ๋๋ ์๊ฒฉ ์บ๋ฆฐ๋์ ๊ตฌ๋ ๋ฉํ๋ฐ์ดํฐ์ ๋๋ค. |
CalendarColors์ ์์ฑ:
| ์์ฑ | ํ์ | ์ค๋ช |
|---|---|---|
eventColor | string | ์ด๋ฒคํธ ๋ฐฐ๊ฒฝ์์ ๋๋ค(๋ณดํต ๋ฐํฌ๋ช ). |
eventSelectedColor | string | ์ด๋ฒคํธ๊ฐ ์ ํ๋์์ ๋์ ๋ฐฐ๊ฒฝ์์ ๋๋ค. |
lineColor | string | ๊ฐ์กฐ ๋๋ ํ ๋๋ฆฌ ์์์ ๋๋ค. |
textColor | string | ์ด๋ฒคํธ ํ ์คํธ ์์์ ๋๋ค. |
theme
theme ์ค์ ์ ์บ๋ฆฐ๋ ์ ์ฒด์ ์๊ฐ์ ์ธํ์ ์ ์ดํฉ๋๋ค:
const calendar = useCalendarApp({
theme: {
mode: 'dark', // 'light' | 'dark' | 'auto'
},
});ํ ๋ง ๋ชจ๋:
'light': ๋ฐ์ ๋ฐฐ๊ฒฝ๊ณผ ์ด๋์ด ๊ธ์๋ฅผ ์ฌ์ฉํ๋ ๋ผ์ดํธ ๋ชจ๋(๊ธฐ๋ณธ๊ฐ)'dark': ์ด๋์ด ๋ฐฐ๊ฒฝ๊ณผ ๋ฐ์ ๊ธ์๋ฅผ ์ฌ์ฉํ๋ ๋คํฌ ๋ชจ๋'auto': ์์คํ ํ ๋ง ์ค์ ์ ์๋์ผ๋ก ๋ฐ๋ฆ ๋๋ค
์ฝ๋๋ก ํ ๋ง ๋ฐ๊พธ๊ธฐ:
// Get current theme
const currentTheme = calendar.app.getTheme();
// Set theme
calendar.app.setTheme('dark');
// Subscribe to theme changes
calendar.app.subscribeThemeChange(theme => {
console.log('Theme changed to:', theme);
});๋คํฌ ๋ชจ๋ ์์ ์ง์ ์ง์ ํ๊ธฐ:
์บ๋ฆฐ๋ ํ์ ๋ง๋ค ๋ผ์ดํธ ๋ชจ๋์ ๋คํฌ ๋ชจ๋์ ์๋ก ๋ค๋ฅธ ์์์ ์ง์ ํ ์ ์์ต๋๋ค:
const calendars = [
{
id: 'work',
name: 'Work',
colors: {
// Light mode colors
lineColor: '#0066cc',
eventColor: '#e6f2ff',
eventSelectedColor: '#cce4ff',
textColor: '#003d7a',
},
darkColors: {
// Dark mode colors
lineColor: '#4da6ff',
eventColor: '#1a3d5c',
eventSelectedColor: '#2a5a8a',
textColor: '#b3d9ff',
},
},
];ํ ๋ง์ ๋ํ ์ ์ฒด ๋ฌธ์๋ ๋คํฌ ๋ชจ๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
locale
locale ์ต์
์ ์บ๋ฆฐ๋์ ์ธ์ด์ ์ง์ญ ์ค์ ์ ์ง์ ํฉ๋๋ค.
- ๋ฌธ์์ด:
'en-US','ja','zh','de','fr','es','ko'๊ฐ์ ์ธ์ด ์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. - Locale ๊ฐ์ฒด: ํ์
์์ ์ฑ์ ์ํด ๊ฐ์ ธ์จ
Locale๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๊ฑฐ๋, ์ง์๋์ง ์๋ ์ธ์ด๋ผ๋ฉด ์ง์ ๋ง๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํฉ๋๋ค.
// String code
const calendar = useCalendarApp({
locale: 'ja',
});
// Additional Locale object from the localization plugin
import { ja } from '@dayflow/plugin-localization';
const calendar = useCalendarApp({
locale: ja,
});
// Custom Locale object
const customLocale = {
code: 'it',
messages: { today: 'Oggi', ... }
};
const calendar = useCalendarApp({
locale: customLocale,
});useEventDetailDialog
true๋ก ์ค์ ํ๋ฉด ๊ธฐ๋ณธ ๋ชจ๋ฌ ๋ํ์์(DefaultEventDetailDialog)๊ฐ ์ผ์ง๋๋ค.DayFlowCalendar์eventDetailContent๋eventDetailDialog์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ฝ์ด์ ์ํ ๊ด๋ฆฌ๋ ๊ทธ๋๋ก ๋๊ณ UI๋ง ๊ต์ฒดํ ์ ์์ต๋๋ค.
eventDetailTrigger
'dbClick'(๊ธฐ๋ณธ๊ฐ): ํ ๋ฒ ํด๋ฆญํ๋ฉด ์ด๋ฒคํธ๊ฐ ์ ํ๋๊ณ , ๋๋ธ ํด๋ฆญํ๋ฉด ์์ธ ํจ๋ยท๋ํ์์๊ฐ ์ด๋ฆฝ๋๋ค.'click': ํ ๋ฒ ํด๋ฆญํ๋ฉด ์์ธ ํจ๋ยท๋ํ์์๊ฐ ๋ฐ๋ก ์ด๋ฆฝ๋๋ค.- ํฐ์น ์ ๋ ฅ์ ์ด ์ต์ ๊ณผ ๋ฌด๊ดํ๊ฒ ๋์ผํฉ๋๋ค. ์ด๋ฒคํธ๋ฅผ ํญํ๋ฉด ์์ธ๊ฐ ์ด๋ฆฝ๋๋ค.
const calendar = useCalendarApp({
views: [createMonthView()],
eventDetailTrigger: 'click',
});useCalendarHeader
true(๊ธฐ๋ณธ๊ฐ): ๋ด์ฅ ์บ๋ฆฐ๋ ํค๋๋ฅผ ๋ ๋๋งํฉ๋๋ค.false: ํค๋๋ฅผ ์์ ํ ์จ๊น๋๋ค.
์ง์ ๋ง๋ ํค๋๋ฅผ ๋ ๋๋งํ๋ ค๋ฉด DayFlowCalendar์ calendarHeader ์ฌ๋กฏ์ ์ฌ์ฉํ์ธ์. ์์ธํ ๋ด์ฉ์ ์บ๋ฆฐ๋ ํค๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
readOnly
true: ๋ด์ฅ ํธ์ง UI(๋๋๊ทธ, ์์ฑ, ํธ์ง)๋ฅผ ๋นํ์ฑํํฉ๋๋ค.ReadOnlyConfig: ์ธ๋ถ์ ์ผ๋ก ์ ์ดํฉ๋๋ค.draggable: ๋๋๊ทธ ํ์ฉ ์ฌ๋ถ์ ๋๋ค.viewable: ์ด๋ฒคํธ ์์ธ๋ฅผ ์ด ์ ์๋์ง ์ฌ๋ถ์ ๋๋ค.
calendar.addEvent(),calendar.updateEvent(),calendar.deleteEvent(),calendar.applyEventsChanges()๊ฐ์ ์ฝ๋ ๊ธฐ๋ฐ API๋ ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋์์๋ ๊ทธ๋๋ก ๋์ํฉ๋๋ค.- ์ง์ ๋ง๋ UI์์๋
calendar.canMutateFromUI()๋ก ์์ฑยทํธ์งยท์ญ์ ์ปจํธ๋กค์ ํ์ํ ์ง ํ๋จํ์ธ์. - ์์ธํ ๋ด์ฉ์ ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
allDaySortComparator
๋ชจ๋ ๋ทฐ(์ผ, ์ฃผ, ์, ์์ ๋ค, ์ฐ)์์ ์ข ์ผ ์ด๋ฒคํธ ํ์ ์ ๋ ฌ ์์๋ฅผ ์ ์ดํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก DayFlow๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํฉ๋๋ค:
- ์ข
์ผ ์ด๋ฒคํธ๋ฅผ ์ฒ์ ๋ฑ์ฅํ ์์๋๋ก
calendarId๊ธฐ์ค์ผ๋ก ๋ฌถ์ต๋๋ค - ์ฌ๋ฌ ๋ ์ ๊ฑธ์น ์ข ์ผ ์ด๋ฒคํธ๋ฅผ ํ๋ฃจ์ง๋ฆฌ ์ข ์ผ ์ด๋ฒคํธ๋ณด๋ค ์์ ๋ก๋๋ค
- ๊ฐ์ ์บ๋ฆฐ๋์ ์ข ์ผ ์ด๋ฒคํธ๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ชจ์ ๋ก๋๋ค
์ต์ข
์์๋ฅผ ์์ ํ ์ง์ ์ ํ๊ณ ์ถ์ ๋๋ง allDaySortComparator๋ฅผ ์ ๋ฌํ์ธ์. ์ง์ ํ๋ฉด ๋น๊ต ํจ์์ ๊ฒฐ๊ณผ๊ฐ ๊ทธ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๋น๊ต ํจ์๋ฅผ ์ ๋ฌํ๋ฉด ์ ๋ ฌ์ ์์ ํ ์ ์ดํ ์ ์์ต๋๋ค. ๋ ๊ฐ์ Event ๊ฐ์ฒด๋ฅผ ๋ฐ์ผ๋ฉฐ JavaScript์ Array.sort์ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค:
const calendar = useCalendarApp({
allDaySortComparator: (a, b) => a.title.localeCompare(b.title),
});@dayflow/core์์ ๋ด๋ณด๋ด๋ ํฌํผ ํจ์:
| ํฌํผ | ๋์ |
|---|---|
sortAllDayByTitle | ์ข ์ผ ์ด๋ฒคํธ๋ฅผ ์ ๋ชฉ ๊ธฐ์ค ์ํ๋ฒณ์์ผ๋ก ์ ๋ ฌํ๋ฉฐ, ๊ธฐ๋ณธ ๊ทธ๋ฃนํ ๋ฐฉ์์ ์์ ํ ๋์ฒดํฉ๋๋ค |
import { sortAllDayByTitle } from '@dayflow/core';
const calendar = useCalendarApp({
allDaySortComparator: sortAllDayByTitle,
});๋ฐํ์์ ์ ๋ ฌ์ ๋ฐ๊พธ๋ ค๋ฉด updateConfig๋ฅผ ์ฌ์ฉํ์ธ์:
calendar.app.updateConfig({ allDaySortComparator: sortAllDayByTitle });
// Restore the default calendar-grouped ordering
calendar.app.updateConfig({ allDaySortComparator: undefined });๊ณ ๊ธ ์ค์ ์์
import {
useCalendarApp,
DayFlowCalendar,
createMonthView,
createWeekView,
ViewType,
} from '@dayflow/react'; // or '@dayflow/vue', '@dayflow/svelte', '@dayflow/angular'
import { createSidebarPlugin } from '@dayflow/plugin-sidebar';
import '@dayflow/core/dist/styles.css';
const calendars = [
{
id: 'work',
name: 'Work',
colors: {
eventColor: '#2563eb',
eventSelectedColor: '#1d4ed8',
lineColor: '#1e40af',
textColor: '#ffffff',
},
},
{
id: 'personal',
name: 'Personal',
colors: {
eventColor: '#f97316',
eventSelectedColor: '#ea580c',
lineColor: '#c2410c',
textColor: '#ffffff',
},
},
];
export function AdvancedCalendar() {
const calendar = useCalendarApp({
views: [createMonthView(), createWeekView()],
defaultView: ViewType.WEEK,
initialDate: new Date('2024-10-01'),
events: [],
calendars,
defaultCalendar: 'work',
switcherMode: 'select',
callbacks: {
onEventUpdate: event => api.events.update(event),
onVisibleRangeChange: (start, end, reason) =>
preloadVisibleRange(start, end, reason),
},
plugins: [
createSidebarPlugin({
width: 280,
initialCollapsed: false,
}),
],
useEventDetailDialog: true,
});
return <DayFlowCalendar calendar={calendar} />;
}ํ:
useCalendarApp์ด ๋ฐํํ๋ ๊ฐ์ฒด๋ ์ํ(currentView,currentDate,events)์ ๋์์ ๋ชจ๋ ์ ๊ณตํฉ๋๋ค. ๊ฐ์ ์ธ์คํด์ค๋ฅผDayFlowCalendar, ์ง์ ๋ง๋ ํด๋ฐ, ์ฌ์ด๋ ํจ๋๊ณผ ๊ณต์ ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๋๊ธฐํ๋ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.