Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
711fc4a
feat(core): take the shared foundation the new modules stand on
ndlabdev Sep 6, 2026
d992203
fix(core): make the shared foundation hold what it claims to
ndlabdev Sep 6, 2026
95ea349
feat(features): take all sixteen feature modules
ndlabdev Sep 6, 2026
85d86e0
refactor(features): let each barrel offer only what something asks for
ndlabdev Sep 6, 2026
712534c
feat(components): take the thirteen parts, and drop the two that sold…
ndlabdev Sep 6, 2026
1c64a21
refactor(components): sort the parts by what they are, not by when th…
ndlabdev Sep 6, 2026
f6038aa
feat(api): open the surface, and prove the promise that comes with it
ndlabdev Sep 6, 2026
6165202
test: bring over the suites that needed no grid around them
ndlabdev Sep 6, 2026
9905e7f
test: bring over the suites built around the component that no longer…
ndlabdev Sep 6, 2026
66b650e
refactor(api): offer a panel the way every other part is offered
ndlabdev Sep 6, 2026
c13d4e9
refactor: say it in characters a keyboard has, and in one product's w…
ndlabdev Sep 6, 2026
00aef27
refactor(filtering): compare a value in one place instead of three
ndlabdev Sep 6, 2026
b815f1a
refactor(api): a barrel offers what something asks for, and nothing else
ndlabdev Sep 6, 2026
352a6e4
feat(demos): take the seventeen playground routes, and mend what they…
ndlabdev Sep 6, 2026
ef36c34
fix: four defects a deep review found in the new modules
ndlabdev Sep 6, 2026
3bf4a0b
refactor: keep the comments a reader hovers, drop the ones that shout
ndlabdev Sep 6, 2026
83b7b76
feat(demos): take the last two routes, and give a grid its own overrides
ndlabdev Sep 7, 2026
8592831
test(benchmarks): take the budgets the new modules were measured against
ndlabdev Sep 7, 2026
bf83cb4
refactor: keep a doc block only where somebody can hover it
ndlabdev Sep 7, 2026
7e695fe
refactor: stop exporting what nothing imports, and give every barrel …
ndlabdev Sep 7, 2026
5562628
test(barrels): hold the shape so it cannot drift back
ndlabdev Sep 7, 2026
8a6b066
feat(demos): a menu for the routes this release adds
ndlabdev Sep 7, 2026
e56bf2e
fix(pagination): let a page number wider than 2rem fit its button
ndlabdev Sep 7, 2026
033eecc
fix: let a column with an accessor show what a feature computed for it
ndlabdev Sep 8, 2026
bc8e7ec
fix(status-bar): count rows, not the furniture around them
ndlabdev Sep 8, 2026
a4021f9
fix(advanced-filter): read a column of Date objects as dates
ndlabdev Sep 8, 2026
5ffd085
fix: draw the text a typed column cannot parse instead of swallowing it
ndlabdev Sep 8, 2026
57722a0
feat(api): export getGridContext and getGridElement
ndlabdev Sep 8, 2026
00be3ef
fix(show-values-as): say when percentOfParent has nothing to divide by
ndlabdev Sep 8, 2026
959d811
docs: write down what the release actually contains
ndlabdev Sep 8, 2026
01b5c47
test(api): pin the xlsx entry, which nothing was watching
ndlabdev Sep 8, 2026
4ce55fd
fix: stop a boolean column claiming a value it does not have
ndlabdev Sep 8, 2026
738c61f
fix: hold a height on a grid that has not registered virtualization
ndlabdev Sep 8, 2026
1314c68
test(range-selection): pin the fill handle dragged down
ndlabdev Sep 8, 2026
dc4e255
docs: record the two old defects, and how to check an expression
ndlabdev Sep 8, 2026
b739743
fix(status-bar): count the rows a filter left, not the rows that are …
ndlabdev Sep 8, 2026
3f1fa5d
fix(a11y): tell a screen reader the number the status bar shows
ndlabdev Sep 9, 2026
01fcfd2
fix(find-replace): bring the next match into view on a grid that scrolls
ndlabdev Sep 9, 2026
8259c80
fix(a11y): say how many columns a full-width cell covers
ndlabdev Sep 10, 2026
3054338
fix(server-row-model): draw its hierarchy as one, and ask once per sn…
ndlabdev Sep 10, 2026
f235a7f
fix(advanced-filter): stop reporting itself broken on a server that a…
ndlabdev Sep 10, 2026
0583131
docs: record the three server-mode defects
ndlabdev Sep 10, 2026
9fc078b
fix(server): a share is not measured against what happens to be loaded
ndlabdev Sep 11, 2026
be3ae93
Merge pull request #47 from ndlabdev/feat/merge-w0-core
ndlabdev Sep 11, 2026
6f94989
chore(release): 2.0.0
ndlabdev Sep 11, 2026
68db377
test: give two timing gates the headroom every other budget has
ndlabdev Sep 11, 2026
52c5c44
test: measure the worker handoff against two frames, not one
ndlabdev Sep 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 4 additions & 6 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@ body:
value: |
Thanks for the suggestion. Please search existing issues first.

