PostBulkActionBar (نوار اعمال گروهی)
نوار شناور پایین صفحه که با انتخاب چند پست در PostList ظاهر میشود — تگ، بولتن، خروجی، پرچم.
معرفی
<PostBulkActionBar> همان الگوی Gmail / Linear / Notion: وقتی یک یا چند پست انتخاب میشوند، یک نوار شناور رند در پایین viewport میچسبد و اکشنهای گروهی را نمایش میدهد. بهطور پیشفرض داخل <PostList> Auto-wired است و فقط وقتی onSelectedIdsChange تنظیم شده فعال میشود.
چه زمانی استفاده کنیم:
- برای فیدهایی که نیاز به اعمال یک عمل روی چند پست دارند (تگگذاری، خروجی، طبقهبندی sentiment).
- وقتی کاربر در جریان triage باید تعداد موارد انتخابشده را همیشه ببیند و بتواند با یک حرکت آن را پاک کند.
- برای گردشکارهای حجیم — مانند برچسبگذاری یکجای پستهای «کمپین تخفیف فصلی» یا خروجی گرفتن از بازخوردهای «رونمایی محصول جدید».
چه زمانی استفاده نکنیم:
- برای اکشن تکپستی — از
<PostActions>روی خود کارت استفاده کنید. - وقتی هیچ عمل گروهی تعریف نشده و فقط میخواهید تعداد انتخاب را نمایش دهید — یک
Badgeیا متن ساده کافی است. - برای اکشنهای ثابت صفحه که به انتخاب وابسته نیستند — این نوار فقط با
selectedCount > 0رندر میشود و جای toolbar دائمی را نمیگیرد.
زمین بازی
زمین بازی
تنظیمات
داده
3
کد این نمونه بهصورت خودکار قابل تولید نیست — برای کد آمادهی copy/paste به بخش «استفاده» در بالای صفحه مراجعه کنید.
استفاده
بهطور خودکار توسط <PostList> رندر میشود وقتی onSelectedIdsChange ست شده. برای استفادهی مستقل:
import { PostBulkActionBar } from '@partodata/ui'
;<PostBulkActionBar
selectedCount={selectedIds.length}
selectedIds={selectedIds}
onClear={() => setSelectedIds([])}
actions={[
{ id: 'tag', label: 'تگ', icon: Tag, onClick: (ids) => bulkTag(ids) },
{
id: 'export',
label: 'خروجی',
icon: Download,
options: [
{ id: 'csv', label: 'CSV' },
{ id: 'json', label: 'JSON' },
],
onClick: (ids, opt) => exportAs(ids, opt),
},
]}
/>راهنمای استفاده
بکنید
onClearرا همیشه تنظیم کنید — دکمه ضربدر و میانبرEscفقط وقتی فعال میشوند کهonClearداده شده باشد.selectedCountرا ازselectedIds.lengthمشتق کنید تا شمارنده نوار و آرایهای که به اکشنها میرسد همیشه همگام باشند.- برای اکشنهای چندگزینهای (مانند خروجی CSV / JSON / PDF) از
optionsاستفاده کنید — کامپوننت خودش DropdownMenu میسازد و گزینه انتخابشده را بهصورتoptionIdبهonClickمیدهد. - برای عمل مخرب گروهی (مانند پرچمگذاری)
variant: 'danger'بدهید تا دکمه با استایل قرمز رندر شود. - اکشنهایی که در وضعیت فعلی بیمعنا هستند را با
hidden: trueحذف و اکشنهای موقتاً غیرمجاز را باdisabledغیرفعال کنید — نه با unmount کردن کل نوار.
نکنید
- بیش از چهار-پنج اکشن سطحاول در نوار قرار ندهید — نوار افقی است و روی صفحههای باریک سرریز میشود؛ اکشنهای فرعی را در
optionsگروهبندی کنید. - بیش از یک نمونه از نوار را همزمان رندر نکنید — موقعیت آن
fixedدر وسط پایین viewport است و دو نمونه روی هم میافتند. z-indexآن را دستی بالا نبرید — لایهz-overlayعمداً زیر modal/popover میماند تا دیالوگهای تأیید روی نوار باز شوند.- وقتی از
<PostList>استفاده میکنید نوار را جداگانه رندر نکنید — با تنظیمonSelectedIdsChangeبهصورت خودکار wired میشود. - به اکشنهای پیشفرض در محیط واقعی اتکا نکنید —
onClickآنها خالی است و فقط برای پیشنمایش/playground کاربرد دارند.
Props
PostBulkActionBar
سایر ویژگیهای HTMLAttributes<HTMLDivElement> (مانند className) به div ریشه منتقل میشوند؛ فقط onClick عمداً از تایپ حذف (Omit) شده است.
PostBulkAction
دسترسیپذیری
- ریشه نوار
role="toolbar"باaria-label="اعمال گروهی روی پستهای انتخابشده"دارد — screen reader آن را بهعنوان یک toolbar مستقل اعلام میکند. - دکمه ضربدر یک
<button>واقعی باaria-label="پاک کردن انتخاب"و حلقه فوکوس مرئی (focus-visible:ring) است. - جداکننده عمودی بین شمارنده و اکشنها
aria-hidden="true"دارد و برای screen reader خوانده نمیشود. - وقتی
selectedCountصفر شود کل نوار از DOM حذف میشود — هیچ عنصر focusable مخفی باقی نمیماند. - انیمیشن slide-up با
motion-reduce:animate-noneبرای کاربرانی که prefers-reduced-motion فعال دارند غیرفعال میشود. - شمارنده با رقم فارسی (
convertToLocalNumbers) و کلاسtabular-numsرندر میشود.tabular-numsاینجا بیاثر است — فونتtnumندارد — پس ارقام همعرض نمیشوند؛ پایداری چیدمان از عرضِ ثابت ظرف میآید، نه از این کلاس.
کیبورد
Esc→ پاک کردن انتخاب- listener کلید
Escسراسری (رویwindow) است — از هر جای صفحه کار میکند، نه فقط وقتی فوکوس روی نوار است؛ و فقط وقتی attach میشود کهonClearتنظیم شده باشد. Tab/Shift+Tab→ حرکت بین دکمه ضربدر و دکمههای اکشن (هر کنترل یک tab-stop مستقل است؛ نوار roving tabindex ندارد).Enter/Space→ فعالسازی اکشن فوکوسشده؛ روی اکشنهای دارایoptionsمنوی گزینهها باز میشود.- در منوی باز، کلیدهای جهتدار بین گزینهها حرکت میکنند و
Enterگزینه را اجرا میکند (رفتار استانداردDropdownMenu).
کامپوننتهای مرتبط
- PostActions — برای اکشنهای تککارتی روی خود کارت؛ نوار گروهی فقط برای اعمال یک عمل روی چند پست همزمان است.
- PostList — برای کنترل selection state با
selectedIdsوonSelectedIdsChange؛ با تنظیمonSelectedIdsChangeهمین نوار بهصورت خودکار رندر میشود. - DropdownMenu — اگر منوی گزینهها را خارج از الگوی اکشن گروهی نیاز دارید؛ اکشنهای دارای
optionsبهصورت داخلی از همین کامپوننت ساخته میشوند. - Badge — اگر فقط نمایش تعداد انتخاب بدون هیچ اکشن گروهی کافی است.