@revolist/revogrid 4.22.1 → 4.23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/{cell-renderer-BQdEGQXP.js → cell-renderer-Dcz022q7.js} +9 -3
- package/dist/cjs/{column.drag.plugin-RDjQhKCH.js → column.drag.plugin-DJueWxN_.js} +391 -256
- package/dist/cjs/{column.service-DXYMehqK.js → column.service-C1Qvcf5l.js} +10 -1
- package/dist/cjs/{dimension.helpers-CiiNnlLa.js → dimension.helpers-B9HgANnM.js} +14 -145
- package/dist/cjs/{edit.utils-CecCfA4E.js → edit.utils-pKeiYFLJ.js} +1 -1
- package/dist/cjs/{header-cell-renderer-DGyBrK8I.js → header-cell-renderer-QrcXXSkF.js} +1 -1
- package/dist/cjs/index-DxaSE5uZ.js +136 -0
- package/dist/cjs/index.cjs.js +37 -32
- package/dist/cjs/revo-grid.cjs.entry.js +124 -18
- package/dist/cjs/revogr-attribution_7.cjs.entry.js +43 -25
- package/dist/cjs/revogr-clipboard_3.cjs.entry.js +10 -8
- package/dist/cjs/revogr-data_4.cjs.entry.js +74 -32
- package/dist/cjs/revogr-filter-panel.cjs.entry.js +2 -1
- package/dist/cjs/{text-editor-DnLZW1a-.js → text-editor-B4W-m-r-.js} +3 -3
- package/dist/cjs/{throttle-CfgQFkfR.js → throttle-BCwEuJJq.js} +59 -24
- package/dist/cjs/viewport.helpers-BND76K2j.js +140 -0
- package/dist/cjs/{viewport.store-q6YdR9mg.js → viewport.store-BlKQ4x9H.js} +16 -16
- package/dist/collection/components/data/revogr-data.js +5 -3
- package/dist/collection/components/header/header-group-renderer.js +1 -1
- package/dist/collection/components/header/header-renderer.js +1 -1
- package/dist/collection/components/header/revogr-header-style.css +13 -3
- package/dist/collection/components/header/revogr-header.js +53 -17
- package/dist/collection/components/order/order-row.service.js +6 -5
- package/dist/collection/components/overlay/keyboard.service.js +23 -1
- package/dist/collection/components/overlay/selection.utils.js +8 -6
- package/dist/collection/components/revoGrid/revo-grid.js +69 -5
- package/dist/collection/components/revoGrid/viewport.service.js +2 -1
- package/dist/collection/components/scroll/revogr-viewport-scroll.js +10 -6
- package/dist/collection/components/scrollable/revogr-scroll-virtual.js +4 -10
- package/dist/collection/plugins/filter/filter.panel.js +2 -1
- package/dist/collection/plugins/filter/filter.plugin.js +11 -4
- package/dist/collection/plugins/groupingRow/grouping.row.plugin.js +25 -1
- package/dist/collection/plugins/groupingRow/grouping.service.js +9 -0
- package/dist/collection/plugins/moveColumn/column.drag.plugin.js +4 -4
- package/dist/collection/plugins/sorting/sorting.func.js +173 -15
- package/dist/collection/plugins/sorting/sorting.plugin.js +167 -84
- package/dist/collection/plugins/sorting/sorting.sign.js +7 -1
- package/dist/collection/serve/controller.js +98 -37
- package/dist/collection/serve/data.js +273 -144
- package/dist/collection/services/dimension.provider.js +16 -1
- package/dist/collection/services/local.scroll.service.js +59 -24
- package/dist/collection/services/scroll.dimension.helpers.js +83 -0
- package/dist/collection/services/selection.store.connector.js +30 -4
- package/dist/collection/store/dimension/dimension.recalculate.plugin.js +22 -9
- package/dist/collection/store/dimension/dimension.store.js +4 -2
- package/dist/collection/store/vp/viewport.helpers.js +9 -0
- package/dist/collection/store/vp/viewport.store.js +5 -16
- package/dist/collection/utils/store.utils.js +3 -3
- package/dist/{revo-grid/cell-renderer-CALsEsnh.js → esm/cell-renderer-BtN-NGCk.js} +9 -3
- package/dist/esm/{column.drag.plugin-Dy5ztusn.js → column.drag.plugin-DCZW62Uc.js} +388 -255
- package/dist/esm/{column.service-CCvAi5l4.js → column.service-CC_SD8W3.js} +10 -1
- package/dist/{revo-grid/debounce-BfO9dz9v.js → esm/debounce-PCRWZliA.js} +1 -1
- package/dist/{revo-grid/dimension.helpers-DmIvjIa7.js → esm/dimension.helpers-CGKwSvw6.js} +7 -128
- package/dist/esm/{edit.utils-DYN6XZh8.js → edit.utils-Dnnbd0xG.js} +1 -1
- package/dist/{revo-grid/header-cell-renderer-DU8wKAbg.js → esm/header-cell-renderer-BsvUQ8GS.js} +1 -1
- package/dist/esm/index-Db3qZoW5.js +127 -0
- package/dist/esm/index.js +11 -10
- package/dist/esm/revo-grid.entry.js +123 -17
- package/dist/esm/revogr-attribution_7.entry.js +42 -24
- package/dist/esm/revogr-clipboard_3.entry.js +11 -9
- package/dist/esm/revogr-data_4.entry.js +75 -33
- package/dist/esm/revogr-filter-panel.entry.js +3 -2
- package/dist/esm/{text-editor-DpCnd6Fq.js → text-editor-C3RUSwH5.js} +2 -2
- package/dist/esm/{throttle-ERvyruXb.js → throttle-CaUDyxyU.js} +60 -25
- package/dist/esm/viewport.helpers-CoCAvmZs.js +133 -0
- package/dist/{revo-grid/viewport.store-CFjDW-3l.js → esm/viewport.store-COAfzAyu.js} +15 -17
- package/dist/{esm/cell-renderer-CALsEsnh.js → revo-grid/cell-renderer-BtN-NGCk.js} +9 -3
- package/dist/revo-grid/{column.drag.plugin-Dy5ztusn.js → column.drag.plugin-DCZW62Uc.js} +388 -255
- package/dist/revo-grid/{column.service-CCvAi5l4.js → column.service-CC_SD8W3.js} +10 -1
- package/dist/{esm/debounce-BfO9dz9v.js → revo-grid/debounce-PCRWZliA.js} +1 -1
- package/dist/{esm/dimension.helpers-DmIvjIa7.js → revo-grid/dimension.helpers-CGKwSvw6.js} +7 -128
- package/dist/revo-grid/{edit.utils-DYN6XZh8.js → edit.utils-Dnnbd0xG.js} +1 -1
- package/dist/{esm/header-cell-renderer-DU8wKAbg.js → revo-grid/header-cell-renderer-BsvUQ8GS.js} +1 -1
- package/dist/revo-grid/index-Db3qZoW5.js +127 -0
- package/dist/revo-grid/index.esm.js +11 -10
- package/dist/revo-grid/revo-grid.entry.js +123 -17
- package/dist/revo-grid/revogr-attribution_7.entry.js +42 -24
- package/dist/revo-grid/revogr-clipboard_3.entry.js +11 -9
- package/dist/revo-grid/revogr-data_4.entry.js +75 -33
- package/dist/revo-grid/revogr-filter-panel.entry.js +3 -2
- package/dist/revo-grid/{text-editor-DpCnd6Fq.js → text-editor-C3RUSwH5.js} +2 -2
- package/dist/revo-grid/{throttle-ERvyruXb.js → throttle-CaUDyxyU.js} +60 -25
- package/dist/revo-grid/viewport.helpers-CoCAvmZs.js +133 -0
- package/dist/{esm/viewport.store-CFjDW-3l.js → revo-grid/viewport.store-COAfzAyu.js} +15 -17
- package/dist/types/components/header/header-group-renderer.d.ts +2 -0
- package/dist/types/components/header/header-renderer.d.ts +1 -0
- package/dist/types/components/header/revogr-header.d.ts +2 -0
- package/dist/types/components/overlay/keyboard.service.d.ts +5 -0
- package/dist/types/components/revoGrid/revo-grid.d.ts +12 -0
- package/dist/types/plugins/groupingRow/grouping.row.plugin.d.ts +8 -0
- package/dist/types/plugins/sorting/sorting.func.d.ts +25 -2
- package/dist/types/plugins/sorting/sorting.plugin.d.ts +84 -9
- package/dist/types/plugins/sorting/sorting.sign.d.ts +5 -1
- package/dist/types/plugins/sorting/sorting.types.d.ts +46 -1
- package/dist/types/services/local.scroll.service.d.ts +10 -2
- package/dist/types/services/scroll.dimension.helpers.d.ts +20 -0
- package/dist/types/services/selection.store.connector.d.ts +6 -0
- package/dist/types/store/vp/viewport.helpers.d.ts +2 -0
- package/dist/types/types/interfaces.d.ts +11 -0
- package/dist/types/types/selection.d.ts +13 -0
- package/hydrate/index.js +795 -383
- package/hydrate/index.mjs +795 -383
- package/package.json +1 -1
- package/standalone/column.service.js +1 -1
- package/standalone/data.store.js +1 -1
- package/standalone/debounce.js +1 -1
- package/standalone/dimension.helpers.js +1 -1
- package/standalone/index.js +1 -1
- package/standalone/local.scroll.timer.js +1 -1
- package/standalone/revo-grid.js +1 -1
- package/standalone/revogr-data2.js +1 -1
- package/standalone/revogr-filter-panel.js +1 -1
- package/standalone/revogr-header2.js +1 -1
- package/standalone/revogr-order-editor2.js +1 -1
- package/standalone/revogr-overlay-selection2.js +1 -1
- package/standalone/revogr-row-headers.js +1 -1
- package/standalone/revogr-row-headers2.js +1 -1
- package/standalone/revogr-scroll-virtual2.js +1 -1
- package/standalone/revogr-viewport-scroll2.js +1 -1
- package/standalone/selection.utils.js +1 -1
- package/standalone/throttle.js +1 -1
- package/standalone/toNumber.js +1 -1
- package/dist/cjs/viewport.helpers-BAovztDd.js +0 -58
- package/dist/esm/viewport.helpers-VXhsJZtn.js +0 -52
- package/dist/revo-grid/viewport.helpers-VXhsJZtn.js +0 -52
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Built by Revolist OU ❤️
|
|
3
|
+
*/
|
|
4
|
+
const FALLBACK_MAX_SCROLL_SIZE = 16000000;
|
|
5
|
+
const SCROLL_SIZE_GUARD = 1000000;
|
|
6
|
+
let detectedMaxScrollSize;
|
|
7
|
+
function getMaxScrollSize(doc = typeof document === 'undefined' ? undefined : document) {
|
|
8
|
+
if (typeof detectedMaxScrollSize === 'number') {
|
|
9
|
+
return detectedMaxScrollSize;
|
|
10
|
+
}
|
|
11
|
+
const body = doc === null || doc === void 0 ? void 0 : doc.body;
|
|
12
|
+
if (body) {
|
|
13
|
+
const ownerDocument = body.ownerDocument;
|
|
14
|
+
const element = ownerDocument.createElement('div');
|
|
15
|
+
element.style.cssText = [
|
|
16
|
+
'height:1px',
|
|
17
|
+
'left:-10000px',
|
|
18
|
+
'overflow:scroll',
|
|
19
|
+
'position:absolute',
|
|
20
|
+
'top:-10000px',
|
|
21
|
+
'visibility:hidden',
|
|
22
|
+
'width:1px',
|
|
23
|
+
].join(';');
|
|
24
|
+
const content = ownerDocument.createElement('div');
|
|
25
|
+
content.style.height = `${FALLBACK_MAX_SCROLL_SIZE * 4}px`;
|
|
26
|
+
element.appendChild(content);
|
|
27
|
+
body.appendChild(element);
|
|
28
|
+
detectedMaxScrollSize = Math.max(0, Math.min(element.scrollHeight, FALLBACK_MAX_SCROLL_SIZE * 4) - SCROLL_SIZE_GUARD);
|
|
29
|
+
element.remove();
|
|
30
|
+
if (detectedMaxScrollSize > SCROLL_SIZE_GUARD) {
|
|
31
|
+
return detectedMaxScrollSize;
|
|
32
|
+
}
|
|
33
|
+
detectedMaxScrollSize = FALLBACK_MAX_SCROLL_SIZE;
|
|
34
|
+
return detectedMaxScrollSize;
|
|
35
|
+
}
|
|
36
|
+
return FALLBACK_MAX_SCROLL_SIZE;
|
|
37
|
+
}
|
|
38
|
+
function getScrollDimension({ contentSize, clientSize, virtualSize = 0, maxScrollSize = getMaxScrollSize(), }) {
|
|
39
|
+
const safeContentSize = Math.max(0, maxScrollSize - SCROLL_SIZE_GUARD);
|
|
40
|
+
const size = Math.max(0, contentSize);
|
|
41
|
+
const client = Math.max(0, clientSize);
|
|
42
|
+
const viewport = Math.max(0, virtualSize || client);
|
|
43
|
+
const logicalScrollSize = Math.max(0, size - viewport);
|
|
44
|
+
const maxPhysicalScrollSize = Math.max(0, safeContentSize - client);
|
|
45
|
+
const physicalScrollSize = Math.min(logicalScrollSize, maxPhysicalScrollSize);
|
|
46
|
+
const physicalContentSize = client + physicalScrollSize;
|
|
47
|
+
const isCompressed = logicalScrollSize > physicalScrollSize && physicalScrollSize > 0;
|
|
48
|
+
const clampLogical = (coordinate) => Math.min(Math.max(0, coordinate || 0), logicalScrollSize);
|
|
49
|
+
const clampPhysical = (coordinate) => Math.min(Math.max(0, coordinate || 0), physicalScrollSize);
|
|
50
|
+
const toLogicalCoordinate = (coordinate) => {
|
|
51
|
+
if (!logicalScrollSize || !physicalScrollSize) {
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
if (!isCompressed) {
|
|
55
|
+
return clampLogical(coordinate);
|
|
56
|
+
}
|
|
57
|
+
return clampLogical((clampPhysical(coordinate) / physicalScrollSize) * logicalScrollSize);
|
|
58
|
+
};
|
|
59
|
+
const toPhysicalCoordinate = (coordinate) => {
|
|
60
|
+
if (!logicalScrollSize || !physicalScrollSize) {
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
if (!isCompressed) {
|
|
64
|
+
return clampPhysical(coordinate);
|
|
65
|
+
}
|
|
66
|
+
return clampPhysical((clampLogical(coordinate) / logicalScrollSize) * physicalScrollSize);
|
|
67
|
+
};
|
|
68
|
+
return {
|
|
69
|
+
contentSize: size,
|
|
70
|
+
clientSize: client,
|
|
71
|
+
viewportSize: viewport,
|
|
72
|
+
physicalContentSize,
|
|
73
|
+
logicalScrollSize,
|
|
74
|
+
physicalScrollSize,
|
|
75
|
+
isCompressed,
|
|
76
|
+
toLogicalCoordinate,
|
|
77
|
+
toPhysicalCoordinate,
|
|
78
|
+
getRenderOffset(coordinate) {
|
|
79
|
+
const logical = clampLogical(coordinate);
|
|
80
|
+
return logical - toPhysicalCoordinate(logical);
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Collects data for pinned columns in the required @ViewportProps format.
|
|
87
|
+
*/
|
|
88
|
+
/**
|
|
89
|
+
* Represents the slot names for the viewport slots.
|
|
90
|
+
*/
|
|
91
|
+
const HEADER_SLOT = 'header'; // Slot name for the header slot
|
|
92
|
+
const FOOTER_SLOT = 'footer'; // Slot name for the footer slot
|
|
93
|
+
const CONTENT_SLOT = 'content'; // Slot name for the content slot
|
|
94
|
+
const DATA_SLOT = 'data'; // Slot name for the data slot
|
|
95
|
+
/**
|
|
96
|
+
* Returns the last visible cell in the viewport for a given row type.
|
|
97
|
+
* Coordinates are not zero-based and are relative to the viewport.
|
|
98
|
+
* If needed to be zero-based they can be adjusted by subtracting 1.
|
|
99
|
+
*/
|
|
100
|
+
function getLastCell(data, rowType) {
|
|
101
|
+
// Get the last visible column count from the viewport column data.
|
|
102
|
+
const lastVisibleColumnCount = data.viewports[data.colType].store.get('realCount');
|
|
103
|
+
// Get the last visible row count for the given row type from the viewport column data.
|
|
104
|
+
const lastVisibleRowCount = data.viewports[rowType].store.get('realCount');
|
|
105
|
+
// Return the last visible cell with the last visible column count and row count.
|
|
106
|
+
return {
|
|
107
|
+
x: lastVisibleColumnCount,
|
|
108
|
+
y: lastVisibleRowCount,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function viewportDataPartition(data, type, slot, fixed) {
|
|
112
|
+
return {
|
|
113
|
+
colData: data.colStore,
|
|
114
|
+
viewportCol: data.viewports[data.colType].store,
|
|
115
|
+
viewportRow: data.viewports[type].store,
|
|
116
|
+
/**
|
|
117
|
+
* lastCell is the last real coordinate + 1, saved to selection store
|
|
118
|
+
*/
|
|
119
|
+
lastCell: getLastCell(data, type),
|
|
120
|
+
slot,
|
|
121
|
+
type,
|
|
122
|
+
canDrag: !fixed,
|
|
123
|
+
position: data.position,
|
|
124
|
+
dataStore: data.rowStores[type].store,
|
|
125
|
+
dimensionCol: data.dimensions[data.colType].store,
|
|
126
|
+
dimensionRow: data.dimensions[type].store,
|
|
127
|
+
style: fixed
|
|
128
|
+
? { height: `${data.dimensions[type].store.get('realSize')}px` }
|
|
129
|
+
: undefined,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export { CONTENT_SLOT as C, DATA_SLOT as D, FOOTER_SLOT as F, HEADER_SLOT as H, getScrollDimension as g, viewportDataPartition as v };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Built by Revolist OU ❤️
|
|
3
3
|
*/
|
|
4
|
-
import { j as getItemByPosition,
|
|
4
|
+
import { j as getItemByPosition, K as createStore, l as setStore } from './dimension.helpers-CGKwSvw6.js';
|
|
5
5
|
|
|
6
6
|
const LETTER_BLOCK_SIZE = 10;
|
|
7
7
|
const calculateRowHeaderSize = (itemsLength, rowHeaderColumn, minWidth = 50) => {
|
|
@@ -9,6 +9,15 @@ const calculateRowHeaderSize = (itemsLength, rowHeaderColumn, minWidth = 50) =>
|
|
|
9
9
|
Math.max((itemsLength.toString().length + 1) * LETTER_BLOCK_SIZE, minWidth));
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
+
function getViewportMaxCoordinate(dimension, viewportSize, frameOffset = 1) {
|
|
13
|
+
if (!viewportSize || dimension.realSize <= viewportSize) {
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
return Math.max(0, dimension.realSize - viewportSize - dimension.originItemSize * frameOffset);
|
|
17
|
+
}
|
|
18
|
+
function clampViewportCoordinate(coordinate, dimension, viewportSize, frameOffset = 1) {
|
|
19
|
+
return Math.min(Math.max(0, coordinate), getViewportMaxCoordinate(dimension, viewportSize, frameOffset));
|
|
20
|
+
}
|
|
12
21
|
/**
|
|
13
22
|
* Update items based on new scroll position
|
|
14
23
|
* If viewport wasn't changed fully simple recombination of positions
|
|
@@ -274,6 +283,8 @@ function initialState() {
|
|
|
274
283
|
realCount: 0,
|
|
275
284
|
// size of viewport in px
|
|
276
285
|
clientSize: 0,
|
|
286
|
+
// logical-to-physical render offset used when scroll space is compressed
|
|
287
|
+
renderOffset: 0,
|
|
277
288
|
};
|
|
278
289
|
}
|
|
279
290
|
/**
|
|
@@ -309,21 +320,8 @@ class ViewportStore {
|
|
|
309
320
|
const outsize = singleOffsetInPx * 2;
|
|
310
321
|
// math virtual size is based on visible area + 2 items outside of visible area
|
|
311
322
|
const virtualSize = viewportSize + outsize;
|
|
312
|
-
|
|
313
|
-
let
|
|
314
|
-
// if there is nodes outside of viewport, max coordinate has to be adjusted
|
|
315
|
-
if (dimension.realSize > viewportSize) {
|
|
316
|
-
// max coordinate is real size minus virtual/rendered space
|
|
317
|
-
maxCoordinate = dimension.realSize - viewportSize - singleOffsetInPx;
|
|
318
|
-
}
|
|
319
|
-
let pos = position;
|
|
320
|
-
// limit position to max and min coordinates
|
|
321
|
-
if (pos < 0) {
|
|
322
|
-
pos = 0;
|
|
323
|
-
}
|
|
324
|
-
else if (pos > maxCoordinate) {
|
|
325
|
-
pos = maxCoordinate;
|
|
326
|
-
}
|
|
323
|
+
const maxCoordinate = getViewportMaxCoordinate(dimension, viewportSize, frameOffset);
|
|
324
|
+
let pos = clampViewportCoordinate(position, dimension, viewportSize, frameOffset);
|
|
327
325
|
// store last coordinate for further restore on redraw
|
|
328
326
|
this.lastCoordinate = pos;
|
|
329
327
|
// actual position is less than first item start based on offset
|
|
@@ -401,4 +399,4 @@ class ViewportStore {
|
|
|
401
399
|
}
|
|
402
400
|
}
|
|
403
401
|
|
|
404
|
-
export { ViewportStore as V,
|
|
402
|
+
export { ViewportStore as V, getUpdatedItemsByPosition as a, addMissingItems as b, clampViewportCoordinate as c, getItems as d, isActiveRangeOutsideLastItem as e, getFirstItem as f, getViewportMaxCoordinate as g, getLastItem as h, isActiveRange as i, calculateRowHeaderSize as j, recombineByOffset as r, setItemSizes as s, updateMissingAndRange as u };
|
|
@@ -3,12 +3,14 @@ import { Group } from "../../store/index";
|
|
|
3
3
|
import type { ProvidersColumns } from "../../types/index";
|
|
4
4
|
import { ResizeEvent, ResizeProps } from './resizable.directive';
|
|
5
5
|
export type HeaderGroupRendererProps = {
|
|
6
|
+
level: number;
|
|
6
7
|
start: number;
|
|
7
8
|
end: number;
|
|
8
9
|
group: Group;
|
|
9
10
|
providers: ProvidersColumns;
|
|
10
11
|
additionalData: any;
|
|
11
12
|
canResize?: boolean;
|
|
13
|
+
renderOffset?: number;
|
|
12
14
|
onResize?(e: ResizeEvent): void;
|
|
13
15
|
} & Partial<Pick<ResizeProps, 'active'>>;
|
|
14
16
|
declare const HeaderGroupRenderer: (p: HeaderGroupRendererProps) => ReturnType<typeof h>;
|
|
@@ -88,6 +88,8 @@ export declare class RevogrHeaderComponent {
|
|
|
88
88
|
private renderGroupingColumns;
|
|
89
89
|
private renderGroupRow;
|
|
90
90
|
private renderGroupColumn;
|
|
91
|
+
private getGroupIndexRange;
|
|
92
|
+
private getGroupBounds;
|
|
91
93
|
private getVisibleGroupRange;
|
|
92
94
|
private getHeaderCellKey;
|
|
93
95
|
private getDuplicateHeaderProps;
|
|
@@ -15,6 +15,11 @@ type Config = {
|
|
|
15
15
|
export declare class KeyboardService {
|
|
16
16
|
private sv;
|
|
17
17
|
constructor(sv: Config);
|
|
18
|
+
/**
|
|
19
|
+
* Appends printable key input that arrives after edit mode was requested
|
|
20
|
+
* but before the editor input has mounted or received focus.
|
|
21
|
+
*/
|
|
22
|
+
private appendPendingEditValue;
|
|
18
23
|
keyDown(e: KeyboardEvent, canRange: boolean, isEditMode: boolean, { range, focus }: Nullable<Pick<EventData, 'range' | 'focus'>>): Promise<void>;
|
|
19
24
|
private selectAll;
|
|
20
25
|
keyChangeSelection(e: KeyboardEvent, canRange: boolean): Promise<boolean>;
|
|
@@ -626,8 +626,20 @@ export declare class RevoGridComponent {
|
|
|
626
626
|
orderService: OrdererService;
|
|
627
627
|
selectionStoreConnector?: SelectionStoreConnector;
|
|
628
628
|
scrollingService: GridScrollingService;
|
|
629
|
+
private pendingColumnFocusRestore?;
|
|
629
630
|
columnTypesChanged(): void;
|
|
630
631
|
columnChanged(newVal?: (ColumnGrouping | ColumnRegular)[], _prevVal?: (ColumnGrouping | ColumnRegular)[] | undefined, __watchName?: string, init?: boolean): void;
|
|
632
|
+
/**
|
|
633
|
+
* Capture logical focus before columns are repartitioned by pin state.
|
|
634
|
+
* Regression case: selecting a regular cell, then pinning that column left,
|
|
635
|
+
* used to let the new pinned viewport reuse the old rgCol selection store.
|
|
636
|
+
*/
|
|
637
|
+
private getColumnFocusRestore;
|
|
638
|
+
/**
|
|
639
|
+
* Reapply focus by column prop after render, once pinning has moved the
|
|
640
|
+
* column to its new viewport and virtual index.
|
|
641
|
+
*/
|
|
642
|
+
private restoreColumnFocusAfterRender;
|
|
631
643
|
disableVirtualXChanged(newVal?: boolean, prevVal?: boolean): void;
|
|
632
644
|
rowSizeChanged(s: number): void;
|
|
633
645
|
themeChanged(t: Theme, _?: Theme, __?: string, init?: boolean): void;
|
|
@@ -20,6 +20,14 @@ export declare class GroupingRowPlugin extends BasePlugin {
|
|
|
20
20
|
private beforeTrimmedApply;
|
|
21
21
|
private beforeFilterTrimmed;
|
|
22
22
|
private isSortingRunning;
|
|
23
|
+
/**
|
|
24
|
+
* Returns grouping options for regrouping that must preserve current UI state.
|
|
25
|
+
*
|
|
26
|
+
* `expandedAll` and config `prevExpanded` are initial/config instructions.
|
|
27
|
+
* Reusing them after sorting would reopen groups the user collapsed before
|
|
28
|
+
* sorting instead of using the current grouped source state.
|
|
29
|
+
*/
|
|
30
|
+
private getCurrentExpandedOptions;
|
|
23
31
|
/**
|
|
24
32
|
* Starts global source update with group clearing and applying new one
|
|
25
33
|
* Initiated when need to reapply grouping
|
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
import type { CellCompareFunc, ColumnProp, ColumnRegular, DataType, Order } from "../../types/index";
|
|
2
|
-
import type { SortingOrderFunction } from './sorting.types';
|
|
3
|
-
|
|
2
|
+
import type { SortingColumnMap, SortingColumnOrder, SortingColumnRender, SortingOrder, SortingOrderFunction } from './sorting.types';
|
|
3
|
+
/**
|
|
4
|
+
* Checks whether a sorting map contains at least one active order.
|
|
5
|
+
*
|
|
6
|
+
* Empty maps and properties with `undefined` order are treated as inactive.
|
|
7
|
+
*/
|
|
8
|
+
export declare function hasActiveSorting(sorting?: SortingOrder): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Returns one-based additive sorting rank for a column.
|
|
11
|
+
*
|
|
12
|
+
* A single active sort does not need a visible rank, so it returns undefined.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getSortingIndex(sorting: SortingOrder | undefined, prop: ColumnProp, sortingOrder?: SortingColumnOrder): SortingColumnRender['sortIndex'];
|
|
15
|
+
/**
|
|
16
|
+
* Sorts row indexes against a source collection.
|
|
17
|
+
*
|
|
18
|
+
* @param indexes - Current proxy row indexes to sort.
|
|
19
|
+
* @param source - Full source collection addressed by the indexes.
|
|
20
|
+
* @param sortingFunc - Comparator functions by column property.
|
|
21
|
+
* @param sorting - Active sorting order by column property.
|
|
22
|
+
* @param sortingColumns - Column metadata by property for default-comparer optimization.
|
|
23
|
+
* @param sortingOrder - Active sorting priority in click/config insertion order.
|
|
24
|
+
* @returns Sorted proxy indexes. With no sorting function keys, returns source-order indexes.
|
|
25
|
+
*/
|
|
26
|
+
export declare function sortIndexByItems(indexes: number[], source: DataType[], sortingFunc?: SortingOrderFunction, sorting?: SortingOrder, sortingColumns?: SortingColumnMap, sortingOrder?: SortingColumnOrder): number[];
|
|
4
27
|
export declare function defaultCellCompare(this: {
|
|
5
28
|
column?: ColumnRegular;
|
|
6
29
|
}, prop: ColumnProp, a: DataType, b: DataType): 0 | 1 | -1;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BasePlugin } from '../base.plugin';
|
|
2
2
|
import type { ColumnRegular, DimensionRows, PluginProviders } from "../../types/index";
|
|
3
|
-
import type { SortingConfig, SortingOrder, SortingOrderFunction } from './sorting.types';
|
|
3
|
+
import type { SortingColumnMap, SortingColumnOrder, SortingConfig, SortingOrder, SortingOrderFunction } from './sorting.types';
|
|
4
4
|
export * from './sorting.types';
|
|
5
5
|
export * from './sorting.func';
|
|
6
6
|
export * from './sorting.sign';
|
|
@@ -15,34 +15,109 @@ export * from './sorting.sign';
|
|
|
15
15
|
*/
|
|
16
16
|
export declare class SortingPlugin extends BasePlugin {
|
|
17
17
|
revogrid: HTMLRevoGridElement;
|
|
18
|
+
/**
|
|
19
|
+
* Current sorting order per column property.
|
|
20
|
+
*/
|
|
18
21
|
sorting?: SortingOrder;
|
|
22
|
+
/**
|
|
23
|
+
* Comparator functions indexed by column property.
|
|
24
|
+
*
|
|
25
|
+
* Multiple columns can be sorted at the same time.
|
|
26
|
+
*/
|
|
19
27
|
sortingFunc?: SortingOrderFunction;
|
|
20
28
|
/**
|
|
21
|
-
*
|
|
29
|
+
* Column metadata for the current sorting state.
|
|
30
|
+
*
|
|
31
|
+
* Used internally to optimize default sorting without changing comparator
|
|
32
|
+
* functions or their public API contract.
|
|
33
|
+
*/
|
|
34
|
+
private sortingColumns?;
|
|
35
|
+
/**
|
|
36
|
+
* Active sorting priority in click/config insertion order.
|
|
37
|
+
*
|
|
38
|
+
* Required for numeric column props because object key iteration does not
|
|
39
|
+
* preserve insertion order for integer-like keys.
|
|
40
|
+
*/
|
|
41
|
+
private sortingOrder?;
|
|
42
|
+
/**
|
|
43
|
+
* Delayed sorting promise registered in the grid render job queue.
|
|
22
44
|
*/
|
|
23
45
|
sortingPromise: (() => void) | null;
|
|
24
46
|
/**
|
|
25
|
-
*
|
|
47
|
+
* Debounced sorting entry point.
|
|
48
|
+
*
|
|
49
|
+
* Sorting can be requested by column changes, source changes, and header
|
|
50
|
+
* clicks in quick succession, so the actual sort is delayed and coalesced.
|
|
26
51
|
*/
|
|
27
|
-
postponeSort: import("lodash").DebouncedFunc<(order?: SortingOrder, comparison?: SortingOrderFunction, ignoreViewportUpdate?: boolean) => void>;
|
|
52
|
+
postponeSort: import("lodash").DebouncedFunc<(order?: SortingOrder, comparison?: SortingOrderFunction, sortingColumns?: SortingColumnMap, sortingOrder?: SortingColumnOrder, ignoreViewportUpdate?: boolean) => void>;
|
|
28
53
|
constructor(revogrid: HTMLRevoGridElement, providers: PluginProviders, config?: SortingConfig);
|
|
29
54
|
/**
|
|
30
|
-
*
|
|
55
|
+
* Creates mutable sorting maps from current state when additive sorting is requested.
|
|
56
|
+
*/
|
|
57
|
+
private createSortingState;
|
|
58
|
+
/**
|
|
59
|
+
* Stores normalized sorting state, clearing inactive empty maps.
|
|
60
|
+
*/
|
|
61
|
+
private setSortingState;
|
|
62
|
+
/**
|
|
63
|
+
* Adds or replaces a column in a sorting state.
|
|
64
|
+
*/
|
|
65
|
+
private setColumnSorting;
|
|
66
|
+
/**
|
|
67
|
+
* Removes a column from a sorting state.
|
|
68
|
+
*/
|
|
69
|
+
private clearColumnSorting;
|
|
70
|
+
/**
|
|
71
|
+
* Normalizes external sorting configuration into internal order,
|
|
72
|
+
* comparator, and column metadata maps.
|
|
73
|
+
*/
|
|
74
|
+
private applySortingConfig;
|
|
75
|
+
/**
|
|
76
|
+
* Schedules sorting before the next render.
|
|
77
|
+
*
|
|
78
|
+
* @param order - Active sorting order by column property.
|
|
79
|
+
* @param sortingFunc - Comparator functions by column property.
|
|
80
|
+
* @param sortingColumns - Column metadata by property.
|
|
81
|
+
* @param sortingOrder - Active sorting priority in click/config insertion order.
|
|
82
|
+
* @param ignoreViewportUpdate - Skips dimension position recalculation when true.
|
|
31
83
|
*/
|
|
32
84
|
startSorting(order?: SortingOrder, sortingFunc?: SortingOrderFunction, ignoreViewportUpdate?: boolean): void;
|
|
85
|
+
startSorting(order?: SortingOrder, sortingFunc?: SortingOrderFunction, sortingColumns?: SortingColumnMap, sortingOrder?: SortingColumnOrder, ignoreViewportUpdate?: boolean): void;
|
|
33
86
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
87
|
+
* Applies sorting requested by a sortable header click.
|
|
88
|
+
*
|
|
89
|
+
* @param column - Column that initiated sorting.
|
|
90
|
+
* @param additive - If true, add/remove this column from the current multi-sort state.
|
|
36
91
|
*/
|
|
37
92
|
headerclick(column: ColumnRegular, additive: boolean): void;
|
|
93
|
+
/**
|
|
94
|
+
* Applies sorting state produced by a header click.
|
|
95
|
+
*/
|
|
96
|
+
private applyHeaderSorting;
|
|
97
|
+
/**
|
|
98
|
+
* Runs a scheduled sort and resolves the render-blocking sorting promise.
|
|
99
|
+
*
|
|
100
|
+
* @param order - Active sorting order by column property.
|
|
101
|
+
* @param comparison - Comparator functions by column property.
|
|
102
|
+
* @param sortingColumns - Column metadata by property.
|
|
103
|
+
* @param sortingOrder - Active sorting priority in click/config insertion order.
|
|
104
|
+
* @param ignoreViewportUpdate - Skips dimension position recalculation when true.
|
|
105
|
+
*/
|
|
38
106
|
runSorting(order?: SortingOrder, comparison?: SortingOrderFunction, ignoreViewportUpdate?: boolean): void;
|
|
107
|
+
runSorting(order?: SortingOrder, comparison?: SortingOrderFunction, sortingColumns?: SortingColumnMap, sortingOrder?: SortingColumnOrder, ignoreViewportUpdate?: boolean): void;
|
|
39
108
|
/**
|
|
40
|
-
*
|
|
109
|
+
* Sorts row proxy indexes by sorting functions.
|
|
110
|
+
*
|
|
41
111
|
* @requires proxyItems applied to row store
|
|
42
112
|
* @requires source applied to row store
|
|
43
113
|
*
|
|
44
114
|
* @param sorting - per column sorting
|
|
45
|
-
* @param
|
|
115
|
+
* @param sortingFunc - Comparator functions by column property.
|
|
116
|
+
* @param sortingColumns - Column metadata by property.
|
|
117
|
+
* @param sortingOrder - Active sorting priority in click/config insertion order.
|
|
118
|
+
* @param types - Row stores to sort.
|
|
119
|
+
* @param ignoreViewportUpdate - Skips dimension position recalculation when true.
|
|
46
120
|
*/
|
|
47
121
|
sort(sorting?: SortingOrder, sortingFunc?: SortingOrderFunction, types?: DimensionRows[], ignoreViewportUpdate?: boolean): void;
|
|
122
|
+
sort(sorting?: SortingOrder, sortingFunc?: SortingOrderFunction, sortingColumns?: SortingColumnMap, sortingOrder?: SortingColumnOrder, types?: DimensionRows[], ignoreViewportUpdate?: boolean): void;
|
|
48
123
|
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { ColumnRegular } from "../../types/index";
|
|
2
|
+
import type { SortingColumnRender } from './sorting.types';
|
|
2
3
|
type Props = {
|
|
3
|
-
column: ColumnRegular;
|
|
4
|
+
column: ColumnRegular & SortingColumnRender;
|
|
4
5
|
};
|
|
6
|
+
/**
|
|
7
|
+
* Renders sorting direction and optional additive sorting rank.
|
|
8
|
+
*/
|
|
5
9
|
export declare const SortingSign: ({ column }: Props) => any;
|
|
6
10
|
export {};
|
|
@@ -1,14 +1,59 @@
|
|
|
1
|
-
import type { CellCompareFunc, ColumnProp, Order } from "../../types/index";
|
|
1
|
+
import type { CellCompareFunc, ColumnProp, ColumnRegular, Order } from "../../types/index";
|
|
2
|
+
/**
|
|
3
|
+
* Current sorting order per column property.
|
|
4
|
+
*/
|
|
2
5
|
export type SortingOrder = Record<ColumnProp, Order>;
|
|
6
|
+
/**
|
|
7
|
+
* Comparator functions indexed by column property.
|
|
8
|
+
*
|
|
9
|
+
* Undefined comparator entries are treated as inactive sorting entries.
|
|
10
|
+
*/
|
|
3
11
|
export type SortingOrderFunction = Record<ColumnProp, CellCompareFunc | undefined>;
|
|
12
|
+
/**
|
|
13
|
+
* Column metadata indexed by column property.
|
|
14
|
+
*
|
|
15
|
+
* This is an internal companion map for `SortingOrderFunction`. It lets the
|
|
16
|
+
* sorting helper detect the default comparer path without mutating
|
|
17
|
+
* `CellCompareFunc` instances or changing the public comparator contract.
|
|
18
|
+
*/
|
|
19
|
+
export type SortingColumnMap = Record<ColumnProp, Partial<ColumnRegular> | undefined>;
|
|
20
|
+
/**
|
|
21
|
+
* Active sorting priority in click/config insertion order.
|
|
22
|
+
*
|
|
23
|
+
* This is stored separately from `SortingOrder` because JavaScript object keys
|
|
24
|
+
* that look like integers are enumerated in numeric order, not insertion order.
|
|
25
|
+
*/
|
|
26
|
+
export type SortingColumnOrder = ColumnProp[];
|
|
27
|
+
/**
|
|
28
|
+
* Header metadata used to display additive sort priority.
|
|
29
|
+
*/
|
|
30
|
+
export type SortingColumnRender = {
|
|
31
|
+
/**
|
|
32
|
+
* One-based additive sorting rank.
|
|
33
|
+
*/
|
|
34
|
+
sortIndex?: number;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Sorting information emitted after columns are set.
|
|
38
|
+
*/
|
|
4
39
|
export type ColumnSetEvent = {
|
|
5
40
|
order: SortingOrder;
|
|
6
41
|
};
|
|
42
|
+
/**
|
|
43
|
+
* External sorting configuration.
|
|
44
|
+
*/
|
|
7
45
|
export type SortingConfig = {
|
|
46
|
+
/**
|
|
47
|
+
* Columns to sort by.
|
|
48
|
+
*/
|
|
8
49
|
columns?: {
|
|
9
50
|
prop: ColumnProp;
|
|
10
51
|
order: Order;
|
|
11
52
|
cellCompare?: CellCompareFunc;
|
|
12
53
|
}[];
|
|
54
|
+
/**
|
|
55
|
+
* If true, merge provided columns with the current sorting state.
|
|
56
|
+
* If false or omitted, replace current sorting state.
|
|
57
|
+
*/
|
|
13
58
|
additive?: boolean;
|
|
14
59
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DimensionType, ViewPortScrollEvent } from "../types/index";
|
|
2
|
+
import { type ScrollDimension } from './scroll.dimension.helpers';
|
|
2
3
|
interface Config {
|
|
3
4
|
skipAnimationFrame?: boolean;
|
|
4
5
|
runScroll(e: ViewPortScrollEvent): void;
|
|
@@ -10,6 +11,8 @@ type Params = {
|
|
|
10
11
|
clientSize: number;
|
|
11
12
|
virtualSize: number;
|
|
12
13
|
maxSize?: number;
|
|
14
|
+
maxScrollSize?: number;
|
|
15
|
+
scrollDimension?: ScrollDimension;
|
|
13
16
|
};
|
|
14
17
|
/**
|
|
15
18
|
* Based on content size, client size and virtual size
|
|
@@ -20,17 +23,22 @@ export default class LocalScrollService {
|
|
|
20
23
|
private cfg;
|
|
21
24
|
private preventArtificialScroll;
|
|
22
25
|
private previousScroll;
|
|
26
|
+
private previousLogicalScroll;
|
|
23
27
|
private params;
|
|
24
28
|
constructor(cfg: Config);
|
|
25
29
|
setParams(params: Params, dimension: DimensionType): void;
|
|
26
30
|
setScroll(e: ViewPortScrollEvent): Promise<void>;
|
|
31
|
+
setScrollByDelta(e: ViewPortScrollEvent, currentPhysicalCoordinate: number): Promise<ViewPortScrollEvent>;
|
|
27
32
|
/**
|
|
28
33
|
* On scroll event started
|
|
29
34
|
*/
|
|
30
35
|
scroll(coordinate: number, dimension: DimensionType, force?: boolean, delta?: number, outside?: boolean): void;
|
|
31
36
|
private getParams;
|
|
32
|
-
private
|
|
37
|
+
private wrapPhysicalCoordinate;
|
|
38
|
+
private wrapLogicalCoordinate;
|
|
33
39
|
private cancelScroll;
|
|
34
|
-
private
|
|
40
|
+
private toLogicalScrollCoordinate;
|
|
41
|
+
private toPhysicalCoordinate;
|
|
42
|
+
private toLogicalCoordinate;
|
|
35
43
|
}
|
|
36
44
|
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type ScrollDimensionInput = {
|
|
2
|
+
contentSize: number;
|
|
3
|
+
clientSize: number;
|
|
4
|
+
virtualSize?: number;
|
|
5
|
+
maxScrollSize?: number;
|
|
6
|
+
};
|
|
7
|
+
export type ScrollDimension = {
|
|
8
|
+
contentSize: number;
|
|
9
|
+
clientSize: number;
|
|
10
|
+
viewportSize: number;
|
|
11
|
+
physicalContentSize: number;
|
|
12
|
+
logicalScrollSize: number;
|
|
13
|
+
physicalScrollSize: number;
|
|
14
|
+
isCompressed: boolean;
|
|
15
|
+
toLogicalCoordinate(coordinate: number): number;
|
|
16
|
+
toPhysicalCoordinate(coordinate: number): number;
|
|
17
|
+
getRenderOffset(coordinate: number): number;
|
|
18
|
+
};
|
|
19
|
+
export declare function getMaxScrollSize(doc?: Document | undefined): number;
|
|
20
|
+
export declare function getScrollDimension({ contentSize, clientSize, virtualSize, maxScrollSize, }: ScrollDimensionInput): ScrollDimension;
|
|
@@ -70,5 +70,11 @@ export declare class SelectionStoreConnector {
|
|
|
70
70
|
selectAll(): void;
|
|
71
71
|
private getXStores;
|
|
72
72
|
private getYStores;
|
|
73
|
+
/**
|
|
74
|
+
* Keep column viewport positions and types in sync across pin/unpin rerenders.
|
|
75
|
+
* Regression case: when a selected rgCol cell was pinned left, colPinStart
|
|
76
|
+
* could take over x=0 and render the stale rgCol focus store in the pinned area.
|
|
77
|
+
*/
|
|
78
|
+
private updateColumnTypeMapping;
|
|
73
79
|
}
|
|
74
80
|
export {};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { DimensionSettingsState, PositionItem, ViewSettingSizeProp, ViewportStateItems, VirtualPositionItem, Range } from "../../types/index";
|
|
2
2
|
export type DimensionDataViewport = Pick<DimensionSettingsState, 'indexes' | 'positionIndexes' | 'positionIndexToItem' | 'sizes' | 'originItemSize' | 'realSize'>;
|
|
3
3
|
export type ItemsToUpdate = Pick<ViewportStateItems, 'items' | 'start' | 'end'>;
|
|
4
|
+
export declare function getViewportMaxCoordinate(dimension: Pick<DimensionSettingsState, 'realSize' | 'originItemSize'>, viewportSize: number, frameOffset?: number): number;
|
|
5
|
+
export declare function clampViewportCoordinate(coordinate: number, dimension: Pick<DimensionSettingsState, 'realSize' | 'originItemSize'>, viewportSize: number, frameOffset?: number): number;
|
|
4
6
|
/**
|
|
5
7
|
* Update items based on new scroll position
|
|
6
8
|
* If viewport wasn't changed fully simple recombination of positions
|
|
@@ -509,6 +509,12 @@ export interface ViewportState extends ViewportStateItems {
|
|
|
509
509
|
* Until virtualization is not disabled.
|
|
510
510
|
*/
|
|
511
511
|
clientSize: number;
|
|
512
|
+
/**
|
|
513
|
+
* Difference between logical coordinate and browser-safe rendered coordinate.
|
|
514
|
+
* Internal scroll virtualization offset used when content exceeds browser
|
|
515
|
+
* native scroll size limits.
|
|
516
|
+
*/
|
|
517
|
+
renderOffset?: number;
|
|
512
518
|
}
|
|
513
519
|
/**
|
|
514
520
|
* `ViewSettingSizeProp` is a record that maps column or row indexes to their
|
|
@@ -625,6 +631,11 @@ export interface DimensionSettingsState extends DimensionCalc {
|
|
|
625
631
|
* Represents the origin item size of the dimension.
|
|
626
632
|
*/
|
|
627
633
|
originItemSize: number;
|
|
634
|
+
/**
|
|
635
|
+
* Internal render offset applied when logical scroll space is compressed into
|
|
636
|
+
* a browser-safe physical scroll range.
|
|
637
|
+
*/
|
|
638
|
+
renderOffset?: number;
|
|
628
639
|
}
|
|
629
640
|
/**
|
|
630
641
|
* Represents the mapping of dimension types to their corresponding observable stores.
|
|
@@ -65,6 +65,19 @@ export type ChangedRange = {
|
|
|
65
65
|
[newRowIndex: number]: DataType;
|
|
66
66
|
};
|
|
67
67
|
};
|
|
68
|
+
/**
|
|
69
|
+
* Logical focus marker captured before column viewport ownership changes.
|
|
70
|
+
* Used when a selected column is pinned/unpinned so focus can be restored by
|
|
71
|
+
* column prop after the column moves between rgCol, colPinStart, or colPinEnd.
|
|
72
|
+
*/
|
|
73
|
+
export type PendingColumnFocusRestore = {
|
|
74
|
+
prop: ColumnProp;
|
|
75
|
+
colType: DimensionCols;
|
|
76
|
+
colIndex: ColIndex;
|
|
77
|
+
prevStoreX: ColIndex;
|
|
78
|
+
rowType: DimensionRows;
|
|
79
|
+
rowIndex: RowIndex;
|
|
80
|
+
};
|
|
68
81
|
/**
|
|
69
82
|
* Cell coordinates
|
|
70
83
|
*/
|