ํ์บ๋ฆฐ๋(FullCalendar) ์์ฑ - 3
FullCalendar JS๋ฅผ ํ์ฉํ๋ค ๋ณด๋ฉด ๊ต์ฅํ ๋ค์ํ ์์ฑ๊ณผ ์ด๋ฒคํธ๋ฅผ ๋ณผ ์ ์๋ค. ์ฌ๋ฌ ์์ฑ๋ค์ด ์ด๋ค ํน์ง๋ค์ ๊ฐ์ง๊ณ ์๋์ง, ํ์บ๋ฆฐ๋๊ฐ ๊ฐ์ง๊ณ ์๋ ์ด๋ฒคํธ์๋ ์ด๋ค ๊ฒ๋ค์ด ์์ผ๋ฉฐ ํด๋น ์ด๋ฒคํธ๋ ์ด๋ค ๋์๋ค์ ํฌํจํ๊ณ ์๋์ง ๋ฑ๋ฑ์ ๋ํด์ ์ ๋ชจ๋ฅผ ๋๊ฐ ๋ง๋ค. FullCalendar JS ๊ณต์ ํํ์ด์ง์์ ์ ๊ณตํ๋ Documents ํ์ผ์ ๋ณด๊ธด ํ์ง๋ง Docs ๋ฌธ์๋ค์ ํ์ธํ๋ ๊ฒ ์์ง ์ต์์ง ์์ ์ฌ๋์ ๋ฌธ์ ๋ณด๋ ๋ฐฉ๋ฒ์กฐ์ฐจ ์ด๋ ค์ธ ์ ์๋ค. ๊ทธ๋์ FullCalendar JS์์ ์ฌ์ฉํ ์ ์๋ ์์ฑ๋ค์ ํ๋์ ์ดํด๋ณด๊ณ ์ ํ๋ค. ๋ฌผ๋ก 100% ๋ชจ๋ ์์ฑ๋ค์ ์ ๋ถ ๋ณด๋ฉด ์ข๊ฒ ์ง๋ง, ๊ฐ์ฅ ์ค์ํ ์์ฑ๋ค ์์ฃผ๋ก ํ์ธํด ๋ณด๊ณ ๊ทธ ์ธ์ ์์ฑ๋ค์ ์ง์ Documents๋ฅผ ํ์ธํด ๋ณด๊ธธ ๋ฐ๋๋ค.
๐ 3. ์ด๋ฒคํธ ๊ด๋ จ ์ค์ (Event Settings)
events
' ๋ฌ๋ ฅ์ ํ์ ๋ ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ฐฐ์ด '
FullCalendar์ ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ผ ๋ events ์์ฑ์ ํตํด์ ์ค์ ํ ์ ์๋ค. events ์์ฑ์ ์ผ์ ๊ฐ๋ค์ ๋ฐฐ์ด ํํ๋ก ๊ด๋ฆฌํ๋ค. ๋ฐฐ์ด ํ์์ ๋ง์ถฐ 'title', 'start', 'end', 'allDay' ๋ฑ๋ฑ๊ณผ ๊ฐ์ ์์ฑ๋ค์ด ํฌํจ๋ ๊ฐ์ฒด ์ ๋ณด๋ค์ ํ์ฉํ์ฌ ์ผ์ ์ ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์ ๋ง์ง๋ง ์ด๋ฒคํธ ๋ค์๋ ์ผํ๊ฐ ๊ผญ ์์ด์ผ ํ๋ค. (Internet Explorer์์ ์๋ฌ๊ฐ ๋ฐ์) ์ ๋ด์ฉ์ ๋ํ ๋ถ๋ถ๋ ํ์ฌ ์์ ์์ ๋ดค์ ๋์๋ IE๊ฐ ์๋น์ค ์ข ๋ฃ๊ฐ ๋์ง ์ด๋ฏธ ์ค๋์ ์ด๋ผ ๋ฌธ์ ๋ ์๊ฒ ์ง๋ง, ์์ง๋ IE๋ฅผ ์ฌ์ฉํ๋๊ณณ์ด ์์ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ณต์๋ฌธ์์์ ์ด์ผ๊ธฐํ๋ ๋ด์ฉ์ ์๊ณ ๋ง ์์!
// 1. ๋ฐฐ์ด์ ํํ๋ก ๊ตฌ์ฑํ๊ธฐ
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
events: [
{ title: '์ผ์ 1', start: '2025-02-10' }, // ํ๋ฃจ ์ผ์
{ title: '์ผ์ 2', start: '2025-02-12', end: '2025-02-15' }, // ๊ธฐ๊ฐ ์ผ์
{ title: '์ผ์ 3', start: '2025-02-18T14:00:00', allDays: false } // ์๊ฐ ํฌํจ ์ผ์
]
});
calendar.render();
// 2. ์ธ๋ถ ๋งํฌ๋ก ์ฐ๊ฒฐ (url)
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
events: [
{ title: '์น ์ธ๋ฏธ๋ ์ฐธ๊ฐํ๊ธฐ', start: '2025-02-25', url: 'https://example.com/webinar' }
]
});
calendar.render();
// 3. JSON URL๋ก ๋ถ๋ฌ์ค๊ธฐ
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
events: '/api/events' // ์๋ฒ์์ ์ผ์ JSON ๋ฐ์ดํฐ ๋ก๋
});
calendar.render();
// 4. Ajax๋ก ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
events: function(fetchInfo, successCallback, failureCallback) {
$.ajax({
url: '/api/getEvents',
dataType: 'json',
data: {
start: fetchInfo.startStr,
end: fetchInfo.endStr
},
success: function(response) {
successCallback(response); // ์ผ์ ๋ก๋ ์ฑ๊ณต ์ ํ์
},
error: function() {
failureCallback(); // ์๋ฌ ์ฒ๋ฆฌ
}
});
}
});
calendar.render();
Calendar ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋, events ์์ฑ์ ๋ฐฐ์ด ํํ๋ฅผ ๋ง๋ค๊ณ ํด๋น ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ค์ ๋ง๋ค์ด๊ฐ๋ค. ๊ฐ์ฒด ์์์ ์ฌ์ฉ์ค์ธ ์ฌ๋ฌ ์์ฑ๋ค์ด ์กด์ฌํ๋๋ฐ ๊ฐ๊ฐ์ ์์ฑ๋ค์ ์๋ ํ๋ฅผ ํตํด์ ํ์ธํ ์ ์๋๋ก ํ์.
events ์์ฑ ํ์ฅํ
์ด๋ฒคํธ ํ์ฅํ ์ต์ ์ ํด๋นํ๋ ์ด๋ฒคํธ ์์ค๋ ์ด๋ฒคํธ ์์ค ์ต์ ๋ค์ ์ค์ ํ ์ ์๋๋ฐ, ์ฌ๋ฌ ์ด๋ฒคํธ ์์ค๋ฅผ ์ง์ ํ๊ณ ํน์ ์ต์ ์ ํน์ ์ด๋ฒคํธ์๋ง ์ ์ฉํ๋ ค๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด events ์์ฑ๊ณผ๋ ์์ฑ ๋ฐฉ์์ด ์กฐ๊ธ ๋ค๋ฅด๋ค. eventsSources ์์ฑ์ ์ด์ฉํ์ฌ ์ฌ๋ฌ events๋ฅผ ๊ฐ์ฒดํํ๋ก ๋ง๋ค์ด์ ๋ฑ๋กํ๋ค.
events ์์ฑ์์ ์ฌ๋ฌ ๊ฐ์ฒด์ ๋ณด๋ค์ ๋ง๋ค ๋ ์ฌ์ฉ๊ฐ๋ฅํ ์์ฑ์ด ์กด์ฌํ๋ค. ํด๋น ์ผ์ ๋ํ๋ ์ผ์ ๋ด์ฉ๋ค์ ์ฌ๋ฌ ์์ฑ์ ๋ณด์ ํด๋นํ๋ 'id', 'groupId', 'allDay', 'start', 'end', 'startStr', 'endStr' ๋ฑ๋ฑ๊ณผ ๊ฐ์ ์์ฑ์ ๋ณด๋ฅผ ํตํด์ ๋ํ๋ผ ์ ์๋ค.
๋ฒํธ | ์์ฑ | ๋ด์ฉ |
1 | id | - ์ด๋ฒคํธ์ ๊ณ ์ ์๋ณ์ |
2 | groupId | - ์ด๋ฒคํธ๋ฅผ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๊ทธ๋ฃนํ ๋ ์๋ณ์ |
3 | allDay | - ํด๋น ๋ทฐ์ 'allDay'์ธ ํ๋ฃจ์ข
์ผ ์ด๋ฒคํธ๋ฅผ ํ์ํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ - ์ํ ๊ฐ์ด 'true'์ธ ๊ฒฝ์ฐ ์๊ฐ ํ ์คํธ๊ฐ ํจ๊ป ํ์๋์ง ์๋๋ค. |
4 | start | - ํ์ฌ timeZone์ ๋ฐ๋ฅด๋ ๋ ์ง ๊ฐ์ฒด - ์์์ผ์ ํ์ |
5 | end | - ํ์ฌ timeZone์ ๋ฐ๋ฅด๋ ๋ ์ง ๊ฐ์ฒด - ์ข ๋ฃ์ผ์ ํ์ํ๊ณ ์ง์ ๋์ง ์๋ ๊ฒฝ์ฐ null ** ๋ฐฐํ์ , ์ข ๋ฃ์ผ์ด '2024-06-19'์ผ ๋ ์ข ๋ฃ๋๋ ์์ ์ '2024-06-20'์ด ๋๊ธฐ ์ ์ด๋ค. |
6 | startStr | - ์์์ผ์ ๋ฌธ์์ด ํํ(ISO8601) - ์์์ผ์ ํฌํจ์ํฌ ํ ์คํธ(ํ๋ฃจ ์ข ์ผ ์งํ๋๋ ๊ฒฝ์ฐ ์๊ฐ ๋ถ๋ถ์ด ์์.) |
7 | endStr | - ์ข
๋ฃ์ผ์ ๋ฌธ์์ด ํํ(ISO8601) - ์ข ๋ฃ์ผ์ ํฌํจ์ํฌ ํ ์คํธ(ํ๋ฃจ ์ข ์ผ ์งํ๋๋ ๊ฒฝ์ฐ ์๊ฐ ๋ถ๋ถ์ด ์์.) |
8 | title | - ์ด๋ฒคํธ์ ํ์๋ ํ ์คํธ(์ผ์ ๋ช ) |
9 | url | - ์ฌ์ฉ์๊ฐ ์ด๋ฒคํธ๋ฅผ ํด๋ฆญํ ๋ ๋ฐฉ๋ฌธํ๊ฒ ๋ URL - ๋์ ์ ์ด์ ์์ธํ ๋ด์ฉ์ eventClick callback ์ฐธ์กฐ |
10 | classNames | - class๋ช
๋ฌธ์์ด ๋ฐฐ์ด - ๋๋๋ง๋ ์ด๋ฒคํธ์ ์ฒจ๋ถํ className์ ๊ฒฐ์ |
11 | editable | - ํน์ ์ด๋ฒคํธ์ ๋ํด ํธ์ง ๊ฐ๋ฅํ ์ค์ ์ ์ฌ์ ์ํ๋ ๊ฐ(true/false) - true์ผ ๊ฒฝ์ฐ, ์ผ์ bar๋ฅผ ์ ํํ๊ฑฐ๋ ๋๋๊ทธ ํ ์ ์๋ค. - false์ผ ๊ฒฝ์ฐ, ์ผ์ bar๋ฅผ ์ ํํ๊ฑฐ๋ ๋๋๊ทธํ ์ ์๋ค. |
12 | startEditable | - ํน์ ์ด๋ฒคํธ์ ๋ํ eventStartEditable ์ค์ ์ ์ฌ์ ์ ํ๋ ๊ฐ(true/false) - ๋๋๊ทธ๋ฅผ ํตํด ์ด๋ฒคํธ์ ์์ ์๊ฐ์ ํธ์งํ ์ ์๋๋ก ํ์ฉ |
13 | durationEditable | - ํน์ ์ด๋ฒคํธ์ ๋ํ eventDurationEditable ์ค์ ์ ์ฌ์ ์ ํ๋ ๊ฐ(true/false) - ํฌ๊ธฐ ์กฐ์ ์ ํตํด ์ด๋ฒคํธ ๊ธฐ๊ฐ์ ํธ์งํ ์ ์๋๋ก ํ์ฉ |
14 | resourceEditable | - ํน์ ์ด๋ฒคํธ์ ๋ํ eventResourceEditable ์ค์ ์ ์ฌ์ ์ ํ๋ ๊ฐ(true/false) - ์ฌ์ฉ์๊ฐ ๋ฆฌ์์ค ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋๋๊ทธํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ |
15 | display | - ์ด๋ฒคํธ์ ๋๋๋ง ์ ํ - ๋๋๋ง ์ ํ์ 'auto', 'block', 'list-item', 'background', 'inverse-background', 'none' ์ด ์๋ค. - auto : default, daygrid์ ์์ ๋ ํ๋ฃจ ์ข ์ผ ๋๋ ๋ฉฐ์น ๋์ ์งํ๋๋ ๊ฒฝ์ฐ ์ด๋ฒคํธ๋ฅผ ๋จ์ ์ง์ฌ๊ฐํ์ผ๋ก ๋๋๋ง ํ๋ค. ์๊ฐ์ด ์ง์ ๋ ์ด๋ฒคํธ์ธ ๊ฒฝ์ฐ ์ ์ผ๋ก ๋๋๋ง๋๋ค. - block : daygrid์ ์๋ ๊ฒฝ์ฐ ์ด๋ฒคํธ๋ฅผ ๋จ์ ์ง์ฌ๊ฐํ์ผ๋ก ๋๋๋งํ๋ค. - list-item : daygrid์ ์๋ ๊ฒฝ์ฐ ์ด๋ฒคํธ๋ฅผ ์ ์ผ๋ก ๋๋๋งํ๋ค. - background : ๋ฐฐ๊ฒฝ ํ์ด๋ผ์ดํธ๋ก ๋ํ๋๋ ์ด๋ฒคํธ, ์ ์ฌ๊ฐํ์ ์๊น๋ง ํ์๋จ. - inverse-background : background์ ๋น์ทํ์ง๋ง, ๋ฐ๋์ชฝ ๊ณต๊ฐ์ ๋ฐฐ๊ฒฝ ํ์ด๋ผ์ดํธ๋ก ๋ํ๋ธ๋ค. - none : ์ด๋ฒคํธ๋ฅผ ๋๋๋งํ์ง ์๋๋ค. |
16 | overlap | - ํน์ ์ด๋ฒคํธ์ ๋ํ eventOverlap ์ค์ ์ ์ฌ์ ์ํ๋ ๊ฐ - false์ธ ๊ฒฝ์ฐ, ํด๋น ์ด๋ฒคํธ๊ฐ ๋ค๋ฅธ ์ด๋ฒคํธ ์๋ก ๋๋๊ทธ/ํฌ๊ธฐ ์กฐ์ ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค. - false์ธ ๊ฒฝ์ฐ, ๋ค๋ฅธ ์ด๋ฒคํธ๊ฐ ํด๋น ์ด๋ฒคํธ ์๋ก ๋๋๊ทธ/ํฌ๊ธฐ ์กฐ์ ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค. |
17 | constraint | - ํน์ ์ด๋ฒคํธ์ ๋ํ eventConstraint ์ฌ์ ์ - ์ด๋ฒคํธ ๋๋๊ทธ ๋ฐ ํฌ๊ธฐ ์กฐ์ ์ ํน์ ์๊ฐ ์ฐฝ์ผ๋ก ์ ํํ๋ค. - ์ผ์ ์ฃผ๋ณ, ์๊ฐ๋ณ, groupId ๋ฑ์ผ๋ก ๋ฒ์๋ฅผ ์ ํํ์ฌ ์ด๋ฒคํธ๋ฅผ ์ ํํ๋ค. |
18 | backgroundColor | - ํน์ ์ด๋ฒคํธ์ ๋ํ eventBackgroundColor ์ฌ์ ์ - ์บ๋ฆฐ๋์ ๋ชจ๋ ์ด๋ฒคํธ์ ๋ํ ๋ฐฐ๊ฒฝ์์ ์ค์ ํ๋ค. - '#f00', '#ff0000', '.rgb(255,0,0)', 'red'์ ๊ฐ์ CSS ์์ ํ์์ ์ฌ์ฉํ ์ ์๋ค. |
19 | borderColor | - ํน์ ์ด๋ฒคํธ์ ๋ํ eventBorderColor ์ฌ์ ์ - ์บ๋ฆฐ๋์ ๋ชจ๋ ์ด๋ฒคํธ์ ๋ํ ํ ๋๋ฆฌ ์์์ ์ค์ ํ๋ค. - '#f00', '#ff0000', '.rgb(255,0,0)', 'red'์ ๊ฐ์ CSS ์์ ํ์์ ์ฌ์ฉํ ์ ์๋ค. |
20 | textColor | - ํน์ ์ด๋ฒคํธ์ ๋ํ eventTextColor ์ฌ์ ์ - ์บ๋ฆฐ๋์ ๋ชจ๋ ์ด๋ฒคํธ์ ๋ํ ํ ์คํธ ์์์ ์ค์ ํ๋ค. - '#f00', '#ff0000', '.rgb(255,0,0)', 'red'์ ๊ฐ์ CSS ์์ ํ์์ ์ฌ์ฉํ ์ ์๋ค. |
21 | extendedProps | - ๊ตฌ๋ฌธ ๋ถ์ ์ค์ ์ง์ ๋ ๊ธฐํ ์์ฑ์ ๋ณด์ ํ๋ ์ผ๋ฐ ๊ฐ์ฒด - ๋ช ์์ ์ผ๋ก ์ง์ ๋ ExtendedProps Hash์ ์์ฑ๊ณผ ๊ธฐํ ๋นํ์ค ์์ฑ์ ๋ฐ๋๋ค. |
22 | source | - ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ด๋ฒคํธ ์์ค์ ๋ํ ์ฐธ์กฐ - addEvent๋ฅผ ํตํด ์ด๋ฒคํธ๊ฐ ๋์ ์ผ๋ก ์ถ๊ฐ๋๊ณ source ๋งค๊ฐ๋ณ์๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ null |
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView : 'dayGridMonth',
events: [
{
title: '์ผ์ ๋ช
์
๋๋ค.',
start: '2024-06-19T09:00:00',
end: '2024-06-19T12:50:00',
startStr: 'Start ํ
์คํธ', // ์ผ์ bar์ ์ถ๋ ฅ์ด ๋์ง๋ ์์
endStr: 'End ํ
์คํธ', // ์ผ์ bar์ ์ถ๋ ฅ์ด ๋์ง๋ ์์
classNames:['custom-className1','custom-className2'],
editable: false,
display: 'block', // ์ง์ฌ๊ฐํ bar๊ฐ ๋ํ๋๋ค.
overlap: false,
backgroundColor: 'red',
borderColor: 'blue',
textColor: 'white'
}
]
});
์ ์ ๊ฐ์ ์์ฑ๋ค์ ํ์ฉํ์ฌ ์บ๋ฆฐ๋์ events ์์ฑ์ ๊ฐ์ฒด์ ๋ณด๋ฅผ ๋ง๋ค ์ ์๋ค. ์ผ์ ๋ช ์ '์ผ์ ๋ช ์ ๋๋ค.', ์์์ผ๊ณผ ์ข ๋ฃ์ผ์ '2024๋ 6์ 19์ผ ์ค์ 9์๋ถํฐ 2024๋ 6์ 19์ผ ์คํ 12์ 50๋ถ', ์์ ๋ฌธ์์ด๊ณผ ๋ ๋ฌธ์์ด์ 'Start ํ ์คํธ', 'End ํ ์คํธ', ํด๋น ์ผ์ bar์ ์์ฑ๋ class๋ 'custom-className1', 'custom-className2', ๋๋๊ทธ ๋ฐ ํฌ๊ธฐ ์กฐ์ ๋ถ๊ฐ๋ฅ, ์ผ์ ๋ณด์ฌ์ง๋ view ์ต์ ์ ์ง์ฌ๊ฐํ bar๊ฐ ๋ํ๋ 'block', ์ด๋ฒคํธ์ ์ด๋ฒคํธ๊ฐ ๊ฒน์น์ง ์๊ฒ ํ๊ธฐ ์ํ overlap false ๋ฑ๋ฑ์ ์ค์ ๋ค์ ์ด์ฉํด์ events ๊ฐ์ฒด์ ๋ณด๋ฅผ ์ค์ ํ๋ค.
๊ฐ ์ค์ ์ ์ํด์ ๋ง๋ค์ด์ง ์บ๋ฆฐ๋ View์ด๋ค. ๋ณดํต์ ์ ๋ ๊ฒ ๋ง์ ์์ฑ ์ ๋ณด๋ฅผ ํ์ฉํ๊ธฐ ๋ณด๋ค๋ ๊ฐ์ผ๋ก์ ์ถ๋ ฅํ ์ ์๋ ํํ์ ์์ฑ๋ค์ ํ์ฉํ์ฌ ์บ๋ฆฐ๋ ์ผ์ ์ ํธ๋ค๋งํ๋ค. ๊ทธ๋ ์ง๋ง, ๊ฐ ์์ฑ๋ค์ ์ค์ ์ ๋ฐ๋ผ์ events ์์ฑ์ด ๊ฐ์ง๊ณ ์๋ ์ผ์ ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ข ๋ detailํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ ์ฅ์ ์ ์์ ์ ์๋ค. ์๋์ events ์์ฑ์ด ์ฌ๋ฌ ์์ฑ๋ค์ ์ํด์ ์ค์ ๋ ๋ฐ์ดํฐ์ ํํฉ์ด๋ค.
events ์์ฑ์ ๋ฐฐ์ด ํํ์ ๊ฐ์ผ๋ก 1๊ฐ์ ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์๋ค. ๋ฐฐ๊ฒฝ์ ์ค์ , ํ ๋๋ฆฌ ์ ์ค์ , class๋ช ์ 'custom-className'์ผ๋ก 2๊ฐ ์ค์ ํ์๊ณ , ๋ณด์ฌ์ง๋ ๋ฐฉ์, ํธ์ง ์ฌ๋ถ, ์์์ผ, ์ข ๋ฃ์ผ, ์ผ์ ๋ช ๋ฑ๋ฑ์ ์ฌ๋ฌ ์์ฑ์ ๋ณด๋ฅผ ํตํด ์ค์ ํ๋ฉด calendar ๊ฐ์ฒด์์ events ์์ฑ ์ ๋ณด๋ฅผ ์ด์ด๋ณด๋ฉด ์ผ์ชฝ๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ์ ํํฉ์ ํ์ธํ ์ ์๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ๋ฌ ์์ฑ๋ค์ ๊ด๋ฆฌํ๊ณ ์ฌ๋ฌ ์์ฑ๋ค์ ํตํด์ ์ํ๋ ๊ฐ์ ์ปจํธ๋กค ํ๋ ๊ฑด, ๊ฐ์ฅ ํฐ ๊ถ๊ทน์ ์ธ ๋ชฉ์ ์ ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ ๊ฐ์ ์ค์ ํ๋๋ฐ์ ์์ง๋ง, ๋ฐ์ดํฐ ์ถ๋ ฅ ์ด์ธ์ ๋ค์ํ ์์ฑ ์ ๋ณด๋ฅผ ํตํด ๋ค์ํ ๊ธฐ๋ฅ๋ค๋ก์ ํธ๋ค๋ง์ ํ๊ธฐ ์ํด์์ด๊ธฐ๋ ํ๋ค. events ์์ฑ์ ๋ด๊ฐ ๋ฐฐ์ด์ ํํ๋ก ์ถ๊ฐํ ์ฌ๋ฌ ์ผ์ ๋ฐ์ดํฐ๋ฅผ index์ ํํ๋ก ๊ด๋ฆฌํ๋๋ฐ, groupId ํํ๋ก ๋ฌถ์ด์๋ ์ปจํธ๋กค์ ํ ์๋ ์๊ณ , ๊ฐ className์ผ๋ก๋ ํธ๋ค๋ง ํ ์๋ ์์๊ฒ์ด๋ค. ๋ ๋ค์ํ ์์ฑ์ ๋ณด์ ์์ฑ ์ ๋ณด์ ๋ฐ๋ฅธ ๋ด์ฉ์ ๋ณธ ์์ฑ๊ธ 1,2 ๋๋ ๊ณต์๋ฌธ์๋ฅผ ํตํด์ ํ์ธํ ์ ์๋๋ก ํฉ์๋ค.
eventColor
' ๋ฌ๋ ฅ์ ์๋ ๋ชจ๋ ์ด๋ฒคํธ์ ๋ฐฐ๊ฒฝ ๊ณผ ํ ๋๋ฆฌ ์์์ ์ค์ '
eventColor ์์ฑ์ ์บ๋ฆฐ๋์ ํ์๋๋ ๋ชจ๋ ์ผ์ (Event)์ ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ์์ ์ค์ ํ๋ ์์ฑ์ ๋๋ค. ๋ชจ๋ Event์ ์ผ์ ์ ์ผ๊ด ์์ ์ ์ฉํ ์ ์๊ณ ๋น ๋ฅธ ์คํ์ผ๋ง์ด ๊ฐ๋ฅํฉ๋๋ค. ๊ฐ๋ณ ์ผ์ ์ ์ปจํธ๋กคํ๊ธฐ ์ํ ์ค์ ๋ณด๋ค๋ ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๊ณ ์์ด ์ ์ฒด ์ด๋ฒคํธ ์์ ์ ์งํํ๋ค ํ๋๋ผ๋ ๊ฐ๋ณ ์ผ์ ์ ์์ ํ๋ฉด ๊ฐ๋ณ ์ผ์ ์ด ์ฐ์ ์ผ๋ก ์์ ๋ฉ๋๋ค. Event์ ์์์ CSS ์์ ํ์('#ff00', '#ff0011', 'rgb(255,0,0)', 'red')์ ์ฌ์ฉํ ์ ์์ต๋๋ค. eventBackgroundColor, eventBorderColor, eventTextColor ์ต์ ์ ํตํด ๋์ฑ ์ธ๋ถ์ ์ธ ํํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ color ์ต์ ์ ์ฌ์ฉํ์ฌ ์์ค๋ณ๋ก ์ฌ์ ์ํ๊ฑฐ๋, ์ด๋ฒคํธ๋ณ๋ก ์ฌ์ ์ ํ ์ ์์ต๋๋ค.
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
eventColor: '#3788d8', // ๊ธฐ๋ณธ ์ผ์ ์์ (ํ๋์)
events: [
{ title: '์ผ์ 1', start: '2025-02-10' },
{ title: '์ผ์ 2', start: '2025-02-12' },
{ title: '์ผ์ 3', start: '2025-02-15' }
]
});
calendar.render();
eventColor์ ๊ฐ๋ณ ์ผ์ ์์ ๋น๊ต
โ ๊ฐ๋ณ ์ผ์ ์ backgroundColor ์ฌ์ฉ ์
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
eventColor: '#3788d8', // ๊ธฐ๋ณธ ํ๋์
events: [
{ title: '๊ธด๊ธ ์ผ์ ', start: '2025-02-14', backgroundColor: '#ff0000' }, // ๋นจ๊ฐ์
{ title: '์ ๊ธฐ ์ผ์ ', start: '2025-02-18' } // ๊ธฐ๋ณธ ํ๋์
]
});
calendar.render();
๊ธฐ๋ณธ์ ์ธ ์ผ์ ๊ณผ ๊ธด๊ธํ ์ผ์ ์ ๋ํ ๋ถ๋ถ๋ค์ ์๊น์ ๋ณ๋๋ก ์ค์ ํ์ฌ ์บ๋ฆฐ๋์ ์ถ๋ ฅํ ์ ์๋ค. ์ ์ฒด์ ์ธ ์ผ์ ์ ๊ฐ์ ์๊น๋ก ๋ถ์ฌํ ์ ์์ง๋ง, ๊ฐ๋ณ ์ผ์ ์ ์ค์ ํ ๋ 'backgroundColor' ์์ฑ์ ํตํด ๊ฐ๋ณ ์ผ์ ์์์ ์ค์ ํ ์ ์๋ค.
eventTextColor๋ก ๊ธ์ ์์ ๋ณ๊ฒฝ
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
eventColor: '#4caf50', // ์ด๋ก์ ๋ฐฐ๊ฒฝ
eventTextColor: '#ffffff', // ํฐ์ ๊ธ์
events: [
{ title: '์ผ์ 1', start: '2025-02-20' },
{ title: '์ผ์ 2', start: '2025-02-22' }
]
});
calendar.render();
editable
' ๋ฌ๋ ฅ์ ์๋ ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ '
editable ์ต์ ์ ์ด๋ฒคํธ๋ฅผ ๋๋๊ทธ ํ๊ณ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๋์์ ๋๊ฐ์ง ์ต์ ์ ์ปจํธ๋กค ํ ์ ์์ต๋๋ค. ๋ ๊ฐ์ง ์ต์ ์ ์ํ์ง ์๋ ๊ฒฝ์ฐ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ปจํธ๋กค ํ ์ ์๋ eventStartEdition ๋ฐ eventDurationEditable์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด๋น ์ต์ ์ ํ์ ํ๋ฌ๊ทธ์ธ( '@fullcalendar/core' )์ด ํ์ํฉ๋๋ค. ํด๋น ํ๋ฌ๊ทธ์ธ์ 'index.global.js'์ ํฌํจ๋์ด ์์ด global.js๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฌด๋ฆฌ์์ด ์ฌ์ฉํ ์ ์๋ค.
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
editable: true
// editable: false
});
calendar.render();
});
editable ์ต์ ์ด 'false'๋ก ๋นํ์ฑํ ๋์ด ์๋ค๋ฉด ์ ์์์ฒ๋ผ ์ด๋ ๋ฐ resize๊ฐ ๋ถ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์ต์ ๊ฐ์ 'true'์ธ ํ์ฑ์ผ๋ก ์ค์ ํ๋ค๋ฉด ์ด๋ ๋ฐ resize๊ฐ ๊ฐ๋ฅํ๋ค.
dayMaxEvents
' ํ๋ฃจ์ ํ์ํ ์ ์๋ ์ต๋ ์ด๋ฒคํธ ๊ฐ์ '
dayMaxEvents๋ ์บ๋ฆฐ๋์์ ํ๋ฃจ์ ํ์ํ ์ ์๋ ์ต๋ ์ด๋ฒคํธ ๊ฐ์๋ฅผ ์ค์ ํ๋ ์์ฑ์ผ๋ก ํด๋น ๊ฐ๋ณด๋ค ๋ ๋ง์ ์ด๋ฒคํธ๊ฐ ์์ ๊ฒฝ์ฐ, ๋๋จธ์ง ์ด๋ฒคํธ ๋ถ๋ถ์ '+๋๋ณด๊ธฐ'๋งํฌ๋ก ํ์๋ฉ๋๋ค. ํด๋น ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด ํด๋น ๋ ์ง์ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ํ์ธํ ์ ์๋ ํ์ ๋๋ ํ์ฅ ๋ทฐ๊ฐ ์ด๋ฆฝ๋๋ค. dayMaxEvents ์์ฑ์ ํ์ฉํ๋ฉด ํ๋ฃจ์ ์ด๋ฒคํธ๊ฐ ๋ง์ ๋ ๋ณด๋ค ๊น๋ํ ์ผ์ ์ ํ๊ธฐํ ์ ์๊ณ '+๋๋ณด๊ธฐ'์ ๊ฐ์ ๋งํฌ๋ก ๋๋จธ์ง ์ด๋ฒคํธ๋ฅผ ๊ด๋ฆฌ ํ ์ ์์ต๋๋ค.
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
events: [
{ title: 'ํ์ 1', start: '2025-02-10' },
{ title: 'ํ์ 2', start: '2025-02-10' },
{ title: 'ํ์ 3', start: '2025-02-10' },
{ title: 'ํ์ 4', start: '2025-02-10' },
{ title: 'ํ์ 5', start: '2025-02-10' }
],
dayMaxEvents: 3 // ํ๋ฃจ์ ์ต๋ 3๊ฐ์ ์ด๋ฒคํธ๋ง ํ์
// dayMaxEvents: true // true๋ก ์ค์ ์, ์ ์ ํ ๊ฐ์๋ก ์๋ ์ค์ ๋จ
});
calendar.render();
});
dayMaxEvents ์์ฑ์ ์ํ๋ ์ผ์ ์๋ฅผ ์ ๋ ฅํ ์๋ ์์ง๋ง, 'true' ๊ฐ์ผ๋ก๋ ์ค์ ํ ์ ์๋ค. ์์ฑ์ ๊ฐ์ true๋ก ์ค์ ์์๋ ์๋์ผ๋ก ์ ์ ํ ์ผ์ ๊ฐ์๋ก ์ ํ๋ฉ๋๋ค.
'+2 more' ๋ฒํผ์ ํด๋ฆญํ์ ๋ ํ์ ๊ณผ ๊ฐ์ ์ฐฝ์ด ๋ํ๋๋ฉด์ ์ ์ฒด ์ผ์ ์ ํ์ธํ ์ ์๋๋ฐ, more ๋ฒํผ์ ํด๋ฆญ ์ ์ด๋ฒคํธ๋ฅผ ์ง์ ์ ์ดํ๊ณ ์ถ๋ค๋ฉด 'moreLinkClick' ์์ฑ์ ํตํด ํด๋ฆญ ํ์ ๋์ ์ด๋ฒคํธ๋ฅผ ์ ์ดํ ์ ์๋ค.
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
events: [
{ title: 'ํ์ 1', start: '2025-02-10' },
{ title: 'ํ์ 2', start: '2025-02-10' },
{ title: 'ํ์ 3', start: '2025-02-10' },
{ title: 'ํ์ 4', start: '2025-02-10' },
{ title: 'ํ์ 5', start: '2025-02-10' }
],
dayMaxEvents: 3, // ํ๋ฃจ์ ์ต๋ 3๊ฐ์ ์ด๋ฒคํธ๋ง ํ์
// dayMaxEvents: true // true๋ก ์ค์ ์, ์ ์ ํ ๊ฐ์๋ก ์๋ ์ค์ ๋จ
moreLinkClick: function(info) {
alert('๋๋ณด๊ธฐ ํด๋ฆญ: ' + info.date);
// ์ฌ๊ธฐ์ ํ์
์ ์ด๊ฑฐ๋ ๋ค๋ฅธ ํ๋์ ์ ์ํ ์ ์์
return false; // ๊ธฐ๋ณธ ํ์
์ด๋ฆผ ๋ฐฉ์ง(false: ํ์
์ด๋ฆผ, true: ํ์
์์ด๋ฆผ)
}
});
calendar.render();
});
eventOverlap
' ๋๋๊ทธํ๊ณ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ์ด๋ฒคํธ๊ฐ ์๋ก ๊ฒน์น ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ '
eventOverlap ์์ฑ์ ์ผ์ (Event)์ด ์๋ก ๊ฒน์น ์ ์๋์ง ์ฌ๋ถ๋ฅผ ์ ์ดํ๋ ์์ฑ์ ๋๋ค. ๊ฒน์นจ ํ์ฉ/์ฐจ๋จ ๋ ์ค์ ํ๋๋ก ์ค์ ํ ์ ์๊ณ ๊ธฐ๋ณธ๊ฐ์ 'true' ์ ๋๋ค. ์ค์ ์ด 'false'๋ก ๋นํ์ฑํ ๋๋ค๋ฉด ์ด๋ ํ ์ด๋ฒคํธ๋ ๊ฒน์น ์ ์์ต๋๋ค. ์ด๋ฒคํธ ๊ฒน์นจ์ ๋ํ ํจ์๊ฐ ์ค์ ๋์ด ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ์ด๋ฒคํธ๋ฅผ ๋๋๊ทธํ๊ฑฐ๋ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ๋์ ๊ฐ์ด ๊ต์ฐจํ๋ ์ด๋ฒคํธ๊ฐ ์์ด ์์ ๋๋ง๋ค ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค. ํจ์ํธ์ถ์ eventOverlap ์์ฑ์ ๊ฐ์ด 'true'๋ก ํ์ฑํ๋์ด ์๋ ์ํ์ฌ์ผ ํ๋ฉฐ, ๋ ์ด๋ฒคํธ ๋ชจ๋๊ฐ ํ๋ฃจ ์ข ์ผ์ธ ๊ฒฝ์ฐ์๋ง ๊ฒน์นจ์ ํ์ฉํฉ๋๋ค.
// ๊ธฐ๋ณธ ์ค์
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'timeGridWeek',
events: [
{ title: '์ผ์ 1', start: '2025-02-10T10:00:00', end: '2025-02-10T12:00:00' },
{ title: '์ผ์ 2', start: '2025-02-10T11:00:00', end: '2025-02-10T13:00:00' }
]
});
calendar.render();
// ํน์ ์ผ์ ์๋ง ๊ฒน์นจ ํ์ฑํ (function์ ์ด์ฉํ ๋ฐฉ๋ฒ)
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'timeGridWeek',
eventOverlap: function(stillEvent, movingEvent) {
// "์ค์ ์ผ์ "์ ๊ฒน์น ์ ์์
if (stillEvent.title === '์ค์ ์ผ์ 1') {
return false; // ๊ฒน์นจ ๊ธ์ง
}
return true; // ๋๋จธ์ง๋ ๊ฒน์นจ ํ์ฉ
},
editable: true,
events: [
{ title: '์ค์ ์ผ์ 1', start: '2025-02-12T09:00:00', end: '2025-02-12T11:00:00' },
{ title: '์ผ๋ฐ ์ผ์ 2', start: '2025-02-12T10:00:00', end: '2025-02-12T12:00:00' }
]
});
calendar.render();
์์ฑ ์์ฝ
์์ฑ | ์ค๋ช | ์์ ๊ฐ |
eventOverlap | ์ผ์ ๊ฐ ๊ฒน์นจ ํ์ฉ ์ฌ๋ถ | true, false, function |
overlap (๊ฐ๋ณ ์ผ์ ) | ํด๋น ์ผ์ ์ ๋ํ ๊ฒน์นจ ํ์ฉ ์ฌ๋ถ | true, false |
nowIndicator
' ํ์ฌ ์๊ฐ์ ๋ํ๋ด๋ ๋ง์ปค๋ฅผ ํ์ํ ์ง ์ฌ๋ถ '
์ฌ์ฉ์๊ฐ ๋ฌ๋ ฅ์ ๋ณด๋ ๋์ ํ์๊ธฐ๊ฐ ํ์ฌ ๋ ์ง์ ์๊ฐ์ ํ์ํฉ๋๋ค. ํด๋น ์ต์ ์ ์ค์ ์ 'TimeGrid'์ ๊ฐ์ ์๊ฐ์ ํ์ธํ ์ ์๋ ํด๋น ์์ญ์์ ํ์ธํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ฌ 2025๋ 02์ 03์ผ ์คํ 17์ 10๋ถ์ด๋ผ๊ณ ๊ฐ์ ํ๋ค๋ฉด, ํด๋น ์ผ์์ ํด๋น ์๊ฐ ์์ญ์ ํ์๊ธฐ๊ฐ ๋นจ๊ฐ์ ์ ์ผ๋ก ํ์๋๋๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
nowIndicator : true
// nowIndicator : false
});
calendar.render();
});
๋ฌ๋ ฅ ๋ด, ํด๋น ๋ ์ง์ ํ์ฌ ์๊ฐ์ ํ์๊ธฐ๊ฐ ์๋์ผ๋ก ํ์๋๊ธฐ ๋๋ฌธ์ ํ์ฌ์ ์๊ฐ์ ๋ชจ๋ํฐ๋ง ํ๋๋ฐ ์ ์ฉํฉ๋๋ค.
titleFormat
' headerToolbar์ ์ ๋ชฉ์ ํ์๋ ํ ์คํธ๋ฅผ ์ค์ '
headerToolbar ์ต์ ์ ์ค์ ํ๋ฉด 'title'์ ํด๋นํ๋ ๋ ์ง ํ ์คํธ๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๋๋ฐ ๋ ์ง ํ ์คํธ๋ฅผ ์ด๋ค ํ์์ผ๋ก ์ถ๋ ฅํ ์ง๋ฅผ ๊ฒฐ์ ํ ์ ์๋ค. titleFormat์ ์ด์ฉํ์ฌ ๋ , ์, ์ผ์ ๋ค์ํ ํ์์ ํผ์ผ๋ก ๋ง์ถฐ์ ์ถ๋ ฅํ ์ ์๋๋ฐ 'year', 'month', 'day', 'weekday' ์์ฑ์ ํ์ฉํ๋ฉด ๋ /์/์ผ์ ์ค์ ํ ์ ์๋ค.
์์ฑ | ๊ฐ | ์ถ๋ ฅ ์ |
year | numeric | '2024' |
2-digit | '24' | |
month | long | 'September' |
short | 'Sep' | |
narrow | 'S' | |
numeric | '1' | |
2-digit | '01' | |
day | numeric | '3' |
2-digit | '03' | |
weekday | long | 'Wednesday' |
short | 'Wed' | |
narrow | 'W' | |
hour | numeric | '5' |
2-digit | '05' | |
minute | numeric | '6' |
2-digit | '06' | |
second | numeric | '9' |
2-digit | '09' | |
hour12 | true | 12์๊ฐ์ |
false | 24์๊ฐ์ | |
timeZoneName | short | 'long'์ FullCalendar์์ ์ ๊ณต X |
์ ํ์์ ๋ํ๋๋ฏ์ด ๊ฐ ์์ฑ์ ํด๋น ์์ฑ ๊ฐ์ ์ด์ฉํ์ฌ ๋ด๊ฐ ์ํ๋ ์ถ๋ ฅ ํํ์ ํ ์คํธ๋ก 'title'์ ํํ๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ถ๋ ฅํ ์ ์๋ค. ๊ธฐ์กด default๋ก ์ ๊ณต๋๋ title์ ์ด์ฉํด๋ ๋ฌด๋ฐฉํ์ง๋ง ์๊ธฐ๋ง์ title์ ๋ง๋ค ๋ ์ ์ฉํ ๊ฒ์ด๋ค.
var calendar = new FullCalendar.Calendar(calendarEl, {
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay'
},
views: {
dayGridMonth: {
titleFormat: {
year: 'numeric',
month: '2-digit',
day: '2-digit'
}
}
}
});
'title'์ ๋ํ๋๊ณ ์๋ ๋ ์ง ํ์์ ๋ฌธ์์ด์ ์์ฑ๊ณผ ์์ฑ ๊ฐ๋ค์ ์ด์ฉํ์ฌ ์ถ๋ ฅ๋ ๊ฐ๋ฅํ์ง๋ง, Moment JS์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ด์ฉํด๋ ํจ์ฌ ๊ฐ๋จํ๊ฒ ์ถ๋ ฅํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ 'titleFormat' ์์ฑ์ function์ ์ง์ ํด ์ง์ ์์ ์ง์ ๋ ๊ฐ๋ฅํ๋ค.
buttonText
' headerToolbar, footerToolbar์ ๋ฒํผ์ ํ์๋ ํ ์คํธ '
headerToolbar, footerToolbar์์ ๋ฒํผ์ ํ์๋ ํ ์คํธ๋ฅผ ์ค์ ํฉ๋๋ค. 'today', 'month', 'week', 'day', 'list' ๋ฒํผ์ ํ ์คํธ๋ default ๊ฐ์ผ๋ก ์์ฑ๋ช ๊ณผ ๋์ผํ๋ค( 'today', 'month', 'week', 'day', 'list' ). ๋ฒํผ๋ช ์ ๋ณ๊ฒฝํ๊ณ ์ ํ ๋์๋ 'buttonText' ์์ฑ์ ์ด์ฉํ์ฌ ๋ฒํผ๋ช ์ ๋ณ๊ฒฝํ ์ ์๋ค.
var calendar = new FullCalendar.Calendar(calendarEl, {
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay',
},
buttonText: {
today : 'ํ์ฌ๋ ์ง',
month : '์',
week: '์ฃผ',
day: '์ผ',
list: '๋ชฉ๋ก'
}
});
themeSystem
' ์ฃผ์ด์ง ํ ๋ง ์์คํ ์ผ๋ก ๋ฌ๋ ฅ์ ๋๋๋ง '
themeSystem ์์ฑ์ FullCalendar์ ๊ธฐ๋ณธ CSS๋ฅผ ์ด์ฉํ์ฌ ๋ฌ๋ ฅ ๋์์ธ ํํ๋ฅผ ์ค์ ํ๊ฑฐ๋ BootStrap์ ์ด์ฉํ์ฌ ๋ฌ๋ ฅ ๋์์ธ ํํ๋ฅผ ์ค์ ํ ์ ์๋ค. BootStrap4์ BootStrap5 ๋ฒ์ ๋ ๊ฐ ์ค ํ ๊ฐ์ง๋ฅผ ์ ํํ์ฌ ์ค์ ํ ์ ์๋ค. themeSystem ์์ฑ์ 'standard'๊ฐ default๊ฐ์ด๊ณ , 'bootstrap', 'bootstrap5' ๋ ๊ฐ์ ์์ฑ๊ฐ์ด ์กด์ฌํ๋ค.
BootStrap5 ๋ฒ์ ์ผ๋ก ๋ฌ๋ ฅ ๋์์ธ์ ์ค์ ํ๊ธฐ ์ํด์๋ ๊ด๋ จ CSS์ JS๊ฐ ํ์ํ๋ค. ์๋จ์ linkํ๊ทธ๋ฅผ ํ์ฉํ์ฌ CSS๋ฅผ ์ถ๊ฐํ๊ณ ํ๋จ์๋ scriptํ๊ทธ๋ฅผ ํ์ฉํ์ฌ JS๋ฅผ ์ถ๊ฐํ๋ค.
๋ถํธ์คํธ๋ฉ 5 ๊ด๋ จ CSS์ ๋ถํธ์คํธ๋ฉ Icon๊ด๋ จ CSS๋ฅผ ์ถ๊ฐ
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css' rel='stylesheet'>
<link href='https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css' rel='stylesheet'>
๋ถํธ์คํธ๋ฉ5 ๊ด๋ จ JS๋ฅผ ์ถ๊ฐ
<script src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.14/index.global.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@fullcalendar/bootstrap5@6.1.14/index.global.min.js"></script>
var calendar = new FullCalendar.Calendar(calendarEl, {
themeSystem: 'bootstrap5', // BootStrap5 ๋ฒ์ ์ผ๋ก ๋์์ธ ์ค์
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay',
},
buttonText: {
today : 'ํ์ฌ๋ ์ง',
month : '์',
week: '์ฃผ',
day: '์ผ',
list: '๋ชฉ๋ก'
},
events: 'https://fullcalendar.io/api/demo-feeds/events.json'
});
๋ถํธ์คํธ๋ฉ ๊ด๋ จ CSS์ JS๋ฅผ ํ์ฉํ์ฌ FullCalendar JS themeSystem์ ๋ถํธ์คํธ๋ฉ5 ๋ฒ์ ์ ๋ฌ๋ ฅ ๋์์ธ์ผ๋ก ์ค์ ํ๋ค. ๊ธฐ์กด ๊ฒ์์์ผ๋ก ๋์์ธ๋์ด ์๋ ๋ฒํผ๋ค์ ์๊น๊ณผ ๋์์ธ์ด ๋ถํธ์คํธ๋ฉ ๊ธฐ๋ณธ primary ์ข ๋ฅ์ ์๊น๊ณผ ๋์์ธ์ผ๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
FullCalendar JS๋ฅผ ์๊ฐํ๋ ๋ด์ฉ์, FullCalendar ๊ณต์ ํํ์ด์ง์ ๋ด์ฉ์ ์ ๊ทน ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ๊ธ์์ ๋ช ์ํฉ๋๋ค. ๋ชจ๋ ๋ด์ฉ์ ๊ณต์ ํํ์ด์ง ๋ฉ์ธ ๋ด์ฉ ๋ฐ Documents๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์์ต๋๋ค.
@Junesker
๋๊ธ