@uzum-tech/ui 2.0.8 → 2.1.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.
Files changed (83) hide show
  1. package/dist/index.js +1787 -467
  2. package/dist/index.mjs +1782 -468
  3. package/dist/index.prod.js +2 -2
  4. package/dist/index.prod.mjs +2 -2
  5. package/es/carousel/src/Carousel.d.ts +1 -1
  6. package/es/components.d.ts +655 -5
  7. package/es/components.mjs +5 -0
  8. package/es/config-provider/src/internal-interface.d.ts +3 -1
  9. package/es/data-table/src/DataTable.d.ts +1 -1
  10. package/es/descriptions/src/Descriptions.d.ts +1 -1
  11. package/es/kanban/index.d.ts +7 -0
  12. package/es/kanban/index.mjs +5 -0
  13. package/es/kanban/src/Kanban.d.ts +570 -0
  14. package/es/kanban/src/Kanban.mjs +349 -0
  15. package/es/kanban/src/KanbanCard.d.ts +39 -0
  16. package/es/kanban/src/KanbanCard.mjs +86 -0
  17. package/es/kanban/src/KanbanColumn.d.ts +45 -0
  18. package/es/kanban/src/KanbanColumn.mjs +176 -0
  19. package/es/kanban/src/injection.d.ts +28 -0
  20. package/es/kanban/src/injection.mjs +2 -0
  21. package/es/kanban/src/interface.d.ts +215 -0
  22. package/es/kanban/src/interface.mjs +84 -0
  23. package/es/kanban/src/styles/index.cssr.d.ts +2 -0
  24. package/es/kanban/src/styles/index.cssr.mjs +165 -0
  25. package/es/kanban/src/use-kanban-data.d.ts +4 -0
  26. package/es/kanban/src/use-kanban-data.mjs +69 -0
  27. package/es/kanban/src/use-kanban-drag.d.ts +2 -0
  28. package/es/kanban/src/use-kanban-drag.mjs +238 -0
  29. package/es/kanban/styles/dark.d.ts +73 -0
  30. package/es/kanban/styles/dark.mjs +15 -0
  31. package/es/kanban/styles/index.d.ts +3 -0
  32. package/es/kanban/styles/index.mjs +2 -0
  33. package/es/kanban/styles/light.d.ts +109 -0
  34. package/es/kanban/styles/light.mjs +64 -0
  35. package/es/modal/src/BodyWrapper.d.ts +1 -1
  36. package/es/themes/dark.mjs +2 -0
  37. package/es/themes/light.mjs +2 -0
  38. package/es/tree/src/Tree.d.ts +1 -1
  39. package/es/tree/src/TreeNode.d.ts +1 -1
  40. package/es/tree/src/TreeNode.mjs +2 -1
  41. package/es/version.d.ts +1 -1
  42. package/es/version.mjs +1 -1
  43. package/lib/carousel/src/Carousel.d.ts +1 -1
  44. package/lib/components.d.ts +655 -5
  45. package/lib/components.js +13 -5
  46. package/lib/config-provider/src/internal-interface.d.ts +3 -1
  47. package/lib/data-table/src/DataTable.d.ts +1 -1
  48. package/lib/descriptions/src/Descriptions.d.ts +1 -1
  49. package/lib/kanban/index.d.ts +7 -0
  50. package/lib/kanban/index.js +17 -0
  51. package/lib/kanban/src/Kanban.d.ts +570 -0
  52. package/lib/kanban/src/Kanban.js +291 -0
  53. package/lib/kanban/src/KanbanCard.d.ts +39 -0
  54. package/lib/kanban/src/KanbanCard.js +63 -0
  55. package/lib/kanban/src/KanbanColumn.d.ts +45 -0
  56. package/lib/kanban/src/KanbanColumn.js +141 -0
  57. package/lib/kanban/src/injection.d.ts +28 -0
  58. package/lib/kanban/src/injection.js +5 -0
  59. package/lib/kanban/src/interface.d.ts +215 -0
  60. package/lib/kanban/src/interface.js +87 -0
  61. package/lib/kanban/src/styles/index.cssr.d.ts +2 -0
  62. package/lib/kanban/src/styles/index.cssr.js +170 -0
  63. package/lib/kanban/src/use-kanban-data.d.ts +4 -0
  64. package/lib/kanban/src/use-kanban-data.js +70 -0
  65. package/lib/kanban/src/use-kanban-drag.d.ts +2 -0
  66. package/lib/kanban/src/use-kanban-drag.js +220 -0
  67. package/lib/kanban/styles/dark.d.ts +73 -0
  68. package/lib/kanban/styles/dark.js +17 -0
  69. package/lib/kanban/styles/index.d.ts +3 -0
  70. package/lib/kanban/styles/index.js +10 -0
  71. package/lib/kanban/styles/light.d.ts +109 -0
  72. package/lib/kanban/styles/light.js +54 -0
  73. package/lib/modal/src/BodyWrapper.d.ts +1 -1
  74. package/lib/themes/dark.js +98 -96
  75. package/lib/themes/light.js +96 -94
  76. package/lib/tree/src/Tree.d.ts +1 -1
  77. package/lib/tree/src/TreeNode.d.ts +1 -1
  78. package/lib/tree/src/TreeNode.js +2 -1
  79. package/lib/version.d.ts +1 -1
  80. package/lib/version.js +1 -1
  81. package/package.json +1 -1
  82. package/volar.d.ts +3 -0
  83. package/web-types.json +171 -1
