Ajout des commentaires dans le code

This commit is contained in:
PTA
2026-08-20 13:22:49 +02:00
parent 4201894e28
commit 5d8c0993a6
154 changed files with 5071 additions and 47 deletions

View File

@@ -1,3 +1,23 @@
/**
* Périodes de vacances scolaires (`PTA.modules.vacationCalendar`), écran
* vacations.php.
*
* Ces périodes déterminent le contexte périscolaire ou extrascolaire de chaque
* journée : c'est un référentiel structurant, pas un simple calendrier
* d'affichage.
*
* L'IMPORT SE FAIT EN DEUX TEMPS, volontairement séparés :
* 1. APERÇU — `preview()` interroge l'API publique data.education.gouv.fr via
* le serveur, SANS RIEN ÉCRIRE. Les périodes proposées sont affichées dans
* un tableau où chaque ligne est éditable et cochable ;
* 2. ENREGISTREMENT — seules les lignes cochées sont envoyées, avec les
* libellés et dates éventuellement corrigés à l'écran.
* Aucune donnée externe n'entre en base sans relecture humaine : les libellés et
* découpages publiés varient d'une académie et d'une année à l'autre.
*
* Une saisie entièrement manuelle reste possible, pour les cas que l'API ne
* couvre pas.
*/
(() => {
'use strict';
@@ -7,6 +27,11 @@
const { escapeHtml, readJsonResponse, apiErrorMessage, formatDate } = PTA.utils;
let previewPeriods = [];
/**
* Sélecteurs résolus À CHAQUE APPEL, et non mis en cache : les tableaux de
* cette page sont reconstruits, et des références figées pointeraient vers
* des nœuds détachés du document.
*/
const elements = () => ({
academy: document.querySelector('#vacation-academy'),
calendarYear: document.querySelector('#vacation-calendar-year'),
@@ -29,10 +54,16 @@
element.textContent = text;
}
/** Origine d'une période : import officiel ou saisie manuelle. */
function sourceLabel(source) {
return source === 'DATA_GOUV' ? 'API officielle' : 'Saisie manuelle';
}
/**
* Rend le tableau d'aperçu : une ligne par période proposée, avec une case à
* cocher et des champs éditables. L'utilisateur peut corriger un libellé ou
* une date avant d'enregistrer.
*/
function renderPreview() {
const el = elements();
if (!el.previewBody || !el.previewPanel) return;
@@ -62,6 +93,12 @@
if (el.selectAll) el.selectAll.checked = false;
}
/**
* Interroge l'API officielle par l'intermédiaire du serveur. AUCUNE
* écriture. Un échec ressort en 502 : c'est le service distant qui n'a pas
* répondu, pas PTA qui a échoué. Les `warnings` signalent les périodes que
* le serveur n'a pas su interpréter.
*/
async function preview() {
const el = elements();
const academy = el.academy?.value.trim() || '';
@@ -95,6 +132,13 @@
}
}
/**
* Construit la charge utile à partir des seules lignes cochées.
*
* Les valeurs affichées (libellé, dates) priment, puisqu'elles ont pu être
* corrigées ; les métadonnées non éditables (année scolaire, académie, zone)
* sont reprises de la proposition d'origine, retrouvée par l'index de ligne.
*/
function selectedPreviewPeriods() {
const el = elements();
return Array.from(el.previewBody?.querySelectorAll('.vacation-preview-row') || [])
@@ -113,6 +157,10 @@
});
}
/**
* Enregistre un lot de périodes puis recharge la liste enregistrée.
* Mutualisé entre l'import et la saisie manuelle.
*/
async function savePeriods(periods, messageElement) {
const response = await fetch('api/save_vacation_periods.php', {
method: 'POST',
@@ -129,6 +177,7 @@
return data;
}
/** Enregistre les périodes cochées dans l'aperçu. */
async function saveSelected() {
const el = elements();
const periods = selectedPreviewPeriods();
@@ -149,6 +198,7 @@
}
}
/** Enregistre une période saisie à la main, pour les cas hors API. */
async function saveManual(event) {
event.preventDefault();
const el = elements();
@@ -182,6 +232,7 @@
}
}
/** Rend le tableau des périodes déjà enregistrées, avec leur origine. */
function renderSaved(periods) {
const el = elements();
if (!el.savedBody) return;
@@ -202,6 +253,7 @@
`).join('');
}
/** Recharge les périodes enregistrées en base. */
async function loadSaved() {
const el = elements();
try {
@@ -215,6 +267,11 @@
}
}
/**
* Supprime une période après confirmation.
* Les créneaux déjà planifiés ne sont pas touchés, mais le contexte
* scolaire/extrascolaire des journées concernées change.
*/
async function deletePeriod(button) {
const row = button.closest('tr[data-period-id]');
const id = Number(row?.dataset.periodId || 0);