1. ๋ฌ๋ ฅ ์ด๋ฒคํธ ์์
์ผ๋จ ์์ ํ๊ธฐ ์ ๋ฌ๋ ฅ ์ด๋ฒคํธ๋ฅผ ํด๋ฆญํ๋ฉด ํด๋ฆญ๋ ์ด๋ฒคํธ์ ์ ๋ณด๋ฅผ ๋ชจ๋ฌ์ ํ์ํ๊ณ ์ถ์๋ค.
ํ์บ๋ฆฐ๋์ ์ด๋ฒคํธํด๋ฆญ ์์ฑ์ด ์์ด์ ์ด๊ฑธ ์ฌ์ฉํ๋ค. => eventClick : function(info) { }
1-1. ์์ฑ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
์ด๋ฒคํธ ๊ฐ์ฒด์๋ ์ฌ๋ฌ๊ฐ์ง ์์ฑ๋ค์ด ์์
id : ์ด๋ฒคํธ์ ๊ณ ์ ์๋ณ์
title : ์ด๋ฒคํธ์ ์ ๋ชฉ
start / startStr : ์ด๋ฒคํธ์ ์์ ์ผ์
end / endStr : ์ด๋ฒคํธ์ ์ข ๋ฃ ์ผ์
extendedProps : ์ถ๊ฐ์ ์ธ ์ฌ์ฉ์ ์ ์ ์์ฑ
...
// Firebase์์ ์ผ์ ๊ฐ์ ธ์ค๊ธฐ
function loadEvents(fetchInfo, successCallback, failureCallback) {
db.collection("events").get().then((querySnapshot) => {
let events = [];
querySnapshot.forEach((doc) => {
const eventData = doc.data();
events.push({
title: eventData.subject,
start: eventData.start,
end: eventData.end,
id : eventData.docName,
subject : eventData.title
});
});
successCallback(events); // ๊ฐ์ ธ์จ ์ด๋ฒคํธ ๋ฐฐ์ด ์ ๋ฌ
})
.catch(function(error) {
console.error("์ผ์ ๋ถ๋ฌ์ค๊ธฐ ์ค๋ฅ:", error);
failureCallback(error); // ์ค๋ฅ ๋ฐ์ ์ ์คํจ ์ฝ๋ฐฑ ํธ์ถ
});
}
์ผ์ ์ ๊ฐ์ ธ์ฌ ๋ title ๊ฐ์ด ์ ํด์ ธ ์๋ ์์ฑ์ ๊ฐ์ ๋ฃ์ด ๊ฐ์ ธ์ค๋ฉด
info.event.title ๋ก ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๊ณ
subject ๊ฐ์ด ์ ํด์ ธ์๋ ์์ฑ๊ฐ์ด ์๋ ์ฌ์ฉ์๊ฐ ๋ง๋ ์์ฑ๊ฐ์ ๊ฐ์ ๋ฃ์ด ๊ฐ์ ธ์ค๋ฉด
info.event.extendedProps.subject๋ก ๊ฐ์ ๊ฐ์ ธ ์ฌ ์ ์์.
eventClick: function(info) { // ํด๋ฆญ๋ ์ด๋ฒคํธ์ ์ ๋ณด๋ฅผ ๋ชจ๋ฌ์ ํ์
$('.submitBtn').text('์์ ');
$('#docName').val(info.event.id);
$('#subject').val(info.event.title);
$('#title').val(info.event.extendedProps.subject);
$('#start').val(info.event.startStr.substring(0, 10));
$('#end').val(info.event.endStr.substring(0, 10));
$('#addEventModal').modal('show');
}
ํด๋ฆญํ ์ผ์ ์ ์ ๊ฐ์ ธ์ค๋ ๊ฑธ ํ์ธ ํ ์ ์๋ค.
1-2. ์์ ๋ก์ง ๋ง๋ค๊ธฐ
๋๋ firebase db๋ฅผ ์ฌ์ฉํ๋๋ฐ, firebase์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ ์ถ๊ฐ ๋ฉ์๋๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.
add( ) : ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋ ์ฌ์ฉ. ์ด ๋ฉ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ฉด Firebase๊ฐ ์๋์ผ๋ก ๊ณ ์ ID๋ฅผ ํ ๋นํจ.
set( ) : ํน์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ ํ ๋ ์ฌ์ฉ. ๋ฐ์ดํฐ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ค์ผ ํ๋ฉฐ, ๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ ๋ฐ์ดํธ๋ฅผ ํ๊ณ , ์์ผ๋ฉด ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ฑํจ.
ํ๋์ ํจ์์์ ๋ฐ์ดํฐ ์ ์ฅ, ์์ ์ ํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ set ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์๋ค.
โ ์์ฑ, ์์ ์ ๊ตฌ๋ถ ํ ์ ์๋๋ก HTML ๋ชจ๋ฌ๋ถ๋ถ์ hidden input ํ๋ ์์ฑ
<div class="mb-3">
<input type="hidden" class="form-control" id="docName">
</div>
โก ๊ณ ์ ์์ด๋ ์์ฑ
$('#eventForm').submit(function(e) {
e.preventDefault(); // ํผ์ ๊ธฐ๋ณธ ๋์ ๋ฐฉ์ง
// ์
๋ ฅ๋ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
const subject = $('#subject').val();
const title = $('#title').val();
const start = $('#start').val();
const end = $('#end').val();
const doc = $('#docName').val();
doc ? docName = doc : docTime(); // ์์ : ์์ฑ
// Firebase์ ๊ณผ์ ์ถ๊ฐ
db.collection("events").doc(docName).set({
docName : docName,
subject : subject,
title: title,
start: start+"T00:00",
end: end+"T23:59"
})
.then(function() {
$('#addEventModal').modal('hide'); // ๋ชจ๋ฌ ๋ซ๊ธฐ
calendar.refetchEvents(); // ๋ฌ๋ ฅ ๊ฐฑ์
resetForm();
})
.catch(function(error) {
console.error("๊ณผ์ ์ถ๊ฐ ์ค๋ฅ:", error);
});
});
* docName์ ๊ฐ์ธ์ ์ผ๋ก ๋ง๋ ๊ณ ์ ID์ด๋ค.
์์์ ๋ง๋ hidden input์
๊ฐ์ด ์์ ๊ฒฝ์ฐ (=์์ ) ํด๋น ์ผ์ ์ ๊ณ ์ ID๋ฅผ ๊ฐ์ ธ์ค๊ณ ,
๊ฐ์ด ์์ ๊ฒฝ์ฐ (=์์ฑ) docTime์ด๋ผ๋ ํจ์๋ฅผ ํตํด ๊ณ ์ ID๋ฅผ ์๋ก ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ set ๋ฉ์๋๋ฅผ ํตํด docName์ด ์์ ๊ฒฝ์ฐ ์์ , ์์ ๊ฒฝ์ฐ ์์ฑํ๋ ๋ก์ง์ ๋ง๋ค์๋ค.
์ ์์ ์ผ๋ก ์์ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค!
2. ๋ฌ๋ ฅ ์ด๋ฒคํธ ์ญ์
์ฐ์ ์์ ์ผ ๊ฒฝ์ฐ์๋ง ์ญ์ ๋ฒํผ์ด ๋ณด์ด๋๋ก ๋ง๋ค์ด ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ญ์ ๋ฒํผ์ ๋๋ ์ ๋ ์ผ์ ์ด ์ญ์ ๋๋๋ก ์ฝ๋๋ฅผ ์งฐ๋ค.
// ์ด๋ฒคํธ ์ญ์
$('.delBtn').click(function() {
var docName = $('#docName').val(); // ์ญ์ ํ ์ด๋ฒคํธ์ ๊ณ ์ ID ๊ฐ์ ธ์ค๊ธฐ
if (confirm('๊ณผ์ ๋ฅผ ์ญ์ ํ์๊ฒ ์ต๋๊น?')) {
db.collection("events").doc(docName).delete().then(function() {
$('#addEventModal').modal('hide');
calendar.refetchEvents(); // ๋ฌ๋ ฅ ๊ฐฑ์
resetForm(); // ํผ ์ด๊ธฐํ
}).catch(function(error) {
console.error("์ด๋ฒคํธ ์ญ์ ์ค ์ค๋ฅ ๋ฐ์:", error);
});
}
});
์ญ์ ์๋ฃ ๐ฅฐ