قالبهای بخش گزارش (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 آماده در یک بولتن
خلاصه اجرایی
توزیع احساسات
توزیع جریانها
منابع
زمین بازی
توزیع جریانها
استفاده
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)
ExecutiveSummarySection
SentimentBreakdownSection
FlowDistributionSection
TopPostsSection
TimelineSection
SourceBreakdownSection
دسترسیپذیری
- هر بخش با
ReportSectionshell 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 تا، یکMetricCardgrid مستقل بسازید — این 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