feat(templates): refonte complète des templates façon Notion + vues/agents-skills
FlowDeck CI / lint (push) Failing after 1m32s
FlowDeck CI / test (push) Failing after 27m50s
FlowDeck CI / docker (push) Skipped

Templates (v7.71.x) :

- registre unifié \	emplates\ (migrations 48-49) + TemplateService.instantiate unique (UI, API v2, agent, scheduler)

- sélecteur (pilule page vide, menu •••, commande /template), gestionnaire /templates, menu New ▾, From template, base inline dans un document

- 141 presets système (59 pages, 42 bases, 15 blocs, 25 lignes), titre auto depuis le template, variables title réservée

- récurrences RRULE + scheduler dédupliqué, agent apply_template/list_templates, API /api/templates + /api/v2/fd-templates

- correctifs : bouton Templates, centrage fenêtre, filtres CSP, flux de création, variable title

- tests : tests/test_fd_templates.py (19) et e2e/templates_picker.spec.js (8)

Inclut le travail déjà présent dans le working tree (vues Notion : view_query/view_aggregate/form_projection/geocoding, property_types, database_table, docs agents-skills) et ignore .playwright-mcp/.
This commit is contained in:
2026-10-10 18:52:19 -04:00
parent d0452e10dd
commit fc8548194a
36 changed files with 12290 additions and 137 deletions
+203
View File
@@ -1,5 +1,208 @@
# Changelog - FlowDeck
## v7.71.5 (2026-10-10) — Galerie système : +94 templates (135 au total)
### Added
- **Galerie système portée à 135 presets** (auparavant 41, + 6 bases legacy
= 47 installés). Nouveaux templates, tous genres :
- **+39 pages** — Semainier, Daily standup, Agenda de réunion, Compte rendu
de sprint, Kickoff/Registre des risques/Leçons apprises/Note de
cadrage/Plan de communication, Runbook d'incident, Checklist de code
review, Doc d'API/architecture, Plan de test, Changelog, User persona,
Guide d'entretien utilisateur, Roadmap produit, Business Model Canvas,
SWOT, RACI, Proposition commerciale, Facture, Plan marketing, Brief,
Script d'appel, Rapport de performance, Fiche de poste, Guide
d'entretien d'embauche, Politique interne, Guide d'installation, Plan de
repas, Liste de courses, Checklist de ménage, Suivi d'entraînement, Plan
de carrière, Rétro perso, Checklist de valise, Boîte à idées.
- **+9 blocs** — Étapes numérotées, Avantages/Inconvénients, Mise en garde
+ Astuce, Définition, Ressources/liens, Contacts clés, Présentation,
Comparatif d'options, Signature d'email.
- **+26 bases** — Pipeline de vente, Devis/Factures, Réunions, Registre des
décisions, Backlog/Idées, Sprints, Roadmap/Fonctionnalités, Tests QA,
Risques, Candidatures, Formations & cours, Compétences, Abonnements,
Budget/Revenus, Dépenses partagées, Campagnes marketing, Publications
réseaux sociaux, KPI/Métriques, Événements, Recettes, Films & séries,
Voyages, Fournisseurs, Matériel/Équipement, Rendez-vous santé,
Entraînements.
- **+20 lignes** — Client, Opportunité, Devis, Facture, Réunion, Décision,
Risque, Idée, Fonctionnalité, Cas de test, Vidéo, Événement, Voyage,
Recette, Séance d'entraînement, Candidature, Formation, Fournisseur,
Abonnement, Indicateur (base cible résolue par nom).
Les installations existantes sont rafraîchies automatiquement au boot
(`PRESET_VERSION`), sans toucher aux copies personnelles.
## v7.71.4 (2026-10-10) — Templates de page : titre automatique, plus d'erreur « variable requise »
### Fixed
- **« Échec : HTTP 400 {"detail":"variable requise manquante : title"} »** —
plusieurs presets de page déclaraient `title` comme variable *requise* ; le
sélecteur l'envoyait vide → refus. `title` est désormais une **variable
système réservée** (jamais requise) : une valeur fournie prime, sinon la
résolution retombe sur le titre de la page cible puis sur le nom du
template. Les presets concernés déclarent `title` en optionnel.
- **Le titre du document suit le template choisi** — appliquer un template de
page à la page courante (ou via `/template`, ou en créer une nouvelle)
définit maintenant le titre à partir de `title_template` (ex.
« CR — Compte rendu client (2026-10-10) »), au lieu de laisser
« Untitled ». Le titre est mis à jour en place dans l'éditeur sans
rechargement.
## v7.71.3 (2026-10-10) — Templates : commande `/` + galerie enrichie (> 20 presets)
### Added
- **Commande slash `/template`** dans l'éditeur : elle ouvre le même sélecteur
de templates mais **sans les templates de page** — filtres limités à
*Bases / Lignes / Blocs* (plus « Tous »). Un template de blocs s'insère au
curseur, un template de base crée une base inline dans le document, un
template de ligne crée la ligne dans sa base (sans quitter la page).
- **Galerie système enrichie à 38 presets** (auparavant 7), tous genres
confondus :
- **18 pages** : Note de réunion, Compte rendu client, 1:1, Revue hebdo,
Journal quotidien, Journal de gratitude, Spécification produit, Plan de
projet, Rétrospective, Post-mortem incident, Objectifs OKR, Décision
(ADR), Procédure (SOP), Onboarding, Notes de cours, Fiche de lecture,
Recette, Itinéraire, Fiche prospect, Communiqué…
- **6 blocs** : Sommaire + actions, Questions de réunion, Matrice
d'Eisenhower, FAQ, Citation + source, Checklist de démarrage.
- **10 bases** : Tâches, Gestion de projet, Suivi de bugs, Contenu
éditorial, Habitudes, Dépenses, Inventaire, Bibliothèque de liens,
Objectifs, Annuaire d'équipe.
- **5 lignes** : Tâche, Bug, Article, Dépense, Habitude (résolues par nom
de base cible — utilisables depuis le menu *New ▾* d'une base ou le
sélecteur).
### Fixed
- **Types de blocs des presets** : les entêtes utilisaient `heading`
(rendu comme un simple paragraphe) et les cases à cocher `todo` — corrigés
en `heading_1/2/3` et `to_do` (types réels de l'éditeur). Les presets
système déjà installés sont **rafraîchis automatiquement** au boot
(`preset_version`), sans toucher aux copies personnelles de l'utilisateur.
- **Manifeste des presets de base** : `ensure_system_presets` ignorait la
définition `collection` (schéma) → les bases système étaient créées vides ;
le manifeste est désormais transmis, et une base créée depuis un preset
porte ses propriétés (Statut, Priorité, Échéance…).
- **Templates de ligne** : la base cible d'un preset est résolue par nom
(`target_collection_name`) dans le workspace, avec un message explicite si
la base n'existe pas — au lieu d'un échec technique.
## v7.71.2 (2026-10-10) — Templates : flux de création des documents + menu contextuel
### Changed
- **Un seul flux de création de document, cohérent partout.** Le bouton
« New page » (barre de titre du workspace local, actions de section,
menu « New » en bas de la sidebar, menu contextuel) **crée désormais un
document vide** et navigue dessus — comportement Notion. Il n'ouvre plus
l'ancien panneau « New page from template » (supprimé) dont les boutons
Annuler/fermer étaient inopérants (collision d'`id` `fd-tpl-picker` avec
le sélecteur de l'éditeur : `document.getElementById('fd-tpl-close')`
renvoyait `null`, la fermeture n'était jamais câblée, et l'overlay
bloquait le reste de l'UI — d'où le menu contextuel perçu comme cassé).
- **Nouveau sélecteur global « Nouveau depuis un template »**, adossé au
registre unifié (`/api/templates`) : accessible depuis le menu « New »
de la sidebar (*From template…*), utilisable sur toutes les pages
(sidebar, workspace local, library), avec recherche, filtres, « Gérer… »,
état vide/erreur explicite et Annuler/✕ fonctionnels.
- **Filtres du sélecteur de l'éditeur restylés** (segmented control
partagé `.fd-tpl-filter`, libellés FR : Tous / Pages / Bases / Lignes /
Blocs, état actif accentué, survol) — mêmes classes que le sélecteur
global, aucun nouveau langage visuel.
### Fixed
- Menu contextuel clic droit de la section Workspace : plus bloqué par
l'ancien overlay figé du panneau template.
### Tests
- `e2e/templates_picker.spec.js` : +2 (le bouton « New page » crée un
document vide et navigue ; le menu *New > From template* ouvre le
sélecteur global et le ✕ ferme) ; filtres mis à jour (libellés FR).
## v7.71.1 (2026-10-10) — Templates : correctifs du sélecteur (centrage, filtres, aperçu, base inline)
### Fixed
- **Fenêtre « Appliquer un template » centrée** — l'overlay portait
`display:flex` en style inline ; Alpine, au retour de `x-show`, réapplique
`display:block` et écrasait le flex → le dialogue restait collé en haut à
gauche. Le flex vit désormais dans une enveloppe distincte de `x-show`
(l'overlay ne contrôle plus que la visibilité).
- **Boutons de filtre `Tous / page / blocks / row / database` inopérants** —
les handlers inline contenaient deux expressions séparées par `;`
(`tplKind = k; loadTplList()`), refusées par le parseur CSP d'Alpine.js
(« CSP Parser Error: Unexpected token: loadTplList »). Une méthode unique
`setTplKind(k)` / `setTplVar(name, value)` est appelée depuis les
handlers (une seule expression par binding, invariant build CSP).
- **« Aperçu indisponible : HTTP 400 » sur certains templates** — l'aperçu
partageait la résolution stricte de l'instanciation : une variable
déclarée requise non encore saisie levait `ValueError` → 400. L'aperçu
utilise désormais un mode non strict (`_resolve_all(..., strict=False)`) :
les tokens non résolus restent visibles avec un avertissement « À
compléter », seule l'instanciation exige la saisie.
- **Appliquer un template de type Database dans le document courant** — la
création partait dans une base détachée sans insertion. Le sélecteur
transmet `parent_page_id`, la collection est créée INLINE
(`is_inline=1`, `parent_page_id`) et le front insère le bloc embed
`collection` à la position du curseur, sans navigation (même patron que
la pilule « Database »).
### Tests
- `tests/test_fd_templates.py` : +3 (aperçu jamais 400, presets système,
base inline rattachée à la page) — 13 tests.
- `e2e/templates_picker.spec.js` : +2 (filtres par genre, insertion d'un
template Database dans le document) — 4 tests.
## v7.71.0 (2026-10-10) — Templates unifiés façon Notion (registre + sélecteur + gestionnaire)
### Fixed
- **Bouton « Templates » de la page vide réparé (cause établie par preuve,
phase 0 du cahier des charges)** — la pilule portait
`@click="gsMoreOpen = !gsMoreOpen"`, soit exactement le même flag que le
bouton « ••• » : le clic ouvrait le menu de création de base
(Table/Board/List…) au lieu d'un sélecteur (hypothèses H1+H4 confirmées
par lecture du code ; H2 écartée — le composant `editorState` est bien
enregistré via `Alpine.data`). La pilule et l'entrée « Apply template… »
du menu ••• ouvrent désormais le sélecteur unifié.
### Added
- **Registre unifié `templates` (migrations 48 + 49)** — catalogue les trois
silos legacy (`database_templates`, `page_templates`,
`page_global_templates`) sans les détruire (backfill idempotent au boot,
adaptateurs de lecture) ; journal `template_runs` (compteurs, audit,
idempotence) et `template_recurrences` (RRULE + scheduler 60 s
dédupliqué par `occurrence_key`).
- **`TemplateService.instantiate()` unique** — UI, API v2, agent
(`apply_template` rebranché + nouvel outil lecture `list_templates`) et
scheduler partagent la même instanciation transactionnelle : variables
système (`{{today}}`, `{{now}}`, `{{me}}`, `{{date:+7d}}`…) et déclarées
figées à la création, validation via `validate_property_value()`,
dégradation avec avertissements (propriété renommée), aucun `{{token}}`
survivant, pages-supports masquées (hors recherche/arbre/récents).
- **Sélecteur (§7.1)** : recherche, filtres par genre, aperçu résolu,
formulaire de variables, insertion de blocs au curseur / remplissage de
la page en place / création + navigation, toast avec annulation.
- **Gestionnaire `/templates`** (entrée sidebar + page SSR) : liste
filtrable, side peek (aperçu, variables, défauts, récurrence, journal),
création (vierge, depuis page/ligne/base, import `.json`), duplication,
archivage, corbeille, export/import au format `flowdeck-template` v1.
- **Menu *New ▾* des bases** : `GET /api/collections/{id}/templates`
(défaut ★, créations dédiées) ; **galerie système** (7 presets) ;
**API interne** `/api/templates…` et **API v2** `/api/v2/fd-templates…`
(liste, instantiate idempotent, export, import).
- **Tests** : `tests/test_fd_templates.py` (10 tests, §17.2) et
`e2e/templates_picker.spec.js` (régression T0-3 : le clic ouvre le
sélecteur et applique visiblement un template).
## v7.70.1 (2026-10-10) — Refonte navigation Repository : fix cache + erreurs console
### Fixed