@vuu-ui/vuu-table 0.12.1 → 0.13.0

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 (55) hide show
  1. package/cjs/Table.js +1 -1
  2. package/cjs/Table.js.map +1 -1
  3. package/cjs/bulk-edit/BulkEditPanel.js.map +1 -1
  4. package/cjs/cell-block/useCellBlockSelection.js.map +1 -1
  5. package/cjs/column-resizing/useTableColumnResize.js.map +1 -1
  6. package/cjs/table-dom-utils.js.map +1 -1
  7. package/cjs/table-header/TableHeader.js +1 -0
  8. package/cjs/table-header/TableHeader.js.map +1 -1
  9. package/cjs/useCellFocus.js +3 -1
  10. package/cjs/useCellFocus.js.map +1 -1
  11. package/cjs/useHighlighting.js.map +1 -1
  12. package/cjs/useKeyboardNavigation.js +1 -1
  13. package/cjs/useKeyboardNavigation.js.map +1 -1
  14. package/cjs/useSelection.js.map +1 -1
  15. package/cjs/useTable.js +3 -3
  16. package/cjs/useTable.js.map +1 -1
  17. package/cjs/useTableAndColumnSettings.js +1 -1
  18. package/cjs/useTableAndColumnSettings.js.map +1 -1
  19. package/cjs/useTableModel.js +2 -2
  20. package/cjs/useTableModel.js.map +1 -1
  21. package/esm/Table.js +1 -1
  22. package/esm/Table.js.map +1 -1
  23. package/esm/bulk-edit/BulkEditPanel.js.map +1 -1
  24. package/esm/cell-block/useCellBlockSelection.js.map +1 -1
  25. package/esm/column-resizing/useTableColumnResize.js.map +1 -1
  26. package/esm/table-dom-utils.js.map +1 -1
  27. package/esm/table-header/TableHeader.js +1 -0
  28. package/esm/table-header/TableHeader.js.map +1 -1
  29. package/esm/useCellFocus.js +3 -1
  30. package/esm/useCellFocus.js.map +1 -1
  31. package/esm/useHighlighting.js.map +1 -1
  32. package/esm/useKeyboardNavigation.js +1 -1
  33. package/esm/useKeyboardNavigation.js.map +1 -1
  34. package/esm/useSelection.js.map +1 -1
  35. package/esm/useTable.js +3 -3
  36. package/esm/useTable.js.map +1 -1
  37. package/esm/useTableAndColumnSettings.js +1 -1
  38. package/esm/useTableAndColumnSettings.js.map +1 -1
  39. package/esm/useTableModel.js +2 -2
  40. package/esm/useTableModel.js.map +1 -1
  41. package/package.json +13 -13
  42. package/types/bulk-edit/BulkEditPanel.d.ts +2 -2
  43. package/types/bulk-edit/useBulkEditRow.d.ts +1 -1
  44. package/types/cell-block/useCellBlockSelection.d.ts +2 -2
  45. package/types/column-resizing/useTableColumnResize.d.ts +1 -1
  46. package/types/table-dom-utils.d.ts +3 -3
  47. package/types/table-header/useTableHeader.d.ts +1 -1
  48. package/types/useCellFocus.d.ts +3 -3
  49. package/types/useControlledTableNavigation.d.ts +1 -1
  50. package/types/useDataSource.d.ts +1 -1
  51. package/types/useHighlighting.d.ts +2 -1
  52. package/types/useKeyboardNavigation.d.ts +2 -2
  53. package/types/useSelection.d.ts +3 -3
  54. package/types/useTable.d.ts +3 -3
  55. package/types/useTableModel.d.ts +3 -15
