@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 @@
1
+ {"version":3,"file":"buildContextMenuDescriptors.js","sources":["../../src/context-menu/buildContextMenuDescriptors.ts"],"sourcesContent":["import {\n ContextMenuItemDescriptor,\n DataSource,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { RuntimeColumnDescriptor, PinLocation } from \"@vuu-ui/vuu-table-types\";\nimport { isNumericColumn } from \"@vuu-ui/vuu-utils\";\n\nexport type ContextMenuLocation = \"header\" | \"filter\" | \"grid\";\n\ntype MaybeColumn = { column?: RuntimeColumnDescriptor };\n\nexport const buildContextMenuDescriptors =\n (dataSource?: DataSource): MenuBuilder =>\n (location, options) => {\n const descriptors: ContextMenuItemDescriptor[] = [];\n if (dataSource === undefined) {\n return descriptors;\n }\n //TODO which should it be ?\n if (location === \"header\" || location === \"column-menu\") {\n descriptors.push(\n ...buildSortMenuItems(options as MaybeColumn, dataSource)\n );\n descriptors.push(\n ...buildGroupMenuItems(options as MaybeColumn, dataSource)\n );\n descriptors.push(\n ...buildAggregationMenuItems(options as MaybeColumn, dataSource)\n );\n descriptors.push(...buildColumnDisplayMenuItems(options as MaybeColumn));\n descriptors.push({\n action: \"column-settings\",\n icon: \"cog\",\n label: `Column Settings`,\n options,\n });\n descriptors.push({\n action: \"table-settings\",\n icon: \"cog\",\n label: `DataGrid Settings`,\n options,\n });\n }\n\n // if (options?.selectedRowCount){\n // // TODO pass the table name\n // const rpcActions = getRpcActions();\n // for (let {label, method} of rpcActions){\n // descriptors.push({action: Action.RpcCall, label, options: {method}})\n // }\n // }\n\n return descriptors;\n };\n\nfunction buildSortMenuItems(\n options: MaybeColumn,\n { sort: { sortDefs } }: DataSource\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (column === undefined) {\n return menuItems;\n }\n\n const hasSort = sortDefs.length > 0;\n\n if (column.sorted === \"A\") {\n menuItems.push({\n label: \"Reverse Sort (DSC)\",\n action: \"sort-dsc\",\n options,\n });\n } else if (column.sorted === \"D\") {\n menuItems.push({\n label: \"Reverse Sort (ASC)\",\n action: \"sort-asc\",\n options,\n });\n } else if (typeof column.sorted === \"number\") {\n if (column.sorted > 0) {\n menuItems.push({\n label: \"Reverse Sort (DSC)\",\n action: \"sort-add-dsc\",\n options,\n });\n } else {\n menuItems.push({\n label: \"Reverse Sort (ASC)\",\n action: \"sort-add-asc\",\n options,\n });\n }\n\n // removing the last column from a sort would be a no-op, so pointless\n if (hasSort && Math.abs(column.sorted) < sortDefs.length) {\n menuItems.push({\n label: \"Remove from sort\",\n action: \"sort-remove\",\n options,\n });\n }\n\n menuItems.push({\n label: \"New Sort\",\n children: [\n { label: \"Ascending\", action: \"sort-asc\", options },\n { label: \"Descending\", action: \"sort-dsc\", options },\n ],\n });\n } else if (hasSort) {\n menuItems.push({\n label: \"Add to sort\",\n children: [\n { label: \"Ascending\", action: \"sort-add-asc\", options },\n { label: \"Descending\", action: \"sort-add-dsc\", options },\n ],\n });\n menuItems.push({\n label: \"New Sort\",\n children: [\n { label: \"Ascending\", action: \"sort-asc\", options },\n { label: \"Descending\", action: \"sort-dsc\", options },\n ],\n });\n } else {\n menuItems.push({\n label: \"Sort\",\n children: [\n { label: \"Ascending\", action: \"sort-asc\", options },\n { label: \"Descending\", action: \"sort-dsc\", options },\n ],\n });\n }\n return menuItems;\n}\n\nfunction buildAggregationMenuItems(\n options: MaybeColumn,\n dataSource: DataSource\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n if (column === undefined || dataSource.groupBy.length === 0) {\n return [];\n }\n const { name, label = name } = column;\n\n return [\n {\n label: `Aggregate ${label}`,\n children: [\n { label: \"Count\", action: \"agg-count\", options },\n { label: \"Distinct\", action: \"agg-distinct\", options },\n ].concat(\n isNumericColumn(column)\n ? [\n { label: \"Sum\", action: \"agg-sum\", options },\n { label: \"Avg\", action: \"agg-avg\", options },\n { label: \"High\", action: \"agg-high\", options },\n { label: \"Low\", action: \"agg-low\", options },\n ]\n : []\n ),\n },\n ];\n}\n\nconst pinColumn = (options: unknown, pinLocation: PinLocation) =>\n ({\n label: `Pin ${pinLocation}`,\n action: `column-pin-${pinLocation}`,\n options,\n } as ContextMenuItemDescriptor);\n\nconst pinLeft = (options: unknown) => pinColumn(options, \"left\");\nconst pinFloating = (options: unknown) => pinColumn(options, \"floating\");\nconst pinRight = (options: unknown) => pinColumn(options, \"right\");\n\nfunction buildColumnDisplayMenuItems(\n options: MaybeColumn\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n if (column === undefined) {\n return [];\n }\n const { pin } = column;\n\n const menuItems: ContextMenuItemDescriptor[] = [\n {\n label: `Hide column`,\n action: \"column-hide\",\n options,\n },\n {\n label: `Remove column`,\n action: \"column-remove\",\n options,\n },\n ];\n\n if (pin === undefined) {\n menuItems.push({\n label: `Pin column`,\n children: [pinLeft(options), pinFloating(options), pinRight(options)],\n });\n } else if (pin === \"left\") {\n menuItems.push(\n { label: \"Unpin column\", action: \"column-unpin\", options },\n {\n label: `Pin column`,\n children: [pinFloating(options), pinRight(options)],\n }\n );\n } else if (pin === \"right\") {\n menuItems.push(\n { label: \"Unpin column\", action: \"column-unpin\", options },\n {\n label: `Pin column`,\n children: [pinLeft(options), pinFloating(options)],\n }\n );\n } else if (pin === \"floating\") {\n menuItems.push(\n { label: \"Unpin column\", action: \"column-unpin\", options },\n {\n label: `Pin column`,\n children: [pinLeft(options), pinRight(options)],\n }\n );\n }\n\n return menuItems;\n}\n\nfunction buildGroupMenuItems(\n options: MaybeColumn,\n { groupBy }: DataSource\n): ContextMenuItemDescriptor[] {\n const { column } = options;\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (column === undefined) {\n return menuItems;\n }\n\n const { name, label = name } = column;\n\n if (groupBy.length === 0) {\n menuItems.push({\n label: `Group by ${label}`,\n action: \"group\",\n options,\n });\n } else {\n menuItems.push({\n label: `Add ${label} to group by`,\n action: \"group-add\",\n options,\n });\n }\n\n return menuItems;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { setAggregations, addGroupColumn, addSortColumn, setSortColumn, removeColumnFromFilter, AggregationType } from '@vuu-ui/vuu-utils';
2
+
3
+ const removeFilterColumn = (dataSourceFilter, column) => {
4
+ if (dataSourceFilter.filterStruct && column) {
5
+ const [filterStruct, filter] = removeColumnFromFilter(
6
+ column,
7
+ dataSourceFilter.filterStruct
8
+ );
9
+ return {
10
+ filter,
11
+ filterStruct
12
+ };
13
+ } else {
14
+ return dataSourceFilter;
15
+ }
16
+ };
17
+ const { Average, Count, Distinct, High, Low, Sum } = AggregationType;
18
+ const useHandleTableContextMenu = ({
19
+ dataSource,
20
+ onPersistentColumnOperation
21
+ }) => {
22
+ const handleContextMenuAction = (action) => {
23
+ const gridOptions = action.options;
24
+ if (gridOptions.column && dataSource) {
25
+ const { column } = gridOptions;
26
+ switch (action.menuId) {
27
+ case "sort-asc":
28
+ return dataSource.sort = setSortColumn(dataSource.sort, column, "A"), true;
29
+ case "sort-dsc":
30
+ return dataSource.sort = setSortColumn(dataSource.sort, column, "D"), true;
31
+ case "sort-add-asc":
32
+ return dataSource.sort = addSortColumn(dataSource.sort, column, "A"), true;
33
+ case "sort-add-dsc":
34
+ return dataSource.sort = addSortColumn(dataSource.sort, column, "D"), true;
35
+ case "group":
36
+ return dataSource.groupBy = addGroupColumn(dataSource.groupBy, column), true;
37
+ case "group-add":
38
+ return dataSource.groupBy = addGroupColumn(dataSource.groupBy, column), true;
39
+ case "column-hide":
40
+ return onPersistentColumnOperation({ type: "hideColumns", columns: [column] }), true;
41
+ case "column-remove":
42
+ return dataSource.columns = dataSource.columns.filter((name) => name !== column.name), true;
43
+ case "filter-remove-column":
44
+ return dataSource.filter = removeFilterColumn(dataSource.filter, column), true;
45
+ case "remove-filters":
46
+ return dataSource.filter = { filter: "" }, true;
47
+ case "agg-avg":
48
+ return dataSource.aggregations = setAggregations(dataSource.aggregations, column, Average), true;
49
+ case "agg-high":
50
+ return dataSource.aggregations = setAggregations(dataSource.aggregations, column, High), true;
51
+ case "agg-low":
52
+ return dataSource.aggregations = setAggregations(dataSource.aggregations, column, Low), true;
53
+ case "agg-count":
54
+ return dataSource.aggregations = setAggregations(dataSource.aggregations, column, Count), true;
55
+ case "agg-distinct":
56
+ return dataSource.aggregations = setAggregations(dataSource.aggregations, column, Distinct), true;
57
+ case "agg-sum":
58
+ return dataSource.aggregations = setAggregations(dataSource.aggregations, column, Sum), true;
59
+ case "column-pin-floating":
60
+ return onPersistentColumnOperation({ type: "pinColumn", column, pin: "floating" }), true;
61
+ case "column-pin-left":
62
+ return onPersistentColumnOperation({ type: "pinColumn", column, pin: "left" }), true;
63
+ case "column-pin-right":
64
+ return onPersistentColumnOperation({ type: "pinColumn", column, pin: "right" }), true;
65
+ case "column-unpin":
66
+ return onPersistentColumnOperation({ type: "pinColumn", column, pin: void 0 }), true;
67
+ case "column-settings":
68
+ return onPersistentColumnOperation({ type: "columnSettings", column }), true;
69
+ case "table-settings":
70
+ return onPersistentColumnOperation({ type: "tableSettings" }), true;
71
+ }
72
+ }
73
+ return false;
74
+ };
75
+ return handleContextMenuAction;
76
+ };
77
+
78
+ export { useHandleTableContextMenu };
79
+ //# sourceMappingURL=useHandleTableContextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHandleTableContextMenu.js","sources":["../../src/context-menu/useHandleTableContextMenu.ts"],"sourcesContent":["/* eslint-disable no-sequences */\nimport { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { removeColumnFromFilter } from \"@vuu-ui/vuu-utils\";\nimport { VuuFilter } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n DataSource,\n DataSourceFilter,\n MenuActionHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport { PersistentColumnAction } from \"../useTableModel\";\nimport {\n addGroupColumn,\n addSortColumn,\n AggregationType,\n setAggregations,\n setSortColumn,\n} from \"@vuu-ui/vuu-utils\";\n\nexport interface ContextMenuOptions {\n column?: RuntimeColumnDescriptor;\n filter?: Filter;\n sort?: VuuFilter;\n}\nexport interface ContextMenuHookProps {\n dataSource?: DataSource;\n /**\n * A persistent Column Operation is any manipulation of a table column that should be\n * persisted across user sessions. e.g. if user pins a column, column should still be\n * pinned next time user opens app.\n */\n onPersistentColumnOperation: (action: PersistentColumnAction) => void;\n}\n\nconst removeFilterColumn = (\n dataSourceFilter: DataSourceFilter,\n column: RuntimeColumnDescriptor\n) => {\n if (dataSourceFilter.filterStruct && column) {\n const [filterStruct, filter] = removeColumnFromFilter(\n column,\n dataSourceFilter.filterStruct\n );\n return {\n filter,\n filterStruct,\n };\n } else {\n return dataSourceFilter;\n }\n};\n\nconst { Average, Count, Distinct, High, Low, Sum } = AggregationType;\n\nexport const useHandleTableContextMenu = ({\n dataSource,\n onPersistentColumnOperation,\n}: ContextMenuHookProps) => {\n /** return {boolean} used by caller to determine whether to forward to additional installed context menu handlers */\n const handleContextMenuAction: MenuActionHandler = (action): boolean => {\n const gridOptions = action.options as ContextMenuOptions;\n if (gridOptions.column && dataSource) {\n const { column } = gridOptions;\n // prettier-ignore\n switch(action.menuId){\n case \"sort-asc\": return (dataSource.sort = setSortColumn(dataSource.sort, column, \"A\")), true;\n case \"sort-dsc\": return (dataSource.sort = setSortColumn(dataSource.sort, column, \"D\")), true;\n case \"sort-add-asc\": return (dataSource.sort = addSortColumn(dataSource.sort, column, \"A\")), true;\n case \"sort-add-dsc\": return (dataSource.sort = addSortColumn(dataSource.sort, column, \"D\")), true;\n case \"group\": return (dataSource.groupBy = addGroupColumn(dataSource.groupBy, column)), true;\n case \"group-add\": return (dataSource.groupBy = addGroupColumn(dataSource.groupBy, column)), true;\n case \"column-hide\": return onPersistentColumnOperation({type: \"hideColumns\", columns: [column]}), true;\n case \"column-remove\": return (dataSource.columns = dataSource.columns.filter(name => name !== column.name)), true\n case \"filter-remove-column\": return (dataSource.filter = removeFilterColumn(dataSource.filter, column)), true;\n case \"remove-filters\": return (dataSource.filter = {filter:\"\"}), true;\n case \"agg-avg\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Average)), true;\n case \"agg-high\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, High)), true;\n case \"agg-low\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Low)), true;\n case \"agg-count\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Count)), true;\n case \"agg-distinct\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Distinct)), true;\n case \"agg-sum\": return dataSource.aggregations = (setAggregations(dataSource.aggregations, column, Sum)), true;\n case \"column-pin-floating\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: \"floating\"}), true;\n case \"column-pin-left\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: \"left\"}), true;\n case \"column-pin-right\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: \"right\"}), true;\n case \"column-unpin\": return onPersistentColumnOperation({type: \"pinColumn\", column, pin: undefined}), true\n case \"column-settings\": return onPersistentColumnOperation({type: \"columnSettings\", column}), true\n case \"table-settings\": return onPersistentColumnOperation({type: \"tableSettings\"}), true\n default:\n }\n }\n return false;\n };\n\n return handleContextMenuAction;\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ var headerCellCss = "\n.vuu-theme {\n --svg-spinner: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><path fill=\"rgb(38, 112, 169)\" d=\"M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50\"><animateTransform attributeName=\"transform\" attributeType=\"XML\" type=\"rotate\" dur=\"1s\" from=\"0 50 50\" to=\"360 50 50\" repeatCount=\"indefinite\" /></path></svg>');\n}\n\n.vuuTableGroupHeaderCell {\n --vuuColumnHeaderPill-margin: 0;\n --cell-align: 'flex-start';\n text-align: left;\n background: var(--dataTable-background);\n cursor: default;\n height: var(--vuuTableHeaderHeight);\n /* ensure header row sits atop everything else when scrolling down */\n }\n\n\n .vuuTableGroupHeaderCell-inner {\n align-items: center;\n display: flex;\n gap: 4px;\n height: 100%;\n padding-left: 1px;\n }\n\n .vuuTableGroupHeaderCell-col {\n align-items: center;\n background-color: inherit;\n display: inline-flex;\n flex: 0 1 auto;\n height: calc(var(--vuuTableHeaderHeight) - 2px);\n justify-content: space-between;\n padding-right: 8px;\n position: relative;\n }\n\n .vuuTableGroupHeaderCell-label {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n }\n\n .vuuTableGroupHeaderCell-close {\n --vuu-icon-height: 18px;\n --vuu-icon-width: 18px;\n cursor: pointer;\n left: 3px;\n }\n \n .vuuTableGroupHeaderCell-resizing {\n --columnResizer-color: var(--salt-color-blue-500);\n --columnResizer-height: var(--table-height);\n --columnResizer-width: 2px;\n }\n .vuuTableGroupHeaderCell-pending {\n --pending-content: '';\n }\n\n .vuuTableGroupHeaderCell-col:has(+ .vuuColumnResizer):after {\n content: var(--pending-content);\n width: 24px;\n height:24px;\n background-image: var(--svg-spinner);\n background-repeat: no-repeat;\n background-size: cover;\n }\n";
2
+
3
+ export { headerCellCss as default };
4
+ //# sourceMappingURL=GroupHeaderCell.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupHeaderCell.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,115 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useRef, useState, useCallback, createElement } from 'react';
3
+ import { OverflowContainer } from '@vuu-ui/vuu-ui-controls';
4
+ import { useLayoutEffectSkipFirst } from '@vuu-ui/vuu-utils';
5
+ import { useComponentCssInjection } from '@salt-ds/styles';
6
+ import { useWindow } from '@salt-ds/window';
7
+ import cx from 'clsx';
8
+ import { ColumnHeaderPill } from '../column-header-pill/ColumnHeaderPill.js';
9
+ import { GroupColumnPill } from '../column-header-pill/GroupColumnPill.js';
10
+ import { ColumnResizer } from '../column-resizing/ColumnResizer.js';
11
+ import { useTableColumnResize } from '../column-resizing/useTableColumnResize.js';
12
+ import { useCell } from '../useCell.js';
13
+ import headerCellCss from './GroupHeaderCell.css.js';
14
+
15
+ const classBase = "vuuTableGroupHeaderCell";
16
+ const switchIfChanged = (columns, newColumns) => {
17
+ if (columns === newColumns) {
18
+ return columns;
19
+ } else {
20
+ return newColumns;
21
+ }
22
+ };
23
+ const GroupHeaderCell = ({
24
+ column: groupColumn,
25
+ className: classNameProp,
26
+ onMoveColumn,
27
+ onRemoveColumn,
28
+ onResize,
29
+ ...htmlAttributes
30
+ }) => {
31
+ const targetWindow = useWindow();
32
+ useComponentCssInjection({
33
+ testId: "vuu-group-header-cell",
34
+ css: headerCellCss,
35
+ window: targetWindow
36
+ });
37
+ const rootRef = useRef(null);
38
+ const { isResizing, ...resizeProps } = useTableColumnResize({
39
+ column: groupColumn,
40
+ onResize,
41
+ rootRef
42
+ });
43
+ const [columns, setColumns] = useState(groupColumn.columns);
44
+ const { className, style } = useCell(groupColumn, classBase, true);
45
+ const columnPillProps = columns.length > 1 ? {
46
+ removable: true,
47
+ onRemove: onRemoveColumn
48
+ } : void 0;
49
+ const handleMoveItem = useCallback(
50
+ (fromIndex, toIndex) => {
51
+ setColumns((cols) => {
52
+ const newCols = cols.slice();
53
+ const [tab] = newCols.splice(fromIndex, 1);
54
+ if (toIndex === -1) {
55
+ const result = newCols.concat(tab);
56
+ onMoveColumn?.(result);
57
+ return result;
58
+ } else {
59
+ newCols.splice(toIndex, 0, tab);
60
+ onMoveColumn?.(newCols);
61
+ return newCols;
62
+ }
63
+ });
64
+ },
65
+ [onMoveColumn]
66
+ );
67
+ useLayoutEffectSkipFirst(() => {
68
+ setColumns((cols) => switchIfChanged(cols, groupColumn.columns));
69
+ }, [groupColumn.columns]);
70
+ return /* @__PURE__ */ jsxs(
71
+ "div",
72
+ {
73
+ ...htmlAttributes,
74
+ className: cx(className, classNameProp, {
75
+ [`${classBase}-pending`]: groupColumn.groupConfirmed === false
76
+ }),
77
+ ref: rootRef,
78
+ role: "columnheader",
79
+ style,
80
+ children: [
81
+ /* @__PURE__ */ jsx(
82
+ OverflowContainer,
83
+ {
84
+ allowDragDrop: true,
85
+ className: `${classBase}-inner`,
86
+ onMoveItem: handleMoveItem,
87
+ overflowPosition: "start",
88
+ children: columns.map((column) => {
89
+ return /* @__PURE__ */ createElement(
90
+ GroupColumnPill,
91
+ {
92
+ ...columnPillProps,
93
+ column,
94
+ key: column.name
95
+ }
96
+ );
97
+ })
98
+ }
99
+ ),
100
+ /* @__PURE__ */ jsx(
101
+ ColumnHeaderPill,
102
+ {
103
+ column: groupColumn,
104
+ removable: true,
105
+ onRemove: onRemoveColumn
106
+ }
107
+ ),
108
+ groupColumn.resizeable !== false ? /* @__PURE__ */ jsx(ColumnResizer, { ...resizeProps }) : null
109
+ ]
110
+ }
111
+ );
112
+ };
113
+
114
+ export { GroupHeaderCell };
115
+ //# sourceMappingURL=GroupHeaderCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupHeaderCell.js","sources":["../../src/header-cell/GroupHeaderCell.tsx"],"sourcesContent":["import { OverflowContainer } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n ColumnDescriptor,\n GroupColumnDescriptor,\n HeaderCellProps,\n RuntimeColumnDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\nimport { useLayoutEffectSkipFirst } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { ColumnHeaderPill, GroupColumnPill } from \"../column-header-pill\";\nimport { ColumnResizer, useTableColumnResize } from \"../column-resizing\";\nimport { useCell } from \"../useCell\";\n\nimport headerCellCss from \"./GroupHeaderCell.css\";\n\nconst classBase = \"vuuTableGroupHeaderCell\";\n\nconst switchIfChanged = (\n columns: RuntimeColumnDescriptor[],\n newColumns: RuntimeColumnDescriptor[]\n) => {\n if (columns === newColumns) {\n return columns;\n } else {\n return newColumns;\n }\n};\n\nexport interface GroupHeaderCellProps\n extends Omit<HeaderCellProps, \"onDragStart\" | \"onDrag\" | \"onDragEnd\"> {\n column: GroupColumnDescriptor;\n onMoveColumn?: (columns: ColumnDescriptor[]) => void;\n onRemoveColumn: (column: RuntimeColumnDescriptor) => void;\n}\n\nexport const GroupHeaderCell = ({\n column: groupColumn,\n className: classNameProp,\n onMoveColumn,\n onRemoveColumn,\n onResize,\n ...htmlAttributes\n}: GroupHeaderCellProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-group-header-cell\",\n css: headerCellCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLTableCellElement>(null);\n const { isResizing, ...resizeProps } = useTableColumnResize({\n column: groupColumn,\n onResize,\n rootRef,\n });\n\n const [columns, setColumns] = useState(groupColumn.columns);\n const { className, style } = useCell(groupColumn, classBase, true);\n const columnPillProps =\n columns.length > 1\n ? {\n removable: true,\n onRemove: onRemoveColumn,\n }\n : undefined;\n\n const handleMoveItem = useCallback(\n (fromIndex, toIndex) => {\n setColumns((cols) => {\n const newCols = cols.slice();\n const [tab] = newCols.splice(fromIndex, 1);\n if (toIndex === -1) {\n const result = newCols.concat(tab);\n onMoveColumn?.(result);\n return result;\n } else {\n newCols.splice(toIndex, 0, tab);\n onMoveColumn?.(newCols);\n return newCols;\n }\n });\n },\n [onMoveColumn]\n );\n\n useLayoutEffectSkipFirst(() => {\n setColumns((cols) => switchIfChanged(cols, groupColumn.columns));\n }, [groupColumn.columns]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(className, classNameProp, {\n [`${classBase}-pending`]: groupColumn.groupConfirmed === false,\n })}\n ref={rootRef}\n role=\"columnheader\"\n style={style}\n >\n <OverflowContainer\n allowDragDrop\n className={`${classBase}-inner`}\n onMoveItem={handleMoveItem}\n overflowPosition=\"start\"\n >\n {columns.map((column) => {\n return (\n <GroupColumnPill\n {...columnPillProps}\n column={column}\n key={column.name}\n />\n );\n })}\n </OverflowContainer>\n <ColumnHeaderPill\n column={groupColumn}\n removable\n onRemove={onRemoveColumn}\n />\n\n {groupColumn.resizeable !== false ? (\n <ColumnResizer {...resizeProps} />\n ) : null}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ var headerCellCss = ".vuuTableGroupHeaderCell,\n.vuuTableHeaderCell {\n --cell-align: 'flex-start';\n --vuuColumnHeaderPill-margin: 0;\n --vuuColumnHeaderPill-flex: 0 0 24px;\n\n align-items: center;\n background-color: var(--vuuTableHeaderCell-background, inherit);\n border-bottom: 1px solid #ccc;\n border-right-color: var(--cell-borderColor);\n border-right-style: solid;\n border-right-width: 1px;\n box-sizing: border-box;\n cursor: default;\n display: inline-flex;\n gap: 4px;\n height: var(--header-height);\n padding: 0 12px 0 4px;\n position: relative;\n vertical-align: top;\n}\n\n.vuuTableHeaderCell:focus {\n outline: var(--vuuTableCell-outline, solid var(--salt-focused-outlineColor) 2px);\n outline-offset: -3px;\n}\n\n.vuuTableHeaderCell-right {\n --columnResizer-left: 0;\n --vuuTable-columnMenu-margin: 0;\n --vuuColumnHeaderPill-margin: 0 3px 0 0;\n --column-menu-left: 2px;\n justify-content: flex-end;\n padding: 0 3px 0 12px;\n}\n\n.vuuTableHeaderCell-noMenu {\n padding-left: var(--salt-spacing-300)\n}\n\n.vuuTableHeaderCell-label {\n flex: 0 1 auto;\n line-height: calc(var(--header-height) - 1px);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.vuuTableHeaderCell-right .vuuTableHeaderCell-label {\n text-align: right;\n}\n\n.vuuTableHeaderCell-resizing {\n --columnResizeThumb-color: var(--vuu-color-purple-10);\n --columnResizer-color: var(--vuu-color-purple-10);\n --columnResizer-height: var(--table-height);\n}\n\n.vuuTableHeaderCell.vuuPinLeft {\n padding-left: 2px;\n}\n\n .vuuTableHeaderCell.vuuPinLeft.vuuEndPin .vuuColumnResizer:before {\n --height: calc(var(--table-height) - var(--horizontal-scrollbar-height));\n --inset-r: calc(var(--pin-width) - 2px);\n --inset-b: calc(var(--height) - 2px);\n --clip-path: polygon(\n 0% 0%, \n 0% 120%, \n 2px 120%, \n 2px 2px, \n var(--inset-r) 2px, \n var(--inset-r) var(--inset-b), \n 2px var(--inset-b), \n 2px 120%, \n 120% 120%, \n 120% 0% \n );\n background-color: transparent;\n border-color: var(--vuuTablePinnedColumn-borderColor, var(--salt-container-primary-borderColor));\n border-width: 1px;\n border-style: solid solid solid solid;\n /* border-radius: 0 6px 6px 0; */\n border-radius: 4px;\n box-shadow: 2px 1px 4px 0px rgba(0, 0, 0, 0.10);\n /* clip-path: inset(10px 10px 10px 10px); */\n clip-path: var(--clip-path);\n content: '';\n position: absolute;\n width: var(--pin-width);\n top:0;\n bottom:0;\n right: 3px;\n height: var(--height);\n z-index: -5;\n}\n\n.vuuTableHeaderCell.vuuPinRight.vuuEndPin .vuuColumnResizer:before {\n --height: calc(var(--table-height) - var(--horizontal-scrollbar-height));\n --inset-r: calc(var(--pin-width) - 2px);\n --inset-b: calc(var(--height) - 2px);\n --clip-path: polygon(\n -20% 0%, \n -20% 120%, \n 2px 120%, \n 2px 2px, \n var(--inset-r) 2px, \n var(--inset-r) var(--inset-b), \n 2px var(--inset-b), \n 2px 120%, \n 120% 120%, \n 120% 0% \n );\n background-color: transparent;\n border-color: #A9AAAD;\n border-width: 1px;\n border-style: solid solid solid solid;\n /* border-radius: 0 6px 6px 0; */\n border-radius: 4px;\n box-shadow: -2px 1px 4px 0px rgba(0, 0, 0, 0.10);\n /* clip-path: inset(10px 10px 10px 10px); */\n clip-path: var(--clip-path);\n content: '';\n position: absolute;\n width: var(--pin-width);\n top:0;\n bottom:0;\n right: 0px;\n height: var(--height);\n z-index: -5;\n}\n\n.vuuTableHeaderCell.vuuDraggable-dragAway {\n display: none;\n}\n\n.vuuTable-headingCell {\n background: var(--dataTable-background);\n border-color: var(--salt-separable-tertiary-borderColor);\n border-style: solid solid solid none;\n border-width: 1px;\n color: var(--salt-text-secondary-foreground);\n display: inline-block;\n height: var(--header-height);\n padding: 0 !important;\n}\n";
2
+
3
+ export { headerCellCss as default };
4
+ //# sourceMappingURL=HeaderCell.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderCell.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,107 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useContextMenu } from '@vuu-ui/vuu-popups';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import cx from 'clsx';
6
+ import { useRef, useMemo, useCallback } from 'react';
7
+ import { SortIndicator } from '../column-header-pill/SortIndicator.js';
8
+ import { ColumnMenu } from '../column-menu/ColumnMenu.js';
9
+ import { ColumnResizer } from '../column-resizing/ColumnResizer.js';
10
+ import { useTableColumnResize } from '../column-resizing/useTableColumnResize.js';
11
+ import { useCell } from '../useCell.js';
12
+ import headerCellCss from './HeaderCell.css.js';
13
+
14
+ const classBase = "vuuTableHeaderCell";
15
+ const HeaderCell = ({
16
+ className: classNameProp,
17
+ column,
18
+ onClick,
19
+ onResize,
20
+ showMenu = true,
21
+ ...htmlAttributes
22
+ }) => {
23
+ const targetWindow = useWindow();
24
+ useComponentCssInjection({
25
+ testId: "vuu-header-cell",
26
+ css: headerCellCss,
27
+ window: targetWindow
28
+ });
29
+ const { HeaderCellContentRenderer, HeaderCellLabelRenderer } = column;
30
+ const rootRef = useRef(null);
31
+ const { isResizing, ...resizeProps } = useTableColumnResize({
32
+ column,
33
+ onResize,
34
+ rootRef
35
+ });
36
+ const [showContextMenu] = useContextMenu();
37
+ const handleContextMenu = useMemo(() => {
38
+ if (showMenu) {
39
+ return void 0;
40
+ } else {
41
+ return (e) => showContextMenu(e, "column-menu", { column });
42
+ }
43
+ }, [column, showContextMenu, showMenu]);
44
+ const headerItems = useMemo(() => {
45
+ const sortIndicator = /* @__PURE__ */ jsx(SortIndicator, { column });
46
+ const columnLabel = HeaderCellLabelRenderer ? /* @__PURE__ */ jsx(
47
+ HeaderCellLabelRenderer,
48
+ {
49
+ className: `${classBase}-label`,
50
+ column
51
+ }
52
+ ) : /* @__PURE__ */ jsx("div", { className: `${classBase}-label`, children: column.label ?? column.name });
53
+ const columnContent = HeaderCellContentRenderer ? [/* @__PURE__ */ jsx(HeaderCellContentRenderer, { column }, "content")] : [];
54
+ if (showMenu) {
55
+ const columnMenu = /* @__PURE__ */ jsx(ColumnMenu, { column });
56
+ if (column.align === "right") {
57
+ return [sortIndicator, columnLabel, columnContent, columnMenu];
58
+ } else {
59
+ return [columnMenu, columnLabel, sortIndicator, columnContent];
60
+ }
61
+ } else {
62
+ if (column.align === "right") {
63
+ return [sortIndicator, columnLabel, columnContent];
64
+ } else {
65
+ return [columnLabel, sortIndicator, columnContent];
66
+ }
67
+ }
68
+ }, [HeaderCellContentRenderer, HeaderCellLabelRenderer, column, showMenu]);
69
+ const handleClick = useCallback(
70
+ (evt) => {
71
+ !isResizing && onClick?.(evt);
72
+ },
73
+ [isResizing, onClick]
74
+ );
75
+ const handleKeyDown = useCallback(
76
+ (evt) => {
77
+ if (evt.key === "Enter") {
78
+ onClick?.(evt);
79
+ }
80
+ },
81
+ [onClick]
82
+ );
83
+ const { className, style } = useCell(column, classBase, true);
84
+ return /* @__PURE__ */ jsxs(
85
+ "div",
86
+ {
87
+ ...htmlAttributes,
88
+ className: cx(className, classNameProp, {
89
+ [`${classBase}-resizing`]: isResizing,
90
+ [`${classBase}-noMenu`]: showMenu === false
91
+ }),
92
+ onClick: handleClick,
93
+ onContextMenu: handleContextMenu,
94
+ onKeyDown: handleKeyDown,
95
+ ref: rootRef,
96
+ role: "columnheader",
97
+ style,
98
+ children: [
99
+ ...headerItems,
100
+ column.resizeable !== false ? /* @__PURE__ */ jsx(ColumnResizer, { ...resizeProps }) : null
101
+ ]
102
+ }
103
+ );
104
+ };
105
+
106
+ export { HeaderCell };
107
+ //# sourceMappingURL=HeaderCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderCell.js","sources":["../../src/header-cell/HeaderCell.tsx"],"sourcesContent":["import { useContextMenu } from \"@vuu-ui/vuu-popups\";\nimport { HeaderCellProps } from \"@vuu-ui/vuu-table-types\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport {\n KeyboardEventHandler,\n MouseEvent,\n MouseEventHandler,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\nimport { SortIndicator } from \"../column-header-pill\";\nimport { ColumnMenu } from \"../column-menu\";\nimport { ColumnResizer, useTableColumnResize } from \"../column-resizing\";\nimport { useCell } from \"../useCell\";\n\nimport headerCellCss from \"./HeaderCell.css\";\n\nconst classBase = \"vuuTableHeaderCell\";\n\nexport const HeaderCell = ({\n className: classNameProp,\n column,\n onClick,\n onResize,\n showMenu = true,\n ...htmlAttributes\n}: HeaderCellProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-header-cell\",\n css: headerCellCss,\n window: targetWindow,\n });\n\n const { HeaderCellContentRenderer, HeaderCellLabelRenderer } = column;\n const rootRef = useRef<HTMLDivElement>(null);\n const { isResizing, ...resizeProps } = useTableColumnResize({\n column,\n onResize,\n rootRef,\n });\n\n const [showContextMenu] = useContextMenu();\n\n const handleContextMenu = useMemo(() => {\n if (showMenu) {\n return undefined;\n } else {\n return (e: MouseEvent) => showContextMenu(e, \"column-menu\", { column });\n }\n }, [column, showContextMenu, showMenu]);\n\n const headerItems = useMemo(() => {\n const sortIndicator = <SortIndicator column={column} />;\n const columnLabel = HeaderCellLabelRenderer ? (\n <HeaderCellLabelRenderer\n className={`${classBase}-label`}\n column={column}\n />\n ) : (\n <div className={`${classBase}-label`}>{column.label ?? column.name}</div>\n );\n const columnContent = HeaderCellContentRenderer\n ? [<HeaderCellContentRenderer column={column} key=\"content\" />]\n : [];\n\n if (showMenu) {\n const columnMenu = <ColumnMenu column={column} />;\n\n if (column.align === \"right\") {\n return [sortIndicator, columnLabel, columnContent, columnMenu];\n } else {\n return [columnMenu, columnLabel, sortIndicator, columnContent];\n }\n } else {\n if (column.align === \"right\") {\n return [sortIndicator, columnLabel, columnContent];\n } else {\n return [columnLabel, sortIndicator, columnContent];\n }\n }\n }, [HeaderCellContentRenderer, HeaderCellLabelRenderer, column, showMenu]);\n\n const handleClick = useCallback<MouseEventHandler<HTMLDivElement>>(\n (evt) => {\n !isResizing && onClick?.(evt);\n },\n [isResizing, onClick]\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (evt) => {\n if (evt.key === \"Enter\") {\n onClick?.(evt);\n }\n },\n [onClick]\n );\n\n const { className, style } = useCell(column, classBase, true);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(className, classNameProp, {\n [`${classBase}-resizing`]: isResizing,\n [`${classBase}-noMenu`]: showMenu === false,\n })}\n onClick={handleClick}\n onContextMenu={handleContextMenu}\n onKeyDown={handleKeyDown}\n ref={rootRef}\n role=\"columnheader\"\n style={style}\n >\n {...headerItems}\n {column.resizeable !== false ? <ColumnResizer {...resizeProps} /> : null}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
package/esm/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export { GroupHeaderCell, GroupHeaderCell as GroupHeaderCellNext } from './header-cell/GroupHeaderCell.js';
2
+ export { HeaderCell } from './header-cell/HeaderCell.js';
3
+ export { Table } from './Table.js';
4
+ export { TableCell } from './table-cell/TableCell.js';
5
+ export { TableGroupCell } from './table-cell/TableGroupCell.js';
6
+ export { updateTableConfig } from './table-config.js';
7
+ export { CheckboxCell } from './cell-renderers/checkbox-cell/CheckboxCell.js';
8
+ export { InputCell } from './cell-renderers/input-cell/InputCell.js';
9
+ export { ToggleCell } from './cell-renderers/toggle-cell/ToggleCell.js';
10
+ export { useControlledTableNavigation } from './useControlledTableNavigation.js';
11
+ export { isShowColumnSettings, isShowTableSettings, useTableModel } from './useTableModel.js';
12
+ export { noScrolling, useTableScroll } from './useTableScroll.js';
13
+ export { useTableViewport } from './useTableViewport.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
@@ -0,0 +1,59 @@
1
+ import { WindowRange, isRowSelectedLast, metadataKeys } from '@vuu-ui/vuu-utils';
2
+
3
+ const { SELECTED } = metadataKeys;
4
+ class MovingWindow {
5
+ constructor({ from, to }) {
6
+ this.rowCount = 0;
7
+ this.setRowCount = (rowCount) => {
8
+ if (rowCount < this.data.length) {
9
+ this.data.length = rowCount;
10
+ }
11
+ this.rowCount = rowCount;
12
+ };
13
+ this.range = new WindowRange(from, to);
14
+ this.data = new Array(Math.max(0, to - from));
15
+ this.rowCount = 0;
16
+ }
17
+ add(data) {
18
+ const [index] = data;
19
+ if (this.isWithinRange(index)) {
20
+ const internalIndex = index - this.range.from;
21
+ this.data[internalIndex] = data;
22
+ if (data[SELECTED]) {
23
+ const previousRow = this.data[internalIndex - 1];
24
+ if (isRowSelectedLast(previousRow)) {
25
+ this.data[internalIndex - 1] = previousRow.slice();
26
+ this.data[internalIndex - 1][SELECTED] -= 4;
27
+ }
28
+ }
29
+ }
30
+ }
31
+ getAtIndex(index) {
32
+ return this.range.isWithin(index) && this.data[index - this.range.from] != null ? this.data[index - this.range.from] : void 0;
33
+ }
34
+ isWithinRange(index) {
35
+ return this.range.isWithin(index);
36
+ }
37
+ setRange({ from, to }) {
38
+ if (from !== this.range.from || to !== this.range.to) {
39
+ const [overlapFrom, overlapTo] = this.range.overlap(from, to);
40
+ const newData = new Array(Math.max(0, to - from));
41
+ for (let i = overlapFrom; i < overlapTo; i++) {
42
+ const data = this.getAtIndex(i);
43
+ if (data) {
44
+ const index = i - from;
45
+ newData[index] = data;
46
+ }
47
+ }
48
+ this.data = newData;
49
+ this.range.from = from;
50
+ this.range.to = to;
51
+ }
52
+ }
53
+ getSelectedRows() {
54
+ return this.data.filter((row) => row[SELECTED] !== 0);
55
+ }
56
+ }
57
+
58
+ export { MovingWindow };
59
+ //# 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":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ 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";
2
+
3
+ export { tableCellCss as default };
4
+ //# sourceMappingURL=TableCell.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableCell.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,70 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { isNumericColumn } 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 tableCellCss from './TableCell.css.js';
8
+
9
+ const classBase = "vuuTableCell";
10
+ const TableCell = ({
11
+ column,
12
+ columnMap,
13
+ onClick,
14
+ onDataEdited,
15
+ row
16
+ }) => {
17
+ const targetWindow = useWindow();
18
+ useComponentCssInjection({
19
+ testId: "vuu-table-cell",
20
+ css: tableCellCss,
21
+ window: targetWindow
22
+ });
23
+ const { className, style } = useCell(column, classBase);
24
+ const { CellRenderer, index, name, valueFormatter } = column;
25
+ const dataIdx = columnMap[name];
26
+ const handleDataItemEdited = useCallback(
27
+ (value) => {
28
+ if (onDataEdited) {
29
+ let typedValue = value;
30
+ if (isNumericColumn(column) && typeof value === "string") {
31
+ typedValue = column.serverDataType === "double" ? parseFloat(value) : parseInt(value);
32
+ }
33
+ return onDataEdited?.(row, name, typedValue);
34
+ } else {
35
+ throw Error(
36
+ "TableCell onDataEdited prop not supplied for an editable cell"
37
+ );
38
+ }
39
+ },
40
+ [column, name, onDataEdited, row]
41
+ );
42
+ const handleClick = useCallback(
43
+ (evt) => {
44
+ onClick?.(evt, column);
45
+ },
46
+ [column, onClick]
47
+ );
48
+ return /* @__PURE__ */ jsx(
49
+ "div",
50
+ {
51
+ "aria-colindex": index,
52
+ className,
53
+ onClick: onClick ? handleClick : void 0,
54
+ role: "cell",
55
+ style,
56
+ children: CellRenderer ? /* @__PURE__ */ jsx(
57
+ CellRenderer,
58
+ {
59
+ column,
60
+ columnMap,
61
+ onCommit: handleDataItemEdited,
62
+ row
63
+ }
64
+ ) : valueFormatter(row[dataIdx])
65
+ }
66
+ );
67
+ };
68
+
69
+ export { TableCell };
70
+ //# 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":[],"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,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAA,YAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,SAAW,EAAA,KAAA,EAAU,GAAA,OAAA,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,GAAA,WAAA;AAAA,IAC3B,CAAC,KAAU,KAAA;AACT,MAAA,IAAI,YAAc,EAAA;AAChB,QAAA,IAAI,UAAa,GAAA,KAAA,CAAA;AACjB,QAAA,IAAI,eAAgB,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,GAAA,WAAA;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,uBAAA,GAAA;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,mBAAA,GAAA;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,4 @@
1
+ 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";
2
+
3
+ export { tableGroupCellCss as default };
4
+ //# sourceMappingURL=TableGroupCell.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableGroupCell.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}