Files
HouseHub/assets/js/family-calendar.js
T
2025-12-08 14:11:54 +01:00

215 lines
6.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// assets/js/family-calendar.js
const weeks = [
{
month: "September",
code: "W36",
dates: "01/09 07/09",
caroleOffDays: 0,
isSchoolHoliday: false,
isBankHoliday: false,
alex: { cp: 0, rtt: 0, ja: 0 },
laia: { cp: 0, rtt: 0, ja: 0 },
},
{
month: "September",
code: "W38",
dates: "15/09 21/09",
caroleOffDays: 2,
isSchoolHoliday: false,
isBankHoliday: false,
alex: { cp: 0, rtt: 0, ja: 0 },
laia: { cp: 0, rtt: 0, ja: 0 },
},
{
month: "October",
code: "W40",
dates: "29/09 05/10",
caroleOffDays: 0,
isSchoolHoliday: false,
isBankHoliday: false,
alex: { cp: 0, rtt: 0, ja: 0 },
laia: { cp: 0, rtt: 0, ja: 0 },
},
{
month: "August",
code: "W32",
dates: "03/08 09/08",
caroleOffDays: 5,
isSchoolHoliday: true,
isBankHoliday: false,
alex: { cp: 0, rtt: 0, ja: 0 },
laia: { cp: 0, rtt: 0, ja: 0 },
},
// TODO: compléter le reste des semaines W36 → W35
];
function renderTable() {
const planningBody = document.getElementById("planningBody");
if (!planningBody) return;
planningBody.innerHTML = "";
const showOnlyCaroleOff =
document.getElementById("showOnlyCaroleOff")?.checked;
const showOnlySchoolHoliday = document.getElementById(
"showOnlySchoolHoliday"
)?.checked;
weeks.forEach((week, index) => {
if (showOnlyCaroleOff && week.caroleOffDays === 0) return;
if (showOnlySchoolHoliday && !week.isSchoolHoliday) return;
const tr = document.createElement("tr");
if (week.caroleOffDays > 0) tr.classList.add("fc-row--carole-off");
if (week.isSchoolHoliday) tr.classList.add("fc-row--school-holiday");
if (week.isBankHoliday) tr.classList.add("fc-row--bank-holiday");
tr.innerHTML = `
<td>${week.month}</td>
<td>${week.code}</td>
<td>${week.dates}</td>
<td>${week.caroleOffDays || ""}</td>
<td>${week.isSchoolHoliday ? "Oui" : ""}</td>
<td>${week.isBankHoliday ? "Oui" : ""}</td>
<td><input type="number" step="0.25" min="0" value="${
week.alex.cp
}" data-week="${index}" data-person="alex" data-type="cp"></td>
<td><input type="number" step="0.25" min="0" value="${
week.alex.rtt
}" data-week="${index}" data-person="alex" data-type="rtt"></td>
<td><input type="number" step="0.25" min="0" value="${
week.alex.ja
}" data-week="${index}" data-person="alex" data-type="ja"></td>
<td><input type="number" step="0.25" min="0" value="${
week.laia.cp
}" data-week="${index}" data-person="laia" data-type="cp"></td>
<td><input type="number" step="0.25" min="0" value="${
week.laia.rtt
}" data-week="${index}" data-person="laia" data-type="rtt"></td>
<td><input type="number" step="0.25" min="0" value="${
week.laia.ja
}" data-week="${index}" data-person="laia" data-type="ja"></td>
`;
planningBody.appendChild(tr);
});
attachInputListeners();
updateSummary();
}
function attachInputListeners() {
const planningBody = document.getElementById("planningBody");
if (!planningBody) return;
planningBody.querySelectorAll("input[type='number']").forEach((input) => {
input.addEventListener("change", (e) => {
const w = parseInt(e.target.dataset.week, 10);
const person = e.target.dataset.person;
const type = e.target.dataset.type;
const value = parseFloat(e.target.value || "0");
weeks[w][person][type] = value;
updateSummary();
});
});
}
function updateSummary() {
const summaryDiv = document.getElementById("summaryText");
if (!summaryDiv) return;
const alexCpInit = parseFloat(
document.getElementById("alexCpInit")?.value || "0"
);
const alexRttInit = parseFloat(
document.getElementById("alexRttInit")?.value || "0"
);
const alexJaInit = parseFloat(
document.getElementById("alexJaInit")?.value || "0"
);
const laiaCpInit = parseFloat(
document.getElementById("laiaCpInit")?.value || "0"
);
const laiaRttInit = parseFloat(
document.getElementById("laiaRttInit")?.value || "0"
);
const laiaJaInit = parseFloat(
document.getElementById("laiaJaInit")?.value || "0"
);
let alexCpUsed = 0,
alexRttUsed = 0,
alexJaUsed = 0;
let laiaCpUsed = 0,
laiaRttUsed = 0,
laiaJaUsed = 0;
weeks.forEach((week) => {
alexCpUsed += week.alex.cp;
alexRttUsed += week.alex.rtt;
alexJaUsed += week.alex.ja;
laiaCpUsed += week.laia.cp;
laiaRttUsed += week.laia.rtt;
laiaJaUsed += week.laia.ja;
});
const alexCpLeft = alexCpInit - alexCpUsed;
const alexRttLeft = alexRttInit - alexRttUsed;
const alexJaLeft = alexJaInit - alexJaUsed;
const laiaCpLeft = laiaCpInit - laiaCpUsed;
const laiaRttLeft = laiaRttInit - laiaRttUsed;
const laiaJaLeft = laiaJaInit - laiaJaUsed;
summaryDiv.innerHTML = `
<p><strong>Alex</strong><br>
CP utilisés : ${alexCpUsed.toFixed(2)} / ${alexCpInit.toFixed(
2
)} (reste ${alexCpLeft.toFixed(2)})<br>
RTT utilisés : ${alexRttUsed.toFixed(2)} / ${alexRttInit.toFixed(
2
)} (reste ${alexRttLeft.toFixed(2)})<br>
JA utilisés : ${alexJaUsed.toFixed(2)} / ${alexJaInit.toFixed(
2
)} (reste ${alexJaLeft.toFixed(2)})</p>
<p><strong>Laia</strong><br>
CP utilisés : ${laiaCpUsed.toFixed(2)} / ${laiaCpInit.toFixed(
2
)} (reste ${laiaCpLeft.toFixed(2)})<br>
RTT utilisés : ${laiaRttUsed.toFixed(2)} / ${laiaRttInit.toFixed(
2
)} (reste ${laiaRttLeft.toFixed(2)})<br>
JA utilisés : ${laiaJaUsed.toFixed(2)} / ${laiaJaInit.toFixed(2)})</p>
`;
}
function initFamilyCalendar() {
if (!document.getElementById("planningBody")) return;
[
"alexCpInit",
"alexRttInit",
"alexJaInit",
"laiaCpInit",
"laiaRttInit",
"laiaJaInit",
].forEach((id) => {
const el = document.getElementById(id);
if (el) el.addEventListener("change", updateSummary);
});
["showOnlyCaroleOff", "showOnlySchoolHoliday"].forEach((id) => {
const el = document.getElementById(id);
if (el) el.addEventListener("change", renderTable);
});
renderTable();
}
document.addEventListener("DOMContentLoaded", initFamilyCalendar);