@osdk/react-components 0.19.0 → 0.19.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/build/browser/action-form/FormFieldApi.js.map +1 -1
  3. package/build/browser/action-form/utils/getDefaultFieldDefinitions.js +1 -0
  4. package/build/browser/action-form/utils/getDefaultFieldDefinitions.js.map +1 -1
  5. package/build/browser/filter-list/FilterInput.js +7 -0
  6. package/build/browser/filter-list/FilterInput.js.map +1 -1
  7. package/build/browser/filter-list/FilterList.js +8 -2
  8. package/build/browser/filter-list/FilterList.js.map +1 -1
  9. package/build/browser/filter-list/FilterListApi.js.map +1 -1
  10. package/build/browser/filter-list/FilterListItemApi.js.map +1 -1
  11. package/build/browser/filter-list/__tests__/aggregationMocks.js +50 -0
  12. package/build/browser/filter-list/__tests__/aggregationMocks.js.map +1 -0
  13. package/build/browser/filter-list/base/BaseFilterList.js.map +1 -1
  14. package/build/browser/filter-list/base/BaseFilterListApi.js.map +1 -1
  15. package/build/browser/filter-list/base/FilterInputExcludeRow.js +12 -16
  16. package/build/browser/filter-list/base/FilterInputExcludeRow.js.map +1 -1
  17. package/build/browser/filter-list/base/FilterListContent.js +42 -40
  18. package/build/browser/filter-list/base/FilterListContent.js.map +1 -1
  19. package/build/browser/filter-list/base/FilterListItem.js +8 -36
  20. package/build/browser/filter-list/base/FilterListItem.js.map +1 -1
  21. package/build/browser/filter-list/base/SortableFilterListItem.js +3 -1
  22. package/build/browser/filter-list/base/SortableFilterListItem.js.map +1 -1
  23. package/build/browser/filter-list/base/inputs/ListogramInput.js +3 -1
  24. package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
  25. package/build/browser/filter-list/base/inputs/ListogramInput.module.css +6 -0
  26. package/build/browser/filter-list/base/inputs/MultiDateInput.js +2 -1
  27. package/build/browser/filter-list/base/inputs/MultiDateInput.js.map +1 -1
  28. package/build/browser/filter-list/base/inputs/MultiSelectInput.js +7 -3
  29. package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
  30. package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css +6 -0
  31. package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css.js +1 -0
  32. package/build/browser/filter-list/base/inputs/SingleDateInput.js +4 -2
  33. package/build/browser/filter-list/base/inputs/SingleDateInput.js.map +1 -1
  34. package/build/browser/filter-list/hooks/useDualScopeAggregation.js +70 -0
  35. package/build/browser/filter-list/hooks/useDualScopeAggregation.js.map +1 -0
  36. package/build/browser/filter-list/hooks/useFilterListState.js +35 -17
  37. package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
  38. package/build/browser/filter-list/hooks/useFilterPropertyAggregation.js +37 -0
  39. package/build/browser/filter-list/hooks/useFilterPropertyAggregation.js.map +1 -0
  40. package/build/browser/filter-list/hooks/usePropertyAggregation.js +7 -6
  41. package/build/browser/filter-list/hooks/usePropertyAggregation.js.map +1 -1
  42. package/build/browser/filter-list/inputs/LinkedPropertyInput.js +45 -22
  43. package/build/browser/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
  44. package/build/browser/filter-list/inputs/ListogramFilterInput.js +9 -7
  45. package/build/browser/filter-list/inputs/ListogramFilterInput.js.map +1 -1
  46. package/build/browser/filter-list/inputs/MultiSelectFilterInput.js +8 -6
  47. package/build/browser/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
  48. package/build/browser/filter-list/inputs/PropertyFilterInput.js +10 -1
  49. package/build/browser/filter-list/inputs/PropertyFilterInput.js.map +1 -1
  50. package/build/browser/filter-list/inputs/SingleDateFilterInput.js +4 -2
  51. package/build/browser/filter-list/inputs/SingleDateFilterInput.js.map +1 -1
  52. package/build/browser/filter-list/inputs/SingleSelectFilterInput.js +9 -6
  53. package/build/browser/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
  54. package/build/browser/filter-list/inputs/StaticValuesFilterInput.js.map +1 -1
  55. package/build/browser/filter-list/types/CustomRendererTypes.js.map +1 -1
  56. package/build/browser/filter-list/types/KeywordSearchTypes.js.map +1 -1
  57. package/build/browser/filter-list/types/LinkedFilterTypes.js +42 -1
  58. package/build/browser/filter-list/types/LinkedFilterTypes.js.map +1 -1
  59. package/build/browser/filter-list/types/StaticValuesTypes.js.map +1 -1
  60. package/build/browser/filter-list/utils/filterStateToWhereClause.js +58 -22
  61. package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  62. package/build/browser/filter-list/utils/filterValues.js +148 -2
  63. package/build/browser/filter-list/utils/filterValues.js.map +1 -1
  64. package/build/browser/filter-list/utils/narrowObjectSet.js +48 -0
  65. package/build/browser/filter-list/utils/narrowObjectSet.js.map +1 -0
  66. package/build/browser/public/experimental/filter-list.js +1 -0
  67. package/build/browser/public/experimental/filter-list.js.map +1 -1
  68. package/build/browser/styles.css +17 -0
  69. package/build/browser/tokens/component-tokens/filter-list.css +5 -0
  70. package/build/browser/util/UserAgent.js +1 -1
  71. package/build/browser/util/UserAgent.js.map +1 -1
  72. package/build/cjs/{chunk-6XRF4IAL.cjs → chunk-2AK24MNP.cjs} +4 -4
  73. package/build/cjs/{chunk-6XRF4IAL.cjs.map → chunk-2AK24MNP.cjs.map} +1 -1
  74. package/build/cjs/chunk-3DIODTDY.cjs +11 -0
  75. package/build/cjs/{chunk-774FGQHO.cjs.map → chunk-3DIODTDY.cjs.map} +1 -1
  76. package/build/cjs/{chunk-P7R4RWMU.cjs → chunk-3RKGMRPD.cjs} +4 -4
  77. package/build/cjs/{chunk-P7R4RWMU.cjs.map → chunk-3RKGMRPD.cjs.map} +1 -1
  78. package/build/cjs/chunk-ACIIYYEL.cjs +11 -0
  79. package/build/cjs/{chunk-62DGPKOC.cjs.map → chunk-ACIIYYEL.cjs.map} +1 -1
  80. package/build/cjs/{chunk-3OUALM3K.cjs → chunk-COLGW56W.cjs} +4 -4
  81. package/build/cjs/{chunk-3OUALM3K.cjs.map → chunk-COLGW56W.cjs.map} +1 -1
  82. package/build/cjs/{chunk-DKPG7O4B.cjs → chunk-GTFPQHZL.cjs} +5 -4
  83. package/build/cjs/chunk-GTFPQHZL.cjs.map +1 -0
  84. package/build/cjs/{chunk-L6QDNMMG.cjs → chunk-K3IJA7WZ.cjs} +4 -4
  85. package/build/cjs/{chunk-L6QDNMMG.cjs.map → chunk-K3IJA7WZ.cjs.map} +1 -1
  86. package/build/cjs/chunk-MAQSZDRT.cjs +11 -0
  87. package/build/cjs/{chunk-S25XCKOA.cjs.map → chunk-MAQSZDRT.cjs.map} +1 -1
  88. package/build/cjs/chunk-MHMRIDIM.cjs +11 -0
  89. package/build/cjs/{chunk-SLHKSOQC.cjs.map → chunk-MHMRIDIM.cjs.map} +1 -1
  90. package/build/cjs/{chunk-BXCHISUQ.cjs → chunk-NOONKE5X.cjs} +3 -3
  91. package/build/cjs/{chunk-BXCHISUQ.cjs.map → chunk-NOONKE5X.cjs.map} +1 -1
  92. package/build/cjs/chunk-OEESYGT4.cjs +11 -0
  93. package/build/cjs/{chunk-3Y4W37E3.cjs.map → chunk-OEESYGT4.cjs.map} +1 -1
  94. package/build/cjs/{chunk-QOI2FQSL.cjs → chunk-PUZZZTC7.cjs} +372 -157
  95. package/build/cjs/chunk-PUZZZTC7.cjs.map +1 -0
  96. package/build/cjs/{chunk-FIAYYZHY.cjs → chunk-QWKUCBXE.cjs} +4 -4
  97. package/build/cjs/{chunk-FIAYYZHY.cjs.map → chunk-QWKUCBXE.cjs.map} +1 -1
  98. package/build/cjs/public/experimental/action-form.cjs +4 -4
  99. package/build/cjs/public/experimental/action-form.d.cts +1 -1
  100. package/build/cjs/public/experimental/document-viewer.cjs +4 -4
  101. package/build/cjs/public/experimental/email-viewer.cjs +3 -3
  102. package/build/cjs/public/experimental/excel-viewer.cjs +3 -3
  103. package/build/cjs/public/experimental/filter-list.cjs +17 -13
  104. package/build/cjs/public/experimental/filter-list.css +8 -0
  105. package/build/cjs/public/experimental/filter-list.css.map +1 -1
  106. package/build/cjs/public/experimental/filter-list.d.cts +95 -25
  107. package/build/cjs/public/experimental/image-viewer.cjs +3 -3
  108. package/build/cjs/public/experimental/markdown-renderer.cjs +3 -3
  109. package/build/cjs/public/experimental/object-table.cjs +8 -8
  110. package/build/cjs/public/experimental/pdf-viewer.cjs +7 -7
  111. package/build/cjs/public/experimental/tiff-renderer.cjs +3 -3
  112. package/build/cjs/public/experimental/video-viewer.cjs +3 -3
  113. package/build/cjs/public/experimental/xml-viewer.cjs +3 -3
  114. package/build/cjs/public/experimental.cjs +50 -46
  115. package/build/cjs/public/experimental.css +8 -0
  116. package/build/cjs/public/experimental.css.map +1 -1
  117. package/build/cjs/public/experimental.d.cts +1 -1
  118. package/build/esm/action-form/FormFieldApi.js.map +1 -1
  119. package/build/esm/action-form/utils/getDefaultFieldDefinitions.js +1 -0
  120. package/build/esm/action-form/utils/getDefaultFieldDefinitions.js.map +1 -1
  121. package/build/esm/filter-list/FilterInput.js +7 -0
  122. package/build/esm/filter-list/FilterInput.js.map +1 -1
  123. package/build/esm/filter-list/FilterList.js +8 -2
  124. package/build/esm/filter-list/FilterList.js.map +1 -1
  125. package/build/esm/filter-list/FilterListApi.js.map +1 -1
  126. package/build/esm/filter-list/FilterListItemApi.js.map +1 -1
  127. package/build/esm/filter-list/__tests__/aggregationMocks.js +50 -0
  128. package/build/esm/filter-list/__tests__/aggregationMocks.js.map +1 -0
  129. package/build/esm/filter-list/base/BaseFilterList.js.map +1 -1
  130. package/build/esm/filter-list/base/BaseFilterListApi.js.map +1 -1
  131. package/build/esm/filter-list/base/FilterInputExcludeRow.js +12 -16
  132. package/build/esm/filter-list/base/FilterInputExcludeRow.js.map +1 -1
  133. package/build/esm/filter-list/base/FilterListContent.js +42 -40
  134. package/build/esm/filter-list/base/FilterListContent.js.map +1 -1
  135. package/build/esm/filter-list/base/FilterListItem.js +8 -36
  136. package/build/esm/filter-list/base/FilterListItem.js.map +1 -1
  137. package/build/esm/filter-list/base/SortableFilterListItem.js +3 -1
  138. package/build/esm/filter-list/base/SortableFilterListItem.js.map +1 -1
  139. package/build/esm/filter-list/base/inputs/ListogramInput.js +3 -1
  140. package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
  141. package/build/esm/filter-list/base/inputs/ListogramInput.module.css +6 -0
  142. package/build/esm/filter-list/base/inputs/MultiDateInput.js +2 -1
  143. package/build/esm/filter-list/base/inputs/MultiDateInput.js.map +1 -1
  144. package/build/esm/filter-list/base/inputs/MultiSelectInput.js +7 -3
  145. package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
  146. package/build/esm/filter-list/base/inputs/MultiSelectInput.module.css +6 -0
  147. package/build/esm/filter-list/base/inputs/SingleDateInput.js +4 -2
  148. package/build/esm/filter-list/base/inputs/SingleDateInput.js.map +1 -1
  149. package/build/esm/filter-list/hooks/useDualScopeAggregation.js +70 -0
  150. package/build/esm/filter-list/hooks/useDualScopeAggregation.js.map +1 -0
  151. package/build/esm/filter-list/hooks/useFilterListState.js +35 -17
  152. package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
  153. package/build/esm/filter-list/hooks/useFilterPropertyAggregation.js +37 -0
  154. package/build/esm/filter-list/hooks/useFilterPropertyAggregation.js.map +1 -0
  155. package/build/esm/filter-list/hooks/usePropertyAggregation.js +7 -6
  156. package/build/esm/filter-list/hooks/usePropertyAggregation.js.map +1 -1
  157. package/build/esm/filter-list/inputs/LinkedPropertyInput.js +45 -22
  158. package/build/esm/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
  159. package/build/esm/filter-list/inputs/ListogramFilterInput.js +9 -7
  160. package/build/esm/filter-list/inputs/ListogramFilterInput.js.map +1 -1
  161. package/build/esm/filter-list/inputs/MultiSelectFilterInput.js +8 -6
  162. package/build/esm/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
  163. package/build/esm/filter-list/inputs/PropertyFilterInput.js +10 -1
  164. package/build/esm/filter-list/inputs/PropertyFilterInput.js.map +1 -1
  165. package/build/esm/filter-list/inputs/SingleDateFilterInput.js +4 -2
  166. package/build/esm/filter-list/inputs/SingleDateFilterInput.js.map +1 -1
  167. package/build/esm/filter-list/inputs/SingleSelectFilterInput.js +9 -6
  168. package/build/esm/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
  169. package/build/esm/filter-list/inputs/StaticValuesFilterInput.js.map +1 -1
  170. package/build/esm/filter-list/types/CustomRendererTypes.js.map +1 -1
  171. package/build/esm/filter-list/types/KeywordSearchTypes.js.map +1 -1
  172. package/build/esm/filter-list/types/LinkedFilterTypes.js +42 -1
  173. package/build/esm/filter-list/types/LinkedFilterTypes.js.map +1 -1
  174. package/build/esm/filter-list/types/StaticValuesTypes.js.map +1 -1
  175. package/build/esm/filter-list/utils/filterStateToWhereClause.js +58 -22
  176. package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  177. package/build/esm/filter-list/utils/filterValues.js +148 -2
  178. package/build/esm/filter-list/utils/filterValues.js.map +1 -1
  179. package/build/esm/filter-list/utils/narrowObjectSet.js +48 -0
  180. package/build/esm/filter-list/utils/narrowObjectSet.js.map +1 -0
  181. package/build/esm/public/experimental/filter-list.js +1 -0
  182. package/build/esm/public/experimental/filter-list.js.map +1 -1
  183. package/build/esm/tokens/component-tokens/filter-list.css +5 -0
  184. package/build/esm/util/UserAgent.js +1 -1
  185. package/build/esm/util/UserAgent.js.map +1 -1
  186. package/build/types/action-form/FormFieldApi.d.ts +1 -1
  187. package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
  188. package/build/types/filter-list/FilterInput.d.ts +6 -1
  189. package/build/types/filter-list/FilterInput.d.ts.map +1 -1
  190. package/build/types/filter-list/FilterList.d.ts.map +1 -1
  191. package/build/types/filter-list/FilterListApi.d.ts +30 -15
  192. package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
  193. package/build/types/filter-list/FilterListItemApi.d.ts +15 -1
  194. package/build/types/filter-list/FilterListItemApi.d.ts.map +1 -1
  195. package/build/types/filter-list/__tests__/aggregationMocks.d.ts +11 -0
  196. package/build/types/filter-list/__tests__/aggregationMocks.d.ts.map +1 -0
  197. package/build/types/filter-list/base/BaseFilterList.d.ts +2 -1
  198. package/build/types/filter-list/base/BaseFilterList.d.ts.map +1 -1
  199. package/build/types/filter-list/base/BaseFilterListApi.d.ts +2 -2
  200. package/build/types/filter-list/base/BaseFilterListApi.d.ts.map +1 -1
  201. package/build/types/filter-list/base/FilterInputExcludeRow.d.ts.map +1 -1
  202. package/build/types/filter-list/base/FilterListContent.d.ts +3 -3
  203. package/build/types/filter-list/base/FilterListContent.d.ts.map +1 -1
  204. package/build/types/filter-list/base/FilterListItem.d.ts +2 -1
  205. package/build/types/filter-list/base/FilterListItem.d.ts.map +1 -1
  206. package/build/types/filter-list/base/SortableFilterListItem.d.ts +2 -1
  207. package/build/types/filter-list/base/SortableFilterListItem.d.ts.map +1 -1
  208. package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -1
  209. package/build/types/filter-list/base/inputs/MultiDateInput.d.ts.map +1 -1
  210. package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts.map +1 -1
  211. package/build/types/filter-list/base/inputs/SingleDateInput.d.ts +2 -0
  212. package/build/types/filter-list/base/inputs/SingleDateInput.d.ts.map +1 -1
  213. package/build/types/filter-list/hooks/useDualScopeAggregation.d.ts +32 -0
  214. package/build/types/filter-list/hooks/useDualScopeAggregation.d.ts.map +1 -0
  215. package/build/types/filter-list/hooks/useFilterListState.d.ts +7 -0
  216. package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
  217. package/build/types/filter-list/hooks/useFilterPropertyAggregation.d.ts +13 -0
  218. package/build/types/filter-list/hooks/useFilterPropertyAggregation.d.ts.map +1 -0
  219. package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts +6 -4
  220. package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts.map +1 -1
  221. package/build/types/filter-list/inputs/ListogramFilterInput.d.ts +4 -1
  222. package/build/types/filter-list/inputs/ListogramFilterInput.d.ts.map +1 -1
  223. package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts +4 -1
  224. package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts.map +1 -1
  225. package/build/types/filter-list/inputs/PropertyFilterInput.d.ts +4 -1
  226. package/build/types/filter-list/inputs/PropertyFilterInput.d.ts.map +1 -1
  227. package/build/types/filter-list/inputs/SingleDateFilterInput.d.ts +7 -1
  228. package/build/types/filter-list/inputs/SingleDateFilterInput.d.ts.map +1 -1
  229. package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts +4 -1
  230. package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts.map +1 -1
  231. package/build/types/filter-list/inputs/StaticValuesFilterInput.d.ts +1 -1
  232. package/build/types/filter-list/types/CustomRendererTypes.d.ts +2 -2
  233. package/build/types/filter-list/types/CustomRendererTypes.d.ts.map +1 -1
  234. package/build/types/filter-list/types/KeywordSearchTypes.d.ts +2 -2
  235. package/build/types/filter-list/types/KeywordSearchTypes.d.ts.map +1 -1
  236. package/build/types/filter-list/types/LinkedFilterTypes.d.ts +34 -4
  237. package/build/types/filter-list/types/LinkedFilterTypes.d.ts.map +1 -1
  238. package/build/types/filter-list/types/StaticValuesTypes.d.ts +2 -2
  239. package/build/types/filter-list/types/StaticValuesTypes.d.ts.map +1 -1
  240. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts +24 -1
  241. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts.map +1 -1
  242. package/build/types/filter-list/utils/filterValues.d.ts +26 -0
  243. package/build/types/filter-list/utils/filterValues.d.ts.map +1 -1
  244. package/build/types/filter-list/utils/narrowObjectSet.d.ts +7 -0
  245. package/build/types/filter-list/utils/narrowObjectSet.d.ts.map +1 -0
  246. package/build/types/public/experimental/filter-list.d.ts +3 -1
  247. package/build/types/public/experimental/filter-list.d.ts.map +1 -1
  248. package/docs/CSSVariables.md +78 -17
  249. package/docs/FilterList.md +52 -6
  250. package/package.json +9 -9
  251. package/build/cjs/chunk-3Y4W37E3.cjs +0 -11
  252. package/build/cjs/chunk-62DGPKOC.cjs +0 -11
  253. package/build/cjs/chunk-774FGQHO.cjs +0 -11
  254. package/build/cjs/chunk-DKPG7O4B.cjs.map +0 -1
  255. package/build/cjs/chunk-QOI2FQSL.cjs.map +0 -1
  256. package/build/cjs/chunk-S25XCKOA.cjs +0 -11
  257. package/build/cjs/chunk-SLHKSOQC.cjs +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"ListogramInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","Checkbox","filterValuesBySearch","isEmptyValue","formatCompactCount","styles","ListogramSkeleton","NoValueLabel","sharedStyles","useStableData","ListogramInputInner","values","maxCount","isLoading","error","selectedValues","onChange","colorMap","displayMode","showCount","isExcluding","className","style","maxVisibleItems","searchQuery","renderValue","isExpanded","setIsExpanded","stableValues","selectedSet","Set","toggleValue","value","has","filter","v","filteredValues","rendered","sortedValues","selected","unselected","displayValues","slice","hasMore","length","createElement","listogram","errorMessage","message","emptyMessage","container","map","count","percentage","perRowColor","isEmpty","key","row","undefined","onClick","checkbox","e","stopPropagation","checked","onCheckedChange","label","noValueLabel","title","toLocaleString","bar","barFill","type","viewAllButton","ListogramInput"],"sources":["ListogramInput.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, useMemo, useState } from \"react\";\nimport { Checkbox } from \"../../../base-components/checkbox/Checkbox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport {\n filterValuesBySearch,\n isEmptyValue,\n} from \"../../utils/filterValues.js\";\nimport { formatCompactCount } from \"./formatCompactCount.js\";\nimport styles from \"./ListogramInput.module.css\";\nimport { ListogramSkeleton } from \"./ListogramSkeleton.js\";\nimport { NoValueLabel } from \"./NoValueLabel.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport { useStableData } from \"./useStableData.js\";\n\nexport type ListogramDisplayMode = \"full\" | \"count\" | \"minimal\";\n\ninterface ListogramInputProps {\n values: PropertyAggregationValue[];\n maxCount: number;\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (values: string[]) => void;\n colorMap?: Record<string, string>;\n displayMode?: ListogramDisplayMode;\n showCount?: boolean;\n isExcluding?: boolean;\n className?: string;\n style?: React.CSSProperties;\n maxVisibleItems?: number;\n searchQuery?: string;\n renderValue?: (value: string) => React.ReactNode;\n}\n\nfunction ListogramInputInner({\n values,\n maxCount,\n isLoading,\n error,\n selectedValues,\n onChange,\n colorMap,\n displayMode = \"full\",\n showCount = true,\n isExcluding,\n className,\n style,\n maxVisibleItems,\n searchQuery,\n renderValue,\n}: ListogramInputProps): React.ReactElement {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const stableValues = useStableData(values, isLoading);\n\n const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);\n\n const toggleValue = useCallback(\n (value: string) => {\n if (selectedSet.has(value)) {\n onChange(selectedValues.filter((v) => v !== value));\n } else {\n onChange([...selectedValues, value]);\n }\n },\n [selectedValues, selectedSet, onChange],\n );\n\n const filteredValues = useMemo(() => {\n if (searchQuery) {\n return filterValuesBySearch(\n stableValues,\n searchQuery,\n (v) => {\n const rendered = renderValue?.(v.value);\n return typeof rendered === \"string\" ? rendered : v.value;\n },\n );\n }\n return stableValues;\n }, [stableValues, searchQuery, renderValue]);\n\n const sortedValues = useMemo(() => {\n const selected = filteredValues.filter((v) => selectedSet.has(v.value));\n const unselected = filteredValues.filter((v) => !selectedSet.has(v.value));\n return [...selected, ...unselected];\n }, [filteredValues, selectedSet]);\n\n const displayValues = useMemo(() => {\n if (isExpanded || !maxVisibleItems) return sortedValues;\n return sortedValues.slice(0, maxVisibleItems);\n }, [sortedValues, maxVisibleItems, isExpanded]);\n\n const hasMore = maxVisibleItems != null\n && sortedValues.length > maxVisibleItems;\n\n return (\n <div\n className={classnames(styles.listogram, className)}\n style={style}\n data-loading={isLoading && filteredValues.length > 0}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading values: {error.message}\n </div>\n )}\n\n {!error && filteredValues.length === 0 && isLoading && (\n <ListogramSkeleton />\n )}\n {!error && filteredValues.length === 0 && !isLoading && (\n <div className={sharedStyles.emptyMessage}>No values available</div>\n )}\n\n {filteredValues.length > 0 && (\n <div className={styles.container}>\n {displayValues.map(({ value, count }) => {\n const percentage = maxCount > 0 ? (count / maxCount) * 100 : 0;\n const perRowColor = colorMap?.[value];\n const isEmpty = isEmptyValue(value);\n\n return (\n <Button\n key={value}\n className={styles.row}\n data-empty={isEmpty || undefined}\n // eslint-disable-next-line react/jsx-no-bind\n onClick={() => toggleValue(value)}\n aria-pressed={selectedSet.has(value)}\n style={perRowColor || percentage > 0\n ? ({\n \"--osdk-filter-listogram-bar-fill-scale\": percentage / 100,\n ...(perRowColor\n ? {\n \"--osdk-filter-listogram-row-bar-color\": perRowColor,\n }\n : undefined),\n } as React.CSSProperties)\n : undefined}\n >\n <span\n className={styles.checkbox}\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={selectedSet.has(value)}\n // eslint-disable-next-line react/jsx-no-bind\n onCheckedChange={() => toggleValue(value)}\n isExcluding={isExcluding}\n />\n </span>\n <span\n className={styles.label}\n data-excluding={(isExcluding && selectedSet.has(value))\n || undefined}\n >\n {isEmpty\n ? <NoValueLabel className={styles.noValueLabel} />\n : (renderValue?.(value) ?? value)}\n </span>\n {showCount && displayMode !== \"minimal\" && (\n <span\n className={styles.count}\n title={count.toLocaleString()}\n >\n {formatCompactCount(count)}\n </span>\n )}\n {displayMode === \"full\" && (\n <span className={styles.bar}>\n <span className={styles.barFill} />\n </span>\n )}\n </Button>\n );\n })}\n\n {hasMore && !isExpanded && (\n <Button\n type=\"button\"\n className={styles.viewAllButton}\n // eslint-disable-next-line react/jsx-no-bind\n onClick={() => setIsExpanded(true)}\n >\n View all ({sortedValues.length})\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const ListogramInput = memo(\n ListogramInputInner,\n) as typeof ListogramInputInner;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ListogramInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","Checkbox","filterValuesBySearch","isEmptyValue","formatCompactCount","styles","ListogramSkeleton","NoValueLabel","sharedStyles","useStableData","ListogramInputInner","values","maxCount","isLoading","error","selectedValues","onChange","colorMap","displayMode","showCount","isExcluding","className","style","maxVisibleItems","searchQuery","renderValue","isExpanded","setIsExpanded","stableValues","selectedSet","Set","toggleValue","value","has","filter","v","filteredValues","rendered","sortedValues","selected","unselected","displayValues","slice","hasMore","length","createElement","listogram","errorMessage","message","emptyMessage","container","map","count","percentage","perRowColor","isEmpty","isFilteredOut","key","row","undefined","onClick","checkbox","e","stopPropagation","checked","onCheckedChange","label","noValueLabel","title","toLocaleString","bar","barFill","type","viewAllButton","ListogramInput"],"sources":["ListogramInput.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, useMemo, useState } from \"react\";\nimport { Checkbox } from \"../../../base-components/checkbox/Checkbox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport {\n filterValuesBySearch,\n isEmptyValue,\n} from \"../../utils/filterValues.js\";\nimport { formatCompactCount } from \"./formatCompactCount.js\";\nimport styles from \"./ListogramInput.module.css\";\nimport { ListogramSkeleton } from \"./ListogramSkeleton.js\";\nimport { NoValueLabel } from \"./NoValueLabel.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport { useStableData } from \"./useStableData.js\";\n\nexport type ListogramDisplayMode = \"full\" | \"count\" | \"minimal\";\n\ninterface ListogramInputProps {\n values: PropertyAggregationValue[];\n maxCount: number;\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (values: string[]) => void;\n colorMap?: Record<string, string>;\n displayMode?: ListogramDisplayMode;\n showCount?: boolean;\n isExcluding?: boolean;\n className?: string;\n style?: React.CSSProperties;\n maxVisibleItems?: number;\n searchQuery?: string;\n renderValue?: (value: string) => React.ReactNode;\n}\n\nfunction ListogramInputInner({\n values,\n maxCount,\n isLoading,\n error,\n selectedValues,\n onChange,\n colorMap,\n displayMode = \"full\",\n showCount = true,\n isExcluding,\n className,\n style,\n maxVisibleItems,\n searchQuery,\n renderValue,\n}: ListogramInputProps): React.ReactElement {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const stableValues = useStableData(values, isLoading);\n\n const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);\n\n const toggleValue = useCallback(\n (value: string) => {\n if (selectedSet.has(value)) {\n onChange(selectedValues.filter((v) => v !== value));\n } else {\n onChange([...selectedValues, value]);\n }\n },\n [selectedValues, selectedSet, onChange],\n );\n\n const filteredValues = useMemo(() => {\n if (searchQuery) {\n return filterValuesBySearch(\n stableValues,\n searchQuery,\n (v) => {\n const rendered = renderValue?.(v.value);\n return typeof rendered === \"string\" ? rendered : v.value;\n },\n );\n }\n return stableValues;\n }, [stableValues, searchQuery, renderValue]);\n\n const sortedValues = useMemo(() => {\n const selected = filteredValues.filter((v) => selectedSet.has(v.value));\n const unselected = filteredValues.filter((v) => !selectedSet.has(v.value));\n return [...selected, ...unselected];\n }, [filteredValues, selectedSet]);\n\n const displayValues = useMemo(() => {\n if (isExpanded || !maxVisibleItems) return sortedValues;\n return sortedValues.slice(0, maxVisibleItems);\n }, [sortedValues, maxVisibleItems, isExpanded]);\n\n const hasMore = maxVisibleItems != null\n && sortedValues.length > maxVisibleItems;\n\n return (\n <div\n className={classnames(styles.listogram, className)}\n style={style}\n data-loading={isLoading && filteredValues.length > 0}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading values: {error.message}\n </div>\n )}\n\n {!error && filteredValues.length === 0 && isLoading && (\n <ListogramSkeleton />\n )}\n {!error && filteredValues.length === 0 && !isLoading && (\n <div className={sharedStyles.emptyMessage}>No values available</div>\n )}\n\n {filteredValues.length > 0 && (\n <div className={styles.container}>\n {displayValues.map(({ value, count }) => {\n const percentage = maxCount > 0 ? (count / maxCount) * 100 : 0;\n const perRowColor = colorMap?.[value];\n const isEmpty = isEmptyValue(value);\n\n const isFilteredOut = count === 0 && !selectedSet.has(value);\n return (\n <Button\n key={value}\n className={styles.row}\n data-empty={isEmpty || undefined}\n data-filtered-out={isFilteredOut || undefined}\n // eslint-disable-next-line react/jsx-no-bind\n onClick={() => toggleValue(value)}\n aria-pressed={selectedSet.has(value)}\n style={perRowColor || percentage > 0\n ? ({\n \"--osdk-filter-listogram-bar-fill-scale\": percentage / 100,\n ...(perRowColor\n ? {\n \"--osdk-filter-listogram-row-bar-color\": perRowColor,\n }\n : undefined),\n } as React.CSSProperties)\n : undefined}\n >\n <span\n className={styles.checkbox}\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={selectedSet.has(value)}\n // eslint-disable-next-line react/jsx-no-bind\n onCheckedChange={() => toggleValue(value)}\n isExcluding={isExcluding}\n />\n </span>\n <span\n className={styles.label}\n data-excluding={(isExcluding && selectedSet.has(value))\n || undefined}\n >\n {isEmpty\n ? <NoValueLabel className={styles.noValueLabel} />\n : (renderValue?.(value) ?? value)}\n </span>\n {showCount && displayMode !== \"minimal\" && (\n <span\n className={styles.count}\n title={count.toLocaleString()}\n >\n {formatCompactCount(count)}\n </span>\n )}\n {displayMode === \"full\" && (\n <span className={styles.bar}>\n <span className={styles.barFill} />\n </span>\n )}\n </Button>\n );\n })}\n\n {hasMore && !isExpanded && (\n <Button\n type=\"button\"\n className={styles.viewAllButton}\n // eslint-disable-next-line react/jsx-no-bind\n onClick={() => setIsExpanded(true)}\n >\n View all ({sortedValues.length})\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const ListogramInput = memo(\n ListogramInputInner,\n) as typeof ListogramInputInner;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,uBAAuB;AAC9C,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AACnE,SAASC,QAAQ,QAAQ,+CAA+C;AAExE,SACEC,oBAAoB,EACpBC,YAAY,QACP,6BAA6B;AACpC,SAASC,kBAAkB,QAAQ,yBAAyB;AAC5D,OAAOC,MAAM,MAAM,6BAA6B;AAChD,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,SAASC,YAAY,QAAQ,mBAAmB;AAChD,OAAOC,YAAY,MAAM,qBAAqB;AAC9C,SAASC,aAAa,QAAQ,oBAAoB;AAsBlD,SAASC,mBAAmBA,CAAC;EAC3BC,MAAM;EACNC,QAAQ;EACRC,SAAS;EACTC,KAAK;EACLC,cAAc;EACdC,QAAQ;EACRC,QAAQ;EACRC,WAAW,GAAG,MAAM;EACpBC,SAAS,GAAG,IAAI;EAChBC,WAAW;EACXC,SAAS;EACTC,KAAK;EACLC,eAAe;EACfC,WAAW;EACXC;AACmB,CAAC,EAAsB;EAC1C,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAG3B,QAAQ,CAAC,KAAK,CAAC;EAEnD,MAAM4B,YAAY,GAAGnB,aAAa,CAACE,MAAM,EAAEE,SAAS,CAAC;EAErD,MAAMgB,WAAW,GAAG9B,OAAO,CAAC,MAAM,IAAI+B,GAAG,CAACf,cAAc,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;EAE5E,MAAMgB,WAAW,GAAGjC,WAAW,CAC5BkC,KAAa,IAAK;IACjB,IAAIH,WAAW,CAACI,GAAG,CAACD,KAAK,CAAC,EAAE;MAC1BhB,QAAQ,CAACD,cAAc,CAACmB,MAAM,CAAEC,CAAC,IAAKA,CAAC,KAAKH,KAAK,CAAC,CAAC;IACrD,CAAC,MAAM;MACLhB,QAAQ,CAAC,CAAC,GAAGD,cAAc,EAAEiB,KAAK,CAAC,CAAC;IACtC;EACF,CAAC,EACD,CAACjB,cAAc,EAAEc,WAAW,EAAEb,QAAQ,CACxC,CAAC;EAED,MAAMoB,cAAc,GAAGrC,OAAO,CAAC,MAAM;IACnC,IAAIyB,WAAW,EAAE;MACf,OAAOtB,oBAAoB,CACzB0B,YAAY,EACZJ,WAAW,EACVW,CAAC,IAAK;QACL,MAAME,QAAQ,GAAGZ,WAAW,GAAGU,CAAC,CAACH,KAAK,CAAC;QACvC,OAAO,OAAOK,QAAQ,KAAK,QAAQ,GAAGA,QAAQ,GAAGF,CAAC,CAACH,KAAK;MAC1D,CACF,CAAC;IACH;IACA,OAAOJ,YAAY;EACrB,CAAC,EAAE,CAACA,YAAY,EAAEJ,WAAW,EAAEC,WAAW,CAAC,CAAC;EAE5C,MAAMa,YAAY,GAAGvC,OAAO,CAAC,MAAM;IACjC,MAAMwC,QAAQ,GAAGH,cAAc,CAACF,MAAM,CAAEC,CAAC,IAAKN,WAAW,CAACI,GAAG,CAACE,CAAC,CAACH,KAAK,CAAC,CAAC;IACvE,MAAMQ,UAAU,GAAGJ,cAAc,CAACF,MAAM,CAAEC,CAAC,IAAK,CAACN,WAAW,CAACI,GAAG,CAACE,CAAC,CAACH,KAAK,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAGO,QAAQ,EAAE,GAAGC,UAAU,CAAC;EACrC,CAAC,EAAE,CAACJ,cAAc,EAAEP,WAAW,CAAC,CAAC;EAEjC,MAAMY,aAAa,GAAG1C,OAAO,CAAC,MAAM;IAClC,IAAI2B,UAAU,IAAI,CAACH,eAAe,EAAE,OAAOe,YAAY;IACvD,OAAOA,YAAY,CAACI,KAAK,CAAC,CAAC,EAAEnB,eAAe,CAAC;EAC/C,CAAC,EAAE,CAACe,YAAY,EAAEf,eAAe,EAAEG,UAAU,CAAC,CAAC;EAE/C,MAAMiB,OAAO,GAAGpB,eAAe,IAAI,IAAI,IAClCe,YAAY,CAACM,MAAM,GAAGrB,eAAe;EAE1C,oBACE3B,KAAA,CAAAiD,aAAA;IACExB,SAAS,EAAE1B,UAAU,CAACU,MAAM,CAACyC,SAAS,EAAEzB,SAAS,CAAE;IACnDC,KAAK,EAAEA,KAAM;IACb,gBAAcT,SAAS,IAAIuB,cAAc,CAACQ,MAAM,GAAG;EAAE,GAEpD9B,KAAK,iBACJlB,KAAA,CAAAiD,aAAA;IAAKxB,SAAS,EAAEb,YAAY,CAACuC;EAAa,GAAC,wBACnB,EAACjC,KAAK,CAACkC,OAC1B,CACN,EAEA,CAAClC,KAAK,IAAIsB,cAAc,CAACQ,MAAM,KAAK,CAAC,IAAI/B,SAAS,iBACjDjB,KAAA,CAAAiD,aAAA,CAACvC,iBAAiB,MAAE,CACrB,EACA,CAACQ,KAAK,IAAIsB,cAAc,CAACQ,MAAM,KAAK,CAAC,IAAI,CAAC/B,SAAS,iBAClDjB,KAAA,CAAAiD,aAAA;IAAKxB,SAAS,EAAEb,YAAY,CAACyC;EAAa,GAAC,qBAAwB,CACpE,EAEAb,cAAc,CAACQ,MAAM,GAAG,CAAC,iBACxBhD,KAAA,CAAAiD,aAAA;IAAKxB,SAAS,EAAEhB,MAAM,CAAC6C;EAAU,GAC9BT,aAAa,CAACU,GAAG,CAAC,CAAC;IAAEnB,KAAK;IAAEoB;EAAM,CAAC,KAAK;IACvC,MAAMC,UAAU,GAAGzC,QAAQ,GAAG,CAAC,GAAIwC,KAAK,GAAGxC,QAAQ,GAAI,GAAG,GAAG,CAAC;IAC9D,MAAM0C,WAAW,GAAGrC,QAAQ,GAAGe,KAAK,CAAC;IACrC,MAAMuB,OAAO,GAAGpD,YAAY,CAAC6B,KAAK,CAAC;IAEnC,MAAMwB,aAAa,GAAGJ,KAAK,KAAK,CAAC,IAAI,CAACvB,WAAW,CAACI,GAAG,CAACD,KAAK,CAAC;IAC5D,oBACEpC,KAAA,CAAAiD,aAAA,CAACnD,MAAM;MACL+D,GAAG,EAAEzB,KAAM;MACXX,SAAS,EAAEhB,MAAM,CAACqD,GAAI;MACtB,cAAYH,OAAO,IAAII,SAAU;MACjC,qBAAmBH,aAAa,IAAIG;MACpC;MAAA;MACAC,OAAO,EAAEA,CAAA,KAAM7B,WAAW,CAACC,KAAK,CAAE;MAClC,gBAAcH,WAAW,CAACI,GAAG,CAACD,KAAK,CAAE;MACrCV,KAAK,EAAEgC,WAAW,IAAID,UAAU,GAAG,CAAC,GAC/B;QACD,wCAAwC,EAAEA,UAAU,GAAG,GAAG;QAC1D,IAAIC,WAAW,GACX;UACA,uCAAuC,EAAEA;QAC3C,CAAC,GACCK,SAAS;MACf,CAAC,GACCA;IAAU,gBAEd/D,KAAA,CAAAiD,aAAA;MACExB,SAAS,EAAEhB,MAAM,CAACwD,QAAS;MAC3BD,OAAO,EAAGE,CAAC,IAAKA,CAAC,CAACC,eAAe,CAAC;IAAE,gBAEpCnE,KAAA,CAAAiD,aAAA,CAAC5C,QAAQ;MACP+D,OAAO,EAAEnC,WAAW,CAACI,GAAG,CAACD,KAAK;MAC9B;MAAA;MACAiC,eAAe,EAAEA,CAAA,KAAMlC,WAAW,CAACC,KAAK,CAAE;MAC1CZ,WAAW,EAAEA;IAAY,CAC1B,CACG,CAAC,eACPxB,KAAA,CAAAiD,aAAA;MACExB,SAAS,EAAEhB,MAAM,CAAC6D,KAAM;MACxB,kBAAiB9C,WAAW,IAAIS,WAAW,CAACI,GAAG,CAACD,KAAK,CAAC,IACjD2B;IAAU,GAEdJ,OAAO,gBACJ3D,KAAA,CAAAiD,aAAA,CAACtC,YAAY;MAACc,SAAS,EAAEhB,MAAM,CAAC8D;IAAa,CAAE,CAAC,GAC/C1C,WAAW,GAAGO,KAAK,CAAC,IAAIA,KACzB,CAAC,EACNb,SAAS,IAAID,WAAW,KAAK,SAAS,iBACrCtB,KAAA,CAAAiD,aAAA;MACExB,SAAS,EAAEhB,MAAM,CAAC+C,KAAM;MACxBgB,KAAK,EAAEhB,KAAK,CAACiB,cAAc,CAAC;IAAE,GAE7BjE,kBAAkB,CAACgD,KAAK,CACrB,CACP,EACAlC,WAAW,KAAK,MAAM,iBACrBtB,KAAA,CAAAiD,aAAA;MAAMxB,SAAS,EAAEhB,MAAM,CAACiE;IAAI,gBAC1B1E,KAAA,CAAAiD,aAAA;MAAMxB,SAAS,EAAEhB,MAAM,CAACkE;IAAQ,CAAE,CAC9B,CAEF,CAAC;EAEb,CAAC,CAAC,EAED5B,OAAO,IAAI,CAACjB,UAAU,iBACrB9B,KAAA,CAAAiD,aAAA,CAACnD,MAAM;IACL8E,IAAI,EAAC,QAAQ;IACbnD,SAAS,EAAEhB,MAAM,CAACoE;IAClB;IAAA;IACAb,OAAO,EAAEA,CAAA,KAAMjC,aAAa,CAAC,IAAI;EAAE,GACpC,YACW,EAACW,YAAY,CAACM,MAAM,EAAC,GACzB,CAEP,CAEJ,CAAC;AAEV;AAEA,OAAO,MAAM8B,cAAc,gBAAG7E,IAAI,CAChCa,mBACF,CAA+B","ignoreList":[]}
