قالب‌های بخش گزارش (ReportSections)

شش template آماده برای بخش‌های بولتن — Executive Summary، Sentiment، Flow، Top Posts، Timeline، Source Breakdown

معرفی

ReportComposer خود primitive container است؛ این مجموعه شش section template آماده است که 90٪ بخش‌های یک بولتن افکارسنجی را پوشش می‌دهند. هر template یک composition نازک از primitive های موجود (Distribution، Post، PartoLineChart، PlatformMark) داخل ReportSection shell است.

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

  • وقتی بخش‌های استاندارد یک بولتن (خلاصه اجرایی، توزیع احساسات، روند زمانی، پست‌های برتر، منابع) را می‌سازید و نمی‌خواهید layout هر بخش را از صفر بنویسید
  • وقتی بخش‌ها داخل ReportComposer یا BulletinViewer قرار می‌گیرند و به قابلیت‌های shell (فعال/غیرفعال، collapse، drag) نیاز دارید
  • وقتی گزارش باید locale-aware باشد — عنوان پیش‌فرض هر بخش و فرمت اعداد بر اساس prop locale (fa/ar/en) خودکار تنظیم می‌شوند

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

  • برای نمایش standalone یک نمودار خارج از بولتن — مستقیماً از Distribution یا PartoLineChart استفاده کنید
  • وقتی layout بخش موردنظر با هیچ‌کدام از شش template منطبق نیست — به‌جای دور زدن props، یک ReportSection خام با محتوای سفارشی بسازید
  • برای داشبوردهای تعاملی با فیلتر و drill-down — این templateها برای گزارش‌های ایستا و قابل چاپ طراحی شده‌اند

بولتن هفتگی — هفته 14

نمونه ترکیب چند template آماده در یک بولتن

خلاصه اجرایی

نظرات مثبت روند صعودی داشت؛ سهم منتقد سازنده هم در شش استان به‌طور قابل‌توجه رشد کرد.
تعداد پست4.8 هزار+12.4٪
سهم مثبت78٪+3.2٪
پلتفرم فعال9

توزیع احساسات

مثبت78٪خنثی11٪منفی11٪
شادی26٪اعتماد17٪انتظار9٪خنثی23٪غم11٪ترس5٪خشم9٪

توزیع جریان‌ها

حامی37٪منتقد سازنده24٪مخالف14٪مخالف جدی9٪خنثی16٪

منابع

1.8 هزار43.4%
98023.1%
72017.0%
48011.3%
2205.2%

زمین بازی

زمین بازی

توزیع جریان‌ها

حامی37٪منتقد سازنده24٪مخالف14٪مخالف جدی9٪خنثی16٪
تنظیمات
داده
محتوا
کد این نمونه به‌صورت خودکار قابل تولید نیست — برای کد آماده‌ی copy/paste به بخش «استفاده» در بالای صفحه مراجعه کنید.

استفاده

import { ReportComposer, ExecutiveSummarySection } from '@partodata/ui'
<ReportComposer title="بولتن هفتگی">
  <ExecutiveSummarySection
    summary="حجم گفت‌وگو درباره کمپین تخفیف فصلی نسبت به هفته گذشته رشد داشت."
    metrics={[{ label: 'تعداد پست', value: 4820, delta: 12.4 }]}
  />
</ReportComposer>

ترکیب کامل شش template کنار هم:

import {
  ReportComposer,
  ExecutiveSummarySection,
  SentimentBreakdownSection,
  FlowDistributionSection,
  TopPostsSection,
  TimelineSection,
  SourceBreakdownSection,
} from '@partodata/ui'
;<ReportComposer title="بولتن هفتگی">
  <ExecutiveSummarySection
    summary="نظرات مثبت روند صعودی داشت..."
    metrics={[
      { label: 'تعداد پست', value: 4820, delta: 12.4 },
      { label: 'سهم مثبت', value: 78, unit: '٪' },
    ]}
  />
  <SentimentBreakdownSection sentiment={sentiment} emotions={emotions} />
  <FlowDistributionSection flow={flow} />
  <TimelineSection data={dailyVolume} dataKeys={['volume']} summary={{ seriesKey: 'volume', from: 1240, to: 4820 }} />
  <TopPostsSection posts={topPosts} topN={5} />
  <SourceBreakdownSection
    sources={[
      { platform: 'instagram', count: 600 },
      { platform: 'twitter', count: 300 },
      { platform: 'telegram', count: 80 },
    ]}
  />
</ReportComposer>

شش Template

ExecutiveSummarySection

عنوان + پاراگراف AI/analyst-written + تا 4 tile متریک (با delta و unit؛ مقدار هر tile نقش عدد شاخص است، .text-stat 24 / 400). برای بالای هر بولتن که خواننده در 5 ثانیه context بگیرد.

SentimentBreakdownSection

Distribution kind="sentiment" + (اختیاری) Distribution kind="emotion" کنار هم در lg+ breakpoint. اگر emotions نگذارید، فقط 3-class.

FlowDistributionSection

Distribution kind="flow" افقی stacked از 5 گرایش مخاطب.

TopPostsSection

پست‌های شاخص هفته، با topN cap (پیش‌فرض 5). هر پست یک Post است (5.0؛ کارت به‌طور پیش‌فرض، view="compact" ردیف و view="grid" کاشی) و دادهٔ PostData را با fromPostData تبدیل می‌کند؛ فهرست پست بیرون از گزارش را با EntityCollection و entity="post" بسازید.

