@raystack/apsara 0.56.6 → 1.0.0-rc.0

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 (605) hide show
  1. package/README.md +3 -3
  2. package/dist/components/accordion/accordion-content.cjs +3 -3
  3. package/dist/components/accordion/accordion-content.cjs.map +1 -1
  4. package/dist/components/accordion/accordion-content.d.ts +1 -7
  5. package/dist/components/accordion/accordion-content.d.ts.map +1 -1
  6. package/dist/components/accordion/accordion-content.js +3 -3
  7. package/dist/components/accordion/accordion-content.js.map +1 -1
  8. package/dist/components/accordion/accordion-item.cjs +3 -3
  9. package/dist/components/accordion/accordion-item.cjs.map +1 -1
  10. package/dist/components/accordion/accordion-item.d.ts +1 -7
  11. package/dist/components/accordion/accordion-item.d.ts.map +1 -1
  12. package/dist/components/accordion/accordion-item.js +2 -2
  13. package/dist/components/accordion/accordion-item.js.map +1 -1
  14. package/dist/components/accordion/accordion-root.cjs +24 -13
  15. package/dist/components/accordion/accordion-root.cjs.map +1 -1
  16. package/dist/components/accordion/accordion-root.d.ts +12 -6
  17. package/dist/components/accordion/accordion-root.d.ts.map +1 -1
  18. package/dist/components/accordion/accordion-root.js +24 -13
  19. package/dist/components/accordion/accordion-root.js.map +1 -1
  20. package/dist/components/accordion/accordion-trigger.cjs +3 -3
  21. package/dist/components/accordion/accordion-trigger.cjs.map +1 -1
  22. package/dist/components/accordion/accordion-trigger.d.ts +1 -7
  23. package/dist/components/accordion/accordion-trigger.d.ts.map +1 -1
  24. package/dist/components/accordion/accordion-trigger.js +2 -2
  25. package/dist/components/accordion/accordion-trigger.js.map +1 -1
  26. package/dist/components/accordion/accordion.d.ts +14 -4
  27. package/dist/components/accordion/accordion.d.ts.map +1 -1
  28. package/dist/components/accordion/accordion.module.css.cjs +1 -1
  29. package/dist/components/accordion/accordion.module.css.js +1 -1
  30. package/dist/components/avatar/avatar.cjs +4 -5
  31. package/dist/components/avatar/avatar.cjs.map +1 -1
  32. package/dist/components/avatar/avatar.d.ts +4 -5
  33. package/dist/components/avatar/avatar.d.ts.map +1 -1
  34. package/dist/components/avatar/avatar.js +4 -5
  35. package/dist/components/avatar/avatar.js.map +1 -1
  36. package/dist/components/avatar/index.d.ts +2 -2
  37. package/dist/components/breadcrumb/breadcrumb-item.cjs +2 -2
  38. package/dist/components/breadcrumb/breadcrumb-item.cjs.map +1 -1
  39. package/dist/components/breadcrumb/breadcrumb-item.d.ts +3 -3
  40. package/dist/components/breadcrumb/breadcrumb-item.d.ts.map +1 -1
  41. package/dist/components/breadcrumb/breadcrumb-item.js +2 -2
  42. package/dist/components/breadcrumb/breadcrumb-item.js.map +1 -1
  43. package/dist/components/button/button.cjs +3 -4
  44. package/dist/components/button/button.cjs.map +1 -1
  45. package/dist/components/button/button.d.ts +12 -11
  46. package/dist/components/button/button.d.ts.map +1 -1
  47. package/dist/components/button/button.js +3 -4
  48. package/dist/components/button/button.js.map +1 -1
  49. package/dist/components/calendar/calendar.cjs +1 -2
  50. package/dist/components/calendar/calendar.cjs.map +1 -1
  51. package/dist/components/calendar/calendar.d.ts.map +1 -1
  52. package/dist/components/calendar/calendar.js +2 -3
  53. package/dist/components/calendar/calendar.js.map +1 -1
  54. package/dist/components/checkbox/__tests__/checkbox-group.test.d.ts +2 -0
  55. package/dist/components/checkbox/__tests__/checkbox-group.test.d.ts.map +1 -0
  56. package/dist/components/checkbox/checkbox.cjs +10 -21
  57. package/dist/components/checkbox/checkbox.cjs.map +1 -1
  58. package/dist/components/checkbox/checkbox.d.ts +3 -13
  59. package/dist/components/checkbox/checkbox.d.ts.map +1 -1
  60. package/dist/components/checkbox/checkbox.js +11 -22
  61. package/dist/components/checkbox/checkbox.js.map +1 -1
  62. package/dist/components/checkbox/checkbox.module.css.cjs +1 -1
  63. package/dist/components/checkbox/checkbox.module.css.js +1 -1
  64. package/dist/components/checkbox/index.d.ts +1 -1
  65. package/dist/components/chip/chip.d.ts +1 -1
  66. package/dist/components/code-block/code-block-misc.d.ts +15 -15
  67. package/dist/components/code-block/code-block-misc.d.ts.map +1 -1
  68. package/dist/components/code-block/code-block.d.ts +100 -0
  69. package/dist/components/code-block/code-block.d.ts.map +1 -0
  70. package/dist/components/collapsible/__tests__/collapsible.test.d.ts +2 -0
  71. package/dist/components/collapsible/__tests__/collapsible.test.d.ts.map +1 -0
  72. package/dist/components/collapsible/collapsible.cjs +22 -0
  73. package/dist/components/collapsible/collapsible.cjs.map +1 -0
  74. package/dist/components/collapsible/collapsible.d.ts +5 -0
  75. package/dist/components/collapsible/collapsible.d.ts.map +1 -0
  76. package/dist/components/collapsible/collapsible.js +20 -0
  77. package/dist/components/collapsible/collapsible.js.map +1 -0
  78. package/dist/components/collapsible/collapsible.module.css.cjs +8 -0
  79. package/dist/components/collapsible/collapsible.module.css.cjs.map +1 -0
  80. package/dist/components/collapsible/collapsible.module.css.js +4 -0
  81. package/dist/components/collapsible/collapsible.module.css.js.map +1 -0
  82. package/dist/components/collapsible/index.d.ts +2 -0
  83. package/dist/components/collapsible/index.d.ts.map +1 -0
  84. package/dist/components/color-picker/color-picker-alpha.cjs +3 -3
  85. package/dist/components/color-picker/color-picker-alpha.cjs.map +1 -1
  86. package/dist/components/color-picker/color-picker-alpha.d.ts +2 -3
  87. package/dist/components/color-picker/color-picker-alpha.d.ts.map +1 -1
  88. package/dist/components/color-picker/color-picker-alpha.js +4 -4
  89. package/dist/components/color-picker/color-picker-alpha.js.map +1 -1
  90. package/dist/components/color-picker/color-picker-hue.cjs +3 -3
  91. package/dist/components/color-picker/color-picker-hue.cjs.map +1 -1
  92. package/dist/components/color-picker/color-picker-hue.d.ts +2 -3
  93. package/dist/components/color-picker/color-picker-hue.d.ts.map +1 -1
  94. package/dist/components/color-picker/color-picker-hue.js +4 -4
  95. package/dist/components/color-picker/color-picker-hue.js.map +1 -1
  96. package/dist/components/color-picker/color-picker.d.ts +8 -0
  97. package/dist/components/color-picker/color-picker.d.ts.map +1 -0
  98. package/dist/components/color-picker/color-picker.module.css.cjs +1 -1
  99. package/dist/components/color-picker/color-picker.module.css.js +1 -1
  100. package/dist/components/combobox/combobox-content.cjs +5 -26
  101. package/dist/components/combobox/combobox-content.cjs.map +1 -1
  102. package/dist/components/combobox/combobox-content.d.ts +3 -4
  103. package/dist/components/combobox/combobox-content.d.ts.map +1 -1
  104. package/dist/components/combobox/combobox-content.js +6 -27
  105. package/dist/components/combobox/combobox-content.js.map +1 -1
  106. package/dist/components/combobox/combobox-input.cjs +10 -33
  107. package/dist/components/combobox/combobox-input.cjs.map +1 -1
  108. package/dist/components/combobox/combobox-input.d.ts.map +1 -1
  109. package/dist/components/combobox/combobox-input.js +11 -34
  110. package/dist/components/combobox/combobox-input.js.map +1 -1
  111. package/dist/components/combobox/combobox-item.cjs +15 -15
  112. package/dist/components/combobox/combobox-item.cjs.map +1 -1
  113. package/dist/components/combobox/combobox-item.d.ts +5 -5
  114. package/dist/components/combobox/combobox-item.d.ts.map +1 -1
  115. package/dist/components/combobox/combobox-item.js +15 -15
  116. package/dist/components/combobox/combobox-item.js.map +1 -1
  117. package/dist/components/combobox/combobox-misc.cjs +13 -13
  118. package/dist/components/combobox/combobox-misc.cjs.map +1 -1
  119. package/dist/components/combobox/combobox-misc.d.ts +3 -9
  120. package/dist/components/combobox/combobox-misc.d.ts.map +1 -1
  121. package/dist/components/combobox/combobox-misc.js +13 -13
  122. package/dist/components/combobox/combobox-misc.js.map +1 -1
  123. package/dist/components/combobox/combobox-root.cjs +23 -42
  124. package/dist/components/combobox/combobox-root.cjs.map +1 -1
  125. package/dist/components/combobox/combobox-root.d.ts +19 -26
  126. package/dist/components/combobox/combobox-root.d.ts.map +1 -1
  127. package/dist/components/combobox/combobox-root.js +24 -43
  128. package/dist/components/combobox/combobox-root.js.map +1 -1
  129. package/dist/components/combobox/combobox.d.ts +6 -12
  130. package/dist/components/combobox/combobox.d.ts.map +1 -1
  131. package/dist/components/combobox/combobox.module.css.cjs +1 -1
  132. package/dist/components/combobox/combobox.module.css.js +1 -1
  133. package/dist/components/data-table/components/content.cjs +26 -18
  134. package/dist/components/data-table/components/content.cjs.map +1 -1
  135. package/dist/components/data-table/components/content.d.ts.map +1 -1
  136. package/dist/components/data-table/components/content.js +26 -18
  137. package/dist/components/data-table/components/content.js.map +1 -1
  138. package/dist/components/data-table/components/filters.cjs +3 -3
  139. package/dist/components/data-table/components/filters.cjs.map +1 -1
  140. package/dist/components/data-table/components/filters.d.ts.map +1 -1
  141. package/dist/components/data-table/components/filters.js +4 -4
  142. package/dist/components/data-table/components/filters.js.map +1 -1
  143. package/dist/components/data-table/components/virtualized-content.cjs +52 -5
  144. package/dist/components/data-table/components/virtualized-content.cjs.map +1 -1
  145. package/dist/components/data-table/components/virtualized-content.d.ts.map +1 -1
  146. package/dist/components/data-table/components/virtualized-content.js +53 -6
  147. package/dist/components/data-table/components/virtualized-content.js.map +1 -1
  148. package/dist/components/data-table/data-table.cjs +6 -3
  149. package/dist/components/data-table/data-table.cjs.map +1 -1
  150. package/dist/components/data-table/data-table.d.ts +1 -1
  151. package/dist/components/data-table/data-table.d.ts.map +1 -1
  152. package/dist/components/data-table/data-table.js +6 -3
  153. package/dist/components/data-table/data-table.js.map +1 -1
  154. package/dist/components/data-table/data-table.module.css.cjs +1 -1
  155. package/dist/components/data-table/data-table.module.css.js +1 -1
  156. package/dist/components/data-table/data-table.types.cjs.map +1 -1
  157. package/dist/components/data-table/data-table.types.d.ts +5 -0
  158. package/dist/components/data-table/data-table.types.d.ts.map +1 -1
  159. package/dist/components/data-table/data-table.types.js.map +1 -1
  160. package/dist/components/data-table/utils/filter-operations.cjs +6 -6
  161. package/dist/components/data-table/utils/filter-operations.cjs.map +1 -1
  162. package/dist/components/data-table/utils/filter-operations.d.ts +1 -1
  163. package/dist/components/data-table/utils/filter-operations.js +6 -6
  164. package/dist/components/data-table/utils/filter-operations.js.map +1 -1
  165. package/dist/components/dialog/dialog-content.cjs +17 -0
  166. package/dist/components/dialog/dialog-content.cjs.map +1 -0
  167. package/dist/components/dialog/dialog-content.d.ts +15 -0
  168. package/dist/components/dialog/dialog-content.d.ts.map +1 -0
  169. package/dist/components/dialog/dialog-content.js +15 -0
  170. package/dist/components/dialog/dialog-content.js.map +1 -0
  171. package/dist/components/dialog/dialog-misc.cjs +37 -0
  172. package/dist/components/dialog/dialog-misc.cjs.map +1 -0
  173. package/dist/components/dialog/dialog-misc.d.ts +34 -0
  174. package/dist/components/dialog/dialog-misc.d.ts.map +1 -0
  175. package/dist/components/dialog/dialog-misc.js +30 -0
  176. package/dist/components/dialog/dialog-misc.js.map +1 -0
  177. package/dist/components/dialog/dialog.cjs +13 -44
  178. package/dist/components/dialog/dialog.cjs.map +1 -1
  179. package/dist/components/dialog/dialog.d.ts +38 -44
  180. package/dist/components/dialog/dialog.d.ts.map +1 -1
  181. package/dist/components/dialog/dialog.js +6 -34
  182. package/dist/components/dialog/dialog.js.map +1 -1
  183. package/dist/components/dialog/dialog.module.css.cjs +1 -1
  184. package/dist/components/dialog/dialog.module.css.js +1 -1
  185. package/dist/components/drawer/__tests__/drawer.test.d.ts +2 -0
  186. package/dist/components/drawer/__tests__/drawer.test.d.ts.map +1 -0
  187. package/dist/components/drawer/drawer-content.cjs +30 -0
  188. package/dist/components/drawer/drawer-content.cjs.map +1 -0
  189. package/dist/components/drawer/drawer-content.d.ts +13 -0
  190. package/dist/components/drawer/drawer-content.d.ts.map +1 -0
  191. package/dist/components/drawer/drawer-content.js +28 -0
  192. package/dist/components/drawer/drawer-content.js.map +1 -0
  193. package/dist/components/drawer/drawer-misc.cjs +26 -0
  194. package/dist/components/drawer/drawer-misc.cjs.map +1 -0
  195. package/dist/components/drawer/drawer-misc.d.ts +13 -0
  196. package/dist/components/drawer/drawer-misc.d.ts.map +1 -0
  197. package/dist/components/drawer/drawer-misc.js +20 -0
  198. package/dist/components/drawer/drawer-misc.js.map +1 -0
  199. package/dist/components/drawer/drawer-root.cjs +19 -0
  200. package/dist/components/drawer/drawer-root.cjs.map +1 -0
  201. package/dist/components/drawer/drawer-root.d.ts +12 -0
  202. package/dist/components/drawer/drawer-root.d.ts.map +1 -0
  203. package/dist/components/drawer/drawer-root.js +17 -0
  204. package/dist/components/drawer/drawer-root.js.map +1 -0
  205. package/dist/components/drawer/drawer.cjs +20 -0
  206. package/dist/components/drawer/drawer.cjs.map +1 -0
  207. package/dist/components/drawer/drawer.d.ts +21 -0
  208. package/dist/components/drawer/drawer.d.ts.map +1 -0
  209. package/dist/components/drawer/drawer.js +18 -0
  210. package/dist/components/drawer/drawer.js.map +1 -0
  211. package/dist/components/drawer/drawer.module.css.cjs +8 -0
  212. package/dist/components/drawer/drawer.module.css.cjs.map +1 -0
  213. package/dist/components/drawer/drawer.module.css.js +4 -0
  214. package/dist/components/drawer/drawer.module.css.js.map +1 -0
  215. package/dist/components/drawer/index.d.ts +2 -0
  216. package/dist/components/drawer/index.d.ts.map +1 -0
  217. package/dist/components/flex/flex.cjs +13 -4
  218. package/dist/components/flex/flex.cjs.map +1 -1
  219. package/dist/components/flex/flex.d.ts +7 -6
  220. package/dist/components/flex/flex.d.ts.map +1 -1
  221. package/dist/components/flex/flex.js +13 -4
  222. package/dist/components/flex/flex.js.map +1 -1
  223. package/dist/components/grid/grid-item.cjs +21 -16
  224. package/dist/components/grid/grid-item.cjs.map +1 -1
  225. package/dist/components/grid/grid-item.d.ts +14 -13
  226. package/dist/components/grid/grid-item.d.ts.map +1 -1
  227. package/dist/components/grid/grid-item.js +21 -16
  228. package/dist/components/grid/grid-item.js.map +1 -1
  229. package/dist/components/grid/grid.cjs +26 -21
  230. package/dist/components/grid/grid.cjs.map +1 -1
  231. package/dist/components/grid/grid.d.ts +27 -18
  232. package/dist/components/grid/grid.d.ts.map +1 -1
  233. package/dist/components/grid/grid.js +26 -21
  234. package/dist/components/grid/grid.js.map +1 -1
  235. package/dist/components/grid/index.d.ts +8 -6
  236. package/dist/components/grid/index.d.ts.map +1 -1
  237. package/dist/components/headline/headline.d.ts +1 -1
  238. package/dist/components/input-field/input-field.cjs +2 -2
  239. package/dist/components/input-field/input-field.cjs.map +1 -1
  240. package/dist/components/input-field/input-field.d.ts +2 -1
  241. package/dist/components/input-field/input-field.d.ts.map +1 -1
  242. package/dist/components/input-field/input-field.js +2 -2
  243. package/dist/components/input-field/input-field.js.map +1 -1
  244. package/dist/components/menu/__tests__/menu.test.d.ts +2 -0
  245. package/dist/components/menu/__tests__/menu.test.d.ts.map +1 -0
  246. package/dist/components/menu/cell.cjs +12 -0
  247. package/dist/components/menu/cell.cjs.map +1 -0
  248. package/dist/components/{dropdown-menu → menu}/cell.d.ts +2 -2
  249. package/dist/components/menu/cell.d.ts.map +1 -0
  250. package/dist/components/menu/cell.js +10 -0
  251. package/dist/components/menu/cell.js.map +1 -0
  252. package/dist/components/{dropdown-menu → menu}/cell.module.css.cjs +1 -1
  253. package/dist/components/menu/cell.module.css.js +4 -0
  254. package/dist/components/menu/index.d.ts +2 -0
  255. package/dist/components/menu/index.d.ts.map +1 -0
  256. package/dist/components/menu/menu-content.cjs +95 -0
  257. package/dist/components/menu/menu-content.cjs.map +1 -0
  258. package/dist/components/menu/menu-content.d.ts +7 -0
  259. package/dist/components/menu/menu-content.d.ts.map +1 -0
  260. package/dist/components/menu/menu-content.js +92 -0
  261. package/dist/components/menu/menu-content.js.map +1 -0
  262. package/dist/components/menu/menu-item.cjs +30 -0
  263. package/dist/components/menu/menu-item.cjs.map +1 -0
  264. package/dist/components/menu/menu-item.d.ts +7 -0
  265. package/dist/components/menu/menu-item.d.ts.map +1 -0
  266. package/dist/components/menu/menu-item.js +28 -0
  267. package/dist/components/menu/menu-item.js.map +1 -0
  268. package/dist/components/menu/menu-misc.cjs +42 -0
  269. package/dist/components/menu/menu-misc.cjs.map +1 -0
  270. package/dist/components/menu/menu-misc.d.ts +8 -0
  271. package/dist/components/menu/menu-misc.d.ts.map +1 -0
  272. package/dist/components/menu/menu-misc.js +37 -0
  273. package/dist/components/menu/menu-misc.js.map +1 -0
  274. package/dist/components/menu/menu-root.cjs +103 -0
  275. package/dist/components/menu/menu-root.cjs.map +1 -0
  276. package/dist/components/menu/menu-root.d.ts +71 -0
  277. package/dist/components/menu/menu-root.d.ts.map +1 -0
  278. package/dist/components/menu/menu-root.js +98 -0
  279. package/dist/components/menu/menu-root.js.map +1 -0
  280. package/dist/components/menu/menu-trigger.cjs +43 -0
  281. package/dist/components/menu/menu-trigger.cjs.map +1 -0
  282. package/dist/components/menu/menu-trigger.d.ts +11 -0
  283. package/dist/components/menu/menu-trigger.d.ts.map +1 -0
  284. package/dist/components/menu/menu-trigger.js +40 -0
  285. package/dist/components/menu/menu-trigger.js.map +1 -0
  286. package/dist/components/menu/menu.cjs +23 -0
  287. package/dist/components/menu/menu.cjs.map +1 -0
  288. package/dist/components/menu/menu.d.ts +21 -0
  289. package/dist/components/menu/menu.d.ts.map +1 -0
  290. package/dist/components/menu/menu.js +21 -0
  291. package/dist/components/menu/menu.js.map +1 -0
  292. package/dist/components/menu/menu.module.css.cjs +8 -0
  293. package/dist/components/menu/menu.module.css.cjs.map +1 -0
  294. package/dist/components/menu/menu.module.css.js +4 -0
  295. package/dist/components/menu/menu.module.css.js.map +1 -0
  296. package/dist/components/menu/utils.cjs +53 -0
  297. package/dist/components/menu/utils.cjs.map +1 -0
  298. package/dist/components/menu/utils.d.ts +8 -0
  299. package/dist/components/menu/utils.d.ts.map +1 -0
  300. package/dist/components/menu/utils.js +46 -0
  301. package/dist/components/menu/utils.js.map +1 -0
  302. package/dist/components/popover/popover.cjs +8 -7
  303. package/dist/components/popover/popover.cjs.map +1 -1
  304. package/dist/components/popover/popover.d.ts +6 -8
  305. package/dist/components/popover/popover.d.ts.map +1 -1
  306. package/dist/components/popover/popover.js +7 -6
  307. package/dist/components/popover/popover.js.map +1 -1
  308. package/dist/components/popover/popover.module.css.cjs +1 -1
  309. package/dist/components/popover/popover.module.css.js +1 -1
  310. package/dist/components/preview-card/__tests__/preview-card.test.d.ts +2 -0
  311. package/dist/components/preview-card/__tests__/preview-card.test.d.ts.map +1 -0
  312. package/dist/components/preview-card/index.d.ts +2 -0
  313. package/dist/components/preview-card/index.d.ts.map +1 -0
  314. package/dist/components/preview-card/preview-card.cjs +24 -0
  315. package/dist/components/preview-card/preview-card.cjs.map +1 -0
  316. package/dist/components/preview-card/preview-card.d.ts +15 -0
  317. package/dist/components/preview-card/preview-card.d.ts.map +1 -0
  318. package/dist/components/preview-card/preview-card.js +22 -0
  319. package/dist/components/preview-card/preview-card.js.map +1 -0
  320. package/dist/components/preview-card/preview-card.module.css.cjs +8 -0
  321. package/dist/components/preview-card/preview-card.module.css.cjs.map +1 -0
  322. package/dist/components/preview-card/preview-card.module.css.js +4 -0
  323. package/dist/components/preview-card/preview-card.module.css.js.map +1 -0
  324. package/dist/components/radio/index.d.ts +1 -1
  325. package/dist/components/radio/radio.cjs +8 -11
  326. package/dist/components/radio/radio.cjs.map +1 -1
  327. package/dist/components/radio/radio.d.ts +4 -13
  328. package/dist/components/radio/radio.d.ts.map +1 -1
  329. package/dist/components/radio/radio.js +10 -12
  330. package/dist/components/radio/radio.js.map +1 -1
  331. package/dist/components/scroll-area/index.d.ts +2 -1
  332. package/dist/components/scroll-area/index.d.ts.map +1 -1
  333. package/dist/components/scroll-area/scroll-area-scrollbar.cjs +4 -4
  334. package/dist/components/scroll-area/scroll-area-scrollbar.cjs.map +1 -1
  335. package/dist/components/scroll-area/scroll-area-scrollbar.d.ts +5 -6
  336. package/dist/components/scroll-area/scroll-area-scrollbar.d.ts.map +1 -1
  337. package/dist/components/scroll-area/scroll-area-scrollbar.js +4 -4
  338. package/dist/components/scroll-area/scroll-area-scrollbar.js.map +1 -1
  339. package/dist/components/scroll-area/scroll-area.cjs +11 -2
  340. package/dist/components/scroll-area/scroll-area.cjs.map +1 -1
  341. package/dist/components/scroll-area/scroll-area.d.ts +6 -1
  342. package/dist/components/scroll-area/scroll-area.d.ts.map +1 -1
  343. package/dist/components/scroll-area/scroll-area.js +11 -2
  344. package/dist/components/scroll-area/scroll-area.js.map +1 -1
  345. package/dist/components/scroll-area/scroll-area.module.css.cjs +1 -1
  346. package/dist/components/scroll-area/scroll-area.module.css.js +1 -1
  347. package/dist/components/select/select-content.cjs +9 -18
  348. package/dist/components/select/select-content.cjs.map +1 -1
  349. package/dist/components/select/select-content.d.ts +6 -2
  350. package/dist/components/select/select-content.d.ts.map +1 -1
  351. package/dist/components/select/select-content.js +11 -20
  352. package/dist/components/select/select-content.js.map +1 -1
  353. package/dist/components/select/select-item.cjs +10 -11
  354. package/dist/components/select/select-item.cjs.map +1 -1
  355. package/dist/components/select/select-item.d.ts +9 -4
  356. package/dist/components/select/select-item.d.ts.map +1 -1
  357. package/dist/components/select/select-item.js +10 -11
  358. package/dist/components/select/select-item.js.map +1 -1
  359. package/dist/components/select/select-misc.cjs +19 -10
  360. package/dist/components/select/select-misc.cjs.map +1 -1
  361. package/dist/components/select/select-misc.d.ts +15 -4
  362. package/dist/components/select/select-misc.d.ts.map +1 -1
  363. package/dist/components/select/select-misc.js +19 -10
  364. package/dist/components/select/select-misc.js.map +1 -1
  365. package/dist/components/select/select-multiple-value.cjs +3 -7
  366. package/dist/components/select/select-multiple-value.cjs.map +1 -1
  367. package/dist/components/select/select-multiple-value.d.ts +2 -3
  368. package/dist/components/select/select-multiple-value.d.ts.map +1 -1
  369. package/dist/components/select/select-multiple-value.js +5 -9
  370. package/dist/components/select/select-multiple-value.js.map +1 -1
  371. package/dist/components/select/select-root.cjs +51 -66
  372. package/dist/components/select/select-root.cjs.map +1 -1
  373. package/dist/components/select/select-root.d.ts +11 -15
  374. package/dist/components/select/select-root.d.ts.map +1 -1
  375. package/dist/components/select/select-root.js +52 -67
  376. package/dist/components/select/select-root.js.map +1 -1
  377. package/dist/components/select/select-trigger.cjs +7 -4
  378. package/dist/components/select/select-trigger.cjs.map +1 -1
  379. package/dist/components/select/select-trigger.d.ts +2 -3
  380. package/dist/components/select/select-trigger.d.ts.map +1 -1
  381. package/dist/components/select/select-trigger.js +7 -4
  382. package/dist/components/select/select-trigger.js.map +1 -1
  383. package/dist/components/select/select-value.cjs +17 -8
  384. package/dist/components/select/select-value.cjs.map +1 -1
  385. package/dist/components/select/select-value.d.ts +6 -4
  386. package/dist/components/select/select-value.d.ts.map +1 -1
  387. package/dist/components/select/select-value.js +17 -8
  388. package/dist/components/select/select-value.js.map +1 -1
  389. package/dist/components/select/select.cjs +4 -4
  390. package/dist/components/select/select.cjs.map +1 -1
  391. package/dist/components/select/select.d.ts +10 -11
  392. package/dist/components/select/select.d.ts.map +1 -1
  393. package/dist/components/select/select.js +4 -4
  394. package/dist/components/select/select.js.map +1 -1
  395. package/dist/components/select/select.module.css.cjs +1 -1
  396. package/dist/components/select/select.module.css.js +1 -1
  397. package/dist/components/separator/separator.cjs +3 -3
  398. package/dist/components/separator/separator.cjs.map +1 -1
  399. package/dist/components/separator/separator.d.ts +3 -5
  400. package/dist/components/separator/separator.d.ts.map +1 -1
  401. package/dist/components/separator/separator.js +3 -3
  402. package/dist/components/separator/separator.js.map +1 -1
  403. package/dist/components/sidebar/sidebar-item.cjs +7 -4
  404. package/dist/components/sidebar/sidebar-item.cjs.map +1 -1
  405. package/dist/components/sidebar/sidebar-item.d.ts.map +1 -1
  406. package/dist/components/sidebar/sidebar-item.js +7 -4
  407. package/dist/components/sidebar/sidebar-item.js.map +1 -1
  408. package/dist/components/sidebar/sidebar-misc.cjs +1 -1
  409. package/dist/components/sidebar/sidebar-misc.cjs.map +1 -1
  410. package/dist/components/sidebar/sidebar-misc.js +1 -1
  411. package/dist/components/sidebar/sidebar-misc.js.map +1 -1
  412. package/dist/components/sidebar/sidebar-root.cjs +4 -5
  413. package/dist/components/sidebar/sidebar-root.cjs.map +1 -1
  414. package/dist/components/sidebar/sidebar-root.d.ts +5 -3
  415. package/dist/components/sidebar/sidebar-root.d.ts.map +1 -1
  416. package/dist/components/sidebar/sidebar-root.js +4 -5
  417. package/dist/components/sidebar/sidebar-root.js.map +1 -1
  418. package/dist/components/sidebar/sidebar.d.ts +1 -1
  419. package/dist/components/sidebar/sidebar.module.css.cjs +1 -1
  420. package/dist/components/sidebar/sidebar.module.css.js +1 -1
  421. package/dist/components/slider/index.d.ts +1 -1
  422. package/dist/components/slider/slider.cjs +10 -22
  423. package/dist/components/slider/slider.cjs.map +1 -1
  424. package/dist/components/slider/slider.d.ts +6 -13
  425. package/dist/components/slider/slider.d.ts.map +1 -1
  426. package/dist/components/slider/slider.js +12 -24
  427. package/dist/components/slider/slider.js.map +1 -1
  428. package/dist/components/slider/slider.module.css.cjs +1 -1
  429. package/dist/components/slider/slider.module.css.js +1 -1
  430. package/dist/components/switch/switch.cjs +2 -3
  431. package/dist/components/switch/switch.cjs.map +1 -1
  432. package/dist/components/switch/switch.d.ts +4 -5
  433. package/dist/components/switch/switch.d.ts.map +1 -1
  434. package/dist/components/switch/switch.js +4 -5
  435. package/dist/components/switch/switch.js.map +1 -1
  436. package/dist/components/tabs/index.d.ts +1 -1
  437. package/dist/components/tabs/tabs.cjs +10 -14
  438. package/dist/components/tabs/tabs.cjs.map +1 -1
  439. package/dist/components/tabs/tabs.d.ts +7 -14
  440. package/dist/components/tabs/tabs.d.ts.map +1 -1
  441. package/dist/components/tabs/tabs.js +11 -15
  442. package/dist/components/tabs/tabs.js.map +1 -1
  443. package/dist/components/tabs/tabs.module.css.cjs +1 -1
  444. package/dist/components/tabs/tabs.module.css.js +1 -1
  445. package/dist/components/text/text.d.ts +1 -1
  446. package/dist/components/toast/index.d.ts +3 -1
  447. package/dist/components/toast/index.d.ts.map +1 -1
  448. package/dist/components/toast/toast-manager.cjs +9 -0
  449. package/dist/components/toast/toast-manager.cjs.map +1 -0
  450. package/dist/components/toast/toast-manager.d.ts +2 -0
  451. package/dist/components/toast/toast-manager.d.ts.map +1 -0
  452. package/dist/components/toast/toast-manager.js +7 -0
  453. package/dist/components/toast/toast-manager.js.map +1 -0
  454. package/dist/components/toast/toast-provider.cjs +22 -0
  455. package/dist/components/toast/toast-provider.cjs.map +1 -0
  456. package/dist/components/toast/toast-provider.d.ts +11 -0
  457. package/dist/components/toast/toast-provider.d.ts.map +1 -0
  458. package/dist/components/toast/toast-provider.js +20 -0
  459. package/dist/components/toast/toast-provider.js.map +1 -0
  460. package/dist/components/toast/toast-root.cjs +34 -0
  461. package/dist/components/toast/toast-root.cjs.map +1 -0
  462. package/dist/components/toast/toast-root.d.ts +8 -0
  463. package/dist/components/toast/toast-root.d.ts.map +1 -0
  464. package/dist/components/toast/toast-root.js +32 -0
  465. package/dist/components/toast/toast-root.js.map +1 -0
  466. package/dist/components/toast/toast.cjs +11 -25
  467. package/dist/components/toast/toast.cjs.map +1 -1
  468. package/dist/components/toast/toast.d.ts +6 -8
  469. package/dist/components/toast/toast.d.ts.map +1 -1
  470. package/dist/components/toast/toast.js +10 -24
  471. package/dist/components/toast/toast.js.map +1 -1
  472. package/dist/components/toast/toast.module.css.cjs +1 -1
  473. package/dist/components/toast/toast.module.css.js +1 -1
  474. package/dist/components/tooltip/tooltip-content.cjs +17 -0
  475. package/dist/components/tooltip/tooltip-content.cjs.map +1 -0
  476. package/dist/components/tooltip/tooltip-content.d.ts +10 -0
  477. package/dist/components/tooltip/tooltip-content.d.ts.map +1 -0
  478. package/dist/components/tooltip/tooltip-content.js +15 -0
  479. package/dist/components/tooltip/tooltip-content.js.map +1 -0
  480. package/dist/components/tooltip/tooltip-misc.cjs +19 -0
  481. package/dist/components/tooltip/tooltip-misc.cjs.map +1 -0
  482. package/dist/components/tooltip/tooltip-misc.d.ts +9 -0
  483. package/dist/components/tooltip/tooltip-misc.d.ts.map +1 -0
  484. package/dist/components/tooltip/tooltip-misc.js +16 -0
  485. package/dist/components/tooltip/tooltip-misc.js.map +1 -0
  486. package/dist/components/tooltip/tooltip.cjs +7 -4
  487. package/dist/components/tooltip/tooltip.cjs.map +1 -1
  488. package/dist/components/tooltip/tooltip.d.ts +8 -5
  489. package/dist/components/tooltip/tooltip.d.ts.map +1 -1
  490. package/dist/components/tooltip/tooltip.js +7 -4
  491. package/dist/components/tooltip/tooltip.js.map +1 -1
  492. package/dist/components/tooltip/tooltip.module.css.cjs +1 -1
  493. package/dist/components/tooltip/tooltip.module.css.js +1 -1
  494. package/dist/index.cjs +14 -8
  495. package/dist/index.cjs.map +1 -1
  496. package/dist/index.d.ts +6 -4
  497. package/dist/index.d.ts.map +1 -1
  498. package/dist/index.js +8 -4
  499. package/dist/index.js.map +1 -1
  500. package/dist/style.css +1 -1
  501. package/package.json +5 -7
  502. package/dist/components/dropdown-menu/__tests__/dropdown-menu.test.d.ts +0 -2
  503. package/dist/components/dropdown-menu/__tests__/dropdown-menu.test.d.ts.map +0 -1
  504. package/dist/components/dropdown-menu/cell.cjs +0 -12
  505. package/dist/components/dropdown-menu/cell.cjs.map +0 -1
  506. package/dist/components/dropdown-menu/cell.d.ts.map +0 -1
  507. package/dist/components/dropdown-menu/cell.js +0 -10
  508. package/dist/components/dropdown-menu/cell.js.map +0 -1
  509. package/dist/components/dropdown-menu/cell.module.css.js +0 -4
  510. package/dist/components/dropdown-menu/dropdown-menu-content.cjs +0 -36
  511. package/dist/components/dropdown-menu/dropdown-menu-content.cjs.map +0 -1
  512. package/dist/components/dropdown-menu/dropdown-menu-content.d.ts +0 -7
  513. package/dist/components/dropdown-menu/dropdown-menu-content.d.ts.map +0 -1
  514. package/dist/components/dropdown-menu/dropdown-menu-content.js +0 -34
  515. package/dist/components/dropdown-menu/dropdown-menu-content.js.map +0 -1
  516. package/dist/components/dropdown-menu/dropdown-menu-item.cjs +0 -45
  517. package/dist/components/dropdown-menu/dropdown-menu-item.cjs.map +0 -1
  518. package/dist/components/dropdown-menu/dropdown-menu-item.d.ts +0 -9
  519. package/dist/components/dropdown-menu/dropdown-menu-item.d.ts.map +0 -1
  520. package/dist/components/dropdown-menu/dropdown-menu-item.js +0 -43
  521. package/dist/components/dropdown-menu/dropdown-menu-item.js.map +0 -1
  522. package/dist/components/dropdown-menu/dropdown-menu-misc.cjs +0 -36
  523. package/dist/components/dropdown-menu/dropdown-menu-misc.cjs.map +0 -1
  524. package/dist/components/dropdown-menu/dropdown-menu-misc.d.ts +0 -10
  525. package/dist/components/dropdown-menu/dropdown-menu-misc.d.ts.map +0 -1
  526. package/dist/components/dropdown-menu/dropdown-menu-misc.js +0 -31
  527. package/dist/components/dropdown-menu/dropdown-menu-misc.js.map +0 -1
  528. package/dist/components/dropdown-menu/dropdown-menu-root.cjs +0 -52
  529. package/dist/components/dropdown-menu/dropdown-menu-root.cjs.map +0 -1
  530. package/dist/components/dropdown-menu/dropdown-menu-root.d.ts +0 -40
  531. package/dist/components/dropdown-menu/dropdown-menu-root.d.ts.map +0 -1
  532. package/dist/components/dropdown-menu/dropdown-menu-root.js +0 -48
  533. package/dist/components/dropdown-menu/dropdown-menu-root.js.map +0 -1
  534. package/dist/components/dropdown-menu/dropdown-menu-trigger.cjs +0 -34
  535. package/dist/components/dropdown-menu/dropdown-menu-trigger.cjs.map +0 -1
  536. package/dist/components/dropdown-menu/dropdown-menu-trigger.d.ts +0 -14
  537. package/dist/components/dropdown-menu/dropdown-menu-trigger.d.ts.map +0 -1
  538. package/dist/components/dropdown-menu/dropdown-menu-trigger.js +0 -31
  539. package/dist/components/dropdown-menu/dropdown-menu-trigger.js.map +0 -1
  540. package/dist/components/dropdown-menu/dropdown-menu.cjs +0 -24
  541. package/dist/components/dropdown-menu/dropdown-menu.cjs.map +0 -1
  542. package/dist/components/dropdown-menu/dropdown-menu.d.ts +0 -16
  543. package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +0 -1
  544. package/dist/components/dropdown-menu/dropdown-menu.js +0 -22
  545. package/dist/components/dropdown-menu/dropdown-menu.js.map +0 -1
  546. package/dist/components/dropdown-menu/dropdown-menu.module.css.cjs +0 -8
  547. package/dist/components/dropdown-menu/dropdown-menu.module.css.cjs.map +0 -1
  548. package/dist/components/dropdown-menu/dropdown-menu.module.css.js +0 -4
  549. package/dist/components/dropdown-menu/dropdown-menu.module.css.js.map +0 -1
  550. package/dist/components/dropdown-menu/index.d.ts +0 -2
  551. package/dist/components/dropdown-menu/index.d.ts.map +0 -1
  552. package/dist/components/dropdown-menu/types.d.ts +0 -4
  553. package/dist/components/dropdown-menu/types.d.ts.map +0 -1
  554. package/dist/components/dropdown-menu/utils.cjs +0 -21
  555. package/dist/components/dropdown-menu/utils.cjs.map +0 -1
  556. package/dist/components/dropdown-menu/utils.d.ts +0 -4
  557. package/dist/components/dropdown-menu/utils.d.ts.map +0 -1
  558. package/dist/components/dropdown-menu/utils.js +0 -18
  559. package/dist/components/dropdown-menu/utils.js.map +0 -1
  560. package/dist/components/scroll-area/scroll-area-root.cjs +0 -17
  561. package/dist/components/scroll-area/scroll-area-root.cjs.map +0 -1
  562. package/dist/components/scroll-area/scroll-area-root.d.ts +0 -9
  563. package/dist/components/scroll-area/scroll-area-root.d.ts.map +0 -1
  564. package/dist/components/scroll-area/scroll-area-root.js +0 -15
  565. package/dist/components/scroll-area/scroll-area-root.js.map +0 -1
  566. package/dist/components/sheet/__tests__/sheet.test.d.ts +0 -2
  567. package/dist/components/sheet/__tests__/sheet.test.d.ts.map +0 -1
  568. package/dist/components/sheet/index.d.ts +0 -2
  569. package/dist/components/sheet/index.d.ts.map +0 -1
  570. package/dist/components/sheet/sheet.cjs +0 -50
  571. package/dist/components/sheet/sheet.cjs.map +0 -1
  572. package/dist/components/sheet/sheet.d.ts +0 -36
  573. package/dist/components/sheet/sheet.d.ts.map +0 -1
  574. package/dist/components/sheet/sheet.js +0 -45
  575. package/dist/components/sheet/sheet.js.map +0 -1
  576. package/dist/components/sheet/sheet.module.css.cjs +0 -8
  577. package/dist/components/sheet/sheet.module.css.cjs.map +0 -1
  578. package/dist/components/sheet/sheet.module.css.js +0 -4
  579. package/dist/components/sheet/sheet.module.css.js.map +0 -1
  580. package/dist/components/slider/thumb.cjs +0 -8
  581. package/dist/components/slider/thumb.cjs.map +0 -1
  582. package/dist/components/slider/thumb.d.ts +0 -2
  583. package/dist/components/slider/thumb.d.ts.map +0 -1
  584. package/dist/components/slider/thumb.js +0 -6
  585. package/dist/components/slider/thumb.js.map +0 -1
  586. package/dist/components/tooltip/tooltip-provider.cjs +0 -18
  587. package/dist/components/tooltip/tooltip-provider.cjs.map +0 -1
  588. package/dist/components/tooltip/tooltip-provider.d.ts +0 -9
  589. package/dist/components/tooltip/tooltip-provider.d.ts.map +0 -1
  590. package/dist/components/tooltip/tooltip-provider.js +0 -15
  591. package/dist/components/tooltip/tooltip-provider.js.map +0 -1
  592. package/dist/components/tooltip/tooltip-root.cjs +0 -66
  593. package/dist/components/tooltip/tooltip-root.cjs.map +0 -1
  594. package/dist/components/tooltip/tooltip-root.d.ts +0 -29
  595. package/dist/components/tooltip/tooltip-root.d.ts.map +0 -1
  596. package/dist/components/tooltip/tooltip-root.js +0 -63
  597. package/dist/components/tooltip/tooltip-root.js.map +0 -1
  598. package/dist/components/tooltip/utils.cjs +0 -30
  599. package/dist/components/tooltip/utils.cjs.map +0 -1
  600. package/dist/components/tooltip/utils.d.ts +0 -10
  601. package/dist/components/tooltip/utils.d.ts.map +0 -1
  602. package/dist/components/tooltip/utils.js +0 -28
  603. package/dist/components/tooltip/utils.js.map +0 -1
  604. /package/dist/components/{dropdown-menu → menu}/cell.module.css.cjs.map +0 -0
  605. /package/dist/components/{dropdown-menu → menu}/cell.module.css.js.map +0 -0
