last update

This commit is contained in:
PTA
2026-08-27 11:38:59 +02:00
parent 1a67080268
commit 90e8a06ca0
11 changed files with 2423 additions and 708 deletions

View File

@@ -79,8 +79,10 @@
};
/**
* Cache de données brutes qu'un module expose aux autres, pour éviter de
* refaire un appel réseau déjà effectué.
* Ce qu'un module expose aux autres : des données brutes déjà chargées (pour
* éviter de refaire un appel réseau) et des FABRIQUES d'écran, quand deux
* pages rendent le même bloc à partir de la même API — voir
* `comptes-acces.js`, partagé par l'espace DSI et l'onglet Administration.
*/
const shared = {
lastAgentOverviewData: null,
@@ -177,6 +179,58 @@
return data?.details ? `${base} Détail : ${data.details}` : base;
}
/**
* Appel d'API mutualisé : lit le JSON et transforme toute réponse non-OK en
* exception, de sorte que l'appelant n'a qu'un seul `catch` à écrire.
*
* Chaque écran avait recopié ces quatre lignes ; elles vivent ici depuis
* qu'elles servaient à l'identique dans quatre modules.
*/
async function apiJson(url, options = {}) {
const response = await fetch(url, options);
const data = await readJsonResponse(response);
if (!response.ok) throw new Error(apiErrorMessage(data, 'Opération impossible.'));
return data;
}
/**
* Raccourci des appels mutants : POST JSON avec le jeton CSRF DANS LE CORPS.
* PTA ne lit jamais le jeton depuis un en-tête (voir Csrf::assertPayload).
*/
function postJson(url, payload) {
return apiJson(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ csrf_token: window.PTA_CONFIG?.csrfToken, ...payload }),
});
}
/**
* Message dans un bandeau désigné par son identifiant HTML.
*
* `showMessage()` vise le bandeau unique de l'éditeur de planning
* (`elements.messageBox`) ; les écrans qui en portent plusieurs — comptes,
* jetons, journal — passent par ici.
*/
function showMessageIn(id, text, type = 'info') {
const box = document.getElementById(id);
if (!box) return;
box.className = `message message-${type}`;
box.textContent = text;
}
/**
* « 2026-08-20 09:41:07.482 » → « 20/08/2026 09:41 ».
* Découpage de chaîne pour la même raison que `formatDate()` : `new Date()`
* interpréterait la valeur en UTC.
*/
function formatDateTime(value) {
if (!value) return '—';
const [date, time = ''] = String(value).split(' ');
const [year, month, day] = date.split('-');
return `${day}/${month}/${year} ${time.slice(0, 5)}`;
}
/**
* Date → « AAAA-MM-JJ » en heure LOCALE.
* `toISOString()` convertirait en UTC et décalerait la date d'un jour selon
@@ -284,6 +338,10 @@
clearMessage,
readJsonResponse,
apiErrorMessage,
apiJson,
postJson,
showMessageIn,
formatDateTime,
parseIsoWeek,
timeToMinutes,
formatDuration,