کارت‌ها به‌صورت پیش‌فرض فقط‌خواندنی‌اند (بولتن چاپی یا خروجی‌گرفته‌شده چیزی بیش از این لازم ندارد). در نسخهٔ آنلاین، onOpen را به جزئیات داخل برنامه وصل کنید؛ رفتن به مبدأ اقدام «مشاهده در مبدأ» روی هر کارت است. تا 3٫x هر کارت دارای URL دکمه‌ای بود که با کلیک منبع را در tab جدید باز می‌کرد؛ openSourceOnClick همان رفتار را برمی‌گرداند.

import { Sheet, SheetContent, SheetTitle, TopPostsSection } from '@partodata/ui'
import { Post, fromPostData } from '@partodata/ui/social'

const [openPost, setOpenPost] = React.useState<PostData | null>(null)

<TopPostsSection posts={topPosts} onOpen={setOpenPost} onOpenDetails={setOpenPost} />
<Sheet open={openPost !== null} onOpenChange={(open) => !open && setOpenPost(null)}>
  <SheetContent>
    <SheetTitle className="sr-only">جزئیات پست</SheetTitle>
    {openPost && <Post post={fromPostData(openPost)} layout="details" />}
  </SheetContent>
</Sheet>

TimelineSection

PartoLineChart با chartHeight تنظیم‌پذیر + اختیاری summary tile زیر آن (sparkline + delta percent). axis‌ها locale-aware.

SourceBreakdownSection

Grid از platform badge ها با count + درصد محاسبه‌شده — مناسب نمایش سهم رسانه‌ها در پوشش یک موضوع.

ویژگی مشترک

هر شش template از ReportSectionShellProps ارث می‌برند، یعنی همه prop های slot ای ReportSection را پشتیبانی می‌کنند: enabled / onEnabledChange / collapsed / onCollapsedChange / draggable / onDragHandlePointerDown / onSettingsClick / headerActions. این اجازه می‌دهد در composer ادیتور هم استفاده شوند:

<ExecutiveSummarySection
  summary="..."
  enabled={summaryOn}
  onEnabledChange={setSummaryOn}
  collapsed={summaryCollapsed}
  onCollapsedChange={setSummaryCollapsed}
  draggable
  onDragHandlePointerDown={handleDragStart}
/>

عنوان پیش‌فرض هر template به‌صورت locale-aware: مثلاً ExecutiveSummarySection بدون title پاس‌دادن «خلاصه اجرایی» (fa) / «الملخص التنفيذي» (ar) / «Executive Summary» (en) رندر می‌کند. title prop آن را override می‌کند.

هر شش template همچنین isLoading را می‌پذیرند — چون داده هر بخش معمولاً مستقل fetch می‌شود، هر بخش باید بتواند وضعیت in-flight خودش را نشان دهد، نه اینکه با داده‌ی خالی یا صفر رندر شود:

<TimelineSection data={dailyVolume} dataKeys={['volume']} isLoading={isVolumeLoading} />

وقتی isLoading باشد، بخش به‌جای محتوای واقعی، Skeleton متناسب با layout خودش (پاراگراف + tile های متریک، bar نمودار، ردیف‌های منبع و…) نمایش می‌دهد.

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

تمام شش template از ReportSectionShellProps ارث می‌برند، یعنی این props مشترک‌اند:

پراپ‌های مشترک (همه‌ی templates)

Prop

Type

ExecutiveSummarySection

Prop

Type

SentimentBreakdownSection

Prop

Type

FlowDistributionSection

Prop

Type

TopPostsSection

Prop

Type

TimelineSection

Prop

Type

SourceBreakdownSection

Prop

Type

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

  • هر بخش با ReportSection shell wrap می‌شود که heading <h3> معنادار، landmark structure و کنترل‌های keyboard-accessible (Switch enable، Button collapse، drag handle) را تأمین می‌کند.
  • چارت‌های داخلی (Distribution، PartoLineChart) خود ARIA labels و توضیحات text-summary مناسب رندر می‌کنند — <title> و <desc> در SVG.
  • TrendIndicator در summary tile با aria-label مناسب (مثل «دلتا 12٪») جهت screen reader آماده می‌شود.
  • در حالت چاپ، header actions (print:hidden) مخفی می‌شوند و sectionها break-inside-avoid می‌گیرند تا روی صفحه نصف نشوند.
  • ترتیب tab روی sections از بالا به پایین RTL-aware است؛ drag handle قبل از Switch enable در tab order قرار می‌گیرد.

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

بکنید

  • ترتیب پیشنهادی: ExecutiveSummary → Sentiment → Flow → Timeline → Top Posts → Sources. این ترتیب از بالا-به-پایین scan-ablity بهینه است - برای print، sections را در BulletinViewer بپوشانید — هر section خودکار break-inside-avoid می‌گیرد - برای metric tile بیش از 4 تا، یک MetricCard grid مستقل بسازید — این template برای headline KPI است

نکنید

  • sectionها را به‌عنوان detail view مستقل استفاده نکنید — این‌ها داخل ReportComposer/BulletinViewer container طراحی‌شده‌اند - topN بیش از 10 روی TopPostsSection نگذارید — هدف «شاخص‌ترین‌ها» است نه فهرست کامل

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

  • container و shell → ReportComposer + ReportSection + BulletinViewer
  • اگر template خودتان می‌خواهید → ReportSection خام بسازید
  • پست‌های کامل به‌جای فهرست فشرده → EntityCollection از Post با چیدمان card
  • توزیع به‌صورت standalone (نه داخل bulletin) → Distribution