Release Notes

DataGrid Changelog

Every release of @sv5ui/datagrid from 1.0.0 on, which is where its API came under semver. It is a separate package with its own version numbers, so nothing here lines up with an sv5ui release of the same name.

v1.3.0 Latest August 24, 2026 GitHub
New Features
  • A filter row under the header: filtering({ floatingRow: true }) , or <DataGrid floatingFilters /> . One field per column in the operator that column already uses, with a date picker, a searchable list of ticks for a set, and a summary that opens the panel for what one field cannot hold docs →
  • Header groups fold. columnGroupShow on a child makes its group foldable, collapsed gives it a starting state, and collapseMode: 'rail' folds the whole group away behind a labelled drawer. The header, the column menu, the keyboard and grid.api.toggleGroup all reach it docs →
  • cellValue : a feature can stand between a cell and every way its value leaves the grid, the cell, the tooltip, CSV, the clipboard, the quick filter's text, a set filter's list and an editor's draft. Sorting and filter predicates deliberately stay raw docs →
  • cellDecoration.style writes declarations onto a cell for the values a class cannot name: a colour scale, a bar width, a custom property a pseudo-element reads docs →
  • headerGroupCell draws a group header the way headerCell draws a leaf one, and the grid keeps its fold control beside whatever the snippet draws docs →
Improvements
  • Date filters are a date picker in the panel as well as in the new row, so a year still being typed is never read as a filter over the whole set docs →
  • The column menu of every column in a foldable group carries the fold action, and the announcer says which way it went docs →
  • A snapshot carries folded groups under columns.collapsed , keyed by group rather than by column, so folding and hiding stay apart docs →
Bug Fixes
  • Focus survives a column disappearing. Hiding a column, or folding one away with its group, used to leave the roving tabindex pointing past the last column, and a grid whose one tab stop that was could not be tabbed into at all docs →
  • A date-only string with a year under 100 is the year it spells. new Date(y, m, d) reads two digits as 19xx, so a field reporting 0002 while someone was still typing jumped to 1902 docs →
v1.2.0 August 18, 2026 GitHub
New Features
  • onExportAll on the toolbar and on Grid.ExportMenu takes over the "all rows" item, for the set the grid does not hold. Under rowModel: 'server' the item is named "Loaded rows" without it, because one page is all there is to write docs →
  • The server request carries two decisions it used to leave to guesswork: quickFields , the columns a bare query applies to, and nulls on every sort entry, written as the side blanks actually land on so ORDER BY ... NULLS LAST reproduces the client ordering docs →
  • initialColumns on column virtualization bounds what renders before the viewport is measured, which is every server-rendered paint. Twenty thousand columns used to mount every one of them for a frame docs →
  • A locale pack may be partial. English answers for whatever it leaves out, so a pack of five strings works and one written against an older version keeps building when a new string is named docs →
Improvements
  • The quick filter matches the text a cell draws as well as the value behind it, so a currency column answers to $127,691.00 and a percent column to 45% . The text is built once per row and held, so the first keystroke pays for the pass and the rest are a substring test each docs →
  • Sorting reads each column once per row rather than twice per comparison, sorts positions rather than nodes, and specializes the comparator to a column of plain numbers or strings. An accessor used to be called on the order of 1.7 million times for 100k rows docs →
  • A number, currency or percent column parses what an editor or the clipboard hands it, so the row keeps holding a number rather than the string that was typed. Text that is not a number goes to validation rather than being stored as NaN docs →
  • The column range is found by binary search rather than by walking from the first column, so scrolling far to the right no longer costs the whole column list per frame docs →
