@osdk/react-components 0.2.0-beta.15 → 0.2.0-beta.16

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 (337) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/browser/base-components/action-button/ActionButton.module.css +0 -4
  3. package/build/browser/base-components/checkbox/Checkbox.module.css +0 -4
  4. package/build/browser/base-components/dialog/Dialog.module.css +0 -8
  5. package/build/browser/base-components/draggable-list/DraggableList.js +4 -2
  6. package/build/browser/base-components/draggable-list/DraggableList.js.map +1 -1
  7. package/build/browser/base-components/draggable-list/DraggableList.module.css +0 -8
  8. package/build/browser/filter-list/FilterInput.js +132 -0
  9. package/build/browser/filter-list/FilterInput.js.map +1 -0
  10. package/build/browser/filter-list/FilterList.js +91 -0
  11. package/build/browser/filter-list/FilterList.js.map +1 -0
  12. package/build/browser/filter-list/FilterListApi.js.map +1 -1
  13. package/build/browser/filter-list/FilterListItemApi.js.map +1 -1
  14. package/build/browser/filter-list/base/{FilterList.js → BaseFilterList.js} +30 -31
  15. package/build/browser/filter-list/base/BaseFilterList.js.map +1 -0
  16. package/build/browser/filter-list/base/BaseFilterListApi.js +2 -0
  17. package/build/browser/filter-list/base/BaseFilterListApi.js.map +1 -0
  18. package/build/browser/filter-list/base/FilterIcons.js +63 -0
  19. package/build/browser/filter-list/base/FilterIcons.js.map +1 -0
  20. package/build/browser/filter-list/base/FilterList.module.css +22 -1
  21. package/build/browser/filter-list/base/FilterList.module.css.js +2 -0
  22. package/build/browser/filter-list/base/FilterListContent.js +21 -20
  23. package/build/browser/filter-list/base/FilterListContent.js.map +1 -1
  24. package/build/browser/filter-list/base/FilterListHeader.js +8 -3
  25. package/build/browser/filter-list/base/FilterListHeader.js.map +1 -1
  26. package/build/browser/filter-list/base/FilterListHeader.module.css +25 -1
  27. package/build/browser/filter-list/base/FilterListHeader.module.css.js +3 -0
  28. package/build/browser/filter-list/base/FilterListItem.js +36 -17
  29. package/build/browser/filter-list/base/FilterListItem.js.map +1 -1
  30. package/build/browser/filter-list/base/FilterListItem.module.css +58 -2
  31. package/build/browser/filter-list/base/FilterListItem.module.css.js +2 -0
  32. package/build/browser/filter-list/base/SortableFilterListItem.js +6 -6
  33. package/build/browser/filter-list/base/SortableFilterListItem.js.map +1 -1
  34. package/build/browser/filter-list/base/index.js +1 -2
  35. package/build/browser/filter-list/base/index.js.map +1 -1
  36. package/build/browser/filter-list/base/inputs/CheckboxListInput.js +34 -15
  37. package/build/browser/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
  38. package/build/browser/filter-list/base/inputs/CheckboxListInput.module.css +13 -0
  39. package/build/browser/filter-list/base/inputs/CheckboxListInput.module.css.js +2 -1
  40. package/build/browser/filter-list/base/inputs/DateRangeInput.js.map +1 -1
  41. package/build/browser/filter-list/base/inputs/ListogramInput.js +17 -21
  42. package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
  43. package/build/browser/filter-list/base/inputs/ListogramInput.module.css +25 -19
  44. package/build/browser/filter-list/base/inputs/MultiDateInput.module.css +6 -4
  45. package/build/browser/filter-list/base/inputs/MultiSelectInput.js +7 -14
  46. package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
  47. package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css +4 -1
  48. package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css.js +1 -1
  49. package/build/browser/filter-list/base/inputs/NullValueWrapper.js +4 -23
  50. package/build/browser/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
  51. package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css +3 -2
  52. package/build/browser/filter-list/base/inputs/NumberRangeInput.js.map +1 -1
  53. package/build/browser/filter-list/base/inputs/RangeInput.js +2 -32
  54. package/build/browser/filter-list/base/inputs/RangeInput.js.map +1 -1
  55. package/build/browser/filter-list/base/inputs/RangeInput.module.css +16 -14
  56. package/build/browser/filter-list/base/inputs/SingleDateInput.module.css +2 -1
  57. package/build/browser/filter-list/base/inputs/SingleSelectInput.js +6 -13
  58. package/build/browser/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
  59. package/build/browser/filter-list/base/inputs/TextTagsInput.js +6 -14
  60. package/build/browser/filter-list/base/inputs/TextTagsInput.js.map +1 -1
  61. package/build/browser/filter-list/base/inputs/TimelineInput.js +2 -2
  62. package/build/browser/filter-list/base/inputs/TimelineInput.js.map +1 -1
  63. package/build/browser/filter-list/base/inputs/TimelineInput.module.css +14 -12
  64. package/build/browser/filter-list/base/inputs/shared.module.css +5 -4
  65. package/build/browser/filter-list/hooks/useFilterListState.js +24 -3
  66. package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
  67. package/build/browser/filter-list/hooks/usePropertyAggregation.js.map +1 -1
  68. package/build/browser/filter-list/inputs/CheckboxListFilterInput.js +56 -0
  69. package/build/browser/filter-list/inputs/CheckboxListFilterInput.js.map +1 -0
  70. package/build/browser/filter-list/inputs/ContainsTextFilterInput.js +38 -0
  71. package/build/browser/filter-list/inputs/ContainsTextFilterInput.js.map +1 -0
  72. package/build/browser/filter-list/inputs/DateRangeFilterInput.js +105 -0
  73. package/build/browser/filter-list/inputs/DateRangeFilterInput.js.map +1 -0
  74. package/build/browser/filter-list/inputs/LinkedPropertyInput.js +508 -0
  75. package/build/browser/filter-list/inputs/LinkedPropertyInput.js.map +1 -0
  76. package/build/browser/filter-list/inputs/ListogramFilterInput.js +62 -0
  77. package/build/browser/filter-list/inputs/ListogramFilterInput.js.map +1 -0
  78. package/build/browser/filter-list/inputs/MultiDateFilterInput.js +38 -0
  79. package/build/browser/filter-list/inputs/MultiDateFilterInput.js.map +1 -0
  80. package/build/browser/filter-list/inputs/MultiSelectFilterInput.js +55 -0
  81. package/build/browser/filter-list/inputs/MultiSelectFilterInput.js.map +1 -0
  82. package/build/browser/filter-list/inputs/NumberRangeFilterInput.js +105 -0
  83. package/build/browser/filter-list/inputs/NumberRangeFilterInput.js.map +1 -0
  84. package/build/browser/filter-list/inputs/PropertyFilterInput.js +129 -0
  85. package/build/browser/filter-list/inputs/PropertyFilterInput.js.map +1 -0
  86. package/build/browser/filter-list/inputs/SingleDateFilterInput.js +38 -0
  87. package/build/browser/filter-list/inputs/SingleDateFilterInput.js.map +1 -0
  88. package/build/browser/filter-list/inputs/SingleSelectFilterInput.js +55 -0
  89. package/build/browser/filter-list/inputs/SingleSelectFilterInput.js.map +1 -0
  90. package/build/browser/filter-list/inputs/TextTagsFilterInput.js +54 -0
  91. package/build/browser/filter-list/inputs/TextTagsFilterInput.js.map +1 -0
  92. package/build/browser/filter-list/inputs/TimelineFilterInput.js +49 -0
  93. package/build/browser/filter-list/inputs/TimelineFilterInput.js.map +1 -0
  94. package/build/browser/filter-list/inputs/ToggleFilterInput.js +36 -0
  95. package/build/browser/filter-list/inputs/ToggleFilterInput.js.map +1 -0
  96. package/build/browser/filter-list/types/AggregationTypes.js +2 -0
  97. package/build/browser/filter-list/types/AggregationTypes.js.map +1 -0
  98. package/build/browser/filter-list/types/LinkedFilterTypes.js.map +1 -1
  99. package/build/browser/filter-list/types/index.js +0 -2
  100. package/build/browser/filter-list/types/index.js.map +1 -1
  101. package/build/browser/filter-list/utils/filterStateSerialization.js +42 -0
  102. package/build/browser/filter-list/utils/filterStateSerialization.js.map +1 -0
  103. package/build/browser/filter-list/utils/filterStateToWhereClause.js +19 -11
  104. package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  105. package/build/browser/filter-list/utils/filterValues.js +26 -0
  106. package/build/browser/filter-list/utils/filterValues.js.map +1 -1
  107. package/build/browser/object-table/ColumnConfigDialog.module.css +0 -9
  108. package/build/browser/object-table/MultiColumnSortDialog.module.css +0 -4
  109. package/build/browser/object-table/TableHeaderWithPopover.module.css +0 -12
  110. package/build/browser/public/experimental.js +4 -1
  111. package/build/browser/public/experimental.js.map +1 -1
  112. package/build/browser/shared/ErrorBoundary.module.css +14 -14
  113. package/build/browser/styles.css +207 -124
  114. package/build/cjs/public/experimental.cjs +3144 -2551
  115. package/build/cjs/public/experimental.cjs.map +1 -1
  116. package/build/cjs/public/experimental.css +591 -513
  117. package/build/cjs/public/experimental.css.map +1 -1
  118. package/build/cjs/public/experimental.d.cts +62 -2
  119. package/build/esm/base-components/action-button/ActionButton.module.css +0 -4
  120. package/build/esm/base-components/checkbox/Checkbox.module.css +0 -4
  121. package/build/esm/base-components/dialog/Dialog.module.css +0 -8
  122. package/build/esm/base-components/draggable-list/DraggableList.js +4 -2
  123. package/build/esm/base-components/draggable-list/DraggableList.js.map +1 -1
  124. package/build/esm/base-components/draggable-list/DraggableList.module.css +0 -8
  125. package/build/esm/filter-list/FilterInput.js +132 -0
  126. package/build/esm/filter-list/FilterInput.js.map +1 -0
  127. package/build/esm/filter-list/FilterList.js +91 -0
  128. package/build/esm/filter-list/FilterList.js.map +1 -0
  129. package/build/esm/filter-list/FilterListApi.js.map +1 -1
  130. package/build/esm/filter-list/FilterListItemApi.js.map +1 -1
  131. package/build/esm/filter-list/base/{FilterList.js → BaseFilterList.js} +30 -31
  132. package/build/esm/filter-list/base/BaseFilterList.js.map +1 -0
  133. package/build/esm/filter-list/base/BaseFilterListApi.js +2 -0
  134. package/build/esm/filter-list/base/BaseFilterListApi.js.map +1 -0
  135. package/build/esm/filter-list/base/FilterIcons.js +63 -0
  136. package/build/esm/filter-list/base/FilterIcons.js.map +1 -0
  137. package/build/esm/filter-list/base/FilterList.module.css +22 -1
  138. package/build/esm/filter-list/base/FilterListContent.js +21 -20
  139. package/build/esm/filter-list/base/FilterListContent.js.map +1 -1
  140. package/build/esm/filter-list/base/FilterListHeader.js +8 -3
  141. package/build/esm/filter-list/base/FilterListHeader.js.map +1 -1
  142. package/build/esm/filter-list/base/FilterListHeader.module.css +25 -1
  143. package/build/esm/filter-list/base/FilterListItem.js +36 -17
  144. package/build/esm/filter-list/base/FilterListItem.js.map +1 -1
  145. package/build/esm/filter-list/base/FilterListItem.module.css +58 -2
  146. package/build/esm/filter-list/base/SortableFilterListItem.js +6 -6
  147. package/build/esm/filter-list/base/SortableFilterListItem.js.map +1 -1
  148. package/build/esm/filter-list/base/index.js +1 -2
  149. package/build/esm/filter-list/base/index.js.map +1 -1
  150. package/build/esm/filter-list/base/inputs/CheckboxListInput.js +34 -15
  151. package/build/esm/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
  152. package/build/esm/filter-list/base/inputs/CheckboxListInput.module.css +13 -0
  153. package/build/esm/filter-list/base/inputs/DateRangeInput.js.map +1 -1
  154. package/build/esm/filter-list/base/inputs/ListogramInput.js +17 -21
  155. package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
  156. package/build/esm/filter-list/base/inputs/ListogramInput.module.css +25 -19
  157. package/build/esm/filter-list/base/inputs/MultiDateInput.module.css +6 -4
  158. package/build/esm/filter-list/base/inputs/MultiSelectInput.js +7 -14
  159. package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
  160. package/build/esm/filter-list/base/inputs/MultiSelectInput.module.css +4 -1
  161. package/build/esm/filter-list/base/inputs/NullValueWrapper.js +4 -23
  162. package/build/esm/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
  163. package/build/esm/filter-list/base/inputs/NullValueWrapper.module.css +3 -2
  164. package/build/esm/filter-list/base/inputs/NumberRangeInput.js.map +1 -1
  165. package/build/esm/filter-list/base/inputs/RangeInput.js +2 -32
  166. package/build/esm/filter-list/base/inputs/RangeInput.js.map +1 -1
  167. package/build/esm/filter-list/base/inputs/RangeInput.module.css +16 -14
  168. package/build/esm/filter-list/base/inputs/SingleDateInput.module.css +2 -1
  169. package/build/esm/filter-list/base/inputs/SingleSelectInput.js +6 -13
  170. package/build/esm/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
  171. package/build/esm/filter-list/base/inputs/TextTagsInput.js +6 -14
  172. package/build/esm/filter-list/base/inputs/TextTagsInput.js.map +1 -1
  173. package/build/esm/filter-list/base/inputs/TimelineInput.js +2 -2
  174. package/build/esm/filter-list/base/inputs/TimelineInput.js.map +1 -1
  175. package/build/esm/filter-list/base/inputs/TimelineInput.module.css +14 -12
  176. package/build/esm/filter-list/base/inputs/shared.module.css +5 -4
  177. package/build/esm/filter-list/hooks/useFilterListState.js +24 -3
  178. package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
  179. package/build/esm/filter-list/hooks/usePropertyAggregation.js.map +1 -1
  180. package/build/esm/filter-list/inputs/CheckboxListFilterInput.js +56 -0
  181. package/build/esm/filter-list/inputs/CheckboxListFilterInput.js.map +1 -0
  182. package/build/esm/filter-list/inputs/ContainsTextFilterInput.js +38 -0
  183. package/build/esm/filter-list/inputs/ContainsTextFilterInput.js.map +1 -0
  184. package/build/esm/filter-list/inputs/DateRangeFilterInput.js +105 -0
  185. package/build/esm/filter-list/inputs/DateRangeFilterInput.js.map +1 -0
  186. package/build/esm/filter-list/inputs/LinkedPropertyInput.js +508 -0
  187. package/build/esm/filter-list/inputs/LinkedPropertyInput.js.map +1 -0
  188. package/build/esm/filter-list/inputs/ListogramFilterInput.js +62 -0
  189. package/build/esm/filter-list/inputs/ListogramFilterInput.js.map +1 -0
  190. package/build/esm/filter-list/inputs/MultiDateFilterInput.js +38 -0
  191. package/build/esm/filter-list/inputs/MultiDateFilterInput.js.map +1 -0
  192. package/build/esm/filter-list/inputs/MultiSelectFilterInput.js +55 -0
  193. package/build/esm/filter-list/inputs/MultiSelectFilterInput.js.map +1 -0
  194. package/build/esm/filter-list/inputs/NumberRangeFilterInput.js +105 -0
  195. package/build/esm/filter-list/inputs/NumberRangeFilterInput.js.map +1 -0
  196. package/build/esm/filter-list/inputs/PropertyFilterInput.js +129 -0
  197. package/build/esm/filter-list/inputs/PropertyFilterInput.js.map +1 -0
  198. package/build/esm/filter-list/inputs/SingleDateFilterInput.js +38 -0
  199. package/build/esm/filter-list/inputs/SingleDateFilterInput.js.map +1 -0
  200. package/build/esm/filter-list/inputs/SingleSelectFilterInput.js +55 -0
  201. package/build/esm/filter-list/inputs/SingleSelectFilterInput.js.map +1 -0
  202. package/build/esm/filter-list/inputs/TextTagsFilterInput.js +54 -0
  203. package/build/esm/filter-list/inputs/TextTagsFilterInput.js.map +1 -0
  204. package/build/esm/filter-list/inputs/TimelineFilterInput.js +49 -0
  205. package/build/esm/filter-list/inputs/TimelineFilterInput.js.map +1 -0
  206. package/build/esm/filter-list/inputs/ToggleFilterInput.js +36 -0
  207. package/build/esm/filter-list/inputs/ToggleFilterInput.js.map +1 -0
  208. package/build/esm/filter-list/types/AggregationTypes.js +2 -0
  209. package/build/esm/filter-list/types/AggregationTypes.js.map +1 -0
  210. package/build/esm/filter-list/types/LinkedFilterTypes.js.map +1 -1
  211. package/build/esm/filter-list/types/index.js +0 -2
  212. package/build/esm/filter-list/types/index.js.map +1 -1
  213. package/build/esm/filter-list/utils/filterStateSerialization.js +42 -0
  214. package/build/esm/filter-list/utils/filterStateSerialization.js.map +1 -0
  215. package/build/esm/filter-list/utils/filterStateToWhereClause.js +19 -11
  216. package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  217. package/build/esm/filter-list/utils/filterValues.js +26 -0
  218. package/build/esm/filter-list/utils/filterValues.js.map +1 -1
  219. package/build/esm/object-table/ColumnConfigDialog.module.css +0 -9
  220. package/build/esm/object-table/MultiColumnSortDialog.module.css +0 -4
  221. package/build/esm/object-table/TableHeaderWithPopover.module.css +0 -12
  222. package/build/esm/public/experimental.js +4 -1
  223. package/build/esm/public/experimental.js.map +1 -1
  224. package/build/esm/shared/ErrorBoundary.module.css +14 -14
  225. package/build/types/filter-list/{base/FilterInput.d.ts → FilterInput.d.ts} +2 -2
  226. package/build/types/filter-list/FilterInput.d.ts.map +1 -0
  227. package/build/types/filter-list/{base/FilterList.d.ts → FilterList.d.ts} +1 -1
  228. package/build/types/filter-list/FilterList.d.ts.map +1 -0
  229. package/build/types/filter-list/FilterListApi.d.ts +14 -0
  230. package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
  231. package/build/types/filter-list/FilterListItemApi.d.ts +13 -0
  232. package/build/types/filter-list/FilterListItemApi.d.ts.map +1 -1
  233. package/build/types/filter-list/base/BaseFilterList.d.ts +3 -0
  234. package/build/types/filter-list/base/BaseFilterList.d.ts.map +1 -0
  235. package/build/types/filter-list/base/BaseFilterListApi.d.ts +29 -0
  236. package/build/types/filter-list/base/BaseFilterListApi.d.ts.map +1 -0
  237. package/build/types/filter-list/base/FilterIcons.d.ts +4 -0
  238. package/build/types/filter-list/base/FilterIcons.d.ts.map +1 -0
  239. package/build/types/filter-list/base/FilterListContent.d.ts +8 -8
  240. package/build/types/filter-list/base/FilterListContent.d.ts.map +1 -1
  241. package/build/types/filter-list/base/FilterListHeader.d.ts.map +1 -1
  242. package/build/types/filter-list/base/FilterListItem.d.ts +7 -8
  243. package/build/types/filter-list/base/FilterListItem.d.ts.map +1 -1
  244. package/build/types/filter-list/base/SortableFilterListItem.d.ts +7 -8
  245. package/build/types/filter-list/base/SortableFilterListItem.d.ts.map +1 -1
  246. package/build/types/filter-list/base/index.d.ts +2 -2
  247. package/build/types/filter-list/base/index.d.ts.map +1 -1
  248. package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts +7 -13
  249. package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts.map +1 -1
  250. package/build/types/filter-list/base/inputs/DateRangeInput.d.ts +7 -12
  251. package/build/types/filter-list/base/inputs/DateRangeInput.d.ts.map +1 -1
  252. package/build/types/filter-list/base/inputs/ListogramInput.d.ts +10 -13
  253. package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -1
  254. package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts +7 -13
  255. package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts.map +1 -1
  256. package/build/types/filter-list/base/inputs/NullValueWrapper.d.ts +5 -11
  257. package/build/types/filter-list/base/inputs/NullValueWrapper.d.ts.map +1 -1
  258. package/build/types/filter-list/base/inputs/NumberRangeInput.d.ts +7 -12
  259. package/build/types/filter-list/base/inputs/NumberRangeInput.d.ts.map +1 -1
  260. package/build/types/filter-list/base/inputs/RangeInput.d.ts +7 -14
  261. package/build/types/filter-list/base/inputs/RangeInput.d.ts.map +1 -1
  262. package/build/types/filter-list/base/inputs/SingleSelectInput.d.ts +7 -13
  263. package/build/types/filter-list/base/inputs/SingleSelectInput.d.ts.map +1 -1
  264. package/build/types/filter-list/base/inputs/TextTagsInput.d.ts +7 -13
  265. package/build/types/filter-list/base/inputs/TextTagsInput.d.ts.map +1 -1
  266. package/build/types/filter-list/hooks/useFilterListState.d.ts +1 -0
  267. package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
  268. package/build/types/filter-list/hooks/usePropertyAggregation.d.ts +2 -5
  269. package/build/types/filter-list/hooks/usePropertyAggregation.d.ts.map +1 -1
  270. package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts +14 -0
  271. package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts.map +1 -0
  272. package/build/types/filter-list/inputs/ContainsTextFilterInput.d.ts +10 -0
  273. package/build/types/filter-list/inputs/ContainsTextFilterInput.d.ts.map +1 -0
  274. package/build/types/filter-list/inputs/DateRangeFilterInput.d.ts +12 -0
  275. package/build/types/filter-list/inputs/DateRangeFilterInput.d.ts.map +1 -0
  276. package/build/types/filter-list/{base/inputs → inputs}/LinkedPropertyInput.d.ts +2 -2
  277. package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts.map +1 -0
  278. package/build/types/filter-list/inputs/ListogramFilterInput.d.ts +16 -0
  279. package/build/types/filter-list/inputs/ListogramFilterInput.d.ts.map +1 -0
  280. package/build/types/filter-list/inputs/MultiDateFilterInput.d.ts +9 -0
  281. package/build/types/filter-list/inputs/MultiDateFilterInput.d.ts.map +1 -0
  282. package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts +13 -0
  283. package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts.map +1 -0
  284. package/build/types/filter-list/inputs/NumberRangeFilterInput.d.ts +12 -0
  285. package/build/types/filter-list/inputs/NumberRangeFilterInput.d.ts.map +1 -0
  286. package/build/types/filter-list/inputs/PropertyFilterInput.d.ts +17 -0
  287. package/build/types/filter-list/inputs/PropertyFilterInput.d.ts.map +1 -0
  288. package/build/types/filter-list/inputs/SingleDateFilterInput.d.ts +9 -0
  289. package/build/types/filter-list/inputs/SingleDateFilterInput.d.ts.map +1 -0
  290. package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts +13 -0
  291. package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts.map +1 -0
  292. package/build/types/filter-list/inputs/TextTagsFilterInput.d.ts +13 -0
  293. package/build/types/filter-list/inputs/TextTagsFilterInput.d.ts.map +1 -0
  294. package/build/types/filter-list/inputs/TimelineFilterInput.d.ts +9 -0
  295. package/build/types/filter-list/inputs/TimelineFilterInput.d.ts.map +1 -0
  296. package/build/types/filter-list/inputs/ToggleFilterInput.d.ts +9 -0
  297. package/build/types/filter-list/inputs/ToggleFilterInput.d.ts.map +1 -0
  298. package/build/types/filter-list/types/AggregationTypes.d.ts +5 -0
  299. package/build/types/filter-list/types/AggregationTypes.d.ts.map +1 -0
  300. package/build/types/filter-list/types/LinkedFilterTypes.d.ts +0 -19
  301. package/build/types/filter-list/types/LinkedFilterTypes.d.ts.map +1 -1
  302. package/build/types/filter-list/types/index.d.ts +0 -2
  303. package/build/types/filter-list/types/index.d.ts.map +1 -1
  304. package/build/types/filter-list/utils/filterStateSerialization.d.ts +3 -0
  305. package/build/types/filter-list/utils/filterStateSerialization.d.ts.map +1 -0
  306. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts +1 -1
  307. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts.map +1 -1
  308. package/build/types/filter-list/utils/filterValues.d.ts +2 -0
  309. package/build/types/filter-list/utils/filterValues.d.ts.map +1 -1
  310. package/build/types/public/experimental.d.ts +4 -1
  311. package/build/types/public/experimental.d.ts.map +1 -1
  312. package/package.json +3 -3
  313. package/build/browser/filter-list/base/FilterInput.js +0 -542
  314. package/build/browser/filter-list/base/FilterInput.js.map +0 -1
  315. package/build/browser/filter-list/base/FilterList.js.map +0 -1
  316. package/build/browser/filter-list/base/inputs/LinkedPropertyInput.js +0 -237
  317. package/build/browser/filter-list/base/inputs/LinkedPropertyInput.js.map +0 -1
  318. package/build/browser/filter-list/types/AddFilterMenuTypes.js +0 -2
  319. package/build/browser/filter-list/types/AddFilterMenuTypes.js.map +0 -1
  320. package/build/browser/filter-list/types/FilterPanelTypes.js +0 -2
  321. package/build/browser/filter-list/types/FilterPanelTypes.js.map +0 -1
  322. package/build/esm/filter-list/base/FilterInput.js +0 -542
  323. package/build/esm/filter-list/base/FilterInput.js.map +0 -1
  324. package/build/esm/filter-list/base/FilterList.js.map +0 -1
  325. package/build/esm/filter-list/base/inputs/LinkedPropertyInput.js +0 -237
  326. package/build/esm/filter-list/base/inputs/LinkedPropertyInput.js.map +0 -1
  327. package/build/esm/filter-list/types/AddFilterMenuTypes.js +0 -2
  328. package/build/esm/filter-list/types/AddFilterMenuTypes.js.map +0 -1
  329. package/build/esm/filter-list/types/FilterPanelTypes.js +0 -2
  330. package/build/esm/filter-list/types/FilterPanelTypes.js.map +0 -1
  331. package/build/types/filter-list/base/FilterInput.d.ts.map +0 -1
  332. package/build/types/filter-list/base/FilterList.d.ts.map +0 -1
  333. package/build/types/filter-list/base/inputs/LinkedPropertyInput.d.ts.map +0 -1
  334. package/build/types/filter-list/types/AddFilterMenuTypes.d.ts +0 -56
  335. package/build/types/filter-list/types/AddFilterMenuTypes.d.ts.map +0 -1
  336. package/build/types/filter-list/types/FilterPanelTypes.d.ts +0 -18
  337. package/build/types/filter-list/types/FilterPanelTypes.d.ts.map +0 -1
