CI / test (push) Successful in 2m22s
- Clients : create_milestone / update_milestone (cache invalidé) ; GitHub hérite des mêmes endpoints. - API Kanbante : création, modification (titre/échéance, échéance vidée = retirée), fermeture ; CSRF, validation de date avant toute écriture, erreurs forge en 502. - Page Projet : formulaire 'Nouveau jalon' + édition/ fermeture par jalon (project.js versionné). - Échéance à midi UTC : à minuit, le fuseau de l'instance Gitea faisait reculer la date affichée d'un jour (réel). - 291 tests verts (5 nouveaux, palier 24) ; cycle réel complet sur Projets/kanbante (jalons smoke #37/#38 créés, dates vérifiées, fermés).
28 lines
1.2 KiB
JavaScript
28 lines
1.2 KiB
JavaScript
// Page Projet — écritures de jalons (0.35.0, issue #26).
|
|
// Les formulaires data-ms-form sont interceptés : POST vers
|
|
// l'API Kanbante (qui écrit dans la forge), puis rechargement
|
|
// pour refléter l'état réel.
|
|
(() => {
|
|
const csrf = document.querySelector('meta[name="csrf-token"]')?.content || '';
|
|
document.querySelectorAll('form[data-ms-form]').forEach((form) => {
|
|
form.addEventListener('submit', async (e) => {
|
|
e.preventDefault();
|
|
const confirmMsg = form.dataset.confirm;
|
|
if (confirmMsg && !window.confirm(confirmMsg)) return;
|
|
const fd = new FormData(form);
|
|
fd.append('csrf_token', csrf);
|
|
const btn = form.querySelector('button[type="submit"]');
|
|
if (btn) btn.disabled = true;
|
|
try {
|
|
const r = await fetch(form.dataset.action, { method: 'POST', body: fd });
|
|
const data = await r.json().catch(() => ({}));
|
|
if (!r.ok || !data.ok) throw new Error(data.error || ('HTTP ' + r.status));
|
|
window.location.reload();
|
|
} catch (err) {
|
|
if (btn) btn.disabled = false;
|
|
window.alert('❌ ' + err.message);
|
|
}
|
|
});
|
|
});
|
|
})();
|