@@ -4,13 +4,14 @@ import { TableIcon } from '@radix-ui/react-icons';
4
4
  import { flexRender } from '@tanstack/react-table';
5
5
  import { useVirtualizer } from '@tanstack/react-virtual';
6
6
  import { cx } from 'class-variance-authority';
7
- import { useRef, useCallback } from 'react';
7
+ import { useRef, useState, useMemo, useCallback, useLayoutEffect } from 'react';
8
8
  import tableStyles from '../../table/table.module.css.js';
9
9
  import { Badge } from '../../badge/badge.js';
10
10
  import { EmptyState } from '../../empty-state/empty-state.js';
11
11
  import { Flex } from '../../flex/flex.js';
12
12
  import { Skeleton } from '../../skeleton/skeleton.js';
13
13
  import styles from '../data-table.module.css.js';
14
+ import { defaultGroupOption } from '../data-table.types.js';
14
15
  import { useDataTable } from '../hooks/useDataTable.js';
15
16
  import { hasActiveQuery } from '../utils/index.js';
16
17
 
@@ -54,11 +55,25 @@ function VirtualLoaderRows({ columns, rowHeight, count }) {
54
55
  }
55
56
  const DefaultEmptyComponent = () => (jsx(EmptyState, { icon: jsx(TableIcon, {}), heading: 'No Data' }));
