@osdk/react-components 0.1.0 → 0.2.0-beta.10

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 (609) hide show
  1. package/CHANGELOG.md +98 -19
  2. package/README.md +56 -23
  3. package/build/browser/base-components/action-button/ActionButton.js +31 -0
  4. package/build/browser/base-components/action-button/ActionButton.js.map +1 -0
  5. package/build/browser/base-components/action-button/ActionButton.module.css +70 -0
  6. package/build/browser/base-components/action-button/ActionButton.module.css.js +8 -0
  7. package/build/browser/base-components/checkbox/Checkbox.js +27 -32
  8. package/build/browser/base-components/checkbox/Checkbox.module.css +79 -0
  9. package/build/browser/base-components/checkbox/Checkbox.module.css.js +7 -0
  10. package/build/browser/base-components/combobox/Combobox.js +124 -0
  11. package/build/browser/base-components/combobox/Combobox.js.map +1 -0
  12. package/build/browser/base-components/combobox/Combobox.module.css +177 -0
  13. package/build/browser/base-components/combobox/Combobox.module.css.js +16 -0
  14. package/build/browser/base-components/dialog/Dialog.js +52 -0
  15. package/build/browser/base-components/dialog/Dialog.js.map +1 -0
  16. package/build/browser/base-components/dialog/Dialog.module.css +101 -0
  17. package/build/browser/base-components/dialog/Dialog.module.css.js +13 -0
  18. package/build/browser/base-components/draggable-list/DraggableList.js +155 -0
  19. package/build/browser/base-components/draggable-list/DraggableList.js.map +1 -0
  20. package/build/browser/base-components/draggable-list/DraggableList.module.css +108 -0
  21. package/build/browser/base-components/draggable-list/DraggableList.module.css.js +11 -0
  22. package/build/browser/base-components/search-bar/SearchBar.js +44 -0
  23. package/build/browser/base-components/search-bar/SearchBar.js.map +1 -0
  24. package/build/browser/base-components/search-bar/SearchBar.module.css +53 -0
  25. package/build/browser/base-components/search-bar/SearchBar.module.css.js +8 -0
  26. package/build/browser/base-components/select/Select.js +89 -0
  27. package/build/browser/base-components/select/Select.js.map +1 -0
  28. package/build/browser/base-components/select/Select.module.css +138 -0
  29. package/build/browser/base-components/select/Select.module.css.js +11 -0
  30. package/build/browser/base-components/switch/Switch.js +33 -0
  31. package/build/browser/base-components/switch/Switch.js.map +1 -0
  32. package/build/browser/base-components/switch/Switch.module.css +91 -0
  33. package/build/browser/base-components/switch/Switch.module.css.js +7 -0
  34. package/build/browser/filter-list/FilterListApi.js.map +1 -1
  35. package/build/browser/filter-list/FilterListItemApi.js.map +1 -1
  36. package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js +202 -0
  37. package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js.map +1 -0
  38. package/build/browser/filter-list/__tests__/dateUtils.test.js +55 -0
  39. package/build/browser/filter-list/__tests__/dateUtils.test.js.map +1 -0
  40. package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js +296 -0
  41. package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js.map +1 -0
  42. package/build/browser/filter-list/__tests__/getFilterKey.test.js +53 -0
  43. package/build/browser/filter-list/__tests__/getFilterKey.test.js.map +1 -0
  44. package/build/browser/filter-list/__tests__/testUtils.js +203 -0
  45. package/build/browser/filter-list/__tests__/testUtils.js.map +1 -0
  46. package/build/browser/filter-list/base/FilterInput.js +542 -0
  47. package/build/browser/filter-list/base/FilterInput.js.map +1 -0
  48. package/build/browser/filter-list/base/FilterList.js +77 -0
  49. package/build/browser/filter-list/base/FilterList.js.map +1 -0
  50. package/build/browser/filter-list/base/FilterList.module.css +67 -0
  51. package/build/browser/filter-list/base/FilterList.module.css.js +8 -0
  52. package/build/browser/filter-list/base/FilterListContent.js +57 -0
  53. package/build/browser/filter-list/base/FilterListContent.js.map +1 -0
  54. package/build/browser/filter-list/base/FilterListContent.module.css +27 -0
  55. package/build/browser/filter-list/base/FilterListContent.module.css.js +7 -0
  56. package/build/browser/filter-list/base/FilterListHeader.js +58 -0
  57. package/build/browser/filter-list/base/FilterListHeader.js.map +1 -0
  58. package/build/browser/filter-list/base/FilterListHeader.module.css +127 -0
  59. package/build/browser/filter-list/base/FilterListHeader.module.css.js +13 -0
  60. package/build/browser/filter-list/base/FilterListItem.js +75 -0
  61. package/build/browser/filter-list/base/FilterListItem.js.map +1 -0
  62. package/build/browser/filter-list/base/FilterListItem.module.css +38 -0
  63. package/build/browser/filter-list/base/FilterListItem.module.css.js +9 -0
  64. package/build/browser/filter-list/base/index.js +22 -0
  65. package/build/browser/filter-list/base/index.js.map +1 -0
  66. package/build/browser/filter-list/base/inputs/CheckboxListInput.js +75 -0
  67. package/build/browser/filter-list/base/inputs/CheckboxListInput.js.map +1 -0
  68. package/build/browser/filter-list/base/inputs/CheckboxListInput.module.css +42 -0
  69. package/build/browser/filter-list/base/inputs/CheckboxListInput.module.css.js +9 -0
  70. package/build/browser/filter-list/base/inputs/ContainsTextInput.js +85 -0
  71. package/build/browser/filter-list/base/inputs/ContainsTextInput.js.map +1 -0
  72. package/build/browser/filter-list/base/inputs/ContainsTextInput.module.css +91 -0
  73. package/build/browser/filter-list/base/inputs/ContainsTextInput.module.css.js +10 -0
  74. package/build/browser/filter-list/base/inputs/DateRangeInput.js +37 -0
  75. package/build/browser/filter-list/base/inputs/DateRangeInput.js.map +1 -0
  76. package/build/browser/filter-list/base/inputs/LinkedPropertyInput.js +237 -0
  77. package/build/browser/filter-list/base/inputs/LinkedPropertyInput.js.map +1 -0
  78. package/build/browser/filter-list/base/inputs/LinkedPropertyInput.module.css +20 -0
  79. package/build/browser/filter-list/base/inputs/LinkedPropertyInput.module.css.js +6 -0
  80. package/build/browser/filter-list/base/inputs/ListogramInput.js +98 -0
  81. package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -0
  82. package/build/browser/filter-list/base/inputs/ListogramInput.module.css +88 -0
  83. package/build/browser/filter-list/base/inputs/ListogramInput.module.css.js +12 -0
  84. package/build/browser/filter-list/base/inputs/MultiDateInput.js +82 -0
  85. package/build/browser/filter-list/base/inputs/MultiDateInput.js.map +1 -0
  86. package/build/browser/filter-list/base/inputs/MultiDateInput.module.css +54 -0
  87. package/build/browser/filter-list/base/inputs/MultiDateInput.module.css.js +9 -0
  88. package/build/browser/filter-list/base/inputs/MultiSelectInput.js +100 -0
  89. package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -0
  90. package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css +35 -0
  91. package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css.js +9 -0
  92. package/build/browser/filter-list/base/inputs/NullValueWrapper.js +76 -0
  93. package/build/browser/filter-list/base/inputs/NullValueWrapper.js.map +1 -0
  94. package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css +49 -0
  95. package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css.js +10 -0
  96. package/build/browser/filter-list/base/inputs/NumberRangeInput.js +48 -0
  97. package/build/browser/filter-list/base/inputs/NumberRangeInput.js.map +1 -0
  98. package/build/browser/filter-list/base/inputs/RangeInput.js +187 -0
  99. package/build/browser/filter-list/base/inputs/RangeInput.js.map +1 -0
  100. package/build/browser/filter-list/base/inputs/RangeInput.module.css +81 -0
  101. package/build/browser/filter-list/base/inputs/RangeInput.module.css.js +13 -0
  102. package/build/browser/filter-list/base/inputs/SingleDateInput.js +61 -0
  103. package/build/browser/filter-list/base/inputs/SingleDateInput.js.map +1 -0
  104. package/build/browser/filter-list/base/inputs/SingleDateInput.module.css +63 -0
  105. package/build/browser/filter-list/base/inputs/SingleDateInput.module.css.js +9 -0
  106. package/build/browser/filter-list/base/inputs/SingleSelectInput.js +95 -0
  107. package/build/browser/filter-list/base/inputs/SingleSelectInput.js.map +1 -0
  108. package/build/browser/filter-list/base/inputs/SingleSelectInput.module.css +55 -0
  109. package/build/browser/filter-list/base/inputs/SingleSelectInput.module.css.js +8 -0
  110. package/build/browser/filter-list/base/inputs/TextTagsInput.js +141 -0
  111. package/build/browser/filter-list/base/inputs/TextTagsInput.js.map +1 -0
  112. package/build/browser/filter-list/base/inputs/TextTagsInput.module.css +25 -0
  113. package/build/browser/filter-list/base/inputs/TextTagsInput.module.css.js +7 -0
  114. package/build/browser/filter-list/base/inputs/TimelineInput.js +74 -0
  115. package/build/browser/filter-list/base/inputs/TimelineInput.js.map +1 -0
  116. package/build/browser/filter-list/base/inputs/TimelineInput.module.css +73 -0
  117. package/build/browser/filter-list/base/inputs/TimelineInput.module.css.js +10 -0
  118. package/build/browser/filter-list/base/inputs/ToggleInput.js +43 -0
  119. package/build/browser/filter-list/base/inputs/ToggleInput.js.map +1 -0
  120. package/build/browser/filter-list/base/inputs/ToggleInput.module.css +34 -0
  121. package/build/browser/filter-list/base/inputs/ToggleInput.module.css.js +8 -0
  122. package/build/browser/filter-list/base/inputs/createHistogramBuckets.js +53 -0
  123. package/build/browser/filter-list/base/inputs/createHistogramBuckets.js.map +1 -0
  124. package/build/browser/filter-list/base/inputs/dateUtils.js +57 -0
  125. package/build/browser/filter-list/base/inputs/dateUtils.js.map +1 -0
  126. package/build/browser/filter-list/base/inputs/index.js +25 -0
  127. package/build/browser/filter-list/base/inputs/index.js.map +1 -0
  128. package/build/browser/filter-list/base/inputs/shared.module.css +79 -0
  129. package/build/browser/filter-list/base/inputs/shared.module.css.js +11 -0
  130. package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js +128 -0
  131. package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js.map +1 -0
  132. package/build/browser/filter-list/hooks/useFilterListState.js +119 -0
  133. package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -0
  134. package/build/browser/filter-list/hooks/usePropertyAggregation.js +92 -0
  135. package/build/browser/filter-list/hooks/usePropertyAggregation.js.map +1 -0
  136. package/build/browser/filter-list/types/AddFilterMenuTypes.js +2 -0
  137. package/build/browser/filter-list/types/AddFilterMenuTypes.js.map +1 -0
  138. package/build/browser/filter-list/types/CustomRendererTypes.js +2 -0
  139. package/build/browser/filter-list/types/CustomRendererTypes.js.map +1 -0
  140. package/build/browser/filter-list/types/FilterPanelTypes.js +2 -0
  141. package/build/browser/filter-list/types/FilterPanelTypes.js.map +1 -0
  142. package/build/browser/filter-list/types/KeywordSearchTypes.js +2 -0
  143. package/build/browser/filter-list/types/KeywordSearchTypes.js.map +1 -0
  144. package/build/browser/filter-list/types/LinkedFilterTypes.js +2 -0
  145. package/build/browser/filter-list/types/LinkedFilterTypes.js.map +1 -0
  146. package/build/browser/filter-list/types/index.js +22 -0
  147. package/build/browser/filter-list/types/index.js.map +1 -0
  148. package/build/browser/filter-list/utils/aggregationHelpers.js +44 -0
  149. package/build/browser/filter-list/utils/aggregationHelpers.js.map +1 -0
  150. package/build/browser/filter-list/utils/assertUnreachable.js +25 -0
  151. package/build/browser/filter-list/utils/assertUnreachable.js.map +1 -0
  152. package/build/browser/filter-list/utils/coerceFilterValue.js +33 -0
  153. package/build/browser/filter-list/utils/coerceFilterValue.js.map +1 -0
  154. package/build/browser/filter-list/utils/filterStateToWhereClause.js +337 -0
  155. package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -0
  156. package/build/browser/filter-list/utils/filterValues.js +55 -0
  157. package/build/browser/filter-list/utils/filterValues.js.map +1 -0
  158. package/build/browser/filter-list/utils/getFilterKey.js +34 -0
  159. package/build/browser/filter-list/utils/getFilterKey.js.map +1 -0
  160. package/build/browser/object-table/CellContextMenu.js +23 -20
  161. package/build/browser/object-table/CellContextMenu.module.css +20 -0
  162. package/build/browser/object-table/CellContextMenu.module.css.js +6 -0
  163. package/build/browser/object-table/ColumnConfigDialog.js +259 -0
  164. package/build/browser/object-table/ColumnConfigDialog.js.map +1 -0
  165. package/build/browser/object-table/ColumnConfigDialog.module.css +247 -0
  166. package/build/browser/object-table/ColumnConfigDialog.module.css.js +29 -0
  167. package/build/browser/object-table/DefaultCellRenderer.js +43 -0
  168. package/build/browser/object-table/DefaultCellRenderer.js.map +1 -0
  169. package/build/browser/object-table/EditableCell.js +91 -0
  170. package/build/browser/object-table/EditableCell.js.map +1 -0
  171. package/build/browser/object-table/EditableCell.module.css +3 -0
  172. package/build/browser/object-table/EditableCell.module.css.js +6 -0
  173. package/build/browser/object-table/LoadingCell.js +24 -29
  174. package/build/browser/object-table/LoadingCell.module.css +48 -0
  175. package/build/browser/object-table/LoadingCell.module.css.js +8 -0
  176. package/build/browser/object-table/LoadingRow.js +24 -50
  177. package/build/browser/object-table/LoadingStateTable.js +49 -343
  178. package/build/browser/object-table/LoadingStateTable.js.map +1 -1
  179. package/build/browser/object-table/MultiColumnSortDialog.js +178 -0
  180. package/build/browser/object-table/MultiColumnSortDialog.js.map +1 -0
  181. package/build/browser/object-table/MultiColumnSortDialog.module.css +195 -0
  182. package/build/browser/object-table/MultiColumnSortDialog.module.css.js +22 -0
  183. package/build/browser/object-table/NonIdealState.js +23 -20
  184. package/build/browser/object-table/NonIdealState.module.css +27 -0
  185. package/build/browser/object-table/NonIdealState.module.css.js +7 -0
  186. package/build/browser/object-table/ObjectTable.js +74 -15
  187. package/build/browser/object-table/ObjectTable.js.map +1 -1
  188. package/build/browser/object-table/ObjectTableApi.js.map +1 -1
  189. package/build/browser/object-table/SelectionCells.js +15 -4
  190. package/build/browser/object-table/SelectionCells.js.map +1 -1
  191. package/build/browser/object-table/SortableItemsList.js +35 -0
  192. package/build/browser/object-table/SortableItemsList.js.map +1 -0
  193. package/build/browser/object-table/Table.js +70 -935
  194. package/build/browser/object-table/Table.js.map +1 -1
  195. package/build/browser/object-table/Table.module.css +45 -0
  196. package/build/browser/object-table/Table.module.css.js +8 -0
  197. package/build/browser/object-table/TableBody.js +36 -260
  198. package/build/browser/object-table/TableBody.module.css +22 -0
  199. package/build/browser/object-table/TableBody.module.css.js +6 -0
  200. package/build/browser/object-table/TableCell.js +31 -111
  201. package/build/browser/object-table/TableCell.module.css +83 -0
  202. package/build/browser/object-table/TableCell.module.css.js +8 -0
  203. package/build/browser/object-table/TableHeader.js +126 -216
  204. package/build/browser/object-table/TableHeader.js.map +1 -1
  205. package/build/browser/object-table/TableHeader.module.css +108 -0
  206. package/build/browser/object-table/TableHeader.module.css.js +10 -0
  207. package/build/browser/object-table/TableHeaderContent.js +21 -18
  208. package/build/browser/object-table/TableHeaderContent.module.css +30 -0
  209. package/build/browser/object-table/TableHeaderContent.module.css.js +6 -0
  210. package/build/browser/object-table/TableHeaderWithPopover.js +110 -93
  211. package/build/browser/object-table/TableHeaderWithPopover.js.map +1 -1
  212. package/build/browser/object-table/TableHeaderWithPopover.module.css +141 -0
  213. package/build/browser/object-table/TableHeaderWithPopover.module.css.js +17 -0
  214. package/build/browser/object-table/TableRow.js +26 -144
  215. package/build/browser/object-table/TableRow.module.css +62 -0
  216. package/build/browser/object-table/TableRow.module.css.js +6 -0
  217. package/build/browser/object-table/__tests__/useEditableTable.test.js +197 -0
  218. package/build/browser/object-table/__tests__/useEditableTable.test.js.map +1 -0
  219. package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js +14 -2
  220. package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js.map +1 -1
  221. package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js +160 -138
  222. package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js.map +1 -1
  223. package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js +113 -25
  224. package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js.map +1 -1
  225. package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js +48 -0
  226. package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js.map +1 -1
  227. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +27 -82
  228. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -1
  229. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js +290 -0
  230. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js.map +1 -1
  231. package/build/browser/object-table/hooks/useColumnDefs.js +16 -3
  232. package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
  233. package/build/browser/object-table/hooks/useColumnResize.js +45 -0
  234. package/build/browser/object-table/hooks/useColumnResize.js.map +1 -0
  235. package/build/browser/object-table/hooks/useColumnVisibility.js +52 -20
  236. package/build/browser/object-table/hooks/useColumnVisibility.js.map +1 -1
  237. package/build/browser/object-table/hooks/useEditableTable.js +57 -0
  238. package/build/browser/object-table/hooks/useEditableTable.js.map +1 -0
  239. package/build/browser/object-table/hooks/useObjectTableData.js +42 -7
  240. package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
  241. package/build/browser/object-table/hooks/useRowSelection.js +31 -10
  242. package/build/browser/object-table/hooks/useRowSelection.js.map +1 -1
  243. package/build/browser/object-table/hooks/useSelectionColumn.js +15 -6
  244. package/build/browser/object-table/hooks/useSelectionColumn.js.map +1 -1
  245. package/build/browser/object-table/utils/getCellId.js +27 -0
  246. package/build/browser/object-table/utils/getCellId.js.map +1 -0
  247. package/build/browser/object-table/utils/types.js +2 -0
  248. package/build/browser/object-table/utils/types.js.map +1 -0
  249. package/build/browser/public/experimental.js +2 -0
  250. package/build/browser/public/experimental.js.map +1 -1
  251. package/build/browser/shared/ErrorBoundary.js +62 -0
  252. package/build/browser/shared/ErrorBoundary.js.map +1 -0
  253. package/build/browser/shared/ErrorBoundary.module.css +55 -0
  254. package/build/browser/shared/ErrorBoundary.module.css.js +8 -0
  255. package/build/browser/styles.css +3073 -0
  256. package/build/cjs/public/experimental.cjs +4026 -240
  257. package/build/cjs/public/experimental.cjs.map +1 -1
  258. package/build/cjs/public/experimental.css +1834 -154
  259. package/build/cjs/public/experimental.css.map +1 -1
  260. package/build/cjs/public/experimental.d.cts +453 -50
  261. package/build/esm/base-components/action-button/ActionButton.js +31 -0
  262. package/build/esm/base-components/action-button/ActionButton.js.map +1 -0
  263. package/build/esm/base-components/action-button/ActionButton.module.css +70 -0
  264. package/build/esm/base-components/checkbox/Checkbox.module.css +1 -1
  265. package/build/esm/base-components/combobox/Combobox.js +124 -0
  266. package/build/esm/base-components/combobox/Combobox.js.map +1 -0
  267. package/build/esm/base-components/combobox/Combobox.module.css +177 -0
  268. package/build/esm/base-components/dialog/Dialog.js +52 -0
  269. package/build/esm/base-components/dialog/Dialog.js.map +1 -0
  270. package/build/esm/base-components/dialog/Dialog.module.css +101 -0
  271. package/build/esm/base-components/draggable-list/DraggableList.js +155 -0
  272. package/build/esm/base-components/draggable-list/DraggableList.js.map +1 -0
  273. package/build/esm/base-components/draggable-list/DraggableList.module.css +108 -0
  274. package/build/esm/base-components/search-bar/SearchBar.js +44 -0
  275. package/build/esm/base-components/search-bar/SearchBar.js.map +1 -0
  276. package/build/esm/base-components/search-bar/SearchBar.module.css +53 -0
  277. package/build/esm/base-components/select/Select.js +89 -0
  278. package/build/esm/base-components/select/Select.js.map +1 -0
  279. package/build/esm/base-components/select/Select.module.css +138 -0
  280. package/build/esm/base-components/switch/Switch.js +33 -0
  281. package/build/esm/base-components/switch/Switch.js.map +1 -0
  282. package/build/esm/base-components/switch/Switch.module.css +91 -0
  283. package/build/esm/filter-list/FilterListApi.js.map +1 -1
  284. package/build/esm/filter-list/FilterListItemApi.js.map +1 -1
  285. package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js +202 -0
  286. package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js.map +1 -0
  287. package/build/esm/filter-list/__tests__/dateUtils.test.js +55 -0
  288. package/build/esm/filter-list/__tests__/dateUtils.test.js.map +1 -0
  289. package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js +296 -0
  290. package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js.map +1 -0
  291. package/build/esm/filter-list/__tests__/getFilterKey.test.js +53 -0
  292. package/build/esm/filter-list/__tests__/getFilterKey.test.js.map +1 -0
  293. package/build/esm/filter-list/__tests__/testUtils.js +203 -0
  294. package/build/esm/filter-list/__tests__/testUtils.js.map +1 -0
  295. package/build/esm/filter-list/base/FilterInput.js +542 -0
  296. package/build/esm/filter-list/base/FilterInput.js.map +1 -0
  297. package/build/esm/filter-list/base/FilterList.js +77 -0
  298. package/build/esm/filter-list/base/FilterList.js.map +1 -0
  299. package/build/esm/filter-list/base/FilterList.module.css +67 -0
  300. package/build/esm/filter-list/base/FilterListContent.js +57 -0
  301. package/build/esm/filter-list/base/FilterListContent.js.map +1 -0
  302. package/build/esm/filter-list/base/FilterListContent.module.css +27 -0
  303. package/build/esm/filter-list/base/FilterListHeader.js +58 -0
  304. package/build/esm/filter-list/base/FilterListHeader.js.map +1 -0
  305. package/build/esm/filter-list/base/FilterListHeader.module.css +127 -0
  306. package/build/esm/filter-list/base/FilterListItem.js +75 -0
  307. package/build/esm/filter-list/base/FilterListItem.js.map +1 -0
  308. package/build/esm/filter-list/base/FilterListItem.module.css +38 -0
  309. package/build/esm/filter-list/base/index.js +22 -0
  310. package/build/esm/filter-list/base/index.js.map +1 -0
  311. package/build/esm/filter-list/base/inputs/CheckboxListInput.js +75 -0
  312. package/build/esm/filter-list/base/inputs/CheckboxListInput.js.map +1 -0
  313. package/build/esm/filter-list/base/inputs/CheckboxListInput.module.css +42 -0
  314. package/build/esm/filter-list/base/inputs/ContainsTextInput.js +85 -0
  315. package/build/esm/filter-list/base/inputs/ContainsTextInput.js.map +1 -0
  316. package/build/esm/filter-list/base/inputs/ContainsTextInput.module.css +91 -0
  317. package/build/esm/filter-list/base/inputs/DateRangeInput.js +37 -0
  318. package/build/esm/filter-list/base/inputs/DateRangeInput.js.map +1 -0
  319. package/build/esm/filter-list/base/inputs/LinkedPropertyInput.js +237 -0
  320. package/build/esm/filter-list/base/inputs/LinkedPropertyInput.js.map +1 -0
  321. package/build/esm/filter-list/base/inputs/LinkedPropertyInput.module.css +20 -0
  322. package/build/esm/filter-list/base/inputs/ListogramInput.js +98 -0
  323. package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -0
  324. package/build/esm/filter-list/base/inputs/ListogramInput.module.css +88 -0
  325. package/build/esm/filter-list/base/inputs/MultiDateInput.js +82 -0
  326. package/build/esm/filter-list/base/inputs/MultiDateInput.js.map +1 -0
  327. package/build/esm/filter-list/base/inputs/MultiDateInput.module.css +54 -0
  328. package/build/esm/filter-list/base/inputs/MultiSelectInput.js +100 -0
  329. package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -0
  330. package/build/esm/filter-list/base/inputs/MultiSelectInput.module.css +35 -0
  331. package/build/esm/filter-list/base/inputs/NullValueWrapper.js +76 -0
  332. package/build/esm/filter-list/base/inputs/NullValueWrapper.js.map +1 -0
  333. package/build/esm/filter-list/base/inputs/NullValueWrapper.module.css +49 -0
  334. package/build/esm/filter-list/base/inputs/NumberRangeInput.js +48 -0
  335. package/build/esm/filter-list/base/inputs/NumberRangeInput.js.map +1 -0
  336. package/build/esm/filter-list/base/inputs/RangeInput.js +187 -0
  337. package/build/esm/filter-list/base/inputs/RangeInput.js.map +1 -0
  338. package/build/esm/filter-list/base/inputs/RangeInput.module.css +81 -0
  339. package/build/esm/filter-list/base/inputs/SingleDateInput.js +61 -0
  340. package/build/esm/filter-list/base/inputs/SingleDateInput.js.map +1 -0
  341. package/build/esm/filter-list/base/inputs/SingleDateInput.module.css +63 -0
  342. package/build/esm/filter-list/base/inputs/SingleSelectInput.js +95 -0
  343. package/build/esm/filter-list/base/inputs/SingleSelectInput.js.map +1 -0
  344. package/build/esm/filter-list/base/inputs/SingleSelectInput.module.css +55 -0
  345. package/build/esm/filter-list/base/inputs/TextTagsInput.js +141 -0
  346. package/build/esm/filter-list/base/inputs/TextTagsInput.js.map +1 -0
  347. package/build/esm/filter-list/base/inputs/TextTagsInput.module.css +25 -0
  348. package/build/esm/filter-list/base/inputs/TimelineInput.js +74 -0
  349. package/build/esm/filter-list/base/inputs/TimelineInput.js.map +1 -0
  350. package/build/esm/filter-list/base/inputs/TimelineInput.module.css +73 -0
  351. package/build/esm/filter-list/base/inputs/ToggleInput.js +43 -0
  352. package/build/esm/filter-list/base/inputs/ToggleInput.js.map +1 -0
  353. package/build/esm/filter-list/base/inputs/ToggleInput.module.css +34 -0
  354. package/build/esm/filter-list/base/inputs/createHistogramBuckets.js +53 -0
  355. package/build/esm/filter-list/base/inputs/createHistogramBuckets.js.map +1 -0
  356. package/build/esm/filter-list/base/inputs/dateUtils.js +57 -0
  357. package/build/esm/filter-list/base/inputs/dateUtils.js.map +1 -0
  358. package/build/esm/filter-list/base/inputs/index.js +25 -0
  359. package/build/esm/filter-list/base/inputs/index.js.map +1 -0
  360. package/build/esm/filter-list/base/inputs/shared.module.css +79 -0
  361. package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js +128 -0
  362. package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js.map +1 -0
  363. package/build/esm/filter-list/hooks/useFilterListState.js +119 -0
  364. package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -0
  365. package/build/esm/filter-list/hooks/usePropertyAggregation.js +92 -0
  366. package/build/esm/filter-list/hooks/usePropertyAggregation.js.map +1 -0
  367. package/build/esm/filter-list/types/AddFilterMenuTypes.js +2 -0
  368. package/build/esm/filter-list/types/AddFilterMenuTypes.js.map +1 -0
  369. package/build/esm/filter-list/types/CustomRendererTypes.js +2 -0
  370. package/build/esm/filter-list/types/CustomRendererTypes.js.map +1 -0
  371. package/build/esm/filter-list/types/FilterPanelTypes.js +2 -0
  372. package/build/esm/filter-list/types/FilterPanelTypes.js.map +1 -0
  373. package/build/esm/filter-list/types/KeywordSearchTypes.js +2 -0
  374. package/build/esm/filter-list/types/KeywordSearchTypes.js.map +1 -0
  375. package/build/esm/filter-list/types/LinkedFilterTypes.js +2 -0
  376. package/build/esm/filter-list/types/LinkedFilterTypes.js.map +1 -0
  377. package/build/esm/filter-list/types/index.js +22 -0
  378. package/build/esm/filter-list/types/index.js.map +1 -0
  379. package/build/esm/filter-list/utils/aggregationHelpers.js +44 -0
  380. package/build/esm/filter-list/utils/aggregationHelpers.js.map +1 -0
  381. package/build/esm/filter-list/utils/assertUnreachable.js +25 -0
  382. package/build/esm/filter-list/utils/assertUnreachable.js.map +1 -0
  383. package/build/esm/filter-list/utils/coerceFilterValue.js +33 -0
  384. package/build/esm/filter-list/utils/coerceFilterValue.js.map +1 -0
  385. package/build/esm/filter-list/utils/filterStateToWhereClause.js +337 -0
  386. package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -0
  387. package/build/esm/filter-list/utils/filterValues.js +55 -0
  388. package/build/esm/filter-list/utils/filterValues.js.map +1 -0
  389. package/build/esm/filter-list/utils/getFilterKey.js +34 -0
  390. package/build/esm/filter-list/utils/getFilterKey.js.map +1 -0
  391. package/build/esm/object-table/ColumnConfigDialog.js +259 -0
  392. package/build/esm/object-table/ColumnConfigDialog.js.map +1 -0
  393. package/build/esm/object-table/ColumnConfigDialog.module.css +247 -0
  394. package/build/esm/object-table/DefaultCellRenderer.js +43 -0
  395. package/build/esm/object-table/DefaultCellRenderer.js.map +1 -0
  396. package/build/esm/object-table/EditableCell.js +91 -0
  397. package/build/esm/object-table/EditableCell.js.map +1 -0
  398. package/build/esm/object-table/EditableCell.module.css +3 -0
  399. package/build/esm/object-table/LoadingStateTable.js +4 -4
  400. package/build/esm/object-table/LoadingStateTable.js.map +1 -1
  401. package/build/esm/object-table/MultiColumnSortDialog.js +178 -0
  402. package/build/esm/object-table/MultiColumnSortDialog.js.map +1 -0
  403. package/build/esm/object-table/MultiColumnSortDialog.module.css +195 -0
  404. package/build/esm/object-table/NonIdealState.module.css +2 -3
  405. package/build/esm/object-table/ObjectTable.js +74 -15
  406. package/build/esm/object-table/ObjectTable.js.map +1 -1
  407. package/build/esm/object-table/ObjectTableApi.js.map +1 -1
  408. package/build/esm/object-table/SelectionCells.js +15 -4
  409. package/build/esm/object-table/SelectionCells.js.map +1 -1
  410. package/build/esm/object-table/SortableItemsList.js +35 -0
  411. package/build/esm/object-table/SortableItemsList.js.map +1 -0
  412. package/build/esm/object-table/Table.js +25 -8
  413. package/build/esm/object-table/Table.js.map +1 -1
  414. package/build/esm/object-table/Table.module.css +26 -3
  415. package/build/esm/object-table/TableBody.module.css +2 -0
  416. package/build/esm/object-table/TableCell.module.css +22 -1
  417. package/build/esm/object-table/TableHeader.js +93 -6
  418. package/build/esm/object-table/TableHeader.js.map +1 -1
  419. package/build/esm/object-table/TableHeader.module.css +9 -2
  420. package/build/esm/object-table/TableHeaderWithPopover.js +53 -22
  421. package/build/esm/object-table/TableHeaderWithPopover.js.map +1 -1
  422. package/build/esm/object-table/TableHeaderWithPopover.module.css +56 -25
  423. package/build/esm/object-table/TableRow.module.css +2 -0
  424. package/build/esm/object-table/__tests__/useEditableTable.test.js +197 -0
  425. package/build/esm/object-table/__tests__/useEditableTable.test.js.map +1 -0
  426. package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js +14 -2
  427. package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js.map +1 -1
  428. package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js +160 -138
  429. package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js.map +1 -1
  430. package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js +113 -25
  431. package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js.map +1 -1
  432. package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js +48 -0
  433. package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js.map +1 -1
  434. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +27 -82
  435. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -1
  436. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js +290 -0
  437. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js.map +1 -1
  438. package/build/esm/object-table/hooks/useColumnDefs.js +16 -3
  439. package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
  440. package/build/esm/object-table/hooks/useColumnResize.js +45 -0
  441. package/build/esm/object-table/hooks/useColumnResize.js.map +1 -0
  442. package/build/esm/object-table/hooks/useColumnVisibility.js +52 -20
  443. package/build/esm/object-table/hooks/useColumnVisibility.js.map +1 -1
  444. package/build/esm/object-table/hooks/useEditableTable.js +57 -0
  445. package/build/esm/object-table/hooks/useEditableTable.js.map +1 -0
  446. package/build/esm/object-table/hooks/useObjectTableData.js +42 -7
  447. package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
  448. package/build/esm/object-table/hooks/useRowSelection.js +31 -10
  449. package/build/esm/object-table/hooks/useRowSelection.js.map +1 -1
  450. package/build/esm/object-table/hooks/useSelectionColumn.js +15 -6
  451. package/build/esm/object-table/hooks/useSelectionColumn.js.map +1 -1
  452. package/build/esm/object-table/utils/getCellId.js +27 -0
  453. package/build/esm/object-table/utils/getCellId.js.map +1 -0
  454. package/build/esm/object-table/utils/types.js +2 -0
  455. package/build/esm/object-table/utils/types.js.map +1 -0
  456. package/build/esm/public/experimental.js +2 -0
  457. package/build/esm/public/experimental.js.map +1 -1
  458. package/build/esm/shared/ErrorBoundary.js +62 -0
  459. package/build/esm/shared/ErrorBoundary.js.map +1 -0
  460. package/build/esm/shared/ErrorBoundary.module.css +55 -0
  461. package/build/types/base-components/action-button/ActionButton.d.ts +5 -0
  462. package/build/types/base-components/action-button/ActionButton.d.ts.map +1 -0
  463. package/build/types/base-components/combobox/Combobox.d.ts +52 -0
  464. package/build/types/base-components/combobox/Combobox.d.ts.map +1 -0
  465. package/build/types/base-components/dialog/Dialog.d.ts +10 -0
  466. package/build/types/base-components/dialog/Dialog.d.ts.map +1 -0
  467. package/build/types/base-components/draggable-list/DraggableList.d.ts +17 -0
  468. package/build/types/base-components/draggable-list/DraggableList.d.ts.map +1 -0
  469. package/build/types/base-components/search-bar/SearchBar.d.ts +11 -0
  470. package/build/types/base-components/search-bar/SearchBar.d.ts.map +1 -0
  471. package/build/types/base-components/select/Select.d.ts +34 -0
  472. package/build/types/base-components/select/Select.d.ts.map +1 -0
  473. package/build/types/base-components/switch/Switch.d.ts +10 -0
  474. package/build/types/base-components/switch/Switch.d.ts.map +1 -0
  475. package/build/types/filter-list/FilterListApi.d.ts +62 -17
  476. package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
  477. package/build/types/filter-list/FilterListItemApi.d.ts +101 -53
  478. package/build/types/filter-list/FilterListItemApi.d.ts.map +1 -1
  479. package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts +1 -0
  480. package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts.map +1 -0
  481. package/build/types/filter-list/__tests__/dateUtils.test.d.ts +1 -0
  482. package/build/types/filter-list/__tests__/dateUtils.test.d.ts.map +1 -0
  483. package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts +1 -0
  484. package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts.map +1 -0
  485. package/build/types/filter-list/__tests__/getFilterKey.test.d.ts +1 -0
  486. package/build/types/filter-list/__tests__/getFilterKey.test.d.ts.map +1 -0
  487. package/build/types/filter-list/__tests__/testUtils.d.ts +65 -0
  488. package/build/types/filter-list/__tests__/testUtils.d.ts.map +1 -0
  489. package/build/types/filter-list/base/FilterInput.d.ts +15 -0
  490. package/build/types/filter-list/base/FilterInput.d.ts.map +1 -0
  491. package/build/types/filter-list/base/FilterList.d.ts +4 -0
  492. package/build/types/filter-list/base/FilterList.d.ts.map +1 -0
  493. package/build/types/filter-list/base/FilterListContent.d.ts +16 -0
  494. package/build/types/filter-list/base/FilterListContent.d.ts.map +1 -0
  495. package/build/types/filter-list/base/FilterListHeader.d.ts +14 -0
  496. package/build/types/filter-list/base/FilterListHeader.d.ts.map +1 -0
  497. package/build/types/filter-list/base/FilterListItem.d.ts +18 -0
  498. package/build/types/filter-list/base/FilterListItem.d.ts.map +1 -0
  499. package/build/types/filter-list/base/index.d.ts +5 -0
  500. package/build/types/filter-list/base/index.d.ts.map +1 -0
  501. package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts +21 -0
  502. package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts.map +1 -0
  503. package/build/types/filter-list/base/inputs/ContainsTextInput.d.ts +13 -0
  504. package/build/types/filter-list/base/inputs/ContainsTextInput.d.ts.map +1 -0
  505. package/build/types/filter-list/base/inputs/DateRangeInput.d.ts +22 -0
  506. package/build/types/filter-list/base/inputs/DateRangeInput.d.ts.map +1 -0
  507. package/build/types/filter-list/base/inputs/LinkedPropertyInput.d.ts +21 -0
  508. package/build/types/filter-list/base/inputs/LinkedPropertyInput.d.ts.map +1 -0
  509. package/build/types/filter-list/base/inputs/ListogramInput.d.ts +22 -0
  510. package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -0
  511. package/build/types/filter-list/base/inputs/MultiDateInput.d.ts +12 -0
  512. package/build/types/filter-list/base/inputs/MultiDateInput.d.ts.map +1 -0
  513. package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts +24 -0
  514. package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts.map +1 -0
  515. package/build/types/filter-list/base/inputs/NullValueWrapper.d.ts +21 -0
  516. package/build/types/filter-list/base/inputs/NullValueWrapper.d.ts.map +1 -0
  517. package/build/types/filter-list/base/inputs/NumberRangeInput.d.ts +22 -0
  518. package/build/types/filter-list/base/inputs/NumberRangeInput.d.ts.map +1 -0
  519. package/build/types/filter-list/base/inputs/RangeInput.d.ts +37 -0
  520. package/build/types/filter-list/base/inputs/RangeInput.d.ts.map +1 -0
  521. package/build/types/filter-list/base/inputs/SingleDateInput.d.ts +13 -0
  522. package/build/types/filter-list/base/inputs/SingleDateInput.d.ts.map +1 -0
  523. package/build/types/filter-list/base/inputs/SingleSelectInput.d.ts +24 -0
  524. package/build/types/filter-list/base/inputs/SingleSelectInput.d.ts.map +1 -0
  525. package/build/types/filter-list/base/inputs/TextTagsInput.d.ts +24 -0
  526. package/build/types/filter-list/base/inputs/TextTagsInput.d.ts.map +1 -0
  527. package/build/types/filter-list/base/inputs/TimelineInput.d.ts +11 -0
  528. package/build/types/filter-list/base/inputs/TimelineInput.d.ts.map +1 -0
  529. package/build/types/filter-list/base/inputs/ToggleInput.d.ts +10 -0
  530. package/build/types/filter-list/base/inputs/ToggleInput.d.ts.map +1 -0
  531. package/build/types/filter-list/base/inputs/createHistogramBuckets.d.ts +16 -0
  532. package/build/types/filter-list/base/inputs/createHistogramBuckets.d.ts.map +1 -0
  533. package/build/types/filter-list/base/inputs/dateUtils.d.ts +17 -0
  534. package/build/types/filter-list/base/inputs/dateUtils.d.ts.map +1 -0
  535. package/build/types/filter-list/base/inputs/index.d.ts +8 -0
  536. package/build/types/filter-list/base/inputs/index.d.ts.map +1 -0
  537. package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts +1 -0
  538. package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts.map +1 -0
  539. package/build/types/filter-list/hooks/useFilterListState.d.ts +11 -0
  540. package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -0
  541. package/build/types/filter-list/hooks/usePropertyAggregation.d.ts +20 -0
  542. package/build/types/filter-list/hooks/usePropertyAggregation.d.ts.map +1 -0
  543. package/build/types/filter-list/types/AddFilterMenuTypes.d.ts +56 -0
  544. package/build/types/filter-list/types/AddFilterMenuTypes.d.ts.map +1 -0
  545. package/build/types/filter-list/types/CustomRendererTypes.d.ts +76 -0
  546. package/build/types/filter-list/types/CustomRendererTypes.d.ts.map +1 -0
  547. package/build/types/filter-list/types/FilterPanelTypes.d.ts +18 -0
  548. package/build/types/filter-list/types/FilterPanelTypes.d.ts.map +1 -0
  549. package/build/types/filter-list/types/KeywordSearchTypes.d.ts +56 -0
  550. package/build/types/filter-list/types/KeywordSearchTypes.d.ts.map +1 -0
  551. package/build/types/filter-list/types/LinkedFilterTypes.d.ts +89 -0
  552. package/build/types/filter-list/types/LinkedFilterTypes.d.ts.map +1 -0
  553. package/build/types/filter-list/types/index.d.ts +5 -0
  554. package/build/types/filter-list/types/index.d.ts.map +1 -0
  555. package/build/types/filter-list/utils/aggregationHelpers.d.ts +9 -0
  556. package/build/types/filter-list/utils/aggregationHelpers.d.ts.map +1 -0
  557. package/build/types/filter-list/utils/assertUnreachable.d.ts +6 -0
  558. package/build/types/filter-list/utils/assertUnreachable.d.ts.map +1 -0
  559. package/build/types/filter-list/utils/coerceFilterValue.d.ts +11 -0
  560. package/build/types/filter-list/utils/coerceFilterValue.d.ts.map +1 -0
  561. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts +16 -0
  562. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts.map +1 -0
  563. package/build/types/filter-list/utils/filterValues.d.ts +5 -0
  564. package/build/types/filter-list/utils/filterValues.d.ts.map +1 -0
  565. package/build/types/filter-list/utils/getFilterKey.d.ts +3 -0
  566. package/build/types/filter-list/utils/getFilterKey.d.ts.map +1 -0
  567. package/build/types/object-table/ColumnConfigDialog.d.ts +18 -0
  568. package/build/types/object-table/ColumnConfigDialog.d.ts.map +1 -0
  569. package/build/types/object-table/DefaultCellRenderer.d.ts +3 -0
  570. package/build/types/object-table/DefaultCellRenderer.d.ts.map +1 -0
  571. package/build/types/object-table/EditableCell.d.ts +10 -0
  572. package/build/types/object-table/EditableCell.d.ts.map +1 -0
  573. package/build/types/object-table/LoadingStateTable.d.ts.map +1 -1
  574. package/build/types/object-table/MultiColumnSortDialog.d.ts +15 -0
  575. package/build/types/object-table/MultiColumnSortDialog.d.ts.map +1 -0
  576. package/build/types/object-table/ObjectTable.d.ts +1 -1
  577. package/build/types/object-table/ObjectTable.d.ts.map +1 -1
  578. package/build/types/object-table/ObjectTableApi.d.ts +79 -8
  579. package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
  580. package/build/types/object-table/SortableItemsList.d.ts +13 -0
  581. package/build/types/object-table/SortableItemsList.d.ts.map +1 -0
  582. package/build/types/object-table/Table.d.ts +26 -1
  583. package/build/types/object-table/Table.d.ts.map +1 -1
  584. package/build/types/object-table/TableHeader.d.ts +3 -1
  585. package/build/types/object-table/TableHeader.d.ts.map +1 -1
  586. package/build/types/object-table/TableHeaderWithPopover.d.ts +30 -6
  587. package/build/types/object-table/TableHeaderWithPopover.d.ts.map +1 -1
  588. package/build/types/object-table/__tests__/useEditableTable.test.d.ts +1 -0
  589. package/build/types/object-table/__tests__/useEditableTable.test.d.ts.map +1 -0
  590. package/build/types/object-table/hooks/useColumnDefs.d.ts.map +1 -1
  591. package/build/types/object-table/hooks/useColumnResize.d.ts +10 -0
  592. package/build/types/object-table/hooks/useColumnResize.d.ts.map +1 -0
  593. package/build/types/object-table/hooks/useColumnVisibility.d.ts +18 -7
  594. package/build/types/object-table/hooks/useColumnVisibility.d.ts.map +1 -1
  595. package/build/types/object-table/hooks/useEditableTable.d.ts +22 -0
  596. package/build/types/object-table/hooks/useEditableTable.d.ts.map +1 -0
  597. package/build/types/object-table/hooks/useObjectTableData.d.ts +6 -5
  598. package/build/types/object-table/hooks/useObjectTableData.d.ts.map +1 -1
  599. package/build/types/object-table/hooks/useRowSelection.d.ts +5 -4
  600. package/build/types/object-table/hooks/useRowSelection.d.ts.map +1 -1
  601. package/build/types/object-table/utils/getCellId.d.ts +3 -0
  602. package/build/types/object-table/utils/getCellId.d.ts.map +1 -0
  603. package/build/types/object-table/utils/types.d.ts +14 -0
  604. package/build/types/object-table/utils/types.d.ts.map +1 -0
  605. package/build/types/public/experimental.d.ts +6 -2
  606. package/build/types/public/experimental.d.ts.map +1 -1
  607. package/build/types/shared/ErrorBoundary.d.ts +19 -0
  608. package/build/types/shared/ErrorBoundary.d.ts.map +1 -0
  609. package/package.json +17 -9
