PageSourceSearch

https://static.nendaz.ch/schedules.js?1790171890

js nendaz.ch collected 2026-09-24 22:50:57 UTC 9,992 bytes, 220 lines download raw bytes

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.