فید فعالیت (ActionTimeline)
فید زمانی رویدادها و اقدامات — عملیات Booster، رویدادهای چرخهعمر تحلیل، لاگ audit — با markerهای وضعیتی، متادیتای نسبی/مطلق، گروهبندی روزانه، و پشتیبانی از پیشنمایش و اکشنهای inline.
معرفی
ActionTimeline یک لیست زمانی از رویدادها است. هر آیتم یک مارکر با آیکون وضعیت، یک عنوان (subject + verb + object)، یک timestamp نسبی، و بهصورت اختیاری پیشنمایش متنی (مثل محتوای کامنت)، تگ دستهبندی، و دکمههای action دارد. از سه پنل audit شده استخراج شد:
- Booster — لاگ عملیات per-worker (لایک، کامنت، فالو، ...)
- کامنتسنج — رویدادهای چرخهعمر تحلیل (شروع، اتمام، خطا)
- ارزیابی — audit log اجرای ارزیابیها
چه زمانی استفاده کنیم:
- فید فعالیتهای اخیر در داشبورد
- Audit trail یک entity (مثل تاریخچهی یک worker یا کمپین)
- Activity tab داخل یک Drawer/Dialog جزئیات
- لاگ real-time رویدادهای سیستم (با aria-live از بیرون)
چه زمانی استفاده نکنیم:
- برای نمایش مراحل یک pipeline از
StatusFlowاستفاده کنید (رویداد نیست، stage است) - برای توییت/پست از
PostCardاستفاده کنید - برای لیست notification از
NotificationCenterاستفاده کنید (محور: mark-as-read, dismiss, filter) - اگر همهی آیتمها همنوع و بدون timestamp معنادار هستند، یک
<ul>ساده با DataTable کفایت میکند
- worker_12 کامنتی روی پست @news_channel گذاشتکامنت«خیلی ممنون بابت این توضیحات، کار شما ارزشمنده»
- worker_08 پست @tech_weekly را لایک کردلایک
- worker_03 هنگام فالو کردن @cafe_lux خطا گرفتفالو
challenged → نیاز به ورود مجدد
- worker_17 در صف لایک ۳ پستلایک
- worker_05 نرخ rate-limit بالا گزارش دادسیستم
کمپین موقتاً متوقف شد
زمین بازی
با تغییر تنظیمات زیر، پیشنمایش زنده را مشاهده کنید.
- نظر جدید ثبت شد
- در حال تحلیل لایکها
- گزارش هفتگی صادر شد
استفاده
data-driven (پیشفرض)
import { ActionTimeline } from '@parto-system-design/ui'
export function RecentActivity({ events }) {
return (
<ActionTimeline
items={events.map((e) => ({
id: e.id,
status: e.outcome, // 'success' | 'failed' | 'pending' | 'warning' | 'info'
title: e.summary,
description: e.detail,
preview: e.commentText, // snippet shown in a muted box
tag: e.type, // 'Instagram', 'AI', ...
timestamp: e.createdAt, // Date | ISO string | epoch ms
}))}
/>
)
}composition
<ActionTimeline>
<ActionTimelineItem id="a" status="success" title="ورود worker موفق" timestamp={Date.now() - 60_000} />
<ActionTimelineItem id="b" status="pending" title="در حال warmup" timestamp={Date.now()} tag="warmup" />
</ActionTimeline>- worker_01 وارد سیستم شدلاگین
- worker_01 در حال گرمسازیwarmup
روز ۳ از ۷ دوره warmup
گروهبندی روزانه
- امروز
- تحلیل کامنتهای پست ۱۲۳ تکمیل شدتحلیل
- احمدی برچسب «منتقد سازنده» را به کامنت افزودبرچسب
- دیروز
- کمپین بوستر فالو تکمیل شدبوستر
۲۵۰ از ۲۵۰ موفق
- ایمپورت اکسل با خطا مواجه شدایمپورت
ستون دوم ناسازگار
- ۱۸ خرداد ۱۴۰۵
- ارزیابی ۸ پیج ورزشی اجرا شدارزیابی
با groupBy="day" هدرهای sticky روزانه ظاهر میشوند — «امروز»، «دیروز»، یا تاریخ کامل (Jalali برای fa/ar، گریگوری برای en). آیتمها باید به ترتیب نزولی timestamp مرتب شده باشند (ActionTimeline خودش مرتب نمیکند).
چگالی (density)
compact
- رویداد اول
- رویداد دوم
- رویداد سوم
default
- رویداد اول
- رویداد دوم
- رویداد سوم
spacious
- رویداد اول
- رویداد دوم
- رویداد سوم
compact— مناسب sidebar یا لیست متراکم inside drawerdefault— متن عادی، برای فیدهای داشبوردspacious— در صفحات اختصاصی audit با پیشنمایشهای طولانی
پنج وضعیت canonical
ActionStatusKey: success | failed | pending | warning | info
اینها سبکتر از JobStatusKey هستند چون یک event اتمیک است (چیزی مثل «paused» برای یک event خاص معنا ندارد). با توکنهای --sentiment-positive، --destructive-default، --brand-default، --warning-default، و --foreground-lighter map میشوند.
اکشنهای inline
- کمپین بوستر ناموفقبوستر
خطا در احراز هویت ۳ worker
- تحلیل تکمیل شد — ۸۷۰ کامنتتحلیل
actions یک slot جانبی است که در انتهای ردیف نمایش داده میشود. کلیک روی این slot propagate نمیشود — بنابراین وقتی onItemSelect هم تنظیم است، هندلر row trigger نمیشود. مناسب «تلاش مجدد»، «مشاهده گزارش»، «پنهان کردن».
حالت خالی
- هیچ رویدادی ثبت نشده است
وقتی items خالی یا تعریفنشده است، یک متن پیشفرض («هیچ رویدادی ثبت نشده») نشان داده میشود. با emptyState میتوانید نود دلخواه جایگزین کنید (مثل یک <Empty> با illustration).
Props
ActionTimeline
ActionTimelineItemData
راهنمای استفاده
بکنید
- آیتمها را مرتبشده نزولی بر اساس timestamp پاس دهید — ActionTimeline خودش مرتب نمیکند - برای feed طولانی از
limitاستفاده کنید و pagination/scroll-infinite را در والد بزنید -tagرا برای دستهبندی اولیه استفاده کنید (نوع action، پلتفرم) — کوتاه نگه دارید (۱-۲ کلمه) -previewبرای متن کامنت یا پیام خطا ایدهآل است — باعث میشود کاربر بدون کلیک کانتکست کامل بگیرد - در feed زنده، پس از اضافه شدن آیتم جدید، root راaria-live="polite"بگذارید تا screen reader announce کند
نکنید
ActionTimelineرا برای stepها/pipeline استفاده نکنید —StatusFlowاین کار را بهتر میکند -previewرا برای محتوای خیلی بلند پر نکنید؛ اگر ۳+ خط است، row را interactive کنید تا کاربر با کلیک به detail برود - بیش از ۳-۴ actions درactionsslot نگذارید — از dropdown menu استفاده کنید -groupBy="day"را باdensity="compact"ترکیب نکنید روی لیست کوتاه — هدرها overhead میشوند
دسترسیپذیری
- Root
<ol>باdata-density+data-group-by - هر آیتم
<li>باaria-label="{statusLabel}: {title}"— screen reader وضعیت + عنوان را در کنار هم اعلام میکند - timestamp در
<time dateTime={ISO}>باtitleabsolute (هاور tooltip نشان میدهد Jalali کامل) - مارکرها
aria-hiddenهستند (اطلاعات در aria-label و متن تکرار شده) - spinner روی status
pendingباmotion-safe:animate-spin— prefers-reduced-motion safe - وقتی
onItemSelectتنظیم باشد، بدنهی آیتم به<button>تبدیل میشود با focus ring actionsslot باonClick={e.stopPropagation()}wrapped — کلیک دکمهها trigger row نمیکند
کامپوننتهای مرتبط
- StatusFlow — برای نمایش مرحلههای یک pipeline نه event history
- NotificationCenter — اگر آیتمها mark-as-read و dismiss دارند
- JobCard — برای هر job احتمالاً یک «تاریخچهی اقدامات» داخلی میخواهید؛ ActionTimeline درون آن قرار میگیرد
- PostCard — برای نمایش پست کامل، نه event atomic
جریان وضعیت (StatusFlow)
تجسم افقی/عمودی چرخه عمر چندمرحلهای — هر مرحله وضعیت مستقل دارد (در انتظار، در حال اجرا، تکمیل، ناموفق، رد شده، با هشدار، متوقف) و درصد پیشرفت درون مرحله فعلی.
ویزارد کار (JobWizard)
wizard چندمرحلهای canonical برای راهاندازی کارهای async — تحلیل، کمپین، ارزیابی، ایمپورت — با per-step validation، draft persistence، و finish state (submitting/success/error).