@@ -1,29 +1,2877 @@
1
1
  'use strict';
2
2
 
3
- var reactTable = require('@tanstack/react-table');
4
- var React7 = require('react');
5
- var react = require('@osdk/react');
6
- var experimental = require('@osdk/react/experimental');
3
+ var button = require('@base-ui/react/button');
4
+ var classnames7 = require('classnames');
5
+ var React21 = require('react');
7
6
  var checkbox = require('@base-ui/react/checkbox');
8
7
  var icons = require('@blueprintjs/icons');
9
- var classNames2 = require('classnames');
8
+ var experimental = require('@osdk/react/experimental');
9
+ var input = require('@base-ui/react/input');
10
+ var lodashEs = require('lodash-es');
11
+ var combobox = require('@base-ui/react/combobox');
12
+ var select = require('@base-ui/react/select');
13
+ var _switch = require('@base-ui/react/switch');
14
+ var reactTable = require('@tanstack/react-table');
15
+ var react = require('@osdk/react');
16
+ var collapsible = require('@base-ui/react/collapsible');
17
+ var sortable = require('@dnd-kit/sortable');
18
+ var dialog = require('@base-ui/react/dialog');
19
+ var core = require('@dnd-kit/core');
20
+ var utilities = require('@dnd-kit/utilities');
10
21
  var menu = require('@base-ui/react/menu');
11
22
  var reactVirtual = require('@tanstack/react-virtual');
12
23
  var reactDom = require('react-dom');
13
24
 
14
25
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
26
 
