fix: /local-workspace — chemin du header + clic sur un dossier du sidebar (v7.69.9)
FlowDeck CI / lint (push) Successful in 1m37s
FlowDeck CI / test (push) Failing after 24m19s
FlowDeck CI / docker (push) Skipped

Corrige deux régressions de /local-workspace :

- le chemin du header restait bloqué sur « Home / <workspace> » quel que
  soit le dossier affiché : la route rend désormais breadcrumb_items
  (Home / <workspace> / <dossier> / <sous-dossier>, niveaux cliquables,
  collapse « … » au-delà de 4) et la navigation sans rechargement recalcule
  le chemin via l'event flowdeck:breadcrumb-changed ;
- le clic sur un dossier du sidebar affichait TOUS les composants à la
  fois : Alpine.data('wsInitData') retournait le même objet singleton, le
  2e montage (navigation partielle) levait « Cannot redefine property:
  \ » et initTree abandonnait, laissant tout le contenu au state
  brut. La factory retourne désormais une enveloppe fraîche par montage
  qui délègue à l'état réactif partagé. #lw-config est aussi relu à chaque
  exécution (le 2e montage gardait le folder_id du 1er chargement).

Inclus également le travail en cours de l'arbre : Library (colonnes Last
visited/Source, ordre d'en-tête, favoris à icônes Workspace), Meeting
Notes (bloc, CSS, routes, docs), coloration de code hljs, badges
favori/publié dans l'arbre local-workspace, docs (DATA_MODEL,
architectures) et tests associés.
This commit is contained in:
2026-10-09 16:58:04 -04:00
parent 7468e497c6
commit 0218d8f5e5
44 changed files with 12060 additions and 1729 deletions
+167 -1
View File
@@ -1,6 +1,172 @@
# Changelog - FlowDeck
## v7.69.4 (2026-10-08) — Le close de Settings ferme vraiment
## v7.69.9 (2026-10-09) — /local-workspace : chemin du header + navigation dans les dossiers réparée
### Fixed
- **/local-workspace : le chemin du header suit la navigation** — le header
restait bloqué sur « Home / <workspace> » quel que soit le dossier
affiché. La route rend désormais `breadcrumb_items`
(`_render_local_workspace`) au format des pages
(`_nav_breadcrumb`) : **Home / <workspace> / <dossier> / <sous-dossier> /
…**, chaque niveau cliquable (`/local-workspace?folder=<id>`) et le
dernier niveau courant ; au-delà de 4 niveaux, collapse « … » identique
à l'éditeur de page. La navigation **sans rechargement** (clic sur un
dossier dans la vue, breadcrumb interne, retour/avant) recalcule le
chemin via le nouvel event `flowdeck:breadcrumb-changed`, écouté par
`fdBreadcrumb` (`_header.html`) — les renommages continuent de suivre
via `flowdeck:page-renamed`.
- **/local-workspace : clic sur un dossier du sidebar = tous les composants
affichés en même temps** — après une navigation partielle
(`/local-workspace` → `/local-workspace?folder=<id>`), Alpine échouait
à remonter la page : `Alpine.data('wsInitData')` retournait **le même
objet singleton** et Alpine redéfinit ses magics (`$nextTick`…) avec
`Object.defineProperty` non-configurable →
« Cannot redefine property: $nextTick », `initTree` abandonnait et
**tout le contenu restait au state brut** (tree/list/détails/cartes,
dropdowns, toast Undo, barre d'upload… visibles simultanément).
La factory retourne désormais une enveloppe fraîche à chaque montage,
qui délègue lecture/écriture au proxy réactif partagé (état et
`wsPreview` inchangés).
- **/local-workspace : le dossier de l'URL était perdu en navigation
partielle** — `LW` (config `#lw-config`) n'était lu qu'à la première
exécution du script (verrouillé par `__fdLocalWorkspaceScriptsLoaded`) :
le 2e montage gardait le `folder_id`/`workspace_id` du premier
chargement. La config est relue à chaque exécution et l'état transitoire
(recherche, filtre, panneaux) est remis à zéro au montage.
- **/local-workspace : breadcrumb interne toujours rendu** — il n'apparaît
que si la page était chargée avec `?folder=` ; il est désormais présent
dès la racine et suit la pile de dossiers.
### Tests
- `e2e/regression_local_workspace_breadcrumb.spec.js` : parcours complet
(sidebar → dossiers/sous-dossiers, clic dans la vue, breadcrumb
interne, crumb workspace du header) avec vérification du chemin header
et absence de composants peints à l'état brut.
## v7.69.8 (2026-10-09) — Library : ordre des colonnes visited/source
### Fixed
- **Combinaison « Last visited time » + Source illisible** — les cellules
de données rendaient Source avant Edited/Visited alors que l'en-tête
l'attend en dernier : les valeurs tombaient sous les mauvais intitulés.
L'ordre des cellules suit désormais l'en-tête (Name, Created by, Last
edited by, Last edited time, Last visited time, Source), et les intitulés
d'en-tête tronquent en ellipsis au lieu de déborder sur la colonne
suivante (reproduit et mesuré au navigateur : alignement header/lignes
vérifié colonne par colonne).
### Fixed
- **Sidebar Favorites : icônes Workspace** — la liste utilisait des emoji
bruts (voire rien) via `item.icon` ; `_build_item` renvoie désormais les
noms SVG (`folder`/`file`/`edit`/`image`), idem pour les favoris board.
- **/local-workspace : indicateurs de statut** — ★ favori (ambre), 👥
partagé (existant), 🌐 publié ; exposés par `_build_tree_children`
(`favorited`, `published`, `is_shared`) et rendus dans l'arbre Alpine
comme dans le rendu JS des enfants.
- **Library « Created by » vide** — aucune source auteur n'était
sélectionnée. Nouvelle provenance groupée : created by (première
version, sinon propriétaire du workspace), last edited by (dernière
version), last visited (table `recents`, tracée à chaque lecture de
page). Nouvelles colonnes **Last edited by**, **Last edited time**,
**Last visited time** ; le menu **Show columns** pilote chaque colonne,
seul Page name est verrouillé.
- **Colonne Source avec icône** — `file` (local), `link` (Gitea),
`external-link` (GitHub), mêmes SVG que le reste de Flowdeck.
- **Show columns réellement fonctionnel** — les règles de visibilité
(spécificité 0,1,0) perdaient contre `.lib-table-header .th` et
`.lib-row .row-cell` (0,2,0) : seule Last edited time s'affichait et
masquait, les autres options semblaient mortes (reproduit et corrigé
avec vérification en direct : les 5 toggles on/off + colonne Source
avec icône + libellé, 0 erreur console).
### Tests
- `tests/test_v696_sidebar_library_publish.py` (+3) : provenance et visite
tracée, icônes favoris, flags de l'arbre local-workspace.
## v7.69.6 (2026-10-09) — Library AI Meeting Notes, Recents réels, Publish unifié
### Added
- **Onglet Library « AI Meeting Notes »** (`GET /api/library/meetings`) :
notes de réunion de l'utilisateur regroupées par date — Today,
Yesterday, This week, Last week, This month, Older — avec icône
calendrier, statut (Summary ready / Ready to record) en colonne Source,
recherche et sélection réutilisées. Les notes sont exclues des onglets
Recents / Workspace / Private (ainsi que de l'arbre Workspace et du
navigateur local).
### Fixed
- **Sidebar Recents vide** — elle ne listait que les dépôts Gitea. Elle
liste désormais les fichiers réellement récents (`updated_at`, 8
derniers, dépôts conservés ensuite), avec les mêmes icônes SVG que le
Workspace et les notes de réunion exclues (→ Meetings).
- **Customize sidebar inutilisable** — l'overlay plein écran (z-index 998)
recouvrait aussi le panneau d'options : chaque clic refermait le mode.
Le panneau passe au-dessus (z-index 999).
- **Publish qui ne « tenait » pas** — le share dialog écrivait `published`,
les routes `/publish` écrivaient `is_published`, et chaque lecteur ne
regardait qu'une colonne. Toutes les écritures maintiennent désormais
les deux drapeaux (+ slug garanti), tous les lecteurs acceptent l'un ou
l'autre : la page publiée reste publiée dans le dialogue, apparaît dans
la section Published de la sidebar et dans l'onglet Published de la
Library.
### Tests
- `tests/test_v696_sidebar_library_publish.py` (6) : onglet meetings et
exclusions, Recents sidebar, publish/unpublish des deux chemins,
visibilité sidebar+library+dialogue, z-index du panneau customize.
## v7.69.5 (2026-10-09) — Meeting Notes : setup visible, retry qui ne perd plus rien
### Fixed
- **Pas de « Setup check » visible avant l'enregistrement** — il était caché
dans le menu ▾ du bouton Start, que personne n'ouvre. Le panneau idle
affiche désormais une bande de vérification : état de la permission micro
(via Permissions API), transcription live dispo ou repli manuel, mode
onglet supporté ou non, et bouton **Test microphone** (4 s de niveau réel,
qui fait aussi accorder l'autorisation avant le Start).
- **Erreur 400 persistante au Stop/Retry après un collage de transcript** —
`retry()`/`regenerate()` appelaient le serveur sans y verser d'abord le
contenu local (segments + manuel collé) : le serveur restait vide et
répondait 400 en boucle. Ils drainent désormais le tampon local (attente
bornée) avant tout appel, et `retry()` détecte une session encore en vie
côté serveur pour terminer par `/stop` plutôt que `/processing:retry`.
- **Stop appelé alors que l'upload des segments échoue** — condamnait à un
400 (« transcript is empty ») malgré des segments en local. Le client
n'appelle plus `/stop` dans ce cas : état `failed` avec message « envoi
impossible, Retry », session serveur conservée.
- **`/summarize` accepte `allow_empty`** (diagnostic `fragmentary` honnête
au lieu de 400), comme `/stop` et `/processing:retry`.
- **Cache-busting** : le bump 7.69.4 → 7.69.5 change `?v=` de tous les
assets — les navigateurs ayant gardé l'ancien `meeting_block.js` (sans
garde-fou ni diagnostic) reçoivent le nouveau code. C'était la cause la
plus probable du « toujours l'erreur 400 ».
- **Menu contextuel des sections Meetings et Workspace** : les notes de la
section Meetings ont désormais le même clic droit que le Workspace
(Open / Rename / Delete, via `showWsContext`) ; l'action **Open** est
ajoutée au menu des deux sections (page → `/pages/{id}`, dossier →
navigation dossier) ; rename/delete rafraîchissent la section Meetings.
- **Sidebar sur /local-workspace** : la règle CSS globale `.ws-tree-item`
de la page écrasait les items de la sidebar (espacements différents) —
scopée à `.ws-tree` (arbre principal) ; et `refreshSidebarTree()`
remonte désormais le fragment via `Alpine.initTree`, sans quoi l'arbre
perdait menu contextuel, toggles et drag&drop après chaque refresh
(d'où le menu « mort » sur cette page qui rafraîchit en continu).
### Tests
- `tests/test_v711_meeting_notion.py` (+5) : `summarize` vide → 400 sans
flag / diagnostic avec flag, retry intelligent quand la session serveur
est encore live, `meeting_notes` + propriété, exclusion de l'arbre
Workspace.
### Fixed