Ajout des commentaires dans le code
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user