@expcat/tigercat-vue 0.3.70 → 0.4.2

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 (43) hide show
  1. package/dist/{chunk-ZTJTIQZY.mjs → chunk-DEFEAEYE.mjs} +126 -6
  2. package/dist/{chunk-KUJ75OHX.js → chunk-ESALMEHU.js} +10 -9
  3. package/dist/{chunk-KVZLGW45.js → chunk-ETTYERGO.js} +14 -5
  4. package/dist/chunk-HFBRO2IF.mjs +440 -0
  5. package/dist/chunk-HK2TAPQX.js +334 -0
  6. package/dist/{chunk-YZK2HXRT.js → chunk-LGRUMMOG.js} +2 -2
  7. package/dist/chunk-LW3LFCRZ.mjs +331 -0
  8. package/dist/{chunk-ND4XDRYR.mjs → chunk-TCJBN2DA.mjs} +1 -1
  9. package/dist/{chunk-7FCHU5KV.mjs → chunk-TTDBR2B4.mjs} +11 -10
  10. package/dist/{chunk-RKPYLBPU.mjs → chunk-WM4ESIHG.mjs} +15 -6
  11. package/dist/{chunk-3PQIZBT5.js → chunk-WV3Y45YK.js} +125 -5
  12. package/dist/chunk-YQGKXFV5.js +443 -0
  13. package/dist/components/ActivityFeed.js +4 -4
  14. package/dist/components/ActivityFeed.mjs +2 -2
  15. package/dist/components/Collapse.d.mts +1 -1
  16. package/dist/components/Collapse.d.ts +1 -1
  17. package/dist/components/DataTableWithToolbar.js +4 -4
  18. package/dist/components/DataTableWithToolbar.mjs +2 -2
  19. package/dist/components/InputNumber.d.mts +170 -0
  20. package/dist/components/InputNumber.d.ts +170 -0
  21. package/dist/components/InputNumber.js +17 -0
  22. package/dist/components/InputNumber.mjs +2 -0
  23. package/dist/components/Sidebar.d.mts +20 -0
  24. package/dist/components/Sidebar.d.ts +20 -0
  25. package/dist/components/Sidebar.js +3 -3
  26. package/dist/components/Sidebar.mjs +1 -1
  27. package/dist/components/SubMenu.js +3 -3
  28. package/dist/components/SubMenu.mjs +1 -1
  29. package/dist/components/Table.d.mts +16 -2
  30. package/dist/components/Table.d.ts +16 -2
  31. package/dist/components/Table.js +3 -3
  32. package/dist/components/Table.mjs +1 -1
  33. package/dist/components/TaskBoard.d.mts +129 -0
  34. package/dist/components/TaskBoard.d.ts +129 -0
  35. package/dist/components/TaskBoard.js +18 -0
  36. package/dist/components/TaskBoard.mjs +3 -0
  37. package/dist/index.d.mts +2 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +50 -40
  40. package/dist/index.mjs +13 -11
  41. package/package.json +2 -2
  42. package/dist/{chunk-NGW5UMAN.js → chunk-EBTLMVDJ.js} +1 -1
  43. package/dist/{chunk-D7VMY6WX.mjs → chunk-RVEEEDJQ.mjs} +1 -1
@@ -1,6 +1,6 @@
1
1
  import { MenuContextKey } from './chunk-3AM6WEUE.mjs';
2
2
  import { defineComponent, inject, computed, ref, h, Transition, isVNode, cloneVNode, nextTick } from 'vue';
3
- import { isKeyOpen, classNames, getSubMenuTitleClasses, coerceClassValue, mergeStyleValues, submenuContentHorizontalClasses, submenuContentPopupClasses, submenuContentInlineClasses, submenuContentVerticalClasses, getMenuItemIndent, menuItemIconClasses, getSubMenuExpandIconClasses, moveFocusInMenu, focusMenuEdge, focusFirstChildItem } from '@expcat/tigercat-core';
3
+ import { isKeyOpen, classNames, getSubMenuTitleClasses, coerceClassValue, mergeStyleValues, submenuContentHorizontalClasses, submenuContentHorizontalNestedClasses, submenuContentPopupClasses, submenuContentInlineClasses, submenuContentVerticalClasses, getSubmenuPopupZIndex, getMenuItemIndent, menuItemIconClasses, getSubMenuExpandIconClasses, moveFocusInMenu, focusMenuEdge, focusFirstChildItem } from '@expcat/tigercat-core';
4
4
 
