پرتوپرتو

نمای مقایسه جدولی (TableComparisonView)

نمای مقایسه‌ای از چند ردیف انتخاب‌شده — pivot 90° با metrics-as-rows × entities-as-columns + highlight اختلافات

معرفی

TableComparisonView نمایی پیوت 90° از یک DataTable است: ستون‌های اصلی به سطرهای مقایسه تبدیل می‌شوند، و ردیف‌های انتخاب‌شده به ستون. مناسب الگوی «۲-۴ آیتم را انتخاب کن، با هم مقایسه کن» که در dashboardهای influence/افکارسنجی متداول است.

معیارسارا احمدیمحمد رضاییاستودیو پارتو
نامسارا احمدیمحمد رضاییاستودیو پارتو
پلتفرمinstagramtwittertelegram
دنبال‌کننده۱۲۴ هزار۹۸ هزار۲۱۰ هزار
نرخ تعامل4.8٪4.8٪2.1٪
پوشش۸۲٬۰۰۰۶۴٬۰۰۰۱۴۵٬۰۰۰

زمین بازی

زمین بازی
معیارپروفایل الفپروفایل بپروفایل ج
پلتفرماینستاگرامتوییترتلگرام
دنبال‌کننده۱۲٬۴۰۰۸٬۸۰۰۲۴٬۰۰۰
نرخ تعامل۴٫۲٪۶٫۱٪۲٫۸٪
تنظیمات
داده
3
ظاهر
محتوا
کد این نمونه به‌صورت خودکار قابل تولید نیست — برای کد آماده‌ی copy/paste به بخش «استفاده» در بالای صفحه مراجعه کنید.

چه زمانی استفاده کنیم:

  • کاربر ۲-۴ کانسپت/پیج/کلاستر را انتخاب کرده و می‌خواهد کنار هم ببیند
  • compare-modal بعد از کلیک «مقایسه‌ی انتخاب‌شده‌ها»
  • خروجی side-by-side در یک bulletin section

چه زمانی استفاده نکنیم:

  • بیش از ۴ ردیف → جدول معمولی scrollable
  • داده‌ی time-series → از PartoLineChart چندخطی استفاده کنید
  • وقتی فقط ۲ آیتم با ۲-۳ متریک دارید → grid 2-ستونه ساده کافی است

استفاده

import { DataTable, TableComparisonView } from '@parto-system-design/ui'

const [selected, setSelected] = React.useState<Set<number>>(new Set())
const selectedRows = data.filter((_, i) => selected.has(i))

<DataTable
  columns={columns}
  data={data}
  selection={{ selectedRows: selected, onSelectionChange: setSelected }}
/>

{selectedRows.length >= 2 && (
  <Dialog open onOpenChange={() => setSelected(new Set())}>
    <DialogContent className="max-w-3xl">
      <DialogTitle>مقایسه</DialogTitle>
      <TableComparisonView
        columns={columns}
        rows={selectedRows}
        onRemoveRow={(idx) => {
          const next = new Set(selected)
          next.delete(idx)
          setSelected(next)
        }}
      />
    </DialogContent>
  </Dialog>
)}

ویژگی‌های کلیدی

  • استفاده‌ی مجدد از همان cell() رندررهایی که در DataTable تعریف کرده‌اید — هیچ کد مضاعف
  • highlight خودکار برای سلول‌هایی که در سطر اختلاف دارند (data-cell-differs="true") — کاربر اختلاف‌ها را در یک نگاه می‌گیرد
  • Cap 4 ردیف پیش‌فرض — اگر rows بیشتر بدهید، ردیف‌های اضافه چاپ نمی‌شوند
  • onRemoveRow?: (rowIndex) => void — وقتی تنظیم شد، X button در هر header column رندر می‌شود

راهنمای استفاده

بکنید

  • معمولاً این نما را در Dialog یا Sheet پاپ کنید — هم تمرکز ایجاد می‌کند هم escape برای کاربر سهل است - وقتی فقط ۱ ردیف انتخاب است، کامپوننت را نمایش ندهید (مقایسه‌ی تک نفره معنا ندارد) - cell rendererها (مثل SparklineCell، FlowCell) خودکار در این نما هم کار می‌کنند

نکنید

  • بیش از ۴ ردیف نگذارید — column header overflow دستی fix نمی‌شود - برای metric textی که خود "اختلاف" را نشان می‌دهد (مثل +12 vs prev)، اگر highlight هم اعمال شود redundant است → از data-cell-differs در CSS برای style پویا استفاده کنید نه default highlight

جدول ویژگی‌ها

Prop

Type

دسترسی‌پذیری

  • جدول از یک <table> semantic استفاده می‌کند، پس screen reader navigation سطر/ستون استاندارد را پشتیبانی می‌کند.
  • header columnها از <th scope="col"> استفاده می‌کنند تا ارتباط cell-to-header در screen reader درست اعلام شود.
  • دکمه‌ی X روی هر header (وقتی onRemoveRow ست شود) aria-label با مفهوم «حذف از مقایسه» دارد و با Enter/Space قابل فعال‌سازی است.
  • highlight اختلاف از طریق attribute data-cell-differs="true" اعمال می‌شود؛ این یک نشانه‌ی بصری است — برای کاربر screen reader، خود مقدار سلول معنا را منتقل می‌کند.
  • هنگام نمایش در Dialog، focus trap به‌صورت خودکار توسط Dialog مدیریت می‌شود و Escape modal را می‌بندد.

کامپوننت‌های مرتبط

  • خود جدول و selectionDataTable
  • مقایسه‌ی Influencer/Concept به‌صورت radarComparisonRadar
  • مقایسه‌ی دو entity در gridComparisonCard