@@ -21,12 +21,13 @@
21
21
  }
22
22
 
23
23
  .clearAll {
24
- font-size: var(--osdk-typography-size-body-small);
25
- color: var(--osdk-intent-primary-rest);
24
+ font-family: var(--osdk-filter-date-clear-font-family);
25
+ font-size: var(--osdk-filter-date-clear-font-size);
26
+ color: var(--osdk-filter-date-clear-color);
26
27
  background: transparent;
27
28
  border: none;
28
29
  cursor: pointer;
29
- padding: calc(var(--osdk-surface-spacing) * 0.5);
30
+ padding: var(--osdk-filter-date-clear-padding);
30
31
 
31
32
  &:hover {
32
33
  text-decoration: underline;
@@ -39,7 +40,8 @@
39
40
 
40
41
  .input {
41
42
  flex: 1;
42
- font-size: var(--osdk-typography-size-body-medium);
43
+ font-family: var(--osdk-filter-input-font-family);
44
+ font-size: var(--osdk-filter-timeline-input-font-size);
43
45
  padding: var(--osdk-filter-input-padding);
44
46
  border: var(--osdk-filter-input-border);
45
47
  border-radius: var(--osdk-filter-input-border-radius);
@@ -18,28 +18,21 @@ import { Button } from "@base-ui/react/button";
18
18
  import classnames from "classnames";
19
19
  import React, { memo, useCallback } from "react";
20
20
  import { Combobox } from "../../../base-components/combobox/Combobox.js";
21
- import { usePropertyAggregation } from "../../hooks/usePropertyAggregation.js";
22
21
  import styles from "./MultiSelectInput.module.css";
23
22
  import sharedStyles from "./shared.module.css";
24
23
  function MultiSelectInputInner({
25
- objectType,
26
- propertyKey,
24
+ values,
25
+ isLoading,
26
+ error,
27
27
  selectedValues,
28
28
  onChange,
29
- whereClause,
30
29
  className,
31
30
  style,
32
31
  placeholder = "Select values...",
33
32
  maxDisplayedTags = 3,
34
- showClearAll = true
33
+ showClearAll = true,
34
+ ariaLabel = "Search values"
35
35
  }) {
36
- const {
37
- data: values,
38
- isLoading,
39
- error
40
- } = usePropertyAggregation(objectType, propertyKey, {
41
- where: whereClause
42
- });
43
36
  const handleValueChange = useCallback(newValues => {
44
37
  onChange(newValues ?? []);
45
38
  }, [onChange]);
@@ -81,7 +74,7 @@ function MultiSelectInputInner({
81
74
  className: styles.inputRow
82
75
  }, /*#__PURE__*/React.createElement(Combobox.Input, {
83
76
  placeholder: selectedValues.length > 0 ? `${selectedValues.length} selected` : placeholder,
84
- "aria-label": `Search ${propertyKey} values`
77
+ "aria-label": ariaLabel
85
78
  }), showClearAll && selectedValues.length > 0 && /*#__PURE__*/React.createElement(Combobox.Clear, {
86
79
  className: styles.clearButton,
87
80
  onClick: clearAll,
@@ -93,7 +86,7 @@ function MultiSelectInputInner({
93
86
  key: value,
94
87
  value: value
95
88
  }, /*#__PURE__*/React.createElement("span", null, value), /*#__PURE__*/React.createElement("span", {
96
- className: styles.count
89
+ className: styles.itemCount
97
90
  }, "(", count.toLocaleString(), ")"))))))));
98
91
  }
