Framework/Spring Framework

(23.01.18)Spring ํ”„๋ ˆ์ž„์›Œํฌ + Thymeleaf ๋กœ FullCalendar ์ด๋ฏธ์ง€ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋ฐ ์ด๋ฒคํŠธ ์˜จํด๋ฆญ(onClick)์ฒ˜๋ฆฌํ•˜๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2023. 1. 23.

Spring + Thymeleaf ๋กœ FullCalendar ์ด๋ฏธ์ง€ ๋‚˜ํƒ€๋‚ด๊ธฐ

๋ฐ ์ด๋ฒคํŠธ ์˜จํด๋ฆญ(onClick)์ฒ˜๋ฆฌํ•˜๊ธฐ

 

 

๋‹ฌ๋ ฅ์„ ๋ทฐ๋กœ ๋„์šธ ๋•Œ ๋งŽ์ด ์“ฐ๋Š” ๋‹ฌ๋ ฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.

๋ฐ”๋กœ fullcalendar์ธ๋ฐ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ฌ๋ ฅ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

fullcalendar์€ ์ผ์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹ฌ๋ ฅ์— ์นœํ™”์ ์ธ๋ฐ ์ด๋ฅผ ์กฐ๊ธˆ ์‘์šฉํ•˜์—ฌ ์ผ๊ธฐ ๋‹ฌ๋ ฅ์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

์ผ๊ธฐ๋ฅผ ์“ฐ๋ฉด ํ•ด๋‹น ๋‚ ์งœ์— ํ”„๋กœํ•„ ์‚ฌ์ง„์ด ๋œจ๊ณ  ํ”„๋กœํ•„์„ ๋ˆ„๋ฅด๋ฉด ์ผ๊ธฐ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

 

https://fullcalendar.io/

 

FullCalendar - JavaScript Event Calendar

Open Source... With over 10 years of open source and over 120 contributors, FullCalendar will always have a free and open source core. Learn more

fullcalendar.io

์—์„œ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ปค์Šคํ…€๋งˆ์ด์ง• ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  css๋‚˜ ํ‹€์„ cdn ์œผ๋กœ ๋ฐ›์•„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

