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.
Files changed (123) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +257 -0
  4. package/dist/arthub-table.common.js +2 -0
  5. package/dist/arthub-table.common.js.map +1 -0
  6. package/dist/arthub-table.css +1 -0
  7. package/dist/arthub-table.umd.js +2 -0
  8. package/dist/arthub-table.umd.js.map +1 -0
  9. package/dist/arthub-table.umd.min.js +2 -0
  10. package/dist/arthub-table.umd.min.js.map +1 -0
  11. package/dist/demo.html +1 -0
  12. package/dist/img/ah-icon_audio_pause.55c06fbf.svg +3 -0
  13. package/dist/img/ah-icon_closeshape.82e52181.svg +3 -0
  14. package/dist/img/icon_attachment.724d33ba.svg +3 -0
  15. package/dist/img/icon_default.9ef1a394.svg +5 -0
  16. package/dist/img/icon_edit.9966e699.svg +3 -0
  17. package/dist/img/icon_error_dark.2a057cdd.svg +17 -0
  18. package/dist/img/icon_error_light.ac6763e9.svg +17 -0
  19. package/dist/img/icon_failure_dark.f68723a7.svg +25 -0
  20. package/dist/img/icon_failure_light.489a7167.svg +25 -0
  21. package/dist/img/icon_folder.ea3efcce.svg +11 -0
  22. package/dist/img/icon_netdisc.d8bbe2e0.svg +4 -0
  23. package/dist/img/icon_singlearrowright.6adcd336.svg +4 -0
  24. package/dist/img/icon_totalNum.23a86d16.svg +3 -0
  25. package/dist/img/icon_transform_dark.033764ea.svg +26 -0
  26. package/dist/img/icon_transform_light.fa9fbcbd.svg +26 -0
  27. package/dist/img/img_3d.39b27128.svg +14 -0
  28. package/dist/img/img_aep.a898e3e7.svg +8 -0
  29. package/dist/img/img_ai.61f08a0a.svg +8 -0
  30. package/dist/img/img_audio.e4ada65c.svg +5 -0
  31. package/dist/img/img_enf.ad88f95d.svg +28 -0
  32. package/dist/img/img_excel.56663d85.svg +30 -0
  33. package/dist/img/img_exe.5e3fc198.svg +27 -0
  34. package/dist/img/img_img.ac2e0d0c.svg +8 -0
  35. package/dist/img/img_mcp.393ef169.svg +28 -0
  36. package/dist/img/img_pdf.f4da9922.svg +7 -0
  37. package/dist/img/img_ppt.d172780f.svg +26 -0
  38. package/dist/img/img_pxcook.7e9fce57.svg +18 -0
  39. package/dist/img/img_rarzip7z.e3b1de82.svg +28 -0
  40. package/dist/img/img_sketch.d49a9bd4.svg +32 -0
  41. package/dist/img/img_video.b6ac6198.svg +7 -0
  42. package/dist/img/img_word.0c1d3c88.svg +31 -0
  43. package/dist/img/img_x2d.6acc94f6.svg +28 -0
  44. package/dist/img/img_xd.cc23d09a.svg +28 -0
  45. package/dist/img/matrix-icon_finish.617f5d3e.svg +3 -0
  46. package/dist/img/matrix-icon_inprogress.3781156a.svg +3 -0
  47. package/dist/img/matrix-icon_supervise.edae43f0.svg +3 -0
  48. package/dist/types/assets/icon/iconBase64.d.ts +3 -0
  49. package/dist/types/components/Icon/index.d.ts +2 -0
  50. package/dist/types/components/clickoutside.d.ts +3 -0
  51. package/dist/types/core/Body.d.ts +142 -0
  52. package/dist/types/core/Cell.d.ts +94 -0
  53. package/dist/types/core/Clipboard.d.ts +16 -0
  54. package/dist/types/core/ColumnHeader.d.ts +24 -0
  55. package/dist/types/core/Context.d.ts +24 -0
  56. package/dist/types/core/DataGrid.d.ts +749 -0
  57. package/dist/types/core/EdgeScroller.d.ts +75 -0
  58. package/dist/types/core/Editor.d.ts +33 -0
  59. package/dist/types/core/Events.d.ts +25 -0
  60. package/dist/types/core/Footer.d.ts +37 -0
  61. package/dist/types/core/GifAnimationManager.d.ts +69 -0
  62. package/dist/types/core/GifOverlay.d.ts +33 -0
  63. package/dist/types/core/GroupRow.d.ts +80 -0
  64. package/dist/types/core/Header.d.ts +40 -0
  65. package/dist/types/core/History.d.ts +27 -0
  66. package/dist/types/core/ImageManager.d.ts +94 -0
  67. package/dist/types/core/NestedGrid.d.ts +177 -0
  68. package/dist/types/core/Paint.d.ts +101 -0
  69. package/dist/types/core/PerformanceMonitor.d.ts +96 -0
  70. package/dist/types/core/Row.d.ts +31 -0
  71. package/dist/types/core/RowHeader.d.ts +22 -0
  72. package/dist/types/core/Scroller.d.ts +33 -0
  73. package/dist/types/core/Selector.d.ts +9 -0
  74. package/dist/types/core/StyleManager.d.ts +108 -0
  75. package/dist/types/core/Tooltip.d.ts +28 -0
  76. package/dist/types/core/Validator.d.ts +26 -0
  77. package/dist/types/core/config.d.ts +5 -0
  78. package/dist/types/core/constants.d.ts +39 -0
  79. package/dist/types/core/element.d.ts +36 -0
  80. package/dist/types/core/extension-type-mapping.d.ts +5 -0
  81. package/dist/types/core/footer/utils.d.ts +7 -0
  82. package/dist/types/core/types.d.ts +399 -0
  83. package/dist/types/core/util.d.ts +17 -0
  84. package/dist/types/core/viewers/BooleanViewer.d.ts +46 -0
  85. package/dist/types/core/viewers/DatetimeViewer.d.ts +33 -0
  86. package/dist/types/core/viewers/DeliverableReviewViewer.d.ts +87 -0
  87. package/dist/types/core/viewers/FileStorageSpecViewer.d.ts +37 -0
  88. package/dist/types/core/viewers/FileViewer.d.ts +118 -0
  89. package/dist/types/core/viewers/GroupHeaderViewer.d.ts +73 -0
  90. package/dist/types/core/viewers/HyperlinkTextViewer.d.ts +80 -0
  91. package/dist/types/core/viewers/ImageViewer.d.ts +31 -0
  92. package/dist/types/core/viewers/ItfsPathViewer.d.ts +58 -0
  93. package/dist/types/core/viewers/ModuleViewer.d.ts +53 -0
  94. package/dist/types/core/viewers/NestedGridViewer.d.ts +47 -0
  95. package/dist/types/core/viewers/PersonViewer.d.ts +61 -0
  96. package/dist/types/core/viewers/PivotViewer.d.ts +43 -0
  97. package/dist/types/core/viewers/PriorityTextViewer.d.ts +35 -0
  98. package/dist/types/core/viewers/ProgressViewer.d.ts +68 -0
  99. package/dist/types/core/viewers/PunchTimingViewer.d.ts +42 -0
  100. package/dist/types/core/viewers/PunchViewer.d.ts +116 -0
  101. package/dist/types/core/viewers/RichTextViewer.d.ts +83 -0
  102. package/dist/types/core/viewers/SelectViewer.d.ts +57 -0
  103. package/dist/types/core/viewers/SeparatorRowViewer.d.ts +25 -0
  104. package/dist/types/core/viewers/StatusTextViewer.d.ts +40 -0
  105. package/dist/types/core/viewers/StatusViewer.d.ts +53 -0
  106. package/dist/types/core/viewers/TableActionButtonViewer.d.ts +77 -0
  107. package/dist/types/core/viewers/TaskNodeViewer.d.ts +106 -0
  108. package/dist/types/core/viewers/TextViewer.d.ts +37 -0
  109. package/dist/types/core/viewers/TextViewerWithSwitcher.d.ts +112 -0
  110. package/dist/types/core/viewers/ThemeViewer.d.ts +36 -0
  111. package/dist/types/core/viewers/TreeDropdownViewer.d.ts +55 -0
  112. package/dist/types/core/viewers/UpstreamViewer.d.ts +79 -0
  113. package/dist/types/core/viewers/ViewerRegistry.d.ts +76 -0
  114. package/dist/types/core/viewers/WfStateViewer.d.ts +76 -0
  115. package/dist/types/core/viewers/WorkflowViewer.d.ts +37 -0
  116. package/dist/types/core/viewers/index.d.ts +114 -0
  117. package/dist/types/core/viewers/types.d.ts +1097 -0
  118. package/dist/types/index.d.ts +37 -0
  119. package/dist/types/testing/SnapshotManager.d.ts +55 -0
  120. package/dist/types/testing/TestHooks.d.ts +275 -0
  121. package/dist/types/testing/index.d.ts +3 -0
  122. package/dist/types/testing/installTestHooks.d.ts +16 -0
  123. 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;