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
+183
View File
@@ -0,0 +1,183 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Carte des établissements scolaires — France</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css"/>
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css"/>
<link rel="stylesheet" href="style.css"/>
</head>
<body>
<div id="app">
<aside id="sidebar">
<header>
<h1>Établissements scolaires</h1>
<p class="subtitle">Annuaire de l'Éducation nationale</p>
<p id="count" class="count">Chargement…</p>
</header>
<div class="filters">
<div class="field">
<label for="search">Recherche (nom / commune)</label>
<input type="search" id="search" placeholder="Ex. Jean Jaurès, Lyon…" autocomplete="off">
</div>
<fieldset>
<legend>Type d'établissement</legend>
<div id="f-type" class="checks"></div>
</fieldset>
<fieldset>
<legend>Statut</legend>
<div id="f-stat" class="checks"></div>
</fieldset>
<fieldset>
<legend>État</legend>
<div id="f-etat" class="checks"></div>
</fieldset>
<div class="field">
<label for="f-reg">Région</label>
<select id="f-reg"></select>
</div>
<div class="field">
<label for="f-aca">Académie</label>
<select id="f-aca"></select>
</div>
<div class="field">
<label for="f-dep">Département</label>
<select id="f-dep"></select>
</div>
<div class="field">
<label for="f-circ">Circonscription</label>
<select id="f-circ"></select>
</div>
<fieldset>
<legend>Options proposées</legend>
<div id="f-opt" class="checks"></div>
<p class="hint">Coché = uniquement les établissements proposant l'option.</p>
</fieldset>
<button id="reset" type="button">Réinitialiser les filtres</button>
</div>
<footer>
<p><a href="admin.html">🔐 Espace administration</a></p>
<p>Source : <a href="https://data.education.gouv.fr/explore/dataset/fr-en-annuaire-education/" target="_blank" rel="noopener">data.education.gouv.fr</a> — fond de carte © OpenStreetMap</p>
</footer>
</aside>
<main id="map"></main>
</div>
<div id="legend" class="legend"></div>
<!-- Fiche établissement plein écran (overlay superposé à la carte) -->
<div id="fiche" class="fiche" hidden>
<header class="fiche-bar">
<button id="fiche-back" class="fiche-back" type="button">← Retour à la carte</button>
<div class="fiche-title">
<h2 id="fiche-nom"></h2>
<span id="fiche-sub" class="fiche-sub"></span>
</div>
</header>
<nav class="fiche-tabs">
<button class="fiche-tab active" type="button" data-tab="infos">Informations</button>
<button class="fiche-tab" type="button" data-tab="docs">Documents</button>
<button class="fiche-tab" type="button" data-tab="photos">Photothèque</button>
<button class="fiche-tab" type="button" data-tab="propose"> Proposer un élément</button>
</nav>
<div class="fiche-body">
<section id="tab-infos" class="tab-panel active">
<div class="tab-actions">
<button id="fiche-locate" type="button" class="btn-secondary">📍 Localiser sur la carte</button>
</div>
<div class="info-cols">
<div id="info-main" class="info-main"><!-- cartes : identité, coordonnées… --></div>
<div id="info-side" class="info-side"><!-- commentaires --></div>
</div>
</section>
<section id="tab-docs" class="tab-panel">
<div class="docs-layout">
<nav id="folder-tree" class="folder-tree"></nav>
<div id="folder-items" class="folder-items"></div>
</div>
</section>
<section id="tab-photos" class="tab-panel">
<div id="photo-grid" class="photo-grid"></div>
</section>
<section id="tab-propose" class="tab-panel">
<form id="propose-form" class="propose-form" autocomplete="off">
<p class="propose-intro">
Proposez un document, une photo ou un lien. Votre proposition sera
publiée après validation par un administrateur.
</p>
<div class="field">
<label>Type d'élément</label>
<div class="radio-row">
<label><input type="radio" name="kind" value="file" checked> 📄 Fichier</label>
<label><input type="radio" name="kind" value="photo"> 🖼 Photo</label>
<label><input type="radio" name="kind" value="link"> 🔗 Lien</label>
</div>
</div>
<div class="field">
<label for="p-folder">Dossier</label>
<select id="p-folder" name="folder_id"></select>
</div>
<div class="field" data-when="file photo">
<label for="p-file">Fichier</label>
<input id="p-file" type="file">
</div>
<div class="field" data-when="link">
<label for="p-url">URL du lien</label>
<input id="p-url" type="url" placeholder="https://…">
</div>
<div class="field">
<label for="p-title">Libellé <span class="opt">(facultatif pour un fichier)</span></label>
<input id="p-title" type="text" name="title" placeholder="Ex. Règlement intérieur 2025">
</div>
<div class="field">
<label for="p-desc">Description <span class="opt">(facultatif)</span></label>
<textarea id="p-desc" name="description" rows="3" placeholder="Texte explicatif : de quoi s'agit-il, contexte, date du document…"></textarea>
</div>
<div class="field-2">
<div class="field">
<label for="p-name">Votre nom <span class="opt">(facultatif)</span></label>
<input id="p-name" type="text" name="submitter_name">
</div>
<div class="field">
<label for="p-mail">Votre e-mail <span class="opt">(facultatif)</span></label>
<input id="p-mail" type="email" name="submitter_email">
</div>
</div>
<button type="submit" class="btn-primary">Envoyer la proposition</button>
<p id="propose-msg" class="propose-msg"></p>
</form>
</section>
</div>
</div>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
<script src="fiche.js"></script>
<script src="app.js"></script>
</body>
</html>