From 7be04cd148e5a08d5bdbed8875892ff099979d82 Mon Sep 17 00:00:00 2001 From: Jona Date: Sat, 17 Oct 2026 01:23:33 -0400 Subject: [PATCH 01/10] Add first-row header toggle to cell context menu --- README.md | 2 +- media/main.js | 12 +- src/CsvEditorProvider.ts | 16 ++- src/test/header-context-menu.test.ts | 175 +++++++++++++++++++++++++++ 4 files changed, 199 insertions(+), 6 deletions(-) create mode 100644 src/test/header-context-menu.test.ts diff --git a/README.md b/README.md index 93cf1ab..f9e9e7a 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Working with CSV files shouldn’t be a chore. With CSV, you get: - **Interactive Editing:** Two modes — type to start a quick edit, or press Enter/double‑click for detail edit. Changes commit to the document when focus leaves the cell or CSV view; unsaved changes remain visible when you switch tabs. - **Smart Resizing:** Automatic calculation of column widths for improved readability. - **Dynamic Color Coding:** Visual cues based on data type help you quickly identify numbers, dates, booleans, and more (with opt‑in cool palette and theme-foreground mode settings). -- **Sticky Headers:** Keep column titles in view as you scroll through large datasets. +- **Sticky Headers:** Keep column titles in view as you scroll through large datasets. Right-click any cell and choose **Use first row as header** or **Treat first row as data** to toggle the header for that file. With leading metadata rows hidden, this applies to the first visible row; the CSV contents stay unchanged. - **Enhanced Keyboard Navigation:** Navigate cells with arrows and Tab/Shift+Tab; quick edits can commit with arrow keys; `Ctrl/Cmd + A` selects all; `Ctrl/Cmd + C` copies selection. - **Advanced Multi-Cell Selection:** Easily select and copy blocks of data, then paste them elsewhere as properly formatted CSV. - **Add/Delete Columns:** Right-click any cell to add a column left or right, or remove the selected column. diff --git a/media/main.js b/media/main.js index 8b4678a..e6918be 100644 --- a/media/main.js +++ b/media/main.js @@ -178,14 +178,14 @@ const restoreState = () => { } } if (typeof st.anchorRow === 'number' && typeof st.anchorCol === 'number') { - const tag = (hasHeader && st.anchorRow === 0 ? 'th' : 'td'); - let sel = table.querySelector(`${tag}[data-row="${st.anchorRow}"][data-col="${st.anchorCol}"]`); + const selector = `td[data-row="${st.anchorRow}"][data-col="${st.anchorCol}"], th[data-row="${st.anchorRow}"][data-col="${st.anchorCol}"]`; + let sel = table.querySelector(selector); // If not present yet (due to chunking), load chunks until available or exhausted if (!sel && typeof window.__csvLoadNextChunk === 'function') { let guard = 100; // prevent infinite loops while (!sel && typeof window.__csvLoadNextChunk === 'function' && guard-- > 0) { if (!window.__csvLoadNextChunk()) break; - sel = table.querySelector(`${tag}[data-row="${st.anchorRow}"][data-col="${st.anchorCol}"]`); + sel = table.querySelector(selector); } } applySizeStateToRenderedCells(); @@ -367,6 +367,7 @@ const handleZoomWheel = e => { window.addEventListener('wheel', handleZoomWheel, { passive: false }); const hasHeader = document.querySelector('thead') !== null; +const headerEnabled = root?.dataset?.headerenabled === '1'; const getCellCoords = cell => ({ row: parseInt(cell.getAttribute('data-row')), col: parseInt(cell.getAttribute('data-col')) }); const clearSelection = () => { currentSelection.forEach(c => c.classList.remove('selected')); currentSelection = []; }; const contextMenu = document.getElementById('contextMenu'); @@ -386,6 +387,11 @@ const showContextMenu = (x, y, row, col) => { d.style.margin = '1px 0'; contextMenu.appendChild(d); }; + item(headerEnabled ? 'Treat first row as data' : 'Use first row as header', () => { + persistState(); + vscode.postMessage({ type: 'setHeader', enabled: !headerEnabled }); + }); + divider(); item('Cut', () => copySelectionToClipboard(true)); item('Copy', () => copySelectionToClipboard()); item('Paste', () => pasteFromClipboard()); diff --git a/src/CsvEditorProvider.ts b/src/CsvEditorProvider.ts index 6e0aab0..0a5ec38 100644 --- a/src/CsvEditorProvider.ts +++ b/src/CsvEditorProvider.ts @@ -148,6 +148,16 @@ class CsvEditorController { case 'save': await this.handleSave(); break; + case 'setHeader': { + if (typeof e.enabled === 'boolean') { + const uri = this.document.uri; + await CsvEditorProvider.setHeaderForUri(this.context, uri, e.enabled); + CsvEditorProvider.editors + .filter(editor => editor.getDocumentUri().toString() === uri.toString()) + .forEach(editor => editor.refresh()); + } + break; + } case 'copyCells': await this.copyCells(e.matrix, e.startRow, e.startCol, e.cut === true); break; @@ -1451,6 +1461,7 @@ class CsvEditorController { extraColumnColorCss: colorCss, nextChunkStart, hasRemoteChunks, + headerEnabled: treatHeader, mouseWheelZoomEnabled, mouseWheelZoomInvert }); @@ -1703,10 +1714,11 @@ class CsvEditorController { extraColumnColorCss: string; nextChunkStart: number; hasRemoteChunks: boolean; + headerEnabled: boolean; mouseWheelZoomEnabled: boolean; mouseWheelZoomInvert: boolean; }): string { - const { webview, nonce, fontFamily, fontSize, cellPadding, separator, tableHtml, chunksJson, extraColumnColorCss, nextChunkStart, hasRemoteChunks, mouseWheelZoomEnabled, mouseWheelZoomInvert } = args; + const { webview, nonce, fontFamily, fontSize, cellPadding, separator, tableHtml, chunksJson, extraColumnColorCss, nextChunkStart, hasRemoteChunks, headerEnabled, mouseWheelZoomEnabled, mouseWheelZoomInvert } = args; const isDark = vscode.window.activeColorTheme.kind === vscode.ColorThemeKind.Dark; // Build script URI using file path for compatibility (older APIs may lack Uri.joinPath) const scriptUri = webview.asWebviewUri( @@ -1918,7 +1930,7 @@ class CsvEditorController { -
+
${tableHtml}
diff --git a/src/test/header-context-menu.test.ts b/src/test/header-context-menu.test.ts new file mode 100644 index 0000000..ec87975 --- /dev/null +++ b/src/test/header-context-menu.test.ts @@ -0,0 +1,175 @@ +import assert from 'assert'; +import { describe, it } from 'node:test'; +import { createEditorHarness, createWebviewDom } from './edit-integrity-harness'; +const { CsvEditorProvider } = require('../CsvEditorProvider') as typeof import('../CsvEditorProvider'); + +type Host = Awaited>; +type View = ReturnType; +const rows = [['Name', 'Value'], ['one', 'two'], ['three', 'four']]; +const settle = () => new Promise(resolve => setTimeout(resolve, 20)); + +function openMenu(view: View, row: number, column: number) { + const target = view.cell(row, column); + assert.ok(target); + target.dispatchEvent(new view.window.MouseEvent('mousedown', { button: 2, bubbles: true, cancelable: true })); + target.dispatchEvent(new view.window.MouseEvent('contextmenu', { bubbles: true, cancelable: true })); + return Array.from(view.window.document.querySelectorAll('#contextMenu div')) as any[]; +} + +function chooseHeader(view: View, row: number, column: number, enabled: boolean) { + const label = enabled ? 'Use first row as header' : 'Treat first row as data'; + const item = openMenu(view, row, column).find(element => element.textContent === label); + assert.ok(item, label); + item.click(); + const message = view.messages.slice().reverse().find((item: any) => item.type === 'setHeader'); + assert.strictEqual(message.enabled, enabled); + return message; +} + +async function finishRefresh(host: Host, view: View, start = 0) { + const prepare = host.messages.slice(start).reverse().find((message: any) => message.type === 'prepareViewRefresh'); + if (prepare) { + const begin = view.messages.length; + view.window.dispatchEvent(new view.window.MessageEvent('message', { data: prepare })); + for (const message of view.messages.slice(begin)) { await host.receive(message); } + } + await settle(); +} + +async function applyHeader(host: Host, view: View, message: unknown) { + const start = host.messages.length; + await host.receive(message); + await finishRefresh(host, view, start); +} + +describe('File header context action', () => { + for (const separator of [',', '\t']) { + for (const header of [false, true]) { + it(`toggles the file header from either column (${JSON.stringify(separator)}, header ${header})`, async () => { + for (const column of [0, 1]) { + const host = await createEditorHarness({ rows, separator, header }); + const view = createWebviewDom(host.panel.webview.html); + const source = host.document.getText(); + const version = host.document.version; + try { + await applyHeader(host, view, chooseHeader(view, 1, column, !header)); + const next = createWebviewDom(host.panel.webview.html); + try { + assert.strictEqual(!!next.window.document.querySelector('thead'), !header); + const reverse = header ? 'Use first row as header' : 'Treat first row as data'; + assert.ok(openMenu(next, 1, column).some(item => item.textContent === reverse)); + } finally { next.close(); } + assert.strictEqual(host.document.getText(), source); + assert.strictEqual(host.document.version, version); + } finally { view.close(); } + } + }); + } + } + + it('uses the effective detected state rather than the stored fallback', async () => { + const host = await createEditorHarness({ rows, header: true }); + const initial = createWebviewDom(host.panel.webview.html); + const controller = CsvEditorProvider.getActiveProvider()!; + const context = (controller as any).context; + try { + await context.workspaceState.update(CsvEditorProvider.headerKey, {}); + controller.refresh(); + await finishRefresh(host, initial); + const view = createWebviewDom(host.panel.webview.html); + try { + assert.strictEqual(view.window.document.querySelector('thead'), null); + await applyHeader(host, view, chooseHeader(view, 1, 1, true)); + assert.strictEqual(CsvEditorProvider.getHeaderForUri(context, host.document.uri as any), true); + assert.strictEqual(CsvEditorProvider.hasHeaderOverride(context, host.document.uri as any), true); + const next = createWebviewDom(host.panel.webview.html); + try { assert.ok(next.window.document.querySelector('thead')); } finally { next.close(); } + } finally { view.close(); } + } finally { initial.close(); } + }); + + it('targets the owning file even when another CSV editor becomes active', async () => { + const host = await createEditorHarness({ rows, header: true }); + const view = createWebviewDom(host.panel.webview.html); + const other = await createEditorHarness({ rows, separator: '\t', header: true }); + try { + await applyHeader(host, view, chooseHeader(view, 1, 1, false)); + const next = createWebviewDom(host.panel.webview.html); + const untouched = createWebviewDom(other.panel.webview.html); + try { + assert.strictEqual(next.window.document.querySelector('thead'), null); + assert.ok(untouched.window.document.querySelector('thead')); + } finally { next.close(); untouched.close(); } + } finally { view.close(); } + }); + + it('rejects non-boolean header messages without changing the setting or view', async () => { + const host = await createEditorHarness({ rows, header: true }); + const html = host.panel.webview.html; + for (const enabled of [undefined, null, 'false', 0, 1, {}]) { + await host.receive({ type: 'setHeader', enabled }); + } + await settle(); + assert.strictEqual(host.panel.webview.html, html); + assert.deepStrictEqual(host.rows(), rows); + }); + + it('persists the clicked anchor and scroll, including a header after hidden metadata', async () => { + const host = await createEditorHarness({ rows: [['metadata', ''], ...rows], header: false }); + const initial = createWebviewDom(host.panel.webview.html); + const controller = CsvEditorProvider.getActiveProvider()!; + const context = (controller as any).context; + try { + await CsvEditorProvider.setHiddenRowsForUri(context, host.document.uri as any, 1); + controller.refresh(); + await finishRefresh(host, initial); + const view = createWebviewDom(host.panel.webview.html); + try { + const container = view.window.document.querySelector('.table-container'); + container.scrollLeft = 40; + container.scrollTop = 120; + await applyHeader(host, view, chooseHeader(view, 1, 1, true)); + const saved = view.window.acquireVsCodeApi().getState(); + assert.strictEqual(saved.anchorRow, 1); + assert.strictEqual(saved.anchorCol, 1); + assert.strictEqual(saved.scrollX, 40); + assert.strictEqual(saved.scrollY, 120); + const next = createWebviewDom(host.panel.webview.html); + try { + next.window.acquireVsCodeApi().setState(saved); + next.window.dispatchEvent(new next.window.Event('focus')); + await settle(); + assert.strictEqual(next.cell(1, 1).tagName, 'TH'); + assert.ok(next.cell(1, 1).classList.contains('selected')); + assert.strictEqual(next.window.document.querySelector('.table-container').scrollTop, 120); + assert.strictEqual(next.cell(0, 0), null); + } finally { next.close(); } + assert.deepStrictEqual(host.rows(), [['metadata', ''], ...rows]); + } finally { view.close(); } + } finally { initial.close(); } + }); + + it('can switch off an empty file header preference even without a rendered header', async () => { + const host = await createEditorHarness({ rows: [], header: true }); + const view = createWebviewDom(host.panel.webview.html); + try { + assert.strictEqual(view.window.document.querySelector('thead'), null); + await applyHeader(host, view, chooseHeader(view, 0, 0, false)); + const next = createWebviewDom(host.panel.webview.html); + try { + assert.ok(openMenu(next, 0, 0).some(item => item.textContent === 'Use first row as header')); + } finally { next.close(); } + assert.strictEqual(host.document.getText(), ''); + } finally { view.close(); } + }); + + it('offers the same action on header, body, serial-index and append cells', async () => { + const host = await createEditorHarness({ rows, header: true }); + const view = createWebviewDom(host.panel.webview.html); + try { + for (const [row, column] of [[0, 1], [1, 0], [1, -1], [3, 1]]) { + assert.ok(openMenu(view, row, column).some(item => item.textContent === 'Treat first row as data')); + } + } finally { view.close(); } + }); +}); From 2854f635ea973aa3ccc1261166bb8a5fb553cbd4 Mon Sep 17 00:00:00 2001 From: Jona Date: Sat, 17 Oct 2026 01:26:42 -0400 Subject: [PATCH 02/10] Add visual evidence for header context actions --- images/header-menu-off.jpg | Bin 0 -> 16177 bytes images/header-menu-on.jpg | Bin 0 -> 16108 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/header-menu-off.jpg create mode 100644 images/header-menu-on.jpg diff --git a/images/header-menu-off.jpg b/images/header-menu-off.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90339a52c4347ae4a41e3dc40c98b8ca957cdf09 GIT binary patch literal 16177 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 Be31YE literal 0 HcmV?d00001 diff --git a/images/header-menu-on.jpg b/images/header-menu-on.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14db680bf507798cf5f791868f0b53c27bcaac0e GIT binary patch literal 16108 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 z zn4%AqABQx08{(e3noCNB@WmYm^!jE$q(B_5WVwozR+vXG`F_}g<<~P6{2a~r0(CGc zfMrn09v(iy?GOKM$Nw7xvjkm-_h{3{=*Y?C_6S#KtF*%ygar!pbWw${2Wz@3rM?l^ z^@9jBsjCQb^3PtAV8;}p+iR<;HIgY?ubP>TO~YyQ42t0d=7Cp~ohP z&JOJla$B-ekPEMCjIq8!dhEgfoQ$5jwjd+Zn!&5XoOivzzyJY+n?ENl{q{_tXF1iu zL8@4AlB{l4m2VLDAUh1Uj$o)#wQB&bR1lI%cMCSYXk$1ye=Dj8L21e+OjGk%C1;AUs?d8NC%it@YdEDYT-L4mt&Ck2 z>E#B2!u5@JANt8S^hr$$Yw6u3N^D5bDk>3zY;d(sxSDuSHLCfUkez->WChUp{u7H1 zVg_G0VOGu$-@AQ$hGJU8GJkTZcsaKJMpR|HU^)b(eal=nwsKcwn%mjVNZ%)uC$Ny7 z+dT~5QM@@lb{rW^^=s@(k=;3W)s#6UhGMR|NX*R;p}i|PD_e)+HNS(13Sub*iJ?Gc z$$H6aW#(MMDQ10OD2%L^9aL>*QOo(LUwa87v8L=JiK^ga4Veoe9<~tN#R9P!wQG|K z4nCsJR`D{`(gxv%%MUQ~WZj(oXlj}MH2dX6X!a|T5snrW(g!s(uMgsA60t2Fvdf6! ze1u|Y75-yD;(=&T=a%yTB_yZHrqc!;x$$A&F?eb^zGlb9hUr>7m?wr=whKq_q) zW*ZyEHOOsc{A$n8lD$MXhA9b#SLmSN-<@4bl6@SzD?xY6d}SDIHI>=!Qm#5$!baDi z2APkw@(>=xl;JbE2PWXg*oa&Ra~26%=YlvE(-;EZs@==U%ekgcK3_SlDdbNc^4;d zW^#LfC4G^wP^DROa?4Hbpj)eme$SJA%l)mC-qL`GwX-_%rQC7;yF8Oh^ukPSM}5=3 z-HZ4sp}_UPqoP}M1&)v&@IiQg0Diw{>AIJeU|DLmc8|Bq8sA#UcT0N_eHFrOo8TeD z=wSuBQwVlJxO<6p(JiBGMkY5!T!&Njwe{?QE7VTHu2KN}FZVW?F1;7XvyfZpyd%|A z*%2)(VoKY@=dcNybWbmj1y1K@4LR2B<)tdbtsep6Ff`?lZ%=MkVo!#2ZfR(#YDmD! zy3Gu;L&d~j_dthfE3(iRf*U;rQ*~h5Z$Yk6vq@oL`=PytyC(PCr>J?IG*4l#Prv_F zu!SacQCd5TVOe~w=sKtat8R#{2x9cKgp!%{U+?Z``uf3dhYw_shx3S0?JZB|whX|k zW=sQk@|IruU%ATnSOKdU>zWj{xyo_hVUE(1CD`MMm>&3R%x+Mo_FwdIt&a6C1kM(! s{*^sZmhb92fqd3F`(G0}7k847yQui*RoQ;G5#e-Z#(I2!u@0L_X`egFUf literal 0 HcmV?d00001 From 60e49fea2f5e364851f374ce353e769f5ca85399 Mon Sep 17 00:00:00 2001 From: Jona Date: Sat, 17 Oct 2026 01:30:31 -0400 Subject: [PATCH 03/10] Restrict header context action to the first row --- README.md | 2 +- images/header-menu-later.jpg | Bin 0 -> 13846 bytes images/header-menu-off.jpg | Bin 16177 -> 16348 bytes images/header-menu-on.jpg | Bin 16108 -> 17262 bytes media/main.js | 12 ++++--- src/CsvEditorProvider.ts | 6 ++-- src/test/header-context-menu.test.ts | 48 +++++++++++++++++++++------ 7 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 images/header-menu-later.jpg diff --git a/README.md b/README.md index f9e9e7a..30c0813 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Working with CSV files shouldn’t be a chore. With CSV, you get: - **Interactive Editing:** Two modes — type to start a quick edit, or press Enter/double‑click for detail edit. Changes commit to the document when focus leaves the cell or CSV view; unsaved changes remain visible when you switch tabs. - **Smart Resizing:** Automatic calculation of column widths for improved readability. - **Dynamic Color Coding:** Visual cues based on data type help you quickly identify numbers, dates, booleans, and more (with opt‑in cool palette and theme-foreground mode settings). -- **Sticky Headers:** Keep column titles in view as you scroll through large datasets. Right-click any cell and choose **Use first row as header** or **Treat first row as data** to toggle the header for that file. With leading metadata rows hidden, this applies to the first visible row; the CSV contents stay unchanged. +- **Sticky Headers:** Keep column titles in view as you scroll through large datasets. Right-click a cell in the first visible row and choose **Use first row as header** or **Treat first row as data** to toggle the header for that file. With leading metadata rows hidden, this applies to the first visible row; the CSV contents stay unchanged. - **Enhanced Keyboard Navigation:** Navigate cells with arrows and Tab/Shift+Tab; quick edits can commit with arrow keys; `Ctrl/Cmd + A` selects all; `Ctrl/Cmd + C` copies selection. - **Advanced Multi-Cell Selection:** Easily select and copy blocks of data, then paste them elsewhere as properly formatted CSV. - **Add/Delete Columns:** Right-click any cell to add a column left or right, or remove the selected column. diff --git a/images/header-menu-later.jpg b/images/header-menu-later.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4990f498aa3c3b86ce7809b6a82cedb87b1e0f5 GIT binary patch literal 13846 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 literal 0 HcmV?d00001 diff --git a/images/header-menu-off.jpg b/images/header-menu-off.jpg index 90339a52c4347ae4a41e3dc40c98b8ca957cdf09..b9b28909f0dbf2cecec7a1cc7f8cb684ed4c8880 100644 GIT binary patch literal 16348 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 sf~-&&+<${s`bF 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 Be31YE diff --git a/images/header-menu-on.jpg b/images/header-menu-on.jpg index 14db680bf507798cf5f791868f0b53c27bcaac0e..c0ffdf4876cb1924d1146cd6f713a46958fd0557 100644 GIT binary patch literal 17262 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 z zn4%AqABQx08{(e3noCNB@WmYm^!jE$q(B_5WVwozR+vXG`F_}g<<~P6{2a~r0(CGc zfMrn09v(iy?GOKM$Nw7xvjkm-_h{3{=*Y?C_6S#KtF*%ygar!pbWw${2Wz@3rM?l^ z^@9jBsjCQb^3PtAV8;}p+iR<;HIgY?ubP>TO~YyQ42t0d=7Cp~ohP z&JOJla$B-ekPEMCjIq8!dhEgfoQ$5jwjd+Zn!&5XoOivzzyJY+n?ENl{q{_tXF1iu zL8@4AlB{l4m2VLDAUh1Uj$o)#wQB&bR1lI%cMCSYXk$1ye=Dj8L21e+OjGk%C1;AUs?d8NC%it@YdEDYT-L4mt&Ck2 z>E#B2!u5@JANt8S^hr$$Yw6u3N^D5bDk>3zY;d(sxSDuSHLCfUkez->WChUp{u7H1 zVg_G0VOGu$-@AQ$hGJU8GJkTZcsaKJMpR|HU^)b(eal=nwsKcwn%mjVNZ%)uC$Ny7 z+dT~5QM@@lb{rW^^=s@(k=;3W)s#6UhGMR|NX*R;p}i|PD_e)+HNS(13Sub*iJ?Gc z$$H6aW#(MMDQ10OD2%L^9aL>*QOo(LUwa87v8L=JiK^ga4Veoe9<~tN#R9P!wQG|K z4nCsJR`D{`(gxv%%MUQ~WZj(oXlj}MH2dX6X!a|T5snrW(g!s(uMgsA60t2Fvdf6! ze1u|Y75-yD;(=&T=a%yTB_yZHrqc!;x$$A&F?eb^zGlb9hUr>7m?wr=whKq_q) zW*ZyEHOOsc{A$n8lD$MXhA9b#SLmSN-<@4bl6@SzD?xY6d}SDIHI>=!Qm#5$!baDi z2APkw@(>=xl;JbE2PWXg*oa&Ra~26%=YlvE(-;EZs@==U%ekgcK3_SlDdbNc^4;d zW^#LfC4G^wP^DROa?4Hbpj)eme$SJA%l)mC-qL`GwX-_%rQC7;yF8Oh^ukPSM}5=3 z-HZ4sp}_UPqoP}M1&)v&@IiQg0Diw{>AIJeU|DLmc8|Bq8sA#UcT0N_eHFrOo8TeD z=wSuBQwVlJxO<6p(JiBGMkY5!T!&Njwe{?QE7VTHu2KN}FZVW?F1;7XvyfZpyd%|A z*%2)(VoKY@=dcNybWbmj1y1K@4LR2B<)tdbtsep6Ff`?lZ%=MkVo!#2ZfR(#YDmD! zy3Gu;L&d~j_dthfE3(iRf*U;rQ*~h5Z$Yk6vq@oL`=PytyC(PCr>J?IG*4l#Prv_F zu!SacQCd5TVOe~w=sKtat8R#{2x9cKgp!%{U+?Z``uf3dhYw_shx3S0?JZB|whX|k zW=sQk@|IruU%ATnSOKdU>zWj{xyo_hVUE(1CD`MMm>&3R%x+Mo_FwdIt&a6C1kM(! s{*^sZmhb92fqd3F`(G0}7k847yQui*RoQ;G5#e-Z#(I2!u@0L_X`egFUf diff --git a/media/main.js b/media/main.js index e6918be..58eaa5a 100644 --- a/media/main.js +++ b/media/main.js @@ -387,11 +387,13 @@ const showContextMenu = (x, y, row, col) => { d.style.margin = '1px 0'; contextMenu.appendChild(d); }; - item(headerEnabled ? 'Treat first row as data' : 'Use first row as header', () => { - persistState(); - vscode.postMessage({ type: 'setHeader', enabled: !headerEnabled }); - }); - divider(); + if (row === Number(root?.dataset?.firstrow)) { + item(headerEnabled ? 'Treat first row as data' : 'Use first row as header', () => { + persistState(); + vscode.postMessage({ type: 'setHeader', enabled: !headerEnabled }); + }); + divider(); + } item('Cut', () => copySelectionToClipboard(true)); item('Copy', () => copySelectionToClipboard()); item('Paste', () => pasteFromClipboard()); diff --git a/src/CsvEditorProvider.ts b/src/CsvEditorProvider.ts index 0a5ec38..0733c01 100644 --- a/src/CsvEditorProvider.ts +++ b/src/CsvEditorProvider.ts @@ -1462,6 +1462,7 @@ class CsvEditorController { nextChunkStart, hasRemoteChunks, headerEnabled: treatHeader, + firstVisibleRow: Math.min(Math.max(0, hiddenRows), data.length), mouseWheelZoomEnabled, mouseWheelZoomInvert }); @@ -1715,10 +1716,11 @@ class CsvEditorController { nextChunkStart: number; hasRemoteChunks: boolean; headerEnabled: boolean; + firstVisibleRow: number; mouseWheelZoomEnabled: boolean; mouseWheelZoomInvert: boolean; }): string { - const { webview, nonce, fontFamily, fontSize, cellPadding, separator, tableHtml, chunksJson, extraColumnColorCss, nextChunkStart, hasRemoteChunks, headerEnabled, mouseWheelZoomEnabled, mouseWheelZoomInvert } = args; + const { webview, nonce, fontFamily, fontSize, cellPadding, separator, tableHtml, chunksJson, extraColumnColorCss, nextChunkStart, hasRemoteChunks, headerEnabled, firstVisibleRow, mouseWheelZoomEnabled, mouseWheelZoomInvert } = args; const isDark = vscode.window.activeColorTheme.kind === vscode.ColorThemeKind.Dark; // Build script URI using file path for compatibility (older APIs may lack Uri.joinPath) const scriptUri = webview.asWebviewUri( @@ -1930,7 +1932,7 @@ class CsvEditorController { -
+
${tableHtml}
diff --git a/src/test/header-context-menu.test.ts b/src/test/header-context-menu.test.ts index ec87975..dd9bbe7 100644 --- a/src/test/header-context-menu.test.ts +++ b/src/test/header-context-menu.test.ts @@ -45,19 +45,19 @@ async function applyHeader(host: Host, view: View, message: unknown) { describe('File header context action', () => { for (const separator of [',', '\t']) { for (const header of [false, true]) { - it(`toggles the file header from either column (${JSON.stringify(separator)}, header ${header})`, async () => { + it(`toggles the file header from either first-row column (${JSON.stringify(separator)}, header ${header})`, async () => { for (const column of [0, 1]) { const host = await createEditorHarness({ rows, separator, header }); const view = createWebviewDom(host.panel.webview.html); const source = host.document.getText(); const version = host.document.version; try { - await applyHeader(host, view, chooseHeader(view, 1, column, !header)); + await applyHeader(host, view, chooseHeader(view, 0, column, !header)); const next = createWebviewDom(host.panel.webview.html); try { assert.strictEqual(!!next.window.document.querySelector('thead'), !header); const reverse = header ? 'Use first row as header' : 'Treat first row as data'; - assert.ok(openMenu(next, 1, column).some(item => item.textContent === reverse)); + assert.ok(openMenu(next, 0, column).some(item => item.textContent === reverse)); } finally { next.close(); } assert.strictEqual(host.document.getText(), source); assert.strictEqual(host.document.version, version); @@ -79,7 +79,7 @@ describe('File header context action', () => { const view = createWebviewDom(host.panel.webview.html); try { assert.strictEqual(view.window.document.querySelector('thead'), null); - await applyHeader(host, view, chooseHeader(view, 1, 1, true)); + await applyHeader(host, view, chooseHeader(view, 0, 1, true)); assert.strictEqual(CsvEditorProvider.getHeaderForUri(context, host.document.uri as any), true); assert.strictEqual(CsvEditorProvider.hasHeaderOverride(context, host.document.uri as any), true); const next = createWebviewDom(host.panel.webview.html); @@ -93,7 +93,7 @@ describe('File header context action', () => { const view = createWebviewDom(host.panel.webview.html); const other = await createEditorHarness({ rows, separator: '\t', header: true }); try { - await applyHeader(host, view, chooseHeader(view, 1, 1, false)); + await applyHeader(host, view, chooseHeader(view, 0, 1, false)); const next = createWebviewDom(host.panel.webview.html); const untouched = createWebviewDom(other.panel.webview.html); try { @@ -163,13 +163,39 @@ describe('File header context action', () => { } finally { view.close(); } }); - it('offers the same action on header, body, serial-index and append cells', async () => { + it('keeps the first displayed row actionable when hidden metadata exceeds the file length', async () => { const host = await createEditorHarness({ rows, header: true }); - const view = createWebviewDom(host.panel.webview.html); + const initial = createWebviewDom(host.panel.webview.html); + const controller = CsvEditorProvider.getActiveProvider()!; + const context = (controller as any).context; try { - for (const [row, column] of [[0, 1], [1, 0], [1, -1], [3, 1]]) { - assert.ok(openMenu(view, row, column).some(item => item.textContent === 'Treat first row as data')); - } - } finally { view.close(); } + await CsvEditorProvider.setHiddenRowsForUri(context, host.document.uri as any, 10); + controller.refresh(); + await finishRefresh(host, initial); + const view = createWebviewDom(host.panel.webview.html); + try { + await applyHeader(host, view, chooseHeader(view, rows.length, 0, false)); + assert.strictEqual(CsvEditorProvider.getHeaderForUri(context, host.document.uri as any), false); + assert.deepStrictEqual(host.rows(), rows); + } finally { view.close(); } + } finally { initial.close(); } + }); + + it('only offers the header action on first-row cells, with headers on or off', async () => { + for (const header of [true, false]) { + const host = await createEditorHarness({ rows, header }); + const view = createWebviewDom(host.panel.webview.html); + try { + const label = header ? 'Treat first row as data' : 'Use first row as header'; + for (const column of [0, 1]) { + assert.ok(openMenu(view, 0, column).some(item => item.textContent === label)); + } + for (const [row, column] of [[1, 0], [1, -1], [2, 1], [3, 1]]) { + const items = openMenu(view, row, column); + assert.ok(!items.some(item => item.textContent === label)); + assert.ok(items.some(item => item.textContent === 'Copy'), 'later cells retain normal context actions'); + } + } finally { view.close(); } + } }); }); From 28cd79ce4a8b9c77dc74eb9d65329687c0170ccd Mon Sep 17 00:00:00 2001 From: Jona Date: Sat, 17 Oct 2026 02:53:25 -0400 Subject: [PATCH 04/10] Keep context menus readable within the viewport --- README.md | 2 +- media/main.js | 21 ++- src/CsvEditorProvider.ts | 2 +- src/test/context-menu-positioning.test.ts | 182 ++++++++++++++++++++++ src/test/webview-clipboard.test.ts | 5 +- 5 files changed, 206 insertions(+), 6 deletions(-) create mode 100644 src/test/context-menu-positioning.test.ts diff --git a/README.md b/README.md index 30c0813..f3c68b9 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Working with CSV files shouldn’t be a chore. With CSV, you get: - **Enhanced Keyboard Navigation:** Navigate cells with arrows and Tab/Shift+Tab; quick edits can commit with arrow keys; `Ctrl/Cmd + A` selects all; `Ctrl/Cmd + C` copies selection. - **Advanced Multi-Cell Selection:** Easily select and copy blocks of data, then paste them elsewhere as properly formatted CSV. - **Add/Delete Columns:** Right-click any cell to add a column left or right, or remove the selected column. -- **Add/Delete Rows:** Insert above/below or remove the selected row via context menu. +- **Add/Delete Rows:** Insert above/below or remove the selected row via context menu. Menus open toward available space and remain scrollable in small editor panes. - **Edit Empty CSVs:** Create or open an empty CSV file and start typing immediately. - **Column Sorting:** Right-click a header and choose A–Z or Z–A. - **Custom Font Controls:** Choose a font family and optional font-size override, or inherit VS Code defaults. diff --git a/media/main.js b/media/main.js index 58eaa5a..11a9acc 100644 --- a/media/main.js +++ b/media/main.js @@ -468,10 +468,25 @@ const showContextMenu = (x, y, row, col) => { }); } - contextMenu.style.left = x + 'px'; - contextMenu.style.top = y + 'px'; + const viewportWidth = window.innerWidth; + const viewportHeight = window.innerHeight; + const marginX = Math.min(8, viewportWidth / 4); + const marginY = Math.min(8, viewportHeight / 4); + contextMenu.style.maxWidth = `${Math.max(0, viewportWidth - 2 * marginX)}px`; + contextMenu.style.maxHeight = `${Math.max(0, viewportHeight - 2 * marginY)}px`; + // Measure all actions at their natural width, bounded by the viewport, before placing. + contextMenu.style.left = `${marginX}px`; + contextMenu.style.top = `${marginY}px`; contextMenu.style.display = 'block'; + contextMenu.scrollTop = 0; + contextMenu.scrollLeft = 0; + const { width, height } = contextMenu.getBoundingClientRect(); + const left = x + width <= viewportWidth - marginX ? x : x - width; + const top = y + height <= viewportHeight - marginY ? y : y - height; + contextMenu.style.left = `${clamp(left, marginX, Math.max(marginX, viewportWidth - marginX - width))}px`; + contextMenu.style.top = `${clamp(top, marginY, Math.max(marginY, viewportHeight - marginY - height))}px`; }; +window.addEventListener('resize', () => { contextMenu.style.display = 'none'; }); const getElementTarget = target => { if (target instanceof Element) return target; @@ -766,7 +781,7 @@ table.addEventListener('contextmenu', e => { if ((isNaN(col) || col === -1) && (isNaN(row) || row === -1)) return; e.preventDefault(); lastContextIsHeader = target.tagName === 'TH'; - showContextMenu(e.pageX, e.pageY, row, col); + showContextMenu(e.clientX, e.clientY, row, col); }); table.addEventListener('mousedown', e => { diff --git a/src/CsvEditorProvider.ts b/src/CsvEditorProvider.ts index 0733c01..162e3fc 100644 --- a/src/CsvEditorProvider.ts +++ b/src/CsvEditorProvider.ts @@ -1923,7 +1923,7 @@ class CsvEditorController { font-size: inherit; } #findReplaceWidget .fr-overflow-item:hover { background: rgba(255,255,255,0.05); } - #contextMenu { position: absolute; display: none; background: ${isDark ? '#2d2d2d' : '#ffffff'}; border: 1px solid ${isDark ? '#555' : '#ccc'}; z-index: 10000; font-family: ${this.escapeCss(fontFamily)}; font-size: inherit; } + #contextMenu { position: fixed; display: none; width: max-content; box-sizing: border-box; overflow: auto; overflow-wrap: anywhere; background: ${isDark ? '#2d2d2d' : '#ffffff'}; border: 1px solid ${isDark ? '#555' : '#ccc'}; z-index: 10000; font-family: ${this.escapeCss(fontFamily)}; font-size: inherit; } #contextMenu div { padding: 4px 12px; cursor: pointer; } #contextMenu div:hover { background: ${isDark ? '#3d3d3d' : '#eeeeee'}; } diff --git a/src/test/context-menu-positioning.test.ts b/src/test/context-menu-positioning.test.ts new file mode 100644 index 0000000..30e471f --- /dev/null +++ b/src/test/context-menu-positioning.test.ts @@ -0,0 +1,182 @@ +import assert from 'assert'; +import { describe, it } from 'node:test'; +import { createEditorHarness, createWebviewDom } from './edit-integrity-harness'; + +async function fixture(separator = ',') { + const host = await createEditorHarness({ rows: [['Name', 'Value'], ['one', 'two']], header: true, separator }); + const view = createWebviewDom(host.panel.webview.html); + const { window } = view; + const menu = window.document.getElementById('contextMenu'); + let naturalSize: { width: number; height: number } | undefined; + const measurements: Array<{ left: string; top: string; display: string }> = []; + const natural = () => naturalSize ?? { + width: Math.max(...Array.from(menu.children).map((item: any) => item.textContent.length * 8 + 26)), + height: Array.from(menu.children).reduce((sum: number, item: any) => sum + (item.textContent ? 24 : 4), 2) + }; + const size = () => ({ + width: Math.min(natural().width, Number.parseFloat(menu.style.maxWidth)), + height: Math.min(natural().height, Number.parseFloat(menu.style.maxHeight)) + }); + menu.getBoundingClientRect = () => { + measurements.push({ left: menu.style.left, top: menu.style.top, display: menu.style.display }); + const { width, height } = size(); + const left = Number.parseFloat(menu.style.left), top = Number.parseFloat(menu.style.top); + return { left, top, right: left + width, bottom: top + height, width, height }; + }; + Object.defineProperty(menu, 'scrollHeight', { get: () => natural().height }); + Object.defineProperty(menu, 'clientHeight', { get: () => size().height }); + const viewport = (width: number, height: number) => { + Object.defineProperty(window, 'innerWidth', { value: width, configurable: true }); + Object.defineProperty(window, 'innerHeight', { value: height, configurable: true }); + }; + viewport(1000, 700); + const open = (x: number, y: number, row = 1, column = 0, pageOffsetX = 0, pageOffsetY = 0) => { + const target = view.cell(row, column); + target.dispatchEvent(new window.MouseEvent('mousedown', { button: 2, bubbles: true, cancelable: true, clientX: x, clientY: y })); + const event = new window.MouseEvent('contextmenu', { bubbles: true, cancelable: true, clientX: x, clientY: y }); + Object.defineProperty(event, 'pageX', { value: x + pageOffsetX }); + Object.defineProperty(event, 'pageY', { value: y + pageOffsetY }); + target.dispatchEvent(event); + assert.strictEqual(event.defaultPrevented, true); + return { left: Number.parseFloat(menu.style.left), top: Number.parseFloat(menu.style.top), ...size() }; + }; + return { ...view, menu, measurements, viewport, open, setSize: (width: number, height: number) => { naturalSize = { width, height }; } }; +} + +describe('Context menu viewport positioning', () => { + it('renders the provider popup at natural width with bounded wrapping and scrolling', async () => { + const view = await fixture(); + try { + const css = view.window.getComputedStyle(view.menu); + assert.strictEqual(css.position, 'fixed'); + assert.strictEqual(css.width, 'max-content'); + assert.strictEqual(css.boxSizing, 'border-box'); + assert.strictEqual(css.overflow, 'auto'); + assert.strictEqual(css.overflowWrap, 'anywhere'); + } finally { view.close(); } + }); + + for (const separator of [',', '\t']) { + it(`flips at the measured right-space threshold, including fractional coordinates (${JSON.stringify(separator)})`, async () => { + const view = await fixture(separator); + try { + view.setSize(200, 120); + assert.strictEqual(view.open(792, 100).left, 792, 'exact fit stays on the right, beyond the screen midpoint'); + assert.strictEqual(view.open(792.5, 100).left, 592.5, 'half a pixel beyond the measured threshold opens left'); + assert.ok(view.measurements.every(measurement => measurement.left === '8px' && measurement.top === '8px' && measurement.display === 'block')); + } finally { view.close(); } + }); + } + + it('chooses a side again for differently sized menus at the same pointer position', async () => { + const view = await fixture(); + try { + view.setSize(100, 120); + assert.strictEqual(view.open(650, 100).left, 650); + view.setSize(400, 120); + assert.strictEqual(view.open(650, 100).left, 250); + } finally { view.close(); } + }); + + it('measures the completed header menu, including its extra actions', async () => { + const view = await fixture(); + try { + const body = view.open(100, 100, 1); + const x = 1000 - 8 - body.width; + assert.strictEqual(view.open(x, 100, 1).left, x); + const header = view.open(x, 100, 0); + assert.ok(header.width > body.width); + assert.ok(header.height > body.height); + assert.strictEqual(header.left, x - header.width); + assert.ok(Array.from(view.menu.children).some((item: any) => item.textContent === 'Treat first row as data')); + assert.ok(Array.from(view.menu.children).some((item: any) => item.textContent === 'Sort: A-Z')); + } finally { view.close(); } + }); + + it('flips upward at the measured bottom-space threshold', async () => { + const view = await fixture(); + try { + view.setSize(200, 120); + assert.strictEqual(view.open(100, 572).top, 572); + assert.strictEqual(view.open(100, 572.5).top, 452.5); + } finally { view.close(); } + }); + + it('clamps all four corners inside the viewport margins', async () => { + const view = await fixture(); + try { + view.setSize(200, 120); + for (const [x, y, left, top] of [[0, 0, 8, 8], [1000, 0, 792, 8], [0, 700, 8, 572], [1000, 700, 792, 572]]) { + const placed = view.open(x, y); + assert.strictEqual(placed.left, left); + assert.strictEqual(placed.top, top); + assert.ok(placed.left + placed.width <= 992); + assert.ok(placed.top + placed.height <= 692); + } + } finally { view.close(); } + }); + + it('uses viewport client coordinates independently of document and table scrolling', async () => { + const view = await fixture(); + try { + view.setSize(200, 120); + Object.defineProperty(view.window, 'scrollX', { value: 5000 }); + Object.defineProperty(view.window, 'scrollY', { value: 7000 }); + const container = view.window.document.querySelector('.table-container'); + container.scrollLeft = 300; + container.scrollTop = 600; + const placed = view.open(100, 200, 1, 0, 5000, 7000); + assert.strictEqual(placed.left, 100); + assert.strictEqual(placed.top, 200); + assert.strictEqual(container.scrollLeft, 300); + assert.strictEqual(container.scrollTop, 600); + } finally { view.close(); } + }); + + it('bounds tiny editor menus and retains reachable actions through vertical scrolling', async () => { + const view = await fixture(); + try { + view.setSize(300, 500); + for (const [width, height] of [[120, 90], [16, 12]]) { + view.viewport(width, height); + const placed = view.open(width - 1, height - 1); + assert.ok(placed.width <= width - 2 * Math.min(8, width / 4)); + assert.ok(placed.height <= height - 2 * Math.min(8, height / 4)); + assert.ok(placed.left >= 0 && placed.left + placed.width <= width); + assert.ok(placed.top >= 0 && placed.top + placed.height <= height); + assert.ok(view.menu.scrollHeight > view.menu.clientHeight); + } + view.menu.scrollTop = view.menu.scrollHeight - view.menu.clientHeight; + const last = view.menu.lastElementChild; + assert.strictEqual(last.textContent, 'Delete COLUMN'); + last.click(); + assert.strictEqual(view.messages.at(-1).type, 'deleteColumn'); + assert.strictEqual(view.messages.at(-1).index, 0); + assert.strictEqual(view.menu.style.display, 'none'); + } finally { view.close(); } + }); + + it('dismisses on viewport resize and remeasures/reset scroll when reopened', async () => { + const view = await fixture(); + try { + view.viewport(120, 90); + view.setSize(300, 500); + view.open(119, 89); + view.menu.scrollTop = 200; + view.menu.scrollLeft = 20; + view.viewport(1000, 700); + view.window.dispatchEvent(new view.window.Event('resize')); + assert.strictEqual(view.menu.style.display, 'none'); + view.setSize(180, 100); + const placed = view.open(100, 100); + assert.strictEqual(placed.left, 100); + assert.strictEqual(placed.top, 100); + assert.strictEqual(placed.width, 180); + assert.strictEqual(placed.height, 100); + assert.strictEqual(view.menu.scrollTop, 0); + assert.strictEqual(view.menu.scrollLeft, 0); + assert.strictEqual(view.menu.style.display, 'block'); + assert.ok(Array.from(view.menu.children).some((item: any) => item.textContent === 'Copy')); + } finally { view.close(); } + }); +}); diff --git a/src/test/webview-clipboard.test.ts b/src/test/webview-clipboard.test.ts index 2bf95e7..acb28ec 100644 --- a/src/test/webview-clipboard.test.ts +++ b/src/test/webview-clipboard.test.ts @@ -46,6 +46,7 @@ function createWebview() { contains(other: Element): boolean { return other === this || this.children.some(child => child.contains(other)); } focus() { document.activeElement = this; } scrollIntoView() {} + getBoundingClientRect() { return { width: 200, height: 300 }; } matches(selector: string): boolean { if (selector.includes(' ')) { const [ancestor, child] = selector.split(' '); @@ -102,6 +103,8 @@ function createWebview() { } const window = new Element('WINDOW') as any; window.getComputedStyle = () => ({ fontSize: '14px' }); + window.innerWidth = 1024; + window.innerHeight = 768; const messages: any[] = []; const context = vm.createContext({ document, window, Element, Node: Element, @@ -191,7 +194,7 @@ describe('Shipped webview clipboard interactions', () => { const second = view.cell(1, 1, 'two'); view.select(1, 0, 1, 1); view.dispatch(second, 'mousedown', { button: 2 }); - view.dispatch(second, 'contextmenu', { pageX: 10, pageY: 20 }); + view.dispatch(second, 'contextmenu', { clientX: 10, clientY: 20 }); const menu = view.byId('contextMenu'); for (const label of ['Copy', 'Cut', 'Paste']) { const item = menu.children.find(child => child.textContent === label)!; From 6ccbfbddb97086dfcf49e20439457e19482e505c Mon Sep 17 00:00:00 2001 From: Jona Date: Sat, 17 Oct 2026 02:55:40 -0400 Subject: [PATCH 05/10] Dismiss context menus when CSV zoom changes --- media/main.js | 2 ++ src/test/context-menu-positioning.test.ts | 31 ++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/media/main.js b/media/main.js index 11a9acc..8e75123 100644 --- a/media/main.js +++ b/media/main.js @@ -95,6 +95,8 @@ const setZoomScale = (nextScale, persist = true) => { return false; } zoomScale = normalized; + const menu = document.getElementById('contextMenu'); + if (menu) { menu.style.display = 'none'; } document.body.style.fontSize = `${Math.max(1, BASE_FONT_SIZE_PX * zoomScale)}px`; applySizeStateToRenderedCells(); if (persist) { diff --git a/src/test/context-menu-positioning.test.ts b/src/test/context-menu-positioning.test.ts index 30e471f..8e85e4d 100644 --- a/src/test/context-menu-positioning.test.ts +++ b/src/test/context-menu-positioning.test.ts @@ -9,9 +9,14 @@ async function fixture(separator = ',') { const menu = window.document.getElementById('contextMenu'); let naturalSize: { width: number; height: number } | undefined; const measurements: Array<{ left: string; top: string; display: string }> = []; - const natural = () => naturalSize ?? { - width: Math.max(...Array.from(menu.children).map((item: any) => item.textContent.length * 8 + 26)), - height: Array.from(menu.children).reduce((sum: number, item: any) => sum + (item.textContent ? 24 : 4), 2) + const baseFontSize = Number.parseFloat(window.getComputedStyle(window.document.body).fontSize); + const natural = () => { + if (naturalSize) { return naturalSize; } + const scale = Number.parseFloat(window.getComputedStyle(window.document.body).fontSize) / baseFontSize; + return { + width: Math.max(...Array.from(menu.children).map((item: any) => item.textContent.length * 8 * scale + 26)), + height: Array.from(menu.children).reduce((sum: number, item: any) => sum + (item.textContent ? 24 * scale : 4), 2) + }; }; const size = () => ({ width: Math.min(natural().width, Number.parseFloat(menu.style.maxWidth)), @@ -156,6 +161,26 @@ describe('Context menu viewport positioning', () => { } finally { view.close(); } }); + it('dismisses only when CSV zoom changes and measures the enlarged menu on reopen', async () => { + const view = await fixture(); + try { + const original = view.open(100, 100); + const x = 1000 - 8 - original.width; + assert.strictEqual(view.open(x, 100).left, x); + view.key('0', { ctrlKey: true }); + assert.strictEqual(view.menu.style.display, 'block', 'reset at the existing zoom leaves the menu open'); + const originalFontSize = Number.parseFloat(view.window.getComputedStyle(view.window.document.body).fontSize); + view.key('+', { ctrlKey: true }); + assert.strictEqual(view.menu.style.display, 'none'); + assert.ok(Number.parseFloat(view.window.document.body.style.fontSize) > originalFontSize); + const enlarged = view.open(x, 100); + assert.ok(enlarged.width > original.width); + assert.strictEqual(enlarged.left, x - enlarged.width); + assert.ok(enlarged.left + enlarged.width <= 992); + assert.strictEqual(view.menu.style.display, 'block'); + } finally { view.close(); } + }); + it('dismisses on viewport resize and remeasures/reset scroll when reopened', async () => { const view = await fixture(); try { From 0a8c573db3d06e35fbd08288446102099a7867c6 Mon Sep 17 00:00:00 2001 From: Jona Date: Sat, 17 Oct 2026 02:57:29 -0400 Subject: [PATCH 06/10] Show context menu placement near the editor edge --- images/context-menu-edge.jpg | Bin 0 -> 162600 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/context-menu-edge.jpg diff --git a/images/context-menu-edge.jpg b/images/context-menu-edge.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e59353d1481200ec6c9078a2b098268ec270b85 GIT binary patch literal 162600 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 ZDIZC8 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%0A~b$`MfIx5!M`lw-?RRw@bpPuw&R{? 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 YzlRU|I}q^qF8&|8_WuC`VE Date: Sat, 17 Oct 2026 02:58:26 -0400 Subject: [PATCH 07/10] Check completed menu placement across stacked actions --- src/test/context-menu-positioning.test.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/test/context-menu-positioning.test.ts b/src/test/context-menu-positioning.test.ts index 8e85e4d..5ca10c1 100644 --- a/src/test/context-menu-positioning.test.ts +++ b/src/test/context-menu-positioning.test.ts @@ -88,11 +88,15 @@ describe('Context menu viewport positioning', () => { try { const body = view.open(100, 100, 1); const x = 1000 - 8 - body.width; - assert.strictEqual(view.open(x, 100, 1).left, x); - const header = view.open(x, 100, 0); - assert.ok(header.width > body.width); + const y = 700 - 8 - body.height; + const fittedBody = view.open(x, y, 1); + assert.strictEqual(fittedBody.left, x); + assert.strictEqual(fittedBody.top, y); + const header = view.open(x, y, 0); + assert.ok(header.width >= body.width); assert.ok(header.height > body.height); - assert.strictEqual(header.left, x - header.width); + assert.strictEqual(header.left, header.width > body.width ? x - header.width : x); + assert.strictEqual(header.top, Math.max(8, y - header.height)); assert.ok(Array.from(view.menu.children).some((item: any) => item.textContent === 'Treat first row as data')); assert.ok(Array.from(view.menu.children).some((item: any) => item.textContent === 'Sort: A-Z')); } finally { view.close(); } From b673136e507e9df9350b2aee5c418eb9a585e7dc Mon Sep 17 00:00:00 2001 From: Jona Date: Sat, 17 Oct 2026 03:15:27 -0400 Subject: [PATCH 08/10] Hide the serial index from its context menu --- README.md | 1 + media/main.js | 26 +- src/CsvEditorProvider.ts | 14 +- src/test/edit-integrity-harness.ts | 4 +- src/test/serial-index-context-menu.test.ts | 279 +++++++++++++++++++++ 5 files changed, 319 insertions(+), 5 deletions(-) create mode 100644 src/test/serial-index-context-menu.test.ts diff --git a/README.md b/README.md index f3c68b9..0eb4795 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ Working with CSV files shouldn’t be a chore. With CSV, you get: - **Interactive Editing:** Two modes — type to start a quick edit, or press Enter/double‑click for detail edit. Changes commit to the document when focus leaves the cell or CSV view; unsaved changes remain visible when you switch tabs. - **Smart Resizing:** Automatic calculation of column widths for improved readability. - **Dynamic Color Coding:** Visual cues based on data type help you quickly identify numbers, dates, booleans, and more (with opt‑in cool palette and theme-foreground mode settings). +- **Serial Index Column:** Right-click a serial index cell or its top-left corner and choose **Hide serial index column** for that file. Restore it with **CSV: Toggle Serial Index Column** in the Command Palette. - **Sticky Headers:** Keep column titles in view as you scroll through large datasets. Right-click a cell in the first visible row and choose **Use first row as header** or **Treat first row as data** to toggle the header for that file. With leading metadata rows hidden, this applies to the first visible row; the CSV contents stay unchanged. - **Enhanced Keyboard Navigation:** Navigate cells with arrows and Tab/Shift+Tab; quick edits can commit with arrow keys; `Ctrl/Cmd + A` selects all; `Ctrl/Cmd + C` copies selection. - **Advanced Multi-Cell Selection:** Easily select and copy blocks of data, then paste them elsewhere as properly formatted CSV. diff --git a/media/main.js b/media/main.js index 8e75123..36e6ff8 100644 --- a/media/main.js +++ b/media/main.js @@ -389,6 +389,25 @@ const showContextMenu = (x, y, row, col) => { d.style.margin = '1px 0'; contextMenu.appendChild(d); }; + if (col === -1) { + item('Hide serial index column', () => { + const anchor = anchorCell ? getCellCoords(anchorCell) : null; + if (!anchor || !Number.isFinite(anchor.col) || anchor.col < 0) { + const row = anchor && Number.isFinite(anchor.row) ? anchor.row : Number(root?.dataset?.firstrow || '0'); + const surviving = table.querySelector(`td[data-row="${row}"][data-col="0"], th[data-row="${row}"][data-col="0"]`); + if (surviving) { + clearSelection(); + surviving.classList.add('selected'); + currentSelection.push(surviving); + anchorCell = surviving; + rangeEndCell = surviving; + } + } + persistState(); + vscode.postMessage({ type: 'setSerialIndex', enabled: false }); + }); + divider(); + } if (row === Number(root?.dataset?.firstrow)) { item(headerEnabled ? 'Treat first row as data' : 'Use first row as header', () => { persistState(); @@ -778,11 +797,12 @@ table.addEventListener('contextmenu', e => { if (!target || editingCell) return; const colAttr = target.getAttribute('data-col'); const rowAttr = target.getAttribute('data-row'); - const col = parseInt(colAttr); + const serialCorner = target.hasAttribute('data-serial-index'); + const col = serialCorner ? -1 : parseInt(colAttr); const row = parseInt(rowAttr); - if ((isNaN(col) || col === -1) && (isNaN(row) || row === -1)) return; + if (!serialCorner && (isNaN(col) || col === -1) && (isNaN(row) || row === -1)) return; e.preventDefault(); - lastContextIsHeader = target.tagName === 'TH'; + lastContextIsHeader = target.tagName === 'TH' && !serialCorner; showContextMenu(e.clientX, e.clientY, row, col); }); diff --git a/src/CsvEditorProvider.ts b/src/CsvEditorProvider.ts index 162e3fc..d03c157 100644 --- a/src/CsvEditorProvider.ts +++ b/src/CsvEditorProvider.ts @@ -158,6 +158,18 @@ class CsvEditorController { } break; } + case 'setSerialIndex': { + if (typeof e.enabled === 'boolean') { + const uri = this.getDocumentUri(); + if (CsvEditorProvider.getSerialIndexForUri(this.context, uri) !== e.enabled) { + await CsvEditorProvider.setSerialIndexForUri(this.context, uri, e.enabled); + CsvEditorProvider.editors + .filter(editor => editor.getDocumentUri().toString() === uri.toString()) + .forEach(editor => editor.refresh()); + } + } + break; + } case 'copyCells': await this.copyCells(e.matrix, e.startRow, e.startCol, e.cut === true); break; @@ -1575,7 +1587,7 @@ class CsvEditorController { if (headerFlag) { tableHtml += `${ addSerialIndex - ? `` + ? `` : '' }`; for (let i = 0; i < numColumns; i++) { diff --git a/src/test/edit-integrity-harness.ts b/src/test/edit-integrity-harness.ts index 1a48ed0..2293b97 100644 --- a/src/test/edit-integrity-harness.ts +++ b/src/test/edit-integrity-harness.ts @@ -48,6 +48,7 @@ export async function createEditorHarness(options: { rows?: string[][]; separator?: string; header?: boolean; + serialIndex?: boolean; remote?: boolean; } = {}) { const separator = options.separator ?? ','; @@ -84,6 +85,7 @@ export async function createEditorHarness(options: { } }; await CsvEditorProvider.setHeaderForUri(context as any, uri as any, options.header ?? true); + await CsvEditorProvider.setSerialIndexForUri(context as any, uri as any, options.serialIndex ?? true); const panel = { active: true, visible: true, @@ -100,7 +102,7 @@ export async function createEditorHarness(options: { onDidDispose() {} }; const harness = { - document, panel, messages, changeListeners, saveListeners, + context, document, panel, messages, changeListeners, saveListeners, get diskText() { return diskText; }, get pendingEdits() { return delayedEdits.length; }, deferEdits() { deferEdits = true; }, diff --git a/src/test/serial-index-context-menu.test.ts b/src/test/serial-index-context-menu.test.ts new file mode 100644 index 0000000..e2741e2 --- /dev/null +++ b/src/test/serial-index-context-menu.test.ts @@ -0,0 +1,279 @@ +import assert from 'assert'; +import { describe, it } from 'node:test'; +import { createEditorHarness, createWebviewDom } from './edit-integrity-harness'; +const { CsvEditorProvider } = require('../CsvEditorProvider') as typeof import('../CsvEditorProvider'); + +type Host = Awaited>; +type View = ReturnType; +const rows = [['Name', 'Value'], ['one', 'two'], ['three', 'four']]; +const settle = () => new Promise(resolve => setTimeout(resolve, 20)); + +function openMenu(view: View, target: any) { + assert.ok(target); + target.dispatchEvent(new view.window.MouseEvent('mousedown', { button: 2, bubbles: true, cancelable: true, clientX: 100, clientY: 100 })); + const event = new view.window.MouseEvent('contextmenu', { bubbles: true, cancelable: true, clientX: 100, clientY: 100 }); + target.dispatchEvent(event); + return { event, items: Array.from(view.window.document.querySelectorAll('#contextMenu div')) as any[] }; +} + +function chooseHide(view: View, target: any) { + const item = openMenu(view, target).items.find(element => element.textContent === 'Hide serial index column'); + assert.ok(item); + item.click(); + const message = view.messages.slice().reverse().find(item => item.type === 'setSerialIndex'); + assert.strictEqual(message.enabled, false); + return message; +} + +async function finishRefresh(host: Host, view: View, start = 0) { + let cursor = start; + for (let guard = 0; guard < 5; guard++) { + const pending = host.messages.slice(cursor).filter((item: any) => item.type === 'prepareViewRefresh'); + cursor = host.messages.length; + if (!pending.length) { break; } + for (const prepare of pending) { + const begin = view.messages.length; + view.window.dispatchEvent(new view.window.MessageEvent('message', { data: prepare })); + for (const item of view.messages.slice(begin)) { await host.receive(item); } + } + } + await settle(); +} + +async function applySerialIndex(host: Host, view: View, message: unknown) { + const start = host.messages.length; + await host.receive(message); + await finishRefresh(host, view, start); +} + +async function mountThrough(view: View, host: Host, row: number) { + let begin = 0; + for (let guard = 0; !view.cell(row, -1) && guard < 10; guard++) { + view.window.__csvLoadNextChunk(); + const pending = view.messages.slice(begin).filter(message => message.type === 'requestChunk'); + begin = view.messages.length; + for (const request of pending) { + await host.receive(request); + const response = host.messages.slice().reverse().find((message: any) => message.type === 'chunkData' && message.requestId === request.requestId); + view.window.dispatchEvent(new view.window.MessageEvent('message', { data: response })); + } + } + assert.ok(view.cell(row, -1), `serial cell in row ${row} should be mounted`); +} + +describe('Serial index context action', () => { + for (const separator of [',', '\t']) { + for (const header of [false, true]) { + it(`hides only the serial column without changing source (${JSON.stringify(separator)}, header ${header})`, async () => { + const host = await createEditorHarness({ rows, separator, header }); + const view = createWebviewDom(host.panel.webview.html); + const source = host.document.getText(), version = host.document.version, disk = host.diskText; + try { + for (const row of [1, 2, 3]) { + assert.ok(openMenu(view, view.cell(row, -1)).items.some(item => item.textContent === 'Hide serial index column')); + } + for (const row of [0, 1, 3]) { + for (const column of [0, 1]) { + assert.ok(!openMenu(view, view.cell(row, column)).items.some(item => item.textContent === 'Hide serial index column')); + } + } + await applySerialIndex(host, view, chooseHide(view, view.cell(1, -1))); + const next = createWebviewDom(host.panel.webview.html); + try { + assert.strictEqual(next.window.document.querySelector('[data-col="-1"], [data-serial-index]'), null); + assert.ok(!openMenu(next, next.cell(1, 0)).items.some(item => item.textContent === 'Hide serial index column')); + } finally { next.close(); } + assert.strictEqual(CsvEditorProvider.getSerialIndexForUri(host.context as any, host.document.uri as any), false); + assert.strictEqual(host.document.getText(), source); + assert.strictEqual(host.document.version, version); + assert.strictEqual(host.diskText, disk); + // The existing command uses this setter and refresh route to restore the column. + await CsvEditorProvider.setSerialIndexForUri(host.context as any, host.document.uri as any, true); + CsvEditorProvider.getActiveProvider()!.refresh(); + await settle(); + const restored = createWebviewDom(host.panel.webview.html); + try { assert.ok(restored.cell(1, -1)); } finally { restored.close(); } + } finally { view.close(); } + }); + } + } + + it('offers the corner action while preserving Select All and excluding invalid data actions', async () => { + const host = await createEditorHarness({ rows }); + const view = createWebviewDom(host.panel.webview.html); + try { + const corner = view.window.document.querySelector('thead th[data-serial-index]'); + assert.ok(corner); + assert.ok(!corner.hasAttribute('data-row') && !corner.hasAttribute('data-col')); + corner.dispatchEvent(new view.window.MouseEvent('mousedown', { button: 0, bubbles: true, cancelable: true })); + assert.strictEqual(view.window.document.querySelectorAll('td.selected, th.selected').length, view.window.document.querySelectorAll('td, th').length); + const menu = openMenu(view, corner); + assert.strictEqual(menu.event.defaultPrevented, true); + assert.ok(menu.items.some(item => item.textContent === 'Hide serial index column')); + assert.ok(!menu.items.some(item => /Sort:|COLUMN:|Delete COLUMN|first row as/.test(item.textContent))); + await applySerialIndex(host, view, chooseHide(view, corner)); + assert.ok(!host.panel.webview.html.includes('data-serial-index')); + assert.deepStrictEqual(host.rows(), rows); + } finally { view.close(); } + }); + + it('hides an empty/header-off serial column and accepts a boolean restore idempotently', async () => { + const host = await createEditorHarness({ rows: [], header: false }); + const view = createWebviewDom(host.panel.webview.html); + try { + await applySerialIndex(host, view, chooseHide(view, view.cell(0, -1))); + assert.ok(!host.panel.webview.html.includes('data-col="-1"')); + await applySerialIndex(host, view, { type: 'setSerialIndex', enabled: true }); + const restored = createWebviewDom(host.panel.webview.html); + try { assert.ok(restored.cell(0, -1)); } finally { restored.close(); } + const html = host.panel.webview.html; + await applySerialIndex(host, view, { type: 'setSerialIndex', enabled: true }); + assert.strictEqual(host.panel.webview.html, html); + assert.strictEqual(host.document.getText(), ''); + assert.strictEqual(host.document.version, 1); + } finally { view.close(); } + }); + + it('targets its owner URI and refreshes every view of that URI, even with another active file', async () => { + const host = await createEditorHarness({ rows }); + const view = createWebviewDom(host.panel.webview.html); + const second = await createEditorHarness({ rows }); + const secondView = createWebviewDom(second.panel.webview.html); + second.context.workspaceState = host.context.workspaceState; + const other = await createEditorHarness({ rows, separator: '\t' }); + const otherHtml = other.panel.webview.html; + try { + await applySerialIndex(host, view, chooseHide(view, view.cell(1, -1))); + assert.ok(!host.panel.webview.html.includes('data-col="-1"')); + await finishRefresh(second, secondView); + assert.ok(!second.panel.webview.html.includes('data-col="-1"')); + assert.strictEqual(other.panel.webview.html, otherHtml); + assert.strictEqual(CsvEditorProvider.getSerialIndexForUri(other.context as any, other.document.uri as any), true); + assert.deepStrictEqual(host.rows(), rows); + assert.deepStrictEqual(second.rows(), rows); + } finally { view.close(); secondView.close(); } + }); + + it('rejects malformed preferences and ignores repeated requests without extra writes or reloads', async () => { + const host = await createEditorHarness({ rows }); + const view = createWebviewDom(host.panel.webview.html); + const update = host.context.workspaceState.update.bind(host.context.workspaceState); + let serialWrites = 0; + host.context.workspaceState.update = async (key: string, value: unknown) => { + if (key === CsvEditorProvider.serialKey) { serialWrites++; } + await update(key, value); + }; + try { + const original = host.panel.webview.html; + for (const enabled of [undefined, null, 'false', 0, 1, {}, []]) { + await applySerialIndex(host, view, { type: 'setSerialIndex', enabled }); + } + assert.strictEqual(host.panel.webview.html, original); + assert.strictEqual(serialWrites, 0); + await applySerialIndex(host, view, chooseHide(view, view.cell(1, -1))); + const hidden = host.panel.webview.html; + await applySerialIndex(host, view, { type: 'setSerialIndex', enabled: false }); + assert.strictEqual(host.panel.webview.html, hidden); + assert.strictEqual(serialWrites, 1); + assert.strictEqual(host.document.version, 1); + } finally { view.close(); } + }); + + for (const corner of [false, true]) { + it(`preserves scroll and a surviving data anchor with hidden metadata (corner ${corner})`, async () => { + const host = await createEditorHarness({ rows: [['metadata', ''], ...rows], header: true }); + await CsvEditorProvider.setHiddenRowsForUri(host.context as any, host.document.uri as any, 1); + CsvEditorProvider.getActiveProvider()!.refresh(); + await settle(); + const view = createWebviewDom(host.panel.webview.html); + try { + const container = view.window.document.querySelector('.table-container'); + container.scrollLeft = 40; + container.scrollTop = 120; + const target = corner ? view.window.document.querySelector('[data-serial-index]') : view.cell(2, -1); + const message = chooseHide(view, target); + view.window.dispatchEvent(new view.window.Event('blur')); + view.window.dispatchEvent(new view.window.Event('focus')); + await settle(); + view.window.dispatchEvent(new view.window.Event('blur')); + await applySerialIndex(host, view, message); + const state = view.window.acquireVsCodeApi().getState(); + assert.strictEqual(state.anchorRow, corner ? 1 : 2); + assert.strictEqual(state.anchorCol, 0); + assert.strictEqual(state.scrollX, 40); + assert.strictEqual(state.scrollY, 120); + const next = createWebviewDom(host.panel.webview.html); + try { + next.window.acquireVsCodeApi().setState(state); + next.window.dispatchEvent(new next.window.Event('focus')); + await settle(); + assert.ok(next.cell(state.anchorRow, 0).classList.contains('selected')); + assert.strictEqual(next.window.document.querySelector('.table-container').scrollLeft, 40); + assert.strictEqual(next.window.document.querySelector('.table-container').scrollTop, 120); + } finally { next.close(); } + } finally { view.close(); } + }); + } + + it('retains an existing data anchor when the selected serial cell opens the menu', async () => { + const host = await createEditorHarness({ rows }); + const view = createWebviewDom(host.panel.webview.html); + try { + view.window.editingTestApi.setSingleSelection(view.cell(1, 1)); + view.key('a', { ctrlKey: true }); + assert.ok(view.cell(1, -1).classList.contains('selected')); + const message = chooseHide(view, view.cell(1, -1)); + view.window.dispatchEvent(new view.window.Event('blur')); + const state = view.window.acquireVsCodeApi().getState(); + assert.strictEqual(state.anchorRow, 1); + assert.strictEqual(state.anchorCol, 1); + await applySerialIndex(host, view, message); + assert.deepStrictEqual(host.rows(), rows); + } finally { view.close(); } + }); + + it('keeps remote later-chunk index cells actionable and preserves the source', async () => { + const data = [['Name', 'Value'], ...Array.from({ length: 1100 }, (_, row) => [`row-${row}`, 'value'])]; + const host = await createEditorHarness({ rows: data, remote: true }); + const view = createWebviewDom(host.panel.webview.html); + try { + await mountThrough(view, host, 1050); + await applySerialIndex(host, view, chooseHide(view, view.cell(1050, -1))); + assert.strictEqual(view.window.acquireVsCodeApi().getState().anchorRow, 1050); + assert.strictEqual(view.window.acquireVsCodeApi().getState().anchorCol, 0); + await host.receive({ type: 'requestChunk', start: 1001, requestId: 99 }); + const response = host.messages.slice().reverse().find((message: any) => message.type === 'chunkData' && message.requestId === 99); + assert.ok(!response.html.includes('data-col="-1"')); + assert.deepStrictEqual(host.rows(), data); + assert.strictEqual(host.document.version, 1); + } finally { view.close(); } + }); + + it('retains native context menus while editing and drains queued multiline edits before refresh', async () => { + const host = await createEditorHarness({ rows }); + const view = createWebviewDom(host.panel.webview.html); + try { + view.start(view.cell(1, 0)); + view.type('draft\nline'); + const menu = openMenu(view, view.cell(1, -1)); + assert.strictEqual(menu.event.defaultPrevented, false); + assert.ok(!menu.items.some(item => item.textContent === 'Hide serial index column')); + view.cell(1, 0).blur(); + const editMessage = view.messages.find(message => message.type === 'editCell'); + assert.ok(editMessage); + host.deferEdits(); + const edit = host.receive(editMessage); + await new Promise(resolve => setImmediate(resolve)); + assert.strictEqual(host.pendingEdits, 1); + const hide = host.receive({ type: 'setSerialIndex', enabled: false }); + assert.ok(host.panel.webview.html.includes('data-col="-1"')); + host.releaseEdit(); + await edit; + await hide; + await finishRefresh(host, view); + assert.strictEqual(host.rows()[1][0], editMessage.value); + assert.ok(!host.panel.webview.html.includes('data-col="-1"')); + assert.ok(!host.diskText.includes('draft')); + } finally { view.close(); } + }); +}); From bd1f62b5bb7ee11afb7611c569aea299036f804c Mon Sep 17 00:00:00 2001 From: Jona Date: Sat, 17 Oct 2026 03:18:55 -0400 Subject: [PATCH 09/10] Show the serial index context action --- images/serial-index-menu.jpg | Bin 0 -> 43173 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/serial-index-menu.jpg diff --git a/images/serial-index-menu.jpg b/images/serial-index-menu.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8ebd0c032f1b643ab19b9b800e91b7de31d1977e GIT binary patch literal 43173 zcmeFZ1yq~M_BcwtrFMYg)}no-IFne~!}qqNAa$L3iQ= z9o>n;AKlLZx(9S;PoFt^=JeUKXU?8GclJE}FZA>mF3?}Qa`nAsSg*0LaBvIq za&Yos{!=@fTr%sFbo`5>GaLmI+adk{vLuh7TOgvccOz`;gX1>JW@Hm}x40?(1G-7x>NR<6 z(ek=QNfaL5mmltPKR06BZT{Lk&fN$DUee^&1h%ZC0!i|cGcBHF;u88XJt1+tZ*_8E z1^(h7xC3(FyI!T~wo|1-%}$Dv<{i@TJhJvj{Sj=P7J8dbfC|jy#QG8$SfcAG8>U4*0p*rEvJ9m_N(Vn@qxTZvG!M${~p{b zUd`?)aWv8qM-UT}>JovnGr&V0=2&yzua!ebx{_GjBCZV9%?fv9sPZkw^Nw~@Pq%kJ zNh_|?_d5@jI-L{33LO7?$`*8j%(yIoru|GjzyR`TnQNPpoGK zDw(Xe9)T26runcW57dl-5NkE_PdaJvrR1GtsOeP*mANA4W@uE9;j<{vo@@M6eHgZ$#W;!F%;20Q701gZ z5Nk(EUO~86-}1bsiLO<}^sJv#-cb#_JC+NBR%F0kKXnOdq|Ik?^hjk#5g8a7gAC4V zN|3S}gS_G$1Y8=jyHnHphbYz;#z!I3fx?8DD?Y2pgWtZj;-}GBTV|A^^4(Yw=EkJ$ z_JM7!{=stkL`z|mUPsR#bs+vy-Kk`#E3k0#h;VW;vigThIN-ks8(wpa(%D;@+}Nk1 z60%(*$^%}}`YZBYstpD3JA-KBAhky0i0`wpo{gTn-6c*<27J&F~Aj52`#+!z>lNBypafI0XDRCkxN8_R5_n`>9dH~b-Icf zk+TW5M1s2MTy>Prv%h3N@kdFVcEnj5j6+8Hf;BP2RHqQ1_Nz0h*>1vliy1jk5%!A1 z$ws9^7f_P!k7~8yATSI6-B{Gz*T+kRL~qR;IAj ztNR>s;KRWzrDE+T-DK9~8(q|n4K}nfbDYv*Oq>s^qaTA5CFR<5$({YK9KY$Gbd5Sm zk25Zdu4&BbC3ec0Z7FFAS;SgC-H9};3$*@8ClBTA#N9%@*V{}>ycPjl7nK8DxoQd_ zL5CZck+GSZdZT zGii??O7qDY>2%L5cSB~(7QZ2~LfpR2!AIG~an zb8}{}X2dot(hGEpBtr^nrP*~61})AYoI+A+9+@OqF2<=s_p6U!ZGLzB{qCFq4pTmJ zyk4mtgONf!JI$K=9vSmNr&GLc8jQ|P94BJEL@bVT6zJY>mz?YF&Wpb&^f?4wuhY=w zJMm^U6B2p<#HYeCF$r5M=P0J6uUv9-ay-*oQ6+wsAv-t2Ql>+5=w04%HFA_#wRKlX zer0b+BVzO+{{H^BH1<(DUCz{~m4*a=X6WRKDAyGa)&ACWy(!orF8`LU&grJjJou);UzsSHoi)+TpMKRN4G z$pKcxMgw~mMnF?Q^%h^8<>LMnf_tg+ehwyoF<240_7JA zYQp0zr1|aYAU6j+`S=_G6RLNdyOtJsHLSx`65XH45uaC^A4swFPp;>hM_5S!(=ul| zV_bSi3`E0Hp3)k-Q-UK*)yaJ8+b!TdgAd6zJEd(V*1J(*fegIWSXy^Mg0Akwd%wCL zhL3t&ouXZN$IjCCyL=vbjFxV4>h>AnbFYonaLZic@*-%)uDrn(HQ+(&1~+pkQ11-C zwLWx@OPRAc*pQD*^~76>rp4c8d}?rU{DH7ryRAUc_AQ6EP8*4jFKfS-_r;~zKYJE7 zGzMgnn1}#ODq}ueLq6*+?B~$8woR7*A>#KrFm&toCDNR*PAV2_m$uFG>riG-G6*ZS19D@hh`1LmdWKNuM@Dix%gjhGx-6CO(SasJ?!tS9J&$ zj8B#yOosVC^gTrA#!+{whg0kT~mD=935qizWATGzdQga%~mWhCpXrp1> zPdkb#O|+=DFH&4PweN^uM>T6c+kU7Vhgt^R^d8=~5)~QGoQX?Odac}aWqqI&On^Fm zLV5(XF<$+;Up&X@f6CQK$!^XHF8#zpzap7|tpYmuC={D$=`~4~;)Z$Y>Q+8t zQU6KDj;M@3DB)2-HWs$nnRG;}b!>3PM(eq+`3>=GD#?`PU{D9wz0t2T8fg7_X>g@* z!o~3rzvpriO%)6C{C4nEJ_$wa&Mjxl&RH7on-)Hf_Zd%YY;#lMrpD#kG_a`(fbv?% z8(+tBT47FJ4X#ZvRXZcs9O%1fH~9WmkrD$0XzAq}%0jRxaS($RscbSZFq#WMfKu(X zzRM?F-7YxKZn3Mlhwl~icrBRPkWJpi+v=30VmOw2{iSoRwF~6>T=IY|8)eTbcmW6G zGvFIwL))khQ-%>-QGi#s2K7(aPX0{-Ibs#|UZ9N=?fyFX6iV2gc6a@s+Nsh5M$aTA`4~p0YuBB{ z`amRUV18Np3sNA1^YLoVH&1bHxFbV2JpyVkV>hXciQ;1`VsczG3tGr^)$PBcS>g~ET zI8z*$nw0BLIpL23@BOdr82Td_!qW>Zhq|D7tpWELZF-0TZ zPAhhG(WwXpuo!65zEnt6Rz|1-zfNECQr`6!a=6%y&9@&yeI`%wch<~H@}Ov94+=SI zuCeP}2Je~n#kz=no+2_JP0p8oqXvd<|Gv?}_$9Gry=?VKl3s9bhaFPoo|m1uv+b6!&#(V^NJsZpf08dl2QWvucThQlnF+7B?i(rnn2@893x=_B zs^kI23qg8IHwO=hCkc`7s)N zR1T_JfCK++5{QhYfDNb}s!(EbE+W1Erli4x$6AZj(vIXOxx=(>bhNl z9?S6!IY`2y<8QLJ8F!c^LHqUJZ1^%}t4J8S@7ubQrj?K_-V4t{*txDeLGu{iFy7CQB&=bjkKDq}mA0;+{0AEQcz~dd&q^9y$FHOE8a#%;oA+7#-W@%0|%dfOm*V>BrV$ER6?sTuA?G*i_ zOa5(}0s%7Qpg`Yl49VAVU%Xp{xc5qHnq^LkSZ?GMpVn>3M=}Z-T};JhO0A=BE(~bq z%_Qv_=2&C}s3M>A_pHJTlFQW8+(q8G3mM5o@|rPc_HjzVplG=Q`Y#cfq*p^h)k(Q_ zB_>T{SZ1#FNL*ogZjZ!{F))!&Tas;h2pho%t3P^)-Pj%g$XISKo-M$_Cla$t>aN`PB=Ow{d4LCU%8^W_Rnd#B_Ug?Rl zK0buvOj|Sa3Y920<2`^069f^j=>`oWJR*YBOKlm)$+>q5q{K*{&Kj&=f&G)Z_Tps3-m< z*75ek+y82UnA*1&0u@J`PN?!m^sI$%z6kzTDgO=MPqrS-fx%clBkc!D^s8%ob8eFE zrAd&_P$P-yTiXMR6yb2w*`!#;yfi0c5oQ+1m=SKmxI`g2Kc@YmVsp1Vq*!5z$d%n= z$Jt0Jos}I}Q3`MkoSINhZt2sW$w|i}L`@IL)L3pbCvv0o%FR;CEbT%0G*I9E$LDBk z5anZcR(M5*w?^#?2Q@WF+FC4ZLa`2>Wk82y`Bc=e(g7>0kQ&~0HtyVc_Z}Fo#SgMG z+e(Y-Gp+U&QqmW<0k^L^$y(i4E8Djf|M2GgCuhzElKl&4B%&bp8xWo_Q5~sG{q?Fg zKERcC*|_51bi_iuHbg(Fb$O?-JTKAc4&-ayGj|)2so($QXbY#U^dES9={SkJ!%djx zTsZa1zfAhSKjO@Sj-QE9VTf382w*vwx{^btPr?WL!8Vq3ukv1g=bv1i75WS8h(Vl3 zo+*`MlU-nZg0JVp^*8;Z{|*oj1lxrQsRZ0os#i=dis>-Xww$J9=Yin4&b5#`a~|;k zAkezj)T+yr>?x8t64JTm{F6@MM9n(h-F97Zer`7)Q9iqAS6#N0<^tfo6h7pPs^AFi zS}yfm7n#cP+PmS3Z}9<$5 zRla|90}6(OMP6uDCktO|3lnCShweeukgr$UgYqA=^1rmubLr5m|K`jL&n~s}UG@o6 zw)j|}*JYRCy3$jUDGu%T^yH{{F-uV&K`D|zMi3PwMD@JGy*!#oKBGyO+}T-o9o@^& zd|E?v7s}*i@v~_UTs=AE)>&tHDVzLX<}T#WTB5a6hV?fm)HKpv;lhUd1}f$qDfCc- z`q};rHdl!2(|`cKgD$b29yz7;=yXsWP~K~(lYR9R45+OOYqCMQlYBO!z{ZvK+9kll*Fr_ABIu^9zflxOaF6b;e9 z5L?Bb)gj6>U!uyU4TZ4bdoccEI3J9i<~IV%?Zu^;97d+ll`MlII^ugCZN2>pR@Skx zdOLiRPI8agt}tVx_xadyWGLOmpLA!;7DS$V^ZGtJiXH#$z^?!Sv=D53qLc{V&<6FLMd-Z&G;4iIPplx#t} zK!#^3FRWqF4~~SQnQzd97M)7pog$|pbMo%0P8UQCSL+d^X075o9n3DHG2`$IF2qw0 zu*8`Dbz73qEYl<{S(3!B?{pGtl z#M-ZO)1LyE@|;AlEmpgxtrSv*i{&&d+;G_}=YVG^?5$z!Rn>C=-ICqy-WHDhxHOt^ zn|IiVt>2v7lFxP|>=6>BxMHBn<;(qY!78Owb{F}q5UnCFTh~%~B`#W*f3Rf{RIIR? z-~+xD9QvEzc~$R9*TZCJ`l2$)g3Al41uYG<5S9Ffbt|gk&1P9*S`A;w!Clm0_@g(;84%HmpNkJEo960<)#Ax-Mo?J;5I7^UX5kR ziz?V{Mp|cRoGviY36JiBYCA=l`d+Q z5I112?qaPwclTVDy#5`tJs}y#%nsSIGJB3R;C zlpNZCvW|4Nq9oL7zK?nn+@&={s#ph4?^`lpaXpo5C#Iq3 zi%Qm?Q~@h+@JH{-cVvm#J=*VB39{daiV~<`~^@WR|G808eg}{w=N-_xMCmwuyes_&IY4KTno0amAF~n zUcPEoUH__LE~z%L>g+CKfqo|{`pclPYGL953s40B;W-sAip{C@m{hP4bY5yNbcT9~ z*v3CL27TT(dh9&FG}z_53k@ktVX7mYA_E>4Jw}y3RU;6LI0~w6CI?Tum5@o+T=ZG+ z@3y+hCkkC+40Crxi_d+11jqu!>jf`eWjC$A#Hq{#%}o19=@bEFuoTH;g1pnR#F`5~ z&@^=GV}`zEL3lo^d_Ps@VvlliiR*;PI8pNYb9eEC)>Lgy4pN)CrKI8MnHjPWl8*N4 zy1q17qFFz$>$_|@G8}DGWOG$kvzE(=3B*8Lm$Rl?i;R!G3K*`NDMPmyyuKP5{#?cs zA&3rFNASnVPWI!v!%@r?NCwlZTu0~1&d&$GI6cUKQPxXGLq%vtZvdh-hF2WiesqD9 zAk}rxg1u({3(lQqrhczn zX3|q%T@3`c`)VN4IdPXC)4W!H3DG9@E~q?8ZV9BJ0IW7bGKu0|uf*dP&JryQyy$l` zW^#bcEN2ZSAG2mir949JJvKiSha_RLtZR0kbFy5|8=|F$hvIGRR3KA#fgSyqZG(h6 zGqBbKqrPS-gQ=28!_(FU3*u?rGav_;Qe6hLT&Db*Jf=qhMx4xsdMQZcMYyncJWNaP?Qs+UZ&zv~^@(CXX{6L9Mm(x1C z?-ogaa>nvddnX(Kp?HSy3dJM46dIBVW`YQXn5Ky6;FDyV;t&T$%J$*ah86Je?w&K^ z*`4l*`bcxP;_uGP?oG%qIHYoPsz6No;z$(JCoU3sU06GgE{Td`b!oJnTy3*eZ<<7r zr-9F~6{aD1U?5i)n8bQByVTTV^pr*&31^ny#3HA=+H1!mPyTTgkyNX$4in8YVrGV8 zjPtDuqk3%3(d<^_ZD_Ov9~>)+GsyuN9o}Zsk6u7O_UX4UOoEt0R>MR|pxM1?e^p=` zS6q>*qe+)QsJ`yQ64wrrrd?&DRVITJq!9;t{{IpJodvEEup%QKJa zCblwnkiagYqV6lprKys<3=iofy1KmRW2bV!`=zk9*f_Q+gt?H(#R`h0c~Gh6LnSKw<^PQskoKV0au`lQ&1x6-_-#l#!sRWomgO zv-)`A9Dq)!=&^sC0MX6K5pz6uFkG!+;h*x$|E^14;}-pUC{O<)J3CTsmQ-Gh3Zv}A z>zy9n-(h0dvLN(MmL@!pEO0YB4E2+)6i+fNA!<^d4@!)yfp|Y%KlOtGUNtIs<{A#IEIaX z6Pn$*)%}z1Wd2Zo8Pdoc-NFb;Te0U8cHUj|*|y=R6HOU}r!fPI(b+Ah&r=a*38uCLosyg7xV2xe%%y+t za}{><41=bE5|iE)h~=BVbgZlS;p# z><>*%7=~&du8@k-wrgW3kWy<@5yx=Usj;gROS?};H7T8)UjtdH9xXk!6jMu z1Z0au#zVEijzzb!rwO{HS%#-i70++Do>fgE5=IF3B8zfvpVfRUk{NowJ$s=pjhUHy z%#&dJY+ASfu~Yk8kBORRM5oW%+1*3N#6)qT{*6a{jc(?Gd_iX0VJVZVRRqyt+TA zbUekRc0GwhZTI=UjCIfC_rl3!gE!|VvN*Kf1Ja|6>=8Z%UvDL}DqW++F7{+TIwD?B>&p;F(gzQXPC$b1fGorZ$;2 zB0~2A!OwsA*aUnVC}H}90r|Y%6y*az8ebdmJV@cx#8n4y5=WBJ59lEgnvcj)sgKy} z-_U&@AYaJ}NXa=H&&A>_5T%`o+hI?xm>jO&PF?<%^?vTmf*rUjcR*JuBT=k5T!a6^ zL0r~-KH<{_fUoq||M6zw!jU-OH%w%`^G@B5yEXq9|8IRe;dsp1O+^)K^&dTe6=0%ARq^4FVhO^XHLQP5x7)b=Ax=q5U;38y<$}a=i zWVg;)@tk>${n~Gur>ql3e4v%8ziGGO4#*j_mi>Ew4KzAEUtQ|r+`o4mxXZO$HIKDU z8KL|w5Enlpv2RpG;W`eS_-p>Z29ERp{{zAm!sjBW;SeVDTlDnR5lY9MxXElQF9k z>cfK&KdyK1tmbo8=YH*w2k$T3-k^;ZfHRQpC0reM7aB`IIb}T(Oc9%i`j0<8y5RSr z?DJ(8aWEs-ApHmo0-ctopyt3^ho7_EIs+$ zADPzBT}*O|4>a}f%QPzTnAal}jd_MrR`M90IyrI5_!#4Im2PHDC;8i1Kk4P72|%>o zfhRJUWiUZAr%tnSX3SopfL}f7w`eGZHeMv@O(+i4sr5T-I}oo?Ts6hLmzwKqCe4zo z!(zCYLOr*C&%7v}=DLtK)rD@!r@GKbVbif;K^h17saQ|nwz4;9AN|A|6sNu%>C9DW zUo+i(96|L=VfJ63R87!a2fIh$y^p%qtouH1VdH;o~@ zbv3mh0|KnqglKmcaezN$n6q7=zT=g)%+5V0!ac!wO4e6i$oITUr< zduSaguOh|Q3dL8)u>GWipwtw`W8x`~x@T(B?>Jf+C`A-^R|;zR_(^C(fWzvR6A`|i z7)3fBQidz|gL?T5WA#sEyBDo37BtFgSxId$Aa{xa`yo}$fK=X{m`!p;A~G8*`|IL4 zTsCspy=)xtO`Lab_SDx`YYLwpYGbm~=&xjHjTrW^JwKEU183`U4u^YsIU>>_ST8xQ z$%*#PaTUE2GkFyIs$vUAw}?s;{WoU0a=bzl(SuJ)wR-dB;CzovB7@gH(k=16nweGB z?Mk8j`h4Bf5^Vu}l~c3nYtaVMRPeJHZ@ZK;;N@JD=d5hOgUY3S?;~ZIM6h>^%SBg~ zCoeb;l0c^F27nLj6L+s##v9`$KDisd1!0q_3(r4UqoNri(RrGxDR~|!H_l3oC|c0m zE7Z$7#&HIw@G-x~DJ)|)&JM*>qs`o_9(aGz0gJ;BZcsm71%1LhCAkfJ?;I~NS}z=u zTX%+1nQvHJwZ)~6z^K^-c;>3)=?P51Irl~LfW(ZBf-5ncH=Yr~3zw7z`oqf6(}0mT zgfnVw#^~$+gy8>OB0sd@8mda=Cmrm=qfc(I{Jzi%0)f$Cl^^0&rM>po6I06?}IO6er`feWcnWK-(u@kh14%_wPI|T!7aL zHZK7!IHA-LcLV0ecYG3aC`H1(DC2X`qRYNr**n(Va+alf*olz2@&}0fl$-^g7x#za zbq&(Bt%RHzuR$xA`QbnisDUs$v2azkLzWYYa_%f*xe22@uiPr~;FD`n*C0fG<6wE^ z3^DJPHA@YxCS&qU-X4dN84;TiYYwrz0@kd9!(o3?ODW z+OL6|^+9j>ZY6!UIV{MbgnvBeav~@)e`-CAi5`8pIeJKMgkKqsIm7Pi25?i$C$eF& zgQ{kDZ1n^{R0&xw11P^K4wMRL+%!2$R6j6;0v$Svtv3c~ZJ{d(@gf zlZi1!oTdm;LtIBM#`xC-hfb}WYLLTUnTo;c-+!E5P|YbA6QvH9Ow%ZAO&C5|E9R z@9b*JGW`K90(-CcqB^scPmld(-er~!2!-mU7R0Hf&fm^0v?>KM ziBPe!0rrnpovT(_e|j5Wp|*cJ*1(gM@ti)u2>4CfbgU9RIFaRbcQyQ+&f|<+&8+_7 zenzdy@Vq#Ma!HVy##l})2sAeerg-i+!8Qw*c02DWk1jJn{Ge2W3+vp~P8;kHcTZg? zUc)G^N`YF{obi@)xSlpe(GKtwHOrOJM7iv)4~7Fn=}`q;p;Mo%C)RTY9)(8uV?w)} zqn`Eve4=C`-mA3gbk@)~1*D1X6VJK2)ZLIW<1|G9ce8FaJCdwbm$xF{cE0~LMnRks z_(h>Y+BSGI#und~o=7n35-`7^SrzKeCxb`S%vHTUH`68mILI{xVT?(0>gm3QBz;e_ zb9qt=n%J?#uB^P6{_P)Dlw(z#|E_Bq6SS4Vz7|O-9)FJqLAurobF6=D?5eTwW|jro zcPj)Cr6?S(v$xykw3mIZe>c3JCVkJXMq7cMAzIXZ??8GWK-lmvtBA>Tx4$9v{@SEx z5w>zJUd$P_zjcBQs8JiOL9B|Usy!e&53uGwK}};i0lJrc(h+4vZ*&_-NQRlPxM}il zUY{=~Lr;Hp8C2?&Fu@eY$d{*uw3_oHi!6gD!Kt2dNankBbj3rrI}1x@MOd7qANP1B zH-4S%f(yxD-VnI#eq%ng!|W~8e^2p3%f-VQH5Ahmo$Cfz5}DGY7+Afssd|LhZ@Crh zy(|i>!&_b^8AshfZwa}GxrAbao3ShKF(lpGXirzMk8ua=i~n-EzC%{0zfY899|r}V zsbU5fl{B|`*fCGrcw&~{T@-I?K31KNZK1k>luA=y-2I1X{^R9{k=8oqtp7U{?cC-! z>Z{bcMHbb16ZJbB*pgelfB53cAnYa=k4;P~B`rSa69jJEGg^pZ=E?sS0pXi?iQRZ= zK<6}{QIEfDog^&~me9sWVoP4M6p~&{5e{xW)~}09awFLpxX?~t>xmoI#Eoi7%&wRG zq~qZ}-8zDyUrm3KynrBbKBY8Aj0U4GOrAKhC9v!#%X_*)+`Yt&DuTrCGZR1rIA3p6 zn{8?li9E)Ei)jF|D=X}Z{`r5dXhCHU6NS92ph3xVnJc7BtxB6kr#LmHre~*Mj265> z@CB;n_OhowM-bj(**zdL`C@M0E0fUXD9zfI$S9<{U2ROZn<0r*E;NNG52`avd52Ek zXFk=xPTKj>I^)ve>8fecVc*$_)`UJuhH8UYQQA>;Gp`{kMIQ zE#hP-d6*w&d`?tnl8jrefEbG)jSW2uJ zF>roQxppZ6!3rnPw3is=Hz$nncqSvIs8!*gbVOW!>&upen@yRZBtei@$RxyF{&tB2 z>*a53@{F<=wIEPCKZ*_4k%OUwZr}4izi*FOK7uQ1C-8DqouZ+Jf{3llJ1T)Y%m=?% zf4gHYT%mbn$aej}DP0A2%ahB5R+u_k}tXD24lXgwEW9Q1`Tk8$#wHYNW>&m?> zF=89%WXyBNeZ`M69>emy;#^i)+Q;m=2ZB$gJa1CJQ6VB2Oxj{*ui*EO#k=n*1p?&W z0Tv^HaHh~P5R&ymw8J3HP70&-#2V6X=f@(1s1Gn?Mb!o#^^Sp7#T`l86fw<>|8g`$ zw~wH=KK465{*)XmPK4rR#(9dJ2kZxy$9+z@g%-`T*)j=rk;~}pP>=R3EZQN!Z)PCe9b@4wss4c1fBerI`(ke zvoY`?k?#w$b4ra_QaK(zb|)0&S2L80iH;uL=WQ;;o~{^o>o(NZ{6js^`1=3C*MA$m z{SOtL`70Ndq$GheG{nI~X0#t|vJq7mh^5J)*`;bj)kFKI2ee<`SHT7u`bO1-1% z9O^9|80~$8wRdNCcVwpS%R}Uy6w>|0-GH7UDEqLuH&4))-VG0dVB7II@ZijM9BTlp z%x%%Y7(C~=7OxO!W_}5Pj^vn5%WnEfC%hU-<^4<3)2__nV0C=pqUW|&29;V(tJ$LoBUl1(yMd2 z3TtXM_CEg2s(j7Bhi6){vObGP@Tjk-WcYBG(xgdu5y&A!@X449Kyn|*597CoO}t#E zO4YKSyNKLS-st~9aeTh{`}@_X{=x8Gw>it)A)1=njHSdS_tn6g2S$Ii9Z}3-fX_;H z*xgVzol|(2rc#Xi9n~iQCdsSf_2evvy2e8yg7lJHdp!4*_4@jv3tVTJuluJV9KUI7 zMD=QxTugats`rWV_p>-~k)u08bO~Nbo|dr0p-e*lZc@?Gl7Bc+5T8{pUxxb)O(usg zMt}StaPU9!>94jHPEJX#7m?~Tw5?b9X^BLBX9hNkCZ7k0){1;LbbQ5-G@vSvwnnX! z;9404^k2(*nP(_X5P#rA`}b3hva?FbiPmObtOnDIU!M5*DMlf=CQWB(ZP#X`gl#ot zqtc>gdH_a^-%G7y0v)G6WwkM9bS>P^jX`Sh2L;x`M8{+*BSa=<$O#ZZ`z_(Pn;nXi zQLWBQ`!{j1cW=<0fCYwt_J7hj)dgu2pboH>;l!Px!`n}Fn|-dVKm3=(JdvMB!`9k5 zz@_j=ha41{Xmn@j0ai^vRlKpq(?Zwby;Rqvf6_G2T*k7uy;8X;Md*sWtp8Ji2!tJi zol*ZweOl6#yBn2R$v0=~LD6L=m;4SA(fq}CKz}0G!N|y?r}nZ=e+Kvnqk(#=vq z)tK<%AwwRe7WAjCaS9Hsm6VHW^(ZayvNs z;$1^qp~y;6PkhIu&7+OSK`}t9*8$8B#o3wr`X&Z=mU!;|`I58i6(58h*^ze2E#HK% zR>YXa=ogkD)xAM3Qqtu=>3;u~W&(tJtgiFQaiU^0bc_a))>E)rJq@)mHHx~P5C{@^ zRrsWQLay6n^D!+t>u=8o8WMFf{H!wb$oecFa?B}y^10V`ylWbh@}@_VQw%ArWX(%~9|Yb>ORP9_XfL@ zrCT_IP|Im_;90jzh!|;QD77Tmv|11x4LWCBGCv`ko0HNRb$Z!(wg3nG%fa)@6P=h; z{oL6yB%)`8I>i%k#kkTwYROa$BAWNh_>)z<^&eXyv~u@OqLb-=gl_+bN)L@`D%>by z*nt<=eA3hGy{yAicp<(eb*X5dUA6t#ams=!^JZZ=t8t5Wx>RmT#HKy?&{xBl5)+{N zjD#!ebHYsHV#E=Qm-koyU{O5tt3SUpXS~+I>lNYFD!n14!#`i;Y+CmaSg@Hxrn z?oqwH@{_LSxZckBpLC449|s-hC!P^B)aq5|zISJuULX}(ZC0fTmjRC;uf~8tghCfO zUn|iLETwLoiKNwIhatm^2rn2K*0qwy z6cla7O~wDjhw0_Bxe2A` z5xVh#3L}$r?Xncc$)&zU+}I==(`0eZ|hP;K2UG5tBp8U&}8h zSvv{XyEQ+hf)BcJ$4J2xQ|?Hlh(a!v&{L49WRgB-5VbwFi83`Hur}NN-Jslmls?zS7Chy2#Nc#v(pm>RaB1I!kexLd0e=h> z;GAF228R+RMkpEFg52cCSv#Nv)m-tt?JNqCCdrgUn);kj3ASj1zaXQIqMg25?DlACul=+F zHwSS58wsoZ5%l0Pf`8?8itO&=!Sw;+O%ln`keR|EkZ@E)ot?!GZbT8ah*NZQ}zCaX@ND1m?#wn?37A0rR`-H zvL|>CppRJj?;~EZBW+LzK2_DVDittZX9I-Y^d+;h^Y=9`a^+2WL;KWQn#u2t>7V zl2WD{Ulvr#Te#rOJ0(CQW{Y0{V!Gv}wWeh1(+>&^fqEtP@D@hIL@P>7IDC3a-Ne!C zCDk9v)q<13ke5^Wh`yD~5TEH)Xy(sz|c3houUiHFx{q$NeCregEvP)Jq+S+A)0 zoyNT5TXe$i(Y_#lOg{waE>V*~hxoe`Q#^f}5QGgTDqPe6Qho5yA;GR6+HMk|%EPUi z0|ws@4h<{Kd7J7mFbMJ`TvJ-#O-TZipQw;I@X^)6)bwYU{4pV-sR|P6WBV1F3@(){ z?V)QQWZphJm)@R>ZIMqk4)SC#EJ|t~d<6m;=#!^&6UacG;6r&6*Seyxmv~%I?2Q@7#X?WU(GCZSAzyjL+_p6*sOb5S+YBei&lOcBkj5sYMwvNT**W`87~olSRYz zu;~$_r(H=7L?xl#M1F6dgh)$?XHV{0y=hI8#y*fEF)QZH4VEhY=||CL_{>A|BWHlV z$B_5PTVn6D)Ic-5Xjs;ggK4M`1ptb*hL-nP8~LsPj=eCRXWNpRnF2y5$3w${9>ip# zI#%;gbCPqo_&YW6|Kz-H4E~}GkwihDj4BwIkypb(&QUEOb#=0+7t67~!(+(sbu;&l zPk^6Q8A-1aa&bbjMWukmt&*>m^OboKv>8*jFg1Z}i6uM8@RxpS+$=gPmG^A3zb8Nk zHyB)X%d)xj7$rM87yF-=_RqWO!2S5!o2CP8-X(%SYvLt}dV2;W<_L+#{bw6UH zB|RfwtO6~mAtZ3GEY}#43U*LXWeZnpDjBGS zWFYm#k2&eMLoxXQ+Uk2}oV>=~68}fLE(8TTg`If$^i;kR<2?(3^{&z#Q5W5SSk-{%xfu78HFX<=#6}jQa>zwG6kEJbSoe&Jd2)@raB> zm_Z+|3a*iwD#3s>GD1EJJ@hWf*DljYP%nEobV1z=c{=MvL+n?DL$>iMJwWNL_R z+`EKayInCKr#iGLvFgqz>NsVr%PMC6=6qI^4cBFGU1-Q?YMyDRaG3}@zf?t+rjQY{ zG)A2UQ0^~q>3prMUOPQ-uVBu@&j5NJsP40yPo?cN6m219z2`OIlOfh*sg>3oQoTQY zjbY=AX?<{Gd9HO?@Bh)>dxkZcb?@T5qmEq%kzSmklL!nYKmu6lRZ0>%Bb^{1p$Eay z5rklZ0YWcI3nT=j1Po2-9i$|5R63zZZ=#+I!o2T!=XXB*umAZlA5OmP>*8YXwf5T2 zexAMdy4Ssu?O@Wvx%n`)CZJbOC_->^8L*ZkFU_WiCC2D6Rn$*Y53)9vs&Yt?7nHikQT2TWku?Pp=7KxS44-pEc*buI-8 z=Q1c1K%Me%8M%Iogs@C2xhkpAR+3+Gb(EA?m0+jn?GK3POYxmzyuW}@DJ@=qR%3RF zwAMs~$g8O#a%A2`G-u(G)$BsoCicENOH}$6sv%2qXqnu$ea!P)% zxsmI}7;#_j1x?8$_gA~`nF9E>rYrN^py>V&DR5x(i;vm!D7EK{OXeHf+ShWMv*Io} z3pQ0QBY>7E_v@Thl=%H>dJuO^9G%+PGBL!KG2wGTlZcH>t6XA4bCYcdZRiiJK8g84 zvs4StrtJz*KqfO8kHklX?EoTT-zE*&n;4dtw+@IniwObqp`G+|s z%=9KV|2xIww@x$^=#i8P*?|Y-n-`M~Pgx2+V$gIA+HbyG94^EPoBNB@-S-Glx!Nku z+;brZ9GeFelf22lI2N1V;{X^%r}|wBoQkfr`O>s%1Dvi47GrL7eU)e-o`xX&2u4o` zS$!()XVHHXQ$8~NS2if$G{5QzpZ{wQAFuBU96$7}^*LgE`E>w=G0|>4ZG}x?Nyl%D;j z;idH=*6*5Guh}rwn;ohc(-;ek$fA3BoTmOM{MdmWu5O>uK$LqpU?4IiADOT3{5vzx zR=oPUwrHUo{6unB93VL(ear!973Vwn7&P?$2f9R*>_YKhY7 zCC#CNzvwLGX!{C}qEA^Y(cEZMDAa&oz$En@-N#)ZIE1x|idv=-o>JbSrp?EBUtoCK z3;x4?1zRM68S1Yy1?(yWwj5nlWcmAJuP`0@ANuQlxkCxscqrTZk8v~px*oRe*$j|p zlnI8U^FK9c#A;T+K~QE`q)r+G(emY_>EG(wmm^W(j>ZmZ(6(+L9@-)<$tO0 zpa(KTN?Ab>?iN@-C^TQai}A30MXp_WY57-?_Vt0*D3t;StHS_U#hsCC(7HXHFS-_j2$>eyoV>jI^-tn>X5DVQC~&e_ku&C ztkOQ1B}R0B=i}p^eexF_vX2I#wZ>vKK`0Z6o_C=;lFo4e2)MCC~)4^ z3DLu8o^TfFCxJP>xF~N6dTMlOpy%6 z=DeH9sr1i#2E6~fCC<9*S|%?ael7GRRX1UyL9eq;6^{6h| zdbl*Obnep9;H9%1M$7F*Sn=^E&@sK84!5MpCD)2zMGbmcvJIWe8CjlEFuAXF*!Pc+ z^t<*0Vz0IGZ&xBLMn~?u>t+-lqdvRP|64vqu<3$p)48VFQR`H@aMvtO+;l-C%#5 z&*9ns=yNo+OFfja?UQle{~Und@^B!aphxsYk`u3#DthQa|=P{YvFL$e%OiC;GO z`;}>VE(yAF)rIUSJSr3q+z()abp9c~znIBPw6h5oz0%bScL!cP>hsCa7zMMkHIW+H z|2pL5y|C_+=&NWisB9aG_{~N`fl5Y@;9$6z0E^8~=cQ~0dseU|$9wsO%Ux(wJE-S5 zu*um;=w$sPy1NW+2#-@0#uUOR^Ix;nKM?HuKxkHzmzR5O9=UYwTDE}ROlA-Po&nmS zAF(wjZTqi^RBqh^MeyhYvoyqRBZ;qnc+J9u<{a#gWF2dbMPIk&wPI)g!22nz@NX=) z4nrkU5niz%@kN~|7^qNP!)Fzd5%gy~B-3A*+>;d?)_9(X+_~@|$^lJ|;O#B23X&D; zxu?z-t)S%?@oH`9fd^ExB#`Iz$9_^H=W!IMg{XVC%wqF#gH-5(fMQZ)D3cI$RSg7m zlP8&HpS4f3zIMtXOn)Zhn*KhqK<>#TwkCra6`8kCT3K(ktBCE$T96f#!Qg)x^D`P5 z?AGjDy2UepsjK1DY#HAUqM;q95>{57Uv5f<<~GYZz_0l-f@nPbrh7c;%MR+Vi{oOjHC$yfS~Ye zEc)^5<1^fyg)HBk>#!3fdQA*Sc{ev?m2DA~W0R))H_~Y?>%G}(_)+biX zBvraI+dWkiYl*}-_22}ms#%scQK6yd>Po*4I!3DlFwMp_5l##zq6v^73FH{WyV)tm z)(h(!a0QSRy-du=5S2;eM<7ILveuAH>%4`_j%4#!SK03uwJ_tLEtRd6u}uLIPQYQ0 zWWqhlLdraySSyUvWV6V}1!{g|ha$(Xsecf?r!GI+9rIH9MBPUE1!GkQT(|!;7;5@Y zj*Yq01=EVcwJf&v>E$xe4aW-_QI(0>UIoC-5- zz){VZ6wFeWPg8lu78d)Fpvr-vJmzUm{*Jd!OWFO1>d>iys7r4S#*O$Y0^k0U1^O7* zkaziR~9p>T;&%r4h}BUO`iwO zd*W}|nH=bs`<+2?shZoqKhK1Gw+uYOwWVD_Harc5>}>M+o|olvt>{#KFe5%a<P}d~?${?h$c3KMruGNd62BshZyg5F|=pN#)#O z^HJVd8iF5;pm|`LnC1+Iv1>t1n*zT+E7Va#YMCuN#9=k%#XDci%hV~J;0VAnX;-5N z%FYHhUEL7x5N-E^9Zb{cK%4A4a3Bf|y7Gg}Nas{?Xp`(eI5=V{$9G!O*!)xfBf49~ zkFs!plz$S{N=);F9EB%Z`A+ea50|-Bm9w3+&ZYyoBl`>L8;e=gr(?y7w5Hn2r;+qH zN?zA&k&`9_<^#xgNd+^y0#e`?Px87i|w$>T_BZsb6y+E+2lBYln(4E(h>sZXnk=ksk;DjJkbpy0B4A%S*? zyFz{o77<_D-e`xifwj3Bz0Ip~le^{&0lTNE|2+>lXVv&fHibmR>1TBte1W&yh`)r| zcchJqs*E2Alu{6x`AfOU73E*qTMfK3XrUO5SNo$+yo2ul;5sE zWuA=HWjvU*q!pIwCk^er>W+tNrwY54fNeD3*bzU86C3b};PZT?8%dhfr!vx>5D=<^;%MLYS z%l%;fw{;om`h4KcymbD@F~(wC8*DK|htih~uNrd9cn8q}iTWaraOYYJfZQM$6 zR@4%HOPV|XGeld`<%*NvZGq*_1E;H|5W#@zAHTk9gr&vUK+cd(P~+-lsitlg7&Y5* zc!DXS9W@0dWn3+;^vxwbIk!Y89tq4J?aila!S^K+<;uBsgtd7JzE}}#S##$Va@C>@ za3n=K$ZSe;xmt+?=Rf1w&bAS`ryuxpoaD9Y*dPL~GVdxnFFuf!RVnbN7?&P|OBt~S zgcT|7|KlNVFVPb?wHq&0f6u zW9I8(yY+^TJ7T0zdpbZ6tfx>UCC6HxFWNERCd=SV-oVChN&Ta7F?>EgmF4pOuJcV` zE_?~~Be<0si&6$Q4z&gU=;cog5s*`{vAAeVRusx~?R=R%R-IFUMlL;u310|dtfl0b z5wYrR(^jdcAHB$Vx#HBGrKjFAcCKm{nn$J9EUraPGy;;V9tA%x$@TP1JPen(ujO^6^;+Nb445!fI z8t#k+`*b;XfEt?_FLvNo)+2a%JXM)5;r`Xah*Q)9 zQ0eb8>wd;40Jv%_HVuvSQgjo`%1qH8Zk-qBaDEIWm|qf`RxJ5Y_>9~+vzWDETB5R+ z4QY#h1FTLz{lL-V;QwEI?;QHr*DBwbd51l5IKV8MUolGO*a6RI?xC0inJJmk9ffW} z54wZmPtl3QT)w~q>C6G<(T3{UWZ6y4Om~G2DbqIL@EIbZ*DKMzp4xtO^;6Eee{rHA z&xwQtUBXR(6$U1j;Wdxgi9J$|U8@ zktci_S*Pa$|hp zFR*49C?YxE6snG_jEX|Xez)FtgT1tKx^S>MncwI7ed6GQxjxYkW+(jsW@i`lJOSYN zM5O)(2N3i1C$ew+L;P))ztVZfh7uR=IH0mC*c|&j#v(7--u_TaNt+Qk7?~=ul6dcq4-vF@j;xR!TE7h10_gnrlv)|i_9Xy zLn~<;IErazw|TQA-U*yd(so2LY5uHcr7ix9iLm??y{44hx$SK67^pY>iz$jqZMxqq z{T2QF7D|iMEfQ#KCXkO~HR4M%t^3AO{M0mooZ(0zTqEx;>MUKWI8E* z+oxn5hWRaYfCjqjkm8aU7+|A3kFz;yOI#P>N~%2`4eq&t#!*l_XsT7P7^^vB!xAPI z8yN3T$eCZbmYj9nFru?OXT5wB>MuT!?-63;jp;X4Yf^C@6UCEX!yp1C_ORcMos zIn_lOgfQZ)lnGf$>NF@GN+XzU?cV>bt=}OE0p`O%)l3(ZSpLC?!BI^ARSNHqm*8St z%v6x-0HF8KL*qBJ$s|%Cd9x() zE>ANT@tn@AAE=m#w;GSFhd$ikpd{fmzg!@xoj=ifWSIJ+ znciFAxWcZgx^4exI78LZbSfz!Dr~_fJi)2}E+B+0lAC(BAeAvl-H%?wEjQ7@zckyh zDgibgG_-5?hIb3-K!U0K9`dkStm;oPkoXqZk%Cuz4o^lf;1N&m$G;4xoHpdrqpqQ9 zG2B9qCI`4RU$`zEZFqVCd%E_1DsXCEDBeNhrZ%@-Z?i8VYoC-~H`v1%n{pNE}b6K+#0F?0Vq6sK><5%cfSTz=AG1{q}D$I?tqBKp{? z)!Vk;PS*h%-nXi$eLeNh_05w&zT36gjW_p#Pk+EL;~=X%`_y*&YouTyyaV3vSdbJN z>+3$PZH=F1muuA7r+6%Ep??h358m7ux2p&~{hK)lRGVj?RP`F^%zw&3XX-%|3Y4!2 zC|E$TwWQq&u_*Wbtj>4P>%<+41BykXcG&V8mlt9O2>5jQ&q$-P_MbALOPYd0F%pgJ zoWtfxX5ef`iy`&#I%H&hgzW*_;;n`bgS*=Xl_ICdgx&3X7R|<6*(8JD*_WvT)po$m z{MyT`WhER+FEt7#1ZTmM_%0|)$Lc^X7%?`mbQw~RP2!5serQsJsy4d^gi?mdhzu{Q zLY>_JCKKc3dt_yt**&k8xv?q?PL^g1;M+auhNM*%4vTA7bu1@NP(0z53Yo9=0sX?eXGXG>S9Azj(8p|40{_IYtQ`n(>J8}~#nHi9q#7W5qJ@?fZPe6G5HtoJ*K-EXUs^hr z554ENv8QlVR^VotgBw*1A9{bD_<^`sY=G%37%RdCAEn~$aYmEXjG9>8Ke@|XQ zvX344FbR>jjPAO10+z<(nSlP%>0QbSx^ z2K)T+7Tfxs@yM(0dIek8MOfMR!7@k1JKW~?(h@I(mpVOO5Wx?nX$kaCv#Iblay|~I z`pvL7){SAD?dr zk_K8+fE7xDgrJ#ts&)HSPGrIn!D&?WMmd$ynLtt9q2%=q%8RY`S7} zKLzq2*Trhs8sf)@Gfs_TSYRB&pzl3Jn**3ZcezH3$mSRI{UDCvUU{OseG8Wa6zmuXdo3T#dtD4+!xmn!X4!g2WNe)3RFyk!P_YYjqZ}86qiGoB?15-aEI^zxw z#8Wg>(+r{b3zerai_)oE-GwMQ2E@>ZEsR8T3-a#zB4T&55K#u&_i6SvdC#VKs`&#L z(wZdK3XkLxg`6h}~V=o|$VyqjU2@4bD8R zj~OitN}Fy^p+eVE^aY@#_nEtKc-`;7%HRJX-q^pgbBl=#4*!`{{{nIv6d0|6SyJkzj}EZy);jHpy<*r_aRzSjhq-h zAcSM}u4TqYQa1IkB)H=5U9;*IqD8Am?YTX%a&8XQdsdkW)OaXt5d_G7z3r3=k2(>` zmiKTOcxaXGqx_O{bpP+Xr<2HZPy2pC4Prt0x}v?d4$x=_?JI;U8{JT+E;4uE8&n?l{fZtkU+NT+7z!U z(U7n{NCdl)IMl4SGE@5Jk&4P~X{NVyM&wAtnf$LMNFQ+6Aa-F7n~0RHjs>D`04~I#1LiA*gqt=trvr+m8*o|FCSSzsgf6mcr*LKK|6C6etC}ov__{ z4r^xK6Shn-0i*&aJ~;l*%y$-Iv7D`^7J~tP5t2R z_*~{xCbZqWid2zywNP8}fH2S7Fc!Y?mUz~xZ<_s!Oy@Nt+rFb*lcJKc%xqGXr2@X~kMJqS6cEK*aQ{A0(jx*p21SM^G)SJo1s zqfk>*sM;i!Yfs;zA}sxQsY|ClKBuj>UZvCiRV9Oog>Hhf8bO|2a9u-xO_)g+FPx7# zFF}@nrUp`YYC=Y(I^_1-k8kU%xQq(fhEZfT6t8RJG?YZBY?2+X2H*imA!u9w?(^9L zwfX*>fh@HqYkVYsu)lzYUIH@=Z8{MJ4N#tD3QsB+iezRKW*hM2S{71sj;;2$hBU$Dr_=k-XzwKmB=LbU$G+c^B#~JY6}~;wG4^0q_xEOVtk0X z4PE!sgxiRiCvM%~D5YR_5x@PY5Z1~z(i4Uf2bItU+_OLE=lAvq4^!^7qA0$oHZEzE zf&Yhm3|Lr>z%a&J$uG5YZ(piKq79`2A5hn;Y&rD_}3iz7BPHLXH22rF~VeN62yIOfY z>&e3$FA=nMzUuOtUOJAFelZbVmD&{sSndCPm%wkQ4b#7m_i5gZTK-hc{W$o z$d7$vK{`@=>{b)fRknOOX=CGc%Nq{Sr79DCYEf9#>85?`7~%oL)BS9odiFq+zNyyL zwlYP<;(Rp(h&3d2{SwC6ipuT>#`s{H)(1|dLGN@82f3FgO%2O;_(IXBEx{r&!B#sY z$!K3m%7`6elKYfd-U|KEot8K^?UsBN4<)9lWbi_=I1swG$Q&~GkI6Esy+ttdfB=ul zS|w4rcTf4fx&y!?X9=fI(ezn|DjeZGhW z;g>qXi<)gJ^F38bPcy(|Q}xvyb)|)FA^*%UO~o^d6k-)ywxKRfw0N!zZA#^ti@Ad^ z#)u-y!)93XyHBW%tAFhEt*q#5vlJ_N=eq6iM{R0vmaGS{5b#>lp2W?(It(vu?+FGB zr0k|ZDsBVninBb;aQ6$xtovs-GWPO#6}J-5%Ca!lz`zR8oQF$2i*+FBFe8#XGA|z8!KV$Re
  • )dt@Ce~a6FsleR#P~)% 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 literal 0 HcmV?d00001 From 7135e821550d6feed06bfbc73754579cb49063b1 Mon Sep 17 00:00:00 2001 From: Jona Date: Sat, 17 Oct 2026 14:43:18 -0400 Subject: [PATCH 10/10] Keep header context clipboard behavior aligned --- README.md | 2 +- media/main.js | 6 +- src/CsvEditorProvider.ts | 8 +- src/clipboard.ts | 71 ++++++++++++-- src/test/clipboard-column.test.ts | 142 ++++++++++++++++++++++++++++ src/test/clipboard.test.ts | 29 +++++- src/test/provider-clipboard.test.ts | 9 ++ src/test/webview-clipboard.test.ts | 1 + 8 files changed, 252 insertions(+), 16 deletions(-) create mode 100644 src/test/clipboard-column.test.ts diff --git a/README.md b/README.md index 0eb4795..a2a2beb 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Working with CSV files shouldn’t be a chore. With CSV, you get: - **Smart Column Sizing & Dynamic Color Coding:** Columns automatically adjust to fit content while being visually distinguished by data type. Whether it’s boolean, date, integer, float, or text, each column gets its own adaptive color that adjusts for light and dark themes. - **Sticky Headers & Fluid Navigation:** Keep your header row always visible as you scroll. Effortlessly move through cells using intuitive keyboard shortcuts like `Tab`, `Shift + Tab`, and arrow keys—just like a full-featured spreadsheet. - **Efficient Multi-Cell Selection & Clipboard Integration:** Select a range of cells with click-and-drag and copy them as well-formatted CSV data using `Ctrl/Cmd + C`. -- **Clipboard Actions:** Use Ctrl/Cmd + C or X, or right-click a selection and choose Copy or Cut, to copy properly quoted data to the system clipboard. Right-click Paste inserts clipboard data into the grid. Ordinary cell text is copied without surrounding quotes. CSV escaping still preserves separators, line breaks, literal quotes, surrounding whitespace, and empty cells. Clipboard shortcuts in Find, Replace, and cell text edits keep their normal text-editing behavior. +- **Clipboard Actions:** Use Ctrl/Cmd + C or X, or right-click a selection and choose Copy or Cut, to copy properly quoted data to the system clipboard. Right-click Paste inserts clipboard data into the grid. Ordinary cells stay unquoted even beside complex values. The final append row is never copied or cut; real empty cells remain part of the selection. CSV escaping still preserves separators, line breaks, literal quotes, surrounding whitespace, and empty cells. Clipboard shortcuts in Find, Replace, and cell text edits keep their normal text-editing behavior. - **Grid Paste Support:** Paste copied ranges directly into the selected cell/range with `Ctrl/Cmd + V` in selection mode. - **Robust Data Handling:** Leveraging the power of [Papa Parse](https://www.papaparse.com/), the extension handles complex CSV structures, special characters, and various data types gracefully. - **Theme-Optimized Interface:** Whether you prefer light or dark mode, CSV automatically adapts its styles for an optimal viewing experience. diff --git a/media/main.js b/media/main.js index 36e6ff8..0fc03be 100644 --- a/media/main.js +++ b/media/main.js @@ -2092,8 +2092,12 @@ const copySelectionToClipboard = (cut = false) => { const bounds = getDataSelectionBounds(); if (!bounds) return false; const { minRow, maxRow, minCol, maxCol } = bounds; + const realRowCount = Number(root.dataset.realrowcount); + // The append row is an editor affordance, never clipboard data. Consume an + // append-only gesture without a host write or native empty clipboard copy. + if (!Number.isSafeInteger(realRowCount) || realRowCount < 0 || minRow >= realRowCount) { return true; } const matrix = []; - for (let row = minRow; row <= maxRow; row++) { + for (let row = minRow; row <= Math.min(maxRow, realRowCount - 1); row++) { const values = []; for (let col = minCol; col <= maxCol; col++) { const cell = getRenderedCellByCoords(row, col); diff --git a/src/CsvEditorProvider.ts b/src/CsvEditorProvider.ts index d03c157..0846453 100644 --- a/src/CsvEditorProvider.ts +++ b/src/CsvEditorProvider.ts @@ -1476,7 +1476,8 @@ class CsvEditorController { headerEnabled: treatHeader, firstVisibleRow: Math.min(Math.max(0, hiddenRows), data.length), mouseWheelZoomEnabled, - mouseWheelZoomInvert + mouseWheelZoomInvert, + realRowCount: data.length }); } @@ -1731,8 +1732,9 @@ class CsvEditorController { firstVisibleRow: number; mouseWheelZoomEnabled: boolean; mouseWheelZoomInvert: boolean; + realRowCount: number; }): string { - const { webview, nonce, fontFamily, fontSize, cellPadding, separator, tableHtml, chunksJson, extraColumnColorCss, nextChunkStart, hasRemoteChunks, headerEnabled, firstVisibleRow, mouseWheelZoomEnabled, mouseWheelZoomInvert } = args; + const { webview, nonce, fontFamily, fontSize, cellPadding, separator, tableHtml, chunksJson, extraColumnColorCss, nextChunkStart, hasRemoteChunks, headerEnabled, firstVisibleRow, mouseWheelZoomEnabled, mouseWheelZoomInvert, realRowCount } = args; const isDark = vscode.window.activeColorTheme.kind === vscode.ColorThemeKind.Dark; // Build script URI using file path for compatibility (older APIs may lack Uri.joinPath) const scriptUri = webview.asWebviewUri( @@ -1944,7 +1946,7 @@ class CsvEditorController { -
    +
    ${tableHtml}
    diff --git a/src/clipboard.ts b/src/clipboard.ts index 90a1c21..3c934ae 100644 --- a/src/clipboard.ts +++ b/src/clipboard.ts @@ -4,23 +4,76 @@ const clipboardDelimiterCandidates = ['\t', ',', ';', '|']; export function serializeClipboardMatrix(matrix: string[][], delimiter: string): string { const escapedCharacters = [delimiter, ...clipboardDelimiterCandidates, '"', '\r', '\n', '\uFEFF']; - // Keep ordinary text plain. Complex ranges retain consistent CSV quoting so - // paste auto-detection preserves their cell boundaries and explicit blanks. - const quoteAll = matrix.some(row => row.some(value => - value === '' || value.startsWith(' ') || value.endsWith(' ') || - escapedCharacters.some(character => value.includes(character)) - )); - return Papa.unparse(matrix, { delimiter, quotes: quoteAll, newline: '\r\n' }); + // Quote each value independently: a complex neighbor must not wrap plain text. + return Papa.unparse(matrix, { + delimiter, + quotes: value => value === '' || value.startsWith(' ') || value.endsWith(' ') || + escapedCharacters.some(character => value.includes(character)), + newline: '\r\n' + }); +} + +// Papa's candidate parsers can mistake separators inside a later quoted field +// for delimiters when the first field is unquoted. Remove candidates that occur +// only inside complete quoted fields, then leave parsing/scoring to Papa. +function clipboardDelimitersOutsideQuotes(text: string, candidates: string[]): string[] { + const tokens = [...candidates].sort((a, b) => b.length - a.length); + const found = new Set(); + let quoted = new Set(); + let inQuotes = false; + let fieldStart = true; + const at = (index: number) => tokens.find(token => text.startsWith(token, index)); + for (let i = 0; i < text.length;) { + const character = text[i]; + if (inQuotes) { + if (character === '"') { + if (text[i + 1] === '"') { i += 2; continue; } + const next = text[i + 1]; + if (next !== undefined && next !== '\r' && next !== '\n' && !at(i + 1)) { + // An incomplete/malformed quoted prefix is ordinary external text. + for (const token of quoted) { found.add(token); } + } + inQuotes = false; + quoted = new Set(); + fieldStart = false; + i++; + } else { + const token = at(i); + if (token) { quoted.add(token); i += token.length; } + else { i++; } + } + continue; + } + if (character === '"' && fieldStart) { + inQuotes = true; + i++; + continue; + } + const token = at(i); + if (token) { + found.add(token); + fieldStart = true; + i += token.length; + } else { + fieldStart = character === '\r' || character === '\n'; + i++; + } + } + // Do not hide genuine separators behind an unterminated literal quote. + if (inQuotes) { for (const token of quoted) { found.add(token); } } + return candidates.filter(candidate => found.has(candidate)); } export function parseClipboardMatrix(text: string, fallbackDelimiter: string): string[][] { if (!text) { return []; } + const candidates = [fallbackDelimiter, ...clipboardDelimiterCandidates].filter((value, index, all) => value.length > 0 && all.indexOf(value) === index); + const available = clipboardDelimitersOutsideQuotes(text, candidates); const parsed = Papa.parse(text, { dynamicTyping: false, - delimiter: '', - delimitersToGuess: [fallbackDelimiter, ...clipboardDelimiterCandidates].filter((value, index, all) => all.indexOf(value) === index) + delimiter: available.length > 1 ? '' : available[0] || fallbackDelimiter, + delimitersToGuess: available }); const matrix = parsed.data.map(row => row.map(value => String(value ?? ''))); // A terminal record separator creates one parser sentinel, not an extra record. diff --git a/src/test/clipboard-column.test.ts b/src/test/clipboard-column.test.ts new file mode 100644 index 0000000..22c8503 --- /dev/null +++ b/src/test/clipboard-column.test.ts @@ -0,0 +1,142 @@ +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; +import { createEditorHarness, createWebviewDom } from './edit-integrity-harness'; +import { parseClipboardMatrix, serializeClipboardMatrix } from '../clipboard'; + +const select = (view: ReturnType, start: any, end = start) => { + start.dispatchEvent(new view.window.MouseEvent('mousedown', { bubbles: true, button: 0, clientX: 100, clientY: 50 })); + if (end !== start) { end.dispatchEvent(new view.window.MouseEvent('mousemove', { bubbles: true, clientX: 100, clientY: 50 })); } + end.dispatchEvent(new view.window.MouseEvent('mouseup', { bubbles: true, button: 0 })); +}; +const copy = (view: ReturnType, target: any, route: string) => { + if (route === 'copy' || route === 'cut') { + const event = new view.window.Event(route, { bubbles: true, cancelable: true }); + target.dispatchEvent(event); + return event; + } + if (route === 'keyboard-copy' || route === 'keyboard-cut') { + const event = new view.window.KeyboardEvent('keydown', { key: route === 'keyboard-copy' ? 'c' : 'x', metaKey: true, bubbles: true, cancelable: true }); + target.dispatchEvent(event); + return event; + } + target.dispatchEvent(new view.window.MouseEvent('contextmenu', { bubbles: true, cancelable: true, clientX: 100, clientY: 50 })); + const label = route === 'context-copy' ? 'Copy' : 'Cut'; + const item = Array.from(view.window.document.querySelectorAll('#contextMenu div')).find((element: any) => element.textContent === label) as any; + assert.ok(item); + item.click(); +}; + +describe('Whole-column clipboard and the append row', () => { + it('copies ordinary header columns without quotes or the virtual append cell', async () => { + for (const separator of [',', '\t']) { + const host = await createEditorHarness({ rows: [['Name'], ['alpha'], ['beta']], separator }); + const view = createWebviewDom(host.panel.webview.html); + try { + const header = view.cell(0, 0); + select(view, header); + copy(view, header, 'copy'); + const message = view.messages.find(item => item.type === 'copyCells'); + assert.deepStrictEqual(JSON.parse(JSON.stringify(message.matrix)), [['Name'], ['alpha'], ['beta']]); + assert.strictEqual(serializeClipboardMatrix(message.matrix, separator), 'Name\r\nalpha\r\nbeta'); + assert.strictEqual(host.document.getText(), host.diskText); + } finally { view.close(); } + } + }); + + it('quotes only the real complex/empty values in a selected column and preserves every real source row', async () => { + for (const separator of [',', '\t']) { + const host = await createEditorHarness({ rows: [['Name', 'Other'], ['plain', 'value'], ['', 'keep'], ['with,comma', 'value'], ['last', 'value']], separator }); + const view = createWebviewDom(host.panel.webview.html); + try { + const header = view.cell(0, 0); + select(view, header); + copy(view, header, 'keyboard-copy'); + const matrix = view.messages.find(item => item.type === 'copyCells').matrix; + assert.strictEqual(serializeClipboardMatrix(matrix, separator), 'Name\r\nplain\r\n""\r\n"with,comma"\r\nlast'); + assert.deepStrictEqual(parseClipboardMatrix(serializeClipboardMatrix(matrix, separator), separator), [['Name'], ['plain'], [''], ['with,comma'], ['last']]); + assert.strictEqual(view.window.document.querySelector('#csv-root').dataset.realrowcount, '5'); + } finally { view.close(); } + } + }); + + it('excludes ghost rows from range and Select All Copy/Cut routes, and consumes ghost-only copies without touching clipboard', async () => { + for (const route of ['copy', 'cut', 'keyboard-copy', 'keyboard-cut', 'context-copy', 'context-cut']) { + for (const selection of ['range', 'all', 'ghost']) { + const host = await createEditorHarness({ rows: [['Name', 'Other'], ['', ''], ['last', 'value']] }); + const view = createWebviewDom(host.panel.webview.html); + try { + const ghost = view.cell(3, 0); + assert.ok(ghost); + if (selection === 'all') { + view.window.editingTestApi.setSingleSelection(view.cell(1, 0)); + view.key('a', { metaKey: true }); + } else if (selection === 'range') { + select(view, view.cell(1, 0), ghost); + } else { + view.window.editingTestApi.setSingleSelection(ghost); + } + const event = copy(view, ghost, route); + const messages = view.messages.filter(item => item.type === 'copyCells'); + if (selection === 'ghost') { + assert.strictEqual(messages.length, 0, `${route}: do not send a clipboard write for append-row-only selection`); + if (event) { assert.strictEqual(event.defaultPrevented, true, 'native empty copy must not overwrite the existing system clipboard'); } + } else { + assert.strictEqual(messages.length, 1); + const expected = selection === 'all' ? [['Name', 'Other'], ['', ''], ['last', 'value']] : [[''], ['last']]; + assert.deepStrictEqual(JSON.parse(JSON.stringify(messages[0].matrix)), expected, route); + assert.strictEqual(messages[0].cut, route.includes('cut')); + } + assert.strictEqual(host.document.getText(), host.diskText); + } finally { view.close(); } + } + } + }); + it('uses the full source count instead of treating the last loaded chunk row as a ghost', async () => { + const rows = [['Name'], ...Array.from({ length: 1002 }, (_value, index) => [`row-${index}`])]; + const host = await createEditorHarness({ rows, remote: true }); + const view = createWebviewDom(host.panel.webview.html); + try { + assert.strictEqual(view.window.document.querySelector('#csv-root').dataset.realrowcount, '1003'); + const header = view.cell(0, 0); + select(view, header); + copy(view, header, 'copy'); + const first = view.messages.filter(item => item.type === 'copyCells').slice(-1)[0]; + assert.strictEqual(first.matrix.length, 1001); + assert.strictEqual(first.matrix[1000][0], 'row-999', 'the last loaded real source row is retained'); + let cursor = view.messages.length; + view.window.__csvLoadNextChunk(); + for (let guard = 0; guard < 5 && !view.cell(1003, 0); guard++) { + const requests = view.messages.slice(cursor).filter(item => item.type === 'requestChunk'); + cursor = view.messages.length; + for (const request of requests) { + await host.receive(request); + const response = host.messages.filter(item => item.type === 'chunkData' && item.requestId === request.requestId).slice(-1)[0]; + view.window.dispatchEvent(new view.window.MessageEvent('message', { data: response })); + view.window.__csvLoadNextChunk(); + } + } + assert.ok(view.cell(1003, 0), 'the remote append row is eventually rendered'); + view.window.editingTestApi.setSingleSelection(view.cell(1, 0)); + select(view, header); + copy(view, header, 'copy'); + const complete = view.messages.filter(item => item.type === 'copyCells').slice(-1)[0]; + assert.strictEqual(complete.matrix.length, 1003); + assert.strictEqual(complete.matrix[1002][0], 'row-1001'); + } finally { view.close(); } + }); + + it('does not copy the only ghost cell in an empty file', async () => { + const host = await createEditorHarness({ rows: [] }); + const view = createWebviewDom(host.panel.webview.html); + try { + assert.strictEqual(view.window.document.querySelector('#csv-root').dataset.realrowcount, '0'); + const ghost = view.cell(0, 0); + view.window.editingTestApi.setSingleSelection(ghost); + const event = copy(view, ghost, 'cut'); + assert.strictEqual(event.defaultPrevented, true); + assert.strictEqual(view.messages.some(item => item.type === 'copyCells'), false); + assert.strictEqual(host.document.getText(), ''); + } finally { view.close(); } + }); + +}); diff --git a/src/test/clipboard.test.ts b/src/test/clipboard.test.ts index a3bc022..8d2eb36 100644 --- a/src/test/clipboard.test.ts +++ b/src/test/clipboard.test.ts @@ -18,10 +18,10 @@ describe('Clipboard matrix fidelity', () => { assert.strictEqual(serializeClipboardMatrix(matrix, '\t'), 'name\tvalue\r\nalpha\t42'); }); - it('retains consistent escaping for complex ranges', () => { + it('quotes complex fields without wrapping their ordinary neighbors', () => { assert.strictEqual( serializeClipboardMatrix([['hello', 'with,comma', 'say "hi"', 'line\nvalue']], ','), - '"hello","with,comma","say ""hi""","line\nvalue"' + 'hello,"with,comma","say ""hi""","line\nvalue"' ); }); @@ -96,4 +96,29 @@ describe('Clipboard matrix fidelity', () => { assert.deepStrictEqual(parseClipboardMatrix('"\n"', ','), [['\n']]); assert.deepStrictEqual(parseClipboardMatrix('', ','), []); }); + it('keeps external literal quotes and quoted later fields out of delimiter guesses', () => { + assert.deepStrictEqual(parseClipboardMatrix('left"quote\tright\nother\tvalue', ','), [['left"quote', 'right'], ['other', 'value']]); + assert.deepStrictEqual(parseClipboardMatrix('plain\t"a,b,c"\nother\t"d,e,f"', ','), [['plain', 'a,b,c'], ['other', 'd,e,f']]); + assert.deepStrictEqual(parseClipboardMatrix('plain||"a,b,c"\nother||""', '||'), [['plain', 'a,b,c'], ['other', '']]); + }); + + it('round-trips diverse rectangular matrices across common delimiters and within custom formats', () => { + const values = ['plain', '42', '', 'a,b', 'a\tb', 'a;b', 'a|b', 'say "hi"', 'a\nb', 'a\r\nb', ' edge ', '\uFEFFvalue', 'a^b', 'a::b', 'a||b']; + const common = [',', '\t', ';', '|']; + let seed = 1729; + const next = () => { seed = (Math.imul(seed, 1664525) + 1013904223) >>> 0; return seed; }; + for (let sample = 0; sample < 100; sample++) { + const height = 1 + next() % 4; + const width = 1 + next() % 4; + const matrix = Array.from({ length: height }, () => Array.from({ length: width }, () => values[next() % values.length])); + for (const delimiter of [...common, '^', '||', '::']) { + const text = serializeClipboardMatrix(matrix, delimiter); + assert.deepStrictEqual(Papa.parse(text, { delimiter }).data, matrix); + for (const target of common.includes(delimiter) ? common : [delimiter]) { + assert.deepStrictEqual(parseClipboardMatrix(text, target), matrix, `source ${JSON.stringify(delimiter)}, target ${JSON.stringify(target)}, sample ${sample}`); + } + } + } + }); + }); diff --git a/src/test/provider-clipboard.test.ts b/src/test/provider-clipboard.test.ts index 3cbaf8b..0246c5a 100644 --- a/src/test/provider-clipboard.test.ts +++ b/src/test/provider-clipboard.test.ts @@ -74,6 +74,15 @@ describe('Provider system clipboard integration', () => { } }); + it('writes a mixed column with plain neighbors unquoted and real blanks explicit', async () => { + for (const extension of ['csv', 'tsv']) { + const editor = await createEditor('Name,Other\nplain,1\n"with,comma",2\nlast,3', extension); + await editor.receive({ type: 'copyCells', matrix: [['Name'], ['plain'], ['with,comma'], [''], ['last']], startRow: 0, startCol: 0, cut: false }); + assert.deepStrictEqual(editor.clipboardWrites, ['Name\r\nplain\r\n"with,comma"\r\n""\r\nlast']); + assert.strictEqual(editor.events.includes('edit'), false); + } + }); + it('writes quoted CSV/TSV to the system clipboard and round-trips paste through the document', async () => { for (const extension of ['csv', 'tsv']) { const delimiter = extension === 'csv' ? ',' : '\t'; diff --git a/src/test/webview-clipboard.test.ts b/src/test/webview-clipboard.test.ts index acb28ec..df9d0d5 100644 --- a/src/test/webview-clipboard.test.ts +++ b/src/test/webview-clipboard.test.ts @@ -90,6 +90,7 @@ function createWebview() { }; document.getElementById = byId; const root = byId('csv-root'); + root.dataset.realrowcount = '2'; const table = new Element('TABLE'); const head = new Element('THEAD'); table.appendChild(head);