@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.
Files changed (95) hide show
  1. package/cjs/Row.js +16 -19
  2. package/cjs/Row.js.map +1 -1
  3. package/cjs/Table.js +8 -15
  4. package/cjs/Table.js.map +1 -1
  5. package/cjs/bulk-edit/useBulkEditPanel.js +6 -7
  6. package/cjs/bulk-edit/useBulkEditPanel.js.map +1 -1
  7. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +2 -3
  8. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
  9. package/cjs/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js +2 -3
  10. package/cjs/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +1 -1
  11. package/cjs/cell-renderers/input-cell/InputCell.js +3 -5
  12. package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -1
  13. package/cjs/cell-renderers/toggle-cell/ToggleCell.js +5 -6
  14. package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
  15. package/cjs/data-row/DataRow.js +146 -0
  16. package/cjs/data-row/DataRow.js.map +1 -0
  17. package/cjs/index.js +2 -0
  18. package/cjs/index.js.map +1 -1
  19. package/cjs/table-cell/TableCell.js +6 -9
  20. package/cjs/table-cell/TableCell.js.map +1 -1
  21. package/cjs/table-cell/TableGroupCell.css.js +1 -1
  22. package/cjs/table-cell/TableGroupCell.js +7 -8
  23. package/cjs/table-cell/TableGroupCell.js.map +1 -1
  24. package/cjs/table-data-source/{moving-window.js → DataRowMovingWindow.js} +19 -29
  25. package/cjs/table-data-source/DataRowMovingWindow.js.map +1 -0
  26. package/cjs/table-data-source/useDataSource.js +77 -37
  27. package/cjs/table-data-source/useDataSource.js.map +1 -1
  28. package/cjs/useRowClassNameGenerators.js +2 -2
  29. package/cjs/useRowClassNameGenerators.js.map +1 -1
  30. package/cjs/useSelection.js +5 -6
  31. package/cjs/useSelection.js.map +1 -1
  32. package/cjs/useTable.js +26 -36
  33. package/cjs/useTable.js.map +1 -1
  34. package/cjs/useTableContextMenu.js +6 -10
  35. package/cjs/useTableContextMenu.js.map +1 -1
  36. package/cjs/useTableScroll.js +0 -1
  37. package/cjs/useTableScroll.js.map +1 -1
  38. package/cjs/useTableViewport.js +2 -2
  39. package/cjs/useTableViewport.js.map +1 -1
  40. package/esm/Row.js +17 -20
  41. package/esm/Row.js.map +1 -1
  42. package/esm/Table.js +9 -16
  43. package/esm/Table.js.map +1 -1
  44. package/esm/bulk-edit/useBulkEditPanel.js +7 -8
  45. package/esm/bulk-edit/useBulkEditPanel.js.map +1 -1
  46. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +2 -3
  47. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
  48. package/esm/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js +3 -4
  49. package/esm/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +1 -1
  50. package/esm/cell-renderers/input-cell/InputCell.js +3 -5
  51. package/esm/cell-renderers/input-cell/InputCell.js.map +1 -1
  52. package/esm/cell-renderers/toggle-cell/ToggleCell.js +5 -6
  53. package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
  54. package/esm/data-row/DataRow.js +144 -0
  55. package/esm/data-row/DataRow.js.map +1 -0
  56. package/esm/index.js +1 -0
  57. package/esm/index.js.map +1 -1
  58. package/esm/table-cell/TableCell.js +6 -9
  59. package/esm/table-cell/TableCell.js.map +1 -1
  60. package/esm/table-cell/TableGroupCell.css.js +1 -1
  61. package/esm/table-cell/TableGroupCell.js +8 -9
  62. package/esm/table-cell/TableGroupCell.js.map +1 -1
  63. package/esm/table-data-source/{moving-window.js → DataRowMovingWindow.js} +20 -30
  64. package/esm/table-data-source/DataRowMovingWindow.js.map +1 -0
  65. package/esm/table-data-source/useDataSource.js +78 -38
  66. package/esm/table-data-source/useDataSource.js.map +1 -1
  67. package/esm/useRowClassNameGenerators.js +2 -2
  68. package/esm/useRowClassNameGenerators.js.map +1 -1
  69. package/esm/useSelection.js +6 -7
  70. package/esm/useSelection.js.map +1 -1
  71. package/esm/useTable.js +27 -37
  72. package/esm/useTable.js.map +1 -1
  73. package/esm/useTableContextMenu.js +7 -11
  74. package/esm/useTableContextMenu.js.map +1 -1
  75. package/esm/useTableScroll.js +0 -1
  76. package/esm/useTableScroll.js.map +1 -1
  77. package/esm/useTableViewport.js +2 -2
  78. package/esm/useTableViewport.js.map +1 -1
  79. package/package.json +10 -10
  80. package/types/Row.d.ts +1 -1
  81. package/types/Table.d.ts +1 -12
  82. package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +1 -1
  83. package/types/cell-renderers/input-cell/InputCell.d.ts +1 -1
  84. package/types/data-row/DataRow.d.ts +16 -0
  85. package/types/index.d.ts +1 -0
  86. package/types/table-cell/TableCell.d.ts +1 -1
  87. package/types/table-cell/TableGroupCell.d.ts +1 -1
  88. package/types/table-data-source/DataRowMovingWindow.d.ts +24 -0
  89. package/types/table-data-source/useDataSource.d.ts +5 -6
  90. package/types/useTable.d.ts +5 -7
  91. package/types/useTableContextMenu.d.ts +5 -7
  92. package/types/useTableScroll.d.ts +1 -3
  93. package/cjs/table-data-source/moving-window.js.map +0 -1
  94. package/esm/table-data-source/moving-window.js.map +0 -1
  95. package/types/table-data-source/moving-window.d.ts +0 -23
