stk-table-vue 1.2.4 → 1.2.6

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 (68) hide show
  1. package/README.md +194 -194
  2. package/lib/{Dropdown-D_9cB0rD.js → Dropdown-BAANgg_5.js} +2 -2
  3. package/lib/{StkTable-CVcmlZi9.js → StkTable-CGcxwpdb.js} +22 -6
  4. package/lib/src/StkTable/StkTable.vue.d.ts +18 -4
  5. package/lib/src/StkTable/types/index.d.ts +4 -1
  6. package/lib/src/StkTable/useVirtualScroll.d.ts +6 -1
  7. package/lib/stk-table-vue.js +3 -3
  8. package/lib/style.css +1 -1
  9. package/package.json +93 -93
  10. package/src/StkTable/StkTable.vue +2362 -2338
  11. package/src/StkTable/components/DragHandle.vue +9 -9
  12. package/src/StkTable/components/SortIcon.vue +6 -6
  13. package/src/StkTable/components/TreeNodeCell.vue +19 -19
  14. package/src/StkTable/components/TriangleIcon.vue +3 -3
  15. package/src/StkTable/const.ts +50 -50
  16. package/src/StkTable/custom-cells/ChangeCell/ChangeCell.less +34 -34
  17. package/src/StkTable/custom-cells/ChangeCell/createChangeCell.ts +90 -90
  18. package/src/StkTable/custom-cells/ChangeCell/index.ts +4 -4
  19. package/src/StkTable/custom-cells/CheckboxCell/CheckboxCell.less +14 -14
  20. package/src/StkTable/custom-cells/CheckboxCell/CheckboxCell.vue +56 -56
  21. package/src/StkTable/custom-cells/CheckboxCell/createCheckboxCell.ts +146 -146
  22. package/src/StkTable/custom-cells/CheckboxCell/index.ts +5 -5
  23. package/src/StkTable/custom-cells/FilterCell/Dropdown/index.ts +16 -16
  24. package/src/StkTable/custom-cells/FilterCell/Dropdown/index.vue +186 -186
  25. package/src/StkTable/custom-cells/FilterCell/Filter.less +118 -118
  26. package/src/StkTable/custom-cells/FilterCell/Filter.vue +66 -66
  27. package/src/StkTable/custom-cells/FilterCell/createFilterCell.ts +120 -120
  28. package/src/StkTable/custom-cells/FilterCell/index.ts +6 -6
  29. package/src/StkTable/custom-cells/FilterCell/types.ts +43 -43
  30. package/src/StkTable/custom-cells/NumberCell/createNumberCell.ts +43 -43
  31. package/src/StkTable/custom-cells/NumberCell/index.ts +2 -2
  32. package/src/StkTable/custom-cells/utils/formatNumber.ts +137 -137
  33. package/src/StkTable/features/const.ts +1 -1
  34. package/src/StkTable/features/index.ts +1 -1
  35. package/src/StkTable/features/useAreaSelection.ts +1240 -1239
  36. package/src/StkTable/index.ts +20 -20
  37. package/src/StkTable/mergeCellsCache.ts +69 -69
  38. package/src/StkTable/registerFeature.ts +40 -40
  39. package/src/StkTable/style.less +791 -791
  40. package/src/StkTable/types/highlightDimOptions.ts +28 -28
  41. package/src/StkTable/types/index.ts +503 -500
  42. package/src/StkTable/useAutoResize.ts +87 -87
  43. package/src/StkTable/useColResize.ts +202 -202
  44. package/src/StkTable/useFixedCol.ts +168 -168
  45. package/src/StkTable/useFixedStyle.ts +75 -75
  46. package/src/StkTable/useGetFixedColPosition.ts +63 -63
  47. package/src/StkTable/useHighlight.ts +270 -270
  48. package/src/StkTable/useIndexResolver.ts +29 -29
  49. package/src/StkTable/useKeyboardArrowScroll.ts +114 -114
  50. package/src/StkTable/useMaxRowSpan.ts +60 -60
  51. package/src/StkTable/useMergeCells.ts +541 -541
  52. package/src/StkTable/useRowExpand.ts +81 -81
  53. package/src/StkTable/useScrollRowByRow.ts +96 -96
  54. package/src/StkTable/useScrollbar.ts +177 -177
  55. package/src/StkTable/useSorter.ts +267 -267
  56. package/src/StkTable/useTableColumns.ts +142 -142
  57. package/src/StkTable/useThDrag.ts +94 -94
  58. package/src/StkTable/useTrDrag.ts +100 -100
  59. package/src/StkTable/useTree.ts +253 -253
  60. package/src/StkTable/useVirtualScroll.ts +1032 -1025
  61. package/src/StkTable/useWheeling.ts +23 -23
  62. package/src/StkTable/utils/constRefUtils.ts +29 -29
  63. package/src/StkTable/utils/index.ts +331 -331
  64. package/src/StkTable/utils/rowHeightFenwickTree.ts +74 -74
  65. package/src/StkTable/utils/useTriggerRef.ts +33 -33
  66. package/src/VirtualTree.vue +622 -622
  67. package/src/VirtualTreeSelect.vue +367 -367
  68. package/src/vite-env.d.ts +10 -10