5
5
  var ExpandIcon = (expanded) => {
6
6
  return h(
@@ -85,7 +85,9 @@ var SubMenu = defineComponent({
85
85
  return props.collapsed ?? (menuContext ? menuContext.collapsed.value : false);
86
86
  });
87
87
  const isPopup = computed(() => {
88
- return !!menuContext && menuContext.mode.value === "vertical" && effectiveCollapsed.value;
88
+ if (!menuContext) return false;
89
+ if (menuContext.mode.value === "horizontal") return true;
90
+ return menuContext.mode.value === "vertical" && effectiveCollapsed.value;
89
91
  });
90
92
  const isExpanded = computed(() => {
91
93
  if (menuContext?.mode.value === "horizontal" || isPopup.value) {
@@ -109,12 +111,13 @@ var SubMenu = defineComponent({
109
111
  const contentClasses = computed(() => {
110
112
  if (!menuContext) return "";
111
113
  if (menuContext.mode.value === "horizontal") {
112
- return submenuContentHorizontalClasses;
114
+ return props.level === 0 ? submenuContentHorizontalClasses : submenuContentHorizontalNestedClasses;
113
115
  }
114
116
  if (isPopup.value) return submenuContentPopupClasses;
115
117
  if (menuContext.mode.value === "inline") return submenuContentInlineClasses;
116
118
  return submenuContentVerticalClasses;
117
119
  });
120
+ const popupZIndex = computed(() => isPopup.value ? getSubmenuPopupZIndex(props.level) : {});
118
121
  const handleTitleClick = () => {
119
122
  if (!menuContext || props.disabled) return;
120
123
  if (menuContext.mode.value === "horizontal") return;
@@ -206,7 +209,7 @@ var SubMenu = defineComponent({
206
209
  }
207
210
  };
208
211
  const indentStyle = computed(() => {
209
- if (!menuContext || menuContext.mode.value !== "inline" || props.level === 0) {
212
+ if (!menuContext || menuContext.mode.value === "horizontal" || props.level === 0) {
210
213
  return {};
211
214
  }
212
215
  return getMenuItemIndent(props.level, menuContext.inlineIndent.value);
@@ -224,9 +227,6 @@ var SubMenu = defineComponent({
224
227
  const nextProps = {
225
228
  level: existingProps.level ?? nextLevel
226
229
  };
227
- if (isPopup.value) {
228
- nextProps.collapsed = false;
229
- }
230
230
  return cloneVNode(node, nextProps);
231
231
  });
232
232
  };
@@ -274,12 +274,13 @@ var SubMenu = defineComponent({
274
274
  },
275
275
  titleChildren
276
276
  );
277
- const contentNode = menuContext.mode.value === "horizontal" || isPopup.value ? h(
277
+ const contentNode = isPopup.value ? h(
278
278
  "ul",
279
279
  {
280
280
  class: contentClasses.value,
281
281
  style: {
282
- display: isExpanded.value ? "block" : "none"
282
+ display: isExpanded.value ? "block" : "none",
283
+ ...popupZIndex.value
283
284
  },
284
285
  role: "menu",
285
286
  "aria-hidden": isExpanded.value ? void 0 : "true"
@@ -324,7 +325,7 @@ var SubMenu = defineComponent({
324
325
  return h(
325
326
  "li",
326
327
  {
327
- class: menuContext.mode.value === "horizontal" || isPopup.value ? "relative" : "",
328
+ class: isPopup.value ? "relative" : "",
328
329
  onMouseenter: handleMouseEnter,
329
330
  onMouseleave: handleMouseLeave,
330
331
  role: "none"
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, computed, h } from 'vue';
2
- import { classNames, layoutSidebarClasses, coerceClassValue, mergeStyleValues } from '@expcat/tigercat-core';
2
+ import { classNames, layoutSidebarClasses, layoutSidebarCollapsedClasses, coerceClassValue, getSidebarStyle, mergeStyleValues } from '@expcat/tigercat-core';
3
3
 
4
4
  // src/components/Sidebar.ts
5
5
  var Sidebar = defineComponent({
@@ -21,6 +21,15 @@ var Sidebar = defineComponent({
21
21
  type: String,
22
22
  default: "256px"
23
23
  },
24
+ /**
25
+ * Width when collapsed (mini mode).
26
+ * Set to '0px' to fully hide the sidebar when collapsed.
27
+ * @default '64px'
28
+ */
29
+ collapsedWidth: {
30
+ type: String,
31
+ default: "64px"
32
+ },
24
33
  /**
25
34
  * Whether the sidebar is collapsed
26
35
  * @default false
@@ -41,14 +50,14 @@ var Sidebar = defineComponent({
41
50
  const sidebarClasses = computed(
42
51
  () => classNames(
43
52
  layoutSidebarClasses,
53
+ props.collapsed && layoutSidebarCollapsedClasses,
44
54
  props.className,
45
55
  coerceClassValue(attrs.class)
46
56
  )
47
57
  );
48
- const sidebarStyle = computed(() => ({
49
- width: props.collapsed ? "0px" : props.width,
50
- minWidth: props.collapsed ? "0px" : props.width
51
- }));
58
+ const sidebarStyle = computed(
59
+ () => getSidebarStyle(props.collapsed, props.width, props.collapsedWidth)
60
+ );
52
61
  return () => h(
53
62
  "aside",
54
63
  {
@@ -56,7 +65,7 @@ var Sidebar = defineComponent({
56
65
  class: sidebarClasses.value,
57
66
  style: mergeStyleValues(props.style, sidebarStyle.value)
58
67
  },
59
- !props.collapsed && slots.default?.()
68
+ slots.default?.()
60
69
  );
61
70
  }
62
71
  });
@@ -160,6 +160,12 @@ var Table = vue.defineComponent({
160
160
  rowSelection: {
161
161
  type: Object
162
162
  },
163
+ /**
164
+ * Row expansion configuration
165
+ */
166
+ expandable: {
167
+ type: Object
168
+ },
163
169
  /**
164
170
  * Function to get row key
165
171
  */
@@ -194,7 +200,15 @@ var Table = vue.defineComponent({
194
200
  default: "auto"
195
201
  }
196
202
  },
197
- emits: ["change", "row-click", "selection-change", "sort-change", "filter-change", "page-change"],
203
+ emits: [
204
+ "change",
205
+ "row-click",
206
+ "selection-change",
207
+ "sort-change",
208
+ "filter-change",
209
+ "page-change",
210
+ "expanded-rows-change"
211
+ ],
198
212
  setup(props, { emit, slots }) {
199
213
  const paginationConfig = vue.computed(() => {
200
214
  return props.pagination !== false && typeof props.pagination === "object" ? props.pagination : null;
@@ -204,6 +218,7 @@ var Table = vue.defineComponent({
204
218
  vue.computed(() => paginationConfig.value?.current !== void 0);
205
219
  vue.computed(() => paginationConfig.value?.pageSize !== void 0);
206
220
  const isSelectionControlled = vue.computed(() => props.rowSelection?.selectedRowKeys !== void 0);
221
+ const isExpandControlled = vue.computed(() => props.expandable?.expandedRowKeys !== void 0);
207
222
  const uncontrolledSortState = vue.ref(props.defaultSort);
208
223
  const uncontrolledFilterState = vue.ref(props.defaultFilters);
209
224
  const uncontrolledCurrentPage = vue.ref(
@@ -215,6 +230,9 @@ var Table = vue.defineComponent({
215
230
  const uncontrolledSelectedRowKeys = vue.ref(
216
231
  props.rowSelection?.defaultSelectedRowKeys ?? props.rowSelection?.selectedRowKeys ?? []
217
232
  );
233
+ const uncontrolledExpandedRowKeys = vue.ref(
234
+ props.expandable?.defaultExpandedRowKeys ?? props.expandable?.expandedRowKeys ?? []
235
+ );
218
236
  const sortState = vue.computed(() => props.sort ?? uncontrolledSortState.value);
219
237
  const filterState = vue.computed(() => props.filters ?? uncontrolledFilterState.value);
220
238
  const currentPage = vue.computed(() => {
@@ -226,6 +244,10 @@ var Table = vue.defineComponent({
226
244
  const selectedRowKeys = vue.computed(() => {
227
245
  return props.rowSelection?.selectedRowKeys ?? uncontrolledSelectedRowKeys.value;
228
246
  });
247
+ const expandedRowKeys = vue.computed(() => {
248
+ return props.expandable?.expandedRowKeys ?? uncontrolledExpandedRowKeys.value;
249
+ });
250
+ const expandedRowKeySet = vue.computed(() => new Set(expandedRowKeys.value));
229
251
  vue.watch(
230
252
  () => props.sort,
231
253
  (next) => {
@@ -437,8 +459,25 @@ var Table = vue.defineComponent({
437
459
  const someSelected = vue.computed(() => {
438
460
  return selectedRowKeys.value.length > 0 && !allSelected.value;
439
461
  });
462
+ function handleToggleExpand(key) {
463
+ const isExp = expandedRowKeySet.value.has(key);
464
+ const next = isExp ? expandedRowKeys.value.filter((k) => k !== key) : [...expandedRowKeys.value, key];
465
+ if (!isExpandControlled.value) {
466
+ uncontrolledExpandedRowKeys.value = next;
467
+ }
468
+ emit("expanded-rows-change", next);
469
+ }
470
+ const totalColumnCount = vue.computed(() => {
471
+ let count = displayColumns.value.length;
472
+ if (props.rowSelection && props.rowSelection.showCheckbox !== false) count++;
473
+ if (props.expandable) count++;
474
+ return count;
475
+ });
440
476
  function renderTableHeader() {
441
477
  const headerCells = [];
478
+ if (props.expandable && props.expandable.expandIconPosition !== "end") {
479
+ headerCells.push(vue.h("th", { class: tigercatCore.getExpandCellClasses(props.size) }));
480
+ }
442
481
  if (props.rowSelection && props.rowSelection.showCheckbox !== false && props.rowSelection.type !== "radio") {
443
482
  headerCells.push(
444
483
  vue.h(
@@ -558,6 +597,9 @@ var Table = vue.defineComponent({
558
597
  )
559
598
  );
560
599
  });
600
+ if (props.expandable && props.expandable.expandIconPosition === "end") {
601
+ headerCells.push(vue.h("th", { class: tigercatCore.getExpandCellClasses(props.size) }));
602
+ }
561
603
  return vue.h("thead", { class: tigercatCore.getTableHeaderClasses(props.stickyHeader) }, [
562
604
  vue.h("tr", headerCells)
563
605
  ]);
@@ -572,7 +614,7 @@ var Table = vue.defineComponent({
572
614
  vue.h(
573
615
  "td",
574
616
  {
575
- colspan: displayColumns.value.length + (props.rowSelection ? 1 : 0),
617
+ colspan: totalColumnCount.value,
576
618
  class: tigercatCore.tableEmptyStateClasses
577
619
  },
578
620
  [
@@ -589,11 +631,45 @@ var Table = vue.defineComponent({
589
631
  ])
590
632
  ]);
591
633
  }
592
- const rows = paginatedData.value.map((record, index) => {
634
+ const rows = paginatedData.value.flatMap((record, index) => {
593
635
  const key = paginatedRowKeys.value[index];
594
636
  const isSelected = selectedRowKeySet.value.has(key);
637
+ const isExpanded = expandedRowKeySet.value.has(key);
638
+ const isExpandable = props.expandable ? props.expandable.rowExpandable?.(record) ?? true : false;
595
639
  const rowClass = typeof props.rowClassName === "function" ? props.rowClassName(record, index) : props.rowClassName;
596
640
  const cells = [];
641
+ if (props.expandable && props.expandable.expandIconPosition !== "end") {
642
+ cells.push(
643
+ vue.h("td", { class: tigercatCore.getExpandCellClasses(props.size) }, [
644
+ isExpandable ? vue.h(
645
+ "button",
646
+ {
647
+ class: tigercatCore.classNames(
648
+ tigercatCore.expandIconButtonClasses,
649
+ tigercatCore.getExpandIconRotationClasses(isExpanded)
650
+ ),
651
+ "aria-label": isExpanded ? "Collapse row" : "Expand row",
652
+ onClick: (e) => {
653
+ e.stopPropagation();
654
+ handleToggleExpand(key);
655
+ }
656
+ },
657
+ [
658
+ vue.h(
659
+ "svg",
660
+ tigercatCore.normalizeSvgAttrs({
661
+ xmlns: "http://www.w3.org/2000/svg",
662
+ viewBox: tigercatCore.icon16ViewBox,
663
+ fill: "currentColor",
664
+ class: "w-4 h-4"
665
+ }),
666
+ [vue.h("path", { d: "M6 3l6 5-6 5V3z" })]
667
+ )
668
+ ]
669
+ ) : null
670
+ ])
671
+ );
672
+ }
597
673
  if (props.rowSelection && props.rowSelection.showCheckbox !== false) {
598
674
  const checkboxProps = props.rowSelection?.getCheckboxProps?.(record) || {};
599
675
  cells.push(
@@ -608,6 +684,7 @@ var Table = vue.defineComponent({
608
684
  class: props.rowSelection?.type === "radio" ? "border-gray-300 text-[var(--tiger-primary,#2563eb)] focus:ring-[var(--tiger-primary,#2563eb)]" : "rounded border-gray-300 text-[var(--tiger-primary,#2563eb)] focus:ring-[var(--tiger-primary,#2563eb)]",
609
685
  checked: isSelected,
610
686
  disabled: checkboxProps.disabled,
687
+ onClick: (e) => e.stopPropagation(),
611
688
  onChange: (e) => handleSelectRow(key, e.target.checked)
612
689
  })
613
690
  ]
@@ -649,12 +726,44 @@ var Table = vue.defineComponent({
649
726
  style
650
727
  },
651
728
  [
652
- column.render ? slots[`cell-${column.key}`]?.({ record, index }) || column.render(record, index) : cellValue
729
+ slots[`cell-${column.key}`]?.({ record, index }) ?? (column.render ? column.render(record, index) : cellValue)
653
730
  ]
654
731
  )
655
732
  );
656
733
  });
657
- return vue.h(
734
+ if (props.expandable && props.expandable.expandIconPosition === "end") {
735
+ cells.push(
736
+ vue.h("td", { class: tigercatCore.getExpandCellClasses(props.size) }, [
737
+ isExpandable ? vue.h(
738
+ "button",
739
+ {
740
+ class: tigercatCore.classNames(
741
+ tigercatCore.expandIconButtonClasses,
742
+ tigercatCore.getExpandIconRotationClasses(isExpanded)
743
+ ),
744
+ "aria-label": isExpanded ? "Collapse row" : "Expand row",
745
+ onClick: (e) => {
746
+ e.stopPropagation();
747
+ handleToggleExpand(key);
748
+ }
749
+ },
750
+ [
751
+ vue.h(
752
+ "svg",
753
+ tigercatCore.normalizeSvgAttrs({
754
+ xmlns: "http://www.w3.org/2000/svg",
755
+ viewBox: tigercatCore.icon16ViewBox,
756
+ fill: "currentColor",
757
+ class: "w-4 h-4"
758
+ }),
759
+ [vue.h("path", { d: "M6 3l6 5-6 5V3z" })]
760
+ )
761
+ ]
762
+ ) : null
763
+ ])
764
+ );
765
+ }
766
+ const row = vue.h(
658
767
  "tr",
659
768
  {
660
769
  key,
@@ -666,6 +775,17 @@ var Table = vue.defineComponent({
666
775
  },
667
776
  cells
668
777
  );
778
+ const result = [row];
779
+ if (props.expandable && isExpanded && isExpandable) {
780
+ result.push(
781
+ vue.h("tr", { key: `${key}-expanded`, class: tigercatCore.expandedRowContentClasses }, [
782
+ vue.h("td", { colspan: totalColumnCount.value }, [
783
+ props.expandable.expandedRowRender(record, index)
784
+ ])
785
+ ])
786
+ );
787
+ }
788
+ return result;
669
789
  });
670
790
  return vue.h("tbody", rows);
671
791
  }