Releases 1.1.91 – 1.1.98 · October 2026
From screen readers to pivot tables: everything you see on this page is part of the free core – in Angular, React, Vue, Svelte, Solid, Preact, Web Components and plain JavaScript. 6 of the twelve are Enterprise features at ag-Grid.
npm i @guiexpert/table@1.1.98
A virtual grid only has the visible rows in the DOM – a screen reader would hear 30 rows of a million, and a table without keyboard support fails WCAG 2.1 AA and the BFSG.
API:
ariaLabelledBy · ariaTexts · AriaTextsIf · announce()
const tableOptions: TableOptionsIf = { ...new TableOptions(), ariaLabelledBy: "orders-title", // the visible heading names the grid ariaTexts: { // what the screen reader says – in your language sorted: (column, state) => state ? `Sortiert nach ${column}` : "Unsortiert", filtered: rowCount => `${rowCount} Zeilen` }};tableApi.announce("12 new orders arrived"); // your own announcementWhile data is loading, an empty table looks broken; after a filter without hits it looks like an error.
API:
showLoadingOverlay() · hideOverlay() · getOverlayState() · overlayOptions
tableApi.showLoadingOverlay(); // CSS spinner + "Loading…"const orders: Order[] = await fetch("/api/orders").then(r => r.json());tableApi.setRows(orders);tableApi.repaintHard();tableApi.hideOverlay(); // 0 rows → "No rows to show" by itself, // a filter without hits → "No matching rows"// React, Vue, Svelte, Angular …: <GuiexpertTable loading={isLoading} … />Users resize, move and hide columns, sort, scroll and select – and after a reload everything is gone.
API:
AutoRestoreOptions · getState() · applyState() · resetState() · onStateChanged()
const tableOptions: TableOptionsIf = { ...new TableOptions(), autoRestoreOptions: { ...new AutoRestoreOptions<Order>(), getStorageKeyFn: () => "orders", // localStorage["orderstableState"] getRowId: (order: Order) => order.id, autoRestoreColumnLayout: true, // order, widths, hidden columns autoRestoreSortingState: true, autoRestoreSelectedState: true }};const json = tableApi.getState(); // or: send it to your servertableApi.applyState(json);“Look at row 1,284” only works if there are row numbers – and they must fit 2,000,000.
API:
rowNumbersVisible · RowNumberOptionsIf · RowNumberColumnDef
Every business table needs a sum at the bottom – and it has to be right after filtering.
API:
footerAggregates · Aggregators · getSelectionAggregates() · AreaModelAggregateFooter
50,000 orders are a list – revenue per country and city is an answer.
API:
createTableModel() · setRowGroupBy() · AreaModelRowGroups
Countries in the rows, years and quarters in the columns, revenue in the cells – with subtotals and totals.
Net, VAT, gross, share of the total, rank – computed without changing your data, and still sortable, filterable and exportable.
API:
valueGetter · showValuesAs · formula · setColumnFormula() · compileFormula
const columnDefs = [ ColumnDef.create({ property: "product", headerLabel: "Product" }), ColumnDef.create({ property: "net", headerLabel: "Net", valueGetter: (o: Item) => o.price * o.quantity }), ColumnDef.create({ property: "gross", headerLabel: "Gross", formula: "ROUND([net] * 1.19, 2)" }), ColumnDef.create({ property: "share", headerLabel: "Share", valueGetter: (o: Item) => o.price * o.quantity, showValuesAs: "percentOfColumnTotal" })];tableApi.setColumnFormula("gross", "ROUND([net] * 1.07, 2)"); // from an input fieldPriorities, playlists, agendas – users want to put rows in order by hand, also on touch screens and with the keyboard.
API:
rowDrag · rowDrag · GeRowDragEvent · moveRows()
Spreadsheet users drag a corner to continue 1, 2, 3 … – and want to review their changes before saving them.
API:
fillHandle · batchEdit · getPendingChanges() · commitBatchEdit() · validate
const tableOptions: TableOptionsIf = { ...new TableOptions(), getSelectionModel: () => new SelectionModel("range", "multi"), fillHandle: true, // drag the corner of the selection batchEdit: true // collect changes, mark them};saveButton.onclick = async () => { await sendToServer(tableApi.getPendingChanges()); tableApi.commitBatchEdit(); // or cancelBatchEdit()};An order has items, a customer has contacts – open a row and show them right below it, without leaving the table.
API:
masterDetail · MasterDetailOptionsIf · createTable() · setDetailExpanded()
In Arabic and Hebrew the first column is on the right – and so are scrolling, fixed columns and the arrow keys.
API:
direction · getDirection()
Honest list: a drag & drop group panel and pivot field list, spreadsheet cell references with an in-cell formula editor, paste from the clipboard, undo/redo and a server-side row model are not built in. The comparison with ag-Grid Community and Enterprise is on the home page and in chapter 3 of the training.
Release notes with every detail: GitHub releases · developer guide: instructions.md · API reference.