1/* 2 Scripts to activate open/closed status on objects 3 objects need a .mycity_schedule_status & a data-object-js to be up-to-date on init 4 EDSI-Tech 5*/ 6 7const DynamicScheduleDisplayer = (mycitySchedule) => { 8 const label = mycitySchedule && mycitySchedule.parentElement.querySelector(".mycity_schedule_label"); 9 const hourDom = mycitySchedule && mycitySchedule.parentElement.parentElement.querySelector(".mycity_schedule_hour"); 10 11 return { 12 displayOpen: () => { 13 if (label !== null) label.innerText = window.config.trans['schedule.open']; 14 if (mycitySchedule.classList.contains('before')) { 15 mycitySchedule.classList.add('open-before'); 16 } 17 // Timeout to avoid color flashing because CSS is slower 18 setTimeout(() => { mycitySchedule.style.visibility = 'visible'; }, 100); 19 }, 20 21 displayClosed: () => { 22 if (label !== null) label.innerText = window.config.trans['schedule.closed']; 23 if (mycitySchedule.classList.contains('before')) { 24 mycitySchedule.classList.add('warn-before'); 25 } 26 if (mycitySchedule.classList.contains('thumb')) { 27 mycitySchedule.classList.add('closed-status-thumb'); 28 } 29 // Timeout to avoid color flashing because CSS is slower 30 setTimeout(() => { mycitySchedule.style.visibility = 'visible'; }, 100); 31 }, 32 33 displayOpenAt: (time, tomorrow = false) => { 34 if (!hourDom) return; 35 36 var text = tomorrow 37 ? window.config.trans['schedule.open_tomorrow_at'] 38 : window.config.trans['schedule.open_at']; 39 40 hourDom.innerText = text + " " + time; 41 }, 42 43 displayCloseAt: (time) => { 44 if (!hourDom) return; 45 46 hourDom.innerText = window.config.trans['schedule.close_at'] + " " + time; 47 }, 48 49 displayNothing: () => {}, 50 51 displayLabel: () => { 52 if (label !== null) label.innerText = window.config.trans['schedule.label']; 53 }, 54 }; 55};
56 57const DynamicScheduleController = (scheduleManager) => { 58 59 const formatDate = (date) => { 60 // Ticket#2022030410000052 â TR: Retour intégration points V2022 61 // on aimerait mettre les deux points « : » comme dans les horaires de dessous 62 return MyCity.dayjs(date).format('HH:mm');//.replace(':', 'h'); 63 }; 64 65 const getNextFinishingSchedule = (schedules) => { 66 return schedules 67 .filter(schedule => { 68 var end = MyCity.dayjs(schedule.stop_time.date); 69 70 return scheduleManager.now.diff(end) < 0; 71 }) 72 .sort((a, b) => b.stop_time.date - a.stop_time.date)[0]; 73 }; 74 75 const getNextOpeningSchedule = (schedules, date) => { 76 if (!date) date = new Date().toString(); 77 return schedules 78 .filter(schedule => { 79 const start = MyCity.dayjs(`${date.split(' ')[0]} ${schedule.start_time.date.split(' ')[1]}`); 80 81 return scheduleManager.now.diff(start) < 0; 82 }) 83 .sort((a, b) => b.start_time.date - a.start_time.date)[0]; 84 }; 85 86 const displayScheduleForDate = (mycitySchedule, date, tomorrow = false) => { 87 if (scheduleManager.checkIfDateHasSchedules(date)) { 88 const schedules = scheduleManager.getSchedulesForADate(date); 89 90 const nextOpeningSchedule = getNextOpeningSchedule(schedules, date); 91 92 if (!nextOpeningSchedule) return false; 93 94 const openingTime = formatDate(nextOpeningSchedule.start_time.date); 95 96 DynamicScheduleDisplayer(mycitySchedule).displayOpenAt(openingTime, tomorrow); 97 98 return true; 99 } else { 100 return false; 101 } 102 }; 103 104 return { 105 displaySchedules: (mycitySchedule) => { 106 // Actuellement ouvert, afficher "ouvert" 107 if (scheduleManager.isOpen()) { 108 DynamicScheduleDisplayer(mycitySchedule).displayOpen(); 109 110 // Si fermeture spécial commence aujourd'hui, afficher "ferme à ..." 111 const holidayStartingToday = scheduleManager.getHolidayStartingToday(); 112 if (holidayStartingToday) { 113 const holidayStartTime = formatDate(holidayStartingToday.start_time.date); 114 return DynamicScheduleDisplayer(mycitySchedule).displayCloseAt(holidayStartTime); 115 } 116 117 // Si fermeture dans la journée, afficher "ferme à ..." 118 const hasScheduleAndIsInTime = scheduleManager.checkIfHasSchedulesForToday() && scheduleManager.checkIfIsInSchedulesTime(); 119 if (hasScheduleAndIsInTime) { 120 const todaySchedules = scheduleManager.getSchedulesForToday(); 121 const nextFinishingSchedule = getNextFinishingSchedule(todaySchedules); 122 123 const closingTime = formatDate(nextFinishingSchedule.stop_time.date); 124 125 return DynamicScheduleDisplayer(mycitySchedule).displayCloseAt(closingTime); 126 127 } else { // Si pas de fermeture dans la journée, ne rien afficher 128 return DynamicScheduleDisplayer(mycitySchedule).displayNothing(); 129 } 130 // Actuellement fermé, afficher "fermé" 131 } else { 132 DynamicScheduleDisplayer(mycitySchedule).displayClosed(); 133 134 // Si fermeture exceptionelle aujourd'hui, on affiche seulement "fermé" 135 if (scheduleManager.checkIfIsInHoliday()) return DynamicScheduleDisplayer(mycitySchedule).displayNothing(); 136 137 // Si ouverture dans la journée, afficher "ouvre à ..."
138 const openToday = displayScheduleForDate(mycitySchedule, scheduleManager.nowAsString); 139 140 // Si ouverture le lendemain, afficher "ouvre demain à ..." 141 let openTomorrow = false; 142 if (!openToday) { 143 const tomorrowAsString = scheduleManager.now.add(1, 'day').format('YYYY-MM-DD'); 144 // Si fermeture exceptionelle demain, on affiche seulement "fermé" 145 if (scheduleManager.getHolidayStartingOnDate(tomorrowAsString)) return DynamicScheduleDisplayer(mycitySchedule).displayNothing(); 146 openTomorrow = displayScheduleForDate(mycitySchedule, tomorrowAsString, true); 147 } 148 149 // Si pas d'ouverture ajd ou demain, ne rien afficher 150 if (!openToday && !openTomorrow) return DynamicScheduleDisplayer(mycitySchedule).displayNothing(); 151 } 152 } 153 }; 154}; 155 156function getStatus(data) { 157 var scheduleManager = new MyCity.ScheduleManager(data); 158 159 if (window.config && window.config.mycityParams && window.config.mycityParams["categories_openclose_blacklist"]) { 160 if ((data.category && window.config.mycityParams["categories_openclose_blacklist"].includes(data.category.id)) || (data.categoryId && window.config.mycityParams["categories_openclose_blacklist"].includes(data.categoryId))) { 161 return "hidden"; 162 } 163 } 164 // new rule : if no period, hidden 165 if (scheduleManager.periods.length <= 0) { 166 return "hidden"; 167 } else { 168 return scheduleManager.isOpen() ? "open" : "closed"; 169 } 170} 171 172function verifyAllStatus() { 173 var mycitySchedules = document.getElementsByClassName("mycity_schedule_status"); 174 175 for (var i=0; i<mycitySchedules.length; i++) { 176 var poiJS = JSON.parse(mycitySchedules[i].dataset.objectJs); // Traduction de l'objet Twig en JSON 177 178 // Hotfix for ticket 2022083110000064, can be remove after 13.09.22 deploy 179 if (poiJS.poi_holidays === null) poiJS.poi_holidays = []; 180 181 var scheduleManager = new MyCity.ScheduleManager(poiJS); // création de l'objet ScheduleManager 182 183 // init 184 if (mycitySchedules[i].classList.contains("before")) { 185 mycitySchedules[i].classList.remove("open-before"); 186 mycitySchedules[i].classList.remove("warn-before"); 187 } 188 if (mycitySchedules[i].classList.contains("thumb")) { 189 mycitySchedules[i].classList.remove("closed-status-thumb"); 190 } 191 192 // new rule - always hidden if no periods 193 //if (typeof scheduleManager.isOpen === "function" && scheduleManager.isOpen() && poiJS.periods.length > 0) { 194 if (poiJS.periods.length > 0) { 195 if (mycitySchedules[i].classList.contains("before")) { 196 mycitySchedules[i].classList.add("open-before"); 197 } 198 } else { 199 if (mycitySchedules[i].classList.contains("before")) { 200 mycitySchedules[i].classList.add("warn-before"); 201 } 202 // if (mycitySchedules[i].classList.contains("thumb")) { 203 // mycitySchedules[i].classList.add("hidden-status-thumb"); 204 // } 205 } 206 207 if (window.config && window.config.mycityParams && window.config.mycityParams["categories_openclose_blacklist"]) { 208 if ((poiJS.category && window.config.mycityParams["categories_openclose_blacklist"].includes(poiJS.category.id)) || (poiJS.categoryId && window.config.mycityParams["categories_openclose_blacklist"].includes(poiJS.categoryId))) { 209 mycitySchedules[i].style.display = "none"; 210 DynamicScheduleDisplayer(mycitySchedules[i]).displayLabel(); 211 } 212 } 213 214 if (mycitySchedules[i].style.display !== "none") DynamicScheduleController(scheduleManager).displaySchedules(mycitySchedules[i]); 215 } 216} 217 218(function() { 219 verifyAllStatus(); 220})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.