دو تصمیم هموزن (DecisionActions)
تأیید و رد در کنار هم، بهعنوان یک اقدام — استثنای نامدار قاعدهٔ «یک اقدام اصلی در هر ناحیه»
معرفی
قاعدهٔ سیستم طراحی این است: هر ناحیهٔ مستقل یک اقدام اصلی دارد — سرِ صفحه (با نوارابزارش)، یک پنل
(PagePane)، یک بخش تنظیمات، یک کشو یا یک دیالوگ. ولی بعضی جاها دو تصمیم هموزناند:
تأیید یا رد برچسبهای پیشنهادی، پذیرفتن یا نپذیرفتن یک تطبیق چهره، انتشار یا بازگرداندن. DecisionActions همین جفت
است، بهعنوان یک اقدام: آن را همانجا بدهید که اقدام اصلی ناحیه میرود.
emphasis="region"(پیشفرض) — جفت، اقدام اصلی ناحیه است: «تأیید» اصلی و «رد» خطرناک، هماندازه، «تأیید» در انتها؛emphasis="item"— یک جفت برای هر مورد از یک صف بررسی (کارت، ردیف): هر دو خنثی با آیکونشان، تا صفی از بیست مورد چهل دکمهٔ رنگی نشود؛pending— تصمیمی که در حال فرستادن است اسپینر دارد و دیگری منتظر میماند؛disabledReason— تصمیمی که کاربر اجازهاش را ندارد، همانجا غیرفعال با دلیلش (GatedAction).
استفاده
'use client'
import * as React from 'react'
import { toast } from '@partodata/ui'
import { DecisionActions, DetailPage, DetailSection } from '@partodata/ui/templates'
export function LabelReviewScreen() {
const [pending, setPending] = React.useState<'approve' | 'reject'>()
const decide = (kind: 'approve' | 'reject') => async () => {
setPending(kind)
await fetch(`/api/labels/review/${kind}`, { method: 'POST' })
setPending(undefined)
toast.success(kind === 'approve' ? 'برچسبها تأیید شد' : 'برچسبها رد شد')
}
return (
<DetailPage
title="برچسبهای پیشنهادی"
back={{ href: '/analyses', label: 'تحلیلها' }}
primaryAction={
<DecisionActions
pending={pending}
approve={{ label: 'تأیید', onClick: decide('approve') }}
reject={{ label: 'رد', onClick: decide('reject') }}
/>
}
>
<DetailSection title="برچسبها">…</DetailSection>
</DetailPage>
)
}حالتها و انواع
| ناحیه | جای اقدام اصلی |
|---|---|
| سرِ صفحه (و نوارابزارش) | primaryAction قالب |
| پنل صفحهٔ fill | primaryAction همان PagePane |
| بخش تنظیمات | دکمهٔ ذخیرهٔ همان SettingsSection |
| کشوی موجودیت | primaryAction همان EntityDrawer |
| دیالوگ | دکمهٔ پاورقی دیالوگ |
| مورد یک صف بررسی | DecisionActions emphasis="item" (نه اقدام اصلی) |
در محیط توسعه، اگر سرِ صفحه (یا نوارابزار و سرِ ناحیهاش) بیش از یک دکمهٔ اصلی رندر کند، هشدار میدهد و همین جفت را پیشنهاد میکند.
راهنمای استفاده
بکنید
- تأیید و رد را یک
DecisionActionsکنید و در جای اقدام اصلی همان ناحیه بدهید. - ردی که دلیل میخواهد، دیالوگ دلیل را در
onClickخودش باز کند.
نکنید
- دو
Buttonاصلی کنار هم ننویسید. - در صف بررسی
emphasis="region"به کار نبرید. - تصمیمی را که کاربر اجازهاش را ندارد پنهان نکنید:
disabledReason.
Props
DecisionActions
DecisionAction
دسترسیپذیری
- جفت یک گروه با نام «تصمیم» است؛ هر دکمه آیکون و متن فعلش را دارد (رنگ تنها نشانه نیست).
- تصمیمی که اجازهاش نیست با
aria-disabledدر دسترس صفحهکلید میماند و دلیلش توضیح آن است.
کامپوننتهای مرتبط
GatedAction— اقدامی که کاربر اجازهاش را ندارد.EntityDrawer— کشویی که پاورقیاش جای این جفت است.
دادهٔ زنده (useLiveRefresh)
صفحهای که دادهاش خودبهخود تازه میشود — تازهشدن بی اسکلت و بی جابهجایی، زمان آخرین بهروزرسانی، و شکستی که هرگز داده را پاک نمیکند
اقدام بستهشده (GatedAction)
اقدامی که کاربر اکنون نمیتواند انجامش دهد — همانجا در جایگاهش، غیرفعال، با دلیلش؛ یک پاسخ بهجای پنهان کردن یا دکمهٔ غیرفعال بیدلیل