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>
36 lines
1.5 KiB
JavaScript
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),
|
|
});
|
|
}
|