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
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 数字格式化选项
|
|
3
|
-
*
|
|
4
|
-
* NumberCell / ChangeCell 共享的格式化配置。
|
|
5
|
-
*/
|
|
6
|
-
export interface FormatNumberOptions {
|
|
7
|
-
/** 小数位数(四舍五入)。不传则不强制处理小数位 */
|
|
8
|
-
decimals?: number;
|
|
9
|
-
/** 是否使用千分位分隔符,默认 true */
|
|
10
|
-
thousands?: boolean;
|
|
11
|
-
/** 前缀,如 '¥'、'$' */
|
|
12
|
-
prefix?: string;
|
|
13
|
-
/** 后缀,如 '元'、'股' */
|
|
14
|
-
suffix?: string;
|
|
15
|
-
/** 正数是否强制显示 '+' 号,默认 false(负数始终带 '-') */
|
|
16
|
-
showSign?: boolean;
|
|
17
|
-
/** 百分比模式:值 ×100 并追加 '%',默认 false。与 abbr 互斥 */
|
|
18
|
-
percent?: boolean;
|
|
19
|
-
/** 单位缩放:'cn' = 万/亿,'en' = K/M/B。不传则不缩放。与 percent 互斥 */
|
|
20
|
-
abbr?: 'cn' | 'en';
|
|
21
|
-
/** 缩放后保留的小数位,默认 2 */
|
|
22
|
-
abbrDecimals?: number;
|
|
23
|
-
/** 空值(null/undefined/'')或非数字时的占位符,默认 '--' */
|
|
24
|
-
placeholder?: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** 缩放单位阈值表(从大到小匹配) */
|
|
28
|
-
const ABBR_UNITS: Record<'cn' | 'en', Array<[number, string]>> = {
|
|
29
|
-
cn: [
|
|
30
|
-
[1e8, '亿'],
|
|
31
|
-
[1e4, '万'],
|
|
32
|
-
],
|
|
33
|
-
en: [
|
|
34
|
-
[1e9, 'B'],
|
|
35
|
-
[1e6, 'M'],
|
|
36
|
-
[1e3, 'K'],
|
|
37
|
-
],
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* 给数字字符串的整数部分添加千分位分隔符。
|
|
42
|
-
* @param numStr 不含符号的正数字符串(可含小数部分)
|
|
43
|
-
*
|
|
44
|
-
* 用手动分组代替先读正则 `\B(?=(\d{3})+(?!\d))`:
|
|
45
|
-
* 后者在长数字上开销随位数非线性增长,且 split('.') 会额外分配数组。
|
|
46
|
-
*/
|
|
47
|
-
function addThousandsSeparator(numStr: string): string {
|
|
48
|
-
// 用 indexOf/slice 分离整数与小数部分,避免 split 分配数组
|
|
49
|
-
const dotIndex = numStr.indexOf('.');
|
|
50
|
-
const intPart = dotIndex === -1 ? numStr : numStr.slice(0, dotIndex);
|
|
51
|
-
const len = intPart.length;
|
|
52
|
-
|
|
53
|
-
// 三位以内无需分隔,直接返回原串
|
|
54
|
-
if (len <= 3) return numStr;
|
|
55
|
-
|
|
56
|
-
// 首组长度:不足三位的高位余数
|
|
57
|
-
const firstGroupLen = len % 3 || 3;
|
|
58
|
-
let withSep = intPart.slice(0, firstGroupLen);
|
|
59
|
-
for (let i = firstGroupLen; i < len; i += 3) {
|
|
60
|
-
withSep += ',' + intPart.slice(i, i + 3);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return dotIndex === -1 ? withSep : withSep + numStr.slice(dotIndex);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* 数字格式化纯函数(NumberCell / ChangeCell 共享内核)。
|
|
68
|
-
*
|
|
69
|
-
* 处理管线:空值判断 → 取符号 → 百分比 → 单位缩放 → 小数位 → 千分位 → 拼装。
|
|
70
|
-
*
|
|
71
|
-
* @param value 原始值(数字或可转为数字的字符串)
|
|
72
|
-
* @param options 格式化选项
|
|
73
|
-
* @returns 格式化后的字符串;空值或非数字返回 placeholder
|
|
74
|
-
*/
|
|
75
|
-
export function formatNumber(value: unknown, options: FormatNumberOptions = {}): string {
|
|
76
|
-
const {
|
|
77
|
-
decimals,
|
|
78
|
-
thousands = true,
|
|
79
|
-
prefix = '',
|
|
80
|
-
suffix = '',
|
|
81
|
-
showSign = false,
|
|
82
|
-
percent = false,
|
|
83
|
-
abbr,
|
|
84
|
-
abbrDecimals,
|
|
85
|
-
placeholder = '--',
|
|
86
|
-
} = options;
|
|
87
|
-
|
|
88
|
-
// 空值判断(注意:Number('') === 0,必须先拦掉空字符串)
|
|
89
|
-
if (value === null || value === undefined || value === '') {
|
|
90
|
-
return placeholder;
|
|
91
|
-
}
|
|
92
|
-
const num = typeof value === 'number' ? value : Number(value);
|
|
93
|
-
if (Number.isNaN(num)) {
|
|
94
|
-
return placeholder;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// 符号基于原始值正负;0 不带符号
|
|
98
|
-
const sign = num < 0 ? '-' : showSign && num > 0 ? '+' : '';
|
|
99
|
-
let work = Math.abs(num);
|
|
100
|
-
|
|
101
|
-
// 百分比
|
|
102
|
-
if (percent) {
|
|
103
|
-
work = work * 100;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// 单位缩放(与百分比互斥)
|
|
107
|
-
let unit = '';
|
|
108
|
-
if (abbr && !percent) {
|
|
109
|
-
// 用索引 for 遍历阈值表,避免 for...of 的迭代器与数组解构开销
|
|
110
|
-
const units = ABBR_UNITS[abbr];
|
|
111
|
-
for (let i = 0; i < units.length; i++) {
|
|
112
|
-
const threshold = units[i][0];
|
|
113
|
-
if (work >= threshold) {
|
|
114
|
-
work = work / threshold;
|
|
115
|
-
unit = units[i][1];
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// 小数位:缩放后优先 abbrDecimals,否则回落到 decimals,最终默认 2;未缩放时不强制
|
|
122
|
-
let fractionDigits: number | null;
|
|
123
|
-
if (unit) {
|
|
124
|
-
fractionDigits = abbrDecimals ?? decimals ?? 2;
|
|
125
|
-
} else {
|
|
126
|
-
fractionDigits = decimals ?? null;
|
|
127
|
-
}
|
|
128
|
-
let numStr = fractionDigits == null ? String(work) : work.toFixed(fractionDigits);
|
|
129
|
-
|
|
130
|
-
// 千分位
|
|
131
|
-
if (thousands) {
|
|
132
|
-
numStr = addThousandsSeparator(numStr);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const percentSuffix = percent ? '%' : '';
|
|
136
|
-
return `${prefix}${sign}${numStr}${unit}${percentSuffix}${suffix}`;
|
|
137
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 数字格式化选项
|
|
3
|
+
*
|
|
4
|
+
* NumberCell / ChangeCell 共享的格式化配置。
|
|
5
|
+
*/
|
|
6
|
+
export interface FormatNumberOptions {
|
|
7
|
+
/** 小数位数(四舍五入)。不传则不强制处理小数位 */
|
|
8
|
+
decimals?: number;
|
|
9
|
+
/** 是否使用千分位分隔符,默认 true */
|
|
10
|
+
thousands?: boolean;
|
|
11
|
+
/** 前缀,如 '¥'、'$' */
|
|
12
|
+
prefix?: string;
|
|
13
|
+
/** 后缀,如 '元'、'股' */
|
|
14
|
+
suffix?: string;
|
|
15
|
+
/** 正数是否强制显示 '+' 号,默认 false(负数始终带 '-') */
|
|
16
|
+
showSign?: boolean;
|
|
17
|
+
/** 百分比模式:值 ×100 并追加 '%',默认 false。与 abbr 互斥 */
|
|
18
|
+
percent?: boolean;
|
|
19
|
+
/** 单位缩放:'cn' = 万/亿,'en' = K/M/B。不传则不缩放。与 percent 互斥 */
|
|
20
|
+
abbr?: 'cn' | 'en';
|
|
21
|
+
/** 缩放后保留的小数位,默认 2 */
|
|
22
|
+
abbrDecimals?: number;
|
|
23
|
+
/** 空值(null/undefined/'')或非数字时的占位符,默认 '--' */
|
|
24
|
+
placeholder?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** 缩放单位阈值表(从大到小匹配) */
|
|
28
|
+
const ABBR_UNITS: Record<'cn' | 'en', Array<[number, string]>> = {
|
|
29
|
+
cn: [
|
|
30
|
+
[1e8, '亿'],
|
|
31
|
+
[1e4, '万'],
|
|
32
|
+
],
|
|
33
|
+
en: [
|
|
34
|
+
[1e9, 'B'],
|
|
35
|
+
[1e6, 'M'],
|
|
36
|
+
[1e3, 'K'],
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 给数字字符串的整数部分添加千分位分隔符。
|
|
42
|
+
* @param numStr 不含符号的正数字符串(可含小数部分)
|
|
43
|
+
*
|
|
44
|
+
* 用手动分组代替先读正则 `\B(?=(\d{3})+(?!\d))`:
|
|
45
|
+
* 后者在长数字上开销随位数非线性增长,且 split('.') 会额外分配数组。
|
|
46
|
+
*/
|
|
47
|
+
function addThousandsSeparator(numStr: string): string {
|
|
48
|
+
// 用 indexOf/slice 分离整数与小数部分,避免 split 分配数组
|
|
49
|
+
const dotIndex = numStr.indexOf('.');
|
|
50
|
+
const intPart = dotIndex === -1 ? numStr : numStr.slice(0, dotIndex);
|
|
51
|
+
const len = intPart.length;
|
|
52
|
+
|
|
53
|
+
// 三位以内无需分隔,直接返回原串
|
|
54
|
+
if (len <= 3) return numStr;
|
|
55
|
+
|
|
56
|
+
// 首组长度:不足三位的高位余数
|
|
57
|
+
const firstGroupLen = len % 3 || 3;
|
|
58
|
+
let withSep = intPart.slice(0, firstGroupLen);
|
|
59
|
+
for (let i = firstGroupLen; i < len; i += 3) {
|
|
60
|
+
withSep += ',' + intPart.slice(i, i + 3);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return dotIndex === -1 ? withSep : withSep + numStr.slice(dotIndex);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 数字格式化纯函数(NumberCell / ChangeCell 共享内核)。
|
|
68
|
+
*
|
|
69
|
+
* 处理管线:空值判断 → 取符号 → 百分比 → 单位缩放 → 小数位 → 千分位 → 拼装。
|
|
70
|
+
*
|
|
71
|
+
* @param value 原始值(数字或可转为数字的字符串)
|
|
72
|
+
* @param options 格式化选项
|
|
73
|
+
* @returns 格式化后的字符串;空值或非数字返回 placeholder
|
|
74
|
+
*/
|
|
75
|
+
export function formatNumber(value: unknown, options: FormatNumberOptions = {}): string {
|
|
76
|
+
const {
|
|
77
|
+
decimals,
|
|
78
|
+
thousands = true,
|
|
79
|
+
prefix = '',
|
|
80
|
+
suffix = '',
|
|
81
|
+
showSign = false,
|
|
82
|
+
percent = false,
|
|
83
|
+
abbr,
|
|
84
|
+
abbrDecimals,
|
|
85
|
+
placeholder = '--',
|
|
86
|
+
} = options;
|
|
87
|
+
|
|
88
|
+
// 空值判断(注意:Number('') === 0,必须先拦掉空字符串)
|
|
89
|
+
if (value === null || value === undefined || value === '') {
|
|
90
|
+
return placeholder;
|
|
91
|
+
}
|
|
92
|
+
const num = typeof value === 'number' ? value : Number(value);
|
|
93
|
+
if (Number.isNaN(num)) {
|
|
94
|
+
return placeholder;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// 符号基于原始值正负;0 不带符号
|
|
98
|
+
const sign = num < 0 ? '-' : showSign && num > 0 ? '+' : '';
|
|
99
|
+
let work = Math.abs(num);
|
|
100
|
+
|
|
101
|
+
// 百分比
|
|
102
|
+
if (percent) {
|
|
103
|
+
work = work * 100;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// 单位缩放(与百分比互斥)
|
|
107
|
+
let unit = '';
|
|
108
|
+
if (abbr && !percent) {
|
|
109
|
+
// 用索引 for 遍历阈值表,避免 for...of 的迭代器与数组解构开销
|
|
110
|
+
const units = ABBR_UNITS[abbr];
|
|
111
|
+
for (let i = 0; i < units.length; i++) {
|
|
112
|
+
const threshold = units[i][0];
|
|
113
|
+
if (work >= threshold) {
|
|
114
|
+
work = work / threshold;
|
|
115
|
+
unit = units[i][1];
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// 小数位:缩放后优先 abbrDecimals,否则回落到 decimals,最终默认 2;未缩放时不强制
|
|
122
|
+
let fractionDigits: number | null;
|
|
123
|
+
if (unit) {
|
|
124
|
+
fractionDigits = abbrDecimals ?? decimals ?? 2;
|
|
125
|
+
} else {
|
|
126
|
+
fractionDigits = decimals ?? null;
|
|
127
|
+
}
|
|
128
|
+
let numStr = fractionDigits == null ? String(work) : work.toFixed(fractionDigits);
|
|
129
|
+
|
|
130
|
+
// 千分位
|
|
131
|
+
if (thousands) {
|
|
132
|
+
numStr = addThousandsSeparator(numStr);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const percentSuffix = percent ? '%' : '';
|
|
136
|
+
return `${prefix}${sign}${numStr}${unit}${percentSuffix}${suffix}`;
|
|
137
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const MY_FN_NAME = 'stkName';
|
|
1
|
+
export const MY_FN_NAME = 'stkName';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { useAreaSelection, useAreaSelectionName } from './useAreaSelection';
|
|
1
|
+
export { useAreaSelection, useAreaSelectionName } from './useAreaSelection';
|