99
92
  export const MultiSelectInput = /*#__PURE__*/memo(MultiSelectInputInner);
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSelectInput.js","names":["Button","classnames","React","memo","useCallback","Combobox","usePropertyAggregation","styles","sharedStyles","MultiSelectInputInner","objectType","propertyKey","selectedValues","onChange","whereClause","className","style","placeholder","maxDisplayedTags","showClearAll","data","values","isLoading","error","where","handleValueChange","newValues","removeValue","value","filter","v","clearAll","displayedTags","slice","remainingCount","length","createElement","multiSelect","errorMessage","message","emptyMessage","Root","multiple","onValueChange","loadingMessage","tagContainer","map","key","tag","type","tagRemove","onClick","inputRow","Input","Clear","clearButton","Portal","Positioner","Popup","Empty","count","Item","toLocaleString","MultiSelectInput"],"sources":["MultiSelectInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport type {\n ObjectSet,\n ObjectTypeDefinition,\n PropertyKeys,\n WhereClause,\n} from \"@osdk/api\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback } from \"react\";\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport { usePropertyAggregation } from \"../../hooks/usePropertyAggregation.js\";\nimport styles from \"./MultiSelectInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface MultiSelectInputProps<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n> {\n objectType: Q;\n propertyKey: K;\n selectedValues: string[];\n onChange: (values: string[]) => void;\n objectSet?: ObjectSet<Q>;\n whereClause?: WhereClause<Q>;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n maxDisplayedTags?: number;\n showClearAll?: boolean;\n}\n\nfunction MultiSelectInputInner<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n>({\n objectType,\n propertyKey,\n selectedValues,\n onChange,\n whereClause,\n className,\n style,\n placeholder = \"Select values...\",\n maxDisplayedTags = 3,\n showClearAll = true,\n}: MultiSelectInputProps<Q, K>): React.ReactElement {\n const { data: values, isLoading, error } = usePropertyAggregation(\n objectType,\n propertyKey,\n { where: whereClause },\n );\n\n const handleValueChange = useCallback(\n (newValues: string[] | null) => {\n onChange(newValues ?? []);\n },\n [onChange],\n );\n\n const removeValue = useCallback(\n (value: string) => {\n onChange(selectedValues.filter((v) => v !== value));\n },\n [selectedValues, onChange],\n );\n\n const clearAll = useCallback(() => {\n onChange([]);\n }, [onChange]);\n\n const displayedTags = selectedValues.slice(0, maxDisplayedTags);\n const remainingCount = selectedValues.length - maxDisplayedTags;\n\n return (\n <div\n className={classnames(styles.multiSelect, className)}\n style={style}\n data-loading={isLoading}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading options: {error.message}\n </div>\n )}\n\n {!error && values.length === 0 && (\n <div className={sharedStyles.emptyMessage}>\n {isLoading ? \"Loading options...\" : \"No options available\"}\n </div>\n )}\n\n {(values.length > 0 || isLoading) && (\n <Combobox.Root<string, true>\n multiple\n value={selectedValues}\n onValueChange={handleValueChange}\n >\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Updating...\n </div>\n )}\n\n {selectedValues.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {displayedTags.map((value) => (\n <span key={value} className={sharedStyles.tag}>\n {value}\n <Button\n type=\"button\"\n className={sharedStyles.tagRemove}\n onClick={() =>\n removeValue(value)}\n aria-label={`Remove ${value}`}\n >\n ×\n </Button>\n </span>\n ))}\n {remainingCount > 0 && (\n <span className={sharedStyles.tag}>\n +{remainingCount} more\n </span>\n )}\n </div>\n )}\n\n <div className={styles.inputRow}>\n <Combobox.Input\n placeholder={selectedValues.length > 0\n ? `${selectedValues.length} selected`\n : placeholder}\n aria-label={`Search ${propertyKey} values`}\n />\n {showClearAll && selectedValues.length > 0 && (\n <Combobox.Clear\n className={styles.clearButton}\n onClick={clearAll}\n aria-label=\"Clear all selections\"\n />\n )}\n </div>\n\n <Combobox.Portal>\n <Combobox.Positioner>\n <Combobox.Popup>\n {values.length === 0\n ? <Combobox.Empty>No options available</Combobox.Empty>\n : values.map(({ value, count }) => (\n <Combobox.Item key={value} value={value}>\n <span>{value}</span>\n <span className={styles.count}>\n ({count.toLocaleString()})\n </span>\n </Combobox.Item>\n ))}\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n )}\n </div>\n );\n}\n\nexport const MultiSelectInput = memo(\n MultiSelectInputInner,\n) as typeof MultiSelectInputInner;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MultiSelectInput.js","names":["Button","classnames","React","memo","useCallback","Combobox","styles","sharedStyles","MultiSelectInputInner","values","isLoading","error","selectedValues","onChange","className","style","placeholder","maxDisplayedTags","showClearAll","ariaLabel","handleValueChange","newValues","removeValue","value","filter","v","clearAll","displayedTags","slice","remainingCount","length","createElement","multiSelect","errorMessage","message","emptyMessage","Root","multiple","onValueChange","loadingMessage","tagContainer","map","key","tag","type","tagRemove","onClick","inputRow","Input","Clear","clearButton","Portal","Positioner","Popup","Empty","count","Item","itemCount","toLocaleString","MultiSelectInput"],"sources":["MultiSelectInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback } from \"react\";\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport styles from \"./MultiSelectInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface MultiSelectInputProps {\n values: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (values: string[]) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n maxDisplayedTags?: number;\n showClearAll?: boolean;\n ariaLabel?: string;\n}\n\nfunction MultiSelectInputInner({\n values,\n isLoading,\n error,\n selectedValues,\n onChange,\n className,\n style,\n placeholder = \"Select values...\",\n maxDisplayedTags = 3,\n showClearAll = true,\n ariaLabel = \"Search values\",\n}: MultiSelectInputProps): React.ReactElement {\n const handleValueChange = useCallback(\n (newValues: string[] | null) => {\n onChange(newValues ?? []);\n },\n [onChange],\n );\n\n const removeValue = useCallback(\n (value: string) => {\n onChange(selectedValues.filter((v) => v !== value));\n },\n [selectedValues, onChange],\n );\n\n const clearAll = useCallback(() => {\n onChange([]);\n }, [onChange]);\n\n const displayedTags = selectedValues.slice(0, maxDisplayedTags);\n const remainingCount = selectedValues.length - maxDisplayedTags;\n\n return (\n <div\n className={classnames(styles.multiSelect, className)}\n style={style}\n data-loading={isLoading}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading options: {error.message}\n </div>\n )}\n\n {!error && values.length === 0 && (\n <div className={sharedStyles.emptyMessage}>\n {isLoading ? \"Loading options...\" : \"No options available\"}\n </div>\n )}\n\n {(values.length > 0 || isLoading) && (\n <Combobox.Root<string, true>\n multiple\n value={selectedValues}\n onValueChange={handleValueChange}\n >\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Updating...\n </div>\n )}\n\n {selectedValues.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {displayedTags.map((value) => (\n <span key={value} className={sharedStyles.tag}>\n {value}\n <Button\n type=\"button\"\n className={sharedStyles.tagRemove}\n onClick={() =>\n removeValue(value)}\n aria-label={`Remove ${value}`}\n >\n ×\n </Button>\n </span>\n ))}\n {remainingCount > 0 && (\n <span className={sharedStyles.tag}>\n +{remainingCount} more\n </span>\n )}\n </div>\n )}\n\n <div className={styles.inputRow}>\n <Combobox.Input\n placeholder={selectedValues.length > 0\n ? `${selectedValues.length} selected`\n : placeholder}\n aria-label={ariaLabel}\n />\n {showClearAll && selectedValues.length > 0 && (\n <Combobox.Clear\n className={styles.clearButton}\n onClick={clearAll}\n aria-label=\"Clear all selections\"\n />\n )}\n </div>\n\n <Combobox.Portal>\n <Combobox.Positioner>\n <Combobox.Popup>\n {values.length === 0\n ? <Combobox.Empty>No options available</Combobox.Empty>\n : values.map(({ value, count }) => (\n <Combobox.Item key={value} value={value}>\n <span>{value}</span>\n <span className={styles.itemCount}>\n ({count.toLocaleString()})\n </span>\n </Combobox.Item>\n ))}\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n )}\n </div>\n );\n}\n\nexport const MultiSelectInput = memo(\n MultiSelectInputInner,\n) as typeof MultiSelectInputInner;\n"],"mappings":"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","ignoreList":[]}
@@ -30,6 +30,9 @@
30
30
  flex-shrink: 0;
