@reogrid/pro 0.1.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/package.json +51 -0
- package/pro-react.cjs +7770 -0
- package/pro-react.cjs.map +1 -0
- package/pro-react.d.cts +692 -0
- package/pro-react.d.ts +692 -0
- package/pro-react.js +7751 -0
- package/pro-react.js.map +1 -0
- package/pro-vue.cjs +7784 -0
- package/pro-vue.cjs.map +1 -0
- package/pro-vue.d.cts +719 -0
- package/pro-vue.d.ts +719 -0
- package/pro-vue.js +7768 -0
- package/pro-vue.js.map +1 -0
- package/pro.cjs +7738 -0
- package/pro.cjs.map +1 -0
- package/pro.d.cts +677 -0
- package/pro.d.ts +677 -0
- package/pro.js +7713 -0
- package/pro.js.map +1 -0
package/pro-react.d.cts
ADDED
|
@@ -0,0 +1,692 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface RangeRect {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
}
|
|
10
|
+
type CellHit = {
|
|
11
|
+
type: 'cell';
|
|
12
|
+
row: number;
|
|
13
|
+
column: number;
|
|
14
|
+
};
|
|
15
|
+
type RowHeaderHit = {
|
|
16
|
+
type: 'row-header';
|
|
17
|
+
row: number;
|
|
18
|
+
};
|
|
19
|
+
type ColumnHeaderHit = {
|
|
20
|
+
type: 'column-header';
|
|
21
|
+
column: number;
|
|
22
|
+
};
|
|
23
|
+
type CornerHit = {
|
|
24
|
+
type: 'corner';
|
|
25
|
+
};
|
|
26
|
+
type HitTestResult = CellHit | RowHeaderHit | ColumnHeaderHit | CornerHit;
|
|
27
|
+
|
|
28
|
+
type SelectionBounds = RangeRect & {
|
|
29
|
+
topRow: number;
|
|
30
|
+
bottomRow: number;
|
|
31
|
+
leftColumn: number;
|
|
32
|
+
rightColumn: number;
|
|
33
|
+
};
|
|
34
|
+
declare class SelectionRange {
|
|
35
|
+
private readonly worksheet;
|
|
36
|
+
private startRow;
|
|
37
|
+
private startColumn;
|
|
38
|
+
private endRow;
|
|
39
|
+
private endColumn;
|
|
40
|
+
private anchorBounds;
|
|
41
|
+
constructor(worksheet: Worksheet);
|
|
42
|
+
reset(): void;
|
|
43
|
+
begin(row: number, column: number): void;
|
|
44
|
+
update(row: number, column: number): void;
|
|
45
|
+
isActive(): boolean;
|
|
46
|
+
clampCell(row: number, column: number): {
|
|
47
|
+
row: number;
|
|
48
|
+
column: number;
|
|
49
|
+
};
|
|
50
|
+
setRange(startRow: number, startColumn: number, endRow: number, endColumn: number): void;
|
|
51
|
+
selectRows(startRow: number, endRow?: number): void;
|
|
52
|
+
selectColumns(startColumn: number, endColumn?: number): void;
|
|
53
|
+
selectAll(): void;
|
|
54
|
+
getNormalizedBounds(): SelectionBounds | null;
|
|
55
|
+
draw(ctx: CanvasRenderingContext2D): void;
|
|
56
|
+
getActiveCell(): {
|
|
57
|
+
row: number;
|
|
58
|
+
column: number;
|
|
59
|
+
} | null;
|
|
60
|
+
moveActiveCell(rowDelta: number, columnDelta: number): {
|
|
61
|
+
row: number;
|
|
62
|
+
column: number;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
type TextAlign = 'left' | 'center' | 'right';
|
|
67
|
+
type VerticalAlign = 'top' | 'middle' | 'bottom';
|
|
68
|
+
type TextWrapMode = 'none' | 'wrap' | 'break-word';
|
|
69
|
+
interface CellStyle {
|
|
70
|
+
fontFamily: string;
|
|
71
|
+
fontSize: number;
|
|
72
|
+
bold: boolean;
|
|
73
|
+
italic: boolean;
|
|
74
|
+
underline: boolean;
|
|
75
|
+
backgroundColor: string;
|
|
76
|
+
color: string;
|
|
77
|
+
textAlign: TextAlign;
|
|
78
|
+
verticalAlign: VerticalAlign;
|
|
79
|
+
textWrapMode: TextWrapMode;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
interface RichTextRun {
|
|
83
|
+
text: string;
|
|
84
|
+
fontFamily?: string;
|
|
85
|
+
fontSize?: number;
|
|
86
|
+
bold?: boolean;
|
|
87
|
+
italic?: boolean;
|
|
88
|
+
underline?: boolean;
|
|
89
|
+
color?: string;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
interface CellInputValue {
|
|
93
|
+
row: number;
|
|
94
|
+
column: number;
|
|
95
|
+
value: string;
|
|
96
|
+
displayValue?: string;
|
|
97
|
+
numberFormat?: string;
|
|
98
|
+
style?: Partial<CellStyle>;
|
|
99
|
+
richText?: RichTextRun[];
|
|
100
|
+
}
|
|
101
|
+
interface MergedCellRange {
|
|
102
|
+
topRow: number;
|
|
103
|
+
leftColumn: number;
|
|
104
|
+
bottomRow: number;
|
|
105
|
+
rightColumn: number;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
type BorderSide = 'top' | 'right' | 'bottom' | 'left';
|
|
109
|
+
type RangeBorderSide = BorderSide | 'outside';
|
|
110
|
+
type BorderLineStyle = 'solid' | 'dashed' | 'dotted';
|
|
111
|
+
interface BorderLineOptions {
|
|
112
|
+
style: BorderLineStyle;
|
|
113
|
+
color?: string;
|
|
114
|
+
width?: number;
|
|
115
|
+
}
|
|
116
|
+
interface CellBorderDefinition {
|
|
117
|
+
top?: BorderLine;
|
|
118
|
+
right?: BorderLine;
|
|
119
|
+
bottom?: BorderLine;
|
|
120
|
+
left?: BorderLine;
|
|
121
|
+
}
|
|
122
|
+
interface BorderLine {
|
|
123
|
+
style: BorderLineStyle;
|
|
124
|
+
color: string;
|
|
125
|
+
width: number;
|
|
126
|
+
appliedAt?: number;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
declare class BorderManager {
|
|
130
|
+
private readonly getRows;
|
|
131
|
+
private readonly getColumns;
|
|
132
|
+
private readonly data;
|
|
133
|
+
private sequence;
|
|
134
|
+
constructor(getRows: () => number, getColumns: () => number);
|
|
135
|
+
get size(): number;
|
|
136
|
+
entries(): Iterable<[string, CellBorderDefinition]>;
|
|
137
|
+
getCell(row: number, column: number): CellBorderDefinition | undefined;
|
|
138
|
+
applyAll(borders: Map<string, CellBorderDefinition>): void;
|
|
139
|
+
setRange(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number, border: BorderLineOptions, sides?: RangeBorderSide[]): void;
|
|
140
|
+
pruneOutsideGrid(): void;
|
|
141
|
+
private assignBorder;
|
|
142
|
+
private removeBorderSide;
|
|
143
|
+
private removeAdjacentBorder;
|
|
144
|
+
private getAdjacentCell;
|
|
145
|
+
private oppositeSide;
|
|
146
|
+
private getOrCreate;
|
|
147
|
+
private normalizeLine;
|
|
148
|
+
private normalizeSides;
|
|
149
|
+
private normalizeBounds;
|
|
150
|
+
private isCellInBounds;
|
|
151
|
+
private nextSequence;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
declare class MergeManager {
|
|
155
|
+
private readonly getRows;
|
|
156
|
+
private readonly getColumns;
|
|
157
|
+
/** Maps every cell key in a merged range to that range's descriptor. */
|
|
158
|
+
private readonly cells;
|
|
159
|
+
/** Maps only anchor (top-left) cell keys to their merged range descriptor. */
|
|
160
|
+
private readonly anchors;
|
|
161
|
+
constructor(getRows: () => number, getColumns: () => number);
|
|
162
|
+
get anchorCount(): number;
|
|
163
|
+
iterateAnchors(): IterableIterator<MergedCellRange>;
|
|
164
|
+
get(row: number, column: number): MergedCellRange | null;
|
|
165
|
+
isAnchor(row: number, column: number): boolean;
|
|
166
|
+
getBounds(row: number, column: number): {
|
|
167
|
+
topRow: number;
|
|
168
|
+
bottomRow: number;
|
|
169
|
+
leftColumn: number;
|
|
170
|
+
rightColumn: number;
|
|
171
|
+
};
|
|
172
|
+
setAll(ranges: Iterable<MergedCellRange>): void;
|
|
173
|
+
add(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): void;
|
|
174
|
+
remove(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): boolean;
|
|
175
|
+
clear(): boolean;
|
|
176
|
+
expandSelection(bounds: {
|
|
177
|
+
top: number;
|
|
178
|
+
bottom: number;
|
|
179
|
+
left: number;
|
|
180
|
+
right: number;
|
|
181
|
+
}): {
|
|
182
|
+
top: number;
|
|
183
|
+
bottom: number;
|
|
184
|
+
left: number;
|
|
185
|
+
right: number;
|
|
186
|
+
};
|
|
187
|
+
getMergedLineGaps(): {
|
|
188
|
+
horizontal: Map<number, Array<{
|
|
189
|
+
startColumnBoundary: number;
|
|
190
|
+
endColumnBoundary: number;
|
|
191
|
+
}>>;
|
|
192
|
+
vertical: Map<number, Array<{
|
|
193
|
+
startRowBoundary: number;
|
|
194
|
+
endRowBoundary: number;
|
|
195
|
+
}>>;
|
|
196
|
+
};
|
|
197
|
+
pruneOutsideGrid(): void;
|
|
198
|
+
allAnchors(): MergedCellRange[];
|
|
199
|
+
private applyRange;
|
|
200
|
+
private removeRange;
|
|
201
|
+
private removeOverlapping;
|
|
202
|
+
private rangesOverlap;
|
|
203
|
+
private normalizeRange;
|
|
204
|
+
private normalizeBounds;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
type SelectionChangeListener = (cell: {
|
|
208
|
+
row: number;
|
|
209
|
+
column: number;
|
|
210
|
+
} | null) => void;
|
|
211
|
+
type CellValueChangeListener = (payload: {
|
|
212
|
+
row: number;
|
|
213
|
+
column: number;
|
|
214
|
+
value: string;
|
|
215
|
+
}) => void;
|
|
216
|
+
type ViewportSizeListener = (size: {
|
|
217
|
+
width: number;
|
|
218
|
+
height: number;
|
|
219
|
+
}) => void;
|
|
220
|
+
type ScrollChangeListener = (offset: {
|
|
221
|
+
x: number;
|
|
222
|
+
y: number;
|
|
223
|
+
}) => void;
|
|
224
|
+
type WorksheetExportCell = {
|
|
225
|
+
row: number;
|
|
226
|
+
column: number;
|
|
227
|
+
value?: string;
|
|
228
|
+
style?: CellStyle;
|
|
229
|
+
};
|
|
230
|
+
interface WorksheetExportSnapshot {
|
|
231
|
+
cells: WorksheetExportCell[];
|
|
232
|
+
merges: MergedCellRange[];
|
|
233
|
+
columnWidths: number[];
|
|
234
|
+
rowHeights: number[];
|
|
235
|
+
rows: number;
|
|
236
|
+
columns: number;
|
|
237
|
+
}
|
|
238
|
+
declare class Worksheet {
|
|
239
|
+
protected pixelRatio: number;
|
|
240
|
+
private readonly pointToPixelRatio;
|
|
241
|
+
protected viewportWidth: number;
|
|
242
|
+
protected viewportHeight: number;
|
|
243
|
+
rows: number;
|
|
244
|
+
columns: number;
|
|
245
|
+
readonly columnWidths: number[];
|
|
246
|
+
private readonly columnCustomWidths;
|
|
247
|
+
readonly rowHeights: number[];
|
|
248
|
+
private readonly rowCustomHeights;
|
|
249
|
+
private columnBoundaries;
|
|
250
|
+
private rowBoundaries;
|
|
251
|
+
headerColumnWidth: number;
|
|
252
|
+
headerRowHeight: number;
|
|
253
|
+
readonly selection: SelectionRange;
|
|
254
|
+
private readonly cellInputs;
|
|
255
|
+
private readonly cellRichText;
|
|
256
|
+
private readonly cellDisplayOverrides;
|
|
257
|
+
private readonly cellNumberFormats;
|
|
258
|
+
private readonly cellFormatting;
|
|
259
|
+
protected readonly borders: BorderManager;
|
|
260
|
+
protected readonly merges: MergeManager;
|
|
261
|
+
private readonly selectionChangeListeners;
|
|
262
|
+
private readonly cellValueListeners;
|
|
263
|
+
private readonly viewportSizeListeners;
|
|
264
|
+
private readonly scrollListeners;
|
|
265
|
+
private readonly structureListeners;
|
|
266
|
+
private readonly defaultStyle;
|
|
267
|
+
private _showGridLines;
|
|
268
|
+
protected resizeGuide: {
|
|
269
|
+
type: 'column' | 'row';
|
|
270
|
+
position: number;
|
|
271
|
+
} | null;
|
|
272
|
+
private readonly formulaEngine;
|
|
273
|
+
protected scrollX: number;
|
|
274
|
+
protected scrollY: number;
|
|
275
|
+
private contentWidth;
|
|
276
|
+
private contentHeight;
|
|
277
|
+
constructor();
|
|
278
|
+
render(): void;
|
|
279
|
+
getScrollContentSize(): {
|
|
280
|
+
width: number;
|
|
281
|
+
height: number;
|
|
282
|
+
};
|
|
283
|
+
getScrollOffset(): {
|
|
284
|
+
x: number;
|
|
285
|
+
y: number;
|
|
286
|
+
};
|
|
287
|
+
setScrollOffset(x: number, y: number): void;
|
|
288
|
+
onViewportSizeChange(listener: ViewportSizeListener): () => void;
|
|
289
|
+
onScrollChange(listener: ScrollChangeListener): () => void;
|
|
290
|
+
onStructureChange(listener: () => void): () => void;
|
|
291
|
+
getCellFromPoint(x: number, y: number): {
|
|
292
|
+
row: number;
|
|
293
|
+
column: number;
|
|
294
|
+
} | null;
|
|
295
|
+
hitTest(x: number, y: number): HitTestResult | null;
|
|
296
|
+
updateBoundaries(): void;
|
|
297
|
+
ensureBoundaries(): void;
|
|
298
|
+
protected getColumnBoundaries(): readonly number[];
|
|
299
|
+
protected getRowBoundaries(): readonly number[];
|
|
300
|
+
protected getColumnWidths(): readonly number[];
|
|
301
|
+
protected getRowHeights(): readonly number[];
|
|
302
|
+
protected getCellBorders(): Iterable<[string, CellBorderDefinition]>;
|
|
303
|
+
getBodyViewportWidth(): number;
|
|
304
|
+
getBodyViewportHeight(): number;
|
|
305
|
+
private clampScrollOffset;
|
|
306
|
+
protected clampScrollOffsetInPlace(): void;
|
|
307
|
+
getRangeRect(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): RangeRect;
|
|
308
|
+
getCellRect(row: number, column: number): RangeRect;
|
|
309
|
+
getVisibleRowRange(padding?: number): {
|
|
310
|
+
start: number;
|
|
311
|
+
end: number;
|
|
312
|
+
};
|
|
313
|
+
getVisibleColumnRange(padding?: number): {
|
|
314
|
+
start: number;
|
|
315
|
+
end: number;
|
|
316
|
+
};
|
|
317
|
+
getVisibleRowIndices(): number[];
|
|
318
|
+
getVisibleColumnIndices(): number[];
|
|
319
|
+
getColumnResizeHandle(x: number, y: number, tolerance?: number): number | null;
|
|
320
|
+
getRowResizeHandle(x: number, y: number, tolerance?: number): number | null;
|
|
321
|
+
getColumnStart(column: number): number;
|
|
322
|
+
getRowStart(row: number): number;
|
|
323
|
+
getCellInput(row: number, column: number): string | undefined;
|
|
324
|
+
protected getRichTextRuns(row: number, column: number): RichTextRun[] | undefined;
|
|
325
|
+
setCellInput(row: number, column: number, value: string): void;
|
|
326
|
+
loadCells(cells: Iterable<CellInputValue>): void;
|
|
327
|
+
private updateCellDisplayValue;
|
|
328
|
+
protected getCellText(row: number, column: number): string | null;
|
|
329
|
+
getComputedCellStyle(row: number, column: number): CellStyle;
|
|
330
|
+
getActiveCellStyle(): CellStyle;
|
|
331
|
+
getDefaultCellStyle(): CellStyle;
|
|
332
|
+
setCellStyle(row: number, column: number, style: Partial<CellStyle>): void;
|
|
333
|
+
private setCellFormatting;
|
|
334
|
+
setSelectionFontFamily(fontFamily: string): void;
|
|
335
|
+
setSelectionFontSize(fontSize: number): void;
|
|
336
|
+
setSelectionFontBold(enabled: boolean): void;
|
|
337
|
+
setSelectionFontItalic(enabled: boolean): void;
|
|
338
|
+
setSelectionUnderline(enabled: boolean): void;
|
|
339
|
+
setSelectionBackgroundColor(color: string): void;
|
|
340
|
+
setSelectionHorizontalAlignment(alignment: TextAlign): void;
|
|
341
|
+
setSelectionVerticalAlignment(alignment: VerticalAlign): void;
|
|
342
|
+
setSelectionTextWrapMode(mode: TextWrapMode): void;
|
|
343
|
+
setRangeBackgroundColor(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number, color: string): void;
|
|
344
|
+
setSelectionRange(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): void;
|
|
345
|
+
onSelectionChange(listener: SelectionChangeListener): () => void;
|
|
346
|
+
onCellValueChange(listener: CellValueChangeListener): () => void;
|
|
347
|
+
notifySelectionChanged(): void;
|
|
348
|
+
isActiveCell(row: number, column: number): boolean;
|
|
349
|
+
private applyToSelection;
|
|
350
|
+
setMergedRanges(ranges: Iterable<MergedCellRange>): void;
|
|
351
|
+
mergeCells(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): void;
|
|
352
|
+
unmergeCells(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): void;
|
|
353
|
+
clearMergedRanges(): void;
|
|
354
|
+
getMergedRange(row: number, column: number): MergedCellRange | null;
|
|
355
|
+
isMergedCellAnchor(row: number, column: number): boolean;
|
|
356
|
+
getCellMergeBounds(row: number, column: number): {
|
|
357
|
+
topRow: number;
|
|
358
|
+
bottomRow: number;
|
|
359
|
+
leftColumn: number;
|
|
360
|
+
rightColumn: number;
|
|
361
|
+
};
|
|
362
|
+
expandSelectionWithMergedCells(bounds: {
|
|
363
|
+
top: number;
|
|
364
|
+
bottom: number;
|
|
365
|
+
left: number;
|
|
366
|
+
right: number;
|
|
367
|
+
}): {
|
|
368
|
+
top: number;
|
|
369
|
+
bottom: number;
|
|
370
|
+
left: number;
|
|
371
|
+
right: number;
|
|
372
|
+
};
|
|
373
|
+
protected getMergedLineGaps(): {
|
|
374
|
+
horizontal: Map<number, Array<{
|
|
375
|
+
startColumnBoundary: number;
|
|
376
|
+
endColumnBoundary: number;
|
|
377
|
+
}>>;
|
|
378
|
+
vertical: Map<number, Array<{
|
|
379
|
+
startRowBoundary: number;
|
|
380
|
+
endRowBoundary: number;
|
|
381
|
+
}>>;
|
|
382
|
+
};
|
|
383
|
+
getCellBorder(row: number, column: number): CellBorderDefinition | undefined;
|
|
384
|
+
applyCellBorders(borders: Map<string, CellBorderDefinition>): void;
|
|
385
|
+
setRangeBorder(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number, border: BorderLineOptions, sides?: RangeBorderSide[]): void;
|
|
386
|
+
getColumnWidth(column: number): number;
|
|
387
|
+
setColumnWidth(column: number, width: number): void;
|
|
388
|
+
getRowHeight(row: number): number;
|
|
389
|
+
setRowHeight(row: number, height: number): void;
|
|
390
|
+
applyColumnWidths(widths: Map<number, number>, options?: {
|
|
391
|
+
customColumns?: Set<number>;
|
|
392
|
+
enforceMinColumnWidth?: boolean;
|
|
393
|
+
}): void;
|
|
394
|
+
applyRowHeights(heights: Map<number, number>, options?: {
|
|
395
|
+
customRows?: Set<number>;
|
|
396
|
+
}): void;
|
|
397
|
+
autoFitColumns(options?: {
|
|
398
|
+
columns?: number[];
|
|
399
|
+
respectCustomWidth?: boolean;
|
|
400
|
+
}): void;
|
|
401
|
+
autoFitRows(options?: {
|
|
402
|
+
rows?: number[];
|
|
403
|
+
respectCustomHeight?: boolean;
|
|
404
|
+
}): void;
|
|
405
|
+
protected measureColumnWidth(_column: number): number;
|
|
406
|
+
protected measureRowHeight(_row: number): number;
|
|
407
|
+
protected measureCellContentHeight(_row: number, _column: number, _style: CellStyle): number;
|
|
408
|
+
protected measureCellContentWidth(_row: number, _column: number, _style: CellStyle): number;
|
|
409
|
+
setGridSize(rows: number, columns: number): void;
|
|
410
|
+
setShowGridLines(visible: boolean): void;
|
|
411
|
+
getShowGridLines(): boolean;
|
|
412
|
+
protected shouldRenderGridLines(): boolean;
|
|
413
|
+
setResizeGuide(guide: {
|
|
414
|
+
type: 'column' | 'row';
|
|
415
|
+
position: number;
|
|
416
|
+
} | null, shouldRender?: boolean): void;
|
|
417
|
+
getPixelRatio(): number;
|
|
418
|
+
pointsToPixels(points: number): number;
|
|
419
|
+
getExportSnapshot(): WorksheetExportSnapshot;
|
|
420
|
+
protected parseCellKey(key: string): {
|
|
421
|
+
row: number;
|
|
422
|
+
column: number;
|
|
423
|
+
} | null;
|
|
424
|
+
private isCellInBounds;
|
|
425
|
+
private clampRow;
|
|
426
|
+
private clampColumn;
|
|
427
|
+
normalizeRangeBounds(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): {
|
|
428
|
+
top: number;
|
|
429
|
+
left: number;
|
|
430
|
+
bottom: number;
|
|
431
|
+
right: number;
|
|
432
|
+
} | null;
|
|
433
|
+
private clampSelectionToBounds;
|
|
434
|
+
private pruneCellDataOutsideGrid;
|
|
435
|
+
private ensureArrayLength;
|
|
436
|
+
private emitSelectionChange;
|
|
437
|
+
private emitCellValueChange;
|
|
438
|
+
private emitViewportSizeChange;
|
|
439
|
+
private emitScrollChange;
|
|
440
|
+
private emitStructureChange;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
type LoadXlsxOptions = {
|
|
444
|
+
sheetName?: string;
|
|
445
|
+
};
|
|
446
|
+
type WorksheetImageAnchorPosition = {
|
|
447
|
+
row: number;
|
|
448
|
+
column: number;
|
|
449
|
+
offsetX: number;
|
|
450
|
+
offsetY: number;
|
|
451
|
+
};
|
|
452
|
+
type WorksheetImagePlacement = {
|
|
453
|
+
type: 'oneCell';
|
|
454
|
+
from: WorksheetImageAnchorPosition;
|
|
455
|
+
width: number;
|
|
456
|
+
height: number;
|
|
457
|
+
} | {
|
|
458
|
+
type: 'twoCell';
|
|
459
|
+
from: WorksheetImageAnchorPosition;
|
|
460
|
+
to: WorksheetImageAnchorPosition;
|
|
461
|
+
};
|
|
462
|
+
type WorksheetImageInfo = {
|
|
463
|
+
id: string;
|
|
464
|
+
mimeType: string;
|
|
465
|
+
data: Uint8Array;
|
|
466
|
+
anchor: WorksheetImagePlacement;
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
type CellStyleInput = Partial<CellStyle>;
|
|
470
|
+
declare class CellHandle {
|
|
471
|
+
private readonly ws;
|
|
472
|
+
private readonly r;
|
|
473
|
+
private readonly c;
|
|
474
|
+
constructor(ws: Worksheet, row: number, col: number);
|
|
475
|
+
get value(): string;
|
|
476
|
+
set value(v: string);
|
|
477
|
+
get style(): Partial<CellStyle>;
|
|
478
|
+
set style(s: CellStyleInput);
|
|
479
|
+
getValue(): string;
|
|
480
|
+
setValue(v: string): this;
|
|
481
|
+
getStyle(): CellStyle;
|
|
482
|
+
setStyle(s: CellStyleInput): this;
|
|
483
|
+
}
|
|
484
|
+
/** No-op handle returned when a cell address is outside the allowed constraint bounds. */
|
|
485
|
+
declare class NullCellHandle {
|
|
486
|
+
get value(): string;
|
|
487
|
+
set value(_v: string);
|
|
488
|
+
get style(): Partial<CellStyle>;
|
|
489
|
+
set style(_s: CellStyleInput);
|
|
490
|
+
getValue(): string;
|
|
491
|
+
setValue(_v: string): this;
|
|
492
|
+
getStyle(): CellStyle;
|
|
493
|
+
setStyle(_s: CellStyleInput): this;
|
|
494
|
+
}
|
|
495
|
+
declare class RangeHandle {
|
|
496
|
+
private readonly ws;
|
|
497
|
+
private readonly topRow;
|
|
498
|
+
private readonly leftColumn;
|
|
499
|
+
private readonly bottomRow;
|
|
500
|
+
private readonly rightColumn;
|
|
501
|
+
constructor(ws: Worksheet, topRow: number, leftColumn: number, bottomRow: number, rightColumn: number);
|
|
502
|
+
setStyle(style: CellStyleInput): this;
|
|
503
|
+
setBackgroundColor(color: string): this;
|
|
504
|
+
merge(): this;
|
|
505
|
+
unmerge(): this;
|
|
506
|
+
border(options: BorderLineOptions, sides?: RangeBorderSide[]): this;
|
|
507
|
+
}
|
|
508
|
+
/** No-op handle returned when a range is outside the allowed constraint bounds. */
|
|
509
|
+
declare class NullRangeHandle {
|
|
510
|
+
setStyle(_s: CellStyleInput): this;
|
|
511
|
+
setBackgroundColor(_c: string): this;
|
|
512
|
+
merge(): this;
|
|
513
|
+
unmerge(): this;
|
|
514
|
+
border(_o: BorderLineOptions, _s?: RangeBorderSide[]): this;
|
|
515
|
+
}
|
|
516
|
+
declare class ColumnHandle {
|
|
517
|
+
private readonly ws;
|
|
518
|
+
private readonly col;
|
|
519
|
+
constructor(ws: Worksheet, col: number);
|
|
520
|
+
get width(): number;
|
|
521
|
+
set width(w: number);
|
|
522
|
+
}
|
|
523
|
+
declare class RowHandle {
|
|
524
|
+
private readonly ws;
|
|
525
|
+
private readonly row;
|
|
526
|
+
constructor(ws: Worksheet, row: number);
|
|
527
|
+
get height(): number;
|
|
528
|
+
set height(h: number);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
type SaveXlsxOptions = {
|
|
532
|
+
filename?: string;
|
|
533
|
+
sheetName?: string;
|
|
534
|
+
};
|
|
535
|
+
|
|
536
|
+
interface WorksheetConstraints {
|
|
537
|
+
maxRows?: number;
|
|
538
|
+
maxCols?: number;
|
|
539
|
+
}
|
|
540
|
+
declare class CanvasWorksheet extends Worksheet {
|
|
541
|
+
readonly canvas: HTMLCanvasElement;
|
|
542
|
+
private readonly ctx;
|
|
543
|
+
private readonly sheetRenderer;
|
|
544
|
+
private readonly viewportController;
|
|
545
|
+
private readonly constraints;
|
|
546
|
+
private worksheetImages;
|
|
547
|
+
private readonly imageUrlCache;
|
|
548
|
+
private readonly imageListeners;
|
|
549
|
+
constructor(canvas: HTMLCanvasElement, constraints?: WorksheetConstraints);
|
|
550
|
+
get showGridLines(): boolean;
|
|
551
|
+
set showGridLines(visible: boolean);
|
|
552
|
+
cell(a1: string): CellHandle | NullCellHandle;
|
|
553
|
+
range(a1Range: string): RangeHandle | NullRangeHandle;
|
|
554
|
+
column(index: number): ColumnHandle;
|
|
555
|
+
row(index: number): RowHandle;
|
|
556
|
+
loadFromUrl(url: string | URL, options?: LoadXlsxOptions): Promise<void>;
|
|
557
|
+
loadFromFile(file: File, options?: LoadXlsxOptions): Promise<void>;
|
|
558
|
+
loadFromXlsx(data: ArrayBuffer | Uint8Array | string, options?: LoadXlsxOptions): Promise<void>;
|
|
559
|
+
saveAsXlsx(options?: SaveXlsxOptions): void;
|
|
560
|
+
getImages(): WorksheetImageInfo[];
|
|
561
|
+
createImageUrl(imageId: string): string;
|
|
562
|
+
revokeImageUrl(imageId: string): void;
|
|
563
|
+
onImagesChange(listener: (images: WorksheetImageInfo[]) => void): () => void;
|
|
564
|
+
resize(width?: number, height?: number): void;
|
|
565
|
+
render(): void;
|
|
566
|
+
private isOutOfBounds;
|
|
567
|
+
private isRangeOutOfBounds;
|
|
568
|
+
private decodeA1Cell;
|
|
569
|
+
private decodeA1Range;
|
|
570
|
+
private findImage;
|
|
571
|
+
private resetImageCache;
|
|
572
|
+
private clearImageUrlCache;
|
|
573
|
+
private notifyImagesChanged;
|
|
574
|
+
private normalizeSheetName;
|
|
575
|
+
private downloadWorkbook;
|
|
576
|
+
private triggerDownload;
|
|
577
|
+
private clear;
|
|
578
|
+
private withBodyClip;
|
|
579
|
+
private drawResizeGuide;
|
|
580
|
+
protected measureColumnWidth(column: number): number;
|
|
581
|
+
protected measureRowHeight(row: number): number;
|
|
582
|
+
protected measureCellContentHeight(row: number, column: number, style: CellStyle): number;
|
|
583
|
+
protected measureCellContentWidth(row: number, column: number, style: CellStyle): number;
|
|
584
|
+
private createSheetRendererContext;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
interface BeginEditOptions {
|
|
588
|
+
presetValue?: string;
|
|
589
|
+
selectAll?: boolean;
|
|
590
|
+
}
|
|
591
|
+
declare class CellEditor {
|
|
592
|
+
private readonly worksheet;
|
|
593
|
+
private readonly input;
|
|
594
|
+
private editingCell;
|
|
595
|
+
constructor(worksheet: CanvasWorksheet);
|
|
596
|
+
beginEdit(row: number, column: number, options?: BeginEditOptions): void;
|
|
597
|
+
commit(): void;
|
|
598
|
+
cancel(): void;
|
|
599
|
+
isEditing(): boolean;
|
|
600
|
+
destroy(): void;
|
|
601
|
+
private hide;
|
|
602
|
+
private refreshPosition;
|
|
603
|
+
private createInput;
|
|
604
|
+
private updateInputPosition;
|
|
605
|
+
private handleHorizontalNavigation;
|
|
606
|
+
private commitAndMove;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
declare class PointerController {
|
|
610
|
+
private readonly worksheet;
|
|
611
|
+
private readonly canvas;
|
|
612
|
+
private readonly eventTarget;
|
|
613
|
+
private readonly cellEditor;
|
|
614
|
+
private isDragging;
|
|
615
|
+
private dragContext;
|
|
616
|
+
private isResizing;
|
|
617
|
+
private resizeContext;
|
|
618
|
+
constructor(worksheet: CanvasWorksheet, cellEditor: CellEditor, eventTarget?: HTMLElement);
|
|
619
|
+
destroy(): void;
|
|
620
|
+
private handleMouseDown;
|
|
621
|
+
private handleMouseMove;
|
|
622
|
+
private handleMouseUp;
|
|
623
|
+
private handleDoubleClick;
|
|
624
|
+
private getCanvasPoint;
|
|
625
|
+
private resolveRowFromHit;
|
|
626
|
+
private resolveColumnFromHit;
|
|
627
|
+
private tryBeginResize;
|
|
628
|
+
private handleResizeDrag;
|
|
629
|
+
private updateHoverCursor;
|
|
630
|
+
private setCursor;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
declare class KeyboardController {
|
|
634
|
+
private readonly worksheet;
|
|
635
|
+
private readonly cellEditor;
|
|
636
|
+
constructor(worksheet: CanvasWorksheet, cellEditor: CellEditor);
|
|
637
|
+
destroy(): void;
|
|
638
|
+
private handleKeyDown;
|
|
639
|
+
private handleNavigationKeys;
|
|
640
|
+
private ensureActiveCell;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
type ReogridMountTarget = string | HTMLElement;
|
|
644
|
+
interface ReogridOptions {
|
|
645
|
+
workspace?: ReogridMountTarget;
|
|
646
|
+
workspaceId?: string;
|
|
647
|
+
canvasId?: string;
|
|
648
|
+
injectStyles?: boolean;
|
|
649
|
+
/** Maximum number of rows. Writes beyond this limit are silently ignored. */
|
|
650
|
+
maxRows?: number;
|
|
651
|
+
/** Maximum number of columns. Writes beyond this limit are silently ignored. */
|
|
652
|
+
maxCols?: number;
|
|
653
|
+
}
|
|
654
|
+
interface ReogridInstance {
|
|
655
|
+
worksheet: CanvasWorksheet;
|
|
656
|
+
cellEditor: CellEditor;
|
|
657
|
+
pointerController: PointerController;
|
|
658
|
+
keyboardController: KeyboardController;
|
|
659
|
+
destroy: () => void;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
interface ReogridProps {
|
|
663
|
+
className?: string;
|
|
664
|
+
style?: CSSProperties;
|
|
665
|
+
/**
|
|
666
|
+
* Called once after the grid is initialized, with the full ReogridInstance.
|
|
667
|
+
* Useful for setting initial cell values, styles, or loading an xlsx file.
|
|
668
|
+
*/
|
|
669
|
+
onReady?: (instance: ReogridInstance) => void;
|
|
670
|
+
/**
|
|
671
|
+
* Options forwarded to createReogrid(). `workspace` is managed internally
|
|
672
|
+
* and will be ignored if supplied.
|
|
673
|
+
*/
|
|
674
|
+
options?: Omit<ReogridOptions, 'workspace'>;
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* React component that mounts a ReoGrid Pro canvas spreadsheet.
|
|
678
|
+
* No row/column restrictions. Full xlsx import/export support.
|
|
679
|
+
*
|
|
680
|
+
* The ref exposes the full `ReogridInstance` (worksheet, api, etc.).
|
|
681
|
+
*
|
|
682
|
+
* @example
|
|
683
|
+
* ```tsx
|
|
684
|
+
* const gridRef = useRef<ReogridInstance>(null);
|
|
685
|
+
* <Reogrid ref={gridRef} style={{ flex: 1 }} onReady={(inst) => {
|
|
686
|
+
* inst.api.setCellValue('A1', 'Hello from ReoGrid Pro!');
|
|
687
|
+
* }} />
|
|
688
|
+
* ```
|
|
689
|
+
*/
|
|
690
|
+
declare const Reogrid: react.ForwardRefExoticComponent<ReogridProps & react.RefAttributes<ReogridInstance>>;
|
|
691
|
+
|
|
692
|
+
export { Reogrid, type ReogridInstance, type ReogridProps };
|