@@ -81,6 +81,12 @@
81
81
  gap: var(--osdk-filter-null-label-gap);
82
82
  }
83
83
 
84
+ /* Muted styling for filtered-out (count=0) rows. */
85
+ .row[data-filtered-out] {
86
+ opacity: var(--osdk-filter-filtered-out-item-opacity);
87
+ color: var(--osdk-filter-filtered-out-item-color);
88
+ }
89
+
84
90
  .label {
85
91
  flex: 1;
86
92
  font-family: var(--osdk-filter-listogram-label-font-family);
@@ -68,7 +68,8 @@ function MultiDateInputInner({
68
68
  min: minDate,
69
69
  max: maxDate,
70
70
  ariaLabel: "Add date",
71
- modal: false
71
+ modal: false,
72
+ formatDate: formatDate
72
73
  })));
73
74
  }
74
75
  export const MultiDateInput = /*#__PURE__*/memo(MultiDateInputInner);
@@ -1 +1 @@
1
- {"version":3,"file":"MultiDateInput.js","names":["Button","classnames","React","memo","useCallback","DatePicker","formatDateForDisplay","formatDateForInput","styles","sharedStyles","MultiDateInputInner","selectedDates","onChange","className","style","minDate","maxDate","showClearAll","formatDate","addDate","date","dateStr","exists","some","d","sort","a","b","getTime","removeDate","filter","clearAll","createElement","multiDate","length","tagContainer","map","DateTag","key","toISOString","onRemove","onClick","calendarContainer","value","min","max","ariaLabel","modal","MultiDateInput","handleRemove","label","tag","tagRemove"],"sources":["MultiDateInput.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 { DatePicker } from \"../../../shared/calendar/index.js\";\nimport {\n formatDateForDisplay,\n formatDateForInput,\n} from \"../../../shared/dateUtils.js\";\nimport styles from \"./MultiDateInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface MultiDateInputProps {\n selectedDates: Date[];\n onChange: (dates: Date[]) => void;\n className?: string;\n style?: React.CSSProperties;\n minDate?: Date;\n maxDate?: Date;\n showClearAll?: boolean;\n /**\n * Consumer-provided display formatter for chip text. Falls back to\n * `formatDateForDisplay` (locale-aware) when omitted.\n */\n formatDate?: (date: Date) => string;\n}\n\nfunction MultiDateInputInner({\n selectedDates,\n onChange,\n className,\n style,\n minDate,\n maxDate,\n showClearAll = true,\n formatDate,\n}: MultiDateInputProps): React.ReactElement {\n const addDate = useCallback(\n (date: Date | null) => {\n if (date == null) return;\n const dateStr = formatDateForInput(date);\n const exists = selectedDates.some(\n (d) => formatDateForInput(d) === dateStr,\n );\n if (!exists) {\n onChange(\n [...selectedDates, date].sort((a, b) => a.getTime() - b.getTime()),\n );\n }\n },\n [selectedDates, onChange],\n );\n\n const removeDate = useCallback(\n (date: Date) => {\n const dateStr = formatDateForInput(date);\n onChange(\n selectedDates.filter((d) => formatDateForInput(d) !== dateStr),\n );\n },\n [selectedDates, onChange],\n );\n\n const clearAll = useCallback(() => {\n onChange([]);\n }, [onChange]);\n\n return (\n <div className={classnames(styles.multiDate, className)} style={style}>\n {selectedDates.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {selectedDates.map((date) => (\n <DateTag\n key={date.toISOString()}\n date={date}\n formatDate={formatDate}\n onRemove={removeDate}\n />\n ))}\n {showClearAll && selectedDates.length > 1 && (\n <Button\n className={styles.clearAll}\n onClick={clearAll}\n aria-label=\"Clear all dates\"\n >\n Clear all\n </Button>\n )}\n </div>\n )}\n\n <div className={styles.calendarContainer}>\n <DatePicker\n value={null}\n onChange={addDate}\n min={minDate}\n max={maxDate}\n ariaLabel=\"Add date\"\n modal={false}\n />\n </div>\n </div>\n );\n}\n\nexport const MultiDateInput: React.NamedExoticComponent<MultiDateInputProps> =\n memo(MultiDateInputInner);\n\ninterface DateTagProps {\n date: Date;\n formatDate: ((date: Date) => string) | undefined;\n onRemove: (date: Date) => void;\n}\n\nfunction DateTag(\n { date, formatDate, onRemove }: DateTagProps,\n): React.ReactElement {\n const handleRemove = useCallback(() => {\n onRemove(date);\n }, [onRemove, date]);\n const label = formatDate != null\n ? formatDate(date)\n : formatDateForDisplay(date);\n return (\n <span className={sharedStyles.tag}>\n {label}\n <Button\n className={sharedStyles.tagRemove}\n onClick={handleRemove}\n aria-label={`Remove ${label}`}\n >\n ×\n </Button>\n </span>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MultiDateInput.js","names":["Button","classnames","React","memo","useCallback","DatePicker","formatDateForDisplay","formatDateForInput","styles","sharedStyles","MultiDateInputInner","selectedDates","onChange","className","style","minDate","maxDate","showClearAll","formatDate","addDate","date","dateStr","exists","some","d","sort","a","b","getTime","removeDate","filter","clearAll","createElement","multiDate","length","tagContainer","map","DateTag","key","toISOString","onRemove","onClick","calendarContainer","value","min","max","ariaLabel","modal","MultiDateInput","handleRemove","label","tag","tagRemove"],"sources":["MultiDateInput.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 { DatePicker } from \"../../../shared/calendar/index.js\";\nimport {\n formatDateForDisplay,\n formatDateForInput,\n} from \"../../../shared/dateUtils.js\";\nimport styles from \"./MultiDateInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface MultiDateInputProps {\n selectedDates: Date[];\n onChange: (dates: Date[]) => void;\n className?: string;\n style?: React.CSSProperties;\n minDate?: Date;\n maxDate?: Date;\n showClearAll?: boolean;\n /**\n * Consumer-provided display formatter for chip text. Falls back to\n * `formatDateForDisplay` (locale-aware) when omitted.\n */\n formatDate?: (date: Date) => string;\n}\n\nfunction MultiDateInputInner({\n selectedDates,\n onChange,\n className,\n style,\n minDate,\n maxDate,\n showClearAll = true,\n formatDate,\n}: MultiDateInputProps): React.ReactElement {\n const addDate = useCallback(\n (date: Date | null) => {\n if (date == null) return;\n const dateStr = formatDateForInput(date);\n const exists = selectedDates.some(\n (d) => formatDateForInput(d) === dateStr,\n );\n if (!exists) {\n onChange(\n [...selectedDates, date].sort((a, b) => a.getTime() - b.getTime()),\n );\n }\n },\n [selectedDates, onChange],\n );\n\n const removeDate = useCallback(\n (date: Date) => {\n const dateStr = formatDateForInput(date);\n onChange(\n selectedDates.filter((d) => formatDateForInput(d) !== dateStr),\n );\n },\n [selectedDates, onChange],\n );\n\n const clearAll = useCallback(() => {\n onChange([]);\n }, [onChange]);\n\n return (\n <div className={classnames(styles.multiDate, className)} style={style}>\n {selectedDates.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {selectedDates.map((date) => (\n <DateTag\n key={date.toISOString()}\n date={date}\n formatDate={formatDate}\n onRemove={removeDate}\n />\n ))}\n {showClearAll && selectedDates.length > 1 && (\n <Button\n className={styles.clearAll}\n onClick={clearAll}\n aria-label=\"Clear all dates\"\n >\n Clear all\n </Button>\n )}\n </div>\n )}\n\n <div className={styles.calendarContainer}>\n <DatePicker\n value={null}\n onChange={addDate}\n min={minDate}\n max={maxDate}\n ariaLabel=\"Add date\"\n modal={false}\n formatDate={formatDate}\n />\n </div>\n </div>\n );\n}\n\nexport const MultiDateInput: React.NamedExoticComponent<MultiDateInputProps> =\n memo(MultiDateInputInner);\n\ninterface DateTagProps {\n date: Date;\n formatDate: ((date: Date) => string) | undefined;\n onRemove: (date: Date) => void;\n}\n\nfunction DateTag(\n { date, formatDate, onRemove }: DateTagProps,\n): React.ReactElement {\n const handleRemove = useCallback(() => {\n onRemove(date);\n }, [onRemove, date]);\n const label = formatDate != null\n ? formatDate(date)\n : formatDateForDisplay(date);\n return (\n <span className={sharedStyles.tag}>\n {label}\n <Button\n className={sharedStyles.tagRemove}\n onClick={handleRemove}\n aria-label={`Remove ${label}`}\n >\n ×\n </Button>\n </span>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -63,18 +63,22 @@ function MultiSelectInputInner({
63
63
  value,
64
64
  count
65
65
  }) => [value, count])), [stableValues]);
