stk-table-vue 0.0.1-beta.1
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 +136 -0
- package/lib/StkTable/StkTable.vue.d.ts +169 -0
- package/lib/StkTable/const.d.ts +20 -0
- package/lib/StkTable/index.d.ts +2 -0
- package/lib/StkTable/types/index.d.ts +82 -0
- package/lib/StkTable/useColResize.d.ts +18 -0
- package/lib/StkTable/useThDrag.d.ts +14 -0
- package/lib/StkTable/useVirtualScroll.d.ts +35 -0
- package/lib/StkTable/utils.d.ts +23 -0
- package/lib/StkTableC/store.d.ts +12 -0
- package/lib/stk-table-vue.js +1054 -0
- package/lib/style.css +225 -0
- package/package.json +56 -0
- package/src/StkTable/StkTable.vue +1042 -0
- package/src/StkTable/const.ts +26 -0
- package/src/StkTable/index.ts +2 -0
- package/src/StkTable/types/index.ts +109 -0
- package/src/StkTable/useColResize.ts +172 -0
- package/src/StkTable/useHighlight.ts +150 -0
- package/src/StkTable/useThDrag.ts +43 -0
- package/src/StkTable/useVirtualScroll.ts +186 -0
- package/src/StkTable/utils.ts +132 -0
- package/src/StkTable.d.ts +17 -0
- package/src/StkTable.vue +1686 -0
- package/src/StkTableC/index.vue +193 -0
- package/src/StkTableC/store.js +6 -0
- package/src/StkTable_compatible.vue +590 -0
- package/src/VirtualTree.vue +617 -0
- package/src/VirtualTreeSelect.vue +338 -0
- package/src/images/sort-btn.svg +7 -0
- package/src/vite-env.d.ts +5 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { SortOption, SortState, StkTableColumn } from './types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 对有序数组插入新数据
|
|
5
|
+
* @param {object} sortState
|
|
6
|
+
* @param {string} sortState.dataIndex 排序的列
|
|
7
|
+
* @param {null|'asc'|'desc'} sortState.order 排序顺序
|
|
8
|
+
* @param {'number'|'string'} [sortState.sortType] 排序方式
|
|
9
|
+
* @param {object} newItem 要插入的数据
|
|
10
|
+
* @param {Array} targetArray 表格数据
|
|
11
|
+
*/
|
|
12
|
+
export function insertToOrderedArray(sortState: SortState, newItem: any, targetArray: any[]) {
|
|
13
|
+
const { dataIndex, order } = sortState;
|
|
14
|
+
let { sortType } = sortState;
|
|
15
|
+
if (!sortType) sortType = typeof newItem[dataIndex] as 'number' | 'string';
|
|
16
|
+
const data = [...targetArray];
|
|
17
|
+
if (!order) {
|
|
18
|
+
data.unshift(newItem);
|
|
19
|
+
return data;
|
|
20
|
+
}
|
|
21
|
+
// 二分插入
|
|
22
|
+
let sIndex = 0;
|
|
23
|
+
let eIndex = data.length - 1;
|
|
24
|
+
const targetVal = newItem[dataIndex];
|
|
25
|
+
while (sIndex <= eIndex) {
|
|
26
|
+
// console.log(sIndex, eIndex);
|
|
27
|
+
const midIndex = Math.floor((sIndex + eIndex) / 2);
|
|
28
|
+
const midVal = data[midIndex][dataIndex];
|
|
29
|
+
const compareRes = strCompare(midVal, targetVal, sortType);
|
|
30
|
+
if (compareRes === 0) {
|
|
31
|
+
//midVal == targetVal
|
|
32
|
+
sIndex = midIndex;
|
|
33
|
+
break;
|
|
34
|
+
} else if (compareRes === -1) {
|
|
35
|
+
// midVal < targetVal
|
|
36
|
+
if (order === 'asc') sIndex = midIndex + 1;
|
|
37
|
+
else eIndex = midIndex - 1;
|
|
38
|
+
} else {
|
|
39
|
+
//midVal > targetVal
|
|
40
|
+
if (order === 'asc') eIndex = midIndex - 1;
|
|
41
|
+
else sIndex = midIndex + 1;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
data.splice(sIndex, 0, newItem);
|
|
45
|
+
return data;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 字符串比较
|
|
49
|
+
* @param {string} a
|
|
50
|
+
* @param {string} b
|
|
51
|
+
* @param {'number'|'string'} [type] 类型
|
|
52
|
+
* @return {-1|0|1}
|
|
53
|
+
*/
|
|
54
|
+
function strCompare(a: string, b: string, type: 'number' | 'string') {
|
|
55
|
+
// if (typeof a === 'number' && typeof b === 'number') type = 'number';
|
|
56
|
+
if (type === 'number') {
|
|
57
|
+
if (+a > +b) return 1;
|
|
58
|
+
if (+a === +b) return 0;
|
|
59
|
+
if (+a < +b) return -1;
|
|
60
|
+
} else {
|
|
61
|
+
return String(a).localeCompare(b);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 表格排序抽离
|
|
67
|
+
* 可以在组件外部自己实现表格排序,组件配置remote,使表格不排序。
|
|
68
|
+
* 使用者在@sort-change事件中自行更改table props 'dataSource'完成排序。
|
|
69
|
+
* TODO: key 唯一值,排序字段相同时,根据唯一值排序。
|
|
70
|
+
* @param {SortOption} sortOption 列配置
|
|
71
|
+
* @param {string|null} order 排序方式
|
|
72
|
+
* @param {any} dataSource 排序的数组
|
|
73
|
+
*/
|
|
74
|
+
export function tableSort(sortOption: SortOption, order: string | null, dataSource: any[]) {
|
|
75
|
+
let targetDataSource = [...dataSource];
|
|
76
|
+
if (typeof sortOption.sorter === 'function') {
|
|
77
|
+
const customSorterData = sortOption.sorter(targetDataSource, { order, column: sortOption });
|
|
78
|
+
if (customSorterData) targetDataSource = customSorterData;
|
|
79
|
+
} else if (order) {
|
|
80
|
+
const sortField = sortOption.sortField || sortOption.dataIndex;
|
|
81
|
+
let { sortType } = sortOption;
|
|
82
|
+
if (!sortType) sortType = typeof dataSource[0][sortField] as 'number' | 'string';
|
|
83
|
+
|
|
84
|
+
if (sortType === 'number') {
|
|
85
|
+
// 按数字类型排序
|
|
86
|
+
const nanArr: any[] = []; // 非数字
|
|
87
|
+
const numArr: any[] = []; // 数字
|
|
88
|
+
|
|
89
|
+
for (let i = 0; i < targetDataSource.length; i++) {
|
|
90
|
+
const row = targetDataSource[i];
|
|
91
|
+
if (
|
|
92
|
+
row[sortField] === null ||
|
|
93
|
+
row[sortField] === '' ||
|
|
94
|
+
typeof row[sortField] === 'boolean' ||
|
|
95
|
+
Number.isNaN(+row[sortField])
|
|
96
|
+
) {
|
|
97
|
+
nanArr.push(row);
|
|
98
|
+
} else {
|
|
99
|
+
numArr.push(row);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// 非数字当作最小值处理
|
|
103
|
+
if (order === 'asc') {
|
|
104
|
+
numArr.sort((a, b) => +a[sortField] - +b[sortField]);
|
|
105
|
+
targetDataSource = [...nanArr, ...numArr];
|
|
106
|
+
} else {
|
|
107
|
+
numArr.sort((a, b) => +b[sortField] - +a[sortField]);
|
|
108
|
+
targetDataSource = [...numArr, ...nanArr];
|
|
109
|
+
}
|
|
110
|
+
// targetDataSource = [...numArr, ...nanArr]; // 非数字不进入排序,一直排在最后
|
|
111
|
+
} else {
|
|
112
|
+
// 按string 排序
|
|
113
|
+
if (order === 'asc') {
|
|
114
|
+
targetDataSource.sort((a, b) => String(a[sortField]).localeCompare(b[sortField]));
|
|
115
|
+
} else {
|
|
116
|
+
targetDataSource.sort((a, b) => String(a[sortField]).localeCompare(b[sortField]) * -1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return targetDataSource;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** column 的层级 */
|
|
124
|
+
export function howDeepTheColumn(arr: StkTableColumn<any>[], level = 1) {
|
|
125
|
+
const levels = [level];
|
|
126
|
+
arr.forEach(item => {
|
|
127
|
+
if (item.children?.length) {
|
|
128
|
+
levels.push(howDeepTheColumn(item.children, level + 1));
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
return Math.max(...levels);
|
|
132
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Component, VNode } from 'vue';
|
|
2
|
+
export type StkTableColumn<T> = {
|
|
3
|
+
dataIndex: keyof T;
|
|
4
|
+
title?: string;
|
|
5
|
+
align?: 'right' | 'left' | 'center';
|
|
6
|
+
headerAlign?: 'right' | 'left' | 'center';
|
|
7
|
+
sorter?: boolean | Function;
|
|
8
|
+
width?: string;
|
|
9
|
+
minWidth?: string;
|
|
10
|
+
maxWidth?: string;
|
|
11
|
+
className?: string;
|
|
12
|
+
sortField?: keyof T;
|
|
13
|
+
sortType?: 'number' | 'string';
|
|
14
|
+
fixed?: 'left' | null;
|
|
15
|
+
customCell?: Component | VNode;
|
|
16
|
+
customHeaderCell?: Component | VNode;
|
|
17
|
+
};
|