@vuu-ui/vuu-table 0.9.1 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/cjs/CellFocusState.js +45 -0
  2. package/cjs/CellFocusState.js.map +1 -0
  3. package/cjs/Row.js +7 -2
  4. package/cjs/Row.js.map +1 -1
  5. package/cjs/Table.css.js +1 -1
  6. package/cjs/Table.js +33 -0
  7. package/cjs/Table.js.map +1 -1
  8. package/cjs/VirtualColSpan.js.map +1 -1
  9. package/cjs/bulk-edit/BulkEditDialog.js +57 -0
  10. package/cjs/bulk-edit/BulkEditDialog.js.map +1 -0
  11. package/cjs/bulk-edit/BulkEditPanel.css.js +1 -1
  12. package/cjs/bulk-edit/BulkEditPanel.js +21 -31
  13. package/cjs/bulk-edit/BulkEditPanel.js.map +1 -1
  14. package/cjs/bulk-edit/BulkEditRow.css.js +1 -1
  15. package/cjs/bulk-edit/BulkEditRow.js +53 -48
  16. package/cjs/bulk-edit/BulkEditRow.js.map +1 -1
  17. package/cjs/bulk-edit/useBulkEditPanel.js +101 -0
  18. package/cjs/bulk-edit/useBulkEditPanel.js.map +1 -0
  19. package/cjs/bulk-edit/useBulkEditRow.js +144 -0
  20. package/cjs/bulk-edit/useBulkEditRow.js.map +1 -0
  21. package/cjs/cell-block/CellBlock.js.map +1 -1
  22. package/cjs/cell-block/cellblock-utils.js.map +1 -1
  23. package/cjs/cell-block/useCellBlockSelection.js.map +1 -1
  24. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js +6 -0
  25. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  26. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +40 -5
  27. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
  28. package/cjs/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +1 -1
  29. package/cjs/cell-renderers/input-cell/InputCell.css.js +1 -1
  30. package/cjs/cell-renderers/input-cell/InputCell.js +3 -9
  31. package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -1
  32. package/cjs/cell-renderers/toggle-cell/ToggleCell.js +12 -10
  33. package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
  34. package/cjs/column-header-pill/ColumnHeaderPill.css.js +1 -1
  35. package/cjs/column-header-pill/ColumnHeaderPill.js +0 -1
  36. package/cjs/column-header-pill/ColumnHeaderPill.js.map +1 -1
  37. package/cjs/column-header-pill/GroupColumnPill.js.map +1 -1
  38. package/cjs/column-header-pill/SortIndicator.js.map +1 -1
  39. package/cjs/column-menu/ColumnMenu.js.map +1 -1
  40. package/cjs/column-resizing/ColumnResizer.js.map +1 -1
  41. package/cjs/column-resizing/useTableColumnResize.js.map +1 -1
  42. package/cjs/context-menu/buildContextMenuDescriptors.js.map +1 -1
  43. package/cjs/context-menu/useHandleTableContextMenu.js.map +1 -1
  44. package/cjs/header-cell/GroupHeaderCell.js +3 -2
  45. package/cjs/header-cell/GroupHeaderCell.js.map +1 -1
  46. package/cjs/header-cell/HeaderCell.js +1 -0
  47. package/cjs/header-cell/HeaderCell.js.map +1 -1
  48. package/cjs/index.js +8 -0
  49. package/cjs/index.js.map +1 -1
  50. package/cjs/moving-window.js +1 -1
  51. package/cjs/moving-window.js.map +1 -1
  52. package/cjs/pagination/PaginationControl.js.map +1 -1
  53. package/cjs/pagination/usePagination.js.map +1 -1
  54. package/cjs/table-cell/TableCell.js +33 -15
  55. package/cjs/table-cell/TableCell.js.map +1 -1
  56. package/cjs/table-cell/TableGroupCell.css.js +1 -1
  57. package/cjs/table-cell/TableGroupCell.js +1 -1
  58. package/cjs/table-cell/TableGroupCell.js.map +1 -1
  59. package/cjs/table-config.js.map +1 -1
  60. package/cjs/table-dom-utils.js +4 -2
  61. package/cjs/table-dom-utils.js.map +1 -1
  62. package/cjs/table-header/HeaderProvider.js.map +1 -1
  63. package/cjs/table-header/TableHeader.js +7 -12
  64. package/cjs/table-header/TableHeader.js.map +1 -1
  65. package/cjs/table-header/useTableHeader.js.map +1 -1
  66. package/cjs/useCell.js +4 -3
  67. package/cjs/useCell.js.map +1 -1
  68. package/cjs/useCellEditing.js.map +1 -1
  69. package/cjs/useCellFocus.js +2 -2
  70. package/cjs/useCellFocus.js.map +1 -1
  71. package/cjs/useControlledTableNavigation.js.map +1 -1
  72. package/cjs/useDataSource.js +22 -3
  73. package/cjs/useDataSource.js.map +1 -1
  74. package/cjs/useEditableCell.js +32 -0
  75. package/cjs/useEditableCell.js.map +1 -0
  76. package/cjs/useKeyboardNavigation.js +5 -2
  77. package/cjs/useKeyboardNavigation.js.map +1 -1
  78. package/cjs/useMeasuredHeight.js.map +1 -1
  79. package/cjs/useRowClassNameGenerators.js.map +1 -1
  80. package/cjs/useSelection.js +7 -4
  81. package/cjs/useSelection.js.map +1 -1
  82. package/cjs/useTable.js +48 -25
  83. package/cjs/useTable.js.map +1 -1
  84. package/cjs/useTableAndColumnSettings.js.map +1 -1
  85. package/cjs/useTableContextMenu.js.map +1 -1
  86. package/cjs/useTableModel.js +29 -22
  87. package/cjs/useTableModel.js.map +1 -1
  88. package/cjs/useTableScroll.js.map +1 -1
  89. package/cjs/useTableViewport.js.map +1 -1
  90. package/esm/CellFocusState.js +43 -0
  91. package/esm/CellFocusState.js.map +1 -0
  92. package/esm/Row.js +7 -2
  93. package/esm/Row.js.map +1 -1
  94. package/esm/Table.css.js +1 -1
  95. package/esm/Table.js +33 -0
  96. package/esm/Table.js.map +1 -1
  97. package/esm/VirtualColSpan.js.map +1 -1
  98. package/esm/bulk-edit/BulkEditDialog.js +55 -0
  99. package/esm/bulk-edit/BulkEditDialog.js.map +1 -0
  100. package/esm/bulk-edit/BulkEditPanel.css.js +1 -1
  101. package/esm/bulk-edit/BulkEditPanel.js +21 -31
  102. package/esm/bulk-edit/BulkEditPanel.js.map +1 -1
  103. package/esm/bulk-edit/BulkEditRow.css.js +1 -1
  104. package/esm/bulk-edit/BulkEditRow.js +53 -48
  105. package/esm/bulk-edit/BulkEditRow.js.map +1 -1
  106. package/esm/bulk-edit/useBulkEditPanel.js +99 -0
  107. package/esm/bulk-edit/useBulkEditPanel.js.map +1 -0
  108. package/esm/bulk-edit/useBulkEditRow.js +142 -0
  109. package/esm/bulk-edit/useBulkEditRow.js.map +1 -0
  110. package/esm/cell-block/CellBlock.js.map +1 -1
  111. package/esm/cell-block/cellblock-utils.js.map +1 -1
  112. package/esm/cell-block/useCellBlockSelection.js.map +1 -1
  113. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js +4 -0
  114. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  115. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +40 -5
  116. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
  117. package/esm/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +1 -1
  118. package/esm/cell-renderers/input-cell/InputCell.css.js +1 -1
  119. package/esm/cell-renderers/input-cell/InputCell.js +3 -9
  120. package/esm/cell-renderers/input-cell/InputCell.js.map +1 -1
  121. package/esm/cell-renderers/toggle-cell/ToggleCell.js +12 -10
  122. package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
  123. package/esm/column-header-pill/ColumnHeaderPill.css.js +1 -1
  124. package/esm/column-header-pill/ColumnHeaderPill.js +0 -1
  125. package/esm/column-header-pill/ColumnHeaderPill.js.map +1 -1
  126. package/esm/column-header-pill/GroupColumnPill.js.map +1 -1
  127. package/esm/column-header-pill/SortIndicator.js.map +1 -1
  128. package/esm/column-menu/ColumnMenu.js.map +1 -1
  129. package/esm/column-resizing/ColumnResizer.js.map +1 -1
  130. package/esm/column-resizing/useTableColumnResize.js.map +1 -1
  131. package/esm/context-menu/buildContextMenuDescriptors.js.map +1 -1
  132. package/esm/context-menu/useHandleTableContextMenu.js.map +1 -1
  133. package/esm/header-cell/GroupHeaderCell.js +3 -2
  134. package/esm/header-cell/GroupHeaderCell.js.map +1 -1
  135. package/esm/header-cell/HeaderCell.js +1 -0
  136. package/esm/header-cell/HeaderCell.js.map +1 -1
  137. package/esm/index.js +4 -0
  138. package/esm/index.js.map +1 -1
  139. package/esm/moving-window.js +1 -1
  140. package/esm/moving-window.js.map +1 -1
  141. package/esm/pagination/PaginationControl.js.map +1 -1
  142. package/esm/pagination/usePagination.js.map +1 -1
  143. package/esm/table-cell/TableCell.js +35 -17
  144. package/esm/table-cell/TableCell.js.map +1 -1
  145. package/esm/table-cell/TableGroupCell.css.js +1 -1
  146. package/esm/table-cell/TableGroupCell.js +1 -1
  147. package/esm/table-cell/TableGroupCell.js.map +1 -1
  148. package/esm/table-config.js.map +1 -1
  149. package/esm/table-dom-utils.js +4 -2
  150. package/esm/table-dom-utils.js.map +1 -1
  151. package/esm/table-header/HeaderProvider.js.map +1 -1
  152. package/esm/table-header/TableHeader.js +7 -12
  153. package/esm/table-header/TableHeader.js.map +1 -1
  154. package/esm/table-header/useTableHeader.js.map +1 -1
  155. package/esm/useCell.js +4 -3
  156. package/esm/useCell.js.map +1 -1
  157. package/esm/useCellEditing.js.map +1 -1
  158. package/esm/useCellFocus.js +2 -2
  159. package/esm/useCellFocus.js.map +1 -1
  160. package/esm/useControlledTableNavigation.js.map +1 -1
  161. package/esm/useDataSource.js +22 -3
  162. package/esm/useDataSource.js.map +1 -1
  163. package/esm/useEditableCell.js +30 -0
  164. package/esm/useEditableCell.js.map +1 -0
  165. package/esm/useKeyboardNavigation.js +6 -3
  166. package/esm/useKeyboardNavigation.js.map +1 -1
  167. package/esm/useMeasuredHeight.js.map +1 -1
  168. package/esm/useRowClassNameGenerators.js.map +1 -1
  169. package/esm/useSelection.js +7 -4
  170. package/esm/useSelection.js.map +1 -1
  171. package/esm/useTable.js +48 -25
  172. package/esm/useTable.js.map +1 -1
  173. package/esm/useTableAndColumnSettings.js.map +1 -1
  174. package/esm/useTableContextMenu.js.map +1 -1
  175. package/esm/useTableModel.js +30 -23
  176. package/esm/useTableModel.js.map +1 -1
  177. package/esm/useTableScroll.js.map +1 -1
  178. package/esm/useTableViewport.js.map +1 -1
  179. package/package.json +10 -10
  180. package/types/CellFocusState.d.ts +26 -0
  181. package/types/Row.d.ts +2 -3
  182. package/types/Table.d.ts +42 -3
  183. package/types/VirtualColSpan.d.ts +0 -1
  184. package/types/bulk-edit/BulkEditDialog.d.ts +9 -0
  185. package/types/bulk-edit/BulkEditPanel.d.ts +2 -1
  186. package/types/bulk-edit/BulkEditRow.d.ts +7 -5
  187. package/types/bulk-edit/index.d.ts +3 -0
  188. package/types/bulk-edit/useBulkEditPanel.d.ts +10 -0
  189. package/types/bulk-edit/useBulkEditRow.d.ts +20 -0
  190. package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +1 -2
  191. package/types/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.d.ts +0 -1
  192. package/types/cell-renderers/input-cell/InputCell.d.ts +1 -2
  193. package/types/cell-renderers/toggle-cell/ToggleCell.d.ts +0 -1
  194. package/types/column-header-pill/ColumnHeaderPill.d.ts +1 -1
  195. package/types/column-header-pill/GroupColumnPill.d.ts +1 -2
  196. package/types/column-header-pill/SortIndicator.d.ts +1 -2
  197. package/types/column-menu/ColumnMenu.d.ts +1 -1
  198. package/types/column-resizing/ColumnResizer.d.ts +1 -2
  199. package/types/header-cell/GroupHeaderCell.d.ts +1 -2
  200. package/types/header-cell/HeaderCell.d.ts +1 -2
  201. package/types/index.d.ts +1 -0
  202. package/types/table-cell/TableCell.d.ts +2 -3
  203. package/types/table-cell/TableGroupCell.d.ts +1 -2
  204. package/types/table-header/TableHeader.d.ts +1 -2
  205. package/types/table-header/useTableHeader.d.ts +0 -1
  206. package/types/useCell.d.ts +1 -2
  207. package/types/useCellFocus.d.ts +4 -3
  208. package/types/useControlledTableNavigation.d.ts +1 -1
  209. package/types/useDataSource.d.ts +4 -6
  210. package/types/useEditableCell.d.ts +4 -0
  211. package/types/useKeyboardNavigation.d.ts +1 -1
  212. package/types/useSelection.d.ts +5 -5
  213. package/types/useTable.d.ts +14 -14
  214. package/types/useTableModel.d.ts +6 -6
  215. package/types/useTableScroll.d.ts +3 -2
package/esm/useTable.js CHANGED
@@ -17,6 +17,7 @@ import { useTableContextMenu } from './useTableContextMenu.js';
17
17
  import { useTableModel, isShowColumnSettings, isShowTableSettings } from './useTableModel.js';
18
18
  import { useTableScroll } from './useTableScroll.js';
19
19
  import { useTableViewport } from './useTableViewport.js';
20
+ import { CellFocusState } from './CellFocusState.js';
20
21
 
