plugin-ui-for-kzt 0.0.23 → 0.0.27

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.
Files changed (93) hide show
  1. package/dist/assets/0e28e37419c99ac65b12.png +0 -0
  2. package/dist/assets/264165b2b0e8a6840eb0.png +0 -0
  3. package/dist/components/BaseBadge/BaseBadge.vue.d.ts +2 -2
  4. package/dist/components/BaseButton/BaseButton.vue.d.ts +1 -1
  5. package/dist/components/BaseCalendar/BaseCalendar.vue.d.ts +10 -1
  6. package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +2 -2
  7. package/dist/components/{DataTable/DataTable.vue.d.ts → BaseDefaultPages/BaseDefaultPages.vue.d.ts} +8 -6
  8. package/dist/components/BaseDropdown/BaseDropdown.vue.d.ts +1 -1
  9. package/dist/components/BaseInput/BaseInput.vue.d.ts +4 -4
  10. package/dist/components/BaseInputCalendar/BaseInputCalendar.vue.d.ts +11 -4
  11. package/dist/components/BaseInputCurrency/BaseInputCurrency.vue.d.ts +3 -3
  12. package/dist/components/BaseInputEmail/BaseInputEmail.vue.d.ts +2 -2
  13. package/dist/components/BaseInputPhone/BaseInputPhone.vue.d.ts +2 -2
  14. package/dist/components/{Tooltip/Tooltip.vue.d.ts → BasePageLoader/BasePageLoader.vue.d.ts} +24 -11
  15. package/dist/components/BasePagination/BasePagination.vue.d.ts +1 -1
  16. package/dist/components/BaseRadio/BaseRadio.vue.d.ts +2 -2
  17. package/dist/components/BaseSegmentedButtons/BaseSegmentedButtons.vue.d.ts +1 -1
  18. package/dist/components/BaseSelect/BaseSelect.vue.d.ts +2 -2
  19. package/dist/components/BaseTable/BaseTable.vue.d.ts +44 -0
  20. package/dist/components/BaseTag/BaseTag.vue.d.ts +1 -1
  21. package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +2 -2
  22. package/dist/components/BaseToast/BaseToast.vue.d.ts +69 -0
  23. package/dist/components/BaseToggle/BaseToggle.vue.d.ts +2 -2
  24. package/dist/composables/useToast.d.ts +2 -0
  25. package/dist/index.d.ts +6 -5
  26. package/dist/index.js +1 -1
  27. package/dist/plugins/toastPlugin.d.ts +4 -0
  28. package/dist/sprite.svg +1 -1
  29. package/dist/store/toast.d.ts +8 -0
  30. package/example/App.vue +12 -38
  31. package/package.json +1 -1
  32. package/src/assets/404.png +0 -0
  33. package/src/assets/icons/arrow-down-stick.svg +4 -0
  34. package/src/assets/icons/edit-table.svg +5 -0
  35. package/src/assets/icons/ellipsis.svg +5 -0
  36. package/src/assets/icons/loading-page-default.svg +4 -0
  37. package/src/assets/icons/loading-page-error.svg +6 -0
  38. package/src/assets/icons/loading-page-success.svg +5 -0
  39. package/src/assets/icons/loading-page-warning.svg +6 -0
  40. package/src/assets/icons/more-dots.svg +5 -0
  41. package/src/assets/icons/time-table.svg +7 -0
  42. package/src/assets/icons/toast-error.svg +3 -0
  43. package/src/assets/icons/toast-info.svg +3 -0
  44. package/src/assets/icons/toast-success.svg +3 -0
  45. package/src/assets/icons/toast-warning.svg +3 -0
  46. package/src/assets/icons/trash-table.svg +7 -0
  47. package/src/assets/tech-work.png +0 -0
  48. package/src/components/BaseCalendar/BaseCalendar.vue +2 -0
  49. package/src/components/BaseChips/BaseChips.vue +3 -1
  50. package/src/components/BaseDefaultPages/BaseDefaultPages.vue +140 -0
  51. package/src/components/BaseDefaultPages/README.md +128 -0
  52. package/src/components/BaseOpenedListItem/BaseOpenedListItem.vue +3 -3
  53. package/src/components/BasePageLoader/BasePageLoader.vue +211 -0
  54. package/src/components/BasePageLoader/README.md +80 -0
  55. package/src/components/BaseSelect/BaseSelect.vue +8 -3
  56. package/src/components/BaseTable/BaseTable.vue +411 -0
  57. package/src/components/BaseTable/README.md +294 -0
  58. package/src/components/BaseToast/BaseToast.vue +200 -0
  59. package/src/components/BaseToast/README.md +103 -0
  60. package/src/components/BaseTooltip/BaseTooltip.vue +1 -0
  61. package/src/components/BaseUpload/BaseUpload.vue +1 -1
  62. package/src/composables/useToast.ts +10 -0
  63. package/src/index.ts +17 -13
  64. package/src/plugins/toastPlugin.ts +100 -0
  65. package/src/store/toast.ts +59 -0
  66. package/src/styles/root.scss +2 -0
  67. package/src/styles/toast.scss +36 -0
  68. package/src/types/calendar.d.ts +1 -0
  69. package/src/types/default-pages.d.ts +6 -0
  70. package/src/types/loading-page.d.ts +12 -0
  71. package/src/types/pagination.d.ts +1 -0
  72. package/src/types/table.d.ts +33 -0
  73. package/src/types/toast.d.ts +25 -0
  74. package/webpack.config.js +12 -0
  75. package/dist/components/Spinner/Spinner.vue.d.ts +0 -20
  76. package/dist/components/Toaster/Toaster.vue.d.ts +0 -80
  77. package/dist/components/Toaster/timer.d.ts +0 -12
  78. package/dist/plugins/toasterPlugin.d.ts +0 -26
  79. package/src/components/DataTable/DataTable.vue +0 -169
  80. package/src/components/DataTable/README.md +0 -57
  81. package/src/components/Spinner/README.md +0 -35
  82. package/src/components/Spinner/Spinner.vue +0 -60
  83. package/src/components/Toaster/README.md +0 -70
  84. package/src/components/Toaster/Toaster.vue +0 -235
  85. package/src/components/Toaster/timer.ts +0 -45
  86. package/src/components/Tooltip/README.md +0 -37
  87. package/src/components/Tooltip/Tooltip.vue +0 -96
  88. package/src/components/icons/CloseIcon.vue +0 -5
  89. package/src/components/icons/ErrorIcon.vue +0 -7
  90. package/src/components/icons/InfoIcon.vue +0 -7
  91. package/src/components/icons/SuccessIcon.vue +0 -6
  92. package/src/components/icons/WarningIcon.vue +0 -7
  93. package/src/plugins/toasterPlugin.ts +0 -179
