demo D229
Pushdown to a live OData service in React
A grid over the public Northwind service; filter and sort are pushed to it, and lastPlan shows the split
createPushdownSource · odataAdapter · lastPlan()
This grid runs over the public Northwind OData service, pushing filter and sort to the service and showing the query plan it produced. It shows the grid working directly against a live standards-based API, with the split between what the server did and what the grid did on screen.
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.108.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 * as Lattice from 'https://cdn.latticegrid.dev/lattice-grid@1.108.0/lattice-grid.esm.min.js';
import createLatticeGrid from 'https://cdn.latticegrid.dev/lattice-grid@1.108.0/modules/react.esm.min.js';
const { createGrid, createPushdownSource, odataAdapter } = Lattice;
const LatticeGrid = createLatticeGrid({ React, createGrid });
// The adapter takes a URL and imports nothing. createPushdownSource turns the
// grid's query into an OData request and finishes any residual in the grid.
const adapter = odataAdapter({
url: 'https://services.odata.org/V4/Northwind/Northwind.svc/Orders',
});
const source = createPushdownSource({
adapter,
compute: Lattice, // the grid's own kernels, for anything the service could not do
pageSize: 100,
});
const columns = [
{ field: 'OrderID', title: 'Order', type: 'number' },
{ field: 'CustomerID', title: 'Customer', filter: { type: 'set' } },
{ field: 'ShipCountry', title: 'Ship to', filter: { type: 'set' } },
{ field: 'Freight', title: 'Freight', type: 'number' },
{ field: 'OrderDate', title: 'Ordered', type: 'dateString' },
];
function App() {
// After each query, lastPlan() reports what the service ran and what stayed here.
const onRowsChanged = () => {
const plan = source.lastPlan();
if (plan) console.log(plan.unpushed.length ? 'pushed part' : 'pushed all', plan);
};
return (
<LatticeGrid
rowKey="OrderID"
toolPanel={{ side: 'left', panels: ['filters', 'columns'] }}
columns={columns}
source={source}
onRowsChanged={onRowsChanged}
style={{ height: '520px' }}
/>
);
}
createRoot(document.getElementById('grid')).render(<App />);
</script>