@bit-sun/business-component 4.2.0-alpha.34-wyl → 4.2.0-alpha.37-wyl
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/dist/components/Business/BsSulaQueryTable/clipboard.d.ts +3 -8
- package/dist/components/Business/BsSulaQueryTable/rangeCopy.d.ts +7 -0
- package/dist/components/Business/BsSulaQueryTable/useVirtualRangeCopy.d.ts +20 -0
- package/dist/components/Business/BsSulaQueryTable/virtualRangeCopy.d.ts +54 -0
- package/dist/index.esm.js +998 -40
- package/dist/index.js +998 -40
- package/package.json +1 -1
- package/src/components/Business/BsSulaQueryTable/__tests__/clipboard.test.ts +31 -0
- package/src/components/Business/BsSulaQueryTable/__tests__/virtualRangeCopy.test.ts +184 -0
- package/src/components/Business/BsSulaQueryTable/clipboard.ts +104 -19
- package/src/components/Business/BsSulaQueryTable/index.md +3 -3
- package/src/components/Business/BsSulaQueryTable/index.tsx +9 -3
- package/src/components/Business/BsSulaQueryTable/rangeCopy.less +6 -1
- package/src/components/Business/BsSulaQueryTable/rangeCopy.ts +10 -1
- package/src/components/Business/BsSulaQueryTable/useRangeCopy.tsx +9 -1
- package/src/components/Business/BsSulaQueryTable/useVirtualRangeCopy.tsx +842 -0
- package/src/components/Business/BsSulaQueryTable/virtualRangeCopy.ts +191 -0
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* 2)非安全上下文或旧内核退回 execCommand:临时 textarea 真正移出视口,用完立即移除
|
|
5
|
-
* (避免"每次复制在 body 残留节点、并把键盘焦点留在残留节点上,之后按 Ctrl+C 复制到旧内容")。
|
|
6
|
-
* 返回是否写入成功;失败时调用方应保留选区并提示用户用 Ctrl+C 重试。
|
|
7
|
-
*/
|
|
8
|
-
export declare const writeClipboard: (text: string) => Promise<boolean>;
|
|
1
|
+
/** 当前 window + 父/顶层 window(跨域访问属性会抛,一律忽略) */
|
|
2
|
+
export declare const candidateWindows: () => Window[];
|
|
3
|
+
export declare const writeClipboard: (text: string, anchor?: HTMLElement | null) => Promise<boolean>;
|
|
@@ -9,6 +9,13 @@ export interface RangeCopyResult {
|
|
|
9
9
|
rowCount: number;
|
|
10
10
|
colCount: number;
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* 单元格取文本:用 textContent(不依赖布局,避免逐格 innerText 反复触发布局校验),
|
|
14
|
+
* 去掉零宽字符、把不换行空格还原成空格,并把会破坏 TSV 结构的制表符与换行压成空格。
|
|
15
|
+
*/
|
|
16
|
+
/** 文本归一:去零宽字符、NBSP 还原空格、制表符与换行压成空格 */
|
|
17
|
+
export declare const normalizeText: (value?: string | null) => string;
|
|
18
|
+
export declare const normalizeCellText: (cell?: HTMLTableCellElement) => string;
|
|
12
19
|
/** 选区里真正会被复制的列(按列序);勾选列/操作列等被排除的列不占位 */
|
|
13
20
|
export declare const getIncludedCols: (colStart: number, colEnd: number, excludeCols?: Set<number>) => number[];
|
|
14
21
|
export declare const buildRangeCopy: (rows: HTMLTableRowElement[], colStart: number, colEnd: number, excludeCols?: Set<number>) => RangeCopyResult;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RefObject } from 'react';
|
|
2
|
+
export interface UseVirtualRangeCopyOptions {
|
|
3
|
+
/** 容器 ref(与经典路径共用同一个 DOM 容器) */
|
|
4
|
+
containerRef: RefObject<HTMLElement>;
|
|
5
|
+
/** 是否启用;BsSulaQueryTable 按 rangeCopy / isVirtualTable 决定 */
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
excludeTitles?: string[];
|
|
8
|
+
autoCopy?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 虚拟滚动表(rc-virtual-list 表体)的框选复制。
|
|
12
|
+
* 只渲染可视区附近的行,所以拖拽/自动滚动过程中"边滚边采",松手时按区间拼 TSV,
|
|
13
|
+
* 并对没被渲染到的行如实提示(不假装完整)。
|
|
14
|
+
*
|
|
15
|
+
* 性能约定(滚动期间每帧的固定开销):
|
|
16
|
+
* - 所有事件(mousemove / scroll / wheel / 自动滚动帧)只调用 scheduleFrame(),一帧只干一次活;
|
|
17
|
+
* - 滚动容器在建立选区时解析一次并缓存,热路径上不做任何 scrollHeight/scrollWidth 之类的布局探测;
|
|
18
|
+
* - 命中测试先用便宜的 elementFromPoint,只有被浮层挡住时才退到 elementsFromPoint。
|
|
19
|
+
*/
|
|
20
|
+
export declare const useVirtualRangeCopy: (options: UseVirtualRangeCopyOptions) => void;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export interface RenderedRow {
|
|
2
|
+
row: HTMLElement;
|
|
3
|
+
/** 行内容坐标:相对滚动容器「内容顶部」的像素偏移(与滚动位置无关,跨渲染窗口稳定) */
|
|
4
|
+
offset: number;
|
|
5
|
+
cells: HTMLElement[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 行的内容坐标 = rowRect.top - scrollerRect.top + scroller.scrollTop。
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ 不要用「相对 holder-inner」的偏移。rc-virtual-list 在 useVirtual 模式下
|
|
11
|
+
* (Filler.js:offsetY 有值时)把 holder-inner 用 transform: translateY(fillerOffset) 平移,
|
|
12
|
+
* fillerOffset 是「当前渲染窗口第一行的内容坐标」——inner 的 rect 会随窗口一起走,
|
|
13
|
+
* 于是 inner 相对偏移退化成「窗口内序号」(0,48,96…):窗口一滑动,新行就用同一个 key
|
|
14
|
+
* 覆盖掉已采过的旧行,采集永远只有一屏(实测症状:滚到第 30 多行,只复制出 8 行)。
|
|
15
|
+
*
|
|
16
|
+
* 用滚动容器的 scrollTop 还原内容坐标,key 就与滚动位置、窗口位置都无关,边滚边采才能累积。
|
|
17
|
+
*/
|
|
18
|
+
export declare const getRowOffset: (row: HTMLElement, scroller: HTMLElement) => number;
|
|
19
|
+
/**
|
|
20
|
+
* 找「真正会纵向滚动」的容器:从行往上走到 holder,取第一个有纵向滚动余量的元素。
|
|
21
|
+
* 虚拟表的 holder 是 overflow-y: hidden(滚动条由 rc-virtual-list 自绘),只看 overflow 值
|
|
22
|
+
* 会漏掉它,所以按「有没有滚动余量」判断,都没有时才退化用 holder。
|
|
23
|
+
*/
|
|
24
|
+
export declare const pickScroller: (row: HTMLElement, holder: HTMLElement) => HTMLElement;
|
|
25
|
+
/**
|
|
26
|
+
* 找横向滚动容器,找不到返回 null(**不要**拿 holder 顶包)。
|
|
27
|
+
*
|
|
28
|
+
* rc-virtual-list 在 useVirtual 模式下把 holder 设成 overflow: hidden,横向位移是 React state
|
|
29
|
+
* 驱动的 inner marginLeft(Filler 的 offsetX),holder 自己的 scrollLeft 永远是 0。
|
|
30
|
+
* 所以横向要么落在行的某个祖先上,要么落在同一容器里的兄弟节点上(虚拟表自己的 body 包装层),
|
|
31
|
+
* 两处都要找;都找不到时由调用方决定退路(发合成 wheel 或放弃),而不是往 holder 上写 scrollLeft。
|
|
32
|
+
* 横向只在表格容器范围内找,避免"拖到右边缘"变成"整页左右晃"。
|
|
33
|
+
*/
|
|
34
|
+
export declare const pickScrollerX: (row: HTMLElement, container?: HTMLElement | null) => HTMLElement | null;
|
|
35
|
+
export interface VirtualParts {
|
|
36
|
+
inner: HTMLElement;
|
|
37
|
+
holder: HTMLElement;
|
|
38
|
+
}
|
|
39
|
+
/** 是否虚拟表体:没有常规 tbody,但存在 rc-virtual-list 的渲染区 */
|
|
40
|
+
export declare const isVirtualBody: (container: HTMLElement | null) => boolean;
|
|
41
|
+
export declare const getVirtualParts: (container: HTMLElement | null) => VirtualParts | null;
|
|
42
|
+
/** 收集当前渲染出来的行(按内容坐标升序);未布局的行(高度 0)跳过 */
|
|
43
|
+
export declare const collectRenderedRows: (inner: HTMLElement, scroller: HTMLElement) => RenderedRow[];
|
|
44
|
+
/** 行高估算:优先取相邻行偏移差的中位数,退化到行自身高度 */
|
|
45
|
+
export declare const estimateRowHeight: (rows: RenderedRow[]) => number;
|
|
46
|
+
export interface VirtualCopyResult {
|
|
47
|
+
text: string;
|
|
48
|
+
rowCount: number;
|
|
49
|
+
colCount: number;
|
|
50
|
+
/** 区间内没有被渲染到的行数(按行高估算),> 0 时调用方必须如实提示 */
|
|
51
|
+
missingRows: number;
|
|
52
|
+
}
|
|
53
|
+
/** 按偏移区间 + 列区间,用已采集的行拼 TSV */
|
|
54
|
+
export declare const buildVirtualCopy: (harvest: Map<number, string[]>, fromOffset: number, toOffset: number, colStart: number, colEnd: number, excludeCols: Set<number>, rowHeight: number) => VirtualCopyResult;
|