v5.4.1 Partage : correctif permissions + autocomplete membres (inclut v5.4.0 Interactions de bloc)
- Fix "Invalid permission" : le client envoyait editor/commenter/viewer alors que
l'API attend view/comment/edit (invitePermission -> 'edit', menu participants aligné)
- PUT /api/pages/{page_id}/share/{share_id} : mise à jour de permission persistée
- Autocomplete des membres existants dans le champ d'invitation (search users + debounce,
navigation clavier, envoi user_id pour lier le partage au compte)
- Upsert anti-doublon dans le partage + trim email backend
- 12 tests tests/test_sharing.py ; suite 319 verte (+3 PDF pre-existants)
Sans oublier v5.4.0 (non publie jusque-la) :
- Undo/Redo (Ctrl+Z/Ctrl+Shift+Z/Ctrl+Y), duplicate (Ctrl+D), menu de bloc (turn
into, couleurs, lien #fdblk-, move to, delete), drag&drop multi-selection,
slash "Actions", en-tetes de tableau (has_header/first_col_header) + exports,
sync realtime immédiat apres mutation ; 9 tests test_block_interactions.py
This commit is contained in:
@@ -1,5 +1,63 @@
|
||||
# Changelog - FlowDeck
|
||||
|
||||
## v5.4.1 (2026-09-08) — Partage de page : correctif permissions + autocomplete membres
|
||||
|
||||
> Le partage à un membre existant échouait avec « Invalid permission. Use view,
|
||||
> comment, or edit. » — le client envoyait `editor`/`commenter`/`viewer` alors
|
||||
> que l'API n'accepte que `view`/`comment`/`edit`. Corrigé, et enrichi.
|
||||
|
||||
- **Correctif permissions** — défaut du champ d'invitation passé à `edit` ;
|
||||
valeurs, libellés et surbrillance du menu de permission des participants
|
||||
alignés sur le contrat API (`view`/`comment`/`edit`).
|
||||
- **Mise à jour de permission persistée** — nouvel endpoint
|
||||
`PUT /api/pages/{page_id}/share/{share_id}` ; le menu de permission d'un
|
||||
participant enregistre désormais le changement (avant : visuel uniquement).
|
||||
- **Autocomplete des membres existants** — en tapant dans le champ d'invitation,
|
||||
recherche dans `/api/notifications/users/search?q=` (debounce 150 ms) avec
|
||||
liste de suggestions (avatar couleur, login, nom complet), navigation
|
||||
clavier ↑/↓/Entrée/Échap ; soi-même et membres déjà partagés exclus.
|
||||
- **Partage lié au compte** — la sélection d'un membre dans les suggestions
|
||||
envoie `user_id`, le partage est donc lié au compte (pas seulement à un
|
||||
email) ; un email peut toujours être saisi librement.
|
||||
- **Upsert anti-doublon** — partager un membre déjà présent met à jour sa
|
||||
permission au lieu de créer une ligne dupliquée ; trim de l'email côté serveur.
|
||||
- **Tests** (tests/test_sharing.py) : partage par user_id/email, permission
|
||||
invalide rejetée, upsert, PUT permission, suppression avec unset is_shared,
|
||||
erreurs d'auth. Suite complète 319 verte (+3 PDF pré-existants).
|
||||
|
||||
## v5.4.0 (2026-09-08) — Interactions de bloc
|
||||
|
||||
> Manipulation riche des blocs façon Notion : undo/redo, duplication, menu de
|
||||
> bloc ⋮ (turn into, couleurs, lien vers le bloc, déplacer, supprimer),
|
||||
> glisser-déposer multi-sélection et en-têtes de tableau configurables.
|
||||
|
||||
- **Undo/Redo** : pile d'historique (100 entrées) alimentée à chaque mutation
|
||||
(frappe Entrée, retour arrière, slash, tableau, toggle, colonnes…), rappel
|
||||
`Ctrl+Z` / `Ctrl+Shift+Z` ou `Ctrl+Y`, restauration avec re-focus du bloc.
|
||||
- **Duplication de bloc** : `Ctrl+D`, menu bloc ou commande slash « Duplicate » ;
|
||||
copie profonde (enfants columns/toggle inclus) insérée juste en dessous ;
|
||||
en multi-sélection, le groupe entier est dupliqué.
|
||||
- **Menu de bloc ⋮** sur la poignée (clic ou clic droit) : « Turn into »
|
||||
(sous-menu conservant le contenu), Duplicate, Copy link to block
|
||||
(`#fdblk-<id>`, scrolls/focus au chargement), Move to… (dialogue de
|
||||
recherche des pages de l'arbre, déplacement du bloc via l'API), Delete,
|
||||
couleur de texte et de fond appliquées à un bloc ou à la sélection.
|
||||
- **Glisser-déposer multi-sélection** : `Shift+clic` sur la poignée ajoute un
|
||||
bloc à la sélection ; déplacer un bloc sélectionné déplace tout le groupe
|
||||
(reconstruction de l'ordre depuis le DOM via `data-id`).
|
||||
- **Commandes slash étendues** : groupe « Actions » avec Duplicate, Turn
|
||||
into…, Copy link to block et Delete block.
|
||||
- **En-têtes de tableau** : toggles « Header row » / « First col » dans la
|
||||
barre du tableau ; `has_header` (toujours actif par défaut) et nouveaux
|
||||
`first_col_header` persistés et pris en compte dans les exports Markdown/HTML
|
||||
(app/services/export.py) ainsi que que dans `blocksToMarkdown` client.
|
||||
- **Intégration realtime** : méthode `syncNow`/`forceEmit` sur `window.__fdRT`
|
||||
appelée après chaque mutation programmatique pour pousser immédiatement les
|
||||
ops (undo, duplicate, drag, turn into, couleurs, déplacement, toggles).
|
||||
- **Tests** (tests/test_block_interactions.py) : persistance des blocs avec
|
||||
`has_header`/`first_col_header`/`style`, exports table Markdown/HTML,
|
||||
endpoint « Move to » (get page + POST blocks sur la cible).
|
||||
|
||||
## v5.3.0 (2026-09-08) — Realtime : édition collaborative en direct
|
||||
|
||||
> Deux utilisateurs peuvent maintenant éditer une même page **en même temps**
|
||||
|
||||
Reference in New Issue
Block a user