@vuu-ui/vuu-table 0.13.114 → 0.13.115-alpha.2
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/cjs/Row.js +16 -19
- package/cjs/Row.js.map +1 -1
- package/cjs/Table.js +8 -15
- package/cjs/Table.js.map +1 -1
- package/cjs/bulk-edit/useBulkEditPanel.js +6 -7
- package/cjs/bulk-edit/useBulkEditPanel.js.map +1 -1
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +2 -3
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
- package/cjs/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js +2 -3
- package/cjs/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +1 -1
- package/cjs/cell-renderers/input-cell/InputCell.js +3 -5
- package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -1
- package/cjs/cell-renderers/toggle-cell/ToggleCell.js +5 -6
- package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
- package/cjs/data-row/DataRow.js +146 -0
- package/cjs/data-row/DataRow.js.map +1 -0
- package/cjs/index.js +2 -0
- package/cjs/index.js.map +1 -1
- package/cjs/table-cell/TableCell.js +6 -9
- package/cjs/table-cell/TableCell.js.map +1 -1
- package/cjs/table-cell/TableGroupCell.css.js +1 -1
- package/cjs/table-cell/TableGroupCell.js +7 -8
- package/cjs/table-cell/TableGroupCell.js.map +1 -1
- package/cjs/table-data-source/{moving-window.js → DataRowMovingWindow.js} +19 -29
- package/cjs/table-data-source/DataRowMovingWindow.js.map +1 -0
- package/cjs/table-data-source/useDataSource.js +77 -37
- package/cjs/table-data-source/useDataSource.js.map +1 -1
- package/cjs/useRowClassNameGenerators.js +2 -2
- package/cjs/useRowClassNameGenerators.js.map +1 -1
- package/cjs/useSelection.js +5 -6
- package/cjs/useSelection.js.map +1 -1
- package/cjs/useTable.js +26 -36
- package/cjs/useTable.js.map +1 -1
- package/cjs/useTableContextMenu.js +6 -10
- package/cjs/useTableContextMenu.js.map +1 -1
- package/cjs/useTableScroll.js +0 -1
- package/cjs/useTableScroll.js.map +1 -1
- package/cjs/useTableViewport.js +2 -2
- package/cjs/useTableViewport.js.map +1 -1
- package/esm/Row.js +17 -20
- package/esm/Row.js.map +1 -1
- package/esm/Table.js +9 -16
- package/esm/Table.js.map +1 -1
- package/esm/bulk-edit/useBulkEditPanel.js +7 -8
- package/esm/bulk-edit/useBulkEditPanel.js.map +1 -1
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +2 -3
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
- package/esm/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js +3 -4
- package/esm/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +1 -1
- package/esm/cell-renderers/input-cell/InputCell.js +3 -5
- package/esm/cell-renderers/input-cell/InputCell.js.map +1 -1
- package/esm/cell-renderers/toggle-cell/ToggleCell.js +5 -6
- package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
- package/esm/data-row/DataRow.js +144 -0
- package/esm/data-row/DataRow.js.map +1 -0
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/table-cell/TableCell.js +6 -9
- package/esm/table-cell/TableCell.js.map +1 -1
- package/esm/table-cell/TableGroupCell.css.js +1 -1
- package/esm/table-cell/TableGroupCell.js +8 -9
- package/esm/table-cell/TableGroupCell.js.map +1 -1
- package/esm/table-data-source/{moving-window.js → DataRowMovingWindow.js} +20 -30
- package/esm/table-data-source/DataRowMovingWindow.js.map +1 -0
- package/esm/table-data-source/useDataSource.js +78 -38
- package/esm/table-data-source/useDataSource.js.map +1 -1
- package/esm/useRowClassNameGenerators.js +2 -2
- package/esm/useRowClassNameGenerators.js.map +1 -1
- package/esm/useSelection.js +6 -7
- package/esm/useSelection.js.map +1 -1
- package/esm/useTable.js +27 -37
- package/esm/useTable.js.map +1 -1
- package/esm/useTableContextMenu.js +7 -11
- package/esm/useTableContextMenu.js.map +1 -1
- package/esm/useTableScroll.js +0 -1
- package/esm/useTableScroll.js.map +1 -1
- package/esm/useTableViewport.js +2 -2
- package/esm/useTableViewport.js.map +1 -1
- package/package.json +10 -10
- package/types/Row.d.ts +1 -1
- package/types/Table.d.ts +1 -12
- package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +1 -1
- package/types/cell-renderers/input-cell/InputCell.d.ts +1 -1
- package/types/data-row/DataRow.d.ts +16 -0
- package/types/index.d.ts +1 -0
- package/types/table-cell/TableCell.d.ts +1 -1
- package/types/table-cell/TableGroupCell.d.ts +1 -1
- package/types/table-data-source/DataRowMovingWindow.d.ts +24 -0
- package/types/table-data-source/useDataSource.d.ts +5 -6
- package/types/useTable.d.ts +5 -7
- package/types/useTableContextMenu.d.ts +5 -7
- package/types/useTableScroll.d.ts +1 -3
- package/cjs/table-data-source/moving-window.js.map +0 -1
- package/esm/table-data-source/moving-window.js.map +0 -1
- package/types/table-data-source/moving-window.d.ts +0 -23
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { Range
|
|
1
|
+
import { Range } from '@vuu-ui/vuu-utils';
|
|
2
2
|
import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { MovingDataRowWindow } from './DataRowMovingWindow.js';
|
|
4
|
+
import { dataRowFactory } from '../data-row/DataRow.js';
|
|
4
5
|
|
|
5
|
-
const
|
|
6
|
+
const NullDataRow = () => ({});
|
|
6
7
|
const useDataSource = ({
|
|
7
8
|
autoSelectFirstRow,
|
|
8
9
|
autoSelectRowKey,
|
|
@@ -16,10 +17,14 @@ const useDataSource = ({
|
|
|
16
17
|
suspenseProps
|
|
17
18
|
}) => {
|
|
18
19
|
const [, forceUpdate] = useState(null);
|
|
19
|
-
const
|
|
20
|
+
const dataRows = useRef([]);
|
|
20
21
|
const isMounted = useRef(true);
|
|
21
22
|
const hasUpdated = useRef(false);
|
|
22
23
|
const rangeRef = useRef(dataSource.range);
|
|
24
|
+
const dataRowRef = useRef(NullDataRow);
|
|
25
|
+
const setColumnsRef = useRef(
|
|
26
|
+
void 0
|
|
27
|
+
);
|
|
23
28
|
const totalRowCountRef = useRef(0);
|
|
24
29
|
const rowAutoSelected = useRef(false);
|
|
25
30
|
const autoSelect = autoSelectRowKey ?? (autoSelectFirstRow || selectionModel === "single-no-deselect");
|
|
@@ -41,45 +46,63 @@ const useDataSource = ({
|
|
|
41
46
|
}
|
|
42
47
|
};
|
|
43
48
|
}, [autoSelect, dataSource, handleConfigChange]);
|
|
44
|
-
const
|
|
45
|
-
() => new
|
|
49
|
+
const dataRowWindow = useMemo(
|
|
50
|
+
() => new MovingDataRowWindow(rangeRef.current.withBuffer),
|
|
46
51
|
[]
|
|
47
52
|
);
|
|
53
|
+
useMemo(() => {
|
|
54
|
+
dataSource.on("resumed", () => {
|
|
55
|
+
const { range } = dataSource;
|
|
56
|
+
if (range.to !== 0) {
|
|
57
|
+
dataRowWindow.setRange(dataSource.range.withBuffer);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}, [dataRowWindow, dataSource]);
|
|
48
61
|
const setData = useCallback(
|
|
49
62
|
(updates) => {
|
|
63
|
+
const { current: DataRow2 } = dataRowRef;
|
|
50
64
|
for (const row of updates) {
|
|
51
|
-
|
|
65
|
+
dataRowWindow.add(DataRow2(row));
|
|
52
66
|
}
|
|
53
|
-
|
|
67
|
+
dataRows.current = dataRowWindow.data;
|
|
54
68
|
if (isMounted.current) {
|
|
55
69
|
forceUpdate({});
|
|
56
70
|
}
|
|
57
71
|
},
|
|
58
|
-
[
|
|
72
|
+
[dataRowWindow]
|
|
59
73
|
);
|
|
60
74
|
const selectRow = useCallback(
|
|
61
|
-
(
|
|
62
|
-
const rowKey =
|
|
75
|
+
(dataRow) => {
|
|
76
|
+
const rowKey = dataRow.key;
|
|
63
77
|
dataSource.select?.({
|
|
64
78
|
preserveExistingSelection: false,
|
|
65
79
|
rowKey,
|
|
66
80
|
type: "SELECT_ROW"
|
|
67
81
|
});
|
|
68
|
-
onSelect?.(
|
|
82
|
+
onSelect?.(dataRow);
|
|
69
83
|
},
|
|
70
84
|
[dataSource, onSelect]
|
|
71
85
|
);
|
|
86
|
+
const createDataRow = useCallback(
|
|
87
|
+
(columns, schemaColumns) => {
|
|
88
|
+
const [DataRow2, setColumns] = dataRowFactory(columns, schemaColumns);
|
|
89
|
+
dataRowRef.current = DataRow2;
|
|
90
|
+
setColumnsRef.current = setColumns;
|
|
91
|
+
},
|
|
92
|
+
[]
|
|
93
|
+
);
|
|
72
94
|
const datasourceMessageHandler = useCallback(
|
|
73
95
|
(message) => {
|
|
74
96
|
if (message.type === "subscribed") {
|
|
97
|
+
createDataRow(message.columns, message.tableSchema.columns);
|
|
75
98
|
onSubscribed?.(message);
|
|
76
99
|
} else if (message.type === "viewport-update") {
|
|
77
100
|
if (typeof message.size === "number") {
|
|
78
101
|
onSizeChange?.(message.size);
|
|
79
|
-
const size =
|
|
80
|
-
|
|
102
|
+
const size = dataRowWindow.data.length;
|
|
103
|
+
dataRowWindow.setRowCount(message.size);
|
|
81
104
|
totalRowCountRef.current = message.size;
|
|
82
|
-
if (
|
|
105
|
+
if (dataRowWindow.data.length < size) {
|
|
83
106
|
if (isMounted.current === false) {
|
|
84
107
|
console.log("setting state whilst unmounted");
|
|
85
108
|
}
|
|
@@ -91,27 +114,27 @@ const useDataSource = ({
|
|
|
91
114
|
if (autoSelect && rowAutoSelected.current === false) {
|
|
92
115
|
rowAutoSelected.current = true;
|
|
93
116
|
if (typeof autoSelect === "string") {
|
|
94
|
-
const
|
|
95
|
-
if (
|
|
96
|
-
selectRow(
|
|
117
|
+
const dataRow = dataRowWindow.getByKey(autoSelect);
|
|
118
|
+
if (dataRow) {
|
|
119
|
+
selectRow(dataRow);
|
|
97
120
|
} else {
|
|
98
121
|
console.warn(
|
|
99
122
|
`[useDataSource] autoSelect row key ${autoSelect} not in viewport`
|
|
100
123
|
);
|
|
101
124
|
}
|
|
102
|
-
} else if (
|
|
103
|
-
selectRow(
|
|
125
|
+
} else if (dataRowWindow.hasData) {
|
|
126
|
+
selectRow(dataRowWindow.firstRow);
|
|
104
127
|
}
|
|
105
128
|
}
|
|
106
129
|
} else if (message.size === 0) {
|
|
107
130
|
setData([]);
|
|
108
131
|
} else if (typeof message.size === "number") {
|
|
109
|
-
|
|
132
|
+
dataRows.current = dataRowWindow.data;
|
|
110
133
|
hasUpdated.current = true;
|
|
111
134
|
}
|
|
112
135
|
} else if (message.type === "viewport-clear") {
|
|
113
136
|
onSizeChange?.(0);
|
|
114
|
-
|
|
137
|
+
dataRowWindow.setRowCount(0);
|
|
115
138
|
setData([]);
|
|
116
139
|
if (isMounted.current === false) {
|
|
117
140
|
console.log("setting state whilst unmounted");
|
|
@@ -121,16 +144,27 @@ const useDataSource = ({
|
|
|
121
144
|
console.log(`useDataSource unexpected message ${message.type}`);
|
|
122
145
|
}
|
|
123
146
|
},
|
|
124
|
-
[
|
|
147
|
+
[
|
|
148
|
+
autoSelect,
|
|
149
|
+
createDataRow,
|
|
150
|
+
dataRowWindow,
|
|
151
|
+
onSizeChange,
|
|
152
|
+
onSubscribed,
|
|
153
|
+
selectRow,
|
|
154
|
+
setData
|
|
155
|
+
]
|
|
125
156
|
);
|
|
126
157
|
const getSelectedRows = useCallback(() => {
|
|
127
|
-
return
|
|
128
|
-
}, [
|
|
158
|
+
return dataRowWindow.getSelectedRows();
|
|
159
|
+
}, [dataRowWindow]);
|
|
129
160
|
useEffect(() => {
|
|
130
161
|
if (dataSource.status === "disabled") {
|
|
131
162
|
dataSource.enable?.(datasourceMessageHandler);
|
|
132
163
|
}
|
|
133
164
|
}, [dataSource, datasourceMessageHandler]);
|
|
165
|
+
useMemo(() => {
|
|
166
|
+
setColumnsRef.current?.(dataSource.columns);
|
|
167
|
+
}, [dataSource.columns]);
|
|
134
168
|
const setRange = useCallback(
|
|
135
169
|
(viewportRange) => {
|
|
136
170
|
if (!rangeRef.current.equals(viewportRange)) {
|
|
@@ -139,7 +173,7 @@ const useDataSource = ({
|
|
|
139
173
|
viewportRange.to,
|
|
140
174
|
renderBufferSize
|
|
141
175
|
);
|
|
142
|
-
|
|
176
|
+
dataRowWindow.setRange(range.withBuffer);
|
|
143
177
|
if (dataSource.status !== "subscribed" && dataSource.status !== "subscribing" && dataSource.status !== "enabling") {
|
|
144
178
|
dataSource?.subscribe(
|
|
145
179
|
{
|
|
@@ -156,8 +190,8 @@ const useDataSource = ({
|
|
|
156
190
|
},
|
|
157
191
|
[
|
|
158
192
|
autoSelectRowKey,
|
|
193
|
+
dataRowWindow,
|
|
159
194
|
dataSource,
|
|
160
|
-
dataWindow,
|
|
161
195
|
datasourceMessageHandler,
|
|
162
196
|
renderBufferSize,
|
|
163
197
|
revealSelected
|
|
@@ -166,6 +200,14 @@ const useDataSource = ({
|
|
|
166
200
|
useEffect(() => {
|
|
167
201
|
isMounted.current = true;
|
|
168
202
|
if (dataSource.status !== "initialising") {
|
|
203
|
+
const { columns, tableSchema } = dataSource;
|
|
204
|
+
if (tableSchema) {
|
|
205
|
+
createDataRow(columns, tableSchema.columns);
|
|
206
|
+
} else {
|
|
207
|
+
throw Error(
|
|
208
|
+
`[useDataSource] a resumed dataSource must have a tableSchema`
|
|
209
|
+
);
|
|
210
|
+
}
|
|
169
211
|
dataSource.resume?.(datasourceMessageHandler);
|
|
170
212
|
if (dataSource.range.from > 0) {
|
|
171
213
|
const { from, to } = rangeRef.current.reset;
|
|
@@ -179,20 +221,18 @@ const useDataSource = ({
|
|
|
179
221
|
suspenseProps?.escalateDelay
|
|
180
222
|
);
|
|
181
223
|
};
|
|
182
|
-
}, [
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
);
|
|
224
|
+
}, [
|
|
225
|
+
createDataRow,
|
|
226
|
+
dataSource,
|
|
227
|
+
datasourceMessageHandler,
|
|
228
|
+
setRange,
|
|
229
|
+
suspenseProps
|
|
230
|
+
]);
|
|
190
231
|
return {
|
|
191
|
-
|
|
192
|
-
|
|
232
|
+
dataRows: dataRows.current,
|
|
233
|
+
dataRowsRef: dataRows,
|
|
193
234
|
getSelectedRows,
|
|
194
235
|
range: rangeRef.current,
|
|
195
|
-
removeColumnDataFromCache,
|
|
196
236
|
setRange
|
|
197
237
|
};
|
|
198
238
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDataSource.js","sources":["../../../../packages/vuu-table/src/table-data-source/useDataSource.ts"],"sourcesContent":["import type {\n DataSourceConfigChangeHandler,\n DataSourceRow,\n DataSourceSubscribeCallback,\n DataSourceSubscribedMessage,\n DataSourceSuspenseProps,\n} from \"@vuu-ui/vuu-data-types\";\nimport { SelectRowRequest, VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { Range } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { TableProps } from \"../Table\";\nimport { metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { TableRowSelectHandlerInternal } from \"@vuu-ui/vuu-table-types\";\nimport { MovingWindow } from \"./moving-window\";\n\nconst { KEY } = metadataKeys;\n\nexport interface DataSourceHookProps\n extends Pick<\n TableProps,\n | \"autoSelectFirstRow\"\n | \"autoSelectRowKey\"\n | \"dataSource\"\n | \"renderBufferSize\"\n | \"revealSelected\"\n | \"selectionModel\"\n > {\n suspenseProps?: DataSourceSuspenseProps;\n onSelect: TableRowSelectHandlerInternal;\n onSizeChange: (size: number) => void;\n onSubscribed: (subscription: DataSourceSubscribedMessage) => void;\n}\n\nexport const useDataSource = ({\n autoSelectFirstRow,\n autoSelectRowKey,\n dataSource,\n onSizeChange,\n onSubscribed,\n renderBufferSize = 0,\n revealSelected,\n onSelect,\n selectionModel,\n suspenseProps,\n}: DataSourceHookProps) => {\n const [, forceUpdate] = useState<unknown>(null);\n const data = useRef<DataSourceRow[]>([]);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rangeRef = useRef<Range>(dataSource.range);\n const totalRowCountRef = useRef(0);\n const rowAutoSelected = useRef(false);\n\n const autoSelect =\n autoSelectRowKey ??\n (autoSelectFirstRow || selectionModel === \"single-no-deselect\");\n\n const handleConfigChange = useCallback<DataSourceConfigChangeHandler>(\n (_config, _range, _confirmed, configChanges) => {\n if (configChanges?.filterChanged) {\n rowAutoSelected.current = false;\n }\n },\n [],\n );\n\n useEffect(() => {\n if (autoSelect) {\n dataSource.on(\"config\", handleConfigChange);\n }\n return () => {\n if (autoSelect) {\n dataSource.removeListener(\"config\", handleConfigChange);\n }\n };\n }, [autoSelect, dataSource, handleConfigChange]);\n\n const dataWindow = useMemo(\n () => new MovingWindow(rangeRef.current.withBuffer),\n [],\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n data.current = dataWindow.data;\n if (isMounted.current) {\n // TODO do we ever need to worry about missing updates here ?\n forceUpdate({});\n }\n },\n [dataWindow],\n );\n\n const selectRow = useCallback(\n (row: DataSourceRow) => {\n const rowKey = row[KEY];\n dataSource.select?.({\n preserveExistingSelection: false,\n rowKey,\n type: \"SELECT_ROW\",\n } as SelectRowRequest);\n onSelect?.(row);\n },\n [dataSource, onSelect],\n );\n\n const datasourceMessageHandler: DataSourceSubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"subscribed\") {\n onSubscribed?.(message);\n } else if (message.type === \"viewport-update\") {\n if (typeof message.size === \"number\") {\n onSizeChange?.(message.size);\n const size = dataWindow.data.length;\n dataWindow.setRowCount(message.size);\n totalRowCountRef.current = message.size;\n\n if (dataWindow.data.length < size) {\n if (isMounted.current === false) {\n console.log(\"setting state whilst unmounted\");\n }\n\n forceUpdate({});\n }\n }\n if (message.rows) {\n setData(message.rows);\n if (autoSelect && rowAutoSelected.current === false) {\n // OR if no selected row in message.rows, e.g after a filter\n rowAutoSelected.current = true;\n if (typeof autoSelect === \"string\") {\n const row = message.rows.find((row) => row[KEY] === autoSelect);\n if (row) {\n selectRow(row);\n } else {\n console.warn(\n `[useDataSource] autoSelect row key ${autoSelect} not in viewport`,\n );\n }\n } else if (message.rows.length > 0) {\n selectRow(message.rows[0]);\n }\n }\n } else if (message.size === 0) {\n setData([]);\n } else if (typeof message.size === \"number\") {\n data.current = dataWindow.data;\n hasUpdated.current = true;\n }\n } else if (message.type === \"viewport-clear\") {\n onSizeChange?.(0);\n dataWindow.setRowCount(0);\n setData([]);\n\n if (isMounted.current === false) {\n console.log(\"setting state whilst unmounted\");\n }\n\n forceUpdate({});\n } else {\n console.log(`useDataSource unexpected message ${message.type}`);\n }\n },\n [autoSelect, dataWindow, onSizeChange, onSubscribed, selectRow, setData],\n );\n\n const getSelectedRows = useCallback(() => {\n return dataWindow.getSelectedRows();\n }, [dataWindow]);\n\n useEffect(() => {\n if (dataSource.status === \"disabled\") {\n dataSource.enable?.(datasourceMessageHandler);\n }\n }, [dataSource, datasourceMessageHandler]);\n\n const setRange = useCallback(\n (viewportRange: VuuRange) => {\n if (!rangeRef.current.equals(viewportRange)) {\n const range = Range(\n viewportRange.from,\n viewportRange.to,\n renderBufferSize,\n );\n\n dataWindow.setRange(range.withBuffer);\n\n if (\n dataSource.status !== \"subscribed\" &&\n dataSource.status !== \"subscribing\" &&\n dataSource.status !== \"enabling\"\n ) {\n dataSource?.subscribe(\n {\n range,\n revealSelected,\n selectedKeyValues: autoSelectRowKey\n ? [autoSelectRowKey]\n : undefined,\n },\n datasourceMessageHandler,\n );\n } else {\n dataSource.range = rangeRef.current = range;\n }\n }\n },\n [\n autoSelectRowKey,\n dataSource,\n dataWindow,\n datasourceMessageHandler,\n renderBufferSize,\n revealSelected,\n ],\n );\n\n useEffect(() => {\n isMounted.current = true;\n if (dataSource.status !== \"initialising\") {\n dataSource.resume?.(datasourceMessageHandler);\n\n if (dataSource.range.from > 0) {\n // UI does not currently restore scroll position, so always reset to top of dataset\n const { from, to } = rangeRef.current.reset;\n setRange({ from, to });\n }\n }\n return () => {\n isMounted.current = false;\n dataSource.suspend?.(\n suspenseProps?.escalateToDisable,\n suspenseProps?.escalateDelay,\n );\n };\n }, [dataSource, datasourceMessageHandler, setRange, suspenseProps]);\n\n const removeColumnDataFromCache = useCallback(\n (indexOfRemovedColumn: number) => {\n dataWindow.spliceDataAtIndex(indexOfRemovedColumn);\n data.current = dataWindow.data;\n },\n [dataWindow],\n );\n\n return {\n data: data.current,\n dataRef: data,\n getSelectedRows,\n range: rangeRef.current,\n removeColumnDataFromCache,\n setRange,\n };\n};\n"],"names":["row"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useDataSource.js","sources":["../../../../packages/vuu-table/src/table-data-source/useDataSource.ts"],"sourcesContent":["import type {\n DataSourceConfigChangeHandler,\n DataSourceRow,\n DataSourceSubscribeCallback,\n DataSourceSubscribedMessage,\n DataSourceSuspenseProps,\n SchemaColumn,\n} from \"@vuu-ui/vuu-data-types\";\nimport { SelectRowRequest, VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { Range } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { TableProps } from \"../Table\";\nimport {\n DataRow,\n TableRowSelectHandlerInternal,\n} from \"@vuu-ui/vuu-table-types\";\nimport { MovingDataRowWindow } from \"./DataRowMovingWindow\";\nimport { dataRowFactory, DataRowFunc } from \"../data-row/DataRow\";\n\nconst NullDataRow = () => ({}) as DataRow;\n\nexport interface DataSourceHookProps\n extends Pick<\n TableProps,\n | \"autoSelectFirstRow\"\n | \"autoSelectRowKey\"\n | \"dataSource\"\n | \"renderBufferSize\"\n | \"revealSelected\"\n | \"selectionModel\"\n > {\n suspenseProps?: DataSourceSuspenseProps;\n onSelect: TableRowSelectHandlerInternal;\n onSizeChange: (size: number) => void;\n onSubscribed: (subscription: DataSourceSubscribedMessage) => void;\n}\n\nexport const useDataSource = ({\n autoSelectFirstRow,\n autoSelectRowKey,\n dataSource,\n onSizeChange,\n onSubscribed,\n renderBufferSize = 0,\n revealSelected,\n onSelect,\n selectionModel,\n suspenseProps,\n}: DataSourceHookProps) => {\n const [, forceUpdate] = useState<unknown>(null);\n const dataRows = useRef<DataRow[]>([]);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rangeRef = useRef<Range>(dataSource.range);\n const dataRowRef = useRef<DataRowFunc>(NullDataRow);\n const setColumnsRef = useRef<undefined | ((columns: string[]) => void)>(\n undefined,\n );\n const totalRowCountRef = useRef(0);\n const rowAutoSelected = useRef(false);\n\n const autoSelect =\n autoSelectRowKey ??\n (autoSelectFirstRow || selectionModel === \"single-no-deselect\");\n\n const handleConfigChange = useCallback<DataSourceConfigChangeHandler>(\n (_config, _range, _confirmed, configChanges) => {\n if (configChanges?.filterChanged) {\n rowAutoSelected.current = false;\n }\n },\n [],\n );\n\n useEffect(() => {\n if (autoSelect) {\n dataSource.on(\"config\", handleConfigChange);\n }\n return () => {\n if (autoSelect) {\n dataSource.removeListener(\"config\", handleConfigChange);\n }\n };\n }, [autoSelect, dataSource, handleConfigChange]);\n\n const dataRowWindow = useMemo(\n () => new MovingDataRowWindow(rangeRef.current.withBuffer),\n [],\n );\n\n useMemo(() => {\n dataSource.on(\"resumed\", () => {\n // When we resume a dataSource (after switching tabs etc)\n // client will receive rows. We may not have received any\n // setRange calls at this point so dataWindow range will\n //not yet be set. If the dataWindow range is already set,\n // this is a no-op.\n const { range } = dataSource;\n if (range.to !== 0) {\n dataRowWindow.setRange(dataSource.range.withBuffer);\n }\n });\n }, [dataRowWindow, dataSource]);\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n const { current: DataRow } = dataRowRef;\n for (const row of updates) {\n // for now, we create a new DataRow each time\n dataRowWindow.add(DataRow(row));\n }\n dataRows.current = dataRowWindow.data;\n if (isMounted.current) {\n // TODO do we ever need to worry about missing updates here ?\n forceUpdate({});\n }\n },\n [dataRowWindow],\n );\n\n const selectRow = useCallback(\n (dataRow: DataRow) => {\n const rowKey = dataRow.key;\n dataSource.select?.({\n preserveExistingSelection: false,\n rowKey,\n type: \"SELECT_ROW\",\n } as SelectRowRequest);\n onSelect?.(dataRow);\n },\n [dataSource, onSelect],\n );\n\n const createDataRow = useCallback(\n (columns: string[], schemaColumns: readonly SchemaColumn[]) => {\n const [DataRow, setColumns] = dataRowFactory(columns, schemaColumns);\n dataRowRef.current = DataRow;\n setColumnsRef.current = setColumns;\n },\n [],\n );\n\n const datasourceMessageHandler: DataSourceSubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"subscribed\") {\n createDataRow(message.columns, message.tableSchema.columns);\n onSubscribed?.(message);\n } else if (message.type === \"viewport-update\") {\n if (typeof message.size === \"number\") {\n onSizeChange?.(message.size);\n const size = dataRowWindow.data.length;\n dataRowWindow.setRowCount(message.size);\n totalRowCountRef.current = message.size;\n\n if (dataRowWindow.data.length < size) {\n if (isMounted.current === false) {\n console.log(\"setting state whilst unmounted\");\n }\n\n forceUpdate({});\n }\n }\n if (message.rows) {\n setData(message.rows);\n if (autoSelect && rowAutoSelected.current === false) {\n // OR if no selected row in message.rows, e.g after a filter\n rowAutoSelected.current = true;\n if (typeof autoSelect === \"string\") {\n const dataRow = dataRowWindow.getByKey(autoSelect);\n if (dataRow) {\n selectRow(dataRow);\n } else {\n console.warn(\n `[useDataSource] autoSelect row key ${autoSelect} not in viewport`,\n );\n }\n } else if (dataRowWindow.hasData) {\n selectRow(dataRowWindow.firstRow);\n }\n }\n } else if (message.size === 0) {\n setData([]);\n } else if (typeof message.size === \"number\") {\n dataRows.current = dataRowWindow.data;\n hasUpdated.current = true;\n }\n } else if (message.type === \"viewport-clear\") {\n onSizeChange?.(0);\n dataRowWindow.setRowCount(0);\n setData([]);\n\n if (isMounted.current === false) {\n console.log(\"setting state whilst unmounted\");\n }\n\n forceUpdate({});\n } else {\n console.log(`useDataSource unexpected message ${message.type}`);\n }\n },\n [\n autoSelect,\n createDataRow,\n dataRowWindow,\n onSizeChange,\n onSubscribed,\n selectRow,\n setData,\n ],\n );\n\n const getSelectedRows = useCallback(() => {\n return dataRowWindow.getSelectedRows();\n }, [dataRowWindow]);\n\n useEffect(() => {\n if (dataSource.status === \"disabled\") {\n dataSource.enable?.(datasourceMessageHandler);\n }\n }, [dataSource, datasourceMessageHandler]);\n\n useMemo(() => {\n setColumnsRef.current?.(dataSource.columns);\n }, [dataSource.columns]);\n\n const setRange = useCallback(\n (viewportRange: VuuRange) => {\n if (!rangeRef.current.equals(viewportRange)) {\n const range = Range(\n viewportRange.from,\n viewportRange.to,\n renderBufferSize,\n );\n\n dataRowWindow.setRange(range.withBuffer);\n\n if (\n dataSource.status !== \"subscribed\" &&\n dataSource.status !== \"subscribing\" &&\n dataSource.status !== \"enabling\"\n ) {\n dataSource?.subscribe(\n {\n range,\n revealSelected,\n selectedKeyValues: autoSelectRowKey\n ? [autoSelectRowKey]\n : undefined,\n },\n datasourceMessageHandler,\n );\n } else {\n dataSource.range = rangeRef.current = range;\n }\n }\n },\n [\n autoSelectRowKey,\n dataRowWindow,\n dataSource,\n datasourceMessageHandler,\n renderBufferSize,\n revealSelected,\n ],\n );\n\n useEffect(() => {\n isMounted.current = true;\n if (dataSource.status !== \"initialising\") {\n const { columns, tableSchema } = dataSource;\n if (tableSchema) {\n createDataRow(columns, tableSchema.columns);\n } else {\n throw Error(\n `[useDataSource] a resumed dataSource must have a tableSchema`,\n );\n }\n\n dataSource.resume?.(datasourceMessageHandler);\n\n if (dataSource.range.from > 0) {\n // UI does not currently restore scroll position, so always reset to top of dataset\n const { from, to } = rangeRef.current.reset;\n setRange({ from, to });\n }\n }\n return () => {\n isMounted.current = false;\n dataSource.suspend?.(\n suspenseProps?.escalateToDisable,\n suspenseProps?.escalateDelay,\n );\n };\n }, [\n createDataRow,\n dataSource,\n datasourceMessageHandler,\n setRange,\n suspenseProps,\n ]);\n\n return {\n dataRows: dataRows.current,\n dataRowsRef: dataRows,\n getSelectedRows,\n range: rangeRef.current,\n setRange,\n };\n};\n"],"names":["DataRow"],"mappings":"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"}
|
|
@@ -9,10 +9,10 @@ const createClassNameGenerator = (ids) => {
|
|
|
9
9
|
functions.push(fn.fn);
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
-
return (
|
|
12
|
+
return (dataRow) => {
|
|
13
13
|
const classNames = [];
|
|
14
14
|
functions?.forEach((fn) => {
|
|
15
|
-
const className = fn(
|
|
15
|
+
const className = fn(dataRow);
|
|
16
16
|
if (className) {
|
|
17
17
|
classNames.push(className);
|
|
18
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRowClassNameGenerators.js","sources":["../../../packages/vuu-table/src/useRowClassNameGenerators.ts"],"sourcesContent":["import { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport {\n getRowClassNameGenerator,\n RowClassNameGenerator,\n} from \"@vuu-ui/vuu-utils\";\nimport { useMemo } from \"react\";\n\nconst createClassNameGenerator = (\n ids?: string[],\n): RowClassNameGenerator | undefined => {\n const functions: RowClassNameGenerator[] = [];\n ids?.forEach((id) => {\n const fn = getRowClassNameGenerator(id);\n if (fn) {\n functions.push(fn.fn);\n }\n });\n return (
|
|
1
|
+
{"version":3,"file":"useRowClassNameGenerators.js","sources":["../../../packages/vuu-table/src/useRowClassNameGenerators.ts"],"sourcesContent":["import { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport {\n getRowClassNameGenerator,\n RowClassNameGenerator,\n} from \"@vuu-ui/vuu-utils\";\nimport { useMemo } from \"react\";\n\nconst createClassNameGenerator = (\n ids?: string[],\n): RowClassNameGenerator | undefined => {\n const functions: RowClassNameGenerator[] = [];\n ids?.forEach((id) => {\n const fn = getRowClassNameGenerator(id);\n if (fn) {\n functions.push(fn.fn);\n }\n });\n return (dataRow) => {\n const classNames: string[] = [];\n functions?.forEach((fn) => {\n const className = fn(dataRow);\n if (className) {\n classNames.push(className);\n }\n });\n return classNames.join(\" \");\n };\n};\n\nexport const useRowClassNameGenerators = ({\n rowClassNameGenerators,\n}: TableConfig) => {\n return useMemo<RowClassNameGenerator | undefined>(() => {\n return createClassNameGenerator(rowClassNameGenerators);\n }, [rowClassNameGenerators]);\n};\n"],"names":[],"mappings":";;;AAOA,MAAM,wBAAA,GAA2B,CAC/B,GACsC,KAAA;AACtC,EAAA,MAAM,YAAqC,EAAC;AAC5C,EAAK,GAAA,EAAA,OAAA,CAAQ,CAAC,EAAO,KAAA;AACnB,IAAM,MAAA,EAAA,GAAK,yBAAyB,EAAE,CAAA;AACtC,IAAA,IAAI,EAAI,EAAA;AACN,MAAU,SAAA,CAAA,IAAA,CAAK,GAAG,EAAE,CAAA;AAAA;AACtB,GACD,CAAA;AACD,EAAA,OAAO,CAAC,OAAY,KAAA;AAClB,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAW,SAAA,EAAA,OAAA,CAAQ,CAAC,EAAO,KAAA;AACzB,MAAM,MAAA,SAAA,GAAY,GAAG,OAAO,CAAA;AAC5B,MAAA,IAAI,SAAW,EAAA;AACb,QAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA;AAC3B,KACD,CAAA;AACD,IAAO,OAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,GAC5B;AACF,CAAA;AAEO,MAAM,4BAA4B,CAAC;AAAA,EACxC;AACF,CAAmB,KAAA;AACjB,EAAA,OAAO,QAA2C,MAAM;AACtD,IAAA,OAAO,yBAAyB,sBAAsB,CAAA;AAAA,GACxD,EAAG,CAAC,sBAAsB,CAAC,CAAA;AAC7B;;;;"}
|
package/esm/useSelection.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { deselectItem, selectItem, queryClosest, dispatchMouseEvent
|
|
1
|
+
import { deselectItem, selectItem, queryClosest, dispatchMouseEvent } from '@vuu-ui/vuu-utils';
|
|
2
2
|
import { useRef, useState, useCallback, useEffect } from 'react';
|
|
3
3
|
import { getRowElementByAriaIndex } from './table-dom-utils.js';
|
|
4
4
|
|
|
5
|
-
const { IDX, KEY, SELECTED } = metadataKeys;
|
|
6
5
|
const orderedRowKeys = (activeRowIdentifier, newRowIdentifier, rangeSelect = false) => {
|
|
7
6
|
if (rangeSelect && activeRowIdentifier) {
|
|
8
7
|
if (newRowIdentifier.rowIdx > activeRowIdentifier.rowIdx) {
|
|
@@ -44,14 +43,14 @@ const useSelection = ({
|
|
|
44
43
|
[selectionKeys]
|
|
45
44
|
);
|
|
46
45
|
const handleRowClick = useCallback(
|
|
47
|
-
(e,
|
|
48
|
-
const {
|
|
46
|
+
(e, dataRow, rangeSelect, keepExistingSelection) => {
|
|
47
|
+
const { index: rowIdx, key: rowKey } = dataRow;
|
|
49
48
|
const { current: activeRowKey } = lastActiveRef;
|
|
50
49
|
const newRowIdentifier = { rowIdx, rowKey };
|
|
51
|
-
if (
|
|
50
|
+
if (dataRow.isSelected && selectionModel === "single-no-deselect") {
|
|
52
51
|
return;
|
|
53
52
|
}
|
|
54
|
-
const selectOperation =
|
|
53
|
+
const selectOperation = dataRow.isSelected ? deselectItem : selectItem;
|
|
55
54
|
if (selectionModel === "checkbox" && allowSelectCheckboxRow !== true) {
|
|
56
55
|
const cell = queryClosest(e.target, ".vuuTableCell");
|
|
57
56
|
if (!cell?.querySelector(".vuuCheckboxRowSelector")) {
|
|
@@ -72,7 +71,7 @@ const useSelection = ({
|
|
|
72
71
|
);
|
|
73
72
|
lastActiveRef.current = newRowIdentifier;
|
|
74
73
|
if (selectRequest) {
|
|
75
|
-
onSelect?.(selectOperation === selectItem ?
|
|
74
|
+
onSelect?.(selectOperation === selectItem ? dataRow : null);
|
|
76
75
|
onSelectionChange?.(selectRequest);
|
|
77
76
|
}
|
|
78
77
|
if (allRowsSelected && selectOperation === deselectItem) {
|
package/esm/useSelection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSelection.js","sources":["../../../packages/vuu-table/src/useSelection.ts"],"sourcesContent":["import {\n TableRowClickHandlerInternal,\n TableRowSelectHandlerInternal,\n SelectionChangeHandler,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n deselectItem,\n dispatchMouseEvent,\n
|
|
1
|
+
{"version":3,"file":"useSelection.js","sources":["../../../packages/vuu-table/src/useSelection.ts"],"sourcesContent":["import {\n TableRowClickHandlerInternal,\n TableRowSelectHandlerInternal,\n SelectionChangeHandler,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n deselectItem,\n dispatchMouseEvent,\n queryClosest,\n selectItem,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n KeyboardEventHandler,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { getRowElementByAriaIndex } from \"./table-dom-utils\";\nimport { TableProps } from \"./Table\";\nimport { DataSource, RowSelectionEventHandler } from \"@vuu-ui/vuu-data-types\";\n\nconst orderedRowKeys = (\n activeRowIdentifier: RowIdentifier | undefined,\n newRowIdentifier: RowIdentifier,\n rangeSelect = false,\n): [string, string] | [string] => {\n if (rangeSelect && activeRowIdentifier) {\n if (newRowIdentifier.rowIdx > activeRowIdentifier.rowIdx) {\n return [activeRowIdentifier.rowKey, newRowIdentifier.rowKey];\n } else {\n return [newRowIdentifier.rowKey, activeRowIdentifier.rowKey];\n }\n } else {\n return [newRowIdentifier.rowKey];\n }\n};\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\ntype RowIdentifier = {\n rowIdx: number;\n rowKey: string;\n};\n\nexport interface SelectionHookProps\n extends Pick<TableProps, \"allowSelectCheckboxRow\" | \"onSelectionChange\"> {\n containerRef: RefObject<HTMLElement | null>;\n dataSource: DataSource;\n highlightedIndexRef: RefObject<number | undefined>;\n selectionKeys?: string[];\n selectionModel: TableSelectionModel;\n onSelectionChange: SelectionChangeHandler;\n onSelect?: TableRowSelectHandlerInternal;\n}\n\nexport const useSelection = ({\n allowSelectCheckboxRow,\n containerRef,\n dataSource,\n highlightedIndexRef,\n selectionKeys = defaultSelectionKeys,\n selectionModel,\n onSelect,\n onSelectionChange,\n}: SelectionHookProps) => {\n const lastActiveRef = useRef<RowIdentifier | undefined>(undefined);\n const [allRowsSelected, setAllRowsSelected] = useState(false);\n\n const handleRowSelection = useCallback<RowSelectionEventHandler>(\n (selectedRowsCount) => {\n setAllRowsSelected((allSelected) =>\n allSelected && selectedRowsCount < dataSource.size\n ? false\n : allSelected,\n );\n },\n [dataSource.size],\n );\n\n useEffect(() => {\n dataSource.on(\"row-selection\", handleRowSelection);\n return () => dataSource.removeListener(\"row-selection\", handleRowSelection);\n }, [dataSource, handleRowSelection]);\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent<HTMLElement>) => selectionKeys.includes(evt.key),\n [selectionKeys],\n );\n\n const handleRowClick = useCallback<TableRowClickHandlerInternal>(\n (e, dataRow, rangeSelect, keepExistingSelection) => {\n const { index: rowIdx, key: rowKey } = dataRow;\n const { current: activeRowKey } = lastActiveRef;\n const newRowIdentifier = { rowIdx, rowKey } as RowIdentifier;\n\n if (dataRow.isSelected && selectionModel === \"single-no-deselect\") {\n return;\n }\n\n const selectOperation = dataRow.isSelected ? deselectItem : selectItem;\n\n if (selectionModel === \"checkbox\" && allowSelectCheckboxRow !== true) {\n const cell = queryClosest(e.target, \".vuuTableCell\");\n if (!cell?.querySelector(\".vuuCheckboxRowSelector\")) {\n return;\n }\n }\n\n const [fromRowKey, toRowKey] = orderedRowKeys(\n activeRowKey,\n newRowIdentifier,\n rangeSelect,\n );\n\n const selectRequest = selectOperation(\n selectionModel,\n fromRowKey,\n rangeSelect,\n keepExistingSelection,\n toRowKey,\n );\n\n lastActiveRef.current = newRowIdentifier;\n\n if (selectRequest) {\n onSelect?.(selectOperation === selectItem ? dataRow : null);\n onSelectionChange?.(selectRequest);\n }\n\n if (allRowsSelected && selectOperation === deselectItem) {\n setAllRowsSelected(false);\n }\n },\n [\n allRowsSelected,\n allowSelectCheckboxRow,\n onSelect,\n onSelectionChange,\n selectionModel,\n ],\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLElement>>(\n (e) => {\n if (isSelectionEvent(e)) {\n const { current: rowIndex } = highlightedIndexRef;\n const { current: container } = containerRef;\n if (rowIndex !== undefined && rowIndex !== -1 && container) {\n const rowEl = getRowElementByAriaIndex(container, rowIndex);\n if (rowEl) {\n dispatchMouseEvent(rowEl, \"click\");\n }\n }\n }\n },\n [containerRef, highlightedIndexRef, isSelectionEvent],\n );\n\n const handleCheckboxColumnHeaderClick = useCallback(() => {\n setAllRowsSelected((allSelected) => {\n if (allSelected) {\n onSelectionChange({\n type: \"DESELECT_ALL\",\n });\n } else {\n onSelectionChange({\n type: \"SELECT_ALL\",\n });\n }\n return !allSelected;\n });\n }, [onSelectionChange]);\n\n return {\n allRowsSelected,\n onCheckBoxColumnHeaderClick: handleCheckboxColumnHeaderClick,\n onKeyDown: handleKeyDown,\n onRowClick: handleRowClick,\n };\n};\n"],"names":[],"mappings":"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"}
|
package/esm/useTable.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useTableAndColumnSettings, columnSettingsFromColumnMenuPermissions, tableSettingsFromColumnMenuPermissions, useColumnActions } from '@vuu-ui/vuu-table-extras';
|
|
2
2
|
import { useDragDrop } from '@vuu-ui/vuu-ui-controls';
|
|
3
|
-
import { useStableReference, useLayoutEffectSkipFirst,
|
|
3
|
+
import { useStableReference, useLayoutEffectSkipFirst, updateColumn, logUnhandledMessage, toggleOrApplySort, isValidNumber, getAllCellsInColumn, getPinStateFromElement, isJsonGroup, isGroupColumn, getAriaRowIndex, metadataKeys } from '@vuu-ui/vuu-utils';
|
|
4
4
|
import { useRef, useMemo, useState, useCallback, useEffect } from 'react';
|
|
5
5
|
import { useCellBlockSelection } from './cell-block/useCellBlockSelection.js';
|
|
6
6
|
import { CellFocusState } from './CellFocusState.js';
|
|
@@ -28,7 +28,7 @@ const zeroHeaderState = {
|
|
|
28
28
|
const stripInternalProperties = (tableConfig) => {
|
|
29
29
|
return tableConfig;
|
|
30
30
|
};
|
|
31
|
-
const {
|
|
31
|
+
const { IS_EXPANDED, IS_LEAF } = metadataKeys;
|
|
32
32
|
const NULL_DRAG_DROP = {
|
|
33
33
|
draggable: void 0,
|
|
34
34
|
onMouseDown: void 0
|
|
@@ -66,7 +66,6 @@ const useTable = ({
|
|
|
66
66
|
renderBufferSize = 0,
|
|
67
67
|
revealSelected,
|
|
68
68
|
rowHeight,
|
|
69
|
-
rowToObject = asDataSourceRowObject,
|
|
70
69
|
scrollingApiRef,
|
|
71
70
|
selectionModel,
|
|
72
71
|
showColumnHeaderMenus = true,
|
|
@@ -143,9 +142,6 @@ const useTable = ({
|
|
|
143
142
|
selectionModel
|
|
144
143
|
]
|
|
145
144
|
);
|
|
146
|
-
const columnMap = useMemo(() => {
|
|
147
|
-
return buildColumnMap(dataSource.columns);
|
|
148
|
-
}, [dataSource.columns]);
|
|
149
145
|
const handleSelectionChange = useCallback(
|
|
150
146
|
(selectRequest) => {
|
|
151
147
|
dataSource.select?.(selectRequest);
|
|
@@ -154,12 +150,12 @@ const useTable = ({
|
|
|
154
150
|
[dataSource, onSelectionChange]
|
|
155
151
|
);
|
|
156
152
|
const handleSelect = useCallback(
|
|
157
|
-
(
|
|
153
|
+
(dataRow) => {
|
|
158
154
|
if (onSelect) {
|
|
159
|
-
onSelect(
|
|
155
|
+
onSelect(dataRow);
|
|
160
156
|
}
|
|
161
157
|
},
|
|
162
|
-
[
|
|
158
|
+
[onSelect]
|
|
163
159
|
);
|
|
164
160
|
const onSubscribed = useCallback(
|
|
165
161
|
({ tableSchema }) => {
|
|
@@ -190,11 +186,11 @@ const useTable = ({
|
|
|
190
186
|
showPaginationControls
|
|
191
187
|
});
|
|
192
188
|
const {
|
|
193
|
-
|
|
194
|
-
|
|
189
|
+
dataRows,
|
|
190
|
+
dataRowsRef,
|
|
195
191
|
getSelectedRows,
|
|
196
192
|
range,
|
|
197
|
-
removeColumnDataFromCache,
|
|
193
|
+
// removeColumnDataFromCache,
|
|
198
194
|
setRange
|
|
199
195
|
} = useDataSource({
|
|
200
196
|
autoSelectFirstRow,
|
|
@@ -210,7 +206,6 @@ const useTable = ({
|
|
|
210
206
|
const { requestScroll, scrollTop, ...scrollProps } = useTableScroll({
|
|
211
207
|
cellFocusStateRef,
|
|
212
208
|
columns,
|
|
213
|
-
focusCell: focusCellRef.current,
|
|
214
209
|
getRowAtPosition,
|
|
215
210
|
rowHeight,
|
|
216
211
|
scrollingApiRef,
|
|
@@ -290,14 +285,12 @@ const useTable = ({
|
|
|
290
285
|
...tableConfig,
|
|
291
286
|
columns: tableConfig.columns.filter((col) => col.name !== column.name)
|
|
292
287
|
};
|
|
293
|
-
const indexOfRemovedColumn = columnMap[column.name];
|
|
294
|
-
removeColumnDataFromCache(indexOfRemovedColumn);
|
|
295
288
|
applyTableConfigChange(newTableConfig, {
|
|
296
289
|
type: "column-removed",
|
|
297
290
|
column
|
|
298
291
|
});
|
|
299
292
|
},
|
|
300
|
-
[applyTableConfigChange,
|
|
293
|
+
[applyTableConfigChange, tableConfig]
|
|
301
294
|
);
|
|
302
295
|
const hideColumns = useCallback(
|
|
303
296
|
(action) => {
|
|
@@ -404,7 +397,6 @@ const useTable = ({
|
|
|
404
397
|
const onResizeColumn = useCallback(
|
|
405
398
|
(phase, columnName, width = 0) => {
|
|
406
399
|
if (phase === "resize") {
|
|
407
|
-
console.log(`resize column ${columnName}`);
|
|
408
400
|
cellResizeState.current?.cells.forEach((cell) => {
|
|
409
401
|
cell.style.width = `${width}px`;
|
|
410
402
|
});
|
|
@@ -481,15 +473,15 @@ const useTable = ({
|
|
|
481
473
|
]
|
|
482
474
|
);
|
|
483
475
|
const onToggleGroup = useCallback(
|
|
484
|
-
(
|
|
485
|
-
const isJson = isJsonGroup(column,
|
|
486
|
-
const key =
|
|
487
|
-
if (
|
|
476
|
+
(dataRow, column) => {
|
|
477
|
+
const isJson = isJsonGroup(column, dataRow);
|
|
478
|
+
const { key } = dataRow;
|
|
479
|
+
if (dataRow.isExpanded) {
|
|
488
480
|
dataSource.closeTreeNode(key, true);
|
|
489
481
|
if (isJson) {
|
|
490
482
|
const idx = columns.indexOf(column);
|
|
491
483
|
const rows = dataSource.getRowsAtDepth?.(idx + 1);
|
|
492
|
-
if (rows && !rows.some((
|
|
484
|
+
if (rows && !rows.some((row) => row[IS_EXPANDED] || row[IS_LEAF])) {
|
|
493
485
|
dispatchTableModelAction({
|
|
494
486
|
type: "hideColumns",
|
|
495
487
|
columns: columns.slice(idx + 2)
|
|
@@ -502,7 +494,7 @@ const useTable = ({
|
|
|
502
494
|
const childRows = dataSource.getChildRows?.(key);
|
|
503
495
|
const idx = columns.indexOf(column) + 1;
|
|
504
496
|
const columnsToShow = [columns[idx]];
|
|
505
|
-
if (childRows && childRows.some((
|
|
497
|
+
if (childRows && childRows.some((row) => row[IS_LEAF])) {
|
|
506
498
|
columnsToShow.push(columns[idx + 1]);
|
|
507
499
|
}
|
|
508
500
|
if (columnsToShow.some((col) => col.hidden)) {
|
|
@@ -514,7 +506,7 @@ const useTable = ({
|
|
|
514
506
|
}
|
|
515
507
|
}
|
|
516
508
|
},
|
|
517
|
-
[
|
|
509
|
+
[columns, dataSource, dispatchTableModelAction]
|
|
518
510
|
);
|
|
519
511
|
const handleToggleGroup = useCallback(
|
|
520
512
|
(treeNodeOperation, rowIdx) => {
|
|
@@ -580,9 +572,8 @@ const useTable = ({
|
|
|
580
572
|
[editingFocus, navigationFocus]
|
|
581
573
|
);
|
|
582
574
|
const onContextMenu = useTableContextMenu({
|
|
583
|
-
columnMap,
|
|
584
575
|
columns,
|
|
585
|
-
|
|
576
|
+
dataRows,
|
|
586
577
|
dataSource,
|
|
587
578
|
getSelectedRows,
|
|
588
579
|
headerCount: headerState.count
|
|
@@ -642,11 +633,11 @@ const useTable = ({
|
|
|
642
633
|
rowCount
|
|
643
634
|
});
|
|
644
635
|
const handleRowClick = useCallback(
|
|
645
|
-
(evt,
|
|
646
|
-
selectionHookOnRowClick(evt,
|
|
647
|
-
onRowClickProp?.(evt,
|
|
636
|
+
(evt, dataRow, rangeSelect, keepExistingSelection) => {
|
|
637
|
+
selectionHookOnRowClick(evt, dataRow, rangeSelect, keepExistingSelection);
|
|
638
|
+
onRowClickProp?.(evt, dataRow);
|
|
648
639
|
},
|
|
649
|
-
[
|
|
640
|
+
[onRowClickProp, selectionHookOnRowClick]
|
|
650
641
|
);
|
|
651
642
|
const handleKeyDown = useCallback(
|
|
652
643
|
(e) => {
|
|
@@ -718,17 +709,17 @@ const useTable = ({
|
|
|
718
709
|
const {
|
|
719
710
|
editType = "commit",
|
|
720
711
|
isValid = true,
|
|
721
|
-
|
|
712
|
+
dataRow,
|
|
722
713
|
columnName,
|
|
723
714
|
value
|
|
724
715
|
} = editState;
|
|
725
716
|
if (editType === "commit" && isValid) {
|
|
726
717
|
if (dataSource.rpcRequest) {
|
|
727
|
-
if (columnName &&
|
|
718
|
+
if (columnName && dataRow) {
|
|
728
719
|
const response = await dataSource.rpcRequest({
|
|
729
720
|
params: {
|
|
730
721
|
column: columnName,
|
|
731
|
-
key:
|
|
722
|
+
key: dataRow.key,
|
|
732
723
|
data: value
|
|
733
724
|
},
|
|
734
725
|
rpcName: "editCell",
|
|
@@ -755,13 +746,13 @@ const useTable = ({
|
|
|
755
746
|
(dragDropState) => {
|
|
756
747
|
const { initialDragElement } = dragDropState;
|
|
757
748
|
const rowIndex = getAriaRowIndex(initialDragElement) - headerState.count - 1;
|
|
758
|
-
const row =
|
|
749
|
+
const row = dataRowsRef.current.find((row2) => row2.index === rowIndex);
|
|
759
750
|
if (row) {
|
|
760
751
|
dragDropState.setPayload(row);
|
|
761
752
|
}
|
|
762
753
|
onDragStart?.(dragDropState);
|
|
763
754
|
},
|
|
764
|
-
[
|
|
755
|
+
[dataRowsRef, headerState.count, onDragStart]
|
|
765
756
|
);
|
|
766
757
|
const onHeaderHeightMeasured = useCallback(
|
|
767
758
|
(height, count) => {
|
|
@@ -793,9 +784,8 @@ const useTable = ({
|
|
|
793
784
|
allRowsSelected,
|
|
794
785
|
"aria-rowcount": dataSource.size,
|
|
795
786
|
cellBlock,
|
|
796
|
-
columnMap,
|
|
797
787
|
columns,
|
|
798
|
-
|
|
788
|
+
dataRows,
|
|
799
789
|
draggableRow,
|
|
800
790
|
focusCellPlaceholderKeyDown,
|
|
801
791
|
focusCellPlaceholderRef,
|