feat(wiki,templates): v5.11.0 wiki-links & mentions + v5.12.0 templates & page lock (release 5.12.0)
FlowDeck CI / lint (push) Successful in 50s
FlowDeck CI / test (push) Successful in 5m41s
FlowDeck CI / docker (push) Successful in 45s

v5.11.0 Wiki-links & mentions de page :
- tokens [[fdpage:ID]] / [[fddate:ISO]] dans le texte des blocs,
  service app/services/wiki_links.py (labels, rendu HTML, extraction)
- taper [[ ouvre le picker de pages (recherche floue, clavier) ;
  le menu @ gagne les sections Pages et Date (today/tomorrow/YYYY-MM-DD)
- chips atomiques contenteditable=false relues en tokens par gtTok()
  (autosave/drag/undo preservent les liens) ; renommage propage via
  GET /board/api/wiki/titles ; backlinks reconnaissent les tokens ;
  page publique rend les chips (echopee)

v5.12.0 Templates & verrouillage :
- template picker global sur + New page : 5 built-in
  (app/services/block_templates.py) + templates perso
  (table page_global_templates, migration 13)
- POST /board/api/page-templates (save current page) + /{id}/use
  (instantiate, id 0 = built-in par cle)
- page lock : POST /api/pages/{id}/lock, garde _ensure_page_editable
  -> 423 en ecriture pour les non-privileged, deblocage par
  locked_by ou admin seulement (403 sinon), banniere + read-only UI
- full-width / small text par page (pages.full_width/font_small,
  POST /api/pages/{id}/options, classes CSS)
- migration 13 : is_locked, locked_by, full_width, font_small,
  page_global_templates

Tests : tests/test_v511_v512_wiki_templates.py (15) ; suite complete
538 verte ; ruff OK ; node --check des templates JS OK.
This commit is contained in:
2026-09-14 06:38:09 -04:00
parent d4adf89db5
commit 9dfc38706c
14 changed files with 1439 additions and 95 deletions
+61
View File
@@ -1,5 +1,66 @@
# Changelog - FlowDeck
## v5.12.0 (2026-09-14) — v5.11.0 Wiki-links & v5.12.0 Templates & lock
> Deux versions roadmap livrées ensemble : le graphe de connaissances
> Notion (liens `[[`, mentions de page et de date, renommage propagé) et
> les options de page (galerie de templates globale, verrouillage
> lecture-seule, pleine largeur, texte compact).
### v5.11.0 — Wiki-links & mentions de page
- **Service** `app/services/wiki_links.py` — tokens stockés dans le texte
des blocs : `[[fdpage:ID]]` (lien interne résolu à l'affichage) et
`[[fddate:YYYY-MM-DD]]` (chip de date). Le token ne contient que l'id →
**renommage propagé** automatiquement.
- **Endpoints** — `GET /board/api/wiki/pages?q=` (picker, recherche
substring + sous-séquence floue « mnt » → « Meeting notes ») et
`GET /board/api/wiki/titles?ids=` (labels courants en batch, icônes
incluses, « Deleted page » si supprimée).
- **Éditeur** — taper `[[` ouvre le picker de pages (recherche live,
navigation clavier ↑↓/Entrée/Échap, sélection à la souris), Enter
insère une **chip de page** atomique (icône + titre, clique = navigate).
Le menu `@` existant gagne deux sections : **Pages** (`@Nom` → lien
inline) et **Date** (`@today`, `@tomorrow`, `@YYYY-MM-DD` → chips).
Les chips sont relu en tokens bruts (`gtTok`) à chaque sync : le drag,
le split Entrée, l'undo/redo et l'autosave préservent les liens.
- **Backlinks** — le scanner v5.4.0 reconnaît désormais les tokens
`[[fdpage:ID]]` : « Lié depuis » fonctionne avec les wiki-links.
- **Page publique** — `_render_blocks_public` résout les chips (liens
absolus + dates lisibles, HTML échappé).
### v5.12.0 — Templates & verrouillage de page
- **Template picker global** — « + New page » (sidebar, footer, palette
Ctrl+K) ouvre la galerie : 5 templates built-in (`app/services/
block_templates.py` : Empty, Meeting notes, Weekly report, To-do list,
Project doc) + les templates personnels sauvegardés ; « Empty » retombe
sur la création classique (workspace item).
- **Save as template** — menu « … » de la page → capture le contenu blocs
courant comme template personnel (`page_global_templates`, visibles
uniquement par leur créateur, `created_by IS NULL` = partagé).
- **Bouton « Use template »** — `POST /board/api/page-templates/{id}/use`
(id 0 = built-in par clé) duplique le contenu des blocs dans une
nouvelle page du workspace de l'utilisateur et renvoie son id.
- **Page lock** — menu « … » → « 🔒 Lock page » : bannière sticky
« locked (read-only) », blocs et titre passés `contenteditable=false`,
handles/actions masquées. Serveur : `POST /board/api/pages/{id}/lock`,
garde `_ensure_page_editable` → **423** sur `PUT /api/pages/{id}` et
`POST /api/pages/{id}/blocks` pour tout non-privileged ; déverrouillage
réservé à la personne qui a verrouillé (`locked_by`) ou un admin (403
sinon).
- **Full-width / Small text** — toggles dans le menu « … », persistés par
page (`pages.full_width`, `pages.font_small`), options `POST
/board/api/pages/{id}/options`, rendu via classes CSS
(`.full-width` / `.small-text`).
- **Migrations 13** — `pages.is_locked`, `pages.locked_by`,
`pages.full_width`, `pages.font_small`, table `page_global_templates`.
- **Tests** — `tests/test_v511_v512_wiki_templates.py` : **15 tests**
(schéma, helpers tokens + échappement, picker flou, renommage propagé,
persistance des tokens + backlinks, chips en page publiée, lock 423 /
403 / admin / ré-ouverture, options, templates built-in + perso +
cloisonnement, shapes service, câblage front). Suite complète
**538 verte**, `ruff check` OK.
- **Version** — 5.12.0.
## v5.11.7 (2026-09-13) — v5.8.0 Calendrier & Rappels
> Calendrier complet (jour / semaine / mois) avec récurrences expandues