fix: colonnes rendues, tables IA sans pipe de tête, copier/couper/coller multi-blocs (v7.68.0)
Colonnes / équation / TOC - renderBlock() n'appelait JAMAIS renderColumnsBlock()/renderMathBlock()/renderTOC() (3 renderers morts) → un bloc colonnes (slash « Column list », Turn into 2/3/4/5 colonnes) tombait dans le rendu générique = paragraphe vide. Dispatch ajouté ; la × de suppression de colonne (opacity:0 sans survol) devient visible au survol. Tables rendues par l'IA - _tblIsData/_tblIsSep exigeaient un | de tête → le GFM sans pipe (A | B / --- | ---) devenait des paragraphes. Pipe de tête optionnel, séparateur gardé à ≥2 cellules (« texte » + « --- » reste un séparateur). md2b et paste2b partagent les helpers. Copier / couper / coller - Sélection de texte MULTI-BLOCS : _clipState()/_clipMarkdown() (début partiel → blocs entiers via blocksToMarkdown → fin partielle), clipCopy()/clipCut() (coupure = tête du 1er bloc + queue du dernier), listeners copy/cut (Ctrl+C/X via les événements natifs), groupe Clipboard (Cut/Copy/Paste) dans le menu du clic droit avec la sélection figée à l'ouverture (la recherche prend le focus), clic droit sur un bloc sélectionné = sélection multi-blocs conservée. - Coller un seul bloc structuré (table/code/titre) = vraie insertion (avant : texte brut) ; pasteBlocks colle après le dernier bloc sans focus. - « Copy link to block » réparé (data-bm-act link → copy-link). Tests: pytest tests/ -q -n auto → 1394 passed / 0 failed ; ruff OK ; e2e v768_columns_clipboard (4 : slash+Turn into colonnes, table IA sans pipe, copier/couper/coller, clic droit Clipboard) + v762/v764/v766/v7641/v763/ regression_editor_mount → verts sur :8081 (image flowdeck:v7.68.0).
This commit is contained in:
@@ -1,5 +1,60 @@
|
||||
# Changelog - FlowDeck
|
||||
|
||||
## v7.68.0 (2026-10-08) — Colonnes rendues, tables IA, copier/couper/coller multi-blocs
|
||||
|
||||
### Fixed
|
||||
|
||||
- **Colonnes / équation / TOC n'étaient JAMAIS rendus** : `renderBlock()`
|
||||
n'appelait pas `renderColumnsBlock()` / `renderMathBlock()` / `renderTOC()`
|
||||
(3 renderers morts depuis l'extraction v7.22) → un bloc colonnes — créé par
|
||||
le slash « Column list », par **Turn into → 2/3/4/5 colonnes** — tombait dans
|
||||
le rendu générique : un paragraphe vide. Dispatch ajouté.
|
||||
- la **× de suppression de colonne** était en `opacity:0` **sans règle de
|
||||
survol** (invisible mais cliquable) → visible au survol du bloc colonne.
|
||||
- **Tables rendues par l'IA** : `_tblIsData`/`_tblIsSep` exigeaient un `|` de
|
||||
tête → le GFM sans pipe (`A | B` / `--- | ---`, ce que produit souvent le
|
||||
modèle) devenait des paragraphes. Le pipe de tête est **optionnel** en GFM ;
|
||||
garde conservée : une ligne de séparation doit faire ≥2 cellules (un « texte »
|
||||
suivi d'un « --- » reste un séparateur de section). `md2b` et `paste2b`
|
||||
partagent les helpers → alignés d'office.
|
||||
- **Coller un SEUL bloc structuré** (table, code, titre) retombait en texte
|
||||
brut (`if(parsed.length<=1) return fallback()`) → seul un bloc paragraphe
|
||||
(une ligne) garde le comportement inline.
|
||||
- **« Copy link to block »** du menu de bloc : `data-bm-act="link"` alors que
|
||||
le handler attend `'copy-link'` → l'action ne faisait rien.
|
||||
|
||||
### Added
|
||||
|
||||
- **Copier / couper une sélection de texte MULTI-BLOCS** :
|
||||
- `_clipState()` (sélection vivante traversant ≥2 blocs) + `_clipMarkdown()`
|
||||
(début partiel → blocs entiers sérialisés par `blocksToMarkdown` → fin
|
||||
partielle) ; `clipCopy()` / `clipCut()` (la coupure garde la tête du 1ᵉʳ
|
||||
bloc et la queue du dernier, le milieu part) ;
|
||||
- listeners **`copy` / `cut`** sur `#_blocksCt` : Ctrl+C / Ctrl+X passent par
|
||||
les événements natifs du navigateur ; dans un seul bloc, on laisse le
|
||||
navigateur faire (copie native) ;
|
||||
- groupe **Clipboard** (`Cut Ctrl+X` / `Copy Ctrl+C` / `Paste Ctrl+V`) en
|
||||
tête du menu du clic droit, avec la sélection **figée à l'ouverture** du
|
||||
menu (la recherche prend le focus et détruit la sélection) ;
|
||||
- clic droit **sur un bloc sélectionné** → la sélection multi-blocs (handle +
|
||||
Maj-clic) est conservée et le Clipboard agit dessus (`copySelectedBlocks`) ;
|
||||
- `pasteBlocks()` colle après le dernier bloc quand aucun bloc n'est focalisé.
|
||||
|
||||
### Tests
|
||||
|
||||
- `tests/test_v768_columns_clipboard.py` (4).
|
||||
- **e2e** `e2e/v768_columns_clipboard.spec.js` (4) : slash « Column list » +
|
||||
« Add column » + **Turn into → 2 colonnes** (bloc `.block-column` réellement
|
||||
rendu), table IA **sans pipe de tête** (vrai `.ftable-editor` + garde
|
||||
« texte »/« --- »), copier→`readText` → couper (blocs réduits à la tête +
|
||||
queue) → coller (blocs revenus), clic droit → groupe Clipboard → Copy.
|
||||
- le raccourci clavier n'est pas déclenché en headless Chromium (pas de
|
||||
presse-papier OS) : le test passe par `document.execCommand('copy'/'cut')`,
|
||||
qui émet les **mêmes** événements que Ctrl+C/X.
|
||||
- `pytest tests/ -q -n auto` → **1394 passed, 0 failed**, `ruff check app tests`
|
||||
→ OK.
|
||||
|
||||
|
||||
## v7.67.0 (2026-10-08) — Réactions dans le tiroir Comments (+ suppression) et refonte du menu de sélection
|
||||
|
||||
### Added
|
||||
|
||||
Reference in New Issue
Block a user