Enterprise & licensing
The Community package is a complete, fast grid: a million rows, sorting, filtering, selection, pagination, themes, twelve languages and CSV export.
@kanunilabs/datagrid-react-enterprise starts where you change the data and
where you take it out: the four editing modes, range selection and the fill
handle, server-side data, Excel and PDF export, the chart panel, the nested
filter builder, and the docked side and status bars.
EnterpriseDataGrid is a drop-in replacement for DataGrid — same props, plus
these.
One key opens both products. A KanuniLabs license unlocks the Enterprise edition of DataGrid and PivotGrid. If you already bought for one, you do not buy again for the other.
1. Install from the private registry
The Enterprise package is not on public npm. It comes from our private registry
with credentials issued per license — you receive a ready-to-paste .npmrc by
email, and can always fetch it again from your
dashboard.
@kanunilabs:registry=https://registry.kanunilabs.com/
//registry.kanunilabs.com/:_auth=<value from your email or dashboard>
//registry.kanunilabs.com/:always-auth=true
npm i @kanunilabs/datagrid-react-enterprise
Without React, the same features ship as @kanunilabs/datagrid-enterprise —
one createEnterpriseGrid() call, same licence key, same licence terms. The
JavaScript guide shows it in use.
npm i @kanunilabs/datagrid-enterprise
CI usage, keeping the token out of git and rotating a leaked password are all covered in the Private registry access guide.
2. Set the license key
Set it once, at startup, before the first grid renders:
import {
EnterpriseDataGrid,
LicenseManager,
} from '@kanunilabs/datagrid-react-enterprise';
LicenseManager.setLicenseKey('KLAB1....');
export function OrdersGrid({ rows }) {
return (
<EnterpriseDataGrid
dataSource={rows}
rowKey="id"
columns={[
{ field: 'id', headerName: 'ID', dataType: 'number' },
{ field: 'customer', headerName: 'Customer' },
{ field: 'total', headerName: 'Total', dataType: 'number' },
]}
editing={{ mode: 'cell' }}
/>
);
}
Both stylesheets are needed — the Enterprise one only adds what it introduces:
import '@kanunilabs/datagrid-react/styles.css';
import '@kanunilabs/datagrid-react-enterprise/styles.css';
Without a valid key
The grid keeps working. It is watermarked, not crippled: a badge appears and says what is wrong, in the grid's language — "Unlicensed", "License expired", "License not valid for this domain", "Browser cannot verify the license (HTTPS required)" and so on. A key that was given but did not pass also logs one console notice, in DataGrid's name; with no key at all, the badge is the only notice. This is deliberate — an evaluation, a staging box with a stale key or an expired card should never take your application down.
To act on the reason in your own code, read reasonCode from the licence
state (see Reading the reason below).
When a subscription ends
A paid key covers every version released up to the end of the period you paid for, with no time limit. The grid compares its own release date with the key, never today's date, so an application you shipped keeps running without a watermark after the subscription ends. A version released later is not covered; while you are subscribed, each renewal moves the date forward, so take the current key from your dashboard when you upgrade.
Keys are verified offline. The signature is checked inside the grid, against a public key compiled into the package — there is no licence server to reach, so the check works when our site is down and on a network with no internet at all.
On localhost the key is still required — what local development skips is
the domain check, so one key works from localhost, 127.0.0.1 and *.local
without listing them as domains. The signature is verified everywhere; a grid
with no key is watermarked on your machine exactly as it would be in
production, which is deliberate: you should see what your users would.
Plain HTTP and intranets
A page served over plain http:// from an intranet host (http://erp.corp/,
http://10.0.0.5:8080/) is supported. Browsers only offer their built-in
cryptography (crypto.subtle) on HTTPS and localhost; everywhere else the
grid verifies the key with a JavaScript implementation of the same algorithm,
bundled with the grid and loaded only on such pages. The verdict is the same
either way, and the check is just as strict — a key is valid only after its
signature is verified, on HTTP too. Only the cost differs: an HTTP page loads
that verifier (about 15 KB gzipped) once, on first use — the script-tag builds
carry it inside — and the badge does not appear while the check runs.
Reading the reason
The licence state carries a reasonCode next to status, so your code does not
have to parse the English reason text:
import { useLicenseGuard } from '@kanunilabs/datagrid-react-enterprise';
function LicenceBanner() {
const license = useLicenseGuard();
if (license.reasonCode === 'engine-unavailable') {
return <p>This browser cannot check the licence. Open the app over HTTPS.</p>;
}
return null;
}
reasonCode | status | Meaning |
|---|---|---|
valid | valid | Verified, in date, this domain |
grace | valid | Past its date, inside the grace period — still licensed |
checking | checking | Verification has not finished yet |
missing | missing | No key, or a key that does not cover this product |
invalid-format | invalid-format | Not a KanuniLabs key — truncated, mistyped or not KLAB1. |
invalid-signature | invalid-signature | The key was altered, or not issued by KanuniLabs |
engine-unavailable | invalid-signature | This browser could not run any verifier (no crypto.subtle, and the bundled one could not load) |
expired | expired | A subscription key past its date and grace period |
release-not-covered | expired | A paid key, but this version was released after its cover ended |
domain-mismatch | domain-mismatch | Issued for other domains |
revoked | revoked | The key was reported revoked |
useLicenseGuard and getLicenseState describe the key, shared by every
grid on the page. Two verdicts are made per product, inside the grid, and show
on its badge rather than in that shared state: release-not-covered (this
build is newer than the key's cover) and missing for a key that does not
include DataGrid. For those the shared state still reads valid.
reasonCode is optional in the type, so code written against the older
status values keeps compiling; status itself has not changed.
What Enterprise unlocks
Each entry links to the guide that shows it working. Everything not in this list is in Community and needs no license.
Data & performance
- Server-side dataFiltering, sorting, paging, distinct values and totals run on your server.
Columns
- Cell span / mergeMerge repeating cells down a column.
Filtering
- Filter builderNested AND/OR conditions, built visually.
Grouping & hierarchy
- Multi-level groupingNest groups as deep as the data goes.
- Group summariesPer-group totals in the group footer.
- Master-detailExpand a row into your own detail panel.
- Tree dataSelf-referencing hierarchies with expand/collapse.
Totals
- Selection statisticsSum, average, min, max and count of the selected range.
Selection & keyboard
- Range selectionDrag a rectangle across cells.
- Fill handleDrag the corner to fill a range, spreadsheet-style.
- Cut & pastePaste a block from Excel straight into a range.
Editing
- Cell editingEdit one cell at a time, committed on blur or Enter.
- Batch editingCollect changes and save them together.
- Row editingEdit a whole row with save/cancel controls.
- Form editingEdit the record as a form laid out in the row flow.
- Popup editingEdit the record in a dialog over the grid.
- ValidationPer-column rules with inline error reporting.
- CRUD handlersOne call per row — the shape REST and SQL want.
- PermissionsAllow add, update and delete per row, enforced in the engine.
- Custom editors & lookupsYour own editor component, or a lookup bound to another source.
- Undo / redoFull history with a public API and events.
Export & import
- Excel exportReal .xlsx, with the grid’s formatting carried over.
- PDF exportPaginated, with repeated headers; streams for large results.
- Styled exportNumber formats, banded rows, outline levels, totals.
- Import wizardFile → column mapping → commit.
Presentation
- SparklinesA small chart inside a cell.
- Cell notesA corner marker with text on hover, editable from the menu.
- Status barDocked counters and range statistics.
- Side bar & tool panelsDocked Columns and Filters panels.
Charts
- Chart panelDocked charts driven by the grid’s own columns.
- Cross-filter & zoomClick a bar to filter the grid; wheel to zoom the axis.
- Chart exportSave a chart as PNG or SVG.
What happens if you use one without the license
The boundary is enforced in two places, and both explain themselves rather than failing silently:
- Configuration (grouping depth, group summaries, master-detail, tree data,
cell span, notes) is dropped, and the reason is logged when you
render with
debugMode. - Calls (
exportToExcel,exportToPdf) throw an error naming the feature. - A server-side
DataSourcethrows immediately, because silently dropping it would leave a grid with no data and send you looking in your backend.
Community keeps single-level grouping, footer column totals and CSV export, so a Community grid is never a demo — it is a grid.
What it costs
One key covers both components — DataGrid and PivotGrid — so the list above and PivotGrid's own Enterprise surface come together, not as two purchases.
See Pricing for the tiers, or Private registry access for how the packages are delivered once you have a licence.