DSNiemeyer
Language

Server Table

Same UI as Data Table, but consumer-controlled state. Pass the current page of rows plus the total count; sort/page/search/pageSize are controlled, with onChange callbacks for backend round-trips.

Backend-driven

Controlled sort, search, paging — simulated 400ms fetch

0 of 0 row(s) selected
Rows per page
<ServerTableRoot
  rows={pageData.rows}
  rowCount={pageData.rowCount}
  columns={columns}
  rowKey={(row) => row.id}
  sort={sort} onSortChange={setSort}
  page={page} onPageChange={setPage}
  pageSize={pageSize} onPageSizeChange={setPageSize}
  search={search} onSearchChange={setSearch}
  enableSelection
>
  <DataTableToolbar>
    <DataTableSearch />
    <DataTableViewOptions />
  </DataTableToolbar>
  <DataTableContent stickyHeader maxHeight="28rem" />
  <DataTablePagination />
</ServerTableRoot>

Manual-submit search

Use <DataTableSearchForm /> when each keystroke would be an expensive round-trip. The committed search value only changes on form submit, so the backend is hit once per query.

Typing only updates a local draft — the fetch fires on submit (button or Enter).

Fetches fired: 0
Status
Rows per page
<ServerTableRoot
  rows={pageData.rows}
  rowCount={pageData.rowCount}
  columns={columns}
  rowKey={(row) => row.id}
  search={search} onSearchChange={setSearch}
  /* …other controlled props… */
>
  <DataTableToolbar>
    {/* typing only updates a local draft; fetch fires on submit */}
    <DataTableSearchForm />
    <DataTableViewOptions />
  </DataTableToolbar>
  <DataTableContent stickyHeader maxHeight="28rem" />
  <DataTablePagination />
</ServerTableRoot>