Table
جدول داده با سرستونهای راستچین، مناسب داشبوردها و فهرستهای سازمانی؛ انتخاب سطر، مرتبسازی، حالت راهراه و بارگذاری بدون هیچ وابستگی بیرونی روی همین پنج عنصر استاندارد HTML ساخته شدهاند.
این کامپوننت فعلاً برای ۱ فریمورک از ۴ فریمورک آماده است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نصب
با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/table.jsonnpx dig-ui@latest add https://design-system-tau-green.vercel.app/r/table.jsonyarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/table.jsonbunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/table.jsonاین کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
استفاده
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table"این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
ترکیب اجزا
دسترسپذیری
- از عناصر معنایی table استفاده میکند؛ صفحهخوانها ساختار سطر و ستون را کامل درک میکنند.
- TableCaption توضیح جدول را برای همهٔ کاربران فراهم میکند.
- سطر قابلانتخاب aria-selected و ستون قابلمرتبسازی aria-sort مناسب خودش را میگیرد؛ چکباکسهای انتخاب aria-label فارسی دارند.
- برای عناصر کنشپذیر داخل سلول (دکمه، لینک) روی onClick از event.stopPropagation() استفاده کنید تا با تاگلشدن انتخاب سطر تداخل نکند.
مرجع API
Table
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| color | "default" | "primary" | "success" | "warning" | "destructive" | "info" | "default" | رنگ پسزمینهٔ سطر/سلولِ انتخابشده. |
| size | "default" | "compact" | "default" | تراکم فاصلهٔ عمودی TableHead و TableCell. |
| selectionMode | "none" | "single" | "multiple" | "none" | حالت انتخاب سطر. |
| selectedKeys / defaultSelectedKeys | Set<string> | — | کلیدهای انتخابشده (کنترلشده/غیرکنترلشده). |
| onSelectionChange | (keys: Set<string>) => void | — | با هر بار تغییر انتخاب صدا زده میشود. |
| disallowEmptySelection | boolean | false | اگر true باشد، همیشه حداقل یک سطر انتخابشده باقی میماند. |
| sortDescriptor / defaultSortDescriptor | { column: string; direction: "ascending" | "descending" } | — | ستون و جهت مرتبسازی فعال (کنترلشده/غیرکنترلشده). |
| onSortChange | (descriptor: SortDescriptor) => void | — | با کلیک روی یک TableHead دارای sortKey صدا زده میشود. |
| ...props | React.ComponentProps<"table"> | — | همهٔ ویژگیهای تگ table پشتیبانی میشود. |
TableHeader
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| sticky | boolean | false | سرستون را هنگام اسکرول عمودی بالای جدول ثابت نگه میدارد. |
TableBody
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| striped | boolean | false | سطرهای فرد را با پسزمینهٔ خاکستری راهراه میکند. |
TableRow
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| value | string | — | کلید یکتای سطر؛ فقط با دادن این پراپ سطر قابلانتخاب میشود. |
| disabled | boolean | false | سطر را از انتخاب و کلیک خارج میکند (بدون مخفیکردن آن). |
TableHead / TableCell
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| align | "start" | "center" | "end" | — | ترازبندی افقی محتوای سلول/سرستون. |
| sortKey | string | — | فقط TableHead؛ ستون را قابلمرتبسازی میکند. |
TableCheckboxCell / TableSelectAllCheckbox
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| TableCheckboxCell | Omit<React.ComponentProps<"td">, "children" | "align"> | — | چکباکس انتخاب همان سطر؛ باید داخل یک TableRow دارای value قرار بگیرد. |
| TableSelectAllCheckbox | Omit<React.ComponentProps<"th">, "children" | "align"> | — | چکباکس «انتخاب همه»؛ در selectionMode="multiple" استفاده میشود. |
TableEmpty / TableLoadingRow
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| colSpan | number | — | برابر تعداد ستونهای جدول. |
| children | React.ReactNode | "در حال بارگذاری…" (فقط TableLoadingRow) | متن یا محتوای دلخواه داخل سطر. |
...props
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| ...props | React.ComponentProps<…> | — | هر جزء تمام ویژگیهای عنصر HTML متناظر خود را میپذیرد. |
این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
نمونهها
ردیفهای راهراه
پراپ striped روی TableBody، پسزمینهٔ ردیفهای فرد را با یک رنگ خنثای توپر جدا میکند، نه با opacity، برای اینکه رنگ زیرین صفحه از پشتش دیده نشود.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
تراکم فشرده
size="compact" روی Table، فاصلهٔ عمودی TableHead و TableCell را کم میکند؛ برای جدولهای پرداده در فضای محدود (مثل پنل کناری) مناسبتر است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
سرستون ثابت
sticky روی TableHeader، هنگام اسکرول عمودی داخل یک ظرف با ارتفاع محدود، سرستون را بالای جدول نگه میدارد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
رنگ سطر انتخابشده
رنگ محور مستقلی از حالتهای دیگر است؛ فقط پسزمینهٔ سطر/سلولِ انتخابشده را تعیین میکند، از توکنهای ملایمِ همان رنگ (نه opacity روی رنگ اصلی) تا در هر دو تم خوانا بماند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
انتخاب تکی
با selectionMode="single" کلیک روی هر سطر (فقط با دادن value) آن را انتخاب و انتخاب قبلی را برمیدارد؛ برای این حالت نیازی به چکباکس نیست.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
انتخاب چندگانه
با selectionMode="multiple"، TableSelectAllCheckbox در سرستون و TableCheckboxCell در هر سطر، چکباکسهای بههممتصل میسازند؛ حالت انتخاب کنترلشده است، پس شمار انتخابشدهها بیرون از جدول هم قابلنمایش است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
همیشه یک انتخاب باقی بماند
disallowEmptySelection مانع خالیشدن کامل انتخاب میشود؛ کاربردی برای فیلترهای تکی مثل «نمایش بر اساس» که همیشه باید یک مقدار فعال داشته باشند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
ردیفهای غیرفعال
پراپ disabled روی TableRow، سطر را از انتخاب و کلیک خارج میکند و کمرنگش میکند؛ خودِ داده همچنان دیده میشود، فقط قابلتعامل نیست.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
مرتبسازی ستونها
sortKey روی TableHead، ستون را قابلکلیک میکند و آیکون جهت مرتبسازی را نشان میدهد؛ Table فقط ستون/جهت فعال را نگه میدارد (sortDescriptor)، مرتبسازی واقعیِ آرایه با شماست، مثل مثال زیر.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
سلولهای سفارشی
هر سلول میتواند هر عنصری بگیرد، آواتار، نشان رنگی یا منوی کنش. برای اینکه دکمهٔ کنش با تاگلشدن انتخاب سطر تداخل نکند، روی onClick آن stopPropagation بزنید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
حالت خالی
TableEmpty یک سطر تمامعرض (با colSpan برابر تعداد ستونها) برای وقتیکه فهرست دادهای ندارد رندر میکند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
حالت بارگذاری
TableLoadingRow یک نشانگر چرخان بههمراه متن دلخواه نشان میدهد؛ جایگزین مناسب TableBody تا زمانیکه داده از سرور برسد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
جدول صفحهبندیشده
Table هیچ منطق صفحهبندی ندارد؛ کامپوننت Pagination موجود دیگ را زیر جدول بگذارید و state صفحهٔ فعلی را خودتان نگه دارید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
خالی (Empty)
این دو حالت یکی نیستند و پیامشان هم نباید یکی باشد. «هنوز موردی ثبت نشده» با راهنمای ساخت، در برابر «نتیجهای پیدا نشد» با راهنمای برداشتن فیلتر. پیام را در یک سلول با colSpan بگذارید تا وسط جدول بنشیند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
در حال دریافت (Loading)
جدول خالی نشان ندهید و اسپینر وسط صفحه هم نگذارید. سرستونها را نگه دارید و بهجای سطرها جای خالیِ همساختار بگذارید؛ اینطور چیدمان موقع رسیدن داده نمیپرد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
متن بلند (Overflow)
اسکرول افقی آخرین راهحل است، نه اولین. ستونها را با table-fixed و عرض درصدی جمع کنید و اجازه دهید متن بشکند. سلولهای جدول بهطور پیشفرض whitespace-nowrap دارند، پس برای شکستن باید whitespace-normal بدهید.
با table-fixed و عرض درصدی، ستونها جمع میشوند و متن میشکند؛ جدول از کادر بیرون نمیزند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| ردیفهای راهراه | پراپ striped روی TableBody، پسزمینهٔ ردیفهای فرد را با یک رنگ خنثای توپر جدا میکند، نه با opacity، برای اینکه رنگ زیرین صفحه از پشتش دیده نشود. |
| تراکم فشرده | size="compact" روی Table، فاصلهٔ عمودی TableHead و TableCell را کم میکند؛ برای جدولهای پرداده در فضای محدود (مثل پنل کناری) مناسبتر است. |
| سرستون ثابت | sticky روی TableHeader، هنگام اسکرول عمودی داخل یک ظرف با ارتفاع محدود، سرستون را بالای جدول نگه میدارد. |
| رنگ سطر انتخابشده | رنگ محور مستقلی از حالتهای دیگر است؛ فقط پسزمینهٔ سطر/سلولِ انتخابشده را تعیین میکند، از توکنهای ملایمِ همان رنگ (نه opacity روی رنگ اصلی) تا در هر دو تم خوانا بماند. |
| انتخاب تکی | با selectionMode="single" کلیک روی هر سطر (فقط با دادن value) آن را انتخاب و انتخاب قبلی را برمیدارد؛ برای این حالت نیازی به چکباکس نیست. |
| انتخاب چندگانه | با selectionMode="multiple"، TableSelectAllCheckbox در سرستون و TableCheckboxCell در هر سطر، چکباکسهای بههممتصل میسازند؛ حالت انتخاب کنترلشده است، پس شمار انتخابشدهها بیرون از جدول هم قابلنمایش است. |
| همیشه یک انتخاب باقی بماند | disallowEmptySelection مانع خالیشدن کامل انتخاب میشود؛ کاربردی برای فیلترهای تکی مثل «نمایش بر اساس» که همیشه باید یک مقدار فعال داشته باشند. |
| ردیفهای غیرفعال | پراپ disabled روی TableRow، سطر را از انتخاب و کلیک خارج میکند و کمرنگش میکند؛ خودِ داده همچنان دیده میشود، فقط قابلتعامل نیست. |
| مرتبسازی ستونها | sortKey روی TableHead، ستون را قابلکلیک میکند و آیکون جهت مرتبسازی را نشان میدهد؛ Table فقط ستون/جهت فعال را نگه میدارد (sortDescriptor)، مرتبسازی واقعیِ آرایه با شماست، مثل مثال زیر. |
| سلولهای سفارشی | هر سلول میتواند هر عنصری بگیرد، آواتار، نشان رنگی یا منوی کنش |
| حالت خالی | TableEmpty یک سطر تمامعرض (با colSpan برابر تعداد ستونها) برای وقتیکه فهرست دادهای ندارد رندر میکند. |
| حالت بارگذاری | TableLoadingRow یک نشانگر چرخان بههمراه متن دلخواه نشان میدهد؛ جایگزین مناسب TableBody تا زمانیکه داده از سرور برسد. |
| جدول صفحهبندیشده | Table هیچ منطق صفحهبندی ندارد؛ کامپوننت Pagination موجود دیگ را زیر جدول بگذارید و state صفحهٔ فعلی را خودتان نگه دارید. |
| خالی (Empty) | جدولی که هنوز داده ندارد، در برابر فیلتری که نتیجه نداده |
| در حال دریافت (Loading) | جدولی که دادهاش با تاخیر میآید |
| متن بلند (Overflow) | جدولی با نامها و توضیحهای فارسیِ طولانی |
دستورالعمل استفاده
ستونهای عددی همیشه با یک قاعدهٔ ثابت همترازند
انجام بده
روی TableHead و TableCell ستون مبلغ، یکدست className="text-end" بگذارید تا عددها زیر هم و قابل مقایسه بمانند.
انجام نده
اگر ترازبندی ستون عددی سطر به سطر فرق کند، چشم نمیتواند مبالغ را سریع با هم مقایسه کند.
سرستونها اسم کوتاه و هموزن باشند
انجام بده
هر TableHead یک اسم کوتاه برای همان ستون است؛ طول و لحن سرستونها با هم یکسان میماند.
انجام نده
قاطیکردن سرستون اسمی با یک جملهٔ کامل، هم عرض ستون را بههم میزند و هم خواندن جدول را کند میکند.
ردیف فقط وقتی قابلکلیک بهنظر برسد که واقعاً هست
انجام بده
برای سطرهای قابلانتخاب یا با onRowAction از cursor-pointer پیشفرض خود Table استفاده کنید (فقط با دادن value ایجاد میشود)؛ برای سطرهای صرفاً نمایشی هیچ value ندهید.
انجام نده
دادن onClick به یک سطر بدون هیچ نشانهٔ بصری، کاربر را وادار میکند تصادفی همهجا کلیک کند تا بفهمد چه چیزی قابلکلیک است.