<FhirTable />
The <FhirTable /> component is designed to render data in a tabular fashion.
It is designed to work in conjunction with the useFhirSearch and useFhirSearchController hooks, but can be used independently if need be.
Example usage
// Using the useFhirSearch query directly
const organizationQuery = useFhirSearch("Organization", (search) =>
  search._include("Organization", "partof"),
);
return (
  <FhirTable
    // Spreading the query like this ensure that types flow to the render properly.
    {...organizationQuery}
    columns={[
      {
        key: "name",
        title: "Name",
        render: (org) => <FhirValue type="string" value={org.name} />,
      },
      {
        key: "address",
        title: "Address",
        render: (org) => (
          <FhirValue type="Address" value={org.address} options={{ max: 1 }} />
        ),
      },
      {
        key: "partof",
        title: "Part of",
        render: (org) => (
          <FhirValue type="string" value={org.partOf?.included()?.name} />
        ),
      },
    ]}
  />
);
Each column can provide its own renderer that is used for each cell.
Row navigation
There is built-in support for row navigation when a row is clicked, using the configured navigation on the <FhirUIProvider />.
// Return the target url to navigate to.
<FhirTable onRowNavigate={(org) => `/organizations/${org.id}`} />
Sorting support
When used in tandem with a search controller, the table can provide automatic server-side
sorting.
The column key attrtibute must be a valid FHIR search parameter for the sorting to work properly.
// The search controller coordinates activities and actions between the <FhirTable /> and the query.
const orgsSearchController = useFhirSearchController({
  defaultSort: "name",
  pageSize: 20,
});
const organizationQuery = useFhirSearch(
  "Organization",
  (search) =>
    search
      ._include("Organization", "partof")
      // The page size and sort must now be controlled by the search controller, and passed to the query appropriately.
      ._count(orgsSearchController.pageSize)
      ._sort(orgsSearchController.sort),
);
return (
  <FhirTable
    {...organizationQuery}
    // The search controller is spread as well. which allows the table to update the sort order on demand.
    {...orgsSearchController}
    columns={[
      {
        key: "name",
        title: "Name",
        sortable: true, // This column will be sortable, and will use the "name" search parameters
        render: (org) => <FhirValue type="string" value={org.name} />,
      },
      {
        key: "_lastUpdated",
        title: "Last Updated",
        sortable: true, // This column will be sortable, and will use the "_lastUpdated" search parameters
        render: (org) => (
          <FhirValue type="instant" value={org.meta.lastUpdated} />
        ),
      },
    ]}
  />