TOAST UI ์ ํ๋ค์ ํจํค์ง ๋งค๋์ ๋ฅผ ์ด์ฉํ๊ฑฐ๋, ์ง์ ์์ค ์ฝ๋๋ฅผ ๋ค์ด๋ฐ์ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ํจํค์ง ๋งค๋์ ์ฌ์ฉ์ ๊ถ์ฅํ๋ค.
TOAST UI ์ ํ๋ค์ npm ํจํค์ง ๋งค๋์ ์ ๋ฑ๋ก๋์ด ์๋ค. ๊ฐ ํจํค์ง ๋งค๋์ ๊ฐ ์ ๊ณตํ๋ CLI ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ํจํค์ง๋ฅผ ์ค์นํ ์ ์๋ค. npm ์ฌ์ฉ์ ์ํด์ Node.js๋ฅผ ๋ฏธ๋ฆฌ ์ค์นํด์ผ ํ๋ค.
npm install @toast-ui/calendar # ์ต์ ๋ฒ์
npm install @toast-ui/calendar@<version> # 2.0 ์ดํ ํน์ ๋ฒ์
npm install tui-calendar@<version> # 1.x ํน์ ๋ฒ์
TOAST UI Calendar๋ CDN์ ํตํด ์ฌ์ฉํ ์ ์๋ค.
- ์๋์ ์ฝ๋๋ก CDN์ ์ฌ์ฉํ ์ ์๋ค.
<link rel="stylesheet" href="https://uicdn.toast.com/calendar/latest/toastui-calendar.min.css" />
<script src="https://uicdn.toast.com/calendar/latest/toastui-calendar.min.js"></script>
<!-- ๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ ์ฉ ๋ฒ๋ค ํ์ผ ๊ฐ์ ธ์ค๊ธฐ -->
<!-- <script src="https://uicdn.toast.com/calendar/latest/toastui-calendar.ie11.min.js"></script> -->
<!-- ๋ชจ๋๋ก ๊ฐ์ ธ์ค๊ธฐ -->
<!-- <script type="module" src="https://uicdn.toast.com/calendar/latest/toastui-calendar.mjs"></script> -->
- CDN์ ์๋์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- uicdn.toast.com/
โโ calendar/
โ โโ latest
โ โ โโ toastui-calendar.css
โ โ โโ toastui-calendar.js
โ โ โโ toastui-calendar.min.css
โ โ โโ toastui-calendar.min.js
โ โ โโ toastui-calendar.ie11.js
โ โ โโ toastui-calendar.ie11.min.js
โ โ โ toastui-calendar.mjs
โ โโ v2.0.0/
TOAST UI Calendar๊ฐ ์์ฑ๋ ์ปจํ ์ด๋ ์์๋ฅผ ์ถ๊ฐํ๋ค. ์ด ์์๋ ์ ์ ํ ๋์ด์ height ๊ฐ์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. (์ต์ 600px ์ด์ ๊ถ์ฅ)
<div id="calendar" style="height: 600px;"></div>
TOAST UI Calendar๋ ์์ฑ์ ํจ์๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค. ์์ฑ์ ํจ์์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ํ๊ฒฝ์ ๋ฐ๋ผ ์ ๊ทผํ ์ ์๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
/* Node.js ํ๊ฒฝ์์ ES6 ๋ชจ๋ */
import Calendar from '@toast-ui/calendar';
/* Node.js ํ๊ฒฝ์์ CommonJS */
const Calendar = require('@toast-ui/calendar');
/* ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ namespace */
const Calendar = tui.Calendar;
TOAST UI Calendar๋ ๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ ์ฉ ๋ฒ๋ค ํ์ผ์ ๋ฐ๋ก ์ ๊ณตํ๊ณ ์๋ค. ๊ธฐ๋ณธ ๋ฒ๋ค์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์ ์ต์ 2๊ฐ ๋ฒ์ ์ ์์ ์ ์ผ๋ก ์ง์ํ๋ค. ํ์ง๋ง ๊ธฐ๋ณธ ๋ฒ๋ค์ IE11์ ์ํ ํด๋ฆฌํ์ด ํฌํจ๋์ด์์ง ์์ผ๋ฏ๋ก IE11 ํน์ ์ผ์ ์์ค ์ดํ์ ๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ํด๋ฆฌํ์ด ํฌํจ๋ IE11 ๋ฒ๋ค์ ์ถ๊ฐํด์ผ ํ๋ค.
IE11์ ๋ฒ๋ค ํฌ๊ธฐ๋ ๊ธฐ๋ณธ ๋ฒ๋ค๋ณด๋ค 30%๊ฐ๋ ํฌ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์ง์ ๋ฒ์๋ฅผ ์ ๊ณ ๋ คํ์ฌ ๋ถํ์ํ๊ฒ ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ๋๋ฆฌ์ง ์๋๋ก ์ ์ํด์ผ ํ๋ค.
/* Node.js ํ๊ฒฝ์์ ES6 ๋ชจ๋ */
import Calendar from '@toast-ui/calendar/ie11';
/* Node.js ํ๊ฒฝ์์ CommonJS */
const Calendar = require('@toast-ui/calendar/ie11');
<!-- CDN๊ณผ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ namespace -->
<script src="https://uicdn.toast.com/calendar/latest/toastui-calendar.ie11.min.js"></script>
<script>
const Calendar = tui.Calendar;
</script>
Calendar๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ CSS ํ์ผ์ ์ถ๊ฐํด์ผ ํ๋ค. import, require๋ฅผ ํตํด CSS ํ์ผ์ ๋ถ๋ฌ์ค๊ฑฐ๋, CDN์ ํตํด ๋ถ๋ฌ์ฌ ์ ์๋ค.
/* Node.js ํ๊ฒฝ์์ ES6 ๋ชจ๋ */
import '@toast-ui/calendar/dist/toastui-calendar.min.css'; // Calendar ์คํ์ผ
/* Node.js ํ๊ฒฝ์์ CommonJS */
require('@toast-ui/calendar/dist/toastui-calendar.min.css');
<!-- CDN -->
<link rel="stylesheet" href="https://uicdn.toast.com/calendar/latest/toastui-calendar.min.css" />
์์ฑ์ ํจ์๋ container
, options
๋ ๊ฐ๋ฅผ ์ธ์๋ก ๊ฐ๋๋ค.
container
: TOAST UI Calendar๋ฅผ ์์ ์์๋ก ๊ฐ๋ HTML ์์ ๋๋ HTML ์์๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ CSS ์ ํ์ ๋ฌธ์์ดoptions
: ๊ธฐ๋ณธ ๋ทฐ ํ์ , ํ์์กด, ํ ๋ง, ํ ํ๋ฆฟ ๋ฑ TOAST UI Calendar๋ฅผ ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ ์ต์ ๊ฐ์ฒด. ์์ธํ ์ ๋ณด๋ ์ต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ค.
const container = document.getElementById('calendar');
const options = {
defaultView: 'week',
timezone: {
zones: [
{
timezoneName: 'Asia/Seoul',
displayLabel: 'Seoul',
},
{
timezoneName: 'Europe/London',
displayLabel: 'London',
},
],
},
calendars: [
{
id: 'cal1',
name: '๊ฐ์ธ',
backgroundColor: '#03bd9e',
},
{
id: 'cal2',
name: '์ง์ฅ',
backgroundColor: '#00a9ff',
},
],
};
const calendar = new Calendar(container, options);
TOAST UI ์บ๋ฆฐ๋๋ GA๋ฅผ ์ ์ฉํ์ฌ ์คํ ์์ค ์ฌ์ฉ์ ๋ํ ํต๊ณ๋ฅผ ์์งํ์ฌ ์ ์ธ๊ณ์์ ์ผ๋ง๋ ๋๋ฆฌ ์ฌ์ฉ๋๋์ง ํ์ธํ๋ค.
์ด๋ ํ๋ก์ ํธ์ ํฅํ ์งํ์ ๊ฒฐ์ ํ๋ ์ค์ํ ์งํ ์ญํ ์ ํ๋ค.
location.hostname
(์๋ฅผ ๋ค์ด "ui.toast.com")์ ์์งํ๋ฉฐ ์ฌ์ฉ๋์ ๋ํ ํต๊ณ๋ฅผ ์ธก์ ํ๊ธฐ ์ํด์๋ง ์ฌ์ฉ๋๋ค.
๋ง์ฝ ์ด๋ฅผ ๊ฑฐ๋ถํ๋ ค๋ฉด usageStatistics
์ต์
์ false
๋ก ์ค์ ํ๋ค.
const calendar = new Calendar('#calendar', {
usageStatistics: false
});
์ผ์ ์ ์์ฑํ ๋๋ Calendar ์ธ์คํด์ค์ createEvents
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
์ผ์ ์ ๋ณด๋ EventObject ํํ๋ก ๋๊ธด๋ค.
calendar.createEvents([
{
id: 'event1',
calendarId: 'cal2',
title: '์ฃผ๊ฐ ํ์',
start: '2022-06-07T09:00:00',
end: '2022-06-07T10:00:00',
},
{
id: 'event2',
calendarId: 'cal1',
title: '์ ์ฌ ์ฝ์',
start: '2022-06-08T12:00:00',
end: '2022-06-08T13:00:00',
},
{
id: 'event3',
calendarId: 'cal2',
title: 'ํด๊ฐ',
start: '2022-06-08',
end: '2022-06-10',
isAllday: true,
category: 'allday',
},
]);
TOAST UI Calendar๋ ์ผ์ ์์ฑ ํ์
๊ณผ ์ผ์ ์์ธ ํ์
์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด useFormPopup
๊ณผ useDetailPopup
์ต์
์ true
๋ก ์ค์ ํด์ผ ํ๋ค. ์ต์
์ ์ธ์คํด์ค ์์ฑ ์ ์ค์ ํ๊ฑฐ๋, ์ธ์คํด์ค ์์ฑ ํ setOptions
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ณ๊ฒฝํ ์ ์๋ค.
์ผ์ ์์ฑ ํ์
์ ์ฌ์ฉํ ๋๋ tui-date-picker
์ tui-time-picker
์ css ํ์ผ์ ๊ฐ์ ธ์์ผ ์คํ์ผ์ด ์ ๋๋ก ์ ์ฉ๋๋ค.
npm install tui-date-picker tui-time-picker
// ์ผ์ ์์ฑ ํ์
์ ์ฌ์ฉํ๊ธฐ ์ํด tui-date-picker์ tui-time-picker์ css ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
import 'tui-date-picker/dist/tui-date-picker.css';
import 'tui-time-picker/dist/tui-time-picker.css';
calendar.setOptions({
useFormPopup: true,
useDetailPopup: true,
});
์ผ์ ์์ฑ ํ์ | ์ผ์ ์์ธ ํ์ |
---|---|
์์, ๋ฐฐ๊ฒฝ์๊ณผ ๊ฐ์ ์คํ์ผ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋๋ ํ
๋ง๋ฅผ ์ฌ์ฉํ๋ค. ํ
๋ง๋ ์ธ์คํด์ค ์์ฑ ์ ์ต์
๊ฐ์ฒด์ theme
ํ๋กํผํฐ์ ๋ช
์ํ๊ฑฐ๋, ์ธ์คํด์ค ์์ฑ ํ setTheme
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ณ๊ฒฝํ ์ ์๋ค. ์ ์ฉ ๊ฐ๋ฅํ ํ
๋ง๋ ํ
๋ง ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ค.
calendar.setTheme({
common: {
gridSelection: {
backgroundColor: 'rgba(81, 230, 92, 0.05)',
border: '1px dotted #515ce6',
},
},
});
ํ
ํ๋ฆฟ์ ์ปค์คํ
๋ ๋๋ง์ ์ง์ํ๋ ๊ธฐ๋ฅ์ด๋ค. ์ธ์คํด์ค ์์ฑ ์ ์ต์
๊ฐ์ฒด์ template
ํ๋กํผํฐ์ ๋ช
์ํ๊ฑฐ๋, ์ธ์คํด์ค ์์ฑ ํ setOptions
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ณ๊ฒฝํ ์ ์๋ค. ์ ์ฉ ๊ฐ๋ฅํ ํ
ํ๋ฆฟ์ ํ
ํ๋ฆฟ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ค.
function formatTime(time) {
const hours = `${time.getHours()}`.padStart(2, '0');
const minutes = `${time.getMinutes()}`.padStart(2, '0');
return `${hours}:${minutes}`;
}
calendar.setOptions({
template: {
time(event) {
const { start, end, title } = event;
return `<span style="color: white;">${formatTime(start)}~${formatTime(end)} ${title}</span>`;
},
allday(event) {
return `<span style="color: gray;">${event.title}</span>`;
},
},
});
TOAST UI Calendar๋ ์ธ์คํด์ค ์ด๋ฒคํธ๋ฅผ ์ ๊ณตํ๋ค. ํ์์ ๋ฐ๋ผ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋๋ก ์ค์ ํ์ฌ ์ํ๋ ๋์์ ์คํ์ํฌ ์ ์๋ค. ๋ํ ๋ณ๋๋ก ์ฌ์ฉ์๊ฐ ์์ ๋ง์ ์ด๋ฒคํธ๋ฅผ ์ค์ ํ ์๋ ์๋ค.
on
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์๋ค.
์์ธํ ๋ด์ฉ์ ์ธ์คํด์ค ์ด๋ฒคํธ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ค.
calendar.on('clickEvent', ({ event }) => {
const el = document.getElementById('clicked-event');
el.innerText = event.title;
});