@vuu-ui/vuu-table 0.8.35 → 0.8.36

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 (223) hide show
  1. package/README.md +0 -0
  2. package/cjs/Row.css.js +6 -0
  3. package/cjs/Row.css.js.map +1 -0
  4. package/cjs/Row.js +124 -0
  5. package/cjs/Row.js.map +1 -0
  6. package/cjs/Table.css.js +6 -0
  7. package/cjs/Table.css.js.map +1 -0
  8. package/cjs/Table.js +285 -0
  9. package/cjs/Table.js.map +1 -0
  10. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js +6 -0
  11. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  12. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +42 -0
  13. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
  14. package/cjs/cell-renderers/input-cell/InputCell.css.js +6 -0
  15. package/cjs/cell-renderers/input-cell/InputCell.css.js.map +1 -0
  16. package/cjs/cell-renderers/input-cell/InputCell.js +58 -0
  17. package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -0
  18. package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js +6 -0
  19. package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
  20. package/cjs/cell-renderers/toggle-cell/ToggleCell.js +68 -0
  21. package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
  22. package/cjs/column-header-pill/ColumnHeaderPill.css.js +6 -0
  23. package/cjs/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
  24. package/cjs/column-header-pill/ColumnHeaderPill.js +53 -0
  25. package/cjs/column-header-pill/ColumnHeaderPill.js.map +1 -0
  26. package/cjs/column-header-pill/GroupColumnPill.css.js +6 -0
  27. package/cjs/column-header-pill/GroupColumnPill.css.js.map +1 -0
  28. package/cjs/column-header-pill/GroupColumnPill.js +29 -0
  29. package/cjs/column-header-pill/GroupColumnPill.js.map +1 -0
  30. package/cjs/column-header-pill/SortIndicator.css.js +6 -0
  31. package/cjs/column-header-pill/SortIndicator.css.js.map +1 -0
  32. package/cjs/column-header-pill/SortIndicator.js +27 -0
  33. package/cjs/column-header-pill/SortIndicator.js.map +1 -0
  34. package/cjs/column-menu/ColumnMenu.css.js +6 -0
  35. package/cjs/column-menu/ColumnMenu.css.js.map +1 -0
  36. package/cjs/column-menu/ColumnMenu.js +30 -0
  37. package/cjs/column-menu/ColumnMenu.js.map +1 -0
  38. package/cjs/column-resizing/ColumnResizer.css.js +6 -0
  39. package/cjs/column-resizing/ColumnResizer.css.js.map +1 -0
  40. package/cjs/column-resizing/ColumnResizer.js +72 -0
  41. package/cjs/column-resizing/ColumnResizer.js.map +1 -0
  42. package/cjs/column-resizing/useTableColumnResize.js +55 -0
  43. package/cjs/column-resizing/useTableColumnResize.js.map +1 -0
  44. package/cjs/context-menu/buildContextMenuDescriptors.js +214 -0
  45. package/cjs/context-menu/buildContextMenuDescriptors.js.map +1 -0
  46. package/cjs/context-menu/useHandleTableContextMenu.js +81 -0
  47. package/cjs/context-menu/useHandleTableContextMenu.js.map +1 -0
  48. package/cjs/header-cell/GroupHeaderCell.css.js +6 -0
  49. package/cjs/header-cell/GroupHeaderCell.css.js.map +1 -0
  50. package/cjs/header-cell/GroupHeaderCell.js +117 -0
  51. package/cjs/header-cell/GroupHeaderCell.js.map +1 -0
  52. package/cjs/header-cell/HeaderCell.css.js +6 -0
  53. package/cjs/header-cell/HeaderCell.css.js.map +1 -0
  54. package/cjs/header-cell/HeaderCell.js +109 -0
  55. package/cjs/header-cell/HeaderCell.js.map +1 -0
  56. package/cjs/index.js.map +1 -0
  57. package/cjs/moving-window.js +61 -0
  58. package/cjs/moving-window.js.map +1 -0
  59. package/cjs/table-cell/TableCell.css.js +6 -0
  60. package/cjs/table-cell/TableCell.css.js.map +1 -0
  61. package/cjs/table-cell/TableCell.js +72 -0
  62. package/cjs/table-cell/TableCell.js.map +1 -0
  63. package/cjs/table-cell/TableGroupCell.css.js +6 -0
  64. package/cjs/table-cell/TableGroupCell.css.js.map +1 -0
  65. package/cjs/table-cell/TableGroupCell.js +54 -0
  66. package/cjs/table-cell/TableGroupCell.js.map +1 -0
  67. package/cjs/table-config.js +25 -0
  68. package/cjs/table-config.js.map +1 -0
  69. package/cjs/table-dom-utils.js +60 -0
  70. package/cjs/table-dom-utils.js.map +1 -0
  71. package/cjs/table-header/TableHeader.js +87 -0
  72. package/cjs/table-header/TableHeader.js.map +1 -0
  73. package/cjs/table-header/useTableHeader.js +72 -0
  74. package/cjs/table-header/useTableHeader.js.map +1 -0
  75. package/cjs/useCell.js +28 -0
  76. package/cjs/useCell.js.map +1 -0
  77. package/cjs/useCellEditing.js +79 -0
  78. package/cjs/useCellEditing.js.map +1 -0
  79. package/cjs/useControlledTableNavigation.js +43 -0
  80. package/cjs/useControlledTableNavigation.js.map +1 -0
  81. package/cjs/useDataSource.js +104 -0
  82. package/cjs/useDataSource.js.map +1 -0
  83. package/cjs/useInitialValue.js +11 -0
  84. package/cjs/useInitialValue.js.map +1 -0
  85. package/cjs/useKeyboardNavigation.js +304 -0
  86. package/cjs/useKeyboardNavigation.js.map +1 -0
  87. package/cjs/useRowClassNameGenerators.js +34 -0
  88. package/cjs/useRowClassNameGenerators.js.map +1 -0
  89. package/cjs/useRowHeight.js +43 -0
  90. package/cjs/useRowHeight.js.map +1 -0
  91. package/cjs/useSelection.js +64 -0
  92. package/cjs/useSelection.js.map +1 -0
  93. package/cjs/useTable.js +553 -0
  94. package/cjs/useTable.js.map +1 -0
  95. package/cjs/useTableAndColumnSettings.js +128 -0
  96. package/cjs/useTableAndColumnSettings.js.map +1 -0
  97. package/cjs/useTableContextMenu.js +42 -0
  98. package/cjs/useTableContextMenu.js.map +1 -0
  99. package/cjs/useTableModel.js +297 -0
  100. package/cjs/useTableModel.js.map +1 -0
  101. package/cjs/useTableScroll.js +396 -0
  102. package/cjs/useTableScroll.js.map +1 -0
  103. package/cjs/useTableViewport.js +122 -0
  104. package/cjs/useTableViewport.js.map +1 -0
  105. package/esm/Row.css.js +4 -0
  106. package/esm/Row.css.js.map +1 -0
  107. package/esm/Row.js +121 -0
  108. package/esm/Row.js.map +1 -0
  109. package/esm/Table.css.js +4 -0
  110. package/esm/Table.css.js.map +1 -0
  111. package/esm/Table.js +283 -0
  112. package/esm/Table.js.map +1 -0
  113. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js +4 -0
  114. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  115. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +40 -0
  116. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
  117. package/esm/cell-renderers/input-cell/InputCell.css.js +4 -0
  118. package/esm/cell-renderers/input-cell/InputCell.css.js.map +1 -0
  119. package/esm/cell-renderers/input-cell/InputCell.js +56 -0
  120. package/esm/cell-renderers/input-cell/InputCell.js.map +1 -0
  121. package/esm/cell-renderers/toggle-cell/ToggleCell.css.js +4 -0
  122. package/esm/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
  123. package/esm/cell-renderers/toggle-cell/ToggleCell.js +66 -0
  124. package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
  125. package/esm/column-header-pill/ColumnHeaderPill.css.js +4 -0
  126. package/esm/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
  127. package/esm/column-header-pill/ColumnHeaderPill.js +51 -0
  128. package/esm/column-header-pill/ColumnHeaderPill.js.map +1 -0
  129. package/esm/column-header-pill/GroupColumnPill.css.js +4 -0
  130. package/esm/column-header-pill/GroupColumnPill.css.js.map +1 -0
  131. package/esm/column-header-pill/GroupColumnPill.js +27 -0
  132. package/esm/column-header-pill/GroupColumnPill.js.map +1 -0
  133. package/esm/column-header-pill/SortIndicator.css.js +4 -0
  134. package/esm/column-header-pill/SortIndicator.css.js.map +1 -0
  135. package/esm/column-header-pill/SortIndicator.js +25 -0
  136. package/esm/column-header-pill/SortIndicator.js.map +1 -0
  137. package/esm/column-menu/ColumnMenu.css.js +4 -0
  138. package/esm/column-menu/ColumnMenu.css.js.map +1 -0
  139. package/esm/column-menu/ColumnMenu.js +28 -0
  140. package/esm/column-menu/ColumnMenu.js.map +1 -0
  141. package/esm/column-resizing/ColumnResizer.css.js +4 -0
  142. package/esm/column-resizing/ColumnResizer.css.js.map +1 -0
  143. package/esm/column-resizing/ColumnResizer.js +70 -0
  144. package/esm/column-resizing/ColumnResizer.js.map +1 -0
  145. package/esm/column-resizing/useTableColumnResize.js +53 -0
  146. package/esm/column-resizing/useTableColumnResize.js.map +1 -0
  147. package/esm/context-menu/buildContextMenuDescriptors.js +212 -0
  148. package/esm/context-menu/buildContextMenuDescriptors.js.map +1 -0
  149. package/esm/context-menu/useHandleTableContextMenu.js +79 -0
  150. package/esm/context-menu/useHandleTableContextMenu.js.map +1 -0
  151. package/esm/header-cell/GroupHeaderCell.css.js +4 -0
  152. package/esm/header-cell/GroupHeaderCell.css.js.map +1 -0
  153. package/esm/header-cell/GroupHeaderCell.js +115 -0
  154. package/esm/header-cell/GroupHeaderCell.js.map +1 -0
  155. package/esm/header-cell/HeaderCell.css.js +4 -0
  156. package/esm/header-cell/HeaderCell.css.js.map +1 -0
  157. package/esm/header-cell/HeaderCell.js +107 -0
  158. package/esm/header-cell/HeaderCell.js.map +1 -0
  159. package/esm/index.js +14 -0
  160. package/esm/index.js.map +1 -0
  161. package/esm/moving-window.js +59 -0
  162. package/esm/moving-window.js.map +1 -0
  163. package/esm/table-cell/TableCell.css.js +4 -0
  164. package/esm/table-cell/TableCell.css.js.map +1 -0
  165. package/esm/table-cell/TableCell.js +70 -0
  166. package/esm/table-cell/TableCell.js.map +1 -0
  167. package/esm/table-cell/TableGroupCell.css.js +4 -0
  168. package/esm/table-cell/TableGroupCell.css.js.map +1 -0
  169. package/esm/table-cell/TableGroupCell.js +52 -0
  170. package/esm/table-cell/TableGroupCell.js.map +1 -0
  171. package/esm/table-config.js +23 -0
  172. package/esm/table-config.js.map +1 -0
  173. package/esm/table-dom-utils.js +51 -0
  174. package/esm/table-dom-utils.js.map +1 -0
  175. package/esm/table-header/TableHeader.js +85 -0
  176. package/esm/table-header/TableHeader.js.map +1 -0
  177. package/esm/table-header/useTableHeader.js +70 -0
  178. package/esm/table-header/useTableHeader.js.map +1 -0
  179. package/esm/useCell.js +26 -0
  180. package/esm/useCell.js.map +1 -0
  181. package/esm/useCellEditing.js +77 -0
  182. package/esm/useCellEditing.js.map +1 -0
  183. package/esm/useControlledTableNavigation.js +41 -0
  184. package/esm/useControlledTableNavigation.js.map +1 -0
  185. package/esm/useDataSource.js +101 -0
  186. package/esm/useDataSource.js.map +1 -0
  187. package/esm/useInitialValue.js +9 -0
  188. package/esm/useInitialValue.js.map +1 -0
  189. package/esm/useKeyboardNavigation.js +300 -0
  190. package/esm/useKeyboardNavigation.js.map +1 -0
  191. package/esm/useRowClassNameGenerators.js +32 -0
  192. package/esm/useRowClassNameGenerators.js.map +1 -0
  193. package/esm/useRowHeight.js +41 -0
  194. package/esm/useRowHeight.js.map +1 -0
  195. package/esm/useSelection.js +62 -0
  196. package/esm/useSelection.js.map +1 -0
  197. package/esm/useTable.js +551 -0
  198. package/esm/useTable.js.map +1 -0
  199. package/esm/useTableAndColumnSettings.js +126 -0
  200. package/esm/useTableAndColumnSettings.js.map +1 -0
  201. package/esm/useTableContextMenu.js +40 -0
  202. package/esm/useTableContextMenu.js.map +1 -0
  203. package/esm/useTableModel.js +293 -0
  204. package/esm/useTableModel.js.map +1 -0
  205. package/esm/useTableScroll.js +393 -0
  206. package/esm/useTableScroll.js.map +1 -0
  207. package/esm/useTableViewport.js +120 -0
  208. package/esm/useTableViewport.js.map +1 -0
  209. package/package.json +12 -8
  210. package/types/Row.d.ts +0 -1
  211. package/types/Table.d.ts +0 -1
  212. package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +0 -1
  213. package/types/cell-renderers/input-cell/InputCell.d.ts +0 -1
  214. package/types/cell-renderers/toggle-cell/ToggleCell.d.ts +0 -1
  215. package/types/column-header-pill/ColumnHeaderPill.d.ts +0 -1
  216. package/types/column-header-pill/GroupColumnPill.d.ts +0 -1
  217. package/types/column-header-pill/SortIndicator.d.ts +0 -1
  218. package/types/column-menu/ColumnMenu.d.ts +0 -1
  219. package/types/column-resizing/ColumnResizer.d.ts +0 -1
  220. package/types/header-cell/GroupHeaderCell.d.ts +0 -1
  221. package/types/header-cell/HeaderCell.d.ts +0 -1
  222. package/types/table-cell/TableCell.d.ts +0 -1
  223. package/types/table-cell/TableGroupCell.d.ts +0 -1
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ var vuuUtils = require('@vuu-ui/vuu-utils');
4
+
5
+ const { SELECTED } = vuuUtils.metadataKeys;
6
+ class MovingWindow {
7
+ constructor({ from, to }) {
8
+ this.rowCount = 0;
9
+ this.setRowCount = (rowCount) => {
10
+ if (rowCount < this.data.length) {
11
+ this.data.length = rowCount;
12
+ }
13
+ this.rowCount = rowCount;
14
+ };
15
+ this.range = new vuuUtils.WindowRange(from, to);
16
+ this.data = new Array(Math.max(0, to - from));
17
+ this.rowCount = 0;
18
+ }
19
+ add(data) {
20
+ const [index] = data;
21
+ if (this.isWithinRange(index)) {
22
+ const internalIndex = index - this.range.from;
23
+ this.data[internalIndex] = data;
24
+ if (data[SELECTED]) {
25
+ const previousRow = this.data[internalIndex - 1];
26
+ if (vuuUtils.isRowSelectedLast(previousRow)) {
27
+ this.data[internalIndex - 1] = previousRow.slice();
28
+ this.data[internalIndex - 1][SELECTED] -= 4;
29
+ }
30
+ }
31
+ }
32
+ }
33
+ getAtIndex(index) {
34
+ return this.range.isWithin(index) && this.data[index - this.range.from] != null ? this.data[index - this.range.from] : void 0;
35
+ }
36
+ isWithinRange(index) {
37
+ return this.range.isWithin(index);
38
+ }
39
+ setRange({ from, to }) {
40
+ if (from !== this.range.from || to !== this.range.to) {
41
+ const [overlapFrom, overlapTo] = this.range.overlap(from, to);
42
+ const newData = new Array(Math.max(0, to - from));
43
+ for (let i = overlapFrom; i < overlapTo; i++) {
44
+ const data = this.getAtIndex(i);
45
+ if (data) {
46
+ const index = i - from;
47
+ newData[index] = data;
48
+ }
49
+ }
50
+ this.data = newData;
51
+ this.range.from = from;
52
+ this.range.to = to;
53
+ }
54
+ }
55
+ getSelectedRows() {
56
+ return this.data.filter((row) => row[SELECTED] !== 0);
57
+ }
58
+ }
59
+
60
+ exports.MovingWindow = MovingWindow;
61
+ //# sourceMappingURL=moving-window.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var tableCellCss = ".vuuTableCell {\n border-right-color: var(--cell-borderColor);\n border-right-style: solid;\n border-right-width: 1px;\n /* unfortunately inline-flex doesn't play nice with text-overflow ellipsis */\n display: inline-block;\n white-space: nowrap;\n height: 100%;\n overflow:hidden;\n padding: var(--vuuTableCell-padding, 0 11px 0 12px);\n text-overflow: ellipsis;\n vertical-align: top;\n}\n\n.vuuTableCell-right {\n text-align: right;\n}\n\n.vuuTableCell-editable {\n align-items: center;\n display: inline-flex;\n text-overflow: unset;\n}\n \n.vuuTableCell:focus {\n outline: var(--vuuTableCell-outline, solid var(--salt-focused-outlineColor) 2px);\n outline-offset: -2px;\n /** This is to achieve a white background to outline dashes */\n box-shadow: inset 0 0 0 var(--cell-outline-width) white;\n border-bottom: none;\n}\n\n.vuuTableRow-selected .vuuTableCell:not(.vuuTableCell-editable):focus {\n outline: var(--vuuTableCell-outline, solid var(--salt-focused-outlineColor) 2px);\n outline-offset: -1px;\n\n}\n.vuuTableCell-editable:focus {\n outline: none;\n}\n\n";
4
+
5
+ module.exports = tableCellCss;
6
+ //# sourceMappingURL=TableCell.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableCell.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var styles = require('@salt-ds/styles');
6
+ var window = require('@salt-ds/window');
7
+ var react = require('react');
8
+ var useCell = require('../useCell.js');
9
+ var TableCell$1 = require('./TableCell.css.js');
10
+
11
+ const classBase = "vuuTableCell";
12
+ const TableCell = ({
13
+ column,
14
+ columnMap,
15
+ onClick,
16
+ onDataEdited,
17
+ row
18
+ }) => {
19
+ const targetWindow = window.useWindow();
20
+ styles.useComponentCssInjection({
21
+ testId: "vuu-table-cell",
22
+ css: TableCell$1,
23
+ window: targetWindow
24
+ });
25
+ const { className, style } = useCell.useCell(column, classBase);
26
+ const { CellRenderer, index, name, valueFormatter } = column;
27
+ const dataIdx = columnMap[name];
28
+ const handleDataItemEdited = react.useCallback(
29
+ (value) => {
30
+ if (onDataEdited) {
31
+ let typedValue = value;
32
+ if (vuuUtils.isNumericColumn(column) && typeof value === "string") {
33
+ typedValue = column.serverDataType === "double" ? parseFloat(value) : parseInt(value);
34
+ }
35
+ return onDataEdited?.(row, name, typedValue);
36
+ } else {
37
+ throw Error(
38
+ "TableCell onDataEdited prop not supplied for an editable cell"
39
+ );
40
+ }
41
+ },
42
+ [column, name, onDataEdited, row]
43
+ );
44
+ const handleClick = react.useCallback(
45
+ (evt) => {
46
+ onClick?.(evt, column);
47
+ },
48
+ [column, onClick]
49
+ );
50
+ return /* @__PURE__ */ jsxRuntime.jsx(
51
+ "div",
52
+ {
53
+ "aria-colindex": index,
54
+ className,
55
+ onClick: onClick ? handleClick : void 0,
56
+ role: "cell",
57
+ style,
58
+ children: CellRenderer ? /* @__PURE__ */ jsxRuntime.jsx(
59
+ CellRenderer,
60
+ {
61
+ column,
62
+ columnMap,
63
+ onCommit: handleDataItemEdited,
64
+ row
65
+ }
66
+ ) : valueFormatter(row[dataIdx])
67
+ }
68
+ );
69
+ };
70
+
71
+ exports.TableCell = TableCell;
72
+ //# sourceMappingURL=TableCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableCell.js","sources":["../../src/table-cell/TableCell.tsx"],"sourcesContent":["import { DataItemCommitHandler, TableCellProps } from \"@vuu-ui/vuu-table-types\";\nimport { isNumericColumn } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { MouseEventHandler, useCallback } from \"react\";\nimport { useCell } from \"../useCell\";\n\nimport tableCellCss from \"./TableCell.css\";\n\nconst classBase = \"vuuTableCell\";\n\nexport const TableCell = ({\n column,\n columnMap,\n onClick,\n onDataEdited,\n row,\n}: TableCellProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-table-cell\",\n css: tableCellCss,\n window: targetWindow,\n });\n\n const { className, style } = useCell(column, classBase);\n const { CellRenderer, index, name, valueFormatter } = column;\n const dataIdx = columnMap[name];\n\n const handleDataItemEdited = useCallback<DataItemCommitHandler>(\n (value) => {\n if (onDataEdited) {\n let typedValue = value;\n if (isNumericColumn(column) && typeof value === \"string\") {\n typedValue =\n column.serverDataType === \"double\"\n ? parseFloat(value)\n : parseInt(value);\n }\n return onDataEdited?.(row, name, typedValue);\n } else {\n throw Error(\n \"TableCell onDataEdited prop not supplied for an editable cell\"\n );\n }\n },\n [column, name, onDataEdited, row]\n );\n\n const handleClick = useCallback<MouseEventHandler>(\n (evt) => {\n onClick?.(evt, column);\n },\n [column, onClick]\n );\n\n return (\n <div\n aria-colindex={index}\n className={className}\n onClick={onClick ? handleClick : undefined}\n role=\"cell\"\n style={style}\n >\n {CellRenderer ? (\n <CellRenderer\n column={column}\n columnMap={columnMap}\n onCommit={handleDataItemEdited}\n row={row}\n />\n ) : (\n valueFormatter(row[dataIdx])\n )}\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","tableCellCss","useCell","useCallback","isNumericColumn","jsx"],"mappings":";;;;;;;;;;AASA,MAAM,SAAY,GAAA,cAAA,CAAA;AAEX,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAA;AACF,CAAsB,KAAA;AACpB,EAAA,MAAM,eAAeA,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAAC,WAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,SAAW,EAAA,KAAA,EAAU,GAAAC,eAAA,CAAQ,QAAQ,SAAS,CAAA,CAAA;AACtD,EAAA,MAAM,EAAE,YAAA,EAAc,KAAO,EAAA,IAAA,EAAM,gBAAmB,GAAA,MAAA,CAAA;AACtD,EAAM,MAAA,OAAA,GAAU,UAAU,IAAI,CAAA,CAAA;AAE9B,EAAA,MAAM,oBAAuB,GAAAC,iBAAA;AAAA,IAC3B,CAAC,KAAU,KAAA;AACT,MAAA,IAAI,YAAc,EAAA;AAChB,QAAA,IAAI,UAAa,GAAA,KAAA,CAAA;AACjB,QAAA,IAAIC,wBAAgB,CAAA,MAAM,CAAK,IAAA,OAAO,UAAU,QAAU,EAAA;AACxD,UAAA,UAAA,GACE,OAAO,cAAmB,KAAA,QAAA,GACtB,WAAW,KAAK,CAAA,GAChB,SAAS,KAAK,CAAA,CAAA;AAAA,SACtB;AACA,QAAO,OAAA,YAAA,GAAe,GAAK,EAAA,IAAA,EAAM,UAAU,CAAA,CAAA;AAAA,OACtC,MAAA;AACL,QAAM,MAAA,KAAA;AAAA,UACJ,+DAAA;AAAA,SACF,CAAA;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,MAAA,EAAQ,IAAM,EAAA,YAAA,EAAc,GAAG,CAAA;AAAA,GAClC,CAAA;AAEA,EAAA,MAAM,WAAc,GAAAD,iBAAA;AAAA,IAClB,CAAC,GAAQ,KAAA;AACP,MAAA,OAAA,GAAU,KAAK,MAAM,CAAA,CAAA;AAAA,KACvB;AAAA,IACA,CAAC,QAAQ,OAAO,CAAA;AAAA,GAClB,CAAA;AAEA,EACE,uBAAAE,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,eAAe,EAAA,KAAA;AAAA,MACf,SAAA;AAAA,MACA,OAAA,EAAS,UAAU,WAAc,GAAA,KAAA,CAAA;AAAA,MACjC,IAAK,EAAA,MAAA;AAAA,MACL,KAAA;AAAA,MAEC,QACC,EAAA,YAAA,mBAAAA,cAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,SAAA;AAAA,UACA,QAAU,EAAA,oBAAA;AAAA,UACV,GAAA;AAAA,SAAA;AAAA,OAGF,GAAA,cAAA,CAAe,GAAI,CAAA,OAAO,CAAC,CAAA;AAAA,KAAA;AAAA,GAE/B,CAAA;AAEJ;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var tableGroupCellCss = ".vuuTableGroupCell {\n --group-cell-spacer-width: 20px;\n align-items: center;\n border-right-color: var(--vuuTableGroupCell-borderColor, var(--salt-separable-tertiary-borderColor));\n border-right-style: solid;\n border-right-width: 1px;\n \n cursor: pointer;\n display: inline-flex;\n height: var(--row-height);\n line-height: 16px;\n}\n\n.vuuTableGroupCell-toggle {\n --vuu-icon-height: 16px;\n --vuu-icon-size: 16px;\n --vuu-icon-width: 8px;\n margin-right: 4px;\n transition: transform 0.25s;\n transform: var(--toggle-icon-transform);\n\n}\n\n.vuuTableGroupCell-spacer {\n width: var(--group-cell-spacer-width);\n }\n";
4
+
5
+ module.exports = tableGroupCellCss;
6
+ //# sourceMappingURL=TableGroupCell.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableGroupCell.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var styles = require('@salt-ds/styles');
6
+ var window = require('@salt-ds/window');
7
+ var react = require('react');
8
+ var useCell = require('../useCell.js');
9
+ var cx = require('clsx');
10
+ var TableGroupCell$1 = require('./TableGroupCell.css.js');
11
+
12
+ const { IS_LEAF } = vuuUtils.metadataKeys;
13
+ const classBase = "vuuTableGroupCell";
14
+ const TableGroupCell = ({
15
+ column,
16
+ columnMap,
17
+ onClick,
18
+ row
19
+ }) => {
20
+ const targetWindow = window.useWindow();
21
+ styles.useComponentCssInjection({
22
+ testId: "vuu-table-group-cell",
23
+ css: TableGroupCell$1,
24
+ window: targetWindow
25
+ });
26
+ const { columns } = column;
27
+ const [value, offset] = vuuUtils.getGroupValueAndOffset(columns, row, columnMap);
28
+ const { className, style } = useCell.useCell(column, classBase);
29
+ const handleClick = react.useCallback(
30
+ (evt) => {
31
+ onClick?.(evt, column);
32
+ },
33
+ [column, onClick]
34
+ );
35
+ const isLeaf = row[IS_LEAF];
36
+ const spacers = Array(offset).fill(0).map((n, i) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${classBase}-spacer` }, i));
37
+ return /* @__PURE__ */ jsxRuntime.jsxs(
38
+ "div",
39
+ {
40
+ className: cx(className, "vuuTableCell"),
41
+ role: "cell",
42
+ style,
43
+ onClick: isLeaf ? void 0 : handleClick,
44
+ children: [
45
+ spacers,
46
+ isLeaf ? null : /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${classBase}-toggle`, "data-icon": "triangle-right" }),
47
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: value })
48
+ ]
49
+ }
50
+ );
51
+ };
52
+
53
+ exports.TableGroupCell = TableGroupCell;
54
+ //# 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":["metadataKeys","useWindow","useComponentCssInjection","tableGroupCellCss","getGroupValueAndOffset","useCell","useCallback","jsxs","jsx"],"mappings":";;;;;;;;;;;AAUA,MAAM,EAAE,SAAY,GAAAA,qBAAA,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,eAAeC,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,sBAAA;AAAA,IACR,GAAK,EAAAC,gBAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,EAAE,SAAY,GAAA,MAAA,CAAA;AACpB,EAAA,MAAM,CAAC,KAAO,EAAA,MAAM,IAAIC,+BAAuB,CAAA,OAAA,EAAS,KAAK,SAAS,CAAA,CAAA;AACtE,EAAA,MAAM,EAAE,SAAW,EAAA,KAAA,EAAU,GAAAC,eAAA,CAAQ,QAAQ,SAAS,CAAA,CAAA;AAEtD,EAAA,MAAM,WAAc,GAAAC,iBAAA;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,oCAAO,MAAK,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,OAAA,CAAA,EAAA,EAAgB,CAAG,CAAE,CAAA,CAAA;AAEnE,EACE,uBAAAC,eAAA;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,uBACPC,cAAA,CAAA,MAAA,EAAA,EAAK,WAAW,CAAG,EAAA,SAAS,CAAW,OAAA,CAAA,EAAA,WAAA,EAAU,gBAAiB,EAAA,CAAA;AAAA,wBAErEA,cAAA,CAAC,UAAM,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GACf,CAAA;AAEJ;;;;"}
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ const updateTableConfig = (config, action) => {
4
+ switch (action.type) {
5
+ case "col-size":
6
+ return {
7
+ ...config,
8
+ columns: config.columns.map(
9
+ (col) => col.name === action.column.name ? { ...col, width: action.width } : col
10
+ )
11
+ };
12
+ case "column-prop":
13
+ return {
14
+ ...config,
15
+ columns: config.columns.map(
16
+ (col) => col.name === action.column.name ? { ...col, [action.property]: action.value } : col
17
+ )
18
+ };
19
+ default:
20
+ return config;
21
+ }
22
+ };
23
+
24
+ exports.updateTableConfig = updateTableConfig;
25
+ //# 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,60 @@
1
+ 'use strict';
2
+
3
+ const headerCellQuery = (colIdx) => `.vuuTable-col-headers .vuuTableHeaderCell:nth-child(${colIdx})`;
4
+ const dataCellQuery = (rowIdx, colIdx) => `.vuuTable-body > [aria-rowindex='${rowIdx + 1}'] > [role='cell']:nth-child(${colIdx + 1})`;
5
+ const getTableCell = (containerRef, [rowIdx, colIdx]) => {
6
+ const cssQuery = rowIdx === -1 ? headerCellQuery(colIdx) : dataCellQuery(rowIdx, colIdx);
7
+ const cell = containerRef.current?.querySelector(
8
+ cssQuery
9
+ );
10
+ if (cellIsEditable(cell)) {
11
+ const focusableContent = cell.querySelector("button");
12
+ return focusableContent || cell;
13
+ } else {
14
+ return cell;
15
+ }
16
+ };
17
+ const cellIsEditable = (cell) => cell?.classList.contains("vuuTableCell-editable");
18
+ const cellIsTextInput = (cell) => cell.querySelector(".vuuTableInputCell") !== null;
19
+ function getRowIndex(rowEl) {
20
+ if (rowEl) {
21
+ const idx = rowEl.ariaRowIndex;
22
+ if (idx !== null) {
23
+ return parseInt(idx, 10) - 1;
24
+ }
25
+ }
26
+ return -1;
27
+ }
28
+ const closestRow = (el) => el.closest('[role="row"]');
29
+ const closestRowIndex = (el) => getRowIndex(closestRow(el));
30
+ const NO_SCROLL_NECESSARY = [void 0, void 0];
31
+ const howFarIsRowOutsideViewport = (rowEl, totalHeaderHeight, contentContainer = rowEl.closest(".vuuTable-contentContainer")) => {
32
+ if (contentContainer) {
33
+ const viewport = contentContainer?.getBoundingClientRect();
34
+ const upperBoundary = viewport.top + totalHeaderHeight;
35
+ const row = rowEl.getBoundingClientRect();
36
+ if (row) {
37
+ if (row.bottom > viewport.bottom) {
38
+ return ["down", row.bottom - viewport.bottom];
39
+ } else if (row.top < upperBoundary) {
40
+ return ["up", row.top - upperBoundary];
41
+ } else {
42
+ return NO_SCROLL_NECESSARY;
43
+ }
44
+ } else {
45
+ throw Error("Whats going on, row not found");
46
+ }
47
+ } else {
48
+ throw Error("Whats going on, scrollbar container not found");
49
+ }
50
+ };
51
+
52
+ exports.cellIsEditable = cellIsEditable;
53
+ exports.cellIsTextInput = cellIsTextInput;
54
+ exports.closestRowIndex = closestRowIndex;
55
+ exports.dataCellQuery = dataCellQuery;
56
+ exports.getRowIndex = getRowIndex;
57
+ exports.getTableCell = getTableCell;
58
+ exports.headerCellQuery = headerCellQuery;
59
+ exports.howFarIsRowOutsideViewport = howFarIsRowOutsideViewport;
60
+ //# 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,87 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var cx = require('clsx');
6
+ var react = require('react');
7
+ var GroupHeaderCell = require('../header-cell/GroupHeaderCell.js');
8
+ var HeaderCell = require('../header-cell/HeaderCell.js');
9
+ var useTableHeader = require('./useTableHeader.js');
10
+
11
+ const TableHeader = react.memo(
12
+ ({
13
+ classBase = "vuuTable",
14
+ columns,
15
+ headings,
16
+ onMoveColumn,
17
+ onMoveGroupColumn,
18
+ onRemoveGroupColumn,
19
+ onResizeColumn,
20
+ onSortColumn,
21
+ showColumnHeaderMenus,
22
+ tableConfig,
23
+ tableId,
24
+ virtualColSpan = 0
25
+ }) => {
26
+ const {
27
+ draggableColumn,
28
+ draggedColumnIndex,
29
+ onClick,
30
+ onMouseDown,
31
+ setContainerRef
32
+ } = useTableHeader.useTableHeader({
33
+ columns,
34
+ onMoveColumn,
35
+ onSortColumn,
36
+ tableConfig
37
+ });
38
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${classBase}-col-headings`, ref: setContainerRef, children: [
39
+ headings.map((colHeaders, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "vuuTable-heading", children: colHeaders.map(({ label, width }, j) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "vuuTable-headingCell", style: { width }, children: label }, j)) }, i)),
40
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${classBase}-col-headers`, role: "row", children: [
41
+ virtualColSpan > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
42
+ "div",
43
+ {
44
+ role: "cell",
45
+ className: "vuuTableCell",
46
+ style: { width: virtualColSpan }
47
+ }
48
+ ) : null,
49
+ columns.filter(vuuUtils.isNotHidden).map(
50
+ (col, i) => vuuUtils.isGroupColumn(col) ? /* @__PURE__ */ jsxRuntime.jsx(
51
+ GroupHeaderCell.GroupHeaderCell,
52
+ {
53
+ "aria-colindex": col.index,
54
+ column: col,
55
+ "data-index": i,
56
+ onMoveColumn: onMoveGroupColumn,
57
+ onRemoveColumn: onRemoveGroupColumn,
58
+ onResize: onResizeColumn
59
+ },
60
+ col.name
61
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
62
+ HeaderCell.HeaderCell,
63
+ {
64
+ "aria-colindex": col.index,
65
+ className: cx({
66
+ "vuuDraggable-dragAway": i === draggedColumnIndex
67
+ }),
68
+ column: col,
69
+ "data-index": i,
70
+ id: `${tableId}-col-${i}`,
71
+ onClick,
72
+ onMouseDown,
73
+ onResize: onResizeColumn,
74
+ showMenu: showColumnHeaderMenus
75
+ },
76
+ col.name
77
+ )
78
+ ),
79
+ draggableColumn
80
+ ] })
81
+ ] });
82
+ }
83
+ );
84
+ TableHeader.displayName = "TableHeader";
85
+
86
+ exports.TableHeader = TableHeader;
87
+ //# 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":["memo","useTableHeader","jsx","isNotHidden","isGroupColumn","GroupHeaderCell","HeaderCell"],"mappings":";;;;;;;;;;AAmCO,MAAM,WAAc,GAAAA,UAAA;AAAA,EACzB,CAAC;AAAA,IACC,SAAY,GAAA,UAAA;AAAA,IACZ,OAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,qBAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAiB,GAAA,CAAA;AAAA,GACK,KAAA;AACtB,IAAM,MAAA;AAAA,MACJ,eAAA;AAAA,MACA,kBAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,QACEC,6BAAe,CAAA;AAAA,MACjB,OAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAA,uCACG,KAAI,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,aAAA,CAAA,EAAiB,KAAK,eAC/C,EAAA,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,GAAI,CAAA,CAAC,UAAY,EAAA,CAAA,qBACxBC,cAAA,CAAA,KAAA,EAAA,EAAI,SAAU,EAAA,kBAAA,EACZ,QAAW,EAAA,UAAA,CAAA,GAAA,CAAI,CAAC,EAAE,KAAO,EAAA,KAAA,EAAS,EAAA,CAAA,qBAChCA,cAAA,CAAA,KAAA,EAAA,EAAY,SAAU,EAAA,sBAAA,EAAuB,KAAO,EAAA,EAAE,KAAM,EAAA,EAC1D,QADO,EAAA,KAAA,EAAA,EAAA,CAEV,CACD,CAAA,EAAA,EALoC,CAMvC,CACD,CAAA;AAAA,sCACA,KAAI,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,YAAA,CAAA,EAAgB,MAAK,KAC9C,EAAA,QAAA,EAAA;AAAA,QAAA,cAAA,GAAiB,CAChB,mBAAAA,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAK,EAAA,MAAA;AAAA,YACL,SAAU,EAAA,cAAA;AAAA,YACV,KAAA,EAAO,EAAE,KAAA,EAAO,cAAe,EAAA;AAAA,WAAA;AAAA,SAE/B,GAAA,IAAA;AAAA,QACH,OAAA,CAAQ,MAAO,CAAAC,oBAAW,CAAE,CAAA,GAAA;AAAA,UAAI,CAAC,GAAA,EAAK,CACrC,KAAAC,sBAAA,CAAc,GAAG,CACf,mBAAAF,cAAA;AAAA,YAACG,+BAAA;AAAA,YAAA;AAAA,cACC,iBAAe,GAAI,CAAA,KAAA;AAAA,cACnB,MAAQ,EAAA,GAAA;AAAA,cACR,YAAY,EAAA,CAAA;AAAA,cAEZ,YAAc,EAAA,iBAAA;AAAA,cACd,cAAgB,EAAA,mBAAA;AAAA,cAChB,QAAU,EAAA,cAAA;AAAA,aAAA;AAAA,YAHL,GAAI,CAAA,IAAA;AAAA,WAMX,mBAAAH,cAAA;AAAA,YAACI,qBAAA;AAAA,YAAA;AAAA,cACC,iBAAe,GAAI,CAAA,KAAA;AAAA,cACnB,WAAW,EAAG,CAAA;AAAA,gBACZ,yBAAyB,CAAM,KAAA,kBAAA;AAAA,eAChC,CAAA;AAAA,cACD,MAAQ,EAAA,GAAA;AAAA,cACR,YAAY,EAAA,CAAA;AAAA,cACZ,EAAI,EAAA,CAAA,EAAG,OAAO,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA;AAAA,cAEvB,OAAA;AAAA,cACA,WAAA;AAAA,cACA,QAAU,EAAA,cAAA;AAAA,cACV,QAAU,EAAA,qBAAA;AAAA,aAAA;AAAA,YAJL,GAAI,CAAA,IAAA;AAAA,WAKX;AAAA,SAEJ;AAAA,QACC,eAAA;AAAA,OACH,EAAA,CAAA;AAAA,KACF,EAAA,CAAA,CAAA;AAAA,GAEJ;AACF,EAAA;AACA,WAAA,CAAY,WAAc,GAAA,aAAA;;;;"}
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var react = require('react');
6
+
7
+ const useTableHeader = ({
8
+ columns,
9
+ onMoveColumn,
10
+ onSortColumn,
11
+ tableConfig
12
+ }) => {
13
+ const containerRef = react.useRef(null);
14
+ const scrollingContainerRef = react.useRef(null);
15
+ const setContainerRef = react.useCallback((el) => {
16
+ containerRef.current = el;
17
+ if (el) {
18
+ scrollingContainerRef.current = el.closest(".vuuTable-contentContainer");
19
+ } else {
20
+ scrollingContainerRef.current = null;
21
+ }
22
+ }, []);
23
+ const handleDropColumnHeader = react.useCallback(
24
+ ({ fromIndex: moveFrom, toIndex: moveTo }) => {
25
+ const column = columns[moveFrom];
26
+ const orderedColumns = vuuUtils.moveColumnTo(columns, column, moveTo);
27
+ const ofColumn = ({ name }) => (col) => col.name === name;
28
+ const targetIndex = orderedColumns.findIndex(ofColumn(column));
29
+ const nextColumn = orderedColumns[targetIndex + 1];
30
+ const insertPos = nextColumn ? tableConfig.columns.findIndex(ofColumn(nextColumn)) : -1;
31
+ if (moveTo > moveFrom && insertPos !== -1) {
32
+ onMoveColumn(vuuUtils.moveColumnTo(tableConfig.columns, column, insertPos - 1));
33
+ } else {
34
+ onMoveColumn(vuuUtils.moveColumnTo(tableConfig.columns, column, insertPos));
35
+ }
36
+ },
37
+ [columns, onMoveColumn, tableConfig.columns]
38
+ );
39
+ const handleColumnHeaderClick = react.useCallback(
40
+ (evt) => {
41
+ const headerCell = vuuUtils.queryClosest(evt.target, ".vuuTableHeaderCell");
42
+ const colIdx = parseInt(headerCell?.dataset.index ?? "-1");
43
+ const column = vuuUtils.visibleColumnAtIndex(columns, colIdx);
44
+ const isAdditive = evt.shiftKey;
45
+ column && onSortColumn(column, isAdditive);
46
+ },
47
+ [columns, onSortColumn]
48
+ );
49
+ const {
50
+ onMouseDown: columnHeaderDragMouseDown,
51
+ draggable: draggableColumn,
52
+ ...dragDropHook
53
+ } = vuuUiControls.useDragDrop({
54
+ allowDragDrop: true,
55
+ containerRef,
56
+ draggableClassName: `vuuTable`,
57
+ itemQuery: ".vuuTableHeaderCell",
58
+ onDrop: handleDropColumnHeader,
59
+ orientation: "horizontal",
60
+ scrollingContainerRef
61
+ });
62
+ return {
63
+ draggableColumn,
64
+ draggedColumnIndex: dragDropHook.draggedItemIndex,
65
+ onClick: handleColumnHeaderClick,
66
+ onMouseDown: columnHeaderDragMouseDown,
67
+ setContainerRef
68
+ };
69
+ };
70
+
71
+ exports.useTableHeader = useTableHeader;
72
+ //# 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":["useRef","useCallback","moveColumnTo","queryClosest","visibleColumnAtIndex","useDragDrop"],"mappings":"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"}
package/cjs/useCell.js ADDED
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ var vuuUtils = require('@vuu-ui/vuu-utils');
4
+ var cx = require('clsx');
5
+ var react = require('react');
6
+
7
+ const useCell = (column, classBase, isHeader) => (
8
+ // TODO measure perf without the memo, might not be worth the cost
9
+ react.useMemo(() => {
10
+ const className = cx(classBase, {
11
+ vuuPinFloating: column.pin === "floating",
12
+ vuuPinLeft: column.pin === "left",
13
+ vuuPinRight: column.pin === "right",
14
+ vuuEndPin: isHeader && column.endPin,
15
+ // [`${classBase}-resizing`]: column.resizing,
16
+ [`${classBase}-editable`]: column.editable,
17
+ [`${classBase}-right`]: column.align === "right"
18
+ });
19
+ const style = vuuUtils.getColumnStyle(column);
20
+ return {
21
+ className,
22
+ style
23
+ };
24
+ }, [column, classBase, isHeader])
25
+ );
26
+
27
+ exports.useCell = useCell;
28
+ //# 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":["useMemo","getColumnStyle"],"mappings":";;;;;;AAKa,MAAA,OAAA,GAAU,CACrB,MAAA,EACA,SACA,EAAA,QAAA;AAAA;AAAA,EAGAA,cAAQ,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,GAAQC,wBAAe,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;;;;"}