ResultSortedTableView
The ResultSortedTableView
component renders the contents of a single query's sorted ResultTable
in a Queries
object, and registers a listener so that any changes to that result will cause a re-render.
ResultSortedTableView(props: ResultSortedTableProps): ComponentReturnType
Type | Description | |
---|---|---|
props | ResultSortedTableProps | The props for this component. |
returns | ComponentReturnType | A rendering of the |
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 these are in turn rendered with the ResultRowView
component, but you can override this behavior by providing a resultRowComponent
prop, a custom component of your own that will render a Row
based on ResultRowProps
. You can also pass additional props to your custom component with the getResultRowComponentProps
callback prop.
This component uses the useResultSortedRowIds
hook under the covers, which means that any changes to the structure or sorting of the ResultTable
will cause a re-render.
Examples
This example creates a Queries
object outside the application, which is used in the ResultSortedTableView
component by reference. A change to the data in the Store
re-renders the component.
import {createQueries, createStore} from 'tinybase';
import React from 'react';
import {ResultSortedTableView} from 'tinybase/ui-react';
import {createRoot} from 'react-dom/client';
const store = createStore().setTable('pets', {
fido: {species: 'dog', color: 'brown'},
felix: {species: 'cat', color: 'black'},
});
const queries = createQueries(store).setQueryDefinition(
'petColors',
'pets',
({select}) => select('color'),
);
const App = () => (
<div>
<ResultSortedTableView
queryId="petColors"
cellId="color"
queries={queries}
separator="/"
/>
</div>
);
const app = document.createElement('div');
createRoot(app).render(<App />);
console.log(app.innerHTML);
// -> '<div>black/brown</div>'
store.setCell('pets', 'felix', 'color', 'white');
console.log(app.innerHTML);
// -> '<div>brown/white</div>'
This example creates a Provider context into which a default Queries
object is provided. The ResultSortedTableView
component within it then renders the Table
(with Ids
for readability).
import {Provider, ResultSortedTableView} from 'tinybase/ui-react';
import {createQueries, createStore} from 'tinybase';
import React from 'react';
import {createRoot} from 'react-dom/client';
const App = ({queries}) => (
<Provider queries={queries}>
<Pane />
</Provider>
);
const Pane = () => (
<div>
<ResultSortedTableView
queryId="petColors"
cellId="color"
debugIds={true}
/>
</div>
);
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);
// -> '<div>petColors:{felix:{color:{black}}fido:{color:{brown}}}</div>'
This example creates a Provider context into which a default Queries
object is provided. The ResultSortedTableView
component within it then renders the Table
with a custom Row
component and a custom props callback.
import {
Provider,
ResultRowView,
ResultSortedTableView,
} from 'tinybase/ui-react';
import {createQueries, createStore} from 'tinybase';
import React from 'react';
import {createRoot} from 'react-dom/client';
const App = ({queries}) => (
<Provider queries={queries}>
<Pane />
</Provider>
);
const getBoldProp = (rowId) => ({bold: rowId == 'fido'});
const Pane = () => (
<div>
<ResultSortedTableView
queryId="petColors"
cellId="color"
resultRowComponent={FormattedRowView}
getResultRowComponentProps={getBoldProp}
/>
</div>
);
const FormattedRowView = ({queryId, rowId, bold}) => (
<span>
{bold ? <b>{rowId}</b> : rowId}
{': '}
<ResultRowView queryId={queryId} rowId={rowId} />
</span>
);
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);
// -> '<div><span>felix: black</span><span><b>fido</b>: brown</span></div>'
Since
v2.0.0