@skyservice-developers/vue-dev-kit 2.10.1 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +292 -37
- package/dist/features/data-table/SkyDataTable.vue.d.ts +210 -0
- package/dist/features/data-table/SkyDataTableColumnToggle.vue.d.ts +36 -0
- package/dist/features/data-table/index.d.ts +2 -0
- package/dist/features/index.d.ts +2 -0
- package/dist/features/table/TableColumnSettings.vue.d.ts +31 -0
- package/dist/features/table/TableMassActions.vue.d.ts +56 -0
- package/dist/features/table/TableVirtualBody.vue.d.ts +65 -0
- package/dist/features/table/index.d.ts +3 -0
- package/dist/index.d.ts +1 -0
- package/dist/shared/lib/table/index.d.ts +8 -0
- package/dist/shared/lib/table/tableFeatures.d.ts +110 -0
- package/dist/shared/lib/table/useColumnVisibility.d.ts +29 -0
- package/dist/shared/lib/table/useTableSelection.d.ts +34 -0
- package/dist/shared/lib/table/useTableSort.d.ts +28 -0
- package/dist/shared/ui/Dialog/Dialog.vue.d.ts +1 -4
- package/dist/shared/ui/DialogModal/DialogModal.vue.d.ts +3 -0
- package/dist/shared/ui/DialogNext/DialogNext.vue.d.ts +3 -0
- package/dist/shared/ui/Modal/Modal.vue.d.ts +3 -0
- package/dist/shared/ui/SkyDateRangePicker/SkyDateRangePicker.vue.d.ts +749 -0
- package/dist/shared/ui/SkyDateRangePicker/index.d.ts +1 -0
- package/dist/shared/ui/SkyTable/DynamicScroller.vue.d.ts +2 -2
- package/dist/shared/ui/SkyTable/Row.vue.d.ts +2 -2
- package/dist/shared/ui/SkyTable/items/itemDefault.vue.d.ts +2 -2
- package/dist/shared/ui/SkyTable/items/itemInput.vue.d.ts +1 -1
- package/dist/shared/ui/SkyTable/items/itemSelect.vue.d.ts +2 -2
- package/dist/shared/ui/SkyTable/items/itemTagEditor.vue.d.ts +2 -2
- package/dist/shared/ui/SkyTable/items/itemTags.vue.d.ts +1 -1
- package/dist/shared/ui/functional-calendar/components/Arrows.vue.d.ts +49 -0
- package/dist/shared/ui/functional-calendar/components/Day.vue.d.ts +81 -0
- package/dist/shared/ui/functional-calendar/components/Footer.vue.d.ts +2 -0
- package/dist/shared/ui/functional-calendar/components/FunctionalCalendar.vue.d.ts +554 -0
- package/dist/shared/ui/functional-calendar/components/MonthYearPicker.vue.d.ts +27 -0
- package/dist/shared/ui/functional-calendar/components/PickerInputs.vue.d.ts +41 -0
- package/dist/shared/ui/functional-calendar/components/TimePicker.vue.d.ts +23 -0
- package/dist/shared/ui/functional-calendar/components/WeekNumbers.vue.d.ts +22 -0
- package/dist/shared/ui/index.d.ts +3 -0
- package/dist/shared/ui/table/SkyTableBody.vue.d.ts +11 -0
- package/dist/shared/ui/table/SkyTableCell.vue.d.ts +45 -0
- package/dist/shared/ui/table/SkyTableEmpty.vue.d.ts +39 -0
- package/dist/shared/ui/table/SkyTableHead.vue.d.ts +34 -0
- package/dist/shared/ui/table/SkyTableHeader.vue.d.ts +40 -0
- package/dist/shared/ui/table/SkyTableRoot.vue.d.ts +50 -0
- package/dist/shared/ui/table/SkyTableRow.vue.d.ts +49 -0
- package/dist/shared/ui/table/index.d.ts +9 -0
- package/dist/shared/ui/table/types.d.ts +36 -0
- package/dist/style.css +1 -1
- package/dist/vue-dev-kit.cjs +14 -12
- package/dist/vue-dev-kit.js +11879 -8743
- package/package.json +11 -2
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Vue 3 developer toolkit для Skyservice mini-apps: UI компоненти + TypeScript SDK (iframe bridge + HTTP API клієнт).
|
|
4
4
|
|
|
5
|
+
📖 **Документація з живими демо:** https://74cfe434-a2b3-4d49-8fa7-db7343e399dc.apps.platform365.online/
|
|
6
|
+
|
|
5
7
|
> **v2.0.0 breaking changes:**
|
|
6
8
|
> - Vue 2 більше не підтримується (тільки Vue 3.4+).
|
|
7
9
|
> - Додано повноцінний SDK (`bridge` + `SkyserviceAPI`), раніше опублікований як окремий пакет `skyservice-sdk` (задепрекейтнутий).
|
|
@@ -22,14 +24,20 @@ import '@skyservice-developers/vue-dev-kit/style.css'
|
|
|
22
24
|
import {
|
|
23
25
|
// shared/ui
|
|
24
26
|
Header, Modal, Dialog,
|
|
25
|
-
SkyButton, SkySelect, SkySelectSearch, SkyInput, SkySearchInput, SkyCheckbox,
|
|
27
|
+
SkyButton, SkySelect, SkySelectSearch, SkyInput, SkySearchInput, SkyCheckbox, SkyTabs,
|
|
26
28
|
SkyAlert, SkyBadge, SkyLoader,
|
|
27
29
|
SkyCard, SkyCardHeader, SkyCardRow,
|
|
28
30
|
SkyTable,
|
|
31
|
+
// грід на TanStack + примітиви таблиці + композабли
|
|
32
|
+
SkyDataTable, createSkyColumnHelper, skyTableFeatures,
|
|
33
|
+
SkyTableRoot, SkyTableHeader, SkyTableHead, SkyTableBody, SkyTableRow, SkyTableCell,
|
|
34
|
+
useTableSort, useTableSelection, useColumnVisibility,
|
|
35
|
+
FunctionalCalendar, SkyDateRangePicker,
|
|
29
36
|
// widgets
|
|
30
37
|
SkyTileCard,
|
|
31
38
|
// features
|
|
32
39
|
SkyCheckboxFilter,
|
|
40
|
+
TableMassActions, TableColumnSettings, TableVirtualBody,
|
|
33
41
|
// sdk
|
|
34
42
|
navigate, SkyserviceAPI, isInsideIframe,
|
|
35
43
|
// sky-service-ui-components
|
|
@@ -209,6 +217,24 @@ import {
|
|
|
209
217
|
</Modal>
|
|
210
218
|
```
|
|
211
219
|
|
|
220
|
+
Шапку можна зібрати слотами — так само як у `Header`: `#title` / `#subtitle`
|
|
221
|
+
перекривають відповідні props, `#header-actions` додає елементи справа
|
|
222
|
+
(кнопка "Назад" лишається на місці).
|
|
223
|
+
|
|
224
|
+
```vue
|
|
225
|
+
<Modal v-model="show">
|
|
226
|
+
<template #title>
|
|
227
|
+
<h4 style="margin: 0">Замовлення №1042 <SkyBadge tone="success" label="Оплачено" /></h4>
|
|
228
|
+
</template>
|
|
229
|
+
<template #subtitle>Оновлено щойно</template>
|
|
230
|
+
<template #header-actions>
|
|
231
|
+
<SkyButton variant="outline">Друк</SkyButton>
|
|
232
|
+
</template>
|
|
233
|
+
|
|
234
|
+
<p>Контент</p>
|
|
235
|
+
</Modal>
|
|
236
|
+
```
|
|
237
|
+
|
|
212
238
|
#### Props
|
|
213
239
|
|
|
214
240
|
| Prop | Тип | За замовчуванням | Опис |
|
|
@@ -227,8 +253,17 @@ import {
|
|
|
227
253
|
| Slot | Опис |
|
|
228
254
|
|------|------|
|
|
229
255
|
| `default` | Основний контент |
|
|
256
|
+
| `title` | Кастомний заголовок (замість пропа `title`) |
|
|
257
|
+
| `subtitle` | Кастомний підзаголовок (замість пропа `subtitle`) |
|
|
258
|
+
| `header-actions` | Елементи справа в шапці (кнопки, бейджі) |
|
|
230
259
|
| `footer` | Футер з кнопками |
|
|
231
260
|
|
|
261
|
+
#### CSS змінні
|
|
262
|
+
|
|
263
|
+
| Змінна | За замовчуванням | Опис |
|
|
264
|
+
|--------|------------------|------|
|
|
265
|
+
| `--sky-modal-header-actions-gap` | `8px` | Відступ між елементами в `#header-actions` |
|
|
266
|
+
|
|
232
267
|
#### Events
|
|
233
268
|
|
|
234
269
|
| Event | Опис |
|
|
@@ -271,8 +306,33 @@ import {
|
|
|
271
306
|
| Slot | Опис |
|
|
272
307
|
|------|------|
|
|
273
308
|
| `default` | Основний контент |
|
|
309
|
+
| `title` | Кастомний заголовок (замість пропа `title`) |
|
|
310
|
+
| `subtitle` | Кастомний підзаголовок (замість пропа `subtitle`) |
|
|
311
|
+
| `header-actions` | Елементи справа в шапці (кнопки, бейджі) |
|
|
274
312
|
| `buttons` | Кнопки у футері |
|
|
275
313
|
|
|
314
|
+
Слоти шапки працюють в обох режимах — `next` (ліворуч кнопка "Назад") і
|
|
315
|
+
`classic` (праворуч ×); `#header-actions` рендериться ліворуч від ×.
|
|
316
|
+
|
|
317
|
+
```vue
|
|
318
|
+
<Dialog v-model="show" mode="next">
|
|
319
|
+
<template #title>Замовлення №1042</template>
|
|
320
|
+
<template #subtitle>3 позиції · 1 240 ₴</template>
|
|
321
|
+
<template #header-actions>
|
|
322
|
+
<SkyButton variant="outline">Друк</SkyButton>
|
|
323
|
+
</template>
|
|
324
|
+
|
|
325
|
+
<div style="padding: 20px">Контент</div>
|
|
326
|
+
</Dialog>
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
#### CSS змінні
|
|
330
|
+
|
|
331
|
+
| Змінна | За замовчуванням | Опис |
|
|
332
|
+
|--------|------------------|------|
|
|
333
|
+
| `--sky-dialog-header-actions-gap` | `8px` | Відступ між елементами в `#header-actions` |
|
|
334
|
+
| `--sky-dialog-title-max-width-with-actions` | `50%` | Ширина заголовка в `classic`, коли є `#header-actions` |
|
|
335
|
+
|
|
276
336
|
#### Events
|
|
277
337
|
|
|
278
338
|
| Event | Опис |
|
|
@@ -329,60 +389,47 @@ import {
|
|
|
329
389
|
|
|
330
390
|
### SkySelect
|
|
331
391
|
|
|
332
|
-
|
|
392
|
+
Нативний `<select>` у фірмовому стилі, зі станами `default | success | error` та підказкою під полем.
|
|
333
393
|
|
|
334
394
|
```vue
|
|
335
|
-
<!-- Об'єкти -->
|
|
336
395
|
<SkySelect
|
|
337
|
-
v-model="
|
|
396
|
+
v-model="payment"
|
|
338
397
|
:options="[
|
|
339
|
-
{
|
|
340
|
-
{
|
|
398
|
+
{ value: 'cash', text: 'Готівка' },
|
|
399
|
+
{ value: 'card', text: 'Картка' },
|
|
341
400
|
]"
|
|
342
401
|
placeholder="Оберіть спосіб оплати"
|
|
343
402
|
/>
|
|
344
403
|
|
|
345
|
-
|
|
346
|
-
<SkySelect v-model="
|
|
347
|
-
|
|
348
|
-
<!-- На всю ширину -->
|
|
349
|
-
<SkySelect v-model="selected" :options="options" block />
|
|
404
|
+
<SkySelect v-model="payment" :options="options" state="error" hint="Оберіть спосіб" />
|
|
405
|
+
<SkySelect v-model="payment" :options="options" disabled />
|
|
350
406
|
```
|
|
351
407
|
|
|
352
408
|
#### Props
|
|
353
409
|
|
|
354
410
|
| Prop | Тип | За замовчуванням | Опис |
|
|
355
411
|
|------|-----|------------------|------|
|
|
356
|
-
| `modelValue`
|
|
357
|
-
| `options` | `Array
|
|
358
|
-
| `
|
|
412
|
+
| `modelValue` | `string \| number` | — | Поточне значення (v-model) |
|
|
413
|
+
| `options` | `Array<{ value: string \| number; text: string }>` | — | Список опцій (обов'язковий) |
|
|
414
|
+
| `id` | `String` | — | HTML id |
|
|
359
415
|
| `disabled` | `Boolean` | `false` | Вимкнений стан |
|
|
360
|
-
| `
|
|
361
|
-
| `
|
|
416
|
+
| `state` | `'default' \| 'success' \| 'error'` | `'default'` | Візуальний стан рамки |
|
|
417
|
+
| `placeholder` | `String` | `''` | Текст-заглушка (рендериться як `disabled hidden` опція) |
|
|
418
|
+
| `hint` | `String` | `''` | Підказка під полем у кольорі `state` |
|
|
362
419
|
|
|
363
|
-
####
|
|
420
|
+
#### Events
|
|
364
421
|
|
|
365
|
-
|
|
|
366
|
-
|
|
367
|
-
| `
|
|
368
|
-
| `↑` / `↓` | Навігація по опціях |
|
|
369
|
-
| `Enter` | Вибрати поточну опцію |
|
|
370
|
-
| `Esc` | Закрити дропдаун |
|
|
422
|
+
| Event | Payload | Опис |
|
|
423
|
+
|-------|---------|------|
|
|
424
|
+
| `update:modelValue` | `string \| number` | Emit при виборі опції |
|
|
371
425
|
|
|
372
|
-
|
|
426
|
+
> **Формат опцій — тільки `{ value, text }`.** Масив рядків або `{ label, value }` дадуть порожні пункти:
|
|
427
|
+
> компонент читає `option.value` і `option.text`. Мапте дані заздалегідь — `units.map(u => ({ value: u, text: u }))`.
|
|
373
428
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
--sky-select-font-size: 14px
|
|
378
|
-
--sky-select-border: 1px solid #d1d5db
|
|
379
|
-
--sky-select-dropdown-shadow: 0 4px 12px rgba(0,0,0,0.1)
|
|
380
|
-
--sky-select-dropdown-max-height: 220px
|
|
381
|
-
--sky-select-option-hover-bg: #f3f4f6
|
|
382
|
-
--sky-select-option-selected-color: #24973f
|
|
383
|
-
```
|
|
429
|
+
> Список малює браузер, тож клавіатура й поведінка на мобільних — рідні для платформи, а дропдаун
|
|
430
|
+
> не обрізається контейнерами з `overflow: hidden` (усередині `Modal` teleport не потрібен).
|
|
431
|
+
> Компонент займає всю ширину контейнера — обмежуйте батьківський блок, якщо треба вужче.
|
|
384
432
|
|
|
385
|
-
---
|
|
386
433
|
|
|
387
434
|
### SkySelectSearch
|
|
388
435
|
|
|
@@ -527,6 +574,39 @@ import {
|
|
|
527
574
|
|
|
528
575
|
---
|
|
529
576
|
|
|
577
|
+
### SkyTabs
|
|
578
|
+
|
|
579
|
+
Сегментовані таби з анімованим індикатором: біла «пігулка» плавно переїжджає під активну опцію й підлаштовує ширину під довжину тексту.
|
|
580
|
+
|
|
581
|
+
```vue
|
|
582
|
+
<SkyTabs
|
|
583
|
+
v-model="period"
|
|
584
|
+
:options="[
|
|
585
|
+
{ value: 'day', text: 'День' },
|
|
586
|
+
{ value: 'week', text: 'Тиждень' },
|
|
587
|
+
{ value: 'month', text: 'Місяць' },
|
|
588
|
+
]"
|
|
589
|
+
/>
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
#### Props
|
|
593
|
+
|
|
594
|
+
| Prop | Тип | За замовчуванням | Опис |
|
|
595
|
+
|------|-----|------------------|------|
|
|
596
|
+
| `modelValue` | `string \| number` | — | Активне значення (v-model) |
|
|
597
|
+
| `options` | `Array<{ value: string \| number; text: string }>` | — | Список табів (обов'язковий) |
|
|
598
|
+
| `disabled` | `Boolean` | `false` | Блокує весь набір |
|
|
599
|
+
|
|
600
|
+
#### Events
|
|
601
|
+
|
|
602
|
+
| Event | Payload | Опис |
|
|
603
|
+
|-------|---------|------|
|
|
604
|
+
| `update:modelValue` | `string \| number` | Emit при виборі таба |
|
|
605
|
+
|
|
606
|
+
> Індикатор вимірює активну кнопку через `getBoundingClientRect()`: на першому рендері стає на місце без анімації, далі — з переходом. Реагує на `resize` вікна і зміну кількості опцій. У прихованому контейнері (`display: none`) розміри нульові — позиція виправиться після показу.
|
|
607
|
+
|
|
608
|
+
---
|
|
609
|
+
|
|
530
610
|
### SkyAlert
|
|
531
611
|
|
|
532
612
|
Інформаційне повідомлення з 4 тональностями та опціональною іконкою.
|
|
@@ -779,6 +859,129 @@ Shell-контейнер для карток: ribbon / header / body / footer
|
|
|
779
859
|
|
|
780
860
|
---
|
|
781
861
|
|
|
862
|
+
### SkyDataTable
|
|
863
|
+
|
|
864
|
+
Грід на [TanStack Table v9](https://tanstack.com/table/latest): headless-ядро тримає стан і обчислення, розмітка й стилі — наші. Візуально це та сама таблиця, що в POS. Повний опис — у [документації](https://74cfe434-a2b3-4d49-8fa7-db7343e399dc.apps.platform365.online/components/data-table).
|
|
865
|
+
|
|
866
|
+
```vue
|
|
867
|
+
<script setup lang="ts">
|
|
868
|
+
import { h } from 'vue'
|
|
869
|
+
import { SkyDataTable, SkyBadge, createSkyColumnHelper } from '@skyservice-developers/vue-dev-kit'
|
|
870
|
+
|
|
871
|
+
const column = createSkyColumnHelper<Product>()
|
|
872
|
+
|
|
873
|
+
const columns = [
|
|
874
|
+
column.accessor('name', { header: 'Назва', meta: { widthFr: 2 } }),
|
|
875
|
+
column.accessor('price', {
|
|
876
|
+
header: 'Ціна',
|
|
877
|
+
size: 110,
|
|
878
|
+
meta: { align: 'right' },
|
|
879
|
+
cell: ({ getValue }) => `${getValue()} ₴`,
|
|
880
|
+
}),
|
|
881
|
+
column.accessor('status', {
|
|
882
|
+
header: 'Статус',
|
|
883
|
+
size: 150,
|
|
884
|
+
enableSorting: false,
|
|
885
|
+
cell: ({ getValue }) =>
|
|
886
|
+
h(SkyBadge, { tone: getValue() === 'Активний' ? 'success' : 'default', label: getValue() }),
|
|
887
|
+
}),
|
|
888
|
+
]
|
|
889
|
+
</script>
|
|
890
|
+
|
|
891
|
+
<template>
|
|
892
|
+
<SkyDataTable :columns="columns" :data="products" :page-size="25" row-id="id" searchable />
|
|
893
|
+
</template>
|
|
894
|
+
```
|
|
895
|
+
|
|
896
|
+
#### Props
|
|
897
|
+
|
|
898
|
+
| Prop | Тип | За замовчуванням | Опис |
|
|
899
|
+
|------|-----|------------------|------|
|
|
900
|
+
| `columns` | `ColumnDef[]` | — | Опис колонок (TanStack) |
|
|
901
|
+
| `data` | `TData[]` | — | Дані |
|
|
902
|
+
| `features` | `TableFeatures` | `skyTableFeatures` | Власний набір фіч |
|
|
903
|
+
| `rowId` | `String \| (row) => string` | — | Ключ рядка |
|
|
904
|
+
| `pageSize` | `Number` | `0` | Розмір сторінки; `0` — без пагінації |
|
|
905
|
+
| `searchable` | `Boolean` | `false` | Поле глобального пошуку в тулбарі |
|
|
906
|
+
| `initialSorting` | `SortingState` | — | Початкове сортування |
|
|
907
|
+
| `emptyText` | `String` | `'Даних немає'` | Текст порожнього стану |
|
|
908
|
+
| `interactiveRows` | `Boolean` | `false` | Курсор і hover на рядках |
|
|
909
|
+
|
|
910
|
+
Слоти: `toolbar`, `actions`, `footer`, `empty` (усі отримують `{ table }`). Подія: `row-click`. Інстанс таблиці доступний через `ref` → `tableRef.table`.
|
|
911
|
+
|
|
912
|
+
#### Набір фіч
|
|
913
|
+
|
|
914
|
+
Фічі TanStack v9 вмикаються явно — кіт експортує стабільний `skyTableFeatures` (сортування, вибір, видимість колонок, пагінація, фільтрація + слоти row-моделей і реєстри `sortFns`/`filterFns`). Потрібно більше — зберіть свій обʼєкт і передайте пропом `features`:
|
|
915
|
+
|
|
916
|
+
```ts
|
|
917
|
+
import { tableFeatures, rowExpandingFeature, createExpandedRowModel } from '@tanstack/vue-table'
|
|
918
|
+
import { skyTableFeatures } from '@skyservice-developers/vue-dev-kit'
|
|
919
|
+
|
|
920
|
+
const features = tableFeatures({
|
|
921
|
+
...skyTableFeatures,
|
|
922
|
+
rowExpandingFeature,
|
|
923
|
+
expandedRowModel: createExpandedRowModel(),
|
|
924
|
+
})
|
|
925
|
+
```
|
|
926
|
+
|
|
927
|
+
Ширина колонок: `size: 150` — фіксовані px, `meta: { widthFr: 2 }` — гнучка частка (має пріоритет над `size`), `meta: { align }` і `meta: { minWidthScreen }` — вирівнювання й приховування на вузьких екранах.
|
|
928
|
+
|
|
929
|
+
> `@tanstack/vue-table` входить у залежності пакета й лишається зовнішнім у бандлі — застосунки, які гріда не використовують, його не тягнуть.
|
|
930
|
+
|
|
931
|
+
---
|
|
932
|
+
|
|
933
|
+
### Таблиця з примітивів (композиційна)
|
|
934
|
+
|
|
935
|
+
Набір примітивів і композаблів замість одного великого компонента: береш тільки те, що треба. Без вибору рядків, без масових дій, без віртуалізації — і нічого з цього не потрапляє в бандл. Повний опис — у [документації](https://74cfe434-a2b3-4d49-8fa7-db7343e399dc.apps.platform365.online/components/table).
|
|
936
|
+
|
|
937
|
+
```vue
|
|
938
|
+
<script setup>
|
|
939
|
+
import {
|
|
940
|
+
SkyTableRoot, SkyTableHeader, SkyTableHead,
|
|
941
|
+
SkyTableBody, SkyTableRow, SkyTableCell,
|
|
942
|
+
} from '@skyservice-developers/vue-dev-kit'
|
|
943
|
+
|
|
944
|
+
const columns = [
|
|
945
|
+
{ name: 'name', title: 'Товар', widthFr: 2 },
|
|
946
|
+
{ name: 'price', title: 'Ціна', width: 90, align: 'right' },
|
|
947
|
+
]
|
|
948
|
+
</script>
|
|
949
|
+
|
|
950
|
+
<template>
|
|
951
|
+
<SkyTableRoot :columns="columns">
|
|
952
|
+
<SkyTableHeader>
|
|
953
|
+
<SkyTableHead v-for="c in columns" :key="c.name" :column="c" />
|
|
954
|
+
</SkyTableHeader>
|
|
955
|
+
<SkyTableBody>
|
|
956
|
+
<SkyTableRow v-for="row in rows" :key="row.id">
|
|
957
|
+
<SkyTableCell>{{ row.name }}</SkyTableCell>
|
|
958
|
+
<SkyTableCell align="right">{{ row.price }}</SkyTableCell>
|
|
959
|
+
</SkyTableRow>
|
|
960
|
+
</SkyTableBody>
|
|
961
|
+
</SkyTableRoot>
|
|
962
|
+
</template>
|
|
963
|
+
```
|
|
964
|
+
|
|
965
|
+
#### Що входить
|
|
966
|
+
|
|
967
|
+
| Шар | Експорти | Коли підключати |
|
|
968
|
+
|-----|----------|-----------------|
|
|
969
|
+
| Примітиви (`shared/ui/table`) | `SkyTableRoot`, `SkyTableHeader`, `SkyTableHead`, `SkyTableBody`, `SkyTableRow`, `SkyTableCell`, `SkyTableEmpty` | завжди |
|
|
970
|
+
| Композабли (`shared/lib/table`) | `useTableSort`, `useTableSelection`, `useColumnVisibility` | за потреби |
|
|
971
|
+
| Фічі (`features/table`) | `TableMassActions`, `TableColumnSettings`, `TableVirtualBody` | опційно, кожна окремо |
|
|
972
|
+
|
|
973
|
+
```ts
|
|
974
|
+
const { sort, toggle } = useTableSort({ initial: { of: 'name', ot: 'asc' } })
|
|
975
|
+
const { selected, isSelected, toggle: select, toggleAll } = useTableSelection(rows, { rowId: 'id' })
|
|
976
|
+
const { visibility, visibleColumns } = useColumnVisibility(columns, { storageKey: 'products' })
|
|
977
|
+
```
|
|
978
|
+
|
|
979
|
+
Композабли не сортують і не фільтрують дані — вони тримають стан, а дані лишаються за застосунком (зазвичай сортує сервер). Колонка вибору описується як звичайна колонка (`{ name: '_select', width: 44 }`), щоб грід шапки й рядків рахувався з одного джерела.
|
|
980
|
+
|
|
981
|
+
> `vue-virtual-scroller` імпортує лише `TableVirtualBody`. Не потрібна віртуалізація — беріть `SkyTableBody`, і залежність не знадобиться.
|
|
982
|
+
|
|
983
|
+
---
|
|
984
|
+
|
|
782
985
|
### SkyTable
|
|
783
986
|
|
|
784
987
|
Віртуал-скрол таблиця (на `vue-virtual-scroller`) для великих списків — у DOM тримаються лише видимі рядки. Розмітка й стилі 1:1 з таблицею товарів POS: чекбокси, масові дії, сортування, зміна ширини/видимості колонок, розкриття вкладених рядків (модифікацій), inline-редагування комірок і теги.
|
|
@@ -875,6 +1078,33 @@ const json = { items, total: items.length }
|
|
|
875
1078
|
|
|
876
1079
|
---
|
|
877
1080
|
|
|
1081
|
+
### FunctionalCalendar
|
|
1082
|
+
|
|
1083
|
+
Перенесено зі SkyMarket (`src/lib/functional-calendar`), стилі й розмітка 1:1. Форк [vue-functional-calendar](https://github.com/ManukMinasyan/vue-functional-calendar) під Vue 3 — пропси, події та слоти без змін відносно оригіналу.
|
|
1084
|
+
|
|
1085
|
+
```vue
|
|
1086
|
+
<FunctionalCalendar
|
|
1087
|
+
:value="calendarData"
|
|
1088
|
+
@input="calendarData = $event"
|
|
1089
|
+
is-date-range
|
|
1090
|
+
is-modal
|
|
1091
|
+
/>
|
|
1092
|
+
```
|
|
1093
|
+
|
|
1094
|
+
### SkyDateRangePicker
|
|
1095
|
+
|
|
1096
|
+
Перенесено зі SkyMarket (`DatePickerRange.vue`) — готовий попап-піка діапазону дат на базі `FunctionalCalendar`: іконка-тригер, лейбл періоду, пресети (Сьогодні / Вчора / Тиждень / Місяць / Минулий-Поточний місяць / За весь час), стилі 1:1. На відміну від оригіналу, який читав `store`/`@/langs` конкретного застосунку, тут стан і тексти (з UA-фолбеками) локальні.
|
|
1097
|
+
|
|
1098
|
+
```vue
|
|
1099
|
+
<SkyDateRangePicker v-model="range" @set-date="onPreset" />
|
|
1100
|
+
```
|
|
1101
|
+
|
|
1102
|
+
```js
|
|
1103
|
+
const range = reactive({ start: '', end: '' }) // { start, end } у форматі yyyy-mm-dd
|
|
1104
|
+
```
|
|
1105
|
+
|
|
1106
|
+
---
|
|
1107
|
+
|
|
878
1108
|
## Features
|
|
879
1109
|
|
|
880
1110
|
### SkyCheckboxFilter
|
|
@@ -1008,6 +1238,23 @@ npm run playground
|
|
|
1008
1238
|
npm run build
|
|
1009
1239
|
```
|
|
1010
1240
|
|
|
1241
|
+
## Реліз
|
|
1242
|
+
|
|
1243
|
+
Публікація на npm автоматична — пуш у `main` запускає GitHub Action
|
|
1244
|
+
`Publish to npm`, який збирає й публікує пакет. Руками `npm publish` не запускати.
|
|
1245
|
+
|
|
1246
|
+
| Що треба | Що зробити |
|
|
1247
|
+
| --- | --- |
|
|
1248
|
+
| Випустити нову версію | Бампнути `version` у `package.json` → змержити в `main` |
|
|
1249
|
+
| Залити зміни без релізу | Не чіпати `version` — публікація пропуститься, CI лишиться зеленим |
|
|
1250
|
+
| Опублікувати вручну | Actions → Publish to npm → Run workflow |
|
|
1251
|
+
|
|
1252
|
+
Публікація пропускається, якщо версія з `package.json` уже є в реєстрі. Пуші, що
|
|
1253
|
+
зачіпають лише `**.md` або `.github/**`, воркфлоу не запускають — для них
|
|
1254
|
+
є ручний запуск.
|
|
1255
|
+
|
|
1256
|
+
Поки версію не бампнули, споживачі змін не бачать: npm далі віддає попередню.
|
|
1257
|
+
|
|
1011
1258
|
## Структура проекту
|
|
1012
1259
|
|
|
1013
1260
|
Організовано за Feature-Sliced Design:
|
|
@@ -1028,18 +1275,26 @@ src/
|
|
|
1028
1275
|
│ ├── BaseTeleport/
|
|
1029
1276
|
│ ├── SkyButton/
|
|
1030
1277
|
│ ├── SkySelect/ SkySelectSearch/ SkyInput/ SkySearchInput/ SkyCheckbox/
|
|
1278
|
+
│ ├── SkyTabs/ # сегментовані таби з анімованим індикатором
|
|
1031
1279
|
│ ├── SkyAlert/
|
|
1032
1280
|
│ ├── SkyBadge/
|
|
1033
1281
|
│ ├── SkyCard/ SkyCardHeader/ SkyCardRow/
|
|
1034
1282
|
│ ├── SkyLoader/
|
|
1035
|
-
│ ├──
|
|
1283
|
+
│ ├── table/ # примітиви композиційної таблиці (Root/Header/Head/Body/Row/Cell/Empty)
|
|
1284
|
+
│ ├── SkyTable/ # готова віртуал-скрол таблиця (Header/Row/Footer/DynamicScroller/items/*)
|
|
1036
1285
|
│ ├── SkyTileCard/
|
|
1286
|
+
│ ├── functional-calendar/ # форк vue-functional-calendar, перенесений зі SkyMarket 1:1
|
|
1287
|
+
│ ├── SkyDateRangePicker/ # DatePickerRange зі SkyMarket, store/langs → props/локальний стан
|
|
1037
1288
|
│ └── <Component>/
|
|
1038
1289
|
│ ├── <Component>.vue
|
|
1039
1290
|
│ └── index.ts
|
|
1291
|
+
│ └── lib/
|
|
1292
|
+
│ └── table/ # skyTableFeatures + useTableSort / useTableSelection / useColumnVisibility
|
|
1040
1293
|
├── features/ # фічові блоки (orchestration shared/ui)
|
|
1041
1294
|
│ ├── index.ts
|
|
1042
|
-
│
|
|
1295
|
+
│ ├── SkyCheckboxFilter/
|
|
1296
|
+
│ ├── table/ # TableMassActions / TableColumnSettings / TableVirtualBody
|
|
1297
|
+
│ └── data-table/ # SkyDataTable на TanStack v9 + перемикач колонок
|
|
1043
1298
|
├── sdk/ # TypeScript SDK (без Vue залежностей)
|
|
1044
1299
|
│ ├── bridge.ts # iframe postMessage API
|
|
1045
1300
|
│ ├── api.ts # SkyserviceAPI HTTP клієнт
|