データテーブルDataTableExperimental
列定義、絞り込み、ページ送りを組み合わせて行データを表示するテーブルです。
プレビュー
1 - 10 / 全18件
1 / 2
青井 花owner · active2024-01-15
田中 空admin · active2024-03-08
山本 優member · invited2025-04-22
小林 真央member · active2024-06-30
中村 蓮admin · suspended2024-11-04
佐藤 葵member · active2025-02-12
鈴木 凛member · active2025-06-18
高橋 海member · invited2025-08-01
伊藤 碧admin · active2025-09-20
渡辺 陽member · suspended2025-10-11
状態とバリエーション
行クリック
onRowClick で行全体をクリック(またはフォーカス時に Enter)で開けます。行内のボタンなどインタラクティブ要素のクリックは行クリックを発火しません。
1 - 4 / 4
1 / 1
| 青井 花 | owner | |
| 田中 空 | admin | |
| 山本 優 | member | |
| 小林 真央 | member |
1 / 1
行クリック: — / 詳細ボタン: —
バッジ付きセル
セル内では Badge や Button などの GunjoUI コンポーネントを組み合わせられます。
1 - 10 / 全18件
1 / 2
| 青井 花 | 所有者 | 有効 | 2024-01-15 |
| 田中 空 | 管理者 | 有効 | 2024-03-08 |
| 山本 優 | メンバー | 招待中 | 2025-04-22 |
| 小林 真央 | メンバー | 有効 | 2024-06-30 |
| 中村 蓮 | 管理者 | 停止中 | 2024-11-04 |
| 佐藤 葵 | メンバー | 有効 | 2025-02-12 |
| 鈴木 凛 | メンバー | 有効 | 2025-06-18 |
| 高橋 海 | メンバー | 招待中 | 2025-08-01 |
| 伊藤 碧 | 管理者 | 有効 | 2025-09-20 |
| 渡辺 陽 | メンバー | 停止中 | 2025-10-11 |
空状態
データがない場合は、テーブル内に空状態の行を表示します。
0 - 0 / 全0件
1 / 1
| 該当する結果がありません。 | |||
1 / 1
絞り込みなし
一覧が短い場合や外部フィルターを使う場合は、テーブル内の検索入力を非表示にします。
1 - 10 / 全10件
1 / 1
| 青井 花 | 所有者 | 有効 | 2024-01-15 |
| 田中 空 | 管理者 | 有効 | 2024-03-08 |
| 山本 優 | メンバー | 招待中 | 2025-04-22 |
| 小林 真央 | メンバー | 有効 | 2024-06-30 |
| 中村 蓮 | 管理者 | 停止中 | 2024-11-04 |
| 佐藤 葵 | メンバー | 有効 | 2025-02-12 |
| 鈴木 凛 | メンバー | 有効 | 2025-06-18 |
| 高橋 海 | メンバー | 招待中 | 2025-08-01 |
| 伊藤 碧 | 管理者 | 有効 | 2025-09-20 |
| 渡辺 陽 | メンバー | 停止中 | 2025-10-11 |
1 / 1
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| columns | ColumnDef<TData, TValue>[] | - | 行データをどう表示するかを定義する列設定です。 |
| data | TData[] | - | テーブルに表示する行データです。 |
| filter | { columnId: string; placeholder?: string } | null | undefined | 指定した列を絞り込む入力欄を表示します。null で非表示にします。 |
| pageSize | number | 10 | 1ページに表示する行数です。 |
| pageSizeOptions | number[] | [10, 25, 50, 100, 200] | ページネーションで選べる表示件数です。 |
| labels | DataTableLabels | - | 検索、空状態、並び替え、ページネーションの文言を差し替えます。 |
| className | string | - | ラッパーに追加するクラスです。 |
使い方
import type { ColumnDef } from "@tanstack/react-table"
import { Badge, DataTable, type DataTableLabels } from "@gunjo/ui"
type Member = {
id: string
name: string
role: "owner" | "admin" | "member"
status: "active" | "invited" | "suspended"
joinedAt: string
}
const members: Member[] = [
{ id: "1", name: "青井 花", role: "owner", status: "active", joinedAt: "2024-01-15" },
{ id: "2", name: "田中 空", role: "admin", status: "active", joinedAt: "2024-03-08" },
{ id: "3", name: "山本 優", role: "member", status: "invited", joinedAt: "2025-04-22" },
{ id: "4", name: "小林 真央", role: "member", status: "active", joinedAt: "2024-06-30" },
{ id: "5", name: "中村 蓮", role: "admin", status: "suspended", joinedAt: "2024-11-04" },
{ id: "6", name: "佐藤 葵", role: "member", status: "active", joinedAt: "2025-02-12" },
{ id: "7", name: "鈴木 凛", role: "member", status: "active", joinedAt: "2025-06-18" },
{ id: "8", name: "高橋 海", role: "member", status: "invited", joinedAt: "2025-08-01" },
{ id: "9", name: "伊藤 碧", role: "admin", status: "active", joinedAt: "2025-09-20" },
{ id: "10", name: "渡辺 陽", role: "member", status: "suspended", joinedAt: "2025-10-11" },
{ id: "11", name: "加藤 澪", role: "member", status: "active", joinedAt: "2025-12-03" },
{ id: "12", name: "森 七海", role: "member", status: "active", joinedAt: "2026-01-09" },
{ id: "13", name: "石井 悠", role: "admin", status: "active", joinedAt: "2026-02-14" },
{ id: "14", name: "清水 旭", role: "member", status: "invited", joinedAt: "2026-03-07" },
{ id: "15", name: "林 彩", role: "member", status: "active", joinedAt: "2026-04-16" },
{ id: "16", name: "井上 湊", role: "member", status: "suspended", joinedAt: "2026-05-02" },
{ id: "17", name: "木村 詩", role: "member", status: "active", joinedAt: "2026-05-10" },
{ id: "18", name: "斎藤 光", role: "member", status: "active", joinedAt: "2026-05-21" },
]
const roleLabels: Record<Member["role"], string> = {
owner: "所有者",
admin: "管理者",
member: "メンバー",
}
const statusLabels: Record<Member["status"], string> = {
active: "有効",
invited: "招待中",
suspended: "停止中",
}
const statusVariants: Record<Member["status"], "default" | "secondary" | "destructive"> = {
active: "default",
invited: "secondary",
suspended: "destructive",
}
const columns: ColumnDef<Member>[] = [
{
accessorKey: "name",
header: "名前",
cell: ({ row }) => <span className="font-medium">{row.original.name}</span>,
},
{
accessorKey: "role",
header: "権限",
cell: ({ row }) => roleLabels[row.original.role],
},
{
accessorKey: "status",
header: "状態",
cell: ({ row }) => {
const status = row.original.status
return <Badge variant={statusVariants[status]}>{statusLabels[status]}</Badge>
},
},
{ accessorKey: "joinedAt", header: "参加日" },
]
const labels: DataTableLabels = {
filterPlaceholder: "名前で絞り込み...",
noResults: "該当する結果がありません。",
previous: "前へ",
next: "次へ",
rowsPerPage: "表示件数",
pageSizeOption: (size) => size + "件",
}
export function MembersTable() {
return (
<DataTable
columns={columns}
data={members}
filter={{ columnId: "name", placeholder: labels.filterPlaceholder }}
labels={labels}
pageSize={10}
pageSizeOptions={[10, 25, 50, 100, 200]}
/>
)
}