پرتوپرتو

کارت جستجوی ذخیره‌شده (SavedQueryCard)

نمایش یک query ذخیره‌شده — نام، توضیح، فیلترهای فعال، تعداد اجرا، آخرین اجرا، Run + Favorite

معرفی

SavedQueryCard نمایش یک filter preset / query ذخیره‌شده است — کاربر روی Run کلیک می‌کند و نتایج با همان فیلترهای ذخیره‌شده دوباره اجرا می‌شود. مناسب صفحه‌ی My Saved Searches در پنل افکارسنجی + sidebarهای جستجوی ذخیره‌شده.

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

  • صفحه‌ی جستجوهای ذخیره‌ی من — grid چندتایی
  • panel سمت‌راست داشبورد — لیست quick-runها
  • مرور هیستوری گزارش‌سازی که هر گزارش از یک query تولید شد

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

  • ایجاد یک query جدید با فیلترهای زنده → از FilterPanel + useFilterPresets (این کارت نمایش است، آن hook ذخیره/بازخوانی است)
  • نتایج خود query (لیست پست/concept/etc.) → از DataTable یا PostList
  • جستجوی fuzzy لحظه‌ای → از SearchInput یا CommandPalette

گزارش هفتگی — منتقدان سازنده

نظرات منتقد سازنده در شبکه‌های اجتماعی، ۷ روز اخیر

گرایش:منتقد سازندهپلتفرم:تلگرام، توییتربازه:۷ روز
۴۸ اجرا۲ روز پیش

زمین بازی

زمین بازی

گزارش هفتگی — منتقدان سازنده

نظرات منتقد سازنده در شبکه‌های اجتماعی، ۷ روز اخیر

گرایش:منتقد سازندهپلتفرم:تلگرام، توییتربازه:۷ روز
۴۸ اجرا۲ روز پیش
تنظیمات
محتوا
داده
کد این نمونه به‌صورت خودکار قابل تولید نیست — برای کد آماده‌ی copy/paste به بخش «استفاده» در بالای صفحه مراجعه کنید.

استفاده

import { SavedQueryCard } from '@parto-system-design/ui'

const [starred, setStarred] = React.useState(false)

<SavedQueryCard
  name="گزارش هفتگی — منتقدان سازنده"
  description="نظرات منتقد سازنده در شبکه‌های اجتماعی، ۷ روز اخیر"
  filters={[
    { label: 'گرایش', value: 'منتقد سازنده' },
    { label: 'پلتفرم', value: 'تلگرام، توییتر' },
    { label: 'بازه', value: '۷ روز' },
  ]}
  runCount={48}
  lastRun="۲ روز پیش"
  onRun={() => execute(query)}
  favorite={{ starred, onChange: setStarred }}
/>

ترکیب با useFilterPresets:

import { useFilterPresets, FilterProvider } from '@parto-system-design/ui'

function SavedSearches() {
  const presets = useFilterPresets({ storageKey: 'comments-app:filters' })
  return presets.presets.map((p) => (
    <SavedQueryCard
      key={p.id}
      name={p.name}
      lastRun={new Date(p.updatedAt).toLocaleDateString('fa')}
      onRun={() => presets.load(p.id)}
    />
  ))
}

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

بکنید

  • filters را به ۳-۵ chip محدود کنید — اگر بیش از ۵ فیلتر فعال است، نشان «+۳ فیلتر دیگر» در description بنویسید - lastRun را به‌صورت نسبی پاس بدهید (۲ روز پیش، همین الان) — کاربر سریع‌تر decay می‌فهمد - برای فیلترهای پر-استفاده favorite={{ starred: true, ... }} بگذارید تا کاربر mark کند

نکنید

  • onRun را همگام نگذارید روی DB heavy — همیشه async/queue بسازید چون کاربر روی Run کلیک می‌کند و انتظار feedback سریع دارد - این کارت برای rule هشدار نیست — برای آن AlertRuleCard بسازید

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

Prop

Type

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

  • دکمه favorite (ستاره) aria-label پویا دارد (star/unstar) به همراه aria-pressed={starred} تا screen reader وضعیت toggle را اعلام کند.
  • آیکون Search و Clock و Play همگی aria-hidden="true" هستند — معنا از طریق label و متن کنار آن‌ها منتقل می‌شود.
  • دکمه‌ی Run یک <button> استاندارد با focus ring است؛ کلید Enter/Space آن را فعال می‌کند.
  • ترتیب tab منطقی است: متن کارت → favorite → Run، تا کاربر کیبورد بدون trap به‌سرعت به action برسد.
  • lastRun به‌صورت متن نسبی (مثل «۲ روز پیش») رندر می‌شود — اگر دقت ثانیه نیاز است، title با ISO time به consumer اضافه شود.

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

  • ذخیره و بازخوانی state presetuseFilterPresets hook
  • alert ذخیره‌شده به‌جای جستجوAlertRuleCard
  • اجرای فیلتر زندهFilterPanel + FilterProvider
  • نتایج همان queryDataTable یا PostList