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

@@ -17,7 +17,7 @@
const PTA = window.PTA;
// core.js absent : la page reste lisible, simplement non interactive.
if (!PTA) return;
const { readJsonResponse, apiErrorMessage, escapeHtml, formatDate } = PTA.utils;
const { apiJson, escapeHtml, formatDate } = PTA.utils;
const el = (id) => document.getElementById(id);
/** Message dans le bandeau de la page. */
@@ -28,17 +28,6 @@
box.textContent = text;
}
/**
* Appel d'API mutualisé : lit le JSON et transforme toute réponse non-OK en
* exception. Toutes les actions de la page passent par ici.
*/
async function api(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;
}
/** Rend un contrôle, sa classe CSS dérivant de son niveau. */
function controlHtml(control) {
const level = String(control.niveau || 'INFO').toLowerCase();
@@ -89,7 +78,7 @@
if (end) query.set('date_fin', end);
message('Chargement des équipes…');
try {
const data = await api(`api/teams.php?${query.toString()}`);
const data = await apiJson(`api/teams.php?${query.toString()}`);
el('team-list').innerHTML = (data.teams || []).map(teamHtml).join('') || '<div class="empty-state">Aucune équipe sur cette période.</div>';
message(`${(data.teams || []).length} équipe(s) affichée(s).`, 'success');
} catch (error) { message(error.message, 'error'); }
@@ -100,7 +89,7 @@
event.preventDefault();
const box = el('team-create-message');
try {
const data = await api('api/teams.php', {
const data = await apiJson('api/teams.php', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
csrf_token: window.PTA_CONFIG.csrfToken,
@@ -136,7 +125,7 @@
if (event.type === 'submit' && event.target.matches('.team-member-form')) {
event.preventDefault();
try {
await api('api/team_members.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({
await apiJson('api/team_members.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({
csrf_token: window.PTA_CONFIG.csrfToken, team_id: teamId,
agent_id: Number(card.querySelector('.team-member-agent').value),
fonction_equipe: card.querySelector('.team-member-function').value,
@@ -150,7 +139,7 @@
if (remove) {
if (!window.confirm('Retirer cet agent de l’équipe ?')) return;
try {
await api('api/team_members.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({
await apiJson('api/team_members.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({
csrf_token: window.PTA_CONFIG.csrfToken, action: 'REMOVE', team_id: teamId, agent_id: Number(remove.dataset.agentId),
}) });
await load();
@@ -168,7 +157,7 @@
if (!select) return;
const card = select.closest('.team-card');
try {
await api('api/team_status.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({
await apiJson('api/team_status.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({
csrf_token: window.PTA_CONFIG.csrfToken, team_id: Number(card.dataset.teamId), statut: select.value,
}) });
await load();