سلهای جدول داده (DataTableCells)
مجموعه renderer سبک برای استفاده در کلون cell: ستون DataTable — Sparkline / Trend / Status / Sentiment / Flow / Progress / StatDelta.
معرفی
DataTable v2 با cell renderer های زیر میتواند inline charts و badges در ستونها داشته باشد. هر renderer یک wrapper نازک روی کامپوننتهای موجود DS است که برای استفاده در سلول جدول بهینه شده — اندازه ثابت، بدون margin/padding خارجی، typography یکدست.
چه زمانی استفاده کنیم:
- وقتی ستونی از جدول باید متریک، روند یا وضعیت را فشرده نمایش دهد (مثل نرخ تعامل کمپین تخفیف فصلی یا وضعیت رونمایی محصول) — footprint و typography از پیش برای سلول و هر دو تراکم جدول tune شده است (بخش «تراکم و ارتفاع ردیف»)
- وقتی همان الگوی بصری در چند جدول تکرار میشود — استفاده از renderer آماده، یکدستی density و alignment را تضمین میکند
- وقتی میخواهید کامپوننت DS موجود (Sparkline، SeverityBadge، Progress و …) را بدون tune دستی اندازه و فاصله داخل سلول بیاورید
چه زمانی استفاده نکنیم:
- برای layout سفارشی سلول (چند خط متن، دکمه عملیات، ترکیب آزاد چند عنصر) — یک custom cell با JSX خودتان در
cell()برگردانید - خارج از DataTable — نسخه standalone همان کامپوننت (Sparkline، SeverityBadge، Progress و …) را استفاده کنید
- وقتی سلول به تعامل نیاز دارد (ویرایش inline، منوی عملیات) — این rendererها صرفاً نمایشی هستند
هفت cell renderer:
SparklineCell— sparkline + مقدار اختیاری (مثل3.2٪)TrendCell— arrow up/down/flat با مقدار absolute (پشتیبانی ازinvertبرای متریک معکوس وtoneبرای رنگ جدا از جهت،neutralبرای حجم)SeverityCell— SeverityBadge در ردیف، با برچسب اختیاریSentimentCell—Distribution kind="sentiment"در عرض ثابت (پیشفرض 80px)، همتراکم با جدولFlowCell—Distribution kind="flow"در عرض ثابت (پیشفرض 96px)، همتراکم با جدولProgressCell— Progress bar افقی + مقدار٪StatDeltaCell— مقدار اصلی + delta arrow کنار هم
| پیج | تعامل | رشد | وضعیت | احساسات | ثبات |
|---|---|---|---|---|---|
| @page_alpha | 3٪ | +12نسبت به 7 روز قبل٪ | پایین | مثبتخنثیمنفی | |
| @page_beta | 1٪ | -8نسبت به 7 روز قبل٪ | هشدار | مثبتخنثیمنفی | |
| @page_gamma | 4٪ | +5نسبت به 7 روز قبل٪ | بحرانی | حامیمنتقد سازندهمخالف جدی | 92٪+3٪نسبت به 7 روز قبل |
تراکم و ارتفاع ردیف
هر renderer زیر سقف محتوای ردیف میماند تا همهٔ ردیفها یک ارتفاع داشته باشند (نسخهٔ 4.0). جدول default برای محتوا
35 پیکسل جا دارد (44 منهای 8 پیکسل فاصلهٔ بالا و پایین و 1 پیکسل خط زیر ردیف) و جدول compact 27 پیکسل (36 − 8 − 1).
محتوای 1 پیکسل بلندتر، ردیف را 1 پیکسل بلندتر میکند و virtualize.rowHeight دیگر درست نیست.
| renderer | ردیف default (44) | ردیف compact (36) |
|---|---|---|
SparklineCell، TrendCell، SeverityCell، ProgressCell، StatDeltaCell | 20 تا 24 پیکسل | همان |
SentimentCell و FlowCell با variant="stacked" (پیشفرض) | نوار و یک خط راهنما (34 پیکسل) | فقط نوار (12 پیکسل) |
SentimentCell و FlowCell با variant="compact" | یک خط برچسب (22 تا 23 پیکسل) | همان |
SentimentCell و FlowCell با variant="bars" | یک نوار برای هر دسته (حدود 66 پیکسل) | همان |
SentimentCellوFlowCellتراکم جدولی را که در آن هستند میخوانند (بیرون از جدول مثلdefault). راهنمای رنگها در حالتstackedبه عرض سلول میشکند؛ فقط خط اولش دیده میشود، بقیه برای صفحهخوان میماند و نام قابل دسترس نوار کل تفکیک را با درصد اعلام میکند.- با
variant="compact"برچسبها هرگز به خط بعد نمیروند وwidthحداقل عرض است؛ ستون به اندازهٔ برچسبها پهن میشود. variant="bars"برای نمای جزئیات است (کارت، ردیف بازشده)، نه ردیف جدول: ردیف را بلند میکند.- تایپوگرافی. مقدار اصلی هر سلول هماندازهٔ متن جدول است (14 پیکسل، در جدول
compact13 پیکسل)، مثل عددهای ستون کناری. پسوند و دلتای کنار آن اندازهٔ caption (12 پیکسل) دارند.SeverityCellبدونlabel، برچسبِ خودِ نشان سطح را نمایش میدهد (12 پیکسل، مثل هر نشان دیگری در ردیف).
زمین بازی
با تغییر تنظیمات زیر، پیشنمایش زنده را مشاهده کنید.
استفاده
'use client'
import { DataTable, SparklineCell, TrendCell, SeverityCell, SentimentCell, ProgressCell } from '@partodata/ui'
;<DataTable
columns={[
{ id: 'name', header: 'نام', cell: (r) => r.name },
{
id: 'engagement',
header: 'تعامل',
cell: (r) => <SparklineCell data={r.history} value={r.eRate} suffix="٪" />,
},
{
id: 'growth',
header: 'رشد',
cell: (r) => <TrendCell comparisonLabel="نسبت به 7 روز قبل" value={r.growthDelta} suffix="٪" />,
},
{
id: 'status',
header: 'وضعیت',
cell: (r) => <SeverityCell severity={r.status} label={r.statusLabel} />,
},
{
id: 'sentiment',
header: 'احساسات',
cell: (r) => <SentimentCell data={r.sentimentBreakdown} />,
},
{
id: 'progress',
header: 'پیشرفت',
cell: (r) => <ProgressCell value={r.progressPct} variant="success" />,
},
]}
data={rows}
/>راهنمای استفاده
بکنید
- این سلولها را داخل
cell()ستون DataTable برگردانید — هیچ کدام margin/padding خارجی ندارند - برای متریکهای inverted (مثل bounce rate) ازinvert={true}درTrendCellاستفاده کنید — رنگبندی برعکس میشود - دادهی sparkline را به 5-10 نقطه محدود کنید — جزئیات بیشتر در سلول قابل خواندن نیست
نکنید
- این سلولها را خارج از DataTable استفاده نکنید — برای layout سلولی tuned شدهاند - در یک ستون چند نوع cell متفاوت
ترکیب نکنید — sort/align/density سازگار نیست - دادهی خام بزرگ (100+ نقطه) را به sparkline ندهید — performance افت
میکند -
variant="bars"را در ردیف جدول نگذارید — برای نمای جزئیات است و ردیف را بلند میکند
SparklineCell
<SparklineCell
data={[1.2, 1.5, 1.8, 2.1, 2.4]}
value={2.4}
suffix="٪"
variant="area" // یا 'line' (پیشفرض) یا 'bars'
width={64} // px
height={18} // px
/>TrendCell
<TrendCell comparisonLabel="نسبت به 7 روز قبل" value={12} suffix="٪" /> // ↑ 12٪ (سبز)
<TrendCell comparisonLabel="نسبت به 7 روز قبل" value={-8} suffix="٪" /> // ↓ 8٪ (قرمز)
<TrendCell comparisonLabel="نسبت به 7 روز قبل" value={-3} invert suffix="٪" /> // ↓ 3٪ → سبز (چون نرخ خطا کمتر = بهتر)
<TrendCell comparisonLabel="نسبت به 7 روز قبل" value={0} /> // ━ خنثیSeverityCell
<SeverityCell severity="urgent" label="فوری" />
<SeverityCell severity="medium" /> // برچسب خود نشان («متوسط»)
<SeverityCell severity="low" label="پایین" />SentimentCell / FlowCell
<SentimentCell
data={{ positive: 50, negative: 20, neutral: 30 }}
variant="stacked" // یا 'bars' یا 'compact'
width={80}
/>
<FlowCell
data={{ 'pro-gov': 45, 'internal-critic': 25, 'external-opponent': 20, grey: 10 }}
variant="stacked"
width={96}
/>ProgressCell
<ProgressCell value={67} /> // پیشفرض primary
<ProgressCell value={92} variant="success" />
<ProgressCell value={42} variant="warning" />
<ProgressCell value={67} showValue={false} /> // فقط بار، بدون متنStatDeltaCell
import { StatDeltaCell, formatLargeNumber } from '@partodata/ui'
<StatDeltaCell comparisonLabel="نسبت به 7 روز قبل" value={formatLargeNumber(1240, 'fa')} formatValue={false} delta={12} deltaSuffix="٪" />
// نمایش: 1.2 هزار +12٪
<StatDeltaCell comparisonLabel="نسبت به 7 روز قبل" value={1240} />
// نمایش: 1,240 (formatValue پیشفرض true است — گروهبندی هزارگان با کاما، نه با «٬» فارسی)
<StatDeltaCell comparisonLabel="نسبت به 7 روز قبل" value={500} />
// نمایش: 500 (بدون delta)
<StatDeltaCell comparisonLabel="نسبت به 7 روز قبل" value={45} delta={-8} invertDelta />
// نمایش: 45 ↑ 8 (سبز چون invert)Props
SparklineCell
TrendCell
SeverityCell
SentimentCell
FlowCell
ProgressCell
StatDeltaCell
دسترسیپذیری
- هر cell یک
data-slot="<name>-cell"دارد — برای CSS/telemetry. - متن مقدار همیشه با اعداد محلی فرمت میشود.
- TrendCell جهت را با آیکون + رنگ منتقل میکند، نه فقط رنگ.
- SparklineCell بدون
valueیکrole="img"با نام محلیشده میگیرد (یاaria-labelخودتان)؛ وقتیvalueنمایش داده میشود، خودِ عدد محتوای قابل دسترس است و نمودار تزئینی میماند. - SeverityCell سطح را با آیکون + برچسب منتقل میکند، نه فقط رنگ.
کامپوننتهای مرتبط
- DataTable — جدول اصلی که این cellها در آن استفاده میشوند
- Sparkline — sparkline standalone
- TrendIndicator — trend indicator standalone
- SeverityBadge — status badge standalone
- Distribution — distribution مستقل
- Progress — bar پیشرفت standalone