21
22
  const nullHeaderState = {
22
23
  height: -1,
@@ -29,13 +30,6 @@ const zeroHeaderState = {
29
30
  const stripInternalProperties = (tableConfig) => {
30
31
  return tableConfig;
31
32
  };
32
- const NullCellFocusState = {
33
- cellPos: void 0,
34
- el: null,
35
- outsideViewport: false,
36
- placeholderEl: null,
37
- pos: void 0
38
- };
39
33
  const { KEY, IS_EXPANDED, IS_LEAF } = metadataKeys;
40
34
  const NULL_DRAG_DROP = {
41
35
  draggable: void 0,
@@ -53,12 +47,15 @@ const useTable = ({
53
47
  config,
54
48
  containerRef,
55
49
  dataSource,
50
+ defaultSelectedIndexValues,
51
+ defaultSelectedKeyValues,
56
52
  disableFocus,
57
53
  highlightedIndex: highlightedIndexProp,
58
54
  id,
59
55
  navigationStyle = "cell",
60
56
  onAvailableColumnsChange,
61
57
  onConfigChange,
58
+ onDataEdited: onDataEditedProp,
62
59
  onDragStart,
63
60
  onDrop,
64
61
  onHighlight,
@@ -67,19 +64,22 @@ const useTable = ({
67
64
  onSelectCellBlock,
68
65
  onSelectionChange,
69
66
  renderBufferSize = 0,
67
+ revealSelected,
70
68
  rowHeight = 20,
69
+ rowToObject = asDataSourceRowObject,
71
70
  scrollingApiRef,
72
- selectionBookendWidth,
71
+ selectionBookendWidth = 4,
73
72
  selectionModel,
74
73
  showColumnHeaders,
75
74
  showPaginationControls,
76
75
  size
77
76
  }) => {
78
77
  const tableConfigRef = useRef(config);
78
+ const requestScrollRef = useRef();
79
79
  useMemo(() => {
80
80
  tableConfigRef.current = config;
81
81
  }, [config]);
82
- const initialState = useMemo(() => ({ ...NullCellFocusState }), []);
82
+ const initialState = useMemo(() => new CellFocusState(), []);
83
83
  const cellFocusStateRef = useRef(initialState);
84
84
  const focusCellRef = useRef();
85
85
  const [headerState, setHeaderState] = useState(
@@ -95,7 +95,7 @@ const useTable = ({
95
95
  const virtualContentHeight = rowHeight * rowCount;
96
96
  const viewportBodyHeight = size.height - (headerState.height === -1 ? 0 : headerState.height);
97
97
  const verticalScrollbarWidth = virtualContentHeight > viewportBodyHeight ? 10 : 0;
98
- const availableWidth = size.width - (verticalScrollbarWidth + 8);
98
+ const availableWidth = size.width - (verticalScrollbarWidth + 2 * selectionBookendWidth);
99
99
  const rowClassNameGenerator = useRowClassNameGenerators(config);
100
100
  const useRowDragDrop = allowDragDrop ? useDragDrop : useNullDragDrop;
101
101
  const menuBuilder = useMemo(
@@ -164,8 +164,10 @@ const useTable = ({
164
164
  });
165
165
  const { data, dataRef, getSelectedRows, range, setRange } = useDataSource({
166
166
  dataSource,
167
- // We need to factor this out of Table
167
+ defaultSelectedIndexValues,
168
+ defaultSelectedKeyValues,
168
169
  renderBufferSize,
170
+ revealSelected,
169
171
  onSizeChange: onDataRowcountChange,
170
172
  onSubscribed
171
173
  });
@@ -182,6 +184,7 @@ const useTable = ({
182
184
  onVerticalScrollInSitu: viewportHookSetInSituRowOffset,
183
185
  viewportMeasurements
184
186
  });
187
+ requestScrollRef.current = requestScroll;
185
188
  const handleConfigEditedInSettingsPanel = useCallback(
186
189
  (tableConfig2) => {
187
190
  dispatchTableModelAction({
@@ -205,22 +208,21 @@ const useTable = ({
205
208
  [dataSource]
206
209
  );
207
210
  useEffect(() => {
208
- dataSource.on("config", (config2, confirmed, changes) => {
211
+ dataSource.on("config", (config2, range2, confirmed, changes) => {
209
212
  const scrollSensitiveChanges = changes?.filterChanged || changes?.groupByChanged;
210
- if (scrollSensitiveChanges && dataSource.range.from > 0) {
211
- requestScroll({
213
+ if (scrollSensitiveChanges && range2.from > 0) {
214
+ requestScrollRef.current?.({
212
215
  type: "scroll-end",
213
216
  direction: "home"
214
217
  });
215
218
  }
216
- console.log(`useTable dispatch tableConfig`);
217
219
  dispatchTableModelAction({
218
220
  type: "tableConfig",
219
221
  ...config2,
220
222
  confirmed
221
223
  });
222
224
  });
223
- }, [dataSource, dispatchTableModelAction, requestScroll]);
225
+ }, [dataSource, dispatchTableModelAction]);
224
226
  const handleCreateCalculatedColumn = useCallback(
225
227
  (column) => {
226
228
  dataSource.columns = dataSource.columns.concat(column.name);
@@ -337,7 +339,7 @@ const useTable = ({
337
339
  );
338
340
  }
339
341
  } else {
340
- const byColIndex = `[aria-colindex='${column.index}']`;
342
+ const byColIndex = `[aria-colindex='${column.ariaColIndex}']`;
341
343
  resizeCells.current = Array.from(
342
344
  containerRef.current?.querySelectorAll(
343
345
  `.vuuTableCell${byColIndex},.vuuTableHeaderCell${byColIndex}`
@@ -414,7 +416,7 @@ const useTable = ({
414
416
  focusCell,
415
417
  focusCellPlaceholderKeyDown,
416
418
  focusCellPlaceholderRef,
417
- tableBodyRef
419
+ setTableBodyRef: tableBodyRef
418
420
  } = useCellFocus({
419
421
  cellFocusStateRef,
420
422
  containerRef,
@@ -499,15 +501,17 @@ const useTable = ({
499
501
  const handleSelect = useCallback(
500
502
  (row) => {
501
503
  if (onSelect) {
502
- onSelect(row === null ? null : asDataSourceRowObject(row, columnMap));
504
+ onSelect(row === null ? null : rowToObject(row, columnMap));
503
505
  }
504
506
  },
505
- [columnMap, onSelect]
507
+ [columnMap, onSelect, rowToObject]
506
508
  );
507
509
  const {
508
510
  onKeyDown: selectionHookKeyDown,
509
511
  onRowClick: selectionHookOnRowClick
510
512
  } = useSelection({
513
+ containerRef,
514
+ defaultSelectedIndexValues,
511
515
  highlightedIndexRef,
512
516
  onSelect: handleSelect,
513
517
  onSelectionChange: handleSelectionChange,
@@ -534,9 +538,9 @@ const useTable = ({
534
538
  const handleRowClick = useCallback(
535
539
  (evt, row, rangeSelect, keepExistingSelection) => {
536
540
  selectionHookOnRowClick(evt, row, rangeSelect, keepExistingSelection);
537
- onRowClickProp?.(evt, asDataSourceRowObject(row, columnMap));
541
+ onRowClickProp?.(evt, rowToObject(row, columnMap));
538
542
  },
539
- [columnMap, onRowClickProp, selectionHookOnRowClick]
543
+ [columnMap, onRowClickProp, rowToObject, selectionHookOnRowClick]
540
544
  );
541
545
  const handleKeyDown = useCallback(
542
546
  (e) => {
@@ -565,6 +569,7 @@ const useTable = ({
565
569
  columns: columns2
566
570
  };
567
571
  tableConfigRef.current = newTableConfig;
572
+ console.log(`useTable [onMoveColumn]`);
568
573
  dispatchTableModelAction({
569
574
  availableWidth,
570
575
  type: "init",
@@ -588,10 +593,28 @@ const useTable = ({
588
593
  [onDrop]
589
594
  );
590
595
  const handleDataEdited = useCallback(
591
- async (row, columnName, value) => {
592
- return dataSource.applyEdit(row[KEY], columnName, value);
596
+ async (editState) => {
597
+ const {
598
+ editType = "commit",
599
+ isValid = true,
600
+ row,
601
+ columnName,
602
+ value
603
+ } = editState;
604
+ let result = void 0;
605
+ if (editType === "commit" && isValid) {
606
+ result = await dataSource.applyEdit(
607
+ row[KEY],
608
+ columnName,
609
+ value
610
+ );
611
+ onDataEditedProp?.({ ...editState, isValid: result === true });
612
+ return result;
613
+ } else {
614
+ onDataEditedProp?.(editState);
615
+ }
593
616
  },
594
- [dataSource]
617
+ [dataSource, onDataEditedProp]
595
618
  );
596
619
  const handleDragStartRow = useCallback(
597
620
  (dragDropState) => {
@@ -1 +1 @@
1
- {"version":3,"file":"useTable.js","sources":["../src/useTable.ts"],"sourcesContent":["import {\n DataSourceConfig,\n DataSourceRow,\n DataSourceSubscribedMessage,\n SelectionChangeHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n CellFocusState,\n ColumnDescriptor,\n DataCellEditHandler,\n RuntimeColumnDescriptor,\n TableColumnResizeHandler,\n TableConfig,\n TableRowClickHandlerInternal,\n TableRowSelectHandlerInternal,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n DragStartHandler,\n MeasuredProps,\n MeasuredSize,\n useDragDrop,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport {\n asDataSourceRowObject,\n buildColumnMap,\n isGroupColumn,\n isJsonGroup,\n isValidNumber,\n metadataKeys,\n toggleOrApplySort,\n updateColumn,\n useLayoutEffectSkipFirst,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEvent,\n KeyboardEvent,\n MouseEventHandler,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { TableProps } from \"./Table\";\nimport { useCellBlockSelection } from \"./cell-block/useCellBlockSelection\";\nimport {\n buildContextMenuDescriptors,\n useHandleTableContextMenu,\n} from \"./context-menu\";\nimport { updateTableConfig } from \"./table-config\";\nimport { getAriaRowIndex } from \"./table-dom-utils\";\nimport { useCellEditing } from \"./useCellEditing\";\nimport { FocusCell, useCellFocus } from \"./useCellFocus\";\nimport { useDataSource } from \"./useDataSource\";\nimport {\n GroupToggleHandler,\n useKeyboardNavigation,\n} from \"./useKeyboardNavigation\";\nimport { useRowClassNameGenerators } from \"./useRowClassNameGenerators\";\nimport { useSelection } from \"./useSelection\";\nimport { useTableAndColumnSettings } from \"./useTableAndColumnSettings\";\nimport { useTableContextMenu } from \"./useTableContextMenu\";\nimport {\n ColumnActionHide,\n ColumnActionPin,\n PersistentColumnAction,\n isShowColumnSettings,\n isShowTableSettings,\n useTableModel,\n} from \"./useTableModel\";\nimport { useTableScroll } from \"./useTableScroll\";\nimport { useTableViewport } from \"./useTableViewport\";\nimport { TableCellBlock } from \"./cell-block/cellblock-utils\";\n\ntype HeaderState = {\n height: number;\n count: number;\n};\n\nconst nullHeaderState = {\n height: -1,\n count: -1,\n};\nconst zeroHeaderState = {\n height: 0,\n count: 0,\n};\n\nconst stripInternalProperties = (tableConfig: TableConfig): TableConfig => {\n return tableConfig;\n};\n\nconst NullCellFocusState: CellFocusState = {\n cellPos: undefined,\n el: null,\n outsideViewport: false,\n placeholderEl: null,\n pos: undefined,\n};\n\nexport interface TableHookProps\n extends MeasuredProps,\n Pick<\n TableProps,\n | \"allowCellBlockSelection\"\n | \"allowDragDrop\"\n | \"availableColumns\"\n | \"config\"\n | \"dataSource\"\n | \"disableFocus\"\n | \"highlightedIndex\"\n | \"id\"\n | \"navigationStyle\"\n | \"onAvailableColumnsChange\"\n | \"onConfigChange\"\n | \"onDragStart\"\n | \"onDrop\"\n | \"onHighlight\"\n | \"onSelect\"\n | \"onSelectCellBlock\"\n | \"onSelectionChange\"\n | \"onRowClick\"\n | \"renderBufferSize\"\n | \"scrollingApiRef\"\n | \"selectionBookendWidth\"\n | \"showColumnHeaders\"\n | \"showPaginationControls\"\n > {\n containerRef: RefObject<HTMLDivElement>;\n rowHeight: number;\n selectionModel: TableSelectionModel;\n size: MeasuredSize;\n}\n\nconst { KEY, IS_EXPANDED, IS_LEAF } = metadataKeys;\n\nconst NULL_DRAG_DROP = {\n draggable: undefined,\n onMouseDown: undefined,\n};\nconst useNullDragDrop = () => NULL_DRAG_DROP;\n\nconst addColumn = (\n tableConfig: TableConfig,\n column: ColumnDescriptor,\n): TableConfig => ({\n ...tableConfig,\n columns: tableConfig.columns.concat(column),\n});\n\nexport const useTable = ({\n allowCellBlockSelection,\n allowDragDrop = false,\n availableColumns,\n config,\n containerRef,\n dataSource,\n disableFocus,\n highlightedIndex: highlightedIndexProp,\n id,\n navigationStyle = \"cell\",\n onAvailableColumnsChange,\n onConfigChange,\n onDragStart,\n onDrop,\n onHighlight,\n onRowClick: onRowClickProp,\n onSelect,\n onSelectCellBlock,\n onSelectionChange,\n renderBufferSize = 0,\n rowHeight = 20,\n scrollingApiRef,\n selectionBookendWidth,\n selectionModel,\n showColumnHeaders,\n showPaginationControls,\n size,\n}: TableHookProps) => {\n const tableConfigRef = useRef<TableConfig>(config);\n useMemo(() => {\n tableConfigRef.current = config;\n }, [config]);\n\n // state is mutated, so make every component gets a fresh copy\n const initialState = useMemo(() => ({ ...NullCellFocusState }), []);\n\n const cellFocusStateRef = useRef<CellFocusState>(initialState);\n // Needed to avoid circular dependency between useTableScroll and useCellFocus\n const focusCellRef = useRef<FocusCell>();\n\n const [headerState, setHeaderState] = useState<HeaderState>(\n showColumnHeaders ? nullHeaderState : zeroHeaderState,\n );\n const [rowCount, setRowCount] = useState<number>(dataSource.size);\n if (dataSource === undefined) {\n throw Error(\"no data source provided to Vuu Table\");\n }\n\n const onDataRowcountChange = useCallback((size: number) => {\n setRowCount(size);\n }, []);\n\n const virtualContentHeight = rowHeight * rowCount;\n const viewportBodyHeight =\n size.height - (headerState.height === -1 ? 0 : headerState.height);\n const verticalScrollbarWidth =\n virtualContentHeight > viewportBodyHeight ? 10 : 0;\n const availableWidth = size.width - (verticalScrollbarWidth + 8);\n\n const rowClassNameGenerator = useRowClassNameGenerators(config);\n\n const useRowDragDrop = allowDragDrop ? useDragDrop : useNullDragDrop;\n\n const menuBuilder = useMemo(\n () => buildContextMenuDescriptors(dataSource),\n [dataSource],\n );\n\n const {\n columns,\n dispatchTableModelAction,\n headings,\n tableAttributes,\n tableConfig,\n } = useTableModel(config, dataSource, selectionModel, availableWidth);\n\n // this is realy here to capture changes to available Width - typically when we get\n // rowcount so add allowance for vertical scrollbar, reducing available width\n // including dataSOurce is causing us to do unnecessary work in useTableModel\n // split this iniot multip effects\n useLayoutEffectSkipFirst(() => {\n dispatchTableModelAction({\n availableWidth,\n type: \"init\",\n tableConfig: tableConfigRef.current,\n dataSource,\n });\n }, [availableWidth, config, dataSource, dispatchTableModelAction]);\n\n const applyTableConfigChange = useCallback(\n (config: TableConfig) => {\n dispatchTableModelAction({\n availableWidth,\n type: \"init\",\n tableConfig: config,\n dataSource,\n });\n tableConfigRef.current = config;\n onConfigChange?.(stripInternalProperties(config));\n },\n [availableWidth, dataSource, dispatchTableModelAction, onConfigChange],\n );\n\n const columnMap = useMemo(\n () => buildColumnMap(dataSource.columns),\n [dataSource.columns],\n );\n\n const onSubscribed = useCallback(\n ({ tableSchema }: DataSourceSubscribedMessage) => {\n if (tableSchema) {\n dispatchTableModelAction({\n type: \"setTableSchema\",\n tableSchema,\n });\n } else {\n console.log(\"subscription message with no schema\");\n }\n },\n [dispatchTableModelAction],\n );\n\n const {\n getRowAtPosition,\n getRowOffset,\n setInSituRowOffset: viewportHookSetInSituRowOffset,\n setScrollTop: viewportHookSetScrollTop,\n ...viewportMeasurements\n } = useTableViewport({\n columns,\n headerHeight: headerState.height,\n rowCount,\n rowHeight,\n selectionEndSize: selectionBookendWidth,\n size: size,\n showPaginationControls,\n });\n\n const { data, dataRef, getSelectedRows, range, setRange } = useDataSource({\n dataSource,\n // We need to factor this out of Table\n renderBufferSize,\n onSizeChange: onDataRowcountChange,\n onSubscribed,\n });\n\n const { requestScroll, ...scrollProps } = useTableScroll({\n cellFocusStateRef,\n columns,\n focusCell: focusCellRef.current,\n getRowAtPosition,\n rowHeight,\n scrollingApiRef,\n setRange,\n showPaginationControls,\n onVerticalScroll: viewportHookSetScrollTop,\n onVerticalScrollInSitu: viewportHookSetInSituRowOffset,\n viewportMeasurements,\n });\n\n // TODO does this belong here ?\n const handleConfigEditedInSettingsPanel = useCallback(\n (tableConfig: TableConfig) => {\n dispatchTableModelAction({\n availableWidth,\n dataSource,\n tableConfig,\n type: \"init\",\n });\n tableConfigRef.current = tableConfig;\n onConfigChange?.(stripInternalProperties(tableConfig));\n },\n [availableWidth, dataSource, dispatchTableModelAction, onConfigChange],\n );\n\n const handleDataSourceConfigChanged = useCallback(\n (dataSourceConfig: DataSourceConfig) => {\n dataSource.config = {\n ...dataSource.config,\n ...dataSourceConfig,\n };\n },\n [dataSource],\n );\n\n useEffect(() => {\n dataSource.on(\"config\", (config, confirmed, changes) => {\n const scrollSensitiveChanges =\n changes?.filterChanged || changes?.groupByChanged;\n if (scrollSensitiveChanges && dataSource.range.from > 0) {\n requestScroll({\n type: \"scroll-end\",\n direction: \"home\",\n });\n }\n console.log(`useTable dispatch tableConfig`);\n dispatchTableModelAction({\n type: \"tableConfig\",\n ...config,\n confirmed,\n });\n });\n }, [dataSource, dispatchTableModelAction, requestScroll]);\n\n const handleCreateCalculatedColumn = useCallback(\n (column: ColumnDescriptor) => {\n dataSource.columns = dataSource.columns.concat(column.name);\n applyTableConfigChange(addColumn(tableConfig, column));\n },\n [dataSource, tableConfig, applyTableConfigChange],\n );\n\n const hideColumns = useCallback(\n (action: ColumnActionHide) => {\n const { columns } = action;\n const hiddenColumns = columns.map((c) => c.name);\n const newTableConfig = {\n ...tableConfig,\n columns: tableConfig.columns.map((col) =>\n hiddenColumns.includes(col.name) ? { ...col, hidden: true } : col,\n ),\n };\n applyTableConfigChange(newTableConfig);\n },\n [tableConfig, applyTableConfigChange],\n );\n\n const pinColumn = useCallback(\n (action: ColumnActionPin) => {\n applyTableConfigChange({\n ...tableConfig,\n columns: updateColumn(tableConfig.columns, {\n ...action.column,\n pin: action.pin,\n }),\n });\n },\n [tableConfig, applyTableConfigChange],\n );\n\n const { showColumnSettingsPanel, showTableSettingsPanel } =\n useTableAndColumnSettings({\n availableColumns:\n availableColumns ??\n tableConfig.columns.map(({ name, serverDataType = \"string\" }) => ({\n name,\n serverDataType,\n })),\n onAvailableColumnsChange,\n onConfigChange: handleConfigEditedInSettingsPanel,\n onCreateCalculatedColumn: handleCreateCalculatedColumn,\n onDataSourceConfigChange: handleDataSourceConfigChanged,\n tableConfig,\n });\n\n const onPersistentColumnOperation = useCallback(\n (action: PersistentColumnAction) => {\n if (isShowColumnSettings(action)) {\n showColumnSettingsPanel(action);\n } else if (isShowTableSettings(action)) {\n showTableSettingsPanel();\n } else {\n switch (action.type) {\n case \"hideColumns\":\n return hideColumns(action);\n case \"pinColumn\":\n return pinColumn(action);\n default:\n dispatchTableModelAction(action);\n }\n }\n },\n [\n dispatchTableModelAction,\n hideColumns,\n pinColumn,\n showColumnSettingsPanel,\n showTableSettingsPanel,\n ],\n );\n\n const handleContextMenuAction = useHandleTableContextMenu({\n dataSource,\n onPersistentColumnOperation,\n });\n\n const handleSort = useCallback(\n (column: ColumnDescriptor, extendSort = false, sortType?: VuuSortType) => {\n if (dataSource) {\n dataSource.sort = toggleOrApplySort(\n dataSource.sort,\n column,\n extendSort,\n sortType,\n );\n }\n },\n [dataSource],\n );\n\n const resizeCells = useRef<HTMLElement[] | undefined>();\n\n const onResizeColumn: TableColumnResizeHandler = useCallback(\n (phase, columnName, width) => {\n const column = columns.find((column) => column.name === columnName);\n if (column) {\n if (phase === \"resize\") {\n resizeCells.current?.forEach((cell) => {\n cell.style.width = `${width}px`;\n });\n } else if (phase === \"end\") {\n resizeCells.current = undefined;\n if (isValidNumber(width)) {\n dispatchTableModelAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n onConfigChange?.(\n stripInternalProperties(\n updateTableConfig(tableConfig, {\n type: \"col-size\",\n column,\n columns,\n width,\n }),\n ),\n );\n }\n } else {\n const byColIndex = `[aria-colindex='${column.index}']`;\n resizeCells.current = Array.from(\n containerRef.current?.querySelectorAll(\n `.vuuTableCell${byColIndex},.vuuTableHeaderCell${byColIndex}`,\n ) ?? [],\n );\n dispatchTableModelAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n }\n } else {\n throw Error(\n `useDataTable.handleColumnResize, column ${columnName} not found`,\n );\n }\n },\n [\n columns,\n dispatchTableModelAction,\n onConfigChange,\n tableConfig,\n containerRef,\n ],\n );\n\n const onToggleGroup = useCallback(\n (row: DataSourceRow, column: RuntimeColumnDescriptor) => {\n const isJson = isJsonGroup(column, row, columnMap);\n const key = row[KEY];\n\n if (row[IS_EXPANDED]) {\n dataSource.closeTreeNode(key, true);\n if (isJson) {\n // TODO could this be instigated by an event emitted by the JsonDataSOurce ? \"hide-columns\" ?\n const idx = columns.indexOf(column);\n const rows = dataSource.getRowsAtDepth?.(idx + 1);\n if (rows && !rows.some((row) => row[IS_EXPANDED] || row[IS_LEAF])) {\n dispatchTableModelAction({\n type: \"hideColumns\",\n columns: columns.slice(idx + 2),\n });\n }\n }\n } else {\n dataSource.openTreeNode(key);\n if (isJson) {\n const childRows = dataSource.getChildRows?.(key);\n const idx = columns.indexOf(column) + 1;\n const columnsToShow = [columns[idx]];\n if (childRows && childRows.some((row) => row[IS_LEAF])) {\n columnsToShow.push(columns[idx + 1]);\n }\n if (columnsToShow.some((col) => col.hidden)) {\n dispatchTableModelAction({\n type: \"showColumns\",\n columns: columnsToShow,\n });\n }\n }\n }\n },\n [columnMap, columns, dataSource, dispatchTableModelAction],\n );\n\n // TODO combine with aboue\n const handleToggleGroup = useCallback<GroupToggleHandler>(\n (treeNodeOperation, rowIdx) => {\n if (treeNodeOperation === \"expand\") {\n dataSource.openTreeNode(rowIdx);\n } else {\n dataSource.closeTreeNode(rowIdx);\n }\n },\n [dataSource],\n );\n\n const {\n focusCell,\n focusCellPlaceholderKeyDown,\n focusCellPlaceholderRef,\n tableBodyRef,\n } = useCellFocus({\n cellFocusStateRef,\n containerRef,\n disableFocus,\n requestScroll,\n });\n\n focusCellRef.current = focusCell;\n\n const columnCount = columns.filter((c) => c.hidden !== true).length;\n\n const {\n highlightedIndexRef,\n navigateCell: navigate,\n onFocus: navigationFocus,\n onKeyDown: navigationKeyDown,\n ...containerProps\n } = useKeyboardNavigation({\n cellFocusStateRef,\n columnCount,\n containerRef,\n disableFocus,\n focusCell,\n headerCount: headerState.count,\n highlightedIndex: highlightedIndexProp,\n navigationStyle,\n requestScroll,\n rowCount,\n onHighlight,\n onToggleGroup: handleToggleGroup,\n viewportRange: range,\n viewportRowCount: viewportMeasurements.rowCount,\n });\n\n const {\n onBlur: editingBlur,\n onDoubleClick: editingDoubleClick,\n onKeyDown: editingKeyDown,\n onFocus: editingFocus,\n } = useCellEditing({\n navigate,\n });\n\n const handleFocus = useCallback(\n (e: FocusEvent<HTMLElement>) => {\n navigationFocus();\n if (!e.defaultPrevented) {\n editingFocus(e);\n }\n },\n [editingFocus, navigationFocus],\n );\n\n const onContextMenu = useTableContextMenu({\n columns,\n data,\n dataSource,\n getSelectedRows,\n headerCount: headerState.count,\n });\n\n const onMoveGroupColumn = useCallback(\n (columns: ColumnDescriptor[]) => {\n dataSource.groupBy = columns.map((col) => col.name);\n },\n [dataSource],\n );\n\n const onRemoveGroupColumn = useCallback(\n (column: RuntimeColumnDescriptor) => {\n if (isGroupColumn(column)) {\n dataSource.groupBy = [];\n } else {\n if (dataSource && dataSource.groupBy?.includes(column.name)) {\n dataSource.groupBy = dataSource.groupBy.filter(\n (columnName) => columnName !== column.name,\n );\n }\n }\n },\n [dataSource],\n );\n\n const handleSelectionChange: SelectionChangeHandler = useCallback(\n (selected) => {\n dataSource.select(selected);\n onSelectionChange?.(selected);\n },\n [dataSource, onSelectionChange],\n );\n\n const handleSelect = useCallback<TableRowSelectHandlerInternal>(\n (row) => {\n if (onSelect) {\n onSelect(row === null ? null : asDataSourceRowObject(row, columnMap));\n }\n },\n [columnMap, onSelect],\n );\n\n const {\n onKeyDown: selectionHookKeyDown,\n onRowClick: selectionHookOnRowClick,\n } = useSelection({\n highlightedIndexRef,\n onSelect: handleSelect,\n onSelectionChange: handleSelectionChange,\n selectionModel,\n });\n\n const handleSelectCellBlock = useCallback(\n (cellBlock: TableCellBlock) => {\n handleSelectionChange([]);\n onSelectCellBlock?.(cellBlock);\n },\n [handleSelectionChange, onSelectCellBlock],\n );\n\n const {\n onMouseDown: cellBlockHookMouseDown,\n cellBlock,\n onKeyDown: cellBlockSelectionKeyDown,\n } = useCellBlockSelection({\n allowCellBlockSelection,\n columnCount,\n containerRef,\n onSelectCellBlock: handleSelectCellBlock,\n rowCount,\n });\n\n const handleRowClick = useCallback<TableRowClickHandlerInternal>(\n (evt, row, rangeSelect, keepExistingSelection) => {\n selectionHookOnRowClick(evt, row, rangeSelect, keepExistingSelection);\n onRowClickProp?.(evt, asDataSourceRowObject(row, columnMap));\n },\n [columnMap, onRowClickProp, selectionHookOnRowClick],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLElement>) => {\n cellBlockSelectionKeyDown?.(e);\n if (!e.defaultPrevented) {\n navigationKeyDown(e);\n }\n if (!e.defaultPrevented) {\n editingKeyDown(e);\n }\n if (!e.defaultPrevented) {\n selectionHookKeyDown(e);\n }\n },\n [\n cellBlockSelectionKeyDown,\n navigationKeyDown,\n editingKeyDown,\n selectionHookKeyDown,\n ],\n );\n\n const onMoveColumn = useCallback(\n (columns: ColumnDescriptor[]) => {\n const newTableConfig = {\n ...tableConfig,\n columns,\n };\n\n tableConfigRef.current = newTableConfig;\n\n dispatchTableModelAction({\n availableWidth,\n type: \"init\",\n tableConfig: newTableConfig,\n dataSource,\n });\n onConfigChange?.(stripInternalProperties(newTableConfig));\n },\n [\n availableWidth,\n dataSource,\n dispatchTableModelAction,\n onConfigChange,\n tableConfig,\n ],\n );\n\n const handleDropRow = useCallback(\n (dragDropState) => {\n onDrop?.(dragDropState);\n },\n [onDrop],\n );\n\n const handleDataEdited = useCallback<DataCellEditHandler>(\n async (row, columnName, value) => {\n return dataSource.applyEdit(row[KEY], columnName, value);\n },\n [dataSource],\n );\n\n const handleDragStartRow = useCallback<DragStartHandler>(\n (dragDropState) => {\n const { initialDragElement } = dragDropState;\n const rowIndex =\n getAriaRowIndex(initialDragElement) - headerState.count - 1;\n const row = dataRef.current.find((row) => row[0] === rowIndex);\n if (row) {\n dragDropState.setPayload(row);\n } else {\n // should we abort the operation ?\n }\n onDragStart?.(dragDropState);\n },\n [dataRef, headerState.count, onDragStart],\n );\n\n const onHeaderHeightMeasured = useCallback(\n (height: number, count: number) => {\n setHeaderState({ height, count });\n },\n [],\n );\n\n // Drag Drop rows\n const { onMouseDown: rowDragMouseDown, draggable: draggableRow } =\n useRowDragDrop({\n allowDragDrop,\n containerRef,\n draggableClassName: `vuuTable`,\n id,\n onDragStart: handleDragStartRow,\n onDrop: handleDropRow,\n orientation: \"vertical\",\n itemQuery: \".vuuTableRow\",\n });\n\n const handleMouseDown = useCallback<MouseEventHandler>(\n (evt) => {\n rowDragMouseDown?.(evt);\n if (!evt.isPropagationStopped()) {\n cellBlockHookMouseDown?.(evt);\n }\n },\n [rowDragMouseDown, cellBlockHookMouseDown],\n );\n\n return {\n ...containerProps,\n \"aria-rowcount\": dataSource.size,\n cellBlock,\n columnMap,\n columns,\n data,\n draggableRow,\n focusCellPlaceholderKeyDown,\n focusCellPlaceholderRef,\n getRowOffset,\n handleContextMenuAction,\n headerState,\n headings,\n highlightedIndex: highlightedIndexRef.current,\n menuBuilder,\n onBlur: editingBlur,\n onDoubleClick: editingDoubleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseDown: handleMouseDown,\n onContextMenu,\n onDataEdited: handleDataEdited,\n onHeaderHeightMeasured,\n onMoveColumn,\n onMoveGroupColumn,\n onRemoveGroupColumn,\n onRowClick: handleRowClick,\n onSortColumn: handleSort,\n onResizeColumn,\n onToggleGroup,\n rowClassNameGenerator,\n scrollProps,\n // TODO don't think we need these ...\n tableAttributes,\n tableBodyRef,\n tableConfig,\n viewportMeasurements,\n };\n};\n"],"names":["size","config","tableConfig","columns","column","row","cellBlock"],"mappings":";;;;;;;;;;;;;;;;;;;;AAkFA,MAAM,eAAkB,GAAA;AAAA,EACtB,MAAQ,EAAA,CAAA,CAAA;AAAA,EACR,KAAO,EAAA,CAAA,CAAA;AACT,CAAA,CAAA;AACA,MAAM,eAAkB,GAAA;AAAA,EACtB,MAAQ,EAAA,CAAA;AAAA,EACR,KAAO,EAAA,CAAA;AACT,CAAA,CAAA;AAEA,MAAM,uBAAA,GAA0B,CAAC,WAA0C,KAAA;AACzE,EAAO,OAAA,WAAA,CAAA;AACT,CAAA,CAAA;AAEA,MAAM,kBAAqC,GAAA;AAAA,EACzC,OAAS,EAAA,KAAA,CAAA;AAAA,EACT,EAAI,EAAA,IAAA;AAAA,EACJ,eAAiB,EAAA,KAAA;AAAA,EACjB,aAAe,EAAA,IAAA;AAAA,EACf,GAAK,EAAA,KAAA,CAAA;AACP,CAAA,CAAA;AAoCA,MAAM,EAAE,GAAA,EAAK,WAAa,EAAA,OAAA,EAAY,GAAA,YAAA,CAAA;AAEtC,MAAM,cAAiB,GAAA;AAAA,EACrB,SAAW,EAAA,KAAA,CAAA;AAAA,EACX,WAAa,EAAA,KAAA,CAAA;AACf,CAAA,CAAA;AACA,MAAM,kBAAkB,MAAM,cAAA,CAAA;AAE9B,MAAM,SAAA,GAAY,CAChB,WAAA,EACA,MACiB,MAAA;AAAA,EACjB,GAAG,WAAA;AAAA,EACH,OAAS,EAAA,WAAA,CAAY,OAAQ,CAAA,MAAA,CAAO,MAAM,CAAA;AAC5C,CAAA,CAAA,CAAA;AAEO,MAAM,WAAW,CAAC;AAAA,EACvB,uBAAA;AAAA,EACA,aAAgB,GAAA,KAAA;AAAA,EAChB,gBAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAkB,EAAA,oBAAA;AAAA,EAClB,EAAA;AAAA,EACA,eAAkB,GAAA,MAAA;AAAA,EAClB,wBAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAY,EAAA,cAAA;AAAA,EACZ,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAmB,GAAA,CAAA;AAAA,EACnB,SAAY,GAAA,EAAA;AAAA,EACZ,eAAA;AAAA,EACA,qBAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA,IAAA;AACF,CAAsB,KAAA;AACpB,EAAM,MAAA,cAAA,GAAiB,OAAoB,MAAM,CAAA,CAAA;AACjD,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAA,cAAA,CAAe,OAAU,GAAA,MAAA,CAAA;AAAA,GAC3B,EAAG,CAAC,MAAM,CAAC,CAAA,CAAA;AAGX,EAAM,MAAA,YAAA,GAAe,QAAQ,OAAO,EAAE,GAAG,kBAAmB,EAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAElE,EAAM,MAAA,iBAAA,GAAoB,OAAuB,YAAY,CAAA,CAAA;AAE7D,EAAA,MAAM,eAAe,MAAkB,EAAA,CAAA;AAEvC,EAAM,MAAA,CAAC,WAAa,EAAA,cAAc,CAAI,GAAA,QAAA;AAAA,IACpC,oBAAoB,eAAkB,GAAA,eAAA;AAAA,GACxC,CAAA;AACA,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,CAAI,GAAA,QAAA,CAAiB,WAAW,IAAI,CAAA,CAAA;AAChE,EAAA,IAAI,eAAe,KAAW,CAAA,EAAA;AAC5B,IAAA,MAAM,MAAM,sCAAsC,CAAA,CAAA;AAAA,GACpD;AAEA,EAAM,MAAA,oBAAA,GAAuB,WAAY,CAAA,CAACA,KAAiB,KAAA;AACzD,IAAA,WAAA,CAAYA,KAAI,CAAA,CAAA;AAAA,GAClB,EAAG,EAAE,CAAA,CAAA;AAEL,EAAA,MAAM,uBAAuB,SAAY,GAAA,QAAA,CAAA;AACzC,EAAA,MAAM,qBACJ,IAAK,CAAA,MAAA,IAAU,YAAY,MAAW,KAAA,CAAA,CAAA,GAAK,IAAI,WAAY,CAAA,MAAA,CAAA,CAAA;AAC7D,EAAM,MAAA,sBAAA,GACJ,oBAAuB,GAAA,kBAAA,GAAqB,EAAK,GAAA,CAAA,CAAA;AACnD,EAAM,MAAA,cAAA,GAAiB,IAAK,CAAA,KAAA,IAAS,sBAAyB,GAAA,CAAA,CAAA,CAAA;AAE9D,EAAM,MAAA,qBAAA,GAAwB,0BAA0B,MAAM,CAAA,CAAA;AAE9D,EAAM,MAAA,cAAA,GAAiB,gBAAgB,WAAc,GAAA,eAAA,CAAA;AAErD,EAAA,MAAM,WAAc,GAAA,OAAA;AAAA,IAClB,MAAM,4BAA4B,UAAU,CAAA;AAAA,IAC5C,CAAC,UAAU,CAAA;AAAA,GACb,CAAA;AAEA,EAAM,MAAA;AAAA,IACJ,OAAA;AAAA,IACA,wBAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,GACE,GAAA,aAAA,CAAc,MAAQ,EAAA,UAAA,EAAY,gBAAgB,cAAc,CAAA,CAAA;AAMpE,EAAA,wBAAA,CAAyB,MAAM;AAC7B,IAAyB,wBAAA,CAAA;AAAA,MACvB,cAAA;AAAA,MACA,IAAM,EAAA,MAAA;AAAA,MACN,aAAa,cAAe,CAAA,OAAA;AAAA,MAC5B,UAAA;AAAA,KACD,CAAA,CAAA;AAAA,KACA,CAAC,cAAA,EAAgB,MAAQ,EAAA,UAAA,EAAY,wBAAwB,CAAC,CAAA,CAAA;AAEjE,EAAA,MAAM,sBAAyB,GAAA,WAAA;AAAA,IAC7B,CAACC,OAAwB,KAAA;AACvB,MAAyB,wBAAA,CAAA;AAAA,QACvB,cAAA;AAAA,QACA,IAAM,EAAA,MAAA;AAAA,QACN,WAAaA,EAAAA,OAAAA;AAAA,QACb,UAAA;AAAA,OACD,CAAA,CAAA;AACD,MAAA,cAAA,CAAe,OAAUA,GAAAA,OAAAA,CAAAA;AACzB,MAAiB,cAAA,GAAA,uBAAA,CAAwBA,OAAM,CAAC,CAAA,CAAA;AAAA,KAClD;AAAA,IACA,CAAC,cAAA,EAAgB,UAAY,EAAA,wBAAA,EAA0B,cAAc,CAAA;AAAA,GACvE,CAAA;AAEA,EAAA,MAAM,SAAY,GAAA,OAAA;AAAA,IAChB,MAAM,cAAe,CAAA,UAAA,CAAW,OAAO,CAAA;AAAA,IACvC,CAAC,WAAW,OAAO,CAAA;AAAA,GACrB,CAAA;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,EAAE,WAAA,EAA+C,KAAA;AAChD,MAAA,IAAI,WAAa,EAAA;AACf,QAAyB,wBAAA,CAAA;AAAA,UACvB,IAAM,EAAA,gBAAA;AAAA,UACN,WAAA;AAAA,SACD,CAAA,CAAA;AAAA,OACI,MAAA;AACL,QAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA,CAAA;AAAA,OACnD;AAAA,KACF;AAAA,IACA,CAAC,wBAAwB,CAAA;AAAA,GAC3B,CAAA;AAEA,EAAM,MAAA;AAAA,IACJ,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAoB,EAAA,8BAAA;AAAA,IACpB,YAAc,EAAA,wBAAA;AAAA,IACd,GAAG,oBAAA;AAAA,MACD,gBAAiB,CAAA;AAAA,IACnB,OAAA;AAAA,IACA,cAAc,WAAY,CAAA,MAAA;AAAA,IAC1B,QAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAkB,EAAA,qBAAA;AAAA,IAClB,IAAA;AAAA,IACA,sBAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,IAAM,EAAA,OAAA,EAAS,iBAAiB,KAAO,EAAA,QAAA,KAAa,aAAc,CAAA;AAAA,IACxE,UAAA;AAAA;AAAA,IAEA,gBAAA;AAAA,IACA,YAAc,EAAA,oBAAA;AAAA,IACd,YAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,aAAA,EAAe,GAAG,WAAA,KAAgB,cAAe,CAAA;AAAA,IACvD,iBAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAW,YAAa,CAAA,OAAA;AAAA,IACxB,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,sBAAA;AAAA,IACA,gBAAkB,EAAA,wBAAA;AAAA,IAClB,sBAAwB,EAAA,8BAAA;AAAA,IACxB,oBAAA;AAAA,GACD,CAAA,CAAA;AAGD,EAAA,MAAM,iCAAoC,GAAA,WAAA;AAAA,IACxC,CAACC,YAA6B,KAAA;AAC5B,MAAyB,wBAAA,CAAA;AAAA,QACvB,cAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAAA,EAAAA,YAAAA;AAAA,QACA,IAAM,EAAA,MAAA;AAAA,OACP,CAAA,CAAA;AACD,MAAA,cAAA,CAAe,OAAUA,GAAAA,YAAAA,CAAAA;AACzB,MAAiB,cAAA,GAAA,uBAAA,CAAwBA,YAAW,CAAC,CAAA,CAAA;AAAA,KACvD;AAAA,IACA,CAAC,cAAA,EAAgB,UAAY,EAAA,wBAAA,EAA0B,cAAc,CAAA;AAAA,GACvE,CAAA;AAEA,EAAA,MAAM,6BAAgC,GAAA,WAAA;AAAA,IACpC,CAAC,gBAAuC,KAAA;AACtC,MAAA,UAAA,CAAW,MAAS,GAAA;AAAA,QAClB,GAAG,UAAW,CAAA,MAAA;AAAA,QACd,GAAG,gBAAA;AAAA,OACL,CAAA;AAAA,KACF;AAAA,IACA,CAAC,UAAU,CAAA;AAAA,GACb,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,UAAA,CAAW,EAAG,CAAA,QAAA,EAAU,CAACD,OAAAA,EAAQ,WAAW,OAAY,KAAA;AACtD,MAAM,MAAA,sBAAA,GACJ,OAAS,EAAA,aAAA,IAAiB,OAAS,EAAA,cAAA,CAAA;AACrC,MAAA,IAAI,sBAA0B,IAAA,UAAA,CAAW,KAAM,CAAA,IAAA,GAAO,CAAG,EAAA;AACvD,QAAc,aAAA,CAAA;AAAA,UACZ,IAAM,EAAA,YAAA;AAAA,UACN,SAAW,EAAA,MAAA;AAAA,SACZ,CAAA,CAAA;AAAA,OACH;AACA,MAAA,OAAA,CAAQ,IAAI,CAA+B,6BAAA,CAAA,CAAA,CAAA;AAC3C,MAAyB,wBAAA,CAAA;AAAA,QACvB,IAAM,EAAA,aAAA;AAAA,QACN,GAAGA,OAAAA;AAAA,QACH,SAAA;AAAA,OACD,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GACA,EAAA,CAAC,UAAY,EAAA,wBAAA,EAA0B,aAAa,CAAC,CAAA,CAAA;AAExD,EAAA,MAAM,4BAA+B,GAAA,WAAA;AAAA,IACnC,CAAC,MAA6B,KAAA;AAC5B,MAAA,UAAA,CAAW,OAAU,GAAA,UAAA,CAAW,OAAQ,CAAA,MAAA,CAAO,OAAO,IAAI,CAAA,CAAA;AAC1D,MAAuB,sBAAA,CAAA,SAAA,CAAU,WAAa,EAAA,MAAM,CAAC,CAAA,CAAA;AAAA,KACvD;AAAA,IACA,CAAC,UAAY,EAAA,WAAA,EAAa,sBAAsB,CAAA;AAAA,GAClD,CAAA;AAEA,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,MAA6B,KAAA;AAC5B,MAAM,MAAA,EAAE,OAAAE,EAAAA,QAAAA,EAAY,GAAA,MAAA,CAAA;AACpB,MAAA,MAAM,gBAAgBA,QAAQ,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAA;AAC/C,MAAA,MAAM,cAAiB,GAAA;AAAA,QACrB,GAAG,WAAA;AAAA,QACH,OAAA,EAAS,YAAY,OAAQ,CAAA,GAAA;AAAA,UAAI,CAAC,GAAA,KAChC,aAAc,CAAA,QAAA,CAAS,GAAI,CAAA,IAAI,CAAI,GAAA,EAAE,GAAG,GAAA,EAAK,MAAQ,EAAA,IAAA,EAAS,GAAA,GAAA;AAAA,SAChE;AAAA,OACF,CAAA;AACA,MAAA,sBAAA,CAAuB,cAAc,CAAA,CAAA;AAAA,KACvC;AAAA,IACA,CAAC,aAAa,sBAAsB,CAAA;AAAA,GACtC,CAAA;AAEA,EAAA,MAAM,SAAY,GAAA,WAAA;AAAA,IAChB,CAAC,MAA4B,KAAA;AAC3B,MAAuB,sBAAA,CAAA;AAAA,QACrB,GAAG,WAAA;AAAA,QACH,OAAA,EAAS,YAAa,CAAA,WAAA,CAAY,OAAS,EAAA;AAAA,UACzC,GAAG,MAAO,CAAA,MAAA;AAAA,UACV,KAAK,MAAO,CAAA,GAAA;AAAA,SACb,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KACH;AAAA,IACA,CAAC,aAAa,sBAAsB,CAAA;AAAA,GACtC,CAAA;AAEA,EAAA,MAAM,EAAE,uBAAA,EAAyB,sBAAuB,EAAA,GACtD,yBAA0B,CAAA;AAAA,IACxB,gBAAA,EACE,gBACA,IAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,cAAiB,GAAA,QAAA,EAAgB,MAAA;AAAA,MAChE,IAAA;AAAA,MACA,cAAA;AAAA,KACA,CAAA,CAAA;AAAA,IACJ,wBAAA;AAAA,IACA,cAAgB,EAAA,iCAAA;AAAA,IAChB,wBAA0B,EAAA,4BAAA;AAAA,IAC1B,wBAA0B,EAAA,6BAAA;AAAA,IAC1B,WAAA;AAAA,GACD,CAAA,CAAA;AAEH,EAAA,MAAM,2BAA8B,GAAA,WAAA;AAAA,IAClC,CAAC,MAAmC,KAAA;AAClC,MAAI,IAAA,oBAAA,CAAqB,MAAM,CAAG,EAAA;AAChC,QAAA,uBAAA,CAAwB,MAAM,CAAA,CAAA;AAAA,OAChC,MAAA,IAAW,mBAAoB,CAAA,MAAM,CAAG,EAAA;AACtC,QAAuB,sBAAA,EAAA,CAAA;AAAA,OAClB,MAAA;AACL,QAAA,QAAQ,OAAO,IAAM;AAAA,UACnB,KAAK,aAAA;AACH,YAAA,OAAO,YAAY,MAAM,CAAA,CAAA;AAAA,UAC3B,KAAK,WAAA;AACH,YAAA,OAAO,UAAU,MAAM,CAAA,CAAA;AAAA,UACzB;AACE,YAAA,wBAAA,CAAyB,MAAM,CAAA,CAAA;AAAA,SACnC;AAAA,OACF;AAAA,KACF;AAAA,IACA;AAAA,MACE,wBAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,uBAAA;AAAA,MACA,sBAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,0BAA0B,yBAA0B,CAAA;AAAA,IACxD,UAAA;AAAA,IACA,2BAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,UAAa,GAAA,WAAA;AAAA,IACjB,CAAC,MAAA,EAA0B,UAAa,GAAA,KAAA,EAAO,QAA2B,KAAA;AACxE,MAAA,IAAI,UAAY,EAAA;AACd,QAAA,UAAA,CAAW,IAAO,GAAA,iBAAA;AAAA,UAChB,UAAW,CAAA,IAAA;AAAA,UACX,MAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,SACF,CAAA;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,UAAU,CAAA;AAAA,GACb,CAAA;AAEA,EAAA,MAAM,cAAc,MAAkC,EAAA,CAAA;AAEtD,EAAA,MAAM,cAA2C,GAAA,WAAA;AAAA,IAC/C,CAAC,KAAO,EAAA,UAAA,EAAY,KAAU,KAAA;AAC5B,MAAA,MAAM,SAAS,OAAQ,CAAA,IAAA,CAAK,CAACC,OAAWA,KAAAA,OAAAA,CAAO,SAAS,UAAU,CAAA,CAAA;AAClE,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,IAAI,UAAU,QAAU,EAAA;AACtB,UAAY,WAAA,CAAA,OAAA,EAAS,OAAQ,CAAA,CAAC,IAAS,KAAA;AACrC,YAAK,IAAA,CAAA,KAAA,CAAM,KAAQ,GAAA,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,CAAA;AAAA,WAC5B,CAAA,CAAA;AAAA,SACH,MAAA,IAAW,UAAU,KAAO,EAAA;AAC1B,UAAA,WAAA,CAAY,OAAU,GAAA,KAAA,CAAA,CAAA;AACtB,UAAI,IAAA,aAAA,CAAc,KAAK,CAAG,EAAA;AACxB,YAAyB,wBAAA,CAAA;AAAA,cACvB,IAAM,EAAA,cAAA;AAAA,cACN,KAAA;AAAA,cACA,MAAA;AAAA,cACA,KAAA;AAAA,aACD,CAAA,CAAA;AACD,YAAA,cAAA;AAAA,cACE,uBAAA;AAAA,gBACE,kBAAkB,WAAa,EAAA;AAAA,kBAC7B,IAAM,EAAA,UAAA;AAAA,kBACN,MAAA;AAAA,kBACA,OAAA;AAAA,kBACA,KAAA;AAAA,iBACD,CAAA;AAAA,eACH;AAAA,aACF,CAAA;AAAA,WACF;AAAA,SACK,MAAA;AACL,UAAM,MAAA,UAAA,GAAa,CAAmB,gBAAA,EAAA,MAAA,CAAO,KAAK,CAAA,EAAA,CAAA,CAAA;AAClD,UAAA,WAAA,CAAY,UAAU,KAAM,CAAA,IAAA;AAAA,YAC1B,aAAa,OAAS,EAAA,gBAAA;AAAA,cACpB,CAAA,aAAA,EAAgB,UAAU,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAA;AAAA,iBACxD,EAAC;AAAA,WACR,CAAA;AACA,UAAyB,wBAAA,CAAA;AAAA,YACvB,IAAM,EAAA,cAAA;AAAA,YACN,KAAA;AAAA,YACA,MAAA;AAAA,YACA,KAAA;AAAA,WACD,CAAA,CAAA;AAAA,SACH;AAAA,OACK,MAAA;AACL,QAAM,MAAA,KAAA;AAAA,UACJ,2CAA2C,UAAU,CAAA,UAAA,CAAA;AAAA,SACvD,CAAA;AAAA,OACF;AAAA,KACF;AAAA,IACA;AAAA,MACE,OAAA;AAAA,MACA,wBAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,KAAoB,MAAoC,KAAA;AACvD,MAAA,MAAM,MAAS,GAAA,WAAA,CAAY,MAAQ,EAAA,GAAA,EAAK,SAAS,CAAA,CAAA;AACjD,MAAM,MAAA,GAAA,GAAM,IAAI,GAAG,CAAA,CAAA;AAEnB,MAAI,IAAA,GAAA,CAAI,WAAW,CAAG,EAAA;AACpB,QAAW,UAAA,CAAA,aAAA,CAAc,KAAK,IAAI,CAAA,CAAA;AAClC,QAAA,IAAI,MAAQ,EAAA;AAEV,UAAM,MAAA,GAAA,GAAM,OAAQ,CAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAClC,UAAA,MAAM,IAAO,GAAA,UAAA,CAAW,cAAiB,GAAA,GAAA,GAAM,CAAC,CAAA,CAAA;AAChD,UAAA,IAAI,IAAQ,IAAA,CAAC,IAAK,CAAA,IAAA,CAAK,CAACC,IAAAA,KAAQA,IAAI,CAAA,WAAW,CAAKA,IAAAA,IAAAA,CAAI,OAAO,CAAC,CAAG,EAAA;AACjE,YAAyB,wBAAA,CAAA;AAAA,cACvB,IAAM,EAAA,aAAA;AAAA,cACN,OAAS,EAAA,OAAA,CAAQ,KAAM,CAAA,GAAA,GAAM,CAAC,CAAA;AAAA,aAC/B,CAAA,CAAA;AAAA,WACH;AAAA,SACF;AAAA,OACK,MAAA;AACL,QAAA,UAAA,CAAW,aAAa,GAAG,CAAA,CAAA;AAC3B,QAAA,IAAI,MAAQ,EAAA;AACV,UAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,GAAe,GAAG,CAAA,CAAA;AAC/C,UAAA,MAAM,GAAM,GAAA,OAAA,CAAQ,OAAQ,CAAA,MAAM,CAAI,GAAA,CAAA,CAAA;AACtC,UAAA,MAAM,aAAgB,GAAA,CAAC,OAAQ,CAAA,GAAG,CAAC,CAAA,CAAA;AACnC,UAAI,IAAA,SAAA,IAAa,UAAU,IAAK,CAAA,CAACA,SAAQA,IAAI,CAAA,OAAO,CAAC,CAAG,EAAA;AACtD,YAAA,aAAA,CAAc,IAAK,CAAA,OAAA,CAAQ,GAAM,GAAA,CAAC,CAAC,CAAA,CAAA;AAAA,WACrC;AACA,UAAA,IAAI,cAAc,IAAK,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,MAAM,CAAG,EAAA;AAC3C,YAAyB,wBAAA,CAAA;AAAA,cACvB,IAAM,EAAA,aAAA;AAAA,cACN,OAAS,EAAA,aAAA;AAAA,aACV,CAAA,CAAA;AAAA,WACH;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,SAAA,EAAW,OAAS,EAAA,UAAA,EAAY,wBAAwB,CAAA;AAAA,GAC3D,CAAA;AAGA,EAAA,MAAM,iBAAoB,GAAA,WAAA;AAAA,IACxB,CAAC,mBAAmB,MAAW,KAAA;AAC7B,MAAA,IAAI,sBAAsB,QAAU,EAAA;AAClC,QAAA,UAAA,CAAW,aAAa,MAAM,CAAA,CAAA;AAAA,OACzB,MAAA;AACL,QAAA,UAAA,CAAW,cAAc,MAAM,CAAA,CAAA;AAAA,OACjC;AAAA,KACF;AAAA,IACA,CAAC,UAAU,CAAA;AAAA,GACb,CAAA;AAEA,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,2BAAA;AAAA,IACA,uBAAA;AAAA,IACA,YAAA;AAAA,MACE,YAAa,CAAA;AAAA,IACf,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,YAAA,CAAa,OAAU,GAAA,SAAA,CAAA;AAEvB,EAAM,MAAA,WAAA,GAAc,QAAQ,MAAO,CAAA,CAAC,MAAM,CAAE,CAAA,MAAA,KAAW,IAAI,CAAE,CAAA,MAAA,CAAA;AAE7D,EAAM,MAAA;AAAA,IACJ,mBAAA;AAAA,IACA,YAAc,EAAA,QAAA;AAAA,IACd,OAAS,EAAA,eAAA;AAAA,IACT,SAAW,EAAA,iBAAA;AAAA,IACX,GAAG,cAAA;AAAA,MACD,qBAAsB,CAAA;AAAA,IACxB,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAa,WAAY,CAAA,KAAA;AAAA,IACzB,gBAAkB,EAAA,oBAAA;AAAA,IAClB,eAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAe,EAAA,iBAAA;AAAA,IACf,aAAe,EAAA,KAAA;AAAA,IACf,kBAAkB,oBAAqB,CAAA,QAAA;AAAA,GACxC,CAAA,CAAA;AAED,EAAM,MAAA;AAAA,IACJ,MAAQ,EAAA,WAAA;AAAA,IACR,aAAe,EAAA,kBAAA;AAAA,IACf,SAAW,EAAA,cAAA;AAAA,IACX,OAAS,EAAA,YAAA;AAAA,MACP,cAAe,CAAA;AAAA,IACjB,QAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,CAA+B,KAAA;AAC9B,MAAgB,eAAA,EAAA,CAAA;AAChB,MAAI,IAAA,CAAC,EAAE,gBAAkB,EAAA;AACvB,QAAA,YAAA,CAAa,CAAC,CAAA,CAAA;AAAA,OAChB;AAAA,KACF;AAAA,IACA,CAAC,cAAc,eAAe,CAAA;AAAA,GAChC,CAAA;AAEA,EAAA,MAAM,gBAAgB,mBAAoB,CAAA;AAAA,IACxC,OAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAa,WAAY,CAAA,KAAA;AAAA,GAC1B,CAAA,CAAA;AAED,EAAA,MAAM,iBAAoB,GAAA,WAAA;AAAA,IACxB,CAACF,QAAgC,KAAA;AAC/B,MAAA,UAAA,CAAW,UAAUA,QAAQ,CAAA,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,IAAI,CAAA,CAAA;AAAA,KACpD;AAAA,IACA,CAAC,UAAU,CAAA;AAAA,GACb,CAAA;AAEA,EAAA,MAAM,mBAAsB,GAAA,WAAA;AAAA,IAC1B,CAAC,MAAoC,KAAA;AACnC,MAAI,IAAA,aAAA,CAAc,MAAM,CAAG,EAAA;AACzB,QAAA,UAAA,CAAW,UAAU,EAAC,CAAA;AAAA,OACjB,MAAA;AACL,QAAA,IAAI,cAAc,UAAW,CAAA,OAAA,EAAS,QAAS,CAAA,MAAA,CAAO,IAAI,CAAG,EAAA;AAC3D,UAAW,UAAA,CAAA,OAAA,GAAU,WAAW,OAAQ,CAAA,MAAA;AAAA,YACtC,CAAC,UAAe,KAAA,UAAA,KAAe,MAAO,CAAA,IAAA;AAAA,WACxC,CAAA;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,UAAU,CAAA;AAAA,GACb,CAAA;AAEA,EAAA,MAAM,qBAAgD,GAAA,WAAA;AAAA,IACpD,CAAC,QAAa,KAAA;AACZ,MAAA,UAAA,CAAW,OAAO,QAAQ,CAAA,CAAA;AAC1B,MAAA,iBAAA,GAAoB,QAAQ,CAAA,CAAA;AAAA,KAC9B;AAAA,IACA,CAAC,YAAY,iBAAiB,CAAA;AAAA,GAChC,CAAA;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,GAAQ,KAAA;AACP,MAAA,IAAI,QAAU,EAAA;AACZ,QAAA,QAAA,CAAS,QAAQ,IAAO,GAAA,IAAA,GAAO,qBAAsB,CAAA,GAAA,EAAK,SAAS,CAAC,CAAA,CAAA;AAAA,OACtE;AAAA,KACF;AAAA,IACA,CAAC,WAAW,QAAQ,CAAA;AAAA,GACtB,CAAA;AAEA,EAAM,MAAA;AAAA,IACJ,SAAW,EAAA,oBAAA;AAAA,IACX,UAAY,EAAA,uBAAA;AAAA,MACV,YAAa,CAAA;AAAA,IACf,mBAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,iBAAmB,EAAA,qBAAA;AAAA,IACnB,cAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,qBAAwB,GAAA,WAAA;AAAA,IAC5B,CAACG,UAA8B,KAAA;AAC7B,MAAA,qBAAA,CAAsB,EAAE,CAAA,CAAA;AACxB,MAAA,iBAAA,GAAoBA,UAAS,CAAA,CAAA;AAAA,KAC/B;AAAA,IACA,CAAC,uBAAuB,iBAAiB,CAAA;AAAA,GAC3C,CAAA;AAEA,EAAM,MAAA;AAAA,IACJ,WAAa,EAAA,sBAAA;AAAA,IACb,SAAA;AAAA,IACA,SAAW,EAAA,yBAAA;AAAA,MACT,qBAAsB,CAAA;AAAA,IACxB,uBAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAmB,EAAA,qBAAA;AAAA,IACnB,QAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,GAAA,EAAK,GAAK,EAAA,WAAA,EAAa,qBAA0B,KAAA;AAChD,MAAwB,uBAAA,CAAA,GAAA,EAAK,GAAK,EAAA,WAAA,EAAa,qBAAqB,CAAA,CAAA;AACpE,MAAA,cAAA,GAAiB,GAAK,EAAA,qBAAA,CAAsB,GAAK,EAAA,SAAS,CAAC,CAAA,CAAA;AAAA,KAC7D;AAAA,IACA,CAAC,SAAW,EAAA,cAAA,EAAgB,uBAAuB,CAAA;AAAA,GACrD,CAAA;AAEA,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,CAAkC,KAAA;AACjC,MAAA,yBAAA,GAA4B,CAAC,CAAA,CAAA;AAC7B,MAAI,IAAA,CAAC,EAAE,gBAAkB,EAAA;AACvB,QAAA,iBAAA,CAAkB,CAAC,CAAA,CAAA;AAAA,OACrB;AACA,MAAI,IAAA,CAAC,EAAE,gBAAkB,EAAA;AACvB,QAAA,cAAA,CAAe,CAAC,CAAA,CAAA;AAAA,OAClB;AACA,MAAI,IAAA,CAAC,EAAE,gBAAkB,EAAA;AACvB,QAAA,oBAAA,CAAqB,CAAC,CAAA,CAAA;AAAA,OACxB;AAAA,KACF;AAAA,IACA;AAAA,MACE,yBAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA,oBAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAACH,QAAgC,KAAA;AAC/B,MAAA,MAAM,cAAiB,GAAA;AAAA,QACrB,GAAG,WAAA;AAAA,QACH,OAAAA,EAAAA,QAAAA;AAAA,OACF,CAAA;AAEA,MAAA,cAAA,CAAe,OAAU,GAAA,cAAA,CAAA;AAEzB,MAAyB,wBAAA,CAAA;AAAA,QACvB,cAAA;AAAA,QACA,IAAM,EAAA,MAAA;AAAA,QACN,WAAa,EAAA,cAAA;AAAA,QACb,UAAA;AAAA,OACD,CAAA,CAAA;AACD,MAAiB,cAAA,GAAA,uBAAA,CAAwB,cAAc,CAAC,CAAA,CAAA;AAAA,KAC1D;AAAA,IACA;AAAA,MACE,cAAA;AAAA,MACA,UAAA;AAAA,MACA,wBAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,aAAkB,KAAA;AACjB,MAAA,MAAA,GAAS,aAAa,CAAA,CAAA;AAAA,KACxB;AAAA,IACA,CAAC,MAAM,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,IACvB,OAAO,GAAK,EAAA,UAAA,EAAY,KAAU,KAAA;AAChC,MAAA,OAAO,WAAW,SAAU,CAAA,GAAA,CAAI,GAAG,CAAA,EAAG,YAAY,KAAK,CAAA,CAAA;AAAA,KACzD;AAAA,IACA,CAAC,UAAU,CAAA;AAAA,GACb,CAAA;AAEA,EAAA,MAAM,kBAAqB,GAAA,WAAA;AAAA,IACzB,CAAC,aAAkB,KAAA;AACjB,MAAM,MAAA,EAAE,oBAAuB,GAAA,aAAA,CAAA;AAC/B,MAAA,MAAM,QACJ,GAAA,eAAA,CAAgB,kBAAkB,CAAA,GAAI,YAAY,KAAQ,GAAA,CAAA,CAAA;AAC5D,MAAM,MAAA,GAAA,GAAM,QAAQ,OAAQ,CAAA,IAAA,CAAK,CAACE,IAAQA,KAAAA,IAAAA,CAAI,CAAC,CAAA,KAAM,QAAQ,CAAA,CAAA;AAC7D,MAAA,IAAI,GAAK,EAAA;AACP,QAAA,aAAA,CAAc,WAAW,GAAG,CAAA,CAAA;AAAA,OAG9B;AACA,MAAA,WAAA,GAAc,aAAa,CAAA,CAAA;AAAA,KAC7B;AAAA,IACA,CAAC,OAAA,EAAS,WAAY,CAAA,KAAA,EAAO,WAAW,CAAA;AAAA,GAC1C,CAAA;AAEA,EAAA,MAAM,sBAAyB,GAAA,WAAA;AAAA,IAC7B,CAAC,QAAgB,KAAkB,KAAA;AACjC,MAAe,cAAA,CAAA,EAAE,MAAQ,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,KAClC;AAAA,IACA,EAAC;AAAA,GACH,CAAA;AAGA,EAAA,MAAM,EAAE,WAAa,EAAA,gBAAA,EAAkB,SAAW,EAAA,YAAA,KAChD,cAAe,CAAA;AAAA,IACb,aAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAoB,EAAA,CAAA,QAAA,CAAA;AAAA,IACpB,EAAA;AAAA,IACA,WAAa,EAAA,kBAAA;AAAA,IACb,MAAQ,EAAA,aAAA;AAAA,IACR,WAAa,EAAA,UAAA;AAAA,IACb,SAAW,EAAA,cAAA;AAAA,GACZ,CAAA,CAAA;AAEH,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,GAAQ,KAAA;AACP,MAAA,gBAAA,GAAmB,GAAG,CAAA,CAAA;AACtB,MAAI,IAAA,CAAC,GAAI,CAAA,oBAAA,EAAwB,EAAA;AAC/B,QAAA,sBAAA,GAAyB,GAAG,CAAA,CAAA;AAAA,OAC9B;AAAA,KACF;AAAA,IACA,CAAC,kBAAkB,sBAAsB,CAAA;AAAA,GAC3C,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,GAAG,cAAA;AAAA,IACH,iBAAiB,UAAW,CAAA,IAAA;AAAA,IAC5B,SAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA,2BAAA;AAAA,IACA,uBAAA;AAAA,IACA,YAAA;AAAA,IACA,uBAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,kBAAkB,mBAAoB,CAAA,OAAA;AAAA,IACtC,WAAA;AAAA,IACA,MAAQ,EAAA,WAAA;AAAA,IACR,aAAe,EAAA,kBAAA;AAAA,IACf,OAAS,EAAA,WAAA;AAAA,IACT,SAAW,EAAA,aAAA;AAAA,IACX,WAAa,EAAA,eAAA;AAAA,IACb,aAAA;AAAA,IACA,YAAc,EAAA,gBAAA;AAAA,IACd,sBAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,UAAY,EAAA,cAAA;AAAA,IACZ,YAAc,EAAA,UAAA;AAAA,IACd,cAAA;AAAA,IACA,aAAA;AAAA,IACA,qBAAA;AAAA,IACA,WAAA;AAAA;AAAA,IAEA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,GACF,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"useTable.js","sources":["../src/useTable.ts"],"sourcesContent":["import {\n DataSourceConfig,\n DataSourceRow,\n DataSourceSubscribedMessage,\n SelectionChangeHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType, VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n DataCellEditEvent,\n RuntimeColumnDescriptor,\n TableColumnResizeHandler,\n TableConfig,\n TableRowClickHandlerInternal,\n TableRowSelectHandlerInternal,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n DragStartHandler,\n MeasuredProps,\n MeasuredSize,\n useDragDrop,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport {\n asDataSourceRowObject,\n buildColumnMap,\n isGroupColumn,\n isJsonGroup,\n isValidNumber,\n metadataKeys,\n toggleOrApplySort,\n updateColumn,\n useLayoutEffectSkipFirst,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEvent,\n KeyboardEvent,\n MouseEventHandler,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { TableProps } from \"./Table\";\nimport { useCellBlockSelection } from \"./cell-block/useCellBlockSelection\";\nimport {\n buildContextMenuDescriptors,\n useHandleTableContextMenu,\n} from \"./context-menu\";\nimport { updateTableConfig } from \"./table-config\";\nimport { getAriaRowIndex } from \"./table-dom-utils\";\nimport { useCellEditing } from \"./useCellEditing\";\nimport { FocusCell, useCellFocus } from \"./useCellFocus\";\nimport { useDataSource } from \"./useDataSource\";\nimport {\n GroupToggleHandler,\n useKeyboardNavigation,\n} from \"./useKeyboardNavigation\";\nimport { useRowClassNameGenerators } from \"./useRowClassNameGenerators\";\nimport { useSelection } from \"./useSelection\";\nimport { useTableAndColumnSettings } from \"./useTableAndColumnSettings\";\nimport { useTableContextMenu } from \"./useTableContextMenu\";\nimport {\n ColumnActionHide,\n ColumnActionPin,\n PersistentColumnAction,\n isShowColumnSettings,\n isShowTableSettings,\n useTableModel,\n} from \"./useTableModel\";\nimport { ScrollRequestHandler, useTableScroll } from \"./useTableScroll\";\nimport { useTableViewport } from \"./useTableViewport\";\nimport { TableCellBlock } from \"./cell-block/cellblock-utils\";\nimport { CellFocusState } from \"./CellFocusState\";\n\ntype HeaderState = {\n height: number;\n count: number;\n};\n\nconst nullHeaderState = {\n height: -1,\n count: -1,\n};\nconst zeroHeaderState = {\n height: 0,\n count: 0,\n};\n\nconst stripInternalProperties = (tableConfig: TableConfig): TableConfig => {\n return tableConfig;\n};\n\nexport interface TableHookProps\n extends MeasuredProps,\n Pick<\n TableProps,\n | \"allowCellBlockSelection\"\n | \"allowDragDrop\"\n | \"availableColumns\"\n | \"config\"\n | \"dataSource\"\n | \"defaultSelectedIndexValues\"\n | \"defaultSelectedKeyValues\"\n | \"disableFocus\"\n | \"highlightedIndex\"\n | \"id\"\n | \"navigationStyle\"\n | \"onAvailableColumnsChange\"\n | \"onConfigChange\"\n | \"onDataEdited\"\n | \"onDragStart\"\n | \"onDrop\"\n | \"onHighlight\"\n | \"onSelect\"\n | \"onSelectCellBlock\"\n | \"onSelectionChange\"\n | \"onRowClick\"\n | \"renderBufferSize\"\n | \"revealSelected\"\n | \"rowToObject\"\n | \"scrollingApiRef\"\n | \"selectionBookendWidth\"\n | \"showColumnHeaders\"\n | \"showPaginationControls\"\n > {\n containerRef: RefObject<HTMLDivElement>;\n rowHeight: number;\n selectionModel: TableSelectionModel;\n size: MeasuredSize;\n}\n\nconst { KEY, IS_EXPANDED, IS_LEAF } = metadataKeys;\n\nconst NULL_DRAG_DROP = {\n draggable: undefined,\n onMouseDown: undefined,\n};\nconst useNullDragDrop = () => NULL_DRAG_DROP;\n\nconst addColumn = (\n tableConfig: TableConfig,\n column: ColumnDescriptor,\n): TableConfig => ({\n ...tableConfig,\n columns: tableConfig.columns.concat(column),\n});\n\nexport const useTable = ({\n allowCellBlockSelection,\n allowDragDrop = false,\n availableColumns,\n config,\n containerRef,\n dataSource,\n defaultSelectedIndexValues,\n defaultSelectedKeyValues,\n disableFocus,\n highlightedIndex: highlightedIndexProp,\n id,\n navigationStyle = \"cell\",\n onAvailableColumnsChange,\n onConfigChange,\n onDataEdited: onDataEditedProp,\n onDragStart,\n onDrop,\n onHighlight,\n onRowClick: onRowClickProp,\n onSelect,\n onSelectCellBlock,\n onSelectionChange,\n renderBufferSize = 0,\n revealSelected,\n rowHeight = 20,\n rowToObject = asDataSourceRowObject,\n scrollingApiRef,\n selectionBookendWidth = 4,\n selectionModel,\n showColumnHeaders,\n showPaginationControls,\n size,\n}: TableHookProps) => {\n const tableConfigRef = useRef<TableConfig>(config);\n // avoids a hook dependency on requestScroll, important to avoid re-registering config handler\n const requestScrollRef = useRef<ScrollRequestHandler | undefined>();\n useMemo(() => {\n tableConfigRef.current = config;\n }, [config]);\n\n // state is mutated, so make every component gets a fresh copy\n const initialState = useMemo(() => new CellFocusState(), []);\n\n const cellFocusStateRef = useRef<CellFocusState>(initialState);\n // Needed to avoid circular dependency between useTableScroll and useCellFocus\n const focusCellRef = useRef<FocusCell>();\n\n const [headerState, setHeaderState] = useState<HeaderState>(\n showColumnHeaders ? nullHeaderState : zeroHeaderState,\n );\n const [rowCount, setRowCount] = useState<number>(dataSource.size);\n if (dataSource === undefined) {\n throw Error(\"no data source provided to Vuu Table\");\n }\n\n const onDataRowcountChange = useCallback((size: number) => {\n setRowCount(size);\n }, []);\n\n const virtualContentHeight = rowHeight * rowCount;\n const viewportBodyHeight =\n size.height - (headerState.height === -1 ? 0 : headerState.height);\n const verticalScrollbarWidth =\n virtualContentHeight > viewportBodyHeight ? 10 : 0;\n const availableWidth =\n size.width - (verticalScrollbarWidth + 2 * selectionBookendWidth);\n\n const rowClassNameGenerator = useRowClassNameGenerators(config);\n\n const useRowDragDrop = allowDragDrop ? useDragDrop : useNullDragDrop;\n\n const menuBuilder = useMemo(\n () => buildContextMenuDescriptors(dataSource),\n [dataSource],\n );\n\n const {\n columns,\n dispatchTableModelAction,\n headings,\n tableAttributes,\n tableConfig,\n } = useTableModel(config, dataSource, selectionModel, availableWidth);\n\n // this is realy here to capture changes to available Width - typically when we get\n // rowcount so add allowance for vertical scrollbar, reducing available width\n // including dataSource is causing us to do unnecessary work in useTableModel\n // split this into multiple effects\n useLayoutEffectSkipFirst(() => {\n dispatchTableModelAction({\n availableWidth,\n type: \"init\",\n tableConfig: tableConfigRef.current,\n dataSource,\n });\n }, [availableWidth, config, dataSource, dispatchTableModelAction]);\n\n const applyTableConfigChange = useCallback(\n (config: TableConfig) => {\n dispatchTableModelAction({\n availableWidth,\n type: \"init\",\n tableConfig: config,\n dataSource,\n });\n tableConfigRef.current = config;\n onConfigChange?.(stripInternalProperties(config));\n },\n [availableWidth, dataSource, dispatchTableModelAction, onConfigChange],\n );\n\n const columnMap = useMemo(\n () => buildColumnMap(dataSource.columns),\n [dataSource.columns],\n );\n\n const onSubscribed = useCallback(\n ({ tableSchema }: DataSourceSubscribedMessage) => {\n if (tableSchema) {\n dispatchTableModelAction({\n type: \"setTableSchema\",\n tableSchema,\n });\n } else {\n console.log(\"subscription message with no schema\");\n }\n },\n [dispatchTableModelAction],\n );\n\n const {\n getRowAtPosition,\n getRowOffset,\n setInSituRowOffset: viewportHookSetInSituRowOffset,\n setScrollTop: viewportHookSetScrollTop,\n ...viewportMeasurements\n } = useTableViewport({\n columns,\n headerHeight: headerState.height,\n rowCount,\n rowHeight,\n selectionEndSize: selectionBookendWidth,\n size: size,\n showPaginationControls,\n });\n\n const { data, dataRef, getSelectedRows, range, setRange } = useDataSource({\n dataSource,\n defaultSelectedIndexValues,\n defaultSelectedKeyValues,\n renderBufferSize,\n revealSelected,\n onSizeChange: onDataRowcountChange,\n onSubscribed,\n });\n\n const { requestScroll, ...scrollProps } = useTableScroll({\n cellFocusStateRef,\n columns,\n focusCell: focusCellRef.current,\n getRowAtPosition,\n rowHeight,\n scrollingApiRef,\n setRange,\n showPaginationControls,\n onVerticalScroll: viewportHookSetScrollTop,\n onVerticalScrollInSitu: viewportHookSetInSituRowOffset,\n viewportMeasurements,\n });\n // avoids a hook dependency on requestScroll, important to avoid re-registering config handler\n requestScrollRef.current = requestScroll;\n\n // TODO does this belong here ?\n const handleConfigEditedInSettingsPanel = useCallback(\n (tableConfig: TableConfig) => {\n dispatchTableModelAction({\n availableWidth,\n dataSource,\n tableConfig,\n type: \"init\",\n });\n tableConfigRef.current = tableConfig;\n onConfigChange?.(stripInternalProperties(tableConfig));\n },\n [availableWidth, dataSource, dispatchTableModelAction, onConfigChange],\n );\n\n const handleDataSourceConfigChanged = useCallback(\n (dataSourceConfig: DataSourceConfig) => {\n dataSource.config = {\n ...dataSource.config,\n ...dataSourceConfig,\n };\n },\n [dataSource],\n );\n\n useEffect(() => {\n dataSource.on(\"config\", (config, range, confirmed, changes) => {\n const scrollSensitiveChanges =\n changes?.filterChanged || changes?.groupByChanged;\n if (scrollSensitiveChanges && range.from > 0) {\n requestScrollRef.current?.({\n type: \"scroll-end\",\n direction: \"home\",\n });\n }\n dispatchTableModelAction({\n type: \"tableConfig\",\n ...config,\n confirmed,\n });\n });\n }, [dataSource, dispatchTableModelAction]);\n\n const handleCreateCalculatedColumn = useCallback(\n (column: ColumnDescriptor) => {\n dataSource.columns = dataSource.columns.concat(column.name);\n applyTableConfigChange(addColumn(tableConfig, column));\n },\n [dataSource, tableConfig, applyTableConfigChange],\n );\n\n const hideColumns = useCallback(\n (action: ColumnActionHide) => {\n const { columns } = action;\n const hiddenColumns = columns.map((c) => c.name);\n const newTableConfig = {\n ...tableConfig,\n columns: tableConfig.columns.map((col) =>\n hiddenColumns.includes(col.name) ? { ...col, hidden: true } : col,\n ),\n };\n applyTableConfigChange(newTableConfig);\n },\n [tableConfig, applyTableConfigChange],\n );\n\n const pinColumn = useCallback(\n (action: ColumnActionPin) => {\n applyTableConfigChange({\n ...tableConfig,\n columns: updateColumn(tableConfig.columns, {\n ...action.column,\n pin: action.pin,\n }),\n });\n },\n [tableConfig, applyTableConfigChange],\n );\n\n const { showColumnSettingsPanel, showTableSettingsPanel } =\n useTableAndColumnSettings({\n availableColumns:\n availableColumns ??\n tableConfig.columns.map(({ name, serverDataType = \"string\" }) => ({\n name,\n serverDataType,\n })),\n onAvailableColumnsChange,\n onConfigChange: handleConfigEditedInSettingsPanel,\n onCreateCalculatedColumn: handleCreateCalculatedColumn,\n onDataSourceConfigChange: handleDataSourceConfigChanged,\n tableConfig,\n });\n\n const onPersistentColumnOperation = useCallback(\n (action: PersistentColumnAction) => {\n if (isShowColumnSettings(action)) {\n showColumnSettingsPanel(action);\n } else if (isShowTableSettings(action)) {\n showTableSettingsPanel();\n } else {\n switch (action.type) {\n case \"hideColumns\":\n return hideColumns(action);\n case \"pinColumn\":\n return pinColumn(action);\n default:\n dispatchTableModelAction(action);\n }\n }\n },\n [\n dispatchTableModelAction,\n hideColumns,\n pinColumn,\n showColumnSettingsPanel,\n showTableSettingsPanel,\n ],\n );\n\n const handleContextMenuAction = useHandleTableContextMenu({\n dataSource,\n onPersistentColumnOperation,\n });\n\n const handleSort = useCallback(\n (column: ColumnDescriptor, extendSort = false, sortType?: VuuSortType) => {\n if (dataSource) {\n dataSource.sort = toggleOrApplySort(\n dataSource.sort,\n column,\n extendSort,\n sortType,\n );\n }\n },\n [dataSource],\n );\n\n const resizeCells = useRef<HTMLElement[] | undefined>();\n\n const onResizeColumn: TableColumnResizeHandler = useCallback(\n (phase, columnName, width) => {\n const column = columns.find((column) => column.name === columnName);\n if (column) {\n if (phase === \"resize\") {\n resizeCells.current?.forEach((cell) => {\n cell.style.width = `${width}px`;\n });\n } else if (phase === \"end\") {\n resizeCells.current = undefined;\n if (isValidNumber(width)) {\n dispatchTableModelAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n onConfigChange?.(\n stripInternalProperties(\n updateTableConfig(tableConfig, {\n type: \"col-size\",\n column,\n columns,\n width,\n }),\n ),\n );\n }\n } else {\n const byColIndex = `[aria-colindex='${column.ariaColIndex}']`;\n resizeCells.current = Array.from(\n containerRef.current?.querySelectorAll(\n `.vuuTableCell${byColIndex},.vuuTableHeaderCell${byColIndex}`,\n ) ?? [],\n );\n dispatchTableModelAction({\n type: \"resizeColumn\",\n phase,\n column,\n width,\n });\n }\n } else {\n throw Error(\n `useDataTable.handleColumnResize, column ${columnName} not found`,\n );\n }\n },\n [\n columns,\n dispatchTableModelAction,\n onConfigChange,\n tableConfig,\n containerRef,\n ],\n );\n\n const onToggleGroup = useCallback(\n (row: DataSourceRow, column: RuntimeColumnDescriptor) => {\n const isJson = isJsonGroup(column, row, columnMap);\n const key = row[KEY];\n\n if (row[IS_EXPANDED]) {\n dataSource.closeTreeNode(key, true);\n if (isJson) {\n // TODO could this be instigated by an event emitted by the JsonDataSOurce ? \"hide-columns\" ?\n const idx = columns.indexOf(column);\n const rows = dataSource.getRowsAtDepth?.(idx + 1);\n if (rows && !rows.some((row) => row[IS_EXPANDED] || row[IS_LEAF])) {\n dispatchTableModelAction({\n type: \"hideColumns\",\n columns: columns.slice(idx + 2),\n });\n }\n }\n } else {\n dataSource.openTreeNode(key);\n if (isJson) {\n const childRows = dataSource.getChildRows?.(key);\n const idx = columns.indexOf(column) + 1;\n const columnsToShow = [columns[idx]];\n if (childRows && childRows.some((row) => row[IS_LEAF])) {\n columnsToShow.push(columns[idx + 1]);\n }\n if (columnsToShow.some((col) => col.hidden)) {\n dispatchTableModelAction({\n type: \"showColumns\",\n columns: columnsToShow,\n });\n }\n }\n }\n },\n [columnMap, columns, dataSource, dispatchTableModelAction],\n );\n\n // TODO combine with aboue\n const handleToggleGroup = useCallback<GroupToggleHandler>(\n (treeNodeOperation, rowIdx) => {\n if (treeNodeOperation === \"expand\") {\n dataSource.openTreeNode(rowIdx);\n } else {\n dataSource.closeTreeNode(rowIdx);\n }\n },\n [dataSource],\n );\n\n const {\n focusCell,\n focusCellPlaceholderKeyDown,\n focusCellPlaceholderRef,\n setTableBodyRef: tableBodyRef,\n } = useCellFocus({\n cellFocusStateRef,\n containerRef,\n disableFocus,\n requestScroll,\n });\n\n focusCellRef.current = focusCell;\n\n const columnCount = columns.filter((c) => c.hidden !== true).length;\n\n const {\n highlightedIndexRef,\n navigateCell: navigate,\n onFocus: navigationFocus,\n onKeyDown: navigationKeyDown,\n ...containerProps\n } = useKeyboardNavigation({\n cellFocusStateRef,\n columnCount,\n containerRef,\n disableFocus,\n focusCell,\n headerCount: headerState.count,\n highlightedIndex: highlightedIndexProp,\n navigationStyle,\n requestScroll,\n rowCount,\n onHighlight,\n onToggleGroup: handleToggleGroup,\n viewportRange: range,\n viewportRowCount: viewportMeasurements.rowCount,\n });\n\n const {\n onBlur: editingBlur,\n onDoubleClick: editingDoubleClick,\n onKeyDown: editingKeyDown,\n onFocus: editingFocus,\n } = useCellEditing({\n navigate,\n });\n\n const handleFocus = useCallback(\n (e: FocusEvent<HTMLElement>) => {\n navigationFocus();\n if (!e.defaultPrevented) {\n editingFocus(e);\n }\n },\n [editingFocus, navigationFocus],\n );\n\n const onContextMenu = useTableContextMenu({\n columns,\n data,\n dataSource,\n getSelectedRows,\n headerCount: headerState.count,\n });\n\n const onMoveGroupColumn = useCallback(\n (columns: ColumnDescriptor[]) => {\n dataSource.groupBy = columns.map((col) => col.name);\n },\n [dataSource],\n );\n\n const onRemoveGroupColumn = useCallback(\n (column: RuntimeColumnDescriptor) => {\n if (isGroupColumn(column)) {\n dataSource.groupBy = [];\n } else {\n if (dataSource && dataSource.groupBy?.includes(column.name)) {\n dataSource.groupBy = dataSource.groupBy.filter(\n (columnName) => columnName !== column.name,\n );\n }\n }\n },\n [dataSource],\n );\n\n const handleSelectionChange: SelectionChangeHandler = useCallback(\n (selected) => {\n dataSource.select(selected);\n onSelectionChange?.(selected);\n },\n [dataSource, onSelectionChange],\n );\n\n const handleSelect = useCallback<TableRowSelectHandlerInternal>(\n (row) => {\n if (onSelect) {\n onSelect(row === null ? null : rowToObject(row, columnMap));\n }\n },\n [columnMap, onSelect, rowToObject],\n );\n\n const {\n onKeyDown: selectionHookKeyDown,\n onRowClick: selectionHookOnRowClick,\n } = useSelection({\n containerRef,\n defaultSelectedIndexValues: defaultSelectedIndexValues,\n highlightedIndexRef,\n onSelect: handleSelect,\n onSelectionChange: handleSelectionChange,\n selectionModel,\n });\n\n const handleSelectCellBlock = useCallback(\n (cellBlock: TableCellBlock) => {\n handleSelectionChange([]);\n onSelectCellBlock?.(cellBlock);\n },\n [handleSelectionChange, onSelectCellBlock],\n );\n\n const {\n onMouseDown: cellBlockHookMouseDown,\n cellBlock,\n onKeyDown: cellBlockSelectionKeyDown,\n } = useCellBlockSelection({\n allowCellBlockSelection,\n columnCount,\n containerRef,\n onSelectCellBlock: handleSelectCellBlock,\n rowCount,\n });\n\n const handleRowClick = useCallback<TableRowClickHandlerInternal>(\n (evt, row, rangeSelect, keepExistingSelection) => {\n selectionHookOnRowClick(evt, row, rangeSelect, keepExistingSelection);\n onRowClickProp?.(evt, rowToObject(row, columnMap));\n },\n [columnMap, onRowClickProp, rowToObject, selectionHookOnRowClick],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLElement>) => {\n cellBlockSelectionKeyDown?.(e);\n if (!e.defaultPrevented) {\n navigationKeyDown(e);\n }\n if (!e.defaultPrevented) {\n editingKeyDown(e);\n }\n if (!e.defaultPrevented) {\n selectionHookKeyDown(e);\n }\n },\n [\n cellBlockSelectionKeyDown,\n navigationKeyDown,\n editingKeyDown,\n selectionHookKeyDown,\n ],\n );\n\n const onMoveColumn = useCallback(\n (columns: ColumnDescriptor[]) => {\n const newTableConfig = {\n ...tableConfig,\n columns,\n };\n\n tableConfigRef.current = newTableConfig;\n\n console.log(`useTable [onMoveColumn]`);\n\n dispatchTableModelAction({\n availableWidth,\n type: \"init\",\n tableConfig: newTableConfig,\n dataSource,\n });\n onConfigChange?.(stripInternalProperties(newTableConfig));\n },\n [\n availableWidth,\n dataSource,\n dispatchTableModelAction,\n onConfigChange,\n tableConfig,\n ],\n );\n\n const handleDropRow = useCallback(\n (dragDropState) => {\n onDrop?.(dragDropState);\n },\n [onDrop],\n );\n\n const handleDataEdited = useCallback(\n async (editState: DataCellEditEvent) => {\n const {\n editType = \"commit\",\n isValid = true,\n row,\n columnName,\n value,\n } = editState;\n let result = undefined;\n if (editType === \"commit\" && isValid) {\n result = await dataSource.applyEdit(\n row[KEY],\n columnName,\n value as VuuRowDataItemType,\n );\n onDataEditedProp?.({ ...editState, isValid: result === true });\n return result;\n } else {\n onDataEditedProp?.(editState);\n }\n },\n [dataSource, onDataEditedProp],\n );\n\n const handleDragStartRow = useCallback<DragStartHandler>(\n (dragDropState) => {\n const { initialDragElement } = dragDropState;\n const rowIndex =\n getAriaRowIndex(initialDragElement) - headerState.count - 1;\n const row = dataRef.current.find((row) => row[0] === rowIndex);\n if (row) {\n dragDropState.setPayload(row);\n } else {\n // should we abort the operation ?\n }\n onDragStart?.(dragDropState);\n },\n [dataRef, headerState.count, onDragStart],\n );\n\n const onHeaderHeightMeasured = useCallback(\n (height: number, count: number) => {\n setHeaderState({ height, count });\n },\n [],\n );\n\n // Drag Drop rows\n const { onMouseDown: rowDragMouseDown, draggable: draggableRow } =\n useRowDragDrop({\n allowDragDrop,\n containerRef,\n draggableClassName: `vuuTable`,\n id,\n onDragStart: handleDragStartRow,\n onDrop: handleDropRow,\n orientation: \"vertical\",\n itemQuery: \".vuuTableRow\",\n });\n\n const handleMouseDown = useCallback<MouseEventHandler>(\n (evt) => {\n rowDragMouseDown?.(evt);\n if (!evt.isPropagationStopped()) {\n cellBlockHookMouseDown?.(evt);\n }\n },\n [rowDragMouseDown, cellBlockHookMouseDown],\n );\n\n return {\n ...containerProps,\n \"aria-rowcount\": dataSource.size,\n cellBlock,\n columnMap,\n columns,\n data,\n draggableRow,\n focusCellPlaceholderKeyDown,\n focusCellPlaceholderRef,\n getRowOffset,\n handleContextMenuAction,\n headerState,\n headings,\n highlightedIndex: highlightedIndexRef.current,\n menuBuilder,\n onBlur: editingBlur,\n onDoubleClick: editingDoubleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseDown: handleMouseDown,\n onContextMenu,\n onDataEdited: handleDataEdited,\n onHeaderHeightMeasured,\n onMoveColumn,\n onMoveGroupColumn,\n onRemoveGroupColumn,\n onRowClick: handleRowClick,\n onSortColumn: handleSort,\n onResizeColumn,\n onToggleGroup,\n rowClassNameGenerator,\n scrollProps,\n // TODO don't think we need these ...\n tableAttributes,\n tableBodyRef,\n tableConfig,\n viewportMeasurements,\n };\n};\n"],"names":["size","config","tableConfig","range","columns","column","row","cellBlock"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTableAndColumnSettings.js","sources":["../src/useTableAndColumnSettings.ts"],"sourcesContent":["import { DataSourceConfig, SchemaColumn } from \"@vuu-ui/vuu-data-types\";\nimport { useLayoutProviderDispatch } from \"@vuu-ui/vuu-layout\";\nimport {\n ColumnDescriptor,\n ColumnSettingsProps,\n TableConfig,\n TableSettingsProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n VuuShellLocation,\n getCalculatedColumnDetails,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { ColumnActionColumnSettings } from \"./useTableModel\";\n\nexport interface TableAndColumnSettingsHookProps {\n availableColumns: SchemaColumn[];\n onAvailableColumnsChange?: (columns: SchemaColumn[]) => void;\n onConfigChange: (config: TableConfig) => void;\n onCreateCalculatedColumn: (column: ColumnDescriptor) => void;\n onDataSourceConfigChange: (dataSourceConfig: DataSourceConfig) => void;\n tableConfig: TableConfig;\n}\nexport const useTableAndColumnSettings = ({\n availableColumns: availableColumnsProps,\n onAvailableColumnsChange,\n onConfigChange,\n onCreateCalculatedColumn,\n onDataSourceConfigChange,\n tableConfig,\n}: TableAndColumnSettingsHookProps) => {\n const dispatchLayoutAction = useLayoutProviderDispatch();\n const showTableSettingsRef = useRef<() => void>();\n\n const [availableColumns, setAvailableColumns] = useState<SchemaColumn[]>(\n availableColumnsProps,\n );\n\n const showContextPanel = useCallback(\n (\n componentType: string,\n title: string,\n props: TableSettingsProps | ColumnSettingsProps,\n ) => {\n dispatchLayoutAction({\n type: \"set-props\",\n path: `#${VuuShellLocation.ContextPanel}`,\n props: {\n expanded: true,\n content: {\n type: componentType,\n props,\n },\n title,\n },\n });\n },\n [dispatchLayoutAction],\n );\n\n const handleCancelCreateColumn = useCallback(() => {\n requestAnimationFrame(() => {\n showTableSettingsRef.current?.();\n });\n }, []);\n\n const handleCreateCalculatedColumn = useCallback(\n (column: ColumnDescriptor) => {\n const { serverDataType } = getCalculatedColumnDetails(column);\n if (serverDataType) {\n const newAvailableColumns = availableColumns.concat({\n name: column.name,\n serverDataType,\n });\n setAvailableColumns(newAvailableColumns);\n onAvailableColumnsChange?.(newAvailableColumns);\n requestAnimationFrame(() => {\n showTableSettingsRef.current?.();\n });\n onCreateCalculatedColumn(column);\n } else {\n throw Error(\n \"Cannot create calculatec columns without valis serverDataType\",\n );\n }\n },\n [availableColumns, onAvailableColumnsChange, onCreateCalculatedColumn],\n );\n\n const showColumnSettingsPanel = useCallback(\n (action: ColumnActionColumnSettings) => {\n showContextPanel(\"ColumnSettings\", \"Column Settings\", {\n column: action.column,\n onCancelCreateColumn: handleCancelCreateColumn,\n onConfigChange,\n onCreateCalculatedColumn: handleCreateCalculatedColumn,\n tableConfig,\n vuuTable: action.vuuTable,\n } as ColumnSettingsProps);\n },\n [\n handleCancelCreateColumn,\n handleCreateCalculatedColumn,\n onConfigChange,\n showContextPanel,\n tableConfig,\n ],\n );\n\n const handleAddCalculatedColumn = useCallback(() => {\n showColumnSettingsPanel({\n column: {\n name: \"::\",\n serverDataType: \"string\",\n },\n type: \"columnSettings\",\n vuuTable: { module: \"SIMUL\", table: \"instruments\" },\n });\n }, [showColumnSettingsPanel]);\n\n const handleNavigateToColumn = useCallback(\n (columnName: string) => {\n const column = tableConfig.columns.find((c) => c.name === columnName);\n if (column) {\n showColumnSettingsPanel({\n type: \"columnSettings\",\n column,\n //TODO where do we get this from\n vuuTable: { module: \"SIMUL\", table: \"instruments\" },\n });\n }\n },\n [showColumnSettingsPanel, tableConfig.columns],\n );\n\n showTableSettingsRef.current = useCallback(() => {\n showContextPanel(\"TableSettings\", \"DataGrid Settings\", {\n availableColumns:\n availableColumns ??\n tableConfig.columns.map(({ name, serverDataType }) => ({\n name,\n serverDataType,\n })),\n onAddCalculatedColumn: handleAddCalculatedColumn,\n onConfigChange,\n onDataSourceConfigChange,\n onNavigateToColumn: handleNavigateToColumn,\n tableConfig,\n } as TableSettingsProps);\n }, [\n availableColumns,\n handleAddCalculatedColumn,\n handleNavigateToColumn,\n onConfigChange,\n onDataSourceConfigChange,\n showContextPanel,\n tableConfig,\n ]);\n\n return {\n showColumnSettingsPanel,\n showTableSettingsPanel: showTableSettingsRef.current,\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTableAndColumnSettings.js","sources":["../src/useTableAndColumnSettings.ts"],"sourcesContent":["import { DataSourceConfig, SchemaColumn } from \"@vuu-ui/vuu-data-types\";\nimport { useLayoutProviderDispatch } from \"@vuu-ui/vuu-layout\";\nimport {\n ColumnDescriptor,\n ColumnSettingsProps,\n TableConfig,\n TableSettingsProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n VuuShellLocation,\n getCalculatedColumnDetails,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { ColumnActionColumnSettings } from \"./useTableModel\";\n\nexport interface TableAndColumnSettingsHookProps {\n availableColumns: SchemaColumn[];\n onAvailableColumnsChange?: (columns: SchemaColumn[]) => void;\n onConfigChange: (config: TableConfig) => void;\n onCreateCalculatedColumn: (column: ColumnDescriptor) => void;\n onDataSourceConfigChange: (dataSourceConfig: DataSourceConfig) => void;\n tableConfig: TableConfig;\n}\nexport const useTableAndColumnSettings = ({\n availableColumns: availableColumnsProps,\n onAvailableColumnsChange,\n onConfigChange,\n onCreateCalculatedColumn,\n onDataSourceConfigChange,\n tableConfig,\n}: TableAndColumnSettingsHookProps) => {\n const dispatchLayoutAction = useLayoutProviderDispatch();\n const showTableSettingsRef = useRef<() => void>();\n\n const [availableColumns, setAvailableColumns] = useState<SchemaColumn[]>(\n availableColumnsProps,\n );\n\n const showContextPanel = useCallback(\n (\n componentType: string,\n title: string,\n props: TableSettingsProps | ColumnSettingsProps,\n ) => {\n dispatchLayoutAction({\n type: \"set-props\",\n path: `#${VuuShellLocation.ContextPanel}`,\n props: {\n expanded: true,\n content: {\n type: componentType,\n props,\n },\n title,\n },\n });\n },\n [dispatchLayoutAction],\n );\n\n const handleCancelCreateColumn = useCallback(() => {\n requestAnimationFrame(() => {\n showTableSettingsRef.current?.();\n });\n }, []);\n\n const handleCreateCalculatedColumn = useCallback(\n (column: ColumnDescriptor) => {\n const { serverDataType } = getCalculatedColumnDetails(column);\n if (serverDataType) {\n const newAvailableColumns = availableColumns.concat({\n name: column.name,\n serverDataType,\n });\n setAvailableColumns(newAvailableColumns);\n onAvailableColumnsChange?.(newAvailableColumns);\n requestAnimationFrame(() => {\n showTableSettingsRef.current?.();\n });\n onCreateCalculatedColumn(column);\n } else {\n throw Error(\n \"Cannot create calculatec columns without valis serverDataType\",\n );\n }\n },\n [availableColumns, onAvailableColumnsChange, onCreateCalculatedColumn],\n );\n\n const showColumnSettingsPanel = useCallback(\n (action: ColumnActionColumnSettings) => {\n showContextPanel(\"ColumnSettings\", \"Column Settings\", {\n column: action.column,\n onCancelCreateColumn: handleCancelCreateColumn,\n onConfigChange,\n onCreateCalculatedColumn: handleCreateCalculatedColumn,\n tableConfig,\n vuuTable: action.vuuTable,\n } as ColumnSettingsProps);\n },\n [\n handleCancelCreateColumn,\n handleCreateCalculatedColumn,\n onConfigChange,\n showContextPanel,\n tableConfig,\n ],\n );\n\n const handleAddCalculatedColumn = useCallback(() => {\n showColumnSettingsPanel({\n column: {\n name: \"::\",\n serverDataType: \"string\",\n },\n type: \"columnSettings\",\n vuuTable: { module: \"SIMUL\", table: \"instruments\" },\n });\n }, [showColumnSettingsPanel]);\n\n const handleNavigateToColumn = useCallback(\n (columnName: string) => {\n const column = tableConfig.columns.find((c) => c.name === columnName);\n if (column) {\n showColumnSettingsPanel({\n type: \"columnSettings\",\n column,\n //TODO where do we get this from\n vuuTable: { module: \"SIMUL\", table: \"instruments\" },\n });\n }\n },\n [showColumnSettingsPanel, tableConfig.columns],\n );\n\n showTableSettingsRef.current = useCallback(() => {\n showContextPanel(\"TableSettings\", \"DataGrid Settings\", {\n availableColumns:\n availableColumns ??\n tableConfig.columns.map(({ name, serverDataType }) => ({\n name,\n serverDataType,\n })),\n onAddCalculatedColumn: handleAddCalculatedColumn,\n onConfigChange,\n onDataSourceConfigChange,\n onNavigateToColumn: handleNavigateToColumn,\n tableConfig,\n } as TableSettingsProps);\n }, [\n availableColumns,\n handleAddCalculatedColumn,\n handleNavigateToColumn,\n onConfigChange,\n onDataSourceConfigChange,\n showContextPanel,\n tableConfig,\n ]);\n\n return {\n showColumnSettingsPanel,\n showTableSettingsPanel: showTableSettingsRef.current,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTableContextMenu.js","sources":["../src/useTableContextMenu.ts"],"sourcesContent":["import { DataSource, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useContextMenu as usePopupContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { buildColumnMap } from \"@vuu-ui/vuu-utils\";\nimport { getAriaColIndex, getAriaRowIndex } from \"./table-dom-utils\";\nimport { MouseEvent, useCallback } from \"react\";\n\nexport interface TableContextMenuHookProps {\n columns: RuntimeColumnDescriptor[];\n data: DataSourceRow[];\n dataSource: DataSource;\n getSelectedRows: () => DataSourceRow[];\n // TODO can we eliminate this it is only needed to convert aria row index to actual row index\n headerCount: number;\n}\n\nconst NO_ROWS = [] as const;\n\nexport const useTableContextMenu = ({\n columns,\n data,\n dataSource,\n getSelectedRows,\n headerCount,\n}: TableContextMenuHookProps) => {\n const [showContextMenu] = usePopupContextMenu();\n\n const onContextMenu = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const cellEl = target?.closest<HTMLElement>(\"div[role='cell']\");\n const rowEl = target?.closest<HTMLElement>(\"div[role='row']\");\n if (cellEl && rowEl) {\n const { selectedRowsCount } = dataSource;\n const columnMap = buildColumnMap(columns);\n const rowIndex = getAriaRowIndex(rowEl) - headerCount - 1;\n const cellIndex = getAriaColIndex(cellEl) - 1;\n const row = data.find(([idx]) => idx === rowIndex);\n const columnName = columns[cellIndex];\n // TODO does it really make sense to collect selected rows ?\n // We only have access to rows in local cache\n showContextMenu(evt, \"grid\", {\n columnMap,\n columnName,\n columns,\n row,\n selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),\n viewport: dataSource.viewport,\n });\n }\n },\n [columns, data, dataSource, getSelectedRows, headerCount, showContextMenu],\n );\n\n return onContextMenu;\n};\n"],"names":["usePopupContextMenu"],"mappings":";;;;;AAgBA,MAAM,UAAU,EAAC,CAAA;AAEV,MAAM,sBAAsB,CAAC;AAAA,EAClC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AACF,CAAiC,KAAA;AAC/B,EAAM,MAAA,CAAC,eAAe,CAAA,GAAIA,cAAoB,EAAA,CAAA;AAE9C,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,GAAiC,KAAA;AAChC,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AACnB,MAAM,MAAA,MAAA,GAAS,MAAQ,EAAA,OAAA,CAAqB,kBAAkB,CAAA,CAAA;AAC9D,MAAM,MAAA,KAAA,GAAQ,MAAQ,EAAA,OAAA,CAAqB,iBAAiB,CAAA,CAAA;AAC5D,MAAA,IAAI,UAAU,KAAO,EAAA;AACnB,QAAM,MAAA,EAAE,mBAAsB,GAAA,UAAA,CAAA;AAC9B,QAAM,MAAA,SAAA,GAAY,eAAe,OAAO,CAAA,CAAA;AACxC,QAAA,MAAM,QAAW,GAAA,eAAA,CAAgB,KAAK,CAAA,GAAI,WAAc,GAAA,CAAA,CAAA;AACxD,QAAM,MAAA,SAAA,GAAY,eAAgB,CAAA,MAAM,CAAI,GAAA,CAAA,CAAA;AAC5C,QAAM,MAAA,GAAA,GAAM,KAAK,IAAK,CAAA,CAAC,CAAC,GAAG,CAAA,KAAM,QAAQ,QAAQ,CAAA,CAAA;AACjD,QAAM,MAAA,UAAA,GAAa,QAAQ,SAAS,CAAA,CAAA;AAGpC,QAAA,eAAA,CAAgB,KAAK,MAAQ,EAAA;AAAA,UAC3B,SAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAA;AAAA,UACA,GAAA;AAAA,UACA,YAAc,EAAA,iBAAA,KAAsB,CAAI,GAAA,OAAA,GAAU,eAAgB,EAAA;AAAA,UAClE,UAAU,UAAW,CAAA,QAAA;AAAA,SACtB,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,IACA,CAAC,OAAS,EAAA,IAAA,EAAM,UAAY,EAAA,eAAA,EAAiB,aAAa,eAAe,CAAA;AAAA,GAC3E,CAAA;AAEA,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"useTableContextMenu.js","sources":["../src/useTableContextMenu.ts"],"sourcesContent":["import { DataSource, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useContextMenu as usePopupContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { buildColumnMap } from \"@vuu-ui/vuu-utils\";\nimport { getAriaColIndex, getAriaRowIndex } from \"./table-dom-utils\";\nimport { MouseEvent, useCallback } from \"react\";\n\nexport interface TableContextMenuHookProps {\n columns: RuntimeColumnDescriptor[];\n data: DataSourceRow[];\n dataSource: DataSource;\n getSelectedRows: () => DataSourceRow[];\n // TODO can we eliminate this it is only needed to convert aria row index to actual row index\n headerCount: number;\n}\n\nconst NO_ROWS = [] as const;\n\nexport const useTableContextMenu = ({\n columns,\n data,\n dataSource,\n getSelectedRows,\n headerCount,\n}: TableContextMenuHookProps) => {\n const [showContextMenu] = usePopupContextMenu();\n\n const onContextMenu = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const cellEl = target?.closest<HTMLElement>(\"div[role='cell']\");\n const rowEl = target?.closest<HTMLElement>(\"div[role='row']\");\n if (cellEl && rowEl) {\n const { selectedRowsCount } = dataSource;\n const columnMap = buildColumnMap(columns);\n const rowIndex = getAriaRowIndex(rowEl) - headerCount - 1;\n const cellIndex = getAriaColIndex(cellEl) - 1;\n const row = data.find(([idx]) => idx === rowIndex);\n const columnName = columns[cellIndex];\n // TODO does it really make sense to collect selected rows ?\n // We only have access to rows in local cache\n showContextMenu(evt, \"grid\", {\n columnMap,\n columnName,\n columns,\n row,\n selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),\n viewport: dataSource.viewport,\n });\n }\n },\n [columns, data, dataSource, getSelectedRows, headerCount, showContextMenu],\n );\n\n return onContextMenu;\n};\n"],"names":["usePopupContextMenu"],"mappings":";;;;;AAgBA,MAAM,UAAU,EAAC;AAEV,MAAM,sBAAsB,CAAC;AAAA,EAClC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAiC,KAAA;AAC/B,EAAM,MAAA,CAAC,eAAe,CAAA,GAAIA,cAAoB,EAAA;AAE9C,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,GAAiC,KAAA;AAChC,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA;AACnB,MAAM,MAAA,MAAA,GAAS,MAAQ,EAAA,OAAA,CAAqB,kBAAkB,CAAA;AAC9D,MAAM,MAAA,KAAA,GAAQ,MAAQ,EAAA,OAAA,CAAqB,iBAAiB,CAAA;AAC5D,MAAA,IAAI,UAAU,KAAO,EAAA;AACnB,QAAM,MAAA,EAAE,mBAAsB,GAAA,UAAA;AAC9B,QAAM,MAAA,SAAA,GAAY,eAAe,OAAO,CAAA;AACxC,QAAA,MAAM,QAAW,GAAA,eAAA,CAAgB,KAAK,CAAA,GAAI,WAAc,GAAA,CAAA;AACxD,QAAM,MAAA,SAAA,GAAY,eAAgB,CAAA,MAAM,CAAI,GAAA,CAAA;AAC5C,QAAM,MAAA,GAAA,GAAM,KAAK,IAAK,CAAA,CAAC,CAAC,GAAG,CAAA,KAAM,QAAQ,QAAQ,CAAA;AACjD,QAAM,MAAA,UAAA,GAAa,QAAQ,SAAS,CAAA;AAGpC,QAAA,eAAA,CAAgB,KAAK,MAAQ,EAAA;AAAA,UAC3B,SAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAA;AAAA,UACA,GAAA;AAAA,UACA,YAAc,EAAA,iBAAA,KAAsB,CAAI,GAAA,OAAA,GAAU,eAAgB,EAAA;AAAA,UAClE,UAAU,UAAW,CAAA;AAAA,SACtB,CAAA;AAAA;AACH,KACF;AAAA,IACA,CAAC,OAAS,EAAA,IAAA,EAAM,UAAY,EAAA,eAAA,EAAiB,aAAa,eAAe;AAAA,GAC3E;AAEA,EAAO,OAAA,aAAA;AACT;;;;"}
@@ -1,4 +1,4 @@
1
- import { logger, subscribedOnly, applyWidthToColumns, isPinned, sortPinnedColumns, getTableHeadings, applyGroupByToColumns, applySortToColumns, existingSort, removeSort, applyFilterToColumns, isFilteredColumn, stripFilterFromColumns, applyRuntimeColumnWidthsToConfig, getColumnLabel, getCellRenderer, getColumnHeaderContentRenderer, getColumnHeaderLabelRenderer, hasValidationRules, getValueFormatter, isGroupColumn, replaceColumn } from '@vuu-ui/vuu-utils';
1
+ import { logger, subscribedOnly, applyWidthToColumns, isPinned, sortPinnedColumns, getTableHeadings, checkConfirmationPending, applyGroupByToColumns, isGroupColumn, applySortToColumns, existingSort, removeSort, applyFilterToColumns, isFilteredColumn, stripFilterFromColumns, applyRuntimeColumnWidthsToConfig, getColumnLabel, getCellRenderer, getColumnHeaderContentRenderer, getColumnHeaderLabelRenderer, hasValidationRules, getValueFormatter, replaceColumn } from '@vuu-ui/vuu-utils';
2
2
  import { useReducer } from 'react';
3
3
  import { buildValidationChecker } from '@vuu-ui/vuu-data-react';
4
4
 
@@ -45,7 +45,7 @@ const columnReducer = (state, action) => {
45
45
  )
46
46
  });
47
47
  } else {
48
- return init(action);
48
+ return init(action, state);
49
49
  }
50
50
  }
51
51
  case "moveColumn":
@@ -89,19 +89,25 @@ const useTableModel = (tableConfigProp, dataSource, selectionModel, availableWid
89
89
  tableConfig
90
90
  };
91
91
  };
92
- function init({
93
- availableWidth,
94
- dataSource,
95
- selectionModel,
96
- tableConfig
97
- }) {
92
+ function init({ availableWidth, dataSource, selectionModel, tableConfig }, previousConfig) {
98
93
  const { columns, ...tableAttributes } = tableConfig;
99
94
  const { config: dataSourceConfig, tableSchema } = dataSource;
100
95
  const toRuntimeColumnDescriptor = columnDescriptorToRuntimeColumDescriptor(
101
96
  tableAttributes,
102
97
  tableSchema
103
98
  );
104
- const runtimeColumns = columns.filter(subscribedOnly(dataSourceConfig?.columns)).map(toRuntimeColumnDescriptor);
99
+ const runtimeColumns = [];
100
+ let colIndex = 1;
101
+ for (const column of columns.filter(
102
+ subscribedOnly(dataSourceConfig?.columns)
103
+ )) {
104
+ runtimeColumns.push(
105
+ toRuntimeColumnDescriptor(column, column.hidden ? -1 : colIndex)
106
+ );
107
+ if (!column.hidden) {
108
+ colIndex += 1;
109
+ }
110
+ }
105
111
  if (selectionModel === "checkbox") {
106
112
  runtimeColumns.splice(
107
113
  0,
@@ -126,7 +132,8 @@ function init({
126
132
  const { columns: _, ...rest } = dataSourceConfig;
127
133
  state = updateTableConfig(state, {
128
134
  type: "tableConfig",
129
- ...rest
135
+ ...rest,
136
+ confirmed: checkConfirmationPending(previousConfig)
130
137
  });
131
138
  }
132
139
  return state;
@@ -139,34 +146,36 @@ const getLabel = (label, columnFormatHeader) => {
139
146
  }
140
147
  return label;
141
148
  };
142
- const columnDescriptorToRuntimeColumDescriptor = (tableAttributes, tableSchema) => (column, index) => {
149
+ const columnDescriptorToRuntimeColumDescriptor = (tableAttributes, tableSchema) => (column, ariaColIndex) => {
143
150
  const { columnDefaultWidth = DEFAULT_COLUMN_WIDTH, columnFormatHeader } = tableAttributes;
144
151
  const serverDataType = getDataType(column, tableSchema);
145
152
  const {
146
153
  align = getDefaultAlignment(serverDataType),
147
154
  name,
148
155
  label = getColumnLabel(column),
156
+ source = "server",
149
157
  width = columnDefaultWidth,
150
158
  ...rest
151
159
  } = column;
152
160
  const runtimeColumnWithDefaults = {
153
161
  ...rest,
154
162
  align,
163
+ ariaColIndex,
155
164
  CellRenderer: getCellRenderer(column),
156
165
  HeaderCellContentRenderer: getColumnHeaderContentRenderer(column),
157
166
  HeaderCellLabelRenderer: getColumnHeaderLabelRenderer(column),
158
167
  clientSideEditValidationCheck: hasValidationRules(column.type) ? buildValidationChecker(column.type.rules) : void 0,
159
- index: index + 1,
160
168
  label: getLabel(label, columnFormatHeader),
161
169
  name,
162
- originalIdx: index,
170
+ originalIdx: ariaColIndex,
163
171
  serverDataType,
172
+ source,
164
173
  valueFormatter: getValueFormatter(column, serverDataType),
165
174
  width
166
175
  };
167
176
  if (isGroupColumn(runtimeColumnWithDefaults)) {
168
177
  runtimeColumnWithDefaults.columns = runtimeColumnWithDefaults.columns.map(
169
- (col) => columnDescriptorToRuntimeColumDescriptor(tableAttributes)(col, index)
178
+ (col) => columnDescriptorToRuntimeColumDescriptor(tableAttributes)(col, -1)
170
179
  );
171
180
  }
172
181
  return runtimeColumnWithDefaults;
@@ -323,25 +332,23 @@ function updateTableConfig(state, {
323
332
  sort
324
333
  }) {
325
334
  let result = state;
335
+ const { availableWidth, columnLayout = "static" } = state;
326
336
  if (groupBy.length > 0) {
327
- const groupedColumns = applyGroupByToColumns(
328
- result.columns,
337
+ const groupedColumns = applyGroupByToColumns({
338
+ columns: result.columns,
329
339
  groupBy,
330
- confirmed
331
- );
332
- const { availableWidth, columnLayout = "static" } = state;
340
+ confirmed,
341
+ availableWidth
342
+ });
333
343
  const columns = applyWidthToColumns(groupedColumns, {
334
344
  availableWidth,
335
345
  columnLayout
336
346
  });
337
- console.log(`useTableModel.updateTableConfig applyGroupBy`, {
338
- groupBy
339
- });
340
347
  result = {
341
348
  ...state,
342
349
  columns
343
350
  };
344
- }
351
+ } else if (isGroupColumn(result.columns[0]) && confirmed === false) ;
345
352
  if (sort.sortDefs.length > 0) {
346
353
  result = {
347
354
  ...state,