@vuu-ui/vuu-table 2.1.18 → 2.1.19-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +13 -16
- package/src/CellFocusState.mjs +25 -0
- package/src/Row.mjs +83 -0
- package/src/Table.css.js +441 -0
- package/src/Table.mjs +297 -0
- package/src/VirtualColSpan.mjs +12 -0
- package/src/applyHighlighting.mjs +28 -0
- package/src/bulk-edit/BulkEditPanel.css.js +27 -0
- package/src/bulk-edit/BulkEditPanel.mjs +77 -0
- package/src/bulk-edit/ColumnCascadingUpdateEditor.css.js +86 -0
- package/src/bulk-edit/ColumnCascadingUpdateEditor.mjs +59 -0
- package/src/bulk-edit/InsertNewRowEditor.css.js +86 -0
- package/src/bulk-edit/InsertNewRowEditor.mjs +59 -0
- package/src/bulk-edit/useBulkEditPanel.mjs +61 -0
- package/src/bulk-edit/useColumnCascadingEditor.mjs +124 -0
- package/src/cell-block/CellBlock.css.js +95 -0
- package/src/cell-block/CellBlock.mjs +32 -0
- package/src/cell-block/cellblock-utils.mjs +114 -0
- package/src/cell-block/useCellBlockSelection.mjs +245 -0
- package/src/cell-renderers/checkbox-cell/CheckboxCell.css.js +16 -0
- package/src/cell-renderers/checkbox-cell/CheckboxCell.mjs +56 -0
- package/src/cell-renderers/checkbox-cell/index.mjs +1 -0
- package/src/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.css.js +19 -0
- package/src/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.mjs +34 -0
- package/src/cell-renderers/checkbox-row-selector/index.mjs +1 -0
- package/src/cell-renderers/index.mjs +4 -0
- package/src/cell-renderers/input-cell/InputCell.css.js +81 -0
- package/src/cell-renderers/input-cell/InputCell.mjs +73 -0
- package/src/cell-renderers/input-cell/index.mjs +1 -0
- package/src/cell-renderers/input-cell/useInputCell.mjs +199 -0
- package/src/cell-renderers/toggle-cell/ToggleCell.css.js +31 -0
- package/src/cell-renderers/toggle-cell/ToggleCell.mjs +47 -0
- package/src/cell-renderers/toggle-cell/index.mjs +1 -0
- package/src/column-header-pill/ColumnHeaderPill.css.js +34 -0
- package/src/column-header-pill/ColumnHeaderPill.mjs +39 -0
- package/src/column-header-pill/GroupColumnPill.css.js +10 -0
- package/src/column-header-pill/GroupColumnPill.mjs +33 -0
- package/src/column-header-pill/SortIndicator.css.js +15 -0
- package/src/column-header-pill/SortIndicator.mjs +29 -0
- package/src/column-header-pill/index.mjs +3 -0
- package/src/column-resizing/ColumnResizer.css.js +32 -0
- package/src/column-resizing/ColumnResizer.mjs +69 -0
- package/src/column-resizing/index.mjs +2 -0
- package/src/column-resizing/useTableColumnResize.mjs +57 -0
- package/src/data-row/DataRow.mjs +298 -0
- package/src/header-cell/GroupHeaderCell.css.js +91 -0
- package/src/header-cell/GroupHeaderCell.mjs +98 -0
- package/src/header-cell/HeaderCell.css.js +182 -0
- package/src/header-cell/HeaderCell.mjs +126 -0
- package/src/header-cell/index.mjs +2 -0
- package/src/index.mjs +20 -0
- package/src/pagination/PaginationControl.css.js +18 -0
- package/src/pagination/PaginationControl.mjs +34 -0
- package/src/pagination/index.mjs +1 -0
- package/src/pagination/usePagination.mjs +29 -0
- package/src/table-cell/TableCell.css.js +67 -0
- package/src/table-cell/TableCell.mjs +54 -0
- package/src/table-cell/TableGroupCell.css.js +91 -0
- package/src/table-cell/TableGroupCell.mjs +61 -0
- package/src/table-cell/index.mjs +2 -0
- package/src/table-config/useTableConfig.mjs +49 -0
- package/src/table-config.mjs +38 -0
- package/src/table-data-source/DataRowMovingWindow.mjs +66 -0
- package/src/table-data-source/useDataSource.mjs +177 -0
- package/src/table-dom-utils.mjs +162 -0
- package/src/table-header/HeaderProvider.mjs +14 -0
- package/src/table-header/TableHeader.mjs +182 -0
- package/src/table-header/index.mjs +2 -0
- package/src/table-header/useTableHeader.mjs +69 -0
- package/src/useCell.mjs +22 -0
- package/src/useCellEditing.mjs +58 -0
- package/src/useCellFocus.mjs +112 -0
- package/src/useControlledTableNavigation.mjs +34 -0
- package/src/useEditableCell.mjs +18 -0
- package/src/useInitialValue.mjs +6 -0
- package/src/useKeyboardNavigation.mjs +275 -0
- package/src/useMeasuredHeight.mjs +44 -0
- package/src/useResizeObserver.mjs +118 -0
- package/src/useRowClassNameGenerators.mjs +21 -0
- package/src/useSelection.mjs +101 -0
- package/src/useTable.mjs +588 -0
- package/src/useTableContextMenu.mjs +54 -0
- package/src/useTableModel.mjs +344 -0
- package/src/useTableScroll.mjs +382 -0
- package/src/useTableViewport.mjs +120 -0
- package/types/VirtualColSpan.d.ts +2 -2
- package/types/cell-renderers/toggle-cell/ToggleCell.d.ts +1 -1
- package/types/useTable.d.ts +3 -3
- package/cjs/CellFocusState.js +0 -45
- package/cjs/CellFocusState.js.map +0 -1
- package/cjs/Row.js +0 -116
- package/cjs/Row.js.map +0 -1
- package/cjs/Table.css.js +0 -6
- package/cjs/Table.css.js.map +0 -1
- package/cjs/Table.js +0 -455
- package/cjs/Table.js.map +0 -1
- package/cjs/VirtualColSpan.js +0 -19
- package/cjs/VirtualColSpan.js.map +0 -1
- package/cjs/applyHighlighting.js +0 -33
- package/cjs/applyHighlighting.js.map +0 -1
- package/cjs/bulk-edit/BulkEditPanel.css.js +0 -6
- package/cjs/bulk-edit/BulkEditPanel.css.js.map +0 -1
- package/cjs/bulk-edit/BulkEditPanel.js +0 -107
- package/cjs/bulk-edit/BulkEditPanel.js.map +0 -1
- package/cjs/bulk-edit/ColumnCascadingUpdateEditor.css.js +0 -6
- package/cjs/bulk-edit/ColumnCascadingUpdateEditor.css.js.map +0 -1
- package/cjs/bulk-edit/ColumnCascadingUpdateEditor.js +0 -80
- package/cjs/bulk-edit/ColumnCascadingUpdateEditor.js.map +0 -1
- package/cjs/bulk-edit/InsertNewRowEditor.css.js +0 -6
- package/cjs/bulk-edit/InsertNewRowEditor.css.js.map +0 -1
- package/cjs/bulk-edit/InsertNewRowEditor.js +0 -80
- package/cjs/bulk-edit/InsertNewRowEditor.js.map +0 -1
- package/cjs/bulk-edit/useBulkEditPanel.js +0 -70
- package/cjs/bulk-edit/useBulkEditPanel.js.map +0 -1
- package/cjs/bulk-edit/useColumnCascadingEditor.js +0 -143
- package/cjs/bulk-edit/useColumnCascadingEditor.js.map +0 -1
- package/cjs/cell-block/CellBlock.css.js +0 -6
- package/cjs/cell-block/CellBlock.css.js.map +0 -1
- package/cjs/cell-block/CellBlock.js +0 -45
- package/cjs/cell-block/CellBlock.js.map +0 -1
- package/cjs/cell-block/cellblock-utils.js +0 -125
- package/cjs/cell-block/cellblock-utils.js.map +0 -1
- package/cjs/cell-block/useCellBlockSelection.js +0 -257
- package/cjs/cell-block/useCellBlockSelection.js.map +0 -1
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js +0 -6
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +0 -1
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +0 -67
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +0 -1
- package/cjs/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.css.js +0 -6
- package/cjs/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.css.js.map +0 -1
- package/cjs/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js +0 -51
- package/cjs/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +0 -1
- package/cjs/cell-renderers/input-cell/InputCell.css.js +0 -6
- package/cjs/cell-renderers/input-cell/InputCell.css.js.map +0 -1
- package/cjs/cell-renderers/input-cell/InputCell.js +0 -63
- package/cjs/cell-renderers/input-cell/InputCell.js.map +0 -1
- package/cjs/cell-renderers/input-cell/useInputCell.js +0 -211
- package/cjs/cell-renderers/input-cell/useInputCell.js.map +0 -1
- package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js +0 -6
- package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js.map +0 -1
- package/cjs/cell-renderers/toggle-cell/ToggleCell.js +0 -66
- package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +0 -1
- package/cjs/column-header-pill/ColumnHeaderPill.css.js +0 -6
- package/cjs/column-header-pill/ColumnHeaderPill.css.js.map +0 -1
- package/cjs/column-header-pill/ColumnHeaderPill.js +0 -53
- package/cjs/column-header-pill/ColumnHeaderPill.js.map +0 -1
- package/cjs/column-header-pill/GroupColumnPill.css.js +0 -6
- package/cjs/column-header-pill/GroupColumnPill.css.js.map +0 -1
- package/cjs/column-header-pill/GroupColumnPill.js +0 -29
- package/cjs/column-header-pill/GroupColumnPill.js.map +0 -1
- package/cjs/column-header-pill/SortIndicator.css.js +0 -6
- package/cjs/column-header-pill/SortIndicator.css.js.map +0 -1
- package/cjs/column-header-pill/SortIndicator.js +0 -27
- package/cjs/column-header-pill/SortIndicator.js.map +0 -1
- package/cjs/column-resizing/ColumnResizer.css.js +0 -6
- package/cjs/column-resizing/ColumnResizer.css.js.map +0 -1
- package/cjs/column-resizing/ColumnResizer.js +0 -82
- package/cjs/column-resizing/ColumnResizer.js.map +0 -1
- package/cjs/column-resizing/useTableColumnResize.js +0 -55
- package/cjs/column-resizing/useTableColumnResize.js.map +0 -1
- package/cjs/data-row/DataRow.js +0 -262
- package/cjs/data-row/DataRow.js.map +0 -1
- package/cjs/header-cell/GroupHeaderCell.css.js +0 -6
- package/cjs/header-cell/GroupHeaderCell.css.js.map +0 -1
- package/cjs/header-cell/GroupHeaderCell.js +0 -127
- package/cjs/header-cell/GroupHeaderCell.js.map +0 -1
- package/cjs/header-cell/HeaderCell.css.js +0 -6
- package/cjs/header-cell/HeaderCell.css.js.map +0 -1
- package/cjs/header-cell/HeaderCell.js +0 -139
- package/cjs/header-cell/HeaderCell.js.map +0 -1
- package/cjs/index.js +0 -64
- package/cjs/index.js.map +0 -1
- package/cjs/pagination/PaginationControl.css.js +0 -6
- package/cjs/pagination/PaginationControl.css.js.map +0 -1
- package/cjs/pagination/PaginationControl.js +0 -38
- package/cjs/pagination/PaginationControl.js.map +0 -1
- package/cjs/pagination/usePagination.js +0 -36
- package/cjs/pagination/usePagination.js.map +0 -1
- package/cjs/table-cell/TableCell.css.js +0 -6
- package/cjs/table-cell/TableCell.css.js.map +0 -1
- package/cjs/table-cell/TableCell.js +0 -75
- package/cjs/table-cell/TableCell.js.map +0 -1
- package/cjs/table-cell/TableGroupCell.css.js +0 -6
- package/cjs/table-cell/TableGroupCell.css.js.map +0 -1
- package/cjs/table-cell/TableGroupCell.js +0 -65
- package/cjs/table-cell/TableGroupCell.js.map +0 -1
- package/cjs/table-config/useTableConfig.js +0 -67
- package/cjs/table-config/useTableConfig.js.map +0 -1
- package/cjs/table-config.js +0 -35
- package/cjs/table-config.js.map +0 -1
- package/cjs/table-data-source/DataRowMovingWindow.js +0 -99
- package/cjs/table-data-source/DataRowMovingWindow.js.map +0 -1
- package/cjs/table-data-source/useDataSource.js +0 -236
- package/cjs/table-data-source/useDataSource.js.map +0 -1
- package/cjs/table-dom-utils.js +0 -206
- package/cjs/table-dom-utils.js.map +0 -1
- package/cjs/table-header/HeaderProvider.js +0 -18
- package/cjs/table-header/HeaderProvider.js.map +0 -1
- package/cjs/table-header/TableHeader.js +0 -180
- package/cjs/table-header/TableHeader.js.map +0 -1
- package/cjs/table-header/useTableHeader.js +0 -87
- package/cjs/table-header/useTableHeader.js.map +0 -1
- package/cjs/useCell.js +0 -26
- package/cjs/useCell.js.map +0 -1
- package/cjs/useCellEditing.js +0 -77
- package/cjs/useCellEditing.js.map +0 -1
- package/cjs/useCellFocus.js +0 -119
- package/cjs/useCellFocus.js.map +0 -1
- package/cjs/useControlledTableNavigation.js +0 -46
- package/cjs/useControlledTableNavigation.js.map +0 -1
- package/cjs/useEditableCell.js +0 -27
- package/cjs/useEditableCell.js.map +0 -1
- package/cjs/useKeyboardNavigation.js +0 -323
- package/cjs/useKeyboardNavigation.js.map +0 -1
- package/cjs/useMeasuredHeight.js +0 -51
- package/cjs/useMeasuredHeight.js.map +0 -1
- package/cjs/useRowClassNameGenerators.js +0 -34
- package/cjs/useRowClassNameGenerators.js.map +0 -1
- package/cjs/useSelection.js +0 -130
- package/cjs/useSelection.js.map +0 -1
- package/cjs/useTable.js +0 -742
- package/cjs/useTable.js.map +0 -1
- package/cjs/useTableContextMenu.js +0 -76
- package/cjs/useTableContextMenu.js.map +0 -1
- package/cjs/useTableModel.js +0 -421
- package/cjs/useTableModel.js.map +0 -1
- package/cjs/useTableScroll.js +0 -464
- package/cjs/useTableScroll.js.map +0 -1
- package/cjs/useTableViewport.js +0 -137
- package/cjs/useTableViewport.js.map +0 -1
- package/esm/CellFocusState.js +0 -43
- package/esm/CellFocusState.js.map +0 -1
- package/esm/Row.js +0 -114
- package/esm/Row.js.map +0 -1
- package/esm/Table.css.js +0 -4
- package/esm/Table.css.js.map +0 -1
- package/esm/Table.js +0 -453
- package/esm/Table.js.map +0 -1
- package/esm/VirtualColSpan.js +0 -17
- package/esm/VirtualColSpan.js.map +0 -1
- package/esm/applyHighlighting.js +0 -31
- package/esm/applyHighlighting.js.map +0 -1
- package/esm/bulk-edit/BulkEditPanel.css.js +0 -4
- package/esm/bulk-edit/BulkEditPanel.css.js.map +0 -1
- package/esm/bulk-edit/BulkEditPanel.js +0 -105
- package/esm/bulk-edit/BulkEditPanel.js.map +0 -1
- package/esm/bulk-edit/ColumnCascadingUpdateEditor.css.js +0 -4
- package/esm/bulk-edit/ColumnCascadingUpdateEditor.css.js.map +0 -1
- package/esm/bulk-edit/ColumnCascadingUpdateEditor.js +0 -78
- package/esm/bulk-edit/ColumnCascadingUpdateEditor.js.map +0 -1
- package/esm/bulk-edit/InsertNewRowEditor.css.js +0 -4
- package/esm/bulk-edit/InsertNewRowEditor.css.js.map +0 -1
- package/esm/bulk-edit/InsertNewRowEditor.js +0 -78
- package/esm/bulk-edit/InsertNewRowEditor.js.map +0 -1
- package/esm/bulk-edit/useBulkEditPanel.js +0 -68
- package/esm/bulk-edit/useBulkEditPanel.js.map +0 -1
- package/esm/bulk-edit/useColumnCascadingEditor.js +0 -141
- package/esm/bulk-edit/useColumnCascadingEditor.js.map +0 -1
- package/esm/cell-block/CellBlock.css.js +0 -4
- package/esm/cell-block/CellBlock.css.js.map +0 -1
- package/esm/cell-block/CellBlock.js +0 -43
- package/esm/cell-block/CellBlock.js.map +0 -1
- package/esm/cell-block/cellblock-utils.js +0 -116
- package/esm/cell-block/cellblock-utils.js.map +0 -1
- package/esm/cell-block/useCellBlockSelection.js +0 -255
- package/esm/cell-block/useCellBlockSelection.js.map +0 -1
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js +0 -4
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +0 -1
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +0 -65
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +0 -1
- package/esm/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.css.js +0 -4
- package/esm/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.css.js.map +0 -1
- package/esm/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js +0 -49
- package/esm/cell-renderers/checkbox-row-selector/CheckboxRowSelectorCell.js.map +0 -1
- package/esm/cell-renderers/input-cell/InputCell.css.js +0 -4
- package/esm/cell-renderers/input-cell/InputCell.css.js.map +0 -1
- package/esm/cell-renderers/input-cell/InputCell.js +0 -61
- package/esm/cell-renderers/input-cell/InputCell.js.map +0 -1
- package/esm/cell-renderers/input-cell/useInputCell.js +0 -209
- package/esm/cell-renderers/input-cell/useInputCell.js.map +0 -1
- package/esm/cell-renderers/toggle-cell/ToggleCell.css.js +0 -4
- package/esm/cell-renderers/toggle-cell/ToggleCell.css.js.map +0 -1
- package/esm/cell-renderers/toggle-cell/ToggleCell.js +0 -64
- package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +0 -1
- package/esm/column-header-pill/ColumnHeaderPill.css.js +0 -4
- package/esm/column-header-pill/ColumnHeaderPill.css.js.map +0 -1
- package/esm/column-header-pill/ColumnHeaderPill.js +0 -51
- package/esm/column-header-pill/ColumnHeaderPill.js.map +0 -1
- package/esm/column-header-pill/GroupColumnPill.css.js +0 -4
- package/esm/column-header-pill/GroupColumnPill.css.js.map +0 -1
- package/esm/column-header-pill/GroupColumnPill.js +0 -27
- package/esm/column-header-pill/GroupColumnPill.js.map +0 -1
- package/esm/column-header-pill/SortIndicator.css.js +0 -4
- package/esm/column-header-pill/SortIndicator.css.js.map +0 -1
- package/esm/column-header-pill/SortIndicator.js +0 -25
- package/esm/column-header-pill/SortIndicator.js.map +0 -1
- package/esm/column-resizing/ColumnResizer.css.js +0 -4
- package/esm/column-resizing/ColumnResizer.css.js.map +0 -1
- package/esm/column-resizing/ColumnResizer.js +0 -80
- package/esm/column-resizing/ColumnResizer.js.map +0 -1
- package/esm/column-resizing/useTableColumnResize.js +0 -53
- package/esm/column-resizing/useTableColumnResize.js.map +0 -1
- package/esm/data-row/DataRow.js +0 -260
- package/esm/data-row/DataRow.js.map +0 -1
- package/esm/header-cell/GroupHeaderCell.css.js +0 -4
- package/esm/header-cell/GroupHeaderCell.css.js.map +0 -1
- package/esm/header-cell/GroupHeaderCell.js +0 -125
- package/esm/header-cell/GroupHeaderCell.js.map +0 -1
- package/esm/header-cell/HeaderCell.css.js +0 -4
- package/esm/header-cell/HeaderCell.css.js.map +0 -1
- package/esm/header-cell/HeaderCell.js +0 -137
- package/esm/header-cell/HeaderCell.js.map +0 -1
- package/esm/index.js +0 -27
- package/esm/index.js.map +0 -1
- package/esm/pagination/PaginationControl.css.js +0 -4
- package/esm/pagination/PaginationControl.css.js.map +0 -1
- package/esm/pagination/PaginationControl.js +0 -36
- package/esm/pagination/PaginationControl.js.map +0 -1
- package/esm/pagination/usePagination.js +0 -34
- package/esm/pagination/usePagination.js.map +0 -1
- package/esm/table-cell/TableCell.css.js +0 -4
- package/esm/table-cell/TableCell.css.js.map +0 -1
- package/esm/table-cell/TableCell.js +0 -73
- package/esm/table-cell/TableCell.js.map +0 -1
- package/esm/table-cell/TableGroupCell.css.js +0 -4
- package/esm/table-cell/TableGroupCell.css.js.map +0 -1
- package/esm/table-cell/TableGroupCell.js +0 -63
- package/esm/table-cell/TableGroupCell.js.map +0 -1
- package/esm/table-config/useTableConfig.js +0 -65
- package/esm/table-config/useTableConfig.js.map +0 -1
- package/esm/table-config.js +0 -33
- package/esm/table-config.js.map +0 -1
- package/esm/table-data-source/DataRowMovingWindow.js +0 -97
- package/esm/table-data-source/DataRowMovingWindow.js.map +0 -1
- package/esm/table-data-source/useDataSource.js +0 -234
- package/esm/table-data-source/useDataSource.js.map +0 -1
- package/esm/table-dom-utils.js +0 -188
- package/esm/table-dom-utils.js.map +0 -1
- package/esm/table-header/HeaderProvider.js +0 -15
- package/esm/table-header/HeaderProvider.js.map +0 -1
- package/esm/table-header/TableHeader.js +0 -178
- package/esm/table-header/TableHeader.js.map +0 -1
- package/esm/table-header/useTableHeader.js +0 -85
- package/esm/table-header/useTableHeader.js.map +0 -1
- package/esm/useCell.js +0 -24
- package/esm/useCell.js.map +0 -1
- package/esm/useCellEditing.js +0 -75
- package/esm/useCellEditing.js.map +0 -1
- package/esm/useCellFocus.js +0 -117
- package/esm/useCellFocus.js.map +0 -1
- package/esm/useControlledTableNavigation.js +0 -43
- package/esm/useControlledTableNavigation.js.map +0 -1
- package/esm/useEditableCell.js +0 -25
- package/esm/useEditableCell.js.map +0 -1
- package/esm/useKeyboardNavigation.js +0 -319
- package/esm/useKeyboardNavigation.js.map +0 -1
- package/esm/useMeasuredHeight.js +0 -49
- package/esm/useMeasuredHeight.js.map +0 -1
- package/esm/useRowClassNameGenerators.js +0 -32
- package/esm/useRowClassNameGenerators.js.map +0 -1
- package/esm/useSelection.js +0 -128
- package/esm/useSelection.js.map +0 -1
- package/esm/useTable.js +0 -740
- package/esm/useTable.js.map +0 -1
- package/esm/useTableContextMenu.js +0 -73
- package/esm/useTableContextMenu.js.map +0 -1
- package/esm/useTableModel.js +0 -419
- package/esm/useTableModel.js.map +0 -1
- package/esm/useTableScroll.js +0 -461
- package/esm/useTableScroll.js.map +0 -1
- package/esm/useTableViewport.js +0 -135
- package/esm/useTableViewport.js.map +0 -1
package/esm/useTableModel.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useTableModel.js","sources":["../../../packages/vuu-table/src/useTableModel.ts"],"sourcesContent":["import { buildValidationChecker } from \"@vuu-ui/vuu-data-react\";\nimport {\n DataSource,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuColumnDataType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n ColumnLayout,\n ResizePhase,\n RuntimeColumnDescriptor,\n TableDisplayAttributes,\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 assertAllColumnsAreIncludedInSubscription,\n checkConfirmationPending,\n existingSort,\n flattenColumnGroup,\n getCellRenderer,\n getColumnHeaderContentRenderer,\n getColumnHeaderLabelRenderer,\n getColumnLabel,\n getTableHeadings,\n getValueFormatter,\n hasValidationRules,\n isFilteredColumn,\n isGroupColumn,\n isNumericType,\n isPinned,\n logger,\n removeSort,\n replaceColumn,\n sortPinnedColumns,\n stripFilterFromColumns,\n} from \"@vuu-ui/vuu-utils\";\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 = (\n selectionModel: TableSelectionModel,\n width = 25,\n): ColumnDescriptor => ({\n allowColumnHeaderMenu: false,\n className: selectionModel === \"checkbox-disabled\" ? \"vuuDisabled\" : undefined,\n label: \"\",\n name: \"\",\n width,\n resizeable: false,\n sortable: false,\n isSystemColumn: true,\n type: {\n name: \"checkbox\",\n renderer: {\n name: \"checkbox-row-selector-cell\",\n },\n },\n});\n\nconst PinnedCheckboxColumnDescriptor = (\n selectionModel: TableSelectionModel,\n width?: number,\n): ColumnDescriptor => ({\n ...CheckboxColumnDescriptor(selectionModel, width),\n pin: \"left\",\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 TableDisplayAttributes {\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 getDefaultAlignment = (serverDataType?: VuuColumnDataType) =>\n serverDataType === undefined\n ? undefined\n : isNumericType(serverDataType)\n ? \"right\"\n : \"left\";\n\nexport interface ColumnActionInit {\n availableWidth: number;\n selectionModel?: TableSelectionModel;\n type: \"init\";\n tableConfig: TableConfig;\n dataSource: DataSource;\n}\n\nexport interface ColumnActionHide {\n type: \"hideColumns\";\n columns: ColumnDescriptor[];\n}\nexport interface ColumnActionRemove {\n type: \"removeColumn\";\n column: ColumnDescriptor;\n}\n\nexport interface ColumnActionShow {\n type: \"showColumns\";\n columns: RuntimeColumnDescriptor[];\n}\nexport interface ColumnActionMove {\n type: \"moveColumn\";\n column: RuntimeColumnDescriptor;\n moveBy?: 1 | -1;\n}\n\nexport interface ColumnActionResize {\n type: \"resizeColumn\";\n column: RuntimeColumnDescriptor;\n phase: ResizePhase;\n width?: number;\n}\n\nexport interface ColumnActionSetTableSchema {\n type: \"setTableSchema\";\n tableSchema: TableSchema;\n}\n\nexport interface ColumnActionUpdate {\n type: \"updateColumn\";\n column: ColumnDescriptor;\n}\n\nexport interface ColumnActionUpdateProp {\n align?: ColumnDescriptor[\"align\"];\n column: ColumnDescriptor;\n hidden?: ColumnDescriptor[\"hidden\"];\n label?: ColumnDescriptor[\"label\"];\n resizing?: RuntimeColumnDescriptor[\"resizing\"];\n type: \"updateColumnProp\";\n width?: ColumnDescriptor[\"width\"];\n}\n\nexport interface ColumnActionTableConfig\n extends WithBaseFilter<WithFullConfig> {\n confirmed?: boolean;\n type: \"tableConfig\";\n}\n\nexport type TableModelAction =\n | ColumnActionHide\n | ColumnActionInit\n | ColumnActionMove\n | ColumnActionResize\n | ColumnActionSetTableSchema\n | ColumnActionShow\n | ColumnActionUpdate\n | ColumnActionUpdateProp\n | ColumnActionTableConfig;\n\ntype TableModelReducer = Reducer<InternalTableModel, TableModelAction>;\n\nexport type TableModelActionDispatch = (action: TableModelAction) => void;\n\nconst tableModelReducer: TableModelReducer = (state, action) => {\n info?.(`TableModelReducer ${action.type}`);\n switch (action.type) {\n case \"init\": {\n if (\n state.tableConfig.columnLayout === \"manual\" &&\n action.tableConfig.columnLayout === \"fit\"\n ) {\n //TODO we're jumping through hoops here when we should just make config a controlled prop\n\n // Manual columnLayout has been assigned because user has resized one or more columns.\n // It happened during current session so tableConfig still reflects original value.\n return init({\n ...action,\n tableConfig: applyRuntimeColumnWidthsToConfig(\n action.tableConfig,\n state.columns,\n ),\n });\n } else {\n return init(action, state);\n }\n }\n case \"moveColumn\":\n return moveColumn(state, action);\n case \"resizeColumn\":\n return resizeColumn(state, action);\n case \"setTableSchema\":\n return setTableSchema(state, action);\n case \"hideColumns\":\n return hideColumns(state, action);\n case \"showColumns\":\n return showColumns(state, action);\n case \"updateColumnProp\":\n return updateColumnProp(state, action);\n case \"tableConfig\":\n return updateTableConfig(state, action);\n default:\n console.log(`unhandled action ${action.type}`);\n return state;\n }\n};\n\nexport interface TableModelHookProps {\n config: TableConfig;\n dataSource: DataSource;\n selectionModel: TableSelectionModel;\n availableWidth: number;\n}\n\nexport const useTableModel = ({\n config: tableConfigProp,\n dataSource,\n selectionModel,\n availableWidth,\n}: TableModelHookProps) => {\n const [state, dispatchTableModelAction] = useReducer(\n tableModelReducer,\n {\n availableWidth,\n tableConfig: tableConfigProp,\n dataSource,\n selectionModel,\n },\n init,\n );\n\n const { columns, headings, tableConfig, ...tableAttributes } = state;\n\n return {\n columns,\n dispatchTableModelAction,\n headings,\n tableAttributes,\n tableConfig,\n };\n};\n\ntype InitialConfig = {\n availableWidth: number;\n columnLayout?: ColumnLayout;\n dataSource: DataSource;\n selectionModel?: TableSelectionModel;\n tableConfig: TableConfig;\n};\n\nfunction init(\n { availableWidth, dataSource, selectionModel, tableConfig }: InitialConfig,\n previousConfig?: InternalTableModel,\n): InternalTableModel {\n const { checkboxColumnWidth = 25, columns, ...tableAttributes } = tableConfig;\n const { config: dataSourceConfig, tableSchema } = dataSource;\n const toRuntimeColumnDescriptor = columnDescriptorToRuntimeColumDescriptor(\n tableAttributes,\n tableSchema,\n );\n\n const runtimeColumns: RuntimeColumnDescriptor[] = [];\n\n let colIndex = selectionModel?.startsWith(\"checkbox\") ? 2 : 1;\n assertAllColumnsAreIncludedInSubscription(columns, dataSourceConfig.columns);\n for (const column of columns) {\n runtimeColumns.push(\n toRuntimeColumnDescriptor(column, column.hidden ? -1 : colIndex),\n );\n if (!column.hidden) {\n colIndex += 1;\n }\n }\n\n if (selectionModel?.startsWith(\"checkbox\")) {\n const somePinnedLeft = runtimeColumns.some((col) => col.pin === \"left\");\n runtimeColumns.splice(\n 0,\n 0,\n toRuntimeColumnDescriptor(\n somePinnedLeft\n ? PinnedCheckboxColumnDescriptor(selectionModel, checkboxColumnWidth)\n : CheckboxColumnDescriptor(selectionModel, checkboxColumnWidth),\n 1,\n ),\n );\n }\n\n const { columnLayout = \"static\", selectionBookendWidth = 4 } = tableConfig;\n const runtimeColumnsWithLayout = applyWidthToColumns(runtimeColumns, {\n availableWidth,\n columnLayout,\n });\n\n const columnsInRenderOrder = runtimeColumnsWithLayout.some(isPinned)\n ? sortPinnedColumns(runtimeColumnsWithLayout, selectionBookendWidth)\n : runtimeColumnsWithLayout;\n\n let state: InternalTableModel = {\n availableWidth,\n columns: columnsInRenderOrder,\n headings: getTableHeadings(columnsInRenderOrder),\n tableConfig,\n ...tableAttributes,\n };\n if (dataSourceConfig) {\n const { columns: _, ...rest } = dataSourceConfig;\n state = updateTableConfig(state, {\n type: \"tableConfig\",\n ...rest,\n confirmed: checkConfirmationPending(previousConfig),\n });\n }\n return state;\n}\n\nconst getLabel = (\n label: string,\n columnFormatHeader?: \"uppercase\" | \"capitalize\",\n): string => {\n if (columnFormatHeader === \"uppercase\") {\n return label.toUpperCase();\n } else if (columnFormatHeader === \"capitalize\") {\n return label[0].toUpperCase() + label.slice(1).toLowerCase();\n }\n return label;\n};\n\nconst columnDescriptorToRuntimeColumDescriptor =\n (tableAttributes: TableDisplayAttributes, tableSchema?: TableSchema) =>\n (column: ColumnDescriptor, ariaColIndex: number): RuntimeColumnDescriptor => {\n const { columnDefaultWidth = DEFAULT_COLUMN_WIDTH, columnFormatHeader } =\n tableAttributes;\n const serverDataType = getDataType(column, tableSchema);\n const {\n align = getDefaultAlignment(serverDataType),\n name,\n label = getColumnLabel(column),\n source = \"server\",\n width = columnDefaultWidth,\n ...rest\n } = column;\n\n const runtimeColumnWithDefaults: RuntimeColumnDescriptor = {\n ...rest,\n align,\n ariaColIndex,\n CellRenderer: getCellRenderer(column),\n HeaderCellContentRenderer: getColumnHeaderContentRenderer(column),\n HeaderCellLabelRenderer: getColumnHeaderLabelRenderer(column),\n clientSideEditValidationCheck: hasValidationRules(column.type)\n ? buildValidationChecker(column.type.rules)\n : undefined,\n label: getLabel(label, columnFormatHeader),\n name,\n originalIdx: ariaColIndex,\n serverDataType,\n source,\n valueFormatter: getValueFormatter(column, serverDataType),\n width,\n };\n\n if (isGroupColumn(runtimeColumnWithDefaults)) {\n runtimeColumnWithDefaults.columns = runtimeColumnWithDefaults.columns.map(\n (col) =>\n columnDescriptorToRuntimeColumDescriptor(tableAttributes)(col, -1),\n );\n }\n\n return runtimeColumnWithDefaults;\n };\n\nfunction moveColumn(\n state: InternalTableModel,\n // TODO do we ever use this ?\n { column, moveBy }: ColumnActionMove,\n) {\n const { columns } = state;\n if (typeof moveBy === \"number\") {\n const idx = columns.indexOf(column);\n const newColumns = columns.slice();\n const [movedColumns] = newColumns.splice(idx, 1);\n newColumns.splice(idx + moveBy, 0, movedColumns);\n return {\n ...state,\n columns: newColumns,\n };\n }\n return state;\n}\n\nfunction hideColumns(state: InternalTableModel, { columns }: ColumnActionHide) {\n console.log(`[useTableModel] hideColumns ${JSON.stringify(columns)}`);\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 let newState: InternalTableModel = isFit\n ? {\n ...state,\n tableConfig: applyRuntimeColumnWidthsToConfig(\n tableConfig,\n state.columns,\n ),\n }\n : state;\n\n if (column.pin && !column.pinnedWidth && width) {\n // No pinned width means this is not the last column that is pinned left.\n // All left pinned columns following this one must have pinOffset adjusted\n newState = adjustPinOffsets(newState, column, width);\n }\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 adjustPinOffsets(\n state: InternalTableModel,\n column: RuntimeColumnDescriptor,\n width: number,\n) {\n const newColumns = state.columns.slice();\n if (column.pin === \"left\") {\n const diff = width - column.width;\n const colIndex = newColumns.findIndex((col) => col.name === column.name);\n for (let i = colIndex + 1; i < newColumns.length; i++) {\n const pinnedColumn = newColumns.at(i);\n if (\n pinnedColumn?.pin === \"left\" &&\n typeof pinnedColumn?.pinnedOffset === \"number\"\n ) {\n newColumns[i] = {\n ...newColumns[i],\n pinnedOffset: pinnedColumn.pinnedOffset + diff,\n };\n if (pinnedColumn.pinnedWidth) {\n // this is the endPin, we're done\n newColumns[i] = {\n ...newColumns[i],\n pinnedWidth: pinnedColumn.pinnedWidth + diff,\n };\n\n break;\n }\n } else {\n throw Error(\n `[useTableModel] adjustPinOffsets, invalid column pin, no endPin following pinned column`,\n );\n }\n }\n } else if (column.pin === \"right\") {\n throw \"whoaaargh\";\n } else {\n throw Error(\n `[useTableModel] adjustPinOffsets, invalid param, column is not pinned `,\n );\n }\n\n return {\n ...state,\n columns: newColumns,\n };\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\n// TODO rename to make clear its dataSOurce config\nfunction updateTableConfig(\n state: InternalTableModel,\n {\n confirmed,\n filterSpec,\n groupBy,\n sort,\n }: Omit<ColumnActionTableConfig, \"columns\">,\n) {\n let result = state;\n\n const { availableWidth, columnLayout = \"static\" } = state;\n\n if (groupBy.length > 0) {\n const groupedColumns = applyGroupByToColumns({\n columns: result.columns,\n groupBy,\n confirmed,\n availableWidth,\n });\n const columns = applyWidthToColumns(groupedColumns, {\n availableWidth,\n columnLayout,\n });\n\n result = {\n ...state,\n columns,\n };\n } else if (\n result.columns.length > 0 &&\n isGroupColumn(result.columns[0]) &&\n confirmed\n ) {\n result = {\n ...state,\n columns: flattenColumnGroup(result.columns),\n };\n }\n\n if (sort.sortDefs.length > 0) {\n result = {\n ...state,\n columns: applySortToColumns(result.columns, sort),\n };\n } else if (existingSort(result.columns)) {\n result = {\n ...state,\n columns: removeSort(result.columns),\n };\n }\n\n if (filterSpec.filter.length > 0) {\n result = {\n ...state,\n columns: applyFilterToColumns(result.columns, filterSpec),\n };\n } else if (result.columns.some(isFilteredColumn)) {\n result = {\n ...state,\n columns: stripFilterFromColumns(result.columns),\n };\n }\n\n return result;\n}\n"],"names":[],"mappings":"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"}
|
package/esm/useTableScroll.js
DELETED
|
@@ -1,461 +0,0 @@
|
|
|
1
|
-
import { getColumnsInViewport, itemsChanged } from '@vuu-ui/vuu-utils';
|
|
2
|
-
import { useRef, useState, useMemo, useCallback, useImperativeHandle, useEffect } from 'react';
|
|
3
|
-
import { getRowElementByAriaIndex, howFarIsRowOutsideViewport } from './table-dom-utils.js';
|
|
4
|
-
|
|
5
|
-
const SCROLL_MOVE_CHECK_THRESHOLD = 100;
|
|
6
|
-
const HORIZONTAL_SCROLL_BUFFER = 200;
|
|
7
|
-
const getMaxScroll = (container) => {
|
|
8
|
-
const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;
|
|
9
|
-
return [scrollWidth - clientWidth, scrollHeight - clientHeight];
|
|
10
|
-
};
|
|
11
|
-
const getPctScroll = (container) => {
|
|
12
|
-
const {
|
|
13
|
-
clientHeight,
|
|
14
|
-
clientWidth,
|
|
15
|
-
scrollHeight,
|
|
16
|
-
scrollLeft,
|
|
17
|
-
scrollTop,
|
|
18
|
-
scrollWidth
|
|
19
|
-
} = container;
|
|
20
|
-
const maxScrollLeft = scrollWidth - clientWidth;
|
|
21
|
-
const pctScrollLeft = scrollLeft / (scrollWidth - clientWidth);
|
|
22
|
-
const maxScrollTop = scrollHeight - clientHeight;
|
|
23
|
-
const pctScrollTop = scrollTop / (scrollHeight - clientHeight);
|
|
24
|
-
return [
|
|
25
|
-
scrollLeft,
|
|
26
|
-
pctScrollLeft,
|
|
27
|
-
maxScrollLeft,
|
|
28
|
-
scrollTop,
|
|
29
|
-
pctScrollTop,
|
|
30
|
-
maxScrollTop
|
|
31
|
-
];
|
|
32
|
-
};
|
|
33
|
-
const noScrolling = {
|
|
34
|
-
scrollToIndex: () => void 0,
|
|
35
|
-
scrollToKey: () => void 0
|
|
36
|
-
};
|
|
37
|
-
const useCallbackRef = ({
|
|
38
|
-
onAttach,
|
|
39
|
-
onDetach
|
|
40
|
-
}) => {
|
|
41
|
-
const ref = useRef(null);
|
|
42
|
-
const callbackRef = useCallback(
|
|
43
|
-
(el) => {
|
|
44
|
-
if (el) {
|
|
45
|
-
ref.current = el;
|
|
46
|
-
onAttach?.(el);
|
|
47
|
-
} else if (ref.current) {
|
|
48
|
-
const { current: originalRef } = ref;
|
|
49
|
-
ref.current = el;
|
|
50
|
-
onDetach?.(originalRef);
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
[onAttach, onDetach]
|
|
54
|
-
);
|
|
55
|
-
return callbackRef;
|
|
56
|
-
};
|
|
57
|
-
const useTableScroll = ({
|
|
58
|
-
cellFocusStateRef,
|
|
59
|
-
columns,
|
|
60
|
-
getRowAtPosition,
|
|
61
|
-
onHorizontalScroll,
|
|
62
|
-
onVerticalScroll,
|
|
63
|
-
onVerticalScrollInSitu,
|
|
64
|
-
rowHeight,
|
|
65
|
-
scrollingApiRef,
|
|
66
|
-
setRange,
|
|
67
|
-
viewportMeasurements
|
|
68
|
-
}) => {
|
|
69
|
-
const firstRowRef = useRef(0);
|
|
70
|
-
const rowHeightRef = useRef(rowHeight);
|
|
71
|
-
const contentContainerScrolledRef = useRef(false);
|
|
72
|
-
const contentContainerPosRef = useRef({
|
|
73
|
-
scrollTop: 0,
|
|
74
|
-
scrollLeft: 0
|
|
75
|
-
});
|
|
76
|
-
const scrollbarContainerScrolledRef = useRef(false);
|
|
77
|
-
const scrollbarContainerPosRef = useRef({
|
|
78
|
-
scrollTop: 0,
|
|
79
|
-
scrollLeft: 0
|
|
80
|
-
});
|
|
81
|
-
const scrollbarContainerRef = useRef(null);
|
|
82
|
-
const contentContainerRef = useRef(null);
|
|
83
|
-
const lastHorizontalScrollCheckPoint = useRef(0);
|
|
84
|
-
const {
|
|
85
|
-
appliedPageSize,
|
|
86
|
-
isVirtualScroll,
|
|
87
|
-
rowCount: viewportRowCount,
|
|
88
|
-
totalHeaderHeight,
|
|
89
|
-
usesMeasuredHeaderHeight,
|
|
90
|
-
viewportBodyHeight,
|
|
91
|
-
viewportWidth
|
|
92
|
-
} = viewportMeasurements;
|
|
93
|
-
const columnsWithinViewportRef = useRef([]);
|
|
94
|
-
const [, forceRefresh] = useState({});
|
|
95
|
-
const preSpanRef = useRef(0);
|
|
96
|
-
useMemo(() => {
|
|
97
|
-
const [visibleColumns, offset] = getColumnsInViewport(
|
|
98
|
-
columns,
|
|
99
|
-
contentContainerPosRef.current.scrollLeft,
|
|
100
|
-
contentContainerPosRef.current.scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER
|
|
101
|
-
);
|
|
102
|
-
preSpanRef.current = offset;
|
|
103
|
-
columnsWithinViewportRef.current = visibleColumns;
|
|
104
|
-
}, [viewportWidth, columns]);
|
|
105
|
-
const handleHorizontalScroll = useCallback(
|
|
106
|
-
(scrollLeft) => {
|
|
107
|
-
contentContainerPosRef.current.scrollLeft = scrollLeft;
|
|
108
|
-
onHorizontalScroll?.(scrollLeft);
|
|
109
|
-
if (Math.abs(scrollLeft - lastHorizontalScrollCheckPoint.current) > SCROLL_MOVE_CHECK_THRESHOLD) {
|
|
110
|
-
lastHorizontalScrollCheckPoint.current = scrollLeft;
|
|
111
|
-
const [visibleColumns, pre] = getColumnsInViewport(
|
|
112
|
-
columns,
|
|
113
|
-
scrollLeft,
|
|
114
|
-
scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER
|
|
115
|
-
);
|
|
116
|
-
if (itemsChanged(columnsWithinViewportRef.current, visibleColumns)) {
|
|
117
|
-
preSpanRef.current = pre;
|
|
118
|
-
columnsWithinViewportRef.current = visibleColumns;
|
|
119
|
-
forceRefresh({});
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
[columns, onHorizontalScroll, viewportWidth]
|
|
124
|
-
);
|
|
125
|
-
const handleVerticalScroll = useCallback(
|
|
126
|
-
(scrollTop, pctScrollTop) => {
|
|
127
|
-
contentContainerPosRef.current.scrollTop = scrollTop;
|
|
128
|
-
const { current: prevFirstRow } = firstRowRef;
|
|
129
|
-
onVerticalScroll?.(scrollTop, pctScrollTop);
|
|
130
|
-
const firstRow = getRowAtPosition(scrollTop);
|
|
131
|
-
if (firstRow !== prevFirstRow) {
|
|
132
|
-
firstRowRef.current = firstRow;
|
|
133
|
-
const lastRow = firstRow + viewportRowCount;
|
|
134
|
-
setRange({ from: firstRow, to: lastRow });
|
|
135
|
-
const { current: focusState } = cellFocusStateRef;
|
|
136
|
-
if (focusState.cellPos) {
|
|
137
|
-
const prevLastRow = prevFirstRow + viewportRowCount;
|
|
138
|
-
const [row] = focusState.cellPos;
|
|
139
|
-
const wasInViewport = row >= prevFirstRow && row < prevLastRow;
|
|
140
|
-
const isInViewport = row >= firstRow && row < lastRow;
|
|
141
|
-
if (wasInViewport && !isInViewport) {
|
|
142
|
-
focusState.placeholderEl?.focus({ preventScroll: true });
|
|
143
|
-
focusState.outsideViewport = row < firstRow ? "above" : "below";
|
|
144
|
-
} else if (isInViewport && !wasInViewport) {
|
|
145
|
-
focusState.outsideViewport = false;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
onVerticalScrollInSitu?.(0);
|
|
150
|
-
},
|
|
151
|
-
[
|
|
152
|
-
cellFocusStateRef,
|
|
153
|
-
// focusCell,
|
|
154
|
-
getRowAtPosition,
|
|
155
|
-
onVerticalScroll,
|
|
156
|
-
onVerticalScrollInSitu,
|
|
157
|
-
setRange,
|
|
158
|
-
viewportRowCount
|
|
159
|
-
]
|
|
160
|
-
);
|
|
161
|
-
const scrollTimerRef = useRef(null);
|
|
162
|
-
const checkScrollbarScrollPosition = useCallback(() => {
|
|
163
|
-
const { current: scrollPos } = scrollbarContainerPosRef;
|
|
164
|
-
const { current: contentContainer } = contentContainerRef;
|
|
165
|
-
const { current: scrollbarContainer } = scrollbarContainerRef;
|
|
166
|
-
if (scrollbarContainer && contentContainer) {
|
|
167
|
-
const [scrollLeft, pctScrollLeft, , scrollTop, pctScrollTop] = getPctScroll(scrollbarContainer);
|
|
168
|
-
if (scrollLeft !== scrollPos.scrollLeft || scrollTop !== scrollPos.scrollTop) {
|
|
169
|
-
scrollbarContainerScrolledRef.current = true;
|
|
170
|
-
scrollPos.scrollLeft = scrollLeft;
|
|
171
|
-
scrollPos.scrollTop = scrollTop;
|
|
172
|
-
const [maxScrollLeft, maxScrollTop] = getMaxScroll(scrollbarContainer);
|
|
173
|
-
const contentScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);
|
|
174
|
-
const contentScrollTop = pctScrollTop * maxScrollTop;
|
|
175
|
-
contentContainer.scrollTo({
|
|
176
|
-
left: contentScrollLeft,
|
|
177
|
-
top: contentScrollTop,
|
|
178
|
-
behavior: "auto"
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
scrollTimerRef.current = null;
|
|
182
|
-
}
|
|
183
|
-
}, []);
|
|
184
|
-
const handleScrollbarContainerScroll = useCallback(() => {
|
|
185
|
-
const { current: contentContainer } = contentContainerRef;
|
|
186
|
-
const { current: scrollbarContainer } = scrollbarContainerRef;
|
|
187
|
-
const { current: contentContainerScrolled } = contentContainerScrolledRef;
|
|
188
|
-
const { current: scrollPos } = scrollbarContainerPosRef;
|
|
189
|
-
if (contentContainerScrolled) {
|
|
190
|
-
contentContainerScrolledRef.current = false;
|
|
191
|
-
} else if (contentContainer && scrollbarContainer) {
|
|
192
|
-
scrollbarContainerScrolledRef.current = true;
|
|
193
|
-
const [scrollLeft, pctScrollLeft, , scrollTop, pctScrollTop] = getPctScroll(scrollbarContainer);
|
|
194
|
-
scrollPos.scrollLeft = scrollLeft;
|
|
195
|
-
scrollPos.scrollTop = scrollTop;
|
|
196
|
-
const [maxScrollLeft, maxScrollTop] = getMaxScroll(scrollbarContainer);
|
|
197
|
-
const contentScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);
|
|
198
|
-
const contentScrollTop = pctScrollTop * maxScrollTop;
|
|
199
|
-
contentContainer.scrollTo({
|
|
200
|
-
left: contentScrollLeft,
|
|
201
|
-
top: contentScrollTop,
|
|
202
|
-
behavior: "auto"
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
if (scrollTimerRef.current) {
|
|
206
|
-
clearTimeout(scrollTimerRef.current);
|
|
207
|
-
}
|
|
208
|
-
scrollTimerRef.current = setTimeout(checkScrollbarScrollPosition, 60);
|
|
209
|
-
onVerticalScrollInSitu?.(0);
|
|
210
|
-
}, [checkScrollbarScrollPosition, onVerticalScrollInSitu]);
|
|
211
|
-
const handleContentContainerScroll = useCallback(() => {
|
|
212
|
-
const { current: scrollbarContainerScrolled } = scrollbarContainerScrolledRef;
|
|
213
|
-
const { current: contentContainer } = contentContainerRef;
|
|
214
|
-
const { current: scrollbarContainer } = scrollbarContainerRef;
|
|
215
|
-
const { current: scrollPos } = contentContainerPosRef;
|
|
216
|
-
if (contentContainer && scrollbarContainer) {
|
|
217
|
-
const [
|
|
218
|
-
scrollLeft,
|
|
219
|
-
pctScrollLeft,
|
|
220
|
-
maxScrollLeft,
|
|
221
|
-
scrollTop,
|
|
222
|
-
pctScrollTop,
|
|
223
|
-
maxScrollTop
|
|
224
|
-
] = getPctScroll(contentContainer);
|
|
225
|
-
contentContainerScrolledRef.current = true;
|
|
226
|
-
if (scrollbarContainerScrolled) {
|
|
227
|
-
scrollbarContainerScrolledRef.current = false;
|
|
228
|
-
} else {
|
|
229
|
-
scrollbarContainer.scrollLeft = Math.round(
|
|
230
|
-
pctScrollLeft * maxScrollLeft
|
|
231
|
-
);
|
|
232
|
-
scrollbarContainer.scrollTop = pctScrollTop * maxScrollTop;
|
|
233
|
-
}
|
|
234
|
-
if (scrollPos.scrollTop !== scrollTop) {
|
|
235
|
-
handleVerticalScroll(scrollTop, pctScrollTop);
|
|
236
|
-
}
|
|
237
|
-
if (scrollPos.scrollLeft !== scrollLeft) {
|
|
238
|
-
handleHorizontalScroll(scrollLeft);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}, [handleVerticalScroll, handleHorizontalScroll]);
|
|
242
|
-
const handleAttachScrollbarContainer = useCallback(
|
|
243
|
-
(el) => {
|
|
244
|
-
scrollbarContainerRef.current = el;
|
|
245
|
-
el.addEventListener("scroll", handleScrollbarContainerScroll, {
|
|
246
|
-
passive: true
|
|
247
|
-
});
|
|
248
|
-
},
|
|
249
|
-
[handleScrollbarContainerScroll]
|
|
250
|
-
);
|
|
251
|
-
const handleDetachScrollbarContainer = useCallback(
|
|
252
|
-
(el) => {
|
|
253
|
-
scrollbarContainerRef.current = null;
|
|
254
|
-
el.removeEventListener("scroll", handleScrollbarContainerScroll);
|
|
255
|
-
},
|
|
256
|
-
[handleScrollbarContainerScroll]
|
|
257
|
-
);
|
|
258
|
-
const handleAttachContentContainer = useCallback(
|
|
259
|
-
(el) => {
|
|
260
|
-
contentContainerRef.current = el;
|
|
261
|
-
el.addEventListener("scroll", handleContentContainerScroll, {
|
|
262
|
-
passive: true
|
|
263
|
-
});
|
|
264
|
-
},
|
|
265
|
-
[handleContentContainerScroll]
|
|
266
|
-
);
|
|
267
|
-
const handleDetachContentContainer = useCallback(
|
|
268
|
-
(el) => {
|
|
269
|
-
contentContainerRef.current = null;
|
|
270
|
-
el.removeEventListener("scroll", handleContentContainerScroll);
|
|
271
|
-
},
|
|
272
|
-
[handleContentContainerScroll]
|
|
273
|
-
);
|
|
274
|
-
const contentContainerCallbackRef = useCallbackRef({
|
|
275
|
-
onAttach: handleAttachContentContainer,
|
|
276
|
-
onDetach: handleDetachContentContainer
|
|
277
|
-
});
|
|
278
|
-
const scrollbarContainerCallbackRef = useCallbackRef({
|
|
279
|
-
onAttach: handleAttachScrollbarContainer,
|
|
280
|
-
onDetach: handleDetachScrollbarContainer
|
|
281
|
-
});
|
|
282
|
-
const requestScroll = useCallback(
|
|
283
|
-
(scrollRequest) => {
|
|
284
|
-
const { current: contentContainer } = contentContainerRef;
|
|
285
|
-
const { current: scrollbarContainer } = scrollbarContainerRef;
|
|
286
|
-
if (contentContainer) {
|
|
287
|
-
const [maxScrollLeft, maxScrollTop] = getMaxScroll(contentContainer);
|
|
288
|
-
const { scrollLeft, scrollTop } = contentContainer;
|
|
289
|
-
contentContainerScrolledRef.current = false;
|
|
290
|
-
switch (scrollRequest.type) {
|
|
291
|
-
case "scroll-top":
|
|
292
|
-
{
|
|
293
|
-
if (scrollRequest.instant && scrollRequest.scrollPos === 0 && scrollbarContainer) {
|
|
294
|
-
contentContainer.scrollTop = 0;
|
|
295
|
-
scrollbarContainer.scrollTop = 0;
|
|
296
|
-
} else {
|
|
297
|
-
contentContainer.scrollTo({
|
|
298
|
-
top: scrollRequest.scrollPos,
|
|
299
|
-
left: scrollLeft,
|
|
300
|
-
behavior: "instant"
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
break;
|
|
305
|
-
case "scroll-bottom":
|
|
306
|
-
{
|
|
307
|
-
contentContainer.scrollTo({
|
|
308
|
-
top: scrollRequest.scrollPos - (viewportBodyHeight - 2 * rowHeight),
|
|
309
|
-
left: scrollLeft,
|
|
310
|
-
behavior: "instant"
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
break;
|
|
314
|
-
case "scroll-row":
|
|
315
|
-
{
|
|
316
|
-
const activeRow = getRowElementByAriaIndex(
|
|
317
|
-
contentContainer,
|
|
318
|
-
scrollRequest.rowIndex
|
|
319
|
-
);
|
|
320
|
-
if (activeRow !== null) {
|
|
321
|
-
const [direction, distance] = howFarIsRowOutsideViewport(
|
|
322
|
-
activeRow,
|
|
323
|
-
totalHeaderHeight
|
|
324
|
-
);
|
|
325
|
-
if (direction && distance) {
|
|
326
|
-
if (isVirtualScroll) {
|
|
327
|
-
const offset = direction === "down" ? 1 : -1;
|
|
328
|
-
onVerticalScrollInSitu?.(offset);
|
|
329
|
-
const firstRow = firstRowRef.current + offset;
|
|
330
|
-
firstRowRef.current = firstRow;
|
|
331
|
-
setRange({
|
|
332
|
-
from: firstRow,
|
|
333
|
-
to: firstRow + viewportRowCount
|
|
334
|
-
});
|
|
335
|
-
} else {
|
|
336
|
-
let newScrollLeft = scrollLeft;
|
|
337
|
-
let newScrollTop = scrollTop;
|
|
338
|
-
if (direction === "up" || direction === "down") {
|
|
339
|
-
newScrollTop = Math.min(
|
|
340
|
-
Math.max(0, scrollTop + distance),
|
|
341
|
-
maxScrollTop
|
|
342
|
-
);
|
|
343
|
-
} else {
|
|
344
|
-
newScrollLeft = Math.min(
|
|
345
|
-
Math.max(0, scrollLeft + distance),
|
|
346
|
-
maxScrollLeft
|
|
347
|
-
);
|
|
348
|
-
}
|
|
349
|
-
contentContainer.scrollTo({
|
|
350
|
-
top: newScrollTop,
|
|
351
|
-
left: newScrollLeft,
|
|
352
|
-
// avoid behaviour: 'smooth', doesn't work correctly
|
|
353
|
-
behavior: "instant"
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
break;
|
|
360
|
-
case "scroll-page":
|
|
361
|
-
{
|
|
362
|
-
const { direction } = scrollRequest;
|
|
363
|
-
if (isVirtualScroll) {
|
|
364
|
-
const offset = direction === "down" ? viewportRowCount : -viewportRowCount;
|
|
365
|
-
onVerticalScrollInSitu?.(offset);
|
|
366
|
-
const firstRow = firstRowRef.current + offset;
|
|
367
|
-
firstRowRef.current = firstRow;
|
|
368
|
-
setRange({ from: firstRow, to: firstRow + viewportRowCount });
|
|
369
|
-
} else {
|
|
370
|
-
const scrollBy = direction === "down" ? appliedPageSize : -appliedPageSize;
|
|
371
|
-
const newScrollTop = Math.min(
|
|
372
|
-
Math.max(0, scrollTop + scrollBy),
|
|
373
|
-
maxScrollTop
|
|
374
|
-
);
|
|
375
|
-
contentContainer.scrollTo({
|
|
376
|
-
top: newScrollTop,
|
|
377
|
-
left: scrollLeft,
|
|
378
|
-
behavior: "auto"
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
break;
|
|
383
|
-
case "scroll-end":
|
|
384
|
-
{
|
|
385
|
-
const { direction } = scrollRequest;
|
|
386
|
-
const scrollTo = direction === "end" ? maxScrollTop : 0;
|
|
387
|
-
contentContainer.scrollTo({
|
|
388
|
-
top: scrollTo,
|
|
389
|
-
left: contentContainer.scrollLeft,
|
|
390
|
-
behavior: "auto"
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
break;
|
|
394
|
-
default:
|
|
395
|
-
console.warn(`unexpected scroll request ${scrollRequest["type"]}`);
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
},
|
|
399
|
-
[
|
|
400
|
-
appliedPageSize,
|
|
401
|
-
isVirtualScroll,
|
|
402
|
-
onVerticalScrollInSitu,
|
|
403
|
-
rowHeight,
|
|
404
|
-
setRange,
|
|
405
|
-
totalHeaderHeight,
|
|
406
|
-
viewportBodyHeight,
|
|
407
|
-
viewportRowCount
|
|
408
|
-
]
|
|
409
|
-
);
|
|
410
|
-
const scrollHandles = useMemo(
|
|
411
|
-
// TODO not complete yet
|
|
412
|
-
() => ({
|
|
413
|
-
scrollToIndex: (rowIndex) => {
|
|
414
|
-
if (scrollbarContainerRef.current) {
|
|
415
|
-
const scrollPos = (rowIndex - 30) * 20;
|
|
416
|
-
scrollbarContainerRef.current.scrollTop = scrollPos;
|
|
417
|
-
}
|
|
418
|
-
},
|
|
419
|
-
scrollToKey: (rowKey) => {
|
|
420
|
-
console.log(`scrollToKey ${rowKey}`);
|
|
421
|
-
}
|
|
422
|
-
}),
|
|
423
|
-
[]
|
|
424
|
-
);
|
|
425
|
-
useImperativeHandle(scrollingApiRef, () => {
|
|
426
|
-
if (scrollbarContainerRef.current) {
|
|
427
|
-
return scrollHandles;
|
|
428
|
-
} else {
|
|
429
|
-
return noScrolling;
|
|
430
|
-
}
|
|
431
|
-
}, [scrollHandles]);
|
|
432
|
-
useEffect(() => {
|
|
433
|
-
if (rowHeight !== rowHeightRef.current) {
|
|
434
|
-
rowHeightRef.current = rowHeight;
|
|
435
|
-
if (contentContainerPosRef.current.scrollTop > 0) {
|
|
436
|
-
if (contentContainerRef.current) {
|
|
437
|
-
contentContainerRef.current.scrollTop = 0;
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
} else if (usesMeasuredHeaderHeight) {
|
|
441
|
-
const { current: from } = firstRowRef;
|
|
442
|
-
const rowRange = { from, to: from + viewportRowCount };
|
|
443
|
-
setRange(rowRange);
|
|
444
|
-
}
|
|
445
|
-
}, [rowHeight, setRange, usesMeasuredHeaderHeight, viewportRowCount]);
|
|
446
|
-
return {
|
|
447
|
-
columnsWithinViewport: columnsWithinViewportRef.current,
|
|
448
|
-
/** Ref to be assigned to ScrollbarContainer */
|
|
449
|
-
scrollbarContainerRef: scrollbarContainerCallbackRef,
|
|
450
|
-
/** Ref to be assigned to ContentContainer */
|
|
451
|
-
contentContainerRef: contentContainerCallbackRef,
|
|
452
|
-
/** Scroll the table */
|
|
453
|
-
requestScroll,
|
|
454
|
-
scrollTop: contentContainerPosRef.current.scrollTop,
|
|
455
|
-
/** number of leading columns not rendered because of virtualization */
|
|
456
|
-
virtualColSpan: preSpanRef.current
|
|
457
|
-
};
|
|
458
|
-
};
|
|
459
|
-
|
|
460
|
-
export { noScrolling, useTableScroll };
|
|
461
|
-
//# sourceMappingURL=useTableScroll.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useTableScroll.js","sources":["../../../packages/vuu-table/src/useTableScroll.ts"],"sourcesContent":["import {\n getColumnsInViewport,\n itemsChanged,\n RowAtPositionFunc,\n} from \"@vuu-ui/vuu-utils\";\nimport type { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ForwardedRef,\n RefObject,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ViewportMeasurements } from \"./useTableViewport\";\nimport {\n getRowElementByAriaIndex,\n howFarIsRowOutsideViewport,\n} from \"./table-dom-utils\";\nimport type { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { ICellFocusState } from \"./CellFocusState\";\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 pixel offset.\n */\nexport interface ScrollRequestPosition {\n instant?: boolean;\n scrollPos: number;\n type: \"scroll-top\" | \"scroll-bottom\";\n}\n\n/**\n * scroll into view the row at given row 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 | ScrollRequestPosition;\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 getPctScroll = (container: HTMLElement) => {\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 const pctScrollTop = scrollTop / (scrollHeight - clientHeight);\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 cellFocusStateRef: RefObject<ICellFocusState>;\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 showPaginationControls?: boolean;\n viewportMeasurements: ViewportMeasurements;\n}\n\nexport const useTableScroll = ({\n cellFocusStateRef,\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 usesMeasuredHeaderHeight,\n viewportBodyHeight,\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 const { current: prevFirstRow } = firstRowRef;\n\n onVerticalScroll?.(scrollTop, pctScrollTop);\n const firstRow = getRowAtPosition(scrollTop);\n if (firstRow !== prevFirstRow) {\n firstRowRef.current = firstRow;\n const lastRow = firstRow + viewportRowCount;\n setRange({ from: firstRow, to: lastRow });\n\n // If we've scrolled the focused cell out of view, we need to remove\n // focus from it. The row element will be recycled and used as the\n // render target for a different DataRow, we do not want the focus\n // state of the cell to be preserved.\n // Conversely, if we scroll the focussed cell back into the viewport,\n // we must re-apply focus to it. We use the placeholder cell for this.\n const { current: focusState } = cellFocusStateRef;\n if (focusState.cellPos) {\n const prevLastRow = prevFirstRow + viewportRowCount;\n const [row] = focusState.cellPos;\n const wasInViewport = row >= prevFirstRow && row < prevLastRow;\n const isInViewport = row >= firstRow && row < lastRow;\n\n if (wasInViewport && !isInViewport) {\n focusState.placeholderEl?.focus({ preventScroll: true });\n focusState.outsideViewport = row < firstRow ? \"above\" : \"below\";\n } else if (isInViewport && !wasInViewport) {\n focusState.outsideViewport = false;\n // focusCell?.(focusState.cellPos);\n }\n }\n }\n onVerticalScrollInSitu?.(0);\n },\n [\n cellFocusStateRef,\n // focusCell,\n getRowAtPosition,\n onVerticalScroll,\n onVerticalScrollInSitu,\n setRange,\n viewportRowCount,\n ],\n );\n\n // Because of the amount of work done when we rerender a virtualised section\n // we may drop scroll events. Make sure we get the final resting position right\n // by remeasuring after a short delay.\n const scrollTimerRef = useRef<ReturnType<typeof setTimeout>>(null);\n const checkScrollbarScrollPosition = useCallback(() => {\n const { current: scrollPos } = scrollbarContainerPosRef;\n const { current: contentContainer } = contentContainerRef;\n\n const { current: scrollbarContainer } = scrollbarContainerRef;\n\n if (scrollbarContainer && contentContainer) {\n const [scrollLeft, pctScrollLeft, , scrollTop, pctScrollTop] =\n getPctScroll(scrollbarContainer);\n\n if (\n scrollLeft !== scrollPos.scrollLeft ||\n scrollTop !== scrollPos.scrollTop\n ) {\n scrollbarContainerScrolledRef.current = true;\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\n scrollTimerRef.current = null;\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);\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\n if (scrollTimerRef.current) {\n clearTimeout(scrollTimerRef.current);\n }\n scrollTimerRef.current = setTimeout(checkScrollbarScrollPosition, 60);\n\n onVerticalScrollInSitu?.(0);\n }, [checkScrollbarScrollPosition, 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 const { current: scrollbarContainer } = scrollbarContainerRef;\n\n if (contentContainer) {\n const [maxScrollLeft, maxScrollTop] = getMaxScroll(contentContainer);\n const { scrollLeft, scrollTop } = contentContainer;\n contentContainerScrolledRef.current = false;\n switch (scrollRequest.type) {\n case \"scroll-top\":\n {\n // special case for setting scroll position immediately back to top\n if (\n scrollRequest.instant &&\n scrollRequest.scrollPos === 0 &&\n scrollbarContainer\n ) {\n contentContainer.scrollTop = 0;\n scrollbarContainer.scrollTop = 0;\n } else {\n contentContainer.scrollTo({\n top: scrollRequest.scrollPos,\n left: scrollLeft,\n behavior: \"instant\",\n });\n }\n }\n break;\n case \"scroll-bottom\":\n {\n contentContainer.scrollTo({\n top:\n scrollRequest.scrollPos -\n (viewportBodyHeight - 2 * rowHeight),\n left: scrollLeft,\n behavior: \"instant\",\n });\n }\n break;\n case \"scroll-row\":\n {\n const activeRow = getRowElementByAriaIndex(\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 // avoid behaviour: 'smooth', doesn't work correctly\n behavior: \"instant\",\n });\n }\n }\n }\n }\n break;\n case \"scroll-page\":\n {\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 }\n break;\n case \"scroll-end\":\n {\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 break;\n default:\n console.warn(`unexpected scroll request ${scrollRequest[\"type\"]}`);\n }\n }\n },\n [\n appliedPageSize,\n isVirtualScroll,\n onVerticalScrollInSitu,\n rowHeight,\n setRange,\n totalHeaderHeight,\n viewportBodyHeight,\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 if (usesMeasuredHeaderHeight) {\n const { current: from } = firstRowRef;\n const rowRange = { from, to: from + viewportRowCount };\n setRange(rowRange);\n }\n }, [rowHeight, setRange, usesMeasuredHeaderHeight, 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 scrollTop: contentContainerPosRef.current.scrollTop,\n /** number of leading columns not rendered because of virtualization */\n virtualColSpan: preSpanRef.current,\n };\n};\n"],"names":[],"mappings":";;;;AAsEA,MAAM,2BAA8B,GAAA,GAAA;AAGpC,MAAM,wBAA2B,GAAA,GAAA;AAOjC,MAAM,YAAA,GAAe,CAAC,SAA2B,KAAA;AAC/C,EAAA,MAAM,EAAE,YAAA,EAAc,WAAa,EAAA,YAAA,EAAc,aAAgB,GAAA,SAAA;AACjE,EAAA,OAAO,CAAC,WAAA,GAAc,WAAa,EAAA,YAAA,GAAe,YAAY,CAAA;AAChE,CAAA;AAEA,MAAM,YAAA,GAAe,CAAC,SAA2B,KAAA;AAC/C,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACE,GAAA,SAAA;AAEJ,EAAA,MAAM,gBAAgB,WAAc,GAAA,WAAA;AACpC,EAAM,MAAA,aAAA,GAAgB,cAAc,WAAc,GAAA,WAAA,CAAA;AAClD,EAAA,MAAM,eAAe,YAAe,GAAA,YAAA;AACpC,EAAM,MAAA,YAAA,GAAe,aAAa,YAAe,GAAA,YAAA,CAAA;AAEjD,EAAO,OAAA;AAAA,IACL,UAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AAEO,MAAM,WAA4B,GAAA;AAAA,EACvC,eAAe,MAAM,KAAA,CAAA;AAAA,EACrB,aAAa,MAAM,KAAA;AACrB;AAQA,MAAM,iBAAiB,CAAkB;AAAA,EACvC,QAAA;AAAA,EACA;AACF,CAA+B,KAAA;AAC7B,EAAM,MAAA,GAAA,GAAM,OAAiB,IAAI,CAAA;AACjC,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,EAAiB,KAAA;AAChB,MAAA,IAAI,EAAI,EAAA;AACN,QAAA,GAAA,CAAI,OAAU,GAAA,EAAA;AACd,QAAA,QAAA,GAAW,EAAE,CAAA;AAAA,OACf,MAAA,IAAW,IAAI,OAAS,EAAA;AACtB,QAAM,MAAA,EAAE,OAAS,EAAA,WAAA,EAAgB,GAAA,GAAA;AACjC,QAAA,GAAA,CAAI,OAAU,GAAA,EAAA;AACd,QAAA,QAAA,GAAW,WAAW,CAAA;AAAA;AACxB,KACF;AAAA,IACA,CAAC,UAAU,QAAQ;AAAA,GACrB;AACA,EAAO,OAAA,WAAA;AACT,CAAA;AA0BO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,iBAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,sBAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAA4B,KAAA;AAC1B,EAAM,MAAA,WAAA,GAAc,OAAe,CAAC,CAAA;AACpC,EAAM,MAAA,YAAA,GAAe,OAAO,SAAS,CAAA;AACrC,EAAM,MAAA,2BAAA,GAA8B,OAAO,KAAK,CAAA;AAChD,EAAA,MAAM,yBAAyB,MAAkB,CAAA;AAAA,IAC/C,SAAW,EAAA,CAAA;AAAA,IACX,UAAY,EAAA;AAAA,GACb,CAAA;AACD,EAAM,MAAA,6BAAA,GAAgC,OAAO,KAAK,CAAA;AAClD,EAAA,MAAM,2BAA2B,MAAkB,CAAA;AAAA,IACjD,SAAW,EAAA,CAAA;AAAA,IACX,UAAY,EAAA;AAAA,GACb,CAAA;AACD,EAAM,MAAA,qBAAA,GAAwB,OAA8B,IAAI,CAAA;AAChE,EAAM,MAAA,mBAAA,GAAsB,OAA8B,IAAI,CAAA;AAC9D,EAAM,MAAA,8BAAA,GAAiC,OAAO,CAAC,CAAA;AAE/C,EAAM,MAAA;AAAA,IACJ,eAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAU,EAAA,gBAAA;AAAA,IACV,iBAAA;AAAA,IACA,wBAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACE,GAAA,oBAAA;AAEJ,EAAM,MAAA,wBAAA,GAA2B,MAAkC,CAAA,EAAE,CAAA;AACrE,EAAA,MAAM,GAAG,YAAY,CAAI,GAAA,QAAA,CAAS,EAAE,CAAA;AAEpC,EAAM,MAAA,UAAA,GAAa,OAAO,CAAC,CAAA;AAE3B,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAM,MAAA,CAAC,cAAgB,EAAA,MAAM,CAAI,GAAA,oBAAA;AAAA,MAC/B,OAAA;AAAA,MACA,uBAAuB,OAAQ,CAAA,UAAA;AAAA,MAC/B,sBAAA,CAAuB,OAAQ,CAAA,UAAA,GAC7B,aACA,GAAA;AAAA,KACJ;AACA,IAAA,UAAA,CAAW,OAAU,GAAA,MAAA;AACrB,IAAA,wBAAA,CAAyB,OAAU,GAAA,cAAA;AAAA,GAClC,EAAA,CAAC,aAAe,EAAA,OAAO,CAAC,CAAA;AAE3B,EAAA,MAAM,sBAAyB,GAAA,WAAA;AAAA,IAC7B,CAAC,UAAuB,KAAA;AACtB,MAAA,sBAAA,CAAuB,QAAQ,UAAa,GAAA,UAAA;AAC5C,MAAA,kBAAA,GAAqB,UAAU,CAAA;AAE/B,MAAA,IACE,KAAK,GAAI,CAAA,UAAA,GAAa,8BAA+B,CAAA,OAAO,IAC5D,2BACA,EAAA;AACA,QAAA,8BAAA,CAA+B,OAAU,GAAA,UAAA;AAEzC,QAAM,MAAA,CAAC,cAAgB,EAAA,GAAG,CAAI,GAAA,oBAAA;AAAA,UAC5B,OAAA;AAAA,UACA,UAAA;AAAA,UACA,aAAa,aAAgB,GAAA;AAAA,SAC/B;AAEA,QAAA,IAAI,YAAa,CAAA,wBAAA,CAAyB,OAAS,EAAA,cAAc,CAAG,EAAA;AAClE,UAAA,UAAA,CAAW,OAAU,GAAA,GAAA;AACrB,UAAA,wBAAA,CAAyB,OAAU,GAAA,cAAA;AACnC,UAAA,YAAA,CAAa,EAAE,CAAA;AAAA;AACjB;AACF,KACF;AAAA,IACA,CAAC,OAAS,EAAA,kBAAA,EAAoB,aAAa;AAAA,GAC7C;AACA,EAAA,MAAM,oBAAuB,GAAA,WAAA;AAAA,IAC3B,CAAC,WAAmB,YAAyB,KAAA;AAC3C,MAAA,sBAAA,CAAuB,QAAQ,SAAY,GAAA,SAAA;AAC3C,MAAM,MAAA,EAAE,OAAS,EAAA,YAAA,EAAiB,GAAA,WAAA;AAElC,MAAA,gBAAA,GAAmB,WAAW,YAAY,CAAA;AAC1C,MAAM,MAAA,QAAA,GAAW,iBAAiB,SAAS,CAAA;AAC3C,MAAA,IAAI,aAAa,YAAc,EAAA;AAC7B,QAAA,WAAA,CAAY,OAAU,GAAA,QAAA;AACtB,QAAA,MAAM,UAAU,QAAW,GAAA,gBAAA;AAC3B,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,QAAU,EAAA,EAAA,EAAI,SAAS,CAAA;AAQxC,QAAM,MAAA,EAAE,OAAS,EAAA,UAAA,EAAe,GAAA,iBAAA;AAChC,QAAA,IAAI,WAAW,OAAS,EAAA;AACtB,UAAA,MAAM,cAAc,YAAe,GAAA,gBAAA;AACnC,UAAM,MAAA,CAAC,GAAG,CAAA,GAAI,UAAW,CAAA,OAAA;AACzB,UAAM,MAAA,aAAA,GAAgB,GAAO,IAAA,YAAA,IAAgB,GAAM,GAAA,WAAA;AACnD,UAAM,MAAA,YAAA,GAAe,GAAO,IAAA,QAAA,IAAY,GAAM,GAAA,OAAA;AAE9C,UAAI,IAAA,aAAA,IAAiB,CAAC,YAAc,EAAA;AAClC,YAAA,UAAA,CAAW,aAAe,EAAA,KAAA,CAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AACvD,YAAW,UAAA,CAAA,eAAA,GAAkB,GAAM,GAAA,QAAA,GAAW,OAAU,GAAA,OAAA;AAAA,WAC1D,MAAA,IAAW,YAAgB,IAAA,CAAC,aAAe,EAAA;AACzC,YAAA,UAAA,CAAW,eAAkB,GAAA,KAAA;AAAA;AAE/B;AACF;AAEF,MAAA,sBAAA,GAAyB,CAAC,CAAA;AAAA,KAC5B;AAAA,IACA;AAAA,MACE,iBAAA;AAAA;AAAA,MAEA,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,sBAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA;AACF,GACF;AAKA,EAAM,MAAA,cAAA,GAAiB,OAAsC,IAAI,CAAA;AACjE,EAAM,MAAA,4BAAA,GAA+B,YAAY,MAAM;AACrD,IAAM,MAAA,EAAE,OAAS,EAAA,SAAA,EAAc,GAAA,wBAAA;AAC/B,IAAM,MAAA,EAAE,OAAS,EAAA,gBAAA,EAAqB,GAAA,mBAAA;AAEtC,IAAM,MAAA,EAAE,OAAS,EAAA,kBAAA,EAAuB,GAAA,qBAAA;AAExC,IAAA,IAAI,sBAAsB,gBAAkB,EAAA;AAC1C,MAAM,MAAA,CAAC,YAAY,aAAe,IAAE,WAAW,YAAY,CAAA,GACzD,aAAa,kBAAkB,CAAA;AAEjC,MAAA,IACE,UAAe,KAAA,SAAA,CAAU,UACzB,IAAA,SAAA,KAAc,UAAU,SACxB,EAAA;AACA,QAAA,6BAAA,CAA8B,OAAU,GAAA,IAAA;AAExC,QAAA,SAAA,CAAU,UAAa,GAAA,UAAA;AACvB,QAAA,SAAA,CAAU,SAAY,GAAA,SAAA;AAEtB,QAAA,MAAM,CAAC,aAAA,EAAe,YAAY,CAAA,GAAI,aAAa,kBAAkB,CAAA;AACrE,QAAA,MAAM,iBAAoB,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,GAAgB,aAAa,CAAA;AAClE,QAAA,MAAM,mBAAmB,YAAe,GAAA,YAAA;AAExC,QAAA,gBAAA,CAAiB,QAAS,CAAA;AAAA,UACxB,IAAM,EAAA,iBAAA;AAAA,UACN,GAAK,EAAA,gBAAA;AAAA,UACL,QAAU,EAAA;AAAA,SACX,CAAA;AAAA;AAGH,MAAA,cAAA,CAAe,OAAU,GAAA,IAAA;AAAA;AAC3B,GACF,EAAG,EAAE,CAAA;AAEL,EAAM,MAAA,8BAAA,GAAiC,YAAY,MAAM;AACvD,IAAM,MAAA,EAAE,OAAS,EAAA,gBAAA,EAAqB,GAAA,mBAAA;AACtC,IAAM,MAAA,EAAE,OAAS,EAAA,kBAAA,EAAuB,GAAA,qBAAA;AACxC,IAAM,MAAA,EAAE,OAAS,EAAA,wBAAA,EAA6B,GAAA,2BAAA;AAC9C,IAAM,MAAA,EAAE,OAAS,EAAA,SAAA,EAAc,GAAA,wBAAA;AAE/B,IAAA,IAAI,wBAA0B,EAAA;AAC5B,MAAA,2BAAA,CAA4B,OAAU,GAAA,KAAA;AAAA,KACxC,MAAA,IAAW,oBAAoB,kBAAoB,EAAA;AACjD,MAAA,6BAAA,CAA8B,OAAU,GAAA,IAAA;AACxC,MAAM,MAAA,CAAC,YAAY,aAAe,IAAE,WAAW,YAAY,CAAA,GACzD,aAAa,kBAAkB,CAAA;AAEjC,MAAA,SAAA,CAAU,UAAa,GAAA,UAAA;AACvB,MAAA,SAAA,CAAU,SAAY,GAAA,SAAA;AAEtB,MAAA,MAAM,CAAC,aAAA,EAAe,YAAY,CAAA,GAAI,aAAa,kBAAkB,CAAA;AACrE,MAAA,MAAM,iBAAoB,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,GAAgB,aAAa,CAAA;AAClE,MAAA,MAAM,mBAAmB,YAAe,GAAA,YAAA;AAExC,MAAA,gBAAA,CAAiB,QAAS,CAAA;AAAA,QACxB,IAAM,EAAA,iBAAA;AAAA,QACN,GAAK,EAAA,gBAAA;AAAA,QACL,QAAU,EAAA;AAAA,OACX,CAAA;AAAA;AAGH,IAAA,IAAI,eAAe,OAAS,EAAA;AAC1B,MAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AAAA;AAErC,IAAe,cAAA,CAAA,OAAA,GAAU,UAAW,CAAA,4BAAA,EAA8B,EAAE,CAAA;AAEpE,IAAA,sBAAA,GAAyB,CAAC,CAAA;AAAA,GACzB,EAAA,CAAC,4BAA8B,EAAA,sBAAsB,CAAC,CAAA;AAEzD,EAAM,MAAA,4BAAA,GAA+B,YAAY,MAAM;AACrD,IAAM,MAAA,EAAE,OAAS,EAAA,0BAAA,EACf,GAAA,6BAAA;AACF,IAAM,MAAA,EAAE,OAAS,EAAA,gBAAA,EAAqB,GAAA,mBAAA;AACtC,IAAM,MAAA,EAAE,OAAS,EAAA,kBAAA,EAAuB,GAAA,qBAAA;AACxC,IAAM,MAAA,EAAE,OAAS,EAAA,SAAA,EAAc,GAAA,sBAAA;AAE/B,IAAA,IAAI,oBAAoB,kBAAoB,EAAA;AAC1C,MAAM,MAAA;AAAA,QACJ,UAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF,GAAI,aAAa,gBAAgB,CAAA;AAEjC,MAAA,2BAAA,CAA4B,OAAU,GAAA,IAAA;AAEtC,MAAA,IAAI,0BAA4B,EAAA;AAC9B,QAAA,6BAAA,CAA8B,OAAU,GAAA,KAAA;AAAA,OACnC,MAAA;AACL,QAAA,kBAAA,CAAmB,aAAa,IAAK,CAAA,KAAA;AAAA,UACnC,aAAgB,GAAA;AAAA,SAClB;AACA,QAAA,kBAAA,CAAmB,YAAY,YAAe,GAAA,YAAA;AAAA;AAGhD,MAAI,IAAA,SAAA,CAAU,cAAc,SAAW,EAAA;AACrC,QAAA,oBAAA,CAAqB,WAAW,YAAY,CAAA;AAAA;AAE9C,MAAI,IAAA,SAAA,CAAU,eAAe,UAAY,EAAA;AACvC,QAAA,sBAAA,CAAuB,UAAU,CAAA;AAAA;AACnC;AACF,GACC,EAAA,CAAC,oBAAsB,EAAA,sBAAsB,CAAC,CAAA;AAEjD,EAAA,MAAM,8BAAiC,GAAA,WAAA;AAAA,IACrC,CAAC,EAAuB,KAAA;AACtB,MAAA,qBAAA,CAAsB,OAAU,GAAA,EAAA;AAChC,MAAG,EAAA,CAAA,gBAAA,CAAiB,UAAU,8BAAgC,EAAA;AAAA,QAC5D,OAAS,EAAA;AAAA,OACV,CAAA;AAAA,KACH;AAAA,IACA,CAAC,8BAA8B;AAAA,GACjC;AAEA,EAAA,MAAM,8BAAiC,GAAA,WAAA;AAAA,IACrC,CAAC,EAAuB,KAAA;AACtB,MAAA,qBAAA,CAAsB,OAAU,GAAA,IAAA;AAChC,MAAG,EAAA,CAAA,mBAAA,CAAoB,UAAU,8BAA8B,CAAA;AAAA,KACjE;AAAA,IACA,CAAC,8BAA8B;AAAA,GACjC;AAEA,EAAA,MAAM,4BAA+B,GAAA,WAAA;AAAA,IACnC,CAAC,EAAuB,KAAA;AACtB,MAAA,mBAAA,CAAoB,OAAU,GAAA,EAAA;AAC9B,MAAG,EAAA,CAAA,gBAAA,CAAiB,UAAU,4BAA8B,EAAA;AAAA,QAC1D,OAAS,EAAA;AAAA,OACV,CAAA;AAAA,KACH;AAAA,IACA,CAAC,4BAA4B;AAAA,GAC/B;AAEA,EAAA,MAAM,4BAA+B,GAAA,WAAA;AAAA,IACnC,CAAC,EAAuB,KAAA;AACtB,MAAA,mBAAA,CAAoB,OAAU,GAAA,IAAA;AAC9B,MAAG,EAAA,CAAA,mBAAA,CAAoB,UAAU,4BAA4B,CAAA;AAAA,KAC/D;AAAA,IACA,CAAC,4BAA4B;AAAA,GAC/B;AAEA,EAAA,MAAM,8BAA8B,cAAe,CAAA;AAAA,IACjD,QAAU,EAAA,4BAAA;AAAA,IACV,QAAU,EAAA;AAAA,GACX,CAAA;AAED,EAAA,MAAM,gCAAgC,cAAe,CAAA;AAAA,IACnD,QAAU,EAAA,8BAAA;AAAA,IACV,QAAU,EAAA;AAAA,GACX,CAAA;AAED,EAAA,MAAM,aAAsC,GAAA,WAAA;AAAA,IAC1C,CAAC,aAAkB,KAAA;AACjB,MAAM,MAAA,EAAE,OAAS,EAAA,gBAAA,EAAqB,GAAA,mBAAA;AACtC,MAAM,MAAA,EAAE,OAAS,EAAA,kBAAA,EAAuB,GAAA,qBAAA;AAExC,MAAA,IAAI,gBAAkB,EAAA;AACpB,QAAA,MAAM,CAAC,aAAA,EAAe,YAAY,CAAA,GAAI,aAAa,gBAAgB,CAAA;AACnE,QAAM,MAAA,EAAE,UAAY,EAAA,SAAA,EAAc,GAAA,gBAAA;AAClC,QAAA,2BAAA,CAA4B,OAAU,GAAA,KAAA;AACtC,QAAA,QAAQ,cAAc,IAAM;AAAA,UAC1B,KAAK,YAAA;AACH,YAAA;AAEE,cAAA,IACE,aAAc,CAAA,OAAA,IACd,aAAc,CAAA,SAAA,KAAc,KAC5B,kBACA,EAAA;AACA,gBAAA,gBAAA,CAAiB,SAAY,GAAA,CAAA;AAC7B,gBAAA,kBAAA,CAAmB,SAAY,GAAA,CAAA;AAAA,eAC1B,MAAA;AACL,gBAAA,gBAAA,CAAiB,QAAS,CAAA;AAAA,kBACxB,KAAK,aAAc,CAAA,SAAA;AAAA,kBACnB,IAAM,EAAA,UAAA;AAAA,kBACN,QAAU,EAAA;AAAA,iBACX,CAAA;AAAA;AACH;AAEF,YAAA;AAAA,UACF,KAAK,eAAA;AACH,YAAA;AACE,cAAA,gBAAA,CAAiB,QAAS,CAAA;AAAA,gBACxB,GACE,EAAA,aAAA,CAAc,SACb,IAAA,kBAAA,GAAqB,CAAI,GAAA,SAAA,CAAA;AAAA,gBAC5B,IAAM,EAAA,UAAA;AAAA,gBACN,QAAU,EAAA;AAAA,eACX,CAAA;AAAA;AAEH,YAAA;AAAA,UACF,KAAK,YAAA;AACH,YAAA;AACE,cAAA,MAAM,SAAY,GAAA,wBAAA;AAAA,gBAChB,gBAAA;AAAA,gBACA,aAAc,CAAA;AAAA,eAChB;AAEA,cAAA,IAAI,cAAc,IAAM,EAAA;AACtB,gBAAM,MAAA,CAAC,SAAW,EAAA,QAAQ,CAAI,GAAA,0BAAA;AAAA,kBAC5B,SAAA;AAAA,kBACA;AAAA,iBACF;AACA,gBAAA,IAAI,aAAa,QAAU,EAAA;AACzB,kBAAA,IAAI,eAAiB,EAAA;AACnB,oBAAM,MAAA,MAAA,GAAS,SAAc,KAAA,MAAA,GAAS,CAAI,GAAA,CAAA,CAAA;AAC1C,oBAAA,sBAAA,GAAyB,MAAM,CAAA;AAC/B,oBAAM,MAAA,QAAA,GAAW,YAAY,OAAU,GAAA,MAAA;AACvC,oBAAA,WAAA,CAAY,OAAU,GAAA,QAAA;AACtB,oBAAS,QAAA,CAAA;AAAA,sBACP,IAAM,EAAA,QAAA;AAAA,sBACN,IAAI,QAAW,GAAA;AAAA,qBAChB,CAAA;AAAA,mBACI,MAAA;AACL,oBAAA,IAAI,aAAgB,GAAA,UAAA;AACpB,oBAAA,IAAI,YAAe,GAAA,SAAA;AACnB,oBAAI,IAAA,SAAA,KAAc,IAAQ,IAAA,SAAA,KAAc,MAAQ,EAAA;AAC9C,sBAAA,YAAA,GAAe,IAAK,CAAA,GAAA;AAAA,wBAClB,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,SAAA,GAAY,QAAQ,CAAA;AAAA,wBAChC;AAAA,uBACF;AAAA,qBACK,MAAA;AACL,sBAAA,aAAA,GAAgB,IAAK,CAAA,GAAA;AAAA,wBACnB,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,UAAA,GAAa,QAAQ,CAAA;AAAA,wBACjC;AAAA,uBACF;AAAA;AAEF,oBAAA,gBAAA,CAAiB,QAAS,CAAA;AAAA,sBACxB,GAAK,EAAA,YAAA;AAAA,sBACL,IAAM,EAAA,aAAA;AAAA;AAAA,sBAEN,QAAU,EAAA;AAAA,qBACX,CAAA;AAAA;AACH;AACF;AACF;AAEF,YAAA;AAAA,UACF,KAAK,aAAA;AACH,YAAA;AACE,cAAM,MAAA,EAAE,WAAc,GAAA,aAAA;AACtB,cAAA,IAAI,eAAiB,EAAA;AACnB,gBAAA,MAAM,MACJ,GAAA,SAAA,KAAc,MAAS,GAAA,gBAAA,GAAmB,CAAC,gBAAA;AAC7C,gBAAA,sBAAA,GAAyB,MAAM,CAAA;AAC/B,gBAAM,MAAA,QAAA,GAAW,YAAY,OAAU,GAAA,MAAA;AACvC,gBAAA,WAAA,CAAY,OAAU,GAAA,QAAA;AACtB,gBAAA,QAAA,CAAS,EAAE,IAAM,EAAA,QAAA,EAAU,EAAI,EAAA,QAAA,GAAW,kBAAkB,CAAA;AAAA,eACvD,MAAA;AACL,gBAAA,MAAM,QACJ,GAAA,SAAA,KAAc,MAAS,GAAA,eAAA,GAAkB,CAAC,eAAA;AAC5C,gBAAA,MAAM,eAAe,IAAK,CAAA,GAAA;AAAA,kBACxB,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,SAAA,GAAY,QAAQ,CAAA;AAAA,kBAChC;AAAA,iBACF;AACA,gBAAA,gBAAA,CAAiB,QAAS,CAAA;AAAA,kBACxB,GAAK,EAAA,YAAA;AAAA,kBACL,IAAM,EAAA,UAAA;AAAA,kBACN,QAAU,EAAA;AAAA,iBACX,CAAA;AAAA;AACH;AAEF,YAAA;AAAA,UACF,KAAK,YAAA;AACH,YAAA;AACE,cAAM,MAAA,EAAE,WAAc,GAAA,aAAA;AACtB,cAAM,MAAA,QAAA,GAAW,SAAc,KAAA,KAAA,GAAQ,YAAe,GAAA,CAAA;AACtD,cAAA,gBAAA,CAAiB,QAAS,CAAA;AAAA,gBACxB,GAAK,EAAA,QAAA;AAAA,gBACL,MAAM,gBAAiB,CAAA,UAAA;AAAA,gBACvB,QAAU,EAAA;AAAA,eACX,CAAA;AAAA;AAEH,YAAA;AAAA,UACF;AACE,YAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,0BAAA,EAA6B,aAAc,CAAA,MAAM,CAAC,CAAE,CAAA,CAAA;AAAA;AACrE;AACF,KACF;AAAA,IACA;AAAA,MACE,eAAA;AAAA,MACA,eAAA;AAAA,MACA,sBAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,iBAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,aAA8B,GAAA,OAAA;AAAA;AAAA,IAElC,OAAO;AAAA,MACL,aAAA,EAAe,CAAC,QAAqB,KAAA;AACnC,QAAA,IAAI,sBAAsB,OAAS,EAAA;AAEjC,UAAM,MAAA,SAAA,GAAA,CAAa,WAAW,EAAM,IAAA,EAAA;AACpC,UAAA,qBAAA,CAAsB,QAAQ,SAAY,GAAA,SAAA;AAAA;AAC5C,OACF;AAAA,MACA,WAAA,EAAa,CAAC,MAAmB,KAAA;AAC/B,QAAQ,OAAA,CAAA,GAAA,CAAI,CAAe,YAAA,EAAA,MAAM,CAAE,CAAA,CAAA;AAAA;AACrC,KACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,mBAAA,CAAoB,iBAAiB,MAAM;AACzC,IAAA,IAAI,sBAAsB,OAAS,EAAA;AACjC,MAAO,OAAA,aAAA;AAAA,KACF,MAAA;AACL,MAAO,OAAA,WAAA;AAAA;AACT,GACF,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,SAAA,KAAc,aAAa,OAAS,EAAA;AACtC,MAAA,YAAA,CAAa,OAAU,GAAA,SAAA;AACvB,MAAI,IAAA,sBAAA,CAAuB,OAAQ,CAAA,SAAA,GAAY,CAAG,EAAA;AAChD,QAAA,IAAI,oBAAoB,OAAS,EAAA;AAC/B,UAAA,mBAAA,CAAoB,QAAQ,SAAY,GAAA,CAAA;AAAA;AAC1C;AACF,eACS,wBAA0B,EAAA;AACnC,MAAM,MAAA,EAAE,OAAS,EAAA,IAAA,EAAS,GAAA,WAAA;AAC1B,MAAA,MAAM,QAAW,GAAA,EAAE,IAAM,EAAA,EAAA,EAAI,OAAO,gBAAiB,EAAA;AACrD,MAAA,QAAA,CAAS,QAAQ,CAAA;AAAA;AACnB,KACC,CAAC,SAAA,EAAW,QAAU,EAAA,wBAAA,EAA0B,gBAAgB,CAAC,CAAA;AAEpE,EAAO,OAAA;AAAA,IACL,uBAAuB,wBAAyB,CAAA,OAAA;AAAA;AAAA,IAEhD,qBAAuB,EAAA,6BAAA;AAAA;AAAA,IAEvB,mBAAqB,EAAA,2BAAA;AAAA;AAAA,IAErB,aAAA;AAAA,IACA,SAAA,EAAW,uBAAuB,OAAQ,CAAA,SAAA;AAAA;AAAA,IAE1C,gBAAgB,UAAW,CAAA;AAAA,GAC7B;AACF;;;;"}
|