summaryrefslogtreecommitdiff
path: root/public/js/calendar.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/js/calendar.js')
-rw-r--r--public/js/calendar.js181
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?
2const current_view = calendar.view;
3switch(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
1document.addEventListener('DOMContentLoaded', function(){ 17document.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