Bug Fixes
  • Dates stop drifting by a day. A date-only string is the calendar day it spells rather than UTC midnight, date filters compare calendar days in the reader's own zone and accept epoch numbers, a date column sorts as dates whatever form a row holds, the date editor opens on a Date object, and CSV and clipboard write the day the cell drew rather than a UTC instant docs →
  • A set filter keys its values the way its checklist does, so a column holding Date objects matches what was ticked and a filter restored from a snapshot is the one that was saved docs →
  • A percent column's filter panel speaks percentages: type 5 to find the cells reading 5%, while the model keeps the row's own units, so a persisted filter and a server request still mean 0.05 docs →
  • Enter commits without turning the page. Committing on the last row of a page used to page the grid, taking the row just edited off the screen; arrow keys still cross docs →
  • A Select or a date editor inside a row edit draws one focus ring rather than two, through the new cellEditorInRowWidget slot docs →
v1.1.0 August 13, 2026 GitHub
New Features
  • A cell snippet receives formatted : the text the built-in renderer would have printed. Declaring type and cell together is how a column keeps its formatting and decorates around it, rather than restating its own typeOptions docs →
  • Every cell callback receives column - cell , cellClass , tooltip , colSpan and rowSpan . A renderer that needs its own def, alignment or id had no way to reach them docs →
  • formatted on exportCsv and copySelection writes what the grid is showing rather than the value behind it. Off by default, because a spreadsheet wants a number it can sum docs →
Improvements
  • tooltip: true shows what the cell shows, through sv5ui's Tooltip . It used to return the raw value as a native title , so a currency column reading $204,000.00 had a tooltip saying 204000 . The automatic tooltip for clipped text is untouched docs →
  • Twenty-eight symbols left the package entry, the formatters among them. A 1.0 surface should carry what an app does with the grid rather than what happens to exist inside it; the formatted field above is what replaced the formatters docs →
Bug Fixes
  • toSortRequest finds a column that lives under a header group. The lookup was a flat find, so a grouped grid sent an empty sort: the arrow moved, the request went out, and the rows came back in the order they left, with nothing to say why docs →
  • ui.headerCell typography reaches a sortable column's label. The label sits in the button that toggles the sort, and a button refuses text-transform and text-align from its parent, so a themed header came out in the wrong case docs →
  • A row pinned to the bottom draws its separator on the edge facing the rows rather than the one facing the grid border, where it read as a doubled line docs →
v1.0.0 August 10, 2026 GitHub
New Features
  • rowCountChanged - emitted by setRowCount under rowModel: "server" when the total differs from the one before. It is the moment a server model learns how many rows it has, and the announcer reads that count rather than counting the page docs →
  • registerDataGridIcons and datagridIcons are exported. Nothing needs to call the registrar now that the import covers it, except a grid behind a dynamic import() whose module may load after the app draws its own icons docs →
Improvements
  • Select-all adds the rows in view to the selection instead of replacing it, and clearing takes those rows back out. Under a server model, ticking the header on page 2 used to drop everything chosen on page 1; under a filter it dropped the rows the filter hid. clear() still empties the selection docs →
Bug Fixes
  • setQuickFilter from app code survives the toolbar. The quick filter box owned both directions of the sync in one effect and wrote its own value back over the call in the same flush, so a saved view, a deep link or a "clear all" button was a silent no-op wherever <DataGrid toolbar /> was used docs →
  • A grid on rowModel: "server" stays on the page it is showing. Focusing a body cell turned to the page that row sits on, arithmetic that only holds when the grid holds the whole dataset, so every click past page 1 snapped back to page 1 and fetched it docs →
  • A server model numbers its rows from the page it holds. The row index was offset by the page, so Space , Ctrl+C and type-to-edit reached the wrong row or nothing at all, and aria-rowindex ran past the aria-rowcount the grid reported docs →
  • A server model tells a screen reader where in the whole set the page sits. aria-rowcount counted one page and aria-rowindex counted from 1 within it, so every page read as "row 1 of 10" docs →
  • A click anywhere in the selection column toggles its row. The checkbox is 18x18 inside a 44x40 cell, so 18% of the column was live and the rest looked identical and did nothing docs →
  • The bundled icons register when the grid is imported rather than when a grid mounts, so an icon the app drew first no longer flickers in when its fetch lands docs →