@vuu-ui/vuu-table 0.8.93 → 0.8.95

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 (89) hide show
  1. package/cjs/Row.css.js +1 -1
  2. package/cjs/Row.js +1 -1
  3. package/cjs/Row.js.map +1 -1
  4. package/cjs/Table.css.js +1 -1
  5. package/cjs/Table.js +107 -30
  6. package/cjs/Table.js.map +1 -1
  7. package/cjs/cell-block/CellBlock.css.js +6 -0
  8. package/cjs/cell-block/CellBlock.css.js.map +1 -0
  9. package/cjs/cell-block/CellBlock.js +31 -0
  10. package/cjs/cell-block/CellBlock.js.map +1 -0
  11. package/cjs/cell-block/cellblock-utils.js +69 -0
  12. package/cjs/cell-block/cellblock-utils.js.map +1 -0
  13. package/cjs/cell-block/useCellBlockSelection.js +237 -0
  14. package/cjs/cell-block/useCellBlockSelection.js.map +1 -0
  15. package/cjs/index.js +5 -0
  16. package/cjs/index.js.map +1 -1
  17. package/cjs/moving-window.js +28 -11
  18. package/cjs/moving-window.js.map +1 -1
  19. package/cjs/pagination/PaginationControl.css.js +6 -0
  20. package/cjs/pagination/PaginationControl.css.js.map +1 -0
  21. package/cjs/pagination/PaginationControl.js +38 -0
  22. package/cjs/pagination/PaginationControl.js.map +1 -0
  23. package/cjs/pagination/usePagination.js +38 -0
  24. package/cjs/pagination/usePagination.js.map +1 -0
  25. package/cjs/useControlledTableNavigation.js +3 -1
  26. package/cjs/useControlledTableNavigation.js.map +1 -1
  27. package/cjs/useDataSource.js +35 -17
  28. package/cjs/useDataSource.js.map +1 -1
  29. package/cjs/useKeyboardNavigation.js +3 -1
  30. package/cjs/useKeyboardNavigation.js.map +1 -1
  31. package/cjs/useTable.js +45 -18
  32. package/cjs/useTable.js.map +1 -1
  33. package/cjs/useTableScroll.js.map +1 -1
  34. package/cjs/useTableViewport.js +31 -13
  35. package/cjs/useTableViewport.js.map +1 -1
  36. package/esm/Row.css.js +1 -1
  37. package/esm/Row.js +1 -1
  38. package/esm/Row.js.map +1 -1
  39. package/esm/Table.css.js +1 -1
  40. package/esm/Table.js +109 -32
  41. package/esm/Table.js.map +1 -1
  42. package/esm/cell-block/CellBlock.css.js +4 -0
  43. package/esm/cell-block/CellBlock.css.js.map +1 -0
  44. package/esm/cell-block/CellBlock.js +29 -0
  45. package/esm/cell-block/CellBlock.js.map +1 -0
  46. package/esm/cell-block/cellblock-utils.js +64 -0
  47. package/esm/cell-block/cellblock-utils.js.map +1 -0
  48. package/esm/cell-block/useCellBlockSelection.js +235 -0
  49. package/esm/cell-block/useCellBlockSelection.js.map +1 -0
  50. package/esm/index.js +2 -1
  51. package/esm/index.js.map +1 -1
  52. package/esm/moving-window.js +28 -11
  53. package/esm/moving-window.js.map +1 -1
  54. package/esm/pagination/PaginationControl.css.js +4 -0
  55. package/esm/pagination/PaginationControl.css.js.map +1 -0
  56. package/esm/pagination/PaginationControl.js +36 -0
  57. package/esm/pagination/PaginationControl.js.map +1 -0
  58. package/esm/pagination/usePagination.js +36 -0
  59. package/esm/pagination/usePagination.js.map +1 -0
  60. package/esm/useControlledTableNavigation.js +3 -2
  61. package/esm/useControlledTableNavigation.js.map +1 -1
  62. package/esm/useDataSource.js +36 -18
  63. package/esm/useDataSource.js.map +1 -1
  64. package/esm/useKeyboardNavigation.js +3 -1
  65. package/esm/useKeyboardNavigation.js.map +1 -1
  66. package/esm/useTable.js +45 -18
  67. package/esm/useTable.js.map +1 -1
  68. package/esm/useTableScroll.js.map +1 -1
  69. package/esm/useTableViewport.js +31 -13
  70. package/esm/useTableViewport.js.map +1 -1
  71. package/package.json +9 -9
  72. package/types/Table.d.ts +37 -0
  73. package/types/cell-block/CellBlock.d.ts +5 -0
  74. package/types/cell-block/cellblock-utils.d.ts +17 -0
  75. package/types/cell-block/useCellBlockSelection.d.ts +11 -0
  76. package/types/index.d.ts +1 -0
  77. package/types/moving-window.d.ts +3 -1
  78. package/types/pagination/PaginationControl.d.ts +6 -0
  79. package/types/pagination/index.d.ts +1 -0
  80. package/types/pagination/usePagination.d.ts +9 -0
  81. package/types/useControlledTableNavigation.d.ts +1 -0
  82. package/types/useDataSource.d.ts +1 -2
  83. package/types/useTable.d.ts +11 -10
  84. package/types/useTableScroll.d.ts +1 -0
  85. package/types/useTableViewport.d.ts +3 -2
  86. package/cjs/useInitialValue.js +0 -11
  87. package/cjs/useInitialValue.js.map +0 -1
  88. package/esm/useInitialValue.js +0 -9
  89. package/esm/useInitialValue.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cellblock-utils.js","sources":["../../src/cell-block/cellblock-utils.ts"],"sourcesContent":["import { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { queryClosest } from \"@vuu-ui/vuu-utils\";\n\nexport type TableCellBlock = {\n columnRange: VuuRange;\n rowRange: VuuRange;\n};\n\nexport type CellBox = {\n bottom: number;\n left: number;\n right: number;\n top: number;\n};\n\ntype EndCellDirection =\n | \"self\"\n | \"n\"\n | \"ne\"\n | \"e\"\n | \"se\"\n | \"s\"\n | \"sw\"\n | \"w\"\n | \"nw\";\n\nexport const getEndCellDirection = (\n startBox: CellBox,\n endBox: CellBox,\n): EndCellDirection => {\n const { bottom: sBottom, left: sLeft, right: sRight, top: sTop } = startBox;\n const { bottom: eBottom, left: eLeft, right: eRight, top: eTop } = endBox;\n const north = eTop < sTop;\n const east = eRight > sRight;\n const south = eBottom > sBottom;\n const west = eLeft < sLeft;\n\n if (north && east) return \"ne\";\n else if (south && east) return \"se\";\n else if (south && west) return \"sw\";\n else if (north && west) return \"nw\";\n else if (north) return \"n\";\n else if (east) return \"e\";\n else if (south) return \"s\";\n else if (west) return \"w\";\n else return \"self\";\n};\n\nexport const setElementBox = (el: HTMLElement, box: CellBox) => {\n const { bottom, left, right, top } = el.getBoundingClientRect();\n box.bottom = bottom;\n box.left = left;\n box.right = right;\n box.top = top;\n};\n\nexport const outsideBox = (\n { bottom, left, right, top }: CellBox,\n x: number,\n y: number,\n) => x < left || x > right || y < top || y > bottom;\n\nconst getColIndex = ({ ariaColIndex }: HTMLDivElement) => {\n if (ariaColIndex !== null) {\n return parseInt(ariaColIndex);\n }\n throw Error(\"invalid aria-colindex in table cell\");\n};\n\nconst getRowIndex = (cell: HTMLDivElement) => {\n const row = queryClosest<HTMLDivElement>(cell, \".vuuTableRow\");\n if (row) {\n const { ariaRowIndex } = row;\n if (ariaRowIndex !== null) {\n return parseInt(ariaRowIndex);\n }\n }\n throw Error(\"invalid aria-rowindex in table row\");\n};\n\nexport const getTableCellBlock = (\n startCell: HTMLDivElement,\n endCell: HTMLDivElement,\n): TableCellBlock => {\n const colStart = getColIndex(startCell);\n const colEnd = getColIndex(endCell);\n const rowStart = getRowIndex(startCell);\n const rowEnd = getRowIndex(endCell);\n\n const columnRange = {\n from: Math.min(colStart, colEnd),\n to: Math.max(colStart, colEnd),\n };\n const rowRange = {\n from: Math.min(rowStart, rowEnd),\n to: Math.max(rowStart, rowEnd),\n };\n\n return {\n columnRange,\n rowRange,\n };\n};\n"],"names":["queryClosest"],"mappings":"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"}
