Design System

Component usage guide template

Browse Components

ui

Table

A responsive table component for displaying tabular data.

1. Import
Import the table components from the design system.
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from "@/design-system/components/ui/table"
2. Props
Table component props.
PropTypeDefault
classNamestring--
rowSelectionRowSelectionState{}
onRowSelectionChangeOnChangeFn<RowSelectionState>--
3. TanStack Table
Headless table logic dengan @tanstack/react-table— sorting, filtering, pagination, selection, and actions. URL Filter tab demonstrates use-url-filter hook integration for URL state synchronization.
ID
Email
Date
CategoryDescription
PAY001successken99@yahoo.com
$316.00
13/4/2026Credit CardFoodPayment for services
PAY002successabe45@gmail.com
$242.00
12/4/2026Bank TransferTransportOnline purchase
PAY003processingmonserrat44@gmail.com
$837.00
11/4/2026PayPalShoppingSubscription renewal
PAY004successsilas22@gmail.com
$874.00
10/4/2026CashBillsUtility bill payment
PAY005failedcarmella@hotmail.com
$721.00
9/4/2026CryptoEntertainmentRestaurant expense
PAY006pendingderek12@outlook.com
$150.00
8/4/2026Credit CardFoodPayment for services
PAY007processingluna.star@gmail.com
$490.00
7/4/2026Bank TransferTransportOnline purchase
PAY008successfrank88@yahoo.com
$635.00
6/4/2026PayPalShoppingSubscription renewal
PAY009failedgrace.k@hotmail.com
$218.00
5/4/2026CashBillsUtility bill payment
PAY010pendinghenry.b@gmail.com
$970.00
4/4/2026CryptoEntertainmentRestaurant expense
PAY011successiris.t@gmail.com
$540.00
3/4/2026Credit CardFoodPayment for services
PAY012failedjack.m@yahoo.com
$380.00
2/4/2026Bank TransferTransportOnline purchase
PAY013pendingkate.w@outlook.com
$122.00
1/4/2026PayPalShoppingSubscription renewal
PAY014processingleo.n@gmail.com
$760.00
31/3/2026CashBillsUtility bill payment
PAY015successmia.c@hotmail.com
$430.00
30/3/2026CryptoEntertainmentRestaurant expense
PAY016failednoah.b@gmail.com
$295.00
29/3/2026Credit CardFoodPayment for services
PAY017successolivia.r@yahoo.com
$810.00
28/3/2026Bank TransferTransportOnline purchase
PAY018pendingpaul.s@gmail.com
$165.00
27/3/2026PayPalShoppingSubscription renewal
PAY019processingquinn.f@outlook.com
$920.00
26/3/2026CashBillsUtility bill payment
PAY020successrose.m@gmail.com
$670.00
25/3/2026CryptoEntertainmentRestaurant expense
PAY021failedsam.k@yahoo.com
$345.00
24/3/2026Credit CardFoodPayment for services
PAY022successtina.g@gmail.com
$580.00
23/3/2026Bank TransferTransportOnline purchase
PAY023pendinguma.h@hotmail.com
$210.00
22/3/2026PayPalShoppingSubscription renewal
PAY024processingvictor.p@gmail.com
$755.00
21/3/2026CashBillsUtility bill payment
PAY025successwendy.l@yahoo.com
$440.00
20/3/2026CryptoEntertainmentRestaurant expense
PAY026failedxander.b@gmail.com
$195.00
19/3/2026Credit CardFoodPayment for services
PAY027successyara.m@outlook.com
$820.00
18/3/2026Bank TransferTransportOnline purchase
PAY028pendingzoe.n@gmail.com
$365.00
17/3/2026PayPalShoppingSubscription renewal
PAY029processingalan.c@yahoo.com
$615.00
16/3/2026CashBillsUtility bill payment
PAY030successbella.d@gmail.com
$280.00
15/3/2026CryptoEntertainmentRestaurant expense
PAY031failedcarl.e@hotmail.com
$730.00
13/4/2026Credit CardFoodPayment for services
PAY032pendingdiana.f@gmail.com
$155.00
12/4/2026Bank TransferTransportOnline purchase
PAY033successevan.g@yahoo.com
$890.00
11/4/2026PayPalShoppingSubscription renewal
PAY034processingfiona.h@gmail.com
$425.00
10/4/2026CashBillsUtility bill payment
PAY035successgeorge.i@outlook.com
$560.00
9/4/2026CryptoEntertainmentRestaurant expense
PAY036failedhelen.j@gmail.com
$310.00
8/4/2026Credit CardFoodPayment for services
PAY037pendingivan.k@yahoo.com
$945.00
7/4/2026Bank TransferTransportOnline purchase
PAY038successjulia.l@gmail.com
$475.00
6/4/2026PayPalShoppingSubscription renewal
PAY039processingkevin.m@hotmail.com
$230.00
5/4/2026CashBillsUtility bill payment
PAY040successlaura.n@gmail.com
$685.00
4/4/2026CryptoEntertainmentRestaurant expense
PAY041failedmike.o@yahoo.com
$395.00
3/4/2026Credit CardFoodPayment for services
PAY042pendingnina.p@gmail.com
$845.00
2/4/2026Bank TransferTransportOnline purchase
PAY043successoscar.q@outlook.com
$175.00
1/4/2026PayPalShoppingSubscription renewal
PAY044processingpetra.r@gmail.com
$620.00
31/3/2026CashBillsUtility bill payment
PAY045successquinn.s@yahoo.com
$505.00
30/3/2026CryptoEntertainmentRestaurant expense
PAY046failedryan.t@gmail.com
$260.00
29/3/2026Credit CardFoodPayment for services
PAY047pendingsara.u@hotmail.com
$775.00
28/3/2026Bank TransferTransportOnline purchase
PAY048successtom.v@gmail.com
$335.00
27/3/2026PayPalShoppingSubscription renewal
PAY049processingursula.w@yahoo.com
$960.00
26/3/2026CashBillsUtility bill payment
PAY050successvince.x@gmail.com
$415.00
25/3/2026CryptoEntertainmentRestaurant expense
PAY051failedwilla.y@outlook.com
$590.00
24/3/2026Credit CardFoodPayment for services
PAY052pendingxena.z@gmail.com
$245.00
23/3/2026Bank TransferTransportOnline purchase
PAY053successyogi.a@yahoo.com
$710.00
22/3/2026PayPalShoppingSubscription renewal
PAY054processingzack.b@gmail.com
$380.00
21/3/2026CashBillsUtility bill payment
PAY055successamy.c@hotmail.com
$525.00
20/3/2026CryptoEntertainmentRestaurant expense
PAY056failedbob.d@gmail.com
$170.00
19/3/2026Credit CardFoodPayment for services
PAY057pendingcara.e@yahoo.com
$865.00
18/3/2026Bank TransferTransportOnline purchase
PAY058successdan.f@gmail.com
$455.00
17/3/2026PayPalShoppingSubscription renewal
PAY059processingeva.g@outlook.com
$640.00
16/3/2026CashBillsUtility bill payment
PAY060successfred.h@gmail.com
$295.00
15/3/2026CryptoEntertainmentRestaurant expense
PAY061failedgina.i@yahoo.com
$780.00
13/4/2026Credit CardFoodPayment for services
PAY062pendinghank.j@gmail.com
$350.00
12/4/2026Bank TransferTransportOnline purchase
PAY063successiris.k@hotmail.com
$915.00
11/4/2026PayPalShoppingSubscription renewal
PAY064processingjake.l@gmail.com
$485.00
10/4/2026CashBillsUtility bill payment
PAY065successkim.m@yahoo.com
$570.00
9/4/2026CryptoEntertainmentRestaurant expense
PAY066failedliam.n@gmail.com
$225.00
8/4/2026Credit CardFoodPayment for services
PAY067pendingmona.o@outlook.com
$800.00
7/4/2026Bank TransferTransportOnline purchase
PAY068successned.p@gmail.com
$465.00
6/4/2026PayPalShoppingSubscription renewal
PAY069processingora.q@yahoo.com
$330.00
5/4/2026CashBillsUtility bill payment
PAY070successpete.r@gmail.com
$695.00
4/4/2026CryptoEntertainmentRestaurant expense
PAY071failedquinn.s@hotmail.com
$410.00
3/4/2026Credit CardFoodPayment for services
PAY072pendingrosa.t@gmail.com
$855.00
2/4/2026Bank TransferTransportOnline purchase
PAY073successsean.u@yahoo.com
$185.00
1/4/2026PayPalShoppingSubscription renewal
PAY074processingtara.v@gmail.com
$630.00
31/3/2026CashBillsUtility bill payment
PAY075successulric.w@outlook.com
$515.00
30/3/2026CryptoEntertainmentRestaurant expense
PAY076failedvera.x@gmail.com
$270.00
29/3/2026Credit CardFoodPayment for services
PAY077pendingwill.y@yahoo.com
$745.00
28/3/2026Bank TransferTransportOnline purchase
PAY078successxia.z@gmail.com
$320.00
27/3/2026PayPalShoppingSubscription renewal
PAY079processingyork.a@hotmail.com
$985.00
26/3/2026CashBillsUtility bill payment
PAY080successzena.b@gmail.com
$435.00
25/3/2026CryptoEntertainmentRestaurant expense
PAY081failedadam.c@yahoo.com
$600.00
24/3/2026Credit CardFoodPayment for services
PAY082pendingbeth.d@gmail.com
$255.00
23/3/2026Bank TransferTransportOnline purchase
PAY083successcole.e@outlook.com
$720.00
22/3/2026PayPalShoppingSubscription renewal
PAY084processingdawn.f@gmail.com
$390.00
21/3/2026CashBillsUtility bill payment
PAY085successearl.g@yahoo.com
$535.00
20/3/2026CryptoEntertainmentRestaurant expense
PAY086failedfaye.h@gmail.com
$180.00
19/3/2026Credit CardFoodPayment for services
PAY087pendingglen.i@hotmail.com
$875.00
18/3/2026Bank TransferTransportOnline purchase
PAY088successhope.j@gmail.com
$445.00
17/3/2026PayPalShoppingSubscription renewal
PAY089processingigor.k@yahoo.com
$660.00
16/3/2026CashBillsUtility bill payment
PAY090successjade.l@gmail.com
$305.00
15/3/2026CryptoEntertainmentRestaurant expense
PAY091failedkent.m@outlook.com
$790.00
13/4/2026Credit CardFoodPayment for services
PAY092pendingluna.n@gmail.com
$360.00
12/4/2026Bank TransferTransportOnline purchase
PAY093successmarc.o@yahoo.com
$925.00
11/4/2026PayPalShoppingSubscription renewal
PAY094processingnell.p@gmail.com
$495.00
10/4/2026CashBillsUtility bill payment
PAY095successomar.q@hotmail.com
$580.00
9/4/2026CryptoEntertainmentRestaurant expense
PAY096failedpam.r@gmail.com
$235.00
8/4/2026Credit CardFoodPayment for services
PAY097pendingrex.s@yahoo.com
$815.00
7/4/2026Bank TransferTransportOnline purchase
PAY098successsue.t@gmail.com
$475.00
6/4/2026PayPalShoppingSubscription renewal
PAY099processingted.u@outlook.com
$340.00
5/4/2026CashBillsUtility bill payment
PAY100successuna.v@gmail.com
$705.00
4/4/2026CryptoEntertainmentRestaurant expense
import { useCallback, useMemo } from "react";
import { type ColumnFiltersState } from "@tanstack/react-table";
import { parseAsArrayOf, parseAsInteger, parseAsString } from "nuqs";
import { DataTable } from "@/components/ui/data-table";
import { useUrlFilters } from "@/hooks/use-url-filter";

