INTRO

Practical guide for npm users.

$ npm install wasabi-table
Try the live demo →

Three integration tiers

Start minimal and add depth only when you need it.

Tier 1

Minimal grid

Canvas + create + setCellValue + render.

Tier 2

App screens

Column schema, validation, listeners.

Tier 3

Large data

records, filter/sort, resize, freeze.

Quick start

You need a canvas and a bundler.

Tier 1 — Minimal

import { WasabiTable } from 'wasabi-table';

const canvas = document.getElementById('grid');
const table = await WasabiTable.create(canvas, {
  row_count: 20,
  col_count: 8,
});

table.setCellValue(0, 0, 'Hello');
table.render();

Tier 2 — Listeners + validation

import { createWasabiTableWithListeners } from 'wasabi-table';

const { table, listeners } = await createWasabiTableWithListeners(
  canvas,
  { row_count: 50, col_count: 10 },
  {
    cellReferenceSelector: '#cellRef',
    formulaInputSelector: '#formula',
    statsElementSelector: '#stats',
  },
  { enableValidation: true, enableIMESupport: true }
);

table.setColumnHeaders(JSON.stringify([
  { name: 'email', display_name: 'Email', field_type: 'EmailField', width: 200, order: 0, is_visible: true },
]));

table.setEventHandlers({
  onCellChange: (pos, oldVal, newVal) => console.log(pos, oldVal, newVal),
});

Tier 3 — records + filter/sort

import { WasabiTable } from 'wasabi-table';

const records = [
  { id: 1, name: 'Alice', team: 'A' },
  { id: 2, name: 'Bob', team: 'B' },
  // ... millions of rows OK — viewport sync only
];

const table = await WasabiTable.create(canvas, {
  dataSource: {
    records,
    columns: [
      { field: 'id', header: 'ID', width: 60 },
      { field: 'name', header: 'Name', width: 120 },
      { field: 'team', header: 'Team', width: 80 },
    ],
  },
  freeze_cols: 1,
});

table.addFilterCondition({
  columnIndex: 2,
  fieldType: 'CharField',
  operator: 'equals',
  value: 'A',
  isActive: true,
});
table.setSortCondition({
  columnIndex: 1,
  fieldType: 'CharField',
  direction: 'asc',
});
table.render();

HTML minimum

<canvas id="grid" width="800" height="400"></canvas>
<div id="cellRef">A1</div>
<input id="formula" type="text" />
<div id="stats"></div>

<script type="module">
  import { createWasabiTableWithListeners } from 'wasabi-table';
  // ... init as above
</script>

What you can use

Feature checklist.

Core

  • WasabiTable.create
  • createWasabiTableWithListeners
  • setCellValue / getCellValue
  • setEventHandlers
  • Keyboard navigation
  • Range selection
  • Themes

Editing

  • Inline editing
  • Copy / paste
  • Undo / redo
  • Select all

Schema

  • setColumnHeaders
  • Validation
  • Sort/filter dialog

Large data

  • dataSource records
  • Filter / sort API
  • Viewport sync

UI

  • Column resize
  • freeze_cols
  • Row selection
  • Touch
  • Conditional formatting

Export

  • exportTableToCSV
  • dispose / destroy

Code examples

Pick your stack.

React & SPA notes

  • useEffect init
  • Strict Mode
  • Resize
  • react-example.tsx

Field types

Pass field_type in setColumnHeaders.

CharField
max_length
EmailField
email
IntegerField
min/max
DecimalField
digits
DateField
calendar
TimeField
HH:MM
BooleanField
bool
MenuField
choices

Browser requirements

Modern browsers with WASM.