@vuu-ui/vuu-table 0.0.26

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 (260) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +0 -0
  3. package/cjs/Row.css.js +6 -0
  4. package/cjs/Row.css.js.map +1 -0
  5. package/cjs/Row.js +130 -0
  6. package/cjs/Row.js.map +1 -0
  7. package/cjs/Table.css.js +6 -0
  8. package/cjs/Table.css.js.map +1 -0
  9. package/cjs/Table.js +285 -0
  10. package/cjs/Table.js.map +1 -0
  11. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js +6 -0
  12. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  13. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +42 -0
  14. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
  15. package/cjs/cell-renderers/input-cell/InputCell.css.js +6 -0
  16. package/cjs/cell-renderers/input-cell/InputCell.css.js.map +1 -0
  17. package/cjs/cell-renderers/input-cell/InputCell.js +58 -0
  18. package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -0
  19. package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js +6 -0
  20. package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
  21. package/cjs/cell-renderers/toggle-cell/ToggleCell.js +68 -0
  22. package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
  23. package/cjs/column-header-pill/ColumnHeaderPill.css.js +6 -0
  24. package/cjs/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
  25. package/cjs/column-header-pill/ColumnHeaderPill.js +53 -0
  26. package/cjs/column-header-pill/ColumnHeaderPill.js.map +1 -0
  27. package/cjs/column-header-pill/GroupColumnPill.css.js +6 -0
  28. package/cjs/column-header-pill/GroupColumnPill.css.js.map +1 -0
  29. package/cjs/column-header-pill/GroupColumnPill.js +29 -0
  30. package/cjs/column-header-pill/GroupColumnPill.js.map +1 -0
  31. package/cjs/column-header-pill/SortIndicator.css.js +6 -0
  32. package/cjs/column-header-pill/SortIndicator.css.js.map +1 -0
  33. package/cjs/column-header-pill/SortIndicator.js +27 -0
  34. package/cjs/column-header-pill/SortIndicator.js.map +1 -0
  35. package/cjs/column-menu/ColumnMenu.css.js +6 -0
  36. package/cjs/column-menu/ColumnMenu.css.js.map +1 -0
  37. package/cjs/column-menu/ColumnMenu.js +30 -0
  38. package/cjs/column-menu/ColumnMenu.js.map +1 -0
  39. package/cjs/column-resizing/ColumnResizer.css.js +6 -0
  40. package/cjs/column-resizing/ColumnResizer.css.js.map +1 -0
  41. package/cjs/column-resizing/ColumnResizer.js +72 -0
  42. package/cjs/column-resizing/ColumnResizer.js.map +1 -0
  43. package/cjs/column-resizing/useTableColumnResize.js +55 -0
  44. package/cjs/column-resizing/useTableColumnResize.js.map +1 -0
  45. package/cjs/context-menu/buildContextMenuDescriptors.js +214 -0
  46. package/cjs/context-menu/buildContextMenuDescriptors.js.map +1 -0
  47. package/cjs/context-menu/useHandleTableContextMenu.js +81 -0
  48. package/cjs/context-menu/useHandleTableContextMenu.js.map +1 -0
  49. package/cjs/header-cell/GroupHeaderCell.css.js +6 -0
  50. package/cjs/header-cell/GroupHeaderCell.css.js.map +1 -0
  51. package/cjs/header-cell/GroupHeaderCell.js +117 -0
  52. package/cjs/header-cell/GroupHeaderCell.js.map +1 -0
  53. package/cjs/header-cell/HeaderCell.css.js +6 -0
  54. package/cjs/header-cell/HeaderCell.css.js.map +1 -0
  55. package/cjs/header-cell/HeaderCell.js +109 -0
  56. package/cjs/header-cell/HeaderCell.js.map +1 -0
  57. package/cjs/index.js +36 -0
  58. package/cjs/index.js.map +1 -0
  59. package/cjs/moving-window.js +61 -0
  60. package/cjs/moving-window.js.map +1 -0
  61. package/cjs/table-cell/TableCell.css.js +6 -0
  62. package/cjs/table-cell/TableCell.css.js.map +1 -0
  63. package/cjs/table-cell/TableCell.js +72 -0
  64. package/cjs/table-cell/TableCell.js.map +1 -0
  65. package/cjs/table-cell/TableGroupCell.css.js +6 -0
  66. package/cjs/table-cell/TableGroupCell.css.js.map +1 -0
  67. package/cjs/table-cell/TableGroupCell.js +54 -0
  68. package/cjs/table-cell/TableGroupCell.js.map +1 -0
  69. package/cjs/table-config.js +25 -0
  70. package/cjs/table-config.js.map +1 -0
  71. package/cjs/table-dom-utils.js +60 -0
  72. package/cjs/table-dom-utils.js.map +1 -0
  73. package/cjs/table-header/TableHeader.js +87 -0
  74. package/cjs/table-header/TableHeader.js.map +1 -0
  75. package/cjs/table-header/useTableHeader.js +72 -0
  76. package/cjs/table-header/useTableHeader.js.map +1 -0
  77. package/cjs/useCell.js +28 -0
  78. package/cjs/useCell.js.map +1 -0
  79. package/cjs/useCellEditing.js +79 -0
  80. package/cjs/useCellEditing.js.map +1 -0
  81. package/cjs/useControlledTableNavigation.js +43 -0
  82. package/cjs/useControlledTableNavigation.js.map +1 -0
  83. package/cjs/useDataSource.js +104 -0
  84. package/cjs/useDataSource.js.map +1 -0
  85. package/cjs/useInitialValue.js +11 -0
  86. package/cjs/useInitialValue.js.map +1 -0
  87. package/cjs/useKeyboardNavigation.js +304 -0
  88. package/cjs/useKeyboardNavigation.js.map +1 -0
  89. package/cjs/useRowClassNameGenerators.js +34 -0
  90. package/cjs/useRowClassNameGenerators.js.map +1 -0
  91. package/cjs/useRowHeight.js +43 -0
  92. package/cjs/useRowHeight.js.map +1 -0
  93. package/cjs/useSelection.js +64 -0
  94. package/cjs/useSelection.js.map +1 -0
  95. package/cjs/useTable.js +553 -0
  96. package/cjs/useTable.js.map +1 -0
  97. package/cjs/useTableAndColumnSettings.js +128 -0
  98. package/cjs/useTableAndColumnSettings.js.map +1 -0
  99. package/cjs/useTableContextMenu.js +42 -0
  100. package/cjs/useTableContextMenu.js.map +1 -0
  101. package/cjs/useTableModel.js +297 -0
  102. package/cjs/useTableModel.js.map +1 -0
  103. package/cjs/useTableScroll.js +396 -0
  104. package/cjs/useTableScroll.js.map +1 -0
  105. package/cjs/useTableViewport.js +122 -0
  106. package/cjs/useTableViewport.js.map +1 -0
  107. package/esm/Row.css.js +4 -0
  108. package/esm/Row.css.js.map +1 -0
  109. package/esm/Row.js +127 -0
  110. package/esm/Row.js.map +1 -0
  111. package/esm/Table.css.js +4 -0
  112. package/esm/Table.css.js.map +1 -0
  113. package/esm/Table.js +283 -0
  114. package/esm/Table.js.map +1 -0
  115. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js +4 -0
  116. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  117. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +40 -0
  118. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
  119. package/esm/cell-renderers/input-cell/InputCell.css.js +4 -0
  120. package/esm/cell-renderers/input-cell/InputCell.css.js.map +1 -0
  121. package/esm/cell-renderers/input-cell/InputCell.js +56 -0
  122. package/esm/cell-renderers/input-cell/InputCell.js.map +1 -0
  123. package/esm/cell-renderers/toggle-cell/ToggleCell.css.js +4 -0
  124. package/esm/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
  125. package/esm/cell-renderers/toggle-cell/ToggleCell.js +66 -0
  126. package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
  127. package/esm/column-header-pill/ColumnHeaderPill.css.js +4 -0
  128. package/esm/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
  129. package/esm/column-header-pill/ColumnHeaderPill.js +51 -0
  130. package/esm/column-header-pill/ColumnHeaderPill.js.map +1 -0
  131. package/esm/column-header-pill/GroupColumnPill.css.js +4 -0
  132. package/esm/column-header-pill/GroupColumnPill.css.js.map +1 -0
  133. package/esm/column-header-pill/GroupColumnPill.js +27 -0
  134. package/esm/column-header-pill/GroupColumnPill.js.map +1 -0
  135. package/esm/column-header-pill/SortIndicator.css.js +4 -0
  136. package/esm/column-header-pill/SortIndicator.css.js.map +1 -0
  137. package/esm/column-header-pill/SortIndicator.js +25 -0
  138. package/esm/column-header-pill/SortIndicator.js.map +1 -0
  139. package/esm/column-menu/ColumnMenu.css.js +4 -0
  140. package/esm/column-menu/ColumnMenu.css.js.map +1 -0
  141. package/esm/column-menu/ColumnMenu.js +28 -0
  142. package/esm/column-menu/ColumnMenu.js.map +1 -0
  143. package/esm/column-resizing/ColumnResizer.css.js +4 -0
  144. package/esm/column-resizing/ColumnResizer.css.js.map +1 -0
  145. package/esm/column-resizing/ColumnResizer.js +70 -0
  146. package/esm/column-resizing/ColumnResizer.js.map +1 -0
  147. package/esm/column-resizing/useTableColumnResize.js +53 -0
  148. package/esm/column-resizing/useTableColumnResize.js.map +1 -0
  149. package/esm/context-menu/buildContextMenuDescriptors.js +212 -0
  150. package/esm/context-menu/buildContextMenuDescriptors.js.map +1 -0
  151. package/esm/context-menu/useHandleTableContextMenu.js +79 -0
  152. package/esm/context-menu/useHandleTableContextMenu.js.map +1 -0
  153. package/esm/header-cell/GroupHeaderCell.css.js +4 -0
  154. package/esm/header-cell/GroupHeaderCell.css.js.map +1 -0
  155. package/esm/header-cell/GroupHeaderCell.js +115 -0
  156. package/esm/header-cell/GroupHeaderCell.js.map +1 -0
  157. package/esm/header-cell/HeaderCell.css.js +4 -0
  158. package/esm/header-cell/HeaderCell.css.js.map +1 -0
  159. package/esm/header-cell/HeaderCell.js +107 -0
  160. package/esm/header-cell/HeaderCell.js.map +1 -0
  161. package/esm/index.js +14 -0
  162. package/esm/index.js.map +1 -0
  163. package/esm/moving-window.js +59 -0
  164. package/esm/moving-window.js.map +1 -0
  165. package/esm/table-cell/TableCell.css.js +4 -0
  166. package/esm/table-cell/TableCell.css.js.map +1 -0
  167. package/esm/table-cell/TableCell.js +70 -0
  168. package/esm/table-cell/TableCell.js.map +1 -0
  169. package/esm/table-cell/TableGroupCell.css.js +4 -0
  170. package/esm/table-cell/TableGroupCell.css.js.map +1 -0
  171. package/esm/table-cell/TableGroupCell.js +52 -0
  172. package/esm/table-cell/TableGroupCell.js.map +1 -0
  173. package/esm/table-config.js +23 -0
  174. package/esm/table-config.js.map +1 -0
  175. package/esm/table-dom-utils.js +51 -0
  176. package/esm/table-dom-utils.js.map +1 -0
  177. package/esm/table-header/TableHeader.js +85 -0
  178. package/esm/table-header/TableHeader.js.map +1 -0
  179. package/esm/table-header/useTableHeader.js +70 -0
  180. package/esm/table-header/useTableHeader.js.map +1 -0
  181. package/esm/useCell.js +26 -0
  182. package/esm/useCell.js.map +1 -0
  183. package/esm/useCellEditing.js +77 -0
  184. package/esm/useCellEditing.js.map +1 -0
  185. package/esm/useControlledTableNavigation.js +41 -0
  186. package/esm/useControlledTableNavigation.js.map +1 -0
  187. package/esm/useDataSource.js +101 -0
  188. package/esm/useDataSource.js.map +1 -0
  189. package/esm/useInitialValue.js +9 -0
  190. package/esm/useInitialValue.js.map +1 -0
  191. package/esm/useKeyboardNavigation.js +300 -0
  192. package/esm/useKeyboardNavigation.js.map +1 -0
  193. package/esm/useRowClassNameGenerators.js +32 -0
  194. package/esm/useRowClassNameGenerators.js.map +1 -0
  195. package/esm/useRowHeight.js +41 -0
  196. package/esm/useRowHeight.js.map +1 -0
  197. package/esm/useSelection.js +62 -0
  198. package/esm/useSelection.js.map +1 -0
  199. package/esm/useTable.js +551 -0
  200. package/esm/useTable.js.map +1 -0
  201. package/esm/useTableAndColumnSettings.js +126 -0
  202. package/esm/useTableAndColumnSettings.js.map +1 -0
  203. package/esm/useTableContextMenu.js +40 -0
  204. package/esm/useTableContextMenu.js.map +1 -0
  205. package/esm/useTableModel.js +293 -0
  206. package/esm/useTableModel.js.map +1 -0
  207. package/esm/useTableScroll.js +393 -0
  208. package/esm/useTableScroll.js.map +1 -0
  209. package/esm/useTableViewport.js +120 -0
  210. package/esm/useTableViewport.js.map +1 -0
  211. package/package.json +42 -0
  212. package/types/Row.d.ts +23 -0
  213. package/types/Table.d.ts +91 -0
  214. package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +3 -0
  215. package/types/cell-renderers/checkbox-cell/index.d.ts +1 -0
  216. package/types/cell-renderers/index.d.ts +3 -0
  217. package/types/cell-renderers/input-cell/InputCell.d.ts +3 -0
  218. package/types/cell-renderers/input-cell/index.d.ts +1 -0
  219. package/types/cell-renderers/toggle-cell/ToggleCell.d.ts +3 -0
  220. package/types/cell-renderers/toggle-cell/index.d.ts +1 -0
  221. package/types/column-header-pill/ColumnHeaderPill.d.ts +8 -0
  222. package/types/column-header-pill/GroupColumnPill.d.ts +7 -0
  223. package/types/column-header-pill/SortIndicator.d.ts +6 -0
  224. package/types/column-header-pill/index.d.ts +3 -0
  225. package/types/column-menu/ColumnMenu.d.ts +6 -0
  226. package/types/column-menu/index.d.ts +1 -0
  227. package/types/column-resizing/ColumnResizer.d.ts +7 -0
  228. package/types/column-resizing/index.d.ts +2 -0
  229. package/types/column-resizing/useTableColumnResize.d.ts +15 -0
  230. package/types/context-menu/buildContextMenuDescriptors.d.ts +3 -0
  231. package/types/context-menu/index.d.ts +2 -0
  232. package/types/context-menu/useHandleTableContextMenu.d.ts +20 -0
  233. package/types/header-cell/GroupHeaderCell.d.ts +8 -0
  234. package/types/header-cell/HeaderCell.d.ts +3 -0
  235. package/types/header-cell/index.d.ts +2 -0
  236. package/types/index.d.ts +11 -0
  237. package/types/moving-window.d.ts +14 -0
  238. package/types/table-cell/TableCell.d.ts +3 -0
  239. package/types/table-cell/TableGroupCell.d.ts +3 -0
  240. package/types/table-cell/index.d.ts +2 -0
  241. package/types/table-config.d.ts +25 -0
  242. package/types/table-dom-utils.d.ts +14 -0
  243. package/types/table-header/TableHeader.d.ts +19 -0
  244. package/types/table-header/useTableHeader.d.ts +15 -0
  245. package/types/useCell.d.ts +6 -0
  246. package/types/useCellEditing.d.ts +10 -0
  247. package/types/useControlledTableNavigation.d.ts +7 -0
  248. package/types/useDataSource.d.ts +20 -0
  249. package/types/useInitialValue.d.ts +1 -0
  250. package/types/useKeyboardNavigation.d.ts +36 -0
  251. package/types/useResizeObserver.d.ts +15 -0
  252. package/types/useRowClassNameGenerators.d.ts +3 -0
  253. package/types/useRowHeight.d.ts +8 -0
  254. package/types/useSelection.d.ts +14 -0
  255. package/types/useTable.d.ts +71 -0
  256. package/types/useTableAndColumnSettings.d.ts +15 -0
  257. package/types/useTableContextMenu.d.ts +10 -0
  258. package/types/useTableModel.d.ts +103 -0
  259. package/types/useTableScroll.d.ts +57 -0
  260. package/types/useTableViewport.d.ts +41 -0
