Embed public AIT¶
L'espace AIT expose deux pages publiques qu'une commune intègre en iframe sur son propre site, pour ses habitants, sans l'app bat-id : une carte interactive en lecture seule et la liste des mises à l'enquête. Découplées de toute session AIT.
Lecture seule, aucune donnée privée
Routes publiques : pas d'authentification, pas de session AIT, pas de Policy. Aucune zone d'alerte, aucun identifiant bat-id, aucune donnée privée. Aucune écriture possible.
Endpoints¶
| Méthode | Route | Contenu |
|---|---|---|
GET | /ait/embed/{municipality} | Carte interactive (formes géométriques de la commune) |
GET | /ait/embed-alerts/{municipality} | Liste des mises à l'enquête (annonces BO) |
GET | /ait/embed-screen/{municipality} | Écran d'information plein écran, boucle automatique |
{municipality} = identifiant de la commune (route-model binding). Langue optionnelle sur la carte :
Carte interactive — /ait/embed/{municipality}¶
Diffuse les planches géométriques publiées par la commune. Une planche reste invisible tant qu'un admin AIT ne l'a pas explicitement passée en statut published ; les brouillons (draft) ne sont jamais diffusés.
- Payload par forme : titre, information, couleur, publics cibles, pictogrammes, bornes de validité (
valid_from,valid_until). - Tranche temporelle (
past/present/future) calculée côté serveur ; filtre par période appliqué côté client. - Filtres client sur les publics cibles et pictogrammes réellement présents.
- Géométries servies en GeoJSON (
FeatureCollection).
Formes publiées et valides uniquement
Le serveur n'expose que les planches en statut published destinées à la diffusion publique (where('status', 'published')). Les brouillons restent réservés au back-office AIT. Aucune zone d'alerte ni donnée nominative dans le payload.
Fidélité de rendu¶
Les formes s'affichent dans l'iframe à l'identique de l'éditeur AIT (source de vérité : AitMap.vue) :
- couleur et épaisseur de trait (
_line_weight) respectées ; - tirets proportionnels (
computeDash(_dash_array, _line_weight)) ; - étiquettes texte avec leur taille (
_text_size) et leur fond (_text_bg, padding et centrage).
Le codage temporel public (passé estompé, futur en tirets) s'applique par-dessus ce rendu fidèle.
Liste des alertes — /ait/embed-alerts/{municipality}¶
Annonces du Bulletin officiel de la commune (jusqu'à 300, les plus récentes d'abord), sans carte. Par entrée : date, ancienneté en jours, parcelles concernées, rubrique, titre, source, lien vers le PDF. Mention bat-id sobre incitant à la géolocalisation. Active par défaut pour toutes les communes.
Écran d'information — /ait/embed-screen/{municipality}¶
Vue plein écran conçue pour des écrans diffusés en continu (commerces, cafés, office du tourisme, vitrines communales). Sans filtre ni interaction : la page enchaîne automatiquement les sujets « en ce moment » (planches valides le jour même) puis « à venir » (nouveautés des 5 prochains jours), avec une transition de carte (zoom arrière → recadrage → zoom avant) entre chaque. Grand format, lisible à distance.
Même source publique que la carte interactive (planches published uniquement, aucune donnée nominative). Affichage recommandé en 16:9 (le code d'intégration proposé est responsive en ratio 16:9).
Intégration iframe¶
En-têtes configurés pour ces deux routes uniquement :
Content-Security-Policy: frame-ancestors *— autorise l'intégration par tout site communal tiers.X-Frame-Optionsretiré — neutralisé au cas où un reverse-proxy ajouterait unDENY/SAMEORIGIN. Sur navigateurs modernes,frame-ancestorsprévaut ; les deux sont couverts.
Périmètre des en-têtes
Limités aux deux routes d'embed. Aucun middleware global de headers n'est touché.
Exemple responsive¶
<div style="position:relative; width:100%; padding-top:62.5%;">
<iframe
src="https://demo.bat-id.ch/ait/embed/{ID_COMMUNE}?lang=fr"
title="Carte des mises à l'enquête"
loading="lazy"
style="position:absolute; inset:0; width:100%; height:100%; border:0;"
referrerpolicy="no-referrer">
</iframe>
</div>
Pour la liste des alertes, remplacer le chemin par /ait/embed-alerts/{ID_COMMUNE}.
Bonnes pratiques
loading="lazy" + conteneur à ratio fixe pour éviter le décalage de mise en page. Le domaine dépend de l'environnement (démo / production) — vérifier l'URL exacte côté espace AIT.