Files
echo-du-huit/extension/transfert.js
T
Pierre MartinandClaude Opus 4.8 3d86330894 feat: list upcoming events with a create button
The list page now parses the calendar feed and renders each upcoming
event (title, date, place) in chronological order, with a button that
hands the event over to the town hall form.

Sorting, date formatting and the café fallback live in a pure
presentation module rather than in liste.js, which touches the DOM and
cannot be imported under bun test. The seam to the sibling task's
content script lives in transfert.js: a single storage slot, since a
content script running on the town hall site has no way to learn a uid.
The deposit is awaited before opening the tab, otherwise the content
script could read before the write lands.

Test timezone is pinned to Europe/Paris: date formatting is the core
logic here and would otherwise pass only on machines set to Paris.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 18:23:38 +02:00

36 lines
1.5 KiB
JavaScript

// Couture liste → content script du formulaire mairie (contrat lu par la tâche
// sœur « formater les données pour le formulaire mairie »).
//
// Clé UNIQUE, pas indexée par uid : le content script s'exécute sur le site de
// la mairie et n'a aucun moyen d'apprendre un uid (le fragment d'URL a été
// écarté). Une clé connue d'avance lui suffit donc à lire « l'événement à
// créer ». Corollaire assumé : le dernier clic gagne, et on n'efface pas à la
// lecture pour que le formulaire survive à un rechargement.
//
// `debut`/`fin` sont sérialisés en ISO 8601 : le contrat reste explicite quel
// que soit le moteur, et le content script réhydrate avec `new Date(iso)`.
export const CLE_EVENEMENT_EN_ATTENTE = "evenement-en-attente";
// `lieu` est laissé brut ("" si absent) : c'est le signal dont le content
// script a besoin pour décider s'il pose aussi les coordonnées du café.
export function serialiserPourFormulaire(evenement) {
return {
uid: evenement.uid,
titre: evenement.titre,
description: evenement.description,
lieu: evenement.lieu,
debut: evenement.debut.toISOString(),
fin: evenement.fin.toISOString(),
categories: evenement.categories,
journeeEntiere: evenement.journeeEntiere,
};
}
// `storage` est injecté (obligatoire) : testable sans navigateur.
export async function deposerEvenement(storage, evenement) {
await storage.set({
[CLE_EVENEMENT_EN_ATTENTE]: serialiserPourFormulaire(evenement),
});
}