import {
createColumnHelper,
createSortedRowModel,
rowSortingFeature,
tableFeatures,
useTable,
} from "@tanstack/react-table"
type Employee = { name: string; department: string; joined: number }
const employees: Employee[] = [
{ name: "陳怡君", department: "業務", joined: 2019 },
{ name: "林志明", department: "研發", joined: 2021 },
{ name: "王雅婷", department: "研發", joined: 2023 },
{ name: "張家豪", department: "人資", joined: 2020 },
]
const features = tableFeatures({
rowSortingFeature,
sortedRowModel: createSortedRowModel(),
})
const helper = createColumnHelper<typeof features, Employee>()
const columns = helper.columns([
helper.accessor("name", { header: "姓名" }),
helper.accessor("department", { header: "部門" }),
helper.accessor("joined", { header: "到職年份" }),
])
export default function App() {
const table = useTable({ features, columns, data: employees })
return (
<div className="overflow-hidden rounded-xl border bg-background">
<table className="w-full text-sm">
<thead>
{table.getHeaderGroups().map((group) => (
<tr key={group.id} className="bg-muted/50">
{group.headers.map((header) => (
<th
key={header.id}
onClick={header.column.getToggleSortingHandler()}
className="cursor-pointer px-4 py-2.5 text-left font-medium text-muted-foreground select-none hover:text-foreground"
>
<table.FlexRender header={header} />
{header.column.getIsSorted() === "asc" && " ▲"}
{header.column.getIsSorted() === "desc" && " ▼"}
</th>
))}
</tr>
))}
</thead>
<tbody>
{table.getRowModel().rows.map((row) => (
<tr key={row.id} className="hover:bg-muted/30">
{row.getAllCells().map((cell) => (
<td
key={cell.id}
className="border-t px-4 py-2.5"
>
<table.FlexRender cell={cell} />
</td>
))}
</tr>
))}
</tbody>
</table>
</div>
)
}