66
+ const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);
66
67
  const comboboxFilter = useMemo(() => renderValue ? createRenderValueFilter(renderValue) : undefined, [renderValue]);
67
68
  const renderItem = useCallback(value => {
68
69
  const isEmpty = isEmptyValue(value);
70
+ const count = countByValue.get(value) ?? 0;
71
+ const isFilteredOut = count === 0 && !selectedSet.has(value);
69
72
  return /*#__PURE__*/React.createElement(Combobox.Item, {
70
73
  key: value,
71
- value: value
74
+ value: value,
75
+ className: isFilteredOut ? styles.filteredOutItem : undefined
72
76
  }, /*#__PURE__*/React.createElement(Combobox.ItemIndicator, null), /*#__PURE__*/React.createElement("span", {
73
77
  className: styles.itemLabel
74
78
  }, isEmpty ? /*#__PURE__*/React.createElement(NoValueLabel, null) : renderValue ? renderValue(value) : value), showCounts && /*#__PURE__*/React.createElement("span", {
75
79
  className: styles.itemCount
76
- }, "(", (countByValue.get(value) ?? 0).toLocaleString(), ")"));
77
- }, [countByValue, showCounts, renderValue]);
80
+ }, "(", count.toLocaleString(), ")"));
81
+ }, [countByValue, selectedSet, showCounts, renderValue]);
78
82
  const renderChips = useCallback(selectedItems => /*#__PURE__*/React.createElement(React.Fragment, null, selectedItems.map(value => {
79
83
  const isEmpty = isEmptyValue(value);
80
84
  return /*#__PURE__*/React.createElement(Combobox.Chip, {
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSelectInput.js","names":["classnames","React","memo","useCallback","useMemo","Combobox","isEmptyValue","useFilterListBoundary","createRenderValueFilter","MultiSelectDropdownLayout","MultiSelectInlineLayout","styles","NoValueLabel","SelectInputSkeleton","sharedStyles","useStableData","MultiSelectInputInner","values","isLoading","error","selectedValues","onChange","className","style","placeholder","showCounts","ariaLabel","renderValue","layout","collisionBoundary","handleValueChange","newValues","stableValues","items","map","value","countByValue","Map","count","comboboxFilter","undefined","renderItem","isEmpty","createElement","Item","key","ItemIndicator","itemLabel","itemCount","get","toLocaleString","renderChips","selectedItems","Fragment","Chip","ChipRemove","Input","length","isNoData","isReloading","multiSelect","srOnly","role","errorMessage","message","emptyMessage","Root","multiple","onValueChange","filter","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 classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport { isEmptyValue } from \"../../utils/filterValues.js\";\nimport { useFilterListBoundary } from \"../FilterListBoundaryContext.js\";\nimport { createRenderValueFilter } from \"./comboboxFilter.js\";\nimport { MultiSelectDropdownLayout } from \"./MultiSelectDropdownLayout.js\";\nimport { MultiSelectInlineLayout } from \"./MultiSelectInlineLayout.js\";\nimport styles from \"./MultiSelectInput.module.css\";\nimport { NoValueLabel } from \"./NoValueLabel.js\";\nimport { SelectInputSkeleton } from \"./SelectInputSkeleton.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport { useStableData } from \"./useStableData.js\";\n\n/**\n * Layout for the value list:\n * - `\"dropdown\"` (default): chips inline + portaled Combobox popup. Use when\n * the input drives its own surface (e.g. standalone in a row).\n * - `\"inline\"`: search input + always-visible value list rendered in flow.\n * Use when wrapping the input in your own popover so the values are\n * immediately visible without an extra inner trigger.\n */\nexport type MultiSelectInputLayout = \"dropdown\" | \"inline\";\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 showCounts?: boolean;\n ariaLabel?: string;\n renderValue?: (value: string) => React.ReactNode;\n layout?: MultiSelectInputLayout;\n}\n\nfunction MultiSelectInputInner({\n values,\n isLoading,\n error,\n selectedValues,\n onChange,\n className,\n style,\n placeholder = \"Select values...\",\n showCounts = true,\n ariaLabel = \"Search values\",\n renderValue,\n layout = \"dropdown\",\n}: MultiSelectInputProps): React.ReactElement {\n const collisionBoundary = useFilterListBoundary();\n\n const handleValueChange = useCallback(\n (newValues: string[] | null) => {\n onChange(newValues ?? []);\n },\n [onChange],\n );\n\n const stableValues = useStableData(values, isLoading);\n\n const items = useMemo(\n () => stableValues.map(({ value }) => value),\n [stableValues],\n );\n\n const countByValue = useMemo(\n () => new Map(stableValues.map(({ value, count }) => [value, count])),\n [stableValues],\n );\n\n const comboboxFilter = useMemo(\n () => renderValue ? createRenderValueFilter(renderValue) : undefined,\n [renderValue],\n );\n\n const renderItem = useCallback(\n (value: string) => {\n const isEmpty = isEmptyValue(value);\n return (\n <Combobox.Item key={value} value={value}>\n <Combobox.ItemIndicator />\n <span className={styles.itemLabel}>\n {isEmpty\n ? <NoValueLabel />\n : (renderValue ? renderValue(value) : value)}\n </span>\n {showCounts && (\n <span className={styles.itemCount}>\n ({(countByValue.get(value) ?? 0).toLocaleString()})\n </span>\n )}\n </Combobox.Item>\n );\n },\n [countByValue, showCounts, renderValue],\n );\n\n const renderChips = useCallback(\n (selectedItems: string[]) => (\n <>\n {selectedItems.map((value) => {\n const isEmpty = isEmptyValue(value);\n return (\n <Combobox.Chip\n key={value}\n aria-label={isEmpty ? \"No value\" : value}\n >\n {isEmpty\n ? <NoValueLabel />\n : (renderValue ? renderValue(value) : value)}\n <Combobox.ChipRemove />\n </Combobox.Chip>\n );\n })}\n <Combobox.Input\n placeholder={selectedItems.length > 0 ? \"\" : placeholder}\n aria-label={ariaLabel}\n />\n </>\n ),\n [placeholder, ariaLabel, renderValue],\n );\n\n const isNoData = !error && stableValues.length === 0;\n const isReloading = isLoading && stableValues.length > 0;\n\n return (\n <div\n className={classnames(styles.multiSelect, className)}\n style={style}\n data-loading={isReloading}\n >\n <span className={sharedStyles.srOnly} role=\"status\">\n {isLoading ? \"Loading options\" : \"\"}\n </span>\n\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading options: {error.message}\n </div>\n )}\n\n {isNoData && isLoading && <SelectInputSkeleton />}\n {isNoData && !isLoading && (\n <div className={sharedStyles.emptyMessage}>\n No options available\n </div>\n )}\n\n {stableValues.length > 0 && (\n <Combobox.Root<string, true>\n multiple={true}\n value={selectedValues}\n onValueChange={handleValueChange}\n items={items}\n filter={comboboxFilter}\n >\n {layout === \"inline\"\n ? (\n <MultiSelectInlineLayout\n placeholder={placeholder}\n ariaLabel={ariaLabel}\n renderItem={renderItem}\n />\n )\n : (\n <MultiSelectDropdownLayout\n renderChips={renderChips}\n renderItem={renderItem}\n collisionBoundary={collisionBoundary}\n />\n )}\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":["classnames","React","memo","useCallback","useMemo","Combobox","isEmptyValue","useFilterListBoundary","createRenderValueFilter","MultiSelectDropdownLayout","MultiSelectInlineLayout","styles","NoValueLabel","SelectInputSkeleton","sharedStyles","useStableData","MultiSelectInputInner","values","isLoading","error","selectedValues","onChange","className","style","placeholder","showCounts","ariaLabel","renderValue","layout","collisionBoundary","handleValueChange","newValues","stableValues","items","map","value","countByValue","Map","count","selectedSet","Set","comboboxFilter","undefined","renderItem","isEmpty","get","isFilteredOut","has","createElement","Item","key","filteredOutItem","ItemIndicator","itemLabel","itemCount","toLocaleString","renderChips","selectedItems","Fragment","Chip","ChipRemove","Input","length","isNoData","isReloading","multiSelect","srOnly","role","errorMessage","message","emptyMessage","Root","multiple","onValueChange","filter","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 classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport { isEmptyValue } from \"../../utils/filterValues.js\";\nimport { useFilterListBoundary } from \"../FilterListBoundaryContext.js\";\nimport { createRenderValueFilter } from \"./comboboxFilter.js\";\nimport { MultiSelectDropdownLayout } from \"./MultiSelectDropdownLayout.js\";\nimport { MultiSelectInlineLayout } from \"./MultiSelectInlineLayout.js\";\nimport styles from \"./MultiSelectInput.module.css\";\nimport { NoValueLabel } from \"./NoValueLabel.js\";\nimport { SelectInputSkeleton } from \"./SelectInputSkeleton.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport { useStableData } from \"./useStableData.js\";\n\n/**\n * Layout for the value list:\n * - `\"dropdown\"` (default): chips inline + portaled Combobox popup. Use when\n * the input drives its own surface (e.g. standalone in a row).\n * - `\"inline\"`: search input + always-visible value list rendered in flow.\n * Use when wrapping the input in your own popover so the values are\n * immediately visible without an extra inner trigger.\n */\nexport type MultiSelectInputLayout = \"dropdown\" | \"inline\";\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 showCounts?: boolean;\n ariaLabel?: string;\n renderValue?: (value: string) => React.ReactNode;\n layout?: MultiSelectInputLayout;\n}\n\nfunction MultiSelectInputInner({\n values,\n isLoading,\n error,\n selectedValues,\n onChange,\n className,\n style,\n placeholder = \"Select values...\",\n showCounts = true,\n ariaLabel = \"Search values\",\n renderValue,\n layout = \"dropdown\",\n}: MultiSelectInputProps): React.ReactElement {\n const collisionBoundary = useFilterListBoundary();\n\n const handleValueChange = useCallback(\n (newValues: string[] | null) => {\n onChange(newValues ?? []);\n },\n [onChange],\n );\n\n const stableValues = useStableData(values, isLoading);\n\n const items = useMemo(\n () => stableValues.map(({ value }) => value),\n [stableValues],\n );\n\n const countByValue = useMemo(\n () => new Map(stableValues.map(({ value, count }) => [value, count])),\n [stableValues],\n );\n\n const selectedSet = useMemo(\n () => new Set(selectedValues),\n [selectedValues],\n );\n\n const comboboxFilter = useMemo(\n () => renderValue ? createRenderValueFilter(renderValue) : undefined,\n [renderValue],\n );\n\n const renderItem = useCallback(\n (value: string) => {\n const isEmpty = isEmptyValue(value);\n const count = countByValue.get(value) ?? 0;\n const isFilteredOut = count === 0 && !selectedSet.has(value);\n return (\n <Combobox.Item\n key={value}\n value={value}\n className={isFilteredOut ? styles.filteredOutItem : undefined}\n >\n <Combobox.ItemIndicator />\n <span className={styles.itemLabel}>\n {isEmpty\n ? <NoValueLabel />\n : (renderValue ? renderValue(value) : value)}\n </span>\n {showCounts && (\n <span className={styles.itemCount}>\n ({count.toLocaleString()})\n </span>\n )}\n </Combobox.Item>\n );\n },\n [countByValue, selectedSet, showCounts, renderValue],\n );\n\n const renderChips = useCallback(\n (selectedItems: string[]) => (\n <>\n {selectedItems.map((value) => {\n const isEmpty = isEmptyValue(value);\n return (\n <Combobox.Chip\n key={value}\n aria-label={isEmpty ? \"No value\" : value}\n >\n {isEmpty\n ? <NoValueLabel />\n : (renderValue ? renderValue(value) : value)}\n <Combobox.ChipRemove />\n </Combobox.Chip>\n );\n })}\n <Combobox.Input\n placeholder={selectedItems.length > 0 ? \"\" : placeholder}\n aria-label={ariaLabel}\n />\n </>\n ),\n [placeholder, ariaLabel, renderValue],\n );\n\n const isNoData = !error && stableValues.length === 0;\n const isReloading = isLoading && stableValues.length > 0;\n\n return (\n <div\n className={classnames(styles.multiSelect, className)}\n style={style}\n data-loading={isReloading}\n >\n <span className={sharedStyles.srOnly} role=\"status\">\n {isLoading ? \"Loading options\" : \"\"}\n </span>\n\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading options: {error.message}\n </div>\n )}\n\n {isNoData && isLoading && <SelectInputSkeleton />}\n {isNoData && !isLoading && (\n <div className={sharedStyles.emptyMessage}>\n No options available\n </div>\n )}\n\n {stableValues.length > 0 && (\n <Combobox.Root<string, true>\n multiple={true}\n value={selectedValues}\n onValueChange={handleValueChange}\n items={items}\n filter={comboboxFilter}\n >\n {layout === \"inline\"\n ? (\n <MultiSelectInlineLayout\n placeholder={placeholder}\n ariaLabel={ariaLabel}\n renderItem={renderItem}\n />\n )\n : (\n <MultiSelectDropdownLayout\n renderChips={renderChips}\n renderItem={renderItem}\n collisionBoundary={collisionBoundary}\n />\n )}\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":[]}
@@ -47,6 +47,12 @@
47
47
  flex-shrink: 0;
48
48
  }
49
49
 
50
+ /* Muted styling for filtered-out (count=0) entries. */
51
+ .filteredOutItem {
52
+ opacity: var(--osdk-filter-filtered-out-item-opacity);
53
+ color: var(--osdk-filter-filtered-out-item-color);
54
+ }
55
+
50
56
  .inlineInput {
51
57
  font-family: var(--osdk-filter-input-font-family);
52
58
  font-size: var(--osdk-filter-input-font-size);
@@ -3,6 +3,7 @@ const styles = {
3
3
  "multiSelect": "MultiSelectInput-module__multiSelect___QW1VndMR",
4
4
  "itemLabel": "MultiSelectInput-module__itemLabel___Kkk-GsEl",
5
5
  "itemCount": "MultiSelectInput-module__itemCount___YAf51fvo",
6
+ "filteredOutItem": "MultiSelectInput-module__filteredOutItem___rJBjg1Q3",
6
7
  "inlineInput": "MultiSelectInput-module__inlineInput___x9buiDhb",
7
8
  "inlineEmpty": "MultiSelectInput-module__inlineEmpty___HNU7wXCh",
8
9
  "inlineList": "MultiSelectInput-module__inlineList___DxKpzqvC"
@@ -27,7 +27,8 @@ function SingleDateInputInner({
27
27
  minDate,
28
28
  maxDate,
29
29
  placeholder,
30
- showClearButton = true
30
+ showClearButton = true,
31
+ formatDate
31
32
  }) {
32
33
  const handleClear = useCallback(() => {
33
34
  onChange(undefined);
@@ -47,7 +48,8 @@ function SingleDateInputInner({
47
48
  max: maxDate,
48
49
  placeholder: placeholder,
49
50
  ariaLabel: "Select date",
50
- modal: false
51
+ modal: false,
52
+ formatDate: formatDate
51
53
  }), showClearButton && selectedDate !== undefined && /*#__PURE__*/React.createElement(Button, {
52
54
  className: styles.clearButton,
53
55
  onClick: handleClear,
@@ -1 +1 @@
1
- {"version":3,"file":"SingleDateInput.js","names":["Button","classnames","React","memo","useCallback","DatePicker","styles","SingleDateInputInner","selectedDate","onChange","className","style","minDate","maxDate","placeholder","showClearButton","handleClear","undefined","handleChange","value","createElement","singleDate","dateContainer","min","max","ariaLabel","modal","clearButton","onClick","SingleDateInput"],"sources":["SingleDateInput.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 { DatePicker } from \"../../../shared/calendar/index.js\";\nimport styles from \"./SingleDateInput.module.css\";\n\ninterface SingleDateInputProps {\n selectedDate: Date | undefined;\n onChange: (date: Date | undefined) => void;\n className?: string;\n style?: React.CSSProperties;\n minDate?: Date;\n maxDate?: Date;\n placeholder?: string;\n showClearButton?: boolean;\n}\n\nfunction SingleDateInputInner({\n selectedDate,\n onChange,\n className,\n style,\n minDate,\n maxDate,\n placeholder,\n showClearButton = true,\n}: SingleDateInputProps): React.ReactElement {\n const handleClear = useCallback(() => {\n onChange(undefined);\n }, [onChange]);\n\n const handleChange = useCallback(\n (value: Date | null) => {\n onChange(value ?? undefined);\n },\n [onChange],\n );\n\n return (\n <div className={classnames(styles.singleDate, className)} style={style}>\n <div className={styles.dateContainer}>\n <DatePicker\n value={selectedDate ?? null}\n onChange={handleChange}\n min={minDate}\n max={maxDate}\n placeholder={placeholder}\n ariaLabel=\"Select date\"\n modal={false}\n />\n {showClearButton && selectedDate !== undefined && (\n <Button\n className={styles.clearButton}\n onClick={handleClear}\n aria-label=\"Clear date\"\n >\n ×\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nexport const SingleDateInput: React.NamedExoticComponent<SingleDateInputProps> =\n memo(SingleDateInputInner);\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,uBAAuB;AAC9C,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,WAAW,QAAQ,OAAO;AAChD,SAASC,UAAU,QAAQ,mCAAmC;AAC9D,OAAOC,MAAM,MAAM,8BAA8B;AAajD,SAASC,oBAAoBA,CAAC;EAC5BC,YAAY;EACZC,QAAQ;EACRC,SAAS;EACTC,KAAK;EACLC,OAAO;EACPC,OAAO;EACPC,WAAW;EACXC,eAAe,GAAG;AACE,CAAC,EAAsB;EAC3C,MAAMC,WAAW,GAAGZ,WAAW,CAAC,MAAM;IACpCK,QAAQ,CAACQ,SAAS,CAAC;EACrB,CAAC,EAAE,CAACR,QAAQ,CAAC,CAAC;EAEd,MAAMS,YAAY,GAAGd,WAAW,CAC7Be,KAAkB,IAAK;IACtBV,QAAQ,CAACU,KAAK,IAAIF,SAAS,CAAC;EAC9B,CAAC,EACD,CAACR,QAAQ,CACX,CAAC;EAED,oBACEP,KAAA,CAAAkB,aAAA;IAAKV,SAAS,EAAET,UAAU,CAACK,MAAM,CAACe,UAAU,EAAEX,SAAS,CAAE;IAACC,KAAK,EAAEA;EAAM,gBACrET,KAAA,CAAAkB,aAAA;IAAKV,SAAS,EAAEJ,MAAM,CAACgB;EAAc,gBACnCpB,KAAA,CAAAkB,aAAA,CAACf,UAAU;IACTc,KAAK,EAAEX,YAAY,IAAI,IAAK;IAC5BC,QAAQ,EAAES,YAAa;IACvBK,GAAG,EAAEX,OAAQ;IACbY,GAAG,EAAEX,OAAQ;IACbC,WAAW,EAAEA,WAAY;IACzBW,SAAS,EAAC,aAAa;IACvBC,KAAK,EAAE;EAAM,CACd,CAAC,EACDX,eAAe,IAAIP,YAAY,KAAKS,SAAS,iBAC5Cf,KAAA,CAAAkB,aAAA,CAACpB,MAAM;IACLU,SAAS,EAAEJ,MAAM,CAACqB,WAAY;IAC9BC,OAAO,EAAEZ,WAAY;IACrB,cAAW;EAAY,GACxB,MAEO,CAEP,CACF,CAAC;AAEV;AAEA,OAAO,MAAMa,eAAiE,gBAC5E1B,IAAI,CAACI,oBAAoB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"SingleDateInput.js","names":["Button","classnames","React","memo","useCallback","DatePicker","styles","SingleDateInputInner","selectedDate","onChange","className","style","minDate","maxDate","placeholder","showClearButton","formatDate","handleClear","undefined","handleChange","value","createElement","singleDate","dateContainer","min","max","ariaLabel","modal","clearButton","onClick","SingleDateInput"],"sources":["SingleDateInput.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 { DatePicker } from \"../../../shared/calendar/index.js\";\nimport styles from \"./SingleDateInput.module.css\";\n\ninterface SingleDateInputProps {\n selectedDate: Date | undefined;\n onChange: (date: Date | undefined) => void;\n className?: string;\n style?: React.CSSProperties;\n minDate?: Date;\n maxDate?: Date;\n placeholder?: string;\n showClearButton?: boolean;\n /** Display formatter for picker idle text. Editing format stays ISO. */\n formatDate?: (date: Date) => string;\n}\n\nfunction SingleDateInputInner({\n selectedDate,\n onChange,\n className,\n style,\n minDate,\n maxDate,\n placeholder,\n showClearButton = true,\n formatDate,\n}: SingleDateInputProps): React.ReactElement {\n const handleClear = useCallback(() => {\n onChange(undefined);\n }, [onChange]);\n\n const handleChange = useCallback(\n (value: Date | null) => {\n onChange(value ?? undefined);\n },\n [onChange],\n );\n\n return (\n <div className={classnames(styles.singleDate, className)} style={style}>\n <div className={styles.dateContainer}>\n <DatePicker\n value={selectedDate ?? null}\n onChange={handleChange}\n min={minDate}\n max={maxDate}\n placeholder={placeholder}\n ariaLabel=\"Select date\"\n modal={false}\n formatDate={formatDate}\n />\n {showClearButton && selectedDate !== undefined && (\n <Button\n className={styles.clearButton}\n onClick={handleClear}\n aria-label=\"Clear date\"\n >\n ×\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nexport const SingleDateInput: React.NamedExoticComponent<SingleDateInputProps> =\n memo(SingleDateInputInner);\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,uBAAuB;AAC9C,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,WAAW,QAAQ,OAAO;AAChD,SAASC,UAAU,QAAQ,mCAAmC;AAC9D,OAAOC,MAAM,MAAM,8BAA8B;AAejD,SAASC,oBAAoBA,CAAC;EAC5BC,YAAY;EACZC,QAAQ;EACRC,SAAS;EACTC,KAAK;EACLC,OAAO;EACPC,OAAO;EACPC,WAAW;EACXC,eAAe,GAAG,IAAI;EACtBC;AACoB,CAAC,EAAsB;EAC3C,MAAMC,WAAW,GAAGb,WAAW,CAAC,MAAM;IACpCK,QAAQ,CAACS,SAAS,CAAC;EACrB,CAAC,EAAE,CAACT,QAAQ,CAAC,CAAC;EAEd,MAAMU,YAAY,GAAGf,WAAW,CAC7BgB,KAAkB,IAAK;IACtBX,QAAQ,CAACW,KAAK,IAAIF,SAAS,CAAC;EAC9B,CAAC,EACD,CAACT,QAAQ,CACX,CAAC;EAED,oBACEP,KAAA,CAAAmB,aAAA;IAAKX,SAAS,EAAET,UAAU,CAACK,MAAM,CAACgB,UAAU,EAAEZ,SAAS,CAAE;IAACC,KAAK,EAAEA;EAAM,gBACrET,KAAA,CAAAmB,aAAA;IAAKX,SAAS,EAAEJ,MAAM,CAACiB;EAAc,gBACnCrB,KAAA,CAAAmB,aAAA,CAAChB,UAAU;IACTe,KAAK,EAAEZ,YAAY,IAAI,IAAK;IAC5BC,QAAQ,EAAEU,YAAa;IACvBK,GAAG,EAAEZ,OAAQ;IACba,GAAG,EAAEZ,OAAQ;IACbC,WAAW,EAAEA,WAAY;IACzBY,SAAS,EAAC,aAAa;IACvBC,KAAK,EAAE,KAAM;IACbX,UAAU,EAAEA;EAAW,CACxB,CAAC,EACDD,eAAe,IAAIP,YAAY,KAAKU,SAAS,iBAC5ChB,KAAA,CAAAmB,aAAA,CAACrB,MAAM;IACLU,SAAS,EAAEJ,MAAM,CAACsB,WAAY;IAC9BC,OAAO,EAAEZ,WAAY;IACrB,cAAW;EAAY,GACxB,MAEO,CAEP,CACF,CAAC;AAEV;AAEA,OAAO,MAAMa,eAAiE,gBAC5E3B,IAAI,CAACI,oBAAoB,CAAC","ignoreList":[]}
@@ -0,0 +1,70 @@
1
+ /*
2
+ * Copyright 2026 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { useMemo } from "react";
18
+ import { usePropertyAggregation } from "./usePropertyAggregation.js";
19
+ const EMPTY_VALUES = [];
20
+ /**
21
+ * Aggregates a property over `scopedObjectSet` (the narrowed scope) and pins
22
+ * any values that exist in `emptySourceObjectSet` (the unfiltered base) but
23
+ * are absent from the narrowed result to count=0, so facets can render
24
+ * "filtered-out" rows alongside live counts.
25
+ *
26
+ * When `emptySourceObjectSet` is `undefined`, this falls through to a single
27
+ * aggregation against `scopedObjectSet` — equivalent to `usePropertyAggregation`
28
+ * with `selectedValues` as the only pinned values.
29
+ *
30
+ * @param objectType - Object type for the aggregation
31
+ * @param propertyKey - Property to aggregate on
32
+ * @param scopedObjectSet - Set the live counts are computed against (post-narrowing)
33
+ * @param emptySourceObjectSet - Unfiltered base set whose values are pinned as
34
+ * count=0 when absent from the scoped aggregation. Pass `undefined` to skip
35
+ * the dual-scope behavior.
36
+ * @param options.selectedValues - Values to always include in the result, even
37
+ * when their count is 0 (e.g. currently-selected filter values)
38
+ * @returns Aggregation against the scoped set, with isLoading reflecting both
39
+ * queries when dual-scope is active.
40
+ */
41
+ export function useDualScopeAggregation(objectType, propertyKey, scopedObjectSet, emptySourceObjectSet, options = {}) {
42
+ const {
43
+ sortBy,
44
+ selectedValues = EMPTY_VALUES,
45
+ limit
46
+ } = options;
47
+ const isDualScope = emptySourceObjectSet !== undefined;
48
+ const emptySourceAggregation = usePropertyAggregation(objectType, propertyKey, emptySourceObjectSet);
49
+ const activeValues = useMemo(() => {
50
+ const merged = new Set(selectedValues);
51
+ if (isDualScope && emptySourceAggregation.error == null) {
52
+ for (const d of emptySourceAggregation.data) {
53
+ merged.add(d.value);
54
+ }
55
+ }
56
+ return merged.size === 0 ? undefined : Array.from(merged);
57
+ }, [isDualScope, emptySourceAggregation.data, emptySourceAggregation.error, selectedValues]);
58
+ const primary = usePropertyAggregation(objectType, propertyKey, scopedObjectSet, {
59
+ sortBy,
60
+ activeValues,
61
+ limit
62
+ });
63
+ return {
64
+ data: primary.data,
65
+ maxCount: primary.maxCount,
66
+ isLoading: primary.isLoading || isDualScope && emptySourceAggregation.isLoading,
67
+ error: primary.error
68
+ };
69
+ }
70
+ //# sourceMappingURL=useDualScopeAggregation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDualScopeAggregation.js","names":["useMemo","usePropertyAggregation","EMPTY_VALUES","useDualScopeAggregation","objectType","propertyKey","scopedObjectSet","emptySourceObjectSet","options","sortBy","selectedValues","limit","isDualScope","undefined","emptySourceAggregation","activeValues","merged","Set","error","d","data","add","value","size","Array","from","primary","maxCount","isLoading"],"sources":["useDualScopeAggregation.ts"],"sourcesContent":["/*\n * Copyright 2026 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 { useMemo } from \"react\";\nimport {\n usePropertyAggregation,\n type UsePropertyAggregationResult,\n} from \"./usePropertyAggregation.js\";\n\nconst EMPTY_VALUES: string[] = [];\n\nexport interface UseDualScopeAggregationOptions {\n limit?: number;\n sortBy?: \"count\" | \"value\";\n selectedValues?: string[];\n}\n\n/**\n * Aggregates a property over `scopedObjectSet` (the narrowed scope) and pins\n * any values that exist in `emptySourceObjectSet` (the unfiltered base) but\n * are absent from the narrowed result to count=0, so facets can render\n * \"filtered-out\" rows alongside live counts.\n *\n * When `emptySourceObjectSet` is `undefined`, this falls through to a single\n * aggregation against `scopedObjectSet` — equivalent to `usePropertyAggregation`\n * with `selectedValues` as the only pinned values.\n *\n * @param objectType - Object type for the aggregation\n * @param propertyKey - Property to aggregate on\n * @param scopedObjectSet - Set the live counts are computed against (post-narrowing)\n * @param emptySourceObjectSet - Unfiltered base set whose values are pinned as\n * count=0 when absent from the scoped aggregation. Pass `undefined` to skip\n * the dual-scope behavior.\n * @param options.selectedValues - Values to always include in the result, even\n * when their count is 0 (e.g. currently-selected filter values)\n * @returns Aggregation against the scoped set, with isLoading reflecting both\n * queries when dual-scope is active.\n */\nexport function useDualScopeAggregation<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n>(\n objectType: Q,\n propertyKey: K,\n scopedObjectSet: ObjectSet<Q> | undefined,\n emptySourceObjectSet: ObjectSet<Q> | undefined,\n options: UseDualScopeAggregationOptions = {},\n): UsePropertyAggregationResult {\n const { sortBy, selectedValues = EMPTY_VALUES, limit } = options;\n const isDualScope = emptySourceObjectSet !== undefined;\n\n const emptySourceAggregation = usePropertyAggregation(\n objectType,\n propertyKey,\n emptySourceObjectSet,\n );\n\n const activeValues = useMemo(() => {\n const merged = new Set(selectedValues);\n if (isDualScope && emptySourceAggregation.error == null) {\n for (const d of emptySourceAggregation.data) {\n merged.add(d.value);\n }\n }\n return merged.size === 0 ? undefined : Array.from(merged);\n }, [\n isDualScope,\n emptySourceAggregation.data,\n emptySourceAggregation.error,\n selectedValues,\n ]);\n\n const primary = usePropertyAggregation(\n objectType,\n propertyKey,\n scopedObjectSet,\n { sortBy, activeValues, limit },\n );\n\n return {\n data: primary.data,\n maxCount: primary.maxCount,\n isLoading: primary.isLoading\n || (isDualScope && emptySourceAggregation.isLoading),\n error: primary.error,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,sBAAsB,QAEjB,6BAA6B;AAEpC,MAAMC,YAAsB,GAAG,EAAE;AAQjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,uBAAuBA,CAIrCC,UAAa,EACbC,WAAc,EACdC,eAAyC,EACzCC,oBAA8C,EAC9CC,OAAuC,GAAG,CAAC,CAAC,EACd;EAC9B,MAAM;IAAEC,MAAM;IAAEC,cAAc,GAAGR,YAAY;IAAES;EAAM,CAAC,GAAGH,OAAO;EAChE,MAAMI,WAAW,GAAGL,oBAAoB,KAAKM,SAAS;EAEtD,MAAMC,sBAAsB,GAAGb,sBAAsB,CACnDG,UAAU,EACVC,WAAW,EACXE,oBACF,CAAC;EAED,MAAMQ,YAAY,GAAGf,OAAO,CAAC,MAAM;IACjC,MAAMgB,MAAM,GAAG,IAAIC,GAAG,CAACP,cAAc,CAAC;IACtC,IAAIE,WAAW,IAAIE,sBAAsB,CAACI,KAAK,IAAI,IAAI,EAAE;MACvD,KAAK,MAAMC,CAAC,IAAIL,sBAAsB,CAACM,IAAI,EAAE;QAC3CJ,MAAM,CAACK,GAAG,CAACF,CAAC,CAACG,KAAK,CAAC;MACrB;IACF;IACA,OAAON,MAAM,CAACO,IAAI,KAAK,CAAC,GAAGV,SAAS,GAAGW,KAAK,CAACC,IAAI,CAACT,MAAM,CAAC;EAC3D,CAAC,EAAE,CACDJ,WAAW,EACXE,sBAAsB,CAACM,IAAI,EAC3BN,sBAAsB,CAACI,KAAK,EAC5BR,cAAc,CACf,CAAC;EAEF,MAAMgB,OAAO,GAAGzB,sBAAsB,CACpCG,UAAU,EACVC,WAAW,EACXC,eAAe,EACf;IAAEG,MAAM;IAAEM,YAAY;IAAEJ;EAAM,CAChC,CAAC;EAED,OAAO;IACLS,IAAI,EAAEM,OAAO,CAACN,IAAI;IAClBO,QAAQ,EAAED,OAAO,CAACC,QAAQ;IAC1BC,SAAS,EAAEF,OAAO,CAACE,SAAS,IACtBhB,WAAW,IAAIE,sBAAsB,CAACc,SAAU;IACtDV,KAAK,EAAEQ,OAAO,CAACR;EACjB,CAAC;AACH","ignoreList":[]}
@@ -17,14 +17,11 @@
17
17
  import { useOsdkMetadata } from "@osdk/react";
18
18
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
19
19
  import { assertUnreachable } from "../../shared/assertUnreachable.js";
20
- import { buildWhereClause } from "../utils/filterStateToWhereClause.js";
20
+ import { buildWhereClause, getActiveLinkedFilters } from "../utils/filterStateToWhereClause.js";
21
21
  import { filterHasActiveState } from "../utils/filterValues.js";
22
22
  import { getFilterKey } from "../utils/getFilterKey.js";
23
+ import { narrowObjectSet } from "../utils/narrowObjectSet.js";
23
24
  import { useStableMapEntries } from "./useStableMapEntries.js";
24
- /**
25
- * Build initial states from filter definitions.
26
- * Uses string keys derived from getFilterKey() for stable lookups.
27
- */
28
25
  function buildInitialStates(definitions) {
29
26
  const states = new Map();
30
27
  if (!definitions) {
@@ -79,9 +76,11 @@ function buildInitialStates(definitions) {
79
76
  export function useFilterListState(props) {
80
77
  const {
81
78
  objectType,
79
+ objectSet,
82
80
  filterDefinitions,
83
81
  onFilterStateChanged,
84
82
  onFilterClauseChanged,
83
+ onEffectiveObjectSet,
85
84
  initialFilterStates
86
85
  } = props;
87
86
  const {
@@ -89,6 +88,10 @@ export function useFilterListState(props) {
89
88
  } = useOsdkMetadata(objectType);
90
89
  const onFilterClauseChangedRef = useRef(onFilterClauseChanged);
91
90
  onFilterClauseChangedRef.current = onFilterClauseChanged;
91
+ const onEffectiveObjectSetRef = useRef(onEffectiveObjectSet);
92
+ onEffectiveObjectSetRef.current = onEffectiveObjectSet;
93
+ const filterDefinitionsRef = useRef(filterDefinitions);
94
+ filterDefinitionsRef.current = filterDefinitions;
92
95
  const propertyTypes = useMemo(() => {
93
96
  const map = new Map();
94
97
  if (metadata?.properties) {
@@ -104,13 +107,13 @@ export function useFilterListState(props) {
104
107
  return map;
105
108
  }, [metadata?.properties]);
106
109
  const [filterStates, setFilterStates] = useState(() => {
107
- const states = buildInitialStates(filterDefinitions);
110
+ const initial = buildInitialStates(filterDefinitions);
108
111
  if (initialFilterStates) {
109
112
  for (const [key, state] of initialFilterStates) {
110
- states.set(key, state);
113
+ initial.set(key, state);
111
114
  }
112
115
  }
113
- return states;
116
+ return initial;
114
117
  });
115
118
  const setFilterState = useCallback((filterKey, state) => {
116
119
  setFilterStates(prev => {
@@ -118,11 +121,11 @@ export function useFilterListState(props) {
118
121
  next.set(filterKey, state);
119
122
  return next;
120
123
  });
121
- const definition = filterDefinitions?.find(d => getFilterKey(d) === filterKey);
124
+ const definition = filterDefinitionsRef.current?.find(d => getFilterKey(d) === filterKey);
122
125
  if (definition) {
123
126
  onFilterStateChanged?.(definition, state);
124
127
  }
125
- }, [filterDefinitions, onFilterStateChanged]);
128
+ }, [onFilterStateChanged]);
126
129
  const clearFilterState = useCallback(filterKey => {
127
130
  setFilterStates(prev => {
128
131
  const next = new Map(prev);
@@ -130,13 +133,21 @@ export function useFilterListState(props) {
130
133
  return next;
131
134
  });
132
135
  }, []);
136
+ const reset = useCallback(() => {
137
+ setFilterStates(buildInitialStates(filterDefinitionsRef.current));
138
+ }, []);
133
139
  const whereClause = useMemo(() => buildWhereClause(filterDefinitions, filterStates, propertyTypes), [filterDefinitions, filterStates, propertyTypes]);
140
+ const linkedFilters = useMemo(() => getActiveLinkedFilters(filterDefinitions, filterStates), [filterDefinitions, filterStates]);
141
+ const effectiveObjectSet = useMemo(() => objectSet == null ? undefined : narrowObjectSet(objectSet, whereClause, linkedFilters), [objectSet, whereClause, linkedFilters]);
134
142
  useEffect(() => {
135
143
  onFilterClauseChangedRef.current?.(whereClause);
136
144
  }, [whereClause]);
137
-
138
- // Preserve per-key clause references when content hasn't changed so
139
- // FilterInput.memo can hold and aggregations don't refetch unnecessarily.
145
+ useEffect(() => {
146
+ if (effectiveObjectSet == null) {
147
+ return;
148
+ }
149
+ onEffectiveObjectSetRef.current?.(effectiveObjectSet);
150
+ }, [effectiveObjectSet]);
140
151
  const perFilterWhereClauses = useStableMapEntries(useMemo(() => {
141
152
  const map = new Map();
142
153
  for (const definition of filterDefinitions ?? []) {
@@ -145,6 +156,14 @@ export function useFilterListState(props) {
145
156
  }
146
157
  return map;
147
158
  }, [filterDefinitions, filterStates, propertyTypes]));
159
+ const perFilterLinkedFilters = useStableMapEntries(useMemo(() => {
160
+ const map = new Map();
161
+ for (const definition of filterDefinitions ?? []) {
162
+ const key = getFilterKey(definition);
163
+ map.set(key, getActiveLinkedFilters(filterDefinitions, filterStates, key));
164
+ }
165
+ return map;
166
+ }, [filterDefinitions, filterStates]));
148
167
  const activeFilterCount = useMemo(() => {
149
168
  let count = 0;
150
169
  for (const state of filterStates.values()) {
@@ -154,17 +173,16 @@ export function useFilterListState(props) {
154
173
  }
155
174
  return count;
156
175
  }, [filterStates]);
157
- const reset = useCallback(() => {
158
- setFilterStates(buildInitialStates(filterDefinitions));
159
- }, [filterDefinitions]);
160
176
  return useMemo(() => ({
161
177
  filterStates,
162
178
  setFilterState,
163
179
  clearFilterState,
164
180
  whereClause,
181
+ linkedFilters,
165
182
  perFilterWhereClauses,
183
+ perFilterLinkedFilters,
166
184
  activeFilterCount,
167
185
  reset
168
- }), [filterStates, setFilterState, clearFilterState, whereClause, perFilterWhereClauses, activeFilterCount, reset]);
186
+ }), [filterStates, setFilterState, clearFilterState, whereClause, linkedFilters, perFilterWhereClauses, perFilterLinkedFilters, activeFilterCount, reset]);
169
187
  }
170
188
  //# sourceMappingURL=useFilterListState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFilterListState.js","names":["useOsdkMetadata","useCallback","useEffect","useMemo","useRef","useState","assertUnreachable","buildWhereClause","filterHasActiveState","getFilterKey","useStableMapEntries","buildInitialStates","definitions","states","Map","definition","key","type","state","filterState","set","defaultFilterState","innerState","defaultLinkedFilterState","linkedFilterState","useFilterListState","props","objectType","filterDefinitions","onFilterStateChanged","onFilterClauseChanged","initialFilterStates","metadata","onFilterClauseChangedRef","current","propertyTypes","map","properties","prop","Object","entries","multiplicity","filterStates","setFilterStates","setFilterState","filterKey","prev","next","find","d","clearFilterState","delete","whereClause","perFilterWhereClauses","activeFilterCount","count","values","reset"],"sources":["useFilterListState.ts"],"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, WhereClause } from \"@osdk/api\";\nimport { useOsdkMetadata } from \"@osdk/react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { assertUnreachable } from \"../../shared/assertUnreachable.js\";\nimport type { FilterListProps } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport type { LinkedPropertyFilterState } from \"../types/LinkedFilterTypes.js\";\nimport {\n buildWhereClause,\n type PropertyTypeInfo,\n} from \"../utils/filterStateToWhereClause.js\";\nimport { filterHasActiveState } from \"../utils/filterValues.js\";\nimport { getFilterKey } from \"../utils/getFilterKey.js\";\nimport { useStableMapEntries } from \"./useStableMapEntries.js\";\n\nexport interface UseFilterListStateResult<Q extends ObjectTypeDefinition> {\n filterStates: Map<string, FilterState>;\n setFilterState: (\n filterKey: string,\n state: FilterState,\n ) => void;\n clearFilterState: (filterKey: string) => void;\n whereClause: WhereClause<Q>;\n perFilterWhereClauses: Map<string, WhereClause<Q>>;\n activeFilterCount: number;\n reset: () => void;\n}\n\n/**\n * Build initial states from filter definitions.\n * Uses string keys derived from getFilterKey() for stable lookups.\n */\nfunction buildInitialStates<Q extends ObjectTypeDefinition>(\n definitions: FilterListProps<Q>[\"filterDefinitions\"],\n): Map<string, FilterState> {\n const states = new Map<string, FilterState>();\n\n if (!definitions) {\n return states;\n }\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n switch (definition.type) {\n case \"PROPERTY\": {\n const state = definition.filterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"HAS_LINK\":\n case \"KEYWORD_SEARCH\":\n case \"CUSTOM\": {\n const state = definition.defaultFilterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"STATIC_VALUES\": {\n const state = definition.filterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"LINKED_PROPERTY\": {\n const innerState = definition.defaultLinkedFilterState;\n if (innerState) {\n const state: LinkedPropertyFilterState = {\n type: \"linkedProperty\",\n linkedFilterState: innerState,\n };\n states.set(key, state);\n }\n break;\n }\n default:\n assertUnreachable(definition);\n }\n }\n\n return states;\n}\n\nexport function useFilterListState<Q extends ObjectTypeDefinition>(\n props: FilterListProps<Q>,\n): UseFilterListStateResult<Q> {\n const {\n objectType,\n filterDefinitions,\n onFilterStateChanged,\n onFilterClauseChanged,\n initialFilterStates,\n } = props;\n const { metadata } = useOsdkMetadata(objectType);\n const onFilterClauseChangedRef = useRef(onFilterClauseChanged);\n onFilterClauseChangedRef.current = onFilterClauseChanged;\n\n const propertyTypes = useMemo(() => {\n const map = new Map<string, PropertyTypeInfo>();\n if (metadata?.properties) {\n for (const [key, prop] of Object.entries(metadata.properties)) {\n if (typeof prop.type === \"string\") {\n map.set(key, {\n type: prop.type,\n multiplicity: prop.multiplicity === true,\n });\n }\n }\n }\n return map;\n }, [metadata?.properties]);\n\n const [filterStates, setFilterStates] = useState<\n Map<string, FilterState>\n >(() => {\n const states = buildInitialStates(filterDefinitions);\n if (initialFilterStates) {\n for (const [key, state] of initialFilterStates) {\n states.set(key, state);\n }\n }\n return states;\n });\n\n const setFilterState = useCallback(\n (filterKey: string, state: FilterState) => {\n setFilterStates((prev) => {\n const next = new Map(prev);\n next.set(filterKey, state);\n return next;\n });\n\n const definition = filterDefinitions?.find(\n (d) => getFilterKey(d) === filterKey,\n );\n if (definition) {\n onFilterStateChanged?.(definition, state);\n }\n },\n [\n filterDefinitions,\n onFilterStateChanged,\n ],\n );\n\n const clearFilterState = useCallback(\n (filterKey: string) => {\n setFilterStates((prev) => {\n const next = new Map(prev);\n next.delete(filterKey);\n return next;\n });\n },\n [],\n );\n\n const whereClause = useMemo(\n () =>\n buildWhereClause(\n filterDefinitions,\n filterStates,\n propertyTypes,\n ),\n [filterDefinitions, filterStates, propertyTypes],\n );\n\n useEffect(() => {\n onFilterClauseChangedRef.current?.(whereClause);\n }, [whereClause]);\n\n // Preserve per-key clause references when content hasn't changed so\n // FilterInput.memo can hold and aggregations don't refetch unnecessarily.\n const perFilterWhereClauses = useStableMapEntries(\n useMemo(() => {\n const map = new Map<string, WhereClause<Q>>();\n for (const definition of filterDefinitions ?? []) {\n const key = getFilterKey(definition);\n map.set(\n key,\n buildWhereClause(\n filterDefinitions,\n filterStates,\n propertyTypes,\n key,\n ),\n );\n }\n return map;\n }, [filterDefinitions, filterStates, propertyTypes]),\n );\n\n const activeFilterCount = useMemo(() => {\n let count = 0;\n for (const state of filterStates.values()) {\n if (filterHasActiveState(state)) {\n count++;\n }\n }\n return count;\n }, [filterStates]);\n\n const reset = useCallback(() => {\n setFilterStates(buildInitialStates(filterDefinitions));\n }, [filterDefinitions]);\n\n return useMemo(() => ({\n filterStates,\n setFilterState,\n clearFilterState,\n whereClause,\n perFilterWhereClauses,\n activeFilterCount,\n reset,\n }), [\n filterStates,\n setFilterState,\n clearFilterState,\n whereClause,\n perFilterWhereClauses,\n activeFilterCount,\n reset,\n ]);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"useFilterListState.js","names":["useOsdkMetadata","useCallback","useEffect","useMemo","useRef","useState","assertUnreachable","buildWhereClause","getActiveLinkedFilters","filterHasActiveState","getFilterKey","narrowObjectSet","useStableMapEntries","buildInitialStates","definitions","states","Map","definition","key","type","state","filterState","set","defaultFilterState","innerState","defaultLinkedFilterState","linkedFilterState","useFilterListState","props","objectType","objectSet","filterDefinitions","onFilterStateChanged","onFilterClauseChanged","onEffectiveObjectSet","initialFilterStates","metadata","onFilterClauseChangedRef","current","onEffectiveObjectSetRef","filterDefinitionsRef","propertyTypes","map","properties","prop","Object","entries","multiplicity","filterStates","setFilterStates","initial","setFilterState","filterKey","prev","next","find","d","clearFilterState","delete","reset","whereClause","linkedFilters","effectiveObjectSet","undefined","perFilterWhereClauses","perFilterLinkedFilters","activeFilterCount","count","values"],"sources":["useFilterListState.ts"],"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, WhereClause } from \"@osdk/api\";\nimport { useOsdkMetadata } from \"@osdk/react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { assertUnreachable } from \"../../shared/assertUnreachable.js\";\nimport type { FilterListProps } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport type {\n LinkedFilter,\n LinkedPropertyFilterState,\n} from \"../types/LinkedFilterTypes.js\";\nimport {\n buildWhereClause,\n getActiveLinkedFilters,\n type PropertyTypeInfo,\n} from \"../utils/filterStateToWhereClause.js\";\nimport { filterHasActiveState } from \"../utils/filterValues.js\";\nimport { getFilterKey } from \"../utils/getFilterKey.js\";\nimport { narrowObjectSet } from \"../utils/narrowObjectSet.js\";\nimport { useStableMapEntries } from \"./useStableMapEntries.js\";\n\nexport interface UseFilterListStateResult<Q extends ObjectTypeDefinition> {\n filterStates: Map<string, FilterState>;\n setFilterState: (\n filterKey: string,\n state: FilterState,\n ) => void;\n clearFilterState: (filterKey: string) => void;\n /** Direct (non-link-traversing) filters combined into a `WhereClause<Q>`. */\n whereClause: WhereClause<Q>;\n /** Active linked-property records; apply via `narrowObjectSet`. */\n linkedFilters: ReadonlyArray<LinkedFilter<Q>>;\n /** Per-filter excluding-self where clauses keyed by `getFilterKey`. */\n perFilterWhereClauses: Map<string, WhereClause<Q>>;\n /** Per-filter excluding-self linked filters keyed by `getFilterKey`. */\n perFilterLinkedFilters: Map<string, ReadonlyArray<LinkedFilter<Q>>>;\n activeFilterCount: number;\n reset: () => void;\n}\n\nfunction buildInitialStates<Q extends ObjectTypeDefinition>(\n definitions: FilterListProps<Q>[\"filterDefinitions\"],\n): Map<string, FilterState> {\n const states = new Map<string, FilterState>();\n\n if (!definitions) {\n return states;\n }\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n switch (definition.type) {\n case \"PROPERTY\": {\n const state = definition.filterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"HAS_LINK\":\n case \"KEYWORD_SEARCH\":\n case \"CUSTOM\": {\n const state = definition.defaultFilterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"STATIC_VALUES\": {\n const state = definition.filterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"LINKED_PROPERTY\": {\n const innerState = definition.defaultLinkedFilterState;\n if (innerState) {\n const state: LinkedPropertyFilterState = {\n type: \"linkedProperty\",\n linkedFilterState: innerState,\n };\n states.set(key, state);\n }\n break;\n }\n default:\n assertUnreachable(definition);\n }\n }\n\n return states;\n}\n\nexport function useFilterListState<Q extends ObjectTypeDefinition>(\n props: FilterListProps<Q>,\n): UseFilterListStateResult<Q> {\n const {\n objectType,\n objectSet,\n filterDefinitions,\n onFilterStateChanged,\n onFilterClauseChanged,\n onEffectiveObjectSet,\n initialFilterStates,\n } = props;\n const { metadata } = useOsdkMetadata(objectType);\n const onFilterClauseChangedRef = useRef(onFilterClauseChanged);\n onFilterClauseChangedRef.current = onFilterClauseChanged;\n const onEffectiveObjectSetRef = useRef(onEffectiveObjectSet);\n onEffectiveObjectSetRef.current = onEffectiveObjectSet;\n const filterDefinitionsRef = useRef(filterDefinitions);\n filterDefinitionsRef.current = filterDefinitions;\n\n const propertyTypes = useMemo(() => {\n const map = new Map<string, PropertyTypeInfo>();\n if (metadata?.properties) {\n for (const [key, prop] of Object.entries(metadata.properties)) {\n if (typeof prop.type === \"string\") {\n map.set(key, {\n type: prop.type,\n multiplicity: prop.multiplicity === true,\n });\n }\n }\n }\n return map;\n }, [metadata?.properties]);\n\n const [filterStates, setFilterStates] = useState<Map<string, FilterState>>(\n () => {\n const initial = buildInitialStates(filterDefinitions);\n if (initialFilterStates) {\n for (const [key, state] of initialFilterStates) {\n initial.set(key, state);\n }\n }\n return initial;\n },\n );\n\n const setFilterState = useCallback(\n (filterKey: string, state: FilterState) => {\n setFilterStates((prev) => {\n const next = new Map(prev);\n next.set(filterKey, state);\n return next;\n });\n\n const definition = filterDefinitionsRef.current?.find(\n (d) => getFilterKey(d) === filterKey,\n );\n if (definition) {\n onFilterStateChanged?.(definition, state);\n }\n },\n [onFilterStateChanged],\n );\n\n const clearFilterState = useCallback((filterKey: string) => {\n setFilterStates((prev) => {\n const next = new Map(prev);\n next.delete(filterKey);\n return next;\n });\n }, []);\n\n const reset = useCallback(() => {\n setFilterStates(buildInitialStates(filterDefinitionsRef.current));\n }, []);\n\n const whereClause = useMemo(\n () => buildWhereClause(filterDefinitions, filterStates, propertyTypes),\n [filterDefinitions, filterStates, propertyTypes],\n );\n\n const linkedFilters = useMemo(\n () => getActiveLinkedFilters(filterDefinitions, filterStates),\n [filterDefinitions, filterStates],\n );\n\n const effectiveObjectSet = useMemo<ObjectSet<Q> | undefined>(\n () =>\n objectSet == null\n ? undefined\n : narrowObjectSet(objectSet, whereClause, linkedFilters),\n [objectSet, whereClause, linkedFilters],\n );\n\n useEffect(() => {\n onFilterClauseChangedRef.current?.(whereClause);\n }, [whereClause]);\n\n useEffect(() => {\n if (effectiveObjectSet == null) {\n return;\n }\n onEffectiveObjectSetRef.current?.(effectiveObjectSet);\n }, [effectiveObjectSet]);\n\n const perFilterWhereClauses = useStableMapEntries(\n useMemo(() => {\n const map = new Map<string, WhereClause<Q>>();\n for (const definition of filterDefinitions ?? []) {\n const key = getFilterKey(definition);\n map.set(\n key,\n buildWhereClause(filterDefinitions, filterStates, propertyTypes, key),\n );\n }\n return map;\n }, [filterDefinitions, filterStates, propertyTypes]),\n );\n\n const perFilterLinkedFilters = useStableMapEntries(\n useMemo(() => {\n const map = new Map<string, ReadonlyArray<LinkedFilter<Q>>>();\n for (const definition of filterDefinitions ?? []) {\n const key = getFilterKey(definition);\n map.set(\n key,\n getActiveLinkedFilters(filterDefinitions, filterStates, key),\n );\n }\n return map;\n }, [filterDefinitions, filterStates]),\n );\n\n const activeFilterCount = useMemo(() => {\n let count = 0;\n for (const state of filterStates.values()) {\n if (filterHasActiveState(state)) {\n count++;\n }\n }\n return count;\n }, [filterStates]);\n\n return useMemo(() => ({\n filterStates,\n setFilterState,\n clearFilterState,\n whereClause,\n linkedFilters,\n perFilterWhereClauses,\n perFilterLinkedFilters,\n activeFilterCount,\n reset,\n }), [\n filterStates,\n setFilterState,\n clearFilterState,\n whereClause,\n linkedFilters,\n perFilterWhereClauses,\n perFilterLinkedFilters,\n activeFilterCount,\n reset,\n ]);\n}\n"],"mappings":"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","ignoreList":[]}