fix: /local-workspace — chemin du header + clic sur un dossier du sidebar (v7.69.9)
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:
+167
-1
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user