demo D209
A unit family of your own in React
Register a unit system from symbols and their factors
registerUnitSystem · createUnitType
This grid registers a unit family of your own from its symbols and their conversion factors, then uses it like any built-in unit type. It lets a column speak a domain's own units, parsed and converted correctly, without waiting for the unit to be built in.
This is the React version. The grid mounts through the createLatticeGrid adapter, which takes its configuration as ordinary props and hands back the live grid through a ref. The grid below is the same one every other tab runs.
The configuration
<link rel="stylesheet" href="https://cdn.latticegrid.dev/lattice-grid@1.107.0/lattice-grid.min.css">
<div id="grid"></div>
<script type="module">
import React from 'https://esm.sh/react@18';
import { createRoot } from 'https://esm.sh/react-dom@18/client';
import { createGrid, registerUnitSystem, defineUnit, createUnitType } from 'https://cdn.latticegrid.dev/lattice-grid@1.107.0/lattice-grid.esm.min.js';
import createLatticeGrid from 'https://cdn.latticegrid.dev/lattice-grid@1.107.0/modules/react.esm.min.js';
const LatticeGrid = createLatticeGrid({ React, createGrid });
// A unit family of your own. factor is how many base units one of these is;
// exactly one must be 1. The factors are the ladder, sorted at load.
registerUnitSystem('yarn', [
defineUnit('tex', 1, ['tx']),
defineUnit('ktex', 1e3, [], { prefix: 'k' }),
defineUnit('den', 1 / 9, ['denier']),
]);
const dataTypes = {
linearDensity: createUnitType({ system: 'yarn', unit: 'tex', display: 'auto' }),
};
const columns = [
{ field: 'yarn', title: 'Yarn', layout: { pin: 'start', width: 130 } },
{ field: 'count', title: 'Linear density', type: 'linearDensity', total: 'median' },
];
// 1500 tex renders as 1.5 ktex; typing "9 den" stores 1.
const rows = [/* yarn records */];
function App() {
return (
<LatticeGrid
rowKey="id"
dataTypes={dataTypes}
columns={columns}
rows={rows}
style={{ height: '460px' }}
/>
);
}
createRoot(document.getElementById('grid')).render(<App />);
</script>