@@ -0,0 +1,237 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var react = require('react');
6
+ var CellBlock = require('./CellBlock.js');
7
+ var cellblockUtils = require('./cellblock-utils.js');
8
+
9
+ const Hi = Number.MAX_SAFE_INTEGER;
10
+ const refState = {
11
+ cellBlock: null,
12
+ cellBlockClassName: "",
13
+ dragState: "pending",
14
+ endBox: { bottom: -1, left: Hi, right: -1, top: Hi },
15
+ endCell: null,
16
+ mousePosX: -1,
17
+ mousePosY: -1,
18
+ mouseStartX: -1,
19
+ mouseStartY: -1,
20
+ startBox: { bottom: -1, left: -1, right: -1, top: -1 },
21
+ startCell: null
22
+ };
23
+ const NullHandler = () => console.error("no handler installed");
24
+ const mouseHandlers = {
25
+ mouseMove: NullHandler,
26
+ mouseMovePreDrag: NullHandler,
27
+ mouseUp: NullHandler,
28
+ mouseUpPreDrag: NullHandler
29
+ };
30
+ const mouseType = (name) => name.startsWith("mouseMove") ? "mousemove" : "mouseup";
31
+ const DRAG_THRESHOLD = 5;
32
+ const useCellBlockSelection = ({
33
+ allowCellBlockSelection,
34
+ onSelectCellBlock
35
+ }) => {
36
+ const [cellBlock, setCellBlock] = react.useState(null);
37
+ const stateRef = react.useRef(refState);
38
+ const handlersRef = react.useRef(mouseHandlers);
39
+ const cellBlockRef = react.useCallback((el) => {
40
+ stateRef.current.cellBlock = el;
41
+ }, []);
42
+ const createCellBlock = react.useCallback(() => {
43
+ const { startBox, startCell } = stateRef.current;
44
+ if (startCell) {
45
+ cellblockUtils.setElementBox(startCell, startBox);
46
+ startCell.classList.add("vuu-cellblock-start");
47
+ setCellBlock(/* @__PURE__ */ jsxRuntime.jsx(CellBlock.CellBlock, { ref: cellBlockRef }));
48
+ }
49
+ }, [cellBlockRef]);
50
+ const initializeStateRef = react.useCallback(() => {
51
+ const { cellBlock: cellBlock2, cellBlockClassName, startCell, endCell } = stateRef.current;
52
+ if (startCell) {
53
+ startCell.classList.remove("vuu-cellblock-start");
54
+ }
55
+ if (endCell) {
56
+ endCell.classList.remove("vuu-cellblock-end");
57
+ }
58
+ if (cellBlock2?.classList.contains(cellBlockClassName)) {
59
+ cellBlock2.classList.remove(cellBlockClassName);
60
+ }
61
+ const { endBox, startBox } = refState;
62
+ stateRef.current = {
63
+ ...refState,
64
+ cellBlock: cellBlock2,
65
+ endBox: { ...endBox },
66
+ startBox: { ...startBox }
67
+ };
68
+ }, []);
69
+ const addMouseListener = react.useCallback(
70
+ (mouseOperation, handler) => {
71
+ window.addEventListener(mouseType(mouseOperation), handler);
72
+ handlersRef.current[mouseOperation] = handler;
73
+ },
74
+ []
75
+ );
76
+ const removeMouseListener = react.useCallback((name) => {
77
+ window.removeEventListener(mouseType(name), handlersRef.current[name]);
78
+ }, []);
79
+ handlersRef.current.mouseMove = react.useCallback((evt) => {
80
+ const { clientX: x, clientY: y } = evt;
81
+ const { cellBlock: cellBlock2, cellBlockClassName, endBox, startBox } = stateRef.current;
82
+ if (cellblockUtils.outsideBox(startBox, x, y) && cellblockUtils.outsideBox(endBox, x, y)) {
83
+ const cell = vuuUtils.queryClosest(
84
+ evt.target,
85
+ ".vuuTableCell, .vuuCellBlock"
86
+ );
87
+ const table = vuuUtils.queryClosest(cell, ".vuuTable");
88
+ if (table) {
89
+ table.classList.add("vuu-cellblock-select-in-progress");
90
+ }
91
+ if (cell?.classList.contains("vuuTableCell")) {
92
+ cellblockUtils.setElementBox(cell, endBox);
93
+ stateRef.current.endCell = cell;
94
+ const endBlockDirection = cellblockUtils.getEndCellDirection(startBox, endBox);
95
+ const newCellBlockClassName = `cellblock-direction-${endBlockDirection}`;
96
+ if (newCellBlockClassName !== cellBlockClassName) {
97
+ if (cellBlockClassName) {
98
+ cellBlock2?.classList.replace(
99
+ cellBlockClassName,
100
+ newCellBlockClassName
101
+ );
102
+ } else {
103
+ cellBlock2?.classList.add(newCellBlockClassName);
104
+ }
105
+ stateRef.current.cellBlockClassName = newCellBlockClassName;
106
+ }
107
+ }
108
+ }
109
+ }, []);
110
+ handlersRef.current.mouseUp = react.useCallback(
111
+ (evt) => {
112
+ removeMouseListener("mouseMove");
113
+ removeMouseListener("mouseUp");
114
+ const { endCell, startCell } = stateRef.current;
115
+ const table = vuuUtils.queryClosest(evt.target, ".vuuTable");
116
+ endCell?.classList.add("vuu-cellblock-end");
117
+ if (table) {
118
+ table.classList.remove("vuu-cellblock-select-in-progress");
119
+ }
120
+ if (startCell && endCell) {
121
+ const tableCellBlock = cellblockUtils.getTableCellBlock(startCell, endCell);
122
+ onSelectCellBlock?.(tableCellBlock);
123
+ }
124
+ },
125
+ [onSelectCellBlock, removeMouseListener]
126
+ );
127
+ handlersRef.current.mouseMovePreDrag = react.useCallback(
128
+ (evt) => {
129
+ const { current: state } = stateRef;
130
+ const { mouseStartX, mouseStartY } = state;
131
+ const x = state.mousePosX = evt.clientX;
132
+ const y = state.mousePosY = evt.clientY;
133
+ const distance = Math.max(
134
+ Math.abs(x - mouseStartX),
135
+ Math.abs(y - mouseStartY)
136
+ );
137
+ if (distance > DRAG_THRESHOLD) {
138
+ createCellBlock();
139
+ const { mouseMove, mouseUp } = handlersRef.current;
140
+ removeMouseListener("mouseMovePreDrag");
141
+ removeMouseListener("mouseUpPreDrag");
142
+ addMouseListener("mouseMove", mouseMove);
143
+ addMouseListener("mouseUp", mouseUp);
144
+ }
145
+ },
146
+ [addMouseListener, createCellBlock, removeMouseListener]
147
+ );
148
+ handlersRef.current.mouseUpPreDrag = react.useCallback(() => {
149
+ removeMouseListener("mouseMovePreDrag");
150
+ removeMouseListener("mouseUpPreDrag");
151
+ }, [removeMouseListener]);
152
+ const handleMouseDown = react.useCallback(
153
+ (evt) => {
154
+ initializeStateRef();
155
+ const { current: state } = stateRef;
156
+ const cell = vuuUtils.queryClosest(evt.target, ".vuuTableCell");
157
+ if (cell) {
158
+ state.startCell = cell;
159
+ state.mouseStartX = evt.clientX;
160
+ state.mouseStartY = evt.clientY;
161
+ const { mouseMovePreDrag, mouseUpPreDrag } = handlersRef.current;
162
+ addMouseListener("mouseMovePreDrag", mouseMovePreDrag);
163
+ addMouseListener("mouseUpPreDrag", mouseUpPreDrag);
164
+ }
165
+ },
166
+ [addMouseListener, initializeStateRef]
167
+ );
168
+ const shiftingRef = react.useRef(false);
169
+ const cellBlockEndRef = react.useRef([0, 0]);
170
+ const nativeKeyDownHandlerRef = react.useRef(NullHandler);
171
+ const handleNativeKeyUp = react.useCallback((evt) => {
172
+ if (evt.key === "Shift") {
173
+ const { current: pos } = cellBlockEndRef;
174
+ if (pos[0] || pos[1]) {
175
+ console.log(`cell selection [${pos[0]},${pos[1]}]`);
176
+ }
177
+ console.log("abandon cellblock selection");
178
+ shiftingRef.current = false;
179
+ window.removeEventListener("keydown", nativeKeyDownHandlerRef.current, {
180
+ capture: true
181
+ });
182
+ window.removeEventListener("keyup", handleNativeKeyUp, {
183
+ capture: true
184
+ });
185
+ }
186
+ }, []);
187
+ const handleNativeKeyDown = nativeKeyDownHandlerRef.current = react.useCallback(
188
+ (evt) => {
189
+ if (evt.key.startsWith("Arrow")) {
190
+ const { current: pos } = cellBlockEndRef;
191
+ switch (evt.key) {
192
+ case "ArrowRight":
193
+ pos[0] += 1;
194
+ break;
195
+ case "ArrowLEFT":
196
+ pos[0] -= 1;
197
+ break;
198
+ case "ArrowUP":
199
+ pos[1] -= 1;
200
+ break;
201
+ case "ArrowDown":
202
+ pos[1] += 1;
203
+ break;
204
+ }
205
+ }
206
+ },
207
+ []
208
+ );
209
+ const handleKeyDown = react.useCallback(
210
+ (evt) => {
211
+ if (evt.key === "Shift") {
212
+ shiftingRef.current = true;
213
+ const cell = vuuUtils.queryClosest(evt.target, ".vuuTableCell");
214
+ if (cell) {
215
+ const { current: state } = stateRef;
216
+ state.startCell = cell;
217
+ window.addEventListener("keydown", handleNativeKeyDown, {
218
+ capture: true
219
+ });
220
+ window.addEventListener("keyup", handleNativeKeyUp, {
221
+ capture: true
222
+ });
223
+ evt.preventDefault();
224
+ }
225
+ }
226
+ },
227
+ [handleNativeKeyDown, handleNativeKeyUp]
228
+ );
229
+ return {
230
+ cellBlock,
231
+ onKeyDown: allowCellBlockSelection ? handleKeyDown : void 0,
232
+ onMouseDown: allowCellBlockSelection ? handleMouseDown : void 0
233
+ };
234
+ };
235
+
236
+ exports.useCellBlockSelection = useCellBlockSelection;
237
+ //# sourceMappingURL=useCellBlockSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCellBlockSelection.js","sources":["../../src/cell-block/useCellBlockSelection.tsx"],"sourcesContent":["import { queryClosest } from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEventHandler,\n MouseEventHandler,\n ReactElement,\n RefCallback,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { CellBlock } from \"./CellBlock\";\nimport {\n CellBox,\n TableCellBlock,\n getEndCellDirection,\n getTableCellBlock,\n outsideBox,\n setElementBox,\n} from \"./cellblock-utils\";\n\nconst Hi = Number.MAX_SAFE_INTEGER;\n\ntype RefState = {\n dragState: \"pending\" | \"active\";\n cellBlock: HTMLDivElement | null;\n cellBlockClassName: string;\n endBox: CellBox;\n endCell: HTMLDivElement | null;\n mousePosX: number;\n mousePosY: number;\n mouseStartX: number;\n mouseStartY: number;\n startCell: HTMLDivElement | null;\n startBox: CellBox;\n};\n\nconst refState: RefState = {\n cellBlock: null,\n cellBlockClassName: \"\",\n dragState: \"pending\",\n endBox: { bottom: -1, left: Hi, right: -1, top: Hi },\n endCell: null,\n mousePosX: -1,\n mousePosY: -1,\n mouseStartX: -1,\n mouseStartY: -1,\n startBox: { bottom: -1, left: -1, right: -1, top: -1 },\n startCell: null,\n} as const;\n\ntype NativeKeyboardHandler = (evt: KeyboardEvent) => void;\ntype NativeMouseHandler = (evt: MouseEvent) => void;\ntype MouseHandlers = {\n mouseMove: NativeMouseHandler;\n mouseMovePreDrag: NativeMouseHandler;\n mouseUp: NativeMouseHandler;\n mouseUpPreDrag: NativeMouseHandler;\n};\n\nconst NullHandler = () => console.error(\"no handler installed\");\nconst mouseHandlers: MouseHandlers = {\n mouseMove: NullHandler,\n mouseMovePreDrag: NullHandler,\n mouseUp: NullHandler,\n mouseUpPreDrag: NullHandler,\n};\n\ntype MouseOperation = keyof typeof mouseHandlers;\n\nconst mouseType = (name: string) =>\n name.startsWith(\"mouseMove\") ? \"mousemove\" : \"mouseup\";\n\nconst DRAG_THRESHOLD = 5;\n\nexport interface CellblockSelectionHookProps {\n allowCellBlockSelection?: boolean;\n onSelectCellBlock?: (cellBlock: TableCellBlock) => void;\n}\n\nexport const useCellBlockSelection = ({\n allowCellBlockSelection,\n onSelectCellBlock,\n}: CellblockSelectionHookProps) => {\n const [cellBlock, setCellBlock] = useState<ReactElement | null>(null);\n const stateRef = useRef<RefState>(refState);\n const handlersRef = useRef<MouseHandlers>(mouseHandlers);\n\n const cellBlockRef = useCallback<RefCallback<HTMLDivElement>>((el) => {\n stateRef.current.cellBlock = el;\n }, []);\n\n const createCellBlock = useCallback(() => {\n const { startBox, startCell } = stateRef.current;\n if (startCell) {\n setElementBox(startCell, startBox);\n startCell.classList.add(\"vuu-cellblock-start\");\n setCellBlock(<CellBlock ref={cellBlockRef} />);\n }\n }, [cellBlockRef]);\n\n const initializeStateRef = useCallback(() => {\n const { cellBlock, cellBlockClassName, startCell, endCell } =\n stateRef.current;\n if (startCell) {\n startCell.classList.remove(\"vuu-cellblock-start\");\n }\n if (endCell) {\n endCell.classList.remove(\"vuu-cellblock-end\");\n }\n if (cellBlock?.classList.contains(cellBlockClassName)) {\n cellBlock.classList.remove(cellBlockClassName);\n }\n\n const { endBox, startBox } = refState;\n\n stateRef.current = {\n ...refState,\n cellBlock,\n endBox: { ...endBox },\n startBox: { ...startBox },\n };\n }, []);\n\n const addMouseListener = useCallback(\n (mouseOperation: MouseOperation, handler: NativeMouseHandler) => {\n window.addEventListener(mouseType(mouseOperation), handler);\n handlersRef.current[mouseOperation] = handler;\n },\n [],\n );\n\n const removeMouseListener = useCallback((name: MouseOperation) => {\n window.removeEventListener(mouseType(name), handlersRef.current[name]);\n }, []);\n\n handlersRef.current.mouseMove = useCallback((evt: MouseEvent) => {\n const { clientX: x, clientY: y } = evt;\n const { cellBlock, cellBlockClassName, endBox, startBox } =\n stateRef.current;\n if (outsideBox(startBox, x, y) && outsideBox(endBox, x, y)) {\n const cell = queryClosest<HTMLDivElement>(\n evt.target,\n \".vuuTableCell, .vuuCellBlock\",\n );\n const table = queryClosest<HTMLDivElement>(cell, \".vuuTable\");\n if (table) {\n table.classList.add(\"vuu-cellblock-select-in-progress\");\n }\n if (cell?.classList.contains(\"vuuTableCell\")) {\n setElementBox(cell, endBox);\n stateRef.current.endCell = cell;\n const endBlockDirection = getEndCellDirection(startBox, endBox);\n const newCellBlockClassName = `cellblock-direction-${endBlockDirection}`;\n if (newCellBlockClassName !== cellBlockClassName) {\n if (cellBlockClassName) {\n cellBlock?.classList.replace(\n cellBlockClassName,\n newCellBlockClassName,\n );\n } else {\n cellBlock?.classList.add(newCellBlockClassName);\n }\n stateRef.current.cellBlockClassName = newCellBlockClassName;\n }\n }\n }\n }, []);\n\n handlersRef.current.mouseUp = useCallback(\n (evt: MouseEvent) => {\n removeMouseListener(\"mouseMove\");\n removeMouseListener(\"mouseUp\");\n\n const { endCell, startCell } = stateRef.current;\n\n const table = queryClosest<HTMLDivElement>(evt.target, \".vuuTable\");\n endCell?.classList.add(\"vuu-cellblock-end\");\n if (table) {\n table.classList.remove(\"vuu-cellblock-select-in-progress\");\n }\n\n if (startCell && endCell) {\n const tableCellBlock = getTableCellBlock(startCell, endCell);\n onSelectCellBlock?.(tableCellBlock);\n }\n },\n [onSelectCellBlock, removeMouseListener],\n );\n\n handlersRef.current.mouseMovePreDrag = useCallback(\n (evt: MouseEvent) => {\n const { current: state } = stateRef;\n const { mouseStartX, mouseStartY } = state;\n\n const x = (state.mousePosX = evt.clientX);\n const y = (state.mousePosY = evt.clientY);\n\n const distance = Math.max(\n Math.abs(x - mouseStartX),\n Math.abs(y - mouseStartY),\n );\n\n if (distance > DRAG_THRESHOLD) {\n createCellBlock();\n\n const { mouseMove, mouseUp } = handlersRef.current;\n removeMouseListener(\"mouseMovePreDrag\");\n removeMouseListener(\"mouseUpPreDrag\");\n addMouseListener(\"mouseMove\", mouseMove);\n addMouseListener(\"mouseUp\", mouseUp);\n }\n },\n [addMouseListener, createCellBlock, removeMouseListener],\n );\n\n handlersRef.current.mouseUpPreDrag = useCallback(() => {\n removeMouseListener(\"mouseMovePreDrag\");\n removeMouseListener(\"mouseUpPreDrag\");\n }, [removeMouseListener]);\n\n const handleMouseDown = useCallback<MouseEventHandler>(\n (evt) => {\n initializeStateRef();\n const { current: state } = stateRef;\n const cell = queryClosest<HTMLDivElement>(evt.target, \".vuuTableCell\");\n if (cell) {\n state.startCell = cell;\n state.mouseStartX = evt.clientX;\n state.mouseStartY = evt.clientY;\n\n const { mouseMovePreDrag, mouseUpPreDrag } = handlersRef.current;\n addMouseListener(\"mouseMovePreDrag\", mouseMovePreDrag);\n addMouseListener(\"mouseUpPreDrag\", mouseUpPreDrag);\n }\n },\n [addMouseListener, initializeStateRef],\n );\n\n const shiftingRef = useRef(false);\n const cellBlockEndRef = useRef([0, 0]);\n const nativeKeyDownHandlerRef = useRef<NativeKeyboardHandler>(NullHandler);\n\n const handleNativeKeyUp = useCallback((evt: KeyboardEvent) => {\n if (evt.key === \"Shift\") {\n const { current: pos } = cellBlockEndRef;\n\n if (pos[0] || pos[1]) {\n console.log(`cell selection [${pos[0]},${pos[1]}]`);\n }\n console.log(\"abandon cellblock selection\");\n shiftingRef.current = false;\n\n window.removeEventListener(\"keydown\", nativeKeyDownHandlerRef.current, {\n capture: true,\n });\n window.removeEventListener(\"keyup\", handleNativeKeyUp, {\n capture: true,\n });\n }\n }, []);\n const handleNativeKeyDown = (nativeKeyDownHandlerRef.current = useCallback(\n (evt: KeyboardEvent) => {\n if (evt.key.startsWith(\"Arrow\")) {\n const { current: pos } = cellBlockEndRef;\n switch (evt.key) {\n case \"ArrowRight\":\n pos[0] += 1;\n break;\n case \"ArrowLEFT\":\n pos[0] -= 1;\n break;\n case \"ArrowUP\":\n pos[1] -= 1;\n break;\n case \"ArrowDown\":\n pos[1] += 1;\n break;\n }\n }\n },\n [],\n ));\n const handleKeyDown = useCallback<KeyboardEventHandler>(\n (evt) => {\n if (evt.key === \"Shift\") {\n shiftingRef.current = true;\n\n const cell = queryClosest<HTMLDivElement>(evt.target, \".vuuTableCell\");\n if (cell) {\n const { current: state } = stateRef;\n state.startCell = cell;\n window.addEventListener(\"keydown\", handleNativeKeyDown, {\n capture: true,\n });\n window.addEventListener(\"keyup\", handleNativeKeyUp, {\n capture: true,\n });\n\n evt.preventDefault();\n }\n }\n },\n [handleNativeKeyDown, handleNativeKeyUp],\n );\n\n return {\n cellBlock,\n onKeyDown: allowCellBlockSelection ? handleKeyDown : undefined,\n onMouseDown: allowCellBlockSelection ? handleMouseDown : undefined,\n };\n};\n"],"names":["useState","useRef","useCallback","setElementBox","jsx","CellBlock","cellBlock","outsideBox","queryClosest","getEndCellDirection","getTableCellBlock"],"mappings":";;;;;;;;AAoBA,MAAM,KAAK,MAAO,CAAA,gBAAA,CAAA;AAgBlB,MAAM,QAAqB,GAAA;AAAA,EACzB,SAAW,EAAA,IAAA;AAAA,EACX,kBAAoB,EAAA,EAAA;AAAA,EACpB,SAAW,EAAA,SAAA;AAAA,EACX,MAAA,EAAQ,EAAE,MAAQ,EAAA,CAAA,CAAA,EAAI,MAAM,EAAI,EAAA,KAAA,EAAO,CAAI,CAAA,EAAA,GAAA,EAAK,EAAG,EAAA;AAAA,EACnD,OAAS,EAAA,IAAA;AAAA,EACT,SAAW,EAAA,CAAA,CAAA;AAAA,EACX,SAAW,EAAA,CAAA,CAAA;AAAA,EACX,WAAa,EAAA,CAAA,CAAA;AAAA,EACb,WAAa,EAAA,CAAA,CAAA;AAAA,EACb,QAAA,EAAU,EAAE,MAAQ,EAAA,CAAA,CAAA,EAAI,MAAM,CAAI,CAAA,EAAA,KAAA,EAAO,CAAI,CAAA,EAAA,GAAA,EAAK,CAAG,CAAA,EAAA;AAAA,EACrD,SAAW,EAAA,IAAA;AACb,CAAA,CAAA;AAWA,MAAM,WAAc,GAAA,MAAM,OAAQ,CAAA,KAAA,CAAM,sBAAsB,CAAA,CAAA;AAC9D,MAAM,aAA+B,GAAA;AAAA,EACnC,SAAW,EAAA,WAAA;AAAA,EACX,gBAAkB,EAAA,WAAA;AAAA,EAClB,OAAS,EAAA,WAAA;AAAA,EACT,cAAgB,EAAA,WAAA;AAClB,CAAA,CAAA;AAIA,MAAM,YAAY,CAAC,IAAA,KACjB,KAAK,UAAW,CAAA,WAAW,IAAI,WAAc,GAAA,SAAA,CAAA;AAE/C,MAAM,cAAiB,GAAA,CAAA,CAAA;AAOhB,MAAM,wBAAwB,CAAC;AAAA,EACpC,uBAAA;AAAA,EACA,iBAAA;AACF,CAAmC,KAAA;AACjC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAA8B,IAAI,CAAA,CAAA;AACpE,EAAM,MAAA,QAAA,GAAWC,aAAiB,QAAQ,CAAA,CAAA;AAC1C,EAAM,MAAA,WAAA,GAAcA,aAAsB,aAAa,CAAA,CAAA;AAEvD,EAAM,MAAA,YAAA,GAAeC,iBAAyC,CAAA,CAAC,EAAO,KAAA;AACpE,IAAA,QAAA,CAAS,QAAQ,SAAY,GAAA,EAAA,CAAA;AAAA,GAC/B,EAAG,EAAE,CAAA,CAAA;AAEL,EAAM,MAAA,eAAA,GAAkBA,kBAAY,MAAM;AACxC,IAAA,MAAM,EAAE,QAAA,EAAU,SAAU,EAAA,GAAI,QAAS,CAAA,OAAA,CAAA;AACzC,IAAA,IAAI,SAAW,EAAA;AACb,MAAAC,4BAAA,CAAc,WAAW,QAAQ,CAAA,CAAA;AACjC,MAAU,SAAA,CAAA,SAAA,CAAU,IAAI,qBAAqB,CAAA,CAAA;AAC7C,MAAA,YAAA,iBAAcC,cAAA,CAAAC,mBAAA,EAAA,EAAU,GAAK,EAAA,YAAA,EAAc,CAAE,CAAA,CAAA;AAAA,KAC/C;AAAA,GACF,EAAG,CAAC,YAAY,CAAC,CAAA,CAAA;AAEjB,EAAM,MAAA,kBAAA,GAAqBH,kBAAY,MAAM;AAC3C,IAAA,MAAM,EAAE,SAAAI,EAAAA,UAAAA,EAAW,oBAAoB,SAAW,EAAA,OAAA,KAChD,QAAS,CAAA,OAAA,CAAA;AACX,IAAA,IAAI,SAAW,EAAA;AACb,MAAU,SAAA,CAAA,SAAA,CAAU,OAAO,qBAAqB,CAAA,CAAA;AAAA,KAClD;AACA,IAAA,IAAI,OAAS,EAAA;AACX,MAAQ,OAAA,CAAA,SAAA,CAAU,OAAO,mBAAmB,CAAA,CAAA;AAAA,KAC9C;AACA,IAAA,IAAIA,UAAW,EAAA,SAAA,CAAU,QAAS,CAAA,kBAAkB,CAAG,EAAA;AACrD,MAAAA,UAAAA,CAAU,SAAU,CAAA,MAAA,CAAO,kBAAkB,CAAA,CAAA;AAAA,KAC/C;AAEA,IAAM,MAAA,EAAE,MAAQ,EAAA,QAAA,EAAa,GAAA,QAAA,CAAA;AAE7B,IAAA,QAAA,CAAS,OAAU,GAAA;AAAA,MACjB,GAAG,QAAA;AAAA,MACH,SAAAA,EAAAA,UAAAA;AAAA,MACA,MAAA,EAAQ,EAAE,GAAG,MAAO,EAAA;AAAA,MACpB,QAAA,EAAU,EAAE,GAAG,QAAS,EAAA;AAAA,KAC1B,CAAA;AAAA,GACF,EAAG,EAAE,CAAA,CAAA;AAEL,EAAA,MAAM,gBAAmB,GAAAJ,iBAAA;AAAA,IACvB,CAAC,gBAAgC,OAAgC,KAAA;AAC/D,MAAA,MAAA,CAAO,gBAAiB,CAAA,SAAA,CAAU,cAAc,CAAA,EAAG,OAAO,CAAA,CAAA;AAC1D,MAAY,WAAA,CAAA,OAAA,CAAQ,cAAc,CAAI,GAAA,OAAA,CAAA;AAAA,KACxC;AAAA,IACA,EAAC;AAAA,GACH,CAAA;AAEA,EAAM,MAAA,mBAAA,GAAsBA,iBAAY,CAAA,CAAC,IAAyB,KAAA;AAChE,IAAA,MAAA,CAAO,oBAAoB,SAAU,CAAA,IAAI,GAAG,WAAY,CAAA,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA;AAAA,GACvE,EAAG,EAAE,CAAA,CAAA;AAEL,EAAA,WAAA,CAAY,OAAQ,CAAA,SAAA,GAAYA,iBAAY,CAAA,CAAC,GAAoB,KAAA;AAC/D,IAAA,MAAM,EAAE,OAAA,EAAS,CAAG,EAAA,OAAA,EAAS,GAAM,GAAA,GAAA,CAAA;AACnC,IAAA,MAAM,EAAE,SAAAI,EAAAA,UAAAA,EAAW,oBAAoB,MAAQ,EAAA,QAAA,KAC7C,QAAS,CAAA,OAAA,CAAA;AACX,IAAI,IAAAC,yBAAA,CAAW,UAAU,CAAG,EAAA,CAAC,KAAKA,yBAAW,CAAA,MAAA,EAAQ,CAAG,EAAA,CAAC,CAAG,EAAA;AAC1D,MAAA,MAAM,IAAO,GAAAC,qBAAA;AAAA,QACX,GAAI,CAAA,MAAA;AAAA,QACJ,8BAAA;AAAA,OACF,CAAA;AACA,MAAM,MAAA,KAAA,GAAQA,qBAA6B,CAAA,IAAA,EAAM,WAAW,CAAA,CAAA;AAC5D,MAAA,IAAI,KAAO,EAAA;AACT,QAAM,KAAA,CAAA,SAAA,CAAU,IAAI,kCAAkC,CAAA,CAAA;AAAA,OACxD;AACA,MAAA,IAAI,IAAM,EAAA,SAAA,CAAU,QAAS,CAAA,cAAc,CAAG,EAAA;AAC5C,QAAAL,4BAAA,CAAc,MAAM,MAAM,CAAA,CAAA;AAC1B,QAAA,QAAA,CAAS,QAAQ,OAAU,GAAA,IAAA,CAAA;AAC3B,QAAM,MAAA,iBAAA,GAAoBM,kCAAoB,CAAA,QAAA,EAAU,MAAM,CAAA,CAAA;AAC9D,QAAM,MAAA,qBAAA,GAAwB,uBAAuB,iBAAiB,CAAA,CAAA,CAAA;AACtE,QAAA,IAAI,0BAA0B,kBAAoB,EAAA;AAChD,UAAA,IAAI,kBAAoB,EAAA;AACtB,YAAAH,YAAW,SAAU,CAAA,OAAA;AAAA,cACnB,kBAAA;AAAA,cACA,qBAAA;AAAA,aACF,CAAA;AAAA,WACK,MAAA;AACL,YAAAA,UAAAA,EAAW,SAAU,CAAA,GAAA,CAAI,qBAAqB,CAAA,CAAA;AAAA,WAChD;AACA,UAAA,QAAA,CAAS,QAAQ,kBAAqB,GAAA,qBAAA,CAAA;AAAA,SACxC;AAAA,OACF;AAAA,KACF;AAAA,GACF,EAAG,EAAE,CAAA,CAAA;AAEL,EAAA,WAAA,CAAY,QAAQ,OAAU,GAAAJ,iBAAA;AAAA,IAC5B,CAAC,GAAoB,KAAA;AACnB,MAAA,mBAAA,CAAoB,WAAW,CAAA,CAAA;AAC/B,MAAA,mBAAA,CAAoB,SAAS,CAAA,CAAA;AAE7B,MAAA,MAAM,EAAE,OAAA,EAAS,SAAU,EAAA,GAAI,QAAS,CAAA,OAAA,CAAA;AAExC,MAAA,MAAM,KAAQ,GAAAM,qBAAA,CAA6B,GAAI,CAAA,MAAA,EAAQ,WAAW,CAAA,CAAA;AAClE,MAAS,OAAA,EAAA,SAAA,CAAU,IAAI,mBAAmB,CAAA,CAAA;AAC1C,MAAA,IAAI,KAAO,EAAA;AACT,QAAM,KAAA,CAAA,SAAA,CAAU,OAAO,kCAAkC,CAAA,CAAA;AAAA,OAC3D;AAEA,MAAA,IAAI,aAAa,OAAS,EAAA;AACxB,QAAM,MAAA,cAAA,GAAiBE,gCAAkB,CAAA,SAAA,EAAW,OAAO,CAAA,CAAA;AAC3D,QAAA,iBAAA,GAAoB,cAAc,CAAA,CAAA;AAAA,OACpC;AAAA,KACF;AAAA,IACA,CAAC,mBAAmB,mBAAmB,CAAA;AAAA,GACzC,CAAA;AAEA,EAAA,WAAA,CAAY,QAAQ,gBAAmB,GAAAR,iBAAA;AAAA,IACrC,CAAC,GAAoB,KAAA;AACnB,MAAM,MAAA,EAAE,OAAS,EAAA,KAAA,EAAU,GAAA,QAAA,CAAA;AAC3B,MAAM,MAAA,EAAE,WAAa,EAAA,WAAA,EAAgB,GAAA,KAAA,CAAA;AAErC,MAAM,MAAA,CAAA,GAAK,KAAM,CAAA,SAAA,GAAY,GAAI,CAAA,OAAA,CAAA;AACjC,MAAM,MAAA,CAAA,GAAK,KAAM,CAAA,SAAA,GAAY,GAAI,CAAA,OAAA,CAAA;AAEjC,MAAA,MAAM,WAAW,IAAK,CAAA,GAAA;AAAA,QACpB,IAAA,CAAK,GAAI,CAAA,CAAA,GAAI,WAAW,CAAA;AAAA,QACxB,IAAA,CAAK,GAAI,CAAA,CAAA,GAAI,WAAW,CAAA;AAAA,OAC1B,CAAA;AAEA,MAAA,IAAI,WAAW,cAAgB,EAAA;AAC7B,QAAgB,eAAA,EAAA,CAAA;AAEhB,QAAA,MAAM,EAAE,SAAA,EAAW,OAAQ,EAAA,GAAI,WAAY,CAAA,OAAA,CAAA;AAC3C,QAAA,mBAAA,CAAoB,kBAAkB,CAAA,CAAA;AACtC,QAAA,mBAAA,CAAoB,gBAAgB,CAAA,CAAA;AACpC,QAAA,gBAAA,CAAiB,aAAa,SAAS,CAAA,CAAA;AACvC,QAAA,gBAAA,CAAiB,WAAW,OAAO,CAAA,CAAA;AAAA,OACrC;AAAA,KACF;AAAA,IACA,CAAC,gBAAkB,EAAA,eAAA,EAAiB,mBAAmB,CAAA;AAAA,GACzD,CAAA;AAEA,EAAY,WAAA,CAAA,OAAA,CAAQ,cAAiB,GAAAA,iBAAA,CAAY,MAAM;AACrD,IAAA,mBAAA,CAAoB,kBAAkB,CAAA,CAAA;AACtC,IAAA,mBAAA,CAAoB,gBAAgB,CAAA,CAAA;AAAA,GACtC,EAAG,CAAC,mBAAmB,CAAC,CAAA,CAAA;AAExB,EAAA,MAAM,eAAkB,GAAAA,iBAAA;AAAA,IACtB,CAAC,GAAQ,KAAA;AACP,MAAmB,kBAAA,EAAA,CAAA;AACnB,MAAM,MAAA,EAAE,OAAS,EAAA,KAAA,EAAU,GAAA,QAAA,CAAA;AAC3B,MAAA,MAAM,IAAO,GAAAM,qBAAA,CAA6B,GAAI,CAAA,MAAA,EAAQ,eAAe,CAAA,CAAA;AACrE,MAAA,IAAI,IAAM,EAAA;AACR,QAAA,KAAA,CAAM,SAAY,GAAA,IAAA,CAAA;AAClB,QAAA,KAAA,CAAM,cAAc,GAAI,CAAA,OAAA,CAAA;AACxB,QAAA,KAAA,CAAM,cAAc,GAAI,CAAA,OAAA,CAAA;AAExB,QAAA,MAAM,EAAE,gBAAA,EAAkB,cAAe,EAAA,GAAI,WAAY,CAAA,OAAA,CAAA;AACzD,QAAA,gBAAA,CAAiB,oBAAoB,gBAAgB,CAAA,CAAA;AACrD,QAAA,gBAAA,CAAiB,kBAAkB,cAAc,CAAA,CAAA;AAAA,OACnD;AAAA,KACF;AAAA,IACA,CAAC,kBAAkB,kBAAkB,CAAA;AAAA,GACvC,CAAA;AAEA,EAAM,MAAA,WAAA,GAAcP,aAAO,KAAK,CAAA,CAAA;AAChC,EAAA,MAAM,eAAkB,GAAAA,YAAA,CAAO,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACrC,EAAM,MAAA,uBAAA,GAA0BA,aAA8B,WAAW,CAAA,CAAA;AAEzE,EAAM,MAAA,iBAAA,GAAoBC,iBAAY,CAAA,CAAC,GAAuB,KAAA;AAC5D,IAAI,IAAA,GAAA,CAAI,QAAQ,OAAS,EAAA;AACvB,MAAM,MAAA,EAAE,OAAS,EAAA,GAAA,EAAQ,GAAA,eAAA,CAAA;AAEzB,MAAA,IAAI,GAAI,CAAA,CAAC,CAAK,IAAA,GAAA,CAAI,CAAC,CAAG,EAAA;AACpB,QAAQ,OAAA,CAAA,GAAA,CAAI,mBAAmB,GAAI,CAAA,CAAC,CAAC,CAAI,CAAA,EAAA,GAAA,CAAI,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,OACpD;AACA,MAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA,CAAA;AACzC,MAAA,WAAA,CAAY,OAAU,GAAA,KAAA,CAAA;AAEtB,MAAO,MAAA,CAAA,mBAAA,CAAoB,SAAW,EAAA,uBAAA,CAAwB,OAAS,EAAA;AAAA,QACrE,OAAS,EAAA,IAAA;AAAA,OACV,CAAA,CAAA;AACD,MAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,iBAAmB,EAAA;AAAA,QACrD,OAAS,EAAA,IAAA;AAAA,OACV,CAAA,CAAA;AAAA,KACH;AAAA,GACF,EAAG,EAAE,CAAA,CAAA;AACL,EAAM,MAAA,mBAAA,GAAuB,wBAAwB,OAAU,GAAAA,iBAAA;AAAA,IAC7D,CAAC,GAAuB,KAAA;AACtB,MAAA,IAAI,GAAI,CAAA,GAAA,CAAI,UAAW,CAAA,OAAO,CAAG,EAAA;AAC/B,QAAM,MAAA,EAAE,OAAS,EAAA,GAAA,EAAQ,GAAA,eAAA,CAAA;AACzB,QAAA,QAAQ,IAAI,GAAK;AAAA,UACf,KAAK,YAAA;AACH,YAAA,GAAA,CAAI,CAAC,CAAK,IAAA,CAAA,CAAA;AACV,YAAA,MAAA;AAAA,UACF,KAAK,WAAA;AACH,YAAA,GAAA,CAAI,CAAC,CAAK,IAAA,CAAA,CAAA;AACV,YAAA,MAAA;AAAA,UACF,KAAK,SAAA;AACH,YAAA,GAAA,CAAI,CAAC,CAAK,IAAA,CAAA,CAAA;AACV,YAAA,MAAA;AAAA,UACF,KAAK,WAAA;AACH,YAAA,GAAA,CAAI,CAAC,CAAK,IAAA,CAAA,CAAA;AACV,YAAA,MAAA;AAAA,SACJ;AAAA,OACF;AAAA,KACF;AAAA,IACA,EAAC;AAAA,GACH,CAAA;AACA,EAAA,MAAM,aAAgB,GAAAA,iBAAA;AAAA,IACpB,CAAC,GAAQ,KAAA;AACP,MAAI,IAAA,GAAA,CAAI,QAAQ,OAAS,EAAA;AACvB,QAAA,WAAA,CAAY,OAAU,GAAA,IAAA,CAAA;AAEtB,QAAA,MAAM,IAAO,GAAAM,qBAAA,CAA6B,GAAI,CAAA,MAAA,EAAQ,eAAe,CAAA,CAAA;AACrE,QAAA,IAAI,IAAM,EAAA;AACR,UAAM,MAAA,EAAE,OAAS,EAAA,KAAA,EAAU,GAAA,QAAA,CAAA;AAC3B,UAAA,KAAA,CAAM,SAAY,GAAA,IAAA,CAAA;AAClB,UAAO,MAAA,CAAA,gBAAA,CAAiB,WAAW,mBAAqB,EAAA;AAAA,YACtD,OAAS,EAAA,IAAA;AAAA,WACV,CAAA,CAAA;AACD,UAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,iBAAmB,EAAA;AAAA,YAClD,OAAS,EAAA,IAAA;AAAA,WACV,CAAA,CAAA;AAED,UAAA,GAAA,CAAI,cAAe,EAAA,CAAA;AAAA,SACrB;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,qBAAqB,iBAAiB,CAAA;AAAA,GACzC,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,SAAA;AAAA,IACA,SAAA,EAAW,0BAA0B,aAAgB,GAAA,KAAA,CAAA;AAAA,IACrD,WAAA,EAAa,0BAA0B,eAAkB,GAAA,KAAA,CAAA;AAAA,GAC3D,CAAA;AACF;;;;"}
package/cjs/index.js CHANGED
@@ -14,6 +14,7 @@ var tableConfig = require('./table-config.js');
14
14
  var HeaderProvider = require('./table-header/HeaderProvider.js');
