diff options
Diffstat (limited to 'public/js/calendar_admin.js')
| -rw-r--r-- | public/js/calendar_admin.js | 82 |
1 files changed, 60 insertions, 22 deletions
diff --git a/public/js/calendar_admin.js b/public/js/calendar_admin.js index 17ae0c2..0600954 100644 --- a/public/js/calendar_admin.js +++ b/public/js/calendar_admin.js | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | // js/calendar_admin.js | 1 | // js/calendar_admin.js |
| 2 | 2 | ||
| 3 | document.addEventListener('DOMContentLoaded', function(){ | 3 | document.addEventListener('DOMContentLoaded', function(){ |
| 4 | const calendarEl = document.getElementById('calendar'); | 4 | const calendarEl = getElementOrThrow('calendar'); |
| 5 | let selected_start_string = null; | 5 | let selected_start_string = null; |
| 6 | let event_selected = false; // pour event.remove() | 6 | let event_selected = false; // pour event.remove() |
| 7 | 7 | ||
| @@ -44,7 +44,7 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 44 | select: function(info){ | 44 | select: function(info){ |
| 45 | selected_start_string = info.startStr; // variable "globale" | 45 | selected_start_string = info.startStr; // variable "globale" |
| 46 | event_selected = false; | 46 | event_selected = false; |
| 47 | const aside = document.querySelector('aside'); | 47 | const modal = getElementOrThrow('event_modal'); |
| 48 | let checked = ''; | 48 | let checked = ''; |
| 49 | let input = 'datetime-local'; | 49 | let input = 'datetime-local'; |
| 50 | 50 | ||
| @@ -81,7 +81,7 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 81 | } | 81 | } |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | const aside_content = `<div id="form_event"> | 84 | const modal_content = `<div id="form_event"> |
| 85 | <div class="event_title_box"> | 85 | <div class="event_title_box"> |
| 86 | <h2>Nouvel évènement</h2> | 86 | <h2>Nouvel évènement</h2> |
| 87 | </div> | 87 | </div> |
| @@ -112,7 +112,7 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 112 | <button class="submit_new_event">Enregistrer</button> | 112 | <button class="submit_new_event">Enregistrer</button> |
| 113 | <button class="event_close_button">Annuler</button> | 113 | <button class="event_close_button">Annuler</button> |
| 114 | </div>`; | 114 | </div>`; |
| 115 | aside.innerHTML = aside_content; | 115 | modal.innerHTML = modal_content; |
| 116 | calendar.updateSize(); | 116 | calendar.updateSize(); |
| 117 | }, | 117 | }, |
| 118 | // sélection d'une date simple sur mobile, évite des problèmes de conflit avec eventClick | 118 | // sélection d'une date simple sur mobile, évite des problèmes de conflit avec eventClick |
| @@ -138,7 +138,7 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 138 | //unselect: function(event, view){}, | 138 | //unselect: function(event, view){}, |
| 139 | eventClick: function(info){ | 139 | eventClick: function(info){ |
| 140 | event_selected = true; // variable "globale" | 140 | event_selected = true; // variable "globale" |
| 141 | const aside = document.querySelector('aside'); | 141 | const modal = getElementOrThrow('event_modal'); |
| 142 | const checked = info.event.allDay ? 'checked' : ''; | 142 | const checked = info.event.allDay ? 'checked' : ''; |
| 143 | const input = info.event.allDay ? 'date' : 'datetime-local'; | 143 | const input = info.event.allDay ? 'date' : 'datetime-local'; |
| 144 | 144 | ||
| @@ -153,9 +153,9 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | const formated_start = formatDate(info.event.start); | 155 | const formated_start = formatDate(info.event.start); |
| 156 | const formated_end = formatDate(info.event.allDay ? minusOneDay(info.event.end) : info.event.end, info.event.allDay); | 156 | const formated_end = formatDate(info.event.allDay ? minusOneDay(info.event.end) : info.event.end); |
| 157 | 157 | ||
| 158 | const aside_content = `<div id="form_event" style="border-color: ` + info.event.backgroundColor +`;"> | 158 | const modal_content = `<div id="form_event" style="border-color: ` + info.event.backgroundColor +`;"> |
| 159 | <div class="event_title_box"> | 159 | <div class="event_title_box"> |
| 160 | <h2>Modifier un évènement</h2> | 160 | <h2>Modifier un évènement</h2> |
| 161 | </div> | 161 | </div> |
| @@ -188,7 +188,7 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 188 | <button class="event_close_button">Annuler</button> | 188 | <button class="event_close_button">Annuler</button> |
| 189 | <button class="delete_event">Supprimer</button> | 189 | <button class="delete_event">Supprimer</button> |
| 190 | </div>`; | 190 | </div>`; |
| 191 | aside.innerHTML = aside_content; | 191 | modal.innerHTML = modal_content; |
| 192 | calendar.updateSize(); | 192 | calendar.updateSize(); |
| 193 | }, | 193 | }, |
| 194 | viewDidMount: function(info){ // déclenché lorsque qu'une nouvelle vue est chargée (mois, semaine...) | 194 | viewDidMount: function(info){ // déclenché lorsque qu'une nouvelle vue est chargée (mois, semaine...) |
| @@ -200,21 +200,41 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 200 | }); | 200 | }); |
| 201 | 201 | ||
| 202 | function hideModal(){ | 202 | function hideModal(){ |
| 203 | const aside = document.querySelector('aside'); | 203 | const modal = getElementOrThrow('event_modal'); |
| 204 | event_selected = false; | 204 | event_selected = false; |
| 205 | aside.innerHTML = ''; | 205 | modal.innerHTML = ''; |
| 206 | calendar.updateSize(); | 206 | calendar.updateSize(); |
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | function submitEvent(new_event){ | 209 | function submitEvent(new_event){ |
| 210 | const event_title = document.getElementById('event_title').value; | 210 | const event_title_input = getElementOrThrow('event_title'); |
| 211 | const event_description = document.getElementById('event_description').value; | 211 | const event_description_input = getElementOrThrow('event_description'); |
| 212 | const event_all_day = document.getElementById('event_all_day').checked; | 212 | const event_all_day_input = getElementOrThrow('event_all_day'); |
| 213 | let event_start = document.getElementById('event_start').value; | 213 | const event_start_input = getElementOrThrow('event_start'); |
| 214 | let event_end = document.getElementById('event_end').value; | 214 | const event_end_input = getElementOrThrow('event_end'); |
| 215 | const event_color = document.getElementById('event_color').value; // #3788d8 par défaut | 215 | const event_color_input = getElementOrThrow('event_color'); |
| 216 | const event_id = new_event ? '' : document.getElementById('event_id').value; | 216 | assertElementType(event_title_input, HTMLInputElement); |
| 217 | assertElementType(event_description_input, HTMLTextAreaElement); | ||
| 218 | assertElementType(event_all_day_input, HTMLInputElement); | ||
| 219 | assertElementType(event_start_input, HTMLInputElement); | ||
| 220 | assertElementType(event_end_input, HTMLInputElement); | ||
| 221 | assertElementType(event_color_input, HTMLInputElement); | ||
| 217 | 222 | ||
| 223 | const event_title = event_title_input.value; | ||
| 224 | const event_description = event_description_input.value; | ||
| 225 | const event_all_day = event_all_day_input.checked; | ||
| 226 | let event_start = event_start_input.value; | ||
| 227 | let event_end = event_end_input.value; | ||
| 228 | const event_color = event_color_input.value; // #3788d8 par défaut | ||
| 229 | |||
| 230 | let event_id = ''; | ||
| 231 | if(!new_event){ | ||
| 232 | const event_id_input = getElementOrThrow('event_id'); | ||
| 233 | assertElementType(event_id_input, HTMLInputElement); | ||
| 234 | event_id = event_id_input.value; | ||
| 235 | } | ||
| 236 | |||
| 237 | // contrôle de saisie | ||
| 218 | if(event_title.length !== 0 && event_start.length !== 0 && event_end.length !== 0 && event_color.length !== 0 | 238 | if(event_title.length !== 0 && event_start.length !== 0 && event_end.length !== 0 && event_color.length !== 0 |
| 219 | && (new_event || event_id.length !== 0)) | 239 | && (new_event || event_id.length !== 0)) |
| 220 | { | 240 | { |
| @@ -238,6 +258,7 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 238 | // création | 258 | // création |
| 239 | if(new_event){ | 259 | if(new_event){ |
| 240 | const event = { | 260 | const event = { |
| 261 | id: '', | ||
| 241 | title: event_title, | 262 | title: event_title, |
| 242 | description: event_description, | 263 | description: event_description, |
| 243 | allDay: event_all_day, | 264 | allDay: event_all_day, |
| @@ -269,7 +290,9 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 269 | // modification | 290 | // modification |
| 270 | else{ | 291 | else{ |
| 271 | const event = calendar.getEventById(event_id); | 292 | const event = calendar.getEventById(event_id); |
| 272 | 293 | if(!event){ | |
| 294 | throw new Error("Événement non trouvé !"); | ||
| 295 | } | ||
| 273 | if(event){ | 296 | if(event){ |
| 274 | const event_copy = { | 297 | const event_copy = { |
| 275 | id: parseInt(event.id), | 298 | id: parseInt(event.id), |
| @@ -316,13 +339,17 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 316 | } | 339 | } |
| 317 | 340 | ||
| 318 | function checkAllDay(){ | 341 | function checkAllDay(){ |
| 319 | const event_start_input = document.getElementById('event_start'); | 342 | const event_start_input = getElementOrThrow('event_start'); |
| 320 | const event_end_input = document.getElementById('event_end'); | 343 | const event_end_input = getElementOrThrow('event_end'); |
| 344 | const event_all_day = getElementOrThrow('event_all_day'); | ||
| 345 | assertElementType(event_start_input, HTMLInputElement); | ||
| 346 | assertElementType(event_end_input, HTMLInputElement); | ||
| 347 | assertElementType(event_all_day, HTMLInputElement); | ||
| 321 | 348 | ||
| 322 | const start = event_start_input.value; | 349 | const start = event_start_input.value; |
| 323 | const end = event_end_input.value; | 350 | const end = event_end_input.value; |
| 324 | 351 | ||
| 325 | if(document.getElementById('event_all_day').checked){ | 352 | if(event_all_day.checked){ |
| 326 | event_start_input.type = 'date'; | 353 | event_start_input.type = 'date'; |
| 327 | event_end_input.type = 'date'; | 354 | event_end_input.type = 'date'; |
| 328 | 355 | ||
| @@ -341,8 +368,15 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 341 | if(!confirm("Voulez-vous vraiment supprimer cet évènement du calendrier?")){ | 368 | if(!confirm("Voulez-vous vraiment supprimer cet évènement du calendrier?")){ |
| 342 | return; | 369 | return; |
| 343 | } | 370 | } |
| 344 | const event_id = document.getElementById('event_id').value; | 371 | const event_tag = document.getElementById('event_id'); // cible input hidden |
| 372 | if(!event_tag || !(event_tag instanceof HTMLInputElement)){ | ||
| 373 | return; | ||
| 374 | } | ||
| 375 | const event_id = event_tag.value; | ||
| 345 | const event = calendar.getEventById(event_id); | 376 | const event = calendar.getEventById(event_id); |
| 377 | if(!event){ | ||
| 378 | throw new Error("Événement non trouvé !"); | ||
| 379 | } | ||
| 346 | 380 | ||
| 347 | fetch('index.php?action=remove_event', { | 381 | fetch('index.php?action=remove_event', { |
| 348 | method: 'POST', | 382 | method: 'POST', |
| @@ -377,6 +411,10 @@ document.addEventListener('DOMContentLoaded', function(){ | |||
| 377 | // boutons dans la "modale" | 411 | // boutons dans la "modale" |
| 378 | // technique de la délégation d'événements pour utiliser un bouton ajouté dynamiquement | 412 | // technique de la délégation d'événements pour utiliser un bouton ajouté dynamiquement |
| 379 | document.addEventListener('click', function(event){ | 413 | document.addEventListener('click', function(event){ |
| 414 | if(!event.target){ | ||
| 415 | throw new Error('évènement click non conforme'); | ||
| 416 | } | ||
| 417 | assertElementType(event.target, HTMLElement); | ||
| 380 | if(event.target.classList.contains('event_close_button')){ | 418 | if(event.target.classList.contains('event_close_button')){ |
| 381 | hideModal(); | 419 | hideModal(); |
| 382 | } | 420 | } |
