Version initiale — carte des établissements scolaires

Carte Leaflet (annuaire Éducation nationale) + API PHP/MySQL :
fiche établissement (effectifs, IPS, population INSEE, DPE ADEME),
GED documents/photos, commentaires par groupe, gestion utilisateurs
et politique de mots de passe. Imports opendata (effectifs, IPS,
population, DPE, IRIS).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-03 21:35:41 +02:00
commit 5633969d98
40 changed files with 7242 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Réinitialiser le mot de passe</title>
<link rel="stylesheet" href="style.css"/>
</head>
<body>
<div class="auth-wrap">
<div class="auth-card">
<h1>Nouveau mot de passe</h1>
<form id="reset-form" autocomplete="off">
<div class="field">
<label for="pw">Nouveau mot de passe</label>
<input id="pw" type="password" required>
<div id="pw-meter" class="pw-meter"></div>
</div>
<div class="field">
<label for="pw2">Confirmer</label>
<input id="pw2" type="password" required>
</div>
<button type="submit" class="btn-primary">Valider</button>
<p id="msg" class="propose-msg"></p>
</form>
<p class="auth-foot"><a href="admin.html">← Retour à la connexion</a></p>
</div>
</div>
<script src="pwpolicy.js"></script>
<script>
const $ = (id) => document.getElementById(id);
const token = new URLSearchParams(location.search).get('token') || '';
PWPolicy.attach($('pw'), $('pw-meter'));
if (!token) {
$('reset-form').hidden = true;
$('msg').className = 'propose-msg err';
$('msg').textContent = 'Lien invalide : jeton manquant.';
}
$('reset-form').addEventListener('submit', async (ev) => {
ev.preventDefault();
const pw = $('pw').value, pw2 = $('pw2').value;
const r = PWPolicy.check(pw);
if (!r.ok) { showErr('Mot de passe trop faible : ' + r.unmet.join(' ; ') + '.'); return; }
if (pw !== pw2) { showErr('Les deux mots de passe ne correspondent pas.'); return; }
try {
const res = await fetch('api/auth.php?action=reset', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token, new: pw }),
});
const data = await res.json().catch(() => ({}));
if (!res.ok) { showErr(data.error || ('HTTP ' + res.status)); return; }
$('reset-form').hidden = true;
$('msg').className = 'propose-msg ok';
$('msg').innerHTML = '✅ Mot de passe mis à jour. <a href="admin.html">Se connecter</a>.';
} catch (err) { showErr('Erreur : ' + err.message); }
});
function showErr(t) { $('msg').className = 'propose-msg err'; $('msg').textContent = t; }
</script>
</body>
</html>