@@ -0,0 +1,52 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { getGroupValueAndOffset, metadataKeys } from '@vuu-ui/vuu-utils';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import { useCallback } from 'react';
6
+ import { useCell } from '../useCell.js';
7
+ import cx from 'clsx';
8
+ import tableGroupCellCss from './TableGroupCell.css.js';
9
+
10
+ const { IS_LEAF } = metadataKeys;
11
+ const classBase = "vuuTableGroupCell";
12
+ const TableGroupCell = ({
13
+ column,
14
+ columnMap,
15
+ onClick,
16
+ row
17
+ }) => {
18
+ const targetWindow = useWindow();
19
+ useComponentCssInjection({
20
+ testId: "vuu-table-group-cell",
21
+ css: tableGroupCellCss,
22
+ window: targetWindow
23
+ });
24
+ const { columns } = column;
25
+ const [value, offset] = getGroupValueAndOffset(columns, row, columnMap);
26
+ const { className, style } = useCell(column, classBase);
27
+ const handleClick = useCallback(
28
+ (evt) => {
29
+ onClick?.(evt, column);
30
+ },
31
+ [column, onClick]
32
+ );
33
+ const isLeaf = row[IS_LEAF];
34
+ const spacers = Array(offset).fill(0).map((n, i) => /* @__PURE__ */ jsx("span", { className: `${classBase}-spacer` }, i));
35
+ return /* @__PURE__ */ jsxs(
36
+ "div",
37
+ {
38
+ className: cx(className, "vuuTableCell"),
39
+ role: "cell",
40
+ style,
41
+ onClick: isLeaf ? void 0 : handleClick,
42
+ children: [
43
+ spacers,
44
+ isLeaf ? null : /* @__PURE__ */ jsx("span", { className: `${classBase}-toggle`, "data-icon": "triangle-right" }),
45
+ /* @__PURE__ */ jsx("span", { children: value })
46
+ ]
47
+ }
48
+ );
49
+ };
50
+
51
+ export { TableGroupCell };
52
+ //# sourceMappingURL=TableGroupCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableGroupCell.js","sources":["../../src/table-cell/TableGroupCell.tsx"],"sourcesContent":["import { GroupColumnDescriptor, TableCellProps } from \"@vuu-ui/vuu-table-types\";\nimport { getGroupValueAndOffset, metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { MouseEvent, useCallback } from \"react\";\nimport { useCell } from \"../useCell\";\nimport cx from \"clsx\";\n\nimport tableGroupCellCss from \"./TableGroupCell.css\";\n\nconst { IS_LEAF } = metadataKeys;\n\nconst classBase = \"vuuTableGroupCell\";\n\nexport const TableGroupCell = ({\n column,\n columnMap,\n onClick,\n row,\n}: TableCellProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-table-group-cell\",\n css: tableGroupCellCss,\n window: targetWindow,\n });\n\n const { columns } = column as GroupColumnDescriptor;\n const [value, offset] = getGroupValueAndOffset(columns, row, columnMap);\n const { className, style } = useCell(column, classBase);\n\n const handleClick = useCallback(\n (evt: MouseEvent<HTMLDivElement>) => {\n onClick?.(evt, column);\n },\n [column, onClick]\n );\n\n const isLeaf = row[IS_LEAF];\n const spacers = Array(offset)\n .fill(0)\n .map((n, i) => <span className={`${classBase}-spacer`} key={i} />);\n\n return (\n <div\n className={cx(className, \"vuuTableCell\")}\n role=\"cell\"\n style={style}\n onClick={isLeaf ? undefined : handleClick}\n >\n {spacers}\n {isLeaf ? null : (\n <span className={`${classBase}-toggle`} data-icon=\"triangle-right\" />\n )}\n <span>{value}</span>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAUA,MAAM,EAAE,SAAY,GAAA,YAAA,CAAA;AAEpB,MAAM,SAAY,GAAA,mBAAA,CAAA;AAEX,MAAM,iBAAiB,CAAC;AAAA,EAC7B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AACF,CAAsB,KAAA;AACpB,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,sBAAA;AAAA,IACR,GAAK,EAAA,iBAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,EAAE,SAAY,GAAA,MAAA,CAAA;AACpB,EAAA,MAAM,CAAC,KAAO,EAAA,MAAM,IAAI,sBAAuB,CAAA,OAAA,EAAS,KAAK,SAAS,CAAA,CAAA;AACtE,EAAA,MAAM,EAAE,SAAW,EAAA,KAAA,EAAU,GAAA,OAAA,CAAQ,QAAQ,SAAS,CAAA,CAAA;AAEtD,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,GAAoC,KAAA;AACnC,MAAA,OAAA,GAAU,KAAK,MAAM,CAAA,CAAA;AAAA,KACvB;AAAA,IACA,CAAC,QAAQ,OAAO,CAAA;AAAA,GAClB,CAAA;AAEA,EAAM,MAAA,MAAA,GAAS,IAAI,OAAO,CAAA,CAAA;AAC1B,EAAA,MAAM,UAAU,KAAM,CAAA,MAAM,EACzB,IAAK,CAAA,CAAC,EACN,GAAI,CAAA,CAAC,CAAG,EAAA,CAAA,yBAAO,MAAK,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,OAAA,CAAA,EAAA,EAAgB,CAAG,CAAE,CAAA,CAAA;AAEnE,EACE,uBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,cAAc,CAAA;AAAA,MACvC,IAAK,EAAA,MAAA;AAAA,MACL,KAAA;AAAA,MACA,OAAA,EAAS,SAAS,KAAY,CAAA,GAAA,WAAA;AAAA,MAE7B,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QACA,MAAA,GAAS,uBACP,GAAA,CAAA,MAAA,EAAA,EAAK,WAAW,CAAG,EAAA,SAAS,CAAW,OAAA,CAAA,EAAA,WAAA,EAAU,gBAAiB,EAAA,CAAA;AAAA,wBAErE,GAAA,CAAC,UAAM,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GACf,CAAA;AAEJ;;;;"}
@@ -0,0 +1,23 @@
1
+ const updateTableConfig = (config, action) => {
2
+ switch (action.type) {
3
+ case "col-size":
4
+ return {
5
+ ...config,
6
+ columns: config.columns.map(
7
+ (col) => col.name === action.column.name ? { ...col, width: action.width } : col
8
+ )
9
+ };
10
+ case "column-prop":
11
+ return {
12
+ ...config,
13
+ columns: config.columns.map(
14
+ (col) => col.name === action.column.name ? { ...col, [action.property]: action.value } : col
15
+ )
16
+ };
17
+ default:
18
+ return config;
19
+ }
20
+ };
21
+
22
+ export { updateTableConfig };
23
+ //# sourceMappingURL=table-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-config.js","sources":["../src/table-config.ts"],"sourcesContent":["import { ColumnDescriptor, TableConfig } from \"@vuu-ui/vuu-table-types\";\n\nexport type MoveColumnTableConfigAction = {\n type: \"col-move\";\n column: ColumnDescriptor;\n fromIndex: number;\n toIndex: number;\n};\n\nexport type ResizeColumnTableConfigAction = {\n type: \"col-size\";\n column: ColumnDescriptor;\n width: number;\n};\n\nexport type SubscribeColumnTableConfigAction = {\n type: \"subscribed\";\n column: ColumnDescriptor;\n value: boolean;\n};\n\nexport type UpdateColumnPropertyTableConfigAction = {\n type: \"column-prop\";\n column: ColumnDescriptor;\n property: keyof ColumnDescriptor;\n value: boolean | number | string;\n};\n\nexport type TableConfigAction =\n | MoveColumnTableConfigAction\n | ResizeColumnTableConfigAction\n | UpdateColumnPropertyTableConfigAction;\n\nexport const updateTableConfig = (\n config: TableConfig,\n action: TableConfigAction\n): TableConfig => {\n switch (action.type) {\n case \"col-size\":\n return {\n ...config,\n columns: config.columns.map((col) =>\n col.name === action.column.name\n ? { ...col, width: action.width }\n : col\n ),\n };\n case \"column-prop\":\n return {\n ...config,\n columns: config.columns.map((col) =>\n col.name === action.column.name\n ? { ...col, [action.property]: action.value }\n : col\n ),\n };\n\n default:\n return config;\n }\n};\n"],"names":[],"mappings":"AAiCa,MAAA,iBAAA,GAAoB,CAC/B,MAAA,EACA,MACgB,KAAA;AAChB,EAAA,QAAQ,OAAO,IAAM;AAAA,IACnB,KAAK,UAAA;AACH,MAAO,OAAA;AAAA,QACL,GAAG,MAAA;AAAA,QACH,OAAA,EAAS,OAAO,OAAQ,CAAA,GAAA;AAAA,UAAI,CAAC,GAAA,KAC3B,GAAI,CAAA,IAAA,KAAS,MAAO,CAAA,MAAA,CAAO,IACvB,GAAA,EAAE,GAAG,GAAA,EAAK,KAAO,EAAA,MAAA,CAAO,OACxB,GAAA,GAAA;AAAA,SACN;AAAA,OACF,CAAA;AAAA,IACF,KAAK,aAAA;AACH,MAAO,OAAA;AAAA,QACL,GAAG,MAAA;AAAA,QACH,OAAA,EAAS,OAAO,OAAQ,CAAA,GAAA;AAAA,UAAI,CAAC,GAC3B,KAAA,GAAA,CAAI,IAAS,KAAA,MAAA,CAAO,OAAO,IACvB,GAAA,EAAE,GAAG,GAAA,EAAK,CAAC,MAAO,CAAA,QAAQ,GAAG,MAAA,CAAO,OACpC,GAAA,GAAA;AAAA,SACN;AAAA,OACF,CAAA;AAAA,IAEF;AACE,MAAO,OAAA,MAAA,CAAA;AAAA,GACX;AACF;;;;"}
@@ -0,0 +1,51 @@
1
+ const headerCellQuery = (colIdx) => `.vuuTable-col-headers .vuuTableHeaderCell:nth-child(${colIdx})`;
2
+ const dataCellQuery = (rowIdx, colIdx) => `.vuuTable-body > [aria-rowindex='${rowIdx + 1}'] > [role='cell']:nth-child(${colIdx + 1})`;
3
+ const getTableCell = (containerRef, [rowIdx, colIdx]) => {
4
+ const cssQuery = rowIdx === -1 ? headerCellQuery(colIdx) : dataCellQuery(rowIdx, colIdx);
5
+ const cell = containerRef.current?.querySelector(
6
+ cssQuery
7
+ );
8
+ if (cellIsEditable(cell)) {
9
+ const focusableContent = cell.querySelector("button");
10
+ return focusableContent || cell;
11
+ } else {
12
+ return cell;
13
+ }
14
+ };
15
+ const cellIsEditable = (cell) => cell?.classList.contains("vuuTableCell-editable");
16
+ const cellIsTextInput = (cell) => cell.querySelector(".vuuTableInputCell") !== null;
17
+ function getRowIndex(rowEl) {
18
+ if (rowEl) {
19
+ const idx = rowEl.ariaRowIndex;
20
+ if (idx !== null) {
21
+ return parseInt(idx, 10) - 1;
22
+ }
23
+ }
24
+ return -1;
25
+ }
26
+ const closestRow = (el) => el.closest('[role="row"]');
27
+ const closestRowIndex = (el) => getRowIndex(closestRow(el));
28
+ const NO_SCROLL_NECESSARY = [void 0, void 0];
29
+ const howFarIsRowOutsideViewport = (rowEl, totalHeaderHeight, contentContainer = rowEl.closest(".vuuTable-contentContainer")) => {
30
+ if (contentContainer) {
31
+ const viewport = contentContainer?.getBoundingClientRect();
32
+ const upperBoundary = viewport.top + totalHeaderHeight;
33
+ const row = rowEl.getBoundingClientRect();
34
+ if (row) {
35
+ if (row.bottom > viewport.bottom) {
36
+ return ["down", row.bottom - viewport.bottom];
37
+ } else if (row.top < upperBoundary) {
38
+ return ["up", row.top - upperBoundary];
39
+ } else {
40
+ return NO_SCROLL_NECESSARY;
41
+ }
42
+ } else {
43
+ throw Error("Whats going on, row not found");
44
+ }
45
+ } else {
46
+ throw Error("Whats going on, scrollbar container not found");
47
+ }
48
+ };
49
+
50
+ export { cellIsEditable, cellIsTextInput, closestRowIndex, dataCellQuery, getRowIndex, getTableCell, headerCellQuery, howFarIsRowOutsideViewport };
51
+ //# sourceMappingURL=table-dom-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-dom-utils.js","sources":["../src/table-dom-utils.ts"],"sourcesContent":["import { RefObject } from \"react\";\nimport { ScrollDirection } from \"./useTableScroll\";\n\n/**\n * [rowIndex, colIndex\n */\nexport type CellPos = [number, number];\n\nexport const headerCellQuery = (colIdx: number) =>\n `.vuuTable-col-headers .vuuTableHeaderCell:nth-child(${colIdx})`;\n\nexport const dataCellQuery = (rowIdx: number, colIdx: number) =>\n `.vuuTable-body > [aria-rowindex='${rowIdx + 1}'] > [role='cell']:nth-child(${\n colIdx + 1\n })`;\n\nexport const getTableCell = (\n containerRef: RefObject<HTMLElement>,\n\n [rowIdx, colIdx]: CellPos\n) => {\n const cssQuery =\n rowIdx === -1 ? headerCellQuery(colIdx) : dataCellQuery(rowIdx, colIdx);\n const cell = containerRef.current?.querySelector(\n cssQuery\n ) as HTMLTableCellElement;\n\n if (cellIsEditable(cell)) {\n // Dropdown gets focus, Input does not\n const focusableContent = cell.querySelector(\"button\") as HTMLElement;\n return focusableContent || cell;\n } else {\n return cell;\n }\n};\n\nexport const cellIsEditable = (cell: HTMLDivElement | null) =>\n cell?.classList.contains(\"vuuTableCell-editable\");\n\nexport const cellIsTextInput = (cell: HTMLElement) =>\n cell.querySelector(\".vuuTableInputCell\") !== null;\n\nexport function getRowIndex(rowEl?: HTMLElement) {\n if (rowEl) {\n const idx: string | null = rowEl.ariaRowIndex;\n if (idx !== null) {\n return parseInt(idx, 10) - 1;\n }\n }\n return -1;\n}\n\nconst closestRow = (el: HTMLElement) =>\n el.closest('[role=\"row\"]') as HTMLElement;\n\nexport const closestRowIndex = (el: HTMLElement) => getRowIndex(closestRow(el));\n\nconst NO_SCROLL_NECESSARY = [undefined, undefined] as const;\n\nexport const howFarIsRowOutsideViewport = (\n rowEl: HTMLElement,\n totalHeaderHeight: number,\n contentContainer = rowEl.closest(\".vuuTable-contentContainer\")\n): readonly [ScrollDirection | undefined, number | undefined] => {\n //TODO lots of scope for optimisation here\n if (contentContainer) {\n // TODO take totalHeaderHeight into consideration\n const viewport = contentContainer?.getBoundingClientRect();\n const upperBoundary = viewport.top + totalHeaderHeight;\n const row = rowEl.getBoundingClientRect();\n if (row) {\n if (row.bottom > viewport.bottom) {\n return [\"down\", row.bottom - viewport.bottom];\n } else if (row.top < upperBoundary) {\n return [\"up\", row.top - upperBoundary];\n } else {\n return NO_SCROLL_NECESSARY;\n }\n } else {\n throw Error(\"Whats going on, row not found\");\n }\n } else {\n throw Error(\"Whats going on, scrollbar container not found\");\n }\n};\n"],"names":[],"mappings":"AAQO,MAAM,eAAkB,GAAA,CAAC,MAC9B,KAAA,CAAA,oDAAA,EAAuD,MAAM,CAAA,CAAA,EAAA;AAElD,MAAA,aAAA,GAAgB,CAAC,MAAgB,EAAA,MAAA,KAC5C,oCAAoC,MAAS,GAAA,CAAC,CAC5C,6BAAA,EAAA,MAAA,GAAS,CACX,CAAA,CAAA,EAAA;AAEK,MAAM,eAAe,CAC1B,YAAA,EAEA,CAAC,MAAA,EAAQ,MAAM,CACZ,KAAA;AACH,EAAM,MAAA,QAAA,GACJ,WAAW,CAAK,CAAA,GAAA,eAAA,CAAgB,MAAM,CAAI,GAAA,aAAA,CAAc,QAAQ,MAAM,CAAA,CAAA;AACxE,EAAM,MAAA,IAAA,GAAO,aAAa,OAAS,EAAA,aAAA;AAAA,IACjC,QAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,cAAA,CAAe,IAAI,CAAG,EAAA;AAExB,IAAM,MAAA,gBAAA,GAAmB,IAAK,CAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AACpD,IAAA,OAAO,gBAAoB,IAAA,IAAA,CAAA;AAAA,GACtB,MAAA;AACL,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACF,EAAA;AAEO,MAAM,iBAAiB,CAAC,IAAA,KAC7B,IAAM,EAAA,SAAA,CAAU,SAAS,uBAAuB,EAAA;AAE3C,MAAM,kBAAkB,CAAC,IAAA,KAC9B,IAAK,CAAA,aAAA,CAAc,oBAAoB,CAAM,KAAA,KAAA;AAExC,SAAS,YAAY,KAAqB,EAAA;AAC/C,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,MAAM,MAAqB,KAAM,CAAA,YAAA,CAAA;AACjC,IAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,MAAO,OAAA,QAAA,CAAS,GAAK,EAAA,EAAE,CAAI,GAAA,CAAA,CAAA;AAAA,KAC7B;AAAA,GACF;AACA,EAAO,OAAA,CAAA,CAAA,CAAA;AACT,CAAA;AAEA,MAAM,UAAa,GAAA,CAAC,EAClB,KAAA,EAAA,CAAG,QAAQ,cAAc,CAAA,CAAA;AAEpB,MAAM,kBAAkB,CAAC,EAAA,KAAoB,WAAY,CAAA,UAAA,CAAW,EAAE,CAAC,EAAA;AAE9E,MAAM,mBAAA,GAAsB,CAAC,KAAA,CAAA,EAAW,KAAS,CAAA,CAAA,CAAA;AAEpC,MAAA,0BAAA,GAA6B,CACxC,KACA,EAAA,iBAAA,EACA,mBAAmB,KAAM,CAAA,OAAA,CAAQ,4BAA4B,CACE,KAAA;AAE/D,EAAA,IAAI,gBAAkB,EAAA;AAEpB,IAAM,MAAA,QAAA,GAAW,kBAAkB,qBAAsB,EAAA,CAAA;AACzD,IAAM,MAAA,aAAA,GAAgB,SAAS,GAAM,GAAA,iBAAA,CAAA;AACrC,IAAM,MAAA,GAAA,GAAM,MAAM,qBAAsB,EAAA,CAAA;AACxC,IAAA,IAAI,GAAK,EAAA;AACP,MAAI,IAAA,GAAA,CAAI,MAAS,GAAA,QAAA,CAAS,MAAQ,EAAA;AAChC,QAAA,OAAO,CAAC,MAAA,EAAQ,GAAI,CAAA,MAAA,GAAS,SAAS,MAAM,CAAA,CAAA;AAAA,OAC9C,MAAA,IAAW,GAAI,CAAA,GAAA,GAAM,aAAe,EAAA;AAClC,QAAA,OAAO,CAAC,IAAA,EAAM,GAAI,CAAA,GAAA,GAAM,aAAa,CAAA,CAAA;AAAA,OAChC,MAAA;AACL,QAAO,OAAA,mBAAA,CAAA;AAAA,OACT;AAAA,KACK,MAAA;AACL,MAAA,MAAM,MAAM,+BAA+B,CAAA,CAAA;AAAA,KAC7C;AAAA,GACK,MAAA;AACL,IAAA,MAAM,MAAM,+CAA+C,CAAA,CAAA;AAAA,GAC7D;AACF;;;;"}
@@ -0,0 +1,85 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { isNotHidden, isGroupColumn } from '@vuu-ui/vuu-utils';
3
+ import cx from 'clsx';
4
+ import { memo } from 'react';
5
+ import { GroupHeaderCell } from '../header-cell/GroupHeaderCell.js';
6
+ import { HeaderCell } from '../header-cell/HeaderCell.js';
7
+ import { useTableHeader } from './useTableHeader.js';
8
+
9
+ const TableHeader = memo(
10
+ ({
11
+ classBase = "vuuTable",
12
+ columns,
13
+ headings,
14
+ onMoveColumn,
15
+ onMoveGroupColumn,
16
+ onRemoveGroupColumn,
17
+ onResizeColumn,
18
+ onSortColumn,
19
+ showColumnHeaderMenus,
20
+ tableConfig,
21
+ tableId,
22
+ virtualColSpan = 0
23
+ }) => {
24
+ const {
25
+ draggableColumn,
26
+ draggedColumnIndex,
27
+ onClick,
28
+ onMouseDown,
29
+ setContainerRef
30
+ } = useTableHeader({
31
+ columns,
32
+ onMoveColumn,
33
+ onSortColumn,
34
+ tableConfig
35
+ });
36
+ return /* @__PURE__ */ jsxs("div", { className: `${classBase}-col-headings`, ref: setContainerRef, children: [
37
+ headings.map((colHeaders, i) => /* @__PURE__ */ jsx("div", { className: "vuuTable-heading", children: colHeaders.map(({ label, width }, j) => /* @__PURE__ */ jsx("div", { className: "vuuTable-headingCell", style: { width }, children: label }, j)) }, i)),
38
+ /* @__PURE__ */ jsxs("div", { className: `${classBase}-col-headers`, role: "row", children: [
39
+ virtualColSpan > 0 ? /* @__PURE__ */ jsx(
40
+ "div",
41
+ {
42
+ role: "cell",
43
+ className: "vuuTableCell",
44
+ style: { width: virtualColSpan }
45
+ }
46
+ ) : null,
47
+ columns.filter(isNotHidden).map(
48
+ (col, i) => isGroupColumn(col) ? /* @__PURE__ */ jsx(
49
+ GroupHeaderCell,
50
+ {
51
+ "aria-colindex": col.index,
52
+ column: col,
53
+ "data-index": i,
54
+ onMoveColumn: onMoveGroupColumn,
55
+ onRemoveColumn: onRemoveGroupColumn,
56
+ onResize: onResizeColumn
57
+ },
58
+ col.name
59
+ ) : /* @__PURE__ */ jsx(
60
+ HeaderCell,
61
+ {
62
+ "aria-colindex": col.index,
63
+ className: cx({
64
+ "vuuDraggable-dragAway": i === draggedColumnIndex
65
+ }),
66
+ column: col,
67
+ "data-index": i,
68
+ id: `${tableId}-col-${i}`,
69
+ onClick,
70
+ onMouseDown,
71
+ onResize: onResizeColumn,
72
+ showMenu: showColumnHeaderMenus
73
+ },
74
+ col.name
75
+ )
76
+ ),
77
+ draggableColumn
78
+ ] })
79
+ ] });
80
+ }
81
+ );
82
+ TableHeader.displayName = "TableHeader";
83
+
84
+ export { TableHeader };
85
+ //# sourceMappingURL=TableHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableHeader.js","sources":["../../src/table-header/TableHeader.tsx"],"sourcesContent":["import { VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n RuntimeColumnDescriptor,\n TableColumnResizeHandler,\n TableConfig,\n TableHeadings,\n} from \"@vuu-ui/vuu-table-types\";\nimport { isGroupColumn, isNotHidden } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { memo } from \"react\";\nimport { GroupHeaderCell, HeaderCell } from \"../header-cell\";\nimport { useTableHeader } from \"./useTableHeader\";\n\nexport type ColumnSortHandler = (\n column: ColumnDescriptor,\n addToExistingSort: boolean,\n sortType?: VuuSortType\n) => void;\n\nexport interface TableHeaderProps {\n classBase?: string;\n columns: RuntimeColumnDescriptor[];\n headings: TableHeadings;\n onResizeColumn: TableColumnResizeHandler;\n onMoveColumn: (columns: ColumnDescriptor[]) => void;\n onMoveGroupColumn: (columns: ColumnDescriptor[]) => void;\n onRemoveGroupColumn: (column: RuntimeColumnDescriptor) => void;\n onSortColumn: ColumnSortHandler;\n showColumnHeaderMenus: boolean;\n tableConfig: TableConfig;\n tableId: string;\n virtualColSpan?: number;\n}\n\nexport const TableHeader = memo(\n ({\n classBase = \"vuuTable\",\n columns,\n headings,\n onMoveColumn,\n onMoveGroupColumn,\n onRemoveGroupColumn,\n onResizeColumn,\n onSortColumn,\n showColumnHeaderMenus,\n tableConfig,\n tableId,\n virtualColSpan = 0,\n }: TableHeaderProps) => {\n const {\n draggableColumn,\n draggedColumnIndex,\n onClick,\n onMouseDown,\n setContainerRef,\n } = useTableHeader({\n columns,\n onMoveColumn,\n onSortColumn,\n tableConfig,\n });\n\n return (\n <div className={`${classBase}-col-headings`} ref={setContainerRef}>\n {headings.map((colHeaders, i) => (\n <div className=\"vuuTable-heading\" key={i}>\n {colHeaders.map(({ label, width }, j) => (\n <div key={j} className=\"vuuTable-headingCell\" style={{ width }}>\n {label}\n </div>\n ))}\n </div>\n ))}\n <div className={`${classBase}-col-headers`} role=\"row\">\n {virtualColSpan > 0 ? (\n <div\n role=\"cell\"\n className=\"vuuTableCell\"\n style={{ width: virtualColSpan }}\n />\n ) : null}\n {columns.filter(isNotHidden).map((col, i) =>\n isGroupColumn(col) ? (\n <GroupHeaderCell\n aria-colindex={col.index}\n column={col}\n data-index={i}\n key={col.name}\n onMoveColumn={onMoveGroupColumn}\n onRemoveColumn={onRemoveGroupColumn}\n onResize={onResizeColumn}\n />\n ) : (\n <HeaderCell\n aria-colindex={col.index}\n className={cx({\n \"vuuDraggable-dragAway\": i === draggedColumnIndex,\n })}\n column={col}\n data-index={i}\n id={`${tableId}-col-${i}`}\n key={col.name}\n onClick={onClick}\n onMouseDown={onMouseDown}\n onResize={onResizeColumn}\n showMenu={showColumnHeaderMenus}\n />\n )\n )}\n {draggableColumn}\n </div>\n </div>\n );\n }\n);\nTableHeader.displayName = \"TableHeader\";\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { useDragDrop } from '@vuu-ui/vuu-ui-controls';
2
+ import { moveColumnTo, queryClosest, visibleColumnAtIndex } from '@vuu-ui/vuu-utils';
3
+ import { useRef, useCallback } from 'react';
4
+
5
+ const useTableHeader = ({
6
+ columns,
7
+ onMoveColumn,
8
+ onSortColumn,
9
+ tableConfig
10
+ }) => {
11
+ const containerRef = useRef(null);
12
+ const scrollingContainerRef = useRef(null);
13
+ const setContainerRef = useCallback((el) => {
14
+ containerRef.current = el;
15
+ if (el) {
16
+ scrollingContainerRef.current = el.closest(".vuuTable-contentContainer");
17
+ } else {
18
+ scrollingContainerRef.current = null;
19
+ }
20
+ }, []);
21
+ const handleDropColumnHeader = useCallback(
22
+ ({ fromIndex: moveFrom, toIndex: moveTo }) => {
23
+ const column = columns[moveFrom];
24
+ const orderedColumns = moveColumnTo(columns, column, moveTo);
25
+ const ofColumn = ({ name }) => (col) => col.name === name;
26
+ const targetIndex = orderedColumns.findIndex(ofColumn(column));
27
+ const nextColumn = orderedColumns[targetIndex + 1];
28
+ const insertPos = nextColumn ? tableConfig.columns.findIndex(ofColumn(nextColumn)) : -1;
29
+ if (moveTo > moveFrom && insertPos !== -1) {
30
+ onMoveColumn(moveColumnTo(tableConfig.columns, column, insertPos - 1));
31
+ } else {
32
+ onMoveColumn(moveColumnTo(tableConfig.columns, column, insertPos));
33
+ }
34
+ },
35
+ [columns, onMoveColumn, tableConfig.columns]
36
+ );
37
+ const handleColumnHeaderClick = useCallback(
38
+ (evt) => {
39
+ const headerCell = queryClosest(evt.target, ".vuuTableHeaderCell");
40
+ const colIdx = parseInt(headerCell?.dataset.index ?? "-1");
41
+ const column = visibleColumnAtIndex(columns, colIdx);
42
+ const isAdditive = evt.shiftKey;
43
+ column && onSortColumn(column, isAdditive);
44
+ },
45
+ [columns, onSortColumn]
46
+ );
47
+ const {
48
+ onMouseDown: columnHeaderDragMouseDown,
49
+ draggable: draggableColumn,
50
+ ...dragDropHook
51
+ } = useDragDrop({
52
+ allowDragDrop: true,
53
+ containerRef,
54
+ draggableClassName: `vuuTable`,
55
+ itemQuery: ".vuuTableHeaderCell",
56
+ onDrop: handleDropColumnHeader,
57
+ orientation: "horizontal",
58
+ scrollingContainerRef
59
+ });
60
+ return {
61
+ draggableColumn,
62
+ draggedColumnIndex: dragDropHook.draggedItemIndex,
63
+ onClick: handleColumnHeaderClick,
64
+ onMouseDown: columnHeaderDragMouseDown,
65
+ setContainerRef
66
+ };
67
+ };
68
+
69
+ export { useTableHeader };
70
+ //# sourceMappingURL=useTableHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableHeader.js","sources":["../../src/table-header/useTableHeader.ts"],"sourcesContent":["import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n DropOptions,\n useDragDrop as useDragDrop,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport {\n moveColumnTo,\n queryClosest,\n visibleColumnAtIndex,\n} from \"@vuu-ui/vuu-utils\";\nimport { RefCallback, useCallback, useRef } from \"react\";\nimport { TableHeaderProps } from \"./TableHeader\";\n\nexport interface TableHeaderHookProps\n extends Pick<\n TableHeaderProps,\n \"columns\" | \"onMoveColumn\" | \"onSortColumn\" | \"tableConfig\"\n > {\n label?: string;\n onMoveColumn: (columns: ColumnDescriptor[]) => void;\n onSortColumn: (column: ColumnDescriptor, addToExistingSort: boolean) => void;\n}\n\nexport const useTableHeader = ({\n columns,\n onMoveColumn,\n onSortColumn,\n tableConfig,\n}: TableHeaderHookProps) => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const scrollingContainerRef = useRef<HTMLDivElement | null>(null);\n const setContainerRef = useCallback<RefCallback<HTMLDivElement>>((el) => {\n containerRef.current = el;\n if (el) {\n scrollingContainerRef.current = el.closest(\".vuuTable-contentContainer\");\n } else {\n scrollingContainerRef.current = null;\n }\n }, []);\n\n const handleDropColumnHeader = useCallback(\n ({ fromIndex: moveFrom, toIndex: moveTo }: DropOptions) => {\n const column = columns[moveFrom];\n // columns are what get rendered, so these are the columns that\n // the drop operation relates to. We must translate these into\n // columns within the table config. Grouping complicates this\n // as the group columns are not present in columns but ARE in\n // config.columns\n const orderedColumns = moveColumnTo(columns, column, moveTo);\n\n const ofColumn =\n ({ name }: ColumnDescriptor) =>\n (col: ColumnDescriptor) =>\n col.name === name;\n\n const targetIndex = orderedColumns.findIndex(ofColumn(column));\n const nextColumn = orderedColumns[targetIndex + 1];\n const insertPos = nextColumn\n ? tableConfig.columns.findIndex(ofColumn(nextColumn))\n : -1;\n\n if (moveTo > moveFrom && insertPos !== -1) {\n onMoveColumn(moveColumnTo(tableConfig.columns, column, insertPos - 1));\n } else {\n onMoveColumn(moveColumnTo(tableConfig.columns, column, insertPos));\n }\n },\n [columns, onMoveColumn, tableConfig.columns]\n );\n\n const handleColumnHeaderClick = useCallback(\n (evt: React.MouseEvent | React.KeyboardEvent) => {\n const headerCell = queryClosest(evt.target, \".vuuTableHeaderCell\");\n const colIdx = parseInt(headerCell?.dataset.index ?? \"-1\");\n const column = visibleColumnAtIndex(columns, colIdx);\n const isAdditive = evt.shiftKey;\n column && onSortColumn(column, isAdditive);\n },\n [columns, onSortColumn]\n );\n\n // Drag Drop column headers\n const {\n onMouseDown: columnHeaderDragMouseDown,\n draggable: draggableColumn,\n ...dragDropHook\n } = useDragDrop({\n allowDragDrop: true,\n containerRef,\n draggableClassName: `vuuTable`,\n itemQuery: \".vuuTableHeaderCell\",\n onDrop: handleDropColumnHeader,\n orientation: \"horizontal\",\n scrollingContainerRef,\n });\n\n return {\n draggableColumn,\n draggedColumnIndex: dragDropHook.draggedItemIndex,\n onClick: handleColumnHeaderClick,\n onMouseDown: columnHeaderDragMouseDown,\n setContainerRef,\n };\n};\n"],"names":[],"mappings":"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"}
package/esm/useCell.js ADDED
@@ -0,0 +1,26 @@
1
+ import { getColumnStyle } from '@vuu-ui/vuu-utils';
2
+ import cx from 'clsx';
3
+ import { useMemo } from 'react';
4
+
5
+ const useCell = (column, classBase, isHeader) => (
6
+ // TODO measure perf without the memo, might not be worth the cost
7
+ useMemo(() => {
8
+ const className = cx(classBase, {
9
+ vuuPinFloating: column.pin === "floating",
10
+ vuuPinLeft: column.pin === "left",
11
+ vuuPinRight: column.pin === "right",
12
+ vuuEndPin: isHeader && column.endPin,
13
+ // [`${classBase}-resizing`]: column.resizing,
14
+ [`${classBase}-editable`]: column.editable,
15
+ [`${classBase}-right`]: column.align === "right"
16
+ });
17
+ const style = getColumnStyle(column);
18
+ return {
19
+ className,
20
+ style
21
+ };
22
+ }, [column, classBase, isHeader])
23
+ );
24
+
25
+ export { useCell };
26
+ //# sourceMappingURL=useCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCell.js","sources":["../src/useCell.ts"],"sourcesContent":["import { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { getColumnStyle } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { useMemo } from \"react\";\n\nexport const useCell = (\n column: RuntimeColumnDescriptor,\n classBase: string,\n isHeader?: boolean\n) =>\n // TODO measure perf without the memo, might not be worth the cost\n useMemo(() => {\n const className = cx(classBase, {\n vuuPinFloating: column.pin === \"floating\",\n vuuPinLeft: column.pin === \"left\",\n vuuPinRight: column.pin === \"right\",\n vuuEndPin: isHeader && column.endPin,\n // [`${classBase}-resizing`]: column.resizing,\n [`${classBase}-editable`]: column.editable,\n [`${classBase}-right`]: column.align === \"right\",\n });\n\n const style = getColumnStyle(column);\n return {\n className,\n style,\n };\n }, [column, classBase, isHeader]);\n"],"names":[],"mappings":";;;;AAKa,MAAA,OAAA,GAAU,CACrB,MAAA,EACA,SACA,EAAA,QAAA;AAAA;AAAA,EAGA,QAAQ,MAAM;AACZ,IAAM,MAAA,SAAA,GAAY,GAAG,SAAW,EAAA;AAAA,MAC9B,cAAA,EAAgB,OAAO,GAAQ,KAAA,UAAA;AAAA,MAC/B,UAAA,EAAY,OAAO,GAAQ,KAAA,MAAA;AAAA,MAC3B,WAAA,EAAa,OAAO,GAAQ,KAAA,OAAA;AAAA,MAC5B,SAAA,EAAW,YAAY,MAAO,CAAA,MAAA;AAAA;AAAA,MAE9B,CAAC,CAAA,EAAG,SAAS,CAAA,SAAA,CAAW,GAAG,MAAO,CAAA,QAAA;AAAA,MAClC,CAAC,CAAG,EAAA,SAAS,CAAQ,MAAA,CAAA,GAAG,OAAO,KAAU,KAAA,OAAA;AAAA,KAC1C,CAAA,CAAA;AAED,IAAM,MAAA,KAAA,GAAQ,eAAe,MAAM,CAAA,CAAA;AACnC,IAAO,OAAA;AAAA,MACL,SAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACC,EAAA,CAAC,MAAQ,EAAA,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA;;;;"}
@@ -0,0 +1,77 @@
1
+ import { isCharacterKey } from '@vuu-ui/vuu-utils';
2
+ import { useCallback } from 'react';
3
+ import { cellIsTextInput } from './table-dom-utils.js';
4
+
5
+ const useCellEditing = ({ navigate }) => {
6
+ const commitHandler = useCallback(() => {
7
+ navigate();
8
+ }, [navigate]);
9
+ const editInput = useCallback(
10
+ (evt) => {
11
+ const cellEl = evt.target;
12
+ const input = cellEl.matches("input") ? cellEl : cellEl.querySelector("input");
13
+ if (input) {
14
+ input.focus();
15
+ input.select();
16
+ }
17
+ },
18
+ []
19
+ );
20
+ const focusInput = useCallback(
21
+ (evt) => {
22
+ const cellEl = evt.target;
23
+ const input = cellEl.querySelector("input");
24
+ if (input) {
25
+ input.focus();
26
+ input.select();
27
+ }
28
+ },
29
+ []
30
+ );
31
+ const handleKeyDown = useCallback(
32
+ (e) => {
33
+ const el = e.target;
34
+ if (cellIsTextInput(el)) {
35
+ if (isCharacterKey(e.key)) {
36
+ editInput(e);
37
+ } else if (e.key === "Enter") {
38
+ focusInput(e);
39
+ }
40
+ }
41
+ },
42
+ [editInput, focusInput]
43
+ );
44
+ const handleDoubleClick = useCallback(
45
+ (e) => {
46
+ const el = e.target;
47
+ if (el.matches("input") || el.querySelector("input")) {
48
+ editInput(e);
49
+ e.stopPropagation();
50
+ }
51
+ },
52
+ [editInput]
53
+ );
54
+ const handleBlur = useCallback(
55
+ (e) => {
56
+ const el = e.target;
57
+ el.removeEventListener("vuu-commit", commitHandler, true);
58
+ },
59
+ [commitHandler]
60
+ );
61
+ const handleFocus = useCallback(
62
+ (e) => {
63
+ const el = e.target;
64
+ el.addEventListener("vuu-commit", commitHandler, true);
65
+ },
66
+ [commitHandler]
67
+ );
68
+ return {
69
+ onBlur: handleBlur,
70
+ onDoubleClick: handleDoubleClick,
71
+ onFocus: handleFocus,
72
+ onKeyDown: handleKeyDown
73
+ };
74
+ };
75
+
76
+ export { useCellEditing };
77
+ //# sourceMappingURL=useCellEditing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCellEditing.js","sources":["../src/useCellEditing.ts"],"sourcesContent":["import { isCharacterKey } from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEventHandler,\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent,\n useCallback,\n} from \"react\";\nimport { cellIsTextInput } from \"./table-dom-utils\";\n\nexport interface CellEditingHookProps {\n navigate: () => void;\n}\n\nexport const useCellEditing = ({ navigate }: CellEditingHookProps) => {\n const commitHandler = useCallback(() => {\n navigate();\n }, [navigate]);\n\n const editInput = useCallback(\n (evt: MouseEvent<HTMLElement> | ReactKeyboardEvent<HTMLElement>) => {\n const cellEl = evt.target as HTMLDivElement;\n const input = cellEl.matches(\"input\")\n ? (cellEl as HTMLInputElement)\n : cellEl.querySelector(\"input\");\n\n if (input) {\n input.focus();\n input.select();\n }\n },\n []\n );\n\n const focusInput = useCallback(\n (evt: MouseEvent<HTMLElement> | ReactKeyboardEvent<HTMLElement>) => {\n const cellEl = evt.target as HTMLDivElement;\n const input = cellEl.querySelector(\"input\");\n if (input) {\n input.focus();\n input.select();\n }\n },\n []\n );\n\n const handleKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLElement>) => {\n const el = e.target as HTMLElement;\n if (cellIsTextInput(el)) {\n if (isCharacterKey(e.key)) {\n editInput(e);\n } else if (e.key === \"Enter\") {\n focusInput(e);\n }\n }\n },\n [editInput, focusInput]\n );\n\n const handleDoubleClick = useCallback(\n (e: MouseEvent<HTMLElement>) => {\n const el = e.target as HTMLElement;\n if (el.matches(\"input\") || el.querySelector(\"input\")) {\n editInput(e);\n e.stopPropagation();\n }\n },\n [editInput]\n );\n\n const handleBlur = useCallback<FocusEventHandler>(\n (e) => {\n const el = e.target as HTMLElement;\n el.removeEventListener(\"vuu-commit\", commitHandler, true);\n },\n [commitHandler]\n );\n\n const handleFocus = useCallback<FocusEventHandler>(\n (e) => {\n const el = e.target as HTMLElement;\n el.addEventListener(\"vuu-commit\", commitHandler, true);\n },\n [commitHandler]\n );\n\n return {\n onBlur: handleBlur,\n onDoubleClick: handleDoubleClick,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { useStateRef } from '@vuu-ui/vuu-ui-controls';
2
+ import { dispatchMouseEvent } from '@vuu-ui/vuu-utils';
3
+ import { useRef, useCallback } from 'react';
4
+
5
+ const useControlledTableNavigation = (initialValue, rowCount) => {
6
+ const tableRef = useRef(null);
7
+ const [highlightedIndexRef, setHighlightedIndex] = useStateRef(initialValue);
8
+ const handleKeyDown = useCallback(
9
+ (e) => {
10
+ if (e.key === "ArrowDown") {
11
+ setHighlightedIndex((index = -1) => Math.min(rowCount - 1, index + 1));
12
+ } else if (e.key === "ArrowUp") {
13
+ setHighlightedIndex((index = -1) => Math.max(0, index - 1));
14
+ } else if (e.key === "Enter" || e.key === " ") {
15
+ const { current: rowIdx } = highlightedIndexRef;
16
+ const rowEl = tableRef.current?.querySelector(
17
+ `[aria-rowindex="${rowIdx}"]`
18
+ );
19
+ if (rowEl) {
20
+ dispatchMouseEvent(rowEl, "click");
21
+ }
22
+ }
23
+ },
24
+ [highlightedIndexRef, rowCount, setHighlightedIndex]
25
+ );
26
+ const handleHighlight = useCallback(
27
+ (idx) => {
28
+ setHighlightedIndex(idx);
29
+ },
30
+ [setHighlightedIndex]
31
+ );
32
+ return {
33
+ highlightedIndexRef,
34
+ onHighlight: handleHighlight,
35
+ onKeyDown: handleKeyDown,
36
+ tableRef
37
+ };
38
+ };
39
+
40
+ export { useControlledTableNavigation };
41
+ //# sourceMappingURL=useControlledTableNavigation.js.map
@@ -0,0 +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 const rowEl = tableRef.current?.querySelector(\n `[aria-rowindex=\"${rowIdx}\"]`\n ) as HTMLElement;\n if (rowEl) {\n dispatchMouseEvent(rowEl, \"click\");\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":[],"mappings":";;;;AAIa,MAAA,4BAAA,GAA+B,CAC1C,YAAA,EACA,QACG,KAAA;AACH,EAAM,MAAA,QAAA,GAAW,OAAuB,IAAI,CAAA,CAAA;AAE5C,EAAA,MAAM,CAAC,mBAAA,EAAqB,mBAAmB,CAAA,GAAI,YAEjD,YAAY,CAAA,CAAA;AAEd,EAAA,MAAM,aAAgB,GAAA,WAAA;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,QAAM,MAAA,KAAA,GAAQ,SAAS,OAAS,EAAA,aAAA;AAAA,UAC9B,mBAAmB,MAAM,CAAA,EAAA,CAAA;AAAA,SAC3B,CAAA;AACA,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,kBAAA,CAAmB,OAAO,OAAO,CAAA,CAAA;AAAA,SACnC;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,mBAAqB,EAAA,QAAA,EAAU,mBAAmB,CAAA;AAAA,GACrD,CAAA;AAEA,EAAA,MAAM,eAAkB,GAAA,WAAA;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;;;;"}
@@ -0,0 +1,101 @@
1
+ import { getFullRange, rangesAreSame, NULL_RANGE } from '@vuu-ui/vuu-utils';
2
+ import { useState, useRef, useMemo, useCallback, useEffect } from 'react';
3
+ import { MovingWindow } from './moving-window.js';
4
+
5
+ const isVuuFeatureInvocation = (action) => action.type === "vuu-link-created" || action.type === "vuu-link-removed";
6
+ const useDataSource = ({
7
+ dataSource,
8
+ onFeatureInvocation,
9
+ onSizeChange,
10
+ onSubscribed,
11
+ range = NULL_RANGE,
12
+ renderBufferSize = 0
13
+ }) => {
14
+ const [, forceUpdate] = useState(null);
15
+ const data = useRef([]);
16
+ const isMounted = useRef(true);
17
+ const hasUpdated = useRef(false);
18
+ const rangeRef = useRef(range);
19
+ const dataWindow = useMemo(
20
+ () => new MovingWindow(getFullRange(range, renderBufferSize)),
21
+ // eslint-disable-next-line react-hooks/exhaustive-deps
22
+ []
23
+ );
24
+ const setData = useCallback(
25
+ (updates) => {
26
+ for (const row of updates) {
27
+ dataWindow.add(row);
28
+ }
29
+ data.current = dataWindow.data;
30
+ if (isMounted.current) {
31
+ forceUpdate({});
32
+ }
33
+ },
34
+ [dataWindow]
35
+ );
36
+ const datasourceMessageHandler = useCallback(
37
+ (message) => {
38
+ if (message.type === "subscribed") {
39
+ onSubscribed?.(message);
40
+ } else if (message.type === "viewport-update") {
41
+ if (typeof message.size === "number") {
42
+ onSizeChange?.(message.size);
43
+ dataWindow.setRowCount(message.size);
44
+ }
45
+ if (message.rows) {
46
+ setData(message.rows);
47
+ } else if (typeof message.size === "number") {
48
+ data.current = dataWindow.data;
49
+ hasUpdated.current = true;
50
+ }
51
+ } else if (isVuuFeatureInvocation(message)) {
52
+ onFeatureInvocation?.(message);
53
+ } else {
54
+ console.log(`useDataSource unexpected message ${message.type}`);
55
+ }
56
+ },
57
+ [dataWindow, onFeatureInvocation, onSizeChange, onSubscribed, setData]
58
+ );
59
+ const getSelectedRows = useCallback(() => {
60
+ return dataWindow.getSelectedRows();
61
+ }, [dataWindow]);
62
+ useEffect(() => {
63
+ isMounted.current = true;
64
+ dataSource.resume?.();
65
+ return () => {
66
+ isMounted.current = false;
67
+ dataSource.suspend?.();
68
+ };
69
+ }, [dataSource]);
70
+ useEffect(() => {
71
+ if (dataSource.status === "disabled") {
72
+ dataSource.enable?.(datasourceMessageHandler);
73
+ } else {
74
+ dataSource?.subscribe(
75
+ { range: getFullRange(range, renderBufferSize) },
76
+ datasourceMessageHandler
77
+ );
78
+ }
79
+ }, [dataSource, datasourceMessageHandler, range, renderBufferSize]);
80
+ const setRange = useCallback(
81
+ (range2) => {
82
+ if (!rangesAreSame(range2, rangeRef.current)) {
83
+ const fullRange = getFullRange(range2, renderBufferSize);
84
+ dataWindow.setRange(fullRange);
85
+ dataSource.range = rangeRef.current = fullRange;
86
+ dataSource.emit("range", range2);
87
+ }
88
+ },
89
+ [dataSource, dataWindow, renderBufferSize]
90
+ );
91
+ return {
92
+ data: data.current,
93
+ dataRef: data,
94
+ getSelectedRows,
95
+ range: rangeRef.current,
96
+ setRange
97
+ };
98
+ };
99
+
100
+ export { isVuuFeatureInvocation, useDataSource };
101
+ //# sourceMappingURL=useDataSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDataSource.js","sources":["../src/useDataSource.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribedMessage,\n SubscribeCallback,\n VuuFeatureInvocationMessage,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, NULL_RANGE, rangesAreSame } from \"@vuu-ui/vuu-utils\";\nimport { GridAction } from \"@vuu-ui/vuu-table-types\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { MovingWindow } from \"./moving-window\";\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n onFeatureInvocation?: (message: VuuFeatureInvocationMessage) => void;\n onSizeChange: (size: number) => void;\n onSubscribed: (subscription: DataSourceSubscribedMessage) => void;\n range?: VuuRange;\n renderBufferSize?: number;\n}\n\nexport const isVuuFeatureInvocation = (\n action: GridAction\n): action is VuuFeatureInvocationMessage =>\n action.type === \"vuu-link-created\" || action.type === \"vuu-link-removed\";\n\nexport const useDataSource = ({\n dataSource,\n onFeatureInvocation,\n onSizeChange,\n onSubscribed,\n range = NULL_RANGE,\n renderBufferSize = 0,\n}: DataSourceHookProps) => {\n const [, forceUpdate] = useState<unknown>(null);\n const data = useRef<DataSourceRow[]>([]);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rangeRef = useRef<VuuRange>(range);\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(range, renderBufferSize)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n data.current = dataWindow.data;\n if (isMounted.current) {\n // TODO do we ever need to worry about missing updates here ?\n forceUpdate({});\n } else {\n // do nothing\n }\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"subscribed\") {\n onSubscribed?.(message);\n } else if (message.type === \"viewport-update\") {\n if (typeof message.size === \"number\") {\n onSizeChange?.(message.size);\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n } else if (typeof message.size === \"number\") {\n data.current = dataWindow.data;\n hasUpdated.current = true;\n }\n } else if (isVuuFeatureInvocation(message)) {\n onFeatureInvocation?.(message);\n } else {\n console.log(`useDataSource unexpected message ${message.type}`);\n }\n },\n [dataWindow, onFeatureInvocation, onSizeChange, onSubscribed, setData]\n );\n\n const getSelectedRows = useCallback(() => {\n return dataWindow.getSelectedRows();\n }, [dataWindow]);\n\n useEffect(() => {\n isMounted.current = true;\n dataSource.resume?.();\n return () => {\n isMounted.current = false;\n dataSource.suspend?.();\n };\n }, [dataSource]);\n\n useEffect(() => {\n if (dataSource.status === \"disabled\") {\n dataSource.enable?.(datasourceMessageHandler);\n } else {\n //TODO could we improve this by using a ref for range ?\n dataSource?.subscribe(\n { range: getFullRange(range, renderBufferSize) },\n datasourceMessageHandler\n );\n }\n }, [dataSource, datasourceMessageHandler, range, renderBufferSize]);\n\n const setRange = useCallback(\n (range: VuuRange) => {\n if (!rangesAreSame(range, rangeRef.current)) {\n const fullRange = getFullRange(range, renderBufferSize);\n dataWindow.setRange(fullRange);\n dataSource.range = rangeRef.current = fullRange;\n // emit a range event omitting the renderBufferSize\n // This isn't great, we're using the dataSource as a conduit to emit a\n // message that has nothing to do with the dataSource itself. CLient\n // is the DataSourceState component.\n dataSource.emit(\"range\", range);\n }\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n return {\n data: data.current,\n dataRef: data,\n getSelectedRows,\n range: rangeRef.current,\n setRange,\n };\n};\n"],"names":["range"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { useRef, useMemo } from 'react';
2
+
3
+ const useInitialValue = (value) => {
4
+ const ref = useRef(value);
5
+ return useMemo(() => ref.current, []);
6
+ };
7
+
8
+ export { useInitialValue };
9
+ //# sourceMappingURL=useInitialValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInitialValue.js","sources":["../src/useInitialValue.ts"],"sourcesContent":["import { useMemo, useRef } from \"react\";\n\nexport const useInitialValue = <T = unknown>(value: T): T => {\n const ref = useRef<T>(value);\n return useMemo(() => ref.current, []);\n};\n"],"names":[],"mappings":";;AAEa,MAAA,eAAA,GAAkB,CAAc,KAAgB,KAAA;AAC3D,EAAM,MAAA,GAAA,GAAM,OAAU,KAAK,CAAA,CAAA;AAC3B,EAAA,OAAO,OAAQ,CAAA,MAAM,GAAI,CAAA,OAAA,EAAS,EAAE,CAAA,CAAA;AACtC;;;;"}