Skip to content

SkyTable ​

Віртуал-скрол таблиця для великих списків: у DOM тримаються лише видимі рядки. Розмітка й стилі 1:1 з таблицею товарів POS — чекбокси, масові дії, сортування, зміна ширини та видимості колонок, розкриття вкладених рядків (модифікацій), inline-редагування комірок і теги.

Демо ​

Приклад ​

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

const items = [
  { id: 1, name: 'Кава', price: 45, status: 'Активний' },
  // ...
]

const params = reactive({
  id: 'id',                 // ім'я ключового поля рядка
  name: 'products',         // назва інстансу таблиці
  selected: [],             // обрані рядки (мутується всередині)
  allSelect: false,
  footer: false,            // показати футер-панель
  massActions: { delete: { value: 'delete', title: 'Видалити' } },
  sort: { of: '', ot: '' }, // of — поле, ot — напрям
  header: [
    { title: 'Назва', name: 'name', sort: 'name', width: 240, enable: true },
    { title: 'Ціна', name: 'price', sort: 'price', width: 130, enable: true, customItemComponent: 'itemInput' },
  ],
})

const json = { items, total: items.length }
</script>

<template>
  <SkyTable
    :params="params"
    :json="json"
    :main-json-data="items"
    @getData="loadData"
    @updateSelected="onSelected"
    @open="onOpenRow"
  />
</template>

Висота контейнера

Віртуал-скрол рахує, скільки рядків показати, від висоти батьківського елемента. Огорніть таблицю в контейнер із заданою висотою (height: 380px, flex: 1 тощо) — інакше вона схлопнеться.

Props ​

PropТипЗа замовчуваннямОпис
paramsObject{}Конфіг таблиці (див. нижче)
json{ items: any[]; total: number }{}Дані: items + загальна кількість total
mainJsonDataArray[]Масив рядків для рендеру (те, що бачить віртуал-скрол)
justDeletedString''id щойно видаленого рядка — прибирає його з selected

params — конфіг таблиці ​

ПолеТипОпис
idStringІм'я ключового поля рядка (напр. 'id')
nameStringНазва інстансу таблиці
selectedArrayОбрані рядки (мутується компонентом)
allSelectBooleanЧи обрано всі
footerBooleanПоказати футер-панель
massActionsRecord<string, { value: string; title: string }>Масові дії; порожньо або { none: … } — приховати панель
sort{ of: string; ot: string }Поточне сортування: of — поле, ot — напрям
headerColumn[]Опис колонок (див. нижче)

params передавайте як reactive — компонент пише в нього (selected, allSelect, ширини й видимість колонок).

header[] — колонка ​

ПолеТипОпис
titleStringЗаголовок колонки
nameStringКлюч у рядку даних
sortString | falseПоле сортування або false
widthNumberФіксована ширина, px
widthFrNumberГнучка ширина (flex-частка), альтернатива width
enableBooleanВидимість колонки за замовчуванням
customItemComponent'itemInput' | 'itemSelect' | 'itemTags' | 'itemTagEditor'Тип комірки; без нього — звичайний текст
minWidthScreenNumberХовати колонку на екранах, вужчих за це значення

Типи комірок ​

customItemComponentПоведінкаПов'язаний event
— (не задано)Звичайний текст—
itemInputInline-редагування значенняinputEdit
itemSelectВибір зі списку прямо в комірціselectUpdate
itemTagsПоказ тегів + кнопка відкриття модалкиopenTagsModal, deleteTag
itemTagEditorРедактор тегів усередині коміркиopenTagsModal, deleteTag

Events ​

EventPayloadОпис
getData{ of, ot }Запит даних (зміна сортування)
updateSelectedany[]Змінився список обраних рядків
updateMassactionData{ action, items }Застосовано масову дію
open(item, isModification)Клік по рядку
openContext(item, { x, y })Контекстне меню (right-click / long-tap)
inputEdit(payload, columnName, handlers, item)Inline-редагування комірки itemInput
selectUpdate(columnName, item)Зміна в комірці itemSelect
openTagsModalitemВідкрити модалку тегів (itemTags)
deleteTag(item, tag)Видалити тег
deleteRowitemВидалити рядок (кнопка при params.isShowDeleteRow)

Сортування — серверне: компонент не сортує масив сам, а емітить getData з новими of / ot, а застосунок вантажить дані й оновлює json та mainJsonData.

Slots ​

SlotPropsОпис
cell-<name>{ row, value, item }Кастомний рендер комірки колонки <name>
vue
<SkyTable :params="params" :json="json" :main-json-data="items">
  <template #cell-status="{ value }">
    <SkyBadge :tone="value === 'Активний' ? 'success' : 'default'" :label="value" />
  </template>
</SkyTable>

Залежності й хост-середовище ​

Що треба врахувати перед інтеграцією

  • @tanstack/vue-virtual — зовнішня залежність. Її треба встановити в застосунку: npm i @tanstack/vue-virtual. Раніше тут був vue-virtual-scroller; рушій замінено, публічний API компонента не змінився.
  • i18n читається з window.lang (з UA-фолбеками), як у Dashboard.
  • Частина ассетів — хостові, за абсолютними шляхами (/image/dragons/…, /svg/arrow_black.svg). Вони навмисно не бандляться в бібліотеку (vite.config → transformAssetUrls.includeAbsolute: false), тож поза Skyservice-хостом ці іконки не завантажаться.

Пов'язане ​

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