31
31
  }
32
32
 
33
- .count {
33
+ .itemCount {
34
+ font-family: var(--osdk-filter-multiselect-count-font-family);
35
+ font-size: var(--osdk-filter-multiselect-count-font-size);
34
36
  font-variant-numeric: tabular-nums;
37
+ color: var(--osdk-filter-multiselect-count-color);
35
38
  }
@@ -14,16 +14,15 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { useOsdkAggregation } from "@osdk/react/experimental";
18
17
  import classnames from "classnames";
19
- import React, { memo, useCallback, useMemo } from "react";
18
+ import React, { memo, useCallback } from "react";
20
19
  import { Checkbox } from "../../../base-components/checkbox/Checkbox.js";
21
- import { createNullCountAggregateOptions, createNullWhereClause } from "../../utils/aggregationHelpers.js";
22
20
  import styles from "./NullValueWrapper.module.css";
23
21
  import sharedStyles from "./shared.module.css";
24
22
  function NullValueWrapperInner({
25
- objectType,
26
- propertyKey,
23
+ nullCount,
24
+ isLoading,
25
+ error,
27
26
  includeNull = false,
28
27
  onIncludeNullChange,
29
28
  showNullCount = true,
@@ -31,24 +30,6 @@ function NullValueWrapperInner({
31
30
  className,
32
31
  style
33
32
  }) {
34
- const nullCountAggregateOptions = useMemo(() => createNullCountAggregateOptions(), []);
35
- const nullWhereClause = useMemo(() => createNullWhereClause(propertyKey), [propertyKey]);
36
- const {
37
- data: nullCountData,
38
- isLoading,
39
- error
40
- } = useOsdkAggregation(objectType, {
41
- where: nullWhereClause,
42
- aggregate: nullCountAggregateOptions
43
- });
44
- const nullCount = useMemo(() => {
45
- if (!nullCountData) return 0;
46
- const result = nullCountData;
47
- if ("$count" in result && typeof result.$count === "number") {
48
- return result.$count;
49
- }
50
- return 0;
51
- }, [nullCountData]);
52
33
  const handleToggle = useCallback(() => {
53
34
  onIncludeNullChange(!includeNull);
54
35
  }, [includeNull, onIncludeNullChange]);
@@ -1 +1 @@
1
- {"version":3,"file":"NullValueWrapper.js","names":["useOsdkAggregation","classnames","React","memo","useCallback","useMemo","Checkbox","createNullCountAggregateOptions","createNullWhereClause","styles","sharedStyles","NullValueWrapperInner","objectType","propertyKey","includeNull","onIncludeNullChange","showNullCount","children","className","style","nullCountAggregateOptions","nullWhereClause","data","nullCountData","isLoading","error","where","aggregate","nullCount","result","$count","handleToggle","createElement","nullWrapper","nullValueRow","nullLabel","checked","onCheckedChange","nullLabelText","count","toLocaleString","errorMessage","NullValueWrapper"],"sources":["NullValueWrapper.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, PropertyKeys } from \"@osdk/api\";\nimport { useOsdkAggregation } from \"@osdk/react/experimental\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { Checkbox } from \"../../../base-components/checkbox/Checkbox.js\";\nimport {\n createNullCountAggregateOptions,\n createNullWhereClause,\n} from \"../../utils/aggregationHelpers.js\";\nimport styles from \"./NullValueWrapper.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface NullValueWrapperProps<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n> {\n objectType: Q;\n propertyKey: K;\n includeNull?: boolean;\n onIncludeNullChange: (include: boolean) => void;\n showNullCount?: boolean;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction NullValueWrapperInner<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n>({\n objectType,\n propertyKey,\n includeNull = false,\n onIncludeNullChange,\n showNullCount = true,\n children,\n className,\n style,\n}: NullValueWrapperProps<Q, K>): React.ReactElement {\n const nullCountAggregateOptions = useMemo(\n () => createNullCountAggregateOptions<Q>(),\n [],\n );\n\n const nullWhereClause = useMemo(\n () => createNullWhereClause<Q>(propertyKey as string),\n [propertyKey],\n );\n\n const { data: nullCountData, isLoading, error } = useOsdkAggregation(\n objectType,\n {\n where: nullWhereClause,\n aggregate: nullCountAggregateOptions,\n },\n );\n\n const nullCount = useMemo(() => {\n if (!nullCountData) return 0;\n const result = nullCountData as { $count?: number } | Iterable<unknown>;\n if (\"$count\" in result && typeof result.$count === \"number\") {\n return result.$count;\n }\n return 0;\n }, [nullCountData]);\n\n const handleToggle = useCallback(() => {\n onIncludeNullChange(!includeNull);\n }, [includeNull, onIncludeNullChange]);\n\n return (\n <div className={classnames(styles.nullWrapper, className)} style={style}>\n {children}\n\n <div\n className={styles.nullValueRow}\n data-checked={includeNull}\n data-loading={isLoading}\n >\n <label className={styles.nullLabel}>\n <Checkbox checked={includeNull} onCheckedChange={handleToggle} />\n <span className={styles.nullLabelText}>No value</span>\n </label>\n {showNullCount && !error && nullCount > 0 && (\n <span className={styles.count}>\n {nullCount.toLocaleString()}\n </span>\n )}\n </div>\n {error && (\n <div className={sharedStyles.errorMessage}>\n Failed to load null count\n </div>\n )}\n </div>\n );\n}\n\nexport const NullValueWrapper = memo(\n NullValueWrapperInner,\n) as typeof NullValueWrapperInner;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,kBAAkB,QAAQ,0BAA0B;AAC7D,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AACzD,SAASC,QAAQ,QAAQ,+CAA+C;AACxE,SACEC,+BAA+B,EAC/BC,qBAAqB,QAChB,mCAAmC;AAC1C,OAAOC,MAAM,MAAM,+BAA+B;AAClD,OAAOC,YAAY,MAAM,qBAAqB;AAgB9C,SAASC,qBAAqBA,CAG5B;EACAC,UAAU;EACVC,WAAW;EACXC,WAAW,GAAG,KAAK;EACnBC,mBAAmB;EACnBC,aAAa,GAAG,IAAI;EACpBC,QAAQ;EACRC,SAAS;EACTC;AAC2B,CAAC,EAAsB;EAClD,MAAMC,yBAAyB,GAAGf,OAAO,CACvC,MAAME,+BAA+B,CAAI,CAAC,EAC1C,EACF,CAAC;EAED,MAAMc,eAAe,GAAGhB,OAAO,CAC7B,MAAMG,qBAAqB,CAAIK,WAAqB,CAAC,EACrD,CAACA,WAAW,CACd,CAAC;EAED,MAAM;IAAES,IAAI,EAAEC,aAAa;IAAEC,SAAS;IAAEC;EAAM,CAAC,GAAGzB,kBAAkB,CAClEY,UAAU,EACV;IACEc,KAAK,EAAEL,eAAe;IACtBM,SAAS,EAAEP;EACb,CACF,CAAC;EAED,MAAMQ,SAAS,GAAGvB,OAAO,CAAC,MAAM;IAC9B,IAAI,CAACkB,aAAa,EAAE,OAAO,CAAC;IAC5B,MAAMM,MAAM,GAAGN,aAAwD;IACvE,IAAI,QAAQ,IAAIM,MAAM,IAAI,OAAOA,MAAM,CAACC,MAAM,KAAK,QAAQ,EAAE;MAC3D,OAAOD,MAAM,CAACC,MAAM;IACtB;IACA,OAAO,CAAC;EACV,CAAC,EAAE,CAACP,aAAa,CAAC,CAAC;EAEnB,MAAMQ,YAAY,GAAG3B,WAAW,CAAC,MAAM;IACrCW,mBAAmB,CAAC,CAACD,WAAW,CAAC;EACnC,CAAC,EAAE,CAACA,WAAW,EAAEC,mBAAmB,CAAC,CAAC;EAEtC,oBACEb,KAAA,CAAA8B,aAAA;IAAKd,SAAS,EAAEjB,UAAU,CAACQ,MAAM,CAACwB,WAAW,EAAEf,SAAS,CAAE;IAACC,KAAK,EAAEA;EAAM,GACrEF,QAAQ,eAETf,KAAA,CAAA8B,aAAA;IACEd,SAAS,EAAET,MAAM,CAACyB,YAAa;IAC/B,gBAAcpB,WAAY;IAC1B,gBAAcU;EAAU,gBAExBtB,KAAA,CAAA8B,aAAA;IAAOd,SAAS,EAAET,MAAM,CAAC0B;EAAU,gBACjCjC,KAAA,CAAA8B,aAAA,CAAC1B,QAAQ;IAAC8B,OAAO,EAAEtB,WAAY;IAACuB,eAAe,EAAEN;EAAa,CAAE,CAAC,eACjE7B,KAAA,CAAA8B,aAAA;IAAMd,SAAS,EAAET,MAAM,CAAC6B;EAAc,GAAC,UAAc,CAChD,CAAC,EACPtB,aAAa,IAAI,CAACS,KAAK,IAAIG,SAAS,GAAG,CAAC,iBACvC1B,KAAA,CAAA8B,aAAA;IAAMd,SAAS,EAAET,MAAM,CAAC8B;EAAM,GAC3BX,SAAS,CAACY,cAAc,CAAC,CACtB,CAEL,CAAC,EACLf,KAAK,iBACJvB,KAAA,CAAA8B,aAAA;IAAKd,SAAS,EAAER,YAAY,CAAC+B;EAAa,GAAC,2BAEtC,CAEJ,CAAC;AAEV;AAEA,OAAO,MAAMC,gBAAgB,gBAAGvC,IAAI,CAClCQ,qBACF,CAAiC","ignoreList":[]}
1
+ {"version":3,"file":"NullValueWrapper.js","names":["classnames","React","memo","useCallback","Checkbox","styles","sharedStyles","NullValueWrapperInner","nullCount","isLoading","error","includeNull","onIncludeNullChange","showNullCount","children","className","style","handleToggle","createElement","nullWrapper","nullValueRow","nullLabel","checked","onCheckedChange","nullLabelText","count","toLocaleString","errorMessage","NullValueWrapper"],"sources":["NullValueWrapper.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport classnames from \"classnames\";\nimport React, { memo, useCallback } from \"react\";\nimport { Checkbox } from \"../../../base-components/checkbox/Checkbox.js\";\nimport styles from \"./NullValueWrapper.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface NullValueWrapperProps {\n nullCount: number;\n isLoading: boolean;\n error?: Error | null;\n includeNull?: boolean;\n onIncludeNullChange: (include: boolean) => void;\n showNullCount?: boolean;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction NullValueWrapperInner({\n nullCount,\n isLoading,\n error,\n includeNull = false,\n onIncludeNullChange,\n showNullCount = true,\n children,\n className,\n style,\n}: NullValueWrapperProps): React.ReactElement {\n const handleToggle = useCallback(() => {\n onIncludeNullChange(!includeNull);\n }, [includeNull, onIncludeNullChange]);\n\n return (\n <div className={classnames(styles.nullWrapper, className)} style={style}>\n {children}\n\n <div\n className={styles.nullValueRow}\n data-checked={includeNull}\n data-loading={isLoading}\n >\n <label className={styles.nullLabel}>\n <Checkbox checked={includeNull} onCheckedChange={handleToggle} />\n <span className={styles.nullLabelText}>No value</span>\n </label>\n {showNullCount && !error && nullCount > 0 && (\n <span className={styles.count}>\n {nullCount.toLocaleString()}\n </span>\n )}\n </div>\n {error && (\n <div className={sharedStyles.errorMessage}>\n Failed to load null count\n </div>\n )}\n </div>\n );\n}\n\nexport const NullValueWrapper = memo(\n NullValueWrapperInner,\n) as typeof NullValueWrapperInner;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,WAAW,QAAQ,OAAO;AAChD,SAASC,QAAQ,QAAQ,+CAA+C;AACxE,OAAOC,MAAM,MAAM,+BAA+B;AAClD,OAAOC,YAAY,MAAM,qBAAqB;AAc9C,SAASC,qBAAqBA,CAAC;EAC7BC,SAAS;EACTC,SAAS;EACTC,KAAK;EACLC,WAAW,GAAG,KAAK;EACnBC,mBAAmB;EACnBC,aAAa,GAAG,IAAI;EACpBC,QAAQ;EACRC,SAAS;EACTC;AACqB,CAAC,EAAsB;EAC5C,MAAMC,YAAY,GAAGd,WAAW,CAAC,MAAM;IACrCS,mBAAmB,CAAC,CAACD,WAAW,CAAC;EACnC,CAAC,EAAE,CAACA,WAAW,EAAEC,mBAAmB,CAAC,CAAC;EAEtC,oBACEX,KAAA,CAAAiB,aAAA;IAAKH,SAAS,EAAEf,UAAU,CAACK,MAAM,CAACc,WAAW,EAAEJ,SAAS,CAAE;IAACC,KAAK,EAAEA;EAAM,GACrEF,QAAQ,eAETb,KAAA,CAAAiB,aAAA;IACEH,SAAS,EAAEV,MAAM,CAACe,YAAa;IAC/B,gBAAcT,WAAY;IAC1B,gBAAcF;EAAU,gBAExBR,KAAA,CAAAiB,aAAA;IAAOH,SAAS,EAAEV,MAAM,CAACgB;EAAU,gBACjCpB,KAAA,CAAAiB,aAAA,CAACd,QAAQ;IAACkB,OAAO,EAAEX,WAAY;IAACY,eAAe,EAAEN;EAAa,CAAE,CAAC,eACjEhB,KAAA,CAAAiB,aAAA;IAAMH,SAAS,EAAEV,MAAM,CAACmB;EAAc,GAAC,UAAc,CAChD,CAAC,EACPX,aAAa,IAAI,CAACH,KAAK,IAAIF,SAAS,GAAG,CAAC,iBACvCP,KAAA,CAAAiB,aAAA;IAAMH,SAAS,EAAEV,MAAM,CAACoB;EAAM,GAC3BjB,SAAS,CAACkB,cAAc,CAAC,CACtB,CAEL,CAAC,EACLhB,KAAK,iBACJT,KAAA,CAAAiB,aAAA;IAAKH,SAAS,EAAET,YAAY,CAACqB;EAAa,GAAC,2BAEtC,CAEJ,CAAC;AAEV;AAEA,OAAO,MAAMC,gBAAgB,gBAAG1B,IAAI,CAClCK,qBACF,CAAiC","ignoreList":[]}
@@ -43,7 +43,8 @@
43
43
  }
44
44
 
45
45
  .count {
46
- font-size: var(--osdk-typography-size-body-small);
46
+ font-family: var(--osdk-filter-null-count-font-family);
47
+ font-size: var(--osdk-filter-null-count-font-size);
47
48
  font-variant-numeric: tabular-nums;
48
- color: var(--osdk-typography-color-muted);
49
+ color: var(--osdk-filter-null-count-color);
49
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NumberRangeInput.js","names":["React","memo","RangeInput","formatNumber","value","undefined","String","parseNumber","parsed","parseFloat","isNaN","numberConfig","inputType","formatValue","parseValue","toNumber","v","fromNumber","minLabel","maxLabel","formatTooltip","min","max","count","toFixed","toLocaleString","formatPlaceholder","inputProps","step","NumberRangeInputInner","props","createElement","_extends","config","NumberRangeInput"],"sources":["NumberRangeInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectSet, ObjectTypeDefinition, PropertyKeys } from \"@osdk/api\";\nimport React, { memo } from \"react\";\nimport { RangeInput, type RangeInputConfig } from \"./RangeInput.js\";\n\nfunction formatNumber(value: number | undefined): string {\n return value !== undefined ? String(value) : \"\";\n}\n\nfunction parseNumber(value: string): number | undefined {\n if (value === \"\") return undefined;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n}\n\nconst numberConfig: RangeInputConfig<number> = {\n inputType: \"number\",\n formatValue: formatNumber,\n parseValue: parseNumber,\n toNumber: (v) => v,\n fromNumber: (v) => v,\n minLabel: \"Min\",\n maxLabel: \"Max\",\n formatTooltip: (min, max, count) =>\n `${min.toFixed(1)} - ${max.toFixed(1)}: ${count.toLocaleString()}`,\n formatPlaceholder: (value) => value.toFixed(0),\n inputProps: { step: \"any\" },\n};\n\ninterface NumberRangeInputProps<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n> {\n objectType: Q;\n propertyKey: K;\n minValue: number | undefined;\n maxValue: number | undefined;\n onChange: (min: number | undefined, max: number | undefined) => void;\n objectSet?: ObjectSet<Q>;\n showHistogram?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction NumberRangeInputInner<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n>(props: NumberRangeInputProps<Q, K>): React.ReactElement {\n return <RangeInput {...props} config={numberConfig} />;\n}\n\nexport const NumberRangeInput = memo(\n NumberRangeInputInner,\n) as typeof NumberRangeInputInner;\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,KAAK,IAAIC,IAAI,QAAQ,OAAO;AACnC,SAASC,UAAU,QAA+B,iBAAiB;AAEnE,SAASC,YAAYA,CAACC,KAAyB,EAAU;EACvD,OAAOA,KAAK,KAAKC,SAAS,GAAGC,MAAM,CAACF,KAAK,CAAC,GAAG,EAAE;AACjD;AAEA,SAASG,WAAWA,CAACH,KAAa,EAAsB;EACtD,IAAIA,KAAK,KAAK,EAAE,EAAE,OAAOC,SAAS;EAClC,MAAMG,MAAM,GAAGC,UAAU,CAACL,KAAK,CAAC;EAChC,OAAOM,KAAK,CAACF,MAAM,CAAC,GAAGH,SAAS,GAAGG,MAAM;AAC3C;AAEA,MAAMG,YAAsC,GAAG;EAC7CC,SAAS,EAAE,QAAQ;EACnBC,WAAW,EAAEV,YAAY;EACzBW,UAAU,EAAEP,WAAW;EACvBQ,QAAQ,EAAGC,CAAC,IAAKA,CAAC;EAClBC,UAAU,EAAGD,CAAC,IAAKA,CAAC;EACpBE,QAAQ,EAAE,KAAK;EACfC,QAAQ,EAAE,KAAK;EACfC,aAAa,EAAEA,CAACC,GAAG,EAAEC,GAAG,EAAEC,KAAK,KAC7B,GAAGF,GAAG,CAACG,OAAO,CAAC,CAAC,CAAC,MAAMF,GAAG,CAACE,OAAO,CAAC,CAAC,CAAC,KAAKD,KAAK,CAACE,cAAc,CAAC,CAAC,EAAE;EACpEC,iBAAiB,EAAGtB,KAAK,IAAKA,KAAK,CAACoB,OAAO,CAAC,CAAC,CAAC;EAC9CG,UAAU,EAAE;IAAEC,IAAI,EAAE;EAAM;AAC5B,CAAC;AAiBD,SAASC,qBAAqBA,CAG5BC,KAAkC,EAAsB;EACxD,oBAAO9B,KAAA,CAAA+B,aAAA,CAAC7B,UAAU,EAAA8B,QAAA,KAAKF,KAAK;IAAEG,MAAM,EAAEtB;EAAa,EAAE,CAAC;AACxD;AAEA,OAAO,MAAMuB,gBAAgB,gBAAGjC,IAAI,CAClC4B,qBACF,CAAiC","ignoreList":[]}
1
+ {"version":3,"file":"NumberRangeInput.js","names":["React","memo","RangeInput","formatNumber","value","undefined","String","parseNumber","parsed","parseFloat","isNaN","numberConfig","inputType","formatValue","parseValue","toNumber","v","fromNumber","minLabel","maxLabel","formatTooltip","min","max","count","toFixed","toLocaleString","formatPlaceholder","inputProps","step","NumberRangeInputInner","props","createElement","_extends","config","NumberRangeInput"],"sources":["NumberRangeInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { memo } from \"react\";\nimport { RangeInput, type RangeInputConfig } from \"./RangeInput.js\";\n\nfunction formatNumber(value: number | undefined): string {\n return value !== undefined ? String(value) : \"\";\n}\n\nfunction parseNumber(value: string): number | undefined {\n if (value === \"\") return undefined;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n}\n\nconst numberConfig: RangeInputConfig<number> = {\n inputType: \"number\",\n formatValue: formatNumber,\n parseValue: parseNumber,\n toNumber: (v) => v,\n fromNumber: (v) => v,\n minLabel: \"Min\",\n maxLabel: \"Max\",\n formatTooltip: (min, max, count) =>\n `${min.toFixed(1)} - ${max.toFixed(1)}: ${count.toLocaleString()}`,\n formatPlaceholder: (value) => value.toFixed(0),\n inputProps: { step: \"any\" },\n};\n\ninterface NumberRangeInputProps {\n valueCountPairs: Array<{ value: number; count: number }>;\n isLoading: boolean;\n minValue: number | undefined;\n maxValue: number | undefined;\n onChange: (min: number | undefined, max: number | undefined) => void;\n showHistogram?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction NumberRangeInputInner(\n props: NumberRangeInputProps,\n): React.ReactElement {\n return <RangeInput {...props} config={numberConfig} />;\n}\n\nexport const NumberRangeInput = memo(\n NumberRangeInputInner,\n) as typeof NumberRangeInputInner;\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,IAAIC,IAAI,QAAQ,OAAO;AACnC,SAASC,UAAU,QAA+B,iBAAiB;AAEnE,SAASC,YAAYA,CAACC,KAAyB,EAAU;EACvD,OAAOA,KAAK,KAAKC,SAAS,GAAGC,MAAM,CAACF,KAAK,CAAC,GAAG,EAAE;AACjD;AAEA,SAASG,WAAWA,CAACH,KAAa,EAAsB;EACtD,IAAIA,KAAK,KAAK,EAAE,EAAE,OAAOC,SAAS;EAClC,MAAMG,MAAM,GAAGC,UAAU,CAACL,KAAK,CAAC;EAChC,OAAOM,KAAK,CAACF,MAAM,CAAC,GAAGH,SAAS,GAAGG,MAAM;AAC3C;AAEA,MAAMG,YAAsC,GAAG;EAC7CC,SAAS,EAAE,QAAQ;EACnBC,WAAW,EAAEV,YAAY;EACzBW,UAAU,EAAEP,WAAW;EACvBQ,QAAQ,EAAGC,CAAC,IAAKA,CAAC;EAClBC,UAAU,EAAGD,CAAC,IAAKA,CAAC;EACpBE,QAAQ,EAAE,KAAK;EACfC,QAAQ,EAAE,KAAK;EACfC,aAAa,EAAEA,CAACC,GAAG,EAAEC,GAAG,EAAEC,KAAK,KAC7B,GAAGF,GAAG,CAACG,OAAO,CAAC,CAAC,CAAC,MAAMF,GAAG,CAACE,OAAO,CAAC,CAAC,CAAC,KAAKD,KAAK,CAACE,cAAc,CAAC,CAAC,EAAE;EACpEC,iBAAiB,EAAGtB,KAAK,IAAKA,KAAK,CAACoB,OAAO,CAAC,CAAC,CAAC;EAC9CG,UAAU,EAAE;IAAEC,IAAI,EAAE;EAAM;AAC5B,CAAC;AAaD,SAASC,qBAAqBA,CAC5BC,KAA4B,EACR;EACpB,oBAAO9B,KAAA,CAAA+B,aAAA,CAAC7B,UAAU,EAAA8B,QAAA,KAAKF,KAAK;IAAEG,MAAM,EAAEtB;EAAa,EAAE,CAAC;AACxD;AAEA,OAAO,MAAMuB,gBAAgB,gBAAGjC,IAAI,CAClC4B,qBACF,CAAiC","ignoreList":[]}
@@ -16,22 +16,19 @@ function _extends() { return _extends = Object.assign ? Object.assign.bind() : f
16
16
  */
17
17
 
18
18
  import { Input } from "@base-ui/react/input";
19
- import { useOsdkAggregation } from "@osdk/react/experimental";
20
19
  import classnames from "classnames";
21
20
  import { debounce } from "lodash-es";
22
21
  import React, { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
23
- import { createGroupByAggregateOptions } from "../../utils/aggregationHelpers.js";
24
22
  import { createHistogramBuckets, getMaxBucketCount } from "./createHistogramBuckets.js";
25
23
  import styles from "./RangeInput.module.css";
26
24
  import sharedStyles from "./shared.module.css";
27
25
  const DEBOUNCE_MS = 300;
28
26
  function RangeInputInner({
29
- objectType,
30
- propertyKey,
27
+ valueCountPairs,
28
+ isLoading,
31
29
  minValue,
32
30
  maxValue,
33
31
  onChange,
34
- objectSet,
35
32
  showHistogram = true,
36
33
  className,
37
34
  style,
@@ -69,33 +66,6 @@ function RangeInputInner({
69
66
  debouncedMaxChange.cancel();
70
67
  };
71
68
  }, [debouncedMinChange, debouncedMaxChange]);
72
- const aggregateOptions = useMemo(() => createGroupByAggregateOptions(propertyKey), [propertyKey]);
73
- const {
74
- data: aggregateData,
75
- isLoading
76
- } = useOsdkAggregation(objectType, {
77
- aggregate: aggregateOptions
78
- });
79
- const valueCountPairs = useMemo(() => {
80
- if (!aggregateData) return [];
81
-
82
- // Same dynamic $groupBy + $count pattern as usePropertyAggregation
83
-
84
- const pairs = [];
85
- for (const item of aggregateData) {
86
- const rawValue = item.$group[propertyKey];
87
- if (rawValue != null) {
88
- const parsed = config.parseValue(String(rawValue));
89
- if (parsed !== undefined) {
90
- pairs.push({
91
- value: parsed,
92
- count: item.$count ?? 0
93
- });
94
- }
95
- }
96
- }
97
- return pairs;
98
- }, [aggregateData, propertyKey, config]);
99
69
  const computedRange = useMemo(() => {
100
70
  if (valueCountPairs.length === 0) return {
101
71
  min: undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"RangeInput.js","names":["Input","useOsdkAggregation","classnames","debounce","React","memo","useCallback","useEffect","useId","useMemo","useRef","useState","createGroupByAggregateOptions","createHistogramBuckets","getMaxBucketCount","styles","sharedStyles","DEBOUNCE_MS","RangeInputInner","objectType","propertyKey","minValue","maxValue","onChange","objectSet","showHistogram","className","style","config","minInputId","maxInputId","localMin","setLocalMin","formatValue","localMax","setLocalMax","onChangeRef","current","minValueRef","maxValueRef","debouncedMinChange","newValue","parsed","parseValue","debouncedMaxChange","cancel","aggregateOptions","data","aggregateData","isLoading","aggregate","valueCountPairs","pairs","item","rawValue","$group","String","undefined","push","value","count","$count","computedRange","length","min","max","reduce","acc","p","Math","toNumber","Infinity","fromNumber","dataRange","dataMin","dataMax","buckets","maxBucketCount","handleMinChange","e","target","handleMaxChange","createElement","rangeInput","histogramContainer","map","bucket","index","height","isInRange","key","histogramBar","title","formatTooltip","rangeInputs","inputWrapper","htmlFor","inputLabel","minLabel","_extends","id","type","inputType","input","placeholder","formatPlaceholder","inputProps","separator","maxLabel","loadingMessage","RangeInput"],"sources":["RangeInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport type { ObjectSet, ObjectTypeDefinition, PropertyKeys } from \"@osdk/api\";\nimport { useOsdkAggregation } from \"@osdk/react/experimental\";\nimport classnames from \"classnames\";\nimport { debounce } from \"lodash-es\";\nimport React, {\n memo,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n type AggregationGroupResult,\n createGroupByAggregateOptions,\n} from \"../../utils/aggregationHelpers.js\";\nimport {\n createHistogramBuckets,\n getMaxBucketCount,\n type HistogramBucket,\n} from \"./createHistogramBuckets.js\";\nimport styles from \"./RangeInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\nconst DEBOUNCE_MS = 300;\n\nexport interface RangeInputConfig<T> {\n inputType: \"number\" | \"date\";\n formatValue: (value: T | undefined) => string;\n parseValue: (value: string) => T | undefined;\n toNumber: (value: T) => number;\n fromNumber: (value: number) => T;\n minLabel: string;\n maxLabel: string;\n formatTooltip: (min: T, max: T, count: number) => string;\n formatPlaceholder?: (value: T) => string;\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n}\n\nexport interface RangeInputProps<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n T,\n> {\n objectType: Q;\n propertyKey: K;\n minValue: T | undefined;\n maxValue: T | undefined;\n onChange: (min: T | undefined, max: T | undefined) => void;\n objectSet?: ObjectSet<Q>;\n showHistogram?: boolean;\n className?: string;\n style?: React.CSSProperties;\n config: RangeInputConfig<T>;\n}\n\nfunction RangeInputInner<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n T,\n>({\n objectType,\n propertyKey,\n minValue,\n maxValue,\n onChange,\n objectSet,\n showHistogram = true,\n className,\n style,\n config,\n}: RangeInputProps<Q, K, T>): React.ReactElement {\n const minInputId = useId();\n const maxInputId = useId();\n\n const [localMin, setLocalMin] = useState<string>(\n config.formatValue(minValue),\n );\n const [localMax, setLocalMax] = useState<string>(\n config.formatValue(maxValue),\n );\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const minValueRef = useRef(minValue);\n minValueRef.current = minValue;\n const maxValueRef = useRef(maxValue);\n maxValueRef.current = maxValue;\n\n const debouncedMinChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(parsed, maxValueRef.current);\n }, DEBOUNCE_MS),\n [config],\n );\n\n const debouncedMaxChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(minValueRef.current, parsed);\n }, DEBOUNCE_MS),\n [config],\n );\n\n useEffect(() => {\n setLocalMin(config.formatValue(minValue));\n debouncedMinChange.cancel();\n }, [minValue, config, debouncedMinChange]);\n\n useEffect(() => {\n setLocalMax(config.formatValue(maxValue));\n debouncedMaxChange.cancel();\n }, [maxValue, config, debouncedMaxChange]);\n\n useEffect(() => {\n return () => {\n debouncedMinChange.cancel();\n debouncedMaxChange.cancel();\n };\n }, [debouncedMinChange, debouncedMaxChange]);\n\n const aggregateOptions = useMemo(\n () => createGroupByAggregateOptions<Q>(propertyKey as string),\n [propertyKey],\n );\n\n const { data: aggregateData, isLoading } = useOsdkAggregation(objectType, {\n aggregate: aggregateOptions,\n });\n\n const valueCountPairs = useMemo<Array<{ value: T; count: number }>>(() => {\n if (!aggregateData) return [];\n\n // Same dynamic $groupBy + $count pattern as usePropertyAggregation\n const dataArray = aggregateData as AggregationGroupResult;\n\n const pairs: Array<{ value: T; count: number }> = [];\n for (const item of dataArray) {\n const rawValue = item.$group[propertyKey as string];\n if (rawValue != null) {\n const parsed = config.parseValue(String(rawValue));\n if (parsed !== undefined) {\n pairs.push({ value: parsed, count: item.$count ?? 0 });\n }\n }\n }\n\n return pairs;\n }, [aggregateData, propertyKey, config]);\n\n const computedRange = useMemo(() => {\n if (valueCountPairs.length === 0) return { min: undefined, max: undefined };\n const min = valueCountPairs.reduce(\n (acc, p) => Math.min(acc, config.toNumber(p.value)),\n Infinity,\n );\n const max = valueCountPairs.reduce(\n (acc, p) => Math.max(acc, config.toNumber(p.value)),\n -Infinity,\n );\n return {\n min: config.fromNumber(min),\n max: config.fromNumber(max),\n };\n }, [valueCountPairs, config]);\n\n const dataRange = useMemo(() => ({\n dataMin: computedRange.min,\n dataMax: computedRange.max,\n }), [computedRange.min, computedRange.max]);\n\n const buckets = useMemo<Array<HistogramBucket<T>>>(() => {\n if (\n !showHistogram\n || valueCountPairs.length === 0\n || computedRange.min === undefined\n || computedRange.max === undefined\n ) {\n return [];\n }\n\n return createHistogramBuckets(\n valueCountPairs,\n { min: computedRange.min, max: computedRange.max },\n config.toNumber,\n config.fromNumber,\n );\n }, [showHistogram, valueCountPairs, computedRange, config]);\n\n const maxBucketCount = useMemo(() => getMaxBucketCount(buckets), [buckets]);\n\n const handleMinChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMin(newValue);\n debouncedMinChange(newValue);\n },\n [debouncedMinChange],\n );\n\n const handleMaxChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMax(newValue);\n debouncedMaxChange(newValue);\n },\n [debouncedMaxChange],\n );\n\n return (\n <div\n className={classnames(styles.rangeInput, className)}\n style={style}\n data-loading={isLoading}\n >\n {showHistogram && buckets.length > 0 && (\n <div className={styles.histogramContainer}>\n {buckets.map((bucket, index) => {\n const height = (bucket.count / maxBucketCount) * 100;\n const isInRange = (minValue === undefined\n || config.toNumber(bucket.max) >= config.toNumber(minValue))\n && (maxValue === undefined\n || config.toNumber(bucket.min) <= config.toNumber(maxValue));\n\n return (\n <div\n key={index}\n className={styles.histogramBar}\n data-in-range={isInRange}\n style={{ height: `${Math.max(height, 2)}%` }}\n title={config.formatTooltip(\n bucket.min,\n bucket.max,\n bucket.count,\n )}\n />\n );\n })}\n </div>\n )}\n\n <div className={styles.rangeInputs}>\n <div className={styles.inputWrapper}>\n <label htmlFor={minInputId} className={styles.inputLabel}>\n {config.minLabel}\n </label>\n <Input\n id={minInputId}\n type={config.inputType}\n className={styles.input}\n value={localMin}\n onChange={handleMinChange}\n placeholder={dataRange.dataMin !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMin)\n : undefined}\n {...config.inputProps}\n />\n </div>\n\n <span className={styles.separator} aria-hidden=\"true\">\n –\n </span>\n\n <div className={styles.inputWrapper}>\n <label htmlFor={maxInputId} className={styles.inputLabel}>\n {config.maxLabel}\n </label>\n <Input\n id={maxInputId}\n type={config.inputType}\n className={styles.input}\n value={localMax}\n onChange={handleMaxChange}\n placeholder={dataRange.dataMax !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMax)\n : undefined}\n {...config.inputProps}\n />\n </div>\n </div>\n\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Loading...\n </div>\n )}\n </div>\n );\n}\n\nexport const RangeInput = memo(RangeInputInner) as typeof RangeInputInner;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"RangeInput.js","names":["Input","classnames","debounce","React","memo","useCallback","useEffect","useId","useMemo","useRef","useState","createHistogramBuckets","getMaxBucketCount","styles","sharedStyles","DEBOUNCE_MS","RangeInputInner","valueCountPairs","isLoading","minValue","maxValue","onChange","showHistogram","className","style","config","minInputId","maxInputId","localMin","setLocalMin","formatValue","localMax","setLocalMax","onChangeRef","current","minValueRef","maxValueRef","debouncedMinChange","newValue","parsed","parseValue","debouncedMaxChange","cancel","computedRange","length","min","undefined","max","reduce","acc","p","Math","toNumber","value","Infinity","fromNumber","dataRange","dataMin","dataMax","buckets","maxBucketCount","handleMinChange","e","target","handleMaxChange","createElement","rangeInput","histogramContainer","map","bucket","index","height","count","isInRange","key","histogramBar","title","formatTooltip","rangeInputs","inputWrapper","htmlFor","inputLabel","minLabel","_extends","id","type","inputType","input","placeholder","formatPlaceholder","inputProps","separator","maxLabel","loadingMessage","RangeInput"],"sources":["RangeInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport classnames from \"classnames\";\nimport { debounce } from \"lodash-es\";\nimport React, {\n memo,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n createHistogramBuckets,\n getMaxBucketCount,\n type HistogramBucket,\n} from \"./createHistogramBuckets.js\";\nimport styles from \"./RangeInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\nconst DEBOUNCE_MS = 300;\n\nexport interface RangeInputConfig<T> {\n inputType: \"number\" | \"date\";\n formatValue: (value: T | undefined) => string;\n parseValue: (value: string) => T | undefined;\n toNumber: (value: T) => number;\n fromNumber: (value: number) => T;\n minLabel: string;\n maxLabel: string;\n formatTooltip: (min: T, max: T, count: number) => string;\n formatPlaceholder?: (value: T) => string;\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n}\n\nexport interface RangeInputProps<T> {\n valueCountPairs: Array<{ value: T; count: number }>;\n isLoading: boolean;\n minValue: T | undefined;\n maxValue: T | undefined;\n onChange: (min: T | undefined, max: T | undefined) => void;\n showHistogram?: boolean;\n className?: string;\n style?: React.CSSProperties;\n config: RangeInputConfig<T>;\n}\n\nfunction RangeInputInner<T>({\n valueCountPairs,\n isLoading,\n minValue,\n maxValue,\n onChange,\n showHistogram = true,\n className,\n style,\n config,\n}: RangeInputProps<T>): React.ReactElement {\n const minInputId = useId();\n const maxInputId = useId();\n\n const [localMin, setLocalMin] = useState<string>(\n config.formatValue(minValue),\n );\n const [localMax, setLocalMax] = useState<string>(\n config.formatValue(maxValue),\n );\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const minValueRef = useRef(minValue);\n minValueRef.current = minValue;\n const maxValueRef = useRef(maxValue);\n maxValueRef.current = maxValue;\n\n const debouncedMinChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(parsed, maxValueRef.current);\n }, DEBOUNCE_MS),\n [config],\n );\n\n const debouncedMaxChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(minValueRef.current, parsed);\n }, DEBOUNCE_MS),\n [config],\n );\n\n useEffect(() => {\n setLocalMin(config.formatValue(minValue));\n debouncedMinChange.cancel();\n }, [minValue, config, debouncedMinChange]);\n\n useEffect(() => {\n setLocalMax(config.formatValue(maxValue));\n debouncedMaxChange.cancel();\n }, [maxValue, config, debouncedMaxChange]);\n\n useEffect(() => {\n return () => {\n debouncedMinChange.cancel();\n debouncedMaxChange.cancel();\n };\n }, [debouncedMinChange, debouncedMaxChange]);\n\n const computedRange = useMemo(() => {\n if (valueCountPairs.length === 0) return { min: undefined, max: undefined };\n const min = valueCountPairs.reduce(\n (acc, p) => Math.min(acc, config.toNumber(p.value)),\n Infinity,\n );\n const max = valueCountPairs.reduce(\n (acc, p) => Math.max(acc, config.toNumber(p.value)),\n -Infinity,\n );\n return {\n min: config.fromNumber(min),\n max: config.fromNumber(max),\n };\n }, [valueCountPairs, config]);\n\n const dataRange = useMemo(() => ({\n dataMin: computedRange.min,\n dataMax: computedRange.max,\n }), [computedRange.min, computedRange.max]);\n\n const buckets = useMemo<Array<HistogramBucket<T>>>(() => {\n if (\n !showHistogram\n || valueCountPairs.length === 0\n || computedRange.min === undefined\n || computedRange.max === undefined\n ) {\n return [];\n }\n\n return createHistogramBuckets(\n valueCountPairs,\n { min: computedRange.min, max: computedRange.max },\n config.toNumber,\n config.fromNumber,\n );\n }, [showHistogram, valueCountPairs, computedRange, config]);\n\n const maxBucketCount = useMemo(() => getMaxBucketCount(buckets), [buckets]);\n\n const handleMinChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMin(newValue);\n debouncedMinChange(newValue);\n },\n [debouncedMinChange],\n );\n\n const handleMaxChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMax(newValue);\n debouncedMaxChange(newValue);\n },\n [debouncedMaxChange],\n );\n\n return (\n <div\n className={classnames(styles.rangeInput, className)}\n style={style}\n data-loading={isLoading}\n >\n {showHistogram && buckets.length > 0 && (\n <div className={styles.histogramContainer}>\n {buckets.map((bucket, index) => {\n const height = (bucket.count / maxBucketCount) * 100;\n const isInRange = (minValue === undefined\n || config.toNumber(bucket.max) >= config.toNumber(minValue))\n && (maxValue === undefined\n || config.toNumber(bucket.min) <= config.toNumber(maxValue));\n\n return (\n <div\n key={index}\n className={styles.histogramBar}\n data-in-range={isInRange}\n style={{ height: `${Math.max(height, 2)}%` }}\n title={config.formatTooltip(\n bucket.min,\n bucket.max,\n bucket.count,\n )}\n />\n );\n })}\n </div>\n )}\n\n <div className={styles.rangeInputs}>\n <div className={styles.inputWrapper}>\n <label htmlFor={minInputId} className={styles.inputLabel}>\n {config.minLabel}\n </label>\n <Input\n id={minInputId}\n type={config.inputType}\n className={styles.input}\n value={localMin}\n onChange={handleMinChange}\n placeholder={dataRange.dataMin !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMin)\n : undefined}\n {...config.inputProps}\n />\n </div>\n\n <span className={styles.separator} aria-hidden=\"true\">\n –\n </span>\n\n <div className={styles.inputWrapper}>\n <label htmlFor={maxInputId} className={styles.inputLabel}>\n {config.maxLabel}\n </label>\n <Input\n id={maxInputId}\n type={config.inputType}\n className={styles.input}\n value={localMax}\n onChange={handleMaxChange}\n placeholder={dataRange.dataMax !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMax)\n : undefined}\n {...config.inputProps}\n />\n </div>\n </div>\n\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Loading...\n </div>\n )}\n </div>\n );\n}\n\nexport const RangeInput = memo(RangeInputInner) as typeof RangeInputInner;\n"],"mappings":"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","ignoreList":[]}
@@ -17,47 +17,49 @@
17
17
  .rangeInput {
18
18
  display: flex;
19
19
  flex-direction: column;
20
- gap: var(--osdk-filter-range-gap, calc(var(--osdk-surface-spacing) * 2));
20
+ gap: var(--osdk-filter-range-gap);
21
21
  }
22
22
 
23
23
  .histogramContainer {
24
24
  display: flex;
25
25
  align-items: flex-end;
26
- height: var(--osdk-filter-range-histogram-height, 60px);
27
- gap: var(--osdk-filter-range-histogram-bar-gap, 2px);
26
+ height: var(--osdk-filter-range-histogram-height);
27
+ gap: var(--osdk-filter-range-histogram-bar-gap);
28
28
  }
29
29
 
30
30
  .histogramBar {
31
31
  flex: 1;
32
- background: var(--osdk-filter-range-histogram-bar-color, var(--osdk-custom-color-gray-3));
33
- min-width: var(--osdk-filter-range-histogram-bar-min-width, 4px);
34
- transition: background-color var(--osdk-emphasis-transition-duration) var(--osdk-emphasis-ease-default);
32
+ background: var(--osdk-filter-range-histogram-bar-color);
33
+ min-width: var(--osdk-filter-range-histogram-bar-min-width);
34
+ transition: background-color var(--osdk-filter-range-histogram-bar-transition);
35
35
  }
36
36
 
37
37
  .histogramBar[data-in-range="true"] {
38
- background: var(--osdk-filter-range-histogram-bar-active-color, var(--osdk-intent-primary-rest));
38
+ background: var(--osdk-filter-range-histogram-bar-active-color);
39
39
  }
40
40
 
41
41
  .rangeInputs {
42
42
  display: flex;
43
43
  align-items: flex-end;
44
- gap: var(--osdk-filter-range-inputs-gap, calc(var(--osdk-surface-spacing) * 2));
44
+ gap: var(--osdk-filter-range-inputs-gap);
45
45
  }
46
46
 
47
47
  .inputWrapper {
48
48
  flex: 1;
49
49
  display: flex;
50
50
  flex-direction: column;
51
- gap: var(--osdk-filter-range-input-wrapper-gap, calc(var(--osdk-surface-spacing) * 1));
51
+ gap: var(--osdk-filter-range-input-wrapper-gap);
52
52
  }
53
53
 
54
54
  .inputLabel {
55
- font-size: var(--osdk-typography-size-body-small);
56
- color: var(--osdk-typography-color-muted);
55
+ font-family: var(--osdk-filter-range-label-font-family);
56
+ font-size: var(--osdk-filter-range-label-font-size);
57
+ color: var(--osdk-filter-range-label-color);
57
58
  }
58
59
 
59
60
  .input {
60
- font-size: var(--osdk-typography-size-body-small);
61
+ font-family: var(--osdk-filter-input-font-family);
62
+ font-size: var(--osdk-filter-input-font-size);
61
63
  padding: var(--osdk-filter-input-padding);
62
64
  border: var(--osdk-filter-input-border);
63
65
  border-radius: var(--osdk-filter-input-border-radius);
@@ -76,6 +78,6 @@
76
78
  }
77
79
 
78
80
  .separator {
79
- padding-bottom: calc(var(--osdk-surface-spacing) * 1.5);
80
- color: var(--osdk-typography-color-muted);
81
+ padding-bottom: calc(var(--osdk-filter-range-inputs-gap) * 0.75);
82
+ color: var(--osdk-filter-range-separator-color);
81
83
  }
@@ -27,7 +27,8 @@
27
27
 
28
28
  .input {
29
29
  flex: 1;
30
- font-size: var(--osdk-typography-size-body-medium);
30
+ font-family: var(--osdk-filter-input-font-family);
31
+ font-size: var(--osdk-filter-timeline-input-font-size);
31
32
  padding: var(--osdk-filter-input-padding);
32
33
  border: var(--osdk-filter-input-border);
33
34
  border-radius: var(--osdk-filter-input-border-radius);
@@ -19,28 +19,21 @@ import { Cross } from "@blueprintjs/icons";
19
19
  import classnames from "classnames";
20
20
  import React, { memo, useCallback, useMemo } from "react";
21
21
  import { Select } from "../../../base-components/select/Select.js";
22
- import { usePropertyAggregation } from "../../hooks/usePropertyAggregation.js";
23
22
  import sharedStyles from "./shared.module.css";
24
23
  import styles from "./SingleSelectInput.module.css";
25
24
  function SingleSelectInputInner({
26
- objectType,
27
- propertyKey,
25
+ values,
26
+ isLoading,
27
+ error,
28
28
  selectedValue,
29
29
  onChange,
30
- whereClause,
31
30
  className,
32
31
  style,
33
32
  placeholder = "Select a value...",
34
33
  showClearButton = true,
35
- showCounts = false
34
+ showCounts = false,
35
+ ariaLabel = "Select value"
36
36
  }) {
37
- const {
38
- data: values,
39
- isLoading,
40
- error
41
- } = usePropertyAggregation(objectType, propertyKey, {
42
- where: whereClause
43
- });
44
37
  const handleValueChange = useCallback(value => {
45
38
  onChange(value ?? undefined);
46
39
  }, [onChange]);
@@ -75,7 +68,7 @@ function SingleSelectInputInner({
75
68
  items: items
76
69
  }, /*#__PURE__*/React.createElement(Select.Trigger, {
77
70
  placeholder: placeholder,
78
- "aria-label": `Select ${propertyKey}`
71
+ "aria-label": ariaLabel
79
72
  }), /*#__PURE__*/React.createElement(Select.Portal, null, /*#__PURE__*/React.createElement(Select.Positioner, null, /*#__PURE__*/React.createElement(Select.Popup, null, values.map(({
80
73
  value,
81
74
  count
@@ -1 +1 @@
1
- {"version":3,"file":"SingleSelectInput.js","names":["Button","Cross","classnames","React","memo","useCallback","useMemo","Select","usePropertyAggregation","sharedStyles","styles","SingleSelectInputInner","objectType","propertyKey","selectedValue","onChange","whereClause","className","style","placeholder","showClearButton","showCounts","data","values","isLoading","error","where","handleValueChange","value","undefined","handleClear","items","result","count","toLocaleString","createElement","singleSelect","loadingMessage","errorMessage","message","length","emptyMessage","selectContainer","Root","onValueChange","Trigger","Portal","Positioner","Popup","map","Item","key","type","clearButton","onClick","color","SingleSelectInput"],"sources":["SingleSelectInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport { Cross } from \"@blueprintjs/icons\";\nimport type {\n ObjectSet,\n ObjectTypeDefinition,\n PropertyKeys,\n WhereClause,\n} from \"@osdk/api\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { Select } from \"../../../base-components/select/Select.js\";\nimport { usePropertyAggregation } from \"../../hooks/usePropertyAggregation.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport styles from \"./SingleSelectInput.module.css\";\n\ninterface SingleSelectInputProps<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n> {\n objectType: Q;\n propertyKey: K;\n selectedValue: string | undefined;\n onChange: (value: string | undefined) => void;\n objectSet?: ObjectSet<Q>;\n whereClause?: WhereClause<Q>;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n showClearButton?: boolean;\n showCounts?: boolean;\n}\n\nfunction SingleSelectInputInner<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n>({\n objectType,\n propertyKey,\n selectedValue,\n onChange,\n whereClause,\n className,\n style,\n placeholder = \"Select a value...\",\n showClearButton = true,\n showCounts = false,\n}: SingleSelectInputProps<Q, K>): React.ReactElement {\n const { data: values, isLoading, error } = usePropertyAggregation(\n objectType,\n propertyKey,\n { where: whereClause },\n );\n\n const handleValueChange = useCallback(\n (value: string | null) => {\n onChange(value ?? undefined);\n },\n [onChange],\n );\n\n const handleClear = useCallback(() => {\n onChange(undefined);\n }, [onChange]);\n\n const items = useMemo(() => {\n const result: Record<string, string> = {};\n for (const { value, count } of values) {\n result[value] = showCounts\n ? `${value} (${count.toLocaleString()})`\n : value;\n }\n return result;\n }, [values, showCounts]);\n\n return (\n <div\n className={classnames(styles.singleSelect, className)}\n style={style}\n data-loading={isLoading}\n >\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Loading options...\n </div>\n )}\n\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading options: {error.message}\n </div>\n )}\n\n {!isLoading && !error && values.length === 0 && (\n <div className={sharedStyles.emptyMessage}>\n No options available\n </div>\n )}\n\n {(values.length > 0 || isLoading) && (\n <div className={styles.selectContainer}>\n <Select.Root<string>\n value={selectedValue ?? null}\n onValueChange={handleValueChange}\n items={items}\n >\n <Select.Trigger\n placeholder={placeholder}\n aria-label={`Select ${propertyKey}`}\n />\n <Select.Portal>\n <Select.Positioner>\n <Select.Popup>\n {values.map(({ value, count }) => (\n <Select.Item key={value} value={value}>\n {showCounts\n ? `${value} (${count.toLocaleString()})`\n : value}\n </Select.Item>\n ))}\n </Select.Popup>\n </Select.Positioner>\n </Select.Portal>\n </Select.Root>\n {showClearButton && selectedValue !== undefined && (\n <Button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClear}\n aria-label=\"Clear selection\"\n >\n <Cross color=\"currentColor\" />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const SingleSelectInput = memo(\n SingleSelectInputInner,\n) as typeof SingleSelectInputInner;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SingleSelectInput.js","names":["Button","Cross","classnames","React","memo","useCallback","useMemo","Select","sharedStyles","styles","SingleSelectInputInner","values","isLoading","error","selectedValue","onChange","className","style","placeholder","showClearButton","showCounts","ariaLabel","handleValueChange","value","undefined","handleClear","items","result","count","toLocaleString","createElement","singleSelect","loadingMessage","errorMessage","message","length","emptyMessage","selectContainer","Root","onValueChange","Trigger","Portal","Positioner","Popup","map","Item","key","type","clearButton","onClick","color","SingleSelectInput"],"sources":["SingleSelectInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport { Cross } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { Select } from \"../../../base-components/select/Select.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport styles from \"./SingleSelectInput.module.css\";\n\ninterface SingleSelectInputProps {\n values: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n selectedValue: string | undefined;\n onChange: (value: string | undefined) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n showClearButton?: boolean;\n showCounts?: boolean;\n ariaLabel?: string;\n}\n\nfunction SingleSelectInputInner({\n values,\n isLoading,\n error,\n selectedValue,\n onChange,\n className,\n style,\n placeholder = \"Select a value...\",\n showClearButton = true,\n showCounts = false,\n ariaLabel = \"Select value\",\n}: SingleSelectInputProps): React.ReactElement {\n const handleValueChange = useCallback(\n (value: string | null) => {\n onChange(value ?? undefined);\n },\n [onChange],\n );\n\n const handleClear = useCallback(() => {\n onChange(undefined);\n }, [onChange]);\n\n const items = useMemo(() => {\n const result: Record<string, string> = {};\n for (const { value, count } of values) {\n result[value] = showCounts\n ? `${value} (${count.toLocaleString()})`\n : value;\n }\n return result;\n }, [values, showCounts]);\n\n return (\n <div\n className={classnames(styles.singleSelect, className)}\n style={style}\n data-loading={isLoading}\n >\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Loading options...\n </div>\n )}\n\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading options: {error.message}\n </div>\n )}\n\n {!isLoading && !error && values.length === 0 && (\n <div className={sharedStyles.emptyMessage}>\n No options available\n </div>\n )}\n\n {(values.length > 0 || isLoading) && (\n <div className={styles.selectContainer}>\n <Select.Root<string>\n value={selectedValue ?? null}\n onValueChange={handleValueChange}\n items={items}\n >\n <Select.Trigger\n placeholder={placeholder}\n aria-label={ariaLabel}\n />\n <Select.Portal>\n <Select.Positioner>\n <Select.Popup>\n {values.map(({ value, count }) => (\n <Select.Item key={value} value={value}>\n {showCounts\n ? `${value} (${count.toLocaleString()})`\n : value}\n </Select.Item>\n ))}\n </Select.Popup>\n </Select.Positioner>\n </Select.Portal>\n </Select.Root>\n {showClearButton && selectedValue !== undefined && (\n <Button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClear}\n aria-label=\"Clear selection\"\n >\n <Cross color=\"currentColor\" />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const SingleSelectInput = memo(\n SingleSelectInputInner,\n) as typeof SingleSelectInputInner;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,uBAAuB;AAC9C,SAASC,KAAK,QAAQ,oBAAoB;AAC1C,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AACzD,SAASC,MAAM,QAAQ,2CAA2C;AAElE,OAAOC,YAAY,MAAM,qBAAqB;AAC9C,OAAOC,MAAM,MAAM,gCAAgC;AAgBnD,SAASC,sBAAsBA,CAAC;EAC9BC,MAAM;EACNC,SAAS;EACTC,KAAK;EACLC,aAAa;EACbC,QAAQ;EACRC,SAAS;EACTC,KAAK;EACLC,WAAW,GAAG,mBAAmB;EACjCC,eAAe,GAAG,IAAI;EACtBC,UAAU,GAAG,KAAK;EAClBC,SAAS,GAAG;AACU,CAAC,EAAsB;EAC7C,MAAMC,iBAAiB,GAAGjB,WAAW,CAClCkB,KAAoB,IAAK;IACxBR,QAAQ,CAACQ,KAAK,IAAIC,SAAS,CAAC;EAC9B,CAAC,EACD,CAACT,QAAQ,CACX,CAAC;EAED,MAAMU,WAAW,GAAGpB,WAAW,CAAC,MAAM;IACpCU,QAAQ,CAACS,SAAS,CAAC;EACrB,CAAC,EAAE,CAACT,QAAQ,CAAC,CAAC;EAEd,MAAMW,KAAK,GAAGpB,OAAO,CAAC,MAAM;IAC1B,MAAMqB,MAA8B,GAAG,CAAC,CAAC;IACzC,KAAK,MAAM;MAAEJ,KAAK;MAAEK;IAAM,CAAC,IAAIjB,MAAM,EAAE;MACrCgB,MAAM,CAACJ,KAAK,CAAC,GAAGH,UAAU,GACtB,GAAGG,KAAK,KAAKK,KAAK,CAACC,cAAc,CAAC,CAAC,GAAG,GACtCN,KAAK;IACX;IACA,OAAOI,MAAM;EACf,CAAC,EAAE,CAAChB,MAAM,EAAES,UAAU,CAAC,CAAC;EAExB,oBACEjB,KAAA,CAAA2B,aAAA;IACEd,SAAS,EAAEd,UAAU,CAACO,MAAM,CAACsB,YAAY,EAAEf,SAAS,CAAE;IACtDC,KAAK,EAAEA,KAAM;IACb,gBAAcL;EAAU,GAEvBA,SAAS,iBACRT,KAAA,CAAA2B,aAAA;IAAKd,SAAS,EAAER,YAAY,CAACwB;EAAe,GAAC,oBAExC,CACN,EAEAnB,KAAK,iBACJV,KAAA,CAAA2B,aAAA;IAAKd,SAAS,EAAER,YAAY,CAACyB;EAAa,GAAC,yBAClB,EAACpB,KAAK,CAACqB,OAC3B,CACN,EAEA,CAACtB,SAAS,IAAI,CAACC,KAAK,IAAIF,MAAM,CAACwB,MAAM,KAAK,CAAC,iBAC1ChC,KAAA,CAAA2B,aAAA;IAAKd,SAAS,EAAER,YAAY,CAAC4B;EAAa,GAAC,sBAEtC,CACN,EAEA,CAACzB,MAAM,CAACwB,MAAM,GAAG,CAAC,IAAIvB,SAAS,kBAC9BT,KAAA,CAAA2B,aAAA;IAAKd,SAAS,EAAEP,MAAM,CAAC4B;EAAgB,gBACrClC,KAAA,CAAA2B,aAAA,CAACvB,MAAM,CAAC+B,IAAI;IACVf,KAAK,EAAET,aAAa,IAAI,IAAK;IAC7ByB,aAAa,EAAEjB,iBAAkB;IACjCI,KAAK,EAAEA;EAAM,gBAEbvB,KAAA,CAAA2B,aAAA,CAACvB,MAAM,CAACiC,OAAO;IACbtB,WAAW,EAAEA,WAAY;IACzB,cAAYG;EAAU,CACvB,CAAC,eACFlB,KAAA,CAAA2B,aAAA,CAACvB,MAAM,CAACkC,MAAM,qBACZtC,KAAA,CAAA2B,aAAA,CAACvB,MAAM,CAACmC,UAAU,qBAChBvC,KAAA,CAAA2B,aAAA,CAACvB,MAAM,CAACoC,KAAK,QACVhC,MAAM,CAACiC,GAAG,CAAC,CAAC;IAAErB,KAAK;IAAEK;EAAM,CAAC,kBAC3BzB,KAAA,CAAA2B,aAAA,CAACvB,MAAM,CAACsC,IAAI;IAACC,GAAG,EAAEvB,KAAM;IAACA,KAAK,EAAEA;EAAM,GACnCH,UAAU,GACP,GAAGG,KAAK,KAAKK,KAAK,CAACC,cAAc,CAAC,CAAC,GAAG,GACtCN,KACO,CACd,CACW,CACG,CACN,CACJ,CAAC,EACbJ,eAAe,IAAIL,aAAa,KAAKU,SAAS,iBAC7CrB,KAAA,CAAA2B,aAAA,CAAC9B,MAAM;IACL+C,IAAI,EAAC,QAAQ;IACb/B,SAAS,EAAEP,MAAM,CAACuC,WAAY;IAC9BC,OAAO,EAAExB,WAAY;IACrB,cAAW;EAAiB,gBAE5BtB,KAAA,CAAA2B,aAAA,CAAC7B,KAAK;IAACiD,KAAK,EAAC;EAAc,CAAE,CACvB,CAEP,CAEJ,CAAC;AAEV;AAEA,OAAO,MAAMC,iBAAiB,gBAAG/C,IAAI,CACnCM,sBACF,CAAkC","ignoreList":[]}