Row grouping, a tree data model, master and detail rows, range selection,
aggregation and xlsx export are deliberately not in this package; they are
planned for a separate pro package. The kernel already renders nested rows as a
`treegrid`, and infinite scroll is a shape this package supports today —
`rowModel: 'server'` with `virtualization()`, appending as the window nears the
end of what is loaded. See `/server/infinite` in the playground.
Row grouping, tree data, master and detail rows, range selection,
aggregation and xlsx export all ship here. Register the feature module
you need and check the playground route for it before opening an issue:
a request that is already answered costs you a wait and us a reply.

- type: textarea
id: problem
Expand Down
354 changes: 299 additions & 55 deletions CHANGELOG.md

Large diffs are not rendered by default.

95 changes: 95 additions & 0 deletions MIGRATING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# Upgrading to 2.0

Almost everything in this release is additive: register a feature you did not
have before and it works. Four things are not, and this is all of them.

## `DataGridLabels` gained 147 members

The new features brought their own wording, and the label table is one table.
If you hand the grid a subset, which is the usual way, nothing changes:

```ts
createDataGrid({ labels: { search: 'Find...' }, columns, data, getRowId })
```

If you built a complete `DataGridLabels` of your own and passed it as the base
of `mergeLabels`, it no longer type-checks, because it is now missing 147
members. Merge onto the built-in table instead:

```diff
-mergeLabels(overrides, myCompleteTable)
+mergeLabels({ ...myCompleteTable, ...overrides })
```

## A blank cell now passes `neq` on a number

A text column has always kept a blank on `notEqual`: a cell with no word in it
is not the word being excluded. A number column dropped it, from one guard
applied to every numeric comparator at once. They agree now, and the text
reading is the one that won.

If you were relying on `neq` to exclude blanks, say so:

```diff
setColumnFilter('score', {
- kind: 'number', op: 'neq', value: 5
+ kind: 'group',
+ join: 'and',
+ conditions: [
+ { kind: 'number', op: 'neq', value: 5 },
+ { kind: 'number', op: 'notBlank' }
+ ]
})
```

The server contract's reference implementation in
`src/tests/server-contract-ops.test.ts` shows the same rule, so a server you
wrote against it needs the same change.

## A typed column draws text it cannot parse

A `type: 'number'` column handed `notanumber`, or a `type: 'date'` column
handed `1234-56-78`, used to draw an empty cell. The value was in the row and
the editor opened on it; only the screen said nothing was there. It now falls
back to the raw text, so what the data holds is what you see.

A blank cell is unaffected: `null`, `undefined` and `''` still draw the
column's `emptyText`.

This reaches masking too. A `policy()` rule that substitutes a string into a
typed column used to blank the cell; the mark is drawn now, which is what the
same rule already did on an untyped column.

If you assert on a cell that cannot be parsed, it changed:

```diff
-expect(cell.textContent).toBe('')
+expect(cell.textContent).toBe('notanumber')
```

## The loading skeleton draws cells

A row of skeletons used to be a `role="row"` around plain divs, which a screen
reader cannot read and axe reports. Its cells now carry `role="gridcell"`.

A test asserting that no `gridcell` exists while loading will fail. Assert on
what it meant instead - that no data is on screen:

```diff
-expect(container.querySelectorAll('[role="gridcell"]')).toHaveLength(0)
+const cells = [...container.querySelectorAll('[role="gridcell"]')]
+expect(cells.every((cell) => cell.textContent?.trim() === '')).toBe(true)
```

## Worth knowing, but not breaking

`DateFilterOp` gained `notEqual`. A `switch` of your own over that union is no
longer exhaustive, which TypeScript will point out if you asked it to.

The footer's page range separates the two numbers with a hyphen; it used to use
an en dash. If you snapshot that string, it changed.

A grid's language is set per grid, through `locales` and `locale` on
`createDataGrid`. That has not changed, but it is worth repeating now that
there is far more wording to translate: two grids on one page may speak
different languages, and nothing global has to be put back afterwards.
Loading