جای فیلترها — سایدبار فیلتر یا نوار ابزار
فیلترهای هر صفحه فقط در یکی از دو جا هستند — سایدبار فیلتر در ستون دوم قاب، با همهچیز داخلش، یا چند فیلتر کشویی در نوار ابزار بالای فهرست؛ یک پاسخ برای هر نوع صفحه
معرفی
هر صفحه فیلترهایش را فقط در یکی از دو جا میگذارد (تصمیم مالک، 9 اکتبر 2026):
- (الف) سایدبار فیلتر: ستون دوم
ProductFrame، کنار منو، با همهچیز داخلش: سربرگ «N فیلتر فعال · پاک کردن همه»، چیپهای مقدار فعال زیر آن، و هر بخش با نشانگر فعال خودش و کنترلی متناسب با داده. نوار ابزار فقط جستوجو، مرتبسازی و اقدامها را دارد: نه دکمهٔ «فیلترها»، نه چیپ، نه «پاک کردن فیلترها». - (ب) نوار ابزار: چند فیلتر کشویی (حداکثر 4) بالای فهرست. هر ماشه مقدار خودش را نشان میدهد، پس چیپ لازم نیست.
پنلی کنار نتیجهها با دکمهٔ «فیلترها» در نوار ابزار، یا چیپهای فیلتر بالای نتیجهها کنار پنل، دیگر جایی ندارد (منسوخ در 7.13). هر بُعد یک فیلتر است (پلتفرم، احساس، موضوع، بازهٔ زمانی)؛ جستوجو و مرتبسازی بُعد فیلتر نیستند.
نمونه بصری
قاعده
- شمار بُعدها اول تصمیم میگیرد: حداکثر 4 بُعد که گاهبهگاه عوض میشوند ⇒ نوار ابزار. 5 بُعد یا بیشتر، بُعدهایی که کنار هر مقدار شمار دارند، یا صفحهای که کار اصلیاش فیلتر کردن است (جستوجو، کاوش، تحلیل یک نتیجهٔ بزرگ) ⇒ سایدبار فیلتر. صفحهٔ جدولی با 2 بُعد یا کمتر هرگز سایدبار نمیگیرد.
- ستون دوم در هر صفحه یا ناوبری است یا فیلتر. اگر
secondaryNavهمان صفحه ستون را گرفته باشد، قاب نباشد یا کنار ستون کمتر از 40rem برای محتوا بماند، همان بخشهای سایدبار نوار افقی بالای فهرست میشوند: هر بخش یک Popover با همان کنترلها و ماشهای که مقدار خودش را نشان میدهد. زیر 36rem محتوا درSheet. ستون سوم یا فیلتر زیر ناوبری ساخته نمیشود. - هرگز هر دو با هم (
filtersوfilterPanelخطای نوع است). وضعیت فیلترها وضعیت صفحه است (React.useState)؛ هر تغییر فوراً اعمال میشود و فهرست از اول بار میشود. دکمهٔ «اعمال» نیست.
کدام صفحه، کدام جا
| صفحه | جای فیلترها | چگونه |
|---|---|---|
| صفحهٔ فهرست یا جدول (منشنها، منبعها، اعضا، هشدارها) با حداکثر 4 بُعد | نوار ابزار | ListPage filters؛ از 5 بُعد به بالا سایدبار فیلتر |
| فید (پستها، نظرها) با چند بُعد | نوار ابزار | ListPage content="feed" filters؛ عددهای نتیجه در aside، هرگز فیلتر آنجا |
صفحهٔ جستوجو (query): بُعدهای زیاد، شمار هر مقدار | سایدبار فیلتر | ListPage query و filterPanel؛ چیپهای activeFilters بالای خود سایدبار |
کاوش یا تحلیل یک نتیجهٔ بزرگ (search) | سایدبار فیلتر | ListPage filterPanel (ستون قاب، پیشفرض همهٔ صفحهها از 7.13) |
| داشبورد | نوار ابزار یا سایدبار فیلتر | DashboardPage period و filters تا 4 بُعد ساده؛ بیشتر: filterPanel |
| بخشهای صفحهٔ جزئیات | نوار همان بخش | DetailSection search / filters (فهرست همان بخش)؛ فیلتر کل صفحه: DetailPage filters |
| تنظیمات، فرم، جریان چندمرحلهای | بی فیلتر | صفحهٔ تنظیمات بخشبندی میشود (SettingsSection)، نه فیلتر |
| صفحهٔ سفارشی (بوم، ابزار) | نوار بخش یا سایدبار فیلتر | PageToolbar filters برای چند فیلتر یک بخش؛ فیلترهای صفحه: CustomPage filterPanel (FilterPanelLayout منسوخ است) |
پیادهسازی
(الف) سایدبار فیلتر
پنل را به filterPanel قالب بدهید و placement را ننویسید. قالب آن را به ستون دوم قاب میبرد (با
ProductFrame filterSidebarWidth="wide" عرض 18rem، مثل صفحهٔ Logs در Supabase و Prototype) و activeFilters را بالای
خود پنل رسم میکند. شرح کامل، کنترلها و Props در سایدبار فیلتر.
<ListPage
title="جستوجوی پستها"
content="feed"
query={{ value: typed, onValueChange: setTyped, onSubmit: submit, submitted, label: 'جستوجو در پستها' }}
filterPanel={{ panel: <PostFilters />, activeCount }}
// داخل سایدبار، زیر «N فیلتر فعال · پاک کردن همه» — هرگز در نوار ابزار
activeFilters={chips}
filtered={activeCount > 0}
onClearFilters={clearFacets}
state={state}
loadMore={list.loadMore}
>
<EntityCollection entity="post" items={posts} getId={(post) => post.id} renderItem={renderPost} />
</ListPage>داخل سایدبار، به ترتیب Supabase: بازهٔ زمانی اول و باز (FilterSectionPeriod، با relativeInput روی تقویم)، بُعدهای
پرتکرار باز، کمکاربردها با defaultOpen={false} و summary. کنترل هر بخش از نوع داده میآید: هیجان و تازگی
FilterSectionChoices variant="chips" با رنگ و آیکون، منبع و زبان cards، دیدگاه swatches، سطح بحران levelCards،
عدد FilterSectionRange، فهرست بلند FilterSectionOptions (جعبهٔ مرزدار، شمار، «فقط»، جستوجو).
(ب) نوار ابزار
فیلترها در ردیف نوار ابزار بعد از جستوجو میآیند و «پاک کردن فیلترها» در انتهایشان:
<ListPage
title="منشنها"
search={<SearchInput placeholder="جستوجو در منشنها" aria-label="جستوجو در منشنها" value={q} onChange={onQ} />}
filters={
<>
<DataTableFacetedFilter title="پلتفرم" options={PLATFORMS} selected={platforms} onSelectedChange={onPlatforms} />
<DataTableFacetedFilter
title="احساس"
options={SENTIMENTS}
selected={sentiments}
onSelectedChange={onSentiments}
/>
<DateRangePicker value={range} onChange={onRange} placeholder="بازهٔ زمانی" />
</>
}
filtered={filtered}
onClearFilters={clear}
state={state}
loadMore={list.loadMore}
>
<DataTable columns={columns} data={rows} />
</ListPage>الگوهای رایج
ستون دوم با ناوبری بخش
صفحهای که ستون دومش ناوبری بخش است (مثلاً زیرصفحههای «جستوجو»)، همان سایدبار را بهصورت نوار افقی بالای فهرست میگیرد. هر بخش یک Popover است و ماشهاش مقدار فعال را نشان میدهد؛ «پاک کردن فیلترها» در انتهای نوار است.
صفحهٔ کاوش با جدول
همان سایدبار برای صفحهٔ جدولی با بُعدهای شمارشدار. نمونهٔ قابلکامپایل: npx --no parto-ui example list-page-filter-panel.
ستون جمعشدنی
collapsible اختیاری و پیشفرض خاموش است (در Prototype هم خاموش). محصولی که روشنش کند، ستون را با «بستن فیلترها» یا
Ctrl+B میبندد و از زبانهٔ «فیلترها» در خود قاب (با شمار فیلتر فعال) برمیگرداند؛ هرگز دکمهای در نوار ابزار.
بهترین روشها و دامهای رایج
- سایدبار را یک ستون آرام ببینید، نه کارت: پسزمینهٔ خود ستون قاب، بی جعبه و بی سایه.
- فیلتری که بخش ندارد (کلیک روی نمودار) یک
FilterSectionباsummaryبگیرد تا در سایدبار و نوار افقی دیده شود. - دام: دکمهٔ «فیلترها» در نوار ابزار دسکتاپ، چیپهای فیلتر بالای نتیجهها، یا فوتر «اعمال» در سایدبار.
- دام:
placement: 'page'یاFilterPanelLayout(منسوخ؛ هشدار توسعه و ESLint). - دام: همهٔ بخشها فهرست چکباکس.
- بررسی خودکار: ESLint
parto/filter-placement(درrecommended، سطحwarn) بیش از 4 فیلتر در نوار، صفحهٔ جدولیای که پنلش 1 یا 2 بخش دارد،placement: 'page'،FilterPanelLayout،FilterPanelTriggerبیرون ازSheetTrigger، وFilterBarActiveFiltersکنار یکFilterPanelرا نشان میدهد.ListPageدر زمان توسعه هم هشدار میدهد.