@@ -0,0 +1,411 @@
1
+ <template>
2
+ <div class="base-table">
3
+ <div class="base-table__wrapper">
4
+ <table class="base-table__table">
5
+ <thead v-if="hasHeader">
6
+ <slot name="header">
7
+ <tr class="base-table__header">
8
+ <!-- Чек‑бокс «Выбрать всё» -->
9
+ <th v-if="showRowSelection" class="base-table__header-column">
10
+ <span v-if="checkboxTitle">{{ checkboxTitle }}</span>
11
+ <BaseCheckbox id="selectAll" size="small" v-model="isAllSelected" />
12
+ </th>
13
+
14
+ <!-- Обычные колонки -->
15
+ <th v-for="col in columns"
16
+ :key="String(col.key)"
17
+ class="base-table__header-column"
18
+ @click="onHeaderClick(col)"
19
+ :title="col.tooltip"
20
+ >
21
+ <div class="column-header">
22
+ <component
23
+ v-if="col.icons?.[0]"
24
+ :is="col.icons[0]"
25
+ class="header-icon"
26
+ />
27
+ <span v-if="col.label">{{ col.label }}</span>
28
+ <component
29
+ v-if="col.icons?.[1]"
30
+ :is="col.icons[1]"
31
+ class="header-icon"
32
+ />
33
+ <BaseIcon
34
+ v-if="col.sortable"
35
+ name="arrow-up"
36
+ size="extra-small"
37
+ class="base-table__sort-icon"
38
+ :class="{ '--active': sortOrder === 'desc' && sortKey === col.key }"
39
+ />
40
+ </div>
41
+ </th>
42
+
43
+ <!-- Колонка‑действий -->
44
+ <th v-if="showActions" class="base-table__cell base-table__header-column base-table__actions-column"></th>
45
+ </tr>
46
+ </slot>
47
+ </thead>
48
+ <transition-group tag="tbody"
49
+ name="row"
50
+ class="base-table__tbody"
51
+ appear
52
+ >
53
+ <!-- Список строк -->
54
+ <template v-if="paginatedData.length">
55
+ <tr
56
+ v-for="(row, rowIndex) in paginatedData"
57
+ :key="rowId(row)"
58
+ :class="{ '--is-disabled': row.disabled }"
59
+ class="base-table__row"
60
+ >
61
+
62
+ <!-- Чек‑бокс отдельной строки -->
63
+ <td v-if="showRowSelection" class="base-table__cell">
64
+ <BaseCheckbox
65
+ :id="row.id"
66
+ size="small"
67
+ :modelValue="isRowSelected(row)"
68
+ :disabled="row.disabled"
69
+ @update:modelValue="toggleRow(row)"
70
+ />
71
+ </td>
72
+
73
+ <!-- Ячейки -->
74
+ <td v-for="col in columns"
75
+ :key="String(col.key)"
76
+ class="base-table__cell">
77
+ <!-- Пользовательский рендеринг ячейки -->
78
+ <slot
79
+ :name="`cell-${String(col.key)}`"
80
+ :row="row"
81
+ :value="row[col.key]"
82
+ >
83
+ {{ row[col.key] }}
84
+ </slot>
85
+ </td>
86
+
87
+ <!-- Колонка‑действий -->
88
+ <td v-if="showActions" class="base-table__cell base-table__actions-column">
89
+ <slot name="actions" :row="row">
90
+ <BaseButton
91
+ v-for="action in actions"
92
+ :key="action.key"
93
+ :disabled="row.disabled"
94
+ size="extra-small"
95
+ color="quaternary-gray"
96
+ @click="action.handler(row)"
97
+ >
98
+ <BaseIcon :name="action.icon" size="extra-small" />
99
+ </BaseButton>
100
+ </slot>
101
+ </td>
102
+
103
+ <td v-if="$slots['row-menu']" class="base-table__cell base-table__menu-column">
104
+ <slot name="row-menu" :row="row"></slot>
105
+ </td>
106
+ </tr>
107
+ </template>
108
+
109
+ <!-- Пустой набор данных -->
110
+ <tr v-else>
111
+ <td :colspan="colspan" class="base-table__empty">
112
+ <slot name="empty">
113
+ <div>
114
+ Нет данных
115
+ </div>
116
+ </slot>
117
+ </td>
118
+ </tr>
119
+ </transition-group>
120
+
121
+ </table>
122
+
123
+ <div v-if="showPagination" class="base-table__footer">
124
+ <BasePagination
125
+ :totalPages="totalPages"
126
+ :currentPage="currentPage"
127
+ size="small"
128
+ v-bind="pagination"
129
+ @update:currentPage="onPageChange"
130
+ />
131
+ </div>
132
+ </div>
133
+ </div>
134
+ </template>
135
+
136
+ <script setup lang="ts">
137
+ import { ref, computed, watch, defineProps, defineEmits, useSlots } from 'vue'
138
+ import BasePagination from '../BasePagination/BasePagination.vue'
139
+ import BaseCheckbox from '../BaseCheckbox/BaseCheckbox.vue'
140
+ import BaseButton from '../BaseButton/BaseButton.vue'
141
+ import BaseIcon from '../BaseIcon/BaseIcon.vue'
142
+ import type {
143
+ Row,
144
+ Column,
145
+ BaseTableProps,
146
+ } from '../../types/table'
147
+ import type { TPaginationProps } from '../../types/pagination'
148
+
149
+ const props = defineProps<BaseTableProps>()
150
+ const emit = defineEmits<{
151
+ (e: 'update:selected', rows: Row[]): void
152
+ (e: 'select-all', selected: boolean): void
153
+ (e: 'sort-change', payload: { key: string; order: 'asc' | 'desc' }): void
154
+ (e: 'page-change', page: number): void
155
+ }>()
156
+
157
+ const colspan = computed(() => {
158
+ const base = props.columns.length
159
+ const extra =
160
+ (props.showRowSelection ? 1 : 0) +
161
+ (props.showActions ? 1 : 0) +
162
+ (useSlots()['row-menu'] ? 1 : 0)
163
+ return base + extra
164
+ })
165
+
166
+ const hasHeader = computed(() => props.columns.length > 0 || !!useSlots().header)
167
+
168
+ /* ---------- Утилиты ---------- */
169
+ function rowId(row: Row): unknown {
170
+ if (props.rowKey) {
171
+ return typeof props.rowKey === 'function'
172
+ ? (props.rowKey as (r: Row) => unknown)(row)
173
+ : (row as any)[props.rowKey]
174
+ }
175
+
176
+ return (row as any).__uid ?? JSON.stringify(row)
177
+ }
178
+
179
+ /* ---------- СОРТИРОВКА ---------- */
180
+ const sortKey = ref<string | null>(null)
181
+ const sortOrder = ref<'asc' | 'desc'>('asc')
182
+
183
+ function onHeaderClick(col: Column) {
184
+ if (!col.sortable) return
185
+
186
+ if (sortKey.value === col.key) {
187
+ sortOrder.value = sortOrder.value === 'desc' ? 'asc' : 'desc'
188
+ } else {
189
+ sortKey.value = col.key
190
+ sortOrder.value = 'desc'
191
+ }
192
+
193
+ emit('sort-change', { key: col.key, order: sortOrder.value })
194
+ }
195
+
196
+ /* ---------- ПАГИНАЦИЯ ---------- */
197
+ const pagination = computed<TPaginationProps>(() => props.pagination ?? { perPage: 10 })
198
+ const perPage = computed(() => pagination.value.totalPages ?? 10)
199
+
200
+ const totalPages = computed(() => {
201
+ if (!props.pagination) return 1
202
+ return Math.max(1, Math.ceil(props.data.length / perPage.value))
203
+ })
204
+
205
+ const showPagination = computed(() => totalPages.value > 1)
206
+
207
+ const currentPage = ref(pagination.value.currentPage ?? 1)
208
+
209
+ function onPageChange(page: number) {
210
+ currentPage.value = page
211
+ emit('page-change', page)
212
+ }
213
+
214
+ const paginatedData = computed(() => {
215
+ const start = (currentPage.value - 1) * perPage.value
216
+ const end = start + perPage.value
217
+ return props.data.slice(start, end)
218
+ })
219
+
220
+ /* ---------- ВЫБОР СТРОК (чек‑боксы) ---------- */
221
+ const selectedIds = ref<Set<unknown>>(new Set())
222
+
223
+ function isRowSelected(row: Row): boolean {
224
+ return selectedIds.value.has(rowId(row))
225
+ }
226
+
227
+ function toggleRow(row: Row) {
228
+ const id = rowId(row)
229
+ if (selectedIds.value.has(id)) selectedIds.value.delete(id)
230
+ else selectedIds.value.add(id)
231
+ emitSelected()
232
+ }
233
+
234
+ /* computed‑getter/setter «Выбрать всё» */
235
+ const isAllSelected = computed<boolean>({
236
+ get: () => {
237
+ if (!props.showRowSelection) return false
238
+ return props.data.length > 0 && props.data.every((r: Row) => selectedIds.value.has(rowId(r)))
239
+ },
240
+ set: (val: boolean) => {
241
+ if (!props.showRowSelection) return
242
+ if (val) props.data.forEach((r: Row) => selectedIds.value.add(rowId(r)))
243
+ else selectedIds.value.clear()
244
+ emitSelected()
245
+ },
246
+ })
247
+
248
+ /** Эмитим массив выбранных строк */
249
+ function emitSelected() {
250
+ const rows = props.data.filter((r: Row) => selectedIds.value.has(rowId(r)))
251
+ emit('update:selected', rows)
252
+ }
253
+
254
+ /* Синхронзация при изменении props.data */
255
+ watch(
256
+ () => props.data,
257
+ () => {
258
+ const newIds = new Set(props.data.map(rowId))
259
+ selectedIds.value.forEach(id => {
260
+ if (!newIds.has(id)) selectedIds.value.delete(id)
261
+ })
262
+ },
263
+ { deep: true }
264
+ )
265
+
266
+ /* ---------- Подтаблица (expand / collapse) ---------- */
267
+ const expandedRows = ref<Set<number>>(new Set())
268
+ function toggleSubRow(idx: number) {
269
+ if (expandedRows.value.has(idx)) expandedRows.value.delete(idx)
270
+ else expandedRows.value.add(idx)
271
+ }
272
+ </script>
273
+
274
+ <style scoped lang="scss">
275
+ @import '@/styles/variables';
276
+ @import '@/styles/root';
277
+
278
+ .base-table {
279
+ width: 100%;
280
+
281
+ &__wrapper {
282
+ display: flex;
283
+ flex-direction: column;
284
+ border: 1px solid var(--primary-black-200);
285
+ border-radius: var(--corner-radius-m);
286
+ background: var(--bg-light);
287
+ overflow: hidden;
288
+ }
289
+
290
+ &__table {
291
+ width: 100%;
292
+ border-collapse: collapse;
293
+ table-layout: fixed;
294
+ }
295
+
296
+ &__header-column,
297
+ &__cell {
298
+ text-align: left;
299
+ vertical-align: middle;
300
+ }
301
+
302
+ &__header {
303
+ width: 100%;
304
+ background: var(--primary-black-50);
305
+ border: 1px solid var(--primary-black-200);
306
+ color: var(--primary-black-600);
307
+ font: var(--typography-text-s-medium);
308
+ }
309
+
310
+ &__cell {
311
+ padding: var(--spacing-l) var(--spacing-xl);
312
+ }
313
+
314
+ &__cell:nth-child(odd) {
315
+ color: var(--primary-black-600);
316
+ }
317
+
318
+ &__cell:nth-child(even) {
319
+ color: var(--primary-text-primary);
320
+ }
321
+
322
+ &__header-column {
323
+ padding: var(--spacing-m) var(--spacing-xl);
324
+ user-select: none;
325
+ }
326
+
327
+ &__empty {
328
+ text-align: center;
329
+ font: var(--typography-text-xl-medium);
330
+ padding: var(--spacing-m);
331
+ width: 100%;
332
+ }
333
+
334
+ .column-header {
335
+ display: flex;
336
+ align-items: center;
337
+ gap: 4px;
338
+ cursor: pointer;
339
+ }
340
+
341
+ &__sort-icon {
342
+ color: var(--primary-black-600);
343
+ transition: transform 0.2s;
344
+ }
345
+
346
+ &__sort-icon.--active {
347
+ transform: rotate(180deg);
348
+ }
349
+
350
+ &__actions-column,
351
+ &__menu-column {
352
+ width: auto;
353
+ text-align: right;
354
+ }
355
+
356
+ &__footer {
357
+ padding: 20px;
358
+ display: flex;
359
+ justify-content: center;
360
+ background: var(--bg-light);
361
+ }
362
+
363
+ &__row {
364
+ border-bottom: 1px solid var(--primary-black-100);
365
+
366
+ &:hover {
367
+ background: var(--primary-black-100);
368
+ }
369
+
370
+ &.--is-disabled {
371
+ cursor: not-allowed;
372
+ background: var(--primary-black-50);
373
+ }
374
+ }
375
+ }
376
+
377
+ .row-enter-active,
378
+ .row-leave-active {
379
+ transition: opacity 0.3s ease, transform 0.3s ease;
380
+ }
381
+
382
+ .row-enter-from {
383
+ opacity: 0;
384
+ transform: translateY(12px);
385
+ }
386
+ .row-enter-to {
387
+ opacity: 1;
388
+ transform: translateY(0);
389
+ }
390
+
391
+ .row-leave-from {
392
+ opacity: 1;
393
+ transform: translateY(0);
394
+ }
395
+ .row-leave-to {
396
+ opacity: 0;
397
+ transform: translateY(-12px);
398
+ }
399
+
400
+ .row-leave-active {
401
+ position: absolute;
402
+ width: 100%;
403
+ left: 0;
404
+ top: -250px;
405
+ opacity: 0;
406
+ }
407
+
408
+ .base-table__tbody {
409
+ position: relative;
410
+ }
411
+ </style>