Changelog
Release notes and version history.
v1.9.0
DataGridFree cell editing, cards on narrow screens, your own filter operators, and a ready-made SQL server package.
- @kanunilabs/datagrid-core@1.9.0
- @kanunilabs/datagrid@1.8.0
- @kanunilabs/datagrid-react@1.7.0
- @kanunilabs/datagrid-enterprise@1.9.0
- @kanunilabs/datagrid-react-enterprise@1.8.0
- @kanunilabs/datagrid-server@1.0.0
Before you upgrade
- A footer or group total on a number column with no formatter now groups its digits in the grid's locale and keeps at most two decimals (
260,064,641.94instead of260064641.94). A column or summary formatter still decides when you set one. - A filter condition whose operator the column does not know now matches no rows; before, it let every row through. A saved view that names an operator the column no longer registers is the likely source, and
debugModenames it on the console. createRestDataSourcenow sendssummariesandparentKeyin the query string, JSON-encoded likesortandfilter, when the grid asks for footer totals or a tree level. A server that refuses unknown parameters has to accept them.- With grouping on the server,
summariesnow comes with the load request of every grouping level, not only the top one, so sub-group totals can be filled (they stayed empty before). The footer is still read from the answer for the top level only (Enterprise). - An edit on a column whose
iddiffers from itsfieldnow writes the row'sfield; before, it wrote a property named after theid. - In the Enterprise grid a refused
onSavenow shows its error dialog; before, the dialog was cleared before it could appear. - The plain-JavaScript grid lays out right to left for Arabic, as the React grid already did.
- Cell editing is free:
editingon the Community React grid andcreateGrid({ editing: {} })in plain JavaScript open an in-cell editor on double-click, F2 or typing. Enter commits and moves down, Tab moves on, Esc cancels, andonSavegets each committed cell. Edit modes, validation rules, adding and deleting rows, undo, ranges, fill and paste stay Enterprise. - Cards on narrow screens:
cardViewdraws each row as a card (a title, then labelled fields) when the grid is narrower than a breakpoint (600px by default), with a Sort by control in place of the headers. Sorting, filtering, selection, grouping, server data and virtual scrolling keep working; editing stands down while cards are shown, andonCardViewChangetells you when the grid switches. - Your own filter operators: a column's
filterOperators({ id, label, test, operandType }) appear in the operator menu and in the Enterprise filter builders, andrenderFilterputs your own control in the filter cell. The condition stays plain data, so saved views and a server carry it unchanged. valueParserturns typed and pasted text into the stored value before validation runs, andvalueSetterwrites it for nested or immutable data.wrapHeaderTexton a column breaks a long caption onto more lines, andautoHeaderHeightlets the header grow to the tallest caption.@kanunilabs/datagrid-server, a new free package: it turns the grid's load request (sort, filter, quick search, paging, footer totals, server grouping and tree levels) into parameterized SQL for PostgreSQL, MySQL, SQLite and SQL Server, with the grid's own filter meaning. It has no dependencies; you pass the function that runs a query.createRestDataSource({ distinctValues: true })offers the header filter checklist from the same endpoint.
- A number total with no formatter groups its digits in the grid's locale, like the row count beside it.
- An operator id the column does not register matches no rows instead of every row.
- With fewer than 20,000 rows, the React grid could stay on "No data" after it mounted, in every version since 1.0.0: the first view was computed before the component had subscribed to it, and the update was lost. The rows now appear on first paint. Larger datasets, which go through the Web Worker, the plain-JavaScript grid and PivotGrid were not affected.
- A REST grid's footer stayed empty and a server tree could not tell which level was asked for:
summariesandparentKeywere never sent, and returnedsummarieswere dropped. - Accessibility: the filter row's cells are grid cells; the confirm and error dialog keeps Tab inside it, as
aria-modalpromises, with ids unique per dialog; the focus ring, selection and editor stay visible in Windows high-contrast mode. - The Enterprise grid never showed the dialog for a refused save.
v1.10.0
PivotGridQuick search over the rows, a cap on runaway columns, and accessibility fixes.
- @kanunilabs/pivotgrid-core@1.10.0
- @kanunilabs/pivotgrid@1.5.0
- @kanunilabs/pivotgrid-react@1.7.0
- @kanunilabs/pivotgrid-enterprise@1.6.0
- @kanunilabs/pivotgrid-react-enterprise@1.7.0
Before you upgrade
- A pivot with more than 1,000 column members now draws the first 1,000 and says so above the table; the totals still count all the data. Set
maxColumnsto raise the cap, or0to turn it off. - The filter and remove icons on a field chip are no longer buttons, because a control inside the chip's own button cannot be reached as a second control by a screen reader. Mouse clicks work as before; from the keyboard, Alt+ArrowDown on the chip opens its filter and Delete removes it. A test or script that selected
button.kanuni-pivot-chip-btnshould select.kanuni-pivot-chip-btn. - The summary badge on a value field (SUM, AVG…) is drawn in the text colour on an accent tint with an accent border, instead of accent-coloured text.
- Quick search:
searchputs a box in the footer that shows only the row members whose caption contains the text, with the members above them, on top of the reader's own filters;setSearchText(text)does the same from code. Nothing is saved with the layout, so clearing it gives the view back. maxColumns(1,000 by default): a field with a different value on almost every row no longer freezes the page when it is dropped on the columns.getEngineResult().columnsTruncatedreports{ shown, total }. Exports are not cut: they keep every column.- Alt+ArrowDown on a field chip opens its member filter, announced in the chip's key description in twelve languages.
- The pivot grid has an accessible name, and keeps its focus ring and selection visible in Windows high-contrast mode.
- The summary badge on a value field measured 2.77:1 contrast, below the 4.5:1 that small text needs.
v1.8.0
DataGrid36 colour schemes and a Theme Builder, flex columns, row animation, rich tooltips, and a viewport row model.
- @kanunilabs/datagrid-core@1.8.0
- @kanunilabs/datagrid@1.7.0
- @kanunilabs/datagrid-react@1.6.0
- @kanunilabs/datagrid-enterprise@1.8.0
- @kanunilabs/datagrid-react-enterprise@1.7.0
Before you upgrade
- Four structure themes are renamed:
quartzis nowminimal,balhamisledger,materialiselevatedandalpineisframed, and theirkanuni-datagrid-theme-*classes with them. An old name is a type error in TypeScript; in plain JavaScript it is treated as a theme of your own and falls back to the default look.
- 36 colour schemes, light and dark, on the
paletteprop, each measured against WCAG AA contrast and shipped as its own stylesheet (themes/<id>.css,themes/all.css). The free Theme Builder on kanunilabs.com/theme-builder designs your own and exports the CSS. - Flex columns that share the grid's free width, exact filtering and sorting of integers beyond 2^53 with a
bigintcolumn type, pinning a row from its menu, column spans (colSpan) and row animation (animateRows). - Tooltips that open on keyboard focus and on touch, can be interactive and can hold your own content.
- Find without filtering with Ctrl+F, selecting a whole column from its header, renaming a column inside the grid, clipboard callbacks, your own side panels, and editing a group total that is spread over its rows (Enterprise).
- A viewport row model: the server pushes only the rows on screen, and their changes (Enterprise).
- Charts: named series palettes in the Format dialog — Classic, Colour-blind safe, Vivid, One colour — kept at 3:1 contrast with the chart background, and
colorsfor your own list (Enterprise).
- Four structure themes are renamed:
minimal,ledger,elevated,framed. - A range chart with one value column says it needs two instead of drawing empty axes (Enterprise).
- A group's subtotal stayed stale after a cell under it was edited.
- In React, the range anchor cell lost its custom renderer.
v1.9.0
PivotGrid36 colour schemes, row density, chart palettes, and the grand-total flags read the way they are documented.
- @kanunilabs/pivotgrid-core@1.9.0
- @kanunilabs/pivotgrid@1.4.0
- @kanunilabs/pivotgrid-react@1.6.0
- @kanunilabs/pivotgrid-enterprise@1.5.0
- @kanunilabs/pivotgrid-react-enterprise@1.6.0
Before you upgrade
showRowGrandTotalsnow controls the grand total row andshowColumnGrandTotalsthe grand total column, as documented; before, each switched the other — in both renderers, the exports and the clipboard. An app that turned off only one of them sees the other one hidden now; if you had swapped the two to get the right result, swap them back.- In the header filter list a tick always means "shown", in include and exclude mode alike. A saved filter is read the same; only what the list displays changed.
- The footer toolbar buttons get the padding they were meant to have (a 27px target at normal density), so the toolbar is a little taller than in 1.8.0.
- 36 colour schemes, light and dark, as stylesheets next to the grid's own (
themes/<id>.css), named bytheme={{ id }}; they reach every popup and dialog. The theme object gainsheaderBackgroundandheaderTextfor a header band apart from the panels. - Row density:
density'compact' | 'normal' | 'comfortable'(24, 28 or 36px rows), andsetDensity()in plain JavaScript. - Charts: named series palettes — Classic, Colour-blind safe, Vivid, One colour — kept at 3:1 contrast with the chart background, and
colorsfor your own list; a Colours picker in the JavaScript chart's Format dialog, and the names onChartFactory'spalette(Enterprise).
- The rows behind a clicked cell are found when
recordsis first read, matching the cell's path first: 31–62 ms per click on a million rows, down from 300–490 ms. - A range chart with one measure says it needs two instead of drawing empty axes (Enterprise).
- The grand-total flags were swapped everywhere: the row flag drew the column and the other way round.
- Top N "Others": its outer row was empty and its summary added up instead of applying the summary formula.
- The header filter list showed ticks the other way round in exclude mode, and the field-settings and save-view windows were laid out wrongly in React.
- The footer toolbar buttons painted as bare 15px icons with no hover border.
- The React
localeprop was documented as defaulting to Turkish; it defaults to English.
v1.7.0
DataGridFormulas, server-side data in the free edition, a separate group column, and much more for charts.
- @kanunilabs/datagrid-core@1.7.0
- @kanunilabs/datagrid@1.6.0
- @kanunilabs/datagrid-react@1.5.0
- @kanunilabs/datagrid-enterprise@1.7.0
- @kanunilabs/datagrid-react-enterprise@1.6.0
Before you upgrade
- A plain click on a chart category keeps every category on the chart, the others dimmed; before, it narrowed the chart to the clicked one. Ctrl/Cmd-click works as before.
- A remove and an add of the same row id in one
applyTransactionAsyncnow replace the row; before, they cancelled each other out. - Loading rows from a server no longer needs a licence. On a Community grid fed by a server, the grouping, server tree and whole-result export entries are not offered; those stay Enterprise.
- Formulas. A column can be a spreadsheet formula over its row (
formula: '[Price] * [Qty]', Community); withcalculatedColumnsyour users add, edit and remove their own from the column menu, with a live preview (Enterprise); and withallowFormulasa cell can hold=A1*B2, kept on the same cells through sorting and filtering (Enterprise). Noeval, so it runs under a strict Content-Security-Policy. - Excel exports write calculated columns and cell formulas as live Excel formulas, and a column's
exportLinkmakes its cells hyperlinks in Excel and PDF (Enterprise). - Master-detail details in Excel and PDF exports: each master row's detail table under it, from
masterDetail.export(Enterprise). - A separate group column:
grouping.display: 'column'puts the group names in their own column instead of a banner. - Charts: floating windows and several charts per grid, a chart in your own container (
charting.container), detach and reattach, a chart from a selected cell range painted in the grid, text, label angle, grid and series line options, an axis label formatter, a calendar date format,first/lastaggregations, a column's chart role, cross-filtering on several categories, and category selection from the keyboard (Enterprise). - Sparklines: horizontal bars,
[x, y]and object data on a number or time axis, line and area styles, markers, value labels, your own colours and a multi-line tooltip. - Sorting: by magnitude (
absoluteSort), the click cycle per column, and a hook after every sort. - Rows that cannot be selected (
selection.isRowSelectable), numbered page buttons (pagination.pageButtons), and several cell ranges with Ctrl/Cmd (Enterprise). - Server-side data: rows that fail to load say so with a Retry button,
invalidate({ background: true })refreshes without the loading overlay, and Expand all opens server groups as they arrive. - Saved views also keep footer aggregations, group footers, folded column bands and open server groups; selection, focus, scroll and cell ranges on request (
include). - Accessibility: the grid name (
ariaLabel), named tree and band toggles, and in the JavaScript grid keyboard access to headers, filters and menus and announced size and selection.
- Loading rows from a server is now in the Community edition. Grouping on the server, a server tree and an export of the whole result stay Enterprise, and are not offered on a Community grid fed by a server.
- A plain click on a chart category keeps the others visible, dimmed.
- The loading overlay also shows while a slow recompute the grid itself started is running.
- A refresh of server data that failed emptied the grid: a flat grid turned every row into a Retry row and a server-grouped one collapsed to a single row. The rows now keep their last data.
applyTransactionAsynccancelled a remove and an add of the same row in one transaction instead of replacing the row.- Saved views were not written after collapsing a group or changing the page or page size, and a view restored onto a server-grouped grid while its first load ran could stall on one loading row.
- The group panel's Expand all / Collapse all were English in every language.
- The chart ignored an external filter on the Web Worker path.
- In the JavaScript grid, Enter and Space did not press the numbered page buttons.
v1.8.0
PivotGridValue and label filters, live updates in batches, a histogram, and fewer pauses in React.
- @kanunilabs/pivotgrid-core@1.8.0
- @kanunilabs/pivotgrid@1.3.0
- @kanunilabs/pivotgrid-react@1.5.0
- @kanunilabs/pivotgrid-enterprise@1.4.0
- @kanunilabs/pivotgrid-react-enterprise@1.5.0
- Value and label filters: keep members by their totals or their names, from code or the header menu (Community); the AI state schema carries them (Enterprise).
applyTransactionAsync: a fast stream of updates is applied in batches instead of one recompute each.- Date grouping by ISO week, and percent of the parent row or column total.
- A histogram chart, floating chart windows, several charts per grid, detach and reattach, and category selection from the keyboard (Enterprise).
- Accessibility: the tree layout is a tree grid with row levels, sort and filter changes are announced, the focused element is the one a screen reader follows, and the React drill-down window is a real dialog in the grid's language.
- React: a wide pivot draws the visible cells once per change instead of three or four times — far fewer pauses while scrolling and filtering.
- The free JavaScript package is about 21 KB smaller.
- On a page with several pivot grids, one grid could drive another's engine.
- A bare ISO date was read a day early west of UTC.
- The user's display mode and date range were lost on a refresh, and a pending saved view was not written when the grid was destroyed.
- Changing only Top N or "Others" did not recompute.
- Percent displays on an unformatted field showed plain numbers.
- Ctrl+C threw on a page without clipboard access.
- The React "expand all" icon was drawn closed.
v1.7.2
PivotGridWide pivots stop freezing on load; a partial layout no longer empties the grid.
- @kanunilabs/pivotgrid-core@1.7.2
- @kanunilabs/pivotgrid@1.2.2
- @kanunilabs/pivotgrid-react@1.4.2
- @kanunilabs/pivotgrid-enterprise@1.3.2
- @kanunilabs/pivotgrid-react-enterprise@1.4.2
Before you upgrade
- A partial
layout, such as{ rowHeaderLayout: 'tree' }, keeps the defaults for the options it leaves out; before, the grid drew no values. A full set of defaults passed only to work around that can go.
- Sorting the row and column headers built a new locale comparer for every comparison, so a pivot with thousands of members froze for about half a second on load and on every re-sort. One comparer per locale is now reused: 5,000 members sort in 12–25 ms instead of 333–386 ms. The order is unchanged. The member filter list sorts the same way.
- A
layoutthat named only some options, such as{ rowHeaderLayout: 'tree' }or even{}, replaced the defaults instead of landing on them, and the grid drew no values. The options you leave out now come from the defaults. In the JavaScript and the React grid.
v1.6.0
DataGridExcel exports that Excel opens past a million rows, with group subtotals and real dates; sticky group headers; fill from the keyboard.
- @kanunilabs/datagrid-core@1.6.0
- @kanunilabs/datagrid@1.5.0
- @kanunilabs/datagrid-react@1.4.0
- @kanunilabs/datagrid-enterprise@1.6.0
- @kanunilabs/datagrid-react-enterprise@1.5.0
Before you upgrade
- Exports format the grand-total text the way the grid shows it: a PDF totals row reads "$50.00" where it read "50".
- Excel exports write ISO date strings and epoch numbers in a date column as real dates instead of text.
- A date column with a
dateFormatexports and copies the formatted date (CSV, PDF, clipboard, filter list) instead of the stored value.
- Excel export: a sheet holds 1,048,576 rows, header included, and nothing counted them. One row more and Excel refused the file, or repaired it by deleting every row past the limit, with only a line in a dialog to say so. Rows past the limit now continue on "Data (2)", "Data (3)"…, each with the header, a filter and a frozen top row, so every row arrives in a file Excel opens. Measured in Excel: 1,067,371 rows open in about 6 s on two sheets.
- Exports carry group subtotals. With
groupSummaries, a group row exported only its label and count; each subtotal now sits under its own column, formatted as the grid shows it and written to Excel as a number. In CSV, Excel and PDF. - Excel export writes a date column as dates. An ISO string such as "2011-11-01", which is how a JSON API sends a date, was written as text that Excel's date filter and sort ignore; it is now a real date, as is an epoch number. A local-midnight
Dateno longer lands on the previous day in time zones east of UTC: Excel shows the calendar day and clock time the grid shows. - A date column with a
dateFormatreads the same in CSV, PDF, copied cells and the filter checklist as it does in its cells, instead of the stored ISO string or a Date's long form.
grouping.stickyHeaders: the headers of the groups you are scrolling through stay under the column header, outermost first, and the next group pushes them out. Off by default.maxRowsPerSheeton Excel export, to start a new sheet sooner than Excel's limit.- Enterprise: Ctrl/Cmd+D fills down and Ctrl/Cmd+R fills right, copying the first row or column of the selected range, or the cell above or to the left of a single cell. They follow the same permissions as the fill handle and undo as one step.
- The text of the grand total in an export now uses the grid's formatting, the same as the footer and the new group subtotals. A PDF totals row reads "$50.00" where it read "50".
v1.7.1
PivotGridThe packages load under plain Node ESM.
- @kanunilabs/pivotgrid-core@1.7.1
- @kanunilabs/pivotgrid@1.2.1
- @kanunilabs/pivotgrid-react@1.4.1
- @kanunilabs/pivotgrid-enterprise@1.3.1
- @kanunilabs/pivotgrid-react-enterprise@1.4.1
- Importing a PivotGrid package as ESM in plain Node (server rendering, scripts, a test runner in a Node environment) failed with "Named export 'saveAs' not found", because of how the packages imported file-saver. Bundlers were not affected. Every package build now checks that its output loads this way.
v1.5.0
DataGridTree data from paths, nested arrays or a server; calendar grouping and group selection; relative date filters; many more chart types; and a deferred select-all that reports what it selected.
- @kanunilabs/datagrid-core@1.5.0
- @kanunilabs/datagrid@1.4.0
- @kanunilabs/datagrid-react@1.3.0
- @kanunilabs/datagrid-enterprise@1.5.0
- @kanunilabs/datagrid-react-enterprise@1.4.0
Before you upgrade
- With deferred select-all,
selectionChangedreports the selected rows and their count; before, it reported no rows and a count of 0.
- Tree data in two more shapes.
tree.getDataPathtakes each row's place as a list of names; a level with no row of its own becomes a folder row that opens, closes and sorts like any node but is not a record (it cannot be selected or edited).tree.childrenFieldreads nestedchildrenarrays; edits still write to your objects. - Server-side tree: with a remote
DataSource,tree.hasChildrenloads the tree level by level throughload({ parentKey }). Opening everything loads only the levels that come into view. groupInterval: 'day' | 'week' | 'month' | 'quarter' | 'year'on a date column groups by calendar unit, with headers in the grid's language.grouping.display: 'aligned'lays a group row out as cells: the group's name in the first column and each group summary under its own column.- A checkbox on each group header selects every row under the group, open or closed (
toggleGroupSelection,setGroupSelected,getGroupSelectionState,getGroupRowKeys). - Relative date filters: a
periodcondition such as{ period: 'thisMonth' }or{ period: 'lastDays', days: 7 }is worked out each time the filter runs, so a view saved as "this month" still means this month next week. The filter row accepts period names in the grid's language or in English. expandAllDetails(), thetreeRowToggledanddetailToggledevents, and the tree's open rows in the saved view state.- Keyboard: Left and Right open and close tree nodes and groups. Enterprise: Shift+arrow and Ctrl/Cmd+Shift+arrow extend a cell range, and the statistics bar announces it to screen readers.
- Enterprise charts: stacked and 100% stacked; a Format editor (title, axis titles, legend position, data labels, a logarithmic value axis); X-Y scatter and bubble charts with one point per row; waterfall, funnel, treemap, heatmap, box plot, radar and range bar.
- Enterprise charts: the chart is now state you can read and restore (
GridChartState, thechartOpened,chartChangedandchartClosedevents, saved with the view), with an API in React too (charting.apiRef). Images export as PNG or JPEG at a chosen size, or as a data URL. - Enterprise sparklines:
highlight(first, lowest, highest point),color,negativeColorandtooltip. A gap in the series now stays a gap instead of joining its neighbours. - Enterprise:
getAiSchema,getAiStateandapplyAiStatedescribe the grid's state as a JSON Schema for a language model and apply its answer, keeping the valid part and listing the rest. No model or network call is included.
- Deferred select-all:
selectionChangedreported no rows and a count of 0, and after a row was excluded it reported that row as the selection. It now reports the selected rows and their count. The count also no longer subtracts excluded rows that the current filter hides, and "export selected rows only" no longer writes the excluded rows. - Server-side grouping showed one group and loading rows on the first screen until the user scrolled. The rest of the first screen now loads straight away.
- JavaScript Enterprise with a remote data source of more than 100 rows threw on its first paint and drew no rows. Rows not yet loaded now show as loading.
- Enterprise: Shift+click after a drag did not extend the cell range.
- React Enterprise: with
editing={{ enabled: false }}, sparkline columns showed the raw array instead of the chart. - A remote
DataSourcewithtreebut nohasChildrenshowed a flat list without saying so. It now warns once when the grid is created.
v1.7.0
PivotGridLive updates without a rebuild, a pivot your server aggregates, a trend line in each row, many more chart types, and custom summaries that really run.
- @kanunilabs/pivotgrid-core@1.7.0
- @kanunilabs/pivotgrid@1.2.0
- @kanunilabs/pivotgrid-react@1.4.0
- @kanunilabs/pivotgrid-enterprise@1.3.0
- @kanunilabs/pivotgrid-react-enterprise@1.4.0
Before you upgrade
summaryType: 'custom'runs yourcalculateCustomSummary, or the aggregator registered under that name. Before, every custom measure showed a sum, so the numbers of such measures change. An unknown aggregator name is reported as an engine error.controller.on('fieldMove', …)fires now. A handler registered for it starts running on every field drag;newIndexis where the field landed.groupInterval: 'numeric'and'custom'never grouped; they are now reported throughonError.- Fourteen chart panel captions left the
PivotDictionarytype. A dictionary declared with that type that sets them no longer type-checks; your own messages still rename them.
- Live updates:
applyTransaction({ add, update, remove })with arowKey, on the controller,createPivotGridand the Reactref. Only the changed rows are processed and only the groups they touch are summed again, with the same result as a full rebuild. Measured in Node on 1,000,000 rows: about 17 ms in the worker per update, against 230-290 ms for a rebuild. - Enterprise: server-side pivot.
serverSource(built withpivotServerSource({ load, loadFieldValues })) lets your server do the aggregating; only totals reach the browser, and a closed group is not asked for.rollupInMemoryis the reference implementation. - Enterprise:
rowSparklinedraws each row's values across the visible columns as a small line or bar chart in its grand total cell. - Enterprise:
getPivotAiSchema,getPivotAiStateandapplyPivotAiStatedescribe the pivot layout as a JSON Schema for a language model and apply its answer. The Reactrefnow hasgetController(). - Enterprise charts: stacked and 100% stacked; a Format editor; X-Y and bubble charts; a logarithmic value axis; donut, waterfall, funnel, treemap, heatmap, range bar and sunburst. The chart type formerly named Scatter is now called Dot chart; saved charts still open.
- Enterprise charts: colours follow the grid's theme (
chartColors, Reactpalette); clicking a category filters the pivot (chartCrossFilter, ReactonCategoryClick); chart state and events (getChartState,setChartState); image export as PNG, SVG or JPEG, at a chosen size or as a data URL. In React, a second value axis, hiding a series from the legend andmaxSeries.
summaryType: 'custom'now runs yourcalculateCustomSummary, or the aggregator you registered by name. Before, every custom measure silently showed a sum, so numbers from such a measure will change. An unknown aggregator name is now reported as an engine error.controller.on('fieldMove', ...)now fires, and itsnewIndexis where the field actually landed. Dropping a field on its own place no longer reports a move.- Fourteen chart panel captions left the shared
PivotDictionarytype; the Enterprise chart panel carries them. Your own messages can still rename them.
- React: moving the last column field into the rows made the row area's field chips disappear.
- React charts: the points of a dot chart were not bound to any value, and a pie with one series was drawn in one colour.
groupInterval: 'numeric'and'custom'did nothing without saying so. They are now reported throughonError.
v1.4.2
DataGridA search typed in parts prepares the data once, and a validation message is visible while you edit.
- @kanunilabs/datagrid-core@1.4.1
- @kanunilabs/datagrid@1.3.2
- @kanunilabs/datagrid-react@1.2.2
- @kanunilabs/datagrid-enterprise@1.4.2
- @kanunilabs/datagrid-react-enterprise@1.3.2
- On large data the first search prepares the text it searches, which takes a few seconds. Typed in parts, each new part started the same preparation again alongside the first, so "Preparing data…" stayed up longer and its percentage went backwards. The preparation now runs once, and Cancel still stops it. On our Online Retail demo (1,067,371 rows), a search typed in three parts went from 8.2 s of preparation to 2.3 s on the same machine.
- React Enterprise: a validation message raised while editing a cell was rendered but hidden under the cell and the next row, so the user saw a red underline and no reason. The message now shows.
v1.6.0
PivotGridA filter on a field in the filter area is applied again, and column widths have a documented option.
- @kanunilabs/pivotgrid-core@1.6.0
- @kanunilabs/pivotgrid@1.1.0
- @kanunilabs/pivotgrid-react@1.3.0
- @kanunilabs/pivotgrid-enterprise@1.2.0
- @kanunilabs/pivotgrid-react-enterprise@1.3.0
- A field placed only in the filter area did not filter: with values selected, through
filterValuesor by the user, every total still included the excluded rows. The filter now applies, whether the values come with the initial fields, are picked after the grid is up, or survive a remount over the same data. - React: scrolled far to the right with wide or resized data columns, some visible columns were drawn empty. The visible range is now worked out from the real column widths.
- React: a data column removed from the width map kept its old width until the grid was remounted. It now returns to the default straight away.
defaultColumnWidths: { rowHeader, data }onBasePivotGrid,EnterprisePivotGridandcreatePivotGrid: the starting width of every row-header column and every data column (defaults 150 and 95). A width the user drags still wins.setColumnWidthson the Reactref. The keys of the width map,row-<i>andleaf-<i>, are now documented.
v1.4.1
DataGridSaving fixes: a refused save is always shown, a new row is never lost or inserted twice, and one cancel no longer stops the grid from sorting.
- @kanunilabs/datagrid-core@1.4.0
- @kanunilabs/datagrid@1.3.1
- @kanunilabs/datagrid-react@1.2.1
- @kanunilabs/datagrid-enterprise@1.4.1
- @kanunilabs/datagrid-react-enterprise@1.3.1
Before you upgrade
- In batch editing, a validation rule that reads another column sees the value the user just typed there, not the stored one.
- After a single cancel on large data, the grid stopped sorting and filtering until it was destroyed: every later request came back as cancelled. A cancel now reaches only the work that was already in flight.
- With
crudhandlers present, a change whose handler was missing was reported as saved and dropped — a row added withoutcrud.insertnever reached the server and vanished on reload, and a deleted row came back. Such a save is now refused before anything is sent, the changes stay pending, and the console names the missing handler. - Two quick edits in cell mode could send the same change twice, and insert a new row twice. Saves now run one after another, each sending only what the previous one did not.
- In batch mode, a validation rule that reads a neighbouring column saw that column’s stored value instead of the one the user had just typed. Rules now see the row as edited.
- In cell mode, a save refused by a rule or by the server showed nothing, so the user believed it was saved. The grid now shows the reason, in the same dialog Save already used, and puts the user on the cell.
onAutoSaveFailedon the editing engine options, for apps that drive the engine themselves and want to hear about saves the grid starts on its own.
v1.5.0
PivotGridA field declared as text is never shown as a date, the React grid stays inside its container, and a JSON column named __proto__ is no longer blank.
- @kanunilabs/pivotgrid-core@1.5.0
- @kanunilabs/pivotgrid@1.0.2
- @kanunilabs/pivotgrid-react@1.2.2
- @kanunilabs/pivotgrid-enterprise@1.1.1
- @kanunilabs/pivotgrid-react-enterprise@1.2.1
- A field whose
dataTypeisstringand whose values look like “2009-12” was shown as “December 1, 2009” in the headers and “Dec 1” on the chart axis — a month read as a day. The declared type now decides: text is shown as written,datefields are formatted as before. Screen and export now agree. - The React grid laid itself out against the nearest positioned ancestor on the page, so it could spread past its container and cover the component below it. It now fills exactly the element it is given; in a container with no height it takes the height of its content.
- Importing JSON with a top-level
__proto__key produced a column that stayed blank. The key is renamed safely before the columns are discovered, as the CSV and XML imports already did.
formatDimensionValuein@kanunilabs/pivotgrid-core: the one rule the grid, the charts and the export use to show a row or column value.
v1.4.0
DataGridLicence keys verify on plain-HTTP intranet pages and the badge says why a key failed; Turkish-aware search; a font for PDF export; the CSV separator follows the locale.
- @kanunilabs/datagrid-core@1.3.0
- @kanunilabs/datagrid@1.3.0
- @kanunilabs/datagrid-react@1.2.0
- @kanunilabs/datagrid-enterprise@1.4.0
- @kanunilabs/datagrid-react-enterprise@1.3.0
- @kanunilabs/licensing@1.3.0
Before you upgrade
- The CSV separator follows the grid's
locale:;for Turkish, German, French, Spanish, Italian, Portuguese, Russian and Arabic,,elsewhere. If a program reads your CSV files with a fixed separator, passdelimiterto the CSV export. - Search, text filters and lookups treat İ, I, ı and i as one letter, and search also matches what a cell shows (
valueFormatter,dateFormat). A search can find rows it did not find before. - Types:
themeis typedGridThemeName; code that copies the prop's type into aGridThemeshould useGridThemeName. A dictionary typed as the fullGridDictionaryneeds the eight new licence keys; a partialmessagesobject needs nothing.
- Licence keys now verify on pages served over plain
http://— an intranet host, an IP address. Browsers only offercrypto.subtleon HTTPS andlocalhost, so such a page marked a valid key “Invalid license”. Where WebCrypto is missing, a bundled JavaScript implementation of the same ECDSA P-256 check runs instead: same verdict, the signature is always verified, and it loads only on those pages (its own chunk in bundler builds, built into the script-tag builds). - The licence badge says why a key failed: expired, does not cover this version, not valid for this domain, revoked, malformed, invalid signature, or “Browser cannot verify the license (HTTPS required)” — in the grid’s language, all twelve; in Arabic it sits on the left and reads right to left. The licence state carries a matching
reasonCodefor code that wants to act on it. selection.rowClick(replaceortoggle): in checkbox mode a row click still toggles by default;replacemakes it select only that row.- PDF export takes a
font— a TrueType file embedded in the document. The built-in PDF fonts cannot draw letters outside Latin-1 (ş and İ came out as “_” and “0”); without afont, such text now logs a warning instead of going wrong silently. setExportDefaultstakes a format — CSV, Excel or PDF — where it set Excel defaults only.themeaccepts your own theme’s name:theme="acme"putskanuni-datagrid-theme-acmeon the grid, its wrapper and every popup.
- Search, text filters, the header-filter search, highlighting and the lookup editors treat İ, I, ı and i as one letter. Lower-casing “İ” produced “i” plus a combining dot, so “istanbul” never matched “İSTANBUL”.
- Search also matches what a cell shows —
valueFormatteranddateFormatoutput — not only the stored value. - The CSV separator follows the locale:
;for Turkish, German, French, Spanish, Italian, Portuguese, Russian and Arabic, where spreadsheet programs expect it;,elsewhere. - The licence console notice names the product that prints it — a page with only a DataGrid said “KanuniLabs PivotGrid” — and prints once per product, not once per grid. With no key at all the console stays quiet; the badge is the notice.
- Types:
themeisGridThemeName(GridTheme | (string & {})) — passing a value is unaffected, but code that reads the prop’s type into aGridThemeshould useGridThemeName.GridDictionaryhas eight new licence keys: a partialmessagesobject needs nothing, a dictionary typed as the fullGridDictionaryneeds them.
- The React Enterprise bundle imported
rechartsat its top, so an app without it could not build. It is loaded when the chart panel opens, and without it the panel says so. - A valid key could show the licence badge for a moment while it was being checked. Nothing is shown until the check has finished.
- In React, changing
selection.modeafter the first render had no effect. - The
fitCellsauto-size could run before any row was on screen, or not at all when the data was there at mount; it now runs once the first data cells have rendered. Cells holding markup (badges, chips) are measured as laid out rather than by their text, so they are no longer cut short. - React screen-reader announcements were always in English; they come from the dictionary.
- With large data (the worker path), a cell edited to a value not seen before could not be found by search, and sorting read outside its cached order.
- React date and lookup editor popups did not receive the theme class.
- A Vite production build stands an empty module in for an uninstalled optional dependency, so a missing
exceljsorjspdffailed with a cryptic error. The loaders now check what they received.
v1.4.0
PivotGridLicence keys verify on plain-HTTP intranet pages, and the badge says why a key failed.
- @kanunilabs/pivotgrid-core@1.4.0
- @kanunilabs/pivotgrid@1.0.1
- @kanunilabs/pivotgrid-react@1.2.1
- @kanunilabs/pivotgrid-enterprise@1.1.0
- @kanunilabs/pivotgrid-react-enterprise@1.2.0
- @kanunilabs/licensing@1.3.0
Before you upgrade
- A dictionary typed as the full
PivotDictionaryneeds the eight new licence keys; a partialdictionaryneeds nothing.
- Licence keys now verify on pages served over plain
http://. Browsers only offercrypto.subtleon HTTPS andlocalhost; where it is missing, a bundled JavaScript implementation of the same ECDSA P-256 check runs instead — same verdict, the signature is always verified, loaded only on those pages. - The licence badge says why a key failed — expired, not valid for this domain, revoked, malformed, invalid signature, or “Browser cannot verify the license (HTTPS required)” — in the grid’s language, all twelve; right to left in Arabic. The licence state carries a matching
reasonCode.
- The licence console notice names the product that prints it and prints once per product; with no key at all the console stays quiet.
PivotDictionaryhas eight new licence keys: a partialdictionaryneeds nothing, a dictionary typed as the fullPivotDictionaryneeds them. The Community packages are republished with them and pinned to the samepivotgrid-core, so a page never loads two copies.
v1.3.0
DataGridPaste and the fill handle respect cell permissions; paste lands on the focused cell; paid licence keys no longer expire into a watermark.
- @kanunilabs/datagrid-core@1.2.1
- @kanunilabs/datagrid@1.2.1
- @kanunilabs/datagrid-react@1.1.2
- @kanunilabs/datagrid-enterprise@1.3.0
- @kanunilabs/datagrid-react-enterprise@1.2.0
- @kanunilabs/licensing@1.2.0
- Paste and the fill handle wrote into cells the user could not edit.
editable: falseand theallowUpdatingpredicate held for the cell editor and for cut, but Ctrl+V and a fill-handle drag went straight through them. Refused cells are now skipped and the rest of the gesture is written, the same rule cut already followed. - With no rectangle selected, Ctrl+V pasted into the first row and first column of the grid. A bare arrow key collapses the rectangle, so arrowing down a column and pasting wrote far from where the user was. Paste now lands on the focused cell, or on the cell a context menu was opened over.
- In React, Ctrl+V and Ctrl+X still worked with
editing.range: false. Cut and paste — keyboard and context menu — now follow the same switch in both renderers. - The fill handle treated anything
Number()could convert as a number: two blank cells filled with zeros, two dates filled with epoch-millisecond numbers,true/falsebecame 1/0. Only real numbers form a series now; everything else repeats as a pattern. - Community:
pagination: { pageSize: 25 }withoutenabledleft the grid unpaginated. A pagination object now turns paging on unless it saysenabled: false. - Community: on touch devices the toolbar, pager and header-filter buttons get 40px touch targets, and the header filter button — revealed only on hover until now, so unreachable without a mouse — is always visible.
- Paid Enterprise licence keys are now issued as perpetual keys for the builds released during the paid period: when a subscription ends, the version you already ship keeps working without a watermark. Each Enterprise package checks the key against its own release date.
useGridEditingtakes arangeoption, andpaste()on both renderers takes an optional target cell — the context menu passes the cell it was opened over.
v1.1.4
PivotGridPaid licence keys no longer expire into a watermark.
- @kanunilabs/pivotgrid-react-enterprise@1.1.4
- @kanunilabs/pivotgrid-enterprise@1.0.2
- @kanunilabs/licensing@1.2.0
- Paid Enterprise licence keys are now issued as perpetual keys for the builds released during the paid period: when a subscription ends, the version you already ship keeps working without a watermark. Both Enterprise packages pin
@kanunilabs/licensing1.2.0, the same copy as the DataGrid Enterprise packages.
v1.2.1
DataGridEnterprise packages republished on licensing 1.1.2; the JavaScript licence badge follows fullscreen.
- @kanunilabs/datagrid-enterprise@1.2.1
- @kanunilabs/datagrid-react-enterprise@1.1.2
- @kanunilabs/licensing@1.1.2
- In the JavaScript Enterprise package the unlicensed badge stayed on the document body while the grid was fullscreen — where the browser does not paint it, so the notice silently vanished. It now mounts inside the fullscreen element and follows the toggle both ways.
- Both Enterprise packages pin
@kanunilabs/licensing1.1.2, whose LICENSE names all four Enterprise packages. The verifier code is unchanged; the republish keeps a customer who installs both products on one copy of the licensing module, as the 2026-08-26 release promised.
v1.3.0
PivotGridPivotGrid without React — two new packages — and four engine options that were accepted and ignored now work.
- @kanunilabs/pivotgrid-core@1.3.0
- @kanunilabs/pivotgrid@1.0.0
- @kanunilabs/pivotgrid-enterprise@1.0.1
- @kanunilabs/pivotgrid-react@1.2.0
- @kanunilabs/pivotgrid-react-enterprise@1.1.3
- @kanunilabs/licensing@1.1.2
Before you upgrade
- Column subtotals are on by default, like row totals. Set
showColumnTotals: falseinlayoutto keep the columns you had. - Exported sheets name their totals in the grid's language instead of English.
@kanunilabs/pivotgridis the PivotGrid for plain JavaScript. OnecreatePivotGrid(element, config)call builds the grid straight into the DOM — no component tree, no framework peer. It is a second renderer over the same engine and the same stylesheet as the React package: aggregation in the Web Worker, drag-and-drop between areas, filters, sorting, expand and collapse, saved layouts and theming behave identically, and the config mirrors the React props by name. A UMD build (globalKanuniLabsPivotGrid) makes a script tag a complete install, and a parity ledger checked in CI records, surface by surface, where the two renderers agree.@kanunilabs/pivotgrid-enterprisebrings the paid surface to JavaScript throughcreateEnterprisePivotGrid(): the calculated-field designer, the visual prefilter builder, drill-down to source records, an eight-type chart panel and styled Excel and PDF export. It wraps the Community renderer rather than forking it, and the same licence key covers it. The charts are drawn as SVG by the package itself — there is no charting dependency — and the export libraries (exceljs,jspdf,jspdf-autotable) are optional peers, looked up on the page first so a script tag satisfies them.topNworks, andtopNShowOthersfolds the values past the cut into a single Others row or column instead of dropping them.- The coarse
layoutoptions —showGrandTotals,showSubTotals,showColumnTotalsandtotalsDisplayMode— are bridged to the flags the engine reads. Until now all four were declared, accepted and read by nothing. - The three scale-based conditional-formatting rule types —
colorScale,dataBarandiconSet— render. Before this release onlyexpressionrules did. - Subtotals on the column axis: a group of columns gets a total column beside its children, following
totalsPosition, and the exporters pick it up because they derive their columns from the same list the screen does. - In the React renderer: the node context menu is Community now (
PivotNodeContextMenuis exported from@kanunilabs/pivotgrid-react); the field chooser has a Select all button and marks the fields that carry a filter; the field chips are reachable from the keyboard; and a chip being dragged shows a floating clone.
- Column subtotals are on by default, like row totals. Set
showColumnTotals: falsefor the column set you had before. - Under
pointer: coarsethe interactive controls get 40px touch targets (the small chip controls through a larger hit area), andtouch-actionis set so a drag does not also scroll the page. - Exported sheets name their totals in the grid language: the export helpers take the translated Grand Total and Total labels instead of hardcoding English.
@kanunilabs/pivotgrid-react-enterpriseis republished on this core; its node context menu delegates to the Community one.- The two Enterprise packages went out twice the same day: first as 1.0.0 and 1.1.2, then as 1.0.1 and 1.1.3 re-pinned to
@kanunilabs/licensing1.1.2, whose LICENSE now names all four Enterprise packages — the JavaScript one included. The verifier itself is unchanged.
- Eight fields in the row area made the data area disappear: the pinned row headers were wider than the viewport and the data cells scrolled underneath them. The row-header block now has a viewport budget, and resizing one of those columns commits the configured width that yields the width you dragged to — previously widening a column could make it narrower.
- A prefilter on a grouped date field compared the wrong encoding and returned the wrong row count. It is evaluated on the encoded column, as every other filter is.
- A row header whose value is 0, an empty string or false exported as blank or as the subtotal caption, because the check was truthiness rather than null.
- Two sweeps over the React renderer closed 22 further verified defects, among them the column Grand Total header ignoring the dictionary.
v1.2.0
PivotGridThree configuration props that did nothing now work, and Enterprise export is properly gated.
- @kanunilabs/pivotgrid-core@1.2.0
- @kanunilabs/pivotgrid-react@1.1.0
- @kanunilabs/pivotgrid-react-enterprise@1.1.1
Before you upgrade
stateStoringdoes what it says:enabled: falsestops saving,type: 'sessionStorage'saves there, andtype: 'custom'calls youronSave/onLoad. Before, every setting saved to localStorage. Passing nostateStoringkeeps the old behaviour, so saved layouts are kept.- The
toolbarprop is honoured: switches you set in it take effect now. - On a Community grid the paid export formats (
excel-list,excel-pivot,pdf) reject with an error routed toonErrorinstead of silently doing nothing, andexportDatareturns a promise.
stateStoringaccepted four members and read none of them.enabled: falsestill wrote to localStorage,type: 'sessionStorage'still wrote to localStorage, and thetype: 'custom'pair ofonSave/onLoad— documented as the way to persist to your own backend — was a hook nothing ever called. OnlystorageKeywas read, and only as a grid-id fallback. All four work now. Passing nostateStoringat all keeps the previous behaviour, so an upgrade does not lose anyone’s saved layout.- The
toolbarprop was declared and never destructured, so every switch inside it was inert and the footer always rendered its default set. It is honoured now. onErrornever reached the grid. It was pulled out of the props for the error boundary and not passed on, which also meantPivotControllerOptions.onErrorhad never fired in React at all.
- The three paid export formats —
excel-list,excel-pivotandpdf— now refuse on a Community grid instead of quietly doing nothing. The exporter registers itself into a module-level slot when the Enterprise package is imported, and that slot cannot tell which grid is asking, so one Enterprise import anywhere in a bundle used to enable styled export for every grid in it. The controller can tell, so the check lives there. It is an EDITION gate, not a licence gate: an unlicensed Enterprise build still exports, watermarked. - The refusal is a rejected promise carrying the format and the package that provides it, raised before the
exportingevent and routed to youronError. Previously it was a console warning and a resolved promise fired AFTER that event — so a spinner started on it span forever with a clean console. If your application registers its own exporter under one of those format ids, yours still wins. PivotGridRef.exportDatareturns a promise rather thanvoid, so a refusal can be awaited and caught. Existing callers ignore the return value and are unaffected.
- Four guides for the paid features, which previously shared one sentence saying they “light up automatically”: calculated fields, the prefilter and node menu, drill-down and charts, and styled export. Each documents the configuration, the API, and where the feature stops.
enterpriseEditiononPivotControllerOptions, for applications that build their own shell out ofusePivotControllerand the body/footer components rather than usingEnterprisePivotGrid.
v1.2.0
DataGridSix config options that were accepted and did nothing now work.
- @kanunilabs/datagrid@1.2.0
- @kanunilabs/datagrid-enterprise@1.2.0
- @kanunilabs/datagrid-core@1.2.0
- @kanunilabs/datagrid-react@1.1.1
- @kanunilabs/datagrid-react-enterprise@1.1.1
- The JavaScript renderer accepted six configuration members and silently did nothing with them.
tooltip: { enabled: false }did not turn tooltips off — the one spelling anyone writes to disable a feature.cellMenutook only a boolean, so the object form was dropped.cellClassName,headerTooltipandrenderOverlaywere read and discarded, andautoColumnsignored its object form as well asfalse. Every one of them is the worst kind of bug to find: the code looks right, the grid renders, and nothing tells you the line you wrote is inert. They all work now, and the warning table that was supposed to catch this had a hint that pointed the wrong way — that is fixed too. - A sparkline told screen readers the wrong number. The default label read out an internal drawing coordinate rather than the value: a series closing at 31 was announced as "ending at 4", and the number went DOWN as the line went up. It now reads the last plotted value. Pass
ariaLabelif you want to say something better. - Per-instance label overrides for the edit form and the chart panel (
editing.formLabels,charting.labels) were accepted and ignored. They now merge into that grid’s dictionary only — two grids on one page keep their own wording.
- Three types that the API reference linked to but the package did not export:
CellMenuOptions,RowTemplateContextandExportKind. TypeScript users could see them in the docs and not import them. SparklineGeometrynow carrieslastValue— the last plotted reading in data units, next to the existinglastcoordinate. If you draw your own sparkline from the geometry, this is the number to put in the label.
v1.1.0
PivotGridAn English grid no longer shows a Turkish spinner.
- @kanunilabs/pivotgrid-core@1.1.0
- @kanunilabs/pivotgrid-react-enterprise@1.1.0
- @kanunilabs/pivotgrid-react@1.0.7
- @kanunilabs/licensing@1.1.1
- Twelve locales shipped, but any key missing from a translation fell through to TURKISH, because Turkish was the merge floor rather than English. The loading text existed only in the Turkish file, so an English grid displayed “Yükleniyor…”. English is the floor now, and roughly 370 previously-untranslated strings were filled in across the ten non-English, non-Turkish locales.
- Eight footer button tooltips were hardcoded English regardless of locale. They go through the dictionary like everything else.
- The five Enterprise components export their props types (
CalculatedFieldModalProps,ChartFactoryProps,PivotDrillDownModalProps,PivotNodeContextMenuProps,PivotPrefilterBuilderProps). Without them the API reference showed a type name you could read and not import, and the components could not be wrapped in typed application code. - Every published package now has an API reference, the paid ones included — 507 pages across five surfaces per product, generated from the TypeScript source, plus full-text search across all of it.
- PivotGrid Enterprise had been pinned to older Community packages since 1.0.5, so installing both products could give you two copies of the licensing module — and a licence key set through one product was invisible to the other. Everything is republished together on matching versions; one key covers both, as documented.
v1.1.1
DataGridColumn resizing works again in the JavaScript renderer.
- Dragging a column edge in the JavaScript renderer moved it by one pixel and then stopped, which looked like resizing was simply dead. The first width change repaints the header, and that rebuilds the grip the drag started on — a captured element removed from the document loses its pointer capture, so the browser stopped delivering the move events. The drag now listens on the window and survives the repaint. React was never affected: it reconciles the header and keeps the same node.
- The standalone JavaScript demo page is gone;
/playground/datagrid/javascriptnow lands on the gallery with the JavaScript renderer selected. Every demo there already had the React — JavaScript switch, so the separate page was the same claim made once instead of 82 times — and it had drifted, missing the row-count picker the gallery demos have.
v1.1.0
DataGridFooter totals are free, and a column can bring its own editor.
- Footer column totals now work in Community, along with totals-row placement and custom reducers. They were stripped from the config before — while the footer MENU was never gated, so anyone could click a footer cell and pick Sum and get the very total the config had been refused. One capability cannot have two doors with opposite answers; the free side won, because taking the menu away would have removed something people already use. Per-group totals stay Enterprise, since they ride with multi-level grouping.
- A column can replace its cell editor outright in the JavaScript renderer too:
renderEditorreturns a DOM node, with the samecommit()/cancel()handles the built-in editor uses, so undo/redo, batch mode and validation behave identically. It differs from React in one way, by necessity: React re-invokes the renderer on every validation change, which would destroy a DOM node’s caret and any open dropdown — so the editor is built once and subscribes throughonErrorChange.
- The React packages catch up with everything since 1.0.2: band borders that were invisible against the header, group-panel chip reordering that was off by one, clipboard copy that wrote the stored code instead of the label you could see, and a chart panel that walked itself off screen in fullscreen.
v1.0.0
DataGridDataGrid without React — the JavaScript renderer ships.
- @kanunilabs/datagrid on public npm: the same grid built straight into the DOM. One
createGrid(element, config)call, no component tree, no JSX, no build step required. - @kanunilabs/datagrid-enterprise from the private registry, with the editing, range work, charts, master-detail, tree data and styled export the React Enterprise package has. The same licence key covers it — nothing to buy again.
- A UMD build in both packages, so a
<script>tag is a complete install:KanuniLabsDataGrid.createGrid(...)with the engine bundled in, no import map and no bundler configuration. - The config mirrors the React props by name, so a component reads across nearly unchanged. Where a name genuinely differs (
groupPanel→grouping: { panel: true }), the grid says so in the console with the correct spelling instead of ignoring it. - Every demo in the playground now has a React ⇄ JavaScript switch: the live grid AND the copyable code sample both follow it, so the JavaScript renderer can be evaluated feature by feature rather than on one showcase page.
- @kanunilabs/datagrid-core moves to 1.1.0. It gained the helpers both renderers now share — cell display text, anchored-layer placement, sparkline geometry, summary labels and theme presets — so the JavaScript and React renderers resolve one engine rather than each carrying a copy.
v1.0.6
PivotGridnpm page and metadata polish — no code changes.
- The npm page opens with an animated demo of the component instead of a static screenshot.
- Package metadata now links the public issue tracker at github.com/kanunilabsdev/support — bugs and feature requests no longer require an account on our site.
v1.0.2
DataGridnpm page and metadata polish — no code changes.
- The npm page opens with an animated demo of the component instead of a static screenshot.
- Package metadata now links the public issue tracker at github.com/kanunilabsdev/support — bugs and feature requests no longer require an account on our site.
v1.0.5
PivotGridThe Web Worker setup step is gone.
Before you upgrade
- The Web Workers are built into the package and start from a
blob:URL: a worker file you copied intopublic/can go, and an explicitworkerUrlstill wins. Under a Content-Security-Policy withoutworker-src blob:, the grid loads the worker file from the package instead.
- Zero-configuration Web Workers: all three workers (aggregation, export, import) are now compiled into the package and started from a Blob URL. There is no file to copy into
public/, no bundler recipe and nothing to import — Vite, webpack, Next.js and Parcel work as they are. This is the same change DataGrid shipped in 1.0.0. - Existing setups keep working: an explicit
workerUrlstill wins, so a CDN-hosted or self-served worker is unaffected. Under a Content-Security-Policy that forbidsblob:workers, the grid falls back to loading the worker file from the package instead of failing. @kanunilabs/pivotgrid-coregrew by 30 KB (173 KB → 203 KB) as the price of embedding three workers.
v1.0.1
DataGridSame-day patch for Node consumers.
- Importing @kanunilabs/datagrid-core in Node (SSR builds, scripts, test runners) kept the process alive after it finished. A module-scope MessageChannel used for cooperative yielding was unref’d before its message handler was attached — and attaching the handler re-refs the port. The order is now correct, so processes exit normally. Browser behaviour is unchanged.
v1.0.0
DataGridDataGrid is here — the second component, covered by the same licence.
- @kanunilabs/datagrid-core and @kanunilabs/datagrid-react on public npm; @kanunilabs/datagrid-react-enterprise ships from the private registry, like PivotGrid’s.
- One licence key opens both components — an existing PivotGrid key already carries the DataGrid entitlement, with nothing to buy again.
- Community: virtual scrolling to a million rows, Web Worker offload, filter row + header filter popup, grouping with summaries, pinning, selection and keyboard navigation, CSV export, saved views.
- Enterprise: cell and row editing with validation and undo/redo, range selection and fill handle, multi-level grouping, master-detail, tree data, charts, styled Excel/PDF export, import wizard, side bar tool panels, status bar, filter builder.
- Zero-configuration Web Worker: the worker is embedded in the package, so no
workerUrland no file copying — the setup step PivotGrid needed is gone. - Six themes plus a compact density mode, and a chart palette that follows the theme.
v1.0.4
PivotGridKeyboard-first header filters.
- Filter popup: pressing Backspace while a list item has focus jumps back to the search box and deletes the last character — search, navigate (↑/↓), toggle (Space) and apply (Enter) now work entirely from the keyboard.
v1.0.3
npm packaging & documentation polish (covers 1.0.1–1.0.3).
- npm package pages overhauled: product screenshot, feature tour, expanded keywords and contact metadata.
- New bundler guides: Vite worker setup via the
?urlasset import (no manual copying) alongside the Next.js guide.
- Clarified the localhost licensing note: without a key the grid runs watermarked everywhere; localhost only relaxes the domain binding of a valid key.
- API reference README/index URLs now redirect to the API overview instead of returning 404.
v1.0.0
General availability — first stable release on npm.
- @kanunilabs/pivotgrid-core and @kanunilabs/pivotgrid-react published on public npm; the enterprise package ships from the private registry with per-customer credentials.
v1.0.0-beta.1
First public beta of the React packages.
- PivotGrid core engine: Web Worker compute, columnar storage, trie-based grouping.
- React components: BasePivotGrid, field panel, drag & drop, header filters, theming.
- Enterprise: calculated fields, prefilter builder, drill-down, chart integration.
- 12 locales with full RTL support.
- Excel & PDF export (streamed off the main thread).
- Offline license verification and a customer dashboard.
v0.9.0
Engine hardening and framework-agnostic core split.
- Split the engine into a framework-agnostic core consumed by the React layer.
- Reworked the aggregation pipeline for large datasets (50k+ rows stay responsive).
- Next.js Web Worker resolution via the new
workerUrlprop. - Chart panel layout and stable chart sync (no more re-render loops).