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
|
|
|
}
|
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") {
|
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(()=>{
|
|
|
|
$("#moduleimpl_select").trigger("change");
|
|
|
|
}, 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-03-11 11:39:06 +01:00
|
|
|
// TODO: ajout couleur justificatif
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Ajout de la visualisation des assiduités de la mini timeline
|
|
|
|
* @param {HTMLElement} el l'élément survollé
|
|
|
|
* @param {Assiduité} assiduite l'assiduité représentée par l'élément
|
|
|
|
*/
|
2024-03-11 11:39:06 +01:00
|
|
|
function setupAssiduiteBubble(el, assiduite) {
|
|
|
|
|
|
|
|
function formatDateModal(dateStr){
|
|
|
|
const date = new Date(Date.removeUTC(dateStr));
|
|
|
|
return date.format("DD/MM/Y HH:mm");
|
|
|
|
}
|
|
|
|
|
2023-05-30 10:17:49 +02:00
|
|
|
if (!assiduite) return;
|
|
|
|
|
2024-01-16 16:15:48 +01:00
|
|
|
const bubble = document.createElement('div');
|
|
|
|
bubble.className = "assiduite-bubble";
|
|
|
|
bubble.classList.add(assiduite.etat.toLowerCase());
|
|
|
|
|
|
|
|
const idDiv = document.createElement("div");
|
|
|
|
idDiv.className = "assiduite-id";
|
2024-03-11 11:39:06 +01:00
|
|
|
getModuleImpl(assiduite).then((modImpl) => {
|
|
|
|
idDiv.textContent = `${modImpl}`;
|
|
|
|
});
|
2024-01-16 16:15:48 +01:00
|
|
|
bubble.appendChild(idDiv);
|
|
|
|
|
|
|
|
const periodDivDeb = document.createElement("div");
|
|
|
|
periodDivDeb.className = "assiduite-period";
|
|
|
|
periodDivDeb.textContent = `${formatDateModal(assiduite.date_debut)}`;
|
|
|
|
bubble.appendChild(periodDivDeb);
|
|
|
|
const periodDivFin = document.createElement("div");
|
|
|
|
periodDivFin.className = "assiduite-period";
|
|
|
|
periodDivFin.textContent = `${formatDateModal(assiduite.date_fin)}`;
|
|
|
|
bubble.appendChild(periodDivFin);
|
|
|
|
|
|
|
|
const stateDiv = document.createElement("div");
|
|
|
|
stateDiv.className = "assiduite-state";
|
|
|
|
stateDiv.textContent = `État: ${assiduite.etat.capitalize()}`;
|
|
|
|
bubble.appendChild(stateDiv);
|
|
|
|
|
2024-01-19 17:06:01 +01:00
|
|
|
const motifDiv = document.createElement("div");
|
|
|
|
stateDiv.className = "assiduite-why";
|
2024-03-11 11:39:06 +01:00
|
|
|
const motif = ["", null, undefined].includes(assiduite.desc) ? "Pas de motif" : assiduite.desc.capitalize();
|
|
|
|
stateDiv.textContent = `Motif: ${motif}`;
|
2024-01-19 17:06:01 +01:00
|
|
|
bubble.appendChild(motifDiv);
|
|
|
|
|
2024-01-16 16:15:48 +01:00
|
|
|
const userIdDiv = document.createElement("div");
|
|
|
|
userIdDiv.className = "assiduite-user_id";
|
|
|
|
userIdDiv.textContent = `saisie le ${formatDateModal(
|
|
|
|
assiduite.entry_date,
|
|
|
|
" à "
|
|
|
|
)}`;
|
|
|
|
|
|
|
|
if (assiduite.user_id != null) {
|
|
|
|
userIdDiv.textContent += `\npar ${assiduite.user_nom_complet}`
|
|
|
|
}
|
|
|
|
bubble.appendChild(userIdDiv);
|
|
|
|
|
|
|
|
el.appendChild(bubble);
|
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>
|