@@ -0,0 +1,349 @@
1
+ import { computed, defineComponent, h, provide, ref, watch } from 'vue';
2
+ import { useConfig, useTheme, useThemeClass } from "../../_mixins/index.mjs";
3
+ import { UEmpty } from "../../empty/index.mjs";
4
+ import { kanbanLight } from "../styles/index.mjs";
5
+ import { kanbanInjectionKey } from "./injection.mjs";
6
+ import { kanbanProps } from "./interface.mjs";
7
+ import UKanbanColumn from "./KanbanColumn.mjs";
8
+ import style from "./styles/index.cssr.mjs";
9
+ import { groupItemsByColumn, moveItem } from "./use-kanban-data.mjs";
10
+ import { useKanbanDrag } from "./use-kanban-drag.mjs";
11
+ export default defineComponent({
12
+ name: 'Kanban',
13
+ props: Object.assign(Object.assign({}, useTheme.props), kanbanProps),
14
+ emits: ['update:data', 'move', 'columns-reorder', 'drag-start', 'drag-end', 'item-click', 'column-scroll-top', 'column-scroll-bottom', 'scroll-top', 'scroll-bottom'],
15
+ setup(props, {
16
+ emit,
17
+ expose
18
+ }) {
19
+ const {
20
+ mergedClsPrefixRef,
21
+ inlineThemeDisabled
22
+ } = useConfig(props);
23
+ const themeRef = useTheme('Kanban', '-kanban', style, kanbanLight, props, mergedClsPrefixRef);
24
+ const selfElRef = ref(null);
25
+ const uncontrolledDataRef = ref(props.data);
26
+ const uncontrolledColumnsRef = ref(props.columns);
27
+ const mergedDataRef = computed(() => uncontrolledDataRef.value);
28
+ const mergedColumnsRef = computed(() => uncontrolledColumnsRef.value);
29
+ const columnFieldRef = computed(() => props.columnField);
30
+ const orientationRef = computed(() => props.orientation);
31
+ const allowDropRef = computed(() => props.allowDrop);
32
+ const cssVarsRef = computed(() => {
33
+ const {
34
+ common: {
35
+ cubicBezierEaseInOut
36
+ },
37
+ self: {
38
+ columnWidth,
39
+ columnGap,
40
+ cardGap,
41
+ boardPadding,
42
+ columnHeaderPadding,
43
+ columnBodyPadding,
44
+ columnBackgroundColor,
45
+ columnBorderRadius,
46
+ columnHeaderColor,
47
+ countBackgroundColor,
48
+ countTextColor,
49
+ statusSuccessHeaderColor,
50
+ statusSuccessCountColor,
51
+ statusProgressHeaderColor,
52
+ statusProgressCountColor,
53
+ statusPendingHeaderColor,
54
+ statusPendingCountColor,
55
+ statusErrorHeaderColor,
56
+ statusErrorCountColor,
57
+ columnDraggingOpacity,
58
+ cardBackgroundColor,
59
+ cardBackgroundColorDragging,
60
+ cardBorderColorDragging,
61
+ cardBorderRadius,
62
+ cardPadding,
63
+ cardColor,
64
+ cardSubColor,
65
+ cardBoxShadow,
66
+ cardBoxShadowHover,
67
+ cardBoxShadowDragging,
68
+ dropIndicatorColor,
69
+ maxReachedColor
70
+ }
71
+ } = themeRef.value;
72
+ return {
73
+ '--u-bezier': cubicBezierEaseInOut,
74
+ '--u-column-width': columnWidth,
75
+ '--u-column-gap': columnGap,
76
+ '--u-card-gap': cardGap,
77
+ '--u-board-padding': boardPadding,
78
+ '--u-column-header-padding': columnHeaderPadding,
79
+ '--u-column-body-padding': columnBodyPadding,
80
+ '--u-column-background-color': columnBackgroundColor,
81
+ '--u-column-border-radius': columnBorderRadius,
82
+ '--u-column-header-color': columnHeaderColor,
83
+ '--u-count-background-color': countBackgroundColor,
84
+ '--u-count-text-color': countTextColor,
85
+ '--u-status-success-header-color': statusSuccessHeaderColor,
86
+ '--u-status-success-count-color': statusSuccessCountColor,
87
+ '--u-status-progress-header-color': statusProgressHeaderColor,
88
+ '--u-status-progress-count-color': statusProgressCountColor,
89
+ '--u-status-pending-header-color': statusPendingHeaderColor,
90
+ '--u-status-pending-count-color': statusPendingCountColor,
91
+ '--u-status-error-header-color': statusErrorHeaderColor,
92
+ '--u-status-error-count-color': statusErrorCountColor,
93
+ '--u-column-dragging-opacity': columnDraggingOpacity,
94
+ '--u-card-background-color': cardBackgroundColor,
95
+ '--u-card-background-color-dragging': cardBackgroundColorDragging,
96
+ '--u-card-border-color-dragging': cardBorderColorDragging,
97
+ '--u-card-border-radius': cardBorderRadius,
98
+ '--u-card-padding': cardPadding,
99
+ '--u-card-color': cardColor,
100
+ '--u-card-sub-color': cardSubColor,
101
+ '--u-card-box-shadow': cardBoxShadow,
102
+ '--u-card-box-shadow-hover': cardBoxShadowHover,
103
+ '--u-card-box-shadow-dragging': cardBoxShadowDragging,
104
+ '--u-drop-indicator-color': dropIndicatorColor,
105
+ '--u-max-reached-color': maxReachedColor
106
+ };
107
+ });
108
+ const drag = useKanbanDrag({
109
+ dataRef: mergedDataRef,
110
+ columnsRef: mergedColumnsRef,
111
+ columnFieldRef,
112
+ orientationRef,
113
+ getItemKey,
114
+ isItemDraggable,
115
+ isColumnDraggable,
116
+ allowDropRef,
117
+ emitUpdateData: doUpdateData,
118
+ emitMove,
119
+ emitColumnsReorder,
120
+ emitDragStart,
121
+ emitDragEnd
122
+ });
123
+ const themeClassHandle = inlineThemeDisabled ? useThemeClass('kanban', undefined, cssVarsRef, props) : undefined;
124
+ const handleItemClick = (item, column) => {
125
+ var _a;
126
+ (_a = props.onItemClick) === null || _a === void 0 ? void 0 : _a.call(props, item, column);
127
+ emit('item-click', item, column);
128
+ };
129
+ const buildScrollContext = (target, column) => ({
130
+ column,
131
+ scrollTop: target.scrollTop,
132
+ scrollHeight: target.scrollHeight,
133
+ clientHeight: target.clientHeight
134
+ });
135
+ const handleColumnScroll = (column, target) => {
136
+ var _a, _b;
137
+ const {
138
+ scrollTop,
139
+ scrollHeight,
140
+ clientHeight
141
+ } = target;
142
+ const threshold = props.scrollThreshold;
143
+ const ctx = buildScrollContext(target, column.key);
144
+ if (scrollTop <= threshold) {
145
+ (_a = props.onColumnScrollTop) === null || _a === void 0 ? void 0 : _a.call(props, ctx);
146
+ emit('column-scroll-top', ctx);
147
+ }
148
+ if (scrollHeight - scrollTop - clientHeight <= threshold) {
149
+ (_b = props.onColumnScrollBottom) === null || _b === void 0 ? void 0 : _b.call(props, ctx);
150
+ emit('column-scroll-bottom', ctx);
151
+ }
152
+ };
153
+ const handleBoardScroll = event => {
154
+ var _a, _b;
155
+ const target = event.target;
156
+ const {
157
+ scrollTop,
158
+ scrollHeight,
159
+ clientHeight
160
+ } = target;
161
+ const threshold = props.scrollThreshold;
162
+ const ctx = buildScrollContext(target);
163
+ if (scrollTop <= threshold) {
164
+ (_a = props.onScrollTop) === null || _a === void 0 ? void 0 : _a.call(props, ctx);
165
+ emit('scroll-top', ctx);
166
+ }
167
+ if (scrollHeight - scrollTop - clientHeight <= threshold) {
168
+ (_b = props.onScrollBottom) === null || _b === void 0 ? void 0 : _b.call(props, ctx);
169
+ emit('scroll-bottom', ctx);
170
+ }
171
+ };
172
+ const findColumnEl = columnKey => {
173
+ if (!selfElRef.value) {
174
+ return null;
175
+ }
176
+ return selfElRef.value.querySelector(`[data-kanban-column-key="${String(columnKey)}"]`);
177
+ };
178
+ const exposed = {
179
+ moveItem(key, to) {
180
+ var _a;
181
+ const result = moveItem(mergedDataRef.value, getItemKey, columnFieldRef.value, key, to.column, (_a = to.index) !== null && _a !== void 0 ? _a : Number.MAX_SAFE_INTEGER);
182
+ if (result) {
183
+ doUpdateData(result.data);
184
+ }
185
+ },
186
+ addItem(item, index) {
187
+ const next = mergedDataRef.value.slice();
188
+ next.splice(index !== null && index !== void 0 ? index : next.length, 0, item);
189
+ doUpdateData(next);
190
+ },
191
+ removeItem(key) {
192
+ doUpdateData(mergedDataRef.value.filter(item => getItemKey(item) !== key));
193
+ },
194
+ scrollToColumn(columnKey) {
195
+ var _a;
196
+ (_a = findColumnEl(columnKey)) === null || _a === void 0 ? void 0 : _a.scrollIntoView({
197
+ behavior: 'smooth',
198
+ inline: 'nearest',
199
+ block: 'nearest'
200
+ });
201
+ },
202
+ scrollColumnToBottom(columnKey) {
203
+ var _a;
204
+ const body = (_a = findColumnEl(columnKey)) === null || _a === void 0 ? void 0 : _a.querySelector(`.${mergedClsPrefixRef.value}-kanban-column__body`);
205
+ if (body) {
206
+ body.scrollTop = body.scrollHeight;
207
+ }
208
+ }
209
+ };
210
+ expose(exposed);
211
+ function getItemKey(item) {
212
+ const {
213
+ itemKey
214
+ } = props;
215
+ if (typeof itemKey === 'function') {
216
+ return itemKey(item);
217
+ }
218
+ return item[itemKey];
219
+ }
220
+ function isItemDraggable(item, column) {
221
+ return props.draggable && !props.disabled && !item.disabled && !column.frozen;
222
+ }
223
+ function isColumnDraggable(column) {
224
+ return props.columnsDraggable && !props.disabled && !column.disabled;
225
+ }
226
+ function doUpdateData(next) {
227
+ uncontrolledDataRef.value = next;
228
+ emit('update:data', next);
229
+ }
230
+ function doUpdateColumns(next) {
231
+ uncontrolledColumnsRef.value = next;
232
+ }
233
+ function emitMove(ctx) {
234
+ var _a;
235
+ (_a = props.onMove) === null || _a === void 0 ? void 0 : _a.call(props, ctx);
236
+ emit('move', ctx);
237
+ }
238
+ function emitColumnsReorder(columns) {
239
+ var _a;
240
+ doUpdateColumns(columns);
241
+ (_a = props.onColumnsReorder) === null || _a === void 0 ? void 0 : _a.call(props, columns);
242
+ emit('columns-reorder', columns);
243
+ }
244
+ function emitDragStart(ctx) {
245
+ var _a;
246
+ (_a = props.onDragStart) === null || _a === void 0 ? void 0 : _a.call(props, ctx);
247
+ emit('drag-start', ctx);
248
+ }
249
+ function emitDragEnd(ctx) {
250
+ var _a;
251
+ (_a = props.onDragEnd) === null || _a === void 0 ? void 0 : _a.call(props, ctx);
252
+ emit('drag-end', ctx);
253
+ }
254
+ provide(kanbanInjectionKey, {
255
+ mergedClsPrefixRef,
256
+ mergedThemeRef: themeRef,
257
+ propsRef: props,
258
+ getItemKey,
259
+ draggingItemKeySetRef: drag.draggingItemKeySetRef,
260
+ draggingItemRef: drag.draggingItemRef,
261
+ draggingColumnKeyRef: drag.draggingColumnKeyRef,
262
+ droppingColumnKeyRef: drag.droppingColumnKeyRef,
263
+ droppingItemKeyRef: drag.droppingItemKeyRef,
264
+ droppingPositionRef: drag.droppingPositionRef,
265
+ handleItemDragStart: drag.handleItemDragStart,
266
+ handleItemDragOver: drag.handleItemDragOver,
267
+ handleItemDrop: drag.handleItemDrop,
268
+ handleColumnDragStart: drag.handleColumnDragStart,
269
+ handleColumnDragOver: drag.handleColumnDragOver,
270
+ handleColumnDrop: drag.handleColumnDrop,
271
+ handleDragEnd: drag.handleDragEnd,
272
+ handleItemClick,
273
+ handleColumnScroll,
274
+ isItemDraggable,
275
+ isColumnDraggable
276
+ });
277
+ watch(() => props.data, value => {
278
+ uncontrolledDataRef.value = value;
279
+ });
280
+ watch(() => props.columns, value => {
281
+ uncontrolledColumnsRef.value = value;
282
+ });
283
+ return {
284
+ selfElRef,
285
+ mergedClsPrefix: mergedClsPrefixRef,
286
+ mergedColumns: mergedColumnsRef,
287
+ mergedData: mergedDataRef,
288
+ columnFieldValue: columnFieldRef,
289
+ handleBoardScroll,
290
+ cssVars: inlineThemeDisabled ? undefined : cssVarsRef,
291
+ themeClass: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.themeClass,
292
+ onRender: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.onRender
293
+ };
294
+ },
295
+ render() {
296
+ var _a;
297
+ const {
298
+ mergedClsPrefix,
299
+ mergedColumns,
300
+ mergedData,
301
+ columnFieldValue,
302
+ orientation,
303
+ scrollMode,
304
+ loading,
305
+ emptyProps,
306
+ $slots
307
+ } = this;
308
+ (_a = this.onRender) === null || _a === void 0 ? void 0 : _a.call(this);
309
+ const grouped = groupItemsByColumn(mergedColumns, mergedData, columnFieldValue);
310
+ const isEmpty = !mergedColumns.length;
311
+ return h("div", {
312
+ ref: "selfElRef",
313
+ class: [`${mergedClsPrefix}-kanban`, this.themeClass],
314
+ style: this.cssVars
315
+ }, isEmpty ? h("div", {
316
+ class: `${mergedClsPrefix}-kanban__empty`
317
+ }, $slots.empty ? $slots.empty() : h(UEmpty, Object.assign({
318
+ size: "large"
319
+ }, emptyProps))) : h("div", {
320
+ class: [`${mergedClsPrefix}-kanban__board`, {
321
+ [`${mergedClsPrefix}-kanban__board--vertical`]: orientation === 'vertical',
322
+ [`${mergedClsPrefix}-kanban__board--scroll-board`]: scrollMode === 'board'
323
+ }],
324
+ "aria-busy": loading || undefined,
325
+ onScroll: scrollMode === 'board' ? this.handleBoardScroll : undefined
326
+ }, h("div", {
327
+ class: [`${mergedClsPrefix}-kanban__board-track`, {
328
+ [`${mergedClsPrefix}-kanban__board-track--vertical`]: orientation === 'vertical'
329
+ }]
330
+ }, mergedColumns.map((column, index) => {
331
+ var _a, _b;
332
+ return $slots.column ? $slots.column({
333
+ column,
334
+ items: (_a = grouped.get(column.key)) !== null && _a !== void 0 ? _a : [],
335
+ index
336
+ }) : h(UKanbanColumn, {
337
+ key: column.key,
338
+ column: column,
339
+ items: (_b = grouped.get(column.key)) !== null && _b !== void 0 ? _b : [],
340
+ index: index
341
+ }, {
342
+ columnHeader: $slots.columnHeader,
343
+ columnFooter: $slots.columnFooter,
344
+ columnEmpty: $slots.columnEmpty,
345
+ card: $slots.card
346
+ });
347
+ }))));
348
+ }
349
+ });
@@ -0,0 +1,39 @@
1
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
2
+ readonly item: {
3
+ readonly type: import("vue").PropType<import("./interface").KanbanItem>;
4
+ readonly required: true;
5
+ };
6
+ readonly column: {
7
+ readonly type: import("vue").PropType<import("./interface").KanbanColumn>;
8
+ readonly required: true;
9
+ };
10
+ readonly index: {
11
+ readonly type: NumberConstructor;
12
+ readonly default: 0;
13
+ };
14
+ readonly ghost: BooleanConstructor;
15
+ }>, {
16
+ injection: import("./injection").KanbanInjection;
17
+ mergedClsPrefix: import("vue").Ref<string, string>;
18
+ draggable: import("vue").ComputedRef<boolean>;
19
+ dragging: import("vue").ComputedRef<boolean>;
20
+ clickable: import("vue").ComputedRef<boolean>;
21
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
22
+ readonly item: {
23
+ readonly type: import("vue").PropType<import("./interface").KanbanItem>;
24
+ readonly required: true;
25
+ };
26
+ readonly column: {
27
+ readonly type: import("vue").PropType<import("./interface").KanbanColumn>;
28
+ readonly required: true;
29
+ };
30
+ readonly index: {
31
+ readonly type: NumberConstructor;
32
+ readonly default: 0;
33
+ };
34
+ readonly ghost: BooleanConstructor;
35
+ }>> & Readonly<{}>, {
36
+ readonly ghost: boolean;
37
+ readonly index: number;
38
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
39
+ export default _default;
@@ -0,0 +1,86 @@
1
+ import { computed, defineComponent, h, inject } from 'vue';
2
+ import { render as resolveRenderValue, warn } from "../../_utils/index.mjs";
3
+ import { kanbanInjectionKey } from "./injection.mjs";
4
+ import { kanbanCardProps } from "./interface.mjs";
5
+ export default defineComponent({
6
+ name: 'KanbanCard',
7
+ props: kanbanCardProps,
8
+ setup(props) {
9
+ const injection = inject(kanbanInjectionKey, null);
10
+ if (!injection) {
11
+ warn('kanban', '`UKanbanCard` must be used inside `UKanban`.');
12
+ }
13
+ const {
14
+ mergedClsPrefixRef,
15
+ getItemKey,
16
+ draggingItemKeySetRef,
17
+ isItemDraggable,
18
+ propsRef
19
+ } = injection;
20
+ const itemKeyRef = computed(() => getItemKey(props.item));
21
+ const draggableRef = computed(() => isItemDraggable(props.item, props.column));
22
+ const draggingRef = computed(() => draggingItemKeySetRef.value.has(itemKeyRef.value));
23
+ const clickableRef = computed(() => !!propsRef.onItemClick && !props.item.disabled);
24
+ return {
25
+ injection,
26
+ mergedClsPrefix: mergedClsPrefixRef,
27
+ draggable: draggableRef,
28
+ dragging: draggingRef,
29
+ clickable: clickableRef
30
+ };
31
+ },
32
+ render() {
33
+ var _a;
34
+ const {
35
+ mergedClsPrefix,
36
+ item,
37
+ column,
38
+ ghost,
39
+ dragging,
40
+ draggable,
41
+ clickable,
42
+ injection,
43
+ $slots
44
+ } = this;
45
+ let body;
46
+ if ($slots.card) {
47
+ body = $slots.card({
48
+ item,
49
+ column,
50
+ dragging: dragging || ghost
51
+ });
52
+ } else if (item.render) {
53
+ body = item.render(item, column);
54
+ } else {
55
+ body = [h("div", {
56
+ class: `${mergedClsPrefix}-kanban-card__title`
57
+ }, (_a = resolveRenderValue(item.title)) !== null && _a !== void 0 ? _a : item.name), item.description ? h("div", {
58
+ class: `${mergedClsPrefix}-kanban-card__description`
59
+ }, resolveRenderValue(item.description)) : null];
60
+ }
61
+ if (ghost) {
62
+ return h("div", {
63
+ class: [`${mergedClsPrefix}-kanban-card`, `${mergedClsPrefix}-kanban-card--ghost`],
64
+ "aria-hidden": "true"
65
+ }, body);
66
+ }
67
+ return h("div", Object.assign({
68
+ class: [`${mergedClsPrefix}-kanban-card`, {
69
+ [`${mergedClsPrefix}-kanban-card--dragging`]: dragging,
70
+ [`${mergedClsPrefix}-kanban-card--disabled`]: item.disabled,
71
+ [`${mergedClsPrefix}-kanban-card--clickable`]: clickable
72
+ }],
73
+ "data-kanban-card-key": String(injection.getItemKey(item)),
74
+ draggable: draggable || undefined,
75
+ onDragstart: event => injection.handleItemDragStart(event, item),
76
+ onDragover: event => injection.handleItemDragOver(event, item),
77
+ onDrop: event => injection.handleItemDrop(event, item),
78
+ onDragend: () => injection.handleDragEnd(),
79
+ onClick: () => {
80
+ if (clickable) {
81
+ injection.handleItemClick(item, column);
82
+ }
83
+ }
84
+ }, injection.propsRef.cardProps), body);
85
+ }
86
+ });
@@ -0,0 +1,45 @@
1
+ import type { CSSProperties } from 'vue';
2
+ import type { KanbanDropPosition, KanbanItem } from './interface';
3
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ readonly column: {
5
+ readonly type: import("vue").PropType<import("./interface").KanbanColumn>;
6
+ readonly required: true;
7
+ };
8
+ readonly items: {
9
+ readonly type: import("vue").PropType<KanbanItem[]>;
10
+ readonly default: () => never[];
11
+ };
12
+ readonly index: {
13
+ readonly type: NumberConstructor;
14
+ readonly default: 0;
15
+ };
16
+ }>, {
17
+ injection: import("./injection").KanbanInjection;
18
+ mergedClsPrefix: import("vue").Ref<string, string>;
19
+ columnDraggable: import("vue").ComputedRef<boolean>;
20
+ dragging: import("vue").ComputedRef<boolean>;
21
+ columnDropPosition: import("vue").ComputedRef<KanbanDropPosition | null>;
22
+ vertical: import("vue").ComputedRef<boolean>;
23
+ boardScroll: import("vue").ComputedRef<boolean>;
24
+ maxReached: import("vue").ComputedRef<boolean>;
25
+ columnStyle: import("vue").ComputedRef<CSSProperties | undefined>;
26
+ countStyle: import("vue").ComputedRef<CSSProperties | undefined>;
27
+ handleBodyScroll: (event: Event) => void;
28
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
29
+ readonly column: {
30
+ readonly type: import("vue").PropType<import("./interface").KanbanColumn>;
31
+ readonly required: true;
32
+ };
33
+ readonly items: {
34
+ readonly type: import("vue").PropType<KanbanItem[]>;
35
+ readonly default: () => never[];
36
+ };
37
+ readonly index: {
38
+ readonly type: NumberConstructor;
39
+ readonly default: 0;
40
+ };
41
+ }>> & Readonly<{}>, {
42
+ readonly items: KanbanItem[];
43
+ readonly index: number;
44
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
45
+ export default _default;
@@ -0,0 +1,176 @@
1
+ import { computed, defineComponent, h, inject } from 'vue';
2
+ import { render as resolveRenderValue, warn } from "../../_utils/index.mjs";
3
+ import { UEmpty } from "../../empty/index.mjs";
4
+ import { kanbanInjectionKey } from "./injection.mjs";
5
+ import { kanbanColumnProps } from "./interface.mjs";
6
+ import UKanbanCard from "./KanbanCard.mjs";
7
+ export default defineComponent({
8
+ name: 'KanbanColumn',
9
+ props: kanbanColumnProps,
10
+ setup(props) {
11
+ const injection = inject(kanbanInjectionKey, null);
12
+ if (!injection) {
13
+ warn('kanban', '`UKanbanColumn` must be used inside `UKanban`.');
14
+ }
15
+ const {
16
+ mergedClsPrefixRef,
17
+ draggingColumnKeyRef,
18
+ droppingColumnKeyRef,
19
+ droppingPositionRef,
20
+ isColumnDraggable,
21
+ propsRef
22
+ } = injection;
23
+ const columnDraggableRef = computed(() => isColumnDraggable(props.column));
24
+ const draggingRef = computed(() => draggingColumnKeyRef.value === props.column.key);
25
+ const columnDropPositionRef = computed(() => draggingColumnKeyRef.value != null && droppingColumnKeyRef.value === props.column.key ? droppingPositionRef.value : null);
26
+ const verticalRef = computed(() => propsRef.orientation === 'vertical');
27
+ const boardScrollRef = computed(() => propsRef.scrollMode === 'board');
28
+ const maxReachedRef = computed(() => typeof props.column.max === 'number' && props.items.length >= props.column.max);
29
+ const statusRef = computed(() => {
30
+ const status = props.column.status;
31
+ return status && status !== 'neutral' ? status : null;
32
+ });
33
+ const columnStyleRef = computed(() => statusRef.value ? {
34
+ backgroundColor: `var(--u-status-${statusRef.value}-header-color)`
35
+ } : undefined);
36
+ const countStyleRef = computed(() => statusRef.value && !maxReachedRef.value ? {
37
+ backgroundColor: `var(--u-status-${statusRef.value}-count-color)`
38
+ } : undefined);
39
+ function handleBodyScroll(event) {
40
+ injection.handleColumnScroll(props.column, event.target);
41
+ }
42
+ return {
43
+ injection,
44
+ mergedClsPrefix: mergedClsPrefixRef,
45
+ columnDraggable: columnDraggableRef,
46
+ dragging: draggingRef,
47
+ columnDropPosition: columnDropPositionRef,
48
+ vertical: verticalRef,
49
+ boardScroll: boardScrollRef,
50
+ maxReached: maxReachedRef,
51
+ columnStyle: columnStyleRef,
52
+ countStyle: countStyleRef,
53
+ handleBodyScroll
54
+ };
55
+ },
56
+ render() {
57
+ var _a;
58
+ const {
59
+ mergedClsPrefix,
60
+ column,
61
+ items,
62
+ injection,
63
+ columnDraggable,
64
+ dragging,
65
+ columnDropPosition,
66
+ vertical,
67
+ boardScroll,
68
+ maxReached,
69
+ columnStyle,
70
+ countStyle,
71
+ $slots
72
+ } = this;
73
+ const count = items.length;
74
+ const emptyText = injection.propsRef.columnEmptyText;
75
+ const getItemKey = injection.getItemKey;
76
+ const draggingItem = injection.draggingItemRef.value;
77
+ const draggingKey = draggingItem ? getItemKey(draggingItem) : null;
78
+ const columnField = (_a = injection.propsRef.columnField) !== null && _a !== void 0 ? _a : 'column';
79
+ const sourceColumnKey = draggingItem ? draggingItem[columnField] : null;
80
+ const dropColumnKey = injection.droppingColumnKeyRef.value;
81
+ const dropKey = injection.droppingItemKeyRef.value;
82
+ const dropPosition = injection.droppingPositionRef.value;
83
+ const isTarget = !!draggingItem && dropColumnKey === column.key && !column.frozen;
84
+ const isSameColumnReorder = !!draggingItem && sourceColumnKey === dropColumnKey;
85
+ const renderCard = item => h(UKanbanCard, {
86
+ key: getItemKey(item),
87
+ item: item,
88
+ column: column
89
+ }, {
90
+ card: $slots.card
91
+ });
92
+ const renderGhost = () => h(UKanbanCard, {
93
+ key: "__kanban-ghost__",
94
+ ghost: true,
95
+ item: draggingItem,
96
+ column: column
97
+ }, {
98
+ card: $slots.card
99
+ });
100
+ let cardNodes = [];
101
+ if (draggingItem && isSameColumnReorder && sourceColumnKey === column.key) {
102
+ const rest = items.filter(item => getItemKey(item) !== draggingKey);
103
+ let insertAt = rest.length;
104
+ if (dropKey != null) {
105
+ const anchor = rest.findIndex(item => getItemKey(item) === dropKey);
106
+ if (anchor >= 0) {
107
+ insertAt = dropPosition === 'after' ? anchor + 1 : anchor;
108
+ }
109
+ }
110
+ const preview = rest.slice();
111
+ preview.splice(insertAt, 0, draggingItem);
112
+ cardNodes = preview.map(renderCard);
113
+ } else {
114
+ items.forEach(item => {
115
+ const key = getItemKey(item);
116
+ if (isTarget && dropKey === key && dropPosition === 'before') {
117
+ cardNodes.push(renderGhost());
118
+ }
119
+ cardNodes.push(renderCard(item));
120
+ if (isTarget && dropKey === key && dropPosition === 'after') {
121
+ cardNodes.push(renderGhost());
122
+ }
123
+ });
124
+ if (isTarget && dropKey == null) {
125
+ cardNodes.push(renderGhost());
126
+ }
127
+ }
128
+ const hasBodyContent = cardNodes.length > 0;
129
+ return h("div", {
130
+ class: [`${mergedClsPrefix}-kanban-column`, {
131
+ [`${mergedClsPrefix}-kanban-column--vertical`]: vertical,
132
+ [`${mergedClsPrefix}-kanban-column--board-scroll`]: boardScroll,
133
+ [`${mergedClsPrefix}-kanban-column--dragging`]: dragging,
134
+ [`${mergedClsPrefix}-kanban-column--drop-before`]: columnDropPosition === 'before',
135
+ [`${mergedClsPrefix}-kanban-column--drop-after`]: columnDropPosition === 'after'
136
+ }],
137
+ style: columnStyle,
138
+ "data-kanban-column-key": String(column.key),
139
+ onDragover: event => injection.handleColumnDragOver(event, column),
140
+ onDrop: event => injection.handleColumnDrop(event, column)
141
+ }, h("div", {
142
+ class: [`${mergedClsPrefix}-kanban-column__header`, {
143
+ [`${mergedClsPrefix}-kanban-column__header--draggable`]: columnDraggable
144
+ }],
145
+ draggable: columnDraggable || undefined,
146
+ onDragstart: event => injection.handleColumnDragStart(event, column),
147
+ onDragend: () => injection.handleDragEnd()
148
+ }, $slots.columnHeader ? $slots.columnHeader({
149
+ column,
150
+ count
151
+ }) : [h("span", {
152
+ class: `${mergedClsPrefix}-kanban-column__title`
153
+ }, resolveRenderValue(column.title)), h("span", {
154
+ class: [`${mergedClsPrefix}-kanban-column__count`, {
155
+ [`${mergedClsPrefix}-kanban-column__count--max-reached`]: maxReached
156
+ }],
157
+ style: countStyle
158
+ }, typeof column.max === 'number' ? `${count}/${column.max}` : count)]), h("div", {
159
+ class: [`${mergedClsPrefix}-kanban-column__body`, {
160
+ [`${mergedClsPrefix}-kanban-column__body--board-scroll`]: boardScroll
161
+ }],
162
+ onScroll: boardScroll ? undefined : this.handleBodyScroll
163
+ }, hasBodyContent ? cardNodes : h("div", {
164
+ class: `${mergedClsPrefix}-kanban-column__empty`
165
+ }, $slots.columnEmpty ? $slots.columnEmpty({
166
+ column
167
+ }) : typeof emptyText === 'function' ? emptyText() : h(UEmpty, {
168
+ size: "small",
169
+ description: emptyText
170
+ }))), $slots.columnFooter ? h("div", {
171
+ class: `${mergedClsPrefix}-kanban-column__footer`
172
+ }, $slots.columnFooter({
173
+ column
174
+ })) : null);
175
+ }
176
+ });