feat(templates): refonte complète des templates façon Notion + vues/agents-skills
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:
+203
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user