16
- var React7__default = /*#__PURE__*/_interopDefault(React7);
17
- var classNames2__default = /*#__PURE__*/_interopDefault(classNames2);
27
+ var classnames7__default = /*#__PURE__*/_interopDefault(classnames7);
28
+ var React21__default = /*#__PURE__*/_interopDefault(React21);
29
+
30
+ // src/filter-list/base/FilterList.tsx
31
+
32
+ // src/filter-list/utils/assertUnreachable.ts
33
+ function assertUnreachable(value) {
34
+ throw new Error(`Unhandled value: ${String(value)}`);
35
+ }
36
+
37
+ // src/filter-list/utils/getFilterKey.ts
38
+ function getFilterKey(definition) {
39
+ switch (definition.type) {
40
+ case "PROPERTY":
41
+ return definition.id ?? definition.key;
42
+ case "HAS_LINK":
43
+ return definition.id ?? `hasLink:${definition.linkName}`;
44
+ case "LINKED_PROPERTY":
45
+ return definition.id ?? `linkedProperty:${definition.linkName}:${definition.linkedPropertyKey}`;
46
+ case "KEYWORD_SEARCH":
47
+ return definition.id ?? `keywordSearch-${Array.isArray(definition.properties) ? definition.properties.join("-") : "all"}`;
48
+ case "CUSTOM":
49
+ return definition.id ?? definition.key;
50
+ default:
51
+ return assertUnreachable(definition);
52
+ }
53
+ }
54
+
55
+ // src/filter-list/utils/filterStateToWhereClause.ts
56
+ function filterStateToPropertyFilter(state) {
57
+ switch (state.type) {
58
+ case "CONTAINS_TEXT": {
59
+ if (!state.value) {
60
+ return void 0;
61
+ }
62
+ const filter = {
63
+ $containsAnyTerm: state.value
64
+ };
65
+ if (state.isExcluding) {
66
+ return {
67
+ $not: filter
68
+ };
69
+ }
70
+ return filter;
71
+ }
72
+ case "TOGGLE": {
73
+ return state.enabled;
74
+ }
75
+ case "DATE_RANGE": {
76
+ const conditions = [];
77
+ if (state.minValue !== void 0) {
78
+ conditions.push({
79
+ $gte: state.minValue.toISOString()
80
+ });
81
+ }
82
+ if (state.maxValue !== void 0) {
83
+ conditions.push({
84
+ $lte: state.maxValue.toISOString()
85
+ });
86
+ }
87
+ if (conditions.length === 0 && !state.includeNull) {
88
+ return void 0;
89
+ }
90
+ let rangeFilter;
91
+ if (conditions.length === 1) {
92
+ rangeFilter = conditions[0];
93
+ } else if (conditions.length > 1) {
94
+ rangeFilter = {
95
+ $and: conditions
96
+ };
97
+ }
98
+ if (state.includeNull) {
99
+ if (rangeFilter) {
100
+ return {
101
+ $or: [rangeFilter, {
102
+ $isNull: true
103
+ }]
104
+ };
105
+ }
106
+ return {
107
+ $isNull: true
108
+ };
109
+ }
110
+ return rangeFilter;
111
+ }
112
+ case "NUMBER_RANGE": {
113
+ const conditions = [];
114
+ if (state.minValue !== void 0) {
115
+ conditions.push({
116
+ $gte: state.minValue
117
+ });
118
+ }
119
+ if (state.maxValue !== void 0) {
120
+ conditions.push({
121
+ $lte: state.maxValue
122
+ });
123
+ }
124
+ if (conditions.length === 0 && !state.includeNull) {
125
+ return void 0;
126
+ }
127
+ let rangeFilter;
128
+ if (conditions.length === 1) {
129
+ rangeFilter = conditions[0];
130
+ } else if (conditions.length > 1) {
131
+ rangeFilter = {
132
+ $and: conditions
133
+ };
134
+ }
135
+ if (state.includeNull) {
136
+ if (rangeFilter) {
137
+ return {
138
+ $or: [rangeFilter, {
139
+ $isNull: true
140
+ }]
141
+ };
142
+ }
143
+ return {
144
+ $isNull: true
145
+ };
146
+ }
147
+ return rangeFilter;
148
+ }
149
+ case "EXACT_MATCH": {
150
+ if (state.values.length === 0) {
151
+ return void 0;
152
+ }
153
+ const filter = state.values.length === 1 ? state.values[0] : {
154
+ $in: state.values
155
+ };
156
+ if (state.isExcluding) {
157
+ return {
158
+ $not: filter
159
+ };
160
+ }
161
+ return filter;
162
+ }
163
+ case "SELECT": {
164
+ if (state.selectedValues.length === 0) {
165
+ return void 0;
166
+ }
167
+ const isDateValue = state.selectedValues[0] instanceof Date;
168
+ const values = isDateValue ? state.selectedValues.map((v) => v.toISOString()) : state.selectedValues;
169
+ const filter = values.length === 1 ? values[0] : {
170
+ $in: values
171
+ };
172
+ if (state.isExcluding) {
173
+ return {
174
+ $not: filter
175
+ };
176
+ }
177
+ return filter;
178
+ }
179
+ case "TIMELINE": {
180
+ const conditions = [];
181
+ if (state.startDate !== void 0) {
182
+ conditions.push({
183
+ $gte: state.startDate.toISOString()
184
+ });
185
+ }
186
+ if (state.endDate !== void 0) {
187
+ conditions.push({
188
+ $lte: state.endDate.toISOString()
189
+ });
190
+ }
191
+ if (conditions.length === 0) {
192
+ return void 0;
193
+ }
194
+ if (conditions.length === 1) {
195
+ return conditions[0];
196
+ }
197
+ return {
198
+ $and: conditions
199
+ };
200
+ }
201
+ // These filter types are handled separately in buildWhereClause
202
+ // since they need access to the full definition, not just state
203
+ case "hasLink":
204
+ case "linkedProperty":
205
+ case "keywordSearch":
206
+ case "custom":
207
+ return void 0;
208
+ default:
209
+ return assertUnreachable(state);
210
+ }
211
+ }
212
+ function buildWhereClause(definitions, filterStates, operator, objectType) {
213
+ if (!definitions || definitions.length === 0) {
214
+ return {};
215
+ }
216
+ const clauses = [];
217
+ for (const definition of definitions) {
218
+ const state = filterStates.get(getFilterKey(definition));
219
+ if (!state) {
220
+ continue;
221
+ }
222
+ switch (definition.type) {
223
+ case "PROPERTY": {
224
+ const filter = filterStateToPropertyFilter(state);
225
+ if (filter !== void 0) {
226
+ clauses.push({
227
+ [definition.key]: filter
228
+ });
229
+ }
230
+ break;
231
+ }
232
+ case "HAS_LINK": {
233
+ if (state.type !== "hasLink") {
234
+ if (process.env.NODE_ENV !== "production") {
235
+ console.warn(`[FilterList] State type mismatch for hasLink filter "${definition.linkName}": expected hasLink, got ${state.type}`);
236
+ }
237
+ break;
238
+ }
239
+ if (!state.hasLink) {
240
+ break;
241
+ }
242
+ clauses.push({
243
+ [definition.linkName]: {
244
+ $isNotNull: true
245
+ }
246
+ });
247
+ break;
248
+ }
249
+ case "LINKED_PROPERTY": {
250
+ break;
251
+ }
252
+ case "KEYWORD_SEARCH": {
253
+ if (state.type !== "keywordSearch") {
254
+ if (process.env.NODE_ENV !== "production") {
255
+ console.warn(`[FilterList] State type mismatch for keywordSearch filter: expected keywordSearch, got ${state.type}`);
256
+ }
257
+ break;
258
+ }
259
+ if (!state.searchTerm) {
260
+ break;
261
+ }
262
+ const searchTerm = state.searchTerm.trim();
263
+ if (!searchTerm) {
264
+ break;
265
+ }
266
+ const properties = definition.properties;
267
+ let propertiesToSearch;
268
+ if (properties === "all") {
269
+ if (objectType?.__DefinitionMetadata?.properties) {
270
+ propertiesToSearch = Object.entries(objectType.__DefinitionMetadata.properties).filter(([, prop]) => prop.type === "string" && !prop.multiplicity).map(([key]) => key);
271
+ } else {
272
+ if (process.env.NODE_ENV !== "production") {
273
+ console.warn("[FilterList] Keyword search with properties: 'all' requires objectType to be provided. Filter will be skipped.");
274
+ }
275
+ break;
276
+ }
277
+ } else {
278
+ propertiesToSearch = properties;
279
+ }
280
+ if (propertiesToSearch.length === 0) {
281
+ break;
282
+ }
283
+ const containsOp = state.operator === "AND" ? "$containsAllTerms" : "$containsAnyTerm";
284
+ const propertySearches = propertiesToSearch.map((prop) => ({
285
+ [prop]: state.isExcluding ? {
286
+ $not: {
287
+ [containsOp]: searchTerm
288
+ }
289
+ } : {
290
+ [containsOp]: searchTerm
291
+ }
292
+ }));
293
+ if (propertySearches.length === 1) {
294
+ clauses.push(propertySearches[0]);
295
+ } else {
296
+ clauses.push({
297
+ $or: propertySearches
298
+ });
299
+ }
300
+ break;
301
+ }
302
+ case "CUSTOM": {
303
+ if (state.type !== "custom") {
304
+ if (process.env.NODE_ENV !== "production") {
305
+ console.warn(`[FilterList] State type mismatch for custom filter "${definition.key}": expected custom, got ${state.type}`);
306
+ }
307
+ break;
308
+ }
309
+ const customClause = definition.toWhereClause(state);
310
+ if (customClause && Object.keys(customClause).length > 0) {
311
+ clauses.push(customClause);
312
+ }
313
+ break;
314
+ }
315
+ default:
316
+ assertUnreachable(definition);
317
+ }
318
+ }
319
+ if (clauses.length === 0) {
320
+ return {};
321
+ }
322
+ if (clauses.length === 1) {
323
+ return clauses[0];
324
+ }
325
+ if (operator === "and") {
326
+ return {
327
+ $and: clauses
328
+ };
329
+ }
330
+ return {
331
+ $or: clauses
332
+ };
333
+ }
334
+
335
+ // src/filter-list/utils/filterValues.ts
336
+ function filterHasActiveState(state) {
337
+ if (!state) return false;
338
+ switch (state.type) {
339
+ case "SELECT":
340
+ return state.selectedValues.length > 0;
341
+ case "EXACT_MATCH":
342
+ return state.values.length > 0;
343
+ case "CONTAINS_TEXT":
344
+ return state.value !== void 0 && state.value !== "";
345
+ case "NUMBER_RANGE":
346
+ return state.minValue !== void 0 || state.maxValue !== void 0 || state.includeNull === true;
347
+ case "DATE_RANGE":
348
+ return state.minValue !== void 0 || state.maxValue !== void 0 || state.includeNull === true;
349
+ case "TOGGLE":
350
+ return state.enabled;
351
+ case "hasLink":
352
+ return state.hasLink;
353
+ case "linkedProperty":
354
+ return filterHasActiveState(state.linkedFilterState);
355
+ case "keywordSearch":
356
+ return state.searchTerm !== void 0 && state.searchTerm !== "";
357
+ case "TIMELINE":
358
+ return state.startDate !== void 0 || state.endDate !== void 0;
359
+ case "custom":
360
+ return true;
361
+ default:
362
+ return false;
363
+ }
364
+ }
365
+
366
+ // src/filter-list/hooks/useFilterListState.ts
367
+ function buildInitialStates(definitions) {
368
+ const states = /* @__PURE__ */ new Map();
369
+ if (!definitions) {
370
+ return states;
371
+ }
372
+ for (const definition of definitions) {
373
+ const key = getFilterKey(definition);
374
+ switch (definition.type) {
375
+ case "PROPERTY": {
376
+ const state = definition.filterState;
377
+ if (state) {
378
+ states.set(key, state);
379
+ }
380
+ break;
381
+ }
382
+ case "HAS_LINK":
383
+ case "KEYWORD_SEARCH":
384
+ case "CUSTOM": {
385
+ const state = definition.defaultFilterState;
386
+ if (state) {
387
+ states.set(key, state);
388
+ }
389
+ break;
390
+ }
391
+ case "LINKED_PROPERTY": {
392
+ const innerState = definition.defaultLinkedFilterState;
393
+ if (innerState) {
394
+ const state = {
395
+ type: "linkedProperty",
396
+ linkedFilterState: innerState
397
+ };
398
+ states.set(key, state);
399
+ }
400
+ break;
401
+ }
402
+ default:
403
+ assertUnreachable(definition);
404
+ }
405
+ }
406
+ return states;
407
+ }
408
+ function useFilterListState(props) {
409
+ const {
410
+ objectSet,
411
+ filterDefinitions,
412
+ filterOperator = "and",
413
+ onFilterStateChanged,
414
+ onFilterClauseChanged
415
+ } = props;
416
+ const objectType = objectSet.$objectSetInternals.def;
417
+ const [filterStates, setFilterStates] = React21.useState(() => buildInitialStates(filterDefinitions));
418
+ const setFilterState = React21.useCallback((filterKey, state) => {
419
+ let newWhereClause;
420
+ setFilterStates((prev) => {
421
+ const next = new Map(prev);
422
+ next.set(filterKey, state);
423
+ newWhereClause = buildWhereClause(filterDefinitions, next, filterOperator, objectType);
424
+ return next;
425
+ });
426
+ if (newWhereClause !== void 0) {
427
+ onFilterClauseChanged?.(newWhereClause);
428
+ }
429
+ const definition = filterDefinitions?.find((d) => getFilterKey(d) === filterKey);
430
+ if (definition) {
431
+ onFilterStateChanged?.(definition, state);
432
+ }
433
+ }, [filterDefinitions, filterOperator, objectType, onFilterClauseChanged, onFilterStateChanged]);
434
+ const whereClause = React21.useMemo(() => buildWhereClause(filterDefinitions, filterStates, filterOperator, objectType), [filterDefinitions, filterStates, filterOperator, objectType]);
435
+ const activeFilterCount = React21.useMemo(() => {
436
+ let count = 0;
437
+ for (const state of filterStates.values()) {
438
+ if (filterHasActiveState(state)) {
439
+ count++;
440
+ }
441
+ }
442
+ return count;
443
+ }, [filterStates]);
444
+ const reset = React21.useCallback(() => {
445
+ const initialStates = buildInitialStates(filterDefinitions);
446
+ setFilterStates(initialStates);
447
+ const newWhereClause = buildWhereClause(filterDefinitions, initialStates, filterOperator, objectType);
448
+ onFilterClauseChanged?.(newWhereClause);
449
+ }, [filterDefinitions, filterOperator, objectType, onFilterClauseChanged]);
450
+ return React21.useMemo(() => ({
451
+ filterStates,
452
+ setFilterState,
453
+ whereClause,
454
+ activeFilterCount,
455
+ reset
456
+ }), [filterStates, setFilterState, whereClause, activeFilterCount, reset]);
457
+ }
458
+
459
+ // src/filter-list/base/FilterList.module.css
460
+ var FilterList_default = {};
461
+
462
+ // src/filter-list/base/FilterListContent.module.css
463
+ var FilterListContent_default = {};
464
+
465
+ // src/shared/ErrorBoundary.module.css
466
+ var ErrorBoundary_default = {};
467
+
468
+ // src/shared/ErrorBoundary.tsx
469
+ var ErrorBoundary = class extends React21.Component {
470
+ state = {
471
+ hasError: false,
472
+ error: null
473
+ };
474
+ static getDerivedStateFromError(error) {
475
+ return {
476
+ hasError: true,
477
+ error
478
+ };
479
+ }
480
+ componentDidCatch(error, errorInfo) {
481
+ console.error("[ErrorBoundary]", error);
482
+ console.error("[ErrorBoundary] Component stack:", errorInfo.componentStack);
483
+ this.props.onError?.(error);
484
+ }
485
+ handleRetry = () => {
486
+ this.setState({
487
+ hasError: false,
488
+ error: null
489
+ });
490
+ };
491
+ render() {
492
+ if (this.state.hasError) {
493
+ if (this.props.fallback) {
494
+ return this.props.fallback;
495
+ }
496
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
497
+ className: ErrorBoundary_default.errorContainer
498
+ }, /* @__PURE__ */ React21__default.default.createElement("p", {
499
+ className: ErrorBoundary_default.errorMessage
500
+ }, this.props.errorMessage ?? "Something went wrong"), /* @__PURE__ */ React21__default.default.createElement(button.Button, {
501
+ className: ErrorBoundary_default.retryButton,
502
+ onClick: this.handleRetry,
503
+ "aria-label": "Retry"
504
+ }, "Retry"));
505
+ }
506
+ return this.props.children;
507
+ }
508
+ };
509
+
510
+ // src/filter-list/utils/coerceFilterValue.ts
511
+ function coerceToString(value) {
512
+ if (value === void 0) return void 0;
513
+ return String(value);
514
+ }
515
+ function coerceToStringArray(values) {
516
+ if (values === void 0) return [];
517
+ return values.map((v) => String(v));
518
+ }
519
+
520
+ // src/base-components/checkbox/Checkbox.module.css
521
+ var Checkbox_default = {};
522
+
523
+ // src/base-components/checkbox/Checkbox.tsx
524
+ function _extends() {
525
+ return _extends = Object.assign ? Object.assign.bind() : function(n) {
526
+ for (var e = 1; e < arguments.length; e++) {
527
+ var t = arguments[e];
528
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
529
+ }
530
+ return n;
531
+ }, _extends.apply(null, arguments);
532
+ }
533
+ function Checkbox({
534
+ indeterminate,
535
+ className,
536
+ indicatorProps,
537
+ ...rest
538
+ }) {
539
+ return /* @__PURE__ */ React21__default.default.createElement(checkbox.Checkbox.Root, _extends({
540
+ className: classnames7__default.default(Checkbox_default.osdkCheckboxRoot, className),
541
+ indeterminate
542
+ }, rest), /* @__PURE__ */ React21__default.default.createElement(checkbox.Checkbox.Indicator, _extends({}, indicatorProps, {
543
+ className: classnames7__default.default(Checkbox_default.osdkCheckboxIndicator, indicatorProps?.className)
544
+ }), indeterminate ? /* @__PURE__ */ React21__default.default.createElement(icons.Minus, {
545
+ color: "currentColor"
546
+ }) : /* @__PURE__ */ React21__default.default.createElement(icons.Tick, {
547
+ color: "currentColor"
548
+ })));
549
+ }
550
+ function usePropertyAggregation(objectType, propertyKey, options) {
551
+ const aggregateOptions = React21.useMemo(() => ({
552
+ $select: {
553
+ $count: "unordered"
554
+ },
555
+ $groupBy: {
556
+ [propertyKey]: {
557
+ $exact: {
558
+ $includeNullValue: true
559
+ }
560
+ }
561
+ }
562
+ }), [propertyKey]);
563
+ const {
564
+ data: countData,
565
+ isLoading,
566
+ error
567
+ } = experimental.useOsdkAggregation(objectType, {
568
+ aggregate: aggregateOptions,
569
+ where: options?.where
570
+ });
571
+ const result = React21.useMemo(() => {
572
+ if (!countData) {
573
+ return {
574
+ data: [],
575
+ maxCount: 0
576
+ };
577
+ }
578
+ const values = [];
579
+ let maxCount = 0;
580
+ const dataArray = countData;
581
+ for (const item of dataArray) {
582
+ const rawValue = item.$group[propertyKey];
583
+ const count = item.$count ?? 0;
584
+ if (rawValue == null) {
585
+ values.push({
586
+ value: "",
587
+ count,
588
+ isNull: true
589
+ });
590
+ } else {
591
+ values.push({
592
+ value: String(rawValue),
593
+ count
594
+ });
595
+ }
596
+ maxCount = Math.max(maxCount, count);
597
+ }
598
+ values.sort((a, b) => b.count - a.count);
599
+ if (options?.limit && values.length > options.limit) {
600
+ return {
601
+ data: values.slice(0, options.limit),
602
+ maxCount
603
+ };
604
+ }
605
+ return {
606
+ data: values,
607
+ maxCount
608
+ };
609
+ }, [countData, propertyKey, options?.limit]);
610
+ return {
611
+ data: result.data,
612
+ maxCount: result.maxCount,
613
+ isLoading,
614
+ error: error ?? null
615
+ };
616
+ }
617
+
618
+ // src/filter-list/base/inputs/CheckboxListInput.module.css
619
+ var CheckboxListInput_default = {};
620
+
621
+ // src/filter-list/base/inputs/shared.module.css
622
+ var shared_default = {};
623
+
624
+ // src/filter-list/base/inputs/CheckboxListInput.tsx
625
+ function CheckboxListInputInner({
626
+ objectType,
627
+ propertyKey,
628
+ selectedValues,
629
+ onChange,
630
+ whereClause,
631
+ className,
632
+ style
633
+ }) {
634
+ const {
635
+ data,
636
+ isLoading,
637
+ error
638
+ } = usePropertyAggregation(objectType, propertyKey, {
639
+ where: whereClause
640
+ });
641
+ const values = React21.useMemo(() => data.map((item) => item.value), [data]);
642
+ const selectedSet = React21.useMemo(() => new Set(selectedValues), [selectedValues]);
643
+ const toggleValue = React21.useCallback((value) => {
644
+ if (selectedSet.has(value)) {
645
+ onChange(selectedValues.filter((v) => v !== value));
646
+ } else {
647
+ onChange([...selectedValues, value]);
648
+ }
649
+ }, [selectedValues, selectedSet, onChange]);
650
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
651
+ className: classnames7__default.default(CheckboxListInput_default.checkboxList, className),
652
+ style,
653
+ "data-loading": isLoading
654
+ }, error && /* @__PURE__ */ React21__default.default.createElement("div", {
655
+ className: shared_default.errorMessage
656
+ }, "Error loading values: ", error.message), !error && values.length === 0 && /* @__PURE__ */ React21__default.default.createElement("div", {
657
+ className: shared_default.emptyMessage
658
+ }, isLoading ? "Loading values..." : "No values available"), (values.length > 0 || isLoading) && /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, isLoading && /* @__PURE__ */ React21__default.default.createElement("div", {
659
+ className: shared_default.loadingMessage
660
+ }, "Updating..."), values.map((value) => {
661
+ const isSelected = selectedSet.has(value);
662
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
663
+ key: value,
664
+ className: CheckboxListInput_default.checkboxRow,
665
+ "data-selected": isSelected
666
+ }, /* @__PURE__ */ React21__default.default.createElement("label", {
667
+ className: CheckboxListInput_default.checkboxLabel
668
+ }, /* @__PURE__ */ React21__default.default.createElement(Checkbox, {
669
+ checked: isSelected,
670
+ onCheckedChange: () => toggleValue(value)
671
+ }), /* @__PURE__ */ React21__default.default.createElement("span", {
672
+ className: CheckboxListInput_default.valueText
673
+ }, value)));
674
+ })));
675
+ }
676
+ var CheckboxListInput = /* @__PURE__ */ React21.memo(CheckboxListInputInner);
677
+
678
+ // src/filter-list/base/inputs/ContainsTextInput.module.css
679
+ var ContainsTextInput_default = {};
680
+
681
+ // src/filter-list/base/inputs/ContainsTextInput.tsx
682
+ function ContainsTextInputInner({
683
+ value,
684
+ onChange,
685
+ placeholder = "Search...",
686
+ debounceMs = 300,
687
+ className,
688
+ style,
689
+ renderSearchIcon,
690
+ renderClearIcon
691
+ }) {
692
+ const [localValue, setLocalValue] = React21.useState(value ?? "");
693
+ const onChangeRef = React21.useRef(onChange);
694
+ onChangeRef.current = onChange;
695
+ const debouncedOnChange = React21.useMemo(() => lodashEs.debounce((newValue) => {
696
+ onChangeRef.current(newValue.length > 0 ? newValue : void 0);
697
+ }, debounceMs), [debounceMs]);
698
+ React21.useEffect(() => {
699
+ return () => {
700
+ debouncedOnChange.cancel();
701
+ };
702
+ }, [debouncedOnChange]);
703
+ React21.useEffect(() => {
704
+ setLocalValue(value ?? "");
705
+ debouncedOnChange.cancel();
706
+ }, [value, debouncedOnChange]);
707
+ const handleInputChange = React21.useCallback((e) => {
708
+ setLocalValue(e.target.value);
709
+ debouncedOnChange(e.target.value);
710
+ }, [debouncedOnChange]);
711
+ const handleClear = React21.useCallback(() => {
712
+ setLocalValue("");
713
+ debouncedOnChange.cancel();
714
+ onChangeRef.current(void 0);
715
+ }, [debouncedOnChange]);
716
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
717
+ className: classnames7__default.default(ContainsTextInput_default.textInput, className),
718
+ style,
719
+ "data-has-value": !!localValue
720
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
721
+ className: ContainsTextInput_default.inputGroup
722
+ }, renderSearchIcon ? renderSearchIcon() : /* @__PURE__ */ React21__default.default.createElement("span", {
723
+ className: ContainsTextInput_default.searchIcon
724
+ }, /* @__PURE__ */ React21__default.default.createElement(icons.Search, {
725
+ color: "currentColor"
726
+ })), /* @__PURE__ */ React21__default.default.createElement(input.Input, {
727
+ type: "text",
728
+ className: ContainsTextInput_default.input,
729
+ value: localValue,
730
+ onChange: handleInputChange,
731
+ placeholder,
732
+ "aria-label": placeholder
733
+ }), localValue && /* @__PURE__ */ React21__default.default.createElement(button.Button, {
734
+ type: "button",
735
+ className: ContainsTextInput_default.clearButton,
736
+ onClick: handleClear,
737
+ "aria-label": "Clear search"
738
+ }, renderClearIcon ? renderClearIcon() : /* @__PURE__ */ React21__default.default.createElement(icons.Cross, {
739
+ color: "currentColor"
740
+ }))));
741
+ }
742
+ var ContainsTextInput = /* @__PURE__ */ React21.memo(ContainsTextInputInner);
743
+
744
+ // src/filter-list/base/inputs/dateUtils.ts
745
+ function formatDateForInput(date) {
746
+ if (!date) return "";
747
+ const year = date.getFullYear();
748
+ const month = String(date.getMonth() + 1).padStart(2, "0");
749
+ const day = String(date.getDate()).padStart(2, "0");
750
+ return `${year}-${month}-${day}`;
751
+ }
752
+ function parseDateFromInput(value) {
753
+ if (!value) return void 0;
754
+ const date = /* @__PURE__ */ new Date(value + "T00:00:00");
755
+ return isNaN(date.getTime()) ? void 0 : date;
756
+ }
757
+ function formatDateForDisplay(date, fallback = "") {
758
+ if (!date) return fallback;
759
+ return date.toLocaleDateString(void 0, {
760
+ year: "numeric",
761
+ month: "short",
762
+ day: "numeric"
763
+ });
764
+ }
765
+
766
+ // src/filter-list/utils/aggregationHelpers.ts
767
+ function createGroupByAggregateOptions(propertyKey) {
768
+ return {
769
+ $select: {
770
+ $count: "unordered"
771
+ },
772
+ $groupBy: {
773
+ [propertyKey]: "exact"
774
+ }
775
+ };
776
+ }
777
+ function createNullCountAggregateOptions() {
778
+ return {
779
+ $select: {
780
+ $count: "unordered"
781
+ }
782
+ };
783
+ }
784
+ function createNullWhereClause(propertyKey) {
785
+ return {
786
+ [propertyKey]: {
787
+ $isNull: true
788
+ }
789
+ };
790
+ }
791
+
792
+ // src/filter-list/base/inputs/createHistogramBuckets.ts
793
+ var HISTOGRAM_BUCKETS = 20;
794
+ function createHistogramBuckets(pairs, range, toNumber, fromNumber) {
795
+ if (pairs.length === 0) return [];
796
+ const minNum = toNumber(range.min);
797
+ const maxNum = toNumber(range.max);
798
+ const rangeSize = maxNum - minNum;
799
+ if (rangeSize === 0) {
800
+ const totalCount = pairs.reduce((sum, p) => sum + p.count, 0);
801
+ return [{
802
+ min: range.min,
803
+ max: range.max,
804
+ count: totalCount
805
+ }];
806
+ }
807
+ const bucketSize = rangeSize / HISTOGRAM_BUCKETS;
808
+ const bucketCounts = new Array(HISTOGRAM_BUCKETS).fill(0);
809
+ for (const {
810
+ value,
811
+ count
812
+ } of pairs) {
813
+ const bucketIndex = Math.min(Math.floor((toNumber(value) - minNum) / bucketSize), HISTOGRAM_BUCKETS - 1);
814
+ bucketCounts[bucketIndex] += count;
815
+ }
816
+ return bucketCounts.map((count, i) => ({
817
+ min: fromNumber(minNum + i * bucketSize),
818
+ max: fromNumber(minNum + (i + 1) * bucketSize),
819
+ count
820
+ }));
821
+ }
822
+ function getMaxBucketCount(buckets) {
823
+ return Math.max(...buckets.map((b) => b.count), 1);
824
+ }
825
+
826
+ // src/filter-list/base/inputs/RangeInput.module.css
827
+ var RangeInput_default = {};
828
+
829
+ // src/filter-list/base/inputs/RangeInput.tsx
830
+ function _extends2() {
831
+ return _extends2 = Object.assign ? Object.assign.bind() : function(n) {
832
+ for (var e = 1; e < arguments.length; e++) {
833
+ var t = arguments[e];
834
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
835
+ }
836
+ return n;
837
+ }, _extends2.apply(null, arguments);
838
+ }
839
+ var DEBOUNCE_MS = 300;
840
+ function RangeInputInner({
841
+ objectType,
842
+ propertyKey,
843
+ minValue,
844
+ maxValue,
845
+ onChange,
846
+ objectSet,
847
+ showHistogram = true,
848
+ className,
849
+ style,
850
+ config
851
+ }) {
852
+ const minInputId = React21.useId();
853
+ const maxInputId = React21.useId();
854
+ const [localMin, setLocalMin] = React21.useState(config.formatValue(minValue));
855
+ const [localMax, setLocalMax] = React21.useState(config.formatValue(maxValue));
856
+ const onChangeRef = React21.useRef(onChange);
857
+ onChangeRef.current = onChange;
858
+ const minValueRef = React21.useRef(minValue);
859
+ minValueRef.current = minValue;
860
+ const maxValueRef = React21.useRef(maxValue);
861
+ maxValueRef.current = maxValue;
862
+ const debouncedMinChange = React21.useMemo(() => lodashEs.debounce((newValue) => {
863
+ const parsed = config.parseValue(newValue);
864
+ onChangeRef.current(parsed, maxValueRef.current);
865
+ }, DEBOUNCE_MS), [config]);
866
+ const debouncedMaxChange = React21.useMemo(() => lodashEs.debounce((newValue) => {
867
+ const parsed = config.parseValue(newValue);
868
+ onChangeRef.current(minValueRef.current, parsed);
869
+ }, DEBOUNCE_MS), [config]);
870
+ React21.useEffect(() => {
871
+ setLocalMin(config.formatValue(minValue));
872
+ debouncedMinChange.cancel();
873
+ }, [minValue, config, debouncedMinChange]);
874
+ React21.useEffect(() => {
875
+ setLocalMax(config.formatValue(maxValue));
876
+ debouncedMaxChange.cancel();
877
+ }, [maxValue, config, debouncedMaxChange]);
878
+ React21.useEffect(() => {
879
+ return () => {
880
+ debouncedMinChange.cancel();
881
+ debouncedMaxChange.cancel();
882
+ };
883
+ }, [debouncedMinChange, debouncedMaxChange]);
884
+ const aggregateOptions = React21.useMemo(() => createGroupByAggregateOptions(propertyKey), [propertyKey]);
885
+ const {
886
+ data: aggregateData,
887
+ isLoading
888
+ } = experimental.useOsdkAggregation(objectType, {
889
+ aggregate: aggregateOptions
890
+ });
891
+ const valueCountPairs = React21.useMemo(() => {
892
+ if (!aggregateData) return [];
893
+ const dataArray = aggregateData;
894
+ const pairs = [];
895
+ for (const item of dataArray) {
896
+ const rawValue = item.$group[propertyKey];
897
+ if (rawValue != null) {
898
+ const parsed = config.parseValue(String(rawValue));
899
+ if (parsed !== void 0) {
900
+ pairs.push({
901
+ value: parsed,
902
+ count: item.$count ?? 0
903
+ });
904
+ }
905
+ }
906
+ }
907
+ return pairs;
908
+ }, [aggregateData, propertyKey, config]);
909
+ const computedRange = React21.useMemo(() => {
910
+ if (valueCountPairs.length === 0) return {
911
+ min: void 0,
912
+ max: void 0
913
+ };
914
+ const min = valueCountPairs.reduce((acc, p) => Math.min(acc, config.toNumber(p.value)), Infinity);
915
+ const max = valueCountPairs.reduce((acc, p) => Math.max(acc, config.toNumber(p.value)), -Infinity);
916
+ return {
917
+ min: config.fromNumber(min),
918
+ max: config.fromNumber(max)
919
+ };
920
+ }, [valueCountPairs, config]);
921
+ const dataRange = React21.useMemo(() => ({
922
+ dataMin: computedRange.min,
923
+ dataMax: computedRange.max
924
+ }), [computedRange.min, computedRange.max]);
925
+ const buckets = React21.useMemo(() => {
926
+ if (!showHistogram || valueCountPairs.length === 0 || computedRange.min === void 0 || computedRange.max === void 0) {
927
+ return [];
928
+ }
929
+ return createHistogramBuckets(valueCountPairs, {
930
+ min: computedRange.min,
931
+ max: computedRange.max
932
+ }, config.toNumber, config.fromNumber);
933
+ }, [showHistogram, valueCountPairs, computedRange, config]);
934
+ const maxBucketCount = React21.useMemo(() => getMaxBucketCount(buckets), [buckets]);
935
+ const handleMinChange = React21.useCallback((e) => {
936
+ const newValue = e.target.value;
937
+ setLocalMin(newValue);
938
+ debouncedMinChange(newValue);
939
+ }, [debouncedMinChange]);
940
+ const handleMaxChange = React21.useCallback((e) => {
941
+ const newValue = e.target.value;
942
+ setLocalMax(newValue);
943
+ debouncedMaxChange(newValue);
944
+ }, [debouncedMaxChange]);
945
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
946
+ className: classnames7__default.default(RangeInput_default.rangeInput, className),
947
+ style,
948
+ "data-loading": isLoading
949
+ }, showHistogram && buckets.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", {
950
+ className: RangeInput_default.histogramContainer
951
+ }, buckets.map((bucket, index) => {
952
+ const height = bucket.count / maxBucketCount * 100;
953
+ const isInRange = (minValue === void 0 || config.toNumber(bucket.max) >= config.toNumber(minValue)) && (maxValue === void 0 || config.toNumber(bucket.min) <= config.toNumber(maxValue));
954
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
955
+ key: index,
956
+ className: RangeInput_default.histogramBar,
957
+ "data-in-range": isInRange,
958
+ style: {
959
+ height: `${Math.max(height, 2)}%`
960
+ },
961
+ title: config.formatTooltip(bucket.min, bucket.max, bucket.count)
962
+ });
963
+ })), /* @__PURE__ */ React21__default.default.createElement("div", {
964
+ className: RangeInput_default.rangeInputs
965
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
966
+ className: RangeInput_default.inputWrapper
967
+ }, /* @__PURE__ */ React21__default.default.createElement("label", {
968
+ htmlFor: minInputId,
969
+ className: RangeInput_default.inputLabel
970
+ }, config.minLabel), /* @__PURE__ */ React21__default.default.createElement(input.Input, _extends2({
971
+ id: minInputId,
972
+ type: config.inputType,
973
+ className: RangeInput_default.input,
974
+ value: localMin,
975
+ onChange: handleMinChange,
976
+ placeholder: dataRange.dataMin !== void 0 && config.formatPlaceholder ? config.formatPlaceholder(dataRange.dataMin) : void 0
977
+ }, config.inputProps))), /* @__PURE__ */ React21__default.default.createElement("span", {
978
+ className: RangeInput_default.separator,
979
+ "aria-hidden": "true"
980
+ }, "\u2013"), /* @__PURE__ */ React21__default.default.createElement("div", {
981
+ className: RangeInput_default.inputWrapper
982
+ }, /* @__PURE__ */ React21__default.default.createElement("label", {
983
+ htmlFor: maxInputId,
984
+ className: RangeInput_default.inputLabel
985
+ }, config.maxLabel), /* @__PURE__ */ React21__default.default.createElement(input.Input, _extends2({
986
+ id: maxInputId,
987
+ type: config.inputType,
988
+ className: RangeInput_default.input,
989
+ value: localMax,
990
+ onChange: handleMaxChange,
991
+ placeholder: dataRange.dataMax !== void 0 && config.formatPlaceholder ? config.formatPlaceholder(dataRange.dataMax) : void 0
992
+ }, config.inputProps)))), isLoading && /* @__PURE__ */ React21__default.default.createElement("div", {
993
+ className: shared_default.loadingMessage
994
+ }, "Loading..."));
995
+ }
996
+ var RangeInput = /* @__PURE__ */ React21.memo(RangeInputInner);
997
+
998
+ // src/filter-list/base/inputs/DateRangeInput.tsx
999
+ function _extends3() {
1000
+ return _extends3 = Object.assign ? Object.assign.bind() : function(n) {
1001
+ for (var e = 1; e < arguments.length; e++) {
1002
+ var t = arguments[e];
1003
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
1004
+ }
1005
+ return n;
1006
+ }, _extends3.apply(null, arguments);
1007
+ }
1008
+ var dateConfig = {
1009
+ inputType: "date",
1010
+ formatValue: formatDateForInput,
1011
+ parseValue: parseDateFromInput,
1012
+ toNumber: (d) => d.getTime(),
1013
+ fromNumber: (t) => new Date(t),
1014
+ minLabel: "From",
1015
+ maxLabel: "To",
1016
+ formatTooltip: (min, max, count) => `${formatDateForInput(min)} - ${formatDateForInput(max)}: ${count.toLocaleString()}`
1017
+ };
1018
+ function DateRangeInputInner(props) {
1019
+ return /* @__PURE__ */ React21__default.default.createElement(RangeInput, _extends3({}, props, {
1020
+ config: dateConfig
1021
+ }));
1022
+ }
1023
+ var DateRangeInput = /* @__PURE__ */ React21.memo(DateRangeInputInner);
1024
+
1025
+ // src/filter-list/base/inputs/LinkedPropertyInput.module.css
1026
+ var LinkedPropertyInput_default = {};
1027
+
1028
+ // src/filter-list/base/inputs/ListogramInput.module.css
1029
+ var ListogramInput_default = {};
1030
+
1031
+ // src/filter-list/base/inputs/ListogramInput.tsx
1032
+ function ListogramInputInner({
1033
+ objectType,
1034
+ propertyKey,
1035
+ selectedValues,
1036
+ onChange,
1037
+ whereClause,
1038
+ className,
1039
+ style,
1040
+ maxVisibleItems
1041
+ }) {
1042
+ const [isExpanded, setIsExpanded] = React21.useState(false);
1043
+ const {
1044
+ data: values,
1045
+ maxCount,
1046
+ isLoading,
1047
+ error
1048
+ } = usePropertyAggregation(objectType, propertyKey, {
1049
+ where: whereClause
1050
+ });
1051
+ const selectedSet = React21.useMemo(() => new Set(selectedValues), [selectedValues]);
1052
+ const toggleValue = React21.useCallback((value) => {
1053
+ if (selectedSet.has(value)) {
1054
+ onChange(selectedValues.filter((v) => v !== value));
1055
+ } else {
1056
+ onChange([...selectedValues, value]);
1057
+ }
1058
+ }, [selectedValues, selectedSet, onChange]);
1059
+ const displayValues = React21.useMemo(() => {
1060
+ if (isExpanded || !maxVisibleItems) return values;
1061
+ return values.slice(0, maxVisibleItems);
1062
+ }, [values, maxVisibleItems, isExpanded]);
1063
+ const hasMore = maxVisibleItems != null && values.length > maxVisibleItems;
1064
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
1065
+ className: classnames7__default.default(ListogramInput_default.listogram, className),
1066
+ style,
1067
+ "data-loading": isLoading
1068
+ }, isLoading && /* @__PURE__ */ React21__default.default.createElement("div", {
1069
+ className: shared_default.loadingMessage
1070
+ }, "Loading values..."), error && /* @__PURE__ */ React21__default.default.createElement("div", {
1071
+ className: shared_default.errorMessage
1072
+ }, "Error loading values: ", error.message), !isLoading && !error && values.length === 0 && /* @__PURE__ */ React21__default.default.createElement("div", {
1073
+ className: shared_default.emptyMessage
1074
+ }, "No values available"), (values.length > 0 || isLoading) && /* @__PURE__ */ React21__default.default.createElement("div", {
1075
+ className: ListogramInput_default.container
1076
+ }, displayValues.map(({
1077
+ value,
1078
+ count
1079
+ }) => {
1080
+ const isSelected = selectedSet.has(value);
1081
+ const percentage = maxCount > 0 ? count / maxCount * 100 : 0;
1082
+ return /* @__PURE__ */ React21__default.default.createElement(button.Button, {
1083
+ key: value,
1084
+ type: "button",
1085
+ className: ListogramInput_default.row,
1086
+ onClick: () => toggleValue(value),
1087
+ "aria-pressed": isSelected
1088
+ }, /* @__PURE__ */ React21__default.default.createElement("span", {
1089
+ className: ListogramInput_default.label
1090
+ }, value), /* @__PURE__ */ React21__default.default.createElement("span", {
1091
+ className: ListogramInput_default.bar
1092
+ }, /* @__PURE__ */ React21__default.default.createElement("span", {
1093
+ className: ListogramInput_default.barFill,
1094
+ style: {
1095
+ width: `${percentage}%`
1096
+ }
1097
+ })), /* @__PURE__ */ React21__default.default.createElement("span", {
1098
+ className: ListogramInput_default.count
1099
+ }, count.toLocaleString()));
1100
+ }), hasMore && !isExpanded && /* @__PURE__ */ React21__default.default.createElement(button.Button, {
1101
+ type: "button",
1102
+ className: ListogramInput_default.row,
1103
+ onClick: () => setIsExpanded(true)
1104
+ }, "View all (", values.length, ")")));
1105
+ }
1106
+ var ListogramInput = /* @__PURE__ */ React21.memo(ListogramInputInner);
1107
+
1108
+ // src/filter-list/base/inputs/MultiDateInput.module.css
1109
+ var MultiDateInput_default = {};
1110
+
1111
+ // src/filter-list/base/inputs/MultiDateInput.tsx
1112
+ function MultiDateInputInner({
1113
+ selectedDates,
1114
+ onChange,
1115
+ className,
1116
+ style,
1117
+ minDate,
1118
+ maxDate,
1119
+ showClearAll = true
1120
+ }) {
1121
+ const addDate = React21.useCallback((date) => {
1122
+ const dateStr = formatDateForInput(date);
1123
+ const exists = selectedDates.some((d) => formatDateForInput(d) === dateStr);
1124
+ if (!exists) {
1125
+ onChange([...selectedDates, date].sort((a, b) => a.getTime() - b.getTime()));
1126
+ }
1127
+ }, [selectedDates, onChange]);
1128
+ const removeDate = React21.useCallback((date) => {
1129
+ const dateStr = formatDateForInput(date);
1130
+ onChange(selectedDates.filter((d) => formatDateForInput(d) !== dateStr));
1131
+ }, [selectedDates, onChange]);
1132
+ const clearAll = React21.useCallback(() => {
1133
+ onChange([]);
1134
+ }, [onChange]);
1135
+ const handleDateChange = React21.useCallback((e) => {
1136
+ const date = parseDateFromInput(e.target.value);
1137
+ if (date) {
1138
+ addDate(date);
1139
+ e.target.value = "";
1140
+ }
1141
+ }, [addDate]);
1142
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
1143
+ className: classnames7__default.default(MultiDateInput_default.multiDate, className),
1144
+ style
1145
+ }, selectedDates.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", {
1146
+ className: shared_default.tagContainer
1147
+ }, selectedDates.map((date) => /* @__PURE__ */ React21__default.default.createElement("span", {
1148
+ key: date.toISOString(),
1149
+ className: shared_default.tag
1150
+ }, formatDateForDisplay(date), /* @__PURE__ */ React21__default.default.createElement(button.Button, {
1151
+ className: shared_default.tagRemove,
1152
+ onClick: () => removeDate(date),
1153
+ "aria-label": `Remove ${formatDateForDisplay(date)}`
1154
+ }, "\xD7"))), showClearAll && selectedDates.length > 1 && /* @__PURE__ */ React21__default.default.createElement(button.Button, {
1155
+ className: MultiDateInput_default.clearAll,
1156
+ onClick: clearAll,
1157
+ "aria-label": "Clear all dates"
1158
+ }, "Clear all")), /* @__PURE__ */ React21__default.default.createElement("div", {
1159
+ className: MultiDateInput_default.calendarContainer
1160
+ }, /* @__PURE__ */ React21__default.default.createElement(input.Input, {
1161
+ type: "date",
1162
+ className: MultiDateInput_default.input,
1163
+ onChange: handleDateChange,
1164
+ min: minDate ? formatDateForInput(minDate) : void 0,
1165
+ max: maxDate ? formatDateForInput(maxDate) : void 0,
1166
+ "aria-label": "Add date"
1167
+ })));
1168
+ }
1169
+ var MultiDateInput = /* @__PURE__ */ React21.memo(MultiDateInputInner);
1170
+
1171
+ // src/base-components/combobox/Combobox.module.css
1172
+ var Combobox_default = {};
1173
+
1174
+ // src/base-components/combobox/Combobox.tsx
1175
+ function _extends4() {
1176
+ return _extends4 = Object.assign ? Object.assign.bind() : function(n) {
1177
+ for (var e = 1; e < arguments.length; e++) {
1178
+ var t = arguments[e];
1179
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
1180
+ }
1181
+ return n;
1182
+ }, _extends4.apply(null, arguments);
1183
+ }
1184
+ function ComboboxInput({
1185
+ className,
1186
+ ...rest
1187
+ }) {
1188
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
1189
+ className: classnames7__default.default(Combobox_default.osdkComboboxInputWrapper, className)
1190
+ }, /* @__PURE__ */ React21__default.default.createElement(icons.Search, {
1191
+ className: Combobox_default.osdkComboboxSearchIcon,
1192
+ color: "currentColor"
1193
+ }), /* @__PURE__ */ React21__default.default.createElement(combobox.Combobox.Input, _extends4({
1194
+ className: Combobox_default.osdkComboboxInput
1195
+ }, rest)));
1196
+ }
1197
+ function ComboboxPositioner({
1198
+ className,
1199
+ children,
1200
+ ...rest
1201
+ }) {
1202
+ return /* @__PURE__ */ React21__default.default.createElement(combobox.Combobox.Positioner, _extends4({
1203
+ className: classnames7__default.default(Combobox_default.osdkComboboxPositioner, className),
1204
+ sideOffset: 4
1205
+ }, rest), children);
1206
+ }
1207
+ function ComboboxPopup({
1208
+ className,
1209
+ children,
1210
+ ...rest
1211
+ }) {
1212
+ return /* @__PURE__ */ React21__default.default.createElement(combobox.Combobox.Popup, _extends4({
1213
+ className: classnames7__default.default(Combobox_default.osdkComboboxPopup, className)
1214
+ }, rest), children);
1215
+ }
1216
+ function ComboboxItem({
1217
+ className,
1218
+ children,
1219
+ ...rest
1220
+ }) {
1221
+ return /* @__PURE__ */ React21__default.default.createElement(combobox.Combobox.Item, _extends4({
1222
+ className: classnames7__default.default(Combobox_default.osdkComboboxItem, className)
1223
+ }, rest), children);
1224
+ }
1225
+ function ComboboxClear({
1226
+ className,
1227
+ ...rest
1228
+ }) {
1229
+ return /* @__PURE__ */ React21__default.default.createElement(combobox.Combobox.Clear, _extends4({
1230
+ className: classnames7__default.default(Combobox_default.osdkComboboxClear, className),
1231
+ "aria-label": "Clear all"
1232
+ }, rest), /* @__PURE__ */ React21__default.default.createElement(icons.Cross, {
1233
+ color: "currentColor"
1234
+ }));
1235
+ }
1236
+ function ComboboxEmpty({
1237
+ children,
1238
+ className
1239
+ }) {
1240
+ return /* @__PURE__ */ React21__default.default.createElement(combobox.Combobox.Empty, {
1241
+ className: classnames7__default.default(Combobox_default.osdkComboboxEmpty, className)
1242
+ }, children);
1243
+ }
1244
+ var Combobox = {
1245
+ Root: combobox.Combobox.Root,
1246
+ Input: ComboboxInput,
1247
+ Portal: combobox.Combobox.Portal,
1248
+ Positioner: ComboboxPositioner,
1249
+ Popup: ComboboxPopup,
1250
+ Item: ComboboxItem,
1251
+ Clear: ComboboxClear,
1252
+ Empty: ComboboxEmpty
1253
+ };
1254
+
1255
+ // src/filter-list/base/inputs/MultiSelectInput.module.css
1256
+ var MultiSelectInput_default = {};
1257
+
1258
+ // src/filter-list/base/inputs/MultiSelectInput.tsx
1259
+ function MultiSelectInputInner({
1260
+ objectType,
1261
+ propertyKey,
1262
+ selectedValues,
1263
+ onChange,
1264
+ whereClause,
1265
+ className,
1266
+ style,
1267
+ placeholder = "Select values...",
1268
+ maxDisplayedTags = 3,
1269
+ showClearAll = true
1270
+ }) {
1271
+ const {
1272
+ data: values,
1273
+ isLoading,
1274
+ error
1275
+ } = usePropertyAggregation(objectType, propertyKey, {
1276
+ where: whereClause
1277
+ });
1278
+ const handleValueChange = React21.useCallback((newValues) => {
1279
+ onChange(newValues ?? []);
1280
+ }, [onChange]);
1281
+ const removeValue = React21.useCallback((value) => {
1282
+ onChange(selectedValues.filter((v) => v !== value));
1283
+ }, [selectedValues, onChange]);
1284
+ const clearAll = React21.useCallback(() => {
1285
+ onChange([]);
1286
+ }, [onChange]);
1287
+ const displayedTags = selectedValues.slice(0, maxDisplayedTags);
1288
+ const remainingCount = selectedValues.length - maxDisplayedTags;
1289
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
1290
+ className: classnames7__default.default(MultiSelectInput_default.multiSelect, className),
1291
+ style,
1292
+ "data-loading": isLoading
1293
+ }, error && /* @__PURE__ */ React21__default.default.createElement("div", {
1294
+ className: shared_default.errorMessage
1295
+ }, "Error loading options: ", error.message), !error && values.length === 0 && /* @__PURE__ */ React21__default.default.createElement("div", {
1296
+ className: shared_default.emptyMessage
1297
+ }, isLoading ? "Loading options..." : "No options available"), (values.length > 0 || isLoading) && /* @__PURE__ */ React21__default.default.createElement(Combobox.Root, {
1298
+ multiple: true,
1299
+ value: selectedValues,
1300
+ onValueChange: handleValueChange
1301
+ }, isLoading && /* @__PURE__ */ React21__default.default.createElement("div", {
1302
+ className: shared_default.loadingMessage
1303
+ }, "Updating..."), selectedValues.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", {
1304
+ className: shared_default.tagContainer
1305
+ }, displayedTags.map((value) => /* @__PURE__ */ React21__default.default.createElement("span", {
1306
+ key: value,
1307
+ className: shared_default.tag
1308
+ }, value, /* @__PURE__ */ React21__default.default.createElement(button.Button, {
1309
+ type: "button",
1310
+ className: shared_default.tagRemove,
1311
+ onClick: () => removeValue(value),
1312
+ "aria-label": `Remove ${value}`
1313
+ }, "\xD7"))), remainingCount > 0 && /* @__PURE__ */ React21__default.default.createElement("span", {
1314
+ className: shared_default.tag
1315
+ }, "+", remainingCount, " more")), /* @__PURE__ */ React21__default.default.createElement("div", {
1316
+ className: MultiSelectInput_default.inputRow
1317
+ }, /* @__PURE__ */ React21__default.default.createElement(Combobox.Input, {
1318
+ placeholder: selectedValues.length > 0 ? `${selectedValues.length} selected` : placeholder,
1319
+ "aria-label": `Search ${propertyKey} values`
1320
+ }), showClearAll && selectedValues.length > 0 && /* @__PURE__ */ React21__default.default.createElement(Combobox.Clear, {
1321
+ className: MultiSelectInput_default.clearButton,
1322
+ onClick: clearAll,
1323
+ "aria-label": "Clear all selections"
1324
+ })), /* @__PURE__ */ React21__default.default.createElement(Combobox.Portal, null, /* @__PURE__ */ React21__default.default.createElement(Combobox.Positioner, null, /* @__PURE__ */ React21__default.default.createElement(Combobox.Popup, null, values.length === 0 ? /* @__PURE__ */ React21__default.default.createElement(Combobox.Empty, null, "No options available") : values.map(({
1325
+ value,
1326
+ count
1327
+ }) => /* @__PURE__ */ React21__default.default.createElement(Combobox.Item, {
1328
+ key: value,
1329
+ value
1330
+ }, /* @__PURE__ */ React21__default.default.createElement("span", null, value), /* @__PURE__ */ React21__default.default.createElement("span", {
1331
+ className: MultiSelectInput_default.count
1332
+ }, "(", count.toLocaleString(), ")"))))))));
1333
+ }
1334
+ var MultiSelectInput = /* @__PURE__ */ React21.memo(MultiSelectInputInner);
1335
+ function _extends5() {
1336
+ return _extends5 = Object.assign ? Object.assign.bind() : function(n) {
1337
+ for (var e = 1; e < arguments.length; e++) {
1338
+ var t = arguments[e];
1339
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
1340
+ }
1341
+ return n;
1342
+ }, _extends5.apply(null, arguments);
1343
+ }
1344
+ function formatNumber(value) {
1345
+ return value !== void 0 ? String(value) : "";
1346
+ }
1347
+ function parseNumber(value) {
1348
+ if (value === "") return void 0;
1349
+ const parsed = parseFloat(value);
1350
+ return isNaN(parsed) ? void 0 : parsed;
1351
+ }
1352
+ var numberConfig = {
1353
+ inputType: "number",
1354
+ formatValue: formatNumber,
1355
+ parseValue: parseNumber,
1356
+ toNumber: (v) => v,
1357
+ fromNumber: (v) => v,
1358
+ minLabel: "Min",
1359
+ maxLabel: "Max",
1360
+ formatTooltip: (min, max, count) => `${min.toFixed(1)} - ${max.toFixed(1)}: ${count.toLocaleString()}`,
1361
+ formatPlaceholder: (value) => value.toFixed(0),
1362
+ inputProps: {
1363
+ step: "any"
1364
+ }
1365
+ };
1366
+ function NumberRangeInputInner(props) {
1367
+ return /* @__PURE__ */ React21__default.default.createElement(RangeInput, _extends5({}, props, {
1368
+ config: numberConfig
1369
+ }));
1370
+ }
1371
+ var NumberRangeInput = /* @__PURE__ */ React21.memo(NumberRangeInputInner);
1372
+
1373
+ // src/filter-list/base/inputs/SingleDateInput.module.css
1374
+ var SingleDateInput_default = {};
1375
+
1376
+ // src/filter-list/base/inputs/SingleDateInput.tsx
1377
+ function SingleDateInputInner({
1378
+ selectedDate,
1379
+ onChange,
1380
+ className,
1381
+ style,
1382
+ minDate,
1383
+ maxDate,
1384
+ placeholder = "Select a date...",
1385
+ showClearButton = true
1386
+ }) {
1387
+ const handleChange = React21.useCallback((e) => {
1388
+ const date = parseDateFromInput(e.target.value);
1389
+ onChange(date);
1390
+ }, [onChange]);
1391
+ const handleClear = React21.useCallback(() => {
1392
+ onChange(void 0);
1393
+ }, [onChange]);
1394
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
1395
+ className: classnames7__default.default(SingleDateInput_default.singleDate, className),
1396
+ style
1397
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
1398
+ className: SingleDateInput_default.dateContainer
1399
+ }, /* @__PURE__ */ React21__default.default.createElement(input.Input, {
1400
+ type: "date",
1401
+ className: SingleDateInput_default.input,
1402
+ value: formatDateForInput(selectedDate),
1403
+ onChange: handleChange,
1404
+ min: minDate ? formatDateForInput(minDate) : void 0,
1405
+ max: maxDate ? formatDateForInput(maxDate) : void 0,
1406
+ placeholder,
1407
+ "aria-label": "Select date"
1408
+ }), showClearButton && selectedDate !== void 0 && /* @__PURE__ */ React21__default.default.createElement(button.Button, {
1409
+ className: SingleDateInput_default.clearButton,
1410
+ onClick: handleClear,
1411
+ "aria-label": "Clear date"
1412
+ }, "\xD7")));
1413
+ }
1414
+ var SingleDateInput = /* @__PURE__ */ React21.memo(SingleDateInputInner);
1415
+
1416
+ // src/base-components/select/Select.module.css
1417
+ var Select_default = {};
1418
+
1419
+ // src/base-components/select/Select.tsx
1420
+ function _extends6() {
1421
+ return _extends6 = Object.assign ? Object.assign.bind() : function(n) {
1422
+ for (var e = 1; e < arguments.length; e++) {
1423
+ var t = arguments[e];
1424
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
1425
+ }
1426
+ return n;
1427
+ }, _extends6.apply(null, arguments);
1428
+ }
1429
+ function SelectRoot({
1430
+ children,
1431
+ ...rest
1432
+ }) {
1433
+ return /* @__PURE__ */ React21__default.default.createElement(select.Select.Root, rest, children);
1434
+ }
1435
+ function SelectTrigger({
1436
+ className,
1437
+ placeholder,
1438
+ children,
1439
+ ...rest
1440
+ }) {
1441
+ return /* @__PURE__ */ React21__default.default.createElement(select.Select.Trigger, _extends6({
1442
+ className: classnames7__default.default(Select_default.osdkSelectTrigger, className)
1443
+ }, rest), children ?? /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement(select.Select.Value, null, (value) => value != null ? String(value) : placeholder), /* @__PURE__ */ React21__default.default.createElement(select.Select.Icon, {
1444
+ className: Select_default.osdkSelectIcon
1445
+ }, /* @__PURE__ */ React21__default.default.createElement(icons.CaretDown, {
1446
+ color: "currentColor"
1447
+ }))));
1448
+ }
1449
+ function SelectPositioner({
1450
+ className,
1451
+ children,
1452
+ ...rest
1453
+ }) {
1454
+ return /* @__PURE__ */ React21__default.default.createElement(select.Select.Positioner, _extends6({
1455
+ className: classnames7__default.default(Select_default.osdkSelectPositioner, className),
1456
+ sideOffset: 4
1457
+ }, rest), children);
1458
+ }
1459
+ function SelectPopup({
1460
+ className,
1461
+ children,
1462
+ ...rest
1463
+ }) {
1464
+ return /* @__PURE__ */ React21__default.default.createElement(select.Select.Popup, _extends6({
1465
+ className: classnames7__default.default(Select_default.osdkSelectPopup, className)
1466
+ }, rest), children);
1467
+ }
1468
+ function SelectItem({
1469
+ className,
1470
+ children,
1471
+ ...rest
1472
+ }) {
1473
+ return /* @__PURE__ */ React21__default.default.createElement(select.Select.Item, _extends6({
1474
+ className: classnames7__default.default(Select_default.osdkSelectItem, className)
1475
+ }, rest), /* @__PURE__ */ React21__default.default.createElement(select.Select.ItemText, null, children));
1476
+ }
1477
+ var Select = {
1478
+ Root: SelectRoot,
1479
+ Trigger: SelectTrigger,
1480
+ Portal: select.Select.Portal,
1481
+ Positioner: SelectPositioner,
1482
+ Popup: SelectPopup,
1483
+ Item: SelectItem
1484
+ };
1485
+
1486
+ // src/filter-list/base/inputs/SingleSelectInput.module.css
1487
+ var SingleSelectInput_default = {};
1488
+
1489
+ // src/filter-list/base/inputs/SingleSelectInput.tsx
1490
+ function SingleSelectInputInner({
1491
+ objectType,
1492
+ propertyKey,
1493
+ selectedValue,
1494
+ onChange,
1495
+ whereClause,
1496
+ className,
1497
+ style,
1498
+ placeholder = "Select a value...",
1499
+ showClearButton = true,
1500
+ showCounts = false
1501
+ }) {
1502
+ const {
1503
+ data: values,
1504
+ isLoading,
1505
+ error
1506
+ } = usePropertyAggregation(objectType, propertyKey, {
1507
+ where: whereClause
1508
+ });
1509
+ const handleValueChange = React21.useCallback((value) => {
1510
+ onChange(value ?? void 0);
1511
+ }, [onChange]);
1512
+ const handleClear = React21.useCallback(() => {
1513
+ onChange(void 0);
1514
+ }, [onChange]);
1515
+ const items = React21.useMemo(() => {
1516
+ const result = {};
1517
+ for (const {
1518
+ value,
1519
+ count
1520
+ } of values) {
1521
+ result[value] = showCounts ? `${value} (${count.toLocaleString()})` : value;
1522
+ }
1523
+ return result;
1524
+ }, [values, showCounts]);
1525
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
1526
+ className: classnames7__default.default(SingleSelectInput_default.singleSelect, className),
1527
+ style,
1528
+ "data-loading": isLoading
1529
+ }, isLoading && /* @__PURE__ */ React21__default.default.createElement("div", {
1530
+ className: shared_default.loadingMessage
1531
+ }, "Loading options..."), error && /* @__PURE__ */ React21__default.default.createElement("div", {
1532
+ className: shared_default.errorMessage
1533
+ }, "Error loading options: ", error.message), !isLoading && !error && values.length === 0 && /* @__PURE__ */ React21__default.default.createElement("div", {
1534
+ className: shared_default.emptyMessage
1535
+ }, "No options available"), (values.length > 0 || isLoading) && /* @__PURE__ */ React21__default.default.createElement("div", {
1536
+ className: SingleSelectInput_default.selectContainer
1537
+ }, /* @__PURE__ */ React21__default.default.createElement(Select.Root, {
1538
+ value: selectedValue ?? null,
1539
+ onValueChange: handleValueChange,
1540
+ items
1541
+ }, /* @__PURE__ */ React21__default.default.createElement(Select.Trigger, {
1542
+ placeholder,
1543
+ "aria-label": `Select ${propertyKey}`
1544
+ }), /* @__PURE__ */ React21__default.default.createElement(Select.Portal, null, /* @__PURE__ */ React21__default.default.createElement(Select.Positioner, null, /* @__PURE__ */ React21__default.default.createElement(Select.Popup, null, values.map(({
1545
+ value,
1546
+ count
1547
+ }) => /* @__PURE__ */ React21__default.default.createElement(Select.Item, {
1548
+ key: value,
1549
+ value
1550
+ }, showCounts ? `${value} (${count.toLocaleString()})` : value)))))), showClearButton && selectedValue !== void 0 && /* @__PURE__ */ React21__default.default.createElement(button.Button, {
1551
+ type: "button",
1552
+ className: SingleSelectInput_default.clearButton,
1553
+ onClick: handleClear,
1554
+ "aria-label": "Clear selection"
1555
+ }, /* @__PURE__ */ React21__default.default.createElement(icons.Cross, {
1556
+ color: "currentColor"
1557
+ }))));
1558
+ }
1559
+ var SingleSelectInput = /* @__PURE__ */ React21.memo(SingleSelectInputInner);
1560
+
1561
+ // src/filter-list/base/inputs/TextTagsInput.module.css
1562
+ var TextTagsInput_default = {};
1563
+
1564
+ // src/filter-list/base/inputs/TextTagsInput.tsx
1565
+ var TAG_SEPARATOR_PATTERN = /[,\n]/;
1566
+ var TagItem = /* @__PURE__ */ React21.memo(function TagItem2({
1567
+ tag,
1568
+ onRemove
1569
+ }) {
1570
+ const handleRemove = React21.useCallback(() => {
1571
+ onRemove(tag);
1572
+ }, [tag, onRemove]);
1573
+ return /* @__PURE__ */ React21__default.default.createElement("span", {
1574
+ className: shared_default.tag
1575
+ }, tag, /* @__PURE__ */ React21__default.default.createElement(button.Button, {
1576
+ type: "button",
1577
+ className: shared_default.tagRemove,
1578
+ onClick: handleRemove,
1579
+ "aria-label": `Remove ${tag}`
1580
+ }, "\xD7"));
1581
+ });
1582
+ function TextTagsInputInner({
1583
+ objectType,
1584
+ propertyKey,
1585
+ tags,
1586
+ onChange,
1587
+ whereClause,
1588
+ className,
1589
+ style,
1590
+ placeholder = "Add a tag...",
1591
+ allowCustomTags = true,
1592
+ suggestionLimit = 10
1593
+ }) {
1594
+ const [inputValue, setInputValue] = React21.useState("");
1595
+ const {
1596
+ data: suggestions,
1597
+ isLoading,
1598
+ error
1599
+ } = usePropertyAggregation(objectType, propertyKey, {
1600
+ limit: suggestionLimit ?? 0,
1601
+ where: whereClause
1602
+ });
1603
+ const filteredSuggestions = React21.useMemo(() => {
1604
+ if (!suggestionLimit) return [];
1605
+ const lowerInput = inputValue.toLowerCase();
1606
+ return suggestions.filter((s) => (!inputValue.trim() || s.value.toLowerCase().includes(lowerInput)) && !tags.includes(s.value)).slice(0, suggestionLimit);
1607
+ }, [suggestions, inputValue, tags, suggestionLimit]);
1608
+ const addTag = React21.useCallback((tag) => {
1609
+ const trimmedTag = tag.trim();
1610
+ if (trimmedTag && !tags.includes(trimmedTag)) {
1611
+ onChange([...tags, trimmedTag]);
1612
+ }
1613
+ setInputValue("");
1614
+ }, [tags, onChange]);
1615
+ const removeTag = React21.useCallback((tag) => {
1616
+ onChange(tags.filter((t) => t !== tag));
1617
+ }, [tags, onChange]);
1618
+ const handleValueChange = React21.useCallback((newTags) => {
1619
+ onChange(newTags ?? []);
1620
+ }, [onChange]);
1621
+ const handleInputValueChange = React21.useCallback((value) => {
1622
+ setInputValue(value);
1623
+ }, []);
1624
+ const handleKeyDown = React21.useCallback((e) => {
1625
+ if (e.key === "Enter" && inputValue.trim()) {
1626
+ if (filteredSuggestions.length > 0) {
1627
+ return;
1628
+ }
1629
+ e.preventDefault();
1630
+ if (allowCustomTags) {
1631
+ addTag(inputValue);
1632
+ }
1633
+ } else if (e.key === "Backspace" && !inputValue && tags.length > 0) {
1634
+ removeTag(tags[tags.length - 1]);
1635
+ }
1636
+ }, [inputValue, tags, addTag, removeTag, allowCustomTags, filteredSuggestions]);
1637
+ const handlePaste = React21.useCallback((e) => {
1638
+ const pastedText = e.clipboardData.getData("text");
1639
+ if (TAG_SEPARATOR_PATTERN.test(pastedText)) {
1640
+ e.preventDefault();
1641
+ const newTags = pastedText.split(TAG_SEPARATOR_PATTERN).map((t) => t.trim()).filter((t) => t && !tags.includes(t));
1642
+ if (newTags.length > 0) {
1643
+ onChange([...tags, ...newTags]);
1644
+ }
1645
+ }
1646
+ }, [tags, onChange]);
1647
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
1648
+ className: classnames7__default.default(TextTagsInput_default.textTags, className),
1649
+ style,
1650
+ "data-loading": isLoading
1651
+ }, error && /* @__PURE__ */ React21__default.default.createElement("div", {
1652
+ className: shared_default.errorMessage
1653
+ }, "Error loading suggestions: ", error.message), /* @__PURE__ */ React21__default.default.createElement(Combobox.Root, {
1654
+ multiple: true,
1655
+ value: tags,
1656
+ onValueChange: handleValueChange,
1657
+ inputValue,
1658
+ onInputValueChange: handleInputValueChange
1659
+ }, tags.length > 0 && /* @__PURE__ */ React21__default.default.createElement("div", {
1660
+ className: shared_default.tagContainer
1661
+ }, tags.map((tag) => /* @__PURE__ */ React21__default.default.createElement(TagItem, {
1662
+ key: tag,
1663
+ tag,
1664
+ onRemove: removeTag
1665
+ }))), /* @__PURE__ */ React21__default.default.createElement(Combobox.Input, {
1666
+ className: TextTagsInput_default.input,
1667
+ placeholder: tags.length > 0 ? "" : placeholder,
1668
+ onKeyDown: handleKeyDown,
1669
+ onPaste: handlePaste,
1670
+ "aria-label": `Add ${propertyKey} tag`
1671
+ }), /* @__PURE__ */ React21__default.default.createElement(Combobox.Portal, null, /* @__PURE__ */ React21__default.default.createElement(Combobox.Positioner, null, /* @__PURE__ */ React21__default.default.createElement(Combobox.Popup, null, filteredSuggestions.length === 0 ? allowCustomTags && inputValue.trim() ? /* @__PURE__ */ React21__default.default.createElement(Combobox.Empty, null, 'Press Enter to add "', inputValue, '"') : /* @__PURE__ */ React21__default.default.createElement(Combobox.Empty, null, suggestionLimit ? "No suggestions" : "Type to add a tag") : filteredSuggestions.map(({
1672
+ value,
1673
+ count
1674
+ }) => /* @__PURE__ */ React21__default.default.createElement(Combobox.Item, {
1675
+ key: value,
1676
+ value
1677
+ }, value, " (", count.toLocaleString(), ")")))))), isLoading && !!suggestionLimit && /* @__PURE__ */ React21__default.default.createElement("div", {
1678
+ className: shared_default.loadingMessage
1679
+ }, "Loading suggestions..."));
1680
+ }
1681
+ var TextTagsInput = /* @__PURE__ */ React21.memo(TextTagsInputInner);
1682
+
1683
+ // src/filter-list/base/inputs/TimelineInput.module.css
1684
+ var TimelineInput_default = {};
1685
+
1686
+ // src/filter-list/base/inputs/TimelineInput.tsx
1687
+ function TimelineInputInner({
1688
+ startDate,
1689
+ endDate,
1690
+ onChange,
1691
+ className,
1692
+ minDate,
1693
+ maxDate
1694
+ }) {
1695
+ const handleStartChange = React21.useCallback((e) => {
1696
+ const date = parseDateFromInput(e.target.value);
1697
+ onChange(date, endDate);
1698
+ }, [onChange, endDate]);
1699
+ const handleEndChange = React21.useCallback((e) => {
1700
+ const date = parseDateFromInput(e.target.value);
1701
+ onChange(startDate, date);
1702
+ }, [onChange, startDate]);
1703
+ const handleClear = React21.useCallback(() => {
1704
+ onChange(void 0, void 0);
1705
+ }, [onChange]);
1706
+ const startInputMax = React21.useMemo(() => endDate ?? maxDate, [endDate, maxDate]);
1707
+ const endInputMin = React21.useMemo(() => startDate ?? minDate, [startDate, minDate]);
1708
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
1709
+ className: classnames7__default.default(TimelineInput_default.timeline, className)
1710
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
1711
+ className: TimelineInput_default.labels
1712
+ }, /* @__PURE__ */ React21__default.default.createElement("span", null, formatDateForDisplay(startDate, "\u2014")), /* @__PURE__ */ React21__default.default.createElement("span", null, "to"), /* @__PURE__ */ React21__default.default.createElement("span", null, formatDateForDisplay(endDate, "\u2014")), (startDate || endDate) && /* @__PURE__ */ React21__default.default.createElement(button.Button, {
1713
+ type: "button",
1714
+ className: TimelineInput_default.clearButton,
1715
+ onClick: handleClear,
1716
+ "aria-label": "Clear range"
1717
+ }, "\xD7")), /* @__PURE__ */ React21__default.default.createElement("div", {
1718
+ className: TimelineInput_default.brush
1719
+ }, /* @__PURE__ */ React21__default.default.createElement(input.Input, {
1720
+ type: "date",
1721
+ className: TimelineInput_default.input,
1722
+ value: formatDateForInput(startDate),
1723
+ onChange: handleStartChange,
1724
+ min: minDate ? formatDateForInput(minDate) : void 0,
1725
+ max: startInputMax ? formatDateForInput(startInputMax) : void 0,
1726
+ "aria-label": "Start date"
1727
+ }), /* @__PURE__ */ React21__default.default.createElement("span", null, "\u2014"), /* @__PURE__ */ React21__default.default.createElement(input.Input, {
1728
+ type: "date",
1729
+ className: TimelineInput_default.input,
1730
+ value: formatDateForInput(endDate),
1731
+ onChange: handleEndChange,
1732
+ min: endInputMin ? formatDateForInput(endInputMin) : void 0,
1733
+ max: maxDate ? formatDateForInput(maxDate) : void 0,
1734
+ "aria-label": "End date"
1735
+ })));
1736
+ }
1737
+ var TimelineInput = /* @__PURE__ */ React21.memo(TimelineInputInner);
1738
+
1739
+ // src/base-components/switch/Switch.module.css
1740
+ var Switch_default = {};
1741
+
1742
+ // src/base-components/switch/Switch.tsx
1743
+ function _extends7() {
1744
+ return _extends7 = Object.assign ? Object.assign.bind() : function(n) {
1745
+ for (var e = 1; e < arguments.length; e++) {
1746
+ var t = arguments[e];
1747
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
1748
+ }
1749
+ return n;
1750
+ }, _extends7.apply(null, arguments);
1751
+ }
1752
+ function Switch({
1753
+ className,
1754
+ thumbProps,
1755
+ ...rest
1756
+ }) {
1757
+ return /* @__PURE__ */ React21__default.default.createElement(_switch.Switch.Root, _extends7({
1758
+ className: classnames7__default.default(Switch_default.osdkSwitchRoot, className)
1759
+ }, rest), /* @__PURE__ */ React21__default.default.createElement(_switch.Switch.Thumb, _extends7({}, thumbProps, {
1760
+ className: classnames7__default.default(Switch_default.osdkSwitchThumb, thumbProps?.className)
1761
+ })));
1762
+ }
1763
+
1764
+ // src/filter-list/base/inputs/ToggleInput.module.css
1765
+ var ToggleInput_default = {};
1766
+
1767
+ // src/filter-list/base/inputs/ToggleInput.tsx
1768
+ function ToggleInputInner({
1769
+ enabled,
1770
+ onChange,
1771
+ label,
1772
+ className,
1773
+ style
1774
+ }) {
1775
+ const rootClassName = classnames7__default.default(ToggleInput_default.toggleInput, className);
1776
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
1777
+ className: rootClassName,
1778
+ style,
1779
+ "data-enabled": enabled
1780
+ }, /* @__PURE__ */ React21__default.default.createElement("label", {
1781
+ className: ToggleInput_default.toggleLabel
1782
+ }, /* @__PURE__ */ React21__default.default.createElement(Switch, {
1783
+ checked: enabled,
1784
+ onCheckedChange: onChange
1785
+ }), label && /* @__PURE__ */ React21__default.default.createElement("span", {
1786
+ className: ToggleInput_default.labelText
1787
+ }, label)));
1788
+ }
1789
+ var ToggleInput = /* @__PURE__ */ React21.memo(ToggleInputInner);
1790
+
1791
+ // src/filter-list/base/inputs/LinkedPropertyInput.tsx
1792
+ function LinkedPropertyInputInner({
1793
+ objectSet,
1794
+ definition,
1795
+ filterState,
1796
+ onFilterStateChanged,
1797
+ className,
1798
+ style
1799
+ }) {
1800
+ const linkedObjectSet = React21.useMemo(() => objectSet.pivotTo(definition.linkName), [objectSet, definition.linkName]);
1801
+ const linkedObjectType = linkedObjectSet.$objectSetInternals.def;
1802
+ const linkedPropertyKey = definition.linkedPropertyKey;
1803
+ const innerState = filterState?.type === "linkedProperty" ? filterState.linkedFilterState : void 0;
1804
+ const isExcluding = innerState?.isExcluding ?? false;
1805
+ const includeNull = innerState?.includeNull;
1806
+ const wrappedOnChange = React21.useCallback((innerFilterState) => {
1807
+ onFilterStateChanged({
1808
+ type: "linkedProperty",
1809
+ linkedFilterState: innerFilterState
1810
+ });
1811
+ }, [onFilterStateChanged]);
1812
+ const onSelectChange = React21.useCallback((selectedValues) => {
1813
+ wrappedOnChange({
1814
+ type: "SELECT",
1815
+ selectedValues,
1816
+ isExcluding
1817
+ });
1818
+ }, [wrappedOnChange, isExcluding]);
1819
+ const onSingleSelectChange = React21.useCallback((selectedValue) => {
1820
+ wrappedOnChange({
1821
+ type: "SELECT",
1822
+ selectedValues: selectedValue !== void 0 ? [selectedValue] : [],
1823
+ isExcluding
1824
+ });
1825
+ }, [wrappedOnChange, isExcluding]);
1826
+ const onContainsTextChange = React21.useCallback((value) => {
1827
+ wrappedOnChange({
1828
+ type: "CONTAINS_TEXT",
1829
+ value
1830
+ });
1831
+ }, [wrappedOnChange]);
1832
+ const onToggleChange = React21.useCallback((enabled) => {
1833
+ wrappedOnChange({
1834
+ type: "TOGGLE",
1835
+ enabled
1836
+ });
1837
+ }, [wrappedOnChange]);
1838
+ const onNumberRangeChange = React21.useCallback((minValue, maxValue) => {
1839
+ wrappedOnChange({
1840
+ type: "NUMBER_RANGE",
1841
+ minValue,
1842
+ maxValue,
1843
+ includeNull
1844
+ });
1845
+ }, [wrappedOnChange, includeNull]);
1846
+ const onDateRangeChange = React21.useCallback((minValue, maxValue) => {
1847
+ wrappedOnChange({
1848
+ type: "DATE_RANGE",
1849
+ minValue,
1850
+ maxValue,
1851
+ includeNull
1852
+ });
1853
+ }, [wrappedOnChange, includeNull]);
1854
+ const onExactMatchChange = React21.useCallback((values) => {
1855
+ wrappedOnChange({
1856
+ type: "EXACT_MATCH",
1857
+ values,
1858
+ isExcluding
1859
+ });
1860
+ }, [wrappedOnChange, isExcluding]);
1861
+ const onDateSelectChange = React21.useCallback((date) => {
1862
+ wrappedOnChange({
1863
+ type: "SELECT",
1864
+ selectedValues: date !== void 0 ? [date] : [],
1865
+ isExcluding
1866
+ });
1867
+ }, [wrappedOnChange, isExcluding]);
1868
+ const onMultiDateChange = React21.useCallback((dates) => {
1869
+ wrappedOnChange({
1870
+ type: "SELECT",
1871
+ selectedValues: dates
1872
+ });
1873
+ }, [wrappedOnChange]);
1874
+ const onTimelineChange = React21.useCallback((start, end) => {
1875
+ wrappedOnChange({
1876
+ type: "TIMELINE",
1877
+ startDate: start,
1878
+ endDate: end,
1879
+ isExcluding
1880
+ });
1881
+ }, [wrappedOnChange, isExcluding]);
1882
+ const selectStringValues = React21.useMemo(() => innerState?.type === "SELECT" ? coerceToStringArray(innerState.selectedValues) : [], [innerState]);
1883
+ const singleSelectValue = React21.useMemo(() => innerState?.type === "SELECT" ? coerceToString(innerState.selectedValues[0]) : void 0, [innerState]);
1884
+ const exactMatchValues = React21.useMemo(() => innerState?.type === "EXACT_MATCH" ? coerceToStringArray(innerState.values) : [], [innerState]);
1885
+ const selectedDates = React21.useMemo(() => innerState?.type === "SELECT" ? innerState.selectedValues.filter((v) => v instanceof Date) : [], [innerState]);
1886
+ const selectedDate = React21.useMemo(() => innerState?.type === "SELECT" && innerState.selectedValues[0] instanceof Date ? innerState.selectedValues[0] : void 0, [innerState]);
1887
+ const content = (() => {
1888
+ switch (definition.linkedFilterComponent) {
1889
+ case "CHECKBOX_LIST":
1890
+ return /* @__PURE__ */ React21__default.default.createElement(CheckboxListInput, {
1891
+ objectType: linkedObjectType,
1892
+ objectSet: linkedObjectSet,
1893
+ propertyKey: linkedPropertyKey,
1894
+ selectedValues: selectStringValues,
1895
+ onChange: onSelectChange
1896
+ });
1897
+ case "MULTI_SELECT":
1898
+ return /* @__PURE__ */ React21__default.default.createElement(MultiSelectInput, {
1899
+ objectType: linkedObjectType,
1900
+ objectSet: linkedObjectSet,
1901
+ propertyKey: linkedPropertyKey,
1902
+ selectedValues: selectStringValues,
1903
+ onChange: onSelectChange
1904
+ });
1905
+ case "SINGLE_SELECT":
1906
+ return /* @__PURE__ */ React21__default.default.createElement(SingleSelectInput, {
1907
+ objectType: linkedObjectType,
1908
+ objectSet: linkedObjectSet,
1909
+ propertyKey: linkedPropertyKey,
1910
+ selectedValue: singleSelectValue,
1911
+ onChange: onSingleSelectChange
1912
+ });
1913
+ case "CONTAINS_TEXT":
1914
+ return /* @__PURE__ */ React21__default.default.createElement(ContainsTextInput, {
1915
+ value: innerState?.type === "CONTAINS_TEXT" ? innerState.value : void 0,
1916
+ onChange: onContainsTextChange,
1917
+ placeholder: `Search ${String(definition.linkedPropertyKey)}...`
1918
+ });
1919
+ case "TOGGLE":
1920
+ return /* @__PURE__ */ React21__default.default.createElement(ToggleInput, {
1921
+ enabled: innerState?.type === "TOGGLE" ? innerState.enabled : false,
1922
+ onChange: onToggleChange
1923
+ });
1924
+ case "NUMBER_RANGE": {
1925
+ const numberRange = innerState?.type === "NUMBER_RANGE" ? innerState : void 0;
1926
+ return /* @__PURE__ */ React21__default.default.createElement(NumberRangeInput, {
1927
+ objectType: linkedObjectType,
1928
+ objectSet: linkedObjectSet,
1929
+ propertyKey: linkedPropertyKey,
1930
+ minValue: numberRange?.minValue,
1931
+ maxValue: numberRange?.maxValue,
1932
+ onChange: onNumberRangeChange
1933
+ });
1934
+ }
1935
+ case "DATE_RANGE": {
1936
+ const dateRange = innerState?.type === "DATE_RANGE" ? innerState : void 0;
1937
+ return /* @__PURE__ */ React21__default.default.createElement(DateRangeInput, {
1938
+ objectType: linkedObjectType,
1939
+ objectSet: linkedObjectSet,
1940
+ propertyKey: linkedPropertyKey,
1941
+ minValue: dateRange?.minValue,
1942
+ maxValue: dateRange?.maxValue,
1943
+ onChange: onDateRangeChange
1944
+ });
1945
+ }
1946
+ case "LISTOGRAM":
1947
+ return /* @__PURE__ */ React21__default.default.createElement(ListogramInput, {
1948
+ objectType: linkedObjectType,
1949
+ objectSet: linkedObjectSet,
1950
+ propertyKey: linkedPropertyKey,
1951
+ selectedValues: exactMatchValues,
1952
+ onChange: onExactMatchChange
1953
+ });
1954
+ case "TEXT_TAGS":
1955
+ return /* @__PURE__ */ React21__default.default.createElement(TextTagsInput, {
1956
+ objectType: linkedObjectType,
1957
+ objectSet: linkedObjectSet,
1958
+ propertyKey: linkedPropertyKey,
1959
+ tags: exactMatchValues,
1960
+ onChange: onExactMatchChange
1961
+ });
1962
+ case "SINGLE_DATE":
1963
+ return /* @__PURE__ */ React21__default.default.createElement(SingleDateInput, {
1964
+ selectedDate,
1965
+ onChange: onDateSelectChange,
1966
+ showClearButton: true
1967
+ });
1968
+ case "MULTI_DATE":
1969
+ return /* @__PURE__ */ React21__default.default.createElement(MultiDateInput, {
1970
+ selectedDates,
1971
+ onChange: onMultiDateChange,
1972
+ showClearAll: true
1973
+ });
1974
+ case "TIMELINE": {
1975
+ const timeline = innerState?.type === "TIMELINE" ? innerState : void 0;
1976
+ return /* @__PURE__ */ React21__default.default.createElement(TimelineInput, {
1977
+ startDate: timeline?.startDate,
1978
+ endDate: timeline?.endDate,
1979
+ onChange: onTimelineChange
1980
+ });
1981
+ }
1982
+ default:
1983
+ return assertUnreachable(definition.linkedFilterComponent);
1984
+ }
1985
+ })();
1986
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
1987
+ className: classnames7__default.default(LinkedPropertyInput_default.linkedProperty, className),
1988
+ style
1989
+ }, content);
1990
+ }
1991
+ var LinkedPropertyInput = /* @__PURE__ */ React21.memo(LinkedPropertyInputInner);
1992
+
1993
+ // src/filter-list/base/inputs/NullValueWrapper.module.css
1994
+ var NullValueWrapper_default = {};
1995
+
1996
+ // src/filter-list/base/inputs/NullValueWrapper.tsx
1997
+ function NullValueWrapperInner({
1998
+ objectType,
1999
+ propertyKey,
2000
+ includeNull = false,
2001
+ onIncludeNullChange,
2002
+ showNullCount = true,
2003
+ children,
2004
+ className,
2005
+ style
2006
+ }) {
2007
+ const nullCountAggregateOptions = React21.useMemo(() => createNullCountAggregateOptions(), []);
2008
+ const nullWhereClause = React21.useMemo(() => createNullWhereClause(propertyKey), [propertyKey]);
2009
+ const {
2010
+ data: nullCountData,
2011
+ isLoading,
2012
+ error
2013
+ } = experimental.useOsdkAggregation(objectType, {
2014
+ where: nullWhereClause,
2015
+ aggregate: nullCountAggregateOptions
2016
+ });
2017
+ const nullCount = React21.useMemo(() => {
2018
+ if (!nullCountData) return 0;
2019
+ const result = nullCountData;
2020
+ if ("$count" in result && typeof result.$count === "number") {
2021
+ return result.$count;
2022
+ }
2023
+ return 0;
2024
+ }, [nullCountData]);
2025
+ const handleToggle = React21.useCallback(() => {
2026
+ onIncludeNullChange(!includeNull);
2027
+ }, [includeNull, onIncludeNullChange]);
2028
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
2029
+ className: classnames7__default.default(NullValueWrapper_default.nullWrapper, className),
2030
+ style
2031
+ }, children, /* @__PURE__ */ React21__default.default.createElement("div", {
2032
+ className: NullValueWrapper_default.nullValueRow,
2033
+ "data-checked": includeNull,
2034
+ "data-loading": isLoading
2035
+ }, /* @__PURE__ */ React21__default.default.createElement("label", {
2036
+ className: NullValueWrapper_default.nullLabel
2037
+ }, /* @__PURE__ */ React21__default.default.createElement(Checkbox, {
2038
+ checked: includeNull,
2039
+ onCheckedChange: handleToggle
2040
+ }), /* @__PURE__ */ React21__default.default.createElement("span", {
2041
+ className: NullValueWrapper_default.nullLabelText
2042
+ }, "No value")), showNullCount && !error && nullCount > 0 && /* @__PURE__ */ React21__default.default.createElement("span", {
2043
+ className: NullValueWrapper_default.count
2044
+ }, nullCount.toLocaleString())), error && /* @__PURE__ */ React21__default.default.createElement("div", {
2045
+ className: shared_default.errorMessage
2046
+ }, "Failed to load null count"));
2047
+ }
2048
+ var NullValueWrapper = /* @__PURE__ */ React21.memo(NullValueWrapperInner);
2049
+
2050
+ // src/filter-list/base/FilterInput.tsx
2051
+ function FilterInputInner({
2052
+ objectType,
2053
+ objectSet,
2054
+ definition,
2055
+ filterState,
2056
+ onFilterStateChanged,
2057
+ whereClause
2058
+ }) {
2059
+ return /* @__PURE__ */ React21__default.default.createElement(FilterInputContent, {
2060
+ objectType,
2061
+ objectSet,
2062
+ definition,
2063
+ filterState,
2064
+ onFilterStateChanged,
2065
+ whereClause
2066
+ });
2067
+ }
2068
+ var FilterInput = /* @__PURE__ */ React21.memo(FilterInputInner);
2069
+ function FilterInputContent({
2070
+ objectType,
2071
+ objectSet,
2072
+ definition,
2073
+ filterState,
2074
+ onFilterStateChanged,
2075
+ whereClause
2076
+ }) {
2077
+ switch (definition.type) {
2078
+ case "HAS_LINK":
2079
+ return /* @__PURE__ */ React21__default.default.createElement(HasLinkInput, {
2080
+ filterState,
2081
+ onFilterStateChanged
2082
+ });
2083
+ case "LINKED_PROPERTY":
2084
+ return /* @__PURE__ */ React21__default.default.createElement(LinkedPropertyInput, {
2085
+ objectSet,
2086
+ definition,
2087
+ filterState,
2088
+ onFilterStateChanged
2089
+ });
2090
+ case "KEYWORD_SEARCH":
2091
+ return /* @__PURE__ */ React21__default.default.createElement(KeywordSearchInput, {
2092
+ filterState,
2093
+ onFilterStateChanged,
2094
+ placeholder: definition.label ?? "Search..."
2095
+ });
2096
+ case "CUSTOM": {
2097
+ if (!definition.renderInput) {
2098
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
2099
+ "data-unsupported": "true"
2100
+ }, "Custom filter missing renderInput");
2101
+ }
2102
+ const customFilterState = filterState?.type === "custom" ? filterState : definition.filterState;
2103
+ return /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, definition.renderInput({
2104
+ objectSet,
2105
+ filterState: customFilterState,
2106
+ onFilterStateChanged: (state) => onFilterStateChanged(state)
2107
+ }));
2108
+ }
2109
+ case "PROPERTY":
2110
+ return /* @__PURE__ */ React21__default.default.createElement(PropertyFilterInput, {
2111
+ objectType,
2112
+ objectSet,
2113
+ definition,
2114
+ filterState,
2115
+ onFilterStateChanged,
2116
+ whereClause
2117
+ });
2118
+ default:
2119
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
2120
+ "data-unsupported": "true"
2121
+ }, "Unsupported filter type");
2122
+ }
2123
+ }
2124
+ var HasLinkInput = /* @__PURE__ */ React21.memo(function HasLinkInput2({
2125
+ filterState,
2126
+ onFilterStateChanged
2127
+ }) {
2128
+ const hasLink = filterState?.type === "hasLink" ? filterState.hasLink : false;
2129
+ const handleChange = React21.useCallback((hasLink2) => {
2130
+ onFilterStateChanged({
2131
+ type: "hasLink",
2132
+ hasLink: hasLink2
2133
+ });
2134
+ }, [onFilterStateChanged]);
2135
+ return /* @__PURE__ */ React21__default.default.createElement(ToggleInput, {
2136
+ enabled: hasLink,
2137
+ onChange: handleChange
2138
+ });
2139
+ });
2140
+ var KeywordSearchInput = /* @__PURE__ */ React21.memo(function KeywordSearchInput2({
2141
+ filterState,
2142
+ onFilterStateChanged,
2143
+ placeholder
2144
+ }) {
2145
+ const searchTerm = filterState?.type === "keywordSearch" ? filterState.searchTerm : void 0;
2146
+ const operator = filterState?.type === "keywordSearch" ? filterState.operator : "AND";
2147
+ const handleChange = React21.useCallback((newSearchTerm) => {
2148
+ onFilterStateChanged({
2149
+ type: "keywordSearch",
2150
+ searchTerm: newSearchTerm ?? "",
2151
+ operator
2152
+ });
2153
+ }, [onFilterStateChanged, operator]);
2154
+ return /* @__PURE__ */ React21__default.default.createElement(ContainsTextInput, {
2155
+ value: searchTerm,
2156
+ onChange: handleChange,
2157
+ placeholder
2158
+ });
2159
+ });
2160
+ function PropertyFilterInputInner({
2161
+ objectType,
2162
+ objectSet,
2163
+ definition,
2164
+ filterState,
2165
+ onFilterStateChanged,
2166
+ whereClause
2167
+ }) {
2168
+ switch (definition.filterComponent) {
2169
+ case "CHECKBOX_LIST":
2170
+ return /* @__PURE__ */ React21__default.default.createElement(CheckboxListFilterInput, {
2171
+ objectType,
2172
+ objectSet,
2173
+ propertyKey: definition.key,
2174
+ filterState,
2175
+ onFilterStateChanged,
2176
+ whereClause
2177
+ });
2178
+ case "CONTAINS_TEXT":
2179
+ return /* @__PURE__ */ React21__default.default.createElement(ContainsTextFilterInput, {
2180
+ propertyKey: definition.key,
2181
+ filterState,
2182
+ onFilterStateChanged
2183
+ });
2184
+ case "TOGGLE":
2185
+ return /* @__PURE__ */ React21__default.default.createElement(ToggleFilterInput, {
2186
+ filterState,
2187
+ onFilterStateChanged
2188
+ });
2189
+ case "NUMBER_RANGE":
2190
+ return /* @__PURE__ */ React21__default.default.createElement(NumberRangeFilterInput, {
2191
+ objectType,
2192
+ propertyKey: definition.key,
2193
+ filterState,
2194
+ onFilterStateChanged
2195
+ });
2196
+ case "DATE_RANGE":
2197
+ return /* @__PURE__ */ React21__default.default.createElement(DateRangeFilterInput, {
2198
+ objectType,
2199
+ propertyKey: definition.key,
2200
+ filterState,
2201
+ onFilterStateChanged
2202
+ });
2203
+ case "SINGLE_SELECT":
2204
+ return /* @__PURE__ */ React21__default.default.createElement(SingleSelectFilterInput, {
2205
+ objectType,
2206
+ propertyKey: definition.key,
2207
+ filterState,
2208
+ onFilterStateChanged,
2209
+ whereClause
2210
+ });
2211
+ case "MULTI_SELECT":
2212
+ return /* @__PURE__ */ React21__default.default.createElement(MultiSelectFilterInput, {
2213
+ objectType,
2214
+ propertyKey: definition.key,
2215
+ filterState,
2216
+ onFilterStateChanged,
2217
+ whereClause
2218
+ });
2219
+ case "SINGLE_DATE":
2220
+ return /* @__PURE__ */ React21__default.default.createElement(SingleDateFilterInput, {
2221
+ filterState,
2222
+ onFilterStateChanged
2223
+ });
2224
+ case "MULTI_DATE":
2225
+ return /* @__PURE__ */ React21__default.default.createElement(MultiDateFilterInput, {
2226
+ filterState,
2227
+ onFilterStateChanged
2228
+ });
2229
+ case "LISTOGRAM":
2230
+ return /* @__PURE__ */ React21__default.default.createElement(ListogramFilterInput, {
2231
+ objectType,
2232
+ propertyKey: definition.key,
2233
+ filterState,
2234
+ onFilterStateChanged,
2235
+ whereClause
2236
+ });
2237
+ case "TEXT_TAGS":
2238
+ return /* @__PURE__ */ React21__default.default.createElement(TextTagsFilterInput, {
2239
+ objectType,
2240
+ propertyKey: definition.key,
2241
+ filterState,
2242
+ onFilterStateChanged,
2243
+ whereClause
2244
+ });
2245
+ case "TIMELINE":
2246
+ return /* @__PURE__ */ React21__default.default.createElement(TimelineFilterInput, {
2247
+ filterState,
2248
+ onFilterStateChanged
2249
+ });
2250
+ default:
2251
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
2252
+ "data-unsupported": "true"
2253
+ }, "Unsupported filter component: ", definition.filterComponent);
2254
+ }
2255
+ }
2256
+ var PropertyFilterInput = /* @__PURE__ */ React21.memo(PropertyFilterInputInner);
2257
+ function CheckboxListFilterInputInner({
2258
+ objectType,
2259
+ objectSet,
2260
+ propertyKey,
2261
+ filterState,
2262
+ onFilterStateChanged,
2263
+ whereClause
2264
+ }) {
2265
+ const selectedValues = React21.useMemo(() => filterState?.type === "SELECT" ? coerceToStringArray(filterState.selectedValues) : [], [filterState]);
2266
+ const isExcluding = filterState?.isExcluding ?? false;
2267
+ const handleChange = React21.useCallback((newSelectedValues) => {
2268
+ onFilterStateChanged({
2269
+ type: "SELECT",
2270
+ selectedValues: newSelectedValues,
2271
+ isExcluding
2272
+ });
2273
+ }, [onFilterStateChanged, isExcluding]);
2274
+ return /* @__PURE__ */ React21__default.default.createElement(CheckboxListInput, {
2275
+ objectType,
2276
+ objectSet,
2277
+ propertyKey,
2278
+ selectedValues,
2279
+ onChange: handleChange,
2280
+ whereClause
2281
+ });
2282
+ }
2283
+ var CheckboxListFilterInput = /* @__PURE__ */ React21.memo(CheckboxListFilterInputInner);
2284
+ var ContainsTextFilterInput = /* @__PURE__ */ React21.memo(function ContainsTextFilterInput2({
2285
+ propertyKey,
2286
+ filterState,
2287
+ onFilterStateChanged
2288
+ }) {
2289
+ const value = React21.useMemo(() => filterState?.type === "CONTAINS_TEXT" ? filterState.value : void 0, [filterState]);
2290
+ const handleChange = React21.useCallback((value2) => {
2291
+ onFilterStateChanged({
2292
+ type: "CONTAINS_TEXT",
2293
+ value: value2
2294
+ });
2295
+ }, [onFilterStateChanged]);
2296
+ return /* @__PURE__ */ React21__default.default.createElement(ContainsTextInput, {
2297
+ value,
2298
+ onChange: handleChange,
2299
+ placeholder: `Search ${propertyKey}...`
2300
+ });
2301
+ });
2302
+ var ToggleFilterInput = /* @__PURE__ */ React21.memo(function ToggleFilterInput2({
2303
+ filterState,
2304
+ onFilterStateChanged
2305
+ }) {
2306
+ const enabled = filterState?.type === "TOGGLE" ? filterState.enabled : false;
2307
+ const handleChange = React21.useCallback((enabled2) => {
2308
+ onFilterStateChanged({
2309
+ type: "TOGGLE",
2310
+ enabled: enabled2
2311
+ });
2312
+ }, [onFilterStateChanged]);
2313
+ return /* @__PURE__ */ React21__default.default.createElement(ToggleInput, {
2314
+ enabled,
2315
+ onChange: handleChange
2316
+ });
2317
+ });
2318
+ function NumberRangeFilterInputInner({
2319
+ objectType,
2320
+ propertyKey,
2321
+ filterState,
2322
+ onFilterStateChanged
2323
+ }) {
2324
+ const numberRangeState = React21.useMemo(() => filterState?.type === "NUMBER_RANGE" ? filterState : void 0, [filterState]);
2325
+ const includeNull = filterState?.includeNull;
2326
+ const handleNullChange = React21.useCallback((includeNull2) => {
2327
+ onFilterStateChanged({
2328
+ type: "NUMBER_RANGE",
2329
+ minValue: numberRangeState?.minValue,
2330
+ maxValue: numberRangeState?.maxValue,
2331
+ includeNull: includeNull2
2332
+ });
2333
+ }, [onFilterStateChanged, numberRangeState?.minValue, numberRangeState?.maxValue]);
2334
+ const handleRangeChange = React21.useCallback((minValue, maxValue) => {
2335
+ onFilterStateChanged({
2336
+ type: "NUMBER_RANGE",
2337
+ minValue,
2338
+ maxValue,
2339
+ includeNull
2340
+ });
2341
+ }, [onFilterStateChanged, includeNull]);
2342
+ return /* @__PURE__ */ React21__default.default.createElement(NullValueWrapper, {
2343
+ objectType,
2344
+ propertyKey,
2345
+ includeNull,
2346
+ onIncludeNullChange: handleNullChange
2347
+ }, /* @__PURE__ */ React21__default.default.createElement(NumberRangeInput, {
2348
+ objectType,
2349
+ propertyKey,
2350
+ minValue: numberRangeState?.minValue,
2351
+ maxValue: numberRangeState?.maxValue,
2352
+ onChange: handleRangeChange
2353
+ }));
2354
+ }
2355
+ var NumberRangeFilterInput = /* @__PURE__ */ React21.memo(NumberRangeFilterInputInner);
2356
+ function DateRangeFilterInputInner({
2357
+ objectType,
2358
+ propertyKey,
2359
+ filterState,
2360
+ onFilterStateChanged
2361
+ }) {
2362
+ const dateRangeState = React21.useMemo(() => filterState?.type === "DATE_RANGE" ? filterState : void 0, [filterState]);
2363
+ const includeNull = filterState?.includeNull;
2364
+ const handleNullChange = React21.useCallback((includeNull2) => {
2365
+ onFilterStateChanged({
2366
+ type: "DATE_RANGE",
2367
+ minValue: dateRangeState?.minValue,
2368
+ maxValue: dateRangeState?.maxValue,
2369
+ includeNull: includeNull2
2370
+ });
2371
+ }, [onFilterStateChanged, dateRangeState?.minValue, dateRangeState?.maxValue]);
2372
+ const handleRangeChange = React21.useCallback((minValue, maxValue) => {
2373
+ onFilterStateChanged({
2374
+ type: "DATE_RANGE",
2375
+ minValue,
2376
+ maxValue,
2377
+ includeNull
2378
+ });
2379
+ }, [onFilterStateChanged, includeNull]);
2380
+ return /* @__PURE__ */ React21__default.default.createElement(NullValueWrapper, {
2381
+ objectType,
2382
+ propertyKey,
2383
+ includeNull,
2384
+ onIncludeNullChange: handleNullChange
2385
+ }, /* @__PURE__ */ React21__default.default.createElement(DateRangeInput, {
2386
+ objectType,
2387
+ propertyKey,
2388
+ minValue: dateRangeState?.minValue,
2389
+ maxValue: dateRangeState?.maxValue,
2390
+ onChange: handleRangeChange
2391
+ }));
2392
+ }
2393
+ var DateRangeFilterInput = /* @__PURE__ */ React21.memo(DateRangeFilterInputInner);
2394
+ function SingleSelectFilterInputInner({
2395
+ objectType,
2396
+ propertyKey,
2397
+ filterState,
2398
+ onFilterStateChanged,
2399
+ whereClause
2400
+ }) {
2401
+ const selectedValue = React21.useMemo(() => filterState?.type === "SELECT" ? coerceToString(filterState.selectedValues[0]) : void 0, [filterState]);
2402
+ const isExcluding = filterState?.isExcluding ?? false;
2403
+ const handleChange = React21.useCallback((value) => {
2404
+ onFilterStateChanged({
2405
+ type: "SELECT",
2406
+ selectedValues: value !== void 0 ? [value] : [],
2407
+ isExcluding
2408
+ });
2409
+ }, [onFilterStateChanged, isExcluding]);
2410
+ return /* @__PURE__ */ React21__default.default.createElement(SingleSelectInput, {
2411
+ objectType,
2412
+ propertyKey,
2413
+ selectedValue,
2414
+ onChange: handleChange,
2415
+ whereClause
2416
+ });
2417
+ }
2418
+ var SingleSelectFilterInput = /* @__PURE__ */ React21.memo(SingleSelectFilterInputInner);
2419
+ function MultiSelectFilterInputInner({
2420
+ objectType,
2421
+ propertyKey,
2422
+ filterState,
2423
+ onFilterStateChanged,
2424
+ whereClause
2425
+ }) {
2426
+ const selectedValues = React21.useMemo(() => filterState?.type === "SELECT" ? coerceToStringArray(filterState.selectedValues) : [], [filterState]);
2427
+ const isExcluding = filterState?.isExcluding ?? false;
2428
+ const handleChange = React21.useCallback((selectedValues2) => {
2429
+ onFilterStateChanged({
2430
+ type: "SELECT",
2431
+ selectedValues: selectedValues2,
2432
+ isExcluding
2433
+ });
2434
+ }, [onFilterStateChanged, isExcluding]);
2435
+ return /* @__PURE__ */ React21__default.default.createElement(MultiSelectInput, {
2436
+ objectType,
2437
+ propertyKey,
2438
+ selectedValues,
2439
+ onChange: handleChange,
2440
+ whereClause
2441
+ });
2442
+ }
2443
+ var MultiSelectFilterInput = /* @__PURE__ */ React21.memo(MultiSelectFilterInputInner);
2444
+ var SingleDateFilterInput = /* @__PURE__ */ React21.memo(function SingleDateFilterInput2({
2445
+ filterState,
2446
+ onFilterStateChanged
2447
+ }) {
2448
+ const selectedDate = React21.useMemo(() => filterState?.type === "SELECT" ? filterState.selectedValues[0] instanceof Date ? filterState.selectedValues[0] : void 0 : void 0, [filterState]);
2449
+ const isExcluding = filterState?.isExcluding ?? false;
2450
+ const handleChange = React21.useCallback((selectedDate2) => {
2451
+ onFilterStateChanged({
2452
+ type: "SELECT",
2453
+ selectedValues: selectedDate2 !== void 0 ? [selectedDate2] : [],
2454
+ isExcluding
2455
+ });
2456
+ }, [onFilterStateChanged, isExcluding]);
2457
+ return /* @__PURE__ */ React21__default.default.createElement(SingleDateInput, {
2458
+ selectedDate,
2459
+ onChange: handleChange
2460
+ });
2461
+ });
2462
+ var MultiDateFilterInput = /* @__PURE__ */ React21.memo(function MultiDateFilterInput2({
2463
+ filterState,
2464
+ onFilterStateChanged
2465
+ }) {
2466
+ const selectedDates = React21.useMemo(() => filterState?.type === "SELECT" ? filterState.selectedValues.filter((v) => v instanceof Date) : [], [filterState]);
2467
+ const isExcluding = filterState?.isExcluding ?? false;
2468
+ const handleChange = React21.useCallback((selectedDates2) => {
2469
+ onFilterStateChanged({
2470
+ type: "SELECT",
2471
+ selectedValues: selectedDates2,
2472
+ isExcluding
2473
+ });
2474
+ }, [onFilterStateChanged, isExcluding]);
2475
+ return /* @__PURE__ */ React21__default.default.createElement(MultiDateInput, {
2476
+ selectedDates,
2477
+ onChange: handleChange
2478
+ });
2479
+ });
2480
+ function ListogramFilterInputInner({
2481
+ objectType,
2482
+ propertyKey,
2483
+ filterState,
2484
+ onFilterStateChanged,
2485
+ whereClause
2486
+ }) {
2487
+ const selectedValues = React21.useMemo(() => filterState?.type === "EXACT_MATCH" ? coerceToStringArray(filterState.values) : [], [filterState]);
2488
+ const isExcluding = filterState?.isExcluding ?? false;
2489
+ const handleChange = React21.useCallback((values) => {
2490
+ onFilterStateChanged({
2491
+ type: "EXACT_MATCH",
2492
+ values,
2493
+ isExcluding
2494
+ });
2495
+ }, [onFilterStateChanged, isExcluding]);
2496
+ return /* @__PURE__ */ React21__default.default.createElement(ListogramInput, {
2497
+ objectType,
2498
+ propertyKey,
2499
+ selectedValues,
2500
+ onChange: handleChange,
2501
+ whereClause
2502
+ });
2503
+ }
2504
+ var ListogramFilterInput = /* @__PURE__ */ React21.memo(ListogramFilterInputInner);
2505
+ function TextTagsFilterInputInner({
2506
+ objectType,
2507
+ propertyKey,
2508
+ filterState,
2509
+ onFilterStateChanged,
2510
+ whereClause
2511
+ }) {
2512
+ const tags = React21.useMemo(() => filterState?.type === "EXACT_MATCH" ? coerceToStringArray(filterState.values) : [], [filterState]);
2513
+ const isExcluding = filterState?.isExcluding ?? false;
2514
+ const handleChange = React21.useCallback((values) => {
2515
+ onFilterStateChanged({
2516
+ type: "EXACT_MATCH",
2517
+ values,
2518
+ isExcluding
2519
+ });
2520
+ }, [onFilterStateChanged, isExcluding]);
2521
+ return /* @__PURE__ */ React21__default.default.createElement(TextTagsInput, {
2522
+ objectType,
2523
+ propertyKey,
2524
+ tags,
2525
+ onChange: handleChange,
2526
+ whereClause
2527
+ });
2528
+ }
2529
+ var TextTagsFilterInput = /* @__PURE__ */ React21.memo(TextTagsFilterInputInner);
2530
+ var TimelineFilterInput = /* @__PURE__ */ React21.memo(function TimelineFilterInput2({
2531
+ filterState,
2532
+ onFilterStateChanged
2533
+ }) {
2534
+ const {
2535
+ startDate,
2536
+ endDate
2537
+ } = React21.useMemo(() => filterState?.type === "TIMELINE" ? {
2538
+ startDate: filterState.startDate,
2539
+ endDate: filterState.endDate
2540
+ } : {
2541
+ startDate: void 0,
2542
+ endDate: void 0
2543
+ }, [filterState]);
2544
+ const isExcluding = filterState?.isExcluding ?? false;
2545
+ const handleChange = React21.useCallback((startDate2, endDate2) => {
2546
+ onFilterStateChanged({
2547
+ type: "TIMELINE",
2548
+ startDate: startDate2,
2549
+ endDate: endDate2,
2550
+ isExcluding
2551
+ });
2552
+ }, [onFilterStateChanged, isExcluding]);
2553
+ return /* @__PURE__ */ React21__default.default.createElement(TimelineInput, {
2554
+ startDate,
2555
+ endDate,
2556
+ onChange: handleChange
2557
+ });
2558
+ });
2559
+
2560
+ // src/filter-list/base/FilterListItem.module.css
2561
+ var FilterListItem_default = {};
2562
+
2563
+ // src/filter-list/base/FilterListItem.tsx
2564
+ function FilterListItemInner({
2565
+ objectType,
2566
+ objectSet,
2567
+ definition,
2568
+ filterKey,
2569
+ filterState,
2570
+ onFilterStateChanged,
2571
+ whereClause,
2572
+ className,
2573
+ style
2574
+ }) {
2575
+ const label = getLabel(definition);
2576
+ const handleFilterStateChanged = React21.useCallback((newState) => {
2577
+ onFilterStateChanged(filterKey, newState);
2578
+ }, [filterKey, onFilterStateChanged]);
2579
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
2580
+ className: classnames7__default.default(FilterListItem_default.filterItem, className),
2581
+ style,
2582
+ "data-filter-type": definition.type
2583
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
2584
+ className: FilterListItem_default.itemHeader
2585
+ }, /* @__PURE__ */ React21__default.default.createElement("span", {
2586
+ className: FilterListItem_default.itemLabel
2587
+ }, label)), /* @__PURE__ */ React21__default.default.createElement("div", {
2588
+ className: FilterListItem_default.itemContent
2589
+ }, /* @__PURE__ */ React21__default.default.createElement(ErrorBoundary, {
2590
+ errorMessage: "Error loading filter"
2591
+ }, /* @__PURE__ */ React21__default.default.createElement(FilterInput, {
2592
+ objectType,
2593
+ objectSet,
2594
+ definition,
2595
+ filterState,
2596
+ onFilterStateChanged: handleFilterStateChanged,
2597
+ whereClause
2598
+ }))));
2599
+ }
2600
+ var FilterListItem = /* @__PURE__ */ React21.memo(FilterListItemInner);
2601
+ function getLabel(definition) {
2602
+ if ("label" in definition && definition.label) {
2603
+ return definition.label;
2604
+ }
2605
+ switch (definition.type) {
2606
+ case "PROPERTY":
2607
+ return definition.key;
2608
+ case "HAS_LINK":
2609
+ case "LINKED_PROPERTY":
2610
+ return definition.linkName;
2611
+ case "KEYWORD_SEARCH":
2612
+ return "Search";
2613
+ case "CUSTOM":
2614
+ return definition.key;
2615
+ }
2616
+ }
2617
+
2618
+ // src/filter-list/base/FilterListContent.tsx
2619
+ function FilterListContent({
2620
+ objectType,
2621
+ objectSet,
2622
+ filterDefinitions,
2623
+ filterStates,
2624
+ onFilterStateChanged,
2625
+ whereClause,
2626
+ className,
2627
+ style
2628
+ }) {
2629
+ if (!filterDefinitions || filterDefinitions.length === 0) {
2630
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
2631
+ className: classnames7__default.default(FilterListContent_default.content, className),
2632
+ style,
2633
+ "data-empty": "true"
2634
+ });
2635
+ }
2636
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
2637
+ className: classnames7__default.default(FilterListContent_default.content, className),
2638
+ style
2639
+ }, filterDefinitions.map((definition, index) => {
2640
+ const filterKey = getFilterKey(definition);
2641
+ const state = filterStates.get(filterKey);
2642
+ return /* @__PURE__ */ React21__default.default.createElement(FilterListItem, {
2643
+ key: filterKey,
2644
+ objectType,
2645
+ objectSet,
2646
+ definition,
2647
+ filterKey,
2648
+ filterState: state,
2649
+ onFilterStateChanged,
2650
+ whereClause
2651
+ });
2652
+ }));
2653
+ }
2654
+
2655
+ // src/filter-list/base/FilterListHeader.module.css
2656
+ var FilterListHeader_default = {};
2657
+
2658
+ // src/filter-list/base/FilterListHeader.tsx
2659
+ function FilterListHeaderInner({
2660
+ title,
2661
+ titleIcon,
2662
+ collapsed = false,
2663
+ onCollapsedChange,
2664
+ showResetButton,
2665
+ onReset,
2666
+ showActiveFilterCount,
2667
+ activeFilterCount = 0
2668
+ }) {
2669
+ const showCollapseButton = onCollapsedChange != null;
2670
+ const handleCollapseClick = React21.useCallback(() => {
2671
+ onCollapsedChange?.(!collapsed);
2672
+ }, [onCollapsedChange, collapsed]);
2673
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
2674
+ className: FilterListHeader_default.header
2675
+ }, showCollapseButton && /* @__PURE__ */ React21__default.default.createElement(button.Button, {
2676
+ className: FilterListHeader_default.collapseButton,
2677
+ onClick: handleCollapseClick,
2678
+ "aria-expanded": !collapsed,
2679
+ "aria-label": collapsed ? "Expand filters" : "Collapse filters"
2680
+ }, /* @__PURE__ */ React21__default.default.createElement("span", {
2681
+ className: FilterListHeader_default.collapseIcon,
2682
+ "data-collapsed": collapsed
2683
+ })), !collapsed && /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement("div", {
2684
+ className: FilterListHeader_default.titleContainer
2685
+ }, titleIcon && /* @__PURE__ */ React21__default.default.createElement("span", {
2686
+ className: FilterListHeader_default.titleIcon
2687
+ }, titleIcon), title && /* @__PURE__ */ React21__default.default.createElement("span", {
2688
+ className: FilterListHeader_default.title
2689
+ }, title), showActiveFilterCount && activeFilterCount > 0 && /* @__PURE__ */ React21__default.default.createElement("span", {
2690
+ className: FilterListHeader_default.activeCount
2691
+ }, "(", activeFilterCount, ")")), showResetButton && /* @__PURE__ */ React21__default.default.createElement(button.Button, {
2692
+ className: FilterListHeader_default.resetButton,
2693
+ onClick: onReset,
2694
+ disabled: activeFilterCount === 0
2695
+ }, "Reset")));
2696
+ }
2697
+ var FilterListHeader = /* @__PURE__ */ React21.memo(FilterListHeaderInner);
2698
+
2699
+ // src/filter-list/base/FilterList.tsx
2700
+ function FilterList(props) {
2701
+ const {
2702
+ objectSet,
2703
+ title,
2704
+ titleIcon,
2705
+ filterDefinitions,
2706
+ showResetButton = false,
2707
+ onReset,
2708
+ onFilterAdded,
2709
+ showActiveFilterCount = false,
2710
+ className,
2711
+ renderAddFilterButton
2712
+ } = props;
2713
+ const objectType = objectSet.$objectSetInternals.def;
2714
+ const {
2715
+ filterStates,
2716
+ setFilterState,
2717
+ whereClause,
2718
+ activeFilterCount,
2719
+ reset
2720
+ } = useFilterListState(props);
2721
+ const handleReset = React21.useCallback(() => {
2722
+ reset();
2723
+ onReset?.();
2724
+ }, [reset, onReset]);
2725
+ const visibleFilterDefinitions = React21.useMemo(() => {
2726
+ if (!filterDefinitions) return void 0;
2727
+ return filterDefinitions.filter((def) => def.isVisible !== false);
2728
+ }, [filterDefinitions]);
2729
+ const showHeader = title || titleIcon || showResetButton || showActiveFilterCount;
2730
+ const showAddButton = renderAddFilterButton != null || onFilterAdded != null;
2731
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
2732
+ className: classnames7__default.default(FilterList_default.filterList, className),
2733
+ "data-active-count": activeFilterCount
2734
+ }, showHeader && /* @__PURE__ */ React21__default.default.createElement(FilterListHeader, {
2735
+ title,
2736
+ titleIcon,
2737
+ showResetButton,
2738
+ onReset: handleReset,
2739
+ showActiveFilterCount,
2740
+ activeFilterCount
2741
+ }), /* @__PURE__ */ React21__default.default.createElement(FilterListContent, {
2742
+ objectType,
2743
+ objectSet,
2744
+ filterDefinitions: visibleFilterDefinitions,
2745
+ filterStates,
2746
+ onFilterStateChanged: setFilterState,
2747
+ whereClause
2748
+ }), showAddButton && /* @__PURE__ */ React21__default.default.createElement("div", {
2749
+ className: FilterList_default.addButtonContainer
2750
+ }, renderAddFilterButton ? renderAddFilterButton() : /* @__PURE__ */ React21__default.default.createElement(button.Button, {
2751
+ type: "button",
2752
+ className: FilterList_default.addButton
2753
+ }, "+ Add filter")));
2754
+ }
2755
+
2756
+ // src/object-table/EditableCell.module.css
2757
+ var EditableCell_default = {};
2758
+
2759
+ // src/object-table/EditableCell.tsx
2760
+ var NUMBER_TYPES = ["double", "integer", "long", "float", "decimal", "byte", "short"];
2761
+ function valueToString(value) {
2762
+ if (value == null) {
2763
+ return "";
2764
+ }
2765
+ if (typeof value === "object") {
2766
+ return JSON.stringify(value);
2767
+ }
2768
+ return String(value);
2769
+ }
2770
+ function parseValueByType(value, dataType) {
2771
+ if (!dataType || !NUMBER_TYPES.includes(dataType)) {
2772
+ return value;
2773
+ }
2774
+ if (value === "") {
2775
+ return null;
2776
+ }
2777
+ const parsedNumber = Number(value);
2778
+ if (isNaN(parsedNumber)) {
2779
+ return value;
2780
+ }
2781
+ return parsedNumber;
2782
+ }
2783
+ function EditableCell({
2784
+ initialValue,
2785
+ currentValue,
2786
+ cellId,
2787
+ dataType,
2788
+ onCellEdit
2789
+ }) {
2790
+ const [inputValue, setInputValue] = React21.useState(valueToString(currentValue));
2791
+ const isCancelled = React21.useRef(false);
2792
+ React21.useEffect(() => {
2793
+ setInputValue(valueToString(currentValue));
2794
+ }, [currentValue]);
2795
+ const handleBlur = React21.useCallback(() => {
2796
+ if (isCancelled.current) {
2797
+ isCancelled.current = false;
2798
+ return;
2799
+ }
2800
+ const parsedValue = parseValueByType(inputValue, dataType);
2801
+ onCellEdit?.(cellId, {
2802
+ newValue: parsedValue,
2803
+ oldValue: initialValue
2804
+ });
2805
+ }, [inputValue, initialValue, onCellEdit, cellId, dataType]);
2806
+ const handleChange = React21.useCallback((value) => {
2807
+ setInputValue(value);
2808
+ }, []);
2809
+ const handleKeyDown = React21.useCallback((e) => {
2810
+ if (e.key === "Enter") {
2811
+ e.currentTarget.blur();
2812
+ }
2813
+ if (e.key === "Escape") {
2814
+ isCancelled.current = true;
2815
+ setInputValue(valueToString(currentValue));
2816
+ e.currentTarget.blur();
2817
+ }
2818
+ }, [currentValue]);
2819
+ const inputType = dataType && NUMBER_TYPES.includes(dataType) ? "number" : "text";
2820
+ return /* @__PURE__ */ React21__default.default.createElement(input.Input, {
2821
+ className: EditableCell_default.osdkEditableInput,
2822
+ type: inputType,
2823
+ value: inputValue,
2824
+ onValueChange: handleChange,
2825
+ onBlur: handleBlur,
2826
+ onKeyDown: handleKeyDown
2827
+ });
2828
+ }
2829
+
2830
+ // src/object-table/utils/getCellId.ts
2831
+ function getCellId(cellIdentifier) {
2832
+ return JSON.stringify(cellIdentifier);
2833
+ }
2834
+ function getCellIdentifier(cellId) {
2835
+ const parsed = JSON.parse(cellId);
2836
+ if (typeof parsed === "object" && parsed != null && "rowId" in parsed && "columnId" in parsed) {
2837
+ return parsed;
2838
+ }
2839
+ throw new Error("Parsed cellId does not have required properties");
2840
+ }
2841
+
2842
+ // src/object-table/DefaultCellRenderer.tsx
2843
+ function renderDefaultCell(cellContext) {
2844
+ const meta = cellContext.table.options.meta;
2845
+ const columnMeta = cellContext.column.columnDef.meta;
2846
+ if (!columnMeta?.editable || !meta?.onCellEdit) {
2847
+ return /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, cellContext.getValue());
2848
+ }
2849
+ const rowId = cellContext.row.id;
2850
+ const columnId = cellContext.column.id;
2851
+ const cellId = getCellId({
2852
+ rowId,
2853
+ columnId
2854
+ });
2855
+ const cellEdits = meta.cellEdits;
2856
+ const editedValue = cellEdits?.[cellId];
2857
+ const currentValue = editedValue?.newValue ?? cellContext.getValue();
2858
+ return /* @__PURE__ */ React21__default.default.createElement(EditableCell, {
2859
+ initialValue: cellContext.getValue(),
2860
+ currentValue,
2861
+ cellId,
2862
+ dataType: columnMeta?.dataType,
2863
+ onCellEdit: meta.onCellEdit
2864
+ });
2865
+ }
18
2866
 
