Skip to content

SkyFilters ​

Рядок фільтрів з одним v-model на всі. Фільтри, що не влазять по ширині, ховаються в кнопку «Усі фільтри», а вона відкриває штору (SkyFiltersCurtain) зі всіма фільтрами — як HeaderFilters в адмінці. Коли влазить усе й щось обрано, у рядку з'являється «Скинути фільтри».

Вбудовані типи: checkbox, radio (з опційним числовим інпутом), range, search (серверний пошук), date (період). Кожен є й окремим фільтр-чіпом зі своєю сторінкою: SkyCheckboxFilter, SkyRadioFilter, SkyRangeFilter, SkySearchFilter, SkyDateFilter. Свої типи додаються компонентом прямо в конфігу або через registerFilterType.

Демо ​

Потягни повзунок ширини — фільтри почнуть ховатися в «Усі фільтри».

Приклад ​

vue
<script setup>
import { ref } from 'vue'
import { SkyFilters } from '@skyservice-developers/vue-dev-kit'

const values = ref({})
const filters = [
  { key: 'tradepoints', title: 'Торгова точка', options: tradepoints },
  { key: 'payment', title: 'Спосіб оплати', type: 'radio', options: payments },
  { key: 'avgCheck', title: 'Середній чек', type: 'range', min: 0, max: 5000, step: 10 },
  { key: 'clients', title: 'Клієнти', type: 'search', fetch: fetchClients },
]
</script>

<template>
  <div style="display: flex; align-items: center; gap: 5px">
    <SkyDateRangePicker v-model="range" />
    <!-- flex: 1 + min-width: 0 — інакше рядку нема від чого рахувати ширину -->
    <SkyFilters v-model="values" :filters="filters" style="flex: 1; min-width: 0" @change="load" />
  </div>
</template>

Props ​

PropТипЗа замовчуваннямОпис
filtersSkyFilterConfig[]—Конфіг фільтрів, порядок = порядок у рядку
modelValueRecord<string, unknown>{}Значення за ключами (v-model). Відсутній ключ = порожнє значення типу
disabledBooleanfalseВимикає всі фільтри
labelsPartial<SkyFiltersLabels>укр.Тексти: allFilters, active, pcs, reset, ok, done, clear, selectAll, search, empty, loading, loadMore
curtainAnchorstring | HTMLElement—Елемент/селектор, до кута якого прилипає штора (напр. '#content' поруч із меню). Без нього — лівий верхній кут вікна
curtainWidthNumber320Ширина штори, px

SkyFilterConfig ​

ПолеТипиОпис
keyусіКлюч у v-model
titleусіЗаголовок
type—checkbox (за замовчуванням) | radio | range | search | date | свій
optionscheckbox, radio{ value, name }[]. Порожній — фільтр прихований (якщо не keepEmpty)
searchablecheckbox, radioПошук у списку. checkbox — true, radio — false
selectAllcheckbox«Обрати все», true
clearableradio«Очистити», true
inputFor / inputHintradioПункти з числовим інпутом і підпис до нього. Значення стає { value, input }; без числа фільтр не активний
min / max / steprangeМежі й крок. Повний діапазон = { from: null, to: null }
min / maxdateМежі дат YYYY-MM-DD (max: today() — без майбутнього)
maxDays / disabledDate / presetsdateЯк у SkyDateFilter
fetchsearch({ page, search }) => Promise<{ items, hasMore }>
widthусіШирина панелі дропдауна, px (280)
collapsedусіУ шторі секція згорнута, доки в ній нічого не обрано
keepEmptycheckbox, radioПоказувати без опцій
disabledусіВимкнути один фільтр
component / emptyValue / displayсвійДив. нижче

Значення за типами ​

ТипПорожнєОбране
checkbox[][1, 2]
radionull'card'
radio + inputFor{ value: null, input: '' }{ value: 'come', input: '5' }
range{ from: null, to: null }{ from: 100, to: 900 }
search[][{ value: 7, name: 'Клієнт 7' }] — з назвою, бо рядка може вже не бути у списку
date{ start: null, end: null }{ start: '2025-10-01', end: '2025-10-15' }

Свій фільтр ​

Будь-який компонент з modelValue / update:modelValue (отримує ще disabled, filter, labels):

js
{
  key: 'debt',
  title: 'Борг',
  component: DebtFilter,
  emptyValue: () => null,
  // count > 0 — фільтр активний; summary замінює назву в тригері, badge — поруч
  display: (v) => (v ? { count: 1, summary: 'З боргом' } : { count: 0 }),
}

Тип, що повторюється на багатьох сторінках, реєструється раз на застосунок:

js
import { registerFilterType } from '@skyservice-developers/vue-dev-kit'

registerFilterType('date', {
  component: DateFilterPanel,
  emptyValue: () => null,
  display: (v) => (v ? { count: 1, badge: v } : { count: 0 }),
  // які пропи отримує компонент (за замовчуванням { filter, labels })
  props: (filter, labels) => ({ min: filter.min }),
})
// далі: { key: 'created', title: 'Дата', type: 'date' }

Events ​

ПодіяPayloadОпис
update:modelValuevaluesНовий об'єкт значень
change{ key, value, values }Змінився один фільтр (з рядка або зі штори)
resetvalues«Скинути фільтри»

Методи (ref) ​

МетодОпис
recalc()Перерахувати, що влазить (зазвичай не потрібно — є ResizeObserver)
openCurtain() / closeCurtain()Відкрити/закрити штору

CSS-змінні ​

ЗміннаЗа замовчуваннямОпис
--sky-filters-gap5pxВідступ між фільтрами
--sky-filters-reset-colorgrayКолір «Скинути фільтри»
--sky-filters-curtain-z-index999z-index штори (блюр — на 1 нижче)
--sky-filters-curtain-bg#fffФон штори
--sky-filter-range-accent#28a745Колір слайдера діапазону
--sky-filter-list-max-height— / 260px у шторіМаксимальна висота списку в панелі

Решта (--sky-filter-accent, --sky-filter-trigger-*, --sky-filter-panel-*) — від SkyFilterDropdown.

Опубліковано під ліцензією MIT.