@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
@@ -179,23 +179,10 @@ function filterStateToPropertyFilter(state, propertyType) {
179
179
  }
180
180
  }
181
181
 
182
- /**
183
- * Builds a WhereClause from filter definitions and their current states.
184
- *
185
- * The filterStates map uses string keys derived from filter definitions via
186
- * getFilterKey(). This ensures stable state lookups even when filters are
187
- * reordered or definition object references change.
188
- *
189
- * Note: The `as WhereClause<Q>` casts are necessary because we're building
190
- * clauses dynamically from property keys determined at runtime. TypeScript
191
- * cannot verify that the constructed clause structure matches the generic Q's
192
- * expected shape, but the structure is guaranteed to be valid by construction.
193
- */
194
182
  /**
195
183
  * Builds a WHERE clause fragment for a single property key from filter state.
196
- * Shared by PROPERTY and STATIC_VALUES filter types.
197
184
  */
198
- function buildPropertyKeyClause(key, state, propertyType) {
185
+ export function buildPropertyKeyClause(key, state, propertyType) {
199
186
  const filter = filterStateToPropertyFilter(state, propertyType);
200
187
  if (filter === undefined) {
201
188
  return undefined;
@@ -229,6 +216,11 @@ function buildPropertyKeyClause(key, state, propertyType) {
229
216
  } : clause;
230
217
  }
231
218
  }
219
+ /**
220
+ * Builds a `WhereClause<Q>` from direct (non-link-traversing) filter
221
+ * definitions and current states. LINKED_PROPERTY filters are excluded —
222
+ * use `getActiveLinkedFilters` for those and apply via `narrowObjectSet`.
223
+ */
232
224
  export function buildWhereClause(definitions, filterStates, propertyTypes, excludeFilterKey) {
233
225
  if (!definitions || definitions.length === 0) {
234
226
  return {};
@@ -273,14 +265,9 @@ export function buildWhereClause(definitions, filterStates, propertyTypes, exclu
273
265
  break;
274
266
  }
275
267
  case "LINKED_PROPERTY":
276
- {
277
- // OSDK WhereClause does not support filtering through links.
278
- // Link-based filtering requires ObjectSet operations (pivotTo/intersect).
279
- // LinkedProperty filters render UI for selection but cannot be included
280
- // in the where clause. Consumers needing linked property filtering must
281
- // implement it using ObjectSet.pivotTo() and intersect().
282
- break;
283
- }
268
+ // Handled by getActiveLinkedFilters — can't be expressed as a
269
+ // WhereClause<Q>.
270
+ break;
284
271
  case "KEYWORD_SEARCH":
285
272
  {
286
273
  if (state.type !== "keywordSearch") {
@@ -386,6 +373,55 @@ export function buildWhereClause(definitions, filterStates, propertyTypes, exclu
386
373
  };
387
374
  }
388
375
 
376
+ /**
377
+ * Builds the inner `WhereClause` for a linked-property filter, typed against
378
+ * the linked object type. Returns `undefined` when the state doesn't yield a
379
+ * predicate (e.g. empty selection).
380
+ */
381
+ export function buildLinkedInnerWhere(definition, state) {
382
+ const record = buildPropertyKeyClause(definition.linkedPropertyKey, state.linkedFilterState);
383
+ if (record === undefined) {
384
+ return undefined;
385
+ }
386
+ return record;
387
+ }
388
+
389
+ /**
390
+ * Returns the active LINKED_PROPERTY filters as `LinkedFilter<Q>` records.
391
+ */
392
+ export function getActiveLinkedFilters(definitions, filterStates, excludeFilterKey) {
393
+ if (!definitions || definitions.length === 0) {
394
+ return [];
395
+ }
396
+ const result = [];
397
+ for (const definition of definitions) {
398
+ if (definition.type !== "LINKED_PROPERTY") {
399
+ continue;
400
+ }
401
+ const key = getFilterKey(definition);
402
+ if (key === excludeFilterKey) {
403
+ continue;
404
+ }
405
+ const state = filterStates.get(key);
406
+ if (!state || state.type !== "linkedProperty") {
407
+ continue;
408
+ }
409
+ if (definition.reverseLinkName == null) {
410
+ continue;
411
+ }
412
+ const innerWhere = buildLinkedInnerWhere(definition, state);
413
+ if (innerWhere === undefined) {
414
+ continue;
415
+ }
416
+ result.push({
417
+ linkName: definition.linkName,
418
+ reverseLinkName: definition.reverseLinkName,
419
+ innerWhere
420
+ });
421
+ }
422
+ return result;
423
+ }
424
+
389
425
  /** Splits values into non-empty and empty, returning $isNull for empty strings. */
390
426
  function buildValueOrNullFilter(values) {
391
427
  if (values.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"filterStateToWhereClause.js","names":["assertUnreachable","formatDateForInput","getFilterKey","isCompoundFilter","f","NUMERIC_BOUNDS","byte","min","max","short","integer","long","Number","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","clampToPropertyBounds","value","propertyType","undefined","bounds","Math","formatDateValue","date","toISOString","filterStateToPropertyFilter","state","type","$containsAnyTerm","enabled","conditions","minValue","push","$gte","maxValue","$lte","length","includeNull","$isNull","__compound","buildValueOrNullFilter","values","selectedValues","map","v","Date","startDate","endDate","buildPropertyKeyClause","key","filter","isExcluding","fieldClauses","c","rangeClause","$and","$or","$not","clause","buildWhereClause","definitions","filterStates","propertyTypes","excludeFilterKey","clauses","definition","get","process","env","NODE_ENV","console","warn","linkName","hasLink","$isNotNull","searchTerm","trim","properties","propertiesToSearch","size","info","multiplicity","containsOp","operator","propertySearches","prop","searchClause","customClause","toWhereClause","Object","keys","staticClause","nonEmpty","hasEmpty","valueClause","$in"],"sources":["filterStateToWhereClause.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 { assertUnreachable } from \"../../shared/assertUnreachable.js\";\nimport { formatDateForInput } from \"../../shared/dateUtils.js\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { getFilterKey } from \"./getFilterKey.js\";\n\ntype PropertyFilter = Record<string, unknown> | boolean | string | number;\n\ninterface CompoundFilter {\n __compound: true;\n conditions: PropertyFilter[];\n includeNull: boolean;\n}\n\nfunction isCompoundFilter(\n f: PropertyFilter | CompoundFilter,\n): f is CompoundFilter {\n return typeof f === \"object\" && f != null && \"__compound\" in f;\n}\n\nconst NUMERIC_BOUNDS: Record<string, { min: number; max: number }> = {\n byte: { min: -128, max: 127 },\n short: { min: -32_768, max: 32_767 },\n integer: { min: -2_147_483_648, max: 2_147_483_647 },\n long: { min: Number.MIN_SAFE_INTEGER, max: Number.MAX_SAFE_INTEGER },\n};\n\nfunction clampToPropertyBounds(\n value: number,\n propertyType: string | undefined,\n): number {\n if (propertyType === undefined) {\n return value;\n }\n const bounds = NUMERIC_BOUNDS[propertyType];\n if (bounds === undefined) {\n return value;\n }\n return Math.max(bounds.min, Math.min(bounds.max, value));\n}\n\nfunction formatDateValue(\n date: Date,\n propertyType: string | undefined,\n): string {\n if (propertyType === \"datetime\") {\n return formatDateForInput(date);\n }\n return date.toISOString();\n}\n\nfunction filterStateToPropertyFilter(\n state: FilterState,\n propertyType?: string,\n): PropertyFilter | CompoundFilter | undefined {\n switch (state.type) {\n case \"CONTAINS_TEXT\": {\n if (!state.value) {\n return undefined;\n }\n return { $containsAnyTerm: state.value };\n }\n\n case \"TOGGLE\": {\n return state.enabled;\n }\n\n case \"DATE_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({\n $gte: formatDateValue(state.minValue, propertyType),\n });\n }\n if (state.maxValue !== undefined) {\n conditions.push({\n $lte: formatDateValue(state.maxValue, propertyType),\n });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n if (conditions.length === 0 && state.includeNull) {\n return { $isNull: true };\n }\n\n if (conditions.length === 1 && !state.includeNull) {\n return conditions[0];\n }\n\n return {\n __compound: true,\n conditions,\n includeNull: state.includeNull ?? false,\n };\n }\n\n case \"NUMBER_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({\n $gte: clampToPropertyBounds(state.minValue, propertyType),\n });\n }\n if (state.maxValue !== undefined) {\n conditions.push({\n $lte: clampToPropertyBounds(state.maxValue, propertyType),\n });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n if (conditions.length === 0 && state.includeNull) {\n return { $isNull: true };\n }\n\n if (conditions.length === 1 && !state.includeNull) {\n return conditions[0];\n }\n\n return {\n __compound: true,\n conditions,\n includeNull: state.includeNull ?? false,\n };\n }\n\n case \"EXACT_MATCH\": {\n return buildValueOrNullFilter(state.values);\n }\n\n case \"SELECT\": {\n if (state.selectedValues.length === 0) {\n return undefined;\n }\n const values: (string | number | boolean)[] = state.selectedValues.map(\n (v) =>\n v instanceof Date\n ? formatDateValue(v, propertyType)\n : v as string | number | boolean,\n );\n return buildValueOrNullFilter(values);\n }\n\n case \"TIMELINE\": {\n const conditions: PropertyFilter[] = [];\n if (state.startDate !== undefined) {\n conditions.push({\n $gte: formatDateValue(state.startDate, propertyType),\n });\n }\n if (state.endDate !== undefined) {\n conditions.push({\n $lte: formatDateValue(state.endDate, propertyType),\n });\n }\n if (conditions.length === 0) {\n return undefined;\n }\n if (conditions.length === 1) {\n return conditions[0];\n }\n return {\n __compound: true,\n conditions,\n includeNull: false,\n };\n }\n\n // These filter types are handled separately in buildWhereClause\n // since they need access to the full definition, not just state\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"custom\":\n return undefined;\n\n default:\n return assertUnreachable(state);\n }\n}\n\n/**\n * Builds a WhereClause from filter definitions and their current states.\n *\n * The filterStates map uses string keys derived from filter definitions via\n * getFilterKey(). This ensures stable state lookups even when filters are\n * reordered or definition object references change.\n *\n * Note: The `as WhereClause<Q>` casts are necessary because we're building\n * clauses dynamically from property keys determined at runtime. TypeScript\n * cannot verify that the constructed clause structure matches the generic Q's\n * expected shape, but the structure is guaranteed to be valid by construction.\n */\n/**\n * Builds a WHERE clause fragment for a single property key from filter state.\n * Shared by PROPERTY and STATIC_VALUES filter types.\n */\nfunction buildPropertyKeyClause(\n key: string,\n state: FilterState,\n propertyType?: string,\n): Record<string, unknown> | undefined {\n const filter = filterStateToPropertyFilter(state, propertyType);\n if (filter === undefined) {\n return undefined;\n }\n const isExcluding = \"isExcluding\" in state && state.isExcluding;\n if (isCompoundFilter(filter)) {\n const fieldClauses = filter.conditions.map(c => ({\n [key]: c,\n }));\n let rangeClause: Record<string, unknown> = fieldClauses.length === 1\n ? fieldClauses[0]\n : { $and: fieldClauses };\n if (filter.includeNull) {\n rangeClause = {\n $or: [rangeClause, { [key]: { $isNull: true } }],\n };\n }\n return isExcluding ? { $not: rangeClause } : rangeClause;\n } else {\n const clause = { [key]: filter };\n return isExcluding ? { $not: clause } : clause;\n }\n}\n\nexport interface PropertyTypeInfo {\n type: string;\n multiplicity: boolean;\n}\n\nexport function buildWhereClause<Q extends ObjectTypeDefinition>(\n definitions: Array<FilterDefinitionUnion<Q>> | undefined,\n filterStates: Map<string, FilterState>,\n propertyTypes?: Map<string, PropertyTypeInfo>,\n excludeFilterKey?: string,\n): WhereClause<Q> {\n if (!definitions || definitions.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n const clauses: Array<Record<string, unknown>> = [];\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n if (key === excludeFilterKey) {\n continue;\n }\n const state = filterStates.get(key);\n\n if (!state) {\n continue;\n }\n\n switch (definition.type) {\n case \"PROPERTY\": {\n const propertyType = propertyTypes?.get(definition.key as string)\n ?.type;\n const clause = buildPropertyKeyClause(\n definition.key as string,\n state,\n propertyType,\n );\n if (clause !== undefined) {\n clauses.push(clause);\n }\n break;\n }\n\n case \"HAS_LINK\": {\n if (state.type !== \"hasLink\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for hasLink filter \"${definition.linkName}\": expected hasLink, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.hasLink) {\n break;\n }\n clauses.push({ [definition.linkName]: { $isNotNull: true } });\n break;\n }\n\n case \"LINKED_PROPERTY\": {\n // OSDK WhereClause does not support filtering through links.\n // Link-based filtering requires ObjectSet operations (pivotTo/intersect).\n // LinkedProperty filters render UI for selection but cannot be included\n // in the where clause. Consumers needing linked property filtering must\n // implement it using ObjectSet.pivotTo() and intersect().\n break;\n }\n\n case \"KEYWORD_SEARCH\": {\n if (state.type !== \"keywordSearch\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for keywordSearch filter: expected keywordSearch, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.searchTerm) {\n break;\n }\n // TypeScript narrows state to KeywordSearchFilterState\n const searchTerm = state.searchTerm.trim();\n if (!searchTerm) {\n break;\n }\n\n const properties = definition.properties;\n let propertiesToSearch: string[];\n\n if (properties === \"all\") {\n if (propertyTypes && propertyTypes.size > 0) {\n propertiesToSearch = [];\n for (const [key, info] of propertyTypes) {\n if (info.type === \"string\" && !info.multiplicity) {\n propertiesToSearch.push(key);\n }\n }\n } else {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"[FilterList] Keyword search with properties: 'all' requires propertyTypes to be provided. Filter will be skipped.\",\n );\n }\n break;\n }\n } else {\n propertiesToSearch = properties;\n }\n\n if (propertiesToSearch.length === 0) {\n break;\n }\n\n const containsOp = state.operator === \"AND\"\n ? \"$containsAllTerms\"\n : \"$containsAnyTerm\";\n\n const propertySearches = propertiesToSearch.map((prop) => ({\n [prop]: { [containsOp]: searchTerm },\n }));\n\n let searchClause: Record<string, unknown>;\n if (propertySearches.length === 1) {\n searchClause = propertySearches[0];\n } else {\n searchClause = { $or: propertySearches };\n }\n clauses.push(\n state.isExcluding ? { $not: searchClause } : searchClause,\n );\n break;\n }\n\n case \"CUSTOM\": {\n if (state.type !== \"custom\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for custom filter \"${definition.key}\": expected custom, got ${state.type}`,\n );\n }\n break;\n }\n // TypeScript narrows state to CustomFilterState\n const customClause = definition.toWhereClause(state);\n if (customClause && Object.keys(customClause).length > 0) {\n clauses.push(customClause as Record<string, unknown>);\n }\n break;\n }\n\n case \"STATIC_VALUES\": {\n if (definition.toWhereClause) {\n const staticClause = definition.toWhereClause(state);\n if (staticClause && Object.keys(staticClause).length > 0) {\n clauses.push(staticClause as Record<string, unknown>);\n }\n } else {\n const clause = buildPropertyKeyClause(definition.key, state);\n if (clause !== undefined) {\n clauses.push(clause);\n }\n }\n break;\n }\n\n default:\n assertUnreachable(definition);\n }\n }\n\n if (clauses.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n if (clauses.length === 1) {\n return clauses[0] as WhereClause<Q>;\n }\n\n return { $and: clauses } as WhereClause<Q>;\n}\n\n/** Splits values into non-empty and empty, returning $isNull for empty strings. */\nfunction buildValueOrNullFilter(\n values: (string | number | boolean)[],\n): PropertyFilter | CompoundFilter | undefined {\n if (values.length === 0) {\n return undefined;\n }\n\n const nonEmpty = values.filter((v) => v !== \"\");\n const hasEmpty = nonEmpty.length < values.length;\n\n const valueClause: PropertyFilter | undefined = nonEmpty.length === 0\n ? undefined\n : nonEmpty.length === 1\n ? nonEmpty[0]\n : { $in: nonEmpty };\n\n if (!hasEmpty) {\n return valueClause;\n }\n\n if (valueClause === undefined) {\n return { $isNull: true };\n }\n\n return {\n __compound: true,\n conditions: [valueClause],\n includeNull: true,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"filterStateToWhereClause.js","names":["assertUnreachable","formatDateForInput","getFilterKey","isCompoundFilter","f","NUMERIC_BOUNDS","byte","min","max","short","integer","long","Number","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","clampToPropertyBounds","value","propertyType","undefined","bounds","Math","formatDateValue","date","toISOString","filterStateToPropertyFilter","state","type","$containsAnyTerm","enabled","conditions","minValue","push","$gte","maxValue","$lte","length","includeNull","$isNull","__compound","buildValueOrNullFilter","values","selectedValues","map","v","Date","startDate","endDate","buildPropertyKeyClause","key","filter","isExcluding","fieldClauses","c","rangeClause","$and","$or","$not","clause","buildWhereClause","definitions","filterStates","propertyTypes","excludeFilterKey","clauses","definition","get","process","env","NODE_ENV","console","warn","linkName","hasLink","$isNotNull","searchTerm","trim","properties","propertiesToSearch","size","info","multiplicity","containsOp","operator","propertySearches","prop","searchClause","customClause","toWhereClause","Object","keys","staticClause","buildLinkedInnerWhere","record","linkedPropertyKey","linkedFilterState","getActiveLinkedFilters","result","reverseLinkName","innerWhere","nonEmpty","hasEmpty","valueClause","$in"],"sources":["filterStateToWhereClause.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 {\n LinkedType,\n LinkNames,\n ObjectTypeDefinition,\n WhereClause,\n} from \"@osdk/api\";\nimport { assertUnreachable } from \"../../shared/assertUnreachable.js\";\nimport { formatDateForInput } from \"../../shared/dateUtils.js\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport type {\n LinkedFilter,\n LinkedPropertyFilterDefinition,\n LinkedPropertyFilterState,\n} from \"../types/LinkedFilterTypes.js\";\nimport { getFilterKey } from \"./getFilterKey.js\";\n\ntype PropertyFilter = Record<string, unknown> | boolean | string | number;\n\ninterface CompoundFilter {\n __compound: true;\n conditions: PropertyFilter[];\n includeNull: boolean;\n}\n\nfunction isCompoundFilter(\n f: PropertyFilter | CompoundFilter,\n): f is CompoundFilter {\n return typeof f === \"object\" && f != null && \"__compound\" in f;\n}\n\nconst NUMERIC_BOUNDS: Record<string, { min: number; max: number }> = {\n byte: { min: -128, max: 127 },\n short: { min: -32_768, max: 32_767 },\n integer: { min: -2_147_483_648, max: 2_147_483_647 },\n long: { min: Number.MIN_SAFE_INTEGER, max: Number.MAX_SAFE_INTEGER },\n};\n\nfunction clampToPropertyBounds(\n value: number,\n propertyType: string | undefined,\n): number {\n if (propertyType === undefined) {\n return value;\n }\n const bounds = NUMERIC_BOUNDS[propertyType];\n if (bounds === undefined) {\n return value;\n }\n return Math.max(bounds.min, Math.min(bounds.max, value));\n}\n\nfunction formatDateValue(\n date: Date,\n propertyType: string | undefined,\n): string {\n if (propertyType === \"datetime\") {\n return formatDateForInput(date);\n }\n return date.toISOString();\n}\n\nfunction filterStateToPropertyFilter(\n state: FilterState,\n propertyType?: string,\n): PropertyFilter | CompoundFilter | undefined {\n switch (state.type) {\n case \"CONTAINS_TEXT\": {\n if (!state.value) {\n return undefined;\n }\n return { $containsAnyTerm: state.value };\n }\n\n case \"TOGGLE\": {\n return state.enabled;\n }\n\n case \"DATE_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({\n $gte: formatDateValue(state.minValue, propertyType),\n });\n }\n if (state.maxValue !== undefined) {\n conditions.push({\n $lte: formatDateValue(state.maxValue, propertyType),\n });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n if (conditions.length === 0 && state.includeNull) {\n return { $isNull: true };\n }\n\n if (conditions.length === 1 && !state.includeNull) {\n return conditions[0];\n }\n\n return {\n __compound: true,\n conditions,\n includeNull: state.includeNull ?? false,\n };\n }\n\n case \"NUMBER_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({\n $gte: clampToPropertyBounds(state.minValue, propertyType),\n });\n }\n if (state.maxValue !== undefined) {\n conditions.push({\n $lte: clampToPropertyBounds(state.maxValue, propertyType),\n });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n if (conditions.length === 0 && state.includeNull) {\n return { $isNull: true };\n }\n\n if (conditions.length === 1 && !state.includeNull) {\n return conditions[0];\n }\n\n return {\n __compound: true,\n conditions,\n includeNull: state.includeNull ?? false,\n };\n }\n\n case \"EXACT_MATCH\": {\n return buildValueOrNullFilter(state.values);\n }\n\n case \"SELECT\": {\n if (state.selectedValues.length === 0) {\n return undefined;\n }\n const values: (string | number | boolean)[] = state.selectedValues.map(\n (v) =>\n v instanceof Date\n ? formatDateValue(v, propertyType)\n : v as string | number | boolean,\n );\n return buildValueOrNullFilter(values);\n }\n\n case \"TIMELINE\": {\n const conditions: PropertyFilter[] = [];\n if (state.startDate !== undefined) {\n conditions.push({\n $gte: formatDateValue(state.startDate, propertyType),\n });\n }\n if (state.endDate !== undefined) {\n conditions.push({\n $lte: formatDateValue(state.endDate, propertyType),\n });\n }\n if (conditions.length === 0) {\n return undefined;\n }\n if (conditions.length === 1) {\n return conditions[0];\n }\n return {\n __compound: true,\n conditions,\n includeNull: false,\n };\n }\n\n // These filter types are handled separately in buildWhereClause\n // since they need access to the full definition, not just state\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"custom\":\n return undefined;\n\n default:\n return assertUnreachable(state);\n }\n}\n\n/**\n * Builds a WHERE clause fragment for a single property key from filter state.\n */\nexport function buildPropertyKeyClause(\n key: string | number | symbol,\n state: FilterState,\n propertyType?: string,\n): Record<string, unknown> | undefined {\n const filter = filterStateToPropertyFilter(state, propertyType);\n if (filter === undefined) {\n return undefined;\n }\n const isExcluding = \"isExcluding\" in state && state.isExcluding;\n if (isCompoundFilter(filter)) {\n const fieldClauses = filter.conditions.map(c => ({\n [key]: c,\n }));\n let rangeClause: Record<string, unknown> = fieldClauses.length === 1\n ? fieldClauses[0]\n : { $and: fieldClauses };\n if (filter.includeNull) {\n rangeClause = {\n $or: [rangeClause, { [key]: { $isNull: true } }],\n };\n }\n return isExcluding ? { $not: rangeClause } : rangeClause;\n } else {\n const clause = { [key]: filter };\n return isExcluding ? { $not: clause } : clause;\n }\n}\n\nexport interface PropertyTypeInfo {\n type: string;\n multiplicity: boolean;\n}\n\n/**\n * Builds a `WhereClause<Q>` from direct (non-link-traversing) filter\n * definitions and current states. LINKED_PROPERTY filters are excluded —\n * use `getActiveLinkedFilters` for those and apply via `narrowObjectSet`.\n */\nexport function buildWhereClause<Q extends ObjectTypeDefinition>(\n definitions: Array<FilterDefinitionUnion<Q>> | undefined,\n filterStates: Map<string, FilterState>,\n propertyTypes?: Map<string, PropertyTypeInfo>,\n excludeFilterKey?: string,\n): WhereClause<Q> {\n if (!definitions || definitions.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n const clauses: Array<Record<string, unknown>> = [];\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n if (key === excludeFilterKey) {\n continue;\n }\n const state = filterStates.get(key);\n\n if (!state) {\n continue;\n }\n\n switch (definition.type) {\n case \"PROPERTY\": {\n const propertyType = propertyTypes?.get(definition.key as string)\n ?.type;\n const clause = buildPropertyKeyClause(\n definition.key,\n state,\n propertyType,\n );\n if (clause !== undefined) {\n clauses.push(clause);\n }\n break;\n }\n\n case \"HAS_LINK\": {\n if (state.type !== \"hasLink\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for hasLink filter \"${definition.linkName}\": expected hasLink, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.hasLink) {\n break;\n }\n clauses.push({ [definition.linkName]: { $isNotNull: true } });\n break;\n }\n\n case \"LINKED_PROPERTY\":\n // Handled by getActiveLinkedFilters — can't be expressed as a\n // WhereClause<Q>.\n break;\n\n case \"KEYWORD_SEARCH\": {\n if (state.type !== \"keywordSearch\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for keywordSearch filter: expected keywordSearch, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.searchTerm) {\n break;\n }\n // TypeScript narrows state to KeywordSearchFilterState\n const searchTerm = state.searchTerm.trim();\n if (!searchTerm) {\n break;\n }\n\n const properties = definition.properties;\n let propertiesToSearch: string[];\n\n if (properties === \"all\") {\n if (propertyTypes && propertyTypes.size > 0) {\n propertiesToSearch = [];\n for (const [key, info] of propertyTypes) {\n if (info.type === \"string\" && !info.multiplicity) {\n propertiesToSearch.push(key);\n }\n }\n } else {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"[FilterList] Keyword search with properties: 'all' requires propertyTypes to be provided. Filter will be skipped.\",\n );\n }\n break;\n }\n } else {\n propertiesToSearch = properties;\n }\n\n if (propertiesToSearch.length === 0) {\n break;\n }\n\n const containsOp = state.operator === \"AND\"\n ? \"$containsAllTerms\"\n : \"$containsAnyTerm\";\n\n const propertySearches = propertiesToSearch.map((prop) => ({\n [prop]: { [containsOp]: searchTerm },\n }));\n\n let searchClause: Record<string, unknown>;\n if (propertySearches.length === 1) {\n searchClause = propertySearches[0];\n } else {\n searchClause = { $or: propertySearches };\n }\n clauses.push(\n state.isExcluding ? { $not: searchClause } : searchClause,\n );\n break;\n }\n\n case \"CUSTOM\": {\n if (state.type !== \"custom\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for custom filter \"${definition.key}\": expected custom, got ${state.type}`,\n );\n }\n break;\n }\n // TypeScript narrows state to CustomFilterState\n const customClause = definition.toWhereClause(state);\n if (customClause && Object.keys(customClause).length > 0) {\n clauses.push(customClause as Record<string, unknown>);\n }\n break;\n }\n\n case \"STATIC_VALUES\": {\n if (definition.toWhereClause) {\n const staticClause = definition.toWhereClause(state);\n if (staticClause && Object.keys(staticClause).length > 0) {\n clauses.push(staticClause as Record<string, unknown>);\n }\n } else {\n const clause = buildPropertyKeyClause(definition.key, state);\n if (clause !== undefined) {\n clauses.push(clause);\n }\n }\n break;\n }\n\n default:\n assertUnreachable(definition);\n }\n }\n\n if (clauses.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n if (clauses.length === 1) {\n return clauses[0] as WhereClause<Q>;\n }\n\n return { $and: clauses } as WhereClause<Q>;\n}\n\n/**\n * Builds the inner `WhereClause` for a linked-property filter, typed against\n * the linked object type. Returns `undefined` when the state doesn't yield a\n * predicate (e.g. empty selection).\n */\nexport function buildLinkedInnerWhere<\n Q extends ObjectTypeDefinition,\n L extends LinkNames<Q>,\n>(\n definition: LinkedPropertyFilterDefinition<Q, L>,\n state: LinkedPropertyFilterState,\n): WhereClause<LinkedType<Q, L>> | undefined {\n const record = buildPropertyKeyClause(\n definition.linkedPropertyKey,\n state.linkedFilterState,\n );\n if (record === undefined) {\n return undefined;\n }\n return record as WhereClause<LinkedType<Q, L>>;\n}\n\n/**\n * Returns the active LINKED_PROPERTY filters as `LinkedFilter<Q>` records.\n */\nexport function getActiveLinkedFilters<Q extends ObjectTypeDefinition>(\n definitions: Array<FilterDefinitionUnion<Q>> | undefined,\n filterStates: Map<string, FilterState>,\n excludeFilterKey?: string,\n): Array<LinkedFilter<Q>> {\n if (!definitions || definitions.length === 0) {\n return [];\n }\n const result: Array<LinkedFilter<Q>> = [];\n for (const definition of definitions) {\n if (definition.type !== \"LINKED_PROPERTY\") {\n continue;\n }\n const key = getFilterKey(definition);\n if (key === excludeFilterKey) {\n continue;\n }\n const state = filterStates.get(key);\n if (!state || state.type !== \"linkedProperty\") {\n continue;\n }\n if (definition.reverseLinkName == null) {\n continue;\n }\n const innerWhere = buildLinkedInnerWhere(definition, state);\n if (innerWhere === undefined) {\n continue;\n }\n result.push({\n linkName: definition.linkName,\n reverseLinkName: definition.reverseLinkName,\n innerWhere,\n } as LinkedFilter<Q>);\n }\n return result;\n}\n\n/** Splits values into non-empty and empty, returning $isNull for empty strings. */\nfunction buildValueOrNullFilter(\n values: (string | number | boolean)[],\n): PropertyFilter | CompoundFilter | undefined {\n if (values.length === 0) {\n return undefined;\n }\n\n const nonEmpty = values.filter((v) => v !== \"\");\n const hasEmpty = nonEmpty.length < values.length;\n\n const valueClause: PropertyFilter | undefined = nonEmpty.length === 0\n ? undefined\n : nonEmpty.length === 1\n ? nonEmpty[0]\n : { $in: nonEmpty };\n\n if (!hasEmpty) {\n return valueClause;\n }\n\n if (valueClause === undefined) {\n return { $isNull: true };\n }\n\n return {\n __compound: true,\n conditions: [valueClause],\n includeNull: true,\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -14,6 +14,18 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ /**
18
+ * Unwraps a `linkedProperty` wrapper one level so callers can reason about the
19
+ * underlying filter state directly (e.g. for header controls that should
20
+ * follow the inner filter's capabilities).
21
+ */
22
+ export function getEffectiveFilterState(state) {
23
+ if (state?.type === "linkedProperty") {
24
+ return state.linkedFilterState;
25
+ }
26
+ return state;
27
+ }
28
+
17
29
  /** Returns true for filter state types that support in-filter search. */
18
30
  export function supportsSearch(state) {
19
31
  if (!state) {
@@ -111,14 +123,148 @@ export function dedupeEmptyAggregationRows(values) {
111
123
  /** Case-insensitive substring filter for search functionality. */
112
124
  export function filterValuesBySearch(values, searchValue, getValue) {
113
125
  const trimmed = searchValue.trim();
114
- if (!trimmed) return values;
126
+ if (!trimmed) {
127
+ return values;
128
+ }
115
129
  const lowerSearch = trimmed.toLowerCase();
116
130
  return values.filter(v => getValue(v).toLowerCase().includes(lowerSearch));
117
131
  }
118
132
 
133
+ /**
134
+ * Returns a "cleared" version of the given filter state, preserving the
135
+ * discriminator and `isExcluding` flag so the UI doesn't snap between filter
136
+ * modes when a user clicks "Clear all selections". Returns `undefined` if no
137
+ * cleared form is meaningful for the state shape.
138
+ */
139
+ export function clearFilterState(state) {
140
+ if (!state) {
141
+ return undefined;
142
+ }
143
+ switch (state.type) {
144
+ case "SELECT":
145
+ return {
146
+ type: "SELECT",
147
+ selectedValues: [],
148
+ isExcluding: state.isExcluding
149
+ };
150
+ case "EXACT_MATCH":
151
+ return {
152
+ type: "EXACT_MATCH",
153
+ values: [],
154
+ isExcluding: state.isExcluding
155
+ };
156
+ case "CONTAINS_TEXT":
157
+ return {
158
+ type: "CONTAINS_TEXT",
159
+ value: undefined,
160
+ isExcluding: state.isExcluding
161
+ };
162
+ case "NUMBER_RANGE":
163
+ return {
164
+ type: "NUMBER_RANGE",
165
+ minValue: undefined,
166
+ maxValue: undefined,
167
+ includeNull: false
168
+ };
169
+ case "DATE_RANGE":
170
+ return {
171
+ type: "DATE_RANGE",
172
+ minValue: undefined,
173
+ maxValue: undefined,
174
+ includeNull: false
175
+ };
176
+ case "TIMELINE":
177
+ return {
178
+ type: "TIMELINE",
179
+ startDate: undefined,
180
+ endDate: undefined,
181
+ isExcluding: state.isExcluding
182
+ };
183
+ case "TOGGLE":
184
+ return {
185
+ type: "TOGGLE",
186
+ enabled: false
187
+ };
188
+ case "hasLink":
189
+ return {
190
+ type: "hasLink",
191
+ hasLink: false
192
+ };
193
+ case "keywordSearch":
194
+ return {
195
+ type: "keywordSearch",
196
+ searchTerm: "",
197
+ operator: state.operator
198
+ };
199
+ case "linkedProperty":
200
+ {
201
+ const innerCleared = clearFilterState(state.linkedFilterState);
202
+ if (!innerCleared) {
203
+ return undefined;
204
+ }
205
+ return {
206
+ type: "linkedProperty",
207
+ linkedFilterState: innerCleared
208
+ };
209
+ }
210
+ case "custom":
211
+ return undefined;
212
+ default:
213
+ {
214
+ return undefined;
215
+ }
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Returns the state with `isExcluding` flipped, preserving the discriminator
221
+ * and unwrapping/re-wrapping any `linkedProperty` wrapper. Returns `undefined`
222
+ * if the wrapped state is one that does not support excluding.
223
+ */
224
+ export function toggleIsExcluding(state) {
225
+ if (state.type === "linkedProperty") {
226
+ const inner = state.linkedFilterState;
227
+ return {
228
+ type: "linkedProperty",
229
+ linkedFilterState: {
230
+ ...inner,
231
+ isExcluding: !inner.isExcluding
232
+ }
233
+ };
234
+ }
235
+ if (!supportsExcluding(state)) {
236
+ return undefined;
237
+ }
238
+ return {
239
+ ...state,
240
+ isExcluding: !state.isExcluding
241
+ };
242
+ }
243
+
244
+ /**
245
+ * Returns the number of values the user has actively selected for filters
246
+ * whose UI surfaces a selected-of-total count (LISTOGRAM, SINGLE_SELECT,
247
+ * MULTI_SELECT, TEXT_TAGS). Returns 0 for state shapes that don't have a
248
+ * discrete list of selected values.
249
+ */
250
+ export function getSelectedCount(state) {
251
+ if (!state) {
252
+ return 0;
253
+ }
254
+ if (state.type === "EXACT_MATCH") {
255
+ return state.values.length;
256
+ }
257
+ if (state.type === "SELECT") {
258
+ return state.selectedValues.length;
259
+ }
260
+ return 0;
261
+ }
262
+
119
263
  /** Check if a filter state has an active (non-empty) value. */
120
264
  export function filterHasActiveState(state) {
121
- if (!state) return false;
265
+ if (!state) {
266
+ return false;
267
+ }
122
268
  switch (state.type) {
123
269
  case "SELECT":
124
270
  return state.selectedValues.length > 0;
@@ -1 +1 @@
1
- {"version":3,"file":"filterValues.js","names":["supportsSearch","state","type","supportsExcluding","isEmptyValue","value","dedupeEmptyAggregationRows","values","out","emptyCount","firstEmptyIndex","v","length","count","push","splice","isNull","filterValuesBySearch","searchValue","getValue","trimmed","trim","lowerSearch","toLowerCase","filter","includes","filterHasActiveState","selectedValues","undefined","minValue","maxValue","includeNull","enabled","hasLink","linkedFilterState","searchTerm","startDate","endDate"],"sources":["filterValues.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 { FilterState } from \"../FilterListItemApi.js\";\nimport type { PropertyAggregationValue } from \"../types/AggregationTypes.js\";\n\n/** Returns true for filter state types that support in-filter search. */\nexport function supportsSearch(state: FilterState | undefined): boolean {\n if (!state) {\n return false;\n }\n switch (state.type) {\n case \"SELECT\":\n case \"EXACT_MATCH\":\n return true;\n case \"CONTAINS_TEXT\":\n case \"NUMBER_RANGE\":\n case \"DATE_RANGE\":\n case \"TOGGLE\":\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"TIMELINE\":\n case \"custom\":\n return false;\n default: {\n const _exhaustive: never = state;\n return false;\n }\n }\n}\n\n/** Returns true for filter state types that support isExcluding. */\nexport function supportsExcluding(state: FilterState | undefined): boolean {\n if (!state) {\n return false;\n }\n switch (state.type) {\n case \"SELECT\":\n case \"EXACT_MATCH\":\n case \"CONTAINS_TEXT\":\n case \"TIMELINE\":\n return true;\n case \"NUMBER_RANGE\":\n case \"DATE_RANGE\":\n case \"TOGGLE\":\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"custom\":\n return false;\n default: {\n const _exhaustive: never = state;\n return false;\n }\n }\n}\n\n/**\n * Returns true if the given value should render as a \"No value\" placeholder\n * in dropdown options, listogram buckets, and tag chips.\n *\n * Whitespace-only strings (e.g. \" \", \"\\t\") are real values and remain\n * distinct from \"No value\".\n */\nexport function isEmptyValue(value: string | null | undefined): boolean {\n return value == null || value === \"\";\n}\n\n/**\n * Merges every null/undefined/empty-string aggregation row into a single\n * \"No value\" bucket placed at the position of the first empty row encountered.\n * Backends sometimes return separate rows for null, undefined, and \"\"; this\n * collapses them so consumers (listogram, dropdown, multi-select) all see one\n * canonical row.\n */\nexport function dedupeEmptyAggregationRows(\n values: PropertyAggregationValue[],\n): PropertyAggregationValue[] {\n const out: PropertyAggregationValue[] = [];\n let emptyCount = 0;\n let firstEmptyIndex = -1;\n for (const v of values) {\n if (isEmptyValue(v.value)) {\n if (firstEmptyIndex === -1) {\n firstEmptyIndex = out.length;\n }\n emptyCount += v.count;\n } else {\n out.push(v);\n }\n }\n if (firstEmptyIndex >= 0 && emptyCount > 0) {\n out.splice(firstEmptyIndex, 0, {\n value: \"\",\n count: emptyCount,\n isNull: true,\n });\n }\n return out;\n}\n\n/** Case-insensitive substring filter for search functionality. */\nexport function filterValuesBySearch<T>(\n values: T[],\n searchValue: string,\n getValue: (item: T) => string,\n): T[] {\n const trimmed = searchValue.trim();\n if (!trimmed) return values;\n const lowerSearch = trimmed.toLowerCase();\n return values.filter((v) => getValue(v).toLowerCase().includes(lowerSearch));\n}\n\n/** Check if a filter state has an active (non-empty) value. */\nexport function filterHasActiveState(state: FilterState | undefined): boolean {\n if (!state) return false;\n\n switch (state.type) {\n case \"SELECT\":\n return state.selectedValues.length > 0;\n case \"EXACT_MATCH\":\n return state.values.length > 0;\n case \"CONTAINS_TEXT\":\n return state.value !== undefined && state.value !== \"\";\n case \"NUMBER_RANGE\":\n return state.minValue !== undefined || state.maxValue !== undefined\n || state.includeNull === true;\n case \"DATE_RANGE\":\n return state.minValue !== undefined || state.maxValue !== undefined\n || state.includeNull === true;\n case \"TOGGLE\":\n return state.enabled;\n case \"hasLink\":\n return state.hasLink;\n case \"linkedProperty\":\n return filterHasActiveState(state.linkedFilterState);\n case \"keywordSearch\":\n return state.searchTerm !== undefined && state.searchTerm !== \"\";\n case \"TIMELINE\":\n return state.startDate !== undefined || state.endDate !== undefined;\n case \"custom\":\n return true;\n default: {\n const _exhaustive: never = state;\n return false;\n }\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA,OAAO,SAASA,cAAcA,CAACC,KAA8B,EAAW;EACtE,IAAI,CAACA,KAAK,EAAE;IACV,OAAO,KAAK;EACd;EACA,QAAQA,KAAK,CAACC,IAAI;IAChB,KAAK,QAAQ;IACb,KAAK,aAAa;MAChB,OAAO,IAAI;IACb,KAAK,eAAe;IACpB,KAAK,cAAc;IACnB,KAAK,YAAY;IACjB,KAAK,QAAQ;IACb,KAAK,SAAS;IACd,KAAK,gBAAgB;IACrB,KAAK,eAAe;IACpB,KAAK,UAAU;IACf,KAAK,QAAQ;MACX,OAAO,KAAK;IACd;MAAS;QAEP,OAAO,KAAK;MACd;EACF;AACF;;AAEA;AACA,OAAO,SAASC,iBAAiBA,CAACF,KAA8B,EAAW;EACzE,IAAI,CAACA,KAAK,EAAE;IACV,OAAO,KAAK;EACd;EACA,QAAQA,KAAK,CAACC,IAAI;IAChB,KAAK,QAAQ;IACb,KAAK,aAAa;IAClB,KAAK,eAAe;IACpB,KAAK,UAAU;MACb,OAAO,IAAI;IACb,KAAK,cAAc;IACnB,KAAK,YAAY;IACjB,KAAK,QAAQ;IACb,KAAK,SAAS;IACd,KAAK,gBAAgB;IACrB,KAAK,eAAe;IACpB,KAAK,QAAQ;MACX,OAAO,KAAK;IACd;MAAS;QAEP,OAAO,KAAK;MACd;EACF;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,YAAYA,CAACC,KAAgC,EAAW;EACtE,OAAOA,KAAK,IAAI,IAAI,IAAIA,KAAK,KAAK,EAAE;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,0BAA0BA,CACxCC,MAAkC,EACN;EAC5B,MAAMC,GAA+B,GAAG,EAAE;EAC1C,IAAIC,UAAU,GAAG,CAAC;EAClB,IAAIC,eAAe,GAAG,CAAC,CAAC;EACxB,KAAK,MAAMC,CAAC,IAAIJ,MAAM,EAAE;IACtB,IAAIH,YAAY,CAACO,CAAC,CAACN,KAAK,CAAC,EAAE;MACzB,IAAIK,eAAe,KAAK,CAAC,CAAC,EAAE;QAC1BA,eAAe,GAAGF,GAAG,CAACI,MAAM;MAC9B;MACAH,UAAU,IAAIE,CAAC,CAACE,KAAK;IACvB,CAAC,MAAM;MACLL,GAAG,CAACM,IAAI,CAACH,CAAC,CAAC;IACb;EACF;EACA,IAAID,eAAe,IAAI,CAAC,IAAID,UAAU,GAAG,CAAC,EAAE;IAC1CD,GAAG,CAACO,MAAM,CAACL,eAAe,EAAE,CAAC,EAAE;MAC7BL,KAAK,EAAE,EAAE;MACTQ,KAAK,EAAEJ,UAAU;MACjBO,MAAM,EAAE;IACV,CAAC,CAAC;EACJ;EACA,OAAOR,GAAG;AACZ;;AAEA;AACA,OAAO,SAASS,oBAAoBA,CAClCV,MAAW,EACXW,WAAmB,EACnBC,QAA6B,EACxB;EACL,MAAMC,OAAO,GAAGF,WAAW,CAACG,IAAI,CAAC,CAAC;EAClC,IAAI,CAACD,OAAO,EAAE,OAAOb,MAAM;EAC3B,MAAMe,WAAW,GAAGF,OAAO,CAACG,WAAW,CAAC,CAAC;EACzC,OAAOhB,MAAM,CAACiB,MAAM,CAAEb,CAAC,IAAKQ,QAAQ,CAACR,CAAC,CAAC,CAACY,WAAW,CAAC,CAAC,CAACE,QAAQ,CAACH,WAAW,CAAC,CAAC;AAC9E;;AAEA;AACA,OAAO,SAASI,oBAAoBA,CAACzB,KAA8B,EAAW;EAC5E,IAAI,CAACA,KAAK,EAAE,OAAO,KAAK;EAExB,QAAQA,KAAK,CAACC,IAAI;IAChB,KAAK,QAAQ;MACX,OAAOD,KAAK,CAAC0B,cAAc,CAACf,MAAM,GAAG,CAAC;IACxC,KAAK,aAAa;MAChB,OAAOX,KAAK,CAACM,MAAM,CAACK,MAAM,GAAG,CAAC;IAChC,KAAK,eAAe;MAClB,OAAOX,KAAK,CAACI,KAAK,KAAKuB,SAAS,IAAI3B,KAAK,CAACI,KAAK,KAAK,EAAE;IACxD,KAAK,cAAc;MACjB,OAAOJ,KAAK,CAAC4B,QAAQ,KAAKD,SAAS,IAAI3B,KAAK,CAAC6B,QAAQ,KAAKF,SAAS,IAC9D3B,KAAK,CAAC8B,WAAW,KAAK,IAAI;IACjC,KAAK,YAAY;MACf,OAAO9B,KAAK,CAAC4B,QAAQ,KAAKD,SAAS,IAAI3B,KAAK,CAAC6B,QAAQ,KAAKF,SAAS,IAC9D3B,KAAK,CAAC8B,WAAW,KAAK,IAAI;IACjC,KAAK,QAAQ;MACX,OAAO9B,KAAK,CAAC+B,OAAO;IACtB,KAAK,SAAS;MACZ,OAAO/B,KAAK,CAACgC,OAAO;IACtB,KAAK,gBAAgB;MACnB,OAAOP,oBAAoB,CAACzB,KAAK,CAACiC,iBAAiB,CAAC;IACtD,KAAK,eAAe;MAClB,OAAOjC,KAAK,CAACkC,UAAU,KAAKP,SAAS,IAAI3B,KAAK,CAACkC,UAAU,KAAK,EAAE;IAClE,KAAK,UAAU;MACb,OAAOlC,KAAK,CAACmC,SAAS,KAAKR,SAAS,IAAI3B,KAAK,CAACoC,OAAO,KAAKT,SAAS;IACrE,KAAK,QAAQ;MACX,OAAO,IAAI;IACb;MAAS;QAEP,OAAO,KAAK;MACd;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"filterValues.js","names":["getEffectiveFilterState","state","type","linkedFilterState","supportsSearch","supportsExcluding","isEmptyValue","value","dedupeEmptyAggregationRows","values","out","emptyCount","firstEmptyIndex","v","length","count","push","splice","isNull","filterValuesBySearch","searchValue","getValue","trimmed","trim","lowerSearch","toLowerCase","filter","includes","clearFilterState","undefined","selectedValues","isExcluding","minValue","maxValue","includeNull","startDate","endDate","enabled","hasLink","searchTerm","operator","innerCleared","toggleIsExcluding","inner","getSelectedCount","filterHasActiveState"],"sources":["filterValues.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 { FilterState } from \"../FilterListItemApi.js\";\nimport type { PropertyAggregationValue } from \"../types/AggregationTypes.js\";\n\n/**\n * Unwraps a `linkedProperty` wrapper one level so callers can reason about the\n * underlying filter state directly (e.g. for header controls that should\n * follow the inner filter's capabilities).\n */\nexport function getEffectiveFilterState(\n state: FilterState | undefined,\n): FilterState | undefined {\n if (state?.type === \"linkedProperty\") {\n return state.linkedFilterState;\n }\n return state;\n}\n\n/** Returns true for filter state types that support in-filter search. */\nexport function supportsSearch(state: FilterState | undefined): boolean {\n if (!state) {\n return false;\n }\n switch (state.type) {\n case \"SELECT\":\n case \"EXACT_MATCH\":\n return true;\n case \"CONTAINS_TEXT\":\n case \"NUMBER_RANGE\":\n case \"DATE_RANGE\":\n case \"TOGGLE\":\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"TIMELINE\":\n case \"custom\":\n return false;\n default: {\n const _exhaustive: never = state;\n return false;\n }\n }\n}\n\n/** Returns true for filter state types that support isExcluding. */\nexport function supportsExcluding(state: FilterState | undefined): boolean {\n if (!state) {\n return false;\n }\n switch (state.type) {\n case \"SELECT\":\n case \"EXACT_MATCH\":\n case \"CONTAINS_TEXT\":\n case \"TIMELINE\":\n return true;\n case \"NUMBER_RANGE\":\n case \"DATE_RANGE\":\n case \"TOGGLE\":\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"custom\":\n return false;\n default: {\n const _exhaustive: never = state;\n return false;\n }\n }\n}\n\n/**\n * Returns true if the given value should render as a \"No value\" placeholder\n * in dropdown options, listogram buckets, and tag chips.\n *\n * Whitespace-only strings (e.g. \" \", \"\\t\") are real values and remain\n * distinct from \"No value\".\n */\nexport function isEmptyValue(value: string | null | undefined): boolean {\n return value == null || value === \"\";\n}\n\n/**\n * Merges every null/undefined/empty-string aggregation row into a single\n * \"No value\" bucket placed at the position of the first empty row encountered.\n * Backends sometimes return separate rows for null, undefined, and \"\"; this\n * collapses them so consumers (listogram, dropdown, multi-select) all see one\n * canonical row.\n */\nexport function dedupeEmptyAggregationRows(\n values: PropertyAggregationValue[],\n): PropertyAggregationValue[] {\n const out: PropertyAggregationValue[] = [];\n let emptyCount = 0;\n let firstEmptyIndex = -1;\n for (const v of values) {\n if (isEmptyValue(v.value)) {\n if (firstEmptyIndex === -1) {\n firstEmptyIndex = out.length;\n }\n emptyCount += v.count;\n } else {\n out.push(v);\n }\n }\n if (firstEmptyIndex >= 0 && emptyCount > 0) {\n out.splice(firstEmptyIndex, 0, {\n value: \"\",\n count: emptyCount,\n isNull: true,\n });\n }\n return out;\n}\n\n/** Case-insensitive substring filter for search functionality. */\nexport function filterValuesBySearch<T>(\n values: T[],\n searchValue: string,\n getValue: (item: T) => string,\n): T[] {\n const trimmed = searchValue.trim();\n if (!trimmed) {\n return values;\n }\n const lowerSearch = trimmed.toLowerCase();\n return values.filter((v) => getValue(v).toLowerCase().includes(lowerSearch));\n}\n\n/**\n * Returns a \"cleared\" version of the given filter state, preserving the\n * discriminator and `isExcluding` flag so the UI doesn't snap between filter\n * modes when a user clicks \"Clear all selections\". Returns `undefined` if no\n * cleared form is meaningful for the state shape.\n */\nexport function clearFilterState(\n state: FilterState | undefined,\n): FilterState | undefined {\n if (!state) {\n return undefined;\n }\n switch (state.type) {\n case \"SELECT\":\n return {\n type: \"SELECT\",\n selectedValues: [],\n isExcluding: state.isExcluding,\n };\n case \"EXACT_MATCH\":\n return {\n type: \"EXACT_MATCH\",\n values: [],\n isExcluding: state.isExcluding,\n };\n case \"CONTAINS_TEXT\":\n return {\n type: \"CONTAINS_TEXT\",\n value: undefined,\n isExcluding: state.isExcluding,\n };\n case \"NUMBER_RANGE\":\n return {\n type: \"NUMBER_RANGE\",\n minValue: undefined,\n maxValue: undefined,\n includeNull: false,\n };\n case \"DATE_RANGE\":\n return {\n type: \"DATE_RANGE\",\n minValue: undefined,\n maxValue: undefined,\n includeNull: false,\n };\n case \"TIMELINE\":\n return {\n type: \"TIMELINE\",\n startDate: undefined,\n endDate: undefined,\n isExcluding: state.isExcluding,\n };\n case \"TOGGLE\":\n return { type: \"TOGGLE\", enabled: false };\n case \"hasLink\":\n return { type: \"hasLink\", hasLink: false };\n case \"keywordSearch\":\n return {\n type: \"keywordSearch\",\n searchTerm: \"\",\n operator: state.operator,\n };\n case \"linkedProperty\": {\n const innerCleared = clearFilterState(state.linkedFilterState);\n if (!innerCleared) {\n return undefined;\n }\n return { type: \"linkedProperty\", linkedFilterState: innerCleared };\n }\n case \"custom\":\n return undefined;\n default: {\n const _exhaustive: never = state;\n return undefined;\n }\n }\n}\n\n/**\n * Returns the state with `isExcluding` flipped, preserving the discriminator\n * and unwrapping/re-wrapping any `linkedProperty` wrapper. Returns `undefined`\n * if the wrapped state is one that does not support excluding.\n */\nexport function toggleIsExcluding(\n state: FilterState,\n): FilterState | undefined {\n if (state.type === \"linkedProperty\") {\n const inner = state.linkedFilterState;\n return {\n type: \"linkedProperty\",\n linkedFilterState: { ...inner, isExcluding: !inner.isExcluding },\n };\n }\n if (!supportsExcluding(state)) {\n return undefined;\n }\n return { ...state, isExcluding: !state.isExcluding };\n}\n\n/**\n * Returns the number of values the user has actively selected for filters\n * whose UI surfaces a selected-of-total count (LISTOGRAM, SINGLE_SELECT,\n * MULTI_SELECT, TEXT_TAGS). Returns 0 for state shapes that don't have a\n * discrete list of selected values.\n */\nexport function getSelectedCount(state: FilterState | undefined): number {\n if (!state) {\n return 0;\n }\n if (state.type === \"EXACT_MATCH\") {\n return state.values.length;\n }\n if (state.type === \"SELECT\") {\n return state.selectedValues.length;\n }\n return 0;\n}\n\n/** Check if a filter state has an active (non-empty) value. */\nexport function filterHasActiveState(state: FilterState | undefined): boolean {\n if (!state) {\n return false;\n }\n\n switch (state.type) {\n case \"SELECT\":\n return state.selectedValues.length > 0;\n case \"EXACT_MATCH\":\n return state.values.length > 0;\n case \"CONTAINS_TEXT\":\n return state.value !== undefined && state.value !== \"\";\n case \"NUMBER_RANGE\":\n return state.minValue !== undefined || state.maxValue !== undefined\n || state.includeNull === true;\n case \"DATE_RANGE\":\n return state.minValue !== undefined || state.maxValue !== undefined\n || state.includeNull === true;\n case \"TOGGLE\":\n return state.enabled;\n case \"hasLink\":\n return state.hasLink;\n case \"linkedProperty\":\n return filterHasActiveState(state.linkedFilterState);\n case \"keywordSearch\":\n return state.searchTerm !== undefined && state.searchTerm !== \"\";\n case \"TIMELINE\":\n return state.startDate !== undefined || state.endDate !== undefined;\n case \"custom\":\n return true;\n default: {\n const _exhaustive: never = state;\n return false;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,48 @@
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
+ export function narrowObjectSet(objectSet, whereClause, linkedFilters) {
18
+ let narrowed = Object.keys(whereClause).length === 0 ? objectSet : objectSet.where(whereClause);
19
+ for (const filter of linkedFilters) {
20
+ narrowed = narrowed.intersect(applyLinkedFilter(narrowed, filter));
21
+ }
22
+ return narrowed;
23
+ }
24
+ function applyLinkedFilter(base, filter) {
25
+ // reverseLinkName's pointing back to Q is a semantic invariant we can't encode
26
+ // in the type system, so the final result is cast to ObjectSet<Q>.
27
+ return base.pivotTo(filter.linkName).where(filter.innerWhere).pivotTo(filter.reverseLinkName);
28
+ }
29
+ export function computeDualScopes(objectSet, whereClause, linkedFilters, showFilteredOutValues) {
30
+ if (objectSet == null) {
31
+ return {
32
+ scoped: undefined,
33
+ emptySource: undefined
34
+ };
35
+ }
36
+ const scoped = narrowObjectSet(objectSet, whereClause, linkedFilters);
37
+ if (!showFilteredOutValues || linkedFilters.length === 0) {
38
+ return {
39
+ scoped,
40
+ emptySource: undefined
41
+ };
42
+ }
43
+ return {
44
+ scoped,
45
+ emptySource: narrowObjectSet(objectSet, whereClause, [])
46
+ };
47
+ }
48
+ //# sourceMappingURL=narrowObjectSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narrowObjectSet.js","names":["narrowObjectSet","objectSet","whereClause","linkedFilters","narrowed","Object","keys","length","where","filter","intersect","applyLinkedFilter","base","pivotTo","linkName","innerWhere","reverseLinkName","computeDualScopes","showFilteredOutValues","scoped","undefined","emptySource"],"sources":["narrowObjectSet.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, WhereClause } from \"@osdk/api\";\nimport type { LinkedFilter } from \"../types/LinkedFilterTypes.js\";\n\nexport function narrowObjectSet<Q extends ObjectTypeDefinition>(\n objectSet: ObjectSet<Q>,\n whereClause: WhereClause<Q>,\n linkedFilters: ReadonlyArray<LinkedFilter<Q>>,\n): ObjectSet<Q> {\n let narrowed = Object.keys(whereClause).length === 0\n ? objectSet\n : objectSet.where(whereClause);\n for (const filter of linkedFilters) {\n narrowed = narrowed.intersect(applyLinkedFilter(narrowed, filter));\n }\n return narrowed;\n}\n\nfunction applyLinkedFilter<Q extends ObjectTypeDefinition>(\n base: ObjectSet<Q>,\n filter: LinkedFilter<Q>,\n): ObjectSet<Q> {\n // reverseLinkName's pointing back to Q is a semantic invariant we can't encode\n // in the type system, so the final result is cast to ObjectSet<Q>.\n return base\n .pivotTo(filter.linkName)\n .where(filter.innerWhere)\n .pivotTo(filter.reverseLinkName) as ObjectSet<Q>;\n}\n\nexport function computeDualScopes<Q extends ObjectTypeDefinition>(\n objectSet: ObjectSet<Q> | undefined,\n whereClause: WhereClause<Q>,\n linkedFilters: ReadonlyArray<LinkedFilter<Q>>,\n showFilteredOutValues: boolean | undefined,\n): {\n scoped: ObjectSet<Q> | undefined;\n emptySource: ObjectSet<Q> | undefined;\n} {\n if (objectSet == null) {\n return { scoped: undefined, emptySource: undefined };\n }\n const scoped = narrowObjectSet(objectSet, whereClause, linkedFilters);\n if (!showFilteredOutValues || linkedFilters.length === 0) {\n return { scoped, emptySource: undefined };\n }\n return { scoped, emptySource: narrowObjectSet(objectSet, whereClause, []) };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA,OAAO,SAASA,eAAeA,CAC7BC,SAAuB,EACvBC,WAA2B,EAC3BC,aAA6C,EAC/B;EACd,IAAIC,QAAQ,GAAGC,MAAM,CAACC,IAAI,CAACJ,WAAW,CAAC,CAACK,MAAM,KAAK,CAAC,GAChDN,SAAS,GACTA,SAAS,CAACO,KAAK,CAACN,WAAW,CAAC;EAChC,KAAK,MAAMO,MAAM,IAAIN,aAAa,EAAE;IAClCC,QAAQ,GAAGA,QAAQ,CAACM,SAAS,CAACC,iBAAiB,CAACP,QAAQ,EAAEK,MAAM,CAAC,CAAC;EACpE;EACA,OAAOL,QAAQ;AACjB;AAEA,SAASO,iBAAiBA,CACxBC,IAAkB,EAClBH,MAAuB,EACT;EACd;EACA;EACA,OAAOG,IAAI,CACRC,OAAO,CAACJ,MAAM,CAACK,QAAQ,CAAC,CACxBN,KAAK,CAACC,MAAM,CAACM,UAAU,CAAC,CACxBF,OAAO,CAACJ,MAAM,CAACO,eAAe,CAAC;AACpC;AAEA,OAAO,SAASC,iBAAiBA,CAC/BhB,SAAmC,EACnCC,WAA2B,EAC3BC,aAA6C,EAC7Ce,qBAA0C,EAI1C;EACA,IAAIjB,SAAS,IAAI,IAAI,EAAE;IACrB,OAAO;MAAEkB,MAAM,EAAEC,SAAS;MAAEC,WAAW,EAAED;IAAU,CAAC;EACtD;EACA,MAAMD,MAAM,GAAGnB,eAAe,CAACC,SAAS,EAAEC,WAAW,EAAEC,aAAa,CAAC;EACrE,IAAI,CAACe,qBAAqB,IAAIf,aAAa,CAACI,MAAM,KAAK,CAAC,EAAE;IACxD,OAAO;MAAEY,MAAM;MAAEE,WAAW,EAAED;IAAU,CAAC;EAC3C;EACA,OAAO;IAAED,MAAM;IAAEE,WAAW,EAAErB,eAAe,CAACC,SAAS,EAAEC,WAAW,EAAE,EAAE;EAAE,CAAC;AAC7E","ignoreList":[]}
@@ -26,4 +26,5 @@ export { filterHasActiveState } from "../../filter-list/utils/filterValues.js";
26
26
  export { getFilterKey } from "../../filter-list/utils/getFilterKey.js";
27
27
  export { getFilterLabel } from "../../filter-list/utils/getFilterLabel.js";
28
28
  export { summarizeFilterValue } from "../../filter-list/utils/summarizeFilterValue.js";
29
+ export { narrowObjectSet } from "../../filter-list/utils/narrowObjectSet.js";
29
30
  //# sourceMappingURL=filter-list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter-list.js","names":["BaseFilterList","FilterList","_FilterList","withOsdkMetrics","deserializeFilterStates","serializeFilterStates","FilterPopover","FilterInput","useFilterListState","filterHasActiveState","getFilterKey","getFilterLabel","summarizeFilterValue"],"sources":["filter-list.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\nexport { BaseFilterList } from \"../../filter-list/base/BaseFilterList.js\";\nexport type {\n BaseFilterListProps,\n RenderFilterInput,\n} from \"../../filter-list/base/BaseFilterListApi.js\";\nimport { FilterList as _FilterList } from \"../../filter-list/FilterList.js\";\nimport { withOsdkMetrics } from \"../../util/withOsdkMetrics.js\";\nexport const FilterList: typeof _FilterList = withOsdkMetrics(\n _FilterList,\n \"FilterList\",\n);\n\nexport type {\n FilterDefinitionUnion,\n FilterListProps,\n} from \"../../filter-list/FilterListApi.js\";\nexport type {\n FilterComponentType,\n FilterListItemProps,\n FilterState,\n PropertyFilterDefinition,\n} from \"../../filter-list/FilterListItemApi.js\";\nexport {\n deserializeFilterStates,\n serializeFilterStates,\n} from \"../../filter-list/utils/filterStateSerialization.js\";\n\nexport { FilterPopover } from \"../../filter-list/base/FilterPopover.js\";\nexport type { FilterPopoverProps } from \"../../filter-list/base/FilterPopover.js\";\n\nexport { FilterInput } from \"../../filter-list/FilterInput.js\";\nexport type { FilterInputProps } from \"../../filter-list/FilterInput.js\";\n\nexport { useFilterListState } from \"../../filter-list/hooks/useFilterListState.js\";\nexport type { UseFilterListStateResult } from \"../../filter-list/hooks/useFilterListState.js\";\n\nexport { filterHasActiveState } from \"../../filter-list/utils/filterValues.js\";\nexport { getFilterKey } from \"../../filter-list/utils/getFilterKey.js\";\nexport { getFilterLabel } from \"../../filter-list/utils/getFilterLabel.js\";\nexport { summarizeFilterValue } from \"../../filter-list/utils/summarizeFilterValue.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,cAAc,QAAQ,0CAA0C;AAKzE,SAASC,UAAU,IAAIC,WAAW,QAAQ,iCAAiC;AAC3E,SAASC,eAAe,QAAQ,+BAA+B;AAC/D,OAAO,MAAMF,UAA8B,GAAGE,eAAe,CAC3DD,WAAW,EACX,YACF,CAAC;AAYD,SACEE,uBAAuB,EACvBC,qBAAqB,QAChB,qDAAqD;AAE5D,SAASC,aAAa,QAAQ,yCAAyC;AAGvE,SAASC,WAAW,QAAQ,kCAAkC;AAG9D,SAASC,kBAAkB,QAAQ,+CAA+C;AAGlF,SAASC,oBAAoB,QAAQ,yCAAyC;AAC9E,SAASC,YAAY,QAAQ,yCAAyC;AACtE,SAASC,cAAc,QAAQ,2CAA2C;AAC1E,SAASC,oBAAoB,QAAQ,iDAAiD","ignoreList":[]}
1
+ {"version":3,"file":"filter-list.js","names":["BaseFilterList","FilterList","_FilterList","withOsdkMetrics","deserializeFilterStates","serializeFilterStates","FilterPopover","FilterInput","useFilterListState","filterHasActiveState","getFilterKey","getFilterLabel","summarizeFilterValue","narrowObjectSet"],"sources":["filter-list.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\nexport { BaseFilterList } from \"../../filter-list/base/BaseFilterList.js\";\nexport type {\n BaseFilterListProps,\n RenderFilterInput,\n} from \"../../filter-list/base/BaseFilterListApi.js\";\nimport { FilterList as _FilterList } from \"../../filter-list/FilterList.js\";\nimport { withOsdkMetrics } from \"../../util/withOsdkMetrics.js\";\nexport const FilterList: typeof _FilterList = withOsdkMetrics(\n _FilterList,\n \"FilterList\",\n);\n\nexport type {\n FilterDefinitionUnion,\n FilterListProps,\n} from \"../../filter-list/FilterListApi.js\";\nexport type {\n FilterComponentType,\n FilterDefinitionControls,\n FilterListItemProps,\n FilterState,\n PropertyFilterDefinition,\n} from \"../../filter-list/FilterListItemApi.js\";\nexport {\n deserializeFilterStates,\n serializeFilterStates,\n} from \"../../filter-list/utils/filterStateSerialization.js\";\n\nexport { FilterPopover } from \"../../filter-list/base/FilterPopover.js\";\nexport type { FilterPopoverProps } from \"../../filter-list/base/FilterPopover.js\";\n\nexport { FilterInput } from \"../../filter-list/FilterInput.js\";\nexport type { FilterInputProps } from \"../../filter-list/FilterInput.js\";\n\nexport { useFilterListState } from \"../../filter-list/hooks/useFilterListState.js\";\nexport type { UseFilterListStateResult } from \"../../filter-list/hooks/useFilterListState.js\";\n\nexport { filterHasActiveState } from \"../../filter-list/utils/filterValues.js\";\nexport { getFilterKey } from \"../../filter-list/utils/getFilterKey.js\";\nexport { getFilterLabel } from \"../../filter-list/utils/getFilterLabel.js\";\nexport { summarizeFilterValue } from \"../../filter-list/utils/summarizeFilterValue.js\";\n\nexport type { LinkedFilter } from \"../../filter-list/types/LinkedFilterTypes.js\";\nexport { narrowObjectSet } from \"../../filter-list/utils/narrowObjectSet.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,cAAc,QAAQ,0CAA0C;AAKzE,SAASC,UAAU,IAAIC,WAAW,QAAQ,iCAAiC;AAC3E,SAASC,eAAe,QAAQ,+BAA+B;AAC/D,OAAO,MAAMF,UAA8B,GAAGE,eAAe,CAC3DD,WAAW,EACX,YACF,CAAC;AAaD,SACEE,uBAAuB,EACvBC,qBAAqB,QAChB,qDAAqD;AAE5D,SAASC,aAAa,QAAQ,yCAAyC;AAGvE,SAASC,WAAW,QAAQ,kCAAkC;AAG9D,SAASC,kBAAkB,QAAQ,+CAA+C;AAGlF,SAASC,oBAAoB,QAAQ,yCAAyC;AAC9E,SAASC,YAAY,QAAQ,yCAAyC;AACtE,SAASC,cAAc,QAAQ,2CAA2C;AAC1E,SAASC,oBAAoB,QAAQ,iDAAiD;AAGtF,SAASC,eAAe,QAAQ,4CAA4C","ignoreList":[]}
@@ -1147,6 +1147,11 @@
1147
1147
  --osdk-filter-list-empty-text-color: var(--osdk-typography-color-muted);
1148
1148
  --osdk-filter-list-empty-font-size: var(--osdk-typography-size-body-small);
1149
1149
 
1150
+ /* Filtered-out entries: values present in the wider scope but absent from
1151
+ the narrowed scope. Rendered as count=0 muted rows. */
1152
+ --osdk-filter-filtered-out-item-opacity: 0.5;
1153
+ --osdk-filter-filtered-out-item-color: var(--osdk-typography-color-muted);
1154
+
1150
1155
  /* Filter List Header */
1151
1156
  --osdk-filter-header-padding: calc(var(--osdk-surface-spacing) * 2)
1152
1157
  calc(var(--osdk-surface-spacing) * 3);
@@ -6442,6 +6447,12 @@
6442
6447
  gap: var(--osdk-filter-null-label-gap);
6443
6448
  }
6444
6449
 
6450
+ /* Muted styling for filtered-out (count=0) rows. */
6451
+ .ListogramInput-module__row___rps-rpjo[data-filtered-out] {
6452
+ opacity: var(--osdk-filter-filtered-out-item-opacity);
6453
+ color: var(--osdk-filter-filtered-out-item-color);
6454
+ }
6455
+
6445
6456
  .ListogramInput-module__label___hQ3nLEpx {
6446
6457
  flex: 1;
6447
6458
  font-family: var(--osdk-filter-listogram-label-font-family);
@@ -6660,6 +6671,12 @@
6660
6671
  flex-shrink: 0;
6661
6672
  }
6662
6673
 
6674
+ /* Muted styling for filtered-out (count=0) entries. */
6675
+ .MultiSelectInput-module__filteredOutItem___rJBjg1Q3 {
6676
+ opacity: var(--osdk-filter-filtered-out-item-opacity);
6677
+ color: var(--osdk-filter-filtered-out-item-color);
6678
+ }
6679
+
6663
6680
  .MultiSelectInput-module__inlineInput___x9buiDhb {
6664
6681
  font-family: var(--osdk-filter-input-font-family);
6665
6682
  font-size: var(--osdk-filter-input-font-size);
@@ -22,6 +22,11 @@
22
22
  --osdk-filter-list-empty-text-color: var(--osdk-typography-color-muted);
23
23
  --osdk-filter-list-empty-font-size: var(--osdk-typography-size-body-small);
24
24
 
25
+ /* Filtered-out entries: values present in the wider scope but absent from
26
+ the narrowed scope. Rendered as count=0 muted rows. */
27
+ --osdk-filter-filtered-out-item-opacity: 0.5;
28
+ --osdk-filter-filtered-out-item-color: var(--osdk-typography-color-muted);
29
+
25
30
  /* Filter List Header */
26
31
  --osdk-filter-header-padding: calc(var(--osdk-surface-spacing) * 2)
27
32
  calc(var(--osdk-surface-spacing) * 3);
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- const PACKAGE_USER_AGENT = `osdk-react-components/${"0.19.0"}`;
17
+ const PACKAGE_USER_AGENT = `osdk-react-components/${"0.19.1-beta.0"}`;
18
18
  export function componentUserAgent(componentName) {
19
19
  return `${PACKAGE_USER_AGENT}/${componentName}`;
20
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UserAgent.js","names":["PACKAGE_USER_AGENT","componentUserAgent","componentName"],"sources":["UserAgent.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\nconst PACKAGE_USER_AGENT =\n `osdk-react-components/${process.env.PACKAGE_VERSION}`;\n\nexport function componentUserAgent(componentName: string): string {\n return `${PACKAGE_USER_AGENT}/${componentName}`;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAMA,kBAAkB,GACtB,mCAAsD;AAExD,OAAO,SAASC,kBAAkBA,CAACC,aAAqB,EAAU;EAChE,OAAO,GAAGF,kBAAkB,IAAIE,aAAa,EAAE;AACjD","ignoreList":[]}
1
+ {"version":3,"file":"UserAgent.js","names":["PACKAGE_USER_AGENT","componentUserAgent","componentName"],"sources":["UserAgent.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\nconst PACKAGE_USER_AGENT =\n `osdk-react-components/${process.env.PACKAGE_VERSION}`;\n\nexport function componentUserAgent(componentName: string): string {\n return `${PACKAGE_USER_AGENT}/${componentName}`;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAMA,kBAAkB,GACtB,0CAAsD;AAExD,OAAO,SAASC,kBAAkBA,CAACC,aAAqB,EAAU;EAChE,OAAO,GAAGF,kBAAkB,IAAIE,aAAa,EAAE;AACjD","ignoreList":[]}