15
15
  var TableHeader = require('./table-header/TableHeader.js');
16
16
  var useControlledTableNavigation = require('./useControlledTableNavigation.js');
17
+ var useKeyboardNavigation = require('./useKeyboardNavigation.js');
17
18
  var useTableModel = require('./useTableModel.js');
18
19
  var useTableScroll = require('./useTableScroll.js');
19
20
  var useTableViewport = require('./useTableViewport.js');
@@ -35,7 +36,11 @@ exports.updateTableConfig = tableConfig.updateTableConfig;
35
36
  exports.HeaderProvider = HeaderProvider.HeaderProvider;
36
37
  exports.useHeaderProps = HeaderProvider.useHeaderProps;
37
38
  exports.TableHeader = TableHeader.TableHeader;
39
+ exports.isRowSelectionKey = useControlledTableNavigation.isRowSelectionKey;
38
40
  exports.useControlledTableNavigation = useControlledTableNavigation.useControlledTableNavigation;
41
+ exports.isNavigationKey = useKeyboardNavigation.isNavigationKey;
42
+ exports.isPagingKey = useKeyboardNavigation.isPagingKey;
43
+ exports.useKeyboardNavigation = useKeyboardNavigation.useKeyboardNavigation;
39
44
  exports.isShowColumnSettings = useTableModel.isShowColumnSettings;