56
57
  function VirtualizedContent({ rowHeight = 40, groupHeaderHeight, overscan = 5, loadMoreOffset = 100, emptyState, zeroState, classNames = {} }) {
57
- const { onRowClick, table, isLoading, loadMoreData, tableQuery, defaultSort, loadingRowCount = 3 } = useDataTable();
58
+ const { onRowClick, table, isLoading, loadMoreData, tableQuery, defaultSort, loadingRowCount = 3, stickyGroupHeader = false } = useDataTable();
58
59
  const headerGroups = table?.getHeaderGroups();
59
60
  const rowModel = table?.getRowModel();
60
61
  const { rows = [] } = rowModel || {};
61
62
  const scrollContainerRef = useRef(null);
63
+ const headerRef = useRef(null);
64
+ const [stickyGroup, setStickyGroup] = useState(null);
65
+ const [headerHeight, setHeaderHeight] = useState(40);
66
+ const groupBy = tableQuery?.group_by?.[0];
67
+ const isGrouped = Boolean(groupBy) && groupBy !== defaultGroupOption.id;
68
+ const groupHeaderList = useMemo(() => {
69
+ const list = [];
70
+ rows.forEach((row, i) => {
71
+ if (row.subRows && row.subRows.length > 0) {
72
+ list.push({ index: i, data: row.original });
73
+ }
74
+ });
75
+ return list;
76
+ }, [rows]);
62
77
  const showLoaderRows = isLoading && rows.length > 0;
63
78
  const virtualizer = useVirtualizer({
64
79
  count: rows.length,
@@ -70,15 +85,47 @@ function VirtualizedContent({ rowHeight = 40, groupHeaderHeight, overscan = 5, l
70
85
  },
71
86
  overscan
72
87
  });
88
+ const updateStickyGroup = useCallback(() => {
89
+ if (!stickyGroupHeader || !isGrouped || groupHeaderList.length === 0) {
90
+ setStickyGroup(null);
91
+ return;
92
+ }
93
+ const items = virtualizer.getVirtualItems();
94
+ const firstIndex = items[0]?.index ?? 0;
95
+ const current = groupHeaderList
96
+ .filter(g => g.index <= firstIndex)
97
+ .pop()?.data;
98
+ setStickyGroup(current ?? null);
99
+ }, [stickyGroupHeader, isGrouped, groupHeaderList, virtualizer]);
73
100
  const handleVirtualScroll = useCallback(() => {
74
- if (!scrollContainerRef.current || isLoading)
101
+ const el = scrollContainerRef.current;
102
+ if (!el)
75
103
  return;
76
- const { scrollTop, scrollHeight, clientHeight } = scrollContainerRef.current;
104
+ if (stickyGroupHeader)
105
+ updateStickyGroup();
106
+ if (isLoading)
107
+ return;
108
+ const { scrollTop, scrollHeight, clientHeight } = el;
77
109
  if (scrollHeight - scrollTop - clientHeight < loadMoreOffset) {
78
110
  loadMoreData();
79
111
  }
80
- }, [isLoading, loadMoreData, loadMoreOffset]);
112
+ }, [
113
+ stickyGroupHeader,
114
+ isLoading,
115
+ loadMoreData,
116
+ loadMoreOffset,
117
+ updateStickyGroup
118
+ ]);
81
119
  const totalHeight = virtualizer.getTotalSize();
120
+ useLayoutEffect(() => {
121
+ if (headerRef.current) {
122
+ setHeaderHeight(headerRef.current.getBoundingClientRect().height);
123
+ }
124
+ }, [headerGroups]);
125
+ useLayoutEffect(() => {
126
+ if (stickyGroupHeader)
127
+ updateStickyGroup();
128
+ }, [stickyGroupHeader, updateStickyGroup, groupHeaderList, isGrouped]);
82
129
  const hasData = rows?.length > 0 || isLoading;
83
130
  const hasChanges = hasActiveQuery(tableQuery || {}, defaultSort);
84
131
  const isZeroState = !hasData && !hasChanges;
