diff options
Diffstat (limited to 'public/js/calendar.js')
-rw-r--r-- | public/js/calendar.js | 181 |
1 files changed, 127 insertions, 54 deletions
diff --git a/public/js/calendar.js b/public/js/calendar.js index 3046ef0..22cdab3 100644 --- a/public/js/calendar.js +++ b/public/js/calendar.js | |||
@@ -1,3 +1,19 @@ | |||
1 | /* // à utiliser plus tard? | ||
2 | const current_view = calendar.view; | ||
3 | switch(current_view.type){ | ||
4 | case 'dayGridMonth': | ||
5 | console.log('mois'); | ||
6 | break; | ||
7 | case 'timeGridWeek': | ||
8 | console.log('semaine'); | ||
9 | break; | ||
10 | case 'timeGridDay': | ||
11 | console.log('jour'); | ||
12 | break; | ||
13 | default: | ||
14 | console.log('erreur'); | ||
15 | }*/ | ||
16 | |||
1 | document.addEventListener('DOMContentLoaded', function(){ | 17 | document.addEventListener('DOMContentLoaded', function(){ |
2 | const calendarEl = document.getElementById('calendar'); | 18 | const calendarEl = document.getElementById('calendar'); |
3 | let selected_start_string = null; | 19 | let selected_start_string = null; |
@@ -35,29 +51,48 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
35 | 51 | ||
36 | select: function(info){ | 52 | select: function(info){ |
37 | const aside = document.querySelector('aside'); | 53 | const aside = document.querySelector('aside'); |
38 | let start_value; | 54 | let checked = ''; |
55 | let input = 'datetime-local'; | ||
39 | 56 | ||
40 | // on veut des chaines de la forme 2025-05-20T07:05 | 57 | // on veut des chaines de la forme 2025-05-20T07:05 |
41 | // il faut retirer les secondes et le fuseau horaire du format ISO, c'est chiant | 58 | // il faut retirer les secondes et le fuseau horaire du format ISO, c'est chiant |
42 | // enverra par contre une chaine ISO au serveur pour avoir un enregistrement correct | 59 | // on enverra par contre une chaine ISO au serveur pour avoir un enregistrement correct |
43 | //selected_start = document.getElementById('event_start'); | ||
44 | 60 | ||
61 | let start_value; | ||
62 | let end_value; | ||
45 | const end = new Date(info.endStr); | 63 | const end = new Date(info.endStr); |
64 | |||
65 | console.log(info.startStr); | ||
66 | console.log(info.endStr); | ||
67 | |||
46 | if(calendar.view.type == 'dayGridMonth'){ | 68 | if(calendar.view.type == 'dayGridMonth'){ |
47 | start_value = info.startStr + 'T10:00'; | 69 | start_value = info.startStr + 'T10:00'; |
48 | end.setDate(end.getDate() - 1); | 70 | end.setDate(end.getDate() - 1); // jour de fin modifié pour ne pas faire bizarre pour l'utilisateur |
49 | end.setHours(11); | 71 | end.setHours(11); |
50 | } | 72 | } |
51 | else if(calendar.view.type == 'timeGridWeek' || calendar.view.type == 'timeGridDay'){ | 73 | else if(calendar.view.type == 'timeGridWeek' || calendar.view.type == 'timeGridDay'){ |
52 | const start_array = info.startStr.split("T"); | 74 | const start_array = info.startStr.split("T"); |
53 | start_value = start_array[0] + "T" + start_array[1].substr(0,5); // format 2025-06-12T10:00 | 75 | const end_array = info.endStr.split("T"); |
54 | } | ||
55 | 76 | ||
56 | const end_value = end.toISOString().split('T')[0] + "T" + String(end.getHours()).padStart(2, '0') + ":" + String(end.getMinutes()).padStart(2, '0'); | 77 | // clic sur la ligne "Journée", = 'dayGridMonth' |
57 | selected_start_string = start_value; | 78 | if(start_array.length == 1){ |
79 | checked = 'checked'; | ||
80 | input = 'date'; | ||
81 | start_value = info.startStr; | ||
82 | end.setDate(end.getDate() - 1); | ||
83 | end_value = end.toISOString().split('T')[0]; | ||
84 | } | ||
85 | else if(start_array.length == 2){ | ||
86 | start_value = start_array[0] + "T" + start_array[1].substr(0,5); // format 2025-06-12T10:00 | ||
87 | end_value = end_array[0] + "T" + end_array[1].substr(0,5); | ||
88 | } | ||
89 | else{ | ||
90 | console.log('pas censé se produire'); | ||
91 | return; | ||
92 | } | ||
93 | } | ||
58 | 94 | ||
59 | //console.log(info.endStr); | 95 | selected_start_string = start_value; // variable "globale" |
60 | //console.log(end_value.value); | ||
61 | 96 | ||
62 | const aside_content = `<div class="form_event"> | 97 | const aside_content = `<div class="form_event"> |
63 | <div class="event_title_box"> | 98 | <div class="event_title_box"> |
@@ -68,16 +103,16 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
68 | <input type="text" id="event_title"> | 103 | <input type="text" id="event_title"> |
69 | </div> | 104 | </div> |
70 | <div class=""> | 105 | <div class=""> |
71 | <input type="checkbox" id="event_all_day"> | 106 | <input type="checkbox" id="event_all_day" class="event_all_day" ` + checked + `> |
72 | <label for="event_all_day">Journée entière</label> | 107 | <label for="event_all_day">Journée entière</label> |
73 | </div> | 108 | </div> |
74 | <div class=""> | 109 | <div class=""> |
75 | <label for="event_start">Début</label> | 110 | <label for="event_start">Début</label> |
76 | <input type="datetime-local" id="event_start" value="` + start_value + `"> | 111 | <input type="` + input + `" id="event_start" value="` + start_value + `"> |
77 | </div> | 112 | </div> |
78 | <div class=""> | 113 | <div class=""> |
79 | <label for="event_end">Fin</label> | 114 | <label for="event_end">Fin</label> |
80 | <input type="datetime-local" id="event_end" value="` + end_value + `"> | 115 | <input type="` + input + `" id="event_end" value="` + end_value + `"> |
81 | </div> | 116 | </div> |
82 | <div class=""> | 117 | <div class=""> |
83 | <label for="event_color">Couleur</label> | 118 | <label for="event_color">Couleur</label> |
@@ -89,23 +124,24 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
89 | aside.innerHTML = aside_content; | 124 | aside.innerHTML = aside_content; |
90 | calendar.updateSize(); | 125 | calendar.updateSize(); |
91 | }, | 126 | }, |
92 | //~ unselect: function(event, view) { | 127 | //unselect: function(event, view){}, |
93 | //~ const aside = document.querySelector('aside'); | ||
94 | //~ aside.innerHTML = ''; | ||
95 | //~ //calendar.updateSize(); | ||
96 | //~ }, | ||
97 | eventClick: function(info){ | 128 | eventClick: function(info){ |
98 | const aside = document.querySelector('aside'); | 129 | const aside = document.querySelector('aside'); |
99 | const checked = info.event.allDay ? 'checked' : ''; | 130 | const checked = info.event.allDay ? 'checked' : ''; |
100 | const input = info.event.allDay ? 'date' : 'datetime-local'; | 131 | const input = info.event.allDay ? 'date' : 'datetime-local'; |
101 | 132 | ||
102 | // change des objets Date en chaînes compatibles avec des input type datetime-local, ex: 2025-05-20T07:05 | 133 | // change des objets Date en chaînes compatibles avec les input |
103 | function formatDate(date, all_day){ | 134 | function formatDate(date){ |
104 | return date.getFullYear() + '-' + (date.getMonth() + 1).toString().padStart(2, '0') + '-' + date.getDate().toString().padStart(2, '0') | 135 | return date.getFullYear() + '-' + (date.getMonth() + 1).toString().padStart(2, '0') + '-' + date.getDate().toString().padStart(2, '0') |
105 | + (all_day ? '' : 'T' + date.getHours().toString().padStart(2, '0') + ':' + date.getMinutes().toString().padStart(2, '0')); | 136 | + (info.event.allDay ? '' : 'T' + date.getHours().toString().padStart(2, '0') + ':' + date.getMinutes().toString().padStart(2, '0')); |
137 | } | ||
138 | function getEndMinusOneDay(date){ | ||
139 | date.setDate(date.getDate() - 1); // jour de fin modifié pour ne pas faire bizarre pour l'utilisateur | ||
140 | return date; | ||
106 | } | 141 | } |
107 | const formated_start = formatDate(info.event.start, info.event.allDay); | 142 | |
108 | const formated_end = formatDate(info.event.end, info.event.allDay); | 143 | const formated_start = formatDate(info.event.start); |
144 | const formated_end = formatDate(info.event.allDay ? getEndMinusOneDay(info.event.end) : info.event.end, info.event.allDay); | ||
109 | 145 | ||
110 | const aside_content = `<div class="form_event"> | 146 | const aside_content = `<div class="form_event"> |
111 | <div class="event_title_box"> | 147 | <div class="event_title_box"> |
@@ -156,63 +192,100 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
156 | function submitEvent(new_event){ | 192 | function submitEvent(new_event){ |
157 | const event_title = document.getElementById('event_title').value; | 193 | const event_title = document.getElementById('event_title').value; |
158 | const event_all_day = document.getElementById('event_all_day').checked; | 194 | const event_all_day = document.getElementById('event_all_day').checked; |
159 | const event_start = document.getElementById('event_start').value; | 195 | let event_start = document.getElementById('event_start').value; |
160 | const event_end = document.getElementById('event_end').value; | 196 | let event_end = document.getElementById('event_end').value; |
161 | const event_color = document.getElementById('event_color').value; // #3788d8 par défaut | 197 | const event_color = document.getElementById('event_color').value; // #3788d8 par défaut |
162 | const event_id = new_event ? '' : document.getElementById('event_id').value; | 198 | const event_id = new_event ? '' : document.getElementById('event_id').value; |
163 | 199 | ||
164 | if(event_title.length !== 0 && event_start.length !== 0 && event_end.length !== 0 && event_color.length !== 0 | 200 | if(event_title.length !== 0 && event_start.length !== 0 && event_end.length !== 0 && event_color.length !== 0 |
165 | && (new_event || event_id.length !== 0)) | 201 | && (new_event || event_id.length !== 0)) |
166 | { | 202 | { |
167 | const event_start_utc = new Date(event_start).toISOString(); // heure UTC pour fullcalendar (et pour le serveur) | 203 | if(event_all_day){ |
168 | const event_end_utc = new Date(event_end).toISOString(); | 204 | // on remet le jour de fin exclu |
205 | const tmp_object = new Date(event_end); | ||
206 | tmp_object.setDate(tmp_object.getDate() + 1); | ||
207 | event_end = tmp_object.toISOString().split('T')[0]; | ||
208 | } | ||
209 | else{ | ||
210 | event_start = new Date(event_start).toISOString(); | ||
211 | event_end = new Date(event_end).toISOString(); | ||
212 | } | ||
213 | console.log(event_end); | ||
169 | 214 | ||
170 | if(event_start_utc >= event_end_utc){ | 215 | if(event_start > event_end || (!event_all_day && event_start == event_end)){ |
171 | return; | 216 | return; |
172 | } | 217 | } |
173 | 218 | ||
174 | // création | 219 | // création |
175 | if(new_event){ | 220 | if(new_event){ |
176 | /*const current_view = calendar.view; | 221 | const event = { |
177 | switch(current_view.type){ | ||
178 | case 'dayGridMonth': | ||
179 | console.log('mois'); | ||
180 | break; | ||
181 | case 'timeGridWeek': | ||
182 | console.log('semaine'); | ||
183 | break; | ||
184 | case 'timeGridDay': | ||
185 | console.log('jour'); | ||
186 | break; | ||
187 | default: | ||
188 | console.log('erreur'); | ||
189 | }*/ | ||
190 | calendar.addEvent({ | ||
191 | // pas d'id, c'est au serveur de le créer | ||
192 | title: event_title, | 222 | title: event_title, |
193 | allDay: event_all_day, | 223 | allDay: event_all_day, |
194 | start: event_start_utc, | 224 | start: event_start, |
195 | end: event_end_utc, | 225 | end: event_end, |
196 | color: event_color | 226 | color: event_color |
227 | }; | ||
228 | |||
229 | fetch('../src/post-ajax.php', { | ||
230 | method: 'POST', | ||
231 | headers: { | ||
232 | 'Content-Type': 'application/json', | ||
233 | }, | ||
234 | body: JSON.stringify(event), | ||
235 | }) | ||
236 | .then(response => response.json()) | ||
237 | .then(data => { | ||
238 | if(data.success){ | ||
239 | event.id = data.id; | ||
240 | calendar.addEvent(event); | ||
241 | hideModal(); | ||
242 | } | ||
243 | }) | ||
244 | .catch((error) => { | ||
245 | console.error('Error:', error); | ||
197 | }); | 246 | }); |
247 | |||
198 | } | 248 | } |
199 | // modification | 249 | // modification |
200 | else{ | 250 | else{ |
201 | const event = calendar.getEventById(event_id); | 251 | const event = calendar.getEventById(event_id); |
202 | 252 | ||
203 | if(event){ | 253 | if(event){ |
204 | event.setProp('title', event_title); | 254 | const event_copy = { |
205 | event.setAllDay(event_all_day); | 255 | id: parseInt(event.id), |
206 | event.setStart(event_start_utc); | 256 | title: event_title, |
207 | event.setEnd(event_end_utc); | 257 | allDay: event_all_day, |
208 | event.setProp('color', event_color); | 258 | start: event_start, |
259 | end: event_end, | ||
260 | color: event_color | ||
261 | }; | ||
262 | |||
263 | fetch('../src/post-ajax.php', { | ||
264 | method: 'POST', | ||
265 | headers: { | ||
266 | 'Content-Type': 'application/json', | ||
267 | }, | ||
268 | body: JSON.stringify(event_copy), | ||
269 | }) | ||
270 | .then(response => response.json()) | ||
271 | .then(data => { | ||
272 | if(data.success){ | ||
273 | event.setProp('title', event_title); | ||
274 | event.setAllDay(event_all_day); | ||
275 | event.setStart(event_start); | ||
276 | event.setEnd(event_end); | ||
277 | event.setProp('color', event_color); | ||
278 | hideModal(); | ||
279 | } | ||
280 | }) | ||
281 | .catch((error) => { | ||
282 | console.error('Error:', error); | ||
283 | }); | ||
209 | } | 284 | } |
210 | else{ | 285 | else{ |
211 | console.log("Événement non trouvé !"); | 286 | console.log("Événement non trouvé !"); |
212 | } | 287 | } |
213 | } | 288 | } |
214 | |||
215 | hideModal(); | ||
216 | } | 289 | } |
217 | else{ | 290 | else{ |
218 | // notif input vide | 291 | // notif input vide |