2023-04-17 15:44:55 +02:00
|
|
|
<div class="assiduite-bubble">
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<script>
|
2023-05-30 10:17:49 +02:00
|
|
|
|
|
|
|
const mt_start = {{ t_start }};
|
|
|
|
const mt_end = {{ t_end }};
|
|
|
|
/**
|
|
|
|
* Création de la minitiline d'un étudiant
|
|
|
|
* @param {Array[Assiduité]} assiduitesArray
|
|
|
|
* @returns {HTMLElement} l'élément correspondant à la mini timeline
|
|
|
|
*/
|
2023-06-22 16:25:13 +02:00
|
|
|
function createMiniTimeline(assiduitesArray, day = null) {
|
2023-05-30 10:17:49 +02:00
|
|
|
const array = [...assiduitesArray];
|
2024-03-11 11:39:06 +01:00
|
|
|
const date = day == null ? $("#date").datepicker("getDate") : new Date(day);
|
2023-05-30 10:17:49 +02:00
|
|
|
const timeline = document.createElement("div");
|
|
|
|
timeline.className = "mini-timeline";
|
2023-11-20 16:55:26 +01:00
|
|
|
const timelineDate = date.startOf("day");
|
2024-03-11 11:39:06 +01:00
|
|
|
const dayStart = new Date(`${timelineDate.format("YYYY-MM-DD").substring(0,10)}T${numberToTime(mt_start)}`);
|
|
|
|
const dayEnd = new Date(`${timelineDate.format("YYYY-MM-DD").substring(0,10)}T${numberToTime(mt_end)}`);
|
2023-11-08 15:12:42 +01:00
|
|
|
const dayDuration = new Duration(dayStart, dayEnd).minutes;
|
2023-05-30 10:17:49 +02:00
|
|
|
|
|
|
|
timeline.appendChild(setMiniTick(timelineDate, dayStart, dayDuration));
|
|
|
|
|
2023-06-22 16:25:13 +02:00
|
|
|
if (day == null) {
|
2024-03-11 11:39:06 +01:00
|
|
|
const tlTimes = getPeriodAsDate();
|
2023-06-22 16:25:13 +02:00
|
|
|
array.push({
|
|
|
|
date_debut: tlTimes.deb.format(),
|
|
|
|
date_fin: tlTimes.fin.format(),
|
|
|
|
etat: "CRENEAU",
|
|
|
|
});
|
2023-11-20 16:55:26 +01:00
|
|
|
|
2023-06-22 16:25:13 +02:00
|
|
|
}
|
2024-06-11 14:50:30 +02:00
|
|
|
// Pour chaque assiduité (et pour le créneau) on vient créer un block
|
|
|
|
// le block est positionné en fonction de l'heure de début et de fin
|
|
|
|
// et prend une largeur proportionnelle à la durée de l'assiduité
|
2023-05-30 10:17:49 +02:00
|
|
|
array.forEach((assiduité) => {
|
2024-01-12 11:36:00 +01:00
|
|
|
if(assiduité.etat == "CRENEAU" && readOnly) return;
|
2023-11-20 16:55:26 +01:00
|
|
|
let startDate = new Date(Date.removeUTC(assiduité.date_debut));
|
|
|
|
let endDate = new Date(Date.removeUTC(assiduité.date_fin));
|
2023-05-30 10:17:49 +02:00
|
|
|
if (startDate.isBefore(dayStart)) {
|
2023-07-26 16:43:49 +02:00
|
|
|
startDate = dayEnd.clone().startOf("day").add(mt_start, "hours");
|
2023-05-30 10:17:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (endDate.isAfter(dayEnd)) {
|
2023-07-26 16:43:49 +02:00
|
|
|
endDate = dayEnd.clone().startOf("day").add(mt_end, "hours");
|
2023-05-30 10:17:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
const block = document.createElement("div");
|
|
|
|
block.className = "mini-timeline-block";
|
2023-11-20 16:55:26 +01:00
|
|
|
const duration = (new Duration(startDate, endDate)).minutes;
|
|
|
|
const startOffset = (new Duration(dayStart, startDate)).minutes;
|
2023-05-30 10:17:49 +02:00
|
|
|
const leftPercentage = (startOffset / dayDuration) * 100;
|
|
|
|
const widthPercentage = (duration / dayDuration) * 100;
|
|
|
|
|
2023-11-20 16:55:26 +01:00
|
|
|
|
2023-05-30 10:17:49 +02:00
|
|
|
block.style.left = `${leftPercentage}%`;
|
|
|
|
block.style.width = `${widthPercentage}%`;
|
|
|
|
|
|
|
|
if (assiduité.etat != "CRENEAU") {
|
2024-09-24 19:23:42 +02:00
|
|
|
// Si on clique dessus on veut pouvoir
|
2024-06-11 14:50:30 +02:00
|
|
|
// mettre à jour la timeline principale et modifier le moduleimpl_select
|
2023-06-05 16:18:06 +02:00
|
|
|
block.addEventListener("click", () => {
|
2023-11-08 15:12:42 +01:00
|
|
|
let deb = startDate.getHours() + startDate.getMinutes() / 60;
|
|
|
|
let fin = endDate.getHours() + endDate.getMinutes() / 60;
|
2023-06-05 16:18:06 +02:00
|
|
|
deb = Math.max(mt_start, deb);
|
|
|
|
fin = Math.min(mt_end, fin);
|
|
|
|
|
2023-06-22 16:25:13 +02:00
|
|
|
if (day == null) setPeriodValues(deb, fin);
|
2024-03-11 11:39:06 +01:00
|
|
|
|
|
|
|
$("#moduleimpl_select").val(getModuleImplId(assiduité))
|
|
|
|
setTimeout(()=>{
|
2024-09-24 19:23:42 +02:00
|
|
|
$("#moduleimpl_select").trigger("change");
|
2024-03-11 11:39:06 +01:00
|
|
|
}, 0)
|
2023-06-05 16:18:06 +02:00
|
|
|
});
|
2023-05-30 10:17:49 +02:00
|
|
|
//ajouter affichage assiduites on over
|
2024-03-11 11:39:06 +01:00
|
|
|
setupAssiduiteBubble(block, assiduité);
|
2023-05-30 10:17:49 +02:00
|
|
|
}
|
|
|
|
|
2024-04-22 08:39:00 +02:00
|
|
|
// ajout couleur justificatif
|
|
|
|
const justificatifs = assiduité.justificatifs || [];
|
|
|
|
const justified = justificatifs.some(
|
|
|
|
(justificatif) => justificatif.etat === "VALIDE"
|
|
|
|
)
|
|
|
|
|
|
|
|
if(justified) block.classList.add("est_just");
|
2023-05-30 10:17:49 +02:00
|
|
|
|
2024-03-11 11:39:06 +01:00
|
|
|
block.classList.add(assiduité.etat.toLowerCase());
|
|
|
|
if(assiduité.etat != "CRENEAU") block.classList.add("color");
|
2023-05-30 10:17:49 +02:00
|
|
|
|
|
|
|
timeline.appendChild(block);
|
|
|
|
});
|
|
|
|
|
|
|
|
return timeline;
|
|
|
|
}
|
2024-06-11 14:50:30 +02:00
|
|
|
// Ajout du "13h" sur la mini timeline
|
2023-05-30 10:17:49 +02:00
|
|
|
function setMiniTick(timelineDate, dayStart, dayDuration) {
|
2023-11-08 15:12:42 +01:00
|
|
|
const endDate = timelineDate.clone().startOf("day");
|
|
|
|
endDate.setHours(13, 0);
|
|
|
|
const duration = new Duration(dayStart, endDate).minutes;
|
2023-05-30 10:17:49 +02:00
|
|
|
const widthPercentage = (duration / dayDuration) * 100;
|
|
|
|
const tick = document.createElement('span');
|
|
|
|
tick.className = "mini_tick"
|
|
|
|
tick.textContent = "13h"
|
|
|
|
tick.style.left = `${widthPercentage}%`
|
|
|
|
|
|
|
|
return tick
|
|
|
|
|
|
|
|
}
|
2024-01-16 16:15:48 +01:00
|
|
|
</script>
|