๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/JavaScript โ–ช JQuery

[FullCalendar] ํ’€์บ˜๋ฆฐ๋” ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ฌ๋ ฅ ์ƒ์„ฑ3 (๋‹ฌ๋ ฅ ์ด๋ฒคํŠธ ์ˆ˜์ •, ์‚ญ์ œ)

by YeonBu 2024. 2. 16.
728x90

 

 

 

 

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);
        });
    }
    
});

 

 

์‚ญ์ œ ์™„๋ฃŒ ๐Ÿฅฐ

 

 

 

๋ฐ˜์‘ํ˜•