@@ -1,114 +1,114 @@
1
- import { ComputedRef, Ref, ShallowRef, onBeforeUnmount, onMounted, watch } from 'vue';
2
- import { AreaSelectionConfig, StkTableColumn } from './types';
3
- import { VirtualScrollStore, VirtualScrollXStore } from './useVirtualScroll';
4
-
5
- /** 翻页按键 */
6
- const ScrollCodes = {
7
- ArrowUp: 'ArrowUp',
8
- ArrowRight: 'ArrowRight',
9
- ArrowDown: 'ArrowDown',
10
- ArrowLeft: 'ArrowLeft',
11
- PageUp: 'PageUp',
12
- PageDown: 'PageDown',
13
- Home: 'Home',
14
- End: 'End',
15
- } as const;
16
-
17
- type ScrollCodes = (typeof ScrollCodes)[keyof typeof ScrollCodes];
18
-
19
- /** 所有翻页按键数组 */
20
- const ScrollCodesValues = Object.values(ScrollCodes);
21
-
22
- /**
23
- * 按下键盘箭头滚动。只有悬浮在表体上才能生效键盘。
24
- *
25
- * 在低版本浏览器中,虚拟滚动时,使用键盘滚动,等选中的行消失在视口外时,滚动会失效。
26
- */
27
- export function useKeyboardArrowScroll<DT extends Record<string, any>>(
28
- targetElement: Ref<HTMLElement | undefined>,
29
- props: any,
30
- scrollTo: (y: number | null, x: number | null) => void,
31
- virtualScroll: Ref<VirtualScrollStore>,
32
- virtualScrollX: Ref<VirtualScrollXStore>,
33
- tableHeaders: ShallowRef<StkTableColumn<DT>[][]>,
34
- virtual_on: ComputedRef<boolean>,
35
- areaSelectionConfig: ComputedRef<AreaSelectionConfig>,
36
- ) {
37
- /** 检测鼠标是否悬浮在表格体上 */
38
- let isMouseOver = false;
39
- watch(virtual_on, val => {
40
- removeListeners();
41
- if (val) {
42
- addEventListeners();
43
- }
44
- });
45
-
46
- onMounted(addEventListeners);
47
-
48
- onBeforeUnmount(removeListeners);
49
-
50
- function addEventListeners() {
51
- window.addEventListener('keydown', handleKeydown);
52
- targetElement.value?.addEventListener('mouseenter', handleMouseEnter);
53
- targetElement.value?.addEventListener('mouseleave', handleMouseLeave);
54
- targetElement.value?.addEventListener('mousedown', handleMouseDown);
55
- }
56
-
57
- function removeListeners() {
58
- window.removeEventListener('keydown', handleKeydown);
59
- targetElement.value?.removeEventListener('mouseenter', handleMouseEnter);
60
- targetElement.value?.removeEventListener('mouseleave', handleMouseLeave);
61
- targetElement.value?.removeEventListener('mousedown', handleMouseDown);
62
- }
63
-
64
- /** 键盘按下事件 */
65
- function handleKeydown(e: KeyboardEvent) {
66
- if (!virtual_on.value) return; // 非虚拟滚动使用浏览器默认滚动
67
- // 如果单元格选区键盘控制已启用,则不处理滚动,交给 useAreaSelection 处理
68
- if (areaSelectionConfig.value.keyboard) return;
69
- const keyCode = e.code;
70
- if (!ScrollCodesValues.includes(keyCode as any)) return;
71
- if (!isMouseOver) return; // 不悬浮还是要触发键盘事件的
72
- e.preventDefault(); // 不触发键盘默认的箭头事件
73
-
74
- const { scrollTop, rowHeight, containerHeight, scrollHeight } = virtualScroll.value;
75
- const { scrollLeft } = virtualScrollX.value;
76
- const { headless, headerRowHeight } = props;
77
-
78
- // 这里不用virtualScroll 中的pageSize,因为我需要上一页的最后一条放在下一页的第一条
79
- const headerHeight = headless ? 0 : tableHeaders.value.length * (headerRowHeight || rowHeight);
80
- /** 表体的page */
81
- const bodyPageSize = Math.floor((containerHeight - headerHeight) / rowHeight);
82
- if (keyCode === ScrollCodes.ArrowUp) {
83
- scrollTo(scrollTop - rowHeight, null);
84
- } else if (keyCode === ScrollCodes.ArrowRight) {
85
- scrollTo(null, scrollLeft + 50);
86
- } else if (keyCode === ScrollCodes.ArrowDown) {
87
- scrollTo(scrollTop + rowHeight, null);
88
- } else if (keyCode === ScrollCodes.ArrowLeft) {
89
- scrollTo(null, scrollLeft - 50);
90
- } else if (keyCode === ScrollCodes.PageUp) {
91
- scrollTo(scrollTop - rowHeight * bodyPageSize + headerHeight, null);
92
- } else if (keyCode === ScrollCodes.PageDown) {
93
- scrollTo(scrollTop + rowHeight * bodyPageSize - headerHeight, null);
94
- } else if (keyCode === ScrollCodes.Home) {
95
- scrollTo(0, null);
96
- } else if (keyCode === ScrollCodes.End) {
97
- scrollTo(scrollHeight, null);
98
- }
99
- }
100
-
101
- function handleMouseEnter() {
102
- isMouseOver = true;
103
- }
104
- function handleMouseLeave() {
105
- isMouseOver = false;
106
- }
107
- /**
108
- * 兜底。
109
- * 是否存在不触发mouseEnter的时候?
110
- */
111
- function handleMouseDown() {
112
- if (!isMouseOver) isMouseOver = true;
113
- }
114
- }
1
+ import { ComputedRef, Ref, ShallowRef, onBeforeUnmount, onMounted, watch } from 'vue';
2
+ import { AreaSelectionConfig, StkTableColumn } from './types';
3
+ import { VirtualScrollStore, VirtualScrollXStore } from './useVirtualScroll';
4
+
5
+ /** 翻页按键 */
6
+ const ScrollCodes = {
7
+ ArrowUp: 'ArrowUp',
8
+ ArrowRight: 'ArrowRight',
9
+ ArrowDown: 'ArrowDown',
10
+ ArrowLeft: 'ArrowLeft',
11
+ PageUp: 'PageUp',
12
+ PageDown: 'PageDown',
13
+ Home: 'Home',
14
+ End: 'End',
15
+ } as const;
16
+
17
+ type ScrollCodes = (typeof ScrollCodes)[keyof typeof ScrollCodes];
18
+
19
+ /** 所有翻页按键数组 */
20
+ const ScrollCodesValues = Object.values(ScrollCodes);
21
+
22
+ /**
23
+ * 按下键盘箭头滚动。只有悬浮在表体上才能生效键盘。
24
+ *
25
+ * 在低版本浏览器中,虚拟滚动时,使用键盘滚动,等选中的行消失在视口外时,滚动会失效。
26
+ */
27
+ export function useKeyboardArrowScroll<DT extends Record<string, any>>(
28
+ targetElement: Ref<HTMLElement | undefined>,
29
+ props: any,
30
+ scrollTo: (y: number | null, x: number | null) => void,
31
+ virtualScroll: Ref<VirtualScrollStore>,
32
+ virtualScrollX: Ref<VirtualScrollXStore>,
33
+ tableHeaders: ShallowRef<StkTableColumn<DT>[][]>,
34
+ virtual_on: ComputedRef<boolean>,
35
+ areaSelectionConfig: ComputedRef<AreaSelectionConfig>,
36
+ ) {
37
+ /** 检测鼠标是否悬浮在表格体上 */
38
+ let isMouseOver = false;
39
+ watch(virtual_on, val => {
40
+ removeListeners();
41
+ if (val) {
42
+ addEventListeners();
43
+ }
44
+ });
45
+
46
+ onMounted(addEventListeners);
47
+
48
+ onBeforeUnmount(removeListeners);
49
+
50
+ function addEventListeners() {
51
+ window.addEventListener('keydown', handleKeydown);
52
+ targetElement.value?.addEventListener('mouseenter', handleMouseEnter);
53
+ targetElement.value?.addEventListener('mouseleave', handleMouseLeave);
54
+ targetElement.value?.addEventListener('mousedown', handleMouseDown);
55
+ }
56
+
57
+ function removeListeners() {
58
+ window.removeEventListener('keydown', handleKeydown);
59
+ targetElement.value?.removeEventListener('mouseenter', handleMouseEnter);
60
+ targetElement.value?.removeEventListener('mouseleave', handleMouseLeave);
61
+ targetElement.value?.removeEventListener('mousedown', handleMouseDown);
62
+ }
63
+
64
+ /** 键盘按下事件 */
65
+ function handleKeydown(e: KeyboardEvent) {
66
+ if (!virtual_on.value) return; // 非虚拟滚动使用浏览器默认滚动
67
+ // 如果单元格选区键盘控制已启用,则不处理滚动,交给 useAreaSelection 处理
68
+ if (areaSelectionConfig.value.keyboard) return;
69
+ const keyCode = e.code;
70
+ if (!ScrollCodesValues.includes(keyCode as any)) return;
71
+ if (!isMouseOver) return; // 不悬浮还是要触发键盘事件的
72
+ e.preventDefault(); // 不触发键盘默认的箭头事件
73
+
74
+ const { scrollTop, rowHeight, containerHeight, scrollHeight } = virtualScroll.value;
75
+ const { scrollLeft } = virtualScrollX.value;
76
+ const { headless, headerRowHeight } = props;
77
+
78
+ // 这里不用virtualScroll 中的pageSize,因为我需要上一页的最后一条放在下一页的第一条
79
+ const headerHeight = headless ? 0 : tableHeaders.value.length * (headerRowHeight || rowHeight);
80
+ /** 表体的page */
81
+ const bodyPageSize = Math.floor((containerHeight - headerHeight) / rowHeight);
82
+ if (keyCode === ScrollCodes.ArrowUp) {
83
+ scrollTo(scrollTop - rowHeight, null);
84
+ } else if (keyCode === ScrollCodes.ArrowRight) {
85
+ scrollTo(null, scrollLeft + 50);
86
+ } else if (keyCode === ScrollCodes.ArrowDown) {
87
+ scrollTo(scrollTop + rowHeight, null);
88
+ } else if (keyCode === ScrollCodes.ArrowLeft) {
89
+ scrollTo(null, scrollLeft - 50);
90
+ } else if (keyCode === ScrollCodes.PageUp) {
91
+ scrollTo(scrollTop - rowHeight * bodyPageSize + headerHeight, null);
92
+ } else if (keyCode === ScrollCodes.PageDown) {
93
+ scrollTo(scrollTop + rowHeight * bodyPageSize - headerHeight, null);
94
+ } else if (keyCode === ScrollCodes.Home) {
95
+ scrollTo(0, null);
96
+ } else if (keyCode === ScrollCodes.End) {
97
+ scrollTo(scrollHeight, null);
98
+ }
99
+ }
100
+
101
+ function handleMouseEnter() {
102
+ isMouseOver = true;
103
+ }
104
+ function handleMouseLeave() {
105
+ isMouseOver = false;
106
+ }
107
+ /**
108
+ * 兜底。
109
+ * 是否存在不触发mouseEnter的时候?
110
+ */
111
+ function handleMouseDown() {
112
+ if (!isMouseOver) isMouseOver = true;
113
+ }
114
+ }
@@ -1,60 +1,60 @@
1
- import { ShallowRef } from 'vue';
2
- import { PrivateStkTableColumn, RowKeyGen, UniqKey } from './types';
3
-
4
- export function useMaxRowSpan(
5
- props: any,
6
- tableHeaderLast: ShallowRef<PrivateStkTableColumn<any>[]>,
7
- rowKeyGen: RowKeyGen,
8
- dataSourceCopy: ShallowRef<any[]>,
9
- ) {
10
- /** max rowspan of each row */
11
- const maxRowSpan = new Map<UniqKey, number>();
12
-
13
- /** 全局最大 rowspan:用于限定滚动时跨界修正的扫描范围(O(maxSpan) 而非 O(startIndex)) */
14
- let maxRowSpanValue = 0;
15
-
16
- /**
17
- * Use dataSourceCopy and tableHeaderLast to calculate maxRowSpan
18
- * @link {maxRowSpan}
19
- */
20
- function updateMaxRowSpan() {
21
- if (!props.virtual) {
22
- if (maxRowSpan.size) maxRowSpan.clear();
23
- maxRowSpanValue = 0;
24
- return;
25
- }
26
- maxRowSpan.clear();
27
- maxRowSpanValue = 0;
28
-
29
- const data = dataSourceCopy.value;
30
- const columns = tableHeaderLast.value;
31
-
32
- // 收集带 mergeCells 的列及其真实列索引(保证 colIndex 入参与其他调用处一致)
33
- const columnsWithMerge: { col: PrivateStkTableColumn<any>; index: number }[] = [];
34
- for (let i = 0; i < columns.length; i++) {
35
- if (columns[i].mergeCells) columnsWithMerge.push({ col: columns[i], index: i });
36
- }
37
- if (!columnsWithMerge.length) return;
38
-
39
- const dataLength = data.length;
40
- const mergeColumnsLength = columnsWithMerge.length;
41
-
42
- for (let rowIndex = 0; rowIndex < dataLength; rowIndex++) {
43
- const row = data[rowIndex];
44
- const rowKey = rowKeyGen(row);
45
- let currentMax = maxRowSpan.get(rowKey) || 0;
46
-
47
- for (let colIndex = 0; colIndex < mergeColumnsLength; colIndex++) {
48
- const { col, index } = columnsWithMerge[colIndex];
49
- const { rowspan = 1 } = col.mergeCells!({ row, col, rowIndex, colIndex: index }) || {};
50
-
51
- if (rowspan > 1 && rowspan > currentMax) {
52
- currentMax = rowspan;
53
- maxRowSpan.set(rowKey, currentMax);
54
- if (rowspan > maxRowSpanValue) maxRowSpanValue = rowspan;
55
- }
56
- }
57
- }
58
- }
59
- return [maxRowSpan, updateMaxRowSpan, () => maxRowSpanValue] as const;
60
- }
1
+ import { ShallowRef } from 'vue';
2
+ import { PrivateStkTableColumn, RowKeyGen, UniqKey } from './types';
3
+
4
+ export function useMaxRowSpan(
5
+ props: any,
6
+ tableHeaderLast: ShallowRef<PrivateStkTableColumn<any>[]>,
7
+ rowKeyGen: RowKeyGen,
8
+ dataSourceCopy: ShallowRef<any[]>,
9
+ ) {
10
+ /** max rowspan of each row */
11
+ const maxRowSpan = new Map<UniqKey, number>();
12
+
13
+ /** 全局最大 rowspan:用于限定滚动时跨界修正的扫描范围(O(maxSpan) 而非 O(startIndex)) */
14
+ let maxRowSpanValue = 0;
15
+
16
+ /**
17
+ * Use dataSourceCopy and tableHeaderLast to calculate maxRowSpan
18
+ * @link {maxRowSpan}
19
+ */
20
+ function updateMaxRowSpan() {
21
+ if (!props.virtual) {
22
+ if (maxRowSpan.size) maxRowSpan.clear();
23
+ maxRowSpanValue = 0;
24
+ return;
25
+ }
26
+ maxRowSpan.clear();
27
+ maxRowSpanValue = 0;
28
+
29
+ const data = dataSourceCopy.value;
30
+ const columns = tableHeaderLast.value;
31
+
32
+ // 收集带 mergeCells 的列及其真实列索引(保证 colIndex 入参与其他调用处一致)
33
+ const columnsWithMerge: { col: PrivateStkTableColumn<any>; index: number }[] = [];
34
+ for (let i = 0; i < columns.length; i++) {
35
+ if (columns[i].mergeCells) columnsWithMerge.push({ col: columns[i], index: i });
36
+ }
37
+ if (!columnsWithMerge.length) return;
38
+
39
+ const dataLength = data.length;
40
+ const mergeColumnsLength = columnsWithMerge.length;
41
+
42
+ for (let rowIndex = 0; rowIndex < dataLength; rowIndex++) {
43
+ const row = data[rowIndex];
44
+ const rowKey = rowKeyGen(row);
45
+ let currentMax = maxRowSpan.get(rowKey) || 0;
46
+
47
+ for (let colIndex = 0; colIndex < mergeColumnsLength; colIndex++) {
48
+ const { col, index } = columnsWithMerge[colIndex];
49
+ const { rowspan = 1 } = col.mergeCells!({ row, col, rowIndex, colIndex: index }) || {};
50
+
51
+ if (rowspan > 1 && rowspan > currentMax) {
52
+ currentMax = rowspan;
53
+ maxRowSpan.set(rowKey, currentMax);
54
+ if (rowspan > maxRowSpanValue) maxRowSpanValue = rowspan;
55
+ }
56
+ }
57
+ }
58
+ }
59
+ return [maxRowSpan, updateMaxRowSpan, () => maxRowSpanValue] as const;
60
+ }