@@ -1 +1 @@
1
- {"version":3,"file":"useKeyboardNavigation.js","sources":["../src/useKeyboardNavigation.ts"],"sourcesContent":["import { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { PageKey, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { useControlled } from \"@salt-ds/core\";\nimport {\n KeyboardEvent,\n MouseEvent,\n MutableRefObject,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { TableNavigationStyle } from \"./Table\";\nimport {\n NavigationKey,\n cellDropdownShowing,\n closestRowIndex,\n getAriaCellPos,\n getFocusedCell,\n getNextCellPos,\n getTreeNodeOperation,\n getLevelUp as getLevelUp,\n} from \"./table-dom-utils\";\nimport { ScrollRequestHandler } from \"./useTableScroll\";\nimport { FocusCell } from \"./useCellFocus\";\nimport { CellPos } from \"@vuu-ui/vuu-table-types\";\nimport { CellFocusState } from \"./CellFocusState\";\n\nconst rowNavigationKeys = new Set<NavigationKey>([\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"ArrowDown\",\n \"ArrowUp\",\n]);\n\nconst CellLocator =\n \".vuuTableCell,.vuuTableHeaderCell,.vuuTableGroupHeaderCell\";\n\nconst CellControlLocator = \".vuuColumnMenu,.vuuColumnHeaderPill\";\n\nconst cellNavigationKeys = new Set(rowNavigationKeys);\ncellNavigationKeys.add(\"ArrowLeft\");\ncellNavigationKeys.add(\"ArrowRight\");\n\nexport const isNavigationKey = (\n key: string,\n navigationStyle: TableNavigationStyle,\n): key is NavigationKey => {\n switch (navigationStyle) {\n case \"cell\":\n case \"tree\":\n return cellNavigationKeys.has(key as NavigationKey);\n case \"row\":\n return rowNavigationKeys.has(key as NavigationKey);\n default:\n return false;\n }\n};\n\nconst focusControlWithinCell = (e: KeyboardEvent, el: HTMLElement | null) => {\n if (e.shiftKey && e.key.match(/Arrow(Left|Right)/)) {\n if (el?.classList.contains(\"vuuTableHeaderCell\")) {\n const menuButton = el?.querySelector<HTMLButtonElement>(\".vuuColumnMenu\");\n if (menuButton) {\n menuButton.focus();\n return true;\n }\n } else if (el?.classList.contains(\"vuuTableGroupHeaderCell\")) {\n const headerPill = el?.querySelector<HTMLButtonElement>(\n \".vuuColumnHeaderPill\",\n );\n if (headerPill) {\n headerPill.focus();\n return true;\n }\n } else if (el?.classList.contains(\"vuuColumnHeaderPill\")) {\n const nextPill = el.parentElement?.nextElementSibling\n ?.firstChild as HTMLElement;\n if (nextPill?.classList.contains(\"vuuColumnHeaderPill\")) {\n nextPill.focus();\n return true;\n } else {\n const removeButton = queryClosest(\n el,\n \".vuuTableGroupHeaderCell\",\n true,\n ).querySelector(\".vuuTableGroupHeaderCell-removeAll\") as HTMLElement;\n if (removeButton) {\n removeButton.focus();\n return true;\n }\n }\n }\n }\n return false;\n};\n\nconst PageKeys = [\"Home\", \"End\", \"PageUp\", \"PageDown\"];\nexport const isPagingKey = (key: string): key is PageKey =>\n PageKeys.includes(key);\n\nexport type GroupToggleHandler = (\n treeNodeOperation: \"expand\" | \"collapse\",\n rowIndex: number,\n) => void;\n\nexport interface NavigationHookProps {\n cellFocusStateRef: MutableRefObject<CellFocusState>;\n containerRef: RefObject<HTMLElement>;\n columnCount?: number;\n headerCount: number;\n defaultHighlightedIndex?: number;\n disableFocus?: boolean;\n disableHighlightOnFocus?: boolean;\n focusCell: FocusCell;\n highlightedIndex?: number;\n label?: string;\n navigationStyle: TableNavigationStyle;\n viewportRange: VuuRange;\n onHighlight?: (idx: number) => void;\n onToggleGroup: GroupToggleHandler;\n requestScroll?: ScrollRequestHandler;\n restoreLastFocus?: boolean;\n rowCount?: number;\n selected?: unknown;\n viewportRowCount: number;\n}\n\nexport const useKeyboardNavigation = ({\n cellFocusStateRef,\n columnCount = 0,\n containerRef,\n defaultHighlightedIndex,\n disableHighlightOnFocus,\n focusCell,\n headerCount,\n highlightedIndex: highlightedIndexProp,\n navigationStyle,\n requestScroll,\n onHighlight,\n onToggleGroup,\n rowCount = 0,\n viewportRowCount,\n}: NavigationHookProps) => {\n // Keep this in sync with state value. This can be used by functions that need\n // to reference highlightedIndex at call time but do not need to be regenerated\n // every time it changes (i.e keep highlightedIndex out of their dependency\n // arrays, as it can update frequently)\n const highlightedIndexRef = useRef<number | undefined>();\n\n const [highlightedIndex, setHighlightedIdx] = useControlled({\n controlled: highlightedIndexProp,\n default: defaultHighlightedIndex,\n name: \"UseKeyboardNavigation\",\n });\n highlightedIndexRef.current = highlightedIndex;\n\n // We use aria row index for tracking rows\n const maxRowIndex = rowCount + headerCount;\n\n const setHighlightedIndex = useCallback(\n (idx: number) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n highlightedIndexRef.current = idx;\n },\n [onHighlight, setHighlightedIdx],\n );\n\n const setActiveCell = useCallback(\n (rowIdx: number, colIdx: number, fromKeyboard = false) => {\n const pos: CellPos = [rowIdx, colIdx];\n if (navigationStyle === \"row\") {\n setHighlightedIdx(rowIdx);\n } else {\n focusCell(pos, fromKeyboard);\n }\n },\n [focusCell, navigationStyle, setHighlightedIdx],\n );\n\n const nextPageItemIdx = useCallback(\n (\n key: \"PageDown\" | \"PageUp\" | \"Home\" | \"End\",\n [rowIdx, colIdx]: CellPos,\n ): Promise<CellPos> =>\n new Promise((resolve) => {\n let newRowIdx = rowIdx;\n const { current: focusState } = cellFocusStateRef;\n switch (key) {\n case \"PageDown\": {\n newRowIdx = Math.min(rowCount - 1, rowIdx + viewportRowCount);\n if (newRowIdx !== rowIdx) {\n focusState.cellPos = [newRowIdx, colIdx];\n requestScroll?.({ type: \"scroll-page\", direction: \"down\" });\n }\n break;\n }\n case \"PageUp\": {\n newRowIdx = Math.max(0, rowIdx - viewportRowCount);\n if (newRowIdx !== rowIdx) {\n focusState.cellPos = [newRowIdx, colIdx];\n requestScroll?.({ type: \"scroll-page\", direction: \"up\" });\n }\n break;\n }\n case \"Home\": {\n newRowIdx = headerCount + 1;\n if (newRowIdx !== rowIdx) {\n focusState.cellPos = [newRowIdx, colIdx];\n requestScroll?.({ type: \"scroll-end\", direction: \"home\" });\n }\n break;\n }\n case \"End\": {\n newRowIdx = rowCount + headerCount;\n if (newRowIdx !== rowIdx) {\n focusState.cellPos = [newRowIdx, colIdx];\n requestScroll?.({ type: \"scroll-end\", direction: \"end\" });\n }\n break;\n }\n }\n // Introduce a delay to allow the scroll operation to complete,\n // which will trigger a range reset and rerender of rows. We\n // might need to tweak how this works. If we introduce too big\n // a delay, we risk seeing the newly rendered rows, with the focus\n // still on the old cell, which will be apparent as a brief flash\n // of the old cell focus before switching to correct cell. If we were\n // to change the way re assign keys such that we can guarantee that\n // when we page down, rows in same position get same keys, then same\n // cell would be focussed in new page as previous and issue would not\n // arise.\n setTimeout(() => {\n resolve([newRowIdx, colIdx]);\n }, 35);\n }),\n [cellFocusStateRef, headerCount, requestScroll, rowCount, viewportRowCount],\n );\n\n const handleFocus = useCallback(() => {\n if (disableHighlightOnFocus !== true) {\n if (containerRef.current?.contains(document.activeElement)) {\n // IF focus arrives via keyboard, a cell will have received focus,\n // we handle that here. If focus arrives via click on a cell with\n // no tabindex (i.e all cells except one) we leave that to the\n // click handler.\n const focusedCell = getFocusedCell(document.activeElement);\n if (focusedCell) {\n cellFocusStateRef.current.cell = focusedCell;\n if (navigationStyle === \"row\") {\n setHighlightedIdx(cellFocusStateRef.current.cellPos?.[0]);\n }\n }\n }\n }\n }, [\n disableHighlightOnFocus,\n containerRef,\n cellFocusStateRef,\n navigationStyle,\n setHighlightedIdx,\n ]);\n\n const navigateChildItems = useCallback(\n async (\n navigationStyle: \"cell\" | \"tree\" = \"cell\",\n key: NavigationKey,\n shiftKey = false,\n ): Promise<undefined> => {\n const { cellPos } = cellFocusStateRef.current;\n if (cellPos === undefined) {\n throw Error(\"navigateChildItems called before cellPos is set\");\n }\n const [rowIdx, colIdx] = cellPos;\n let nextRowIdx = -1,\n nextColIdx = -1;\n\n if (isPagingKey(key)) {\n [nextRowIdx, nextColIdx] = await nextPageItemIdx(key, cellPos);\n } else {\n const treeNodeOperation = getTreeNodeOperation(\n containerRef,\n navigationStyle,\n cellPos,\n key,\n shiftKey,\n );\n if (\n treeNodeOperation === \"expand\" ||\n treeNodeOperation === \"collapse\"\n ) {\n onToggleGroup(treeNodeOperation, rowIdx - headerCount - 1);\n } else if (treeNodeOperation === \"level-up\") {\n [nextRowIdx, nextColIdx] = getLevelUp(containerRef, cellPos);\n } else {\n [nextRowIdx, nextColIdx] = getNextCellPos(\n key,\n cellPos,\n columnCount,\n maxRowIndex,\n );\n }\n }\n\n if (nextRowIdx !== rowIdx || nextColIdx !== colIdx) {\n setActiveCell(nextRowIdx, nextColIdx, true);\n setHighlightedIndex(nextRowIdx);\n }\n },\n [\n cellFocusStateRef,\n nextPageItemIdx,\n containerRef,\n onToggleGroup,\n headerCount,\n columnCount,\n maxRowIndex,\n setActiveCell,\n setHighlightedIndex,\n ],\n );\n\n const scrollRowIntoViewIfNecessary = useCallback(\n (rowIndex: number) => {\n requestScroll?.({ type: \"scroll-row\", rowIndex });\n },\n [requestScroll],\n );\n\n const moveHighlightedRow = useCallback(\n async (key: NavigationKey) => {\n const { current: highlighted } = highlightedIndexRef;\n const [nextRowIdx] = isPagingKey(key)\n ? await nextPageItemIdx(key, [highlighted ?? -1, 0])\n : getNextCellPos(key, [highlighted ?? -1, 0], columnCount, maxRowIndex);\n if (nextRowIdx !== highlighted) {\n setHighlightedIndex(nextRowIdx);\n // TO(DO make this a scroll request)\n scrollRowIntoViewIfNecessary(nextRowIdx);\n }\n },\n [\n columnCount,\n maxRowIndex,\n nextPageItemIdx,\n scrollRowIntoViewIfNecessary,\n setHighlightedIndex,\n ],\n );\n\n useEffect(() => {\n if (highlightedIndexProp !== undefined && highlightedIndexProp !== -1) {\n requestAnimationFrame(() => {\n // deferred call, ensuring table has fully rendered\n scrollRowIntoViewIfNecessary(highlightedIndexProp);\n });\n }\n }, [highlightedIndexProp, scrollRowIntoViewIfNecessary]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n const cell = queryClosest<HTMLDivElement>(\n e.target,\n `${CellLocator},${CellControlLocator}`,\n );\n if (cellDropdownShowing(cell)) {\n return;\n }\n if (rowCount > 0 && isNavigationKey(e.key, navigationStyle)) {\n e.preventDefault();\n e.stopPropagation();\n if (navigationStyle === \"row\") {\n moveHighlightedRow(e.key);\n } else if (navigationStyle !== \"none\") {\n if (!focusControlWithinCell(e, cell)) {\n navigateChildItems(navigationStyle, e.key, e.shiftKey);\n }\n }\n }\n },\n [rowCount, navigationStyle, moveHighlightedRow, navigateChildItems],\n );\n\n const handleClick = useCallback(\n // Might not be a cell e.g the Settings button\n (evt: MouseEvent) => {\n const target = queryClosest<HTMLDivElement>(evt.target, CellLocator);\n const focusedCell = getFocusedCell(target);\n if (focusedCell) {\n const [rowIdx, colIdx] = getAriaCellPos(focusedCell);\n setActiveCell(rowIdx, colIdx);\n }\n },\n [setActiveCell],\n );\n\n const handleMouseLeave = useCallback(() => {\n setHighlightedIndex(-1);\n }, [setHighlightedIndex]);\n\n const handleMouseMove = useCallback(\n (evt: MouseEvent) => {\n const rowIdx = closestRowIndex(evt.target as HTMLElement);\n if (rowIdx !== -1 && rowIdx !== highlightedIndexRef.current) {\n setHighlightedIndex(rowIdx);\n }\n },\n [setHighlightedIndex],\n );\n\n /**\n * used when editing cells\n */\n const navigateCell = useCallback(() => {\n navigateChildItems(\"cell\", \"ArrowDown\");\n }, [navigateChildItems]);\n\n return {\n highlightedIndexRef,\n navigateCell,\n onClick: handleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseLeave: navigationStyle === \"row\" ? handleMouseLeave : undefined,\n onMouseMove: navigationStyle === \"row\" ? handleMouseMove : undefined,\n };\n};\n"],"names":["queryClosest","useRef","useControlled","useCallback","getFocusedCell","navigationStyle","getTreeNodeOperation","getLevelUp","getNextCellPos","useEffect","cellDropdownShowing","getAriaCellPos","closestRowIndex"],"mappings":"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"}
1
+ {"version":3,"file":"useKeyboardNavigation.js","sources":["../src/useKeyboardNavigation.ts"],"sourcesContent":["import { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { PageKey, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { useControlled } from \"@salt-ds/core\";\nimport {\n KeyboardEvent,\n MouseEvent,\n MutableRefObject,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { TableNavigationStyle } from \"./Table\";\nimport {\n NavigationKey,\n cellDropdownShowing,\n closestRowIndex,\n getAriaCellPos,\n getFocusedCell,\n getNextCellPos,\n getTreeNodeOperation,\n getLevelUp as getLevelUp,\n} from \"./table-dom-utils\";\nimport { ScrollRequestHandler } from \"./useTableScroll\";\nimport { FocusCell } from \"./useCellFocus\";\nimport { CellPos } from \"@vuu-ui/vuu-table-types\";\nimport { CellFocusState } from \"./CellFocusState\";\n\nconst rowNavigationKeys = new Set<NavigationKey>([\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"ArrowDown\",\n \"ArrowUp\",\n]);\n\nconst CellLocator =\n \".vuuTableCell,.vuuTableHeaderCell,.vuuTableGroupHeaderCell\";\n\nconst CellControlLocator = \".vuuColumnMenu,.vuuColumnHeaderPill\";\n\nconst cellNavigationKeys = new Set(rowNavigationKeys);\ncellNavigationKeys.add(\"ArrowLeft\");\ncellNavigationKeys.add(\"ArrowRight\");\n\nexport const isNavigationKey = (\n key: string,\n navigationStyle: TableNavigationStyle,\n): key is NavigationKey => {\n switch (navigationStyle) {\n case \"cell\":\n case \"tree\":\n return cellNavigationKeys.has(key as NavigationKey);\n case \"row\":\n return rowNavigationKeys.has(key as NavigationKey);\n default:\n return false;\n }\n};\n\nconst focusControlWithinCell = (e: KeyboardEvent, el: HTMLElement | null) => {\n if (e.shiftKey && e.key.match(/Arrow(Left|Right)/)) {\n if (el?.classList.contains(\"vuuTableHeaderCell\")) {\n const menuButton = el?.querySelector<HTMLButtonElement>(\".vuuColumnMenu\");\n if (menuButton) {\n menuButton.focus();\n return true;\n }\n } else if (el?.classList.contains(\"vuuTableGroupHeaderCell\")) {\n const headerPill = el?.querySelector<HTMLButtonElement>(\n \".vuuColumnHeaderPill\",\n );\n if (headerPill) {\n headerPill.focus();\n return true;\n }\n } else if (el?.classList.contains(\"vuuColumnHeaderPill\")) {\n const nextPill = el.parentElement?.nextElementSibling\n ?.firstChild as HTMLElement;\n if (nextPill?.classList.contains(\"vuuColumnHeaderPill\")) {\n nextPill.focus();\n return true;\n } else {\n const removeButton = queryClosest(\n el,\n \".vuuTableGroupHeaderCell\",\n true,\n ).querySelector(\".vuuTableGroupHeaderCell-removeAll\") as HTMLElement;\n if (removeButton) {\n removeButton.focus();\n return true;\n }\n }\n }\n }\n return false;\n};\n\nconst PageKeys = [\"Home\", \"End\", \"PageUp\", \"PageDown\"];\nexport const isPagingKey = (key: string): key is PageKey =>\n PageKeys.includes(key);\n\nexport type GroupToggleHandler = (\n treeNodeOperation: \"expand\" | \"collapse\",\n rowIndex: number,\n) => void;\n\nexport interface NavigationHookProps {\n cellFocusStateRef: MutableRefObject<CellFocusState>;\n containerRef: RefObject<HTMLElement | null>;\n columnCount?: number;\n headerCount: number;\n defaultHighlightedIndex?: number;\n disableFocus?: boolean;\n disableHighlightOnFocus?: boolean;\n focusCell: FocusCell;\n highlightedIndex?: number;\n label?: string;\n navigationStyle: TableNavigationStyle;\n viewportRange: VuuRange;\n onHighlight?: (idx: number) => void;\n onToggleGroup: GroupToggleHandler;\n requestScroll?: ScrollRequestHandler;\n restoreLastFocus?: boolean;\n rowCount?: number;\n selected?: unknown;\n viewportRowCount: number;\n}\n\nexport const useKeyboardNavigation = ({\n cellFocusStateRef,\n columnCount = 0,\n containerRef,\n defaultHighlightedIndex,\n disableHighlightOnFocus,\n focusCell,\n headerCount,\n highlightedIndex: highlightedIndexProp,\n navigationStyle,\n requestScroll,\n onHighlight,\n onToggleGroup,\n rowCount = 0,\n viewportRowCount,\n}: NavigationHookProps) => {\n // Keep this in sync with state value. This can be used by functions that need\n // to reference highlightedIndex at call time but do not need to be regenerated\n // every time it changes (i.e keep highlightedIndex out of their dependency\n // arrays, as it can update frequently)\n const highlightedIndexRef = useRef<number | undefined>(undefined);\n\n const [highlightedIndex, setHighlightedIdx] = useControlled({\n controlled: highlightedIndexProp,\n default: defaultHighlightedIndex,\n name: \"UseKeyboardNavigation\",\n });\n highlightedIndexRef.current = highlightedIndex;\n\n // We use aria row index for tracking rows\n const maxRowIndex = rowCount + headerCount;\n\n const setHighlightedIndex = useCallback(\n (idx: number) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n highlightedIndexRef.current = idx;\n },\n [onHighlight, setHighlightedIdx],\n );\n\n const setActiveCell = useCallback(\n (rowIdx: number, colIdx: number, fromKeyboard = false) => {\n const pos: CellPos = [rowIdx, colIdx];\n if (navigationStyle === \"row\") {\n setHighlightedIdx(rowIdx);\n } else {\n focusCell(pos, fromKeyboard);\n }\n },\n [focusCell, navigationStyle, setHighlightedIdx],\n );\n\n const nextPageItemIdx = useCallback(\n (\n key: \"PageDown\" | \"PageUp\" | \"Home\" | \"End\",\n [rowIdx, colIdx]: CellPos,\n ): Promise<CellPos> =>\n new Promise((resolve) => {\n let newRowIdx = rowIdx;\n const { current: focusState } = cellFocusStateRef;\n switch (key) {\n case \"PageDown\": {\n newRowIdx = Math.min(rowCount - 1, rowIdx + viewportRowCount);\n if (newRowIdx !== rowIdx) {\n focusState.cellPos = [newRowIdx, colIdx];\n requestScroll?.({ type: \"scroll-page\", direction: \"down\" });\n }\n break;\n }\n case \"PageUp\": {\n newRowIdx = Math.max(0, rowIdx - viewportRowCount);\n if (newRowIdx !== rowIdx) {\n focusState.cellPos = [newRowIdx, colIdx];\n requestScroll?.({ type: \"scroll-page\", direction: \"up\" });\n }\n break;\n }\n case \"Home\": {\n newRowIdx = headerCount + 1;\n if (newRowIdx !== rowIdx) {\n focusState.cellPos = [newRowIdx, colIdx];\n requestScroll?.({ type: \"scroll-end\", direction: \"home\" });\n }\n break;\n }\n case \"End\": {\n newRowIdx = rowCount + headerCount;\n if (newRowIdx !== rowIdx) {\n focusState.cellPos = [newRowIdx, colIdx];\n requestScroll?.({ type: \"scroll-end\", direction: \"end\" });\n }\n break;\n }\n }\n // Introduce a delay to allow the scroll operation to complete,\n // which will trigger a range reset and rerender of rows. We\n // might need to tweak how this works. If we introduce too big\n // a delay, we risk seeing the newly rendered rows, with the focus\n // still on the old cell, which will be apparent as a brief flash\n // of the old cell focus before switching to correct cell. If we were\n // to change the way re assign keys such that we can guarantee that\n // when we page down, rows in same position get same keys, then same\n // cell would be focussed in new page as previous and issue would not\n // arise.\n setTimeout(() => {\n resolve([newRowIdx, colIdx]);\n }, 35);\n }),\n [cellFocusStateRef, headerCount, requestScroll, rowCount, viewportRowCount],\n );\n\n const handleFocus = useCallback(() => {\n if (disableHighlightOnFocus !== true) {\n if (containerRef.current?.contains(document.activeElement)) {\n // IF focus arrives via keyboard, a cell will have received focus,\n // we handle that here. If focus arrives via click on a cell with\n // no tabindex (i.e all cells except one) we leave that to the\n // click handler.\n const focusedCell = getFocusedCell(document.activeElement);\n if (focusedCell) {\n cellFocusStateRef.current.cell = focusedCell;\n if (navigationStyle === \"row\") {\n setHighlightedIdx(cellFocusStateRef.current.cellPos?.[0]);\n }\n }\n }\n }\n }, [\n disableHighlightOnFocus,\n containerRef,\n cellFocusStateRef,\n navigationStyle,\n setHighlightedIdx,\n ]);\n\n const navigateChildItems = useCallback(\n async (\n navigationStyle: \"cell\" | \"tree\" = \"cell\",\n key: NavigationKey,\n shiftKey = false,\n ): Promise<undefined> => {\n const { cellPos } = cellFocusStateRef.current;\n if (cellPos === undefined) {\n throw Error(\"navigateChildItems called before cellPos is set\");\n }\n const [rowIdx, colIdx] = cellPos;\n let nextRowIdx = -1,\n nextColIdx = -1;\n\n if (isPagingKey(key)) {\n [nextRowIdx, nextColIdx] = await nextPageItemIdx(key, cellPos);\n } else {\n const treeNodeOperation = getTreeNodeOperation(\n containerRef,\n navigationStyle,\n cellPos,\n key,\n shiftKey,\n );\n if (\n treeNodeOperation === \"expand\" ||\n treeNodeOperation === \"collapse\"\n ) {\n onToggleGroup(treeNodeOperation, rowIdx - headerCount - 1);\n } else if (treeNodeOperation === \"level-up\") {\n [nextRowIdx, nextColIdx] = getLevelUp(containerRef, cellPos);\n } else {\n [nextRowIdx, nextColIdx] = getNextCellPos(\n key,\n cellPos,\n columnCount,\n maxRowIndex,\n );\n }\n }\n\n if (nextRowIdx !== rowIdx || nextColIdx !== colIdx) {\n setActiveCell(nextRowIdx, nextColIdx, true);\n setHighlightedIndex(nextRowIdx);\n }\n },\n [\n cellFocusStateRef,\n nextPageItemIdx,\n containerRef,\n onToggleGroup,\n headerCount,\n columnCount,\n maxRowIndex,\n setActiveCell,\n setHighlightedIndex,\n ],\n );\n\n const scrollRowIntoViewIfNecessary = useCallback(\n (rowIndex: number) => {\n requestScroll?.({ type: \"scroll-row\", rowIndex });\n },\n [requestScroll],\n );\n\n const moveHighlightedRow = useCallback(\n async (key: NavigationKey) => {\n const { current: highlighted } = highlightedIndexRef;\n const [nextRowIdx] = isPagingKey(key)\n ? await nextPageItemIdx(key, [highlighted ?? -1, 0])\n : getNextCellPos(key, [highlighted ?? -1, 0], columnCount, maxRowIndex);\n if (nextRowIdx !== highlighted) {\n setHighlightedIndex(nextRowIdx);\n // TO(DO make this a scroll request)\n scrollRowIntoViewIfNecessary(nextRowIdx);\n }\n },\n [\n columnCount,\n maxRowIndex,\n nextPageItemIdx,\n scrollRowIntoViewIfNecessary,\n setHighlightedIndex,\n ],\n );\n\n useEffect(() => {\n if (highlightedIndexProp !== undefined && highlightedIndexProp !== -1) {\n requestAnimationFrame(() => {\n // deferred call, ensuring table has fully rendered\n scrollRowIntoViewIfNecessary(highlightedIndexProp);\n });\n }\n }, [highlightedIndexProp, scrollRowIntoViewIfNecessary]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n const cell = queryClosest<HTMLDivElement>(\n e.target,\n `${CellLocator},${CellControlLocator}`,\n );\n if (cellDropdownShowing(cell)) {\n return;\n }\n if (rowCount > 0 && isNavigationKey(e.key, navigationStyle)) {\n e.preventDefault();\n e.stopPropagation();\n if (navigationStyle === \"row\") {\n moveHighlightedRow(e.key);\n } else if (navigationStyle !== \"none\") {\n if (!focusControlWithinCell(e, cell)) {\n navigateChildItems(navigationStyle, e.key, e.shiftKey);\n }\n }\n }\n },\n [rowCount, navigationStyle, moveHighlightedRow, navigateChildItems],\n );\n\n const handleClick = useCallback(\n // Might not be a cell e.g the Settings button\n (evt: MouseEvent) => {\n const target = queryClosest<HTMLDivElement>(evt.target, CellLocator);\n const focusedCell = getFocusedCell(target);\n if (focusedCell) {\n const [rowIdx, colIdx] = getAriaCellPos(focusedCell);\n setActiveCell(rowIdx, colIdx);\n }\n },\n [setActiveCell],\n );\n\n const handleMouseLeave = useCallback(() => {\n setHighlightedIndex(-1);\n }, [setHighlightedIndex]);\n\n const handleMouseMove = useCallback(\n (evt: MouseEvent) => {\n const rowIdx = closestRowIndex(evt.target as HTMLElement);\n if (rowIdx !== -1 && rowIdx !== highlightedIndexRef.current) {\n setHighlightedIndex(rowIdx);\n }\n },\n [setHighlightedIndex],\n );\n\n /**\n * used when editing cells\n */\n const navigateCell = useCallback(() => {\n navigateChildItems(\"cell\", \"ArrowDown\");\n }, [navigateChildItems]);\n\n return {\n highlightedIndexRef,\n navigateCell,\n onClick: handleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseLeave: navigationStyle === \"row\" ? handleMouseLeave : undefined,\n onMouseMove: navigationStyle === \"row\" ? handleMouseMove : undefined,\n };\n};\n"],"names":["queryClosest","useRef","useControlled","useCallback","getFocusedCell","navigationStyle","getTreeNodeOperation","getLevelUp","getNextCellPos","useEffect","cellDropdownShowing","getAriaCellPos","closestRowIndex"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSelection.js","sources":["../src/useSelection.ts"],"sourcesContent":["import {\n TableRowClickHandlerInternal,\n TableRowSelectHandlerInternal,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n deselectItem,\n dispatchMouseEvent,\n isRowSelected,\n metadataKeys,\n queryClosest,\n selectItem,\n} from \"@vuu-ui/vuu-utils\";\nimport { Selection } from \"@vuu-ui/vuu-data-types\";\nimport {\n KeyboardEvent,\n KeyboardEventHandler,\n MutableRefObject,\n RefObject,\n useCallback,\n useRef,\n} from \"react\";\nimport { getRowElementByAriaIndex } from \"./table-dom-utils\";\nimport { TableProps } from \"./Table\";\n\nconst { IDX } = metadataKeys;\n\nconst NO_SELECTION: Selection = [];\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport interface SelectionHookProps\n extends Pick<TableProps, \"defaultSelectedIndexValues\" | \"onSelectionChange\"> {\n containerRef: RefObject<HTMLElement>;\n highlightedIndexRef: MutableRefObject<number | undefined>;\n selectionKeys?: string[];\n selectionModel: TableSelectionModel;\n onSelect?: TableRowSelectHandlerInternal;\n}\n\nexport const useSelection = ({\n containerRef,\n defaultSelectedIndexValues = NO_SELECTION,\n highlightedIndexRef,\n selectionKeys = defaultSelectionKeys,\n selectionModel,\n onSelect,\n onSelectionChange,\n}: SelectionHookProps) => {\n selectionModel === \"extended\" || selectionModel === \"checkbox\";\n const lastActiveRef = useRef(-1);\n const selectedRef = useRef<Selection>(defaultSelectedIndexValues);\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent<HTMLElement>) => selectionKeys.includes(evt.key),\n [selectionKeys],\n );\n\n const handleRowClick = useCallback<TableRowClickHandlerInternal>(\n (e, row, rangeSelect, keepExistingSelection) => {\n const { [IDX]: idx } = row;\n const { current: active } = lastActiveRef;\n const { current: selected } = selectedRef;\n\n const selectOperation = isRowSelected(row) ? deselectItem : selectItem;\n\n if (selectionModel === \"checkbox\") {\n const cell = queryClosest(e.target, \".vuuTableCell\");\n if (!cell?.querySelector(\".vuuCheckboxRowSelector\")) {\n return;\n }\n }\n\n const newSelected = selectOperation(\n selectionModel,\n selected,\n idx,\n rangeSelect,\n keepExistingSelection,\n active,\n );\n\n selectedRef.current = newSelected;\n lastActiveRef.current = idx;\n\n onSelect?.(selectOperation === selectItem ? row : null);\n onSelectionChange?.(newSelected);\n },\n [onSelect, onSelectionChange, selectionModel],\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLElement>>(\n (e) => {\n if (isSelectionEvent(e)) {\n const { current: rowIndex } = highlightedIndexRef;\n const { current: container } = containerRef;\n if (rowIndex !== undefined && rowIndex !== -1 && container) {\n const rowEl = getRowElementByAriaIndex(container, rowIndex);\n if (rowEl) {\n dispatchMouseEvent(rowEl, \"click\");\n }\n }\n }\n },\n [containerRef, highlightedIndexRef, isSelectionEvent],\n );\n\n return {\n onKeyDown: handleKeyDown,\n onRowClick: handleRowClick,\n };\n};\n"],"names":["metadataKeys","useRef","useCallback","isRowSelected","deselectItem","selectItem","queryClosest","getRowElementByAriaIndex","dispatchMouseEvent"],"mappings":";;;;;;AAyBA,MAAM,EAAE,KAAQ,GAAAA,qBAAA;AAEhB,MAAM,eAA0B,EAAC;AAEjC,MAAM,oBAAA,GAAuB,CAAC,OAAA,EAAS,GAAG,CAAA;AAWnC,MAAM,eAAe,CAAC;AAAA,EAC3B,YAAA;AAAA,EACA,0BAA6B,GAAA,YAAA;AAAA,EAC7B,mBAAA;AAAA,EACA,aAAgB,GAAA,oBAAA;AAAA,EAChB,cAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAA0B,KAAA;AAExB,EAAM,MAAA,aAAA,GAAgBC,aAAO,CAAE,CAAA,CAAA;AAC/B,EAAM,MAAA,WAAA,GAAcA,aAAkB,0BAA0B,CAAA;AAEhE,EAAA,MAAM,gBAAmB,GAAAC,iBAAA;AAAA,IACvB,CAAC,GAAA,KAAoC,aAAc,CAAA,QAAA,CAAS,IAAI,GAAG,CAAA;AAAA,IACnE,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,MAAM,cAAiB,GAAAA,iBAAA;AAAA,IACrB,CAAC,CAAA,EAAG,GAAK,EAAA,WAAA,EAAa,qBAA0B,KAAA;AAC9C,MAAA,MAAM,EAAE,CAAC,GAAG,GAAG,KAAQ,GAAA,GAAA;AACvB,MAAM,MAAA,EAAE,OAAS,EAAA,MAAA,EAAW,GAAA,aAAA;AAC5B,MAAM,MAAA,EAAE,OAAS,EAAA,QAAA,EAAa,GAAA,WAAA;AAE9B,MAAA,MAAM,eAAkB,GAAAC,sBAAA,CAAc,GAAG,CAAA,GAAIC,qBAAe,GAAAC,mBAAA;AAE5D,MAAA,IAAI,mBAAmB,UAAY,EAAA;AACjC,QAAA,MAAM,IAAO,GAAAC,qBAAA,CAAa,CAAE,CAAA,MAAA,EAAQ,eAAe,CAAA;AACnD,QAAA,IAAI,CAAC,IAAA,EAAM,aAAc,CAAA,yBAAyB,CAAG,EAAA;AACnD,UAAA;AAAA;AACF;AAGF,MAAA,MAAM,WAAc,GAAA,eAAA;AAAA,QAClB,cAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA;AAAA,QACA,WAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,WAAA,CAAY,OAAU,GAAA,WAAA;AACtB,MAAA,aAAA,CAAc,OAAU,GAAA,GAAA;AAExB,MAAW,QAAA,GAAA,eAAA,KAAoBD,mBAAa,GAAA,GAAA,GAAM,IAAI,CAAA;AACtD,MAAA,iBAAA,GAAoB,WAAW,CAAA;AAAA,KACjC;AAAA,IACA,CAAC,QAAU,EAAA,iBAAA,EAAmB,cAAc;AAAA,GAC9C;AAEA,EAAA,MAAM,aAAgB,GAAAH,iBAAA;AAAA,IACpB,CAAC,CAAM,KAAA;AACL,MAAI,IAAA,gBAAA,CAAiB,CAAC,CAAG,EAAA;AACvB,QAAM,MAAA,EAAE,OAAS,EAAA,QAAA,EAAa,GAAA,mBAAA;AAC9B,QAAM,MAAA,EAAE,OAAS,EAAA,SAAA,EAAc,GAAA,YAAA;AAC/B,QAAA,IAAI,QAAa,KAAA,KAAA,CAAA,IAAa,QAAa,KAAA,CAAA,CAAA,IAAM,SAAW,EAAA;AAC1D,UAAM,MAAA,KAAA,GAAQK,sCAAyB,CAAA,SAAA,EAAW,QAAQ,CAAA;AAC1D,UAAA,IAAI,KAAO,EAAA;AACT,YAAAC,2BAAA,CAAmB,OAAO,OAAO,CAAA;AAAA;AACnC;AACF;AACF,KACF;AAAA,IACA,CAAC,YAAc,EAAA,mBAAA,EAAqB,gBAAgB;AAAA,GACtD;AAEA,EAAO,OAAA;AAAA,IACL,SAAW,EAAA,aAAA;AAAA,IACX,UAAY,EAAA;AAAA,GACd;AACF;;;;"}
1
+ {"version":3,"file":"useSelection.js","sources":["../src/useSelection.ts"],"sourcesContent":["import {\n TableRowClickHandlerInternal,\n TableRowSelectHandlerInternal,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n deselectItem,\n dispatchMouseEvent,\n isRowSelected,\n metadataKeys,\n queryClosest,\n selectItem,\n} from \"@vuu-ui/vuu-utils\";\nimport { Selection } from \"@vuu-ui/vuu-data-types\";\nimport {\n KeyboardEvent,\n KeyboardEventHandler,\n RefObject,\n useCallback,\n useRef,\n} from \"react\";\nimport { getRowElementByAriaIndex } from \"./table-dom-utils\";\nimport { TableProps } from \"./Table\";\n\nconst { IDX } = metadataKeys;\n\nconst NO_SELECTION: Selection = [];\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport interface SelectionHookProps\n extends Pick<TableProps, \"defaultSelectedIndexValues\" | \"onSelectionChange\"> {\n containerRef: RefObject<HTMLElement | null>;\n highlightedIndexRef: RefObject<number | undefined>;\n selectionKeys?: string[];\n selectionModel: TableSelectionModel;\n onSelect?: TableRowSelectHandlerInternal;\n}\n\nexport const useSelection = ({\n containerRef,\n defaultSelectedIndexValues = NO_SELECTION,\n highlightedIndexRef,\n selectionKeys = defaultSelectionKeys,\n selectionModel,\n onSelect,\n onSelectionChange,\n}: SelectionHookProps) => {\n selectionModel === \"extended\" || selectionModel === \"checkbox\";\n const lastActiveRef = useRef(-1);\n const selectedRef = useRef<Selection>(defaultSelectedIndexValues);\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent<HTMLElement>) => selectionKeys.includes(evt.key),\n [selectionKeys],\n );\n\n const handleRowClick = useCallback<TableRowClickHandlerInternal>(\n (e, row, rangeSelect, keepExistingSelection) => {\n const { [IDX]: idx } = row;\n const { current: active } = lastActiveRef;\n const { current: selected } = selectedRef;\n\n const selectOperation = isRowSelected(row) ? deselectItem : selectItem;\n\n if (selectionModel === \"checkbox\") {\n const cell = queryClosest(e.target, \".vuuTableCell\");\n if (!cell?.querySelector(\".vuuCheckboxRowSelector\")) {\n return;\n }\n }\n\n const newSelected = selectOperation(\n selectionModel,\n selected,\n idx,\n rangeSelect,\n keepExistingSelection,\n active,\n );\n\n selectedRef.current = newSelected;\n lastActiveRef.current = idx;\n\n onSelect?.(selectOperation === selectItem ? row : null);\n onSelectionChange?.(newSelected);\n },\n [onSelect, onSelectionChange, selectionModel],\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLElement>>(\n (e) => {\n if (isSelectionEvent(e)) {\n const { current: rowIndex } = highlightedIndexRef;\n const { current: container } = containerRef;\n if (rowIndex !== undefined && rowIndex !== -1 && container) {\n const rowEl = getRowElementByAriaIndex(container, rowIndex);\n if (rowEl) {\n dispatchMouseEvent(rowEl, \"click\");\n }\n }\n }\n },\n [containerRef, highlightedIndexRef, isSelectionEvent],\n );\n\n return {\n onKeyDown: handleKeyDown,\n onRowClick: handleRowClick,\n };\n};\n"],"names":["metadataKeys","useRef","useCallback","isRowSelected","deselectItem","selectItem","queryClosest","getRowElementByAriaIndex","dispatchMouseEvent"],"mappings":";;;;;;AAwBA,MAAM,EAAE,KAAQ,GAAAA,qBAAA;AAEhB,MAAM,eAA0B,EAAC;AAEjC,MAAM,oBAAA,GAAuB,CAAC,OAAA,EAAS,GAAG,CAAA;AAWnC,MAAM,eAAe,CAAC;AAAA,EAC3B,YAAA;AAAA,EACA,0BAA6B,GAAA,YAAA;AAAA,EAC7B,mBAAA;AAAA,EACA,aAAgB,GAAA,oBAAA;AAAA,EAChB,cAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAA0B,KAAA;AAExB,EAAM,MAAA,aAAA,GAAgBC,aAAO,CAAE,CAAA,CAAA;AAC/B,EAAM,MAAA,WAAA,GAAcA,aAAkB,0BAA0B,CAAA;AAEhE,EAAA,MAAM,gBAAmB,GAAAC,iBAAA;AAAA,IACvB,CAAC,GAAA,KAAoC,aAAc,CAAA,QAAA,CAAS,IAAI,GAAG,CAAA;AAAA,IACnE,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,MAAM,cAAiB,GAAAA,iBAAA;AAAA,IACrB,CAAC,CAAA,EAAG,GAAK,EAAA,WAAA,EAAa,qBAA0B,KAAA;AAC9C,MAAA,MAAM,EAAE,CAAC,GAAG,GAAG,KAAQ,GAAA,GAAA;AACvB,MAAM,MAAA,EAAE,OAAS,EAAA,MAAA,EAAW,GAAA,aAAA;AAC5B,MAAM,MAAA,EAAE,OAAS,EAAA,QAAA,EAAa,GAAA,WAAA;AAE9B,MAAA,MAAM,eAAkB,GAAAC,sBAAA,CAAc,GAAG,CAAA,GAAIC,qBAAe,GAAAC,mBAAA;AAE5D,MAAA,IAAI,mBAAmB,UAAY,EAAA;AACjC,QAAA,MAAM,IAAO,GAAAC,qBAAA,CAAa,CAAE,CAAA,MAAA,EAAQ,eAAe,CAAA;AACnD,QAAA,IAAI,CAAC,IAAA,EAAM,aAAc,CAAA,yBAAyB,CAAG,EAAA;AACnD,UAAA;AAAA;AACF;AAGF,MAAA,MAAM,WAAc,GAAA,eAAA;AAAA,QAClB,cAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA;AAAA,QACA,WAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,WAAA,CAAY,OAAU,GAAA,WAAA;AACtB,MAAA,aAAA,CAAc,OAAU,GAAA,GAAA;AAExB,MAAW,QAAA,GAAA,eAAA,KAAoBD,mBAAa,GAAA,GAAA,GAAM,IAAI,CAAA;AACtD,MAAA,iBAAA,GAAoB,WAAW,CAAA;AAAA,KACjC;AAAA,IACA,CAAC,QAAU,EAAA,iBAAA,EAAmB,cAAc;AAAA,GAC9C;AAEA,EAAA,MAAM,aAAgB,GAAAH,iBAAA;AAAA,IACpB,CAAC,CAAM,KAAA;AACL,MAAI,IAAA,gBAAA,CAAiB,CAAC,CAAG,EAAA;AACvB,QAAM,MAAA,EAAE,OAAS,EAAA,QAAA,EAAa,GAAA,mBAAA;AAC9B,QAAM,MAAA,EAAE,OAAS,EAAA,SAAA,EAAc,GAAA,YAAA;AAC/B,QAAA,IAAI,QAAa,KAAA,KAAA,CAAA,IAAa,QAAa,KAAA,CAAA,CAAA,IAAM,SAAW,EAAA;AAC1D,UAAM,MAAA,KAAA,GAAQK,sCAAyB,CAAA,SAAA,EAAW,QAAQ,CAAA;AAC1D,UAAA,IAAI,KAAO,EAAA;AACT,YAAAC,2BAAA,CAAmB,OAAO,OAAO,CAAA;AAAA;AACnC;AACF;AACF,KACF;AAAA,IACA,CAAC,YAAc,EAAA,mBAAA,EAAqB,gBAAgB;AAAA,GACtD;AAEA,EAAO,OAAA;AAAA,IACL,SAAW,EAAA,aAAA;AAAA,IACX,UAAY,EAAA;AAAA,GACd;AACF;;;;"}
package/cjs/useTable.js CHANGED
@@ -76,13 +76,13 @@ const useTable = ({
76
76
  size
77
77
  }) => {
78
78
  const tableConfigRef = react.useRef(config);
79
- const requestScrollRef = react.useRef();
79
+ const requestScrollRef = react.useRef(void 0);
80
80
  react.useMemo(() => {
81
81
  tableConfigRef.current = config;
82
82
  }, [config]);
83
83
  const initialState = react.useMemo(() => new CellFocusState.CellFocusState(), []);
84
84
  const cellFocusStateRef = react.useRef(initialState);
85
- const focusCellRef = react.useRef();
85
+ const focusCellRef = react.useRef(void 0);
86
86
  const [headerState, setHeaderState] = react.useState(
87
87
  showColumnHeaders ? nullHeaderState : zeroHeaderState
88
88
  );
@@ -316,7 +316,7 @@ const useTable = ({
316
316
  },
317
317
  [dataSource]
318
318
  );
319
- const resizeCells = react.useRef();
319
+ const resizeCells = react.useRef(void 0);
320
320
  const onResizeColumn = react.useCallback(
321
321
  (phase, columnName, width) => {
322
322
  const column = columns.find((column2) => column2.name === columnName);
@@ -1 +1 @@
1
- {"version":3,"file":"useTable.js","sources":["../src/useTable.ts"],"sourcesContent":["import {\n DataSourceConfig,\n DataSourceConfigChangeHandler,\n DataSourceRow,\n DataSourceSubscribedMessage,\n SelectionChangeHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType, VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDisplayActionHandler,\n TableSettingsActionHandler,\n useColumnActions,\n} from \"@vuu-ui/vuu-table-extras\";\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 logUnhandledMessage,\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 { TableCellBlock } from \"./cell-block/cellblock-utils\";\nimport { useCellBlockSelection } from \"./cell-block/useCellBlockSelection\";\nimport { CellFocusState } from \"./CellFocusState\";\nimport { TableProps } from \"./Table\";\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 useTableModel,\n} from \"./useTableModel\";\nimport { ScrollRequestHandler, useTableScroll } from \"./useTableScroll\";\nimport { useTableViewport } from \"./useTableViewport\";\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 {\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 const handleConfigChange = useCallback<DataSourceConfigChangeHandler>(\n (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 [dispatchTableModelAction],\n );\n\n useEffect(() => {\n dataSource.on(\"config\", handleConfigChange);\n return () => {\n dataSource.removeListener(\"config\", handleConfigChange);\n };\n }, [dataSource, dispatchTableModelAction, handleConfigChange]);\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 handleColumnDisplayAction = useCallback<ColumnDisplayActionHandler>(\n (action) => {\n // if (isShowColumnSettings(action)) {\n // showColumnSettingsPanel(action);\n // } else if (isShowTableSettings(action)) {\n // showTableSettingsPanel();\n // } else {\n const { type } = action;\n switch (type) {\n case \"hideColumn\":\n return hideColumns({\n type: \"hideColumns\",\n columns: [action.column],\n });\n case \"pinColumn\":\n return pinColumn(action);\n default:\n logUnhandledMessage(type, \"[vuu-table] handleColumnDisplayAction\");\n }\n // }\n },\n [hideColumns, pinColumn],\n );\n\n const handleDisplaySettingsAction = useCallback<TableSettingsActionHandler>(\n (action) => {\n if (action.type === \"column-settings\") {\n showColumnSettingsPanel(action);\n } else {\n showTableSettingsPanel();\n }\n },\n [showColumnSettingsPanel, showTableSettingsPanel],\n );\n\n const handleColumnAction = useColumnActions({\n dataSource,\n onColumnDisplayAction: handleColumnDisplayAction,\n onDisplaySettingsAction: handleDisplaySettingsAction,\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 // TODO - this should be GlobalDropHandler\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (dragDropState: any) => {\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 handleColumnAction,\n headerState,\n headings,\n highlightedIndex: highlightedIndexRef.current,\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":["metadataKeys","asDataSourceRowObject","useRef","useMemo","CellFocusState","useState","useCallback","size","useRowClassNameGenerators","useDragDrop","tableConfig","useTableModel","useLayoutEffectSkipFirst","config","buildColumnMap","useTableViewport","useDataSource","useTableScroll","range","useEffect","columns","updateColumn","useTableAndColumnSettings","logUnhandledMessage","useColumnActions","toggleOrApplySort","column","isValidNumber","updateTableConfig","isJsonGroup","row","useCellFocus","useKeyboardNavigation","useCellEditing","useTableContextMenu","isGroupColumn","useSelection","cellBlock","useCellBlockSelection","getAriaRowIndex"],"mappings":"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"}
1
+ {"version":3,"file":"useTable.js","sources":["../src/useTable.ts"],"sourcesContent":["import {\n DataSourceConfig,\n DataSourceConfigChangeHandler,\n DataSourceRow,\n DataSourceSubscribedMessage,\n SelectionChangeHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType, VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDisplayActionHandler,\n TableSettingsActionHandler,\n useColumnActions,\n} from \"@vuu-ui/vuu-table-extras\";\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 logUnhandledMessage,\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 { TableCellBlock } from \"./cell-block/cellblock-utils\";\nimport { useCellBlockSelection } from \"./cell-block/useCellBlockSelection\";\nimport { CellFocusState } from \"./CellFocusState\";\nimport { TableProps } from \"./Table\";\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 useTableModel,\n} from \"./useTableModel\";\nimport { ScrollRequestHandler, useTableScroll } from \"./useTableScroll\";\nimport { useTableViewport } from \"./useTableViewport\";\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 | null>;\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>(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>(undefined);\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 {\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 const handleConfigChange = useCallback<DataSourceConfigChangeHandler>(\n (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 [dispatchTableModelAction],\n );\n\n useEffect(() => {\n dataSource.on(\"config\", handleConfigChange);\n return () => {\n dataSource.removeListener(\"config\", handleConfigChange);\n };\n }, [dataSource, dispatchTableModelAction, handleConfigChange]);\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 handleColumnDisplayAction = useCallback<ColumnDisplayActionHandler>(\n (action) => {\n // if (isShowColumnSettings(action)) {\n // showColumnSettingsPanel(action);\n // } else if (isShowTableSettings(action)) {\n // showTableSettingsPanel();\n // } else {\n const { type } = action;\n switch (type) {\n case \"hideColumn\":\n return hideColumns({\n type: \"hideColumns\",\n columns: [action.column],\n });\n case \"pinColumn\":\n return pinColumn(action);\n default:\n logUnhandledMessage(type, \"[vuu-table] handleColumnDisplayAction\");\n }\n // }\n },\n [hideColumns, pinColumn],\n );\n\n const handleDisplaySettingsAction = useCallback<TableSettingsActionHandler>(\n (action) => {\n if (action.type === \"column-settings\") {\n showColumnSettingsPanel(action);\n } else {\n showTableSettingsPanel();\n }\n },\n [showColumnSettingsPanel, showTableSettingsPanel],\n );\n\n const handleColumnAction = useColumnActions({\n dataSource,\n onColumnDisplayAction: handleColumnDisplayAction,\n onDisplaySettingsAction: handleDisplaySettingsAction,\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>(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 // TODO - this should be GlobalDropHandler\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (dragDropState: any) => {\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 handleColumnAction,\n headerState,\n headings,\n highlightedIndex: highlightedIndexRef.current,\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":["metadataKeys","asDataSourceRowObject","useRef","useMemo","CellFocusState","useState","useCallback","size","useRowClassNameGenerators","useDragDrop","tableConfig","useTableModel","useLayoutEffectSkipFirst","config","buildColumnMap","useTableViewport","useDataSource","useTableScroll","range","useEffect","columns","updateColumn","useTableAndColumnSettings","logUnhandledMessage","useColumnActions","toggleOrApplySort","column","isValidNumber","updateTableConfig","isJsonGroup","row","useCellFocus","useKeyboardNavigation","useCellEditing","useTableContextMenu","isGroupColumn","useSelection","cellBlock","useCellBlockSelection","getAriaRowIndex"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAkFA,MAAM,eAAkB,GAAA;AAAA,EACtB,MAAQ,EAAA,CAAA,CAAA;AAAA,EACR,KAAO,EAAA,CAAA;AACT,CAAA;AACA,MAAM,eAAkB,GAAA;AAAA,EACtB,MAAQ,EAAA,CAAA;AAAA,EACR,KAAO,EAAA;AACT,CAAA;AAEA,MAAM,uBAAA,GAA0B,CAAC,WAA0C,KAAA;AACzE,EAAO,OAAA,WAAA;AACT,CAAA;AAyCA,MAAM,EAAE,GAAA,EAAK,WAAa,EAAA,OAAA,EAAY,GAAAA,qBAAA;AAEtC,MAAM,cAAiB,GAAA;AAAA,EACrB,SAAW,EAAA,KAAA,CAAA;AAAA,EACX,WAAa,EAAA,KAAA;AACf,CAAA;AACA,MAAM,kBAAkB,MAAM,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;AAC5C,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,0BAAA;AAAA,EACA,wBAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAkB,EAAA,oBAAA;AAAA,EAClB,EAAA;AAAA,EACA,eAAkB,GAAA,MAAA;AAAA,EAClB,wBAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAc,EAAA,gBAAA;AAAA,EACd,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,cAAA;AAAA,EACA,SAAY,GAAA,EAAA;AAAA,EACZ,WAAc,GAAAC,8BAAA;AAAA,EACd,eAAA;AAAA,EACA,qBAAwB,GAAA,CAAA;AAAA,EACxB,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF,CAAsB,KAAA;AACpB,EAAM,MAAA,cAAA,GAAiBC,aAAoB,MAAM,CAAA;AAEjD,EAAM,MAAA,gBAAA,GAAmBA,aAAyC,KAAS,CAAA,CAAA;AAC3E,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAA,cAAA,CAAe,OAAU,GAAA,MAAA;AAAA,GAC3B,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,eAAeA,aAAQ,CAAA,MAAM,IAAIC,6BAAe,EAAA,EAAG,EAAE,CAAA;AAE3D,EAAM,MAAA,iBAAA,GAAoBF,aAAuB,YAAY,CAAA;AAE7D,EAAM,MAAA,YAAA,GAAeA,aAAkB,KAAS,CAAA,CAAA;AAEhD,EAAM,MAAA,CAAC,WAAa,EAAA,cAAc,CAAI,GAAAG,cAAA;AAAA,IACpC,oBAAoB,eAAkB,GAAA;AAAA,GACxC;AACA,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,CAAI,GAAAA,cAAA,CAAiB,WAAW,IAAI,CAAA;AAChE,EAAA,IAAI,eAAe,KAAW,CAAA,EAAA;AAC5B,IAAA,MAAM,MAAM,sCAAsC,CAAA;AAAA;AAGpD,EAAM,MAAA,oBAAA,GAAuBC,iBAAY,CAAA,CAACC,KAAiB,KAAA;AACzD,IAAA,WAAA,CAAYA,KAAI,CAAA;AAAA,GAClB,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,uBAAuB,SAAY,GAAA,QAAA;AACzC,EAAA,MAAM,qBACJ,IAAK,CAAA,MAAA,IAAU,YAAY,MAAW,KAAA,CAAA,CAAA,GAAK,IAAI,WAAY,CAAA,MAAA,CAAA;AAC7D,EAAM,MAAA,sBAAA,GACJ,oBAAuB,GAAA,kBAAA,GAAqB,EAAK,GAAA,CAAA;AACnD,EAAA,MAAM,cACJ,GAAA,IAAA,CAAK,KAAS,IAAA,sBAAA,GAAyB,CAAI,GAAA,qBAAA,CAAA;AAE7C,EAAM,MAAA,qBAAA,GAAwBC,oDAA0B,MAAM,CAAA;AAE9D,EAAM,MAAA,cAAA,GAAiB,gBAAgBC,yBAAc,GAAA,eAAA;AAErD,EAAM,MAAA;AAAA,IACJ,OAAA;AAAA,IACA,wBAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,iBACAC;AAAA,MACEC,2BAAc,CAAA,EAAE,QAAQ,UAAY,EAAA,cAAA,EAAgB,gBAAgB,CAAA;AAMxE,EAAAC,iCAAA,CAAyB,MAAM;AAC7B,IAAyB,wBAAA,CAAA;AAAA,MACvB,cAAA;AAAA,MACA,IAAM,EAAA,MAAA;AAAA,MACN,aAAa,cAAe,CAAA,OAAA;AAAA,MAC5B;AAAA,KACD,CAAA;AAAA,KACA,CAAC,cAAA,EAAgB,MAAQ,EAAA,UAAA,EAAY,wBAAwB,CAAC,CAAA;AAEjE,EAAA,MAAM,sBAAyB,GAAAN,iBAAA;AAAA,IAC7B,CAACO,OAAwB,KAAA;AACvB,MAAyB,wBAAA,CAAA;AAAA,QACvB,cAAA;AAAA,QACA,IAAM,EAAA,MAAA;AAAA,QACN,WAAaA,EAAAA,OAAAA;AAAA,QACb;AAAA,OACD,CAAA;AACD,MAAA,cAAA,CAAe,OAAUA,GAAAA,OAAAA;AACzB,MAAiB,cAAA,GAAA,uBAAA,CAAwBA,OAAM,CAAC,CAAA;AAAA,KAClD;AAAA,IACA,CAAC,cAAA,EAAgB,UAAY,EAAA,wBAAA,EAA0B,cAAc;AAAA,GACvE;AAEA,EAAA,MAAM,SAAY,GAAAV,aAAA;AAAA,IAChB,MAAMW,uBAAe,CAAA,UAAA,CAAW,OAAO,CAAA;AAAA,IACvC,CAAC,WAAW,OAAO;AAAA,GACrB;AAEA,EAAA,MAAM,YAAe,GAAAR,iBAAA;AAAA,IACnB,CAAC,EAAE,WAAA,EAA+C,KAAA;AAChD,MAAA,IAAI,WAAa,EAAA;AACf,QAAyB,wBAAA,CAAA;AAAA,UACvB,IAAM,EAAA,gBAAA;AAAA,UACN;AAAA,SACD,CAAA;AAAA,OACI,MAAA;AACL,QAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AAAA;AACnD,KACF;AAAA,IACA,CAAC,wBAAwB;AAAA,GAC3B;AAEA,EAAM,MAAA;AAAA,IACJ,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAoB,EAAA,8BAAA;AAAA,IACpB,YAAc,EAAA,wBAAA;AAAA,IACd,GAAG;AAAA,MACDS,iCAAiB,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;AAAA,GACD,CAAA;AAED,EAAA,MAAM,EAAE,IAAM,EAAA,OAAA,EAAS,iBAAiB,KAAO,EAAA,QAAA,KAAaC,2BAAc,CAAA;AAAA,IACxE,UAAA;AAAA,IACA,0BAAA;AAAA,IACA,wBAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAc,EAAA,oBAAA;AAAA,IACd;AAAA,GACD,CAAA;AAED,EAAA,MAAM,EAAE,aAAA,EAAe,GAAG,WAAA,KAAgBC,6BAAe,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;AAAA,GACD,CAAA;AAED,EAAA,gBAAA,CAAiB,OAAU,GAAA,aAAA;AAG3B,EAAA,MAAM,iCAAoC,GAAAX,iBAAA;AAAA,IACxC,CAACI,YAA6B,KAAA;AAC5B,MAAyB,wBAAA,CAAA;AAAA,QACvB,cAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAAA,EAAAA,YAAAA;AAAA,QACA,IAAM,EAAA;AAAA,OACP,CAAA;AACD,MAAA,cAAA,CAAe,OAAUA,GAAAA,YAAAA;AACzB,MAAiB,cAAA,GAAA,uBAAA,CAAwBA,YAAW,CAAC,CAAA;AAAA,KACvD;AAAA,IACA,CAAC,cAAA,EAAgB,UAAY,EAAA,wBAAA,EAA0B,cAAc;AAAA,GACvE;AAEA,EAAA,MAAM,6BAAgC,GAAAJ,iBAAA;AAAA,IACpC,CAAC,gBAAuC,KAAA;AACtC,MAAA,UAAA,CAAW,MAAS,GAAA;AAAA,QAClB,GAAG,UAAW,CAAA,MAAA;AAAA,QACd,GAAG;AAAA,OACL;AAAA,KACF;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,kBAAqB,GAAAA,iBAAA;AAAA,IACzB,CAACO,OAAAA,EAAQK,MAAO,EAAA,SAAA,EAAW,OAAY,KAAA;AACrC,MAAM,MAAA,sBAAA,GACJ,OAAS,EAAA,aAAA,IAAiB,OAAS,EAAA,cAAA;AACrC,MAAI,IAAA,sBAAA,IAA0BA,MAAM,CAAA,IAAA,GAAO,CAAG,EAAA;AAC5C,QAAA,gBAAA,CAAiB,OAAU,GAAA;AAAA,UACzB,IAAM,EAAA,YAAA;AAAA,UACN,SAAW,EAAA;AAAA,SACZ,CAAA;AAAA;AAEH,MAAyB,wBAAA,CAAA;AAAA,QACvB,IAAM,EAAA,aAAA;AAAA,QACN,GAAGL,OAAAA;AAAA,QACH;AAAA,OACD,CAAA;AAAA,KACH;AAAA,IACA,CAAC,wBAAwB;AAAA,GAC3B;AAEA,EAAAM,eAAA,CAAU,MAAM;AACd,IAAW,UAAA,CAAA,EAAA,CAAG,UAAU,kBAAkB,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAW,UAAA,CAAA,cAAA,CAAe,UAAU,kBAAkB,CAAA;AAAA,KACxD;AAAA,GACC,EAAA,CAAC,UAAY,EAAA,wBAAA,EAA0B,kBAAkB,CAAC,CAAA;AAE7D,EAAA,MAAM,4BAA+B,GAAAb,iBAAA;AAAA,IACnC,CAAC,MAA6B,KAAA;AAC5B,MAAA,UAAA,CAAW,OAAU,GAAA,UAAA,CAAW,OAAQ,CAAA,MAAA,CAAO,OAAO,IAAI,CAAA;AAC1D,MAAuB,sBAAA,CAAA,SAAA,CAAUI,aAAa,EAAA,MAAM,CAAC,CAAA;AAAA,KACvD;AAAA,IACA,CAAC,UAAY,EAAAA,aAAA,EAAa,sBAAsB;AAAA,GAClD;AAEA,EAAA,MAAM,WAAc,GAAAJ,iBAAA;AAAA,IAClB,CAAC,MAA6B,KAAA;AAC5B,MAAM,MAAA,EAAE,OAAAc,EAAAA,QAAAA,EAAY,GAAA,MAAA;AACpB,MAAA,MAAM,gBAAgBA,QAAQ,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC/C,MAAA,MAAM,cAAiB,GAAA;AAAA,QACrB,GAAGV,aAAA;AAAA,QACH,OAAA,EAASA,cAAY,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;AAAA;AAChE,OACF;AACA,MAAA,sBAAA,CAAuB,cAAc,CAAA;AAAA,KACvC;AAAA,IACA,CAACA,eAAa,sBAAsB;AAAA,GACtC;AAEA,EAAA,MAAM,SAAY,GAAAJ,iBAAA;AAAA,IAChB,CAAC,MAA4B,KAAA;AAC3B,MAAuB,sBAAA,CAAA;AAAA,QACrB,GAAGI,aAAA;AAAA,QACH,OAAA,EAASW,qBAAa,CAAAX,aAAA,CAAY,OAAS,EAAA;AAAA,UACzC,GAAG,MAAO,CAAA,MAAA;AAAA,UACV,KAAK,MAAO,CAAA;AAAA,SACb;AAAA,OACF,CAAA;AAAA,KACH;AAAA,IACA,CAACA,eAAa,sBAAsB;AAAA,GACtC;AAEA,EAAA,MAAM,EAAE,uBAAA,EAAyB,sBAAuB,EAAA,GACtDY,mDAA0B,CAAA;AAAA,IACxB,gBAAA,EACE,gBACA,IAAAZ,aAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,cAAiB,GAAA,QAAA,EAAgB,MAAA;AAAA,MAChE,IAAA;AAAA,MACA;AAAA,KACA,CAAA,CAAA;AAAA,IACJ,wBAAA;AAAA,IACA,cAAgB,EAAA,iCAAA;AAAA,IAChB,wBAA0B,EAAA,4BAAA;AAAA,IAC1B,wBAA0B,EAAA,6BAAA;AAAA,iBAC1BA;AAAA,GACD,CAAA;AAEH,EAAA,MAAM,yBAA4B,GAAAJ,iBAAA;AAAA,IAChC,CAAC,MAAW,KAAA;AAMV,MAAM,MAAA,EAAE,MAAS,GAAA,MAAA;AACjB,MAAA,QAAQ,IAAM;AAAA,QACZ,KAAK,YAAA;AACH,UAAA,OAAO,WAAY,CAAA;AAAA,YACjB,IAAM,EAAA,aAAA;AAAA,YACN,OAAA,EAAS,CAAC,MAAA,CAAO,MAAM;AAAA,WACxB,CAAA;AAAA,QACH,KAAK,WAAA;AACH,UAAA,OAAO,UAAU,MAAM,CAAA;AAAA,QACzB;AACE,UAAAiB,4BAAA,CAAoB,MAAM,uCAAuC,CAAA;AAAA;AACrE,KAEF;AAAA,IACA,CAAC,aAAa,SAAS;AAAA,GACzB;AAEA,EAAA,MAAM,2BAA8B,GAAAjB,iBAAA;AAAA,IAClC,CAAC,MAAW,KAAA;AACV,MAAI,IAAA,MAAA,CAAO,SAAS,iBAAmB,EAAA;AACrC,QAAA,uBAAA,CAAwB,MAAM,CAAA;AAAA,OACzB,MAAA;AACL,QAAuB,sBAAA,EAAA;AAAA;AACzB,KACF;AAAA,IACA,CAAC,yBAAyB,sBAAsB;AAAA,GAClD;AAEA,EAAA,MAAM,qBAAqBkB,+BAAiB,CAAA;AAAA,IAC1C,UAAA;AAAA,IACA,qBAAuB,EAAA,yBAAA;AAAA,IACvB,uBAAyB,EAAA;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,UAAa,GAAAlB,iBAAA;AAAA,IACjB,CAAC,MAAA,EAA0B,UAAa,GAAA,KAAA,EAAO,QAA2B,KAAA;AACxE,MAAA,IAAI,UAAY,EAAA;AACd,QAAA,UAAA,CAAW,IAAO,GAAAmB,0BAAA;AAAA,UAChB,UAAW,CAAA,IAAA;AAAA,UACX,MAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AAAA;AACF,KACF;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAM,MAAA,WAAA,GAAcvB,aAAkC,KAAS,CAAA,CAAA;AAE/D,EAAA,MAAM,cAA2C,GAAAI,iBAAA;AAAA,IAC/C,CAAC,KAAO,EAAA,UAAA,EAAY,KAAU,KAAA;AAC5B,MAAA,MAAM,SAAS,OAAQ,CAAA,IAAA,CAAK,CAACoB,OAAWA,KAAAA,OAAAA,CAAO,SAAS,UAAU,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;AAAA,WAC5B,CAAA;AAAA,SACH,MAAA,IAAW,UAAU,KAAO,EAAA;AAC1B,UAAA,WAAA,CAAY,OAAU,GAAA,KAAA,CAAA;AACtB,UAAI,IAAAC,sBAAA,CAAc,KAAK,CAAG,EAAA;AACxB,YAAyB,wBAAA,CAAA;AAAA,cACvB,IAAM,EAAA,cAAA;AAAA,cACN,KAAA;AAAA,cACA,MAAA;AAAA,cACA;AAAA,aACD,CAAA;AACD,YAAA,cAAA;AAAA,cACE,uBAAA;AAAA,gBACEC,8BAAkBlB,aAAa,EAAA;AAAA,kBAC7B,IAAM,EAAA,UAAA;AAAA,kBACN,MAAA;AAAA,kBACA,OAAA;AAAA,kBACA;AAAA,iBACD;AAAA;AACH,aACF;AAAA;AACF,SACK,MAAA;AACL,UAAM,MAAA,UAAA,GAAa,CAAmB,gBAAA,EAAA,MAAA,CAAO,YAAY,CAAA,EAAA,CAAA;AACzD,UAAA,WAAA,CAAY,UAAU,KAAM,CAAA,IAAA;AAAA,YAC1B,aAAa,OAAS,EAAA,gBAAA;AAAA,cACpB,CAAA,aAAA,EAAgB,UAAU,CAAA,oBAAA,EAAuB,UAAU,CAAA;AAAA,iBACxD;AAAC,WACR;AACA,UAAyB,wBAAA,CAAA;AAAA,YACvB,IAAM,EAAA,cAAA;AAAA,YACN,KAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA;AACH,OACK,MAAA;AACL,QAAM,MAAA,KAAA;AAAA,UACJ,2CAA2C,UAAU,CAAA,UAAA;AAAA,SACvD;AAAA;AACF,KACF;AAAA,IACA;AAAA,MACE,OAAA;AAAA,MACA,wBAAA;AAAA,MACA,cAAA;AAAA,MACAA,aAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,aAAgB,GAAAJ,iBAAA;AAAA,IACpB,CAAC,KAAoB,MAAoC,KAAA;AACvD,MAAA,MAAM,MAAS,GAAAuB,oBAAA,CAAY,MAAQ,EAAA,GAAA,EAAK,SAAS,CAAA;AACjD,MAAM,MAAA,GAAA,GAAM,IAAI,GAAG,CAAA;AAEnB,MAAI,IAAA,GAAA,CAAI,WAAW,CAAG,EAAA;AACpB,QAAW,UAAA,CAAA,aAAA,CAAc,KAAK,IAAI,CAAA;AAClC,QAAA,IAAI,MAAQ,EAAA;AAEV,UAAM,MAAA,GAAA,GAAM,OAAQ,CAAA,OAAA,CAAQ,MAAM,CAAA;AAClC,UAAA,MAAM,IAAO,GAAA,UAAA,CAAW,cAAiB,GAAA,GAAA,GAAM,CAAC,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;AAAA,aAC/B,CAAA;AAAA;AACH;AACF,OACK,MAAA;AACL,QAAA,UAAA,CAAW,aAAa,GAAG,CAAA;AAC3B,QAAA,IAAI,MAAQ,EAAA;AACV,UAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,GAAe,GAAG,CAAA;AAC/C,UAAA,MAAM,GAAM,GAAA,OAAA,CAAQ,OAAQ,CAAA,MAAM,CAAI,GAAA,CAAA;AACtC,UAAA,MAAM,aAAgB,GAAA,CAAC,OAAQ,CAAA,GAAG,CAAC,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;AAAA;AAErC,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,aACV,CAAA;AAAA;AACH;AACF;AACF,KACF;AAAA,IACA,CAAC,SAAA,EAAW,OAAS,EAAA,UAAA,EAAY,wBAAwB;AAAA,GAC3D;AAGA,EAAA,MAAM,iBAAoB,GAAAxB,iBAAA;AAAA,IACxB,CAAC,mBAAmB,MAAW,KAAA;AAC7B,MAAA,IAAI,sBAAsB,QAAU,EAAA;AAClC,QAAA,UAAA,CAAW,aAAa,MAAM,CAAA;AAAA,OACzB,MAAA;AACL,QAAA,UAAA,CAAW,cAAc,MAAM,CAAA;AAAA;AACjC,KACF;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,2BAAA;AAAA,IACA,uBAAA;AAAA,IACA,eAAiB,EAAA;AAAA,MACfyB,yBAAa,CAAA;AAAA,IACf,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,YAAA,CAAa,OAAU,GAAA,SAAA;AAEvB,EAAM,MAAA,WAAA,GAAc,QAAQ,MAAO,CAAA,CAAC,MAAM,CAAE,CAAA,MAAA,KAAW,IAAI,CAAE,CAAA,MAAA;AAE7D,EAAM,MAAA;AAAA,IACJ,mBAAA;AAAA,IACA,YAAc,EAAA,QAAA;AAAA,IACd,OAAS,EAAA,eAAA;AAAA,IACT,SAAW,EAAA,iBAAA;AAAA,IACX,GAAG;AAAA,MACDC,2CAAsB,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;AAAA,GACxC,CAAA;AAED,EAAM,MAAA;AAAA,IACJ,MAAQ,EAAA,WAAA;AAAA,IACR,aAAe,EAAA,kBAAA;AAAA,IACf,SAAW,EAAA,cAAA;AAAA,IACX,OAAS,EAAA;AAAA,MACPC,6BAAe,CAAA;AAAA,IACjB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,WAAc,GAAA3B,iBAAA;AAAA,IAClB,CAAC,CAA+B,KAAA;AAC9B,MAAgB,eAAA,EAAA;AAChB,MAAI,IAAA,CAAC,EAAE,gBAAkB,EAAA;AACvB,QAAA,YAAA,CAAa,CAAC,CAAA;AAAA;AAChB,KACF;AAAA,IACA,CAAC,cAAc,eAAe;AAAA,GAChC;AAEA,EAAA,MAAM,gBAAgB4B,uCAAoB,CAAA;AAAA,IACxC,OAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAa,WAAY,CAAA;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,iBAAoB,GAAA5B,iBAAA;AAAA,IACxB,CAACc,QAAgC,KAAA;AAC/B,MAAA,UAAA,CAAW,UAAUA,QAAQ,CAAA,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,IAAI,CAAA;AAAA,KACpD;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,mBAAsB,GAAAd,iBAAA;AAAA,IAC1B,CAAC,MAAoC,KAAA;AACnC,MAAI,IAAA6B,sBAAA,CAAc,MAAM,CAAG,EAAA;AACzB,QAAA,UAAA,CAAW,UAAU,EAAC;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;AAAA,WACxC;AAAA;AACF;AACF,KACF;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,qBAAgD,GAAA7B,iBAAA;AAAA,IACpD,CAAC,QAAa,KAAA;AACZ,MAAA,UAAA,CAAW,OAAO,QAAQ,CAAA;AAC1B,MAAA,iBAAA,GAAoB,QAAQ,CAAA;AAAA,KAC9B;AAAA,IACA,CAAC,YAAY,iBAAiB;AAAA,GAChC;AAEA,EAAA,MAAM,YAAe,GAAAA,iBAAA;AAAA,IACnB,CAAC,GAAQ,KAAA;AACP,MAAA,IAAI,QAAU,EAAA;AACZ,QAAA,QAAA,CAAS,QAAQ,IAAO,GAAA,IAAA,GAAO,WAAY,CAAA,GAAA,EAAK,SAAS,CAAC,CAAA;AAAA;AAC5D,KACF;AAAA,IACA,CAAC,SAAW,EAAA,QAAA,EAAU,WAAW;AAAA,GACnC;AAEA,EAAM,MAAA;AAAA,IACJ,SAAW,EAAA,oBAAA;AAAA,IACX,UAAY,EAAA;AAAA,MACV8B,yBAAa,CAAA;AAAA,IACf,YAAA;AAAA,IACA,0BAAA;AAAA,IACA,mBAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,iBAAmB,EAAA,qBAAA;AAAA,IACnB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,qBAAwB,GAAA9B,iBAAA;AAAA,IAC5B,CAAC+B,UAA8B,KAAA;AAC7B,MAAA,qBAAA,CAAsB,EAAE,CAAA;AACxB,MAAA,iBAAA,GAAoBA,UAAS,CAAA;AAAA,KAC/B;AAAA,IACA,CAAC,uBAAuB,iBAAiB;AAAA,GAC3C;AAEA,EAAM,MAAA;AAAA,IACJ,WAAa,EAAA,sBAAA;AAAA,IACb,SAAA;AAAA,IACA,SAAW,EAAA;AAAA,MACTC,2CAAsB,CAAA;AAAA,IACxB,uBAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAmB,EAAA,qBAAA;AAAA,IACnB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,cAAiB,GAAAhC,iBAAA;AAAA,IACrB,CAAC,GAAA,EAAK,GAAK,EAAA,WAAA,EAAa,qBAA0B,KAAA;AAChD,MAAwB,uBAAA,CAAA,GAAA,EAAK,GAAK,EAAA,WAAA,EAAa,qBAAqB,CAAA;AACpE,MAAA,cAAA,GAAiB,GAAK,EAAA,WAAA,CAAY,GAAK,EAAA,SAAS,CAAC,CAAA;AAAA,KACnD;AAAA,IACA,CAAC,SAAA,EAAW,cAAgB,EAAA,WAAA,EAAa,uBAAuB;AAAA,GAClE;AAEA,EAAA,MAAM,aAAgB,GAAAA,iBAAA;AAAA,IACpB,CAAC,CAAkC,KAAA;AACjC,MAAA,yBAAA,GAA4B,CAAC,CAAA;AAC7B,MAAI,IAAA,CAAC,EAAE,gBAAkB,EAAA;AACvB,QAAA,iBAAA,CAAkB,CAAC,CAAA;AAAA;AAErB,MAAI,IAAA,CAAC,EAAE,gBAAkB,EAAA;AACvB,QAAA,cAAA,CAAe,CAAC,CAAA;AAAA;AAElB,MAAI,IAAA,CAAC,EAAE,gBAAkB,EAAA;AACvB,QAAA,oBAAA,CAAqB,CAAC,CAAA;AAAA;AACxB,KACF;AAAA,IACA;AAAA,MACE,yBAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,YAAe,GAAAA,iBAAA;AAAA,IACnB,CAACc,QAAgC,KAAA;AAC/B,MAAA,MAAM,cAAiB,GAAA;AAAA,QACrB,GAAGV,aAAA;AAAA,QACH,OAAAU,EAAAA;AAAA,OACF;AAEA,MAAA,cAAA,CAAe,OAAU,GAAA,cAAA;AAEzB,MAAA,OAAA,CAAQ,IAAI,CAAyB,uBAAA,CAAA,CAAA;AAErC,MAAyB,wBAAA,CAAA;AAAA,QACvB,cAAA;AAAA,QACA,IAAM,EAAA,MAAA;AAAA,QACN,WAAa,EAAA,cAAA;AAAA,QACb;AAAA,OACD,CAAA;AACD,MAAiB,cAAA,GAAA,uBAAA,CAAwB,cAAc,CAAC,CAAA;AAAA,KAC1D;AAAA,IACA;AAAA,MACE,cAAA;AAAA,MACA,UAAA;AAAA,MACA,wBAAA;AAAA,MACA,cAAA;AAAA,MACAV;AAAA;AACF,GACF;AAEA,EAAA,MAAM,aAAgB,GAAAJ,iBAAA;AAAA;AAAA;AAAA,IAGpB,CAAC,aAAuB,KAAA;AACtB,MAAA,MAAA,GAAS,aAAa,CAAA;AAAA,KACxB;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,gBAAmB,GAAAA,iBAAA;AAAA,IACvB,OAAO,SAAiC,KAAA;AACtC,MAAM,MAAA;AAAA,QACJ,QAAW,GAAA,QAAA;AAAA,QACX,OAAU,GAAA,IAAA;AAAA,QACV,GAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACE,GAAA,SAAA;AACJ,MAAA,IAAI,MAAS,GAAA,KAAA,CAAA;AACb,MAAI,IAAA,QAAA,KAAa,YAAY,OAAS,EAAA;AACpC,QAAA,MAAA,GAAS,MAAM,UAAW,CAAA,SAAA;AAAA,UACxB,IAAI,GAAG,CAAA;AAAA,UACP,UAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,gBAAA,GAAmB,EAAE,GAAG,SAAA,EAAW,OAAS,EAAA,MAAA,KAAW,MAAM,CAAA;AAC7D,QAAO,OAAA,MAAA;AAAA,OACF,MAAA;AACL,QAAA,gBAAA,GAAmB,SAAS,CAAA;AAAA;AAC9B,KACF;AAAA,IACA,CAAC,YAAY,gBAAgB;AAAA,GAC/B;AAEA,EAAA,MAAM,kBAAqB,GAAAA,iBAAA;AAAA,IACzB,CAAC,aAAkB,KAAA;AACjB,MAAM,MAAA,EAAE,oBAAuB,GAAA,aAAA;AAC/B,MAAA,MAAM,QACJ,GAAAiC,6BAAA,CAAgB,kBAAkB,CAAA,GAAI,YAAY,KAAQ,GAAA,CAAA;AAC5D,MAAM,MAAA,GAAA,GAAM,QAAQ,OAAQ,CAAA,IAAA,CAAK,CAACT,IAAQA,KAAAA,IAAAA,CAAI,CAAC,CAAA,KAAM,QAAQ,CAAA;AAC7D,MAAA,IAAI,GAAK,EAAA;AACP,QAAA,aAAA,CAAc,WAAW,GAAG,CAAA;AAAA;AAI9B,MAAA,WAAA,GAAc,aAAa,CAAA;AAAA,KAC7B;AAAA,IACA,CAAC,OAAA,EAAS,WAAY,CAAA,KAAA,EAAO,WAAW;AAAA,GAC1C;AAEA,EAAA,MAAM,sBAAyB,GAAAxB,iBAAA;AAAA,IAC7B,CAAC,QAAgB,KAAkB,KAAA;AACjC,MAAe,cAAA,CAAA,EAAE,MAAQ,EAAA,KAAA,EAAO,CAAA;AAAA,KAClC;AAAA,IACA;AAAC,GACH;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;AAAA,GACZ,CAAA;AAEH,EAAA,MAAM,eAAkB,GAAAA,iBAAA;AAAA,IACtB,CAAC,GAAQ,KAAA;AACP,MAAA,gBAAA,GAAmB,GAAG,CAAA;AACtB,MAAI,IAAA,CAAC,GAAI,CAAA,oBAAA,EAAwB,EAAA;AAC/B,QAAA,sBAAA,GAAyB,GAAG,CAAA;AAAA;AAC9B,KACF;AAAA,IACA,CAAC,kBAAkB,sBAAsB;AAAA,GAC3C;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,kBAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,kBAAkB,mBAAoB,CAAA,OAAA;AAAA,IACtC,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,iBACAI,aAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -13,7 +13,7 @@ const useTableAndColumnSettings = ({
13
13
  tableConfig
14
14
  }) => {
15
15
  const dispatchLayoutAction = vuuLayout.useLayoutProviderDispatch();
16
- const showTableSettingsRef = react.useRef();
16
+ const showTableSettingsRef = react.useRef(void 0);
17
17
  const [availableColumns, setAvailableColumns] = react.useState(
18
18
  availableColumnsProps
19
19
  );
@@ -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 { DisplayColumnSettingsAction } from \"@vuu-ui/vuu-table-extras/src/column-menu/column-action-types\";\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: DisplayColumnSettingsAction) => {\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: \"column-settings\",\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: \"column-settings\",\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":["useLayoutProviderDispatch","useRef","useState","useCallback","VuuShellLocation","getCalculatedColumnDetails"],"mappings":";;;;;;AAuBO,MAAM,4BAA4B,CAAC;AAAA,EACxC,gBAAkB,EAAA,qBAAA;AAAA,EAClB,wBAAA;AAAA,EACA,cAAA;AAAA,EACA,wBAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACF,CAAuC,KAAA;AACrC,EAAA,MAAM,uBAAuBA,mCAA0B,EAAA;AACvD,EAAA,MAAM,uBAAuBC,YAAmB,EAAA;AAEhD,EAAM,MAAA,CAAC,gBAAkB,EAAA,mBAAmB,CAAI,GAAAC,cAAA;AAAA,IAC9C;AAAA,GACF;AAEA,EAAA,MAAM,gBAAmB,GAAAC,iBAAA;AAAA,IACvB,CACE,aACA,EAAA,KAAA,EACA,KACG,KAAA;AACH,MAAqB,oBAAA,CAAA;AAAA,QACnB,IAAM,EAAA,WAAA;AAAA,QACN,IAAA,EAAM,CAAI,CAAA,EAAAC,yBAAA,CAAiB,YAAY,CAAA,CAAA;AAAA,QACvC,KAAO,EAAA;AAAA,UACL,QAAU,EAAA,IAAA;AAAA,UACV,OAAS,EAAA;AAAA,YACP,IAAM,EAAA,aAAA;AAAA,YACN;AAAA,WACF;AAAA,UACA;AAAA;AACF,OACD,CAAA;AAAA,KACH;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAM,MAAA,wBAAA,GAA2BD,kBAAY,MAAM;AACjD,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,oBAAA,CAAqB,OAAU,IAAA;AAAA,KAChC,CAAA;AAAA,GACH,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,4BAA+B,GAAAA,iBAAA;AAAA,IACnC,CAAC,MAA6B,KAAA;AAC5B,MAAA,MAAM,EAAE,cAAA,EAAmB,GAAAE,mCAAA,CAA2B,MAAM,CAAA;AAC5D,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAM,MAAA,mBAAA,GAAsB,iBAAiB,MAAO,CAAA;AAAA,UAClD,MAAM,MAAO,CAAA,IAAA;AAAA,UACb;AAAA,SACD,CAAA;AACD,QAAA,mBAAA,CAAoB,mBAAmB,CAAA;AACvC,QAAA,wBAAA,GAA2B,mBAAmB,CAAA;AAC9C,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAA,oBAAA,CAAqB,OAAU,IAAA;AAAA,SAChC,CAAA;AACD,QAAA,wBAAA,CAAyB,MAAM,CAAA;AAAA,OAC1B,MAAA;AACL,QAAM,MAAA,KAAA;AAAA,UACJ;AAAA,SACF;AAAA;AACF,KACF;AAAA,IACA,CAAC,gBAAkB,EAAA,wBAAA,EAA0B,wBAAwB;AAAA,GACvE;AAEA,EAAA,MAAM,uBAA0B,GAAAF,iBAAA;AAAA,IAC9B,CAAC,MAAwC,KAAA;AACvC,MAAA,gBAAA,CAAiB,kBAAkB,iBAAmB,EAAA;AAAA,QACpD,QAAQ,MAAO,CAAA,MAAA;AAAA,QACf,oBAAsB,EAAA,wBAAA;AAAA,QACtB,cAAA;AAAA,QACA,wBAA0B,EAAA,4BAAA;AAAA,QAC1B,WAAA;AAAA,QACA,UAAU,MAAO,CAAA;AAAA,OACK,CAAA;AAAA,KAC1B;AAAA,IACA;AAAA,MACE,wBAAA;AAAA,MACA,4BAAA;AAAA,MACA,cAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAM,MAAA,yBAAA,GAA4BA,kBAAY,MAAM;AAClD,IAAwB,uBAAA,CAAA;AAAA,MACtB,MAAQ,EAAA;AAAA,QACN,IAAM,EAAA,IAAA;AAAA,QACN,cAAgB,EAAA;AAAA,OAClB;AAAA,MACA,IAAM,EAAA,iBAAA;AAAA,MACN,QAAU,EAAA,EAAE,MAAQ,EAAA,OAAA,EAAS,OAAO,aAAc;AAAA,KACnD,CAAA;AAAA,GACH,EAAG,CAAC,uBAAuB,CAAC,CAAA;AAE5B,EAAA,MAAM,sBAAyB,GAAAA,iBAAA;AAAA,IAC7B,CAAC,UAAuB,KAAA;AACtB,MAAM,MAAA,MAAA,GAAS,YAAY,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,UAAU,CAAA;AACpE,MAAA,IAAI,MAAQ,EAAA;AACV,QAAwB,uBAAA,CAAA;AAAA,UACtB,IAAM,EAAA,iBAAA;AAAA,UACN,MAAA;AAAA;AAAA,UAEA,QAAU,EAAA,EAAE,MAAQ,EAAA,OAAA,EAAS,OAAO,aAAc;AAAA,SACnD,CAAA;AAAA;AACH,KACF;AAAA,IACA,CAAC,uBAAyB,EAAA,WAAA,CAAY,OAAO;AAAA,GAC/C;AAEA,EAAqB,oBAAA,CAAA,OAAA,GAAUA,kBAAY,MAAM;AAC/C,IAAA,gBAAA,CAAiB,iBAAiB,mBAAqB,EAAA;AAAA,MACrD,gBAAA,EACE,oBACA,WAAY,CAAA,OAAA,CAAQ,IAAI,CAAC,EAAE,IAAM,EAAA,cAAA,EAAsB,MAAA;AAAA,QACrD,IAAA;AAAA,QACA;AAAA,OACA,CAAA,CAAA;AAAA,MACJ,qBAAuB,EAAA,yBAAA;AAAA,MACvB,cAAA;AAAA,MACA,wBAAA;AAAA,MACA,kBAAoB,EAAA,sBAAA;AAAA,MACpB;AAAA,KACqB,CAAA;AAAA,GACtB,EAAA;AAAA,IACD,gBAAA;AAAA,IACA,yBAAA;AAAA,IACA,sBAAA;AAAA,IACA,cAAA;AAAA,IACA,wBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAO,OAAA;AAAA,IACL,uBAAA;AAAA,IACA,wBAAwB,oBAAqB,CAAA;AAAA,GAC/C;AACF;;;;"}
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 { DisplayColumnSettingsAction } from \"@vuu-ui/vuu-table-extras/src/column-menu/column-action-types\";\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>(undefined);\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: DisplayColumnSettingsAction) => {\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: \"column-settings\",\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: \"column-settings\",\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":["useLayoutProviderDispatch","useRef","useState","useCallback","VuuShellLocation","getCalculatedColumnDetails"],"mappings":"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"}
@@ -32,7 +32,7 @@ const checkboxColumnDescriptor = {
32
32
  };
33
33
  const numericTypes = ["int", "long", "double"];
34
34
  const getDefaultAlignment = (serverDataType) => serverDataType === void 0 ? void 0 : numericTypes.includes(serverDataType) ? "right" : "left";
35
- const columnReducer = (state, action) => {
35
+ const tableModelReducer = (state, action) => {
36
36
  info?.(`TableModelReducer ${action.type}`);
37
37
  switch (action.type) {
38
38
  case "init": {
@@ -76,7 +76,7 @@ const useTableModel = ({
76
76
  availableWidth
77
77
  }) => {
78
78
  const [state, dispatchTableModelAction] = react.useReducer(
79
- columnReducer,
79
+ tableModelReducer,
80
80
  {
81
81
  availableWidth,
82
82
  tableConfig: tableConfigProp,
@@ -1 +1 @@
1
- {"version":3,"file":"useTableModel.js","sources":["../src/useTableModel.ts"],"sourcesContent":["import {\n ColumnDescriptor,\n ColumnLayout,\n PinLocation,\n ResizePhase,\n RuntimeColumnDescriptor,\n TableAttributes,\n TableConfig,\n TableHeadings,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n applyFilterToColumns,\n applyGroupByToColumns,\n applyRuntimeColumnWidthsToConfig,\n applySortToColumns,\n applyWidthToColumns,\n checkConfirmationPending,\n existingSort,\n getCellRenderer,\n getColumnHeaderContentRenderer,\n getColumnHeaderLabelRenderer,\n getColumnLabel,\n getTableHeadings,\n getValueFormatter,\n hasValidationRules,\n isFilteredColumn,\n isGroupColumn,\n isPinned,\n logger,\n removeSort,\n replaceColumn,\n sortPinnedColumns,\n stripFilterFromColumns,\n subscribedOnly,\n} from \"@vuu-ui/vuu-utils\";\n\nimport {\n DataSource,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuColumnDataType } from \"@vuu-ui/vuu-protocol-types\";\nimport { Reducer, useReducer } from \"react\";\nimport { buildValidationChecker } from \"@vuu-ui/vuu-data-react\";\n\nconst { info } = logger(\"useTableModel\");\n\nconst DEFAULT_COLUMN_WIDTH = 100;\n\nconst columnWithoutDataType = ({ serverDataType }: ColumnDescriptor) =>\n serverDataType === undefined;\n\nconst getDataType = (\n column: ColumnDescriptor,\n tableSchema?: TableSchema,\n): VuuColumnDataType | undefined => {\n const schemaColumn = tableSchema?.columns.find(\n ({ name }) => name === column.name,\n );\n if (schemaColumn) {\n return schemaColumn.serverDataType;\n } else {\n return column.serverDataType;\n }\n};\n\nconst checkboxColumnDescriptor: ColumnDescriptor = {\n label: \"\",\n name: \"\",\n width: 25,\n sortable: false,\n isSystemColumn: true,\n type: {\n name: \"checkbox\",\n renderer: {\n name: \"checkbox-row-selector-cell\",\n },\n },\n};\n\n/**\n * TableModel represents state used internally to manage Table. It is\n * derived initially from the TableConfig provided by user, along with the\n * data-related config from DataSource.\n */\nexport interface TableModel extends TableAttributes {\n columns: RuntimeColumnDescriptor[];\n headings: TableHeadings;\n}\n\n/**\n * InternalTableModel describes the state managed within the TableModel\n * reducer. It is the same as TableModel but with the addition of a\n * readonly copy of the original TableConfig.\n */\ninterface InternalTableModel extends TableModel {\n availableWidth: number;\n tableConfig: Readonly<TableConfig>;\n}\n\nconst numericTypes = [\"int\", \"long\", \"double\"];\nconst getDefaultAlignment = (serverDataType?: VuuColumnDataType) =>\n serverDataType === undefined\n ? undefined\n : numericTypes.includes(serverDataType)\n ? \"right\"\n : \"left\";\n\nexport interface ColumnActionInit {\n availableWidth: number;\n type: \"init\";\n tableConfig: TableConfig;\n dataSource: DataSource;\n}\n\nexport interface ColumnActionHide {\n type: \"hideColumns\";\n columns: ColumnDescriptor[];\n}\n\nexport interface ColumnActionShow {\n type: \"showColumns\";\n columns: RuntimeColumnDescriptor[];\n}\nexport interface ColumnActionMove {\n type: \"moveColumn\";\n column: RuntimeColumnDescriptor;\n moveBy?: 1 | -1;\n}\n\nexport interface ColumnActionPin {\n type: \"pinColumn\";\n column: ColumnDescriptor;\n pin: PinLocation | false;\n}\n\nexport interface ColumnActionResize {\n type: \"resizeColumn\";\n column: RuntimeColumnDescriptor;\n phase: ResizePhase;\n width?: number;\n}\n\nexport interface ColumnActionSetTableSchema {\n type: \"setTableSchema\";\n tableSchema: TableSchema;\n}\n\nexport interface ColumnActionUpdate {\n type: \"updateColumn\";\n column: ColumnDescriptor;\n}\n\nexport interface ColumnActionUpdateProp {\n align?: ColumnDescriptor[\"align\"];\n column: ColumnDescriptor;\n hidden?: ColumnDescriptor[\"hidden\"];\n label?: ColumnDescriptor[\"label\"];\n resizing?: RuntimeColumnDescriptor[\"resizing\"];\n type: \"updateColumnProp\";\n width?: ColumnDescriptor[\"width\"];\n}\n\nexport interface ColumnActionTableConfig\n extends WithBaseFilter<WithFullConfig> {\n confirmed?: boolean;\n type: \"tableConfig\";\n}\n\nexport type GridModelAction =\n | ColumnActionHide\n | ColumnActionInit\n | ColumnActionMove\n | ColumnActionPin\n | ColumnActionResize\n | ColumnActionSetTableSchema\n | ColumnActionShow\n | ColumnActionUpdate\n | ColumnActionUpdateProp\n | ColumnActionTableConfig;\n\nexport type GridModelReducer = Reducer<InternalTableModel, GridModelAction>;\n\nexport type ColumnActionDispatch = (action: GridModelAction) => void;\n\nconst columnReducer: GridModelReducer = (state, action) => {\n info?.(`TableModelReducer ${action.type}`);\n switch (action.type) {\n case \"init\": {\n if (\n state.tableConfig.columnLayout === \"manual\" &&\n action.tableConfig.columnLayout === \"fit\"\n ) {\n //TODO we're jumping through hoops here when we should just make config a controlled prop\n\n // Manual columnLayout has been assigned because user has resized one or more columns.\n // It happened during current session so tableConfig still reflects original value.\n return init({\n ...action,\n tableConfig: applyRuntimeColumnWidthsToConfig(\n action.tableConfig,\n state.columns,\n ),\n });\n } else {\n return init(action, state);\n }\n }\n case \"moveColumn\":\n return moveColumn(state, action);\n case \"resizeColumn\":\n return resizeColumn(state, action);\n case \"setTableSchema\":\n return setTableSchema(state, action);\n case \"hideColumns\":\n return hideColumns(state, action);\n case \"showColumns\":\n return showColumns(state, action);\n case \"pinColumn\":\n return pinColumn(state, action);\n case \"updateColumnProp\":\n return updateColumnProp(state, action);\n case \"tableConfig\":\n return updateTableConfig(state, action);\n default:\n console.log(`unhandled action ${action.type}`);\n return state;\n }\n};\n\nexport interface TableModelHookProps {\n config: TableConfig;\n dataSource: DataSource;\n selectionModel: TableSelectionModel;\n availableWidth: number;\n}\n\nexport const useTableModel = ({\n config: tableConfigProp,\n dataSource,\n selectionModel,\n availableWidth,\n}: TableModelHookProps) => {\n const [state, dispatchTableModelAction] = useReducer<\n GridModelReducer,\n InitialConfig\n >(\n columnReducer,\n {\n availableWidth,\n tableConfig: tableConfigProp,\n dataSource,\n selectionModel,\n },\n init,\n );\n\n const { columns, headings, tableConfig, ...tableAttributes } = state;\n\n return {\n columns,\n dispatchTableModelAction,\n headings,\n tableAttributes,\n tableConfig,\n };\n};\n\ntype InitialConfig = {\n availableWidth: number;\n columnLayout?: ColumnLayout;\n dataSource: DataSource;\n selectionModel?: TableSelectionModel;\n tableConfig: TableConfig;\n};\n\nfunction init(\n { availableWidth, dataSource, selectionModel, tableConfig }: InitialConfig,\n previousConfig?: InternalTableModel,\n): InternalTableModel {\n const { columns, ...tableAttributes } = tableConfig;\n const { config: dataSourceConfig, tableSchema } = dataSource;\n const toRuntimeColumnDescriptor = columnDescriptorToRuntimeColumDescriptor(\n tableAttributes,\n tableSchema,\n );\n\n const runtimeColumns: RuntimeColumnDescriptor[] = [];\n let colIndex = 1;\n for (const column of columns.filter(\n subscribedOnly(dataSourceConfig?.columns),\n )) {\n runtimeColumns.push(\n toRuntimeColumnDescriptor(column, column.hidden ? -1 : colIndex),\n );\n if (!column.hidden) {\n colIndex += 1;\n }\n }\n\n if (selectionModel === \"checkbox\") {\n runtimeColumns.splice(\n 0,\n 0,\n toRuntimeColumnDescriptor(checkboxColumnDescriptor, -1),\n );\n }\n\n const { columnLayout = \"static\" } = tableConfig;\n const runtimeColumnsWithLayout = applyWidthToColumns(runtimeColumns, {\n availableWidth,\n columnLayout,\n });\n\n const columnsInRenderOrder = runtimeColumnsWithLayout.some(isPinned)\n ? sortPinnedColumns(runtimeColumnsWithLayout)\n : runtimeColumnsWithLayout;\n\n let state: InternalTableModel = {\n availableWidth,\n columns: columnsInRenderOrder,\n headings: getTableHeadings(columnsInRenderOrder),\n tableConfig,\n ...tableAttributes,\n };\n if (dataSourceConfig) {\n const { columns: _, ...rest } = dataSourceConfig;\n state = updateTableConfig(state, {\n type: \"tableConfig\",\n ...rest,\n confirmed: checkConfirmationPending(previousConfig),\n });\n }\n return state;\n}\n\nconst getLabel = (\n label: string,\n columnFormatHeader?: \"uppercase\" | \"capitalize\",\n): string => {\n if (columnFormatHeader === \"uppercase\") {\n return label.toUpperCase();\n } else if (columnFormatHeader === \"capitalize\") {\n return label[0].toUpperCase() + label.slice(1).toLowerCase();\n }\n return label;\n};\n\nconst columnDescriptorToRuntimeColumDescriptor =\n (tableAttributes: TableAttributes, tableSchema?: TableSchema) =>\n (column: ColumnDescriptor, ariaColIndex: number): RuntimeColumnDescriptor => {\n const { columnDefaultWidth = DEFAULT_COLUMN_WIDTH, columnFormatHeader } =\n tableAttributes;\n const serverDataType = getDataType(column, tableSchema);\n const {\n align = getDefaultAlignment(serverDataType),\n name,\n label = getColumnLabel(column),\n source = \"server\",\n width = columnDefaultWidth,\n ...rest\n } = column;\n\n const runtimeColumnWithDefaults: RuntimeColumnDescriptor = {\n ...rest,\n align,\n ariaColIndex,\n CellRenderer: getCellRenderer(column),\n HeaderCellContentRenderer: getColumnHeaderContentRenderer(column),\n HeaderCellLabelRenderer: getColumnHeaderLabelRenderer(column),\n clientSideEditValidationCheck: hasValidationRules(column.type)\n ? buildValidationChecker(column.type.rules)\n : undefined,\n label: getLabel(label, columnFormatHeader),\n name,\n originalIdx: ariaColIndex,\n serverDataType,\n source,\n valueFormatter: getValueFormatter(column, serverDataType),\n width,\n };\n\n if (isGroupColumn(runtimeColumnWithDefaults)) {\n runtimeColumnWithDefaults.columns = runtimeColumnWithDefaults.columns.map(\n (col) =>\n columnDescriptorToRuntimeColumDescriptor(tableAttributes)(col, -1),\n );\n }\n\n return runtimeColumnWithDefaults;\n };\n\nfunction moveColumn(\n state: InternalTableModel,\n // TODO do we ever use this ?\n { column, moveBy }: ColumnActionMove,\n) {\n const { columns } = state;\n if (typeof moveBy === \"number\") {\n const idx = columns.indexOf(column);\n const newColumns = columns.slice();\n const [movedColumns] = newColumns.splice(idx, 1);\n newColumns.splice(idx + moveBy, 0, movedColumns);\n return {\n ...state,\n columns: newColumns,\n };\n }\n return state;\n}\n\nfunction hideColumns(state: InternalTableModel, { columns }: ColumnActionHide) {\n if (columns.some((col) => col.hidden !== true)) {\n return columns.reduce<InternalTableModel>((s, c) => {\n if (c.hidden !== true) {\n return updateColumnProp(s, {\n type: \"updateColumnProp\",\n column: c,\n hidden: true,\n });\n } else {\n return s;\n }\n }, state);\n } else {\n return state;\n }\n}\nfunction showColumns(state: InternalTableModel, { columns }: ColumnActionShow) {\n if (columns.some((col) => col.hidden)) {\n return columns.reduce<InternalTableModel>((s, c) => {\n if (c.hidden) {\n return updateColumnProp(s, {\n type: \"updateColumnProp\",\n column: c,\n hidden: false,\n });\n } else {\n return s;\n }\n }, state);\n } else {\n return state;\n }\n}\n\nfunction resizeColumn(\n state: InternalTableModel,\n { column, phase, width }: ColumnActionResize,\n) {\n const type = \"updateColumnProp\";\n const resizing = phase !== \"end\";\n switch (phase) {\n case \"begin\":\n return updateColumnProp(state, { type, column, resizing });\n case \"end\": {\n const { tableConfig } = state;\n const isFit = tableConfig.columnLayout === \"fit\";\n const newState: InternalTableModel = isFit\n ? {\n ...state,\n tableConfig: applyRuntimeColumnWidthsToConfig(\n tableConfig,\n state.columns,\n ),\n }\n : state;\n return updateColumnProp(newState, { type, column, resizing, width });\n }\n case \"resize\":\n return updateColumnProp(state, { type, column, width });\n default:\n throw Error(`useTableModel.resizeColumn, invalid resizePhase ${phase}`);\n }\n}\n\nfunction setTableSchema(\n state: InternalTableModel,\n { tableSchema }: ColumnActionSetTableSchema,\n) {\n const { columns } = state;\n if (columns.some(columnWithoutDataType)) {\n const cols = columns.map((column) => {\n const serverDataType = getDataType(column, tableSchema);\n return {\n ...column,\n align: column.align ?? getDefaultAlignment(serverDataType),\n serverDataType,\n };\n });\n\n return {\n ...state,\n columns: cols,\n };\n } else {\n return state;\n }\n}\n\nfunction pinColumn(state: InternalTableModel, action: ColumnActionPin) {\n let { columns } = state;\n const { column, pin } = action;\n const targetColumn = columns.find((col) => col.name === column.name);\n if (targetColumn) {\n columns = replaceColumn(columns, { ...targetColumn, pin });\n columns = sortPinnedColumns(columns);\n return {\n ...state,\n columns,\n };\n } else {\n return state;\n }\n}\nfunction updateColumnProp(\n state: InternalTableModel,\n action: ColumnActionUpdateProp,\n) {\n let { columns, tableConfig } = state;\n const { align, column, hidden, label, resizing, width } = action;\n const targetColumn = columns.find((col) => col.name === column.name);\n if (targetColumn) {\n if (align === \"left\" || align === \"right\") {\n columns = replaceColumn(columns, { ...targetColumn, align });\n }\n if (typeof label === \"string\") {\n columns = replaceColumn(columns, { ...targetColumn, label });\n }\n if (typeof resizing === \"boolean\") {\n columns = replaceColumn(columns, { ...targetColumn, resizing });\n }\n if (typeof hidden === \"boolean\") {\n columns = replaceColumn(columns, { ...targetColumn, hidden });\n }\n if (typeof width === \"number\") {\n columns = replaceColumn(columns, { ...targetColumn, width });\n\n const targetConfigColumn = tableConfig.columns.find(\n (col) => col.name === column.name,\n );\n if (targetConfigColumn) {\n tableConfig = {\n ...tableConfig,\n columns: replaceColumn<ColumnDescriptor>(tableConfig.columns, {\n ...targetConfigColumn,\n width,\n }),\n };\n }\n }\n }\n return {\n ...state,\n columns,\n tableConfig,\n } as InternalTableModel;\n}\n\nfunction updateTableConfig(\n state: InternalTableModel,\n {\n confirmed,\n filterSpec,\n groupBy,\n sort,\n }: Omit<ColumnActionTableConfig, \"columns\">,\n) {\n let result = state;\n\n const { availableWidth, columnLayout = \"static\" } = state;\n\n if (groupBy.length > 0) {\n const groupedColumns = applyGroupByToColumns({\n columns: result.columns,\n groupBy,\n confirmed,\n availableWidth,\n });\n const columns = applyWidthToColumns(groupedColumns, {\n availableWidth,\n columnLayout,\n });\n\n result = {\n ...state,\n columns,\n };\n } else if (isGroupColumn(result.columns[0]) && confirmed === false) {\n // reset groupConfirmed to false, if true\n }\n\n if (sort.sortDefs.length > 0) {\n result = {\n ...state,\n columns: applySortToColumns(result.columns, sort),\n };\n } else if (existingSort(result.columns)) {\n result = {\n ...state,\n columns: removeSort(result.columns),\n };\n }\n\n if (filterSpec.filter.length > 0) {\n result = {\n ...state,\n columns: applyFilterToColumns(result.columns, filterSpec),\n };\n } else if (result.columns.some(isFilteredColumn)) {\n result = {\n ...state,\n columns: stripFilterFromColumns(result.columns),\n };\n }\n\n return result;\n}\n"],"names":["logger","applyRuntimeColumnWidthsToConfig","useReducer","subscribedOnly","applyWidthToColumns","isPinned","sortPinnedColumns","getTableHeadings","checkConfirmationPending","getColumnLabel","getCellRenderer","getColumnHeaderContentRenderer","getColumnHeaderLabelRenderer","hasValidationRules","buildValidationChecker","getValueFormatter","isGroupColumn","replaceColumn","applyGroupByToColumns","applySortToColumns","existingSort","removeSort","applyFilterToColumns","isFilteredColumn","stripFilterFromColumns"],"mappings":"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"}
1
+ {"version":3,"file":"useTableModel.js","sources":["../src/useTableModel.ts"],"sourcesContent":["import {\n ColumnDescriptor,\n ColumnLayout,\n PinLocation,\n ResizePhase,\n RuntimeColumnDescriptor,\n TableAttributes,\n TableConfig,\n TableHeadings,\n TableSelectionModel,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n applyFilterToColumns,\n applyGroupByToColumns,\n applyRuntimeColumnWidthsToConfig,\n applySortToColumns,\n applyWidthToColumns,\n checkConfirmationPending,\n existingSort,\n getCellRenderer,\n getColumnHeaderContentRenderer,\n getColumnHeaderLabelRenderer,\n getColumnLabel,\n getTableHeadings,\n getValueFormatter,\n hasValidationRules,\n isFilteredColumn,\n isGroupColumn,\n isPinned,\n logger,\n removeSort,\n replaceColumn,\n sortPinnedColumns,\n stripFilterFromColumns,\n subscribedOnly,\n} from \"@vuu-ui/vuu-utils\";\n\nimport {\n DataSource,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuColumnDataType } from \"@vuu-ui/vuu-protocol-types\";\nimport { Reducer, useReducer } from \"react\";\nimport { buildValidationChecker } from \"@vuu-ui/vuu-data-react\";\n\nconst { info } = logger(\"useTableModel\");\n\nconst DEFAULT_COLUMN_WIDTH = 100;\n\nconst columnWithoutDataType = ({ serverDataType }: ColumnDescriptor) =>\n serverDataType === undefined;\n\nconst getDataType = (\n column: ColumnDescriptor,\n tableSchema?: TableSchema,\n): VuuColumnDataType | undefined => {\n const schemaColumn = tableSchema?.columns.find(\n ({ name }) => name === column.name,\n );\n if (schemaColumn) {\n return schemaColumn.serverDataType;\n } else {\n return column.serverDataType;\n }\n};\n\nconst checkboxColumnDescriptor: ColumnDescriptor = {\n label: \"\",\n name: \"\",\n width: 25,\n sortable: false,\n isSystemColumn: true,\n type: {\n name: \"checkbox\",\n renderer: {\n name: \"checkbox-row-selector-cell\",\n },\n },\n};\n\n/**\n * TableModel represents state used internally to manage Table. It is\n * derived initially from the TableConfig provided by user, along with the\n * data-related config from DataSource.\n */\nexport interface TableModel extends TableAttributes {\n columns: RuntimeColumnDescriptor[];\n headings: TableHeadings;\n}\n\n/**\n * InternalTableModel describes the state managed within the TableModel\n * reducer. It is the same as TableModel but with the addition of a\n * readonly copy of the original TableConfig.\n */\ninterface InternalTableModel extends TableModel {\n availableWidth: number;\n tableConfig: Readonly<TableConfig>;\n}\n\nconst numericTypes = [\"int\", \"long\", \"double\"];\nconst getDefaultAlignment = (serverDataType?: VuuColumnDataType) =>\n serverDataType === undefined\n ? undefined\n : numericTypes.includes(serverDataType)\n ? \"right\"\n : \"left\";\n\nexport interface ColumnActionInit {\n availableWidth: number;\n type: \"init\";\n tableConfig: TableConfig;\n dataSource: DataSource;\n}\n\nexport interface ColumnActionHide {\n type: \"hideColumns\";\n columns: ColumnDescriptor[];\n}\n\nexport interface ColumnActionShow {\n type: \"showColumns\";\n columns: RuntimeColumnDescriptor[];\n}\nexport interface ColumnActionMove {\n type: \"moveColumn\";\n column: RuntimeColumnDescriptor;\n moveBy?: 1 | -1;\n}\n\nexport interface ColumnActionPin {\n type: \"pinColumn\";\n column: ColumnDescriptor;\n pin: PinLocation | false;\n}\n\nexport interface ColumnActionResize {\n type: \"resizeColumn\";\n column: RuntimeColumnDescriptor;\n phase: ResizePhase;\n width?: number;\n}\n\nexport interface ColumnActionSetTableSchema {\n type: \"setTableSchema\";\n tableSchema: TableSchema;\n}\n\nexport interface ColumnActionUpdate {\n type: \"updateColumn\";\n column: ColumnDescriptor;\n}\n\nexport interface ColumnActionUpdateProp {\n align?: ColumnDescriptor[\"align\"];\n column: ColumnDescriptor;\n hidden?: ColumnDescriptor[\"hidden\"];\n label?: ColumnDescriptor[\"label\"];\n resizing?: RuntimeColumnDescriptor[\"resizing\"];\n type: \"updateColumnProp\";\n width?: ColumnDescriptor[\"width\"];\n}\n\nexport interface ColumnActionTableConfig\n extends WithBaseFilter<WithFullConfig> {\n confirmed?: boolean;\n type: \"tableConfig\";\n}\n\nexport type TableModelAction =\n | ColumnActionHide\n | ColumnActionInit\n | ColumnActionMove\n | ColumnActionPin\n | ColumnActionResize\n | ColumnActionSetTableSchema\n | ColumnActionShow\n | ColumnActionUpdate\n | ColumnActionUpdateProp\n | ColumnActionTableConfig;\n\ntype TableModelReducer = Reducer<InternalTableModel, TableModelAction>;\n\nexport type TableModelActionDispatch = (action: TableModelAction) => void;\n\nconst tableModelReducer: TableModelReducer = (state, action) => {\n info?.(`TableModelReducer ${action.type}`);\n switch (action.type) {\n case \"init\": {\n if (\n state.tableConfig.columnLayout === \"manual\" &&\n action.tableConfig.columnLayout === \"fit\"\n ) {\n //TODO we're jumping through hoops here when we should just make config a controlled prop\n\n // Manual columnLayout has been assigned because user has resized one or more columns.\n // It happened during current session so tableConfig still reflects original value.\n return init({\n ...action,\n tableConfig: applyRuntimeColumnWidthsToConfig(\n action.tableConfig,\n state.columns,\n ),\n });\n } else {\n return init(action, state);\n }\n }\n case \"moveColumn\":\n return moveColumn(state, action);\n case \"resizeColumn\":\n return resizeColumn(state, action);\n case \"setTableSchema\":\n return setTableSchema(state, action);\n case \"hideColumns\":\n return hideColumns(state, action);\n case \"showColumns\":\n return showColumns(state, action);\n case \"pinColumn\":\n return pinColumn(state, action);\n case \"updateColumnProp\":\n return updateColumnProp(state, action);\n case \"tableConfig\":\n return updateTableConfig(state, action);\n default:\n console.log(`unhandled action ${action.type}`);\n return state;\n }\n};\n\nexport interface TableModelHookProps {\n config: TableConfig;\n dataSource: DataSource;\n selectionModel: TableSelectionModel;\n availableWidth: number;\n}\n\nexport const useTableModel = ({\n config: tableConfigProp,\n dataSource,\n selectionModel,\n availableWidth,\n}: TableModelHookProps) => {\n const [state, dispatchTableModelAction] = useReducer(\n tableModelReducer,\n {\n availableWidth,\n tableConfig: tableConfigProp,\n dataSource,\n selectionModel,\n },\n init,\n );\n\n const { columns, headings, tableConfig, ...tableAttributes } = state;\n\n return {\n columns,\n dispatchTableModelAction,\n headings,\n tableAttributes,\n tableConfig,\n };\n};\n\ntype InitialConfig = {\n availableWidth: number;\n columnLayout?: ColumnLayout;\n dataSource: DataSource;\n selectionModel?: TableSelectionModel;\n tableConfig: TableConfig;\n};\n\nfunction init(\n { availableWidth, dataSource, selectionModel, tableConfig }: InitialConfig,\n previousConfig?: InternalTableModel,\n): InternalTableModel {\n const { columns, ...tableAttributes } = tableConfig;\n const { config: dataSourceConfig, tableSchema } = dataSource;\n const toRuntimeColumnDescriptor = columnDescriptorToRuntimeColumDescriptor(\n tableAttributes,\n tableSchema,\n );\n\n const runtimeColumns: RuntimeColumnDescriptor[] = [];\n let colIndex = 1;\n for (const column of columns.filter(\n subscribedOnly(dataSourceConfig?.columns),\n )) {\n runtimeColumns.push(\n toRuntimeColumnDescriptor(column, column.hidden ? -1 : colIndex),\n );\n if (!column.hidden) {\n colIndex += 1;\n }\n }\n\n if (selectionModel === \"checkbox\") {\n runtimeColumns.splice(\n 0,\n 0,\n toRuntimeColumnDescriptor(checkboxColumnDescriptor, -1),\n );\n }\n\n const { columnLayout = \"static\" } = tableConfig;\n const runtimeColumnsWithLayout = applyWidthToColumns(runtimeColumns, {\n availableWidth,\n columnLayout,\n });\n\n const columnsInRenderOrder = runtimeColumnsWithLayout.some(isPinned)\n ? sortPinnedColumns(runtimeColumnsWithLayout)\n : runtimeColumnsWithLayout;\n\n let state: InternalTableModel = {\n availableWidth,\n columns: columnsInRenderOrder,\n headings: getTableHeadings(columnsInRenderOrder),\n tableConfig,\n ...tableAttributes,\n };\n if (dataSourceConfig) {\n const { columns: _, ...rest } = dataSourceConfig;\n state = updateTableConfig(state, {\n type: \"tableConfig\",\n ...rest,\n confirmed: checkConfirmationPending(previousConfig),\n });\n }\n return state;\n}\n\nconst getLabel = (\n label: string,\n columnFormatHeader?: \"uppercase\" | \"capitalize\",\n): string => {\n if (columnFormatHeader === \"uppercase\") {\n return label.toUpperCase();\n } else if (columnFormatHeader === \"capitalize\") {\n return label[0].toUpperCase() + label.slice(1).toLowerCase();\n }\n return label;\n};\n\nconst columnDescriptorToRuntimeColumDescriptor =\n (tableAttributes: TableAttributes, tableSchema?: TableSchema) =>\n (column: ColumnDescriptor, ariaColIndex: number): RuntimeColumnDescriptor => {\n const { columnDefaultWidth = DEFAULT_COLUMN_WIDTH, columnFormatHeader } =\n tableAttributes;\n const serverDataType = getDataType(column, tableSchema);\n const {\n align = getDefaultAlignment(serverDataType),\n name,\n label = getColumnLabel(column),\n source = \"server\",\n width = columnDefaultWidth,\n ...rest\n } = column;\n\n const runtimeColumnWithDefaults: RuntimeColumnDescriptor = {\n ...rest,\n align,\n ariaColIndex,\n CellRenderer: getCellRenderer(column),\n HeaderCellContentRenderer: getColumnHeaderContentRenderer(column),\n HeaderCellLabelRenderer: getColumnHeaderLabelRenderer(column),\n clientSideEditValidationCheck: hasValidationRules(column.type)\n ? buildValidationChecker(column.type.rules)\n : undefined,\n label: getLabel(label, columnFormatHeader),\n name,\n originalIdx: ariaColIndex,\n serverDataType,\n source,\n valueFormatter: getValueFormatter(column, serverDataType),\n width,\n };\n\n if (isGroupColumn(runtimeColumnWithDefaults)) {\n runtimeColumnWithDefaults.columns = runtimeColumnWithDefaults.columns.map(\n (col) =>\n columnDescriptorToRuntimeColumDescriptor(tableAttributes)(col, -1),\n );\n }\n\n return runtimeColumnWithDefaults;\n };\n\nfunction moveColumn(\n state: InternalTableModel,\n // TODO do we ever use this ?\n { column, moveBy }: ColumnActionMove,\n) {\n const { columns } = state;\n if (typeof moveBy === \"number\") {\n const idx = columns.indexOf(column);\n const newColumns = columns.slice();\n const [movedColumns] = newColumns.splice(idx, 1);\n newColumns.splice(idx + moveBy, 0, movedColumns);\n return {\n ...state,\n columns: newColumns,\n };\n }\n return state;\n}\n\nfunction hideColumns(state: InternalTableModel, { columns }: ColumnActionHide) {\n if (columns.some((col) => col.hidden !== true)) {\n return columns.reduce<InternalTableModel>((s, c) => {\n if (c.hidden !== true) {\n return updateColumnProp(s, {\n type: \"updateColumnProp\",\n column: c,\n hidden: true,\n });\n } else {\n return s;\n }\n }, state);\n } else {\n return state;\n }\n}\nfunction showColumns(state: InternalTableModel, { columns }: ColumnActionShow) {\n if (columns.some((col) => col.hidden)) {\n return columns.reduce<InternalTableModel>((s, c) => {\n if (c.hidden) {\n return updateColumnProp(s, {\n type: \"updateColumnProp\",\n column: c,\n hidden: false,\n });\n } else {\n return s;\n }\n }, state);\n } else {\n return state;\n }\n}\n\nfunction resizeColumn(\n state: InternalTableModel,\n { column, phase, width }: ColumnActionResize,\n) {\n const type = \"updateColumnProp\";\n const resizing = phase !== \"end\";\n switch (phase) {\n case \"begin\":\n return updateColumnProp(state, { type, column, resizing });\n case \"end\": {\n const { tableConfig } = state;\n const isFit = tableConfig.columnLayout === \"fit\";\n const newState: InternalTableModel = isFit\n ? {\n ...state,\n tableConfig: applyRuntimeColumnWidthsToConfig(\n tableConfig,\n state.columns,\n ),\n }\n : state;\n return updateColumnProp(newState, { type, column, resizing, width });\n }\n case \"resize\":\n return updateColumnProp(state, { type, column, width });\n default:\n throw Error(`useTableModel.resizeColumn, invalid resizePhase ${phase}`);\n }\n}\n\nfunction setTableSchema(\n state: InternalTableModel,\n { tableSchema }: ColumnActionSetTableSchema,\n) {\n const { columns } = state;\n if (columns.some(columnWithoutDataType)) {\n const cols = columns.map((column) => {\n const serverDataType = getDataType(column, tableSchema);\n return {\n ...column,\n align: column.align ?? getDefaultAlignment(serverDataType),\n serverDataType,\n };\n });\n\n return {\n ...state,\n columns: cols,\n };\n } else {\n return state;\n }\n}\n\nfunction pinColumn(state: InternalTableModel, action: ColumnActionPin) {\n let { columns } = state;\n const { column, pin } = action;\n const targetColumn = columns.find((col) => col.name === column.name);\n if (targetColumn) {\n columns = replaceColumn(columns, { ...targetColumn, pin });\n columns = sortPinnedColumns(columns);\n return {\n ...state,\n columns,\n };\n } else {\n return state;\n }\n}\nfunction updateColumnProp(\n state: InternalTableModel,\n action: ColumnActionUpdateProp,\n) {\n let { columns, tableConfig } = state;\n const { align, column, hidden, label, resizing, width } = action;\n const targetColumn = columns.find((col) => col.name === column.name);\n if (targetColumn) {\n if (align === \"left\" || align === \"right\") {\n columns = replaceColumn(columns, { ...targetColumn, align });\n }\n if (typeof label === \"string\") {\n columns = replaceColumn(columns, { ...targetColumn, label });\n }\n if (typeof resizing === \"boolean\") {\n columns = replaceColumn(columns, { ...targetColumn, resizing });\n }\n if (typeof hidden === \"boolean\") {\n columns = replaceColumn(columns, { ...targetColumn, hidden });\n }\n if (typeof width === \"number\") {\n columns = replaceColumn(columns, { ...targetColumn, width });\n\n const targetConfigColumn = tableConfig.columns.find(\n (col) => col.name === column.name,\n );\n if (targetConfigColumn) {\n tableConfig = {\n ...tableConfig,\n columns: replaceColumn<ColumnDescriptor>(tableConfig.columns, {\n ...targetConfigColumn,\n width,\n }),\n };\n }\n }\n }\n return {\n ...state,\n columns,\n tableConfig,\n } as InternalTableModel;\n}\n\nfunction updateTableConfig(\n state: InternalTableModel,\n {\n confirmed,\n filterSpec,\n groupBy,\n sort,\n }: Omit<ColumnActionTableConfig, \"columns\">,\n) {\n let result = state;\n\n const { availableWidth, columnLayout = \"static\" } = state;\n\n if (groupBy.length > 0) {\n const groupedColumns = applyGroupByToColumns({\n columns: result.columns,\n groupBy,\n confirmed,\n availableWidth,\n });\n const columns = applyWidthToColumns(groupedColumns, {\n availableWidth,\n columnLayout,\n });\n\n result = {\n ...state,\n columns,\n };\n } else if (isGroupColumn(result.columns[0]) && confirmed === false) {\n // reset groupConfirmed to false, if true\n }\n\n if (sort.sortDefs.length > 0) {\n result = {\n ...state,\n columns: applySortToColumns(result.columns, sort),\n };\n } else if (existingSort(result.columns)) {\n result = {\n ...state,\n columns: removeSort(result.columns),\n };\n }\n\n if (filterSpec.filter.length > 0) {\n result = {\n ...state,\n columns: applyFilterToColumns(result.columns, filterSpec),\n };\n } else if (result.columns.some(isFilteredColumn)) {\n result = {\n ...state,\n columns: stripFilterFromColumns(result.columns),\n };\n }\n\n return result;\n}\n"],"names":["logger","applyRuntimeColumnWidthsToConfig","useReducer","subscribedOnly","applyWidthToColumns","isPinned","sortPinnedColumns","getTableHeadings","checkConfirmationPending","getColumnLabel","getCellRenderer","getColumnHeaderContentRenderer","getColumnHeaderLabelRenderer","hasValidationRules","buildValidationChecker","getValueFormatter","isGroupColumn","replaceColumn","applyGroupByToColumns","applySortToColumns","existingSort","removeSort","applyFilterToColumns","isFilteredColumn","stripFilterFromColumns"],"mappings":"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"}