const SORT_ORDER_ENUM = {
  status_asc: 1,
  status_desc: 2,
  method_asc: 3,
  method_desc: 4,
  amount_asc: 5,
  amount_desc: 6,
  date_asc: 7,
  date_desc: 8,
} as const;

const PARSERS = {
  sortOrder: parseAsInteger,
  status: parseAsArrayOf(parseAsString),
  method: parseAsArrayOf(parseAsString),
  category: parseAsArrayOf(parseAsString),
};

export function UrlFilterTableDemo() {
  const {
    filters: urlFilters,
    paginationState,
    setFilter,
    onPaginationChange,
    createSortingHandlers,
  } = useUrlFilters(PARSERS);

  const { sortingState, handleSortingChange } = createSortingHandlers(SORT_ORDER_ENUM);

  const columnFilters = useMemo(() => {
    const next: ColumnFiltersState = [];
    if (urlFilters.status?.length) next.push({ id: "status", value: urlFilters.status });
    if (urlFilters.method?.length) next.push({ id: "method", value: urlFilters.method });
    if (urlFilters.category?.length) next.push({ id: "category", value: urlFilters.category });
    return next;
  }, [urlFilters]);

  const handleColumnFiltersChange = useCallback(
    (updater: ColumnFiltersState | ((old: ColumnFiltersState) => ColumnFiltersState)) => {
      const next = typeof updater === "function" ? updater(columnFilters) : updater;
      const toValue = (id: string) =>
        (next.find((item) => item.id === id)?.value as string[]) ?? null;

      setFilter({
        status: toValue("status"),
        method: toValue("method"),
        category: toValue("category"),
      });
    },
    [columnFilters, setFilter],
  );

  return (
    <DataTable
      data={payments}
      columns={columns}
      sorting={sortingState}
      columnFilters={columnFilters}
      pagination={paginationState}
      onSortingChange={handleSortingChange}
      onColumnFiltersChange={handleColumnFiltersChange}
      onPaginationChange={onPaginationChange}
    />
  );
}
const table = useReactTable({
  data,
  columns,
  autoResetPageIndex: false,
  state: {
    sorting,
    columnFilters,
    pagination,
  },
  onSortingChange,
  onColumnFiltersChange,
  onPaginationChange,
  getCoreRowModel: getCoreRowModel(),
  getSortedRowModel: getSortedRowModel(),
  getFilteredRowModel: getFilteredRowModel(),
  getPaginationRowModel: getPaginationRowModel(),
});