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.
- package/README.md +194 -194
- package/lib/{Dropdown-D_9cB0rD.js → Dropdown-BAANgg_5.js} +2 -2
- package/lib/{StkTable-CVcmlZi9.js → StkTable-CGcxwpdb.js} +22 -6
- package/lib/src/StkTable/StkTable.vue.d.ts +18 -4
- package/lib/src/StkTable/types/index.d.ts +4 -1
- package/lib/src/StkTable/useVirtualScroll.d.ts +6 -1
- package/lib/stk-table-vue.js +3 -3
- package/lib/style.css +1 -1
- package/package.json +93 -93
- package/src/StkTable/StkTable.vue +2362 -2338
- package/src/StkTable/components/DragHandle.vue +9 -9
- package/src/StkTable/components/SortIcon.vue +6 -6
- package/src/StkTable/components/TreeNodeCell.vue +19 -19
- package/src/StkTable/components/TriangleIcon.vue +3 -3
- package/src/StkTable/const.ts +50 -50
- package/src/StkTable/custom-cells/ChangeCell/ChangeCell.less +34 -34
- package/src/StkTable/custom-cells/ChangeCell/createChangeCell.ts +90 -90
- package/src/StkTable/custom-cells/ChangeCell/index.ts +4 -4
- package/src/StkTable/custom-cells/CheckboxCell/CheckboxCell.less +14 -14
- package/src/StkTable/custom-cells/CheckboxCell/CheckboxCell.vue +56 -56
- package/src/StkTable/custom-cells/CheckboxCell/createCheckboxCell.ts +146 -146
- package/src/StkTable/custom-cells/CheckboxCell/index.ts +5 -5
- package/src/StkTable/custom-cells/FilterCell/Dropdown/index.ts +16 -16
- package/src/StkTable/custom-cells/FilterCell/Dropdown/index.vue +186 -186
- package/src/StkTable/custom-cells/FilterCell/Filter.less +118 -118
- package/src/StkTable/custom-cells/FilterCell/Filter.vue +66 -66
- package/src/StkTable/custom-cells/FilterCell/createFilterCell.ts +120 -120
- package/src/StkTable/custom-cells/FilterCell/index.ts +6 -6
- package/src/StkTable/custom-cells/FilterCell/types.ts +43 -43
- package/src/StkTable/custom-cells/NumberCell/createNumberCell.ts +43 -43
- package/src/StkTable/custom-cells/NumberCell/index.ts +2 -2
- package/src/StkTable/custom-cells/utils/formatNumber.ts +137 -137
- package/src/StkTable/features/const.ts +1 -1
- package/src/StkTable/features/index.ts +1 -1
- package/src/StkTable/features/useAreaSelection.ts +1240 -1239
- package/src/StkTable/index.ts +20 -20
- package/src/StkTable/mergeCellsCache.ts +69 -69
- package/src/StkTable/registerFeature.ts +40 -40
- package/src/StkTable/style.less +791 -791
- package/src/StkTable/types/highlightDimOptions.ts +28 -28
- package/src/StkTable/types/index.ts +503 -500
- package/src/StkTable/useAutoResize.ts +87 -87
- package/src/StkTable/useColResize.ts +202 -202
- package/src/StkTable/useFixedCol.ts +168 -168
- package/src/StkTable/useFixedStyle.ts +75 -75
- package/src/StkTable/useGetFixedColPosition.ts +63 -63
- package/src/StkTable/useHighlight.ts +270 -270
- package/src/StkTable/useIndexResolver.ts +29 -29
- package/src/StkTable/useKeyboardArrowScroll.ts +114 -114
- package/src/StkTable/useMaxRowSpan.ts +60 -60
- package/src/StkTable/useMergeCells.ts +541 -541
- package/src/StkTable/useRowExpand.ts +81 -81
- package/src/StkTable/useScrollRowByRow.ts +96 -96
- package/src/StkTable/useScrollbar.ts +177 -177
- package/src/StkTable/useSorter.ts +267 -267
- package/src/StkTable/useTableColumns.ts +142 -142
- package/src/StkTable/useThDrag.ts +94 -94
- package/src/StkTable/useTrDrag.ts +100 -100
- package/src/StkTable/useTree.ts +253 -253
- package/src/StkTable/useVirtualScroll.ts +1032 -1025
- package/src/StkTable/useWheeling.ts +23 -23
- package/src/StkTable/utils/constRefUtils.ts +29 -29
- package/src/StkTable/utils/index.ts +331 -331
- package/src/StkTable/utils/rowHeightFenwickTree.ts +74 -74
- package/src/StkTable/utils/useTriggerRef.ts +33 -33
- package/src/VirtualTree.vue +622 -622
- package/src/VirtualTreeSelect.vue +367 -367
- package/src/vite-env.d.ts +10 -10
package/src/StkTable/index.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
export { useAreaSelection } from './features/index';
|
|
2
|
-
export { registerFeature } from './registerFeature';
|
|
3
|
-
export { default as StkTable } from './StkTable.vue';
|
|
4
|
-
export type { AreaSelectionRange, Order, ScrollAxisTarget, ScrollToFn, ScrollToOptions, SortConfig, SortOption, SortState, StkTableColumn } from './types/index';
|
|
5
|
-
export { binarySearch, insertToOrderedArray, strCompare, tableSort } from './utils';
|
|
6
|
-
// export custom cells
|
|
7
|
-
export { createFilterCell } from './custom-cells/FilterCell/index';
|
|
8
|
-
export type { CreateFilterCellOption, FilterStatus } from './custom-cells/FilterCell/index';
|
|
9
|
-
export { createEditableCell } from './custom-cells/EditableCell/index';
|
|
10
|
-
export type { CreateEditableCellOptions } from './custom-cells/EditableCell/index';
|
|
11
|
-
export { createCheckboxCell } from './custom-cells/CheckboxCell/index';
|
|
12
|
-
export type { createCheckboxCellOptions } from './custom-cells/CheckboxCell/index';
|
|
13
|
-
export { createNumberCell } from './custom-cells/NumberCell/index';
|
|
14
|
-
export type { CreateNumberCellOptions } from './custom-cells/NumberCell/index';
|
|
15
|
-
export { createChangeCell } from './custom-cells/ChangeCell/index';
|
|
16
|
-
export type { CreateChangeCellOptions } from './custom-cells/ChangeCell/index';
|
|
17
|
-
export { formatNumber } from './custom-cells/utils/formatNumber';
|
|
18
|
-
export type { FormatNumberOptions } from './custom-cells/utils/formatNumber';
|
|
19
|
-
|
|
20
|
-
import './style.less';
|
|
1
|
+
export { useAreaSelection } from './features/index';
|
|
2
|
+
export { registerFeature } from './registerFeature';
|
|
3
|
+
export { default as StkTable } from './StkTable.vue';
|
|
4
|
+
export type { AreaSelectionRange, Order, ScrollAxisTarget, ScrollToFn, ScrollToOptions, SortConfig, SortOption, SortState, StkTableColumn } from './types/index';
|
|
5
|
+
export { binarySearch, insertToOrderedArray, strCompare, tableSort } from './utils';
|
|
6
|
+
// export custom cells
|
|
7
|
+
export { createFilterCell } from './custom-cells/FilterCell/index';
|
|
8
|
+
export type { CreateFilterCellOption, FilterStatus } from './custom-cells/FilterCell/index';
|
|
9
|
+
export { createEditableCell } from './custom-cells/EditableCell/index';
|
|
10
|
+
export type { CreateEditableCellOptions } from './custom-cells/EditableCell/index';
|
|
11
|
+
export { createCheckboxCell } from './custom-cells/CheckboxCell/index';
|
|
12
|
+
export type { createCheckboxCellOptions } from './custom-cells/CheckboxCell/index';
|
|
13
|
+
export { createNumberCell } from './custom-cells/NumberCell/index';
|
|
14
|
+
export type { CreateNumberCellOptions } from './custom-cells/NumberCell/index';
|
|
15
|
+
export { createChangeCell } from './custom-cells/ChangeCell/index';
|
|
16
|
+
export type { CreateChangeCellOptions } from './custom-cells/ChangeCell/index';
|
|
17
|
+
export { formatNumber } from './custom-cells/utils/formatNumber';
|
|
18
|
+
export type { FormatNumberOptions } from './custom-cells/utils/formatNumber';
|
|
19
|
+
|
|
20
|
+
import './style.less';
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
import { MergeCellsParam } from './types';
|
|
2
|
-
|
|
3
|
-
/** mergeCells 计算结果 */
|
|
4
|
-
export type MergeCellsResult = { colspan: number; rowspan: number };
|
|
5
|
-
/** 缓存条目:额外保存行引用,用于校验缓存是否仍对应当前行数据 */
|
|
6
|
-
type MergeCellsCacheEntry = MergeCellsResult & { row: MergeCellsParam<any>['row'] };
|
|
7
|
-
|
|
8
|
-
/** 无合并时的默认结果(只读共享,调用方均只解构读取) */
|
|
9
|
-
const DEFAULT_RESULT: MergeCellsResult = { colspan: 1, rowspan: 1 };
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* 缓存键编码为数字:绝对行索引 * 0x10000 + 叶子列索引。
|
|
13
|
-
* 相比字符串键更省内存、查询更快(列数不可能超过 0x10000)。
|
|
14
|
-
*/
|
|
15
|
-
const COL_INDEX_BASE = 0x10000;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* mergeCells 结果缓存工厂。
|
|
19
|
-
*
|
|
20
|
-
* - 缓存键为「绝对行索引 + 叶子列索引」,所有 mergeCells 调用处
|
|
21
|
-
* (hiddenCellMap 构建、virtual-x 可视列范围修正、视口上方占位计算、单元格渲染)共享,
|
|
22
|
-
* 同一单元格只调用一次用户回调;
|
|
23
|
-
* - 缓存可跨虚拟滚动帧复用(键为绝对索引,不随窗口滑动变化),
|
|
24
|
-
* 稳态滚动时仅新进入窗口的行会触发回调,只需在数据/列真正变化时 clear;
|
|
25
|
-
* - 条目额外保存行引用并在命中时校验同一性:即使数据被重排/替换(如排序后同一批行对象
|
|
26
|
-
* 顺序变化),也不会取到错行的旧结果,缓存清理时机不再影响正确性。
|
|
27
|
-
* - 注意:引用同一性校验无法感知行字段被原地修改(行引用不变)。
|
|
28
|
-
* 业务原地改行且 mergeCells 结果依赖该字段时,需调用 clear() 显式失效
|
|
29
|
-
* (组件已暴露 clearMergeCellsCache 实例方法)。
|
|
30
|
-
*/
|
|
31
|
-
export function createMergeCellsCache() {
|
|
32
|
-
const cache = new Map<number, MergeCellsCacheEntry>();
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* 获取(必要时计算并缓存)mergeCells 结果
|
|
36
|
-
* @param row 行数据
|
|
37
|
-
* @param col 列配置
|
|
38
|
-
* @param rowIndex 绝对行索引
|
|
39
|
-
* @param colIndex 叶子列索引
|
|
40
|
-
*/
|
|
41
|
-
function getMergeCellsResult(
|
|
42
|
-
row: MergeCellsParam<any>['row'],
|
|
43
|
-
col: MergeCellsParam<any>['col'],
|
|
44
|
-
rowIndex: number,
|
|
45
|
-
colIndex: number,
|
|
46
|
-
): MergeCellsResult {
|
|
47
|
-
if (!col.mergeCells) return DEFAULT_RESULT;
|
|
48
|
-
|
|
49
|
-
const cacheKey = rowIndex * COL_INDEX_BASE + colIndex;
|
|
50
|
-
const cached = cache.get(cacheKey);
|
|
51
|
-
if (cached && cached.row === row) return cached;
|
|
52
|
-
|
|
53
|
-
let { colspan = 1, rowspan = 1 } = col.mergeCells({ row, col, rowIndex, colIndex }) || {};
|
|
54
|
-
colspan = colspan || 1;
|
|
55
|
-
rowspan = rowspan || 1;
|
|
56
|
-
const entry: MergeCellsCacheEntry = { row, colspan, rowspan };
|
|
57
|
-
cache.set(cacheKey, entry);
|
|
58
|
-
return entry;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** 清空缓存(数据/列变化时自动调用;行字段被原地修改时需显式调用以强制重算) */
|
|
62
|
-
function clear() {
|
|
63
|
-
cache.clear();
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return { getMergeCellsResult, clear };
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export type MergeCellsCache = ReturnType<typeof createMergeCellsCache>;
|
|
1
|
+
import { MergeCellsParam } from './types';
|
|
2
|
+
|
|
3
|
+
/** mergeCells 计算结果 */
|
|
4
|
+
export type MergeCellsResult = { colspan: number; rowspan: number };
|
|
5
|
+
/** 缓存条目:额外保存行引用,用于校验缓存是否仍对应当前行数据 */
|
|
6
|
+
type MergeCellsCacheEntry = MergeCellsResult & { row: MergeCellsParam<any>['row'] };
|
|
7
|
+
|
|
8
|
+
/** 无合并时的默认结果(只读共享,调用方均只解构读取) */
|
|
9
|
+
const DEFAULT_RESULT: MergeCellsResult = { colspan: 1, rowspan: 1 };
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 缓存键编码为数字:绝对行索引 * 0x10000 + 叶子列索引。
|
|
13
|
+
* 相比字符串键更省内存、查询更快(列数不可能超过 0x10000)。
|
|
14
|
+
*/
|
|
15
|
+
const COL_INDEX_BASE = 0x10000;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* mergeCells 结果缓存工厂。
|
|
19
|
+
*
|
|
20
|
+
* - 缓存键为「绝对行索引 + 叶子列索引」,所有 mergeCells 调用处
|
|
21
|
+
* (hiddenCellMap 构建、virtual-x 可视列范围修正、视口上方占位计算、单元格渲染)共享,
|
|
22
|
+
* 同一单元格只调用一次用户回调;
|
|
23
|
+
* - 缓存可跨虚拟滚动帧复用(键为绝对索引,不随窗口滑动变化),
|
|
24
|
+
* 稳态滚动时仅新进入窗口的行会触发回调,只需在数据/列真正变化时 clear;
|
|
25
|
+
* - 条目额外保存行引用并在命中时校验同一性:即使数据被重排/替换(如排序后同一批行对象
|
|
26
|
+
* 顺序变化),也不会取到错行的旧结果,缓存清理时机不再影响正确性。
|
|
27
|
+
* - 注意:引用同一性校验无法感知行字段被原地修改(行引用不变)。
|
|
28
|
+
* 业务原地改行且 mergeCells 结果依赖该字段时,需调用 clear() 显式失效
|
|
29
|
+
* (组件已暴露 clearMergeCellsCache 实例方法)。
|
|
30
|
+
*/
|
|
31
|
+
export function createMergeCellsCache() {
|
|
32
|
+
const cache = new Map<number, MergeCellsCacheEntry>();
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 获取(必要时计算并缓存)mergeCells 结果
|
|
36
|
+
* @param row 行数据
|
|
37
|
+
* @param col 列配置
|
|
38
|
+
* @param rowIndex 绝对行索引
|
|
39
|
+
* @param colIndex 叶子列索引
|
|
40
|
+
*/
|
|
41
|
+
function getMergeCellsResult(
|
|
42
|
+
row: MergeCellsParam<any>['row'],
|
|
43
|
+
col: MergeCellsParam<any>['col'],
|
|
44
|
+
rowIndex: number,
|
|
45
|
+
colIndex: number,
|
|
46
|
+
): MergeCellsResult {
|
|
47
|
+
if (!col.mergeCells) return DEFAULT_RESULT;
|
|
48
|
+
|
|
49
|
+
const cacheKey = rowIndex * COL_INDEX_BASE + colIndex;
|
|
50
|
+
const cached = cache.get(cacheKey);
|
|
51
|
+
if (cached && cached.row === row) return cached;
|
|
52
|
+
|
|
53
|
+
let { colspan = 1, rowspan = 1 } = col.mergeCells({ row, col, rowIndex, colIndex }) || {};
|
|
54
|
+
colspan = colspan || 1;
|
|
55
|
+
rowspan = rowspan || 1;
|
|
56
|
+
const entry: MergeCellsCacheEntry = { row, colspan, rowspan };
|
|
57
|
+
cache.set(cacheKey, entry);
|
|
58
|
+
return entry;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** 清空缓存(数据/列变化时自动调用;行字段被原地修改时需显式调用以强制重算) */
|
|
62
|
+
function clear() {
|
|
63
|
+
cache.clear();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return { getMergeCellsResult, clear };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export type MergeCellsCache = ReturnType<typeof createMergeCellsCache>;
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import { computed, ref } from 'vue';
|
|
2
|
-
import { useAreaSelection, useAreaSelectionName } from './features';
|
|
3
|
-
import { MY_FN_NAME } from './features/const';
|
|
4
|
-
|
|
5
|
-
type OnDemandFeature = {
|
|
6
|
-
[useAreaSelectionName]: typeof useAreaSelection<any>;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
export const ON_DEMAND_FEATURE: OnDemandFeature = {
|
|
10
|
-
[useAreaSelectionName]: (props => {
|
|
11
|
-
if ('useAreaSelection' in props) {
|
|
12
|
-
console.warn('useAreaSelection is not registered');
|
|
13
|
-
}
|
|
14
|
-
return {
|
|
15
|
-
config: computed(() => ({ enabled: false })),
|
|
16
|
-
isSelecting: ref(false),
|
|
17
|
-
onMD: () => {},
|
|
18
|
-
// getClass: () => [],
|
|
19
|
-
// getRowClass: () => [],
|
|
20
|
-
get: () => ({ rows: [], cols: [], ranges: [] }),
|
|
21
|
-
set: () => [],
|
|
22
|
-
clear: () => {},
|
|
23
|
-
copy: () => '',
|
|
24
|
-
};
|
|
25
|
-
}) as typeof useAreaSelection<any>,
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
type Feature = OnDemandFeature[keyof OnDemandFeature];
|
|
29
|
-
|
|
30
|
-
export function registerFeature(feature: Feature | Feature[]) {
|
|
31
|
-
const features = Array.isArray(feature) ? feature : [feature];
|
|
32
|
-
features.forEach(f => {
|
|
33
|
-
const fnName = (f as any)[MY_FN_NAME];
|
|
34
|
-
if (!fnName) {
|
|
35
|
-
console.warn('invalid feature');
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
(ON_DEMAND_FEATURE as any)[fnName] = f as any;
|
|
39
|
-
});
|
|
40
|
-
}
|
|
1
|
+
import { computed, ref } from 'vue';
|
|
2
|
+
import { useAreaSelection, useAreaSelectionName } from './features';
|
|
3
|
+
import { MY_FN_NAME } from './features/const';
|
|
4
|
+
|
|
5
|
+
type OnDemandFeature = {
|
|
6
|
+
[useAreaSelectionName]: typeof useAreaSelection<any>;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const ON_DEMAND_FEATURE: OnDemandFeature = {
|
|
10
|
+
[useAreaSelectionName]: (props => {
|
|
11
|
+
if ('useAreaSelection' in props) {
|
|
12
|
+
console.warn('useAreaSelection is not registered');
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
config: computed(() => ({ enabled: false })),
|
|
16
|
+
isSelecting: ref(false),
|
|
17
|
+
onMD: () => {},
|
|
18
|
+
// getClass: () => [],
|
|
19
|
+
// getRowClass: () => [],
|
|
20
|
+
get: () => ({ rows: [], cols: [], ranges: [] }),
|
|
21
|
+
set: () => [],
|
|
22
|
+
clear: () => {},
|
|
23
|
+
copy: () => '',
|
|
24
|
+
};
|
|
25
|
+
}) as typeof useAreaSelection<any>,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
type Feature = OnDemandFeature[keyof OnDemandFeature];
|
|
29
|
+
|
|
30
|
+
export function registerFeature(feature: Feature | Feature[]) {
|
|
31
|
+
const features = Array.isArray(feature) ? feature : [feature];
|
|
32
|
+
features.forEach(f => {
|
|
33
|
+
const fnName = (f as any)[MY_FN_NAME];
|
|
34
|
+
if (!fnName) {
|
|
35
|
+
console.warn('invalid feature');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
(ON_DEMAND_FEATURE as any)[fnName] = f as any;
|
|
39
|
+
});
|
|
40
|
+
}
|