40
45
  exports.isShowTableSettings = useTableModel.isShowTableSettings;
41
46
  exports.useTableModel = useTableModel.useTableModel;
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2,24 +2,37 @@
2
2
 
3
3
  var vuuUtils = require('@vuu-ui/vuu-utils');
4
4
 
5
+ var __defProp = Object.defineProperty;
6
+ var __typeError = (msg) => {
7
+ throw TypeError(msg);
8
+ };
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
11
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
12
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
13
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
14
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
15
+ var _range;
5
16
  const { SELECTED } = vuuUtils.metadataKeys;
6
17
  class MovingWindow {
7
18
  constructor({ from, to }) {
8
- this.rowCount = 0;
9
- this.setRowCount = (rowCount) => {
19
+ __publicField(this, "data");
20
+ __publicField(this, "rowCount", 0);
21
+ __privateAdd(this, _range);
22
+ __publicField(this, "setRowCount", (rowCount) => {
10
23
  if (rowCount < this.data.length) {
11
24
  this.data.length = rowCount;
12
25
  }
13
26
  this.rowCount = rowCount;
14
- };
15
- this.range = new vuuUtils.WindowRange(from, to);
27
+ });
28
+ __privateSet(this, _range, new vuuUtils.WindowRange(from, to));
16
29
  this.data = new Array(Math.max(0, to - from));
17
30
  this.rowCount = 0;
18
31
  }
19
32
  add(data) {
20
33
  const [index] = data;
21
34
  if (this.isWithinRange(index)) {
22
- const internalIndex = index - this.range.from;
35
+ const internalIndex = index - __privateGet(this, _range).from;
23
36
  this.data[internalIndex] = data;
24
37
  if (data[SELECTED]) {
25
38
  const previousRow = this.data[internalIndex - 1];
@@ -31,14 +44,14 @@ class MovingWindow {
31
44
  }
32
45
  }
33
46
  getAtIndex(index) {
34
- return this.range.isWithin(index) && this.data[index - this.range.from] != null ? this.data[index - this.range.from] : void 0;
47
+ return __privateGet(this, _range).isWithin(index) && this.data[index - __privateGet(this, _range).from] != null ? this.data[index - __privateGet(this, _range).from] : void 0;
35
48
  }
36
49
  isWithinRange(index) {
37
- return this.range.isWithin(index);
50
+ return __privateGet(this, _range).isWithin(index);
38
51
  }
39
52
  setRange({ from, to }) {
40
- if (from !== this.range.from || to !== this.range.to) {
41
- const [overlapFrom, overlapTo] = this.range.overlap(from, to);
53
+ if (from !== __privateGet(this, _range).from || to !== __privateGet(this, _range).to) {
54
+ const [overlapFrom, overlapTo] = __privateGet(this, _range).overlap(from, to);
42
55
  const newData = new Array(Math.max(0, to - from));
43
56
  for (let i = overlapFrom; i < overlapTo; i++) {
44
57
  const data = this.getAtIndex(i);
@@ -48,14 +61,18 @@ class MovingWindow {
48
61
  }
49
62
  }
50
63
  this.data = newData;
51
- this.range.from = from;
52
- this.range.to = to;
64
+ __privateGet(this, _range).from = from;
65
+ __privateGet(this, _range).to = to;
53
66
  }
54
67
  }
55
68
  getSelectedRows() {
56
69
  return this.data.filter((row) => row[SELECTED] !== 0);
57
70
  }
71
+ get range() {
72
+ return __privateGet(this, _range);
73
+ }
58
74
  }
75
+ _range = new WeakMap();
59
76
 
60
77
  exports.MovingWindow = MovingWindow;
61
78
  //# sourceMappingURL=moving-window.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"moving-window.js","sources":["../src/moving-window.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n isRowSelectedLast,\n metadataKeys,\n WindowRange,\n} from \"@vuu-ui/vuu-utils\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\n\nconst { SELECTED } = metadataKeys;\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(Math.max(0, to - from));\n this.rowCount = 0;\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n\n // Hack until we can deal with this more elegantly. When we have a block\n // select operation, first row is selected (and updated via server), then\n // remaining rows are selected when we select the block-end row. We get an\n // update for all rows except first. Because we're extending the select status\n // on the client, we have to adjust the first row selected (its still selected\n // but is no longer the 'last selected row in block')\n // Maybe answer is to apply ALL the selection status code here, not in Viewport\n if (data[SELECTED]) {\n const previousRow = this.data[internalIndex - 1];\n if (isRowSelectedLast(previousRow)) {\n this.data[internalIndex - 1] = previousRow.slice() as DataSourceRow;\n this.data[internalIndex - 1][SELECTED] -= 4;\n }\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange({ from, to }: VuuRange) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(Math.max(0, to - from));\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n\n getSelectedRows() {\n return this.data.filter((row) => row[SELECTED] !== 0);\n }\n}\n"],"names":["metadataKeys","WindowRange","isRowSelectedLast"],"mappings":"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"}
1
+ {"version":3,"file":"moving-window.js","sources":["../src/moving-window.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n isRowSelectedLast,\n metadataKeys,\n WindowRange,\n} from \"@vuu-ui/vuu-utils\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\n\nconst { SELECTED } = metadataKeys;\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n #range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.#range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(Math.max(0, to - from));\n this.rowCount = 0;\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.#range.from;\n this.data[internalIndex] = data;\n\n // Hack until we can deal with this more elegantly. When we have a block\n // select operation, first row is selected (and updated via server), then\n // remaining rows are selected when we select the block-end row. We get an\n // update for all rows except first. Because we're extending the select status\n // on the client, we have to adjust the first row selected (its still selected\n // but is no longer the 'last selected row in block')\n // Maybe answer is to apply ALL the selection status code here, not in Viewport\n if (data[SELECTED]) {\n const previousRow = this.data[internalIndex - 1];\n if (isRowSelectedLast(previousRow)) {\n this.data[internalIndex - 1] = previousRow.slice() as DataSourceRow;\n this.data[internalIndex - 1][SELECTED] -= 4;\n }\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.#range.isWithin(index) &&\n this.data[index - this.#range.from] != null\n ? this.data[index - this.#range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.#range.isWithin(index);\n }\n\n setRange({ from, to }: VuuRange) {\n if (from !== this.#range.from || to !== this.#range.to) {\n const [overlapFrom, overlapTo] = this.#range.overlap(from, to);\n const newData = new Array(Math.max(0, to - from));\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.#range.from = from;\n this.#range.to = to;\n }\n }\n\n getSelectedRows() {\n return this.data.filter((row) => row[SELECTED] !== 0);\n }\n\n get range() {\n return this.#range;\n }\n}\n"],"names":["metadataKeys","WindowRange","isRowSelectedLast"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var paginationControlCss = ".vuuPaginationControl {\n padding: 0 var(--salt-spacing-100);\n .saltButton {\n .saltIcon {\n display: block !important;\n }\n }\n}\n";
4
+
5
+ module.exports = paginationControlCss;
6
+ //# sourceMappingURL=PaginationControl.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaginationControl.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var styles = require('@salt-ds/styles');
5
+ var window = require('@salt-ds/window');
6
+ var core = require('@salt-ds/core');
7
+ var cx = require('clsx');
8
+ var usePagination = require('./usePagination.js');
9
+ var PaginationControl$1 = require('./PaginationControl.css.js');
10
+ var react = require('react');
11
+
12
+ const classBase = "vuuPaginationControl";
13
+ const PaginationControl = react.forwardRef(function PaginationControl2({ className, dataSource, ...htmlAttributes }, forwardedRef) {
14
+ const targetWindow = window.useWindow();
15
+ styles.useComponentCssInjection({
16
+ testId: "vuu-table",
17
+ css: PaginationControl$1,
18
+ window: targetWindow
19
+ });
20
+ const { onPageChange, pageCount } = usePagination.usePagination({
21
+ dataSource
22
+ });
23
+ return /* @__PURE__ */ jsxRuntime.jsx(
24
+ "div",
25
+ {
26
+ ...htmlAttributes,
27
+ className: cx(classBase, className),
28
+ ref: forwardedRef,
29
+ children: /* @__PURE__ */ jsxRuntime.jsxs(core.Pagination, { count: pageCount, onPageChange, children: [
30
+ /* @__PURE__ */ jsxRuntime.jsx(core.GoToInput, {}),
31
+ /* @__PURE__ */ jsxRuntime.jsx(core.Paginator, {})
32
+ ] })
33
+ }
34
+ );
35
+ });
36
+
37
+ exports.PaginationControl = PaginationControl;
38
+ //# sourceMappingURL=PaginationControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaginationControl.js","sources":["../../src/pagination/PaginationControl.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { GoToInput, Pagination, Paginator } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { usePagination } from \"./usePagination\";\n\nimport paginationControlCss from \"./PaginationControl.css\";\nimport { HtmlHTMLAttributes, forwardRef } from \"react\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\n\nconst classBase = \"vuuPaginationControl\";\n\nexport interface PaginationControlProps\n extends HtmlHTMLAttributes<HTMLDivElement> {\n dataSource: DataSource;\n}\n\nexport const PaginationControl = forwardRef<\n HTMLDivElement,\n PaginationControlProps\n>(function PaginationControl(\n { className, dataSource, ...htmlAttributes },\n forwardedRef,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-table\",\n css: paginationControlCss,\n window: targetWindow,\n });\n\n const { onPageChange, pageCount } = usePagination({\n dataSource,\n });\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n ref={forwardedRef}\n >\n <Pagination count={pageCount} onPageChange={onPageChange}>\n <GoToInput />\n <Paginator />\n </Pagination>\n </div>\n );\n});\n"],"names":["forwardRef","PaginationControl","useWindow","useComponentCssInjection","paginationControlCss","usePagination","jsx","jsxs","Pagination","GoToInput","Paginator"],"mappings":";;;;;;;;;;;AAUA,MAAM,SAAY,GAAA,sBAAA,CAAA;AAOL,MAAA,iBAAA,GAAoBA,gBAG/B,CAAA,SAASC,kBACT,CAAA,EAAE,WAAW,UAAY,EAAA,GAAG,cAAe,EAAA,EAC3C,YACA,EAAA;AACA,EAAA,MAAM,eAAeC,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,WAAA;AAAA,IACR,GAAK,EAAAC,mBAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,YAAA,EAAc,SAAU,EAAA,GAAIC,2BAAc,CAAA;AAAA,IAChD,UAAA;AAAA,GACD,CAAA,CAAA;AAED,EACE,uBAAAC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,GAAK,EAAA,YAAA;AAAA,MAEL,QAAC,kBAAAC,eAAA,CAAAC,eAAA,EAAA,EAAW,KAAO,EAAA,SAAA,EAAW,YAC5B,EAAA,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAACG,cAAU,EAAA,EAAA,CAAA;AAAA,uCACVC,cAAU,EAAA,EAAA,CAAA;AAAA,OACb,EAAA,CAAA;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+
5
+ const getPageCount = (dataSource) => {
6
+ const { range, size } = dataSource;
7
+ const pageSize = range.to - range.from;
8
+ if (pageSize > 0) {
9
+ return Math.ceil(size / pageSize);
10
+ } else {
11
+ return 0;
12
+ }
13
+ };
14
+ const usePagination = ({ dataSource }) => {
15
+ const [pageCount, setPageCount] = react.useState(getPageCount(dataSource));
16
+ react.useMemo(() => {
17
+ dataSource.on("page-count", (n) => setPageCount(n));
18
+ }, [dataSource]);
19
+ const handlePageChange = react.useCallback(
20
+ (_evt, page) => {
21
+ const { range } = dataSource;
22
+ const pageSize = range.to - range.from;
23
+ const firstRow = pageSize * (page - 1);
24
+ console.log(
25
+ `set range ${JSON.stringify({ from: firstRow, to: firstRow + pageSize })}`
26
+ );
27
+ dataSource.range = { from: firstRow, to: firstRow + pageSize };
28
+ },
29
+ [dataSource]
30
+ );
31
+ return {
32
+ onPageChange: handlePageChange,
33
+ pageCount
34
+ };
35
+ };
36
+
37
+ exports.usePagination = usePagination;
38
+ //# sourceMappingURL=usePagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePagination.js","sources":["../../src/pagination/usePagination.ts"],"sourcesContent":["import { SyntheticEvent, useCallback, useMemo, useState } from \"react\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\n\nexport interface PaginationHookProps {\n dataSource: DataSource;\n}\n\nconst getPageCount = (dataSource: DataSource) => {\n const { range, size } = dataSource;\n const pageSize = range.to - range.from;\n if (pageSize > 0) {\n return Math.ceil(size / pageSize);\n } else {\n return 0;\n }\n};\n\nexport const usePagination = ({ dataSource }: PaginationHookProps) => {\n const [pageCount, setPageCount] = useState<number>(getPageCount(dataSource));\n\n useMemo(() => {\n dataSource.on(\"page-count\", (n: number) => setPageCount(n));\n }, [dataSource]);\n\n const handlePageChange = useCallback(\n (_evt: SyntheticEvent, page: number) => {\n const { range } = dataSource;\n const pageSize = range.to - range.from;\n const firstRow = pageSize * (page - 1);\n console.log(\n `set range ${JSON.stringify({ from: firstRow, to: firstRow + pageSize })}`,\n );\n dataSource.range = { from: firstRow, to: firstRow + pageSize };\n },\n [dataSource],\n );\n\n return {\n onPageChange: handlePageChange,\n pageCount,\n };\n};\n"],"names":["useState","useMemo","useCallback"],"mappings":";;;;AAOA,MAAM,YAAA,GAAe,CAAC,UAA2B,KAAA;AAC/C,EAAM,MAAA,EAAE,KAAO,EAAA,IAAA,EAAS,GAAA,UAAA,CAAA;AACxB,EAAM,MAAA,QAAA,GAAW,KAAM,CAAA,EAAA,GAAK,KAAM,CAAA,IAAA,CAAA;AAClC,EAAA,IAAI,WAAW,CAAG,EAAA;AAChB,IAAO,OAAA,IAAA,CAAK,IAAK,CAAA,IAAA,GAAO,QAAQ,CAAA,CAAA;AAAA,GAC3B,MAAA;AACL,IAAO,OAAA,CAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEO,MAAM,aAAgB,GAAA,CAAC,EAAE,UAAA,EAAsC,KAAA;AACpE,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,IAAIA,cAAiB,CAAA,YAAA,CAAa,UAAU,CAAC,CAAA,CAAA;AAE3E,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAA,UAAA,CAAW,GAAG,YAAc,EAAA,CAAC,CAAc,KAAA,YAAA,CAAa,CAAC,CAAC,CAAA,CAAA;AAAA,GAC5D,EAAG,CAAC,UAAU,CAAC,CAAA,CAAA;AAEf,EAAA,MAAM,gBAAmB,GAAAC,iBAAA;AAAA,IACvB,CAAC,MAAsB,IAAiB,KAAA;AACtC,MAAM,MAAA,EAAE,OAAU,GAAA,UAAA,CAAA;AAClB,MAAM,MAAA,QAAA,GAAW,KAAM,CAAA,EAAA,GAAK,KAAM,CAAA,IAAA,CAAA;AAClC,MAAM,MAAA,QAAA,GAAW,YAAY,IAAO,GAAA,CAAA,CAAA,CAAA;AACpC,MAAQ,OAAA,CAAA,GAAA;AAAA,QACN,CAAA,UAAA,EAAa,IAAK,CAAA,SAAA,CAAU,EAAE,IAAA,EAAM,UAAU,EAAI,EAAA,QAAA,GAAW,QAAS,EAAC,CAAC,CAAA,CAAA;AAAA,OAC1E,CAAA;AACA,MAAA,UAAA,CAAW,QAAQ,EAAE,IAAA,EAAM,QAAU,EAAA,EAAA,EAAI,WAAW,QAAS,EAAA,CAAA;AAAA,KAC/D;AAAA,IACA,CAAC,UAAU,CAAA;AAAA,GACb,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,YAAc,EAAA,gBAAA;AAAA,IACd,SAAA;AAAA,GACF,CAAA;AACF;;;;"}
@@ -4,6 +4,7 @@ var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
4
4
  var vuuUtils = require('@vuu-ui/vuu-utils');
5
5
  var react = require('react');
6
6
 
7
+ const isRowSelectionKey = (key) => key === "Enter" || key === " ";
7
8
  const useControlledTableNavigation = (initialValue, rowCount) => {
8
9
  const tableRef = react.useRef(null);
9
10
  const [highlightedIndexRef, setHighlightedIndex] = vuuUiControls.useStateRef(initialValue);
@@ -13,7 +14,7 @@ const useControlledTableNavigation = (initialValue, rowCount) => {
13
14
  setHighlightedIndex((index = -1) => Math.min(rowCount - 1, index + 1));
14
15
  } else if (e.key === "ArrowUp") {
15
16
  setHighlightedIndex((index = -1) => Math.max(0, index - 1));
16
- } else if (e.key === "Enter" || e.key === " ") {
17
+ } else if (isRowSelectionKey(e.key)) {
17
18
  const { current: rowIdx } = highlightedIndexRef;
18
19
  if (typeof rowIdx === "number") {
19
20
  const rowEl = tableRef.current?.querySelector(
@@ -41,5 +42,6 @@ const useControlledTableNavigation = (initialValue, rowCount) => {
41
42
  };
42
43
  };
43
44
 
45
+ exports.isRowSelectionKey = isRowSelectionKey;
44
46
  exports.useControlledTableNavigation = useControlledTableNavigation;
45
47
  //# sourceMappingURL=useControlledTableNavigation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useControlledTableNavigation.js","sources":["../src/useControlledTableNavigation.ts"],"sourcesContent":["import { useStateRef } from \"@vuu-ui/vuu-ui-controls\";\nimport { dispatchMouseEvent } from \"@vuu-ui/vuu-utils\";\nimport { KeyboardEventHandler, useCallback, useRef } from \"react\";\n\nexport const useControlledTableNavigation = (\n initialValue: number,\n rowCount: number,\n) => {\n const tableRef = useRef<HTMLDivElement>(null);\n\n const [highlightedIndexRef, setHighlightedIndex] = useStateRef<\n number | undefined\n >(initialValue);\n\n const handleKeyDown = useCallback<KeyboardEventHandler>(\n (e) => {\n if (e.key === \"ArrowDown\") {\n setHighlightedIndex((index = -1) => Math.min(rowCount - 1, index + 1));\n } else if (e.key === \"ArrowUp\") {\n setHighlightedIndex((index = -1) => Math.max(0, index - 1));\n } else if (e.key === \"Enter\" || e.key === \" \") {\n const { current: rowIdx } = highlightedIndexRef;\n // induce an onSelect event by 'clicking' the row\n if (typeof rowIdx === \"number\") {\n const rowEl = tableRef.current?.querySelector(\n `[aria-rowindex=\"${rowIdx + 1}\"]`,\n ) as HTMLElement;\n if (rowEl) {\n dispatchMouseEvent(rowEl, \"click\");\n }\n }\n }\n },\n [highlightedIndexRef, rowCount, setHighlightedIndex],\n );\n\n const handleHighlight = useCallback(\n (idx: number) => {\n setHighlightedIndex(idx);\n },\n [setHighlightedIndex],\n );\n\n return {\n highlightedIndexRef,\n onHighlight: handleHighlight,\n onKeyDown: handleKeyDown,\n tableRef,\n };\n};\n"],"names":["useRef","useStateRef","useCallback","dispatchMouseEvent"],"mappings":";;;;;;AAIa,MAAA,4BAAA,GAA+B,CAC1C,YAAA,EACA,QACG,KAAA;AACH,EAAM,MAAA,QAAA,GAAWA,aAAuB,IAAI,CAAA,CAAA;AAE5C,EAAA,MAAM,CAAC,mBAAA,EAAqB,mBAAmB,CAAA,GAAIC,0BAEjD,YAAY,CAAA,CAAA;AAEd,EAAA,MAAM,aAAgB,GAAAC,iBAAA;AAAA,IACpB,CAAC,CAAM,KAAA;AACL,MAAI,IAAA,CAAA,CAAE,QAAQ,WAAa,EAAA;AACzB,QAAoB,mBAAA,CAAA,CAAC,QAAQ,CAAO,CAAA,KAAA,IAAA,CAAK,IAAI,QAAW,GAAA,CAAA,EAAG,KAAQ,GAAA,CAAC,CAAC,CAAA,CAAA;AAAA,OACvE,MAAA,IAAW,CAAE,CAAA,GAAA,KAAQ,SAAW,EAAA;AAC9B,QAAoB,mBAAA,CAAA,CAAC,QAAQ,CAAO,CAAA,KAAA,IAAA,CAAK,IAAI,CAAG,EAAA,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,iBACjD,CAAE,CAAA,GAAA,KAAQ,OAAW,IAAA,CAAA,CAAE,QAAQ,GAAK,EAAA;AAC7C,QAAM,MAAA,EAAE,OAAS,EAAA,MAAA,EAAW,GAAA,mBAAA,CAAA;AAE5B,QAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,UAAM,MAAA,KAAA,GAAQ,SAAS,OAAS,EAAA,aAAA;AAAA,YAC9B,CAAA,gBAAA,EAAmB,SAAS,CAAC,CAAA,EAAA,CAAA;AAAA,WAC/B,CAAA;AACA,UAAA,IAAI,KAAO,EAAA;AACT,YAAAC,2BAAA,CAAmB,OAAO,OAAO,CAAA,CAAA;AAAA,WACnC;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,mBAAqB,EAAA,QAAA,EAAU,mBAAmB,CAAA;AAAA,GACrD,CAAA;AAEA,EAAA,MAAM,eAAkB,GAAAD,iBAAA;AAAA,IACtB,CAAC,GAAgB,KAAA;AACf,MAAA,mBAAA,CAAoB,GAAG,CAAA,CAAA;AAAA,KACzB;AAAA,IACA,CAAC,mBAAmB,CAAA;AAAA,GACtB,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,mBAAA;AAAA,IACA,WAAa,EAAA,eAAA;AAAA,IACb,SAAW,EAAA,aAAA;AAAA,IACX,QAAA;AAAA,GACF,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"useControlledTableNavigation.js","sources":["../src/useControlledTableNavigation.ts"],"sourcesContent":["import { useStateRef } from \"@vuu-ui/vuu-ui-controls\";\nimport { dispatchMouseEvent } from \"@vuu-ui/vuu-utils\";\nimport { KeyboardEventHandler, useCallback, useRef } from \"react\";\n\nexport const isRowSelectionKey = (key: string) =>\n key === \"Enter\" || key === \" \";\n\nexport const useControlledTableNavigation = (\n initialValue: number,\n rowCount: number,\n) => {\n const tableRef = useRef<HTMLDivElement>(null);\n\n const [highlightedIndexRef, setHighlightedIndex] = useStateRef<\n number | undefined\n >(initialValue);\n\n const handleKeyDown = useCallback<KeyboardEventHandler>(\n (e) => {\n if (e.key === \"ArrowDown\") {\n setHighlightedIndex((index = -1) => Math.min(rowCount - 1, index + 1));\n } else if (e.key === \"ArrowUp\") {\n setHighlightedIndex((index = -1) => Math.max(0, index - 1));\n } else if (isRowSelectionKey(e.key)) {\n const { current: rowIdx } = highlightedIndexRef;\n // induce an onSelect event by 'clicking' the row\n if (typeof rowIdx === \"number\") {\n const rowEl = tableRef.current?.querySelector(\n `[aria-rowindex=\"${rowIdx + 1}\"]`,\n ) as HTMLElement;\n if (rowEl) {\n dispatchMouseEvent(rowEl, \"click\");\n }\n }\n }\n },\n [highlightedIndexRef, rowCount, setHighlightedIndex],\n );\n\n const handleHighlight = useCallback(\n (idx: number) => {\n setHighlightedIndex(idx);\n },\n [setHighlightedIndex],\n );\n\n return {\n highlightedIndexRef,\n onHighlight: handleHighlight,\n onKeyDown: handleKeyDown,\n tableRef,\n };\n};\n"],"names":["useRef","useStateRef","useCallback","dispatchMouseEvent"],"mappings":";;;;;;AAIO,MAAM,iBAAoB,GAAA,CAAC,GAChC,KAAA,GAAA,KAAQ,WAAW,GAAQ,KAAA,IAAA;AAEhB,MAAA,4BAAA,GAA+B,CAC1C,YAAA,EACA,QACG,KAAA;AACH,EAAM,MAAA,QAAA,GAAWA,aAAuB,IAAI,CAAA,CAAA;AAE5C,EAAA,MAAM,CAAC,mBAAA,EAAqB,mBAAmB,CAAA,GAAIC,0BAEjD,YAAY,CAAA,CAAA;AAEd,EAAA,MAAM,aAAgB,GAAAC,iBAAA;AAAA,IACpB,CAAC,CAAM,KAAA;AACL,MAAI,IAAA,CAAA,CAAE,QAAQ,WAAa,EAAA;AACzB,QAAoB,mBAAA,CAAA,CAAC,QAAQ,CAAO,CAAA,KAAA,IAAA,CAAK,IAAI,QAAW,GAAA,CAAA,EAAG,KAAQ,GAAA,CAAC,CAAC,CAAA,CAAA;AAAA,OACvE,MAAA,IAAW,CAAE,CAAA,GAAA,KAAQ,SAAW,EAAA;AAC9B,QAAoB,mBAAA,CAAA,CAAC,QAAQ,CAAO,CAAA,KAAA,IAAA,CAAK,IAAI,CAAG,EAAA,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,OACjD,MAAA,IAAA,iBAAA,CAAkB,CAAE,CAAA,GAAG,CAAG,EAAA;AACnC,QAAM,MAAA,EAAE,OAAS,EAAA,MAAA,EAAW,GAAA,mBAAA,CAAA;AAE5B,QAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,UAAM,MAAA,KAAA,GAAQ,SAAS,OAAS,EAAA,aAAA;AAAA,YAC9B,CAAA,gBAAA,EAAmB,SAAS,CAAC,CAAA,EAAA,CAAA;AAAA,WAC/B,CAAA;AACA,UAAA,IAAI,KAAO,EAAA;AACT,YAAAC,2BAAA,CAAmB,OAAO,OAAO,CAAA,CAAA;AAAA,WACnC;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,mBAAqB,EAAA,QAAA,EAAU,mBAAmB,CAAA;AAAA,GACrD,CAAA;AAEA,EAAA,MAAM,eAAkB,GAAAD,iBAAA;AAAA,IACtB,CAAC,GAAgB,KAAA;AACf,MAAA,mBAAA,CAAoB,GAAG,CAAA,CAAA;AAAA,KACzB;AAAA,IACA,CAAC,mBAAmB,CAAA;AAAA,GACtB,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,mBAAA;AAAA,IACA,WAAa,EAAA,eAAA;AAAA,IACb,SAAW,EAAA,aAAA;AAAA,IACX,QAAA;AAAA,GACF,CAAA;AACF;;;;;"}