arthub-table 0.0.3
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/CHANGELOG.md +36 -0
- package/LICENSE +21 -0
- package/README.md +257 -0
- package/dist/arthub-table.common.js +2 -0
- package/dist/arthub-table.common.js.map +1 -0
- package/dist/arthub-table.css +1 -0
- package/dist/arthub-table.umd.js +2 -0
- package/dist/arthub-table.umd.js.map +1 -0
- package/dist/arthub-table.umd.min.js +2 -0
- package/dist/arthub-table.umd.min.js.map +1 -0
- package/dist/demo.html +1 -0
- package/dist/img/ah-icon_audio_pause.55c06fbf.svg +3 -0
- package/dist/img/ah-icon_closeshape.82e52181.svg +3 -0
- package/dist/img/icon_attachment.724d33ba.svg +3 -0
- package/dist/img/icon_default.9ef1a394.svg +5 -0
- package/dist/img/icon_edit.9966e699.svg +3 -0
- package/dist/img/icon_error_dark.2a057cdd.svg +17 -0
- package/dist/img/icon_error_light.ac6763e9.svg +17 -0
- package/dist/img/icon_failure_dark.f68723a7.svg +25 -0
- package/dist/img/icon_failure_light.489a7167.svg +25 -0
- package/dist/img/icon_folder.ea3efcce.svg +11 -0
- package/dist/img/icon_netdisc.d8bbe2e0.svg +4 -0
- package/dist/img/icon_singlearrowright.6adcd336.svg +4 -0
- package/dist/img/icon_totalNum.23a86d16.svg +3 -0
- package/dist/img/icon_transform_dark.033764ea.svg +26 -0
- package/dist/img/icon_transform_light.fa9fbcbd.svg +26 -0
- package/dist/img/img_3d.39b27128.svg +14 -0
- package/dist/img/img_aep.a898e3e7.svg +8 -0
- package/dist/img/img_ai.61f08a0a.svg +8 -0
- package/dist/img/img_audio.e4ada65c.svg +5 -0
- package/dist/img/img_enf.ad88f95d.svg +28 -0
- package/dist/img/img_excel.56663d85.svg +30 -0
- package/dist/img/img_exe.5e3fc198.svg +27 -0
- package/dist/img/img_img.ac2e0d0c.svg +8 -0
- package/dist/img/img_mcp.393ef169.svg +28 -0
- package/dist/img/img_pdf.f4da9922.svg +7 -0
- package/dist/img/img_ppt.d172780f.svg +26 -0
- package/dist/img/img_pxcook.7e9fce57.svg +18 -0
- package/dist/img/img_rarzip7z.e3b1de82.svg +28 -0
- package/dist/img/img_sketch.d49a9bd4.svg +32 -0
- package/dist/img/img_video.b6ac6198.svg +7 -0
- package/dist/img/img_word.0c1d3c88.svg +31 -0
- package/dist/img/img_x2d.6acc94f6.svg +28 -0
- package/dist/img/img_xd.cc23d09a.svg +28 -0
- package/dist/img/matrix-icon_finish.617f5d3e.svg +3 -0
- package/dist/img/matrix-icon_inprogress.3781156a.svg +3 -0
- package/dist/img/matrix-icon_supervise.edae43f0.svg +3 -0
- package/dist/types/assets/icon/iconBase64.d.ts +3 -0
- package/dist/types/components/Icon/index.d.ts +2 -0
- package/dist/types/components/clickoutside.d.ts +3 -0
- package/dist/types/core/Body.d.ts +142 -0
- package/dist/types/core/Cell.d.ts +94 -0
- package/dist/types/core/Clipboard.d.ts +16 -0
- package/dist/types/core/ColumnHeader.d.ts +24 -0
- package/dist/types/core/Context.d.ts +24 -0
- package/dist/types/core/DataGrid.d.ts +749 -0
- package/dist/types/core/EdgeScroller.d.ts +75 -0
- package/dist/types/core/Editor.d.ts +33 -0
- package/dist/types/core/Events.d.ts +25 -0
- package/dist/types/core/Footer.d.ts +37 -0
- package/dist/types/core/GifAnimationManager.d.ts +69 -0
- package/dist/types/core/GifOverlay.d.ts +33 -0
- package/dist/types/core/GroupRow.d.ts +80 -0
- package/dist/types/core/Header.d.ts +40 -0
- package/dist/types/core/History.d.ts +27 -0
- package/dist/types/core/ImageManager.d.ts +94 -0
- package/dist/types/core/NestedGrid.d.ts +177 -0
- package/dist/types/core/Paint.d.ts +101 -0
- package/dist/types/core/PerformanceMonitor.d.ts +96 -0
- package/dist/types/core/Row.d.ts +31 -0
- package/dist/types/core/RowHeader.d.ts +22 -0
- package/dist/types/core/Scroller.d.ts +33 -0
- package/dist/types/core/Selector.d.ts +9 -0
- package/dist/types/core/StyleManager.d.ts +108 -0
- package/dist/types/core/Tooltip.d.ts +28 -0
- package/dist/types/core/Validator.d.ts +26 -0
- package/dist/types/core/config.d.ts +5 -0
- package/dist/types/core/constants.d.ts +39 -0
- package/dist/types/core/element.d.ts +36 -0
- package/dist/types/core/extension-type-mapping.d.ts +5 -0
- package/dist/types/core/footer/utils.d.ts +7 -0
- package/dist/types/core/types.d.ts +399 -0
- package/dist/types/core/util.d.ts +17 -0
- package/dist/types/core/viewers/BooleanViewer.d.ts +46 -0
- package/dist/types/core/viewers/DatetimeViewer.d.ts +33 -0
- package/dist/types/core/viewers/DeliverableReviewViewer.d.ts +87 -0
- package/dist/types/core/viewers/FileStorageSpecViewer.d.ts +37 -0
- package/dist/types/core/viewers/FileViewer.d.ts +118 -0
- package/dist/types/core/viewers/GroupHeaderViewer.d.ts +73 -0
- package/dist/types/core/viewers/HyperlinkTextViewer.d.ts +80 -0
- package/dist/types/core/viewers/ImageViewer.d.ts +31 -0
- package/dist/types/core/viewers/ItfsPathViewer.d.ts +58 -0
- package/dist/types/core/viewers/ModuleViewer.d.ts +53 -0
- package/dist/types/core/viewers/NestedGridViewer.d.ts +47 -0
- package/dist/types/core/viewers/PersonViewer.d.ts +61 -0
- package/dist/types/core/viewers/PivotViewer.d.ts +43 -0
- package/dist/types/core/viewers/PriorityTextViewer.d.ts +35 -0
- package/dist/types/core/viewers/ProgressViewer.d.ts +68 -0
- package/dist/types/core/viewers/PunchTimingViewer.d.ts +42 -0
- package/dist/types/core/viewers/PunchViewer.d.ts +116 -0
- package/dist/types/core/viewers/RichTextViewer.d.ts +83 -0
- package/dist/types/core/viewers/SelectViewer.d.ts +57 -0
- package/dist/types/core/viewers/SeparatorRowViewer.d.ts +25 -0
- package/dist/types/core/viewers/StatusTextViewer.d.ts +40 -0
- package/dist/types/core/viewers/StatusViewer.d.ts +53 -0
- package/dist/types/core/viewers/TableActionButtonViewer.d.ts +77 -0
- package/dist/types/core/viewers/TaskNodeViewer.d.ts +106 -0
- package/dist/types/core/viewers/TextViewer.d.ts +37 -0
- package/dist/types/core/viewers/TextViewerWithSwitcher.d.ts +112 -0
- package/dist/types/core/viewers/ThemeViewer.d.ts +36 -0
- package/dist/types/core/viewers/TreeDropdownViewer.d.ts +55 -0
- package/dist/types/core/viewers/UpstreamViewer.d.ts +79 -0
- package/dist/types/core/viewers/ViewerRegistry.d.ts +76 -0
- package/dist/types/core/viewers/WfStateViewer.d.ts +76 -0
- package/dist/types/core/viewers/WorkflowViewer.d.ts +37 -0
- package/dist/types/core/viewers/index.d.ts +114 -0
- package/dist/types/core/viewers/types.d.ts +1097 -0
- package/dist/types/index.d.ts +37 -0
- package/dist/types/testing/SnapshotManager.d.ts +55 -0
- package/dist/types/testing/TestHooks.d.ts +275 -0
- package/dist/types/testing/index.d.ts +3 -0
- package/dist/types/testing/installTestHooks.d.ts +16 -0
- package/package.json +126 -0
|
@@ -0,0 +1,749 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import Paint from "./Paint";
|
|
3
|
+
import Body from "./Body";
|
|
4
|
+
import Header from "./Header";
|
|
5
|
+
import Footer from "./Footer";
|
|
6
|
+
import Editor from "./Editor";
|
|
7
|
+
import Scroller from "./Scroller";
|
|
8
|
+
import Events from "./Events";
|
|
9
|
+
import Tooltip from "./Tooltip";
|
|
10
|
+
import Clipboard from "./Clipboard";
|
|
11
|
+
import Histories from "./History";
|
|
12
|
+
import { StyleManager, type TableTheme } from "./StyleManager";
|
|
13
|
+
import EdgeScroller from "./EdgeScroller";
|
|
14
|
+
import { type HeaderConfig } from "./util";
|
|
15
|
+
import { type FooterCellClickInfo, type FooterData, type FooterCellData } from "./types";
|
|
16
|
+
import { type PerformanceMonitor } from "./PerformanceMonitor";
|
|
17
|
+
interface Column extends HeaderConfig {
|
|
18
|
+
children?: Column[];
|
|
19
|
+
[key: string]: any;
|
|
20
|
+
}
|
|
21
|
+
interface RowData {
|
|
22
|
+
[key: string]: any;
|
|
23
|
+
}
|
|
24
|
+
interface CellInfo {
|
|
25
|
+
colIndex: number;
|
|
26
|
+
rowIndex: number;
|
|
27
|
+
x: number;
|
|
28
|
+
y: number;
|
|
29
|
+
width: number;
|
|
30
|
+
height: number;
|
|
31
|
+
value: any;
|
|
32
|
+
fixed?: 'left' | 'right' | '';
|
|
33
|
+
dataType?: string;
|
|
34
|
+
options?: any[];
|
|
35
|
+
readonly?: boolean;
|
|
36
|
+
[key: string]: any;
|
|
37
|
+
}
|
|
38
|
+
interface SelectorState {
|
|
39
|
+
show: boolean;
|
|
40
|
+
isSelected: boolean;
|
|
41
|
+
xArr: [number, number];
|
|
42
|
+
yArr: [number, number];
|
|
43
|
+
}
|
|
44
|
+
interface AutofillState {
|
|
45
|
+
enable: boolean;
|
|
46
|
+
xIndex: number;
|
|
47
|
+
yIndex: number;
|
|
48
|
+
xArr: [number, number];
|
|
49
|
+
yArr: [number, number];
|
|
50
|
+
}
|
|
51
|
+
interface RowDragState {
|
|
52
|
+
isDragging: boolean;
|
|
53
|
+
dragStartY: number;
|
|
54
|
+
draggedRowIndices: number[];
|
|
55
|
+
dropIndicatorType: 'line' | 'overlay' | null;
|
|
56
|
+
dropIndicatorY: number;
|
|
57
|
+
dropTargetRowIndex: number;
|
|
58
|
+
justFinishedDrag: boolean;
|
|
59
|
+
hasStartedDragSelection: boolean;
|
|
60
|
+
isCtrlPressed: boolean;
|
|
61
|
+
isShiftPressed: boolean;
|
|
62
|
+
skipNextClick: boolean;
|
|
63
|
+
}
|
|
64
|
+
interface ColDragState {
|
|
65
|
+
isDragging: boolean;
|
|
66
|
+
dragStartX: number;
|
|
67
|
+
draggedColIds: string[];
|
|
68
|
+
dropIndicatorType: 'line' | null;
|
|
69
|
+
dropIndicatorX: number;
|
|
70
|
+
dropTargetColId: string;
|
|
71
|
+
dropInsertBefore: boolean;
|
|
72
|
+
justFinishedDrag: boolean;
|
|
73
|
+
skipNextClick: boolean;
|
|
74
|
+
}
|
|
75
|
+
interface ViewerDragState {
|
|
76
|
+
isDragging: boolean;
|
|
77
|
+
cell: any | null;
|
|
78
|
+
startX: number;
|
|
79
|
+
startY: number;
|
|
80
|
+
startValue: any;
|
|
81
|
+
currentValue: any;
|
|
82
|
+
}
|
|
83
|
+
interface RangeState {
|
|
84
|
+
minX: number;
|
|
85
|
+
minY: number;
|
|
86
|
+
maxY: number;
|
|
87
|
+
maxX?: number;
|
|
88
|
+
}
|
|
89
|
+
interface ColumnContextMenuInfo {
|
|
90
|
+
colId: string;
|
|
91
|
+
colIndex: number;
|
|
92
|
+
colType?: string;
|
|
93
|
+
colTitle: string;
|
|
94
|
+
fixed: string;
|
|
95
|
+
nestedChildOffset?: number;
|
|
96
|
+
parentKey?: string;
|
|
97
|
+
clientX: number;
|
|
98
|
+
clientY: number;
|
|
99
|
+
}
|
|
100
|
+
export interface DataGridOptions {
|
|
101
|
+
width?: number | string;
|
|
102
|
+
height?: number | string;
|
|
103
|
+
data?: RowData[];
|
|
104
|
+
columns?: Column[];
|
|
105
|
+
color?: string;
|
|
106
|
+
borderColor?: string;
|
|
107
|
+
fillColor?: string;
|
|
108
|
+
borderWidth?: number;
|
|
109
|
+
showCheckbox?: boolean;
|
|
110
|
+
headerHeight?: number;
|
|
111
|
+
rowKey?: string;
|
|
112
|
+
striped?: boolean;
|
|
113
|
+
stripedOddColor?: string;
|
|
114
|
+
stripedEvenColor?: string;
|
|
115
|
+
rowHeight?: number;
|
|
116
|
+
theme?: string | TableTheme;
|
|
117
|
+
beforeSelectCell?: (cell: CellInfo) => void;
|
|
118
|
+
afterSelectCell?: (cell: CellInfo) => void;
|
|
119
|
+
beforeMultiSelectCell?: (cells: CellInfo[]) => void;
|
|
120
|
+
afterMultiSelectCell?: (cells: CellInfo[]) => void;
|
|
121
|
+
beforeEditCell?: (cell: CellInfo) => void;
|
|
122
|
+
afterEditCell?: (cell: RowData) => void;
|
|
123
|
+
beforeSelectRow?: (row: RowData) => void;
|
|
124
|
+
afterSelectRow?: (row: RowData) => void;
|
|
125
|
+
beforeResizeColumn?: () => void;
|
|
126
|
+
afterResizeColumn?: () => void;
|
|
127
|
+
beforeResizeRow?: () => void;
|
|
128
|
+
afterResizeRow?: () => void;
|
|
129
|
+
beforeAutofill?: () => void;
|
|
130
|
+
afterAutofill?: (rows: RowData[]) => void;
|
|
131
|
+
customAutofill?: (params: {
|
|
132
|
+
sourceData: {
|
|
133
|
+
label: string;
|
|
134
|
+
value: any;
|
|
135
|
+
dataType: string;
|
|
136
|
+
}[][];
|
|
137
|
+
targetRange: {
|
|
138
|
+
xArr: [number, number];
|
|
139
|
+
yArr: [number, number];
|
|
140
|
+
};
|
|
141
|
+
selectionRange: {
|
|
142
|
+
xArr: [number, number];
|
|
143
|
+
yArr: [number, number];
|
|
144
|
+
};
|
|
145
|
+
setCell: (rowIndex: number, colIndex: number, value: any) => void;
|
|
146
|
+
getCellDataType: (colIndex: number) => string;
|
|
147
|
+
}) => void;
|
|
148
|
+
beforeCopy?: () => void;
|
|
149
|
+
afterCopy?: () => void;
|
|
150
|
+
beforePaste?: () => void;
|
|
151
|
+
afterPaste?: (rows: RowData[]) => void;
|
|
152
|
+
afterClear?: (rows: RowData[]) => void;
|
|
153
|
+
onLoad?: () => void;
|
|
154
|
+
onRowDragReorder?: (draggedRows: RowData[], targetIndex: number) => void;
|
|
155
|
+
onRowDragMove?: (draggedRows: RowData[], targetRow: RowData) => void;
|
|
156
|
+
onGroupToggle?: (groupRow: RowData, expanded: boolean) => void;
|
|
157
|
+
onTreeExpand?: (rowData: RowData, expanded: boolean) => void;
|
|
158
|
+
onCellTextClick?: (rowData: RowData, colId: string) => void;
|
|
159
|
+
onCellTotalNumClick?: (rowData: RowData, colId: string) => void;
|
|
160
|
+
onColumnDragReorder?: (draggedColIds: string[], targetColId: string, insertBefore: boolean) => void;
|
|
161
|
+
onColumnContextMenu?: (info: ColumnContextMenuInfo) => void;
|
|
162
|
+
onModuleOverflowClick?: (modules: any[], rowData: any, rowIndex: number, colIndex: number) => void;
|
|
163
|
+
onAddRow?: (groupInfo?: any) => void;
|
|
164
|
+
/** Enable debug mode with detailed performance monitoring and console output */
|
|
165
|
+
debug?: boolean;
|
|
166
|
+
/** 是否显示底部统计行 */
|
|
167
|
+
showFooter?: boolean;
|
|
168
|
+
/** Footer 单元格点击回调 */
|
|
169
|
+
onFooterCellClick?: (info: FooterCellClickInfo) => void;
|
|
170
|
+
}
|
|
171
|
+
declare class DataGrid {
|
|
172
|
+
target: HTMLCanvasElement;
|
|
173
|
+
scrollY: number;
|
|
174
|
+
scrollX: number;
|
|
175
|
+
checkboxWidth: number;
|
|
176
|
+
horizontalScrollerSize: number;
|
|
177
|
+
verticalScrollerSize: number;
|
|
178
|
+
tempValue: any;
|
|
179
|
+
focusCell: any;
|
|
180
|
+
enterShift: boolean;
|
|
181
|
+
hashChange: {
|
|
182
|
+
[key: string]: boolean;
|
|
183
|
+
};
|
|
184
|
+
selector: SelectorState;
|
|
185
|
+
editor: Editor;
|
|
186
|
+
autofill: AutofillState;
|
|
187
|
+
rowDrag: RowDragState;
|
|
188
|
+
colDrag: ColDragState;
|
|
189
|
+
selectedColIds: Set<string>;
|
|
190
|
+
lastSelectedColId: string;
|
|
191
|
+
viewerDrag: ViewerDragState;
|
|
192
|
+
painter: Paint;
|
|
193
|
+
clipboard: Clipboard;
|
|
194
|
+
header: Header;
|
|
195
|
+
footer: Footer | null;
|
|
196
|
+
body: Body;
|
|
197
|
+
scroller: Scroller;
|
|
198
|
+
tooltip: Tooltip;
|
|
199
|
+
events: Events;
|
|
200
|
+
history: Histories;
|
|
201
|
+
styleManager: StyleManager;
|
|
202
|
+
edgeScroller: EdgeScroller;
|
|
203
|
+
rowIdMap: Map<string, number>;
|
|
204
|
+
selectedRowIds: Set<string>;
|
|
205
|
+
lastSelectedRowIndex: number;
|
|
206
|
+
/** Footer 行高度(showFooter 为 false 时返回 0) */
|
|
207
|
+
get footerHeight(): number;
|
|
208
|
+
data: RowData[];
|
|
209
|
+
color: string;
|
|
210
|
+
borderColor: string;
|
|
211
|
+
fillColor: string;
|
|
212
|
+
borderWidth: number;
|
|
213
|
+
showCheckbox: boolean;
|
|
214
|
+
headerHeight: number;
|
|
215
|
+
rowKey: string;
|
|
216
|
+
striped: boolean;
|
|
217
|
+
stripedOddColor: string;
|
|
218
|
+
stripedEvenColor: string;
|
|
219
|
+
rowHeight: number;
|
|
220
|
+
hoverRowIndex: number;
|
|
221
|
+
hoverColIndex: number;
|
|
222
|
+
isScrolling: boolean;
|
|
223
|
+
scrollTimer: NodeJS.Timeout | null;
|
|
224
|
+
beforeSelectCell: (cell: CellInfo) => void;
|
|
225
|
+
afterSelectCell: (cell: CellInfo) => void;
|
|
226
|
+
beforeMultiSelectCell: (cells: CellInfo[]) => void;
|
|
227
|
+
afterMultiSelectCell: (cells: CellInfo[]) => void;
|
|
228
|
+
beforeEditCell: (cell: CellInfo) => void;
|
|
229
|
+
afterEditCell: (cell: RowData) => void;
|
|
230
|
+
beforeSelectRow: (row: RowData) => void;
|
|
231
|
+
afterSelectRow: (row: RowData) => void;
|
|
232
|
+
beforeResizeColumn: () => void;
|
|
233
|
+
afterResizeColumn: () => void;
|
|
234
|
+
beforeResizeRow: () => void;
|
|
235
|
+
afterResizeRow: () => void;
|
|
236
|
+
beforeAutofill: () => void;
|
|
237
|
+
afterAutofill: (rows: RowData[]) => void;
|
|
238
|
+
customAutofill?: (params: {
|
|
239
|
+
sourceData: {
|
|
240
|
+
label: string;
|
|
241
|
+
value: any;
|
|
242
|
+
dataType: string;
|
|
243
|
+
}[][];
|
|
244
|
+
targetRange: {
|
|
245
|
+
xArr: [number, number];
|
|
246
|
+
yArr: [number, number];
|
|
247
|
+
};
|
|
248
|
+
selectionRange: {
|
|
249
|
+
xArr: [number, number];
|
|
250
|
+
yArr: [number, number];
|
|
251
|
+
};
|
|
252
|
+
setCell: (rowIndex: number, colIndex: number, value: any) => void;
|
|
253
|
+
getCellDataType: (colIndex: number) => string;
|
|
254
|
+
}) => void;
|
|
255
|
+
beforeCopy: () => void;
|
|
256
|
+
afterCopy: () => void;
|
|
257
|
+
beforePaste: () => void;
|
|
258
|
+
afterPaste: (rows: RowData[]) => void;
|
|
259
|
+
afterClear: (rows: RowData[]) => void;
|
|
260
|
+
onLoad: () => void;
|
|
261
|
+
onRowDragReorder?: (draggedRows: RowData[], targetIndex: number) => void;
|
|
262
|
+
onRowDragMove?: (draggedRows: RowData[], targetRow: RowData) => void;
|
|
263
|
+
onGroupToggle?: (groupRow: RowData, expanded: boolean) => void;
|
|
264
|
+
onTreeExpand?: (rowData: RowData, expanded: boolean) => void;
|
|
265
|
+
onCellTextClick?: (rowData: RowData, colId: string) => void;
|
|
266
|
+
onCellTotalNumClick?: (rowData: RowData, colId: string) => void;
|
|
267
|
+
onColumnDragReorder?: (draggedColIds: string[], targetColId: string, insertBefore: boolean) => void;
|
|
268
|
+
onColumnContextMenu?: (info: ColumnContextMenuInfo) => void;
|
|
269
|
+
onModuleOverflowClick?: (modules: any[], rowData: any, rowIndex: number, colIndex: number) => void;
|
|
270
|
+
onAddRow?: (groupInfo?: any) => void;
|
|
271
|
+
showFooter: boolean;
|
|
272
|
+
onFooterCellClick?: (info: FooterCellClickInfo) => void;
|
|
273
|
+
range: RangeState;
|
|
274
|
+
columns: HeaderConfig[];
|
|
275
|
+
headers: HeaderConfig[];
|
|
276
|
+
columnsLength: number;
|
|
277
|
+
originFixedWidth: number;
|
|
278
|
+
containerOriginX: number;
|
|
279
|
+
containerOriginY: number;
|
|
280
|
+
width: number;
|
|
281
|
+
height: number;
|
|
282
|
+
_configWidth?: number | string;
|
|
283
|
+
_configHeight?: number | string;
|
|
284
|
+
private _baseColumnWidths;
|
|
285
|
+
fixedLeftWidth: number;
|
|
286
|
+
fixedRightWidth: number;
|
|
287
|
+
tableWidth: number;
|
|
288
|
+
tableHeight: number;
|
|
289
|
+
tableHeaderHeight: number;
|
|
290
|
+
nestedColumnColors: Map<number, string>;
|
|
291
|
+
private isDirty;
|
|
292
|
+
private lastScrollX;
|
|
293
|
+
private lastScrollY;
|
|
294
|
+
perfMonitor: PerformanceMonitor;
|
|
295
|
+
private loadingCells;
|
|
296
|
+
private loadingRotation;
|
|
297
|
+
private loadingImage;
|
|
298
|
+
private loadingAnimationId;
|
|
299
|
+
colResizeIndicatorX: number;
|
|
300
|
+
constructor(target: HTMLCanvasElement, options: DataGridOptions);
|
|
301
|
+
/**
|
|
302
|
+
* 容器初始化相关
|
|
303
|
+
*/
|
|
304
|
+
initConfig(options: DataGridOptions): void;
|
|
305
|
+
/**
|
|
306
|
+
* 获取容器可视区域宽、高,设置canvas容器样式尺寸、画布尺寸
|
|
307
|
+
*/
|
|
308
|
+
setLayoutSize(options?: DataGridOptions): void;
|
|
309
|
+
/**
|
|
310
|
+
* 获取表格左、右冻结列宽,表格实际的宽、高
|
|
311
|
+
*/
|
|
312
|
+
getTableSize(): void;
|
|
313
|
+
initTableSize(): void;
|
|
314
|
+
/**
|
|
315
|
+
* 列总宽小于可视区域宽度时,需要补齐
|
|
316
|
+
*/
|
|
317
|
+
fillTableWidth(): void;
|
|
318
|
+
resize(): void;
|
|
319
|
+
/**
|
|
320
|
+
* Restore all column widths (leaf and nested children) to their saved base values.
|
|
321
|
+
* Since this.columns and this.headers share nestedColumns references (via shallow copy),
|
|
322
|
+
* restoring nestedColumns[j].width here also restores header config values.
|
|
323
|
+
*/
|
|
324
|
+
private restoreBaseColumnWidths;
|
|
325
|
+
createContainer(): void;
|
|
326
|
+
/**
|
|
327
|
+
* 选择、编辑相关---------------------------------------------------->
|
|
328
|
+
*/
|
|
329
|
+
getCell(x: number, y: number): any;
|
|
330
|
+
/**
|
|
331
|
+
* Select a range of rows by index, skipping group and separate rows.
|
|
332
|
+
* Shared by row-header drag-select and edge-scroll callback.
|
|
333
|
+
*/
|
|
334
|
+
selectRowRange(startIndex: number, endIndex: number): void;
|
|
335
|
+
selectCell({ colIndex, rowIndex }: {
|
|
336
|
+
colIndex: number;
|
|
337
|
+
rowIndex: number;
|
|
338
|
+
}): void;
|
|
339
|
+
resetCellPosition(): void;
|
|
340
|
+
/**
|
|
341
|
+
* 将画布单元格中的数据传递到编辑器中
|
|
342
|
+
*/
|
|
343
|
+
putCell(): void;
|
|
344
|
+
multiSelectCell(x: number, y: number, mouseX: number, mouseY: number): void;
|
|
345
|
+
endMultiSelect(): void;
|
|
346
|
+
clearMultiSelect(): void;
|
|
347
|
+
clearAllNestedGridsSelection(): void;
|
|
348
|
+
selectCols(col: any, e?: {
|
|
349
|
+
ctrlKey?: boolean;
|
|
350
|
+
metaKey?: boolean;
|
|
351
|
+
shiftKey?: boolean;
|
|
352
|
+
}): void;
|
|
353
|
+
/**
|
|
354
|
+
* 获取嵌套父列下所有子列的colId
|
|
355
|
+
*/
|
|
356
|
+
getNestedChildColIds(parentIndex: number): string[];
|
|
357
|
+
/**
|
|
358
|
+
* 获取所有选中列的基础index集合(去重)
|
|
359
|
+
*/
|
|
360
|
+
getSelectedColBaseIndices(): number[];
|
|
361
|
+
/**
|
|
362
|
+
* 开始列拖拽排序
|
|
363
|
+
*/
|
|
364
|
+
startColDrag(colId: string, mouseX: number): void;
|
|
365
|
+
/**
|
|
366
|
+
* 更新列拖拽状态
|
|
367
|
+
*/
|
|
368
|
+
updateColDrag(mouseX: number, mouseY: number): void;
|
|
369
|
+
/**
|
|
370
|
+
* 结束列拖拽
|
|
371
|
+
*/
|
|
372
|
+
endColDrag(): void;
|
|
373
|
+
/**
|
|
374
|
+
* 取消列拖拽
|
|
375
|
+
*/
|
|
376
|
+
cancelColDrag(): void;
|
|
377
|
+
/**
|
|
378
|
+
* 清除列选中状态
|
|
379
|
+
*/
|
|
380
|
+
clearSelectedCols(): void;
|
|
381
|
+
/**
|
|
382
|
+
* 判断列是否被选中(通过colId判断,支持嵌套子列)
|
|
383
|
+
*/
|
|
384
|
+
isColSelected(colId: string): boolean;
|
|
385
|
+
/**
|
|
386
|
+
* 判断嵌套父列的所有子列是否都被选中
|
|
387
|
+
*/
|
|
388
|
+
isNestedParentAllChildrenSelected(parentIndex: number): boolean;
|
|
389
|
+
selectRows({ rowIndex }: {
|
|
390
|
+
rowIndex: number;
|
|
391
|
+
}): void;
|
|
392
|
+
startAutofill(): void;
|
|
393
|
+
clearAuaofill(): void;
|
|
394
|
+
startEdit(): void;
|
|
395
|
+
doneEdit(): void;
|
|
396
|
+
/**
|
|
397
|
+
* 单个写入数据
|
|
398
|
+
* @param {Number} colIndex 需要写入数据的单元格X轴坐标,表格最左上角为<0,0>
|
|
399
|
+
* @param {Number} rowIndex 需要写入数据的单元格Y轴坐标
|
|
400
|
+
* @param {*} value 需要写入的数据: 简单数据类型
|
|
401
|
+
*/
|
|
402
|
+
setData(value: any, { colIndex, rowIndex }?: {
|
|
403
|
+
colIndex: number;
|
|
404
|
+
rowIndex: number;
|
|
405
|
+
}): void;
|
|
406
|
+
/**
|
|
407
|
+
* 批量写入数据
|
|
408
|
+
* @param {Number} colIndex 需要写入数据的单元格范围起始X轴坐标,表格最左上角为<0,0>
|
|
409
|
+
* @param {Number} rowIndex 需要写入数据的单元格范围起始Y轴坐标
|
|
410
|
+
* @param {Array} value 需要写入的数据: 二维数组[<Array><Array>]
|
|
411
|
+
*/
|
|
412
|
+
batchSetData({ colIndex, rowIndex, value }: {
|
|
413
|
+
colIndex: number;
|
|
414
|
+
rowIndex: number;
|
|
415
|
+
value: any[][];
|
|
416
|
+
}): void;
|
|
417
|
+
/**
|
|
418
|
+
* 将用户通过编辑器输入的值存储为一个临时变量,执行doneEdit()后再去setData()
|
|
419
|
+
*/
|
|
420
|
+
setTempData(value: any): void;
|
|
421
|
+
pasteData(arr: any[][]): void;
|
|
422
|
+
clearSelectedData(): void;
|
|
423
|
+
focusCellByCoord(minX: number, minY: number, maxX?: number, maxY?: number): void;
|
|
424
|
+
/**
|
|
425
|
+
* 调整列宽、行高
|
|
426
|
+
*/
|
|
427
|
+
resizeColumn(colIndex: number, newWidth: number): void;
|
|
428
|
+
resizeRow(rowIndex: number, height: number): void;
|
|
429
|
+
handleCheckRow(y?: number): void;
|
|
430
|
+
handleCheckHeader(): void;
|
|
431
|
+
moveFocus(dir: "LEFT" | "TOP" | "RIGHT" | "BOTTOM"): void;
|
|
432
|
+
/**
|
|
433
|
+
* @deprecated Use edgeScroller.update() instead. Kept for backward compatibility.
|
|
434
|
+
*/
|
|
435
|
+
adjustPosition(_x: number, _y: number, mouseX: number, mouseY: number): void;
|
|
436
|
+
adjustBoundaryPosition(): void;
|
|
437
|
+
/**
|
|
438
|
+
* 画布绘制相关------------------------------------------------------->
|
|
439
|
+
*/
|
|
440
|
+
initPaint(): void;
|
|
441
|
+
/**
|
|
442
|
+
* 标记需要重绘
|
|
443
|
+
* 在数据变化、交互状态变化时调用
|
|
444
|
+
*/
|
|
445
|
+
markDirty(): void;
|
|
446
|
+
drawContainer(): void;
|
|
447
|
+
draw(): void;
|
|
448
|
+
/**
|
|
449
|
+
* 绘制嵌套列的彩色垂直边框,贯穿整个 body 区域(包括分组行和分隔行)
|
|
450
|
+
*/
|
|
451
|
+
drawNestedColumnBorders(): void;
|
|
452
|
+
/**
|
|
453
|
+
* 绘制冻结列区域的嵌套列彩色竖边框(在固定列 cells 之后调用,确保不会被穿透)
|
|
454
|
+
*/
|
|
455
|
+
drawFixedNestedColumnBorders(rowY: number, rowHeight: number): void;
|
|
456
|
+
/**
|
|
457
|
+
* 绘制行拖拽指示器
|
|
458
|
+
*/
|
|
459
|
+
drawColResizeIndicator(): void;
|
|
460
|
+
drawRowDragIndicator(): void;
|
|
461
|
+
/**
|
|
462
|
+
* 绘制列拖拽指示器
|
|
463
|
+
*/
|
|
464
|
+
drawColDragIndicator(): void;
|
|
465
|
+
/**
|
|
466
|
+
* 事件相关------------------------------------------------------->
|
|
467
|
+
*/
|
|
468
|
+
updateColumns(columns: Column[]): void;
|
|
469
|
+
loadColumns(columns: Column[]): void;
|
|
470
|
+
loadData(data: RowData[]): void;
|
|
471
|
+
getData(): RowData[];
|
|
472
|
+
getRowData(y: number): RowData;
|
|
473
|
+
getCheckedRows(): RowData[];
|
|
474
|
+
setSelectedRows(rowIds: string[]): void;
|
|
475
|
+
getSelectedRowIds(): string[];
|
|
476
|
+
getChangedRows(): RowData[];
|
|
477
|
+
validate(callback?: (valid: boolean) => void): void;
|
|
478
|
+
validateChanged(callback?: (valid: boolean) => void): void;
|
|
479
|
+
validateField(ci?: number, ri?: number): void;
|
|
480
|
+
getValidations(): any[][];
|
|
481
|
+
setValidations(errors?: any[]): void;
|
|
482
|
+
clearValidations(): void;
|
|
483
|
+
updateData(data?: any[]): void;
|
|
484
|
+
/**
|
|
485
|
+
* 暂停所有 GIF 动画
|
|
486
|
+
*/
|
|
487
|
+
pauseGif(): void;
|
|
488
|
+
/**
|
|
489
|
+
* 恢复所有 GIF 动画
|
|
490
|
+
*/
|
|
491
|
+
resumeGif(): void;
|
|
492
|
+
/**
|
|
493
|
+
* 切换 GIF 动画播放状态
|
|
494
|
+
* @returns 当前播放状态(true: 播放中, false: 已暂停)
|
|
495
|
+
*/
|
|
496
|
+
toggleGif(): boolean;
|
|
497
|
+
/**
|
|
498
|
+
* 获取 GIF 动画播放状态
|
|
499
|
+
* @returns 当前播放状态(true: 播放中, false: 已暂停)
|
|
500
|
+
*/
|
|
501
|
+
isGifEnabled(): boolean;
|
|
502
|
+
/**
|
|
503
|
+
* 设置斑马纹开关
|
|
504
|
+
* @param enabled 是否启用斑马纹
|
|
505
|
+
*/
|
|
506
|
+
setStriped(enabled: boolean): void;
|
|
507
|
+
/**
|
|
508
|
+
* 获取斑马纹状态
|
|
509
|
+
* @returns 当前斑马纹状态
|
|
510
|
+
*/
|
|
511
|
+
getStriped(): boolean;
|
|
512
|
+
/**
|
|
513
|
+
* 切换斑马纹状态
|
|
514
|
+
* @returns 当前斑马纹状态
|
|
515
|
+
*/
|
|
516
|
+
toggleStriped(): boolean;
|
|
517
|
+
/**
|
|
518
|
+
* 设置主题
|
|
519
|
+
* @param theme 主题名称或主题对象
|
|
520
|
+
*/
|
|
521
|
+
setTheme(theme: string | TableTheme): void;
|
|
522
|
+
/**
|
|
523
|
+
* 获取当前主题
|
|
524
|
+
* @returns 当前主题对象
|
|
525
|
+
*/
|
|
526
|
+
getTheme(): TableTheme;
|
|
527
|
+
/**
|
|
528
|
+
* 注册自定义样式类
|
|
529
|
+
* @param className 样式类名
|
|
530
|
+
* @param style 样式对象
|
|
531
|
+
*/
|
|
532
|
+
registerStyle(className: string, style: any): void;
|
|
533
|
+
/**
|
|
534
|
+
* 批量注册样式类
|
|
535
|
+
* @param styles 样式对象集合
|
|
536
|
+
*/
|
|
537
|
+
registerStyles(styles: Record<string, any>): void;
|
|
538
|
+
/**
|
|
539
|
+
* 设置行高
|
|
540
|
+
* @param height 行高值(像素)
|
|
541
|
+
*/
|
|
542
|
+
setRowHeight(height: number): void;
|
|
543
|
+
/**
|
|
544
|
+
* 获取当前行高
|
|
545
|
+
* @returns 当前行高值
|
|
546
|
+
*/
|
|
547
|
+
getRowHeight(): number;
|
|
548
|
+
/**
|
|
549
|
+
* 设置日期显示类型(绝对时间/相对时间)
|
|
550
|
+
* @param dateDisplayType 日期显示类型值
|
|
551
|
+
*/
|
|
552
|
+
setDateDisplayType(dateDisplayType: string): void;
|
|
553
|
+
/**
|
|
554
|
+
* 开始行拖拽
|
|
555
|
+
*/
|
|
556
|
+
startRowDrag(rowIndex: number, mouseY: number): void;
|
|
557
|
+
/**
|
|
558
|
+
* 更新行拖拽状态
|
|
559
|
+
*/
|
|
560
|
+
updateRowDrag(mouseX: number, mouseY: number): void;
|
|
561
|
+
/**
|
|
562
|
+
* 结束行拖拽
|
|
563
|
+
*/
|
|
564
|
+
endRowDrag(): void;
|
|
565
|
+
/**
|
|
566
|
+
* 取消行拖拽
|
|
567
|
+
*/
|
|
568
|
+
cancelRowDrag(): void;
|
|
569
|
+
/**
|
|
570
|
+
* 设置hover行索引
|
|
571
|
+
* @param rowIndex 行索引,-1表示无hover
|
|
572
|
+
*/
|
|
573
|
+
setHoverRow(rowIndex: number): void;
|
|
574
|
+
/**
|
|
575
|
+
* 设置hover单元格索引
|
|
576
|
+
* @param colIndex 列索引,-1表示无hover
|
|
577
|
+
* @param rowIndex 行索引,-1表示无hover
|
|
578
|
+
*/
|
|
579
|
+
setHoverCell(colIndex: number, rowIndex: number): void;
|
|
580
|
+
/**
|
|
581
|
+
* 设置滚动状态
|
|
582
|
+
* @param isScrolling 是否正在滚动
|
|
583
|
+
*/
|
|
584
|
+
setScrolling(isScrolling: boolean): void;
|
|
585
|
+
/**
|
|
586
|
+
* 预加载 loading 图片
|
|
587
|
+
*/
|
|
588
|
+
private preloadLoadingImage;
|
|
589
|
+
/**
|
|
590
|
+
* 显示指定单元格的 loading 状态
|
|
591
|
+
* @param rowIds 行的唯一标识数组(基于 rowKey 配置对应的行数据字段值)
|
|
592
|
+
* @param columnKeys 列的 key 字段数组
|
|
593
|
+
* @param timeout 超时时间(毫秒),默认 60000(1 分钟)
|
|
594
|
+
*/
|
|
595
|
+
showLoading(rowIds: string[], columnKeys: string[], timeout?: number): void;
|
|
596
|
+
/**
|
|
597
|
+
* 手动停止指定单元格的 loading
|
|
598
|
+
* @param rowIds 行的唯一标识数组
|
|
599
|
+
* @param columnKeys 列的 key 字段数组
|
|
600
|
+
*/
|
|
601
|
+
hideLoading(rowIds: string[], columnKeys: string[]): void;
|
|
602
|
+
/**
|
|
603
|
+
* 清理所有 loading 状态
|
|
604
|
+
*/
|
|
605
|
+
clearAllLoading(): void;
|
|
606
|
+
/**
|
|
607
|
+
* 内部辅助:移除单个 loading 状态
|
|
608
|
+
*/
|
|
609
|
+
private removeSingleLoading;
|
|
610
|
+
/**
|
|
611
|
+
* 查询指定 cellKey 是否处于 loading 状态
|
|
612
|
+
*/
|
|
613
|
+
isLoadingCell(cellKey: string): boolean;
|
|
614
|
+
/**
|
|
615
|
+
* 获取当前 loading 旋转角度
|
|
616
|
+
*/
|
|
617
|
+
getLoadingRotation(): number;
|
|
618
|
+
/**
|
|
619
|
+
* 获取预加载的 loading 图片
|
|
620
|
+
*/
|
|
621
|
+
getLoadingImage(): HTMLImageElement | null;
|
|
622
|
+
/**
|
|
623
|
+
* 启动 loading 动画循环(轻量级:仅更新角度 + markDirty)
|
|
624
|
+
*/
|
|
625
|
+
private startLoadingAnimation;
|
|
626
|
+
/**
|
|
627
|
+
* 停止 loading 动画循环
|
|
628
|
+
*/
|
|
629
|
+
private stopLoadingAnimation;
|
|
630
|
+
/**
|
|
631
|
+
* Get layout information for a specific cell identified by rowId and columnKey.
|
|
632
|
+
* Returns a deep copy to prevent accidental mutation of internal state.
|
|
633
|
+
* @param rowId - Row identifier (number for normal/viewer, string for grouped)
|
|
634
|
+
* @param columnKey - Column key string
|
|
635
|
+
* @returns CellLayout object or null if cell not found
|
|
636
|
+
*/
|
|
637
|
+
testGetCellLayout(rowId: string | number, columnKey: string): {
|
|
638
|
+
x: number;
|
|
639
|
+
y: number;
|
|
640
|
+
width: number;
|
|
641
|
+
height: number;
|
|
642
|
+
visible: boolean;
|
|
643
|
+
columnKey: string;
|
|
644
|
+
rowId: string | number;
|
|
645
|
+
colIndex: number;
|
|
646
|
+
rowIndex: number;
|
|
647
|
+
fixed: string;
|
|
648
|
+
} | null;
|
|
649
|
+
/**
|
|
650
|
+
* Get all cells currently visible in the viewport.
|
|
651
|
+
* Only returns cells rendered by the virtual scroll engine.
|
|
652
|
+
* @returns Array of visible cell layout objects
|
|
653
|
+
*/
|
|
654
|
+
testGetAllVisibleCells(): Array<{
|
|
655
|
+
x: number;
|
|
656
|
+
y: number;
|
|
657
|
+
width: number;
|
|
658
|
+
height: number;
|
|
659
|
+
visible: boolean;
|
|
660
|
+
columnKey: string;
|
|
661
|
+
rowId: string | number;
|
|
662
|
+
colIndex: number;
|
|
663
|
+
rowIndex: number;
|
|
664
|
+
fixed: string;
|
|
665
|
+
value: any;
|
|
666
|
+
label: string;
|
|
667
|
+
}>;
|
|
668
|
+
/**
|
|
669
|
+
* Get configuration for a specific column by its key.
|
|
670
|
+
* Supports both top-level columns and nested child columns.
|
|
671
|
+
* @param columnKey - Column key string
|
|
672
|
+
* @returns Column configuration object or null if not found
|
|
673
|
+
*/
|
|
674
|
+
testGetColumnConfig(columnKey: string): {
|
|
675
|
+
key: string;
|
|
676
|
+
title: string;
|
|
677
|
+
width: number;
|
|
678
|
+
fixed: string;
|
|
679
|
+
visible: boolean;
|
|
680
|
+
index: number;
|
|
681
|
+
level: number;
|
|
682
|
+
type: string;
|
|
683
|
+
children: any[] | null;
|
|
684
|
+
colspan: number;
|
|
685
|
+
rowspan: number;
|
|
686
|
+
parentKey: string | null;
|
|
687
|
+
} | null;
|
|
688
|
+
/**
|
|
689
|
+
* Get data for a specific row identified by rowId.
|
|
690
|
+
* @param rowId - Row identifier
|
|
691
|
+
* @returns Row data object (deep copy) or null if not found
|
|
692
|
+
*/
|
|
693
|
+
testGetRowData(rowId: string | number): Record<string, any> | null;
|
|
694
|
+
/**
|
|
695
|
+
* Get current scroll position and scrollbar state.
|
|
696
|
+
* @returns ScrollPosition object
|
|
697
|
+
*/
|
|
698
|
+
testGetScrollPosition(): {
|
|
699
|
+
scrollX: number;
|
|
700
|
+
scrollY: number;
|
|
701
|
+
maxScrollX: number;
|
|
702
|
+
maxScrollY: number;
|
|
703
|
+
hasHorizontalScrollbar: boolean;
|
|
704
|
+
hasVerticalScrollbar: boolean;
|
|
705
|
+
};
|
|
706
|
+
/**
|
|
707
|
+
* Get overall table dimensions and metrics.
|
|
708
|
+
* @returns TableDimensions object
|
|
709
|
+
*/
|
|
710
|
+
testGetTableDimensions(): {
|
|
711
|
+
containerWidth: number;
|
|
712
|
+
containerHeight: number;
|
|
713
|
+
tableWidth: number;
|
|
714
|
+
tableHeight: number;
|
|
715
|
+
headerHeight: number;
|
|
716
|
+
rowHeight: number;
|
|
717
|
+
fixedLeftWidth: number;
|
|
718
|
+
fixedRightWidth: number;
|
|
719
|
+
totalRows: number;
|
|
720
|
+
totalColumns: number;
|
|
721
|
+
};
|
|
722
|
+
/**
|
|
723
|
+
* Test hook: Compare header column widths with body cell widths.
|
|
724
|
+
* Returns per-column comparison to detect header/body width mismatches,
|
|
725
|
+
* especially for nested (multi-sub-column) columns.
|
|
726
|
+
*/
|
|
727
|
+
testGetHeaderBodyWidthComparison(): Array<{
|
|
728
|
+
colIndex: number;
|
|
729
|
+
columnKey: string;
|
|
730
|
+
headerWidth: number;
|
|
731
|
+
bodyCellWidth: number;
|
|
732
|
+
isNested: boolean;
|
|
733
|
+
match: boolean;
|
|
734
|
+
}>;
|
|
735
|
+
/**
|
|
736
|
+
* Find row index by row ID, searching through body data.
|
|
737
|
+
* Supports both numeric and string row IDs.
|
|
738
|
+
* @param rowId - Row identifier to search for
|
|
739
|
+
* @returns Row index or -1 if not found
|
|
740
|
+
*/
|
|
741
|
+
private findRowIndexById;
|
|
742
|
+
/** 动态切换 footer 显示状态 */
|
|
743
|
+
setShowFooter(show: boolean): void;
|
|
744
|
+
/** 一次性设置所有列的 footer 统计数据 */
|
|
745
|
+
setFooterData(data: FooterData): void;
|
|
746
|
+
/** 设置单列的 footer 统计数据 */
|
|
747
|
+
setFooterCellData(columnKey: string, data: FooterCellData): void;
|
|
748
|
+
}
|
|
749
|
+
export default DataGrid;
|