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>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
d1a1c194bb
commit
3d86330894
@@ -0,0 +1,35 @@
|
||||
// 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),
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user