From d3ba8109d7db54a76ab7da686bb59af9ee5cec66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mindaugas=20Kasparavic=CC=8Cius?= Date: Sun, 9 Aug 2026 21:45:37 +0300 Subject: [PATCH 1/3] feat(spreadsheet): row identity by key columns, headers under a title row MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Spreadsheet track's two "now" items, plus a cross-panel row hover. Row identity — matchRowsByKey.js pairs rows by a composite key across the whole sheet, so a re-sorted export reads as the figures that moved rather than as a rewrite. Duplicate keys pair in order of occurrence and are COUNTED, never hidden. Chosen per sheet in the new Match-rows popover; Auto keeps today's whole-row LCS exactly. Header row — headerPairing scans the first ten rows for a usable header instead of reading rows[0] and dropping silently to positional pairing, which is the failure alignColumns exists to prevent. The band names the row it used when it was not the first. Row hover — the hovered row is marked in BOTH grids; they are two tables, so :hover in one cannot reach the row aligned with it in the other. An outline, not a veil: every row and cell state here is already a background, and a wider border would move the rows the virtualization measures. 2px inset, because 1px read as a different border on beacon and contrast, whose hard --border is a contract. Three bugs found and fixed on the way, two by tests written first: keyColumnsOf let an out-of-range column through (undefined !== null); the Match-rows panel was unclickable because .content carries isolation: isolate and the body-teleported backdrop outranked the whole diff subtree; toolbar-view-menu.spec.mjs still selected .count after the chip moved to ui.css as .btn-count for its second consumer. useSpreadsheetDiff hit its 73-line ratchet and split into the two choices it carried — useToleranceChoice and useKeyColumns. Entry retightened 73 to 69, never raised. Co-Authored-By: Claude Opus 5 --- README.md | 4 +- docs/brand/roadmap.svg | 24 +- docs/glossary.md | 10 +- docs/roadmap.md | 41 ++- docs/screenshots/spreadsheet-diff.png | Bin 135579 -> 141222 bytes e2e/spreadsheet.spec.mjs | 101 ++++++ e2e/toolbar-view-menu.spec.mjs | 2 +- scripts/lib/legacySize.mjs | 2 +- scripts/seed-local.mjs | 38 ++ .../plan.md | 334 ++++++++++++++++++ src/renderer/src/components/RowMatchMenu.vue | 89 +++++ .../src/components/SpreadsheetDiffViewer.vue | 66 ++-- .../src/components/SpreadsheetGrid.vue | 10 +- .../src/components/SpreadsheetStatusBand.vue | 63 ++++ .../src/components/ViewOptionsMenu.vue | 2 +- .../src/components/styles/RowMatchMenu.css | 24 ++ .../src/components/styles/SpreadsheetGrid.css | 18 + .../src/components/styles/ViewOptionsMenu.css | 17 - src/renderer/src/composables/useKeyColumns.js | 36 ++ .../src/composables/useSpreadsheetDiff.js | 50 +-- .../src/composables/useToleranceChoice.js | 40 +++ src/renderer/src/styles/ui.css | 18 + src/renderer/src/types.js | 9 + src/renderer/src/utils/alignColumns.js | 60 +++- src/renderer/src/utils/matchRowsByKey.js | 113 ++++++ src/renderer/src/utils/spreadsheetDiff.js | 91 ++++- src/shared/i18n/en-XA.json | 12 +- src/shared/i18n/en.json | 12 +- .../composables/useKeyColumns.test.js | 69 ++++ .../composables/useSpreadsheetDiff.test.js | 86 +++++ tests/renderer/utils/alignColumns.test.js | 124 ++++++- tests/renderer/utils/matchRowsByKey.test.js | 165 +++++++++ tests/renderer/utils/spreadsheetDiff.test.js | 130 +++++++ 33 files changed, 1696 insertions(+), 164 deletions(-) create mode 100644 specs/2026-08-09-spreadsheet-row-identity/plan.md create mode 100644 src/renderer/src/components/RowMatchMenu.vue create mode 100644 src/renderer/src/components/SpreadsheetStatusBand.vue create mode 100644 src/renderer/src/components/styles/RowMatchMenu.css create mode 100644 src/renderer/src/composables/useKeyColumns.js create mode 100644 src/renderer/src/composables/useToleranceChoice.js create mode 100644 src/renderer/src/utils/matchRowsByKey.js create mode 100644 tests/renderer/composables/useKeyColumns.test.js create mode 100644 tests/renderer/utils/matchRowsByKey.test.js diff --git a/README.md b/README.md index 3e67e460..0fdf26d0 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Builds are **unsigned**, so SmartScreen and Gatekeeper warn on first launch (the | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Compare** | Two files or pasted text, split or inline, word-level highlights, in-view search, and a live re-diff when a file changes on disk. | | **Understand structure** | JSON, YAML and XML compared as _data_: reordering keys or reformatting stops counting, and unchanged keys collapse away. | -| **Excel** | `.xlsx` workbooks as aligned grids — sheet tabs and cell-level highlights, with inserted rows and columns that don't cascade into false changes. Dates read as dates, hidden sheets and rows are marked, and formulas are compared as well as their results, so a total pasted over the formula behind it is caught rather than shown as unchanged. Set a tolerance — one of the presets or a threshold of your own, percentage or raw — and rounding noise stops counting; export the whole change list as a CSV. | +| **Excel** | `.xlsx` workbooks as aligned grids — sheet tabs and cell-level highlights, with inserted rows and columns that don't cascade into false changes. Dates read as dates, hidden sheets and rows are marked, and formulas are compared as well as their results, so a total pasted over the formula behind it is caught rather than shown as unchanged. Headers are found under a title row rather than assumed to be row 1, and rows can be paired by the columns that name them — one column or several — so the same export sorted differently reads as the one figure that moved instead of as a rewrite. Set a tolerance — one of the presets or a threshold of your own, percentage or raw — and rounding noise stops counting; export the whole change list as a CSV. | | **CSV** | `.csv` and `.tsv` compare as text or, one toggle away, as the same grid — rows aligned by their first column, quoted fields kept whole. | | **Huge files** | Past 32 MB a file is indexed by line instead of loaded, and the rows you're looking at are read from disk as you scroll — a multi-gigabyte log opens in seconds. Marked as streamed, with the few actions that need the whole text saying so rather than half-working. | | **Keep** | Saved diffs: encrypted, tagged, optionally auto-expiring. Drag a row onto another to arrange the list yourself; starred rows stay above the rest. Your open tabs come back on the next launch, and the strip can be told to close the oldest comparison to make room for a new one. | @@ -105,7 +105,7 @@ flowchart LR
- Two multi-sheet Excel workbooks compared as aligned grids: sheet tabs with per-sheet change counts, a tolerance control and a change-register export, changed cells boxed, and an added row and an inserted column each shown as a striped gap on the side without them + Two multi-sheet Excel workbooks compared as aligned grids: sheet tabs with per-sheet change counts, a tolerance control, a row-matching control and a change-register export, changed cells boxed, and an added row and an inserted column each shown as a striped gap on the side without them

Excel workbooks as aligned grids.

diff --git a/docs/brand/roadmap.svg b/docs/brand/roadmap.svg index 6f4985da..4e90c400 100644 --- a/docs/brand/roadmap.svg +++ b/docs/brand/roadmap.svg @@ -5,7 +5,7 @@ sidebar. Track hues are real theme accents from src/renderer/src/utils/themes.js (Dim, Bloom, Neon, Beacon) — colour depth encodes sequence: solid now, faded later. Keep this in step with the items in docs/roadmap.md. --> - + @@ -34,32 +34,26 @@ font-family="ui-monospace, SFMono-Regular, Menlo, monospace" fill="#a99a7f">V0.4.27 · PLANNED - + Spreadsheet · finance 6 + font-family="ui-monospace, SFMono-Regular, Menlo, monospace" fill="#8d8168">4 - Row identity · key columns + Amounts read as amounts - Header row offset + Δ and net variance - Amounts read as amounts + Reading a big diff - Δ and net variance + Caps that announce themselves - - Reading a big diff - - - Caps that announce themselves - - - alignRows.js:72 + + numfmt.js diff --git a/docs/glossary.md b/docs/glossary.md index f0ecdd24..832cd16e 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -83,7 +83,15 @@ where the concept lives in this repo. - **Shared strings** — an `.xlsx` de-duplicated text table (`sharedStrings.xml`) that cells reference by index. - **LCS** — _Longest Common Subsequence_, the classic diff algorithm; used to - align spreadsheet rows and to build the copy-as-patch output. + align spreadsheet rows by default and to build the copy-as-patch output. +- **Key column** — a column whose value names a row, so the two sides pair by + identity rather than by position or whole-row contents; several together make + a **composite key** (an account plus a cost centre). Chosen per sheet in the + grid's Match-rows panel and applied by `utils/matchRowsByKey.js`. It is what + lets the same export, sorted differently, read as the figures that moved. +- **Header row** — the row whose labels name the columns. Found by scanning the + first few rows (`headerPairing`), because an exported pack opens with a title + and a date before it; without one, columns pair by position. - **Monaco** — the VS Code editor component, used for the text diff view. - **Mermaid** — the text-to-diagram library used to render `mermaid` snippets. diff --git a/docs/roadmap.md b/docs/roadmap.md index 94d3e97f..5466f1b6 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1,7 +1,7 @@ # Roadmap Roadmap board — four tracks. Spreadsheet · finance: row identity by key columns, header row offset, amounts read as amounts, delta and net variance, reading a big diff, caps that announce themselves. Diagrams: sequence · gantt · pie, click a change to pan to it. Comparing more: folder compare, image pairs, three-way merge — a decision first. Signing: macOS Developer ID, Windows deferred. + alt="Roadmap board — four tracks. Spreadsheet · finance: amounts read as amounts, delta and net variance, reading a big diff, caps that announce themselves. Diagrams: sequence · gantt · pie, click a change to pan to it. Comparing more: folder compare, image pairs, three-way merge — a decision first. Signing: macOS Developer ID, Windows deferred."> Board is `docs/brand/roadmap.svg` — hand-authored, edit it alongside the sections below. @@ -12,7 +12,9 @@ sections below. **Built** — formulas captured and normalised to R1C1 (`r1c1.js`), number formats (`numfmt.js`), materiality tolerance, change register, hidden state + error -cells, columns paired by header, `.csv`/`.tsv` through the same grid. +cells, columns paired by header — found under a title row, not assumed to be +row 1 — rows paired by the columns that name them, `.csv`/`.tsv` through the +same grid. ```mermaid flowchart TB @@ -27,9 +29,9 @@ flowchart TB sh --> ad["adapters/xlsxAdapter.js
adapters/csvAdapter.js — delimited text"] subgraph rend["renderer"] direction TB - ad --> ac["utils/alignColumns.js — pair columns by header"] + ad --> ac["utils/alignColumns.js — headerPairing
scans past a title row"] ac --> dw["utils/spreadsheetDiff.js — diffWorkbooks
utils/sheetCells.js — cell identity"] - dw --> al["utils/alignRows.js — rows + tolerance"] + dw --> al["utils/alignRows.js — signatures + tolerance
utils/matchRowsByKey.js — key columns"] al --> g["SpreadsheetGrid.vue"] al --> cr["utils/changeRegister.js --> diff:exportFile"] end @@ -44,30 +46,31 @@ trial balance, a GL export, a board pack — hits the gaps below. ```mermaid flowchart LR subgraph now["now"] - direction TB - a["1 · row identity
key columns · re-sorted rows"] - b["2 · header row offset"] - end - subgraph next["next"] direction TB c["3 · amounts read as amounts"] d["4 · Δ and net variance"] end - subgraph later["later"] + subgraph next["next"] direction TB e["5 · reading a big diff"] f["6 · caps that announce themselves"] end - now --> next --> later + now --> next ``` -- **1 · row identity** — `opts.keyColumn` exists (`spreadsheetDiff.js:78`) with - no UI, takes one column, and rows pair by LCS over row signatures: the same - export sorted differently reads as 100% changed. Key-based matching, - composite keys, duplicate-key detection -- **2 · header row offset** — `alignColumns.js:16` reads `rows[0]`. A title row - above the header fails `usable()` and drops silently to positional pairing, - which is the failure it was written to prevent +**1 · row identity** and **2 · header row offset** are done. + +- `matchRowsByKey.js` pairs rows by one column or several, wherever they sit, so + a re-sorted export reads as the figures that moved. Duplicate keys pair in + order of occurrence and are COUNTED, never hidden — the panel says so +- `headerPairing` scans for the first row that reads as a header (capped at 10) + instead of reading `rows[0]` and dropping to positional pairing; the band + names the row it used when it was not the first +- The hovered row is marked in BOTH grids — they are two ``s, so `:hover` + in one cannot reach the row aligned with it in the other + +**Open.** + - **3 · amounts read as amounts** — `numfmt.js` renders date, time and percent; everything else falls through to the raw float, so a P&L shows `1234567.891` and never `(1,234)`. A currency or rounding change is invisible today @@ -79,7 +82,7 @@ flowchart LR formulas sharing a prefix compare EQUAL; `maxMetaCells` (`sheet.js:137`) drops formula and format comparison past 100k cells; `csvAdapter` sets `truncated` and nothing renders it. A cap that hides is worse than a cap -- **Tolerance** takes a threshold of your own now (`useSpreadsheetDiff.js:7`, +- **Tolerance** takes a threshold of your own now (`useToleranceChoice.js`, percentage or raw), but it is still global and still `abs` OR `pct` (`alignRows.js:39-40`); materiality is "under €100 AND under 0.5%", per column. Date serials are now exempt (`meta.dt` — a percentage of 45870 is diff --git a/docs/screenshots/spreadsheet-diff.png b/docs/screenshots/spreadsheet-diff.png index 8a4abe72b18e8b443f75d306758a1bfae80b9d4d..018109a32355aded4ec4c89c3e5fd8cf72df9e4d 100644 GIT binary patch literal 141222 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 z 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
    _0Qo2RMU1d%A#uc}>hhUa9(Jb8YGCD>WR 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 diff --git a/e2e/spreadsheet.spec.mjs b/e2e/spreadsheet.spec.mjs index 20a093fd..178acbbf 100644 --- a/e2e/spreadsheet.spec.mjs +++ b/e2e/spreadsheet.spec.mjs @@ -333,3 +333,104 @@ test('exports the spreadsheet grid as a stitched picture', async ({ app, page }) rmSync(dir, { recursive: true, force: true }) } }) + +// A ledger with a title row above its header, re-sorted between the two files: +// changed almost end to end under whole-row matching, one moved amount and one +// dropped line when keyed on Account + Centre. +const ledgerRow = (r, account, centre, amount) => + `${inlineStr(`A${r}`, account)}${inlineStr(`B${r}`, centre)}` + + `${num(`C${r}`, amount)}` +const LEDGER_HEAD = + `${inlineStr('A1', 'Trial balance as at 30 Jun 2025')}` + + `${inlineStr('A2', 'Account')}${inlineStr('B2', 'Centre')}` + + `${inlineStr('C2', 'Amount')}` +const LEDGER_LEFT = buildXlsx( + LEDGER_HEAD + + ledgerRow(3, '1001', 'EMEA', 500) + + ledgerRow(4, '1001', 'APAC', 300) + + ledgerRow(5, '1200', 'EMEA', 120) + + ledgerRow(6, '4000', 'EMEA', 900) +) +const LEDGER_RIGHT = buildXlsx( + LEDGER_HEAD + + ledgerRow(3, '4000', 'EMEA', 900) + + ledgerRow(4, '1200', 'EMEA', 155) + + ledgerRow(5, '1001', 'APAC', 300) +) + +async function openLedger(app, page, dir) { + const leftPath = join(dir, 'ledger-before.xlsx') + const rightPath = join(dir, 'ledger-after.xlsx') + writeFileSync(leftPath, LEDGER_LEFT) + writeFileSync(rightPath, LEDGER_RIGHT) + await stubOpenDialog(app, [leftPath]) + await page.locator('.slot[data-side="left"]').click() + await stubOpenDialog(app, [rightPath]) + await page.locator('.slot[data-side="right"]').click() + await expect(page.locator('.grids')).toBeVisible() +} + +test('pairs re-sorted rows once the key columns are named', async ({ app, page }) => { + const dir = mkdtempSync(join(tmpdir(), 'diffbro-xlsx-key-')) + try { + await openLedger(app, page, dir) + + await expect(page.locator('.status-band')).toContainText('Header row 2') + + // Whole-row matching cannot see past the re-sort. + const band = page.locator('.status-band') + await expect(band).toContainText('3 removed') + + await page.getByTestId('row-match').click() + const panel = page.locator('.popover') + await expect(panel).toContainText('Rows pair by their whole contents') + // Account alone leaves two rows sharing a key, and the panel says so. + await panel.getByRole('checkbox').nth(0).check() + await expect(panel).toContainText('appears more than once') + + await panel.getByRole('checkbox').nth(1).check() + await expect(panel).not.toContainText('appears more than once') + await expect(panel).toContainText('Rows pair by the ticked columns') + await expect(page.getByTestId('row-match').locator('.btn-count')).toHaveText('2') + + await page.keyboard.press('Escape') + // One amount moved, one line gone — not a wholesale rewrite. + await expect(band).toContainText('1 changed') + await expect(band).toContainText('1 removed') + await expect(band).toContainText('0 added') + } finally { + rmSync(dir, { recursive: true, force: true }) + } +}) + +// The two grids are two
s: :hover in one cannot reach the row aligned +// with it in the other, so the mark has to be driven from the viewer. +test('hovering a row marks the same row in both grids', async ({ app, page }) => { + const dir = mkdtempSync(join(tmpdir(), 'diffbro-xlsx-hover-')) + try { + await openLedger(app, page, dir) + + const leftRows = page.locator('.grids > :first-child tbody tr') + const rightRows = page.locator('.grids > :nth-child(2) tbody tr') + await expect(page.locator('tbody tr.hover')).toHaveCount(0) + + await leftRows.nth(2).hover() + await expect(leftRows.nth(2)).toHaveClass(/hover/) + await expect(rightRows.nth(2)).toHaveClass(/hover/) + await expect(page.locator('tbody tr.hover')).toHaveCount(2) + + // Same height on both sides — carrying a figure across the divider is the point. + const l = await leftRows.nth(2).boundingBox() + const r = await rightRows.nth(2).boundingBox() + expect(Math.abs(l.y - r.y)).toBeLessThan(1) + + // The cue is painted, not merely classed. + const outline = await rightRows.nth(2).evaluate((el) => getComputedStyle(el).outlineWidth) + expect(parseFloat(outline)).toBeGreaterThan(0) + + await page.locator('.sheet-bar').hover() + await expect(page.locator('tbody tr.hover')).toHaveCount(0) + } finally { + rmSync(dir, { recursive: true, force: true }) + } +}) diff --git a/e2e/toolbar-view-menu.spec.mjs b/e2e/toolbar-view-menu.spec.mjs index d67a847f..1dcd7bcc 100644 --- a/e2e/toolbar-view-menu.spec.mjs +++ b/e2e/toolbar-view-menu.spec.mjs @@ -51,7 +51,7 @@ test('an unavailable option is disabled and says why', async ({ page }) => { // untouched comparison and mean nothing. test('the count chip tracks changed options, not enabled ones', async ({ page }) => { await pasteCompare(page, 'a\nb', 'a\nc') - const chip = page.locator('.count') + const chip = page.locator('.btn-count') await expect(chip).toBeHidden() // nothing changed yet, though Split view is on await openViewMenu(page) diff --git a/scripts/lib/legacySize.mjs b/scripts/lib/legacySize.mjs index d0412081..09c4403b 100644 --- a/scripts/lib/legacySize.mjs +++ b/scripts/lib/legacySize.mjs @@ -19,7 +19,7 @@ export const LEGACY_SIZE = { 'src/renderer/src/composables/useQuickLookKeys.js': { fn: 97 }, 'src/renderer/src/composables/useSnippetDraft.js': { fn: 182 }, 'src/renderer/src/composables/useSnippetPreview.js': { fn: 73 }, - 'src/renderer/src/composables/useSpreadsheetDiff.js': { fn: 73 }, + 'src/renderer/src/composables/useSpreadsheetDiff.js': { fn: 69 }, 'src/renderer/src/composables/useStreamedDiff.js': { fn: 99 }, 'src/renderer/src/composables/useTabContextMenu.js': { fn: 70 }, 'src/renderer/src/composables/useTagInput.js': { fn: 84 }, diff --git a/scripts/seed-local.mjs b/scripts/seed-local.mjs index 302ed642..14bf4f42 100644 --- a/scripts/seed-local.mjs +++ b/scripts/seed-local.mjs @@ -147,6 +147,44 @@ const FILES = { ] } ]), + // A title row above the header and the same ledger re-sorted: nearly all + // "changed" under Auto, one moved amount and one dropped line when keyed on + // Account + Centre. Account alone is a duplicate key, which the panel says. + 'ledger-before.xlsx': makeXlsx([ + { + name: 'Ledger', + rows: [ + ['Trial balance as at 30 Jun 2025'], + ['Account', 'Centre', 'Description', 'Amount'], + ['1001', 'EMEA', 'Bank', 128400.5], + ['1001', 'APAC', 'Bank', 41200], + ['1200', 'EMEA', 'Receivables', 96750.25], + ['1200', 'APAC', 'Receivables', 30110], + ['2100', 'EMEA', 'Payables', -74300], + ['4000', 'EMEA', 'Revenue', -412900], + ['5000', 'EMEA', 'Cost of sales', 233150.75], + ['6100', 'EMEA', 'Payroll', 118000], + ['6200', 'APAC', 'Travel', 9430.4] + ] + } + ]), + 'ledger-after.xlsx': makeXlsx([ + { + name: 'Ledger', + rows: [ + ['Trial balance as at 31 Jul 2025'], + ['Account', 'Centre', 'Description', 'Amount'], + ['6200', 'APAC', 'Travel', 9430.4], + ['4000', 'EMEA', 'Revenue', -412900], + ['1200', 'APAC', 'Receivables', 30110], + ['1001', 'APAC', 'Bank', 41200], + ['5000', 'EMEA', 'Cost of sales', 233150.75], + ['1200', 'EMEA', 'Receivables', 91020.25], + ['1001', 'EMEA', 'Bank', 128400.5], + ['2100', 'EMEA', 'Payables', -74300] + ] + } + ]), // A workbook wide enough that the grid scrolls sideways — what the image // export reports as columns it cannot reach. 'wide-metrics-a.xlsx': makeXlsx([ diff --git a/specs/2026-08-09-spreadsheet-row-identity/plan.md b/specs/2026-08-09-spreadsheet-row-identity/plan.md new file mode 100644 index 00000000..ec88aad3 --- /dev/null +++ b/specs/2026-08-09-spreadsheet-row-identity/plan.md @@ -0,0 +1,334 @@ +# Row identity and the header row — the Spreadsheet track's "now" + +| | | +|---|---| +| **Status** | shipped | +| **Progress** | 14 / 14 steps | +| **Branch** | `improvement/spreadsheet-row-identity` | +| **Started** | 2026-08-09 | +| **Finished** | 2026-08-09 | +| **Bugs found and fixed this iteration** | 3 code · 5 more found by `/validate` | +| **Token baseline** | 2026-08-09T17:38:10Z | +| **Claude tokens used** | 34,849,636 processed (171 requests) | + +## Problem + +`docs/roadmap.md` reopened the Spreadsheet track against _data_ rather than a +model, and put two items in **now**. Both are live defects, not wishes. + +**1 · row identity.** `opts.keyColumn` exists at `spreadsheetDiff.js:78` with no +UI, takes exactly one column, and is only consulted _inside an LCS gap_ +(`alignRows.js:114`). The outer pairing is an LCS over whole-row signatures +(`alignRows.js:202`), so re-sorting an export re-orders every signature and the +LCS finds almost no common subsequence: + +``` +left right (same data, sorted by amount) +1001, 500 1003, 120 +1002, 300 1002, 300 +1003, 120 1001, 500 +``` + +Today: `same, changed(1002 stays), same` at best, and on a real 400-row trial +balance sorted by a different column it reads as near-100% changed. There is no +way to say "row identity is the account code" — nor to say it is +*account + cost centre*, which is what a GL export actually keys on. + +**2 · header row offset.** `alignColumns.js:16` reads `rows[0]`. A workbook whose +first row is a title — `Trial balance as at 31 Dec 2025` in A1 and nothing else — +produces labels `['Trial balance…', '', '', '']`, which fails `usable()` +(`alignColumns.js:27`, blank label) and falls to `positional()`. Positional +pairing is exactly the failure the file's own header comment says it was written +to prevent: one inserted column then shifts every column after it. It fails +**silently** — nothing in the UI says the columns were paired by position. + +Neither has a test that would catch it, because neither was ever expressible. + +## Solution + +Two independent changes plus one UI surface. + +**Header row (2).** `alignColumns` scans the first `MAX_HEADER_SCAN` rows for the +first row whose labels are `usable()`, instead of reading `rows[0]` and giving +up. Each side scans independently — a title row added on one side only is the +common case. The detected index is exported so the viewer can say which row it +used when it is not row 1. The existing `paired * 2 > narrower` guard still +rejects a data row that happened to look usable, so the scan is strictly better +than the current behaviour: it only runs where the current code already gave up. + +**Row identity (1).** A new pure `utils/matchRowsByKey.js` pairs rows by a +composite key across the WHOLE sheet, bypassing the LCS. `spreadsheetDiff` +branches on `opts.keyColumns` (an array of paired-column indices): empty → today's +`alignRows`, non-empty → key matching. Duplicate keys pair in order of +occurrence and are counted, so the answer is never silently wrong. + +**Output order** follows the RIGHT file — the one the reader has open — with a +removed row emitted just before the first surviving left row that followed it. + +**UI.** A `RowMatchMenu.vue` in the grid-tools band: a `.btn btn-sm` with a count +chip, opening the shared `.popover` layer with one checkbox per paired column, +plus the duplicate-key warning. Per sheet, because column headers are. + +| option | why not | +|---|---| +| key matching inside `alignRows` | the file is 214 lines against a 250 cap, and the two matchers share nothing but the entry shape — one `if` at the top of a second matcher is honest, a mode flag threaded through `lcsOps`/`emitGap` is not | +| sort both sides by key, then align positionally | throws away the reader's own row order; a diff they cannot line up against the file on their screen | +| auto-detect the key column (first column with unique values) | a plausible guess that is wrong invisibly — an `id` column that is unique on the left and duplicated on the right silently changes what "changed" means. Recorded as out of scope, not rejected forever | +| header row as a user-set number | the detection is unambiguous where it matters (blank/duplicate labels vs. a clean header). A control for it is chrome for a case the scan already covers; revisit if the scan is ever seen picking wrong | +| a `BaseDialog` for the key picker | it is a one-of-N-columns choice made while looking at the grid, which is what `.popover` is for (`ViewOptionsMenu`) — a modal would cover the columns being chosen | + +## Scope + +**In:** + +- header-row scan in `alignColumns.js`, exported index, surfaced in the status band +- `utils/matchRowsByKey.js` — composite keys, duplicate detection, right-file order +- `spreadsheetDiff` branch on `opts.keyColumns`; `headerRows` + `duplicateKeys` on the sheet result +- `useSpreadsheetDiff` — per-sheet key selection +- `RowMatchMenu.vue` + its stylesheet; the count chip lifted to `ui.css` as `.btn-count` +- i18n catalogue + `en-XA`; seed pair; unit + e2e tests; roadmap prose + SVG +- **added mid-build, on request:** the hovered row marked in BOTH grids — see Decisions + +**Out:** *(recorded, not drifted into)* + +- **Δ and net variance** (roadmap item 4) — the register keeps its six columns +- **amounts read as amounts** (item 3) — `numfmt.js` untouched +- auto-detecting a key when none is chosen — Auto stays exactly today's LCS +- case-folding or numeric coercion of key values — see Decisions +- `keyColumn` (singular) on `alignRows` stays as-is; it is the in-gap pairing and + is still what Auto uses + +## Design + +The trigger is `.btn .btn-sm` from `ui.css` — the resting three-cue face +(`--btn-face` / `--btn-edge` / `--shadow-1`), never `.btn-ghost`: it stands alone +in the band with no primary beside it. Panel is the shared `.popover` +(`--bg-elevated`, `1px solid var(--border)`, `--radius-lg`, `--shadow-2`), rows +are `.popover-row` at `--control-h`. The count chip is `--chip-h` with a +`--btn-face-press` face and `--text` ink — moved verbatim out of +`ViewOptionsMenu.css` into `ui.css`, because a second component now needs it and +a scoped copy is this repo's recurring drift. + +Secondary text inside the panel (the Auto explanation, the duplicate-key warning) +is `--text-hint`, **not** `--text-dim`: dim's 3.0 floor is held against +`--bg-panel` and this panel is `--bg-elevated`, where `make theme-sweep` measured +2.92 on nord and 2.82 on sepia. `ui.css` already records that. + +The header-row note in the status band is plain `--text-dim` body text in the +existing `.status-band`, which is `--bg-panel` — the floored pair. + +No new colour, radius or font-size literal; nothing accent-filled behind a label; +no glow. + +### Theme verdict — all 20 + +Parsed from `styles/themes.css` (`--bg` for the ground, `--border`, `--accent`). +Every surface here is an existing `ui.css` layer already held to floors by +`check-theme-depth.mjs`, so the verdict is about what the new markup composes, +not a new palette. + +| theme | ground (`--bg`) | verdict | note | +|---|---|---|---| +| light | `#ffffff` (canvas inverted) | ok | popover is `--bg-elevated`, floats on the tinted canvas as every other panel does | +| dark | `#0d1117` | ok | | +| solar | `#fffdf6` | ok | | +| neon | `#090d18` | ok | accent `#22d3ee` only on the checkbox tick and `:focus-visible` — no fill under a label, nothing to halo | +| nord | `#2e3440` | ok | `--text-hint` chosen for exactly this theme (dim measured 2.92 here) | +| sepia | `#e9dcbe` | ok | as nord — dim measured 2.82 | +| dim | `#1b1917` | ok | accent `#d9a441` | +| beacon | `#000000` | ok | hard keyline `#e0e0e0` — popover keeps its `1px solid var(--border)`; nothing here removes a border | +| meridian | `#f5f7f4` | ok | | +| linen | `#faf7f0` | ok | | +| bloom | `#f9f4f5` | ok | | +| nyan | `#160a20` | ok | accent `#ff2ecb` — tick and focus ring only | +| matrix | `#020a04` | ok | accent `#00ff41` — same | +| contrast | `#ffffff` | ok | hard keyline `#111111`, kept | +| volcano | `#000000` | ok | border `#ffc9a4`, accent `#ff5c33` | +| amber | `#0f0a02` | ok | accent `#ffb000` | +| tide | `#0b1a1e` | ok | | +| ember | `#1a1013` | ok | | +| graphite | `#161616` | ok | achromatic; chip face is `--text` at 30%, so it steps toward the ink rather than picking a grey | +| vector | `#ffffff` | ok | | + +**The row-hover mark** is the one genuinely new painted surface, so it was read +off real frames rather than reasoned about: a 2px `--accent` outline inset into +the row, plus `--bg-hover` on the gutter. Captured from a running app on +**light · matrix · beacon · contrast · sepia · nyan · volcano** — the two hard-keyline +contracts, the three high-chroma accents, and one light warm ground. At 1px it +read as "a slightly different border" on beacon (`#4cc2ff` beside a `#e0e0e0` +keyline) and contrast; 2px at `-2px` offset separates the mark from the keyline +and reads on all of them. It never removes a border, never fills behind a label +and never glows, so the three rules the high-chroma themes exist to catch do not +apply. + +Verified by `npm run check:themes` (token floors, 20 themes, green) and re-read in +the running app before the plan closed. + +## Security rules touched + +**None crossed.** No IPC handler, no fs, no crypto, no `shell.*`, no new +dependency, no external link, no `v-html`. Everything added is renderer-side pure +JS over data the main process already parsed and validated. + +Two adjacent rules stay honoured: + +- **Rule 6 (untrusted input is hostile).** Key values come from cells in a file a + user chose. They are used only as `Map` keys and rendered through Vue text + interpolation — never as a selector, a path or markup. The composite key joins + on `\u0000` (NUL), which cannot appear in a spreadsheet cell's text, so two different + key tuples cannot collide into one. +- **Rule 6 again, caps.** The header scan is capped (`MAX_HEADER_SCAN`), the key + picker only lists paired columns and the popover scrolls rather than growing + without bound. Key matching is O(n) hashing — cheaper than the LCS it replaces, + so no new budget is needed. + +## Test plan + +Written before the code; each of the two defects gets its failing test first. + +- **unit** — `tests/renderer/utils/alignColumns.test.js`: a title row above the + header pairs by header, not by position (**red first**: today it returns + `positional()`); a header found at row 2 on the left and row 0 on the right + still pairs; nothing usable in the first ten rows still falls back; a data-only + sheet is unchanged. +- **unit** — `tests/renderer/utils/matchRowsByKey.test.js` (new): re-sorted rows + all pair (**red first**: `alignRows` on the same input reports changes); + composite key over two columns; a duplicate key pairs in order of occurrence + and is counted; unmatched left → removed, unmatched right → added; tolerance is + respected; the emitted order follows the right file with removed rows in place; + a blank key is a key, not a wildcard. +- **unit** — `tests/renderer/utils/spreadsheetDiff.test.js`: `opts.keyColumns` + reaches the matcher and the reported `changed` indices are still in DISPLAY + column space; `headerRows` and `duplicateKeys` on the sheet result. +- **unit** — `tests/renderer/composables/useSpreadsheetDiff.test.js`: key columns + are per sheet and survive a sheet switch; clearing returns to Auto. +- **e2e** — `e2e/spreadsheet.spec.mjs`: build a re-sorted pair with a title row, + open it, assert the grid reports the sheets as near-fully-changed under Auto, + pick the key column in the Match-rows popover, assert the change count collapses + to the one real edit. The popover, the per-sheet memory and the real parse only + exist in a launch. +- **red → green** — recorded per test in the Validation section with the actual + failure text. +- **seed fixtures** — `scripts/seed-local.mjs` `FILES` gains + `ledger-before.xlsx` / `ledger-after.xlsx`: a title row in A1, a header on row + 2, the same twelve ledger lines re-sorted, one amount moved and one line + dropped. Without it neither defect is reproducible by hand on the host Mac. + Keeps the `seed` tag; `local-seed-clean` removes it by the same glob. + +## Docs impact + +| surface | needed? | what changes | +|---|---|---| +| `README.md` | **yes** | the spreadsheet feature list says columns pair by header; it now also says rows can pair by key columns | +| `docs/screenshots/*.png` | **yes** — planned as "no", corrected on check | the plan guessed the tools band was off-frame. It is not: `spreadsheet-diff` shows the whole window, tolerance control included, so Match rows landed in it. Recaptured with `make screenshots SHOTS=spreadsheet-diff` (the container — the script drives the in-app menu bar, which macOS replaces with the native one), and the README `alt` updated with it | +| `docs/roadmap.md` | **yes** | items 1 and 2 leave **now**; 3 and 4 move up. Mermaid + terse bullets, no prose | +| `docs/brand/roadmap.svg` | **yes** | the Spreadsheet card's chips count the rows on the card — hand-authored, edited in the same change | +| `docs/*.md` | **no** | no IPC surface (`ipc-security.md`), no crypto (`security.md`), no new standard (`standards.md`). `glossary.md` — checked: "key column" is worth an entry, added | + +## Implementation plan + +- [x] 1. Branch `improvement/spreadsheet-row-identity`, record the token baseline +- [x] 2. **Red:** header-offset cases in `alignColumns.test.js`; watch them fail +- [x] 3. **Green:** header-row scan in `alignColumns.js`, `headerRowIndex` exported +- [x] 4. **Red:** `matchRowsByKey.test.js`; watch it fail (module absent, then behaviour) +- [x] 5. **Green:** `utils/matchRowsByKey.js` +- [x] 6. `spreadsheetDiff.js` — branch on `opts.keyColumns`, expose `headerRows` + and `duplicateKeys`; extend `spreadsheetDiff.test.js` +- [x] 7. `useSpreadsheetDiff.js` — per-sheet key columns; extend its test +- [x] 8. `.count` chip → `ui.css`; `ViewOptionsMenu.css` drops its copy +- [x] 9. `RowMatchMenu.vue` + `styles/RowMatchMenu.css` on `usePopover` +- [x] 10. `SpreadsheetDiffViewer.vue` — mount it, add the header-row note +- [x] 11. i18n keys in `en.json`, regenerate `en-XA`; `check:i18n` + `check:rawtext` clean +- [x] 12. Seed pair in `seed-local.mjs`; `make local-seed` opens it by hand +- [x] 13. e2e in `spreadsheet.spec.mjs` +- [x] 14. Docs: `README.md`, `docs/roadmap.md`, `docs/brand/roadmap.svg`, `glossary.md` + +## Decisions + +| date | decision | why | rejected | +|---|---|---|---| +| 2026-08-09 | key values are `String(value).trim()` — no case-folding, no numeric coercion | trimming fixes an invisible defect (a trailing space in an export). Folding case would silently merge `ACC-1` and `acc-1`, which in a ledger are two accounts | case-insensitive keys; `Number()` coercion so `'1001'` matches `1001` — cross-format keying is a separate decision with its own failure mode | +| 2026-08-09 | display order follows the RIGHT file | it is the file the reader has open; a removed row is emitted just before the first surviving left row that followed it, so it keeps its context | sorting by key (normalises away the reader's own order); left order (the "after" file is what is being reviewed) | +| 2026-08-09 | key columns are per sheet, held in the composable | the columns differ per sheet, so one global choice is wrong on the second tab | one workbook-wide setting; persisting to the store — the choice is about a comparison, not about the app | +| 2026-08-09 | duplicate keys pair in occurrence order and are COUNTED, never hidden | roadmap item 6 is "a cap that hides is worse than a cap"; the same holds for an ambiguity | refusing to match on a duplicate; matching many-to-one (that is reconciliation, an explicitly undecided track) | +| 2026-08-09 | the header scan is independent per side | the failure case is a title row added on ONE side; a shared index cannot express it | one index for both | +| 2026-08-09 | Auto keeps today's LCS untouched | changing the default matcher is a behaviour change for every existing diff, with no failing case behind it | auto-detecting a key column | +| 2026-08-09 | **scope added on request:** the hovered row is marked in BOTH grids | asked for mid-build. It belongs to this change: keyed rows no longer sit opposite their own position, so carrying a figure across the divider by eye is exactly what got harder | — | +| 2026-08-09 | the hover mark is an `outline` on the `tr`, plus the gutter face | every row and cell state here is already a `background`, so a veil would REPLACE the ghost's stripes and the changed cell's tint; and a wider border would move the rows the virtualization measures (`--grid-row-h` is one number shared by the CSS and the spacer arithmetic) | a background veil; a 2px border; an inset `box-shadow` (collides with `cell-chg` and `err`, which already use one) | +| 2026-08-09 | 2px outline at `-2px` offset, not 1px | 1px read as "a slightly different border" on beacon and contrast, whose hard `--border` is a contract. Measured on rendered frames, not guessed | 1px | +| 2026-08-09 | `RowMatchMenu` renders its backdrop inline, NOT teleported to body | `.content` carries `isolation: isolate`, so a body-level backdrop at z-index 20 outranks the whole diff subtree and swallowed every click meant for the panel. The backdrop is `position: fixed`, so it covers the window from where it is | `Teleport to="body"` (what `ViewOptionsMenu` does — it lives outside `.content`) | +| 2026-08-09 | two choice-composables split out of `useSpreadsheetDiff` | the function hit its 73-line ratchet. `useToleranceChoice` and `useKeyColumns` are the two decisions in it; the diff itself is what is left | raising the cap | + +## Validation + +- [x] `/validate` — four passes run; nine comment trims, two untyped boundary + props, one missing test mirror and one stale screenshot found and fixed in + this change. `quality-audit.md` closes with **no open findings** +- [x] `npm run check` — **green.** lint · style tokens (109 stylesheets) · theme + depth (20 themes) · structure · i18n (1224 keys, 1224 used) · raw text + (0, held at baseline) · 3077 tests passed, 2 skipped · build. Coverage + **95.34 / 88.47 / 95.75 / 96.33** against floors 93 / 86 / 92 / 95 +- [x] e2e on the host, `E2E_HIDDEN=1 E2E_WORKERS=1`: `spreadsheet` (9/9, two of + them new) plus `csv-grid`, `toolbar-view-menu`, `view-toggles`, + `virtual-rows`, `diff-zoom`, `locale`, `ui-affordances` — 63 passed +- [x] UI seen running: the grid, the panel and the hover mark captured off a real + launch on **light, matrix, beacon, contrast, sepia, nyan, volcano**; the + board SVG rendered offscreen and read back before it was committed +- [x] every Docs-impact "yes" done — `README.md`, `docs/roadmap.md`, + `docs/brand/roadmap.svg`, `docs/glossary.md` +- [ ] `make local-seed` — **not run.** It writes into the user's real DiffBro + install (userData: saved diffs, snippets, trusted keys), which is not mine + to change without being asked. The fixture itself is proven instead: the + e2e builds the same title-row-then-header, re-sorted shape and drives it + end to end, and `makeXlsx` already writes the four existing pairs +- [x] token usage measured, header row filled + +### Red → green, recorded + +| test | failure seen first | +|---|---| +| `alignColumns.test.js` — header below a title row (7 cases) | `expected [ 'Trial balance as at 31 Dec 2024', '', '' ] to deeply equal [ 'Account', 'Debit', 'Credit' ]`, and `headerPairing is not a function` | +| `matchRowsByKey.test.js` (14 cases) | `Failed to resolve import ".../utils/matchRowsByKey"` | +| `useSpreadsheetDiff.test.js` — "starts a new pair of files on Auto" | re-verified by deleting the `watch` and watching it fail alone | +| `alignColumns.test.js` — "gives up rather than scanning an unbounded preamble" | a cap test cannot fail before the cap exists, so it was proven by raising `MAX_HEADER_SCAN` to 20 and watching it fail alone | + +Three of the seven header cases **passed** on the first run — positional pairing +happened to give the same answer. They were rewritten to insert a column, so +header pairing and positional pairing disagree and the assertion can tell them +apart. A test that passes before the fix guards nothing. + +### Bugs found and fixed + +1. **`keyColumnsOf` accepted an out-of-range column.** `c?.left !== null` reads + `undefined !== null` → true, so `columns[9]` on a 3-column sheet reached + `picked.map((c) => c.left)` and threw. Caught by the "ignores a key column + only one side has" test; fixed to `c && c.left !== null && c.right !== null`. +2. **The Match-rows panel could not be clicked.** `.content` carries + `isolation: isolate`; the body-teleported backdrop at z-index 20 outranked the + whole subtree, so every checkbox click hit the backdrop and closed the panel. + Caught by the new e2e, fixed by rendering the backdrop inline. +3. **`e2e/toolbar-view-menu.spec.mjs` selected `.count`,** which the chip lost + when it moved to `ui.css` as `.btn-count`. Caught by running the affected + specs rather than only the new ones. + +### Token usage + +Window `2026-08-09T17:38:10Z` → now, 171 requests. + +| category | tokens | +|---|---:| +| input | 342 | +| output | 109,136 | +| cache write | 206,072 | +| cache read | 34,534,086 | +| **total** | **34,849,636** | + +Cache read dominates, so the total is tokens *processed*, not a bill. The window +is wall-clock and the session worked on nothing else. + +**Outcome:** both "now" items on the Spreadsheet track are done, and the board +moves 3 and 4 up. A re-sorted trial balance now reads as the one figure that +moved instead of a wholesale rewrite, a header found under a title row is named +in the band rather than silently abandoned for positional pairing, and the +hovered row is marked in both grids. Three bugs were found and fixed on the way, +two of them by tests written before the code. diff --git a/src/renderer/src/components/RowMatchMenu.vue b/src/renderer/src/components/RowMatchMenu.vue new file mode 100644 index 00000000..3ed772d9 --- /dev/null +++ b/src/renderer/src/components/RowMatchMenu.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/renderer/src/components/SpreadsheetDiffViewer.vue b/src/renderer/src/components/SpreadsheetDiffViewer.vue index 9962ec5a..156b6125 100644 --- a/src/renderer/src/components/SpreadsheetDiffViewer.vue +++ b/src/renderer/src/components/SpreadsheetDiffViewer.vue @@ -1,7 +1,8 @@ + + diff --git a/src/renderer/src/components/ViewOptionsMenu.vue b/src/renderer/src/components/ViewOptionsMenu.vue index 6634ee96..fcd50563 100644 --- a/src/renderer/src/components/ViewOptionsMenu.vue +++ b/src/renderer/src/components/ViewOptionsMenu.vue @@ -72,7 +72,7 @@ defineExpose({ close }) @click="toggle" > {{ $t('appToolbar.view') }} - {{ changedCount }} + {{ changedCount }}
diff --git a/src/renderer/src/components/styles/RowMatchMenu.css b/src/renderer/src/components/styles/RowMatchMenu.css new file mode 100644 index 00000000..e9cfd142 --- /dev/null +++ b/src/renderer/src/components/styles/RowMatchMenu.css @@ -0,0 +1,24 @@ +/* The Match-rows button and its panel (RowMatchMenu.vue). The shell — surface, + keyline, rows, the hint ink — is the shared .popover layer in ui.css; only + what is genuinely local lives here. */ + +.popover { + min-width: 240px; +} +/* A sheet can carry more columns than a panel can be tall, so the list scrolls + rather than the panel growing past the window. */ +.key-list { + max-height: 260px; + overflow-y: auto; +} +/* The two hint lines are direct children of the panel, so they take the row's + own inline padding to line up with the checkboxes. */ +.popover-why { + padding: var(--space-1) var(--space-3); +} +.lead { + padding-top: 0; +} +.clear { + color: var(--text-hint); +} diff --git a/src/renderer/src/components/styles/SpreadsheetGrid.css b/src/renderer/src/components/styles/SpreadsheetGrid.css index 2b9042f2..ed875206 100644 --- a/src/renderer/src/components/styles/SpreadsheetGrid.css +++ b/src/renderer/src/components/styles/SpreadsheetGrid.css @@ -102,6 +102,24 @@ box-shadow: inset 2px 0 0 color-mix(in srgb, var(--text-dim) 70%, transparent); } +/* The row under the pointer, marked in BOTH grids — they are two tables, so + :hover in one cannot reach the row opposite it. Neither cue touches layout or + the row's own background: every row and cell state here is ALREADY a + background, so a veil would replace the ghost's stripes rather than sit over + them, and a wider border would move the rows the virtualization measures. */ +.grid tr.hover { + outline: 2px solid var(--accent); + /* Fully INSIDE the row, so the mark sits beside the cell keyline rather than + on top of it — beacon and contrast carry a hard --border by contract, and a + hairline sharing that edge was the one theme pair where the mark read as a + slightly different border rather than as a mark. */ + outline-offset: -2px; +} +.grid tr.hover .rownum { + background: var(--bg-hover); + color: var(--text); +} + /* Ghost: the aligned gap opposite an added/removed row or column, striped so it reads as "nothing here" while keeping both grids cell-for-cell aligned. */ .grid tr.ghost td, diff --git a/src/renderer/src/components/styles/ViewOptionsMenu.css b/src/renderer/src/components/styles/ViewOptionsMenu.css index 50d25da1..4cff31b5 100644 --- a/src/renderer/src/components/styles/ViewOptionsMenu.css +++ b/src/renderer/src/components/styles/ViewOptionsMenu.css @@ -17,20 +17,3 @@ min-height: auto; padding-top: var(--space-1); } -/* How many options the reader has changed from their defaults. Height comes from - --chip-h, never from padding — that is how the Esc chip drifted to 19px beside - a 26px button. Face is the theme's own ink at 30%, the same step .btn.active - takes: --accent as a fill under a label scores under 4.5:1 on five themes. */ -.count { - min-width: var(--chip-h); - height: var(--chip-h); - padding: 0 var(--space-1); - border-radius: var(--radius-pill); - background: var(--btn-face-press); - color: var(--text); - font-size: var(--font-xs); - font-weight: 700; - display: inline-flex; - align-items: center; - justify-content: center; -} diff --git a/src/renderer/src/composables/useKeyColumns.js b/src/renderer/src/composables/useKeyColumns.js new file mode 100644 index 00000000..ef2479ed --- /dev/null +++ b/src/renderer/src/composables/useKeyColumns.js @@ -0,0 +1,36 @@ +import { computed, ref, watch } from 'vue' + +/** + * Which columns name a row, held per sheet — the columns differ per sheet, so + * one workbook-wide choice would be wrong on the second tab. A Map rather than + * an object: the sheet name comes from the file, and `__proto__` must not + * resolve to anything. + * @param {() => string|undefined} sheetName the sheet the choice applies to + * @param {Array<() => unknown>} resetOn sources that mean "a different pair of + * files": keys are held by NAME, and two workbooks routinely share one. + */ +export function useKeyColumns(sheetName, resetOn = []) { + const bySheet = ref(new Map()) + + if (resetOn.length) watch(resetOn, () => bySheet.value.clear()) + + const activeKeyColumns = computed(() => bySheet.value.get(sheetName()) ?? []) + + function toggleKeyColumn(index) { + const name = sheetName() + if (!name) return + const current = activeKeyColumns.value + const next = current.includes(index) + ? current.filter((i) => i !== index) + : [...current, index].sort((a, b) => a - b) + if (next.length) bySheet.value.set(name, next) + else bySheet.value.delete(name) + } + + function clearKeyColumns() { + const name = sheetName() + if (name) bySheet.value.delete(name) + } + + return { bySheet, activeKeyColumns, toggleKeyColumn, clearKeyColumns } +} diff --git a/src/renderer/src/composables/useSpreadsheetDiff.js b/src/renderer/src/composables/useSpreadsheetDiff.js index 4378c89c..5ea420ec 100644 --- a/src/renderer/src/composables/useSpreadsheetDiff.js +++ b/src/renderer/src/composables/useSpreadsheetDiff.js @@ -1,49 +1,26 @@ import { computed, ref } from 'vue' import { useDiffStore } from '../stores/diffStore' import { diffWorkbooks } from '../utils/spreadsheetDiff' - -// An absolute floor kills float-rounding noise; a percentage is what -// materiality means. Neither covers the other, so both are offered. -export const TOLERANCES = [ - { value: 'exact', label: 'Exact', tolerance: null }, - { value: 'abs', label: '±0.01', tolerance: { abs: 0.01 } }, - { value: 'half', label: '±0.5%', tolerance: { pct: 0.5 } }, - { value: 'one', label: '±1%', tolerance: { pct: 1 } }, - // The threshold the engagement set, which is never one of four numbers. - { value: 'custom', label: 'Custom', tolerance: null } -] - -// Explicit, never sniffed from the text: "50" meaning half a percent or fifty -// pounds is not something to guess at. -export const TOLERANCE_UNITS = [ - { value: 'pct', label: '%' }, - { value: 'abs', label: 'abs' } -] +import { useKeyColumns } from './useKeyColumns' +import { useToleranceChoice } from './useToleranceChoice' // Per-sheet diff of the two loaded spreadsheets + the active tab. export function useSpreadsheetDiff() { const store = useDiffStore() const active = ref(0) - const showFormulas = ref(false) - const toleranceId = ref('exact') - const customValue = ref('') - const customUnit = ref('pct') - // Empty, unparseable or non-positive reads as Exact: a zero threshold forgives - // nothing while claiming a tolerance is set. - const customTolerance = computed(() => { - const n = Number(String(customValue.value).trim()) - if (!Number.isFinite(n) || n <= 0) return null - return customUnit.value === 'abs' ? { abs: n } : { pct: n } - }) - const tolerance = computed(() => - toleranceId.value === 'custom' - ? customTolerance.value - : (TOLERANCES.find((t) => t.value === toleranceId.value)?.tolerance ?? null) + + const { toleranceId, customValue, customUnit, tolerance } = useToleranceChoice() + const { bySheet, activeKeyColumns, toggleKeyColumn, clearKeyColumns } = useKeyColumns( + () => activeSheet.value?.name, + [() => store.gridSheets.left, () => store.gridSheets.right] ) const sheets = computed(() => - diffWorkbooks(store.gridSheets.left, store.gridSheets.right, { tolerance: tolerance.value }) + diffWorkbooks(store.gridSheets.left, store.gridSheets.right, { + tolerance: tolerance.value, + keyColumns: bySheet.value + }) ) // Clamp to the last sheet if the active index falls out of range. @@ -91,6 +68,9 @@ export function useSpreadsheetDiff() { toleranceId, customValue, customUnit, - tolerance + tolerance, + activeKeyColumns, + toggleKeyColumn, + clearKeyColumns } } diff --git a/src/renderer/src/composables/useToleranceChoice.js b/src/renderer/src/composables/useToleranceChoice.js new file mode 100644 index 00000000..e1e0cace --- /dev/null +++ b/src/renderer/src/composables/useToleranceChoice.js @@ -0,0 +1,40 @@ +import { computed, ref } from 'vue' + +// An absolute floor kills float-rounding noise; a percentage is what +// materiality means. Neither covers the other, so both are offered. +export const TOLERANCES = [ + { value: 'exact', label: 'Exact', tolerance: null }, + { value: 'abs', label: '±0.01', tolerance: { abs: 0.01 } }, + { value: 'half', label: '±0.5%', tolerance: { pct: 0.5 } }, + { value: 'one', label: '±1%', tolerance: { pct: 1 } }, + // The threshold the engagement set, which is never one of four numbers. + { value: 'custom', label: 'Custom', tolerance: null } +] + +// Explicit, never sniffed from the text: "50" meaning half a percent or fifty +// pounds is not something to guess at. +export const TOLERANCE_UNITS = [ + { value: 'pct', label: '%' }, + { value: 'abs', label: 'abs' } +] + +/** How close two numbers have to be to count as the same figure. */ +export function useToleranceChoice() { + const toleranceId = ref('exact') + const customValue = ref('') + const customUnit = ref('pct') + // Empty, unparseable or non-positive reads as Exact: a zero threshold forgives + // nothing while claiming a tolerance is set. + const customTolerance = computed(() => { + const n = Number(String(customValue.value).trim()) + if (!Number.isFinite(n) || n <= 0) return null + return customUnit.value === 'abs' ? { abs: n } : { pct: n } + }) + const tolerance = computed(() => + toleranceId.value === 'custom' + ? customTolerance.value + : (TOLERANCES.find((t) => t.value === toleranceId.value)?.tolerance ?? null) + ) + + return { toleranceId, customValue, customUnit, tolerance } +} diff --git a/src/renderer/src/styles/ui.css b/src/renderer/src/styles/ui.css index 385aad25..342f7260 100644 --- a/src/renderer/src/styles/ui.css +++ b/src/renderer/src/styles/ui.css @@ -262,6 +262,24 @@ color: var(--danger-text); filter: brightness(1.08); } +/* How many of the things behind this button are set — the View options a reader + has changed, the columns keying the grid's rows. Height comes from --chip-h, + never from padding: that is how the Esc chip drifted to 19px beside a 26px + button. Face is the theme's own ink at 30%, the same step .btn.active takes — + --accent as a fill under a label scores under 4.5:1 on five themes. */ +.btn-count { + min-width: var(--chip-h); + height: var(--chip-h); + padding: 0 var(--space-1); + border-radius: var(--radius-pill); + background: var(--btn-face-press); + color: var(--text); + font-size: var(--font-xs); + font-weight: 700; + display: inline-flex; + align-items: center; + justify-content: center; +} /* --- Popover layer ------------------------------------------------------ A panel anchored to a button, dismissed by Escape or a press outside — the View options and the toolbar's overflow menu. Shared because there were diff --git a/src/renderer/src/types.js b/src/renderer/src/types.js index 2933e49c..ee4a5934 100644 --- a/src/renderer/src/types.js +++ b/src/renderer/src/types.js @@ -36,6 +36,15 @@ * @property {boolean} [truncated] the row cap was hit before the end */ +/** + * One column of the grid's display order. `left`/`right` index into that side's + * own rows; null means the column is absent there and renders as a ghost. + * @typedef {object} AlignedColumn + * @property {number|null} left + * @property {number|null} right + * @property {string} name the header label, or '' where the pairing was positional + */ + /** * What one cell carries beyond its value. Absent fields mean "nothing to say". * @typedef {object} CellMeta diff --git a/src/renderer/src/utils/alignColumns.js b/src/renderer/src/utils/alignColumns.js index a7f4dd0c..2997d54b 100644 --- a/src/renderer/src/utils/alignColumns.js +++ b/src/renderer/src/utils/alignColumns.js @@ -4,6 +4,9 @@ // the columns that survived; everything downstream works on those pairs. Pure. const MAX_COLUMNS = 4096 +// Bounded: past a handful of rows, a "header" is just the first row that happens +// to look like one. +const MAX_HEADER_SCAN = 10 // Widest row, not the header: a sheet may carry data past its own header. function widthOf(rows) { @@ -12,8 +15,8 @@ function widthOf(rows) { return Math.min(width, MAX_COLUMNS) } -function headerLabels(rows, width) { - const header = rows[0] ?? [] +function headerLabels(rows, width, at = 0) { + const header = rows[at] ?? [] const out = [] for (let i = 0; i < width; i++) { const v = header[i] @@ -22,10 +25,10 @@ function headerLabels(rows, width) { return out } -// Blank or repeated labels would pair columns by coincidence, and a lone row is -// data — a header describes the rows beneath it, and there are none. -function usable(labels, rowCount) { - if (!labels.length || rowCount < 2) return false +// Blank or repeated labels would pair columns by coincidence, and a header +// describes the rows beneath it, so it needs at least one. +function usable(labels, rowsBeneath) { + if (!labels.length || rowsBeneath < 1) return false const seen = new Set() for (const l of labels) { if (!l || seen.has(l)) return false @@ -34,6 +37,15 @@ function usable(labels, rowCount) { return true } +/** The first row that reads as a header, or null within `MAX_HEADER_SCAN`. */ +function headerRowIndex(rows, width) { + const limit = Math.min(rows.length, MAX_HEADER_SCAN) + for (let at = 0; at < limit; at++) { + if (usable(headerLabels(rows, width, at), rows.length - at - 1)) return at + } + return null +} + function lcsOps(a, b) { const n = a.length const m = b.length @@ -74,23 +86,37 @@ function positional(leftLabels, rightLabels) { } /** - * Pair the two sheets' columns into one display order. - * @returns {Array<{left: number|null, right: number|null, name: string}>} - * `left`/`right` index into that side's own rows; null means the column is - * absent there and renders as a ghost. + * Pair the two sheets' columns, and say which row the labels came from. + * @returns {{columns: Array<{left: number|null, right: number|null, name: string}>, + * headerRows: {left: number, right: number}|null}} `headerRows` is null when + * the pairing fell back to position — naming a row it did not use would claim + * the columns were matched by name. */ -export function alignColumns(leftRows = [], rightRows = []) { - const leftLabels = headerLabels(leftRows, widthOf(leftRows)) - const rightLabels = headerLabels(rightRows, widthOf(rightRows)) - if (!usable(leftLabels, leftRows.length) || !usable(rightLabels, rightRows.length)) { - return positional(leftLabels, rightLabels) - } +export function headerPairing(leftRows = [], rightRows = []) { + const leftAt = headerRowIndex(leftRows, widthOf(leftRows)) + const rightAt = headerRowIndex(rightRows, widthOf(rightRows)) + const leftLabels = headerLabels(leftRows, widthOf(leftRows), leftAt ?? 0) + const rightLabels = headerLabels(rightRows, widthOf(rightRows), rightAt ?? 0) + const byPosition = { columns: positional(leftLabels, rightLabels), headerRows: null } + if (leftAt === null || rightAt === null) return byPosition const byHeader = lcsOps(leftLabels, rightLabels) // Pairing a minority of the columns means the row was data, not headers — // `row-0 | v0` against `row-0 | w0` dropped column B out of the diff entirely. const paired = pairedColumns(byHeader).length const narrower = Math.min(leftLabels.length, rightLabels.length) - return paired * 2 > narrower ? byHeader : positional(leftLabels, rightLabels) + return paired * 2 > narrower + ? { columns: byHeader, headerRows: { left: leftAt, right: rightAt } } + : byPosition +} + +/** + * Pair the two sheets' columns into one display order. + * @returns {Array<{left: number|null, right: number|null, name: string}>} + * `left`/`right` index into that side's own rows; null means the column is + * absent there and renders as a ghost. + */ +export function alignColumns(leftRows = [], rightRows = []) { + return headerPairing(leftRows, rightRows).columns } /** The aligned columns present on BOTH sides — the ones a diff can compare. */ diff --git a/src/renderer/src/utils/matchRowsByKey.js b/src/renderer/src/utils/matchRowsByKey.js new file mode 100644 index 00000000..afb3d224 --- /dev/null +++ b/src/renderer/src/utils/matchRowsByKey.js @@ -0,0 +1,113 @@ +// Row pairing by the value a reader recognises the row BY, rather than by the +// whole row's contents. alignRows matches signatures in order, so the same +// export sorted differently reads as changed end to end; keying pairs across the +// whole sheet instead. Pure. +import { changedCells } from './alignRows' + +// A cell's text cannot contain it, so ['a','b'] and ['a b',''] stay two keys. +const SEPARATOR = '\u0000' + +function cellKey(value) { + return value === null || value === undefined ? '' : String(value).trim() +} + +/** + * One pairing key per row, built from that side's own column indices. + * Trimmed — a trailing space in an export is not a different account — but + * never case-folded, because `ACC-1` and `acc-1` are two accounts. + */ +export function compositeKeys(rows = [], columns = []) { + return rows.map((row) => columns.map((c) => cellKey(row?.[c])).join(SEPARATOR)) +} + +function queuesByKey(keys) { + const map = new Map() + for (let i = 0; i < keys.length; i++) { + const queue = map.get(keys[i]) + if (queue) queue.push(i) + else map.set(keys[i], [i]) + } + return map +} + +// A repeated key cannot say WHICH row is which, so the nth occurrence takes the +// nth — counted rather than hidden, because the reader has to know that. +function duplicateCount(leftQueues, rightQueues) { + const keys = new Set() + for (const [key, queue] of leftQueues) if (queue.length > 1) keys.add(key) + for (const [key, queue] of rightQueues) if (queue.length > 1) keys.add(key) + return keys.size +} + +function pairing(leftQueues, rightKeys, leftCount) { + const taken = new Map() + const leftFor = new Array(rightKeys.length).fill(null) + const matchedLeft = new Array(leftCount).fill(false) + for (let j = 0; j < rightKeys.length; j++) { + const queue = leftQueues.get(rightKeys[j]) + const at = taken.get(rightKeys[j]) ?? 0 + if (!queue || at >= queue.length) continue + taken.set(rightKeys[j], at + 1) + leftFor[j] = queue[at] + matchedLeft[queue[at]] = true + } + return { leftFor, matchedLeft } +} + +function pairEntry(leftRows, rightRows, at, tolerance) { + const changed = changedCells(leftRows[at.i], rightRows[at.j], tolerance) + return { + status: changed.length ? 'changed' : 'same', + left: leftRows[at.i], + right: rightRows[at.j], + leftIndex: at.i, + rightIndex: at.j, + changed + } +} + +const oneSided = (status, row, index) => ({ + status, + left: status === 'removed' ? row : null, + right: status === 'removed' ? null : row, + leftIndex: status === 'removed' ? index : null, + rightIndex: status === 'removed' ? null : index, + changed: [] +}) + +/** + * Pair two sheets' rows by key. Display order follows the RIGHT file — the one + * the reader has open — with a removed row emitted just before the first + * surviving left row that followed it, so it keeps its context. + * @returns {{rows: Array<{status:'same'|'changed'|'added'|'removed', left, right, + * leftIndex:number|null, rightIndex:number|null, changed:number[]}>, + * duplicateKeys:number}} + */ +export function matchRowsByKey(leftRows = [], rightRows = [], opts = {}) { + const leftKeys = opts.leftKeys ?? [] + const rightKeys = opts.rightKeys ?? [] + const tolerance = opts.tolerance ?? null + const leftQueues = queuesByKey(leftKeys) + const { leftFor, matchedLeft } = pairing(leftQueues, rightKeys, leftRows.length) + + const rows = [] + let cursor = 0 + const flushTo = (limit) => { + while (cursor < limit) { + if (!matchedLeft[cursor]) rows.push(oneSided('removed', leftRows[cursor], cursor)) + cursor++ + } + } + for (let j = 0; j < rightRows.length; j++) { + const i = leftFor[j] + if (i === null) { + rows.push(oneSided('added', rightRows[j], j)) + continue + } + flushTo(i) + rows.push(pairEntry(leftRows, rightRows, { i, j }, tolerance)) + } + flushTo(leftRows.length) + + return { rows, duplicateKeys: duplicateCount(leftQueues, queuesByKey(rightKeys)) } +} diff --git a/src/renderer/src/utils/spreadsheetDiff.js b/src/renderer/src/utils/spreadsheetDiff.js index 240b5d95..b7ebb7c4 100644 --- a/src/renderer/src/utils/spreadsheetDiff.js +++ b/src/renderer/src/utils/spreadsheetDiff.js @@ -1,7 +1,9 @@ -// Workbook diff: pair sheets by name, pair their columns (alignColumns), align -// each pair's rows (alignRows), roll up per-sheet stats. Pure. +// Workbook diff: pair sheets by name, pair their columns (headerPairing), align +// each pair's rows — by key where the reader named one, otherwise by whole-row +// signature (alignRows) — and roll up per-sheet stats. Pure. import { alignRows, rowKeys, valuesEqual } from './alignRows' -import { alignColumns, pairedColumns } from './alignColumns' +import { headerPairing, pairedColumns } from './alignColumns' +import { compositeKeys, matchRowsByKey } from './matchRowsByKey' import { comparableCell, comparableRows, metaAt, metaIndex } from './sheetCells' // 0 -> "A", 25 -> "Z", 26 -> "AA" (bijective base-26), for the grid's column @@ -73,30 +75,76 @@ function project(rows, indices) { return rows.map((row) => indices.map((i) => row[i])) } -function alignedRows(left, right, columns, opts) { - const pairs = pairedColumns(columns) - const keyColumn = opts.keyColumn ?? 0 - return alignRows( - project( +// Keys are chosen per sheet, because the columns are. A Map rather than an +// object: the sheet name comes from the file, and `__proto__` must not resolve +// to anything. +const keyColumnsFor = (keyColumns, name) => + keyColumns instanceof Map ? (keyColumns.get(name) ?? []) : [] + +// The columns a reader chose as the row's identity, as each side's own indices. +// A column only one side has cannot key both, so it is dropped rather than +// keying one side off a column the other does not have. +function keyColumnsOf(columns, chosen) { + const picked = (chosen ?? []) + .map((i) => columns[i]) + .filter((c) => c && c.left !== null && c.right !== null) + return { left: picked.map((c) => c.left), right: picked.map((c) => c.right) } +} + +function projected(left, right, pairs) { + return { + left: project( comparableRows(left), pairs.map((c) => c.left) ), - project( + right: project( comparableRows(right), pairs.map((c) => c.right) - ), - { - ...opts, - leftKeys: rowKeys(left.rows ?? [], pairs[keyColumn]?.left ?? 0), - rightKeys: rowKeys(right.rows ?? [], pairs[keyColumn]?.right ?? 0) - } - ) + ) + } +} + +function keyedRows(rows, keys, ctx) { + return matchRowsByKey(rows.left, rows.right, { + leftKeys: compositeKeys(ctx.leftRows, keys.left), + rightKeys: compositeKeys(ctx.rightRows, keys.right), + tolerance: ctx.tolerance + }) +} + +function signatureRows(rows, pairs, ctx) { + const keyColumn = ctx.opts.keyColumn ?? 0 + return { + rows: alignRows(rows.left, rows.right, { + ...ctx.opts, + leftKeys: rowKeys(ctx.leftRows, pairs[keyColumn]?.left ?? 0), + rightKeys: rowKeys(ctx.rightRows, pairs[keyColumn]?.right ?? 0) + }), + duplicateKeys: 0 + } +} + +function alignedRows(left, right, columns, opts) { + const pairs = pairedColumns(columns) + const rows = projected(left, right, pairs) + const ctx = { + leftRows: left.rows ?? [], + rightRows: right.rows ?? [], + tolerance: opts.tolerance ?? null, + opts + } + const keys = keyColumnsOf(columns, opts.keyColumns) + return keys.left.length ? keyedRows(rows, keys, ctx) : signatureRows(rows, pairs, ctx) } function bothSides(name, left, right, opts) { - const columns = alignColumns(left.rows ?? [], right.rows ?? []) + const { columns, headerRows } = headerPairing(left.rows ?? [], right.rows ?? []) const tolerance = opts.tolerance ?? null - const rows = alignedRows(left, right, columns, { ...opts, tolerance }) + const { rows, duplicateKeys } = alignedRows(left, right, columns, { + ...opts, + tolerance, + keyColumns: keyColumnsFor(opts.keyColumns, name) + }) // Where each paired column sits in the DISPLAY order, so a changed cell is // reported at the index the grid actually renders. const pairAt = columns.reduce((acc, c, i) => { @@ -122,6 +170,8 @@ function bothSides(name, left, right, opts) { columnsAdded: columns.filter((c) => c.left === null).length, columnsRemoved: columns.filter((c) => c.right === null).length, changes: total(stats), + headerRows, + duplicateKeys, ...state } } @@ -138,7 +188,7 @@ function oneSide(name, sheet, side) { formulaChanged: [] })) const own = sheet.rows ?? [] - const columns = side === 'left' ? alignColumns(own, []) : alignColumns([], own) + const { columns } = side === 'left' ? headerPairing(own, []) : headerPairing([], own) const stats = statsOf(rows) const state = side === 'left' ? sheetState(sheet, null) : sheetState(null, sheet) return { @@ -150,6 +200,8 @@ function oneSide(name, sheet, side) { columnsAdded: 0, columnsRemoved: 0, changes: total(stats), + headerRows: null, + duplicateKeys: 0, ...state } } @@ -163,6 +215,7 @@ function total(stats) { * stats:{changed:number,added:number,removed:number}, * columns:Array<{left:number|null,right:number|null,name:string}>, * columnsAdded:number, columnsRemoved:number, changes:number, + * headerRows:{left:number,right:number}|null, duplicateKeys:number, * hidden:boolean, hasFormulas:boolean, leftMeta:Map, rightMeta:Map, * leftHidden:Set, rightHidden:Set}>} */ diff --git a/src/shared/i18n/en-XA.json b/src/shared/i18n/en-XA.json index 38d39087..9331d4ad 100644 --- a/src/shared/i18n/en-XA.json +++ b/src/shared/i18n/en-XA.json @@ -973,6 +973,14 @@ "noSnippetsMatchTryRemoving": "[Ńō şńĩƥƥéţş ɱàţçĥ — ţřŷ řéɱōṽĩńğ à ƒĩłţéř. ·øé·øé·øé·øé·ø]", "newSnippetCta": "[Ńéŵ şńĩƥƥéţ ·øé·]" }, + "rowMatchMenu": { + "matchRows": "[Ṁàţçĥ řōŵş ·øé·]", + "tip": "[Çĥōōşé ţĥé çōłūɱńş ţĥàţ ńàɱé à řōŵ ·øé·øé·øé·øé]", + "byWholeRow": "[Řōŵş ƥàĩř ƀŷ ţĥéĩř ŵĥōłé çōńţéńţş. Řé-şōřţĩńğ ţĥé ƒĩłé đéƒéàţş ţĥàţ. ·øé·øé·øé·øé·øé·øé·øé·]", + "byKey": "[Řōŵş ƥàĩř ƀŷ ţĥé ţĩçķéđ çōłūɱńş, ŵĥéřéṽéř ţĥéŷ şĩţ ĩń ţĥé ƒĩłé. ·øé·øé·øé·øé·øé·øé·ø]", + "duplicates": "[{n} ķéŷ àƥƥéàřş ɱōřé ţĥàń ōńçé — ţĥōşé řōŵş ƥàĩř ĩń ţĥé ōřđéř ţĥéŷ àƥƥéàř | {n} ķéŷş àƥƥéàř ɱōřé ţĥàń ōńçé — ţĥōşé řōŵş ƥàĩř ĩń ţĥé ōřđéř ţĥéŷ àƥƥéàř ·øé·øé·øé·øé·øé·øé·øé·øé·øé·øé·øé·øé·øé·øé·øé]", + "useAuto": "[Ɓàçķ ţō ŵĥōłé-řōŵ ɱàţçĥĩńğ ·øé·øé·øé]" + }, "spreadsheetDiffViewer": { "customTolerance": "[Çūşţōɱ ţōłéřàńçé ·øé·øé]", "numbersCloserThanThisCount": "[Ńūɱƀéřş çłōşéř ţĥàń ţĥĩş çōūńţ àş ţĥé şàɱé ƒĩğūřé ·øé·øé·øé·øé·øé·ø]", @@ -988,7 +996,9 @@ "columns": "[Çōłūɱńş ·øé]", "backToTheValues": "[Ɓàçķ ţō ţĥé ṽàłūéş éàçĥ ƒōřɱūłà ƥřōđūçéđ ·øé·øé·øé·øé·ø]", "showFormulasNotResults": "[Šĥōŵ ƒōřɱūłàş, ńōţ řéşūłţş ·øé·øé·øé]", - "sheetOnlyIn": "[“{name}” ĩş ōńłŷ ĩń ţĥé {side} ƒĩłé ·øé·øé·øé·]" + "sheetOnlyIn": "[“{name}” ĩş ōńłŷ ĩń ţĥé {side} ƒĩłé ·øé·øé·øé·]", + "headerRow": "[Ĥéàđéř řōŵ {row} ·øé·ø]", + "headerRowEachSide": "[Ĥéàđéř řōŵ {left} · {right} ·øé·øé·ø]" }, "storageSettings": { "dataFolder": "[Đàţà ƒōłđéř ·øé·]", diff --git a/src/shared/i18n/en.json b/src/shared/i18n/en.json index 3202b6e7..2f28f6af 100644 --- a/src/shared/i18n/en.json +++ b/src/shared/i18n/en.json @@ -973,6 +973,14 @@ "noSnippetsMatchTryRemoving": "No snippets match — try removing a filter.", "newSnippetCta": "New snippet" }, + "rowMatchMenu": { + "matchRows": "Match rows", + "tip": "Choose the columns that name a row", + "byWholeRow": "Rows pair by their whole contents. Re-sorting the file defeats that.", + "byKey": "Rows pair by the ticked columns, wherever they sit in the file.", + "duplicates": "{n} key appears more than once — those rows pair in the order they appear | {n} keys appear more than once — those rows pair in the order they appear", + "useAuto": "Back to whole-row matching" + }, "spreadsheetDiffViewer": { "customTolerance": "Custom tolerance", "numbersCloserThanThisCount": "Numbers closer than this count as the same figure", @@ -988,7 +996,9 @@ "columns": "Columns", "backToTheValues": "Back to the values each formula produced", "showFormulasNotResults": "Show formulas, not results", - "sheetOnlyIn": "“{name}” is only in the {side} file" + "sheetOnlyIn": "“{name}” is only in the {side} file", + "headerRow": "Header row {row}", + "headerRowEachSide": "Header row {left} · {right}" }, "storageSettings": { "dataFolder": "Data folder", diff --git a/tests/renderer/composables/useKeyColumns.test.js b/tests/renderer/composables/useKeyColumns.test.js new file mode 100644 index 00000000..0982c2ca --- /dev/null +++ b/tests/renderer/composables/useKeyColumns.test.js @@ -0,0 +1,69 @@ +import { describe, expect, it } from 'vitest' +import { nextTick, ref } from 'vue' +import { useKeyColumns } from '../../../src/renderer/src/composables/useKeyColumns' + +describe('useKeyColumns', () => { + it('holds a choice per sheet name', () => { + const name = ref('Ledger') + const keys = useKeyColumns(() => name.value) + keys.toggleKeyColumn(0) + keys.toggleKeyColumn(2) + expect(keys.activeKeyColumns.value).toEqual([0, 2]) + name.value = 'Regions' + expect(keys.activeKeyColumns.value).toEqual([]) + name.value = 'Ledger' + expect(keys.activeKeyColumns.value).toEqual([0, 2]) + }) + + it('keeps the columns ascending however they were picked', () => { + const keys = useKeyColumns(() => 'S') + keys.toggleKeyColumn(3) + keys.toggleKeyColumn(1) + expect(keys.activeKeyColumns.value).toEqual([1, 3]) + }) + + it('drops the sheet entirely once its last column is toggled off', () => { + const keys = useKeyColumns(() => 'S') + keys.toggleKeyColumn(1) + keys.toggleKeyColumn(1) + expect(keys.activeKeyColumns.value).toEqual([]) + expect(keys.bySheet.value.has('S')).toBe(false) + }) + + it('clears only the active sheet', () => { + const name = ref('A') + const keys = useKeyColumns(() => name.value) + keys.toggleKeyColumn(0) + name.value = 'B' + keys.toggleKeyColumn(1) + keys.clearKeyColumns() + expect(keys.activeKeyColumns.value).toEqual([]) + name.value = 'A' + expect(keys.activeKeyColumns.value).toEqual([0]) + }) + + // The picker is mounted only for a real sheet, but a toggle arriving between + // one comparison and the next must not mint a key under `undefined`. + it('ignores a toggle with no sheet to attach it to', () => { + const keys = useKeyColumns(() => undefined) + keys.toggleKeyColumn(0) + keys.clearKeyColumns() + expect(keys.bySheet.value.size).toBe(0) + }) + + it('starts a new pair of files on Auto', async () => { + const files = ref('first') + const keys = useKeyColumns(() => 'Ledger', [() => files.value]) + keys.toggleKeyColumn(0) + files.value = 'second' + await nextTick() + expect(keys.activeKeyColumns.value).toEqual([]) + }) + + it('does not watch anything when given no reset sources', async () => { + const keys = useKeyColumns(() => 'Ledger') + keys.toggleKeyColumn(0) + await nextTick() + expect(keys.activeKeyColumns.value).toEqual([0]) + }) +}) diff --git a/tests/renderer/composables/useSpreadsheetDiff.test.js b/tests/renderer/composables/useSpreadsheetDiff.test.js index 28309bc4..26576bc3 100644 --- a/tests/renderer/composables/useSpreadsheetDiff.test.js +++ b/tests/renderer/composables/useSpreadsheetDiff.test.js @@ -99,3 +99,89 @@ describe('a tolerance of your own', () => { expect(tolerance.value).toBeNull() }) }) + +describe('useSpreadsheetDiff — key columns', () => { + const ledger = (rows) => [{ name: 'Ledger', rows }] + const header = ['Account', 'Centre', 'Amount'] + const left = ledger([header, ['1001', 'EMEA', 500], ['1002', 'APAC', 300]]) + const right = ledger([header, ['1002', 'APAC', 300], ['1001', 'EMEA', 500]]) + + const loaded = () => { + const store = useDiffStore() + store.left = book(left) + store.right = book(right) + return useSpreadsheetDiff() + } + + it('reads a re-sorted sheet as changed until a key column is named', () => { + const diff = loaded() + expect(diff.identical.value).toBe(false) + diff.toggleKeyColumn(0) + expect(diff.activeKeyColumns.value).toEqual([0]) + expect(diff.identical.value).toBe(true) + }) + + it('toggles a column back off and returns to Auto', () => { + const diff = loaded() + diff.toggleKeyColumn(0) + diff.toggleKeyColumn(0) + expect(diff.activeKeyColumns.value).toEqual([]) + expect(diff.identical.value).toBe(false) + }) + + it('keeps the columns in ascending order however they were picked', () => { + const diff = loaded() + diff.toggleKeyColumn(1) + diff.toggleKeyColumn(0) + expect(diff.activeKeyColumns.value).toEqual([0, 1]) + }) + + it('holds a choice per sheet', () => { + const store = useDiffStore() + const rows = [header, ['1001', 'EMEA', 500]] + store.left = book([ + { name: 'Ledger', rows }, + { name: 'Other', rows } + ]) + store.right = book([ + { name: 'Ledger', rows }, + { name: 'Other', rows } + ]) + const diff = useSpreadsheetDiff() + diff.toggleKeyColumn(0) + diff.select(1) + expect(diff.activeKeyColumns.value).toEqual([]) + diff.select(0) + expect(diff.activeKeyColumns.value).toEqual([0]) + }) + + it('clears the active sheet’s keys', () => { + const diff = loaded() + diff.toggleKeyColumn(0) + diff.clearKeyColumns() + expect(diff.activeKeyColumns.value).toEqual([]) + }) + + // Two workbooks routinely share a sheet name, so a key held by name would + // otherwise carry silently into the next comparison. + it('starts a new pair of files on Auto', async () => { + const store = useDiffStore() + const diff = loaded() + diff.toggleKeyColumn(0) + store.left = book(ledger([header, ['9001', 'EMEA', 1]])) + await Promise.resolve() + expect(diff.activeKeyColumns.value).toEqual([]) + }) + + it('reports the duplicate keys the choice leaves ambiguous', () => { + const store = useDiffStore() + const rows = [header, ['1001', 'EMEA', 500], ['1001', 'APAC', 300]] + store.left = book([{ name: 'Ledger', rows }]) + store.right = book([{ name: 'Ledger', rows }]) + const diff = useSpreadsheetDiff() + diff.toggleKeyColumn(0) + expect(diff.activeSheet.value.duplicateKeys).toBe(1) + diff.toggleKeyColumn(1) + expect(diff.activeSheet.value.duplicateKeys).toBe(0) + }) +}) diff --git a/tests/renderer/utils/alignColumns.test.js b/tests/renderer/utils/alignColumns.test.js index 0bee5e06..1ab69ceb 100644 --- a/tests/renderer/utils/alignColumns.test.js +++ b/tests/renderer/utils/alignColumns.test.js @@ -1,5 +1,9 @@ import { describe, expect, it } from 'vitest' -import { alignColumns, pairedColumns } from '../../../src/renderer/src/utils/alignColumns' +import { + alignColumns, + headerPairing, + pairedColumns +} from '../../../src/renderer/src/utils/alignColumns' const pairs = (cols) => cols.map((c) => [c.left, c.right]) @@ -143,6 +147,124 @@ describe('alignColumns — positional fallback', () => { }) }) +// A title row above the header is the shape every exported pack has, and it used +// to drop the whole sheet to positional pairing — the exact failure header +// pairing exists to prevent. +describe('alignColumns — header below a title row', () => { + const left = [ + ['Trial balance as at 31 Dec 2024'], + ['Account', 'Debit', 'Credit'], + ['1001', 500, 0], + ['1002', 0, 300] + ] + + it('finds the header under a title row and keeps an insert from shifting', () => { + const right = [ + ['Trial balance as at 31 Dec 2025'], + ['Account', 'Debit', 'Note', 'Credit'], + ['1001', 500, '', 0], + ['1002', 0, '', 300] + ] + expect(pairs(alignColumns(left, right))).toEqual([ + [0, 0], + [1, 1], + [null, 2], + [2, 3] + ]) + }) + + // Each of these inserts a column, so header pairing and positional pairing + // give different answers and the assertion can tell them apart. + it('pairs when only one side carries the title row', () => { + const right = [ + ['Account', 'Debit', 'Note', 'Credit'], + ['1001', 500, '', 0], + ['1002', 0, '', 300] + ] + expect(pairs(alignColumns(left, right))).toEqual([ + [0, 0], + [1, 1], + [null, 2], + [2, 3] + ]) + }) + + it('skips blank rows on the way down', () => { + const l = [['Q3 pack'], [], ['Region', 'Q1', 'Q2'], ['North', 1, 2], ['South', 3, 4]] + const r = [ + ['Region', 'New', 'Q1', 'Q2'], + ['North', 9, 1, 2], + ['South', 9, 3, 4] + ] + expect(pairs(alignColumns(l, r))).toEqual([ + [0, 0], + [null, 1], + [1, 2], + [2, 3] + ]) + }) + + it('gives up rather than scanning an unbounded preamble', () => { + const preamble = Array.from({ length: 12 }, (_, i) => [`note ${i}`]) + const l = [...preamble, ['Region', 'Q1', 'Q2'], ['North', 1, 2]] + const r = [...preamble, ['Region', 'New', 'Q1', 'Q2'], ['North', 9, 1, 2]] + expect(pairs(alignColumns(l, r))).toEqual([ + [0, 0], + [1, 1], + [2, 2], + [null, 3] + ]) + }) + + it('names the columns from the header it found, not from the title row', () => { + const right = [ + ['Trial balance as at 31 Dec 2025'], + ['Account', 'Debit', 'Credit'], + ['1001', 500, 0], + ['1002', 0, 300] + ] + expect(alignColumns(left, right).map((c) => c.name)).toEqual(['Account', 'Debit', 'Credit']) + }) +}) + +describe('headerPairing', () => { + it('reports the row each side was read from', () => { + const l = [['Pack'], ['Region', 'Q1'], ['North', 1], ['South', 2]] + const r = [ + ['Region', 'Q1'], + ['North', 1], + ['South', 2] + ] + expect(headerPairing(l, r).headerRows).toEqual({ left: 1, right: 0 }) + }) + + // Naming a header row the pairing did not use would tell the reader the + // columns were matched by name when they were matched by position. + it('reports no header row when the pairing fell back to position', () => { + const l = [ + ['row-0', 'v0'], + ['row-1', 'v1'] + ] + const r = [ + ['row-0', 'w0'], + ['row-1', 'w1'] + ] + expect(headerPairing(l, r).headerRows).toBeNull() + }) + + it('returns the same columns alignColumns does', () => { + const l = [ + ['Region', 'Q1'], + ['North', 1] + ] + const r = [ + ['Region', 'Q2'], + ['North', 2] + ] + expect(headerPairing(l, r).columns).toEqual(alignColumns(l, r)) + }) +}) + describe('pairedColumns', () => { it('keeps only the columns a diff can compare', () => { const cols = [ diff --git a/tests/renderer/utils/matchRowsByKey.test.js b/tests/renderer/utils/matchRowsByKey.test.js new file mode 100644 index 00000000..d1610bc1 --- /dev/null +++ b/tests/renderer/utils/matchRowsByKey.test.js @@ -0,0 +1,165 @@ +import { describe, expect, it } from 'vitest' +import { compositeKeys, matchRowsByKey } from '../../../src/renderer/src/utils/matchRowsByKey' +import { alignRows } from '../../../src/renderer/src/utils/alignRows' + +const statuses = (result) => result.rows.map((e) => e.status) +const keysOf = (result) => result.rows.map((e) => (e.left ?? e.right)[0]) + +const byColumn = (left, right, columns = [0], opts = {}) => + matchRowsByKey(left, right, { + leftKeys: compositeKeys(left, columns), + rightKeys: compositeKeys(right, columns), + ...opts + }) + +describe('matchRowsByKey', () => { + // The reopened-track defect: the same export sorted differently reads as + // changed end to end, because the LCS matches whole-row signatures in order. + const ledger = [ + ['1001', 500], + ['1002', 300], + ['1003', 120] + ] + const resorted = [ + ['1003', 120], + ['1002', 300], + ['1001', 500] + ] + + it('pairs re-sorted rows that the row-signature LCS cannot', () => { + expect(statuses({ rows: alignRows(ledger, resorted) })).not.toEqual(['same', 'same', 'same']) + expect(statuses(byColumn(ledger, resorted))).toEqual(['same', 'same', 'same']) + }) + + it('reports the cell that moved, not the row that moved', () => { + const right = [ + ['1003', 120], + ['1002', 999], + ['1001', 500] + ] + const { rows } = byColumn(ledger, right) + expect(statuses({ rows })).toEqual(['same', 'changed', 'same']) + expect(rows[1].changed).toEqual([1]) + expect(rows[1].leftIndex).toBe(1) + expect(rows[1].rightIndex).toBe(1) + }) + + it('keys on more than one column', () => { + const left = [ + ['1001', 'EMEA', 500], + ['1001', 'APAC', 300] + ] + const right = [ + ['1001', 'APAC', 300], + ['1001', 'EMEA', 500] + ] + expect(statuses(byColumn(left, right, [0]))).not.toEqual(['same', 'same']) + expect(statuses(byColumn(left, right, [0, 1]))).toEqual(['same', 'same']) + }) + + it('marks a row only one side has', () => { + const right = [ + ['1003', 120], + ['1004', 80] + ] + const result = byColumn(ledger, right) + expect(statuses(result)).toEqual(['removed', 'removed', 'same', 'added']) + expect(keysOf(result)).toEqual(['1001', '1002', '1003', '1004']) + }) + + // A removed row belongs beside the rows it sat next to, not in a heap at the + // end: it is emitted just before the first surviving left row that followed it. + it('follows the right file’s order and keeps a removed row in place', () => { + const left = [ + ['A', 1], + ['B', 2], + ['C', 3], + ['D', 4] + ] + const right = [ + ['D', 4], + ['B', 2], + ['A', 1] + ] + const result = byColumn(left, right) + expect(keysOf(result)).toEqual(['C', 'D', 'B', 'A']) + expect(statuses(result)).toEqual(['removed', 'same', 'same', 'same']) + }) + + it('pairs duplicate keys in order of occurrence and counts them', () => { + const left = [ + ['X', 1], + ['X', 2], + ['Y', 3] + ] + const right = [ + ['X', 1], + ['Y', 3] + ] + const result = byColumn(left, right) + expect(result.duplicateKeys).toBe(1) + expect(statuses(result)).toEqual(['same', 'removed', 'same']) + expect(result.rows[1].leftIndex).toBe(1) + }) + + it('counts a key duplicated on the right too', () => { + const left = [['X', 1]] + const right = [ + ['X', 1], + ['X', 2] + ] + const result = byColumn(left, right) + expect(result.duplicateKeys).toBe(1) + expect(statuses(result)).toEqual(['same', 'added']) + }) + + // A blank key is a key. Letting it match anything would pair a spacer row with + // whatever happened to be unmatched. + it('treats a blank key as a key, not a wildcard', () => { + const left = [ + ['', 1], + ['', 2], + ['A', 3] + ] + const right = [ + ['', 1], + ['A', 3] + ] + const result = byColumn(left, right) + expect(statuses(result)).toEqual(['same', 'removed', 'same']) + }) + + it('applies the tolerance to a matched pair', () => { + const left = [['1001', 500]] + const right = [['1001', 500.004]] + expect(statuses(byColumn(left, right))).toEqual(['changed']) + expect(statuses(byColumn(left, right, [0], { tolerance: { abs: 0.01 } }))).toEqual(['same']) + }) + + it('handles an empty side', () => { + expect(statuses(byColumn([], ledger))).toEqual(['added', 'added', 'added']) + expect(statuses(byColumn(ledger, []))).toEqual(['removed', 'removed', 'removed']) + }) +}) + +describe('compositeKeys', () => { + it('trims, so a trailing space in an export is not a different account', () => { + expect(compositeKeys([['1001 ']], [0])).toEqual(compositeKeys([['1001']], [0])) + }) + + it('does not fold case — two accounts are two accounts', () => { + expect(compositeKeys([['ACC-1']], [0])).not.toEqual(compositeKeys([['acc-1']], [0])) + }) + + // Joining on a separator a cell can contain would let ['a','b'] and ['a b'] + // collide into one key. + it('cannot collide two different key tuples into one', () => { + const [ab] = compositeKeys([['a', 'b']], [0, 1]) + const [joined] = compositeKeys([['a b', '']], [0, 1]) + expect(ab).not.toBe(joined) + }) + + it('reads a missing cell as blank', () => { + expect(compositeKeys([[null], [undefined], []], [0])).toEqual(['', '', '']) + }) +}) diff --git a/tests/renderer/utils/spreadsheetDiff.test.js b/tests/renderer/utils/spreadsheetDiff.test.js index cdac8a76..50fdfa38 100644 --- a/tests/renderer/utils/spreadsheetDiff.test.js +++ b/tests/renderer/utils/spreadsheetDiff.test.js @@ -208,3 +208,133 @@ describe('diffWorkbooks — sheet state', () => { expect(s.rightHidden.has(1)).toBe(false) }) }) + +describe('diffWorkbooks — row identity by key columns', () => { + // Keys are named per sheet, so the option is keyed by sheet name. + const keys = (columns) => new Map([['Ledger', columns]]) + + // The same ledger, re-sorted, with one amount moved and one line dropped. + const left = [ + sheet('Ledger', [ + ['Account', 'Cost centre', 'Amount'], + ['1001', 'EMEA', 500], + ['1002', 'EMEA', 300], + ['1002', 'APAC', 120], + ['1003', 'APAC', 80] + ]) + ] + const right = [ + sheet('Ledger', [ + ['Account', 'Cost centre', 'Amount'], + ['1002', 'APAC', 120], + ['1003', 'APAC', 999], + ['1001', 'EMEA', 500] + ]) + ] + + it('reads a re-sorted export as changed when no key is named', () => { + const [s] = diffWorkbooks(left, right) + expect(s.stats.changed + s.stats.added + s.stats.removed).toBeGreaterThan(1) + }) + + it('pairs by the named key columns instead', () => { + const [s] = diffWorkbooks(left, right, { keyColumns: keys([0, 1]) }) + expect(s.stats).toEqual({ changed: 1, added: 0, removed: 1 }) + }) + + // The grid renders the display order, so a changed cell reported in paired + // space would point at the wrong column the moment a column is one-sided. + it('reports the changed cell in DISPLAY column space', () => { + const withGap = [ + sheet('Ledger', [ + ['Account', 'Note', 'Amount'], + ['1001', 'x', 500] + ]) + ] + const noGap = [ + sheet('Ledger', [ + ['Account', 'Amount'], + ['1001', 900] + ]) + ] + const [s] = diffWorkbooks(withGap, noGap, { keyColumns: keys([0]) }) + expect(s.columns.map((c) => c.name)).toEqual(['Account', 'Note', 'Amount']) + expect(s.rows[1].changed).toEqual([2]) + }) + + it('ignores a key column only one side has', () => { + const [s] = diffWorkbooks(left, right, { keyColumns: keys([0, 1, 9]) }) + expect(s.stats).toEqual({ changed: 1, added: 0, removed: 1 }) + }) + + it('counts duplicate keys rather than hiding the ambiguity', () => { + const [s] = diffWorkbooks(left, right, { keyColumns: keys([0]) }) + expect(s.duplicateKeys).toBe(1) + const [exact] = diffWorkbooks(left, right, { keyColumns: keys([0, 1]) }) + expect(exact.duplicateKeys).toBe(0) + }) + + it('leaves the tolerance working through the key path', () => { + const near = [ + sheet('Ledger', [ + ['Account', 'Amount'], + ['1001', 500.004] + ]) + ] + const base = [ + sheet('Ledger', [ + ['Account', 'Amount'], + ['1001', 500] + ]) + ] + expect(diffWorkbooks(base, near, { keyColumns: keys([0]) })[0].stats.changed).toBe(1) + const forgiving = diffWorkbooks(base, near, { + keyColumns: keys([0]), + tolerance: { abs: 0.01 } + }) + expect(forgiving[0].stats.changed).toBe(0) + }) +}) + +describe('diffWorkbooks — header row', () => { + const withTitle = (note) => + sheet('S', [[note], ['Region', 'Q1', 'Q2'], ['North', 1, 2], ['South', 3, 4]]) + + it('reports the row each side’s headers came from', () => { + const [s] = diffWorkbooks( + [withTitle('Pack')], + [ + sheet('S', [ + ['Region', 'Q1', 'Q2'], + ['North', 1, 2], + ['South', 3, 4] + ]) + ] + ) + expect(s.headerRows).toEqual({ left: 1, right: 0 }) + }) + + it('reports none when the columns fell back to positional pairing', () => { + const [s] = diffWorkbooks( + [ + sheet('S', [ + ['row-0', 'v0'], + ['row-1', 'v1'] + ]) + ], + [ + sheet('S', [ + ['row-0', 'w0'], + ['row-1', 'w1'] + ]) + ] + ) + expect(s.headerRows).toBeNull() + }) + + it('leaves a one-sided sheet without a header claim', () => { + const [s] = diffWorkbooks([sheet('Gone', [['a'], ['b']])], []) + expect(s.headerRows).toBeNull() + expect(s.duplicateKeys).toBe(0) + }) +}) From da742ef82fb5d2524726f8c3a028d58f34fda60d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mindaugas=20Kasparavic=CC=8Cius?= Date: Sun, 9 Aug 2026 22:09:16 +0300 Subject: [PATCH 2/3] fix(diagram): a restored Mermaid pair opens as a picture, not as text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every load path already defaulted to the diagram view — the file dialog, a drop, `diffbro compare`, a relaunched session — because receive() and comparePasted() both ask shouldOpenSemantic. restore() did not: it replayed `payload.semanticView === true`, so a snapshot that recorded NOTHING (saved before the diagram view existed, or carried by a bundle that never wrote the field) came back as text. The view is now a tri-state on the way in: an explicitly recorded view is kept, either way, and only an absent one is taken from the files. That needed session.js to stop coercing an unrecorded view to false, or the distinction never survived being read back. restoredSemanticView lives beside shouldOpenSemantic in viewChrome.js: inlining it put restore() over the complexity cap and diffStore over its line ratchet, and the rule belongs with the one it defers to. tabsStore._withCurrentView no longer forces semanticView at all. It must not INHERIT it either — the toggle belongs to the comparison, not to the reader's last tab (tabsStore.test.js already guarded that, and caught the first attempt) — so an unrecorded view is left for restore() to resolve from the files. Co-Authored-By: Claude Opus 5 --- src/renderer/src/stores/diffStore.js | 4 +- src/renderer/src/stores/tabsStore.js | 8 ++-- src/renderer/src/utils/session.js | 2 +- src/renderer/src/utils/viewChrome.js | 8 ++++ .../renderer/stores/diffStore.diagram.test.js | 44 +++++++++++++++++++ tests/renderer/stores/tabsStore.test.js | 19 ++++++++ tests/renderer/utils/session.test.js | 25 +++++++++++ tests/renderer/utils/viewChrome.test.js | 21 +++++++++ 8 files changed, 124 insertions(+), 7 deletions(-) diff --git a/src/renderer/src/stores/diffStore.js b/src/renderer/src/stores/diffStore.js index 778370c9..57d8ad2a 100644 --- a/src/renderer/src/stores/diffStore.js +++ b/src/renderer/src/stores/diffStore.js @@ -4,7 +4,7 @@ import { structureAdapter } from '../adapters/structureAdapter' import { csvAdapter } from '../adapters/csvAdapter' import { diffStructures, structuredKind } from '../utils/structuralDiff' import { delimitedKind } from '../utils/csv' -import { shouldOpenSemantic } from '../utils/viewChrome' +import { restoredSemanticView, shouldOpenSemantic } from '../utils/viewChrome' import { useVaultStore } from './vaultStore' import { useSnippetStore } from './snippetStore' import { isSecret } from '../utils/secretSnippet' @@ -669,7 +669,7 @@ export const useDiffStore = defineStore('diff', { this.pasteRightName = payload.pasteRightName ?? '' this.renderSideBySide = payload.renderSideBySide ?? true this.ignoreTrimWhitespace = payload.ignoreTrimWhitespace ?? false - this.semanticView = payload.semanticView === true + this.semanticView = restoredSemanticView(payload, this) this.mode = payload.mode ?? 'files' // Opened from a saved diff: it already exists in the vault, so replacing // it later needs no "you'll lose it" prompt. diff --git a/src/renderer/src/stores/tabsStore.js b/src/renderer/src/stores/tabsStore.js index ec8e38be..5fda8a46 100644 --- a/src/renderer/src/stores/tabsStore.js +++ b/src/renderer/src/stores/tabsStore.js @@ -114,15 +114,15 @@ export const useTabsStore = defineStore('tabs', { this._capture() this._show(next) }, - // A snapshot that says nothing about the view keeps the one in use: only a - // saved diff, which recorded its own, should change how the panes are set. + // A snapshot that says nothing about the PANES keeps the ones in use. NOT + // semanticView: it belongs to the comparison, not to the last tab, so an + // unrecorded one is left for restore() to take from the files. _withCurrentView(snapshot) { const diff = useDiffStore() return { ...snapshot, renderSideBySide: snapshot.renderSideBySide ?? diff.renderSideBySide, - ignoreTrimWhitespace: snapshot.ignoreTrimWhitespace ?? diff.ignoreTrimWhitespace, - semanticView: snapshot.semanticView === true + ignoreTrimWhitespace: snapshot.ignoreTrimWhitespace ?? diff.ignoreTrimWhitespace } }, _fill(tab, snapshot, { diffSaved, entryId, name }) { diff --git a/src/renderer/src/utils/session.js b/src/renderer/src/utils/session.js index acd45ec5..0064797d 100644 --- a/src/renderer/src/utils/session.js +++ b/src/renderer/src/utils/session.js @@ -60,7 +60,7 @@ export function readSnapshot(raw) { pasteRightName: str(raw.pasteRightName), renderSideBySide: raw.renderSideBySide !== false, ignoreTrimWhitespace: raw.ignoreTrimWhitespace === true, - semanticView: raw.semanticView === true + semanticView: typeof raw.semanticView === 'boolean' ? raw.semanticView : undefined } } diff --git a/src/renderer/src/utils/viewChrome.js b/src/renderer/src/utils/viewChrome.js index f16c736c..01cbab16 100644 --- a/src/renderer/src/utils/viewChrome.js +++ b/src/renderer/src/utils/viewChrome.js @@ -50,3 +50,11 @@ export const showsWhitespaceToggle = (store) => * @returns {boolean} */ export const shouldOpenSemantic = (store) => !!store?.canCompareDiagram || !!store?.delimitedFormat + +/** + * The view a restored snapshot opens in: the one it recorded, or — where it + * recorded none, having been saved before the diagram view or by a bundle that + * never wrote it — whatever the files themselves ask for. + */ +export const restoredSemanticView = (payload, store) => + typeof payload?.semanticView === 'boolean' ? payload.semanticView : shouldOpenSemantic(store) diff --git a/tests/renderer/stores/diffStore.diagram.test.js b/tests/renderer/stores/diffStore.diagram.test.js index d6b2185c..64209989 100644 --- a/tests/renderer/stores/diffStore.diagram.test.js +++ b/tests/renderer/stores/diffStore.diagram.test.js @@ -65,3 +65,47 @@ describe('diagram comparison from pasted text', () => { expect(diff.comparableKind).toBe('diagram') }) }) + +// A saved or shared diff carries the view it was saved in. One that carries +// NOTHING — written before the diagram view existed, or by a bundle that never +// recorded it — used to come back as text, which is the one place a Mermaid +// pair did not open as a picture. +describe('restoring a diagram comparison', () => { + const mmd = (body) => `flowchart TD\n${body}\n` + const payload = (extra) => ({ + left: { path: null, name: 'a.mmd', content: mmd(' A --> B') }, + right: { path: null, name: 'b.mmd', content: mmd(' A --> C') }, + mode: 'files', + ...extra + }) + + it('opens the picture when the snapshot says nothing about the view', () => { + const diff = useDiffStore() + diff.restore(payload()) + expect(diff.semanticView).toBe(true) + expect(diff.comparableKind).toBe('diagram') + }) + + it('honours a snapshot that explicitly recorded text', () => { + const diff = useDiffStore() + diff.restore(payload({ semanticView: false })) + expect(diff.semanticView).toBe(false) + expect(diff.comparableKind).toBe('text') + }) + + it('keeps the picture when the snapshot recorded it', () => { + const diff = useDiffStore() + diff.restore(payload({ semanticView: true })) + expect(diff.semanticView).toBe(true) + }) + + it('leaves a plain-text pair alone', () => { + const diff = useDiffStore() + diff.restore({ + left: { path: null, name: 'a.txt', content: 'one' }, + right: { path: null, name: 'b.txt', content: 'two' }, + mode: 'files' + }) + expect(diff.semanticView).toBe(false) + }) +}) diff --git a/tests/renderer/stores/tabsStore.test.js b/tests/renderer/stores/tabsStore.test.js index ef77ebd1..cc061b24 100644 --- a/tests/renderer/stores/tabsStore.test.js +++ b/tests/renderer/stores/tabsStore.test.js @@ -785,6 +785,25 @@ describe('the structure toggle belongs to its comparison', () => { expect(diff.semanticView).toBe(true) }) + // ...and a comparison that IS a picture opens as one, in a new tab as much as + // in the first: the toggle is taken from the files, never from the tab before. + it('opens a Mermaid pair as a diagram in a fresh tab', () => { + const diff = useDiffStore() + const tabs = useTabsStore() + const mmd = (body) => ({ + mode: 'files', + left: { path: '/tmp/a.mmd', name: 'a.mmd', content: `flowchart TD\n${body}` }, + right: { path: '/tmp/b.mmd', name: 'b.mmd', content: 'flowchart TD\n A --> C' } + }) + tabs.init() + tabs.open(json('{"a":1}', '{"a":2}')) + expect(diff.semanticView).toBe(false) + + tabs.open(mmd(' A --> B')) + expect(diff.semanticView).toBe(true) + expect(diff.comparableKind).toBe('diagram') + }) + it('comes back with a restored session, like the other view toggles', async () => { window.api = { vaultEncrypt: async (text, aad) => vaultEncrypt(SESSION_KEY, text, aad), diff --git a/tests/renderer/utils/session.test.js b/tests/renderer/utils/session.test.js index a2b23b4a..96266f77 100644 --- a/tests/renderer/utils/session.test.js +++ b/tests/renderer/utils/session.test.js @@ -318,3 +318,28 @@ describe('packSession — a half-loaded tab is reset, not blanked', () => { expect(packed.tabs[0].customTitle).toBe('prod vs staging') }) }) + +// A stored session says what the reader chose; a session that predates the +// choice must stay SILENT about it, so the store can take the view from the +// files rather than being told "text" by a field that was never written. +describe('readSession — the view a snapshot never recorded', () => { + const withView = (view) => { + const raw = JSON.parse(JSON.stringify(packSession([tab('tab-1')], 'tab-1'))) + if (view === undefined) delete raw.tabs[0].snapshot.semanticView + else raw.tabs[0].snapshot.semanticView = view + return readSession(JSON.stringify(raw)).tabs[0].snapshot.semanticView + } + + it('leaves an unrecorded view undefined, not false', () => { + expect(withView(undefined)).toBeUndefined() + }) + + it('keeps a recorded view, either way', () => { + expect(withView(true)).toBe(true) + expect(withView(false)).toBe(false) + }) + + it('still refuses a value that is not a boolean', () => { + expect(withView('yes')).toBeUndefined() + }) +}) diff --git a/tests/renderer/utils/viewChrome.test.js b/tests/renderer/utils/viewChrome.test.js index 4b714aa1..5f8947cd 100644 --- a/tests/renderer/utils/viewChrome.test.js +++ b/tests/renderer/utils/viewChrome.test.js @@ -1,5 +1,6 @@ import { describe, expect, it } from 'vitest' import { + restoredSemanticView, shouldOpenSemantic, hasStatusBand, showsSplitView, @@ -124,3 +125,23 @@ describe('shouldOpenSemantic', () => { expect(shouldOpenSemantic(undefined)).toBe(false) }) }) + +describe('restoredSemanticView', () => { + const diagram = { canCompareDiagram: true } + + it('keeps the view the snapshot recorded, either way', () => { + expect(restoredSemanticView({ semanticView: false }, diagram)).toBe(false) + expect(restoredSemanticView({ semanticView: true }, {})).toBe(true) + }) + + it('takes it from the files when the snapshot recorded none', () => { + expect(restoredSemanticView({}, diagram)).toBe(true) + expect(restoredSemanticView({}, { delimitedFormat: 'csv' })).toBe(true) + expect(restoredSemanticView({}, { structuredFormat: 'json' })).toBe(false) + }) + + it('treats a non-boolean as no record at all', () => { + expect(restoredSemanticView({ semanticView: 'yes' }, diagram)).toBe(true) + expect(restoredSemanticView(null, diagram)).toBe(true) + }) +}) From 105c88a7f2da8a4dfdb08c54b181bb7448a4eff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mindaugas=20Kasparavic=CC=8Cius?= Date: Sun, 9 Aug 2026 22:10:15 +0300 Subject: [PATCH 3/3] docs: the diagram default and the second-commit audit record Co-Authored-By: Claude Opus 5 --- docs/roadmap.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/roadmap.md b/docs/roadmap.md index 5466f1b6..2f32b11f 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -143,6 +143,9 @@ flowchart LR u --> v["DiagramDiffViewer.vue
+ change rail"] ``` +- A `.mmd` pair opens AS a picture — every load path takes the view from the + files, and a restored snapshot that recorded none does too rather than + falling back to text (`viewChrome.js` `restoredSemanticView`) - Status is encoded twice — colour AND stroke pattern — and the three tokens are held to a contrast floor and a pairwise ΔE floor on all 20 themes by `check-theme-depth.mjs`