@@ -92,7 +139,7 @@ function VirtualizedContent({ rowHeight = 40, groupHeaderHeight, overscan = 5, l
92
139
  return jsx("div", { className: classNames.root, children: stateToShow });
93
140
  }
94
141
  const visibleColumns = table.getVisibleLeafColumns();
95
- return (jsxs("div", { ref: scrollContainerRef, className: cx(classNames.root, styles.scrollContainer), onScroll: handleVirtualScroll, children: [jsxs("div", { role: 'table', className: cx(styles.virtualTable, classNames.table), children: [jsx(VirtualHeaders, { headerGroups: headerGroups, className: cx(styles.stickyHeader, classNames.header) }), jsx("div", { role: 'rowgroup', className: cx(styles.virtualBodyGroup, classNames.body), style: { height: totalHeight }, children: jsx(VirtualRows, { rows: rows, virtualizer: virtualizer, onRowClick: onRowClick, classNames: {
142
+ return (jsxs("div", { ref: scrollContainerRef, className: cx(classNames.root, styles.scrollContainer), onScroll: handleVirtualScroll, children: [jsxs("div", { role: 'table', className: cx(styles.virtualTable, classNames.table), children: [jsx("div", { ref: headerRef, children: jsx(VirtualHeaders, { headerGroups: headerGroups, className: cx(styles.stickyHeader, classNames.header) }) }), stickyGroupHeader && isGrouped && stickyGroup && (jsx("div", { role: 'row', className: styles.stickyGroupAnchor, style: { top: headerHeight }, children: jsxs(Flex, { gap: 3, align: 'center', children: [stickyGroup.label, stickyGroup.showGroupCount ? (jsx(Badge, { variant: 'neutral', children: stickyGroup.count })) : null] }) })), jsx("div", { role: 'rowgroup', className: cx(styles.virtualBodyGroup, classNames.body), style: { height: totalHeight }, children: jsx(VirtualRows, { rows: rows, virtualizer: virtualizer, onRowClick: onRowClick, classNames: {
96
143
  row: classNames.row
97
144
  } }) })] }), showLoaderRows && (jsx(VirtualLoaderRows, { columns: visibleColumns, rowHeight: rowHeight, count: loadingRowCount }))] }));
98
145
  }
@@ -1 +1 @@
1
- {"version":3,"file":"virtualized-content.js","sources":["../../../../components/data-table/components/virtualized-content.tsx"],"sourcesContent":["'use client';\n\nimport { TableIcon } from '@radix-ui/react-icons';\nimport type { HeaderGroup, Row } from '@tanstack/react-table';\nimport { flexRender } from '@tanstack/react-table';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { cx } from 'class-variance-authority';\nimport { useCallback, useRef } from 'react';\nimport tableStyles from '~/components/table/table.module.css';\nimport { Badge } from '../../badge';\nimport { EmptyState } from '../../empty-state';\nimport { Flex } from '../../flex';\nimport { Skeleton } from '../../skeleton';\nimport styles from '../data-table.module.css';\nimport {\n DataTableColumnDef,\n GroupedData,\n VirtualizedContentProps\n} from '../data-table.types';\nimport { useDataTable } from '../hooks/useDataTable';\nimport { hasActiveQuery } from '../utils';\n\nfunction VirtualHeaders<TData>({\n headerGroups = [],\n className = ''\n}: {\n headerGroups: HeaderGroup<TData>[];\n className?: string;\n}) {\n return (\n <div role='rowgroup' className={cx(styles.virtualHeaderGroup, className)}>\n {headerGroups?.map(headerGroup => (\n <div\n role='row'\n key={headerGroup?.id}\n className={styles.virtualHeaderRow}\n >\n {headerGroup?.headers?.map(header => {\n const columnDef = header.column.columnDef as DataTableColumnDef<\n TData,\n unknown\n >;\n return (\n <div\n role='columnheader'\n key={header.id}\n className={cx(\n tableStyles.head,\n styles.virtualHead,\n columnDef.classNames?.header\n )}\n style={columnDef.styles?.header}\n >\n {flexRender(columnDef.header, header.getContext())}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n );\n}\n\nfunction VirtualGroupHeader<TData>({\n data,\n style\n}: {\n data: GroupedData<TData>;\n style?: React.CSSProperties;\n}) {\n return (\n <div role='row' className={styles.virtualSectionHeader} style={style}>\n <Flex gap={3} align='center'>\n {data?.label}\n {data.showGroupCount ? (\n <Badge variant='neutral'>{data?.count}</Badge>\n ) : null}\n </Flex>\n </div>\n );\n}\n\nfunction VirtualRows<TData>({\n rows,\n virtualizer,\n onRowClick,\n classNames\n}: {\n rows: Row<TData>[];\n virtualizer: ReturnType<typeof useVirtualizer>;\n onRowClick?: (row: TData) => void;\n classNames?: { row?: string };\n}) {\n const items = virtualizer.getVirtualItems();\n\n return items.map((item, idx) => {\n const row = rows[item.index];\n if (!row) return null;\n\n const isSelected = row.getIsSelected();\n const cells = row.getVisibleCells() || [];\n const isGroupHeader = row.subRows && row.subRows.length > 0;\n const rowKey = row.id + '-' + item.index;\n\n const positionStyle: React.CSSProperties = {\n height: item.size,\n top: item.start\n };\n\n if (isGroupHeader) {\n return (\n <VirtualGroupHeader\n key={rowKey}\n data={row.original as GroupedData<unknown>}\n style={positionStyle}\n />\n );\n }\n\n return (\n <div\n role='row'\n key={rowKey}\n className={cx(\n styles.virtualRow,\n styles['row'],\n onRowClick ? styles['clickable'] : '',\n classNames?.row\n )}\n style={positionStyle}\n data-state={isSelected && 'selected'}\n onClick={() => onRowClick?.(row.original)}\n >\n {cells.map(cell => {\n const columnDef = cell.column.columnDef as DataTableColumnDef<\n unknown,\n unknown\n >;\n return (\n <div\n role='cell'\n key={cell.id}\n className={cx(\n tableStyles.cell,\n styles.virtualCell,\n columnDef.classNames?.cell\n )}\n style={columnDef.styles?.cell}\n >\n {flexRender(columnDef.cell, cell.getContext())}\n </div>\n );\n })}\n </div>\n );\n });\n}\n\nfunction VirtualLoaderRows({\n columns,\n rowHeight,\n count\n}: {\n columns: ReturnType<\n ReturnType<typeof useDataTable>['table']['getVisibleLeafColumns']\n >;\n rowHeight: number;\n count: number;\n}) {\n return (\n <div className={styles.stickyLoaderContainer}>\n {Array.from({ length: count }).map((_, rowIndex) => (\n <div\n role='row'\n key={'loading-row-' + rowIndex}\n className={cx(styles.virtualRow, styles['row'], styles.loaderRow)}\n style={{ height: rowHeight }}\n >\n {columns.map((col, colIndex) => {\n const columnDef = col.columnDef as DataTableColumnDef<\n unknown,\n unknown\n >;\n return (\n <div\n role='cell'\n key={'loading-column-' + colIndex}\n className={cx(\n tableStyles.cell,\n styles.virtualCell,\n columnDef.classNames?.cell\n )}\n style={columnDef.styles?.cell}\n >\n <Skeleton containerClassName={styles['flex-1']} />\n </div>\n );\n })}\n </div>\n ))}\n </div>\n );\n}\n\nconst DefaultEmptyComponent = () => (\n <EmptyState icon={<TableIcon />} heading='No Data' />\n);\n\nexport function VirtualizedContent({\n rowHeight = 40,\n groupHeaderHeight,\n overscan = 5,\n loadMoreOffset = 100,\n emptyState,\n zeroState,\n classNames = {}\n}: VirtualizedContentProps) {\n const {\n onRowClick,\n table,\n isLoading,\n loadMoreData,\n tableQuery,\n defaultSort,\n loadingRowCount = 3\n } = useDataTable();\n\n const headerGroups = table?.getHeaderGroups();\n const rowModel = table?.getRowModel();\n const { rows = [] } = rowModel || {};\n\n const scrollContainerRef = useRef<HTMLDivElement | null>(null);\n\n const showLoaderRows = isLoading && rows.length > 0;\n\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => scrollContainerRef.current,\n estimateSize: index => {\n const row = rows[index];\n const isGroupHeader = row?.subRows && row.subRows.length > 0;\n return isGroupHeader ? (groupHeaderHeight ?? rowHeight) : rowHeight;\n },\n overscan\n });\n\n const handleVirtualScroll = useCallback(() => {\n if (!scrollContainerRef.current || isLoading) return;\n const { scrollTop, scrollHeight, clientHeight } =\n scrollContainerRef.current;\n if (scrollHeight - scrollTop - clientHeight < loadMoreOffset) {\n loadMoreData();\n }\n }, [isLoading, loadMoreData, loadMoreOffset]);\n\n const totalHeight = virtualizer.getTotalSize();\n\n const hasData = rows?.length > 0 || isLoading;\n\n const hasChanges = hasActiveQuery(tableQuery || {}, defaultSort);\n\n const isZeroState = !hasData && !hasChanges;\n const isEmptyState = !hasData && hasChanges;\n\n const stateToShow: React.ReactNode = isZeroState\n ? (zeroState ?? emptyState ?? <DefaultEmptyComponent />)\n : isEmptyState\n ? (emptyState ?? <DefaultEmptyComponent />)\n : null;\n\n if (!hasData) {\n return <div className={classNames.root}>{stateToShow}</div>;\n }\n\n const visibleColumns = table.getVisibleLeafColumns();\n\n return (\n <div\n ref={scrollContainerRef}\n className={cx(classNames.root, styles.scrollContainer)}\n onScroll={handleVirtualScroll}\n >\n <div role='table' className={cx(styles.virtualTable, classNames.table)}>\n <VirtualHeaders\n headerGroups={headerGroups}\n className={cx(styles.stickyHeader, classNames.header)}\n />\n <div\n role='rowgroup'\n className={cx(styles.virtualBodyGroup, classNames.body)}\n style={{ height: totalHeight }}\n >\n <VirtualRows\n rows={rows}\n virtualizer={virtualizer}\n onRowClick={onRowClick}\n classNames={{\n row: classNames.row\n }}\n />\n </div>\n </div>\n {showLoaderRows && (\n <VirtualLoaderRows\n columns={visibleColumns}\n rowHeight={rowHeight}\n count={loadingRowCount}\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAsBA;;AAgBY;;;AAuBZ;AAEA;;AAiBA;AAEA;AAWE;;;AAIE;AAAU;AAEV;;AAEA;;AAGA;;;;;AAME;;AASF;AAeM;;AAkBF;AAGN;AACF;AAEA;AAWE;AAUU;;;AAuBZ;AAEA;AAIM;;AAmBJ;AACA;;AAGA;;;;AAME;;AAEE;AACA;AACA;;;AAGH;AAED;AACE;;;;AAIE;;;AAIJ;;;AAMA;AACA;;;AAIE;AACE;;;;;AAOJ;;;;AAqCF;;"}
1
+ {"version":3,"file":"virtualized-content.js","sources":["../../../../components/data-table/components/virtualized-content.tsx"],"sourcesContent":["'use client';\n\nimport { TableIcon } from '@radix-ui/react-icons';\nimport type { HeaderGroup, Row } from '@tanstack/react-table';\nimport { flexRender } from '@tanstack/react-table';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { cx } from 'class-variance-authority';\nimport { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport tableStyles from '~/components/table/table.module.css';\nimport { Badge } from '../../badge';\nimport { EmptyState } from '../../empty-state';\nimport { Flex } from '../../flex';\nimport { Skeleton } from '../../skeleton';\nimport styles from '../data-table.module.css';\nimport {\n DataTableColumnDef,\n defaultGroupOption,\n GroupedData,\n VirtualizedContentProps\n} from '../data-table.types';\nimport { useDataTable } from '../hooks/useDataTable';\nimport { hasActiveQuery } from '../utils';\n\nfunction VirtualHeaders<TData>({\n headerGroups = [],\n className = ''\n}: {\n headerGroups: HeaderGroup<TData>[];\n className?: string;\n}) {\n return (\n <div role='rowgroup' className={cx(styles.virtualHeaderGroup, className)}>\n {headerGroups?.map(headerGroup => (\n <div\n role='row'\n key={headerGroup?.id}\n className={styles.virtualHeaderRow}\n >\n {headerGroup?.headers?.map(header => {\n const columnDef = header.column.columnDef as DataTableColumnDef<\n TData,\n unknown\n >;\n return (\n <div\n role='columnheader'\n key={header.id}\n className={cx(\n tableStyles.head,\n styles.virtualHead,\n columnDef.classNames?.header\n )}\n style={columnDef.styles?.header}\n >\n {flexRender(columnDef.header, header.getContext())}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n );\n}\n\nfunction VirtualGroupHeader<TData>({\n data,\n style\n}: {\n data: GroupedData<TData>;\n style?: React.CSSProperties;\n}) {\n return (\n <div role='row' className={styles.virtualSectionHeader} style={style}>\n <Flex gap={3} align='center'>\n {data?.label}\n {data.showGroupCount ? (\n <Badge variant='neutral'>{data?.count}</Badge>\n ) : null}\n </Flex>\n </div>\n );\n}\n\nfunction VirtualRows<TData>({\n rows,\n virtualizer,\n onRowClick,\n classNames\n}: {\n rows: Row<TData>[];\n virtualizer: ReturnType<typeof useVirtualizer>;\n onRowClick?: (row: TData) => void;\n classNames?: { row?: string };\n}) {\n const items = virtualizer.getVirtualItems();\n\n return items.map((item, idx) => {\n const row = rows[item.index];\n if (!row) return null;\n\n const isSelected = row.getIsSelected();\n const cells = row.getVisibleCells() || [];\n const isGroupHeader = row.subRows && row.subRows.length > 0;\n const rowKey = row.id + '-' + item.index;\n\n const positionStyle: React.CSSProperties = {\n height: item.size,\n top: item.start\n };\n\n if (isGroupHeader) {\n return (\n <VirtualGroupHeader\n key={rowKey}\n data={row.original as GroupedData<unknown>}\n style={positionStyle}\n />\n );\n }\n\n return (\n <div\n role='row'\n key={rowKey}\n className={cx(\n styles.virtualRow,\n styles['row'],\n onRowClick ? styles['clickable'] : '',\n classNames?.row\n )}\n style={positionStyle}\n data-state={isSelected && 'selected'}\n onClick={() => onRowClick?.(row.original)}\n >\n {cells.map(cell => {\n const columnDef = cell.column.columnDef as DataTableColumnDef<\n TData,\n unknown\n >;\n return (\n <div\n role='cell'\n key={cell.id}\n className={cx(\n tableStyles.cell,\n styles.virtualCell,\n columnDef.classNames?.cell\n )}\n style={columnDef.styles?.cell}\n >\n {flexRender(columnDef.cell, cell.getContext())}\n </div>\n );\n })}\n </div>\n );\n });\n}\n\nfunction VirtualLoaderRows({\n columns,\n rowHeight,\n count\n}: {\n columns: ReturnType<\n ReturnType<typeof useDataTable>['table']['getVisibleLeafColumns']\n >;\n rowHeight: number;\n count: number;\n}) {\n return (\n <div className={styles.stickyLoaderContainer}>\n {Array.from({ length: count }).map((_, rowIndex) => (\n <div\n role='row'\n key={'loading-row-' + rowIndex}\n className={cx(styles.virtualRow, styles['row'], styles.loaderRow)}\n style={{ height: rowHeight }}\n >\n {columns.map((col, colIndex) => {\n const columnDef = col.columnDef as DataTableColumnDef<\n unknown,\n unknown\n >;\n return (\n <div\n role='cell'\n key={'loading-column-' + colIndex}\n className={cx(\n tableStyles.cell,\n styles.virtualCell,\n columnDef.classNames?.cell\n )}\n style={columnDef.styles?.cell}\n >\n <Skeleton containerClassName={styles['flex-1']} />\n </div>\n );\n })}\n </div>\n ))}\n </div>\n );\n}\n\nconst DefaultEmptyComponent = () => (\n <EmptyState icon={<TableIcon />} heading='No Data' />\n);\n\nexport function VirtualizedContent({\n rowHeight = 40,\n groupHeaderHeight,\n overscan = 5,\n loadMoreOffset = 100,\n emptyState,\n zeroState,\n classNames = {}\n}: VirtualizedContentProps) {\n const {\n onRowClick,\n table,\n isLoading,\n loadMoreData,\n tableQuery,\n defaultSort,\n loadingRowCount = 3,\n stickyGroupHeader = false\n } = useDataTable();\n\n const headerGroups = table?.getHeaderGroups();\n const rowModel = table?.getRowModel();\n const { rows = [] } = rowModel || {};\n\n const scrollContainerRef = useRef<HTMLDivElement | null>(null);\n const headerRef = useRef<HTMLDivElement | null>(null);\n const [stickyGroup, setStickyGroup] = useState<GroupedData<unknown> | null>(\n null\n );\n const [headerHeight, setHeaderHeight] = useState(40);\n\n const groupBy = tableQuery?.group_by?.[0];\n const isGrouped = Boolean(groupBy) && groupBy !== defaultGroupOption.id;\n\n const groupHeaderList = useMemo(() => {\n const list: { index: number; data: GroupedData<unknown> }[] = [];\n rows.forEach((row, i) => {\n if (row.subRows && row.subRows.length > 0) {\n list.push({ index: i, data: row.original as GroupedData<unknown> });\n }\n });\n return list;\n }, [rows]);\n\n const showLoaderRows = isLoading && rows.length > 0;\n\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => scrollContainerRef.current,\n estimateSize: index => {\n const row = rows[index];\n const isGroupHeader = row?.subRows && row.subRows.length > 0;\n return isGroupHeader ? (groupHeaderHeight ?? rowHeight) : rowHeight;\n },\n overscan\n });\n\n const updateStickyGroup = useCallback(() => {\n if (!stickyGroupHeader || !isGrouped || groupHeaderList.length === 0) {\n setStickyGroup(null);\n return;\n }\n const items = virtualizer.getVirtualItems();\n const firstIndex = items[0]?.index ?? 0;\n const current = groupHeaderList\n .filter(g => g.index <= firstIndex)\n .pop()?.data;\n setStickyGroup(current ?? null);\n }, [stickyGroupHeader, isGrouped, groupHeaderList, virtualizer]);\n\n const handleVirtualScroll = useCallback(() => {\n const el = scrollContainerRef.current;\n if (!el) return;\n if (stickyGroupHeader) updateStickyGroup();\n if (isLoading) return;\n const { scrollTop, scrollHeight, clientHeight } = el;\n if (scrollHeight - scrollTop - clientHeight < loadMoreOffset) {\n loadMoreData();\n }\n }, [\n stickyGroupHeader,\n isLoading,\n loadMoreData,\n loadMoreOffset,\n updateStickyGroup\n ]);\n\n const totalHeight = virtualizer.getTotalSize();\n\n useLayoutEffect(() => {\n if (headerRef.current) {\n setHeaderHeight(headerRef.current.getBoundingClientRect().height);\n }\n }, [headerGroups]);\n\n useLayoutEffect(() => {\n if (stickyGroupHeader) updateStickyGroup();\n }, [stickyGroupHeader, updateStickyGroup, groupHeaderList, isGrouped]);\n\n const hasData = rows?.length > 0 || isLoading;\n\n const hasChanges = hasActiveQuery(tableQuery || {}, defaultSort);\n\n const isZeroState = !hasData && !hasChanges;\n const isEmptyState = !hasData && hasChanges;\n\n const stateToShow: React.ReactNode = isZeroState\n ? (zeroState ?? emptyState ?? <DefaultEmptyComponent />)\n : isEmptyState\n ? (emptyState ?? <DefaultEmptyComponent />)\n : null;\n\n if (!hasData) {\n return <div className={classNames.root}>{stateToShow}</div>;\n }\n\n const visibleColumns = table.getVisibleLeafColumns();\n\n return (\n <div\n ref={scrollContainerRef}\n className={cx(classNames.root, styles.scrollContainer)}\n onScroll={handleVirtualScroll}\n >\n <div role='table' className={cx(styles.virtualTable, classNames.table)}>\n <div ref={headerRef}>\n <VirtualHeaders\n headerGroups={headerGroups}\n className={cx(styles.stickyHeader, classNames.header)}\n />\n </div>\n {stickyGroupHeader && isGrouped && stickyGroup && (\n <div\n role='row'\n className={styles.stickyGroupAnchor}\n style={{ top: headerHeight }}\n >\n <Flex gap={3} align='center'>\n {stickyGroup.label}\n {stickyGroup.showGroupCount ? (\n <Badge variant='neutral'>{stickyGroup.count}</Badge>\n ) : null}\n </Flex>\n </div>\n )}\n <div\n role='rowgroup'\n className={cx(styles.virtualBodyGroup, classNames.body)}\n style={{ height: totalHeight }}\n >\n <VirtualRows\n rows={rows}\n virtualizer={virtualizer}\n onRowClick={onRowClick}\n classNames={{\n row: classNames.row\n }}\n />\n </div>\n </div>\n {showLoaderRows && (\n <VirtualLoaderRows\n columns={visibleColumns}\n rowHeight={rowHeight}\n count={loadingRowCount}\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAuBA;;AAgBY;;;AAuBZ;AAEA;;AAiBA;AAEA;AAWE;;;AAIE;AAAU;AAEV;;AAEA;;AAGA;;;;;AAME;;AASF;AAeM;;AAkBF;AAGN;AACF;AAEA;AAWE;AAUU;;;AAuBZ;AAEA;AAIM;;AAoBJ;AACA;;AAGA;AACA;;;;AAOA;AAEA;;;AAGI;AACE;;AAEJ;AACA;AACF;;;;AAME;;AAEE;AACA;AACA;;;AAGH;AAED;AACE;;;;AAIA;;;;;AAKA;;AAGF;AACE;AACA;;AACA;AAAuB;AACvB;;;;AAGE;;AAEJ;;;;;;AAMC;AAED;;AAGE;;;AAGF;;AAGE;AAAuB;;;;AAOzB;AACA;;;AAIE;AACE;;;;;AAOJ;AAEA;;;AAmDF;;"}
@@ -14,7 +14,7 @@ var context = require('./context.cjs');
14
14
  var dataTable_types = require('./data-table.types.cjs');
15
15
  var index = require('./utils/index.cjs');
16
16
 
17
- function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading = false, loadingRowCount = 3, defaultSort, children, onTableQueryChange, onLoadMore, onRowClick, onColumnVisibilityChange }) {
17
+ function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading = false, loadingRowCount = 3, defaultSort, children, onTableQueryChange, onLoadMore, onRowClick, onColumnVisibilityChange, stickyGroupHeader = false, getRowId }) {
18
18
  const defaultTableQuery = React.useMemo(() => index.getDefaultTableQuery(defaultSort, query), [defaultSort, query]);
19
19
  const initialColumnVisibility = index.getInitialColumnVisibility(columns);
20
20
  const [columnVisibility, setColumnVisibility] = React.useState(initialColumnVisibility);
@@ -57,6 +57,7 @@ function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading =
57
57
  const table = reactTable.useReactTable({
58
58
  data: groupedData,
59
59
  columns: columnsWithFilters,
60
+ getRowId,
60
61
  getCoreRowModel: reactTable.getCoreRowModel(),
61
62
  getExpandedRowModel: reactTable.getExpandedRowModel(),
62
63
  getSubRows: row => row?.subRows || [],
@@ -123,7 +124,8 @@ function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading =
123
124
  defaultSort,
124
125
  loadingRowCount,
125
126
  onRowClick,
126
- shouldShowFilters
127
+ shouldShowFilters,
128
+ stickyGroupHeader
127
129
  };
128
130
  }, [
129
131
  table,
@@ -137,7 +139,8 @@ function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading =
137
139
  defaultSort,
138
140
  loadingRowCount,
139
141
  onRowClick,
140
- shouldShowFilters
142
+ shouldShowFilters,
143
+ stickyGroupHeader
141
144
  ]);
142
145
  return (jsxRuntime.jsx(context.TableContext.Provider, { value: contextValue, children: children }));
143
146
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.cjs","sources":["../../../components/data-table/data-table.tsx"],"sourcesContent":["'use client';\n\nimport {\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n Updater,\n useReactTable,\n VisibilityState\n} from '@tanstack/react-table';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Content } from './components/content';\nimport { DisplaySettings } from './components/display-settings';\nimport { Filters } from './components/filters';\nimport { TableSearch } from './components/search';\nimport { Toolbar } from './components/toolbar';\nimport { VirtualizedContent } from './components/virtualized-content';\nimport { TableContext } from './context';\nimport {\n DataTableProps,\n defaultGroupOption,\n GroupedData,\n InternalQuery,\n TableContextType,\n TableQueryUpdateFn\n} from './data-table.types';\nimport {\n getColumnsWithFilterFn,\n getDefaultTableQuery,\n getInitialColumnVisibility,\n groupData,\n hasQueryChanged,\n queryToTableState,\n transformToDataTableQuery\n} from './utils';\n\nfunction DataTableRoot<TData, TValue>({\n data = [],\n columns,\n query,\n mode = 'client',\n isLoading = false,\n loadingRowCount = 3,\n defaultSort,\n children,\n onTableQueryChange,\n onLoadMore,\n onRowClick,\n onColumnVisibilityChange\n}: React.PropsWithChildren<DataTableProps<TData, TValue>>) {\n const defaultTableQuery = useMemo(\n () => getDefaultTableQuery(defaultSort, query),\n [defaultSort, query]\n );\n const initialColumnVisibility = getInitialColumnVisibility(columns);\n\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>(\n initialColumnVisibility\n );\n const handleColumnVisibilityChange = useCallback(\n (value: Updater<VisibilityState>) => {\n setColumnVisibility(prev => {\n const newValue = typeof value === 'function' ? value(prev) : value;\n onColumnVisibilityChange?.(newValue);\n return newValue;\n });\n },\n [onColumnVisibilityChange]\n );\n\n const [tableQuery, setTableQuery] =\n useState<InternalQuery>(defaultTableQuery);\n\n const oldQueryRef = useRef<InternalQuery | null>(null);\n\n const reactTableState = useMemo(\n () => queryToTableState(tableQuery),\n [tableQuery]\n );\n\n const onDisplaySettingsReset = useCallback(() => {\n setTableQuery(prev => ({\n ...prev,\n ...defaultTableQuery,\n sort: [defaultSort],\n group_by: [defaultGroupOption.id]\n }));\n handleColumnVisibilityChange(initialColumnVisibility);\n }, [\n defaultSort,\n defaultTableQuery,\n initialColumnVisibility,\n handleColumnVisibilityChange\n ]);\n\n const group_by = tableQuery.group_by?.[0];\n\n const columnsWithFilters = useMemo(\n () => getColumnsWithFilterFn<TData, TValue>(columns, tableQuery.filters),\n [columns, tableQuery.filters]\n );\n\n const groupedData = useMemo(\n () => groupData(data, group_by, columns),\n [data, group_by, columns]\n );\n\n useEffect(() => {\n if (\n tableQuery &&\n onTableQueryChange &&\n hasQueryChanged(oldQueryRef.current, tableQuery) &&\n mode === 'server'\n ) {\n onTableQueryChange(transformToDataTableQuery(tableQuery));\n oldQueryRef.current = tableQuery;\n }\n }, [tableQuery, onTableQueryChange]);\n\n const table = useReactTable({\n data: groupedData as unknown as TData[],\n columns: columnsWithFilters,\n getCoreRowModel: getCoreRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSubRows: row => (row as unknown as GroupedData<TData>)?.subRows || [],\n getSortedRowModel: mode === 'server' ? undefined : getSortedRowModel(),\n getFilteredRowModel: mode === 'server' ? undefined : getFilteredRowModel(),\n manualSorting: mode === 'server',\n manualFiltering: mode === 'server',\n onColumnVisibilityChange: handleColumnVisibilityChange,\n globalFilterFn: mode === 'server' ? undefined : 'auto',\n initialState: {\n columnVisibility: initialColumnVisibility\n },\n filterFromLeafRows: true,\n state: {\n ...reactTableState,\n columnVisibility: columnVisibility,\n expanded:\n group_by && group_by !== defaultGroupOption.id ? true : undefined\n }\n });\n\n function updateTableQuery(fn: TableQueryUpdateFn) {\n setTableQuery(prev => fn(prev));\n }\n\n const loadMoreData = useCallback(() => {\n if (mode === 'server' && onLoadMore) {\n onLoadMore();\n }\n }, [mode, onLoadMore]);\n\n const searchQuery = query?.search;\n useEffect(() => {\n if (searchQuery) {\n updateTableQuery(prev => ({\n ...prev,\n search: searchQuery\n }));\n }\n }, [searchQuery]);\n\n // Determine if filters should be visible\n // Filters should be visible if there is data OR if filters are applied (empty state)\n // Filters should NOT be visible if no data AND no filters (zero state)\n // Note: Search alone does not show the filter bar\n const shouldShowFilters = useMemo(() => {\n const hasFilters = tableQuery?.filters && tableQuery.filters.length > 0;\n\n try {\n const rowModel = table.getRowModel();\n const hasData = (rowModel?.rows?.length ?? 0) > 0;\n return hasData || hasFilters;\n } catch {\n // If table is not ready yet, check if we have initial data\n // If no filters and no data, don't show filters\n return hasFilters || data.length > 0;\n }\n }, [table, tableQuery, data.length]);\n\n const contextValue: TableContextType<TData, TValue> = useMemo(() => {\n return {\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick,\n shouldShowFilters\n };\n }, [\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick,\n shouldShowFilters\n ]);\n\n return (\n <TableContext.Provider value={contextValue}>\n {children}\n </TableContext.Provider>\n );\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Content: Content,\n VirtualizedContent: VirtualizedContent,\n Toolbar: Toolbar,\n Search: TableSearch,\n Filters: Filters,\n DisplayControls: DisplaySettings\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAqCA;;AAkBE;;AAKA;;AAGM;AACA;AACA;AACF;AACF;;AAOF;AAEA;AAKA;AACE;AACE;AACA;;AAEA;AACD;;AAEH;;;;;AAKC;;;;;AAeC;;AAGE;;AAGA;AACA;;AAEJ;;AAGE;AACA;;;;AAIA;AACA;;;AAGA;;AAEA;AACE;AACD;AACD;AACA;AACE;AACA;AACA;AAED;AACF;;;;AAMD;AACE;AACE;;AAEJ;AAEA;;;AAGI;AACE;AACA;AACD;;AAEL;;;;;AAMA;AACE;AAEA;AACE;AACA;;;AAEA;;;AAGA;;;AAIJ;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;AAaC;AAED;AAKF;;AAGE;AACA;AACA;AACA;AACA;AACA;AACD;;"}
1
+ {"version":3,"file":"data-table.cjs","sources":["../../../components/data-table/data-table.tsx"],"sourcesContent":["'use client';\n\nimport {\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n Updater,\n useReactTable,\n VisibilityState\n} from '@tanstack/react-table';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Content } from './components/content';\nimport { DisplaySettings } from './components/display-settings';\nimport { Filters } from './components/filters';\nimport { TableSearch } from './components/search';\nimport { Toolbar } from './components/toolbar';\nimport { VirtualizedContent } from './components/virtualized-content';\nimport { TableContext } from './context';\nimport {\n DataTableProps,\n defaultGroupOption,\n GroupedData,\n InternalQuery,\n TableContextType,\n TableQueryUpdateFn\n} from './data-table.types';\nimport {\n getColumnsWithFilterFn,\n getDefaultTableQuery,\n getInitialColumnVisibility,\n groupData,\n hasQueryChanged,\n queryToTableState,\n transformToDataTableQuery\n} from './utils';\n\nfunction DataTableRoot<TData, TValue>({\n data = [],\n columns,\n query,\n mode = 'client',\n isLoading = false,\n loadingRowCount = 3,\n defaultSort,\n children,\n onTableQueryChange,\n onLoadMore,\n onRowClick,\n onColumnVisibilityChange,\n stickyGroupHeader = false,\n getRowId\n}: React.PropsWithChildren<DataTableProps<TData, TValue>>) {\n const defaultTableQuery = useMemo(\n () => getDefaultTableQuery(defaultSort, query),\n [defaultSort, query]\n );\n const initialColumnVisibility = getInitialColumnVisibility(columns);\n\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>(\n initialColumnVisibility\n );\n const handleColumnVisibilityChange = useCallback(\n (value: Updater<VisibilityState>) => {\n setColumnVisibility(prev => {\n const newValue = typeof value === 'function' ? value(prev) : value;\n onColumnVisibilityChange?.(newValue);\n return newValue;\n });\n },\n [onColumnVisibilityChange]\n );\n\n const [tableQuery, setTableQuery] =\n useState<InternalQuery>(defaultTableQuery);\n\n const oldQueryRef = useRef<InternalQuery | null>(null);\n\n const reactTableState = useMemo(\n () => queryToTableState(tableQuery),\n [tableQuery]\n );\n\n const onDisplaySettingsReset = useCallback(() => {\n setTableQuery(prev => ({\n ...prev,\n ...defaultTableQuery,\n sort: [defaultSort],\n group_by: [defaultGroupOption.id]\n }));\n handleColumnVisibilityChange(initialColumnVisibility);\n }, [\n defaultSort,\n defaultTableQuery,\n initialColumnVisibility,\n handleColumnVisibilityChange\n ]);\n\n const group_by = tableQuery.group_by?.[0];\n\n const columnsWithFilters = useMemo(\n () => getColumnsWithFilterFn<TData, TValue>(columns, tableQuery.filters),\n [columns, tableQuery.filters]\n );\n\n const groupedData = useMemo(\n () => groupData(data, group_by, columns),\n [data, group_by, columns]\n );\n\n useEffect(() => {\n if (\n tableQuery &&\n onTableQueryChange &&\n hasQueryChanged(oldQueryRef.current, tableQuery) &&\n mode === 'server'\n ) {\n onTableQueryChange(transformToDataTableQuery(tableQuery));\n oldQueryRef.current = tableQuery;\n }\n }, [tableQuery, onTableQueryChange]);\n\n const table = useReactTable({\n data: groupedData as unknown as TData[],\n columns: columnsWithFilters,\n getRowId,\n getCoreRowModel: getCoreRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSubRows: row => (row as unknown as GroupedData<TData>)?.subRows || [],\n getSortedRowModel: mode === 'server' ? undefined : getSortedRowModel(),\n getFilteredRowModel: mode === 'server' ? undefined : getFilteredRowModel(),\n manualSorting: mode === 'server',\n manualFiltering: mode === 'server',\n onColumnVisibilityChange: handleColumnVisibilityChange,\n globalFilterFn: mode === 'server' ? undefined : 'auto',\n initialState: {\n columnVisibility: initialColumnVisibility\n },\n filterFromLeafRows: true,\n state: {\n ...reactTableState,\n columnVisibility: columnVisibility,\n expanded:\n group_by && group_by !== defaultGroupOption.id ? true : undefined\n }\n });\n\n function updateTableQuery(fn: TableQueryUpdateFn) {\n setTableQuery(prev => fn(prev));\n }\n\n const loadMoreData = useCallback(() => {\n if (mode === 'server' && onLoadMore) {\n onLoadMore();\n }\n }, [mode, onLoadMore]);\n\n const searchQuery = query?.search;\n useEffect(() => {\n if (searchQuery) {\n updateTableQuery(prev => ({\n ...prev,\n search: searchQuery\n }));\n }\n }, [searchQuery]);\n\n // Determine if filters should be visible\n // Filters should be visible if there is data OR if filters are applied (empty state)\n // Filters should NOT be visible if no data AND no filters (zero state)\n // Note: Search alone does not show the filter bar\n const shouldShowFilters = useMemo(() => {\n const hasFilters = tableQuery?.filters && tableQuery.filters.length > 0;\n\n try {\n const rowModel = table.getRowModel();\n const hasData = (rowModel?.rows?.length ?? 0) > 0;\n return hasData || hasFilters;\n } catch {\n // If table is not ready yet, check if we have initial data\n // If no filters and no data, don't show filters\n return hasFilters || data.length > 0;\n }\n }, [table, tableQuery, data.length]);\n\n const contextValue: TableContextType<TData, TValue> = useMemo(() => {\n return {\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick,\n shouldShowFilters,\n stickyGroupHeader\n };\n }, [\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick,\n shouldShowFilters,\n stickyGroupHeader\n ]);\n\n return (\n <TableContext.Provider value={contextValue}>\n {children}\n </TableContext.Provider>\n );\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Content: Content,\n VirtualizedContent: VirtualizedContent,\n Toolbar: Toolbar,\n Search: TableSearch,\n Filters: Filters,\n DisplayControls: DisplaySettings\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAqCA;;AAoBE;;AAKA;;AAGM;AACA;AACA;AACF;AACF;;AAOF;AAEA;AAKA;AACE;AACE;AACA;;AAEA;AACD;;AAEH;;;;;AAKC;;;;;AAeC;;AAGE;;AAGA;AACA;;AAEJ;;AAGE;AACA;;;;;AAKA;AACA;;;AAGA;;AAEA;AACE;AACD;AACD;AACA;AACE;AACA;AACA;AAED;AACF;;;;AAMD;AACE;AACE;;AAEJ;AAEA;;;AAGI;AACE;AACA;AACD;;AAEL;;;;;AAMA;AACE;AAEA;AACE;AACA;;;AAEA;;;AAGA;;;AAIJ;;;;;;;;;;;;;;;;AAgBA;;;;;;;;;;;;;;AAcC;AAED;AAKF;;AAGE;AACA;AACA;AACA;AACA;AACA;AACD;;"}
@@ -4,7 +4,7 @@ import { Filters } from './components/filters';
4
4
  import { Toolbar } from './components/toolbar';
5
5
  import { VirtualizedContent } from './components/virtualized-content';
6
6
  import { DataTableProps } from './data-table.types';
7
- declare function DataTableRoot<TData, TValue>({ data, columns, query, mode, isLoading, loadingRowCount, defaultSort, children, onTableQueryChange, onLoadMore, onRowClick, onColumnVisibilityChange }: React.PropsWithChildren<DataTableProps<TData, TValue>>): import("react/jsx-runtime").JSX.Element;
7
+ declare function DataTableRoot<TData, TValue>({ data, columns, query, mode, isLoading, loadingRowCount, defaultSort, children, onTableQueryChange, onLoadMore, onRowClick, onColumnVisibilityChange, stickyGroupHeader, getRowId }: React.PropsWithChildren<DataTableProps<TData, TValue>>): import("react/jsx-runtime").JSX.Element;
8
8
  export declare const DataTable: typeof DataTableRoot & {
9
9
  Content: typeof Content;
10
10
  VirtualizedContent: typeof VirtualizedContent;
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../../components/data-table/data-table.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,OAAO,EACL,cAAc,EAMf,MAAM,oBAAoB,CAAC;AAW5B,iBAAS,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EACpC,IAAS,EACT,OAAO,EACP,KAAK,EACL,IAAe,EACf,SAAiB,EACjB,eAAmB,EACnB,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,wBAAwB,EACzB,EAAE,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,2CAuKxD;AAED,eAAO,MAAM,SAAS;;;;;;;CAOpB,CAAC"}
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../../components/data-table/data-table.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,OAAO,EACL,cAAc,EAMf,MAAM,oBAAoB,CAAC;AAW5B,iBAAS,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EACpC,IAAS,EACT,OAAO,EACP,KAAK,EACL,IAAe,EACf,SAAiB,EACjB,eAAmB,EACnB,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,wBAAwB,EACxB,iBAAyB,EACzB,QAAQ,EACT,EAAE,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,2CA0KxD;AAED,eAAO,MAAM,SAAS;;;;;;;CAOpB,CAAC"}
@@ -12,7 +12,7 @@ import { TableContext } from './context.js';
12
12
  import { defaultGroupOption } from './data-table.types.js';
13
13
  import { getDefaultTableQuery, getInitialColumnVisibility, queryToTableState, getColumnsWithFilterFn, groupData, hasQueryChanged, transformToDataTableQuery } from './utils/index.js';
14
14
 
15
- function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading = false, loadingRowCount = 3, defaultSort, children, onTableQueryChange, onLoadMore, onRowClick, onColumnVisibilityChange }) {
15
+ function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading = false, loadingRowCount = 3, defaultSort, children, onTableQueryChange, onLoadMore, onRowClick, onColumnVisibilityChange, stickyGroupHeader = false, getRowId }) {
16
16
  const defaultTableQuery = useMemo(() => getDefaultTableQuery(defaultSort, query), [defaultSort, query]);
17
17
  const initialColumnVisibility = getInitialColumnVisibility(columns);
18
18
  const [columnVisibility, setColumnVisibility] = useState(initialColumnVisibility);
@@ -55,6 +55,7 @@ function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading =
55
55
  const table = useReactTable({
56
56
  data: groupedData,
57
57
  columns: columnsWithFilters,
58
+ getRowId,
58
59
  getCoreRowModel: getCoreRowModel(),
59
60
  getExpandedRowModel: getExpandedRowModel(),
60
61
  getSubRows: row => row?.subRows || [],
@@ -121,7 +122,8 @@ function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading =
121
122
  defaultSort,
122
123
  loadingRowCount,
123
124
  onRowClick,
124
- shouldShowFilters
125
+ shouldShowFilters,
126
+ stickyGroupHeader
125
127
  };
126
128
  }, [
127
129
  table,
@@ -135,7 +137,8 @@ function DataTableRoot({ data = [], columns, query, mode = 'client', isLoading =
135
137
  defaultSort,
136
138
  loadingRowCount,
137
139
  onRowClick,
138
- shouldShowFilters
140
+ shouldShowFilters,
141
+ stickyGroupHeader
139
142
  ]);
140
143
  return (jsx(TableContext.Provider, { value: contextValue, children: children }));
141
144
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.js","sources":["../../../components/data-table/data-table.tsx"],"sourcesContent":["'use client';\n\nimport {\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n Updater,\n useReactTable,\n VisibilityState\n} from '@tanstack/react-table';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Content } from './components/content';\nimport { DisplaySettings } from './components/display-settings';\nimport { Filters } from './components/filters';\nimport { TableSearch } from './components/search';\nimport { Toolbar } from './components/toolbar';\nimport { VirtualizedContent } from './components/virtualized-content';\nimport { TableContext } from './context';\nimport {\n DataTableProps,\n defaultGroupOption,\n GroupedData,\n InternalQuery,\n TableContextType,\n TableQueryUpdateFn\n} from './data-table.types';\nimport {\n getColumnsWithFilterFn,\n getDefaultTableQuery,\n getInitialColumnVisibility,\n groupData,\n hasQueryChanged,\n queryToTableState,\n transformToDataTableQuery\n} from './utils';\n\nfunction DataTableRoot<TData, TValue>({\n data = [],\n columns,\n query,\n mode = 'client',\n isLoading = false,\n loadingRowCount = 3,\n defaultSort,\n children,\n onTableQueryChange,\n onLoadMore,\n onRowClick,\n onColumnVisibilityChange\n}: React.PropsWithChildren<DataTableProps<TData, TValue>>) {\n const defaultTableQuery = useMemo(\n () => getDefaultTableQuery(defaultSort, query),\n [defaultSort, query]\n );\n const initialColumnVisibility = getInitialColumnVisibility(columns);\n\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>(\n initialColumnVisibility\n );\n const handleColumnVisibilityChange = useCallback(\n (value: Updater<VisibilityState>) => {\n setColumnVisibility(prev => {\n const newValue = typeof value === 'function' ? value(prev) : value;\n onColumnVisibilityChange?.(newValue);\n return newValue;\n });\n },\n [onColumnVisibilityChange]\n );\n\n const [tableQuery, setTableQuery] =\n useState<InternalQuery>(defaultTableQuery);\n\n const oldQueryRef = useRef<InternalQuery | null>(null);\n\n const reactTableState = useMemo(\n () => queryToTableState(tableQuery),\n [tableQuery]\n );\n\n const onDisplaySettingsReset = useCallback(() => {\n setTableQuery(prev => ({\n ...prev,\n ...defaultTableQuery,\n sort: [defaultSort],\n group_by: [defaultGroupOption.id]\n }));\n handleColumnVisibilityChange(initialColumnVisibility);\n }, [\n defaultSort,\n defaultTableQuery,\n initialColumnVisibility,\n handleColumnVisibilityChange\n ]);\n\n const group_by = tableQuery.group_by?.[0];\n\n const columnsWithFilters = useMemo(\n () => getColumnsWithFilterFn<TData, TValue>(columns, tableQuery.filters),\n [columns, tableQuery.filters]\n );\n\n const groupedData = useMemo(\n () => groupData(data, group_by, columns),\n [data, group_by, columns]\n );\n\n useEffect(() => {\n if (\n tableQuery &&\n onTableQueryChange &&\n hasQueryChanged(oldQueryRef.current, tableQuery) &&\n mode === 'server'\n ) {\n onTableQueryChange(transformToDataTableQuery(tableQuery));\n oldQueryRef.current = tableQuery;\n }\n }, [tableQuery, onTableQueryChange]);\n\n const table = useReactTable({\n data: groupedData as unknown as TData[],\n columns: columnsWithFilters,\n getCoreRowModel: getCoreRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSubRows: row => (row as unknown as GroupedData<TData>)?.subRows || [],\n getSortedRowModel: mode === 'server' ? undefined : getSortedRowModel(),\n getFilteredRowModel: mode === 'server' ? undefined : getFilteredRowModel(),\n manualSorting: mode === 'server',\n manualFiltering: mode === 'server',\n onColumnVisibilityChange: handleColumnVisibilityChange,\n globalFilterFn: mode === 'server' ? undefined : 'auto',\n initialState: {\n columnVisibility: initialColumnVisibility\n },\n filterFromLeafRows: true,\n state: {\n ...reactTableState,\n columnVisibility: columnVisibility,\n expanded:\n group_by && group_by !== defaultGroupOption.id ? true : undefined\n }\n });\n\n function updateTableQuery(fn: TableQueryUpdateFn) {\n setTableQuery(prev => fn(prev));\n }\n\n const loadMoreData = useCallback(() => {\n if (mode === 'server' && onLoadMore) {\n onLoadMore();\n }\n }, [mode, onLoadMore]);\n\n const searchQuery = query?.search;\n useEffect(() => {\n if (searchQuery) {\n updateTableQuery(prev => ({\n ...prev,\n search: searchQuery\n }));\n }\n }, [searchQuery]);\n\n // Determine if filters should be visible\n // Filters should be visible if there is data OR if filters are applied (empty state)\n // Filters should NOT be visible if no data AND no filters (zero state)\n // Note: Search alone does not show the filter bar\n const shouldShowFilters = useMemo(() => {\n const hasFilters = tableQuery?.filters && tableQuery.filters.length > 0;\n\n try {\n const rowModel = table.getRowModel();\n const hasData = (rowModel?.rows?.length ?? 0) > 0;\n return hasData || hasFilters;\n } catch {\n // If table is not ready yet, check if we have initial data\n // If no filters and no data, don't show filters\n return hasFilters || data.length > 0;\n }\n }, [table, tableQuery, data.length]);\n\n const contextValue: TableContextType<TData, TValue> = useMemo(() => {\n return {\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick,\n shouldShowFilters\n };\n }, [\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick,\n shouldShowFilters\n ]);\n\n return (\n <TableContext.Provider value={contextValue}>\n {children}\n </TableContext.Provider>\n );\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Content: Content,\n VirtualizedContent: VirtualizedContent,\n Toolbar: Toolbar,\n Search: TableSearch,\n Filters: Filters,\n DisplayControls: DisplaySettings\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAqCA;;AAkBE;;AAKA;;AAGM;AACA;AACA;AACF;AACF;;AAOF;AAEA;AAKA;AACE;AACE;AACA;;AAEA;AACD;;AAEH;;;;;AAKC;;;;;AAeC;;AAGE;;AAGA;AACA;;AAEJ;;AAGE;AACA;;;;AAIA;AACA;;;AAGA;;AAEA;AACE;AACD;AACD;AACA;AACE;AACA;AACA;AAED;AACF;;;;AAMD;AACE;AACE;;AAEJ;AAEA;;;AAGI;AACE;AACA;AACD;;AAEL;;;;;AAMA;AACE;AAEA;AACE;AACA;;;AAEA;;;AAGA;;;AAIJ;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;AAaC;AAED;AAKF;;AAGE;AACA;AACA;AACA;AACA;AACA;AACD;;"}
1
+ {"version":3,"file":"data-table.js","sources":["../../../components/data-table/data-table.tsx"],"sourcesContent":["'use client';\n\nimport {\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n Updater,\n useReactTable,\n VisibilityState\n} from '@tanstack/react-table';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Content } from './components/content';\nimport { DisplaySettings } from './components/display-settings';\nimport { Filters } from './components/filters';\nimport { TableSearch } from './components/search';\nimport { Toolbar } from './components/toolbar';\nimport { VirtualizedContent } from './components/virtualized-content';\nimport { TableContext } from './context';\nimport {\n DataTableProps,\n defaultGroupOption,\n GroupedData,\n InternalQuery,\n TableContextType,\n TableQueryUpdateFn\n} from './data-table.types';\nimport {\n getColumnsWithFilterFn,\n getDefaultTableQuery,\n getInitialColumnVisibility,\n groupData,\n hasQueryChanged,\n queryToTableState,\n transformToDataTableQuery\n} from './utils';\n\nfunction DataTableRoot<TData, TValue>({\n data = [],\n columns,\n query,\n mode = 'client',\n isLoading = false,\n loadingRowCount = 3,\n defaultSort,\n children,\n onTableQueryChange,\n onLoadMore,\n onRowClick,\n onColumnVisibilityChange,\n stickyGroupHeader = false,\n getRowId\n}: React.PropsWithChildren<DataTableProps<TData, TValue>>) {\n const defaultTableQuery = useMemo(\n () => getDefaultTableQuery(defaultSort, query),\n [defaultSort, query]\n );\n const initialColumnVisibility = getInitialColumnVisibility(columns);\n\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>(\n initialColumnVisibility\n );\n const handleColumnVisibilityChange = useCallback(\n (value: Updater<VisibilityState>) => {\n setColumnVisibility(prev => {\n const newValue = typeof value === 'function' ? value(prev) : value;\n onColumnVisibilityChange?.(newValue);\n return newValue;\n });\n },\n [onColumnVisibilityChange]\n );\n\n const [tableQuery, setTableQuery] =\n useState<InternalQuery>(defaultTableQuery);\n\n const oldQueryRef = useRef<InternalQuery | null>(null);\n\n const reactTableState = useMemo(\n () => queryToTableState(tableQuery),\n [tableQuery]\n );\n\n const onDisplaySettingsReset = useCallback(() => {\n setTableQuery(prev => ({\n ...prev,\n ...defaultTableQuery,\n sort: [defaultSort],\n group_by: [defaultGroupOption.id]\n }));\n handleColumnVisibilityChange(initialColumnVisibility);\n }, [\n defaultSort,\n defaultTableQuery,\n initialColumnVisibility,\n handleColumnVisibilityChange\n ]);\n\n const group_by = tableQuery.group_by?.[0];\n\n const columnsWithFilters = useMemo(\n () => getColumnsWithFilterFn<TData, TValue>(columns, tableQuery.filters),\n [columns, tableQuery.filters]\n );\n\n const groupedData = useMemo(\n () => groupData(data, group_by, columns),\n [data, group_by, columns]\n );\n\n useEffect(() => {\n if (\n tableQuery &&\n onTableQueryChange &&\n hasQueryChanged(oldQueryRef.current, tableQuery) &&\n mode === 'server'\n ) {\n onTableQueryChange(transformToDataTableQuery(tableQuery));\n oldQueryRef.current = tableQuery;\n }\n }, [tableQuery, onTableQueryChange]);\n\n const table = useReactTable({\n data: groupedData as unknown as TData[],\n columns: columnsWithFilters,\n getRowId,\n getCoreRowModel: getCoreRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSubRows: row => (row as unknown as GroupedData<TData>)?.subRows || [],\n getSortedRowModel: mode === 'server' ? undefined : getSortedRowModel(),\n getFilteredRowModel: mode === 'server' ? undefined : getFilteredRowModel(),\n manualSorting: mode === 'server',\n manualFiltering: mode === 'server',\n onColumnVisibilityChange: handleColumnVisibilityChange,\n globalFilterFn: mode === 'server' ? undefined : 'auto',\n initialState: {\n columnVisibility: initialColumnVisibility\n },\n filterFromLeafRows: true,\n state: {\n ...reactTableState,\n columnVisibility: columnVisibility,\n expanded:\n group_by && group_by !== defaultGroupOption.id ? true : undefined\n }\n });\n\n function updateTableQuery(fn: TableQueryUpdateFn) {\n setTableQuery(prev => fn(prev));\n }\n\n const loadMoreData = useCallback(() => {\n if (mode === 'server' && onLoadMore) {\n onLoadMore();\n }\n }, [mode, onLoadMore]);\n\n const searchQuery = query?.search;\n useEffect(() => {\n if (searchQuery) {\n updateTableQuery(prev => ({\n ...prev,\n search: searchQuery\n }));\n }\n }, [searchQuery]);\n\n // Determine if filters should be visible\n // Filters should be visible if there is data OR if filters are applied (empty state)\n // Filters should NOT be visible if no data AND no filters (zero state)\n // Note: Search alone does not show the filter bar\n const shouldShowFilters = useMemo(() => {\n const hasFilters = tableQuery?.filters && tableQuery.filters.length > 0;\n\n try {\n const rowModel = table.getRowModel();\n const hasData = (rowModel?.rows?.length ?? 0) > 0;\n return hasData || hasFilters;\n } catch {\n // If table is not ready yet, check if we have initial data\n // If no filters and no data, don't show filters\n return hasFilters || data.length > 0;\n }\n }, [table, tableQuery, data.length]);\n\n const contextValue: TableContextType<TData, TValue> = useMemo(() => {\n return {\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick,\n shouldShowFilters,\n stickyGroupHeader\n };\n }, [\n table,\n columns,\n mode,\n isLoading,\n loadMoreData,\n tableQuery,\n updateTableQuery,\n onDisplaySettingsReset,\n defaultSort,\n loadingRowCount,\n onRowClick,\n shouldShowFilters,\n stickyGroupHeader\n ]);\n\n return (\n <TableContext.Provider value={contextValue}>\n {children}\n </TableContext.Provider>\n );\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Content: Content,\n VirtualizedContent: VirtualizedContent,\n Toolbar: Toolbar,\n Search: TableSearch,\n Filters: Filters,\n DisplayControls: DisplaySettings\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAqCA;;AAoBE;;AAKA;;AAGM;AACA;AACA;AACF;AACF;;AAOF;AAEA;AAKA;AACE;AACE;AACA;;AAEA;AACD;;AAEH;;;;;AAKC;;;;;AAeC;;AAGE;;AAGA;AACA;;AAEJ;;AAGE;AACA;;;;;AAKA;AACA;;;AAGA;;AAEA;AACE;AACD;AACD;AACA;AACE;AACA;AACA;AAED;AACF;;;;AAMD;AACE;AACE;;AAEJ;AAEA;;;AAGI;AACE;AACA;AACD;;AAEL;;;;;AAMA;AACE;AAEA;AACE;AACA;;;AAEA;;;AAGA;;;AAIJ;;;;;;;;;;;;;;;;AAgBA;;;;;;;;;;;;;;AAcC;AAED;AAKF;;AAGE;AACA;AACA;AACA;AACA;AACA;AACD;;"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var styles = {"toolbar":"data-table-module_toolbar__SsniX","display-popover-content":"data-table-module_display-popover-content__fyCAs","display-popover-properties-container":"data-table-module_display-popover-properties-container__5d1QY","display-popover-properties-select":"data-table-module_display-popover-properties-select__XCZFA","display-popover-reset-container":"data-table-module_display-popover-reset-container__EO-tX","display-popover-sort-icon":"data-table-module_display-popover-sort-icon__qS4Tv","flex-1":"data-table-module_flex-1__bRXzB","contentRoot":"data-table-module_contentRoot__SFof5","row":"data-table-module_row__TqG9x","clickable":"data-table-module_clickable__BGrE5","head":"data-table-module_head__xUe2x","cell":"data-table-module_cell__YNzml","emptyStateCell":"data-table-module_emptyStateCell__icRK5","scrollContainer":"data-table-module_scrollContainer__eKR0-","stickyHeader":"data-table-module_stickyHeader__hWOCt","virtualTable":"data-table-module_virtualTable__GB8Q0","virtualHeaderGroup":"data-table-module_virtualHeaderGroup__dhJXA","virtualHeaderRow":"data-table-module_virtualHeaderRow__LqMog","virtualBodyGroup":"data-table-module_virtualBodyGroup__xlRy5","virtualRow":"data-table-module_virtualRow__dIERR","virtualHead":"data-table-module_virtualHead__Xt-ov","virtualCell":"data-table-module_virtualCell__8i2Lt","virtualSectionHeader":"data-table-module_virtualSectionHeader__rsMjl","stickyLoaderContainer":"data-table-module_stickyLoaderContainer__ueYwH","loaderRow":"data-table-module_loaderRow__yivkT","display___popover___content":"data-table-module_display-popover-content__fyCAs","display___popover___properties___container":"data-table-module_display-popover-properties-container__5d1QY","display___popover___properties___select":"data-table-module_display-popover-properties-select__XCZFA","display___popover___reset___container":"data-table-module_display-popover-reset-container__EO-tX","display___popover___sort___icon":"data-table-module_display-popover-sort-icon__qS4Tv","flex___1":"data-table-module_flex-1__bRXzB"};
5
+ var styles = {"toolbar":"data-table-module_toolbar__SsniX","display-popover-content":"data-table-module_display-popover-content__fyCAs","display-popover-properties-container":"data-table-module_display-popover-properties-container__5d1QY","display-popover-properties-select":"data-table-module_display-popover-properties-select__XCZFA","display-popover-reset-container":"data-table-module_display-popover-reset-container__EO-tX","display-popover-sort-icon":"data-table-module_display-popover-sort-icon__qS4Tv","flex-1":"data-table-module_flex-1__bRXzB","contentRoot":"data-table-module_contentRoot__SFof5","row":"data-table-module_row__TqG9x","clickable":"data-table-module_clickable__BGrE5","head":"data-table-module_head__xUe2x","cell":"data-table-module_cell__YNzml","emptyStateCell":"data-table-module_emptyStateCell__icRK5","scrollContainer":"data-table-module_scrollContainer__eKR0-","stickyHeader":"data-table-module_stickyHeader__hWOCt","virtualTable":"data-table-module_virtualTable__GB8Q0","virtualHeaderGroup":"data-table-module_virtualHeaderGroup__dhJXA","virtualHeaderRow":"data-table-module_virtualHeaderRow__LqMog","virtualBodyGroup":"data-table-module_virtualBodyGroup__xlRy5","virtualRow":"data-table-module_virtualRow__dIERR","virtualHead":"data-table-module_virtualHead__Xt-ov","virtualCell":"data-table-module_virtualCell__8i2Lt","virtualSectionHeader":"data-table-module_virtualSectionHeader__rsMjl","stickyGroupAnchor":"data-table-module_stickyGroupAnchor__T-OZ3","stickyLoaderContainer":"data-table-module_stickyLoaderContainer__ueYwH","loaderRow":"data-table-module_loaderRow__yivkT","stickySectionHeader":"data-table-module_stickySectionHeader__CdMzK","display___popover___content":"data-table-module_display-popover-content__fyCAs","display___popover___properties___container":"data-table-module_display-popover-properties-container__5d1QY","display___popover___properties___select":"data-table-module_display-popover-properties-select__XCZFA","display___popover___reset___container":"data-table-module_display-popover-reset-container__EO-tX","display___popover___sort___icon":"data-table-module_display-popover-sort-icon__qS4Tv","flex___1":"data-table-module_flex-1__bRXzB"};
6
6
 
7
7
  exports.default = styles;
8
8
  //# sourceMappingURL=data-table.module.css.cjs.map
@@ -1,4 +1,4 @@
1
- var styles = {"toolbar":"data-table-module_toolbar__SsniX","display-popover-content":"data-table-module_display-popover-content__fyCAs","display-popover-properties-container":"data-table-module_display-popover-properties-container__5d1QY","display-popover-properties-select":"data-table-module_display-popover-properties-select__XCZFA","display-popover-reset-container":"data-table-module_display-popover-reset-container__EO-tX","display-popover-sort-icon":"data-table-module_display-popover-sort-icon__qS4Tv","flex-1":"data-table-module_flex-1__bRXzB","contentRoot":"data-table-module_contentRoot__SFof5","row":"data-table-module_row__TqG9x","clickable":"data-table-module_clickable__BGrE5","head":"data-table-module_head__xUe2x","cell":"data-table-module_cell__YNzml","emptyStateCell":"data-table-module_emptyStateCell__icRK5","scrollContainer":"data-table-module_scrollContainer__eKR0-","stickyHeader":"data-table-module_stickyHeader__hWOCt","virtualTable":"data-table-module_virtualTable__GB8Q0","virtualHeaderGroup":"data-table-module_virtualHeaderGroup__dhJXA","virtualHeaderRow":"data-table-module_virtualHeaderRow__LqMog","virtualBodyGroup":"data-table-module_virtualBodyGroup__xlRy5","virtualRow":"data-table-module_virtualRow__dIERR","virtualHead":"data-table-module_virtualHead__Xt-ov","virtualCell":"data-table-module_virtualCell__8i2Lt","virtualSectionHeader":"data-table-module_virtualSectionHeader__rsMjl","stickyLoaderContainer":"data-table-module_stickyLoaderContainer__ueYwH","loaderRow":"data-table-module_loaderRow__yivkT","display___popover___content":"data-table-module_display-popover-content__fyCAs","display___popover___properties___container":"data-table-module_display-popover-properties-container__5d1QY","display___popover___properties___select":"data-table-module_display-popover-properties-select__XCZFA","display___popover___reset___container":"data-table-module_display-popover-reset-container__EO-tX","display___popover___sort___icon":"data-table-module_display-popover-sort-icon__qS4Tv","flex___1":"data-table-module_flex-1__bRXzB"};
1
+ var styles = {"toolbar":"data-table-module_toolbar__SsniX","display-popover-content":"data-table-module_display-popover-content__fyCAs","display-popover-properties-container":"data-table-module_display-popover-properties-container__5d1QY","display-popover-properties-select":"data-table-module_display-popover-properties-select__XCZFA","display-popover-reset-container":"data-table-module_display-popover-reset-container__EO-tX","display-popover-sort-icon":"data-table-module_display-popover-sort-icon__qS4Tv","flex-1":"data-table-module_flex-1__bRXzB","contentRoot":"data-table-module_contentRoot__SFof5","row":"data-table-module_row__TqG9x","clickable":"data-table-module_clickable__BGrE5","head":"data-table-module_head__xUe2x","cell":"data-table-module_cell__YNzml","emptyStateCell":"data-table-module_emptyStateCell__icRK5","scrollContainer":"data-table-module_scrollContainer__eKR0-","stickyHeader":"data-table-module_stickyHeader__hWOCt","virtualTable":"data-table-module_virtualTable__GB8Q0","virtualHeaderGroup":"data-table-module_virtualHeaderGroup__dhJXA","virtualHeaderRow":"data-table-module_virtualHeaderRow__LqMog","virtualBodyGroup":"data-table-module_virtualBodyGroup__xlRy5","virtualRow":"data-table-module_virtualRow__dIERR","virtualHead":"data-table-module_virtualHead__Xt-ov","virtualCell":"data-table-module_virtualCell__8i2Lt","virtualSectionHeader":"data-table-module_virtualSectionHeader__rsMjl","stickyGroupAnchor":"data-table-module_stickyGroupAnchor__T-OZ3","stickyLoaderContainer":"data-table-module_stickyLoaderContainer__ueYwH","loaderRow":"data-table-module_loaderRow__yivkT","stickySectionHeader":"data-table-module_stickySectionHeader__CdMzK","display___popover___content":"data-table-module_display-popover-content__fyCAs","display___popover___properties___container":"data-table-module_display-popover-properties-container__5d1QY","display___popover___properties___select":"data-table-module_display-popover-properties-select__XCZFA","display___popover___reset___container":"data-table-module_display-popover-reset-container__EO-tX","display___popover___sort___icon":"data-table-module_display-popover-sort-icon__qS4Tv","flex___1":"data-table-module_flex-1__bRXzB"};
2
2
 
3
3
  export { styles as default };
4
4
  //# sourceMappingURL=data-table.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.types.cjs","sources":["../../../components/data-table/data-table.types.tsx"],"sourcesContent":["import type {\n Column,\n ColumnDef,\n Table,\n VisibilityState\n} from '@tanstack/table-core';\nimport type {\n DataTableFilterOperatorTypes,\n FilterOperatorTypes,\n FilterSelectOption,\n FilterTypes,\n FilterValueType\n} from '~/types/filters';\nimport type { BaseSelectProps } from '../select/select-root';\n\nexport type DataTableMode = 'client' | 'server';\n\nexport const SortOrders = {\n ASC: 'asc',\n DESC: 'desc'\n} as const;\n\nexport interface DataTableFilterValues {\n value: any;\n // Only one of these value fields should be present at a time\n boolValue?: boolean;\n stringValue?: string;\n numberValue?: number;\n}\n// Internal filter with UI operators and metadata\nexport interface InternalFilter extends DataTableFilterValues {\n _type?: FilterTypes;\n _dataType?: FilterValueType;\n name: string;\n operator: FilterOperatorTypes;\n}\n\n// Data table filter for backend API (no internal fields)\nexport interface DataTableFilter extends DataTableFilterValues {\n name: string;\n operator: DataTableFilterOperatorTypes;\n}\n\ntype SortOrdersKeys = keyof typeof SortOrders;\nexport type SortOrdersValues = (typeof SortOrders)[SortOrdersKeys];\n\nexport interface DataTableSort {\n name: string;\n order: SortOrdersValues;\n}\n\n// Internal query with UI operators and metadata\nexport interface InternalQuery {\n filters?: InternalFilter[];\n sort?: DataTableSort[];\n group_by?: string[];\n offset?: number;\n limit?: number;\n search?: string;\n}\n\n// Data table query for backend API (clean, no internal fields)\nexport interface DataTableQuery extends Omit<InternalQuery, 'filters'> {\n filters?: DataTableFilter[];\n}\n\nexport type DataTableColumn<TData, TValue> = Omit<\n Column<TData, TValue>,\n 'columnDef'\n> & {\n columnDef: DataTableColumnDef<TData, TValue>;\n};\n\nexport type DataTableColumnDef<TData, TValue> = ColumnDef<TData, TValue> & {\n accessorKey: string;\n header: string;\n filterType?: FilterTypes;\n dataType?: FilterValueType;\n enableColumnFilter?: boolean;\n enableSorting?: boolean;\n enableHiding?: boolean;\n defaultHidden?: boolean;\n filterOptions?: FilterSelectOption[];\n filterProps?: {\n select?: BaseSelectProps;\n };\n classNames?: {\n cell?: string;\n header?: string;\n };\n styles?: {\n cell?: React.CSSProperties;\n header?: React.CSSProperties;\n };\n enableGrouping?: boolean;\n showGroupCount?: boolean;\n groupCountMap?: Record<string, number>;\n groupLabelsMap?: Record<string, string>;\n // TODO: implement these\n icon?: React.ReactNode;\n};\n\nexport interface DataTableProps<TData, TValue> {\n columns: DataTableColumnDef<TData, TValue>[];\n data: TData[];\n query?: DataTableQuery; // Initial query (will be transformed to internal format)\n mode?: DataTableMode;\n isLoading?: boolean;\n loadingRowCount?: number;\n onTableQueryChange?: (query: DataTableQuery) => void;\n defaultSort: DataTableSort;\n onLoadMore?: () => Promise<void>;\n onRowClick?: (row: TData) => void;\n onColumnVisibilityChange?: (columnVisibility: VisibilityState) => void;\n}\n\nexport type DataTableContentClassNames = {\n root?: string;\n table?: string;\n header?: string;\n body?: string;\n row?: string;\n};\n\nexport type DataTableContentBaseProps = {\n emptyState?: React.ReactNode;\n zeroState?: React.ReactNode;\n classNames?: DataTableContentClassNames;\n};\n\nexport type DataTableContentProps = DataTableContentBaseProps;\n\nexport type VirtualizedContentProps = DataTableContentBaseProps & {\n /** Height of each row in pixels. */\n rowHeight?: number;\n /** Height of group header rows in pixels. Falls back to rowHeight if not set. */\n groupHeaderHeight?: number;\n /** Number of rows to render outside visible area. */\n overscan?: number;\n /** Distance in pixels from bottom to trigger load more. */\n loadMoreOffset?: number;\n};\n\nexport type TableQueryUpdateFn = (query: InternalQuery) => InternalQuery;\n\nexport type TableContextType<TData, TValue> = {\n table: Table<TData>;\n columns: DataTableColumnDef<TData, TValue>[];\n isLoading?: boolean;\n loadMoreData: () => void;\n mode: DataTableMode;\n defaultSort: DataTableSort;\n tableQuery?: InternalQuery;\n loadingRowCount?: number;\n onDisplaySettingsReset: () => void;\n updateTableQuery: (fn: TableQueryUpdateFn) => void;\n onRowClick?: (row: TData) => void;\n shouldShowFilters?: boolean;\n};\n\nexport interface ColumnData {\n label: string;\n id: string;\n isVisible?: boolean;\n}\n\ninterface SubRows<_T> {}\n\nexport interface GroupedData<T> extends SubRows<T> {\n label: string;\n group_key: string;\n subRows: T[];\n count?: number;\n showGroupCount?: boolean;\n}\n\nexport const defaultGroupOption = {\n id: '--',\n label: 'No grouping'\n};\n"],"names":[],"mappings":";;AAiBa,MAAA,UAAU,GAAG;AACxB,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,IAAI,EAAE,MAAM;EACH;AA4JE,MAAA,kBAAkB,GAAG;AAChC,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,KAAK,EAAE,aAAa;;;;;;"}
1
+ {"version":3,"file":"data-table.types.cjs","sources":["../../../components/data-table/data-table.types.tsx"],"sourcesContent":["import type {\n Column,\n ColumnDef,\n Table,\n VisibilityState\n} from '@tanstack/table-core';\nimport type {\n DataTableFilterOperatorTypes,\n FilterOperatorTypes,\n FilterSelectOption,\n FilterTypes,\n FilterValueType\n} from '~/types/filters';\nimport type { BaseSelectProps } from '../select/select-root';\n\nexport type DataTableMode = 'client' | 'server';\n\nexport const SortOrders = {\n ASC: 'asc',\n DESC: 'desc'\n} as const;\n\nexport interface DataTableFilterValues {\n value: any;\n // Only one of these value fields should be present at a time\n boolValue?: boolean;\n stringValue?: string;\n numberValue?: number;\n}\n// Internal filter with UI operators and metadata\nexport interface InternalFilter extends DataTableFilterValues {\n _type?: FilterTypes;\n _dataType?: FilterValueType;\n name: string;\n operator: FilterOperatorTypes;\n}\n\n// Data table filter for backend API (no internal fields)\nexport interface DataTableFilter extends DataTableFilterValues {\n name: string;\n operator: DataTableFilterOperatorTypes;\n}\n\ntype SortOrdersKeys = keyof typeof SortOrders;\nexport type SortOrdersValues = (typeof SortOrders)[SortOrdersKeys];\n\nexport interface DataTableSort {\n name: string;\n order: SortOrdersValues;\n}\n\n// Internal query with UI operators and metadata\nexport interface InternalQuery {\n filters?: InternalFilter[];\n sort?: DataTableSort[];\n group_by?: string[];\n offset?: number;\n limit?: number;\n search?: string;\n}\n\n// Data table query for backend API (clean, no internal fields)\nexport interface DataTableQuery extends Omit<InternalQuery, 'filters'> {\n filters?: DataTableFilter[];\n}\n\nexport type DataTableColumn<TData, TValue> = Omit<\n Column<TData, TValue>,\n 'columnDef'\n> & {\n columnDef: DataTableColumnDef<TData, TValue>;\n};\n\nexport type DataTableColumnDef<TData, TValue> = ColumnDef<TData, TValue> & {\n accessorKey: string;\n header: string;\n filterType?: FilterTypes;\n dataType?: FilterValueType;\n enableColumnFilter?: boolean;\n enableSorting?: boolean;\n enableHiding?: boolean;\n defaultHidden?: boolean;\n filterOptions?: FilterSelectOption[];\n filterProps?: {\n select?: BaseSelectProps;\n };\n classNames?: {\n cell?: string;\n header?: string;\n };\n styles?: {\n cell?: React.CSSProperties;\n header?: React.CSSProperties;\n };\n enableGrouping?: boolean;\n showGroupCount?: boolean;\n groupCountMap?: Record<string, number>;\n groupLabelsMap?: Record<string, string>;\n // TODO: implement these\n icon?: React.ReactNode;\n};\n\nexport interface DataTableProps<TData, TValue> {\n columns: DataTableColumnDef<TData, TValue>[];\n data: TData[];\n query?: DataTableQuery; // Initial query (will be transformed to internal format)\n mode?: DataTableMode;\n isLoading?: boolean;\n loadingRowCount?: number;\n onTableQueryChange?: (query: DataTableQuery) => void;\n defaultSort: DataTableSort;\n onLoadMore?: () => Promise<void>;\n onRowClick?: (row: TData) => void;\n onColumnVisibilityChange?: (columnVisibility: VisibilityState) => void;\n /** When true, group headers stick under the table header while scrolling. Default is false. */\n stickyGroupHeader?: boolean;\n /** Return a stable unique id for each row (used as React key). Use for sortable/filterable tables. */\n getRowId?: (row: TData, index: number) => string;\n}\n\nexport type DataTableContentClassNames = {\n root?: string;\n table?: string;\n header?: string;\n body?: string;\n row?: string;\n};\n\nexport type DataTableContentBaseProps = {\n emptyState?: React.ReactNode;\n zeroState?: React.ReactNode;\n classNames?: DataTableContentClassNames;\n};\n\nexport type DataTableContentProps = DataTableContentBaseProps;\n\nexport type VirtualizedContentProps = DataTableContentBaseProps & {\n /** Height of each row in pixels. */\n rowHeight?: number;\n /** Height of group header rows in pixels. Falls back to rowHeight if not set. */\n groupHeaderHeight?: number;\n /** Number of rows to render outside visible area. */\n overscan?: number;\n /** Distance in pixels from bottom to trigger load more. */\n loadMoreOffset?: number;\n};\n\nexport type TableQueryUpdateFn = (query: InternalQuery) => InternalQuery;\n\nexport type TableContextType<TData, TValue> = {\n table: Table<TData>;\n columns: DataTableColumnDef<TData, TValue>[];\n isLoading?: boolean;\n loadMoreData: () => void;\n mode: DataTableMode;\n defaultSort: DataTableSort;\n tableQuery?: InternalQuery;\n loadingRowCount?: number;\n onDisplaySettingsReset: () => void;\n updateTableQuery: (fn: TableQueryUpdateFn) => void;\n onRowClick?: (row: TData) => void;\n shouldShowFilters?: boolean;\n stickyGroupHeader?: boolean;\n};\n\nexport interface ColumnData {\n label: string;\n id: string;\n isVisible?: boolean;\n}\n\ninterface SubRows<_T> {}\n\nexport interface GroupedData<T> extends SubRows<T> {\n label: string;\n group_key: string;\n subRows: T[];\n count?: number;\n showGroupCount?: boolean;\n}\n\nexport const defaultGroupOption = {\n id: '--',\n label: 'No grouping'\n};\n"],"names":[],"mappings":";;AAiBa,MAAA,UAAU,GAAG;AACxB,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,IAAI,EAAE,MAAM;EACH;AAiKE,MAAA,kBAAkB,GAAG;AAChC,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,KAAK,EAAE,aAAa;;;;;;"}
@@ -81,6 +81,10 @@ export interface DataTableProps<TData, TValue> {
81
81
  onLoadMore?: () => Promise<void>;
82
82
  onRowClick?: (row: TData) => void;
83
83
  onColumnVisibilityChange?: (columnVisibility: VisibilityState) => void;
84
+ /** When true, group headers stick under the table header while scrolling. Default is false. */
85
+ stickyGroupHeader?: boolean;
86
+ /** Return a stable unique id for each row (used as React key). Use for sortable/filterable tables. */
87
+ getRowId?: (row: TData, index: number) => string;
84
88
  }
85
89
  export type DataTableContentClassNames = {
86
90
  root?: string;
@@ -119,6 +123,7 @@ export type TableContextType<TData, TValue> = {
119
123
  updateTableQuery: (fn: TableQueryUpdateFn) => void;
120
124
  onRowClick?: (row: TData) => void;
121
125
  shouldShowFilters?: boolean;
126
+ stickyGroupHeader?: boolean;
122
127
  };
123
128
  export interface ColumnData {
124
129
  label: string;
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.types.d.ts","sourceRoot":"","sources":["../../../components/data-table/data-table.types.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-table.types.d.ts","sourceRoot":"","sources":["../../../components/data-table/data-table.types.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.types.js","sources":["../../../components/data-table/data-table.types.tsx"],"sourcesContent":["import type {\n Column,\n ColumnDef,\n Table,\n VisibilityState\n} from '@tanstack/table-core';\nimport type {\n DataTableFilterOperatorTypes,\n FilterOperatorTypes,\n FilterSelectOption,\n FilterTypes,\n FilterValueType\n} from '~/types/filters';\nimport type { BaseSelectProps } from '../select/select-root';\n\nexport type DataTableMode = 'client' | 'server';\n\nexport const SortOrders = {\n ASC: 'asc',\n DESC: 'desc'\n} as const;\n\nexport interface DataTableFilterValues {\n value: any;\n // Only one of these value fields should be present at a time\n boolValue?: boolean;\n stringValue?: string;\n numberValue?: number;\n}\n// Internal filter with UI operators and metadata\nexport interface InternalFilter extends DataTableFilterValues {\n _type?: FilterTypes;\n _dataType?: FilterValueType;\n name: string;\n operator: FilterOperatorTypes;\n}\n\n// Data table filter for backend API (no internal fields)\nexport interface DataTableFilter extends DataTableFilterValues {\n name: string;\n operator: DataTableFilterOperatorTypes;\n}\n\ntype SortOrdersKeys = keyof typeof SortOrders;\nexport type SortOrdersValues = (typeof SortOrders)[SortOrdersKeys];\n\nexport interface DataTableSort {\n name: string;\n order: SortOrdersValues;\n}\n\n// Internal query with UI operators and metadata\nexport interface InternalQuery {\n filters?: InternalFilter[];\n sort?: DataTableSort[];\n group_by?: string[];\n offset?: number;\n limit?: number;\n search?: string;\n}\n\n// Data table query for backend API (clean, no internal fields)\nexport interface DataTableQuery extends Omit<InternalQuery, 'filters'> {\n filters?: DataTableFilter[];\n}\n\nexport type DataTableColumn<TData, TValue> = Omit<\n Column<TData, TValue>,\n 'columnDef'\n> & {\n columnDef: DataTableColumnDef<TData, TValue>;\n};\n\nexport type DataTableColumnDef<TData, TValue> = ColumnDef<TData, TValue> & {\n accessorKey: string;\n header: string;\n filterType?: FilterTypes;\n dataType?: FilterValueType;\n enableColumnFilter?: boolean;\n enableSorting?: boolean;\n enableHiding?: boolean;\n defaultHidden?: boolean;\n filterOptions?: FilterSelectOption[];\n filterProps?: {\n select?: BaseSelectProps;\n };\n classNames?: {\n cell?: string;\n header?: string;\n };\n styles?: {\n cell?: React.CSSProperties;\n header?: React.CSSProperties;\n };\n enableGrouping?: boolean;\n showGroupCount?: boolean;\n groupCountMap?: Record<string, number>;\n groupLabelsMap?: Record<string, string>;\n // TODO: implement these\n icon?: React.ReactNode;\n};\n\nexport interface DataTableProps<TData, TValue> {\n columns: DataTableColumnDef<TData, TValue>[];\n data: TData[];\n query?: DataTableQuery; // Initial query (will be transformed to internal format)\n mode?: DataTableMode;\n isLoading?: boolean;\n loadingRowCount?: number;\n onTableQueryChange?: (query: DataTableQuery) => void;\n defaultSort: DataTableSort;\n onLoadMore?: () => Promise<void>;\n onRowClick?: (row: TData) => void;\n onColumnVisibilityChange?: (columnVisibility: VisibilityState) => void;\n}\n\nexport type DataTableContentClassNames = {\n root?: string;\n table?: string;\n header?: string;\n body?: string;\n row?: string;\n};\n\nexport type DataTableContentBaseProps = {\n emptyState?: React.ReactNode;\n zeroState?: React.ReactNode;\n classNames?: DataTableContentClassNames;\n};\n\nexport type DataTableContentProps = DataTableContentBaseProps;\n\nexport type VirtualizedContentProps = DataTableContentBaseProps & {\n /** Height of each row in pixels. */\n rowHeight?: number;\n /** Height of group header rows in pixels. Falls back to rowHeight if not set. */\n groupHeaderHeight?: number;\n /** Number of rows to render outside visible area. */\n overscan?: number;\n /** Distance in pixels from bottom to trigger load more. */\n loadMoreOffset?: number;\n};\n\nexport type TableQueryUpdateFn = (query: InternalQuery) => InternalQuery;\n\nexport type TableContextType<TData, TValue> = {\n table: Table<TData>;\n columns: DataTableColumnDef<TData, TValue>[];\n isLoading?: boolean;\n loadMoreData: () => void;\n mode: DataTableMode;\n defaultSort: DataTableSort;\n tableQuery?: InternalQuery;\n loadingRowCount?: number;\n onDisplaySettingsReset: () => void;\n updateTableQuery: (fn: TableQueryUpdateFn) => void;\n onRowClick?: (row: TData) => void;\n shouldShowFilters?: boolean;\n};\n\nexport interface ColumnData {\n label: string;\n id: string;\n isVisible?: boolean;\n}\n\ninterface SubRows<_T> {}\n\nexport interface GroupedData<T> extends SubRows<T> {\n label: string;\n group_key: string;\n subRows: T[];\n count?: number;\n showGroupCount?: boolean;\n}\n\nexport const defaultGroupOption = {\n id: '--',\n label: 'No grouping'\n};\n"],"names":[],"mappings":"AAiBa,MAAA,UAAU,GAAG;AACxB,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,IAAI,EAAE,MAAM;EACH;AA4JE,MAAA,kBAAkB,GAAG;AAChC,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,KAAK,EAAE,aAAa;;;;;"}
1
+ {"version":3,"file":"data-table.types.js","sources":["../../../components/data-table/data-table.types.tsx"],"sourcesContent":["import type {\n Column,\n ColumnDef,\n Table,\n VisibilityState\n} from '@tanstack/table-core';\nimport type {\n DataTableFilterOperatorTypes,\n FilterOperatorTypes,\n FilterSelectOption,\n FilterTypes,\n FilterValueType\n} from '~/types/filters';\nimport type { BaseSelectProps } from '../select/select-root';\n\nexport type DataTableMode = 'client' | 'server';\n\nexport const SortOrders = {\n ASC: 'asc',\n DESC: 'desc'\n} as const;\n\nexport interface DataTableFilterValues {\n value: any;\n // Only one of these value fields should be present at a time\n boolValue?: boolean;\n stringValue?: string;\n numberValue?: number;\n}\n// Internal filter with UI operators and metadata\nexport interface InternalFilter extends DataTableFilterValues {\n _type?: FilterTypes;\n _dataType?: FilterValueType;\n name: string;\n operator: FilterOperatorTypes;\n}\n\n// Data table filter for backend API (no internal fields)\nexport interface DataTableFilter extends DataTableFilterValues {\n name: string;\n operator: DataTableFilterOperatorTypes;\n}\n\ntype SortOrdersKeys = keyof typeof SortOrders;\nexport type SortOrdersValues = (typeof SortOrders)[SortOrdersKeys];\n\nexport interface DataTableSort {\n name: string;\n order: SortOrdersValues;\n}\n\n// Internal query with UI operators and metadata\nexport interface InternalQuery {\n filters?: InternalFilter[];\n sort?: DataTableSort[];\n group_by?: string[];\n offset?: number;\n limit?: number;\n search?: string;\n}\n\n// Data table query for backend API (clean, no internal fields)\nexport interface DataTableQuery extends Omit<InternalQuery, 'filters'> {\n filters?: DataTableFilter[];\n}\n\nexport type DataTableColumn<TData, TValue> = Omit<\n Column<TData, TValue>,\n 'columnDef'\n> & {\n columnDef: DataTableColumnDef<TData, TValue>;\n};\n\nexport type DataTableColumnDef<TData, TValue> = ColumnDef<TData, TValue> & {\n accessorKey: string;\n header: string;\n filterType?: FilterTypes;\n dataType?: FilterValueType;\n enableColumnFilter?: boolean;\n enableSorting?: boolean;\n enableHiding?: boolean;\n defaultHidden?: boolean;\n filterOptions?: FilterSelectOption[];\n filterProps?: {\n select?: BaseSelectProps;\n };\n classNames?: {\n cell?: string;\n header?: string;\n };\n styles?: {\n cell?: React.CSSProperties;\n header?: React.CSSProperties;\n };\n enableGrouping?: boolean;\n showGroupCount?: boolean;\n groupCountMap?: Record<string, number>;\n groupLabelsMap?: Record<string, string>;\n // TODO: implement these\n icon?: React.ReactNode;\n};\n\nexport interface DataTableProps<TData, TValue> {\n columns: DataTableColumnDef<TData, TValue>[];\n data: TData[];\n query?: DataTableQuery; // Initial query (will be transformed to internal format)\n mode?: DataTableMode;\n isLoading?: boolean;\n loadingRowCount?: number;\n onTableQueryChange?: (query: DataTableQuery) => void;\n defaultSort: DataTableSort;\n onLoadMore?: () => Promise<void>;\n onRowClick?: (row: TData) => void;\n onColumnVisibilityChange?: (columnVisibility: VisibilityState) => void;\n /** When true, group headers stick under the table header while scrolling. Default is false. */\n stickyGroupHeader?: boolean;\n /** Return a stable unique id for each row (used as React key). Use for sortable/filterable tables. */\n getRowId?: (row: TData, index: number) => string;\n}\n\nexport type DataTableContentClassNames = {\n root?: string;\n table?: string;\n header?: string;\n body?: string;\n row?: string;\n};\n\nexport type DataTableContentBaseProps = {\n emptyState?: React.ReactNode;\n zeroState?: React.ReactNode;\n classNames?: DataTableContentClassNames;\n};\n\nexport type DataTableContentProps = DataTableContentBaseProps;\n\nexport type VirtualizedContentProps = DataTableContentBaseProps & {\n /** Height of each row in pixels. */\n rowHeight?: number;\n /** Height of group header rows in pixels. Falls back to rowHeight if not set. */\n groupHeaderHeight?: number;\n /** Number of rows to render outside visible area. */\n overscan?: number;\n /** Distance in pixels from bottom to trigger load more. */\n loadMoreOffset?: number;\n};\n\nexport type TableQueryUpdateFn = (query: InternalQuery) => InternalQuery;\n\nexport type TableContextType<TData, TValue> = {\n table: Table<TData>;\n columns: DataTableColumnDef<TData, TValue>[];\n isLoading?: boolean;\n loadMoreData: () => void;\n mode: DataTableMode;\n defaultSort: DataTableSort;\n tableQuery?: InternalQuery;\n loadingRowCount?: number;\n onDisplaySettingsReset: () => void;\n updateTableQuery: (fn: TableQueryUpdateFn) => void;\n onRowClick?: (row: TData) => void;\n shouldShowFilters?: boolean;\n stickyGroupHeader?: boolean;\n};\n\nexport interface ColumnData {\n label: string;\n id: string;\n isVisible?: boolean;\n}\n\ninterface SubRows<_T> {}\n\nexport interface GroupedData<T> extends SubRows<T> {\n label: string;\n group_key: string;\n subRows: T[];\n count?: number;\n showGroupCount?: boolean;\n}\n\nexport const defaultGroupOption = {\n id: '--',\n label: 'No grouping'\n};\n"],"names":[],"mappings":"AAiBa,MAAA,UAAU,GAAG;AACxB,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,IAAI,EAAE,MAAM;EACH;AAiKE,MAAA,kBAAkB,GAAG;AAChC,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,KAAK,EAAE,aAAa;;;;;"}
@@ -38,18 +38,18 @@ const filterOperationsMap = {
38
38
  String(filterValue.value).toLowerCase());
39
39
  },
40
40
  contains: (row, columnId, filterValue, _addMeta) => {
41
- const columnValue = row.getValue(columnId).toLowerCase();
42
- const filterStr = filterValue.value.toLowerCase();
41
+ const columnValue = String(row.getValue(columnId)).toLowerCase();
42
+ const filterStr = String(filterValue.value).toLowerCase();
43
43
  return columnValue.includes(filterStr);
44
44
  },
45
45
  starts_with: (row, columnId, filterValue, _addMeta) => {
46
- const columnValue = row.getValue(columnId).toLowerCase();
47
- const filterStr = filterValue.value.toLowerCase();
46
+ const columnValue = String(row.getValue(columnId)).toLowerCase();
47
+ const filterStr = String(filterValue.value).toLowerCase();
48
48
  return columnValue.startsWith(filterStr);
49
49
  },
50
50
  ends_with: (row, columnId, filterValue, _addMeta) => {
51
- const columnValue = row.getValue(columnId).toLowerCase();
52
- const filterStr = filterValue.value.toLowerCase();
51
+ const columnValue = String(row.getValue(columnId)).toLowerCase();
52
+ const filterStr = String(filterValue.value).toLowerCase();
53
53
  return columnValue.endsWith(filterStr);
54
54
  }
55
55
  },
@@ -1 +1 @@
1
- {"version":3,"file":"filter-operations.cjs","sources":["../../../../components/data-table/utils/filter-operations.tsx"],"sourcesContent":["import type { FilterFn } from '@tanstack/table-core';\nimport dayjs from 'dayjs';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\n\nimport {\n DataTableFilterOperatorTypes,\n DateFilterOperatorType,\n EmptyFilterValue,\n FilterOperatorTypes,\n FilterType,\n FilterTypes,\n FilterValue,\n FilterValueType,\n MultiSelectFilterOperatorType,\n NumberFilterOperatorType,\n SelectFilterOperatorType,\n StringFilterOperatorType\n} from '~/types/filters';\nimport { DataTableFilterValues } from '../data-table.types';\n\ndayjs.extend(isSameOrAfter);\ndayjs.extend(isSameOrBefore);\n\nexport type FilterFunctionsMap = {\n number: Record<NumberFilterOperatorType, FilterFn<unknown>>;\n string: Record<StringFilterOperatorType, FilterFn<unknown>>;\n date: Record<DateFilterOperatorType, FilterFn<unknown>>;\n select: Record<SelectFilterOperatorType, FilterFn<unknown>>;\n multiselect: Record<MultiSelectFilterOperatorType, FilterFn<unknown>>;\n};\n\nexport const filterOperationsMap: FilterFunctionsMap = {\n number: {\n eq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) === Number(filterValue.value);\n },\n neq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) !== Number(filterValue.value);\n },\n lt: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) < Number(filterValue.value);\n },\n lte: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) <= Number(filterValue.value);\n },\n gt: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) > Number(filterValue.value);\n },\n gte: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) >= Number(filterValue.value);\n }\n },\n string: {\n eq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return (\n String(row.getValue(columnId)).toLowerCase() ===\n String(filterValue.value).toLowerCase()\n );\n },\n neq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return (\n String(row.getValue(columnId)).toLowerCase() !==\n String(filterValue.value).toLowerCase()\n );\n },\n contains: (row, columnId, filterValue: FilterValue, _addMeta) => {\n const columnValue = (row.getValue(columnId) as string).toLowerCase();\n const filterStr = (filterValue.value as string).toLowerCase();\n return columnValue.includes(filterStr);\n },\n starts_with: (row, columnId, filterValue: FilterValue, _addMeta) => {\n const columnValue = (row.getValue(columnId) as string).toLowerCase();\n const filterStr = (filterValue.value as string).toLowerCase();\n return columnValue.startsWith(filterStr);\n },\n ends_with: (row, columnId, filterValue: FilterValue, _addMeta) => {\n const columnValue = (row.getValue(columnId) as string).toLowerCase();\n const filterStr = (filterValue.value as string).toLowerCase();\n return columnValue.endsWith(filterStr);\n }\n },\n date: {\n eq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return dayjs(row.getValue(columnId)).isSame(\n dayjs(filterValue.date),\n 'day'\n );\n },\n neq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return !dayjs(row.getValue(columnId)).isSame(\n dayjs(filterValue.date),\n 'day'\n );\n },\n lt: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return dayjs(row.getValue(columnId)).isBefore(\n dayjs(filterValue.date),\n 'day'\n );\n },\n lte: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return dayjs(row.getValue(columnId)).isSameOrBefore(\n dayjs(filterValue.date),\n 'day'\n );\n },\n gt: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return dayjs(row.getValue(columnId)).isAfter(\n dayjs(filterValue.date),\n 'day'\n );\n },\n gte: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return dayjs(row.getValue(columnId)).isSameOrAfter(\n dayjs(filterValue.date),\n 'day'\n );\n }\n },\n select: {\n eq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n if (String(filterValue.value) === EmptyFilterValue) {\n return row.getValue(columnId) === '';\n }\n // Select only supports string values\n return String(row.getValue(columnId)) === String(filterValue.value);\n },\n neq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n if (String(filterValue.value) === EmptyFilterValue) {\n return row.getValue(columnId) !== '';\n }\n // Select only supports string values\n return String(row.getValue(columnId)) !== String(filterValue.value);\n }\n },\n multiselect: {\n in: (row, columnId, filterValue: FilterValue, _addMeta) => {\n if (!Array.isArray(filterValue.value)) return false;\n\n return filterValue.value\n .map(value => (value === EmptyFilterValue ? '' : String(value)))\n .includes(String(row.getValue(columnId)));\n },\n notin: (row, columnId, filterValue: FilterValue, _addMeta) => {\n if (!Array.isArray(filterValue.value)) return false;\n\n return !filterValue.value\n .map(value => (value === EmptyFilterValue ? '' : String(value)))\n .includes(String(row.getValue(columnId)));\n }\n }\n} as const;\n\nexport function getFilterFn<T extends keyof FilterFunctionsMap>(\n type: T,\n operator: FilterOperatorTypes\n) {\n // @ts-expect-error FilterOperatorTypes is union of all possible operators\n return filterOperationsMap[type][operator];\n}\n\nconst handleStringBasedTypes = (\n filterType: FilterTypes,\n value: any,\n operator?: FilterOperatorTypes | DataTableFilterOperatorTypes\n): DataTableFilterValues => {\n switch (filterType) {\n case FilterType.date: {\n const dateValue = dayjs(value);\n return {\n value,\n stringValue: dateValue.isValid() ? dateValue.toISOString() : ''\n };\n }\n case FilterType.select:\n return {\n stringValue: value === EmptyFilterValue ? '' : value,\n value\n };\n case FilterType.multiselect:\n return {\n value,\n stringValue: value\n .map((value: any) =>\n value === EmptyFilterValue ? '' : String(value)\n )\n .join()\n };\n case FilterType.string: {\n // Apply wildcards for ilike operations\n let processedValue = value;\n // Check if we need to apply wildcards (operator could be UI type or already converted to 'ilike')\n if (operator === 'contains') {\n processedValue = `%${value}%`;\n } else if (operator === 'starts_with') {\n processedValue = `${value}%`;\n } else if (operator === 'ends_with') {\n processedValue = `%${value}`;\n } else if (operator === 'ilike') {\n // If already converted to ilike, assume it needs contains-style wildcards\n // unless the value already has wildcards\n if (!value.includes('%')) {\n processedValue = `%${value}%`;\n }\n }\n return {\n stringValue: processedValue,\n value\n };\n }\n default:\n return {\n stringValue: value,\n value\n };\n }\n};\n\nexport const getFilterOperator = ({\n value,\n filterType,\n operator\n}: {\n value: any;\n filterType?: FilterTypes;\n operator: FilterOperatorTypes;\n}): DataTableFilterOperatorTypes => {\n if (value === EmptyFilterValue && filterType === FilterType.select) {\n return 'empty';\n }\n\n // Map string filter operators to ilike for DataTableFilter\n if (\n filterType === FilterType.string &&\n (operator === 'contains' ||\n operator === 'starts_with' ||\n operator === 'ends_with')\n ) {\n return 'ilike';\n }\n\n return operator as DataTableFilterOperatorTypes;\n};\n\nexport const getFilterValue = ({\n value,\n dataType = 'string',\n filterType = FilterType.string,\n operator\n}: {\n value: any;\n dataType?: FilterValueType;\n filterType?: FilterTypes;\n operator?: FilterOperatorTypes | DataTableFilterOperatorTypes;\n}): DataTableFilterValues => {\n if (dataType === 'boolean') {\n return { boolValue: value, value };\n }\n if (dataType === 'number') {\n return { numberValue: value, value };\n }\n\n // Handle string-based types\n return handleStringBasedTypes(filterType, value, operator);\n};\n\nexport const getDataType = ({\n filterType = FilterType.string,\n dataType = 'string'\n}: {\n dataType?: FilterValueType;\n filterType?: FilterTypes;\n}): FilterValueType => {\n switch (filterType) {\n case FilterType.multiselect:\n case FilterType.select:\n return dataType;\n case FilterType.date:\n return 'string';\n default:\n return filterType;\n }\n};\n"],"names":["EmptyFilterValue","FilterType"],"mappings":"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"}
1
+ {"version":3,"file":"filter-operations.cjs","sources":["../../../../components/data-table/utils/filter-operations.tsx"],"sourcesContent":["import type { FilterFn } from '@tanstack/table-core';\nimport dayjs from 'dayjs';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\n\nimport {\n DataTableFilterOperatorTypes,\n DateFilterOperatorType,\n EmptyFilterValue,\n FilterOperatorTypes,\n FilterType,\n FilterTypes,\n FilterValue,\n FilterValueType,\n MultiSelectFilterOperatorType,\n NumberFilterOperatorType,\n SelectFilterOperatorType,\n StringFilterOperatorType\n} from '~/types/filters';\nimport { DataTableFilterValues } from '../data-table.types';\n\ndayjs.extend(isSameOrAfter);\ndayjs.extend(isSameOrBefore);\n\nexport type FilterFunctionsMap = {\n number: Record<NumberFilterOperatorType, FilterFn<unknown>>;\n string: Record<StringFilterOperatorType, FilterFn<unknown>>;\n date: Record<DateFilterOperatorType, FilterFn<unknown>>;\n select: Record<SelectFilterOperatorType, FilterFn<unknown>>;\n multiselect: Record<MultiSelectFilterOperatorType, FilterFn<unknown>>;\n};\n\nexport const filterOperationsMap: FilterFunctionsMap = {\n number: {\n eq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) === Number(filterValue.value);\n },\n neq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) !== Number(filterValue.value);\n },\n lt: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) < Number(filterValue.value);\n },\n lte: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) <= Number(filterValue.value);\n },\n gt: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) > Number(filterValue.value);\n },\n gte: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return Number(row.getValue(columnId)) >= Number(filterValue.value);\n }\n },\n string: {\n eq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return (\n String(row.getValue(columnId)).toLowerCase() ===\n String(filterValue.value).toLowerCase()\n );\n },\n neq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return (\n String(row.getValue(columnId)).toLowerCase() !==\n String(filterValue.value).toLowerCase()\n );\n },\n contains: (row, columnId, filterValue: FilterValue, _addMeta) => {\n const columnValue = String(row.getValue(columnId)).toLowerCase();\n const filterStr = String(filterValue.value).toLowerCase();\n return columnValue.includes(filterStr);\n },\n starts_with: (row, columnId, filterValue: FilterValue, _addMeta) => {\n const columnValue = String(row.getValue(columnId)).toLowerCase();\n const filterStr = String(filterValue.value).toLowerCase();\n return columnValue.startsWith(filterStr);\n },\n ends_with: (row, columnId, filterValue: FilterValue, _addMeta) => {\n const columnValue = String(row.getValue(columnId)).toLowerCase();\n const filterStr = String(filterValue.value).toLowerCase();\n return columnValue.endsWith(filterStr);\n }\n },\n date: {\n eq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return dayjs(row.getValue(columnId)).isSame(\n dayjs(filterValue.date),\n 'day'\n );\n },\n neq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return !dayjs(row.getValue(columnId)).isSame(\n dayjs(filterValue.date),\n 'day'\n );\n },\n lt: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return dayjs(row.getValue(columnId)).isBefore(\n dayjs(filterValue.date),\n 'day'\n );\n },\n lte: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return dayjs(row.getValue(columnId)).isSameOrBefore(\n dayjs(filterValue.date),\n 'day'\n );\n },\n gt: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return dayjs(row.getValue(columnId)).isAfter(\n dayjs(filterValue.date),\n 'day'\n );\n },\n gte: (row, columnId, filterValue: FilterValue, _addMeta) => {\n return dayjs(row.getValue(columnId)).isSameOrAfter(\n dayjs(filterValue.date),\n 'day'\n );\n }\n },\n select: {\n eq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n if (String(filterValue.value) === EmptyFilterValue) {\n return row.getValue(columnId) === '';\n }\n // Select only supports string values\n return String(row.getValue(columnId)) === String(filterValue.value);\n },\n neq: (row, columnId, filterValue: FilterValue, _addMeta) => {\n if (String(filterValue.value) === EmptyFilterValue) {\n return row.getValue(columnId) !== '';\n }\n // Select only supports string values\n return String(row.getValue(columnId)) !== String(filterValue.value);\n }\n },\n multiselect: {\n in: (row, columnId, filterValue: FilterValue, _addMeta) => {\n if (!Array.isArray(filterValue.value)) return false;\n\n return filterValue.value\n .map(value => (value === EmptyFilterValue ? '' : String(value)))\n .includes(String(row.getValue(columnId)));\n },\n notin: (row, columnId, filterValue: FilterValue, _addMeta) => {\n if (!Array.isArray(filterValue.value)) return false;\n\n return !filterValue.value\n .map(value => (value === EmptyFilterValue ? '' : String(value)))\n .includes(String(row.getValue(columnId)));\n }\n }\n} as const;\n\nexport function getFilterFn<T extends keyof FilterFunctionsMap>(\n type: T,\n operator: FilterOperatorTypes\n) {\n // @ts-expect-error FilterOperatorTypes is union of all possible operators\n return filterOperationsMap[type][operator];\n}\n\nconst handleStringBasedTypes = (\n filterType: FilterTypes,\n value: any,\n operator?: FilterOperatorTypes | DataTableFilterOperatorTypes\n): DataTableFilterValues => {\n switch (filterType) {\n case FilterType.date: {\n const dateValue = dayjs(value);\n return {\n value,\n stringValue: dateValue.isValid() ? dateValue.toISOString() : ''\n };\n }\n case FilterType.select:\n return {\n stringValue: value === EmptyFilterValue ? '' : value,\n value\n };\n case FilterType.multiselect:\n return {\n value,\n stringValue: value\n .map((value: any) =>\n value === EmptyFilterValue ? '' : String(value)\n )\n .join()\n };\n case FilterType.string: {\n // Apply wildcards for ilike operations\n let processedValue = value;\n // Check if we need to apply wildcards (operator could be UI type or already converted to 'ilike')\n if (operator === 'contains') {\n processedValue = `%${value}%`;\n } else if (operator === 'starts_with') {\n processedValue = `${value}%`;\n } else if (operator === 'ends_with') {\n processedValue = `%${value}`;\n } else if (operator === 'ilike') {\n // If already converted to ilike, assume it needs contains-style wildcards\n // unless the value already has wildcards\n if (!value.includes('%')) {\n processedValue = `%${value}%`;\n }\n }\n return {\n stringValue: processedValue,\n value\n };\n }\n default:\n return {\n stringValue: value,\n value\n };\n }\n};\n\nexport const getFilterOperator = ({\n value,\n filterType,\n operator\n}: {\n value: any;\n filterType?: FilterTypes;\n operator: FilterOperatorTypes;\n}): DataTableFilterOperatorTypes => {\n if (value === EmptyFilterValue && filterType === FilterType.select) {\n return 'empty';\n }\n\n // Map string filter operators to ilike for DataTableFilter\n if (\n filterType === FilterType.string &&\n (operator === 'contains' ||\n operator === 'starts_with' ||\n operator === 'ends_with')\n ) {\n return 'ilike';\n }\n\n return operator as DataTableFilterOperatorTypes;\n};\n\nexport const getFilterValue = ({\n value,\n dataType = 'string',\n filterType = FilterType.string,\n operator\n}: {\n value: any;\n dataType?: FilterValueType;\n filterType?: FilterTypes;\n operator?: FilterOperatorTypes | DataTableFilterOperatorTypes;\n}): DataTableFilterValues => {\n if (dataType === 'boolean') {\n return { boolValue: value, value };\n }\n if (dataType === 'number') {\n return { numberValue: value, value };\n }\n\n // Handle string-based types\n return handleStringBasedTypes(filterType, value, operator);\n};\n\nexport const getDataType = ({\n filterType = FilterType.string,\n dataType = 'string'\n}: {\n dataType?: FilterValueType;\n filterType?: FilterTypes;\n}): FilterValueType => {\n switch (filterType) {\n case FilterType.multiselect:\n case FilterType.select:\n return dataType;\n case FilterType.date:\n return 'string';\n default:\n return filterType;\n }\n};\n"],"names":["EmptyFilterValue","FilterType"],"mappings":"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"}
@@ -19,7 +19,7 @@ export declare const getFilterValue: ({ value, dataType, filterType, operator }:
19
19
  value: any;
20
20
  dataType?: FilterValueType | undefined;
21
21
  filterType?: "string" | "number" | "select" | "date" | "multiselect" | undefined;
22
- operator?: "empty" | "in" | "eq" | "neq" | "ilike" | "lt" | "lte" | "gt" | "gte" | "contains" | "starts_with" | "ends_with" | "notin" | undefined;
22
+ operator?: "empty" | "eq" | "neq" | "ilike" | "lt" | "lte" | "gt" | "gte" | "contains" | "starts_with" | "ends_with" | "in" | "notin" | undefined;
23
23
  }) => DataTableFilterValues;
24
24
  export declare const getDataType: ({ filterType, dataType }: {
25
25
  dataType?: FilterValueType | undefined;