Changelog
Added
- A column takes
editor: { type: "time" }, a masked time of day with a matching validator and a { type: "time-range" } filter
Fixed
- A time from an Excel sheet now arrives as the time the person saw, and a date hidden behind a time format drops away
Added
- The date picker names months in the editor's
locale, so a French calendar reads in French with no translations passed
Fixed
- A date now imports however the file writes it,
01/05/26, 2026.05.01, 01-May-2026, 20260501, 2026年5月1日, an Excel serial, or a stamp carrying a time or an era
- A column of dates now reads by its own values, and a spelled-out month reads in the editor's
locale wherever the date arrives
- A number now imports through any grouping a file uses,
1,234, 1'234.56, 12,34,567.89, a non-breaking space between the groups, or scientific notation out of XLSX
- The grid now prints a date and a number the way the browser writes them, the apostrophe of de-CH, the narrow space of fr-FR, and a year in the first century included
- A date and a number sent through
loadData are now each read by the column they land in, and a value nothing separates falls to the browser locale and reports through onError
- A column that declares
decimalSeparator and thousandsSeparator on its editor now renders by them in the grid as well as in the cell editor
- A date and a number filter now follows the column's own format, so the range placeholder shows its separators and a select filter matches the rows it lists
- A row seeded through
originalValues reads as untouched when only the format differed
- A
multiselect column now exports its stored values and accepts a delimited string through loadData
transformer now runs on a select and a multiselect column wherever a value enters the editor, once per token
- The chat assistant now writes a number as the digits its column keeps, and a rewrite carrying the value already in the cell stops counting as an edit
- A number formula run over a text column stores its result as text, and a column of plain whole numbers stays quiet on
onError
- A modal, a drawer, and a confirmation dialog now fade out as one piece and leave the screen
Added
- Change header row on the column-matching step reopens header selection for the file being matched, and a column mapped by hand keeps its choice when its header reads the same on the new row
Fixed
- Header detection now picks the header row more precisely
- A transform that writes an empty value into a column the file never carried now leaves the row unchanged, so
onComplete returns only the rows the user edited
- The Changed rows count now returns to zero once the last change is undone
- A multiselect cell written with a different separator from the rest of the column now keeps every value, including one spelled slightly differently from the option it matches
Fixed
asyncFunction now correctly runs in a React app mounted in StrictMode
Added
- The
date rule in validators takes min and max as inclusive YYYY-MM-DD bounds, and the cell's date picker offers exactly that range
- The
number rule in validators takes min, max and decimalPlaces, and the cell's number editor takes its minus gate and its decimal limit from the same rule
Removed
numeric and range in validators, both replaced by the number rule
format on the date rule, and a date column is now checked as YYYY-MM-DD
minDate, maxDate, decimalPlaces and allowChars on the date and number editors, and both editors read their limits from the column's rule
Fixed
- A date or number column accepted a value it could not convert, and it now flags that value even when the column declares no rule
- Rows arriving through
loadData skipped transformer and kept the date format they came in with, and they now go through the same conversion an imported file does
- An export wrote the values the grid painted, and it now writes the stored form, with numbers typed in JSON and XLSX
Removed
- The
{ type: "expression" } rule is gone from validators, and a column that needs custom logic uses { type: "function", fn }
Fixed
Added
onUnstructuredFile takes an optional handler for a file that holds no single table, and your own AI model or parser turns it into tables
- The side panel of the data editor becomes a strip with icon buttons under 1024px
Added
- The column matching step turns each column from the file into a dropdown, and it opens five example values from that column
Fixed
Changed
- A
translations override for the primary key step sat under dataEditor.uploader.steps.primaryKey and dataEditor.uploader.primaryKey, and it now sits under dataEditor.uploader.steps.addOrUpdate and dataEditor.uploader.addOrUpdate
Added
primaryKey takes a list of columns as one composite key, and an imported row updates an existing one only when every column in that list matches
Changed
- An import into a grid that already held rows slowed down as it ran, and it now holds one speed from the first row to the last
Fixed
- A cell kept its duplicate mark after an import replaced the other copy of the value, and the mark now clears as soon as the value is unique
Fixed
- The count on the Rows with empty cells filter disagreed with the rows the filter returned, and the two now report the same rows
Added
customFormats takes a parser you supply, and a file the importer cannot read now goes through it into the grid like a spreadsheet