@vuu-ui/vuu-table 0.8.81 → 0.8.83

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 (75) hide show
  1. package/cjs/Row.js.map +1 -1
  2. package/cjs/Table.js.map +1 -1
  3. package/cjs/bulk-edit/BulkEditRow.js +1 -1
  4. package/cjs/bulk-edit/BulkEditRow.js.map +1 -1
  5. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
  6. package/cjs/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +1 -1
  7. package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -1
  8. package/cjs/cell-renderers/toggle-cell/ToggleCell.js +38 -41
  9. package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
  10. package/cjs/column-header-pill/ColumnHeaderPill.js.map +1 -1
  11. package/cjs/column-header-pill/GroupColumnPill.js.map +1 -1
  12. package/cjs/column-header-pill/SortIndicator.js.map +1 -1
  13. package/cjs/column-resizing/useTableColumnResize.js.map +1 -1
  14. package/cjs/context-menu/buildContextMenuDescriptors.js.map +1 -1
  15. package/cjs/context-menu/useHandleTableContextMenu.js.map +1 -1
  16. package/cjs/header-cell/GroupHeaderCell.js.map +1 -1
  17. package/cjs/header-cell/HeaderCell.js.map +1 -1
  18. package/cjs/table-cell/TableCell.js.map +1 -1
  19. package/cjs/table-cell/TableGroupCell.js.map +1 -1
  20. package/cjs/table-config.js.map +1 -1
  21. package/cjs/table-header/TableHeader.js.map +1 -1
  22. package/cjs/table-header/useTableHeader.js.map +1 -1
  23. package/cjs/useCell.js.map +1 -1
  24. package/cjs/useCellEditing.js.map +1 -1
  25. package/cjs/useControlledTableNavigation.js.map +1 -1
  26. package/cjs/useDataSource.js.map +1 -1
  27. package/cjs/useKeyboardNavigation.js.map +1 -1
  28. package/cjs/useMeasuredHeight.js.map +1 -1
  29. package/cjs/useRowClassNameGenerators.js.map +1 -1
  30. package/cjs/useSelection.js.map +1 -1
  31. package/cjs/useTable.js.map +1 -1
  32. package/cjs/useTableAndColumnSettings.js.map +1 -1
  33. package/cjs/useTableContextMenu.js.map +1 -1
  34. package/cjs/useTableModel.js.map +1 -1
  35. package/cjs/useTableScroll.js +7 -11
  36. package/cjs/useTableScroll.js.map +1 -1
  37. package/cjs/useTableViewport.js.map +1 -1
  38. package/esm/Row.js.map +1 -1
  39. package/esm/Table.js.map +1 -1
  40. package/esm/bulk-edit/BulkEditRow.js +1 -1
  41. package/esm/bulk-edit/BulkEditRow.js.map +1 -1
  42. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -1
  43. package/esm/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +1 -1
  44. package/esm/cell-renderers/input-cell/InputCell.js.map +1 -1
  45. package/esm/cell-renderers/toggle-cell/ToggleCell.js +38 -41
  46. package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -1
  47. package/esm/column-header-pill/ColumnHeaderPill.js.map +1 -1
  48. package/esm/column-header-pill/GroupColumnPill.js.map +1 -1
  49. package/esm/column-header-pill/SortIndicator.js.map +1 -1
  50. package/esm/column-resizing/useTableColumnResize.js.map +1 -1
  51. package/esm/context-menu/buildContextMenuDescriptors.js.map +1 -1
  52. package/esm/context-menu/useHandleTableContextMenu.js.map +1 -1
  53. package/esm/header-cell/GroupHeaderCell.js.map +1 -1
  54. package/esm/header-cell/HeaderCell.js.map +1 -1
  55. package/esm/table-cell/TableCell.js.map +1 -1
  56. package/esm/table-cell/TableGroupCell.js.map +1 -1
  57. package/esm/table-config.js.map +1 -1
  58. package/esm/table-header/TableHeader.js.map +1 -1
  59. package/esm/table-header/useTableHeader.js.map +1 -1
  60. package/esm/useCell.js.map +1 -1
  61. package/esm/useCellEditing.js.map +1 -1
  62. package/esm/useControlledTableNavigation.js.map +1 -1
  63. package/esm/useDataSource.js.map +1 -1
  64. package/esm/useKeyboardNavigation.js.map +1 -1
  65. package/esm/useMeasuredHeight.js.map +1 -1
  66. package/esm/useRowClassNameGenerators.js.map +1 -1
  67. package/esm/useSelection.js.map +1 -1
  68. package/esm/useTable.js.map +1 -1
  69. package/esm/useTableAndColumnSettings.js.map +1 -1
  70. package/esm/useTableContextMenu.js.map +1 -1
  71. package/esm/useTableModel.js.map +1 -1
  72. package/esm/useTableScroll.js +7 -11
  73. package/esm/useTableScroll.js.map +1 -1
  74. package/esm/useTableViewport.js.map +1 -1
  75. package/package.json +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"useTableAndColumnSettings.js","sources":["../src/useTableAndColumnSettings.ts"],"sourcesContent":["import { DataSourceConfig, SchemaColumn } from \"@vuu-ui/vuu-data-types\";\nimport { useLayoutProviderDispatch } from \"@vuu-ui/vuu-layout\";\nimport {\n ColumnDescriptor,\n ColumnSettingsProps,\n TableConfig,\n TableSettingsProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n VuuShellLocation,\n getCalculatedColumnDetails,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { ColumnActionColumnSettings } from \"./useTableModel\";\n\nexport interface TableAndColumnSettingsHookProps {\n availableColumns: SchemaColumn[];\n onAvailableColumnsChange?: (columns: SchemaColumn[]) => void;\n onConfigChange: (config: TableConfig) => void;\n onCreateCalculatedColumn: (column: ColumnDescriptor) => void;\n onDataSourceConfigChange: (dataSourceConfig: DataSourceConfig) => void;\n tableConfig: TableConfig;\n}\nexport const useTableAndColumnSettings = ({\n availableColumns: availableColumnsProps,\n onAvailableColumnsChange,\n onConfigChange,\n onCreateCalculatedColumn,\n onDataSourceConfigChange,\n tableConfig,\n}: TableAndColumnSettingsHookProps) => {\n const dispatchLayoutAction = useLayoutProviderDispatch();\n const showTableSettingsRef = useRef<() => void>();\n\n const [availableColumns, setAvailableColumns] = useState<SchemaColumn[]>(\n availableColumnsProps\n );\n\n const showContextPanel = useCallback(\n (\n componentType: string,\n title: string,\n props: TableSettingsProps | ColumnSettingsProps\n ) => {\n dispatchLayoutAction({\n type: \"set-props\",\n path: `#${VuuShellLocation.ContextPanel}`,\n props: {\n expanded: true,\n content: {\n type: componentType,\n props,\n },\n title,\n },\n });\n },\n [dispatchLayoutAction]\n );\n\n const handleCancelCreateColumn = useCallback(() => {\n requestAnimationFrame(() => {\n showTableSettingsRef.current?.();\n });\n }, []);\n\n const handleCreateCalculatedColumn = useCallback(\n (column: ColumnDescriptor) => {\n const { serverDataType } = getCalculatedColumnDetails(column);\n if (serverDataType) {\n const newAvailableColumns = availableColumns.concat({\n name: column.name,\n serverDataType,\n });\n setAvailableColumns(newAvailableColumns);\n onAvailableColumnsChange?.(newAvailableColumns);\n requestAnimationFrame(() => {\n showTableSettingsRef.current?.();\n });\n onCreateCalculatedColumn(column);\n } else {\n throw Error(\n \"Cannot create calculatec columns without valis serverDataType\"\n );\n }\n },\n [availableColumns, onAvailableColumnsChange, onCreateCalculatedColumn]\n );\n\n const showColumnSettingsPanel = useCallback(\n (action: ColumnActionColumnSettings) => {\n showContextPanel(\"ColumnSettings\", \"Column Settings\", {\n column: action.column,\n onCancelCreateColumn: handleCancelCreateColumn,\n onConfigChange,\n onCreateCalculatedColumn: handleCreateCalculatedColumn,\n tableConfig,\n vuuTable: action.vuuTable,\n } as ColumnSettingsProps);\n },\n [\n handleCancelCreateColumn,\n handleCreateCalculatedColumn,\n onConfigChange,\n showContextPanel,\n tableConfig,\n ]\n );\n\n const handleAddCalculatedColumn = useCallback(() => {\n showColumnSettingsPanel({\n column: {\n name: \"::\",\n serverDataType: \"string\",\n },\n type: \"columnSettings\",\n vuuTable: { module: \"SIMUL\", table: \"instruments\" },\n });\n }, [showColumnSettingsPanel]);\n\n const handleNavigateToColumn = useCallback(\n (columnName: string) => {\n const column = tableConfig.columns.find((c) => c.name === columnName);\n if (column) {\n showColumnSettingsPanel({\n type: \"columnSettings\",\n column,\n //TODO where do we get this from\n vuuTable: { module: \"SIMUL\", table: \"instruments\" },\n });\n }\n },\n [showColumnSettingsPanel, tableConfig.columns]\n );\n\n showTableSettingsRef.current = useCallback(() => {\n showContextPanel(\"TableSettings\", \"DataGrid Settings\", {\n availableColumns:\n availableColumns ??\n tableConfig.columns.map(({ name, serverDataType }) => ({\n name,\n serverDataType,\n })),\n onAddCalculatedColumn: handleAddCalculatedColumn,\n onConfigChange,\n onDataSourceConfigChange,\n onNavigateToColumn: handleNavigateToColumn,\n tableConfig,\n } as TableSettingsProps);\n }, [\n availableColumns,\n handleAddCalculatedColumn,\n handleNavigateToColumn,\n onConfigChange,\n onDataSourceConfigChange,\n showContextPanel,\n tableConfig,\n ]);\n\n return {\n showColumnSettingsPanel,\n showTableSettingsPanel: showTableSettingsRef.current,\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTableAndColumnSettings.js","sources":["../src/useTableAndColumnSettings.ts"],"sourcesContent":["import { DataSourceConfig, SchemaColumn } from \"@vuu-ui/vuu-data-types\";\nimport { useLayoutProviderDispatch } from \"@vuu-ui/vuu-layout\";\nimport {\n ColumnDescriptor,\n ColumnSettingsProps,\n TableConfig,\n TableSettingsProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n VuuShellLocation,\n getCalculatedColumnDetails,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { ColumnActionColumnSettings } from \"./useTableModel\";\n\nexport interface TableAndColumnSettingsHookProps {\n availableColumns: SchemaColumn[];\n onAvailableColumnsChange?: (columns: SchemaColumn[]) => void;\n onConfigChange: (config: TableConfig) => void;\n onCreateCalculatedColumn: (column: ColumnDescriptor) => void;\n onDataSourceConfigChange: (dataSourceConfig: DataSourceConfig) => void;\n tableConfig: TableConfig;\n}\nexport const useTableAndColumnSettings = ({\n availableColumns: availableColumnsProps,\n onAvailableColumnsChange,\n onConfigChange,\n onCreateCalculatedColumn,\n onDataSourceConfigChange,\n tableConfig,\n}: TableAndColumnSettingsHookProps) => {\n const dispatchLayoutAction = useLayoutProviderDispatch();\n const showTableSettingsRef = useRef<() => void>();\n\n const [availableColumns, setAvailableColumns] = useState<SchemaColumn[]>(\n availableColumnsProps,\n );\n\n const showContextPanel = useCallback(\n (\n componentType: string,\n title: string,\n props: TableSettingsProps | ColumnSettingsProps,\n ) => {\n dispatchLayoutAction({\n type: \"set-props\",\n path: `#${VuuShellLocation.ContextPanel}`,\n props: {\n expanded: true,\n content: {\n type: componentType,\n props,\n },\n title,\n },\n });\n },\n [dispatchLayoutAction],\n );\n\n const handleCancelCreateColumn = useCallback(() => {\n requestAnimationFrame(() => {\n showTableSettingsRef.current?.();\n });\n }, []);\n\n const handleCreateCalculatedColumn = useCallback(\n (column: ColumnDescriptor) => {\n const { serverDataType } = getCalculatedColumnDetails(column);\n if (serverDataType) {\n const newAvailableColumns = availableColumns.concat({\n name: column.name,\n serverDataType,\n });\n setAvailableColumns(newAvailableColumns);\n onAvailableColumnsChange?.(newAvailableColumns);\n requestAnimationFrame(() => {\n showTableSettingsRef.current?.();\n });\n onCreateCalculatedColumn(column);\n } else {\n throw Error(\n \"Cannot create calculatec columns without valis serverDataType\",\n );\n }\n },\n [availableColumns, onAvailableColumnsChange, onCreateCalculatedColumn],\n );\n\n const showColumnSettingsPanel = useCallback(\n (action: ColumnActionColumnSettings) => {\n showContextPanel(\"ColumnSettings\", \"Column Settings\", {\n column: action.column,\n onCancelCreateColumn: handleCancelCreateColumn,\n onConfigChange,\n onCreateCalculatedColumn: handleCreateCalculatedColumn,\n tableConfig,\n vuuTable: action.vuuTable,\n } as ColumnSettingsProps);\n },\n [\n handleCancelCreateColumn,\n handleCreateCalculatedColumn,\n onConfigChange,\n showContextPanel,\n tableConfig,\n ],\n );\n\n const handleAddCalculatedColumn = useCallback(() => {\n showColumnSettingsPanel({\n column: {\n name: \"::\",\n serverDataType: \"string\",\n },\n type: \"columnSettings\",\n vuuTable: { module: \"SIMUL\", table: \"instruments\" },\n });\n }, [showColumnSettingsPanel]);\n\n const handleNavigateToColumn = useCallback(\n (columnName: string) => {\n const column = tableConfig.columns.find((c) => c.name === columnName);\n if (column) {\n showColumnSettingsPanel({\n type: \"columnSettings\",\n column,\n //TODO where do we get this from\n vuuTable: { module: \"SIMUL\", table: \"instruments\" },\n });\n }\n },\n [showColumnSettingsPanel, tableConfig.columns],\n );\n\n showTableSettingsRef.current = useCallback(() => {\n showContextPanel(\"TableSettings\", \"DataGrid Settings\", {\n availableColumns:\n availableColumns ??\n tableConfig.columns.map(({ name, serverDataType }) => ({\n name,\n serverDataType,\n })),\n onAddCalculatedColumn: handleAddCalculatedColumn,\n onConfigChange,\n onDataSourceConfigChange,\n onNavigateToColumn: handleNavigateToColumn,\n tableConfig,\n } as TableSettingsProps);\n }, [\n availableColumns,\n handleAddCalculatedColumn,\n handleNavigateToColumn,\n onConfigChange,\n onDataSourceConfigChange,\n showContextPanel,\n tableConfig,\n ]);\n\n return {\n showColumnSettingsPanel,\n showTableSettingsPanel: showTableSettingsRef.current,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTableContextMenu.js","sources":["../src/useTableContextMenu.ts"],"sourcesContent":["import { DataSource, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useContextMenu as usePopupContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { buildColumnMap, getIndexFromRowElement } from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback } from \"react\";\n\nexport interface TableContextMenuHookProps {\n columns: RuntimeColumnDescriptor[];\n data: DataSourceRow[];\n dataSource: DataSource;\n getSelectedRows: () => DataSourceRow[];\n}\n\nconst NO_ROWS = [] as const;\n\nexport const useTableContextMenu = ({\n columns,\n data,\n dataSource,\n getSelectedRows,\n}: TableContextMenuHookProps) => {\n const [showContextMenu] = usePopupContextMenu();\n\n const onContextMenu = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const cellEl = target?.closest(\"div[role='cell']\");\n const rowEl = target?.closest(\"div[role='row']\") as HTMLElement;\n if (cellEl && rowEl) {\n const { selectedRowsCount } = dataSource;\n const columnMap = buildColumnMap(columns);\n const rowIndex = getIndexFromRowElement(rowEl);\n const cellIndex = Array.from(rowEl.childNodes).indexOf(cellEl);\n const row = data.find(([idx]) => idx === rowIndex);\n const columnName = columns[cellIndex];\n // TODO does it really make sense to collect selected rows ?\n // We only have access to rows in local cache\n showContextMenu(evt, \"grid\", {\n columnMap,\n columnName,\n row,\n selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),\n viewport: dataSource.viewport,\n });\n }\n },\n [columns, data, dataSource, getSelectedRows, showContextMenu]\n );\n\n return onContextMenu;\n};\n"],"names":["usePopupContextMenu"],"mappings":";;;;AAaA,MAAM,UAAU,EAAC,CAAA;AAEV,MAAM,sBAAsB,CAAC;AAAA,EAClC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AACF,CAAiC,KAAA;AAC/B,EAAM,MAAA,CAAC,eAAe,CAAA,GAAIA,cAAoB,EAAA,CAAA;AAE9C,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,GAAiC,KAAA;AAChC,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AACnB,MAAM,MAAA,MAAA,GAAS,MAAQ,EAAA,OAAA,CAAQ,kBAAkB,CAAA,CAAA;AACjD,MAAM,MAAA,KAAA,GAAQ,MAAQ,EAAA,OAAA,CAAQ,iBAAiB,CAAA,CAAA;AAC/C,MAAA,IAAI,UAAU,KAAO,EAAA;AACnB,QAAM,MAAA,EAAE,mBAAsB,GAAA,UAAA,CAAA;AAC9B,QAAM,MAAA,SAAA,GAAY,eAAe,OAAO,CAAA,CAAA;AACxC,QAAM,MAAA,QAAA,GAAW,uBAAuB,KAAK,CAAA,CAAA;AAC7C,QAAA,MAAM,YAAY,KAAM,CAAA,IAAA,CAAK,MAAM,UAAU,CAAA,CAAE,QAAQ,MAAM,CAAA,CAAA;AAC7D,QAAM,MAAA,GAAA,GAAM,KAAK,IAAK,CAAA,CAAC,CAAC,GAAG,CAAA,KAAM,QAAQ,QAAQ,CAAA,CAAA;AACjD,QAAM,MAAA,UAAA,GAAa,QAAQ,SAAS,CAAA,CAAA;AAGpC,QAAA,eAAA,CAAgB,KAAK,MAAQ,EAAA;AAAA,UAC3B,SAAA;AAAA,UACA,UAAA;AAAA,UACA,GAAA;AAAA,UACA,YAAc,EAAA,iBAAA,KAAsB,CAAI,GAAA,OAAA,GAAU,eAAgB,EAAA;AAAA,UAClE,UAAU,UAAW,CAAA,QAAA;AAAA,SACtB,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,IACA,CAAC,OAAA,EAAS,IAAM,EAAA,UAAA,EAAY,iBAAiB,eAAe,CAAA;AAAA,GAC9D,CAAA;AAEA,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"useTableContextMenu.js","sources":["../src/useTableContextMenu.ts"],"sourcesContent":["import { DataSource, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { useContextMenu as usePopupContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { buildColumnMap, getIndexFromRowElement } from \"@vuu-ui/vuu-utils\";\nimport { MouseEvent, useCallback } from \"react\";\n\nexport interface TableContextMenuHookProps {\n columns: RuntimeColumnDescriptor[];\n data: DataSourceRow[];\n dataSource: DataSource;\n getSelectedRows: () => DataSourceRow[];\n}\n\nconst NO_ROWS = [] as const;\n\nexport const useTableContextMenu = ({\n columns,\n data,\n dataSource,\n getSelectedRows,\n}: TableContextMenuHookProps) => {\n const [showContextMenu] = usePopupContextMenu();\n\n const onContextMenu = useCallback(\n (evt: MouseEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const cellEl = target?.closest(\"div[role='cell']\");\n const rowEl = target?.closest(\"div[role='row']\") as HTMLElement;\n if (cellEl && rowEl) {\n const { selectedRowsCount } = dataSource;\n const columnMap = buildColumnMap(columns);\n const rowIndex = getIndexFromRowElement(rowEl);\n const cellIndex = Array.from(rowEl.childNodes).indexOf(cellEl);\n const row = data.find(([idx]) => idx === rowIndex);\n const columnName = columns[cellIndex];\n // TODO does it really make sense to collect selected rows ?\n // We only have access to rows in local cache\n showContextMenu(evt, \"grid\", {\n columnMap,\n columnName,\n row,\n selectedRows: selectedRowsCount === 0 ? NO_ROWS : getSelectedRows(),\n viewport: dataSource.viewport,\n });\n }\n },\n [columns, data, dataSource, getSelectedRows, showContextMenu],\n );\n\n return onContextMenu;\n};\n"],"names":["usePopupContextMenu"],"mappings":";;;;AAaA,MAAM,UAAU,EAAC,CAAA;AAEV,MAAM,sBAAsB,CAAC;AAAA,EAClC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AACF,CAAiC,KAAA;AAC/B,EAAM,MAAA,CAAC,eAAe,CAAA,GAAIA,cAAoB,EAAA,CAAA;AAE9C,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,GAAiC,KAAA;AAChC,MAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AACnB,MAAM,MAAA,MAAA,GAAS,MAAQ,EAAA,OAAA,CAAQ,kBAAkB,CAAA,CAAA;AACjD,MAAM,MAAA,KAAA,GAAQ,MAAQ,EAAA,OAAA,CAAQ,iBAAiB,CAAA,CAAA;AAC/C,MAAA,IAAI,UAAU,KAAO,EAAA;AACnB,QAAM,MAAA,EAAE,mBAAsB,GAAA,UAAA,CAAA;AAC9B,QAAM,MAAA,SAAA,GAAY,eAAe,OAAO,CAAA,CAAA;AACxC,QAAM,MAAA,QAAA,GAAW,uBAAuB,KAAK,CAAA,CAAA;AAC7C,QAAA,MAAM,YAAY,KAAM,CAAA,IAAA,CAAK,MAAM,UAAU,CAAA,CAAE,QAAQ,MAAM,CAAA,CAAA;AAC7D,QAAM,MAAA,GAAA,GAAM,KAAK,IAAK,CAAA,CAAC,CAAC,GAAG,CAAA,KAAM,QAAQ,QAAQ,CAAA,CAAA;AACjD,QAAM,MAAA,UAAA,GAAa,QAAQ,SAAS,CAAA,CAAA;AAGpC,QAAA,eAAA,CAAgB,KAAK,MAAQ,EAAA;AAAA,UAC3B,SAAA;AAAA,UACA,UAAA;AAAA,UACA,GAAA;AAAA,UACA,YAAc,EAAA,iBAAA,KAAsB,CAAI,GAAA,OAAA,GAAU,eAAgB,EAAA;AAAA,UAClE,UAAU,UAAW,CAAA,QAAA;AAAA,SACtB,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,IACA,CAAC,OAAA,EAAS,IAAM,EAAA,UAAA,EAAY,iBAAiB,eAAe,CAAA;AAAA,GAC9D,CAAA;AAEA,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
@@ -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 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 DataSourceConfig,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuColumnDataType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { buildValidationChecker } from \"@vuu-ui/vuu-ui-controls\";\nimport { Reducer, useReducer } from \"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: RuntimeColumnDescriptor[];\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;\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: RuntimeColumnDescriptor;\n hidden?: ColumnDescriptor[\"hidden\"];\n label?: ColumnDescriptor[\"label\"];\n resizing?: RuntimeColumnDescriptor[\"resizing\"];\n type: \"updateColumnProp\";\n width?: ColumnDescriptor[\"width\"];\n}\n\nexport interface ColumnActionTableConfig extends DataSourceConfig {\n confirmed?: boolean;\n type: \"tableConfig\";\n}\n\nexport interface ColumnActionColumnSettings extends DataSourceConfig {\n type: \"columnSettings\";\n column: ColumnDescriptor;\n /** required only for calculated coplumns */\n vuuTable?: VuuTable;\n}\n\nexport interface ColumnActionTableSettings extends DataSourceConfig {\n type: \"tableSettings\";\n}\n\nexport const isShowColumnSettings = (\n action: PersistentColumnAction\n): action is ColumnActionColumnSettings => action.type === \"columnSettings\";\n\nexport const isShowTableSettings = (\n action: PersistentColumnAction\n): action is ColumnActionTableSettings => action.type === \"tableSettings\";\n\n/**\n * PersistentColumnActions are those actions that require us to persist user changes across sessions\n */\nexport type PersistentColumnAction =\n | ColumnActionPin\n | ColumnActionHide\n | ColumnActionColumnSettings\n | ColumnActionTableSettings;\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);\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 const useTableModel = (\n tableConfigProp: TableConfig,\n dataSource: DataSource,\n selectionModel: TableSelectionModel,\n availableWidth: number\n) => {\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,\n dataSource,\n selectionModel,\n tableConfig,\n}: InitialConfig): InternalTableModel {\n const { columns, ...tableAttributes } = tableConfig;\n const { config: dataSourceConfig, tableSchema } = dataSource;\n const toRuntimeColumnDescriptor = columnDescriptorToRuntimeColumDescriptor(\n tableAttributes,\n tableSchema\n );\n const runtimeColumns = columns\n .filter(subscribedOnly(dataSourceConfig?.columns))\n .map(toRuntimeColumnDescriptor);\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 if (selectionModel === \"checkbox\") {\n columnsInRenderOrder.splice(\n 0,\n 0,\n toRuntimeColumnDescriptor(checkboxColumnDescriptor, -1)\n );\n }\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 });\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, index: 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 width = columnDefaultWidth,\n ...rest\n } = column;\n\n const runtimeColumnWithDefaults: RuntimeColumnDescriptor = {\n ...rest,\n align,\n CellRenderer: getCellRenderer(column),\n HeaderCellContentRenderer: getColumnHeaderContentRenderer(column),\n HeaderCellLabelRenderer: getColumnHeaderLabelRenderer(column),\n clientSideEditValidationCheck: hasValidationRules(column.type)\n ? buildValidationChecker(column.type.renderer.rules)\n : undefined,\n index: index + 1,\n label: getLabel(label, columnFormatHeader),\n name,\n originalIdx: index,\n serverDataType,\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, index)\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 { confirmed, filterSpec: filter, groupBy, sort }: ColumnActionTableConfig\n) {\n const hasGroupBy = groupBy !== undefined;\n const hasFilter = typeof filter?.filter === \"string\";\n const hasSort = sort && sort.sortDefs.length > 0;\n\n let result = state;\n\n if (hasGroupBy) {\n result = {\n ...state,\n columns: applyGroupByToColumns(result.columns, groupBy, confirmed),\n };\n }\n\n if (hasSort) {\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 (hasFilter) {\n result = {\n ...state,\n columns: applyFilterToColumns(result.columns, filter),\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":[],"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 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 DataSourceConfig,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuColumnDataType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { buildValidationChecker } from \"@vuu-ui/vuu-ui-controls\";\nimport { Reducer, useReducer } from \"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: RuntimeColumnDescriptor[];\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;\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: RuntimeColumnDescriptor;\n hidden?: ColumnDescriptor[\"hidden\"];\n label?: ColumnDescriptor[\"label\"];\n resizing?: RuntimeColumnDescriptor[\"resizing\"];\n type: \"updateColumnProp\";\n width?: ColumnDescriptor[\"width\"];\n}\n\nexport interface ColumnActionTableConfig extends DataSourceConfig {\n confirmed?: boolean;\n type: \"tableConfig\";\n}\n\nexport interface ColumnActionColumnSettings extends DataSourceConfig {\n type: \"columnSettings\";\n column: ColumnDescriptor;\n /** required only for calculated coplumns */\n vuuTable?: VuuTable;\n}\n\nexport interface ColumnActionTableSettings extends DataSourceConfig {\n type: \"tableSettings\";\n}\n\nexport const isShowColumnSettings = (\n action: PersistentColumnAction,\n): action is ColumnActionColumnSettings => action.type === \"columnSettings\";\n\nexport const isShowTableSettings = (\n action: PersistentColumnAction,\n): action is ColumnActionTableSettings => action.type === \"tableSettings\";\n\n/**\n * PersistentColumnActions are those actions that require us to persist user changes across sessions\n */\nexport type PersistentColumnAction =\n | ColumnActionPin\n | ColumnActionHide\n | ColumnActionColumnSettings\n | ColumnActionTableSettings;\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);\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 const useTableModel = (\n tableConfigProp: TableConfig,\n dataSource: DataSource,\n selectionModel: TableSelectionModel,\n availableWidth: number,\n) => {\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,\n dataSource,\n selectionModel,\n tableConfig,\n}: InitialConfig): InternalTableModel {\n const { columns, ...tableAttributes } = tableConfig;\n const { config: dataSourceConfig, tableSchema } = dataSource;\n const toRuntimeColumnDescriptor = columnDescriptorToRuntimeColumDescriptor(\n tableAttributes,\n tableSchema,\n );\n const runtimeColumns = columns\n .filter(subscribedOnly(dataSourceConfig?.columns))\n .map(toRuntimeColumnDescriptor);\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 if (selectionModel === \"checkbox\") {\n columnsInRenderOrder.splice(\n 0,\n 0,\n toRuntimeColumnDescriptor(checkboxColumnDescriptor, -1),\n );\n }\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 });\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, index: 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 width = columnDefaultWidth,\n ...rest\n } = column;\n\n const runtimeColumnWithDefaults: RuntimeColumnDescriptor = {\n ...rest,\n align,\n CellRenderer: getCellRenderer(column),\n HeaderCellContentRenderer: getColumnHeaderContentRenderer(column),\n HeaderCellLabelRenderer: getColumnHeaderLabelRenderer(column),\n clientSideEditValidationCheck: hasValidationRules(column.type)\n ? buildValidationChecker(column.type.renderer.rules)\n : undefined,\n index: index + 1,\n label: getLabel(label, columnFormatHeader),\n name,\n originalIdx: index,\n serverDataType,\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, index),\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 { confirmed, filterSpec: filter, groupBy, sort }: ColumnActionTableConfig,\n) {\n const hasGroupBy = groupBy !== undefined;\n const hasFilter = typeof filter?.filter === \"string\";\n const hasSort = sort && sort.sortDefs.length > 0;\n\n let result = state;\n\n if (hasGroupBy) {\n result = {\n ...state,\n columns: applyGroupByToColumns(result.columns, groupBy, confirmed),\n };\n }\n\n if (hasSort) {\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 (hasFilter) {\n result = {\n ...state,\n columns: applyFilterToColumns(result.columns, filter),\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":[],"mappings":"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"}
@@ -350,17 +350,13 @@ const useTableScroll = ({
350
350
  }),
351
351
  []
352
352
  );
353
- useImperativeHandle(
354
- scrollingApiRef,
355
- () => {
356
- if (scrollbarContainerRef.current) {
357
- return scrollHandles;
358
- } else {
359
- return noScrolling;
360
- }
361
- },
362
- [scrollHandles]
363
- );
353
+ useImperativeHandle(scrollingApiRef, () => {
354
+ if (scrollbarContainerRef.current) {
355
+ return scrollHandles;
356
+ } else {
357
+ return noScrolling;
358
+ }
359
+ }, [scrollHandles]);
364
360
  useEffect(() => {
365
361
  if (rowHeight !== rowHeightRef.current) {
366
362
  rowHeightRef.current = rowHeight;
@@ -1 +1 @@
1
- {"version":3,"file":"useTableScroll.js","sources":["../src/useTableScroll.ts"],"sourcesContent":["import {\n getColumnsInViewport,\n getRowElementAtIndex,\n itemsChanged,\n RowAtPositionFunc,\n} from \"@vuu-ui/vuu-utils\";\nimport type { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ForwardedRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ViewportMeasurements } from \"./useTableViewport\";\nimport { howFarIsRowOutsideViewport } from \"./table-dom-utils\";\nimport type { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport type ScrollDirectionVertical = \"up\" | \"down\";\nexport type ScrollDirectionHorizontal = \"left\" | \"right\";\nexport type ScrollDirection =\n | ScrollDirectionVertical\n | ScrollDirectionHorizontal;\n\n/**\n * scroll into view the row at given index posiiton.\n */\nexport interface ScrollRequestRow {\n rowIndex: number;\n type: \"scroll-row\";\n}\nexport interface ScrollRequestEnd {\n type: \"scroll-end\";\n direction: \"home\" | \"end\";\n}\n\nexport interface ScrollRequestPage {\n type: \"scroll-page\";\n direction: ScrollDirectionVertical;\n}\n\nexport type ScrollRequest =\n | ScrollRequestPage\n | ScrollRequestEnd\n | ScrollRequestRow;\n\nexport type ScrollRequestHandler = (request: ScrollRequest) => void;\n\nexport interface ScrollingAPI {\n scrollToIndex: (itemIndex: number) => void;\n scrollToKey: (rowKey: string) => void;\n}\n\n/** How far we allow horizontal scroll movement before we recheck the rendered columns */\nconst SCROLL_MOVE_CHECK_THRESHOLD = 100;\n\n/** The buffer size in pixels that we allow for rendering columns just outside the viewport */\nconst HORIZONTAL_SCROLL_BUFFER = 200;\n\n/**\n * Return the maximum scroll positions for gioven container\n * @param container\n * @returns [maxScrollLeft, maxScrollTop]\n */\nconst getMaxScroll = (container: HTMLElement) => {\n const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;\n return [scrollWidth - clientWidth, scrollHeight - clientHeight];\n};\n\nconst getScrollDirection = (\n prevScrollPositions: ScrollPos | undefined,\n scrollPos: number\n) => {\n if (prevScrollPositions === undefined) {\n return undefined;\n } else {\n const { scrollTop: prevTop } = prevScrollPositions;\n return scrollPos > prevTop ? \"fwd\" : \"bwd\";\n }\n};\n\nconst getPctScroll = (container: HTMLElement, currentScrollPos?: ScrollPos) => {\n const {\n clientHeight,\n clientWidth,\n scrollHeight,\n scrollLeft,\n scrollTop,\n scrollWidth,\n } = container;\n\n const maxScrollLeft = scrollWidth - clientWidth;\n const pctScrollLeft = scrollLeft / (scrollWidth - clientWidth);\n const maxScrollTop = scrollHeight - clientHeight;\n let pctScrollTop = scrollTop / (scrollHeight - clientHeight);\n\n const scrollDirection = getScrollDirection(currentScrollPos, scrollTop);\n\n if (scrollDirection === \"fwd\" && pctScrollTop > 0.99) {\n pctScrollTop = 1;\n } else if (scrollDirection === \"bwd\" && pctScrollTop < 0.02) {\n pctScrollTop = 0;\n }\n\n return [\n scrollLeft,\n pctScrollLeft,\n maxScrollLeft,\n scrollTop,\n pctScrollTop,\n maxScrollTop,\n ];\n};\n\nexport const noScrolling: ScrollingAPI = {\n scrollToIndex: () => undefined,\n scrollToKey: () => undefined,\n};\n\ninterface CallbackRefHookProps<T = HTMLElement> {\n onAttach?: (el: T) => void;\n onDetach: (el: T) => void;\n label?: string;\n}\n\nconst useCallbackRef = <T = HTMLElement>({\n onAttach,\n onDetach,\n}: CallbackRefHookProps<T>) => {\n const ref = useRef<T | null>(null);\n const callbackRef = useCallback(\n (el: T | null) => {\n if (el) {\n ref.current = el;\n onAttach?.(el);\n } else if (ref.current) {\n const { current: originalRef } = ref;\n ref.current = el;\n onDetach?.(originalRef);\n }\n },\n [onAttach, onDetach]\n );\n return callbackRef;\n};\n\ntype ScrollPos = {\n scrollLeft: number;\n scrollTop: number;\n};\n\nexport interface TableScrollHookProps {\n columns: RuntimeColumnDescriptor[];\n getRowAtPosition: RowAtPositionFunc;\n onHorizontalScroll?: (scrollLeft: number) => void;\n onVerticalScroll?: (scrollTop: number, pctScrollTop: number) => void;\n /**\n * When we have a virtualized scroll container, keyboard navigation is\n * performed `in situ`. We shift the range of rows rendered within the\n * viewport, whithout actually moving the scroll position\n */\n onVerticalScrollInSitu?: (rowIndexOffsetCount: number) => void;\n rowHeight: number;\n scrollingApiRef?: ForwardedRef<ScrollingAPI>;\n setRange: (range: VuuRange) => void;\n viewportMeasurements: ViewportMeasurements;\n}\n\nexport const useTableScroll = ({\n columns,\n getRowAtPosition,\n onHorizontalScroll,\n onVerticalScroll,\n onVerticalScrollInSitu,\n rowHeight,\n scrollingApiRef,\n setRange,\n viewportMeasurements,\n}: TableScrollHookProps) => {\n const firstRowRef = useRef<number>(0);\n const rowHeightRef = useRef(rowHeight);\n const contentContainerScrolledRef = useRef(false);\n const contentContainerPosRef = useRef<ScrollPos>({\n scrollTop: 0,\n scrollLeft: 0,\n });\n const scrollbarContainerScrolledRef = useRef(false);\n const scrollbarContainerPosRef = useRef<ScrollPos>({\n scrollTop: 0,\n scrollLeft: 0,\n });\n const scrollbarContainerRef = useRef<HTMLDivElement | null>(null);\n const contentContainerRef = useRef<HTMLDivElement | null>(null);\n const lastHorizontalScrollCheckPoint = useRef(0);\n\n const {\n appliedPageSize,\n isVirtualScroll,\n rowCount: viewportRowCount,\n totalHeaderHeight,\n viewportWidth,\n } = viewportMeasurements;\n\n const columnsWithinViewportRef = useRef<RuntimeColumnDescriptor[]>([]);\n const [, forceRefresh] = useState({});\n\n const preSpanRef = useRef(0);\n\n useMemo(() => {\n const [visibleColumns, offset] = getColumnsInViewport(\n columns,\n contentContainerPosRef.current.scrollLeft,\n contentContainerPosRef.current.scrollLeft +\n viewportWidth +\n HORIZONTAL_SCROLL_BUFFER\n );\n preSpanRef.current = offset;\n columnsWithinViewportRef.current = visibleColumns;\n }, [viewportWidth, columns]);\n\n const handleHorizontalScroll = useCallback(\n (scrollLeft: number) => {\n contentContainerPosRef.current.scrollLeft = scrollLeft;\n onHorizontalScroll?.(scrollLeft);\n\n if (\n Math.abs(scrollLeft - lastHorizontalScrollCheckPoint.current) >\n SCROLL_MOVE_CHECK_THRESHOLD\n ) {\n lastHorizontalScrollCheckPoint.current = scrollLeft;\n\n const [visibleColumns, pre] = getColumnsInViewport(\n columns,\n scrollLeft,\n scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER\n );\n\n if (itemsChanged(columnsWithinViewportRef.current, visibleColumns)) {\n preSpanRef.current = pre;\n columnsWithinViewportRef.current = visibleColumns;\n forceRefresh({});\n }\n }\n },\n [columns, onHorizontalScroll, viewportWidth]\n );\n const handleVerticalScroll = useCallback(\n (scrollTop: number, pctScrollTop: number) => {\n contentContainerPosRef.current.scrollTop = scrollTop;\n\n onVerticalScroll?.(scrollTop, pctScrollTop);\n const firstRow = getRowAtPosition(scrollTop);\n if (firstRow !== firstRowRef.current) {\n firstRowRef.current = firstRow;\n setRange({ from: firstRow, to: firstRow + viewportRowCount });\n }\n onVerticalScrollInSitu?.(0);\n },\n [\n getRowAtPosition,\n onVerticalScroll,\n onVerticalScrollInSitu,\n setRange,\n viewportRowCount,\n ]\n );\n\n const handleScrollbarContainerScroll = useCallback(() => {\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: contentContainerScrolled } = contentContainerScrolledRef;\n const { current: scrollPos } = scrollbarContainerPosRef;\n\n if (contentContainerScrolled) {\n contentContainerScrolledRef.current = false;\n } else if (contentContainer && scrollbarContainer) {\n scrollbarContainerScrolledRef.current = true;\n const [scrollLeft, pctScrollLeft, , scrollTop, pctScrollTop] =\n getPctScroll(scrollbarContainer, scrollPos);\n\n scrollPos.scrollLeft = scrollLeft;\n scrollPos.scrollTop = scrollTop;\n\n const [maxScrollLeft, maxScrollTop] = getMaxScroll(scrollbarContainer);\n const contentScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);\n const contentScrollTop = pctScrollTop * maxScrollTop;\n\n contentContainer.scrollTo({\n left: contentScrollLeft,\n top: contentScrollTop,\n behavior: \"auto\",\n });\n }\n onVerticalScrollInSitu?.(0);\n }, [onVerticalScrollInSitu]);\n\n const handleContentContainerScroll = useCallback(() => {\n const { current: scrollbarContainerScrolled } =\n scrollbarContainerScrolledRef;\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: scrollPos } = contentContainerPosRef;\n\n if (contentContainer && scrollbarContainer) {\n const [\n scrollLeft,\n pctScrollLeft,\n maxScrollLeft,\n scrollTop,\n pctScrollTop,\n maxScrollTop,\n ] = getPctScroll(contentContainer);\n\n contentContainerScrolledRef.current = true;\n\n if (scrollbarContainerScrolled) {\n scrollbarContainerScrolledRef.current = false;\n } else {\n scrollbarContainer.scrollLeft = Math.round(\n pctScrollLeft * maxScrollLeft\n );\n scrollbarContainer.scrollTop = pctScrollTop * maxScrollTop;\n }\n\n if (scrollPos.scrollTop !== scrollTop) {\n handleVerticalScroll(scrollTop, pctScrollTop);\n }\n if (scrollPos.scrollLeft !== scrollLeft) {\n handleHorizontalScroll(scrollLeft);\n }\n }\n }, [handleVerticalScroll, handleHorizontalScroll]);\n\n const handleAttachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = el;\n el.addEventListener(\"scroll\", handleScrollbarContainerScroll, {\n passive: true,\n });\n },\n [handleScrollbarContainerScroll]\n );\n\n const handleDetachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleScrollbarContainerScroll);\n },\n [handleScrollbarContainerScroll]\n );\n\n const handleAttachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = el;\n el.addEventListener(\"scroll\", handleContentContainerScroll, {\n passive: true,\n });\n },\n [handleContentContainerScroll]\n );\n\n const handleDetachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleContentContainerScroll);\n },\n [handleContentContainerScroll]\n );\n\n const contentContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachContentContainer,\n onDetach: handleDetachContentContainer,\n });\n\n const scrollbarContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachScrollbarContainer,\n onDetach: handleDetachScrollbarContainer,\n });\n\n const requestScroll: ScrollRequestHandler = useCallback(\n (scrollRequest) => {\n const { current: contentContainer } = contentContainerRef;\n if (contentContainer) {\n const [maxScrollLeft, maxScrollTop] = getMaxScroll(contentContainer);\n const { scrollLeft, scrollTop } = contentContainer;\n contentContainerScrolledRef.current = false;\n if (scrollRequest.type === \"scroll-row\") {\n const activeRow = getRowElementAtIndex(\n contentContainer,\n scrollRequest.rowIndex\n );\n\n if (activeRow !== null) {\n const [direction, distance] = howFarIsRowOutsideViewport(\n activeRow,\n totalHeaderHeight\n );\n if (direction && distance) {\n if (isVirtualScroll) {\n const offset = direction === \"down\" ? 1 : -1;\n onVerticalScrollInSitu?.(offset);\n const firstRow = firstRowRef.current + offset;\n firstRowRef.current = firstRow;\n setRange({\n from: firstRow,\n to: firstRow + viewportRowCount,\n });\n } else {\n let newScrollLeft = scrollLeft;\n let newScrollTop = scrollTop;\n if (direction === \"up\" || direction === \"down\") {\n newScrollTop = Math.min(\n Math.max(0, scrollTop + distance),\n maxScrollTop\n );\n } else {\n newScrollLeft = Math.min(\n Math.max(0, scrollLeft + distance),\n maxScrollLeft\n );\n }\n contentContainer.scrollTo({\n top: newScrollTop,\n left: newScrollLeft,\n behavior: \"smooth\",\n });\n }\n }\n }\n } else if (scrollRequest.type === \"scroll-page\") {\n const { direction } = scrollRequest;\n if (isVirtualScroll) {\n const offset =\n direction === \"down\" ? viewportRowCount : -viewportRowCount;\n onVerticalScrollInSitu?.(offset);\n const firstRow = firstRowRef.current + offset;\n firstRowRef.current = firstRow;\n setRange({ from: firstRow, to: firstRow + viewportRowCount });\n } else {\n const scrollBy =\n direction === \"down\" ? appliedPageSize : -appliedPageSize;\n const newScrollTop = Math.min(\n Math.max(0, scrollTop + scrollBy),\n maxScrollTop\n );\n contentContainer.scrollTo({\n top: newScrollTop,\n left: scrollLeft,\n behavior: \"auto\",\n });\n }\n } else if (scrollRequest.type === \"scroll-end\") {\n const { direction } = scrollRequest;\n const scrollTo = direction === \"end\" ? maxScrollTop : 0;\n contentContainer.scrollTo({\n top: scrollTo,\n left: contentContainer.scrollLeft,\n behavior: \"auto\",\n });\n }\n }\n },\n [\n appliedPageSize,\n isVirtualScroll,\n onVerticalScrollInSitu,\n setRange,\n totalHeaderHeight,\n viewportRowCount,\n ]\n );\n\n const scrollHandles: ScrollingAPI = useMemo(\n // TODO not complete yet\n () => ({\n scrollToIndex: (rowIndex: number) => {\n if (scrollbarContainerRef.current) {\n // TODO hardcoded rowHeight\n const scrollPos = (rowIndex - 30) * 20;\n scrollbarContainerRef.current.scrollTop = scrollPos;\n }\n },\n scrollToKey: (rowKey: string) => {\n console.log(`scrollToKey ${rowKey}`);\n },\n }),\n []\n );\n\n useImperativeHandle(\n scrollingApiRef,\n () => {\n if (scrollbarContainerRef.current) {\n return scrollHandles;\n } else {\n return noScrolling;\n }\n },\n [scrollHandles]\n );\n\n useEffect(() => {\n if (rowHeight !== rowHeightRef.current) {\n rowHeightRef.current = rowHeight;\n if (contentContainerPosRef.current.scrollTop > 0) {\n if (contentContainerRef.current) {\n contentContainerRef.current.scrollTop = 0;\n }\n }\n } else {\n const { current: from } = firstRowRef;\n const rowRange = { from, to: from + viewportRowCount };\n setRange(rowRange);\n }\n }, [rowHeight, setRange, viewportRowCount]);\n\n return {\n columnsWithinViewport: columnsWithinViewportRef.current,\n /** Ref to be assigned to ScrollbarContainer */\n scrollbarContainerRef: scrollbarContainerCallbackRef,\n /** Ref to be assigned to ContentContainer */\n contentContainerRef: contentContainerCallbackRef,\n /** Scroll the table */\n requestScroll,\n /** number of leading columns not rendered because of virtualization */\n virtualColSpan: preSpanRef.current,\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTableScroll.js","sources":["../src/useTableScroll.ts"],"sourcesContent":["import {\n getColumnsInViewport,\n getRowElementAtIndex,\n itemsChanged,\n RowAtPositionFunc,\n} from \"@vuu-ui/vuu-utils\";\nimport type { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ForwardedRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ViewportMeasurements } from \"./useTableViewport\";\nimport { howFarIsRowOutsideViewport } from \"./table-dom-utils\";\nimport type { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport type ScrollDirectionVertical = \"up\" | \"down\";\nexport type ScrollDirectionHorizontal = \"left\" | \"right\";\nexport type ScrollDirection =\n | ScrollDirectionVertical\n | ScrollDirectionHorizontal;\n\n/**\n * scroll into view the row at given index posiiton.\n */\nexport interface ScrollRequestRow {\n rowIndex: number;\n type: \"scroll-row\";\n}\nexport interface ScrollRequestEnd {\n type: \"scroll-end\";\n direction: \"home\" | \"end\";\n}\n\nexport interface ScrollRequestPage {\n type: \"scroll-page\";\n direction: ScrollDirectionVertical;\n}\n\nexport type ScrollRequest =\n | ScrollRequestPage\n | ScrollRequestEnd\n | ScrollRequestRow;\n\nexport type ScrollRequestHandler = (request: ScrollRequest) => void;\n\nexport interface ScrollingAPI {\n scrollToIndex: (itemIndex: number) => void;\n scrollToKey: (rowKey: string) => void;\n}\n\n/** How far we allow horizontal scroll movement before we recheck the rendered columns */\nconst SCROLL_MOVE_CHECK_THRESHOLD = 100;\n\n/** The buffer size in pixels that we allow for rendering columns just outside the viewport */\nconst HORIZONTAL_SCROLL_BUFFER = 200;\n\n/**\n * Return the maximum scroll positions for gioven container\n * @param container\n * @returns [maxScrollLeft, maxScrollTop]\n */\nconst getMaxScroll = (container: HTMLElement) => {\n const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;\n return [scrollWidth - clientWidth, scrollHeight - clientHeight];\n};\n\nconst getScrollDirection = (\n prevScrollPositions: ScrollPos | undefined,\n scrollPos: number,\n) => {\n if (prevScrollPositions === undefined) {\n return undefined;\n } else {\n const { scrollTop: prevTop } = prevScrollPositions;\n return scrollPos > prevTop ? \"fwd\" : \"bwd\";\n }\n};\n\nconst getPctScroll = (container: HTMLElement, currentScrollPos?: ScrollPos) => {\n const {\n clientHeight,\n clientWidth,\n scrollHeight,\n scrollLeft,\n scrollTop,\n scrollWidth,\n } = container;\n\n const maxScrollLeft = scrollWidth - clientWidth;\n const pctScrollLeft = scrollLeft / (scrollWidth - clientWidth);\n const maxScrollTop = scrollHeight - clientHeight;\n let pctScrollTop = scrollTop / (scrollHeight - clientHeight);\n\n const scrollDirection = getScrollDirection(currentScrollPos, scrollTop);\n\n if (scrollDirection === \"fwd\" && pctScrollTop > 0.99) {\n pctScrollTop = 1;\n } else if (scrollDirection === \"bwd\" && pctScrollTop < 0.02) {\n pctScrollTop = 0;\n }\n\n return [\n scrollLeft,\n pctScrollLeft,\n maxScrollLeft,\n scrollTop,\n pctScrollTop,\n maxScrollTop,\n ];\n};\n\nexport const noScrolling: ScrollingAPI = {\n scrollToIndex: () => undefined,\n scrollToKey: () => undefined,\n};\n\ninterface CallbackRefHookProps<T = HTMLElement> {\n onAttach?: (el: T) => void;\n onDetach: (el: T) => void;\n label?: string;\n}\n\nconst useCallbackRef = <T = HTMLElement>({\n onAttach,\n onDetach,\n}: CallbackRefHookProps<T>) => {\n const ref = useRef<T | null>(null);\n const callbackRef = useCallback(\n (el: T | null) => {\n if (el) {\n ref.current = el;\n onAttach?.(el);\n } else if (ref.current) {\n const { current: originalRef } = ref;\n ref.current = el;\n onDetach?.(originalRef);\n }\n },\n [onAttach, onDetach],\n );\n return callbackRef;\n};\n\ntype ScrollPos = {\n scrollLeft: number;\n scrollTop: number;\n};\n\nexport interface TableScrollHookProps {\n columns: RuntimeColumnDescriptor[];\n getRowAtPosition: RowAtPositionFunc;\n onHorizontalScroll?: (scrollLeft: number) => void;\n onVerticalScroll?: (scrollTop: number, pctScrollTop: number) => void;\n /**\n * When we have a virtualized scroll container, keyboard navigation is\n * performed `in situ`. We shift the range of rows rendered within the\n * viewport, whithout actually moving the scroll position\n */\n onVerticalScrollInSitu?: (rowIndexOffsetCount: number) => void;\n rowHeight: number;\n scrollingApiRef?: ForwardedRef<ScrollingAPI>;\n setRange: (range: VuuRange) => void;\n viewportMeasurements: ViewportMeasurements;\n}\n\nexport const useTableScroll = ({\n columns,\n getRowAtPosition,\n onHorizontalScroll,\n onVerticalScroll,\n onVerticalScrollInSitu,\n rowHeight,\n scrollingApiRef,\n setRange,\n viewportMeasurements,\n}: TableScrollHookProps) => {\n const firstRowRef = useRef<number>(0);\n const rowHeightRef = useRef(rowHeight);\n const contentContainerScrolledRef = useRef(false);\n const contentContainerPosRef = useRef<ScrollPos>({\n scrollTop: 0,\n scrollLeft: 0,\n });\n const scrollbarContainerScrolledRef = useRef(false);\n const scrollbarContainerPosRef = useRef<ScrollPos>({\n scrollTop: 0,\n scrollLeft: 0,\n });\n const scrollbarContainerRef = useRef<HTMLDivElement | null>(null);\n const contentContainerRef = useRef<HTMLDivElement | null>(null);\n const lastHorizontalScrollCheckPoint = useRef(0);\n\n const {\n appliedPageSize,\n isVirtualScroll,\n rowCount: viewportRowCount,\n totalHeaderHeight,\n viewportWidth,\n } = viewportMeasurements;\n\n const columnsWithinViewportRef = useRef<RuntimeColumnDescriptor[]>([]);\n const [, forceRefresh] = useState({});\n\n const preSpanRef = useRef(0);\n\n useMemo(() => {\n const [visibleColumns, offset] = getColumnsInViewport(\n columns,\n contentContainerPosRef.current.scrollLeft,\n contentContainerPosRef.current.scrollLeft +\n viewportWidth +\n HORIZONTAL_SCROLL_BUFFER,\n );\n preSpanRef.current = offset;\n columnsWithinViewportRef.current = visibleColumns;\n }, [viewportWidth, columns]);\n\n const handleHorizontalScroll = useCallback(\n (scrollLeft: number) => {\n contentContainerPosRef.current.scrollLeft = scrollLeft;\n onHorizontalScroll?.(scrollLeft);\n\n if (\n Math.abs(scrollLeft - lastHorizontalScrollCheckPoint.current) >\n SCROLL_MOVE_CHECK_THRESHOLD\n ) {\n lastHorizontalScrollCheckPoint.current = scrollLeft;\n\n const [visibleColumns, pre] = getColumnsInViewport(\n columns,\n scrollLeft,\n scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER,\n );\n\n if (itemsChanged(columnsWithinViewportRef.current, visibleColumns)) {\n preSpanRef.current = pre;\n columnsWithinViewportRef.current = visibleColumns;\n forceRefresh({});\n }\n }\n },\n [columns, onHorizontalScroll, viewportWidth],\n );\n const handleVerticalScroll = useCallback(\n (scrollTop: number, pctScrollTop: number) => {\n contentContainerPosRef.current.scrollTop = scrollTop;\n\n onVerticalScroll?.(scrollTop, pctScrollTop);\n const firstRow = getRowAtPosition(scrollTop);\n if (firstRow !== firstRowRef.current) {\n firstRowRef.current = firstRow;\n setRange({ from: firstRow, to: firstRow + viewportRowCount });\n }\n onVerticalScrollInSitu?.(0);\n },\n [\n getRowAtPosition,\n onVerticalScroll,\n onVerticalScrollInSitu,\n setRange,\n viewportRowCount,\n ],\n );\n\n const handleScrollbarContainerScroll = useCallback(() => {\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: contentContainerScrolled } = contentContainerScrolledRef;\n const { current: scrollPos } = scrollbarContainerPosRef;\n\n if (contentContainerScrolled) {\n contentContainerScrolledRef.current = false;\n } else if (contentContainer && scrollbarContainer) {\n scrollbarContainerScrolledRef.current = true;\n const [scrollLeft, pctScrollLeft, , scrollTop, pctScrollTop] =\n getPctScroll(scrollbarContainer, scrollPos);\n\n scrollPos.scrollLeft = scrollLeft;\n scrollPos.scrollTop = scrollTop;\n\n const [maxScrollLeft, maxScrollTop] = getMaxScroll(scrollbarContainer);\n const contentScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);\n const contentScrollTop = pctScrollTop * maxScrollTop;\n\n contentContainer.scrollTo({\n left: contentScrollLeft,\n top: contentScrollTop,\n behavior: \"auto\",\n });\n }\n onVerticalScrollInSitu?.(0);\n }, [onVerticalScrollInSitu]);\n\n const handleContentContainerScroll = useCallback(() => {\n const { current: scrollbarContainerScrolled } =\n scrollbarContainerScrolledRef;\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: scrollPos } = contentContainerPosRef;\n\n if (contentContainer && scrollbarContainer) {\n const [\n scrollLeft,\n pctScrollLeft,\n maxScrollLeft,\n scrollTop,\n pctScrollTop,\n maxScrollTop,\n ] = getPctScroll(contentContainer);\n\n contentContainerScrolledRef.current = true;\n\n if (scrollbarContainerScrolled) {\n scrollbarContainerScrolledRef.current = false;\n } else {\n scrollbarContainer.scrollLeft = Math.round(\n pctScrollLeft * maxScrollLeft,\n );\n scrollbarContainer.scrollTop = pctScrollTop * maxScrollTop;\n }\n\n if (scrollPos.scrollTop !== scrollTop) {\n handleVerticalScroll(scrollTop, pctScrollTop);\n }\n if (scrollPos.scrollLeft !== scrollLeft) {\n handleHorizontalScroll(scrollLeft);\n }\n }\n }, [handleVerticalScroll, handleHorizontalScroll]);\n\n const handleAttachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = el;\n el.addEventListener(\"scroll\", handleScrollbarContainerScroll, {\n passive: true,\n });\n },\n [handleScrollbarContainerScroll],\n );\n\n const handleDetachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleScrollbarContainerScroll);\n },\n [handleScrollbarContainerScroll],\n );\n\n const handleAttachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = el;\n el.addEventListener(\"scroll\", handleContentContainerScroll, {\n passive: true,\n });\n },\n [handleContentContainerScroll],\n );\n\n const handleDetachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleContentContainerScroll);\n },\n [handleContentContainerScroll],\n );\n\n const contentContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachContentContainer,\n onDetach: handleDetachContentContainer,\n });\n\n const scrollbarContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachScrollbarContainer,\n onDetach: handleDetachScrollbarContainer,\n });\n\n const requestScroll: ScrollRequestHandler = useCallback(\n (scrollRequest) => {\n const { current: contentContainer } = contentContainerRef;\n if (contentContainer) {\n const [maxScrollLeft, maxScrollTop] = getMaxScroll(contentContainer);\n const { scrollLeft, scrollTop } = contentContainer;\n contentContainerScrolledRef.current = false;\n if (scrollRequest.type === \"scroll-row\") {\n const activeRow = getRowElementAtIndex(\n contentContainer,\n scrollRequest.rowIndex,\n );\n\n if (activeRow !== null) {\n const [direction, distance] = howFarIsRowOutsideViewport(\n activeRow,\n totalHeaderHeight,\n );\n if (direction && distance) {\n if (isVirtualScroll) {\n const offset = direction === \"down\" ? 1 : -1;\n onVerticalScrollInSitu?.(offset);\n const firstRow = firstRowRef.current + offset;\n firstRowRef.current = firstRow;\n setRange({\n from: firstRow,\n to: firstRow + viewportRowCount,\n });\n } else {\n let newScrollLeft = scrollLeft;\n let newScrollTop = scrollTop;\n if (direction === \"up\" || direction === \"down\") {\n newScrollTop = Math.min(\n Math.max(0, scrollTop + distance),\n maxScrollTop,\n );\n } else {\n newScrollLeft = Math.min(\n Math.max(0, scrollLeft + distance),\n maxScrollLeft,\n );\n }\n contentContainer.scrollTo({\n top: newScrollTop,\n left: newScrollLeft,\n behavior: \"smooth\",\n });\n }\n }\n }\n } else if (scrollRequest.type === \"scroll-page\") {\n const { direction } = scrollRequest;\n if (isVirtualScroll) {\n const offset =\n direction === \"down\" ? viewportRowCount : -viewportRowCount;\n onVerticalScrollInSitu?.(offset);\n const firstRow = firstRowRef.current + offset;\n firstRowRef.current = firstRow;\n setRange({ from: firstRow, to: firstRow + viewportRowCount });\n } else {\n const scrollBy =\n direction === \"down\" ? appliedPageSize : -appliedPageSize;\n const newScrollTop = Math.min(\n Math.max(0, scrollTop + scrollBy),\n maxScrollTop,\n );\n contentContainer.scrollTo({\n top: newScrollTop,\n left: scrollLeft,\n behavior: \"auto\",\n });\n }\n } else if (scrollRequest.type === \"scroll-end\") {\n const { direction } = scrollRequest;\n const scrollTo = direction === \"end\" ? maxScrollTop : 0;\n contentContainer.scrollTo({\n top: scrollTo,\n left: contentContainer.scrollLeft,\n behavior: \"auto\",\n });\n }\n }\n },\n [\n appliedPageSize,\n isVirtualScroll,\n onVerticalScrollInSitu,\n setRange,\n totalHeaderHeight,\n viewportRowCount,\n ],\n );\n\n const scrollHandles: ScrollingAPI = useMemo(\n // TODO not complete yet\n () => ({\n scrollToIndex: (rowIndex: number) => {\n if (scrollbarContainerRef.current) {\n // TODO hardcoded rowHeight\n const scrollPos = (rowIndex - 30) * 20;\n scrollbarContainerRef.current.scrollTop = scrollPos;\n }\n },\n scrollToKey: (rowKey: string) => {\n console.log(`scrollToKey ${rowKey}`);\n },\n }),\n [],\n );\n\n useImperativeHandle(scrollingApiRef, () => {\n if (scrollbarContainerRef.current) {\n return scrollHandles;\n } else {\n return noScrolling;\n }\n }, [scrollHandles]);\n\n useEffect(() => {\n if (rowHeight !== rowHeightRef.current) {\n rowHeightRef.current = rowHeight;\n if (contentContainerPosRef.current.scrollTop > 0) {\n if (contentContainerRef.current) {\n contentContainerRef.current.scrollTop = 0;\n }\n }\n } else {\n const { current: from } = firstRowRef;\n const rowRange = { from, to: from + viewportRowCount };\n setRange(rowRange);\n }\n }, [rowHeight, setRange, viewportRowCount]);\n\n return {\n columnsWithinViewport: columnsWithinViewportRef.current,\n /** Ref to be assigned to ScrollbarContainer */\n scrollbarContainerRef: scrollbarContainerCallbackRef,\n /** Ref to be assigned to ContentContainer */\n contentContainerRef: contentContainerCallbackRef,\n /** Scroll the table */\n requestScroll,\n /** number of leading columns not rendered because of virtualization */\n virtualColSpan: preSpanRef.current,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTableViewport.js","sources":["../src/useTableViewport.ts"],"sourcesContent":["/**\n * This hook measures and calculates the values needed to manage layout\n * and virtualisation of the table. This includes measurements required\n * to support pinned columns.\n */\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { MeasuredSize } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n actualRowPositioning,\n measurePinnedColumns,\n RowAtPositionFunc,\n RowOffsetFunc,\n RowPositioning,\n virtualRowPositioning,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\nexport interface TableViewportHookProps {\n columns: RuntimeColumnDescriptor[];\n headerHeight: number;\n rowCount: number;\n rowHeight: number;\n /**\n * this is the solid left/right `border` rendered on the selection block\n */\n selectionEndSize?: number;\n size: MeasuredSize | undefined;\n}\n\nexport interface ViewportMeasurements {\n appliedPageSize: number;\n contentHeight: number;\n horizontalScrollbarHeight: number;\n isVirtualScroll: boolean;\n pinnedWidthLeft: number;\n pinnedWidthRight: number;\n rowCount: number;\n contentWidth: number;\n totalHeaderHeight: number;\n verticalScrollbarWidth: number;\n viewportBodyHeight: number;\n viewportWidth: number;\n}\n\nexport interface TableViewportHookResult extends ViewportMeasurements {\n getRowAtPosition: RowAtPositionFunc;\n getRowOffset: RowOffsetFunc;\n setInSituRowOffset: (rowIndexOffset: number) => void;\n setScrollTop: (scrollTop: number, scrollPct: number) => void;\n}\n\n// Too simplistic, it depends on rowHeight\nconst MAX_PIXEL_HEIGHT = 10_000_000;\n\nconst UNMEASURED_VIEWPORT: TableViewportHookResult = {\n appliedPageSize: 0,\n contentHeight: 0,\n contentWidth: 0,\n getRowAtPosition: () => -1,\n getRowOffset: () => -1,\n horizontalScrollbarHeight: 0,\n isVirtualScroll: false,\n pinnedWidthLeft: 0,\n pinnedWidthRight: 0,\n rowCount: 0,\n setInSituRowOffset: () => undefined,\n setScrollTop: () => undefined,\n totalHeaderHeight: 0,\n verticalScrollbarWidth: 0,\n viewportBodyHeight: 0,\n viewportWidth: 0,\n};\n\nexport const useTableViewport = ({\n columns,\n headerHeight,\n rowCount,\n rowHeight,\n selectionEndSize = 4,\n size,\n}: TableViewportHookProps): TableViewportHookResult => {\n const inSituRowOffsetRef = useRef(0);\n const pctScrollTopRef = useRef(0);\n // TODO we are limited by pixels not an arbitrary number of rows\n const virtualContentHeight = rowCount * rowHeight;\n const pixelContentHeight = Math.min(virtualContentHeight, MAX_PIXEL_HEIGHT);\n const virtualisedExtent = virtualContentHeight - pixelContentHeight;\n\n const { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth } = useMemo(\n () => measurePinnedColumns(columns, selectionEndSize),\n [columns, selectionEndSize]\n );\n\n const [getRowOffset, getRowAtPosition, isVirtualScroll] =\n useMemo<RowPositioning>(() => {\n if (virtualisedExtent) {\n const [_getRowOffset, getRowAtPosition, _isVirtual] =\n virtualRowPositioning(rowHeight, virtualisedExtent, pctScrollTopRef);\n const getOffset: RowOffsetFunc = (row) => {\n return _getRowOffset(row, inSituRowOffsetRef.current);\n };\n return [getOffset, getRowAtPosition, _isVirtual];\n } else {\n return actualRowPositioning(rowHeight);\n }\n }, [virtualisedExtent, rowHeight]);\n\n const setScrollTop = useCallback((_: number, scrollPct: number) => {\n pctScrollTopRef.current = scrollPct;\n }, []);\n\n /**\n * The inSituRowOffset is used to simulate scrolling through a very large dataset\n * without actually moving the scroll position. It is triggered by keyboard\n * navigation. A simulated scroll operation will always be of one or more rows.\n * A value of zero is a request to reset the offset.\n */\n const setInSituRowOffset = useCallback((rowIndexOffset: number) => {\n if (rowIndexOffset === 0) {\n inSituRowOffsetRef.current = 0;\n } else {\n inSituRowOffsetRef.current = Math.max(\n 0,\n inSituRowOffsetRef.current + rowIndexOffset\n );\n }\n }, []);\n\n return useMemo(() => {\n if (size) {\n // TODO determine this at runtime\n const scrollbarSize = 10;\n const contentWidth = pinnedWidthLeft + unpinnedWidth + pinnedWidthRight;\n const horizontalScrollbarHeight =\n contentWidth > size.width ? scrollbarSize : 0;\n const visibleRows = (size.height - headerHeight) / rowHeight;\n const count = Number.isInteger(visibleRows)\n ? visibleRows\n : Math.ceil(visibleRows);\n const viewportBodyHeight = size.height - headerHeight;\n const verticalScrollbarWidth =\n pixelContentHeight > viewportBodyHeight ? scrollbarSize : 0;\n\n const appliedPageSize =\n count * rowHeight * (pixelContentHeight / virtualContentHeight);\n\n const viewportWidth = size.width;\n\n return {\n appliedPageSize,\n contentHeight: pixelContentHeight,\n contentWidth,\n getRowAtPosition,\n getRowOffset,\n isVirtualScroll,\n horizontalScrollbarHeight,\n pinnedWidthLeft,\n pinnedWidthRight,\n rowCount: count,\n setInSituRowOffset,\n setScrollTop,\n totalHeaderHeight: headerHeight,\n verticalScrollbarWidth,\n viewportBodyHeight,\n viewportWidth,\n };\n } else {\n return UNMEASURED_VIEWPORT;\n }\n }, [\n getRowAtPosition,\n getRowOffset,\n headerHeight,\n isVirtualScroll,\n pinnedWidthLeft,\n unpinnedWidth,\n pinnedWidthRight,\n pixelContentHeight,\n rowHeight,\n setInSituRowOffset,\n setScrollTop,\n size,\n virtualContentHeight,\n ]);\n};\n"],"names":["getRowAtPosition"],"mappings":"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"}
1
+ {"version":3,"file":"useTableViewport.js","sources":["../src/useTableViewport.ts"],"sourcesContent":["/**\n * This hook measures and calculates the values needed to manage layout\n * and virtualisation of the table. This includes measurements required\n * to support pinned columns.\n */\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { MeasuredSize } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n actualRowPositioning,\n measurePinnedColumns,\n RowAtPositionFunc,\n RowOffsetFunc,\n RowPositioning,\n virtualRowPositioning,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\nexport interface TableViewportHookProps {\n columns: RuntimeColumnDescriptor[];\n headerHeight: number;\n rowCount: number;\n rowHeight: number;\n /**\n * this is the solid left/right `border` rendered on the selection block\n */\n selectionEndSize?: number;\n size: MeasuredSize | undefined;\n}\n\nexport interface ViewportMeasurements {\n appliedPageSize: number;\n contentHeight: number;\n horizontalScrollbarHeight: number;\n isVirtualScroll: boolean;\n pinnedWidthLeft: number;\n pinnedWidthRight: number;\n rowCount: number;\n contentWidth: number;\n totalHeaderHeight: number;\n verticalScrollbarWidth: number;\n viewportBodyHeight: number;\n viewportWidth: number;\n}\n\nexport interface TableViewportHookResult extends ViewportMeasurements {\n getRowAtPosition: RowAtPositionFunc;\n getRowOffset: RowOffsetFunc;\n setInSituRowOffset: (rowIndexOffset: number) => void;\n setScrollTop: (scrollTop: number, scrollPct: number) => void;\n}\n\n// Too simplistic, it depends on rowHeight\nconst MAX_PIXEL_HEIGHT = 10_000_000;\n\nconst UNMEASURED_VIEWPORT: TableViewportHookResult = {\n appliedPageSize: 0,\n contentHeight: 0,\n contentWidth: 0,\n getRowAtPosition: () => -1,\n getRowOffset: () => -1,\n horizontalScrollbarHeight: 0,\n isVirtualScroll: false,\n pinnedWidthLeft: 0,\n pinnedWidthRight: 0,\n rowCount: 0,\n setInSituRowOffset: () => undefined,\n setScrollTop: () => undefined,\n totalHeaderHeight: 0,\n verticalScrollbarWidth: 0,\n viewportBodyHeight: 0,\n viewportWidth: 0,\n};\n\nexport const useTableViewport = ({\n columns,\n headerHeight,\n rowCount,\n rowHeight,\n selectionEndSize = 4,\n size,\n}: TableViewportHookProps): TableViewportHookResult => {\n const inSituRowOffsetRef = useRef(0);\n const pctScrollTopRef = useRef(0);\n // TODO we are limited by pixels not an arbitrary number of rows\n const virtualContentHeight = rowCount * rowHeight;\n const pixelContentHeight = Math.min(virtualContentHeight, MAX_PIXEL_HEIGHT);\n const virtualisedExtent = virtualContentHeight - pixelContentHeight;\n\n const { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth } = useMemo(\n () => measurePinnedColumns(columns, selectionEndSize),\n [columns, selectionEndSize],\n );\n\n const [getRowOffset, getRowAtPosition, isVirtualScroll] =\n useMemo<RowPositioning>(() => {\n if (virtualisedExtent) {\n const [_getRowOffset, getRowAtPosition, _isVirtual] =\n virtualRowPositioning(rowHeight, virtualisedExtent, pctScrollTopRef);\n const getOffset: RowOffsetFunc = (row) => {\n return _getRowOffset(row, inSituRowOffsetRef.current);\n };\n return [getOffset, getRowAtPosition, _isVirtual];\n } else {\n return actualRowPositioning(rowHeight);\n }\n }, [virtualisedExtent, rowHeight]);\n\n const setScrollTop = useCallback((_: number, scrollPct: number) => {\n pctScrollTopRef.current = scrollPct;\n }, []);\n\n /**\n * The inSituRowOffset is used to simulate scrolling through a very large dataset\n * without actually moving the scroll position. It is triggered by keyboard\n * navigation. A simulated scroll operation will always be of one or more rows.\n * A value of zero is a request to reset the offset.\n */\n const setInSituRowOffset = useCallback((rowIndexOffset: number) => {\n if (rowIndexOffset === 0) {\n inSituRowOffsetRef.current = 0;\n } else {\n inSituRowOffsetRef.current = Math.max(\n 0,\n inSituRowOffsetRef.current + rowIndexOffset,\n );\n }\n }, []);\n\n return useMemo(() => {\n if (size) {\n // TODO determine this at runtime\n const scrollbarSize = 10;\n const contentWidth = pinnedWidthLeft + unpinnedWidth + pinnedWidthRight;\n const horizontalScrollbarHeight =\n contentWidth > size.width ? scrollbarSize : 0;\n const visibleRows = (size.height - headerHeight) / rowHeight;\n const count = Number.isInteger(visibleRows)\n ? visibleRows\n : Math.ceil(visibleRows);\n const viewportBodyHeight = size.height - headerHeight;\n const verticalScrollbarWidth =\n pixelContentHeight > viewportBodyHeight ? scrollbarSize : 0;\n\n const appliedPageSize =\n count * rowHeight * (pixelContentHeight / virtualContentHeight);\n\n const viewportWidth = size.width;\n\n return {\n appliedPageSize,\n contentHeight: pixelContentHeight,\n contentWidth,\n getRowAtPosition,\n getRowOffset,\n isVirtualScroll,\n horizontalScrollbarHeight,\n pinnedWidthLeft,\n pinnedWidthRight,\n rowCount: count,\n setInSituRowOffset,\n setScrollTop,\n totalHeaderHeight: headerHeight,\n verticalScrollbarWidth,\n viewportBodyHeight,\n viewportWidth,\n };\n } else {\n return UNMEASURED_VIEWPORT;\n }\n }, [\n getRowAtPosition,\n getRowOffset,\n headerHeight,\n isVirtualScroll,\n pinnedWidthLeft,\n unpinnedWidth,\n pinnedWidthRight,\n pixelContentHeight,\n rowHeight,\n setInSituRowOffset,\n setScrollTop,\n size,\n virtualContentHeight,\n ]);\n};\n"],"names":["getRowAtPosition"],"mappings":"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"}
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
- "version": "0.8.81",
2
+ "version": "0.8.83",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "devDependencies": {
6
- "@vuu-ui/vuu-data-types": "0.8.81",
7
- "@vuu-ui/vuu-table-types": "0.8.81",
8
- "@vuu-ui/vuu-protocol-types": "0.8.81"
6
+ "@vuu-ui/vuu-data-types": "0.8.83",
7
+ "@vuu-ui/vuu-table-types": "0.8.83",
8
+ "@vuu-ui/vuu-protocol-types": "0.8.83"
9
9
  },
10
10
  "dependencies": {
11
- "@salt-ds/core": "1.27.1",
11
+ "@salt-ds/core": "1.34.0",
12
12
  "@salt-ds/styles": "0.2.1",
13
13
  "@salt-ds/window": "0.1.1",
14
- "@vuu-ui/vuu-data-react": "0.8.81",
15
- "@vuu-ui/vuu-layout": "0.8.81",
16
- "@vuu-ui/vuu-popups": "0.8.81",
17
- "@vuu-ui/vuu-ui-controls": "0.8.81",
18
- "@vuu-ui/vuu-utils": "0.8.81"
14
+ "@vuu-ui/vuu-data-react": "0.8.83",
15
+ "@vuu-ui/vuu-layout": "0.8.83",
16
+ "@vuu-ui/vuu-popups": "0.8.83",
17
+ "@vuu-ui/vuu-ui-controls": "0.8.83",
18
+ "@vuu-ui/vuu-utils": "0.8.83"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "clsx": "^2.0.0",