@@ -1,8 +1,9 @@
1
- import { Range, metadataKeys } from '@vuu-ui/vuu-utils';
1
+ import { Range } from '@vuu-ui/vuu-utils';
2
2
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
3
- import { MovingWindow } from './moving-window.js';
3
+ import { MovingDataRowWindow } from './DataRowMovingWindow.js';
4
+ import { dataRowFactory } from '../data-row/DataRow.js';
4
5
 
5
- const { KEY } = metadataKeys;
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 data = useRef([]);
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 dataWindow = useMemo(
45
- () => new MovingWindow(rangeRef.current.withBuffer),
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
- dataWindow.add(row);
65
+ dataRowWindow.add(DataRow2(row));
52
66
  }
53
- data.current = dataWindow.data;
67
+ dataRows.current = dataRowWindow.data;
54
68
  if (isMounted.current) {
55
69
  forceUpdate({});
56
70
  }
57
71
  },
58
- [dataWindow]
72
+ [dataRowWindow]
59
73
  );
60
74
  const selectRow = useCallback(
61
- (row) => {
62
- const rowKey = row[KEY];
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?.(row);
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 = dataWindow.data.length;
80
- dataWindow.setRowCount(message.size);
102
+ const size = dataRowWindow.data.length;
103
+ dataRowWindow.setRowCount(message.size);
81
104
  totalRowCountRef.current = message.size;
82
- if (dataWindow.data.length < size) {
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 row = message.rows.find((row2) => row2[KEY] === autoSelect);
95
- if (row) {
96
- selectRow(row);
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 (message.rows.length > 0) {
103
- selectRow(message.rows[0]);
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
- data.current = dataWindow.data;
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
- dataWindow.setRowCount(0);
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
- [autoSelect, dataWindow, onSizeChange, onSubscribed, selectRow, setData]
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 dataWindow.getSelectedRows();
128
- }, [dataWindow]);
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
- dataWindow.setRange(range.withBuffer);
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
- }, [dataSource, datasourceMessageHandler, setRange, suspenseProps]);
183
- const removeColumnDataFromCache = useCallback(
184
- (indexOfRemovedColumn) => {
185
- dataWindow.spliceDataAtIndex(indexOfRemovedColumn);
186
- data.current = dataWindow.data;
187
- },
188
- [dataWindow]
189
- );
224
+ }, [
225
+ createDataRow,
226
+ dataSource,
227
+ datasourceMessageHandler,
228
+ setRange,
229
+ suspenseProps
230
+ ]);
190
231
  return {
191
- data: data.current,
192
- dataRef: data,
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 (row, columnMap) => {
12
+ return (dataRow) => {
13
13
  const classNames = [];
14
14
  functions?.forEach((fn) => {
15
- const className = fn(row, columnMap);
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 (row, columnMap) => {\n const classNames: string[] = [];\n functions?.forEach((fn) => {\n const className = fn(row, columnMap);\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,EAAO,OAAA,CAAC,KAAK,SAAc,KAAA;AACzB,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAW,SAAA,EAAA,OAAA,CAAQ,CAAC,EAAO,KAAA;AACzB,MAAM,MAAA,SAAA,GAAY,EAAG,CAAA,GAAA,EAAK,SAAS,CAAA;AACnC,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;;;;"}
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;;;;"}
@@ -1,8 +1,7 @@
1
- import { deselectItem, selectItem, queryClosest, dispatchMouseEvent, metadataKeys } from '@vuu-ui/vuu-utils';
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, row, rangeSelect, keepExistingSelection) => {
48
- const { [IDX]: rowIdx, [KEY]: rowKey } = row;
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 (row[SELECTED] && selectionModel === "single-no-deselect") {
50
+ if (dataRow.isSelected && selectionModel === "single-no-deselect") {
52
51
  return;
53
52
  }
54
- const selectOperation = row[SELECTED] ? deselectItem : selectItem;
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 ? row : null);
74
+ onSelect?.(selectOperation === selectItem ? dataRow : null);
76
75
  onSelectionChange?.(selectRequest);
77
76
  }
78
77
  if (allRowsSelected && selectOperation === deselectItem) {
@@ -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 metadataKeys,\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 { IDX, KEY, SELECTED } = metadataKeys;\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, row, rangeSelect, keepExistingSelection) => {\n const { [IDX]: rowIdx, [KEY]: rowKey } = row;\n const { current: activeRowKey } = lastActiveRef;\n const newRowIdentifier = { rowIdx, rowKey } as RowIdentifier;\n\n if (row[SELECTED] && selectionModel === \"single-no-deselect\") {\n return;\n }\n\n const selectOperation = row[SELECTED] ? 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 ? row : 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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"}
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, buildColumnMap, updateColumn, logUnhandledMessage, toggleOrApplySort, isValidNumber, getAllCellsInColumn, getPinStateFromElement, isJsonGroup, isGroupColumn, getAriaRowIndex, asDataSourceRowObject, metadataKeys } from '@vuu-ui/vuu-utils';
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 { KEY, IS_EXPANDED, IS_LEAF } = metadataKeys;
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
- (row) => {
153
+ (dataRow) => {
158
154
  if (onSelect) {
159
- onSelect(row === null ? null : rowToObject(row, columnMap));
155
+ onSelect(dataRow);
160
156
  }
161
157
  },
162
- [columnMap, onSelect, rowToObject]
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
- data,
194
- dataRef,
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, columnMap, removeColumnDataFromCache, tableConfig]
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
- (row, column) => {
485
- const isJson = isJsonGroup(column, row, columnMap);
486
- const key = row[KEY];
487
- if (row[IS_EXPANDED]) {
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((row2) => row2[IS_EXPANDED] || row2[IS_LEAF])) {
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((row2) => row2[IS_LEAF])) {
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
- [columnMap, columns, dataSource, dispatchTableModelAction]
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
- data,
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, row, rangeSelect, keepExistingSelection) => {
646
- selectionHookOnRowClick(evt, row, rangeSelect, keepExistingSelection);
647
- onRowClickProp?.(evt, rowToObject(row, columnMap));
636
+ (evt, dataRow, rangeSelect, keepExistingSelection) => {
637
+ selectionHookOnRowClick(evt, dataRow, rangeSelect, keepExistingSelection);
638
+ onRowClickProp?.(evt, dataRow);
648
639
  },
649
- [columnMap, onRowClickProp, rowToObject, selectionHookOnRowClick]
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
- row,
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 && row) {
718
+ if (columnName && dataRow) {
728
719
  const response = await dataSource.rpcRequest({
729
720
  params: {
730
721
  column: columnName,
731
- key: row[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 = dataRef.current.find((row2) => row2[0] === rowIndex);
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
- [dataRef, headerState.count, onDragStart]
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
- data,
788
+ dataRows,
799
789
  draggableRow,
800
790
  focusCellPlaceholderKeyDown,
801
791
  focusCellPlaceholderRef,