Thymeleaf ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๋‹ฌ๋ ฅ์— ํ‘œ์‹œํ•˜๊ธฐ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<style>
.calbox {
    width: 25px;
    height: 25px; 
    border-radius: 70%;
    overflow: hidden;
}
.calprofile {
    width: 100%;
    height: 100%;
    object-fit: cover;
}
</style>
  <script th:inline="javascript">
  /*<![CDATA[*/
  document.addEventListener('DOMContentLoaded'function() {
      var calendarEl = document.getElementById('calendar');
      var calendar = new FullCalendar.Calendar(calendarEl, {
         initialView : 'dayGridMonth'// ์ดˆ๊ธฐ ๋กœ๋“œ ๋ ๋•Œ ๋ณด์ด๋Š” ์บ˜๋ฆฐ๋” ํ™”๋ฉด(๊ธฐ๋ณธ ์„ค์ •: ๋‹ฌ)
         headerToolbar : { // ํ—ค๋”์— ํ‘œ์‹œํ•  ํˆด ๋ฐ”
            start : 'prev next today',
            center : 'title',
            end : 'dayGridMonth,dayGridWeek,dayGridDay'
         },
         titleFormat : function(date) {
            return date.date.year + '๋…„ ' + (parseInt(date.date.month) + 1+ '์›”';
         },
         //initialDate: '2021-07-15', // ์ดˆ๊ธฐ ๋‚ ์งœ ์„ค์ • (์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋Š˜ ๋‚ ์งœ๊ฐ€ ๋ณด์ธ๋‹ค.)
         selectable : false// ๋‹ฌ๋ ฅ ์ผ์ž ๋“œ๋ž˜๊ทธ ์„ค์ •๊ฐ€๋Šฅ
         droppable : false,
         editable : true,
         nowIndicator: true// ํ˜„์žฌ ์‹œ๊ฐ„ ๋งˆํฌ
         locale: 'ko'// ํ•œ๊ตญ์–ด ์„ค์ •
         events: 
            [
                /*[# th:each="calendar : ${list}"]*/
                {
                   start:/*[[${calendar['DTIME']}]]*/,
                   image_url:/*[[${calendar['PROFILE']}]]*/,
                   url:"/dageul/detailDiary/"+/*[[${calendar['DNUM']}]]*/
                },
                /*[/]*/
                
            ],
          eventContent: function(arg) {
                   let arrayOfDomNodes = []
                   
                   
                   // image event
                   let imgEventWrap = document.createElement('div')
                   if(arg.event.extendedProps.image_url) {
                     let imgEvent = '<div class=\"calbox\" style=\"background: #BDBDBD;\"><img class=\"calprofile\" src=\"/dageul/getpic/getprofile/'+arg.event.extendedProps.image_url+'" ></a></div>'
                     imgEventWrap.classList = "fc-event-img"
                     imgEventWrap.innerHTML = imgEvent;
                   }
       
                   arrayOfDomNodes = [imgEventWrap]
       
                   return { domNodes: arrayOfDomNodes }
                 },
                 eventClick:function(event) {
                      if(event.url) {
                        location.href=event.url;
                      }
                    }
      });
      calendar.render();
   });
  /*]]>*/
  </script>
cs

 

 

Thymeleaf ๋ฅผ javascript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๋จผ์ € 14์—ด ์ฒ˜๋Ÿผ ์„ ์–ธํ•ด์ฃผ๊ณ  15์—ด๊ณผ 69์—ด ์ฒ˜๋Ÿผ ์ „์ฒด๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌ๋œ CDATA๋ฌธ์„ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผํ•œ๋‹ค. 36์—ด๊ณผ 42์—ด ์ฒ˜๋Ÿผ ๋ฐ˜๋ณต๋ฌธ์„ ์จ์•ผํ•˜๋Š” Thymeleaf ์€ th:each๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌํ•˜์—ฌ ์“ฐ๊ณ  ๋ฐ์ดํ„ฐ ๋˜ํ•œ ์ฃผ์„์ฒ˜๋ฆฌํ•˜์—ฌ ์“ฐ๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ธ์‹ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. 

 

๊ตฌ๊ธ€์— ๋ณด๋ฉด ํ’€์บ˜๋ฆฐ๋”์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋„์šธ๋•Œ eventRender์„ ๋งŽ์ด ์“ฐ๋˜๋ฐ <img >ํƒœ๊ทธ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜์—ฌ  45์—ด~60์—ด ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ผ๋‹ค. ์•ž์— <div class=\"calbox\" style=\"background: #BDBDBD;\">ํƒœ๊ทธ์™€ img ํƒœ๊ทธ์— id๋ฅผ ์ค€๊ฒƒ์€ css๋ฅผ ํ†ตํ•˜์—ฌ ํ”„๋กœํ•„ ์‚ฌ์ง„ ํฌ๊ธฐ์™€ ๋™๊ทธ๋ž—๊ฒŒ ํ‘œ์‹œ ๋˜๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์ฐธ๊ณ  ํŽ˜์ด์ง€ - ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ

https://stackoverflow.com/questions/40266483/fullcalendar-images-as-events

 

FullCalendar - Images as events

Looking to use Full Calendar and to include images as events and draggable. In short, would love to see how this example https://fullcalendar.io/js/fullcalendar-3.0.1/demos/external-dragging.html w...

stackoverflow.com

 

 

61์—ด~ 65์—ด์„ ํ†ตํ•˜์—ฌ ํด๋ฆญํ•˜๋ฉด ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋„ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋‹ค. ์ผ๊ธฐ์— ํ•ด๋‹น ๋ฒˆํ˜ธ๋ฅผ ์„œ๋ฒ„์ธก์—์„œ ์ฃผ์–ด 

ํ”„๋กœํ•„์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋ฒˆํ˜ธ์˜ ์ผ๊ธฐ ์ƒ์„ธ๋ณด๊ธฐ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ํ•ด์ฃผ์—ˆ๋‹ค.

 

 

 

์ปจํŠธ๋กค์—์„œ ๋ฟŒ๋ ค์ฃผ๋Š” ๋ฐ์ดํ„ฐ

 

 

์‹คํ–‰ ๊ฒฐ๊ณผ : 

 

 

๋Œ“๊ธ€