19
- // src/object-table/ObjectTable.tsx
2867
+ // src/object-table/hooks/useColumnDefs.ts
20
2868
  function useColumnDefs(objectType, columnDefinitions) {
21
2869
  const {
22
2870
  metadata,
23
2871
  loading,
24
2872
  error
25
2873
  } = react.useOsdkMetadata(objectType);
26
- const columns = React7.useMemo(() => {
2874
+ const columns = React21.useMemo(() => {
27
2875
  const objectProperties = metadata?.properties;
28
2876
  if (columnDefinitions) {
29
2877
  return getColumnsFromColumnDefinitions(columnDefinitions, objectProperties);
@@ -46,15 +2894,24 @@ function getColumnsFromColumnDefinitions(columnDefinitions, objectProperties) {
46
2894
  resizable,
47
2895
  orderable,
48
2896
  filterable,
2897
+ editable,
49
2898
  renderCell,
50
- renderHeader
2899
+ renderHeader,
2900
+ columnName
51
2901
  } = col;
52
2902
  const propertyMetadata = locator.type === "property" ? objectProperties?.[locator.id] : void 0;
53
2903
  const colKey = locator.id;
2904
+ const dataType = propertyMetadata?.type && typeof propertyMetadata.type === "string" ? propertyMetadata.type : void 0;
54
2905
  const colDef = {
55
2906
  id: colKey,
56
2907
  accessorKey: colKey,
57
- header: renderHeader ?? propertyMetadata?.displayName,
2908
+ header: renderHeader ?? (columnName || propertyMetadata?.displayName),
2909
+ meta: {
2910
+ columnName: columnName || propertyMetadata?.displayName,
2911
+ isVisible: col.isVisible !== false,
2912
+ editable,
2913
+ dataType
2914
+ },
58
2915
  size: width,
59
2916
  ...minWidth ? {
60
2917
  minSize: minWidth
@@ -67,7 +2924,10 @@ function getColumnsFromColumnDefinitions(columnDefinitions, objectProperties) {
67
2924
  enableColumnFilter: filterable,
68
2925
  cell: (cellContext) => {
69
2926
  const object = cellContext.row.original;
70
- return renderCell ? renderCell(object, locator) : cellContext.getValue();
2927
+ if (renderCell) {
2928
+ return renderCell(object, locator);
2929
+ }
2930
+ return renderDefaultCell(cellContext);
71
2931
  }
72
2932
  };
73
2933
  return colDef;
@@ -93,11 +2953,11 @@ var useColumnPinning = ({
93
2953
  hasSelectionColumn,
94
2954
  onColumnsPinnedChanged
95
2955
  }) => {
96
- const [columnPinning, setColumnPinning] = React7.useState({
2956
+ const [columnPinning, setColumnPinning] = React21.useState({
97
2957
  left: [],
98
2958
  right: []
99
2959
  });
100
- React7.useEffect(() => {
2960
+ React21.useEffect(() => {
101
2961
  const defaultState = getColumnPinningStateFromColumnDefs(columnDefinitions);
102
2962
  const selectionCol = hasSelectionColumn ? [SELECTION_COLUMN_ID] : [];
103
2963
  setColumnPinning({
@@ -105,7 +2965,7 @@ var useColumnPinning = ({
105
2965
  right: [...defaultState.right ?? []]
106
2966
  });
107
2967
  }, [columnDefinitions, hasSelectionColumn]);
108
- const onColumnPinningChange = React7.useCallback((updater) => {
2968
+ const onColumnPinningChange = React21.useCallback((updater) => {
109
2969
  setColumnPinning((prev) => {
110
2970
  const newPinning = typeof updater === "function" ? updater(prev) : updater;
111
2971
  if (onColumnsPinnedChanged) {
@@ -159,32 +3019,125 @@ function convertColumnPinningStateToArray(pinningState) {
159
3019
  pinned: "right"
160
3020
  }))];
161
3021
  }
162
- var useColumnVisibility = ({
163
- columnDefinitions
3022
+ var useColumnResize = ({
3023
+ onColumnResize
164
3024
  }) => {
165
- const columnVisibility = React7.useMemo(() => {
166
- if (columnDefinitions) {
167
- const colVisibility = columnDefinitions.reduce((acc, colDef) => {
168
- if (colDef.isVisible !== void 0) {
169
- const {
170
- locator
171
- } = colDef;
172
- const colKey = locator.id;
173
- return {
174
- ...acc,
175
- [colKey]: colDef.isVisible
176
- };
3025
+ const [columnSizing, setColumnSizing] = React21.useState({});
3026
+ const onColumnSizingChange = React21.useCallback((updater) => {
3027
+ setColumnSizing((prev) => {
3028
+ const newState = typeof updater === "function" ? updater(prev) : updater;
3029
+ if (onColumnResize) {
3030
+ for (const columnId of Object.keys(newState)) {
3031
+ if (newState[columnId] !== prev[columnId]) {
3032
+ onColumnResize(columnId, newState[columnId]);
3033
+ }
3034
+ }
3035
+ for (const columnId of Object.keys(prev)) {
3036
+ if (!(columnId in newState)) {
3037
+ onColumnResize(columnId, null);
3038
+ }
177
3039
  }
178
- return acc;
179
- }, {});
180
- return colVisibility;
3040
+ }
3041
+ return newState;
3042
+ });
3043
+ }, [onColumnResize]);
3044
+ return {
3045
+ columnSizing,
3046
+ onColumnSizingChange
3047
+ };
3048
+ };
3049
+ var useColumnVisibility = ({
3050
+ allColumns,
3051
+ onColumnVisibilityChanged
3052
+ }) => {
3053
+ const [columnVisibility, setColumnVisibility] = React21.useState(() => getColumnVisibilityState(allColumns));
3054
+ const [columnOrder, setColumnOrder] = React21.useState(() => getColumnOrder(allColumns));
3055
+ React21.useEffect(() => {
3056
+ setColumnVisibility(getColumnVisibilityState(allColumns));
3057
+ }, [allColumns]);
3058
+ React21.useEffect(() => {
3059
+ setColumnOrder(getColumnOrder(allColumns));
3060
+ }, [allColumns]);
3061
+ const onColumnVisibilityChange = React21.useCallback((updaterOrValue) => {
3062
+ setColumnVisibility((prev) => {
3063
+ const newState = typeof updaterOrValue === "function" ? updaterOrValue(prev) : updaterOrValue;
3064
+ if (onColumnVisibilityChanged) {
3065
+ const changes = Object.entries(newState).map(([columnId, isVisible]) => ({
3066
+ columnId,
3067
+ isVisible
3068
+ }));
3069
+ onColumnVisibilityChanged(changes);
3070
+ }
3071
+ return newState;
3072
+ });
3073
+ }, [onColumnVisibilityChanged]);
3074
+ const onColumnOrderChange = React21.useCallback((updaterOrValue) => {
3075
+ setColumnOrder((prev) => {
3076
+ const newState = typeof updaterOrValue === "function" ? updaterOrValue(prev) : updaterOrValue;
3077
+ return newState;
3078
+ });
3079
+ }, []);
3080
+ return {
3081
+ columnVisibility,
3082
+ onColumnVisibilityChange,
3083
+ columnOrder,
3084
+ onColumnOrderChange
3085
+ };
3086
+ };
3087
+ var getColumnVisibilityState = (allColumns) => {
3088
+ return allColumns.reduce((acc, col) => {
3089
+ const colId = col.id ?? col.accessorKey;
3090
+ if (colId) {
3091
+ return {
3092
+ ...acc,
3093
+ [colId]: col.meta?.isVisible !== false
3094
+ };
181
3095
  }
182
- }, [columnDefinitions]);
183
- return columnVisibility;
3096
+ return acc;
3097
+ }, {});
184
3098
  };
3099
+ var getColumnOrder = (allColumns) => {
3100
+ return allColumns.map((col) => col.id ?? col.accessorKey).filter((id) => id != null);
3101
+ };
3102
+ function useEditableTable({
3103
+ onCellValueChanged,
3104
+ onSubmitEdits
3105
+ }) {
3106
+ const [cellEdits, setCellEdits] = React21.useState({});
3107
+ const handleCellEdit = React21.useCallback((cellId, state) => {
3108
+ const cellIdentifier = getCellIdentifier(cellId);
3109
+ if (state.newValue === state.oldValue) {
3110
+ setCellEdits((prev) => {
3111
+ const {
3112
+ [cellId]: _,
3113
+ ...rest
3114
+ } = prev;
3115
+ return rest;
3116
+ });
3117
+ } else {
3118
+ setCellEdits((prev) => ({
3119
+ ...prev,
3120
+ [cellId]: state
3121
+ }));
3122
+ }
3123
+ onCellValueChanged?.(cellIdentifier, state);
3124
+ }, [onCellValueChanged]);
3125
+ const clearEdits = React21.useCallback(() => {
3126
+ setCellEdits({});
3127
+ }, []);
3128
+ const handleSubmitEdits = React21.useCallback(async () => {
3129
+ await onSubmitEdits?.(cellEdits);
3130
+ }, [cellEdits, onSubmitEdits]);
3131
+ return {
3132
+ cellEdits,
3133
+ handleCellEdit,
3134
+ handleSubmitEdits,
3135
+ clearEdits
3136
+ };
3137
+ }
185
3138
  var PAGE_SIZE = 50;
186
- function useObjectTableData(objectOrInterfaceType, columnDefinitions, filter, sorting) {
187
- const orderBy = React7.useMemo(() => {
3139
+ function useObjectTableData(objectOrInterfaceType, columnDefinitions, filter, sorting, objectSet, objectSetOptions) {
3140
+ const orderBy = React21.useMemo(() => {
188
3141
  if (!sorting || sorting.length === 0) {
189
3142
  return void 0;
190
3143
  }
@@ -193,7 +3146,7 @@ function useObjectTableData(objectOrInterfaceType, columnDefinitions, filter, so
193
3146
  return acc;
194
3147
  }, {});
195
3148
  }, [sorting]);
196
- const withProperties = React7.useMemo(() => {
3149
+ const withProperties = React21.useMemo(() => {
197
3150
  if (!columnDefinitions) {
198
3151
  return;
199
3152
  }
@@ -210,12 +3163,37 @@ function useObjectTableData(objectOrInterfaceType, columnDefinitions, filter, so
210
3163
  };
211
3164
  }, {});
212
3165
  }, [columnDefinitions]);
213
- return experimental.useOsdkObjects(objectOrInterfaceType, {
3166
+ const isObjectType = objectOrInterfaceType.type === "object";
3167
+ const shouldUseObjectSet = !!objectSet && isObjectType;
3168
+ const objectSetResult = experimental.useObjectSet(shouldUseObjectSet ? objectSet : void 0, {
3169
+ ...objectSetOptions,
3170
+ withProperties,
3171
+ where: filter,
3172
+ orderBy,
3173
+ pageSize: PAGE_SIZE,
3174
+ enabled: shouldUseObjectSet
3175
+ });
3176
+ const osdkObjectsResult = experimental.useOsdkObjects(objectOrInterfaceType, {
214
3177
  withProperties,
215
3178
  pageSize: PAGE_SIZE,
216
3179
  where: filter,
217
- orderBy
3180
+ orderBy,
3181
+ enabled: !shouldUseObjectSet
218
3182
  });
3183
+ if (shouldUseObjectSet) {
3184
+ console.debug("Using useObjectSet for data fetching in ObjectTable because objectSet is provided and objectType is an object.");
3185
+ return {
3186
+ data: objectSetResult.data,
3187
+ fetchMore: objectSetResult.fetchMore,
3188
+ isLoading: objectSetResult.isLoading,
3189
+ error: objectSetResult.error,
3190
+ totalCount: objectSetResult.totalCount,
3191
+ isOptimistic: false
3192
+ // ObjectSet doesn't support optimistic updates
3193
+ };
3194
+ }
3195
+ console.debug("Using useOsdkObjects for data fetching in ObjectTable because objectSet is not provided or objectType is an interface.");
3196
+ return osdkObjectsResult;
219
3197
  }
220
3198
 
221
3199
  // src/object-table/utils/getRowId.ts
@@ -231,31 +3209,31 @@ function useRowSelection({
231
3209
  onRowSelection,
232
3210
  data
233
3211
  }) {
234
- const [internalRowSelection, setInternalRowSelection] = React7.useState({});
235
- const [lastSelectedRowIndex, setLastSelectedRowIndex] = React7.useState(null);
3212
+ const [internalRowSelection, setInternalRowSelection] = React21.useState({});
3213
+ const [lastSelectedRowIndex, setLastSelectedRowIndex] = React21.useState(null);
236
3214
  const isControlled = selectedRows !== void 0;
237
- const isSelectionEnabled = selectionMode !== "none";
238
- const rowSelectionState = React7.useMemo(() => {
239
- if (!isSelectionEnabled) return {};
3215
+ const enableRowSelection = selectionMode !== "none";
3216
+ const rowSelectionState = React21.useMemo(() => {
3217
+ if (!enableRowSelection) return {};
240
3218
  if (isControlled && selectedRows) {
241
3219
  return getRowSelectionState(selectedRows);
242
3220
  }
243
3221
  return internalRowSelection;
244
- }, [isSelectionEnabled, isControlled, selectedRows, internalRowSelection]);
3222
+ }, [enableRowSelection, isControlled, selectedRows, internalRowSelection]);
245
3223
  const selectedCount = Object.values(rowSelectionState).filter(Boolean).length;
246
3224
  const totalCount = data?.length ?? 0;
247
3225
  const isAllSelected = totalCount > 0 && selectedCount === totalCount;
248
3226
  const hasSelection = selectedCount > 0;
249
- const onToggleAll = React7.useCallback(() => {
250
- if (!isSelectionEnabled || !data) return;
3227
+ const onToggleAll = React21.useCallback(() => {
3228
+ if (!enableRowSelection || !data) return;
251
3229
  const newSelectedRows = isAllSelected ? [] : data.map((item) => item.$primaryKey);
252
3230
  if (!isControlled) {
253
3231
  setInternalRowSelection(getRowSelectionState(newSelectedRows));
254
3232
  }
255
3233
  onRowSelection?.(newSelectedRows);
256
- }, [isSelectionEnabled, data, isAllSelected, isControlled, onRowSelection]);
257
- const onToggleRow = React7.useCallback((rowId, rowIndex, isShiftClick = false) => {
258
- if (!isSelectionEnabled || !data) return;
3234
+ }, [enableRowSelection, data, isAllSelected, isControlled, onRowSelection]);
3235
+ const onToggleRow = React21.useCallback((rowId, rowIndex, isShiftClick = false) => {
3236
+ if (!enableRowSelection || !data) return;
259
3237
  let newSelectedRows = [];
260
3238
  if (selectionMode === "single") {
261
3239
  newSelectedRows = getSingleSelectionRows({
@@ -264,7 +3242,6 @@ function useRowSelection({
264
3242
  data,
265
3243
  rowSelectionState
266
3244
  });
267
- setLastSelectedRowIndex(rowIndex);
268
3245
  } else {
269
3246
  if (isShiftClick && lastSelectedRowIndex != null) {
270
3247
  newSelectedRows = getRangeSelectionRows({
@@ -273,23 +3250,31 @@ function useRowSelection({
273
3250
  lastSelectedRowIndex,
274
3251
  rowSelectionState
275
3252
  });
3253
+ setLastSelectedRowIndex(rowIndex);
276
3254
  } else {
277
3255
  newSelectedRows = getMultipleSelectionRows({
278
3256
  rowIndex,
279
3257
  data,
280
3258
  rowSelectionState
281
3259
  });
3260
+ if (!isCurrentlySelected({
3261
+ rowIndex,
3262
+ data,
3263
+ rowSelectionState
3264
+ })) {
3265
+ setLastSelectedRowIndex(rowIndex);
3266
+ }
282
3267
  }
283
- setLastSelectedRowIndex(rowIndex);
284
3268
  }
285
3269
  if (!isControlled) {
286
3270
  setInternalRowSelection(getRowSelectionState(newSelectedRows));
287
3271
  }
288
3272
  onRowSelection?.(newSelectedRows);
289
- }, [isSelectionEnabled, data, selectionMode, lastSelectedRowIndex, isControlled, rowSelectionState, onRowSelection]);
3273
+ }, [enableRowSelection, data, selectionMode, lastSelectedRowIndex, isControlled, rowSelectionState, onRowSelection]);
290
3274
  return {
291
3275
  rowSelection: rowSelectionState,
292
3276
  isAllSelected,
3277
+ enableRowSelection,
293
3278
  hasSelection,
294
3279
  onToggleAll,
295
3280
  onToggleRow
@@ -325,6 +3310,15 @@ function getRangeSelectionRows({
325
3310
  }
326
3311
  return [];
327
3312
  }
3313
+ function isCurrentlySelected({
3314
+ rowIndex,
3315
+ data,
3316
+ rowSelectionState
3317
+ }) {
3318
+ const primaryKey = data[rowIndex].$primaryKey;
3319
+ const currentlySelected = getSelectedPrimaryKeys(rowSelectionState, data);
3320
+ return currentlySelected.includes(primaryKey);
3321
+ }
328
3322
  function getMultipleSelectionRows({
329
3323
  rowIndex,
330
3324
  data,
@@ -332,7 +3326,11 @@ function getMultipleSelectionRows({
332
3326
  }) {
333
3327
  const primaryKey = data[rowIndex].$primaryKey;
334
3328
  const currentlySelected = getSelectedPrimaryKeys(rowSelectionState, data);
335
- const newSelectedRows = currentlySelected.includes(primaryKey) ? currentlySelected.filter((i) => i !== primaryKey) : [...currentlySelected, primaryKey];
3329
+ const newSelectedRows = isCurrentlySelected({
3330
+ rowIndex,
3331
+ data,
3332
+ rowSelectionState
3333
+ }) ? currentlySelected.filter((i) => i !== primaryKey) : [...currentlySelected, primaryKey];
336
3334
  return newSelectedRows;
337
3335
  }
338
3336
  function getRowsInRange(data, startIndex, endIndex) {
@@ -356,45 +3354,12 @@ function getRowSelectionState(primaryKeys) {
356
3354
  function getSelectedPrimaryKeys(selectionState, data) {
357
3355
  return data.filter((item) => selectionState[getRowId(item)]).map((item) => item.$primaryKey);
358
3356
  }
359
-
360
- // src/base-components/checkbox/Checkbox.module.css
361
- var Checkbox_default = {};
362
-
363
- // src/base-components/checkbox/Checkbox.tsx
364
- function _extends() {
365
- return _extends = Object.assign ? Object.assign.bind() : function(n) {
366
- for (var e = 1; e < arguments.length; e++) {
367
- var t = arguments[e];
368
- for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
369
- }
370
- return n;
371
- }, _extends.apply(null, arguments);
372
- }
373
- function Checkbox({
374
- indeterminate,
375
- className,
376
- indicatorProps,
377
- ...rest
378
- }) {
379
- return /* @__PURE__ */ React7__default.default.createElement(checkbox.Checkbox.Root, _extends({
380
- className: classNames2__default.default(Checkbox_default.osdkCheckboxRoot, className),
381
- indeterminate
382
- }, rest), /* @__PURE__ */ React7__default.default.createElement(checkbox.Checkbox.Indicator, _extends({}, indicatorProps, {
383
- className: classNames2__default.default(Checkbox_default.osdkCheckboxIndicator, indicatorProps?.className)
384
- }), indeterminate ? /* @__PURE__ */ React7__default.default.createElement(icons.Minus, {
385
- color: "currentColor"
386
- }) : /* @__PURE__ */ React7__default.default.createElement(icons.Tick, {
387
- color: "currentColor"
388
- })));
389
- }
390
-
391
- // src/object-table/SelectionCells.tsx
392
3357
  function SelectionHeaderCell({
393
3358
  isAllSelected,
394
3359
  hasSelection,
395
3360
  onToggleAll
396
3361
  }) {
397
- return /* @__PURE__ */ React7__default.default.createElement(Checkbox, {
3362
+ return /* @__PURE__ */ React21__default.default.createElement(Checkbox, {
398
3363
  indeterminate: hasSelection && !isAllSelected,
399
3364
  checked: isAllSelected,
400
3365
  onCheckedChange: onToggleAll,
@@ -405,15 +3370,24 @@ function SelectionCell({
405
3370
  row,
406
3371
  onToggleRow
407
3372
  }) {
408
- const handleClick = React7.useCallback((event) => {
3373
+ const handleClick = React21.useCallback((event) => {
3374
+ event.stopPropagation();
409
3375
  const isShiftClick = event.shiftKey;
410
3376
  onToggleRow(row.id, row.index, isShiftClick);
411
- }, [row, onToggleRow]);
412
- return /* @__PURE__ */ React7__default.default.createElement(Checkbox, {
413
- checked: row.getIsSelected(),
3377
+ }, [onToggleRow, row.id, row.index]);
3378
+ const handleKeyDown = React21.useCallback((event) => {
3379
+ if (event.key === "Enter") {
3380
+ const isShiftClick = event.shiftKey;
3381
+ onToggleRow(row.id, row.index, isShiftClick);
3382
+ }
3383
+ }, [onToggleRow, row.id, row.index]);
3384
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
414
3385
  onClick: handleClick,
3386
+ onKeyDown: handleKeyDown
3387
+ }, /* @__PURE__ */ React21__default.default.createElement(Checkbox, {
3388
+ checked: row.getIsSelected(),
415
3389
  "aria-label": `Select row ${row.index + 1}`
416
- });
3390
+ }));
417
3391
  }
418
3392
 
419
3393
  // src/object-table/hooks/useSelectionColumn.tsx
@@ -424,20 +3398,28 @@ var useSelectionColumn = ({
424
3398
  onToggleAll,
425
3399
  onToggleRow
426
3400
  }) => {
427
- const selectionColumn = React7.useMemo(() => {
3401
+ const isAllSelectedRef = React21.useRef(isAllSelected);
3402
+ isAllSelectedRef.current = isAllSelected;
3403
+ const hasSelectionRef = React21.useRef(hasSelection);
3404
+ hasSelectionRef.current = hasSelection;
3405
+ const onToggleAllRef = React21.useRef(onToggleAll);
3406
+ onToggleAllRef.current = onToggleAll;
3407
+ const onToggleRowRef = React21.useRef(onToggleRow);
3408
+ onToggleRowRef.current = onToggleRow;
3409
+ const selectionColumn = React21.useMemo(() => {
428
3410
  if (selectionMode === "none") return null;
429
3411
  const colDef = {
430
3412
  id: SELECTION_COLUMN_ID,
431
- header: () => selectionMode === "multiple" ? /* @__PURE__ */ React7__default.default.createElement(SelectionHeaderCell, {
432
- isAllSelected,
433
- hasSelection,
434
- onToggleAll
3413
+ header: () => selectionMode === "multiple" ? /* @__PURE__ */ React21__default.default.createElement(SelectionHeaderCell, {
3414
+ isAllSelected: isAllSelectedRef.current,
3415
+ hasSelection: hasSelectionRef.current,
3416
+ onToggleAll: onToggleAllRef.current
435
3417
  }) : null,
436
3418
  cell: ({
437
3419
  row
438
- }) => /* @__PURE__ */ React7__default.default.createElement(SelectionCell, {
3420
+ }) => /* @__PURE__ */ React21__default.default.createElement(SelectionCell, {
439
3421
  row,
440
- onToggleRow
3422
+ onToggleRow: onToggleRowRef.current
441
3423
  }),
442
3424
  size: 50,
443
3425
  minSize: 50,
@@ -447,7 +3429,7 @@ var useSelectionColumn = ({
447
3429
  enablePinning: false
448
3430
  };
449
3431
  return colDef;
450
- }, [selectionMode, isAllSelected, hasSelection, onToggleAll, onToggleRow]);
3432
+ }, [selectionMode]);
451
3433
  return selectionColumn;
452
3434
  };
453
3435
  var useTableSorting = ({
@@ -455,10 +3437,10 @@ var useTableSorting = ({
455
3437
  defaultOrderBy,
456
3438
  onOrderByChanged
457
3439
  }) => {
458
- const [internalSorting, setInternalSorting] = React7.useState(() => defaultOrderBy ? convertOrderByToSortingState(defaultOrderBy) : []);
3440
+ const [internalSorting, setInternalSorting] = React21.useState(() => defaultOrderBy ? convertOrderByToSortingState(defaultOrderBy) : []);
459
3441
  const isControlled = orderBy !== void 0;
460
- const sortingState = React7.useMemo(() => orderBy ? convertOrderByToSortingState(orderBy) : internalSorting, [orderBy, internalSorting]);
461
- const onSortingChange = React7.useCallback((updater) => {
3442
+ const sortingState = React21.useMemo(() => orderBy ? convertOrderByToSortingState(orderBy) : internalSorting, [orderBy, internalSorting]);
3443
+ const onSortingChange = React21.useCallback((updater) => {
462
3444
  const newSorting = typeof updater === "function" ? updater(sortingState) : updater;
463
3445
  if (!isControlled) {
464
3446
  setInternalSorting(newSorting);
@@ -492,6 +3474,29 @@ function convertSortingStateToOrderBy(sorting) {
492
3474
  }));
493
3475
  }
494
3476
 
3477
+ // src/base-components/action-button/ActionButton.module.css
3478
+ var ActionButton_default = {};
3479
+
3480
+ // src/base-components/action-button/ActionButton.tsx
3481
+ function _extends8() {
3482
+ return _extends8 = Object.assign ? Object.assign.bind() : function(n) {
3483
+ for (var e = 1; e < arguments.length; e++) {
3484
+ var t = arguments[e];
3485
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
3486
+ }
3487
+ return n;
3488
+ }, _extends8.apply(null, arguments);
3489
+ }
3490
+ function ActionButton({
3491
+ variant = "secondary",
3492
+ className,
3493
+ ...rest
3494
+ }) {
3495
+ return /* @__PURE__ */ React21__default.default.createElement(button.Button, _extends8({
3496
+ className: classnames7__default.default(ActionButton_default.button, variant === "primary" ? ActionButton_default.primaryButton : ActionButton_default.secondaryButton, className)
3497
+ }, rest));
3498
+ }
3499
+
495
3500
  // src/object-table/LoadingCell.module.css
496
3501
  var LoadingCell_default = {};
497
3502
 
@@ -502,13 +3507,13 @@ var TableCell_default = {};
502
3507
  function LoadingCell({
503
3508
  width
504
3509
  }) {
505
- return /* @__PURE__ */ React7__default.default.createElement("td", {
3510
+ return /* @__PURE__ */ React21__default.default.createElement("td", {
506
3511
  className: TableCell_default.osdkTableCell,
507
3512
  style: {
508
3513
  width
509
3514
  }
510
- }, /* @__PURE__ */ React7__default.default.createElement("div", {
511
- className: classNames2__default.default(LoadingCell_default.osdkLoadingCell, LoadingCell_default.osdkCellSkeleton)
3515
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
3516
+ className: classnames7__default.default(LoadingCell_default.osdkLoadingCell, LoadingCell_default.osdkCellSkeleton)
512
3517
  }));
513
3518
  }
514
3519
 
@@ -523,17 +3528,17 @@ function LoadingRow({
523
3528
  rowHeight = 40,
524
3529
  columnWidth = 80
525
3530
  }) {
526
- return /* @__PURE__ */ React7__default.default.createElement("tr", {
3531
+ return /* @__PURE__ */ React21__default.default.createElement("tr", {
527
3532
  className: TableRow_default.osdkTableRow,
528
3533
  style: {
529
3534
  height: `${rowHeight}px`,
530
3535
  transform: `translateY(${translateY}px)`
531
3536
  }
532
- }, /* @__PURE__ */ React7__default.default.createElement(React7__default.default.Fragment, null, Array.from({
3537
+ }, /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, Array.from({
533
3538
  length: columnCount
534
3539
  }).map((_, index) => {
535
3540
  const width = headers.length > index ? headers[index].getSize() : columnWidth;
536
- return /* @__PURE__ */ React7__default.default.createElement(LoadingCell, {
3541
+ return /* @__PURE__ */ React21__default.default.createElement(LoadingCell, {
537
3542
  key: `loading-cell-${index}`,
538
3543
  width
539
3544
  });
@@ -543,6 +3548,597 @@ function LoadingRow({
543
3548
  // src/object-table/TableBody.module.css
544
3549
  var TableBody_default = {};
545
3550
 
3551
+ // src/base-components/dialog/Dialog.module.css
3552
+ var Dialog_default = {};
3553
+
3554
+ // src/base-components/dialog/Dialog.tsx
3555
+ function Dialog({
3556
+ isOpen,
3557
+ onOpenChange,
3558
+ title,
3559
+ children,
3560
+ footer,
3561
+ className
3562
+ }) {
3563
+ return /* @__PURE__ */ React21__default.default.createElement(dialog.Dialog.Root, {
3564
+ open: isOpen,
3565
+ onOpenChange
3566
+ }, /* @__PURE__ */ React21__default.default.createElement(dialog.Dialog.Portal, null, /* @__PURE__ */ React21__default.default.createElement(dialog.Dialog.Backdrop, {
3567
+ className: Dialog_default.backdrop
3568
+ }), /* @__PURE__ */ React21__default.default.createElement(dialog.Dialog.Popup, {
3569
+ className: classnames7__default.default(Dialog_default.popup, className)
3570
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
3571
+ className: Dialog_default.header
3572
+ }, /* @__PURE__ */ React21__default.default.createElement(dialog.Dialog.Title, {
3573
+ className: Dialog_default.title
3574
+ }, title), /* @__PURE__ */ React21__default.default.createElement(dialog.Dialog.Close, {
3575
+ className: Dialog_default.closeButton,
3576
+ "aria-label": "Close dialog"
3577
+ }, /* @__PURE__ */ React21__default.default.createElement(icons.Cross, {
3578
+ className: Dialog_default.closeIcon
3579
+ }))), /* @__PURE__ */ React21__default.default.createElement("div", {
3580
+ className: Dialog_default.body
3581
+ }, children), footer != null && /* @__PURE__ */ React21__default.default.createElement("div", {
3582
+ className: Dialog_default.footer
3583
+ }, footer))));
3584
+ }
3585
+
3586
+ // src/base-components/draggable-list/DraggableList.module.css
3587
+ var DraggableList_default = {};
3588
+
3589
+ // src/base-components/draggable-list/DraggableList.tsx
3590
+ function _extends9() {
3591
+ return _extends9 = Object.assign ? Object.assign.bind() : function(n) {
3592
+ for (var e = 1; e < arguments.length; e++) {
3593
+ var t = arguments[e];
3594
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
3595
+ }
3596
+ return n;
3597
+ }, _extends9.apply(null, arguments);
3598
+ }
3599
+ function DraggableListItem({
3600
+ item,
3601
+ onRemove,
3602
+ removeIconVariant = "trash",
3603
+ renderContent
3604
+ }) {
3605
+ const {
3606
+ attributes,
3607
+ listeners,
3608
+ setNodeRef,
3609
+ transform,
3610
+ transition,
3611
+ isDragging
3612
+ } = sortable.useSortable({
3613
+ id: item.id
3614
+ });
3615
+ const style = {
3616
+ transform: utilities.CSS.Transform.toString(transform),
3617
+ transition
3618
+ };
3619
+ const handleRemove = React21.useCallback(() => {
3620
+ onRemove?.(item.id);
3621
+ }, [item.id, onRemove]);
3622
+ const RemoveIcon = removeIconVariant === "trash" ? icons.Trash : icons.SmallCross;
3623
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
3624
+ ref: setNodeRef,
3625
+ style,
3626
+ className: DraggableList_default.draggableItem,
3627
+ "data-dragging": isDragging
3628
+ }, /* @__PURE__ */ React21__default.default.createElement("div", _extends9({
3629
+ className: DraggableList_default.dragHandle,
3630
+ "aria-label": `Reorder ${item.label}`
3631
+ }, attributes, listeners), /* @__PURE__ */ React21__default.default.createElement(icons.DragHandleVertical, {
3632
+ className: DraggableList_default.icon
3633
+ })), /* @__PURE__ */ React21__default.default.createElement("div", {
3634
+ className: DraggableList_default.itemContent
3635
+ }, renderContent ? renderContent(item) : item.label), onRemove && /* @__PURE__ */ React21__default.default.createElement(button.Button, {
3636
+ className: DraggableList_default.removeButton,
3637
+ onClick: handleRemove,
3638
+ "aria-label": `Remove ${item.label}`
3639
+ }, /* @__PURE__ */ React21__default.default.createElement(RemoveIcon, {
3640
+ className: DraggableList_default.icon
3641
+ })));
3642
+ }
3643
+ function DraggableList({
3644
+ items,
3645
+ onReorder,
3646
+ onRemove,
3647
+ removeIconVariant = "cross",
3648
+ renderContent,
3649
+ emptyMessage,
3650
+ className
3651
+ }) {
3652
+ const itemIds = React21.useMemo(() => items.map((item) => item.id), [items]);
3653
+ const sensors = core.useSensors(core.useSensor(core.PointerSensor, {
3654
+ activationConstraint: {
3655
+ distance: 5
3656
+ }
3657
+ }), core.useSensor(core.KeyboardSensor, {
3658
+ coordinateGetter: sortable.sortableKeyboardCoordinates
3659
+ }));
3660
+ const handleDragEnd = React21.useCallback((event) => {
3661
+ const {
3662
+ active,
3663
+ over
3664
+ } = event;
3665
+ if (over && active.id !== over.id) {
3666
+ const oldIndex = items.findIndex((item) => item.id === active.id);
3667
+ const newIndex = items.findIndex((item) => item.id === over.id);
3668
+ onReorder(oldIndex, newIndex);
3669
+ }
3670
+ }, [items, onReorder]);
3671
+ const containerRef = React21.useRef(null);
3672
+ useKeyboardEvents(containerRef);
3673
+ const DndContext = core.DndContext;
3674
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
3675
+ ref: containerRef,
3676
+ className: classnames7__default.default(DraggableList_default.draggableListContainer, className)
3677
+ }, /* @__PURE__ */ React21__default.default.createElement(DndContext, {
3678
+ sensors,
3679
+ collisionDetection: core.closestCenter,
3680
+ onDragEnd: handleDragEnd
3681
+ }, /* @__PURE__ */ React21__default.default.createElement(sortable.SortableContext, {
3682
+ items: itemIds,
3683
+ strategy: sortable.verticalListSortingStrategy
3684
+ }, items.map((item) => /* @__PURE__ */ React21__default.default.createElement(DraggableListItem, {
3685
+ key: item.id,
3686
+ item,
3687
+ onRemove,
3688
+ removeIconVariant,
3689
+ renderContent
3690
+ })))), items.length === 0 && emptyMessage && /* @__PURE__ */ React21__default.default.createElement("div", {
3691
+ className: DraggableList_default.emptyState
3692
+ }, emptyMessage));
3693
+ }
3694
+ var useKeyboardEvents = (containerRef) => {
3695
+ React21.useEffect(() => {
3696
+ const el = containerRef.current;
3697
+ if (el == null) {
3698
+ return;
3699
+ }
3700
+ const ARROW_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"]);
3701
+ function handleCapture(event) {
3702
+ if (!ARROW_KEYS.has(event.key)) {
3703
+ return;
3704
+ }
3705
+ if (el.querySelector('[data-dragging="true"]') == null) {
3706
+ return;
3707
+ }
3708
+ event.stopPropagation();
3709
+ document.dispatchEvent(new KeyboardEvent("keydown", {
3710
+ key: event.key,
3711
+ code: event.code,
3712
+ bubbles: true
3713
+ }));
3714
+ }
3715
+ el.addEventListener("keydown", handleCapture, true);
3716
+ return () => el.removeEventListener("keydown", handleCapture, true);
3717
+ }, [containerRef]);
3718
+ };
3719
+
3720
+ // src/base-components/search-bar/SearchBar.module.css
3721
+ var SearchBar_default = {};
3722
+
3723
+ // src/base-components/search-bar/SearchBar.tsx
3724
+ function SearchBar({
3725
+ value,
3726
+ onChange,
3727
+ placeholder = "Search",
3728
+ "aria-label": ariaLabel,
3729
+ className,
3730
+ onKeyDown
3731
+ }) {
3732
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
3733
+ className: classnames7__default.default(SearchBar_default.searchBar, className)
3734
+ }, /* @__PURE__ */ React21__default.default.createElement(icons.Search, {
3735
+ className: SearchBar_default.searchIcon
3736
+ }), /* @__PURE__ */ React21__default.default.createElement(input.Input, {
3737
+ type: "text",
3738
+ placeholder,
3739
+ "aria-label": ariaLabel ?? placeholder,
3740
+ value,
3741
+ onChange,
3742
+ className: SearchBar_default.searchInput,
3743
+ onKeyDown
3744
+ }));
3745
+ }
3746
+
3747
+ // src/object-table/ColumnConfigDialog.module.css
3748
+ var ColumnConfigDialog_default = {};
3749
+
3750
+ // src/object-table/ColumnConfigDialog.tsx
3751
+ function ColumnConfigDialog({
3752
+ isOpen,
3753
+ onClose,
3754
+ columnOptions,
3755
+ currentVisibility,
3756
+ currentColumnOrder,
3757
+ onApply,
3758
+ isValidConfig
3759
+ }) {
3760
+ const [visibleColumns, setVisibleColumns] = React21.useState([]);
3761
+ const [searchQuery, setSearchQuery] = React21.useState("");
3762
+ const allColumns = React21.useMemo(() => {
3763
+ return columnOptions.map((opt) => {
3764
+ const isVisible = currentVisibility ? currentVisibility[opt.id] : false;
3765
+ return {
3766
+ id: opt.id,
3767
+ label: opt.name,
3768
+ isVisible
3769
+ };
3770
+ });
3771
+ }, [columnOptions, currentVisibility]);
3772
+ React21.useEffect(() => {
3773
+ if (isOpen) {
3774
+ const visibleCols = allColumns.filter((col) => col.isVisible);
3775
+ if (!!currentColumnOrder?.length) {
3776
+ visibleCols.sort((a, b) => {
3777
+ const indexA = currentColumnOrder.indexOf(a.id);
3778
+ const indexB = currentColumnOrder.indexOf(b.id);
3779
+ const orderA = indexA === -1 ? Infinity : indexA;
3780
+ const orderB = indexB === -1 ? Infinity : indexB;
3781
+ return orderA - orderB;
3782
+ });
3783
+ }
3784
+ setVisibleColumns(visibleCols);
3785
+ setSearchQuery("");
3786
+ }
3787
+ }, [isOpen, allColumns, currentColumnOrder]);
3788
+ const handleApply = React21.useCallback(() => {
3789
+ onApply(getColumnConfig(allColumns, visibleColumns));
3790
+ onClose();
3791
+ }, [allColumns, visibleColumns, onApply, onClose]);
3792
+ const isValid = isValidConfig ? isValidConfig(getColumnConfig(allColumns, visibleColumns)) : true;
3793
+ const isApplyDisabled = visibleColumns.length === 0 || !isValid;
3794
+ const handleReorderColumns = React21.useCallback((fromIndex, toIndex) => {
3795
+ setVisibleColumns((items) => sortable.arrayMove(items, fromIndex, toIndex));
3796
+ }, []);
3797
+ const handleRemoveColumn = React21.useCallback((columnId) => {
3798
+ setVisibleColumns((prev) => prev.filter((col) => col.id !== columnId));
3799
+ }, []);
3800
+ const handleToggleColumn = React21.useCallback((column) => {
3801
+ setVisibleColumns((prev) => {
3802
+ const isCurrentlyVisible = prev.some((col) => col.id === column.id);
3803
+ if (isCurrentlyVisible) {
3804
+ return prev.filter((col) => col.id !== column.id);
3805
+ } else {
3806
+ return [...prev, column];
3807
+ }
3808
+ });
3809
+ }, []);
3810
+ const handleSearchChange = React21.useCallback((event) => {
3811
+ setSearchQuery(event.target.value);
3812
+ }, []);
3813
+ const handleSelectAll = React21.useCallback((columns) => {
3814
+ setVisibleColumns((prev) => {
3815
+ const allSelected = columns.every((col) => prev.some((v) => v.id === col.id));
3816
+ if (allSelected) {
3817
+ return prev.filter((v) => !columns.some((col) => col.id === v.id));
3818
+ } else {
3819
+ const newColumns = columns.filter((col) => !prev.some((v) => v.id === col.id));
3820
+ return [...prev, ...newColumns];
3821
+ }
3822
+ });
3823
+ }, []);
3824
+ const filteredAvailableColumns = React21.useMemo(() => {
3825
+ const query = searchQuery.toLowerCase().trim();
3826
+ if (!query) {
3827
+ return allColumns;
3828
+ }
3829
+ return allColumns.filter((col) => (col.label?.toLowerCase().includes(query) ?? false) || col.id.toLowerCase().includes(query));
3830
+ }, [allColumns, searchQuery]);
3831
+ const footer = React21.useMemo(() => /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement(ActionButton, {
3832
+ onClick: onClose
3833
+ }, "Cancel"), /* @__PURE__ */ React21__default.default.createElement(ActionButton, {
3834
+ variant: "primary",
3835
+ onClick: handleApply,
3836
+ disabled: isApplyDisabled
3837
+ }, "Apply")), [onClose, handleApply, isApplyDisabled]);
3838
+ return /* @__PURE__ */ React21__default.default.createElement(Dialog, {
3839
+ isOpen,
3840
+ onOpenChange: onClose,
3841
+ title: DialogTitle,
3842
+ footer,
3843
+ className: ColumnConfigDialog_default.columnConfigDialog
3844
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
3845
+ className: ColumnConfigDialog_default.dialogLayout
3846
+ }, /* @__PURE__ */ React21__default.default.createElement(VisibleColumnsList, {
3847
+ columns: visibleColumns,
3848
+ onReorder: handleReorderColumns,
3849
+ onRemove: handleRemoveColumn
3850
+ }), /* @__PURE__ */ React21__default.default.createElement(AvailableColumnsList, {
3851
+ visibleColumns,
3852
+ searchQuery,
3853
+ onSearchChange: handleSearchChange,
3854
+ onToggleColumn: handleToggleColumn,
3855
+ onSelectAll: handleSelectAll,
3856
+ filteredColumns: filteredAvailableColumns
3857
+ })));
3858
+ }
3859
+ var DialogTitle = /* @__PURE__ */ React21__default.default.createElement("div", {
3860
+ className: ColumnConfigDialog_default.title
3861
+ }, /* @__PURE__ */ React21__default.default.createElement(icons.Cog, null), "Configure Table Columns");
3862
+ var getColumnConfig = (allColumns, visibleColumns) => {
3863
+ const hiddenColumns = allColumns.filter((col) => !visibleColumns.some((v) => v.id === col.id));
3864
+ return [...visibleColumns.map((col) => ({
3865
+ columnId: col.id,
3866
+ isVisible: true
3867
+ })), ...hiddenColumns.map((col) => ({
3868
+ columnId: col.id,
3869
+ isVisible: false
3870
+ }))];
3871
+ };
3872
+ function VisibleColumnsList({
3873
+ columns,
3874
+ onReorder,
3875
+ onRemove
3876
+ }) {
3877
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
3878
+ className: ColumnConfigDialog_default.visibleColumnsContainer
3879
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
3880
+ className: ColumnConfigDialog_default.sectionHeader
3881
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
3882
+ className: ColumnConfigDialog_default.sectionTitle
3883
+ }, /* @__PURE__ */ React21__default.default.createElement("span", null, "Visible Columns"), /* @__PURE__ */ React21__default.default.createElement("span", {
3884
+ className: ColumnConfigDialog_default.countTag
3885
+ }, columns.length)), /* @__PURE__ */ React21__default.default.createElement("div", {
3886
+ className: ColumnConfigDialog_default.sectionHint
3887
+ }, "Drag to reorder")), /* @__PURE__ */ React21__default.default.createElement(DraggableList, {
3888
+ items: columns,
3889
+ onReorder,
3890
+ onRemove,
3891
+ removeIconVariant: "trash",
3892
+ emptyMessage: "No visible columns",
3893
+ className: ColumnConfigDialog_default.columnList
3894
+ }));
3895
+ }
3896
+ function AvailableColumnsList({
3897
+ visibleColumns,
3898
+ searchQuery,
3899
+ onSearchChange,
3900
+ onToggleColumn,
3901
+ onSelectAll,
3902
+ filteredColumns
3903
+ }) {
3904
+ const selectedCount = visibleColumns.length;
3905
+ const totalCount = filteredColumns.length;
3906
+ const allFilteredSelected = filteredColumns.every((col) => visibleColumns.some((v) => v.id === col.id));
3907
+ const someFilteredSelected = filteredColumns.some((col) => visibleColumns.some((v) => v.id === col.id));
3908
+ const handleSelectAllClick = React21.useCallback(() => {
3909
+ onSelectAll(filteredColumns);
3910
+ }, [filteredColumns, onSelectAll]);
3911
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
3912
+ className: ColumnConfigDialog_default.availableColumnsContainer
3913
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
3914
+ className: classnames7__default.default(ColumnConfigDialog_default.sectionHeader, ColumnConfigDialog_default.sectionTitle)
3915
+ }, "Add or Remove Columns"), /* @__PURE__ */ React21__default.default.createElement(SearchBar, {
3916
+ value: searchQuery,
3917
+ onChange: onSearchChange,
3918
+ placeholder: "Search...",
3919
+ "aria-label": "Search available columns",
3920
+ className: ColumnConfigDialog_default.searchContainer
3921
+ }), /* @__PURE__ */ React21__default.default.createElement(collapsible.Collapsible.Root, {
3922
+ defaultOpen: true,
3923
+ className: ColumnConfigDialog_default.propertiesList
3924
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
3925
+ className: ColumnConfigDialog_default.categoryHeader
3926
+ }, /* @__PURE__ */ React21__default.default.createElement(Checkbox, {
3927
+ checked: allFilteredSelected,
3928
+ indeterminate: someFilteredSelected && !allFilteredSelected,
3929
+ onCheckedChange: handleSelectAllClick,
3930
+ className: ColumnConfigDialog_default.checkbox
3931
+ }), /* @__PURE__ */ React21__default.default.createElement(collapsible.Collapsible.Trigger, {
3932
+ className: ColumnConfigDialog_default.categoryTrigger
3933
+ }, /* @__PURE__ */ React21__default.default.createElement("span", {
3934
+ className: ColumnConfigDialog_default.categoryTitle
3935
+ }, "All Columns"), /* @__PURE__ */ React21__default.default.createElement("span", {
3936
+ className: ColumnConfigDialog_default.categoryCount
3937
+ }, selectedCount, "/", totalCount), /* @__PURE__ */ React21__default.default.createElement(icons.CaretDown, {
3938
+ className: ColumnConfigDialog_default.caretIcon
3939
+ }))), /* @__PURE__ */ React21__default.default.createElement(collapsible.Collapsible.Panel, {
3940
+ className: ColumnConfigDialog_default.propertyList
3941
+ }, filteredColumns.length === 0 ? /* @__PURE__ */ React21__default.default.createElement("div", {
3942
+ className: ColumnConfigDialog_default.emptyState
3943
+ }, "No matching columns found") : filteredColumns.map((column) => /* @__PURE__ */ React21__default.default.createElement(PropertyItem, {
3944
+ key: column.id,
3945
+ column,
3946
+ isSelected: visibleColumns.some((v) => v.id === column.id),
3947
+ onToggle: onToggleColumn
3948
+ })))));
3949
+ }
3950
+ function PropertyItem({
3951
+ column,
3952
+ isSelected,
3953
+ onToggle,
3954
+ showInfoIcon = false
3955
+ }) {
3956
+ const handleClick = React21.useCallback(() => {
3957
+ onToggle(column);
3958
+ }, [onToggle, column]);
3959
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
3960
+ className: ColumnConfigDialog_default.propertyItem
3961
+ }, /* @__PURE__ */ React21__default.default.createElement(Checkbox, {
3962
+ checked: isSelected,
3963
+ onCheckedChange: handleClick,
3964
+ className: ColumnConfigDialog_default.checkbox
3965
+ }), /* @__PURE__ */ React21__default.default.createElement(button.Button, {
3966
+ onClick: handleClick,
3967
+ className: ColumnConfigDialog_default.propertyName
3968
+ }, column.label), showInfoIcon && /* @__PURE__ */ React21__default.default.createElement(icons.SmallInfoSign, {
3969
+ className: ColumnConfigDialog_default.infoIcon
3970
+ }));
3971
+ }
3972
+
3973
+ // src/object-table/MultiColumnSortDialog.module.css
3974
+ var MultiColumnSortDialog_default = {};
3975
+ function SortableItemsList({
3976
+ items,
3977
+ onReorder,
3978
+ onRemove,
3979
+ className
3980
+ }) {
3981
+ const renderContent = React21.useCallback((item) => item.content, []);
3982
+ return /* @__PURE__ */ React21__default.default.createElement(DraggableList, {
3983
+ items,
3984
+ onReorder,
3985
+ onRemove,
3986
+ removeIconVariant: "cross",
3987
+ renderContent,
3988
+ className
3989
+ });
3990
+ }
3991
+
3992
+ // src/object-table/MultiColumnSortDialog.tsx
3993
+ function MultiColumnSortDialog({
3994
+ isOpen,
3995
+ onClose,
3996
+ onApply,
3997
+ currentSorting,
3998
+ columnOptions
3999
+ }) {
4000
+ const [selectedSortColumns, setSelectedSortColumns] = React21.useState([]);
4001
+ const [menuSearchQuery, setMenuSearchQuery] = React21.useState("");
4002
+ React21.useEffect(() => {
4003
+ if (isOpen) {
4004
+ const selectedColumns = [];
4005
+ for (const sort of currentSorting) {
4006
+ const column = columnOptions.find((col) => col.id === sort.id);
4007
+ if (column) {
4008
+ selectedColumns.push({
4009
+ ...column,
4010
+ direction: sort.desc ? "desc" : "asc"
4011
+ });
4012
+ }
4013
+ }
4014
+ setSelectedSortColumns(selectedColumns);
4015
+ }
4016
+ }, [isOpen, currentSorting, columnOptions]);
4017
+ const handleAddColumn = React21.useCallback((column) => {
4018
+ setSelectedSortColumns((prev) => [...prev, {
4019
+ ...column,
4020
+ direction: "asc"
4021
+ }]);
4022
+ }, []);
4023
+ const handleRemoveSortColumn = React21.useCallback((id) => {
4024
+ setSelectedSortColumns((prev) => prev.filter((item) => item.id !== id));
4025
+ }, []);
4026
+ const handleReorderSortColumns = React21.useCallback((fromIndex, toIndex) => {
4027
+ setSelectedSortColumns((items) => sortable.arrayMove(items, fromIndex, toIndex));
4028
+ }, []);
4029
+ const handleToggleSortDirection = React21.useCallback((id) => {
4030
+ setSelectedSortColumns((prev) => prev.map((item) => item.id === id ? {
4031
+ ...item,
4032
+ direction: item.direction === "asc" ? "desc" : "asc"
4033
+ } : item));
4034
+ }, []);
4035
+ const handleApply = React21.useCallback(() => {
4036
+ const sortingState = selectedSortColumns.map((col) => ({
4037
+ id: col.id,
4038
+ desc: col.direction === "desc"
4039
+ }));
4040
+ onApply(sortingState);
4041
+ onClose();
4042
+ }, [selectedSortColumns, onApply, onClose]);
4043
+ const availableColumns = React21.useMemo(() => columnOptions.filter((col) => col.canSort && !selectedSortColumns.some((selected) => selected.id === col.id)), [columnOptions, selectedSortColumns]);
4044
+ const filteredAvailableColumns = React21.useMemo(() => {
4045
+ const query = menuSearchQuery.toLowerCase().trim();
4046
+ if (!query) {
4047
+ return availableColumns;
4048
+ }
4049
+ return availableColumns.filter((col) => col.name.toLowerCase().includes(query));
4050
+ }, [availableColumns, menuSearchQuery]);
4051
+ const handleMenuSearchChange = React21.useCallback((event) => {
4052
+ setMenuSearchQuery(event.target.value);
4053
+ }, []);
4054
+ const handleMenuOpenChange = React21.useCallback((open) => {
4055
+ if (open) {
4056
+ setMenuSearchQuery("");
4057
+ }
4058
+ }, []);
4059
+ const sortableItems = React21.useMemo(() => {
4060
+ return selectedSortColumns.map((item) => ({
4061
+ id: item.id,
4062
+ label: item.name,
4063
+ content: /* @__PURE__ */ React21__default.default.createElement("div", {
4064
+ className: MultiColumnSortDialog_default.sortColumnItem
4065
+ }, /* @__PURE__ */ React21__default.default.createElement("span", {
4066
+ className: classnames7__default.default(MultiColumnSortDialog_default.sortColumnName, MultiColumnSortDialog_default.truncate)
4067
+ }, item.name), /* @__PURE__ */ React21__default.default.createElement(button.Button, {
4068
+ className: MultiColumnSortDialog_default.sortDirectionButton,
4069
+ onClick: () => handleToggleSortDirection(item.id),
4070
+ "aria-label": `Toggle sort direction for ${item.name}`
4071
+ }, item.direction === "asc" ? /* @__PURE__ */ React21__default.default.createElement(icons.SortAlphabetical, {
4072
+ className: MultiColumnSortDialog_default.sortIcon
4073
+ }) : /* @__PURE__ */ React21__default.default.createElement(icons.SortAlphabeticalDesc, {
4074
+ className: MultiColumnSortDialog_default.sortIcon
4075
+ })))
4076
+ }));
4077
+ }, [selectedSortColumns, handleToggleSortDirection]);
4078
+ const footer = React21.useMemo(() => /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement(ActionButton, {
4079
+ onClick: onClose
4080
+ }, "Cancel"), /* @__PURE__ */ React21__default.default.createElement(ActionButton, {
4081
+ variant: "primary",
4082
+ onClick: handleApply
4083
+ }, "Apply")), [handleApply, onClose]);
4084
+ return /* @__PURE__ */ React21__default.default.createElement(Dialog, {
4085
+ isOpen,
4086
+ onOpenChange: onClose,
4087
+ title: DialogTitle2,
4088
+ footer
4089
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
4090
+ className: MultiColumnSortDialog_default.sortColumnsList
4091
+ }, /* @__PURE__ */ React21__default.default.createElement(SortableItemsList, {
4092
+ items: sortableItems,
4093
+ onReorder: handleReorderSortColumns,
4094
+ onRemove: handleRemoveSortColumn,
4095
+ className: MultiColumnSortDialog_default.sortableList
4096
+ }), /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Root, {
4097
+ onOpenChange: handleMenuOpenChange
4098
+ }, /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Trigger, {
4099
+ className: MultiColumnSortDialog_default.addColumnButton,
4100
+ disabled: availableColumns.length === 0,
4101
+ "aria-label": "Add column to sort"
4102
+ }, /* @__PURE__ */ React21__default.default.createElement(icons.Add, {
4103
+ className: MultiColumnSortDialog_default.addIcon
4104
+ }), /* @__PURE__ */ React21__default.default.createElement("span", {
4105
+ className: MultiColumnSortDialog_default.addColumnText
4106
+ }, "Add Column to Sort"), /* @__PURE__ */ React21__default.default.createElement(icons.CaretDown, {
4107
+ color: "currentColor"
4108
+ })), /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Portal, null, /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Positioner, {
4109
+ className: MultiColumnSortDialog_default.menuPositioner,
4110
+ sideOffset: 4
4111
+ }, /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Popup, {
4112
+ className: MultiColumnSortDialog_default.dropdownMenu
4113
+ }, /* @__PURE__ */ React21__default.default.createElement(SearchBar, {
4114
+ value: menuSearchQuery,
4115
+ onChange: handleMenuSearchChange,
4116
+ placeholder: "Search columns",
4117
+ "aria-label": "Search columns to sort",
4118
+ className: MultiColumnSortDialog_default.menuSearchContainer,
4119
+ onKeyDown: (e) => e.stopPropagation()
4120
+ }), filteredAvailableColumns.map((column) => /* @__PURE__ */ React21__default.default.createElement(AvailableColumnMenuItem, {
4121
+ key: column.id,
4122
+ column,
4123
+ onAddColumn: handleAddColumn
4124
+ })), filteredAvailableColumns.length === 0 && /* @__PURE__ */ React21__default.default.createElement("div", {
4125
+ className: MultiColumnSortDialog_default.menuEmptyState
4126
+ }, "No matching columns")))))));
4127
+ }
4128
+ var DialogTitle2 = /* @__PURE__ */ React21__default.default.createElement("div", {
4129
+ className: MultiColumnSortDialog_default.title
4130
+ }, /* @__PURE__ */ React21__default.default.createElement(icons.Cog, null), "Sort on Multiple Columns");
4131
+ function AvailableColumnMenuItem({
4132
+ column,
4133
+ onAddColumn
4134
+ }) {
4135
+ const onClick = React21.useCallback(() => onAddColumn(column), [onAddColumn, column]);
4136
+ return /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Item, {
4137
+ className: classnames7__default.default(MultiColumnSortDialog_default.dropdownItem, MultiColumnSortDialog_default.truncate),
4138
+ onClick
4139
+ }, column.name);
4140
+ }
4141
+
546
4142
  // src/object-table/TableHeader.module.css
547
4143
  var TableHeader_default = {};
548
4144
 
@@ -553,7 +4149,7 @@ var TableHeaderContent_default = {};
553
4149
  function TableHeaderContent({
554
4150
  header
555
4151
  }) {
556
- return /* @__PURE__ */ React7__default.default.createElement("div", {
4152
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
557
4153
  className: TableHeaderContent_default.osdkHeaderContent
558
4154
  }, reactTable.flexRender(header.column.columnDef.header, header.getContext()));
559
4155
  }
@@ -568,24 +4164,38 @@ function HeaderMenuItem({
568
4164
  label,
569
4165
  active = false
570
4166
  }) {
571
- return /* @__PURE__ */ React7__default.default.createElement(menu.Menu.Item, {
4167
+ return /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Item, {
572
4168
  closeOnClick: true,
573
- className: classNames2__default.default(TableHeaderWithPopover_default.osdkCenterContainer, TableHeaderWithPopover_default.osdkContentGap, TableHeaderWithPopover_default.osdkHeaderMenuItem, active && TableHeaderWithPopover_default.osdkHeaderActiveMenuItem),
4169
+ className: classnames7__default.default(TableHeaderWithPopover_default.osdkCenterContainer, TableHeaderWithPopover_default.osdkContentGap, TableHeaderWithPopover_default.osdkHeaderMenuItem, active && TableHeaderWithPopover_default.osdkHeaderActiveMenuItem),
574
4170
  onClick
575
- }, /* @__PURE__ */ React7__default.default.createElement(Icon, {
4171
+ }, /* @__PURE__ */ React21__default.default.createElement(Icon, {
576
4172
  className: TableHeaderWithPopover_default.osdkHeaderIcon,
577
4173
  color: "currentColor"
578
- }), /* @__PURE__ */ React7__default.default.createElement("span", null, label));
4174
+ }), /* @__PURE__ */ React21__default.default.createElement("span", null, label));
579
4175
  }
580
4176
  function TableHeaderWithPopover({
581
4177
  header,
4178
+ table,
582
4179
  isColumnPinned,
583
- setColumnPinning,
584
- onSortChange,
585
- onResetSize
4180
+ onResetSize,
4181
+ columnOptions,
4182
+ featureFlags,
4183
+ onOpenColumnConfig,
4184
+ onOpenMultiSort
586
4185
  }) {
587
- const [isOpen, setIsOpen] = React7.useState(false);
588
- const handlePinLeft = React7.useCallback(() => {
4186
+ const {
4187
+ showSortingItems = false,
4188
+ showPinningItems = false,
4189
+ showResizeItem = false,
4190
+ showConfigItem = false
4191
+ } = featureFlags ?? {};
4192
+ const {
4193
+ setColumnPinning,
4194
+ setSorting
4195
+ } = table;
4196
+ const currentSorting = table.getState().sorting;
4197
+ const [isOpen, setIsOpen] = React21.useState(false);
4198
+ const handlePinLeft = React21.useCallback(() => {
589
4199
  setColumnPinning((prev) => {
590
4200
  return {
591
4201
  left: [...prev.left || [], header.column.id],
@@ -593,7 +4203,7 @@ function TableHeaderWithPopover({
593
4203
  };
594
4204
  });
595
4205
  }, [header.column.id, setColumnPinning]);
596
- const handleUnpin = React7.useCallback(() => {
4206
+ const handleUnpin = React21.useCallback(() => {
597
4207
  setColumnPinning((prev) => {
598
4208
  return {
599
4209
  left: prev.left?.filter((id) => id !== header.column.id) || [],
@@ -601,98 +4211,116 @@ function TableHeaderWithPopover({
601
4211
  };
602
4212
  });
603
4213
  }, [header.column.id, setColumnPinning]);
604
- const handleSortAscending = React7.useCallback(() => {
4214
+ const handleSortAscending = React21.useCallback(() => {
605
4215
  header.column.toggleSorting(false);
606
- onSortChange?.([{
4216
+ setSorting?.([{
607
4217
  id: header.column.id,
608
4218
  desc: false
609
4219
  }]);
610
- }, [header.column, onSortChange]);
611
- const handleSortDescending = React7.useCallback(() => {
4220
+ }, [header.column, setSorting]);
4221
+ const handleSortDescending = React21.useCallback(() => {
612
4222
  header.column.toggleSorting(true);
613
- onSortChange?.([{
4223
+ setSorting?.([{
614
4224
  id: header.column.id,
615
4225
  desc: true
616
4226
  }]);
617
- }, [header.column, onSortChange]);
618
- const handleClearAllSorts = React7.useCallback(() => {
4227
+ }, [header.column, setSorting]);
4228
+ const handleClearAllSorts = React21.useCallback(() => {
619
4229
  header.column.clearSorting();
620
- onSortChange?.([]);
621
- }, [header.column, onSortChange]);
622
- const handleResetSize = React7.useCallback(() => {
4230
+ setSorting?.([]);
4231
+ }, [header.column, setSorting]);
4232
+ const handleResetSize = React21.useCallback(() => {
623
4233
  header.column.resetSize();
624
4234
  if (onResetSize) {
625
4235
  onResetSize();
626
4236
  }
627
4237
  }, [header.column, onResetSize]);
628
- const handleInteraction = React7.useCallback((e) => {
4238
+ const handleInteraction = React21.useCallback((e) => {
629
4239
  e.preventDefault();
630
4240
  setIsOpen((prev) => !prev);
631
4241
  }, []);
4242
+ const handleOpenColumnConfig = React21.useCallback(() => {
4243
+ onOpenColumnConfig?.();
4244
+ setIsOpen(false);
4245
+ }, [onOpenColumnConfig]);
4246
+ const handleOpenMultiSort = React21.useCallback(() => {
4247
+ onOpenMultiSort?.();
4248
+ setIsOpen(false);
4249
+ }, [onOpenMultiSort]);
632
4250
  const isSorted = header.column.getIsSorted();
633
4251
  const isSortable = header.column.getCanSort();
634
- return /* @__PURE__ */ React7__default.default.createElement(menu.Menu.Root, {
4252
+ const sortIndex = currentSorting?.findIndex((s) => s.id === header.column.id) ?? -1;
4253
+ const hasAnyMenuItems = showPinningItems || showSortingItems && isSortable || showResizeItem || showConfigItem;
4254
+ return /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Root, {
635
4255
  open: isOpen,
636
4256
  onOpenChange: setIsOpen
637
- }, /* @__PURE__ */ React7__default.default.createElement("div", {
638
- className: classNames2__default.default(TableHeaderWithPopover_default.osdkCenterContainer, TableHeaderWithPopover_default.osdkContentGap, TableHeaderWithPopover_default.osdkHeaderContainer),
4257
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
4258
+ className: classnames7__default.default(TableHeaderWithPopover_default.osdkCenterContainer, TableHeaderWithPopover_default.osdkContentGap, TableHeaderWithPopover_default.osdkHeaderContainer),
639
4259
  onContextMenu: handleInteraction
640
- }, /* @__PURE__ */ React7__default.default.createElement("div", {
641
- className: classNames2__default.default(TableHeaderWithPopover_default.osdkCenterContainer, TableHeaderWithPopover_default.osdkContentGap, TableHeaderWithPopover_default.osdkHeaderContentLeft)
642
- }, isColumnPinned && /* @__PURE__ */ React7__default.default.createElement(icons.Pin, {
4260
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
4261
+ className: classnames7__default.default(TableHeaderWithPopover_default.osdkCenterContainer, TableHeaderWithPopover_default.osdkContentGap, TableHeaderWithPopover_default.osdkHeaderContentLeft)
4262
+ }, isColumnPinned && /* @__PURE__ */ React21__default.default.createElement(icons.Pin, {
643
4263
  className: TableHeaderWithPopover_default.osdkHeaderIcon,
644
4264
  color: "currentColor"
645
- }), /* @__PURE__ */ React7__default.default.createElement(TableHeaderContent, {
4265
+ }), /* @__PURE__ */ React21__default.default.createElement(TableHeaderContent, {
646
4266
  header
647
- })), /* @__PURE__ */ React7__default.default.createElement("div", {
648
- className: classNames2__default.default(TableHeaderWithPopover_default.osdkCenterContainer, TableHeaderWithPopover_default.osdkContentGap, TableHeaderWithPopover_default.osdkHeaderContentRight)
649
- }, isSorted && /* @__PURE__ */ React7__default.default.createElement("div", {
4267
+ })), /* @__PURE__ */ React21__default.default.createElement("div", {
4268
+ className: classnames7__default.default(TableHeaderWithPopover_default.osdkCenterContainer, TableHeaderWithPopover_default.osdkContentGap, TableHeaderWithPopover_default.osdkHeaderContentRight)
4269
+ }, isSorted && /* @__PURE__ */ React21__default.default.createElement("div", {
650
4270
  className: TableHeaderWithPopover_default.osdkCenterContainer
651
- }, isSorted === "asc" ? /* @__PURE__ */ React7__default.default.createElement(icons.SortAlphabetical, {
652
- className: TableHeaderWithPopover_default.osdkHeaderIcon,
653
- color: "currentColor"
654
- }) : /* @__PURE__ */ React7__default.default.createElement(icons.SortAlphabeticalDesc, {
655
- className: TableHeaderWithPopover_default.osdkHeaderIcon,
656
- color: "currentColor"
657
- })), /* @__PURE__ */ React7__default.default.createElement(menu.Menu.Trigger, {
4271
+ }, isSorted === "asc" ? /* @__PURE__ */ React21__default.default.createElement(icons.SortAlphabetical, {
4272
+ className: TableHeaderWithPopover_default.osdkHeaderIcon
4273
+ }) : /* @__PURE__ */ React21__default.default.createElement(icons.SortAlphabeticalDesc, {
4274
+ className: TableHeaderWithPopover_default.osdkHeaderIcon
4275
+ }), currentSorting.length > 1 && sortIndex >= 0 && /* @__PURE__ */ React21__default.default.createElement("span", {
4276
+ className: TableHeaderWithPopover_default.sortIndex
4277
+ }, sortIndex + 1)), hasAnyMenuItems && /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Trigger, {
658
4278
  "aria-label": `Open header menu for column with id=${header.column.id}`,
659
- className: classNames2__default.default(TableHeaderWithPopover_default.osdkCenterContainer, TableHeaderWithPopover_default.osdkHeaderPopoverTrigger)
660
- }, /* @__PURE__ */ React7__default.default.createElement(icons.ChevronDown, {
4279
+ className: classnames7__default.default(TableHeaderWithPopover_default.osdkCenterContainer, TableHeaderWithPopover_default.osdkHeaderPopoverTrigger)
4280
+ }, /* @__PURE__ */ React21__default.default.createElement(icons.ChevronDown, {
661
4281
  className: TableHeaderWithPopover_default.osdkHeaderIcon
662
- }))), /* @__PURE__ */ React7__default.default.createElement(menu.Menu.Portal, {
4282
+ }))), /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Portal, {
663
4283
  container: document.body
664
- }, /* @__PURE__ */ React7__default.default.createElement(menu.Menu.Positioner, {
4284
+ }, /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Positioner, {
665
4285
  sideOffset: 4
666
- }, /* @__PURE__ */ React7__default.default.createElement(menu.Menu.Popup, {
4286
+ }, /* @__PURE__ */ React21__default.default.createElement(menu.Menu.Popup, {
667
4287
  className: TableHeaderWithPopover_default.osdkHeaderPopup
668
- }, !isColumnPinned && /* @__PURE__ */ React7__default.default.createElement(HeaderMenuItem, {
4288
+ }, showPinningItems && !isColumnPinned && /* @__PURE__ */ React21__default.default.createElement(HeaderMenuItem, {
669
4289
  onClick: handlePinLeft,
670
4290
  icon: icons.Pin,
671
4291
  label: "Pin column"
672
- }), isColumnPinned && /* @__PURE__ */ React7__default.default.createElement(HeaderMenuItem, {
4292
+ }), showPinningItems && isColumnPinned && /* @__PURE__ */ React21__default.default.createElement(HeaderMenuItem, {
673
4293
  onClick: handleUnpin,
674
4294
  icon: icons.Unpin,
675
4295
  label: "Unpin Column",
676
4296
  active: true
677
- }), isSortable && /* @__PURE__ */ React7__default.default.createElement(React7__default.default.Fragment, null, /* @__PURE__ */ React7__default.default.createElement(HeaderMenuItem, {
4297
+ }), showSortingItems && isSortable && /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement(HeaderMenuItem, {
678
4298
  onClick: handleSortAscending,
679
4299
  icon: icons.SortAlphabetical,
680
4300
  label: "Sort ascending",
681
4301
  active: isSorted === "asc"
682
- }), /* @__PURE__ */ React7__default.default.createElement(HeaderMenuItem, {
4302
+ }), /* @__PURE__ */ React21__default.default.createElement(HeaderMenuItem, {
683
4303
  onClick: handleSortDescending,
684
4304
  icon: icons.SortAlphabeticalDesc,
685
4305
  label: "Sort descending",
686
4306
  active: isSorted === "desc"
687
- })), !!isSorted && /* @__PURE__ */ React7__default.default.createElement(HeaderMenuItem, {
4307
+ }), columnOptions?.some((col) => col.canSort) && /* @__PURE__ */ React21__default.default.createElement(HeaderMenuItem, {
4308
+ onClick: handleOpenMultiSort,
4309
+ icon: icons.Sort,
4310
+ label: "Sort on multiple columns"
4311
+ })), showSortingItems && !!currentSorting?.length && /* @__PURE__ */ React21__default.default.createElement(HeaderMenuItem, {
688
4312
  onClick: handleClearAllSorts,
689
4313
  icon: icons.Remove,
690
4314
  label: "Clear all sorts"
691
- }), /* @__PURE__ */ React7__default.default.createElement(HeaderMenuItem, {
4315
+ }), showResizeItem && /* @__PURE__ */ React21__default.default.createElement(HeaderMenuItem, {
692
4316
  onClick: handleResetSize,
693
4317
  icon: icons.VerticalDistribution,
694
4318
  label: "Reset Column Size"
695
- }))))));
4319
+ }), showConfigItem && /* @__PURE__ */ React21__default.default.createElement(HeaderMenuItem, {
4320
+ onClick: handleOpenColumnConfig,
4321
+ icon: icons.Settings,
4322
+ label: "Configure Columns"
4323
+ })))))));
696
4324
  }
697
4325
 
698
4326
  // src/object-table/utils/getColumnPinningStyles.ts
@@ -708,14 +4336,80 @@ function getColumnPinningStyles(column) {
708
4336
  }
709
4337
 
710
4338
  // src/object-table/TableHeader.tsx
4339
+ var getHeaderName = (column, allHeaders) => {
4340
+ const {
4341
+ id,
4342
+ columnDef
4343
+ } = column;
4344
+ const header = allHeaders.find((header2) => header2.id === id);
4345
+ const headerDef = columnDef.header;
4346
+ if (headerDef) {
4347
+ if (typeof headerDef === "string") {
4348
+ return headerDef;
4349
+ }
4350
+ if (header) {
4351
+ const displayedHeader = headerDef(header.getContext());
4352
+ if (typeof displayedHeader === "string") return displayedHeader;
4353
+ }
4354
+ }
4355
+ const {
4356
+ meta
4357
+ } = columnDef;
4358
+ return meta?.columnName ?? id;
4359
+ };
711
4360
  function TableHeader({
712
- table
4361
+ table,
4362
+ headerMenuFeatureFlags
713
4363
  }) {
4364
+ const {
4365
+ setColumnOrder,
4366
+ setColumnVisibility,
4367
+ setSorting
4368
+ } = table;
4369
+ const currentSorting = table.getState().sorting;
4370
+ const currentVisibility = table.getState().columnVisibility;
4371
+ const currentColumnOrder = table.getState().columnOrder;
714
4372
  const isResizing = !!table.getState().columnSizingInfo?.isResizingColumn;
715
- return /* @__PURE__ */ React7__default.default.createElement("thead", {
4373
+ const [configDialogOpen, setConfigDialogOpen] = React21.useState(false);
4374
+ const [multiSortDialogOpen, setMultiSortDialogOpen] = React21.useState(false);
4375
+ const handleOpenColumnConfig = React21.useCallback(() => {
4376
+ setConfigDialogOpen(true);
4377
+ }, []);
4378
+ const handleCloseColumnConfig = React21.useCallback(() => {
4379
+ setConfigDialogOpen(false);
4380
+ }, []);
4381
+ const handleOpenMultiSort = React21.useCallback(() => {
4382
+ setMultiSortDialogOpen(true);
4383
+ }, []);
4384
+ const handleCloseMultiSort = React21.useCallback(() => {
4385
+ setMultiSortDialogOpen(false);
4386
+ }, []);
4387
+ const handleApplyMultiSort = React21.useCallback((sortColumns) => {
4388
+ setMultiSortDialogOpen(false);
4389
+ setSorting?.(sortColumns);
4390
+ }, [setSorting]);
4391
+ const handleApplyColumnConfig = React21.useCallback((updates) => {
4392
+ const newVisibilityState = {};
4393
+ for (const update of updates) {
4394
+ newVisibilityState[update.columnId] = update.isVisible;
4395
+ }
4396
+ setColumnOrder(updates.map((col) => col.columnId));
4397
+ setColumnVisibility(newVisibilityState);
4398
+ }, [setColumnOrder, setColumnVisibility]);
4399
+ const columnOptions = React21.useMemo(() => {
4400
+ const allHeaders = table.getHeaderGroups().flatMap((headerGroup) => headerGroup.headers);
4401
+ return table.getAllColumns().filter((column) => column.id !== SELECTION_COLUMN_ID).map((column) => {
4402
+ return {
4403
+ id: column.id,
4404
+ name: getHeaderName(column, allHeaders),
4405
+ canSort: column.getCanSort()
4406
+ };
4407
+ });
4408
+ }, [table]);
4409
+ return /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement("thead", {
716
4410
  className: TableHeader_default.osdkTableHeader,
717
4411
  "data-resizing": isResizing
718
- }, table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ React7__default.default.createElement("tr", {
4412
+ }, table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ React21__default.default.createElement("tr", {
719
4413
  key: headerGroup.id,
720
4414
  className: TableHeader_default.osdkTableHeaderRow
721
4415
  }, headerGroup.headers.map((header) => {
@@ -724,24 +4418,41 @@ function TableHeader({
724
4418
  } = getColumnPinningStyles(header.column);
725
4419
  const isColumnPinned = header.column.getIsPinned();
726
4420
  const isSelectColumn = header.id === SELECTION_COLUMN_ID;
727
- return /* @__PURE__ */ React7__default.default.createElement("th", {
4421
+ return /* @__PURE__ */ React21__default.default.createElement("th", {
728
4422
  key: header.id,
729
4423
  "data-pinned": header.column.getIsPinned(),
730
4424
  className: TableHeader_default.osdkTableHeaderCell,
731
4425
  style: columnStyles
732
- }, header.isPlaceholder ? null : isSelectColumn ? /* @__PURE__ */ React7__default.default.createElement(TableHeaderContent, {
4426
+ }, header.isPlaceholder ? null : isSelectColumn ? /* @__PURE__ */ React21__default.default.createElement(TableHeaderContent, {
733
4427
  header
734
- }) : /* @__PURE__ */ React7__default.default.createElement(TableHeaderWithPopover, {
4428
+ }) : /* @__PURE__ */ React21__default.default.createElement(TableHeaderWithPopover, {
4429
+ table,
735
4430
  header,
736
4431
  isColumnPinned,
737
- setColumnPinning: table.setColumnPinning
738
- }), header.column.getCanResize() && /* @__PURE__ */ React7__default.default.createElement("div", {
4432
+ columnOptions,
4433
+ featureFlags: headerMenuFeatureFlags,
4434
+ onOpenColumnConfig: handleOpenColumnConfig,
4435
+ onOpenMultiSort: handleOpenMultiSort
4436
+ }), header.column.getCanResize() && headerMenuFeatureFlags?.showResizeItem !== false && /* @__PURE__ */ React21__default.default.createElement("div", {
739
4437
  className: TableHeader_default.osdkTableHeaderResizer,
740
4438
  onDoubleClick: () => header.column.resetSize(),
741
4439
  onMouseDown: header.getResizeHandler(),
742
4440
  onTouchStart: header.getResizeHandler()
743
4441
  }));
744
- }))));
4442
+ })))), !!columnOptions?.length && /* @__PURE__ */ React21__default.default.createElement(ColumnConfigDialog, {
4443
+ isOpen: configDialogOpen,
4444
+ onClose: handleCloseColumnConfig,
4445
+ columnOptions,
4446
+ currentVisibility,
4447
+ currentColumnOrder,
4448
+ onApply: handleApplyColumnConfig
4449
+ }), columnOptions?.some((col) => col.canSort) && /* @__PURE__ */ React21__default.default.createElement(MultiColumnSortDialog, {
4450
+ isOpen: multiSortDialogOpen,
4451
+ onClose: handleCloseMultiSort,
4452
+ columnOptions,
4453
+ currentSorting,
4454
+ onApply: handleApplyMultiSort
4455
+ }));
745
4456
  }
746
4457
 
747
4458
  // src/object-table/LoadingStateTable.tsx
@@ -753,15 +4464,15 @@ function LoadingStateTable({
753
4464
  rowHeight = 40,
754
4465
  columnWidth = 120
755
4466
  }) {
756
- const isSelectionEnabled = table.options.enableRowSelection;
757
- const minHeaderCount = isSelectionEnabled ? 1 : 0;
758
- const headers = headerGroups[0]?.headers ?? [];
4467
+ const enableRowSelection = table.options.enableRowSelection;
4468
+ const minHeaderCount = enableRowSelection ? 1 : 0;
4469
+ const headers = React21.useMemo(() => headerGroups.length > 0 ? headerGroups[0].headers : [], [headerGroups]);
759
4470
  const hasHeadersLoaded = headers.length > minHeaderCount;
760
- const headerRef = React7.useRef(null);
761
- const bodyRef = React7.useRef(null);
762
- const [loadingRowCount, setLoadingRowCount] = React7.useState(MIN_ROWS);
763
- const [loadingColumnCount, setLoadingColumnCount] = React7.useState(headers.length);
764
- React7.useEffect(() => {
4471
+ const headerRef = React21.useRef(null);
4472
+ const bodyRef = React21.useRef(null);
4473
+ const [loadingRowCount, setLoadingRowCount] = React21.useState(MIN_ROWS);
4474
+ const [loadingColumnCount, setLoadingColumnCount] = React21.useState(headers.length);
4475
+ React21.useEffect(() => {
765
4476
  if (hasHeadersLoaded) {
766
4477
  setLoadingColumnCount(headers.length);
767
4478
  } else {
@@ -774,7 +4485,7 @@ function LoadingStateTable({
774
4485
  }
775
4486
  }
776
4487
  }, [columnWidth, hasHeadersLoaded, headers, tableContainerRef]);
777
- React7.useEffect(() => {
4488
+ React21.useEffect(() => {
778
4489
  if (tableContainerRef.current) {
779
4490
  const containerHeight = tableContainerRef.current.clientHeight;
780
4491
  const availableHeight = containerHeight - rowHeight;
@@ -784,32 +4495,32 @@ function LoadingStateTable({
784
4495
  }
785
4496
  }
786
4497
  }, [tableContainerRef, rowHeight]);
787
- return /* @__PURE__ */ React7__default.default.createElement(React7__default.default.Fragment, null, hasHeadersLoaded ? /* @__PURE__ */ React7__default.default.createElement(TableHeader, {
4498
+ return /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, hasHeadersLoaded ? /* @__PURE__ */ React21__default.default.createElement(TableHeader, {
788
4499
  table
789
- }) : /* @__PURE__ */ React7__default.default.createElement("thead", {
4500
+ }) : /* @__PURE__ */ React21__default.default.createElement("thead", {
790
4501
  className: TableHeader_default.osdkTableHeader,
791
4502
  ref: headerRef
792
- }, /* @__PURE__ */ React7__default.default.createElement("tr", {
4503
+ }, /* @__PURE__ */ React21__default.default.createElement("tr", {
793
4504
  className: TableHeader_default.osdkTableHeaderRow
794
4505
  }, Array.from({
795
4506
  length: loadingColumnCount
796
4507
  }).map((_, index) => {
797
4508
  const width = headers.length > index ? headers[index].getSize() : columnWidth;
798
- return /* @__PURE__ */ React7__default.default.createElement("th", {
4509
+ return /* @__PURE__ */ React21__default.default.createElement("th", {
799
4510
  key: `loading-header-${index}`,
800
4511
  className: TableHeader_default.osdkTableHeaderCell,
801
4512
  style: {
802
4513
  width
803
4514
  }
804
- }, /* @__PURE__ */ React7__default.default.createElement("div", {
805
- className: classNames2__default.default(TableHeader_default.osdkLoadingHeaderCell, LoadingCell_default.osdkCellSkeleton)
4515
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
4516
+ className: classnames7__default.default(TableHeader_default.osdkLoadingHeaderCell, LoadingCell_default.osdkCellSkeleton)
806
4517
  }));
807
- }))), /* @__PURE__ */ React7__default.default.createElement("tbody", {
4518
+ }))), /* @__PURE__ */ React21__default.default.createElement("tbody", {
808
4519
  className: TableBody_default.osdkTableBody,
809
4520
  ref: bodyRef
810
4521
  }, Array.from({
811
4522
  length: loadingRowCount
812
- }).map((_, index) => /* @__PURE__ */ React7__default.default.createElement(LoadingRow, {
4523
+ }).map((_, index) => /* @__PURE__ */ React21__default.default.createElement(LoadingRow, {
813
4524
  key: `skeleton-${index}`,
814
4525
  columnCount: loadingColumnCount,
815
4526
  headers,
@@ -826,9 +4537,9 @@ var NonIdealState_default = {};
826
4537
  function NonIdealState({
827
4538
  message
828
4539
  }) {
829
- return /* @__PURE__ */ React7__default.default.createElement("div", {
4540
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
830
4541
  className: NonIdealState_default.container
831
- }, /* @__PURE__ */ React7__default.default.createElement("div", {
4542
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
832
4543
  className: NonIdealState_default.message
833
4544
  }, message));
834
4545
  }
@@ -846,8 +4557,8 @@ function CellContextMenu({
846
4557
  onClose,
847
4558
  renderContent
848
4559
  }) {
849
- const ref = React7.useRef(null);
850
- React7.useEffect(() => {
4560
+ const ref = React21.useRef(null);
4561
+ React21.useEffect(() => {
851
4562
  const handleClickOutside = (event) => {
852
4563
  if (ref.current && !ref.current.contains(event.target)) {
853
4564
  onClose();
@@ -858,7 +4569,7 @@ function CellContextMenu({
858
4569
  document.removeEventListener("mousedown", handleClickOutside);
859
4570
  };
860
4571
  }, [onClose]);
861
- return /* @__PURE__ */ reactDom.createPortal(/* @__PURE__ */ React7__default.default.createElement("div", {
4572
+ return /* @__PURE__ */ reactDom.createPortal(/* @__PURE__ */ React21__default.default.createElement("div", {
862
4573
  ref,
863
4574
  className: CellContextMenu_default.osdkCellContextMenu,
864
4575
  style: {
@@ -871,9 +4582,9 @@ function CellContextMenu({
871
4582
  var useCellContextMenu = ({
872
4583
  tdRef
873
4584
  }) => {
874
- const [popoverPosition, setPopoverPosition] = React7.useState(null);
875
- const [isContextMenuOpen, setIsContextMenuOpen] = React7.useState(false);
876
- const handleOpenContextMenu = React7.useCallback((event) => {
4585
+ const [popoverPosition, setPopoverPosition] = React21.useState(null);
4586
+ const [isContextMenuOpen, setIsContextMenuOpen] = React21.useState(false);
4587
+ const handleOpenContextMenu = React21.useCallback((event) => {
877
4588
  event.preventDefault();
878
4589
  event.stopPropagation();
879
4590
  if (tdRef.current) {
@@ -887,7 +4598,7 @@ var useCellContextMenu = ({
887
4598
  setIsContextMenuOpen(true);
888
4599
  }
889
4600
  }, [tdRef]);
890
- const handleCloseContextMenu = React7.useCallback(() => {
4601
+ const handleCloseContextMenu = React21.useCallback(() => {
891
4602
  setIsContextMenuOpen(false);
892
4603
  setPopoverPosition(null);
893
4604
  }, []);
@@ -904,7 +4615,7 @@ function TableCell({
904
4615
  cell,
905
4616
  renderCellContextMenu
906
4617
  }) {
907
- const tdRef = React7.useRef(null);
4618
+ const tdRef = React21.useRef(null);
908
4619
  const isSelectColumn = cell.column.id === SELECTION_COLUMN_ID;
909
4620
  const {
910
4621
  isContextMenuOpen,
@@ -918,15 +4629,15 @@ function TableCell({
918
4629
  const {
919
4630
  columnStyles
920
4631
  } = getColumnPinningStyles(cell.column);
921
- return /* @__PURE__ */ React7__default.default.createElement(React7__default.default.Fragment, null, /* @__PURE__ */ React7__default.default.createElement("td", {
4632
+ return /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement("td", {
922
4633
  ref: tdRef,
923
4634
  "data-pinned": cell.column.getIsPinned(),
924
4635
  className: TableCell_default.osdkTableCell,
925
4636
  style: columnStyles,
926
4637
  onContextMenu: handleOpenContextMenu
927
- }, /* @__PURE__ */ React7__default.default.createElement("div", {
4638
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
928
4639
  className: TableCell_default.osdkTableCellContent
929
- }, reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()))), shouldRenderContextMenu && /* @__PURE__ */ React7__default.default.createElement(CellContextMenu, {
4640
+ }, reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()))), shouldRenderContextMenu && /* @__PURE__ */ React21__default.default.createElement(CellContextMenu, {
930
4641
  cell,
931
4642
  position: popoverPosition,
932
4643
  onClose: handleCloseContextMenu,
@@ -941,10 +4652,10 @@ function TableRow({
941
4652
  onRowClick,
942
4653
  renderCellContextMenu
943
4654
  }) {
944
- const handleClick = React7.useCallback(() => {
4655
+ const handleClick = React21.useCallback(() => {
945
4656
  onRowClick?.(row.original);
946
4657
  }, [onRowClick, row.original]);
947
- return /* @__PURE__ */ React7__default.default.createElement("tr", {
4658
+ return /* @__PURE__ */ React21__default.default.createElement("tr", {
948
4659
  "data-selected": row.getIsSelected(),
949
4660
  className: TableRow_default.osdkTableRow,
950
4661
  style: {
@@ -952,7 +4663,7 @@ function TableRow({
952
4663
  transform: `translateY(${virtualRow.start}px)`
953
4664
  },
954
4665
  onClick: handleClick
955
- }, row.getVisibleCells().map((cell) => /* @__PURE__ */ React7__default.default.createElement(TableCell, {
4666
+ }, row.getVisibleCells().map((cell) => /* @__PURE__ */ React21__default.default.createElement(TableCell, {
956
4667
  key: cell.id,
957
4668
  cell,
958
4669
  renderCellContextMenu
@@ -975,27 +4686,27 @@ function TableBody({
975
4686
  getScrollElement: () => tableContainerRef.current,
976
4687
  overscan: 5
977
4688
  });
978
- React7.useLayoutEffect(() => {
4689
+ React21.useLayoutEffect(() => {
979
4690
  rowVirtualizer.measure();
980
4691
  }, [rowVirtualizer, rows.length]);
981
4692
  const totalSize = rowVirtualizer.getTotalSize();
982
4693
  const bodyHeight = isLoadingMore ? totalSize + rowHeight : totalSize;
983
4694
  const headers = headerGroups[0]?.headers ?? [];
984
- return /* @__PURE__ */ React7__default.default.createElement("tbody", {
4695
+ return /* @__PURE__ */ React21__default.default.createElement("tbody", {
985
4696
  className: TableBody_default.osdkTableBody,
986
4697
  style: {
987
4698
  height: `${bodyHeight}px`
988
4699
  }
989
4700
  }, rowVirtualizer.getVirtualItems().map((virtualRow) => {
990
4701
  const row = rows[virtualRow.index];
991
- return /* @__PURE__ */ React7__default.default.createElement(TableRow, {
4702
+ return /* @__PURE__ */ React21__default.default.createElement(TableRow, {
992
4703
  key: row.id,
993
4704
  row,
994
4705
  virtualRow,
995
4706
  onRowClick,
996
4707
  renderCellContextMenu
997
4708
  });
998
- }), isLoadingMore && /* @__PURE__ */ React7__default.default.createElement(LoadingRow, {
4709
+ }), isLoadingMore && /* @__PURE__ */ React21__default.default.createElement(LoadingRow, {
999
4710
  headers,
1000
4711
  translateY: totalSize,
1001
4712
  rowHeight,
@@ -1012,17 +4723,19 @@ function BaseTable({
1012
4723
  rowHeight,
1013
4724
  renderCellContextMenu,
1014
4725
  className,
1015
- error
4726
+ error,
4727
+ headerMenuFeatureFlags,
4728
+ editableConfig
1016
4729
  }) {
1017
- const tableContainerRef = React7.useRef(null);
1018
- const [isLoadingMore, setIsLoadingMore] = React7.useState(false);
1019
- const fetchingRef = React7.useRef(false);
1020
- React7.useEffect(() => {
4730
+ const tableContainerRef = React21.useRef(null);
4731
+ const [isLoadingMore, setIsLoadingMore] = React21.useState(false);
4732
+ const fetchingRef = React21.useRef(false);
4733
+ React21.useEffect(() => {
1021
4734
  if (!isLoading || fetchNextPage == null) {
1022
4735
  setIsLoadingMore(false);
1023
4736
  }
1024
4737
  }, [isLoading, fetchNextPage]);
1025
- const fetchMoreOnEndReached = React7.useCallback(async (containerRefElement) => {
4738
+ const fetchMoreOnEndReached = React21.useCallback(async (containerRefElement) => {
1026
4739
  if (containerRefElement && !fetchingRef.current && !isLoadingMore) {
1027
4740
  const {
1028
4741
  scrollHeight,
@@ -1040,26 +4753,32 @@ function BaseTable({
1040
4753
  }
1041
4754
  }
1042
4755
  }, [fetchNextPage, isLoading, isLoadingMore]);
1043
- const handleScroll = React7.useCallback(async (e) => {
4756
+ const handleScroll = React21.useCallback(async (e) => {
1044
4757
  await fetchMoreOnEndReached(e.currentTarget);
1045
4758
  }, [fetchMoreOnEndReached]);
1046
4759
  const rows = table.getRowModel().rows;
1047
4760
  const headerGroups = table.getHeaderGroups();
1048
4761
  const hasData = rows.length > 0;
1049
- return /* @__PURE__ */ React7__default.default.createElement("div", {
4762
+ const hasEdits = Object.keys(editableConfig?.cellEdits ?? {}).length > 0;
4763
+ const handleSubmitEdits = React21.useCallback(async () => {
4764
+ await editableConfig?.onSubmitEdits?.();
4765
+ editableConfig?.clearEdits?.();
4766
+ }, [editableConfig]);
4767
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
4768
+ className: classnames7__default.default(Table_default.osdkTableWrapper, className)
4769
+ }, /* @__PURE__ */ React21__default.default.createElement("div", {
1050
4770
  ref: tableContainerRef,
1051
- className: classNames2__default.default(Table_default.osdkTableContainer, className),
4771
+ className: classnames7__default.default(Table_default.osdkTableContainer, editableConfig && Table_default.osdkTableContainerWithButton),
1052
4772
  onScroll: handleScroll
1053
- }, /* @__PURE__ */ React7__default.default.createElement("table", null, isLoading && !hasData ? /* @__PURE__ */ React7__default.default.createElement(LoadingStateTable, {
4773
+ }, /* @__PURE__ */ React21__default.default.createElement("table", null, isLoading && !hasData ? /* @__PURE__ */ React21__default.default.createElement(LoadingStateTable, {
1054
4774
  table,
1055
4775
  headerGroups,
1056
4776
  rowHeight,
1057
4777
  tableContainerRef
1058
- }) : /* @__PURE__ */ React7__default.default.createElement(React7__default.default.Fragment, null, /* @__PURE__ */ React7__default.default.createElement(TableHeader, {
1059
- table
1060
- }), !hasData && error == null ? /* @__PURE__ */ React7__default.default.createElement(NonIdealState, {
1061
- message: "No Data"
1062
- }) : /* @__PURE__ */ React7__default.default.createElement(TableBody, {
4778
+ }) : /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, /* @__PURE__ */ React21__default.default.createElement(TableHeader, {
4779
+ table,
4780
+ headerMenuFeatureFlags
4781
+ }), /* @__PURE__ */ React21__default.default.createElement(TableBody, {
1063
4782
  rows,
1064
4783
  tableContainerRef,
1065
4784
  onRowClick,
@@ -1067,27 +4786,59 @@ function BaseTable({
1067
4786
  renderCellContextMenu,
1068
4787
  isLoadingMore,
1069
4788
  headerGroups
1070
- })), error != null && /* @__PURE__ */ React7__default.default.createElement(NonIdealState, {
4789
+ }))), !hasData && error == null && /* @__PURE__ */ React21__default.default.createElement(NonIdealState, {
4790
+ message: "No Data"
4791
+ }), error != null && /* @__PURE__ */ React21__default.default.createElement(NonIdealState, {
1071
4792
  message: `Error Loading Data: ${error.message}`
1072
- })));
4793
+ })), editableConfig && /* @__PURE__ */ React21__default.default.createElement("div", {
4794
+ className: Table_default.submitButtonContainer
4795
+ }, /* @__PURE__ */ React21__default.default.createElement(ActionButton, {
4796
+ variant: "primary",
4797
+ onClick: handleSubmitEdits,
4798
+ disabled: !hasEdits
4799
+ }, "Submit Edits")));
1073
4800
  }
1074
4801
 
1075
4802
  // src/object-table/ObjectTable.tsx
1076
4803
  function ObjectTable({
1077
4804
  objectType,
4805
+ objectSet,
1078
4806
  columnDefinitions,
1079
4807
  filter,
4808
+ objectSetOptions,
1080
4809
  orderBy,
1081
4810
  defaultOrderBy,
1082
4811
  onOrderByChanged,
1083
4812
  onColumnsPinnedChanged,
4813
+ onColumnResize,
1084
4814
  onRowSelection,
1085
4815
  renderCellContextMenu,
1086
4816
  selectionMode = "none",
1087
4817
  selectedRows,
4818
+ onColumnVisibilityChanged,
4819
+ onCellValueChanged,
4820
+ onSubmitEdits,
4821
+ enableOrdering = true,
4822
+ enableColumnPinning = true,
4823
+ enableColumnResizing = true,
4824
+ enableColumnConfig = true,
1088
4825
  ...props
1089
4826
  }) {
1090
- const [columnSizing, setColumnSizing] = React7.useState({});
4827
+ const {
4828
+ columnSizing,
4829
+ onColumnSizingChange
4830
+ } = useColumnResize({
4831
+ onColumnResize
4832
+ });
4833
+ const {
4834
+ cellEdits,
4835
+ clearEdits,
4836
+ handleCellEdit,
4837
+ handleSubmitEdits
4838
+ } = useEditableTable({
4839
+ onCellValueChanged,
4840
+ onSubmitEdits
4841
+ });
1091
4842
  const {
1092
4843
  sorting,
1093
4844
  onSortingChange
@@ -1101,20 +4852,18 @@ function ObjectTable({
1101
4852
  fetchMore,
1102
4853
  isLoading,
1103
4854
  error
1104
- } = useObjectTableData(objectType, columnDefinitions, filter, sorting);
4855
+ } = useObjectTableData(objectType, columnDefinitions, filter, sorting, objectSet, objectSetOptions);
1105
4856
  const {
1106
4857
  columns,
1107
4858
  loading: isColumnsLoading
1108
4859
  } = useColumnDefs(objectType, columnDefinitions);
1109
- const columnVisibility = useColumnVisibility({
1110
- columnDefinitions
1111
- });
1112
4860
  const {
1113
4861
  rowSelection,
1114
4862
  isAllSelected,
1115
4863
  hasSelection,
1116
4864
  onToggleAll,
1117
- onToggleRow
4865
+ onToggleRow,
4866
+ enableRowSelection
1118
4867
  } = useRowSelection({
1119
4868
  selectionMode,
1120
4869
  selectedRows,
@@ -1128,32 +4877,45 @@ function ObjectTable({
1128
4877
  onToggleAll,
1129
4878
  onToggleRow
1130
4879
  });
1131
- const allColumns = React7.useMemo(() => {
1132
- return selectionColumn ? [selectionColumn, ...columns] : columns;
1133
- }, [selectionColumn, columns]);
4880
+ const {
4881
+ columnVisibility,
4882
+ onColumnVisibilityChange,
4883
+ columnOrder,
4884
+ onColumnOrderChange
4885
+ } = useColumnVisibility({
4886
+ allColumns: columns,
4887
+ onColumnVisibilityChanged
4888
+ });
1134
4889
  const {
1135
4890
  columnPinning,
1136
4891
  onColumnPinningChange
1137
4892
  } = useColumnPinning({
1138
4893
  columnDefinitions,
1139
- hasSelectionColumn: selectionColumn != null,
4894
+ hasSelectionColumn: enableRowSelection,
1140
4895
  onColumnsPinnedChanged
1141
4896
  });
4897
+ const allColumns = React21.useMemo(() => {
4898
+ return selectionColumn ? [selectionColumn, ...columns] : columns;
4899
+ }, [selectionColumn, columns]);
1142
4900
  const table = reactTable.useReactTable({
1143
4901
  data: data ?? [],
1144
4902
  columns: allColumns,
1145
4903
  getCoreRowModel: reactTable.getCoreRowModel(),
1146
4904
  state: {
1147
4905
  columnVisibility,
4906
+ columnOrder,
1148
4907
  rowSelection,
1149
4908
  sorting,
1150
4909
  columnSizing,
1151
4910
  columnPinning
1152
4911
  },
1153
4912
  onSortingChange,
1154
- onColumnSizingChange: setColumnSizing,
4913
+ onColumnSizingChange,
1155
4914
  onColumnPinningChange,
1156
- enableRowSelection: selectionMode !== "none",
4915
+ onColumnVisibilityChange,
4916
+ onColumnOrderChange,
4917
+ enableRowSelection,
4918
+ enableSorting: enableOrdering,
1157
4919
  columnResizeMode: "onChange",
1158
4920
  columnResizeDirection: "ltr",
1159
4921
  manualSorting: true,
@@ -1161,13 +4923,33 @@ function ObjectTable({
1161
4923
  defaultColumn: {
1162
4924
  minSize: 80
1163
4925
  },
1164
- getRowId
4926
+ getRowId,
4927
+ meta: {
4928
+ onCellEdit: handleCellEdit,
4929
+ cellEdits
4930
+ }
1165
4931
  });
1166
- const onRenderCellContextMenu = React7.useCallback((row, cell) => {
4932
+ const onRenderCellContextMenu = React21.useCallback((row, cell) => {
1167
4933
  return renderCellContextMenu?.(row, cell.getValue());
1168
4934
  }, [renderCellContextMenu]);
1169
4935
  const isTableLoading = isLoading || isColumnsLoading;
1170
- return /* @__PURE__ */ React7__default.default.createElement(BaseTable, {
4936
+ const headerMenuFeatureFlags = React21.useMemo(() => ({
4937
+ showSortingItems: enableOrdering,
4938
+ showPinningItems: enableColumnPinning,
4939
+ showResizeItem: enableColumnResizing,
4940
+ showConfigItem: enableColumnConfig
4941
+ }), [enableOrdering, enableColumnPinning, enableColumnResizing, enableColumnConfig]);
4942
+ const editableConfig = React21.useMemo(() => {
4943
+ if (!onSubmitEdits) {
4944
+ return;
4945
+ }
4946
+ return {
4947
+ onSubmitEdits: handleSubmitEdits,
4948
+ clearEdits,
4949
+ cellEdits
4950
+ };
4951
+ }, [onSubmitEdits, handleSubmitEdits, clearEdits, cellEdits]);
4952
+ return /* @__PURE__ */ React21__default.default.createElement(BaseTable, {
1171
4953
  table,
1172
4954
  isLoading: isTableLoading,
1173
4955
  fetchNextPage: fetchMore,
@@ -1175,11 +4957,15 @@ function ObjectTable({
1175
4957
  rowHeight: props.rowHeight,
1176
4958
  renderCellContextMenu: onRenderCellContextMenu,
1177
4959
  className: props.className,
1178
- error
4960
+ error,
4961
+ headerMenuFeatureFlags,
4962
+ editableConfig
1179
4963
  });
1180
4964
  }
1181
4965
 
1182
4966
  exports.BaseTable = BaseTable;
4967
+ exports.ColumnConfigDialog = ColumnConfigDialog;
4968
+ exports.FilterList = FilterList;
1183
4969
  exports.ObjectTable = ObjectTable;
1184
4970
  //# sourceMappingURL=experimental.cjs.map
1185
4971
  //# sourceMappingURL=experimental.cjs.map