ResultSortedTableInHtmlTable
The SortedTableInHtmlTable
component renders the contents of a single query's sorted ResultTable
in a Queries
object as an HTML <table> element, and registers a listener so that any changes to that result will cause a re-render.
ResultSortedTableInHtmlTable(props: ResultSortedTableInHtmlTableProps & HtmlTableProps): ComponentReturnType
Type | Description | |
---|---|---|
props | ResultSortedTableInHtmlTableProps & HtmlTableProps | The props for this component. |
returns | ComponentReturnType | A rendering of the |
See the <ResultSortedTableInHtmlTable /> demo for this component in action.
The component's props identify which ResultTable
to render based on query Id
, and Queries
object (which is either the default context Queries
object, a named context Queries
object, or by explicit reference). It also takes a Cell
Id
to sort by and a boolean to indicate that the sorting should be in descending order. The offset
and limit
props are used to paginate results, but default to 0
and undefined
to return all available Row
Ids
if not specified.
This component renders a ResultTable
by iterating over its Row
objects, in the order dictated by the sort parameters. By default the Cells are in turn rendered with the CellView
component, but you can override this behavior by providing a component
for each Cell
in the customCells
prop. You can pass additional props to that custom component with the getComponentProps
callback. See the ResultCustomCell type for more details.
This component uses the useSortedRowIds
hook under the covers, which means that any changes to the structure or sorting of the ResultTable
will cause a re-render.
You can use the headerRow
and idColumn
props to control whether the Ids
appear in a <th> element at the top of the table, and the start of each row.
The sortOnClick
prop makes the table's sorting interactive such that the user can click on a column heading to sort by that column. The style classes sorted
and ascending
(or descending
) are added so that you can provide hints to the user how the sorting is being applied.
Provide a paginator component for the ResultTable
with the paginator
prop. Set to true
to use the default SortedTablePaginator, or provide your own component that accepts SortedTablePaginatorProps
.
Finally, the onChange
prop lets you listen to a user's changes to the ResultTable
's sorting or pagination.
Examples
This example creates a Provider context into which a default Queries
object is provided. The ResultSortedTableInHtmlTable
component within it then renders the ResultTable
in a <table> element with a CSS class.
import {createQueries, createStore} from 'tinybase';
import {Provider} from 'tinybase/ui-react';
import React from 'react';
import {ResultSortedTableInHtmlTable} from 'tinybase/ui-react-dom';
import {createRoot} from 'react-dom/client';
const App = ({queries}) => (
<Provider queries={queries}>
<Pane />
</Provider>
);
const Pane = () => (
<ResultSortedTableInHtmlTable
queryId="petColors"
cellId="color"
className="table"
/>
);
const queries = createQueries(
createStore().setTable('pets', {
fido: {species: 'dog', color: 'brown'},
felix: {species: 'cat', color: 'black'},
}),
).setQueryDefinition('petColors', 'pets', ({select}) => select('color'));
const app = document.createElement('div');
createRoot(app).render(<App queries={queries} />);
console.log(app.innerHTML);
// ->
`
<table class="table">
<thead>
<tr>
<th>Id</th>
<th class="sorted ascending">↑ color</th>
</tr>
</thead>
<tbody>
<tr>
<th>felix</th>
<td>black</td>
</tr>
<tr>
<th>fido</th>
<td>brown</td>
</tr>
</tbody>
</table>
`;
This example creates a Provider context into which a default Queries
object is provided. The ResultSortedTableInHtmlTable
component within it then renders the ResultTable
with a custom component and a custom props callback for the color
Cell
. The header row at the top of the table and the Id
column at the start of each row is removed.
import {Provider, ResultCellView} from 'tinybase/ui-react';
import {createQueries, createStore} from 'tinybase';
import React from 'react';
import {ResultSortedTableInHtmlTable} from 'tinybase/ui-react-dom';
import {createRoot} from 'react-dom/client';
const App = ({queries}) => (
<Provider queries={queries}>
<Pane />
</Provider>
);
const Pane = () => (
<ResultSortedTableInHtmlTable
queryId="petColors"
cellId="color"
customCells={customCells}
headerRow={false}
idColumn={false}
/>
);
const FormattedResultCellView = ({queryId, rowId, cellId, bold}) => (
<>
{bold ? <b>{rowId}</b> : rowId}:
<ResultCellView queryId={queryId} rowId={rowId} cellId={cellId} />
</>
);
const customCells = {
color: {
component: FormattedResultCellView,
getComponentProps: (rowId) => ({bold: rowId == 'fido'}),
},
};
const queries = createQueries(
createStore().setTable('pets', {
fido: {species: 'dog', color: 'brown'},
felix: {species: 'cat', color: 'black'},
}),
).setQueryDefinition('petColors', 'pets', ({select}) => select('color'));
const app = document.createElement('div');
createRoot(app).render(<App queries={queries} />);
console.log(app.innerHTML);
// ->
`
<table>
<tbody>
<tr>
<td>felix:black</td>
</tr>
<tr>
<td><b>fido</b>:brown</td>
</tr>
</tbody>
</table>
`;
Since
v4.1.0