@osdk/react-components 0.2.0-beta.27 → 0.2.0-beta.29

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 (253) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +58 -3
  3. package/build/browser/action-form/FormFieldApi.js.map +1 -1
  4. package/build/browser/action-form/fields/FormFieldRenderer.js +8 -0
  5. package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
  6. package/build/browser/action-form/fields/NumberInputField.js +130 -0
  7. package/build/browser/action-form/fields/NumberInputField.js.map +1 -0
  8. package/build/browser/action-form/fields/NumberInputField.module.css +96 -0
  9. package/build/browser/action-form/fields/NumberInputField.module.css.js +9 -0
  10. package/build/browser/base-components/checkbox/Checkbox.js +6 -2
  11. package/build/browser/base-components/checkbox/Checkbox.js.map +1 -1
  12. package/build/browser/base-components/checkbox/Checkbox.module.css +15 -2
  13. package/build/browser/base-components/combobox/Combobox.js +14 -1
  14. package/build/browser/base-components/combobox/Combobox.js.map +1 -1
  15. package/build/browser/base-components/combobox/Combobox.module.css +16 -6
  16. package/build/browser/base-components/combobox/Combobox.module.css.js +1 -0
  17. package/build/browser/base-components/searchable-menu/SearchableMenu.js +86 -0
  18. package/build/browser/base-components/searchable-menu/SearchableMenu.js.map +1 -0
  19. package/build/browser/base-components/searchable-menu/SearchableMenu.module.css +80 -0
  20. package/build/browser/base-components/searchable-menu/SearchableMenu.module.css.js +10 -0
  21. package/build/browser/filter-list/FilterList.js +3 -1
  22. package/build/browser/filter-list/FilterList.js.map +1 -1
  23. package/build/browser/filter-list/FilterListApi.js.map +1 -1
  24. package/build/browser/filter-list/FilterListItemApi.js.map +1 -1
  25. package/build/browser/filter-list/base/AddFilterPopover.js +10 -21
  26. package/build/browser/filter-list/base/AddFilterPopover.js.map +1 -1
  27. package/build/browser/filter-list/base/AddFilterPopover.module.css +6 -40
  28. package/build/browser/filter-list/base/AddFilterPopover.module.css.js +1 -4
  29. package/build/browser/filter-list/base/BaseFilterList.js +4 -2
  30. package/build/browser/filter-list/base/BaseFilterList.js.map +1 -1
  31. package/build/browser/filter-list/base/ExcludeDropdown.js +4 -3
  32. package/build/browser/filter-list/base/ExcludeDropdown.js.map +1 -1
  33. package/build/browser/filter-list/base/ExcludeDropdown.module.css +7 -5
  34. package/build/browser/filter-list/base/FilterIcons.js +9 -3
  35. package/build/browser/filter-list/base/FilterIcons.js.map +1 -1
  36. package/build/browser/filter-list/base/FilterInputExcludeRow.js +14 -2
  37. package/build/browser/filter-list/base/FilterInputExcludeRow.js.map +1 -1
  38. package/build/browser/filter-list/base/FilterList.module.css +19 -6
  39. package/build/browser/filter-list/base/FilterList.module.css.js +1 -0
  40. package/build/browser/filter-list/base/FilterListContent.js +38 -17
  41. package/build/browser/filter-list/base/FilterListContent.js.map +1 -1
  42. package/build/browser/filter-list/base/FilterListHeader.js +1 -1
  43. package/build/browser/filter-list/base/FilterListHeader.js.map +1 -1
  44. package/build/browser/filter-list/base/FilterListHeader.module.css +8 -3
  45. package/build/browser/filter-list/base/FilterListItem.js +33 -1
  46. package/build/browser/filter-list/base/FilterListItem.js.map +1 -1
  47. package/build/browser/filter-list/base/FilterListItem.module.css +15 -6
  48. package/build/browser/filter-list/base/FilterListItem.module.css.js +1 -0
  49. package/build/browser/filter-list/base/SortableFilterListItem.js +3 -2
  50. package/build/browser/filter-list/base/SortableFilterListItem.js.map +1 -1
  51. package/build/browser/filter-list/base/inputs/ListogramInput.js +26 -11
  52. package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
  53. package/build/browser/filter-list/base/inputs/ListogramInput.module.css +31 -0
  54. package/build/browser/filter-list/base/inputs/ListogramInput.module.css.js +2 -0
  55. package/build/browser/filter-list/base/inputs/MultiSelectInput.js +26 -43
  56. package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
  57. package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css +7 -8
  58. package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css.js +1 -2
  59. package/build/browser/filter-list/base/inputs/NullValueWrapper.js +1 -1
  60. package/build/browser/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
  61. package/build/browser/filter-list/base/inputs/RangeInput.js +5 -3
  62. package/build/browser/filter-list/base/inputs/RangeInput.js.map +1 -1
  63. package/build/browser/filter-list/base/inputs/RangeInput.module.css +7 -7
  64. package/build/browser/filter-list/base/inputs/SingleSelectInput.js +21 -30
  65. package/build/browser/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
  66. package/build/browser/filter-list/base/inputs/SingleSelectInput.module.css +13 -23
  67. package/build/browser/filter-list/base/inputs/SingleSelectInput.module.css.js +3 -1
  68. package/build/browser/filter-list/base/inputs/index.js +0 -1
  69. package/build/browser/filter-list/base/inputs/index.js.map +1 -1
  70. package/build/browser/filter-list/hooks/useFilterListState.js +16 -12
  71. package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
  72. package/build/browser/filter-list/hooks/usePropertyAggregation.js +7 -2
  73. package/build/browser/filter-list/hooks/usePropertyAggregation.js.map +1 -1
  74. package/build/browser/filter-list/inputs/ContainsTextFilterInput.js +1 -1
  75. package/build/browser/filter-list/inputs/ContainsTextFilterInput.js.map +1 -1
  76. package/build/browser/filter-list/inputs/LinkedPropertyInput.js +0 -35
  77. package/build/browser/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
  78. package/build/browser/filter-list/inputs/ListogramFilterInput.js +14 -3
  79. package/build/browser/filter-list/inputs/ListogramFilterInput.js.map +1 -1
  80. package/build/browser/filter-list/inputs/MultiSelectFilterInput.js +9 -1
  81. package/build/browser/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
  82. package/build/browser/filter-list/inputs/PropertyFilterInput.js +1 -14
  83. package/build/browser/filter-list/inputs/PropertyFilterInput.js.map +1 -1
  84. package/build/browser/filter-list/inputs/SingleSelectFilterInput.js +9 -1
  85. package/build/browser/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
  86. package/build/browser/filter-list/inputs/TextTagsFilterInput.js +9 -1
  87. package/build/browser/filter-list/inputs/TextTagsFilterInput.js.map +1 -1
  88. package/build/browser/filter-list/utils/filterStateToWhereClause.js +2 -7
  89. package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  90. package/build/browser/object-table/ColumnConfigDialog.module.css +1 -2
  91. package/build/browser/object-table/MultiColumnSortDialog.js +22 -59
  92. package/build/browser/object-table/MultiColumnSortDialog.js.map +1 -1
  93. package/build/browser/object-table/MultiColumnSortDialog.module.css +0 -64
  94. package/build/browser/object-table/MultiColumnSortDialog.module.css.js +0 -5
  95. package/build/browser/styles.css +324 -272
  96. package/build/cjs/public/experimental.cjs +1673 -1605
  97. package/build/cjs/public/experimental.cjs.map +1 -1
  98. package/build/cjs/public/experimental.css +501 -462
  99. package/build/cjs/public/experimental.css.map +1 -1
  100. package/build/cjs/public/experimental.d.cts +31 -26
  101. package/build/esm/action-form/FormFieldApi.js.map +1 -1
  102. package/build/esm/action-form/fields/FormFieldRenderer.js +8 -0
  103. package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
  104. package/build/esm/action-form/fields/NumberInputField.js +130 -0
  105. package/build/esm/action-form/fields/NumberInputField.js.map +1 -0
  106. package/build/esm/action-form/fields/NumberInputField.module.css +96 -0
  107. package/build/esm/base-components/checkbox/Checkbox.js +6 -2
  108. package/build/esm/base-components/checkbox/Checkbox.js.map +1 -1
  109. package/build/esm/base-components/checkbox/Checkbox.module.css +15 -2
  110. package/build/esm/base-components/combobox/Combobox.js +14 -1
  111. package/build/esm/base-components/combobox/Combobox.js.map +1 -1
  112. package/build/esm/base-components/combobox/Combobox.module.css +16 -6
  113. package/build/esm/base-components/searchable-menu/SearchableMenu.js +86 -0
  114. package/build/esm/base-components/searchable-menu/SearchableMenu.js.map +1 -0
  115. package/build/esm/base-components/searchable-menu/SearchableMenu.module.css +80 -0
  116. package/build/esm/filter-list/FilterList.js +3 -1
  117. package/build/esm/filter-list/FilterList.js.map +1 -1
  118. package/build/esm/filter-list/FilterListApi.js.map +1 -1
  119. package/build/esm/filter-list/FilterListItemApi.js.map +1 -1
  120. package/build/esm/filter-list/base/AddFilterPopover.js +10 -21
  121. package/build/esm/filter-list/base/AddFilterPopover.js.map +1 -1
  122. package/build/esm/filter-list/base/AddFilterPopover.module.css +6 -40
  123. package/build/esm/filter-list/base/BaseFilterList.js +4 -2
  124. package/build/esm/filter-list/base/BaseFilterList.js.map +1 -1
  125. package/build/esm/filter-list/base/ExcludeDropdown.js +4 -3
  126. package/build/esm/filter-list/base/ExcludeDropdown.js.map +1 -1
  127. package/build/esm/filter-list/base/ExcludeDropdown.module.css +7 -5
  128. package/build/esm/filter-list/base/FilterIcons.js +9 -3
  129. package/build/esm/filter-list/base/FilterIcons.js.map +1 -1
  130. package/build/esm/filter-list/base/FilterInputExcludeRow.js +14 -2
  131. package/build/esm/filter-list/base/FilterInputExcludeRow.js.map +1 -1
  132. package/build/esm/filter-list/base/FilterList.module.css +19 -6
  133. package/build/esm/filter-list/base/FilterListContent.js +38 -17
  134. package/build/esm/filter-list/base/FilterListContent.js.map +1 -1
  135. package/build/esm/filter-list/base/FilterListHeader.js +1 -1
  136. package/build/esm/filter-list/base/FilterListHeader.js.map +1 -1
  137. package/build/esm/filter-list/base/FilterListHeader.module.css +8 -3
  138. package/build/esm/filter-list/base/FilterListItem.js +33 -1
  139. package/build/esm/filter-list/base/FilterListItem.js.map +1 -1
  140. package/build/esm/filter-list/base/FilterListItem.module.css +15 -6
  141. package/build/esm/filter-list/base/SortableFilterListItem.js +3 -2
  142. package/build/esm/filter-list/base/SortableFilterListItem.js.map +1 -1
  143. package/build/esm/filter-list/base/inputs/ListogramInput.js +26 -11
  144. package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
  145. package/build/esm/filter-list/base/inputs/ListogramInput.module.css +31 -0
  146. package/build/esm/filter-list/base/inputs/MultiSelectInput.js +26 -43
  147. package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
  148. package/build/esm/filter-list/base/inputs/MultiSelectInput.module.css +7 -8
  149. package/build/esm/filter-list/base/inputs/NullValueWrapper.js +1 -1
  150. package/build/esm/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
  151. package/build/esm/filter-list/base/inputs/RangeInput.js +5 -3
  152. package/build/esm/filter-list/base/inputs/RangeInput.js.map +1 -1
  153. package/build/esm/filter-list/base/inputs/RangeInput.module.css +7 -7
  154. package/build/esm/filter-list/base/inputs/SingleSelectInput.js +21 -30
  155. package/build/esm/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
  156. package/build/esm/filter-list/base/inputs/SingleSelectInput.module.css +13 -23
  157. package/build/esm/filter-list/base/inputs/index.js +0 -1
  158. package/build/esm/filter-list/base/inputs/index.js.map +1 -1
  159. package/build/esm/filter-list/hooks/useFilterListState.js +16 -12
  160. package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
  161. package/build/esm/filter-list/hooks/usePropertyAggregation.js +7 -2
  162. package/build/esm/filter-list/hooks/usePropertyAggregation.js.map +1 -1
  163. package/build/esm/filter-list/inputs/ContainsTextFilterInput.js +1 -1
  164. package/build/esm/filter-list/inputs/ContainsTextFilterInput.js.map +1 -1
  165. package/build/esm/filter-list/inputs/LinkedPropertyInput.js +0 -35
  166. package/build/esm/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
  167. package/build/esm/filter-list/inputs/ListogramFilterInput.js +14 -3
  168. package/build/esm/filter-list/inputs/ListogramFilterInput.js.map +1 -1
  169. package/build/esm/filter-list/inputs/MultiSelectFilterInput.js +9 -1
  170. package/build/esm/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
  171. package/build/esm/filter-list/inputs/PropertyFilterInput.js +1 -14
  172. package/build/esm/filter-list/inputs/PropertyFilterInput.js.map +1 -1
  173. package/build/esm/filter-list/inputs/SingleSelectFilterInput.js +9 -1
  174. package/build/esm/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
  175. package/build/esm/filter-list/inputs/TextTagsFilterInput.js +9 -1
  176. package/build/esm/filter-list/inputs/TextTagsFilterInput.js.map +1 -1
  177. package/build/esm/filter-list/utils/filterStateToWhereClause.js +2 -7
  178. package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  179. package/build/esm/object-table/ColumnConfigDialog.module.css +1 -2
  180. package/build/esm/object-table/MultiColumnSortDialog.js +22 -59
  181. package/build/esm/object-table/MultiColumnSortDialog.js.map +1 -1
  182. package/build/esm/object-table/MultiColumnSortDialog.module.css +0 -64
  183. package/build/types/action-form/FormFieldApi.d.ts +22 -4
  184. package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
  185. package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -1
  186. package/build/types/action-form/fields/NumberInputField.d.ts +3 -0
  187. package/build/types/action-form/fields/NumberInputField.d.ts.map +1 -0
  188. package/build/types/base-components/checkbox/Checkbox.d.ts +2 -1
  189. package/build/types/base-components/checkbox/Checkbox.d.ts.map +1 -1
  190. package/build/types/base-components/combobox/Combobox.d.ts +6 -1
  191. package/build/types/base-components/combobox/Combobox.d.ts.map +1 -1
  192. package/build/types/base-components/searchable-menu/SearchableMenu.d.ts +18 -0
  193. package/build/types/base-components/searchable-menu/SearchableMenu.d.ts.map +1 -0
  194. package/build/types/filter-list/FilterListApi.d.ts +0 -7
  195. package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
  196. package/build/types/filter-list/FilterListItemApi.d.ts +10 -7
  197. package/build/types/filter-list/FilterListItemApi.d.ts.map +1 -1
  198. package/build/types/filter-list/base/AddFilterPopover.d.ts.map +1 -1
  199. package/build/types/filter-list/base/ExcludeDropdown.d.ts.map +1 -1
  200. package/build/types/filter-list/base/FilterIcons.d.ts +1 -0
  201. package/build/types/filter-list/base/FilterIcons.d.ts.map +1 -1
  202. package/build/types/filter-list/base/FilterInputExcludeRow.d.ts +2 -1
  203. package/build/types/filter-list/base/FilterInputExcludeRow.d.ts.map +1 -1
  204. package/build/types/filter-list/base/FilterListContent.d.ts.map +1 -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 +2 -1
  209. package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -1
  210. package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts +1 -3
  211. package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts.map +1 -1
  212. package/build/types/filter-list/base/inputs/RangeInput.d.ts.map +1 -1
  213. package/build/types/filter-list/base/inputs/SingleSelectInput.d.ts.map +1 -1
  214. package/build/types/filter-list/base/inputs/index.d.ts +0 -1
  215. package/build/types/filter-list/base/inputs/index.d.ts.map +1 -1
  216. package/build/types/filter-list/hooks/useFilterListState.d.ts +1 -0
  217. package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
  218. package/build/types/filter-list/hooks/usePropertyAggregation.d.ts +1 -0
  219. package/build/types/filter-list/hooks/usePropertyAggregation.d.ts.map +1 -1
  220. package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts.map +1 -1
  221. package/build/types/filter-list/inputs/ListogramFilterInput.d.ts.map +1 -1
  222. package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts.map +1 -1
  223. package/build/types/filter-list/inputs/PropertyFilterInput.d.ts.map +1 -1
  224. package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts.map +1 -1
  225. package/build/types/filter-list/inputs/TextTagsFilterInput.d.ts.map +1 -1
  226. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts +1 -1
  227. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts.map +1 -1
  228. package/build/types/object-table/MultiColumnSortDialog.d.ts.map +1 -1
  229. package/package.json +5 -5
  230. package/build/browser/filter-list/base/inputs/CheckboxListInput.js +0 -83
  231. package/build/browser/filter-list/base/inputs/CheckboxListInput.js.map +0 -1
  232. package/build/browser/filter-list/base/inputs/CheckboxListInput.module.css +0 -65
  233. package/build/browser/filter-list/base/inputs/CheckboxListInput.module.css.js +0 -10
  234. package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.js +0 -46
  235. package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.js.map +0 -1
  236. package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.module.css +0 -32
  237. package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.module.css.js +0 -8
  238. package/build/browser/filter-list/inputs/CheckboxListFilterInput.js +0 -66
  239. package/build/browser/filter-list/inputs/CheckboxListFilterInput.js.map +0 -1
  240. package/build/esm/filter-list/base/inputs/CheckboxListInput.js +0 -83
  241. package/build/esm/filter-list/base/inputs/CheckboxListInput.js.map +0 -1
  242. package/build/esm/filter-list/base/inputs/CheckboxListInput.module.css +0 -65
  243. package/build/esm/filter-list/base/inputs/CheckboxListSkeleton.js +0 -46
  244. package/build/esm/filter-list/base/inputs/CheckboxListSkeleton.js.map +0 -1
  245. package/build/esm/filter-list/base/inputs/CheckboxListSkeleton.module.css +0 -32
  246. package/build/esm/filter-list/inputs/CheckboxListFilterInput.js +0 -66
  247. package/build/esm/filter-list/inputs/CheckboxListFilterInput.js.map +0 -1
  248. package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts +0 -16
  249. package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts.map +0 -1
  250. package/build/types/filter-list/base/inputs/CheckboxListSkeleton.d.ts +0 -2
  251. package/build/types/filter-list/base/inputs/CheckboxListSkeleton.d.ts.map +0 -1
  252. package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts +0 -17
  253. package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts.map +0 -1
@@ -24,6 +24,37 @@ import { supportsExcluding, supportsSearch } from "../utils/filterValues.js";
24
24
  import { DragHandleIcon } from "./DragHandleIcon.js";
25
25
  import { OverflowMenuIcon, RemoveIcon, SearchIcon } from "./FilterIcons.js";
26
26
  import styles from "./FilterListItem.module.css";
27
+ function hasActiveSelection(filterState) {
28
+ if (filterState == null) {
29
+ return false;
30
+ }
31
+ switch (filterState.type) {
32
+ case "EXACT_MATCH":
33
+ return filterState.values.length > 0;
34
+ case "SELECT":
35
+ return filterState.selectedValues.length > 0;
36
+ case "CONTAINS_TEXT":
37
+ return filterState.value != null && filterState.value.length > 0;
38
+ case "NUMBER_RANGE":
39
+ return filterState.minValue != null || filterState.maxValue != null;
40
+ case "DATE_RANGE":
41
+ return filterState.minValue != null || filterState.maxValue != null;
42
+ case "TIMELINE":
43
+ return filterState.startDate != null || filterState.endDate != null;
44
+ case "TOGGLE":
45
+ return filterState.enabled;
46
+ case "keywordSearch":
47
+ return filterState.searchTerm.length > 0;
48
+ case "hasLink":
49
+ return filterState.hasLink;
50
+ case "linkedProperty":
51
+ return hasActiveSelection(filterState.linkedFilterState);
52
+ case "custom":
53
+ return true;
54
+ default:
55
+ return false;
56
+ }
57
+ }
27
58
  function FilterListItemInner({
28
59
  definition,
29
60
  filterKey,
@@ -82,7 +113,8 @@ function FilterListItemInner({
82
113
  const searchQueryForInput = searchState.type === "open" ? searchState.query : undefined;
83
114
  return /*#__PURE__*/React.createElement("div", {
84
115
  className: classnames(styles.filterItem, className),
85
- style: style
116
+ style: style,
117
+ "data-has-selection": hasActiveSelection(filterState) || undefined
86
118
  }, /*#__PURE__*/React.createElement("div", {
87
119
  className: styles.itemHeader
88
120
  }, dragHandleAttributes && /*#__PURE__*/React.createElement(Button, _extends({
@@ -1 +1 @@
1
- {"version":3,"file":"FilterListItem.js","names":["Button","Input","classnames","React","memo","useCallback","useState","ErrorBoundary","supportsExcluding","supportsSearch","DragHandleIcon","OverflowMenuIcon","RemoveIcon","SearchIcon","styles","FilterListItemInner","definition","filterKey","label","filterState","onFilterStateChanged","onFilterRemoved","renderInput","dragHandleAttributes","dragHandleListeners","className","style","searchState","setSearchState","type","excludeRowOpen","setExcludeRowOpen","handleFilterStateChanged","newState","handleToggleSearch","prev","query","handleSearchChange","e","target","value","handleSearchClear","handleRemove","handleToggleExcludeRow","searchInputRef","element","focus","preventScroll","showExcludeDropdown","showSearch","searchOpen","searchQuery","searchQueryForInput","undefined","createElement","filterItem","itemHeader","_extends","dragHandle","itemLabel","headerActionButton","onClick","searchRow","searchInput","onChange","placeholder","ref","searchClearButton","itemContent","errorMessage","FilterListItem"],"sources":["FilterListItem.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 { Input } from \"@base-ui/react/input\";\nimport type {\n DraggableAttributes,\n DraggableSyntheticListeners,\n} from \"@dnd-kit/core\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useState } from \"react\";\nimport { ErrorBoundary } from \"../../shared/ErrorBoundary.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { supportsExcluding, supportsSearch } from \"../utils/filterValues.js\";\nimport type { RenderFilterInput } from \"./BaseFilterListApi.js\";\nimport { DragHandleIcon } from \"./DragHandleIcon.js\";\nimport { OverflowMenuIcon, RemoveIcon, SearchIcon } from \"./FilterIcons.js\";\nimport styles from \"./FilterListItem.module.css\";\n\ninterface FilterListItemProps<D> {\n definition: D;\n filterKey: string;\n label: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (\n filterKey: string,\n state: FilterState,\n ) => void;\n onFilterRemoved?: (filterKey: string) => void;\n renderInput: RenderFilterInput<D>;\n dragHandleAttributes?: DraggableAttributes;\n dragHandleListeners?: DraggableSyntheticListeners;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction FilterListItemInner<D>({\n definition,\n filterKey,\n label,\n filterState,\n onFilterStateChanged,\n onFilterRemoved,\n renderInput,\n dragHandleAttributes,\n dragHandleListeners,\n className,\n style,\n}: FilterListItemProps<D>): React.ReactElement {\n const [searchState, setSearchState] = useState<\n { type: \"closed\" } | { type: \"open\"; query: string }\n >({ type: \"closed\" });\n const [excludeRowOpen, setExcludeRowOpen] = useState(false);\n\n const handleFilterStateChanged = useCallback(\n (newState: FilterState) => {\n onFilterStateChanged(filterKey, newState);\n },\n [filterKey, onFilterStateChanged],\n );\n\n const handleToggleSearch = useCallback(() => {\n setSearchState((prev) =>\n prev.type === \"closed\" ? { type: \"open\", query: \"\" } : { type: \"closed\" }\n );\n }, []);\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchState({ type: \"open\", query: e.target.value });\n },\n [],\n );\n\n const handleSearchClear = useCallback(() => {\n setSearchState({ type: \"open\", query: \"\" });\n }, []);\n\n const handleRemove = useCallback(() => {\n onFilterRemoved?.(filterKey);\n }, [filterKey, onFilterRemoved]);\n\n const handleToggleExcludeRow = useCallback(() => {\n setExcludeRowOpen((prev) => !prev);\n }, []);\n\n const searchInputRef = useCallback((element: HTMLInputElement | null) => {\n element?.focus({ preventScroll: true });\n }, []);\n\n const showExcludeDropdown = supportsExcluding(filterState);\n const showSearch = supportsSearch(filterState);\n const hasOverflowActions = showExcludeDropdown;\n\n const searchOpen = searchState.type === \"open\";\n const searchQuery = searchState.type === \"open\" ? searchState.query : \"\";\n const searchQueryForInput = searchState.type === \"open\"\n ? searchState.query\n : undefined;\n\n return (\n <div\n className={classnames(styles.filterItem, className)}\n style={style}\n >\n <div className={styles.itemHeader}>\n {dragHandleAttributes && (\n <Button\n className={styles.dragHandle}\n aria-label={`Reorder ${label}`}\n {...dragHandleAttributes}\n {...dragHandleListeners}\n >\n <DragHandleIcon />\n </Button>\n )}\n <span className={styles.itemLabel}>{label}</span>\n {showSearch && (\n <Button\n className={styles.headerActionButton}\n onClick={handleToggleSearch}\n aria-label=\"Search values\"\n aria-pressed={searchOpen}\n >\n <SearchIcon />\n </Button>\n )}\n {onFilterRemoved && (\n <Button\n className={styles.headerActionButton}\n onClick={handleRemove}\n aria-label={`Remove ${label} filter`}\n >\n <RemoveIcon />\n </Button>\n )}\n {hasOverflowActions && (\n <Button\n className={styles.headerActionButton}\n onClick={handleToggleExcludeRow}\n aria-label=\"More actions\"\n aria-pressed={excludeRowOpen}\n >\n <OverflowMenuIcon />\n </Button>\n )}\n </div>\n\n {searchOpen && (\n <div className={styles.searchRow}>\n <Input\n type=\"text\"\n className={styles.searchInput}\n value={searchQuery}\n onChange={handleSearchChange}\n placeholder=\"Search property values...\"\n aria-label=\"Search property values\"\n ref={searchInputRef}\n />\n {searchQuery && (\n <Button\n type=\"button\"\n className={styles.searchClearButton}\n onClick={handleSearchClear}\n aria-label=\"Clear search\"\n >\n <RemoveIcon />\n </Button>\n )}\n </div>\n )}\n\n <div className={styles.itemContent}>\n <ErrorBoundary errorMessage=\"Error loading filter\">\n {renderInput({\n definition,\n filterKey,\n filterState,\n onFilterStateChanged: handleFilterStateChanged,\n searchQuery: searchQueryForInput,\n excludeRowOpen,\n })}\n </ErrorBoundary>\n </div>\n </div>\n );\n}\n\nexport const FilterListItem = memo(\n FilterListItemInner,\n) as typeof FilterListItemInner;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FilterListItem.js","names":["Button","Input","classnames","React","memo","useCallback","useState","ErrorBoundary","supportsExcluding","supportsSearch","DragHandleIcon","OverflowMenuIcon","RemoveIcon","SearchIcon","styles","hasActiveSelection","filterState","type","values","length","selectedValues","value","minValue","maxValue","startDate","endDate","enabled","searchTerm","hasLink","linkedFilterState","FilterListItemInner","definition","filterKey","label","onFilterStateChanged","onFilterRemoved","renderInput","dragHandleAttributes","dragHandleListeners","className","style","searchState","setSearchState","excludeRowOpen","setExcludeRowOpen","handleFilterStateChanged","newState","handleToggleSearch","prev","query","handleSearchChange","e","target","handleSearchClear","handleRemove","handleToggleExcludeRow","searchInputRef","element","focus","preventScroll","showExcludeDropdown","showSearch","searchOpen","searchQuery","searchQueryForInput","undefined","createElement","filterItem","itemHeader","_extends","dragHandle","itemLabel","headerActionButton","onClick","searchRow","searchInput","onChange","placeholder","ref","searchClearButton","itemContent","errorMessage","FilterListItem"],"sources":["FilterListItem.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 { Input } from \"@base-ui/react/input\";\nimport type {\n DraggableAttributes,\n DraggableSyntheticListeners,\n} from \"@dnd-kit/core\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useState } from \"react\";\nimport { ErrorBoundary } from \"../../shared/ErrorBoundary.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { supportsExcluding, supportsSearch } from \"../utils/filterValues.js\";\nimport type { RenderFilterInput } from \"./BaseFilterListApi.js\";\nimport { DragHandleIcon } from \"./DragHandleIcon.js\";\nimport { OverflowMenuIcon, RemoveIcon, SearchIcon } from \"./FilterIcons.js\";\nimport styles from \"./FilterListItem.module.css\";\n\nfunction hasActiveSelection(filterState: FilterState | undefined): boolean {\n if (filterState == null) {\n return false;\n }\n switch (filterState.type) {\n case \"EXACT_MATCH\":\n return filterState.values.length > 0;\n case \"SELECT\":\n return filterState.selectedValues.length > 0;\n case \"CONTAINS_TEXT\":\n return filterState.value != null && filterState.value.length > 0;\n case \"NUMBER_RANGE\":\n return filterState.minValue != null || filterState.maxValue != null;\n case \"DATE_RANGE\":\n return filterState.minValue != null || filterState.maxValue != null;\n case \"TIMELINE\":\n return filterState.startDate != null || filterState.endDate != null;\n case \"TOGGLE\":\n return filterState.enabled;\n case \"keywordSearch\":\n return filterState.searchTerm.length > 0;\n case \"hasLink\":\n return filterState.hasLink;\n case \"linkedProperty\":\n return hasActiveSelection(filterState.linkedFilterState);\n case \"custom\":\n return true;\n default:\n return false;\n }\n}\n\ninterface FilterListItemProps<D> {\n definition: D;\n filterKey: string;\n label: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (\n filterKey: string,\n state: FilterState,\n ) => void;\n onFilterRemoved?: (filterKey: string) => void;\n renderInput: RenderFilterInput<D>;\n dragHandleAttributes?: DraggableAttributes;\n dragHandleListeners?: DraggableSyntheticListeners;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction FilterListItemInner<D>({\n definition,\n filterKey,\n label,\n filterState,\n onFilterStateChanged,\n onFilterRemoved,\n renderInput,\n dragHandleAttributes,\n dragHandleListeners,\n className,\n style,\n}: FilterListItemProps<D>): React.ReactElement {\n const [searchState, setSearchState] = useState<\n { type: \"closed\" } | { type: \"open\"; query: string }\n >({ type: \"closed\" });\n const [excludeRowOpen, setExcludeRowOpen] = useState(false);\n\n const handleFilterStateChanged = useCallback(\n (newState: FilterState) => {\n onFilterStateChanged(filterKey, newState);\n },\n [filterKey, onFilterStateChanged],\n );\n\n const handleToggleSearch = useCallback(() => {\n setSearchState((prev) =>\n prev.type === \"closed\" ? { type: \"open\", query: \"\" } : { type: \"closed\" }\n );\n }, []);\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchState({ type: \"open\", query: e.target.value });\n },\n [],\n );\n\n const handleSearchClear = useCallback(() => {\n setSearchState({ type: \"open\", query: \"\" });\n }, []);\n\n const handleRemove = useCallback(() => {\n onFilterRemoved?.(filterKey);\n }, [filterKey, onFilterRemoved]);\n\n const handleToggleExcludeRow = useCallback(() => {\n setExcludeRowOpen((prev) => !prev);\n }, []);\n\n const searchInputRef = useCallback((element: HTMLInputElement | null) => {\n element?.focus({ preventScroll: true });\n }, []);\n\n const showExcludeDropdown = supportsExcluding(filterState);\n const showSearch = supportsSearch(filterState);\n const hasOverflowActions = showExcludeDropdown;\n\n const searchOpen = searchState.type === \"open\";\n const searchQuery = searchState.type === \"open\" ? searchState.query : \"\";\n const searchQueryForInput = searchState.type === \"open\"\n ? searchState.query\n : undefined;\n\n return (\n <div\n className={classnames(styles.filterItem, className)}\n style={style}\n data-has-selection={hasActiveSelection(filterState) || undefined}\n >\n <div className={styles.itemHeader}>\n {dragHandleAttributes && (\n <Button\n className={styles.dragHandle}\n aria-label={`Reorder ${label}`}\n {...dragHandleAttributes}\n {...dragHandleListeners}\n >\n <DragHandleIcon />\n </Button>\n )}\n <span\n className={styles.itemLabel}\n >\n {label}\n </span>\n {showSearch && (\n <Button\n className={styles.headerActionButton}\n onClick={handleToggleSearch}\n aria-label=\"Search values\"\n aria-pressed={searchOpen}\n >\n <SearchIcon />\n </Button>\n )}\n {onFilterRemoved && (\n <Button\n className={styles.headerActionButton}\n onClick={handleRemove}\n aria-label={`Remove ${label} filter`}\n >\n <RemoveIcon />\n </Button>\n )}\n {hasOverflowActions && (\n <Button\n className={styles.headerActionButton}\n onClick={handleToggleExcludeRow}\n aria-label=\"More actions\"\n aria-pressed={excludeRowOpen}\n >\n <OverflowMenuIcon />\n </Button>\n )}\n </div>\n\n {searchOpen && (\n <div className={styles.searchRow}>\n <Input\n type=\"text\"\n className={styles.searchInput}\n value={searchQuery}\n onChange={handleSearchChange}\n placeholder=\"Search property values...\"\n aria-label=\"Search property values\"\n ref={searchInputRef}\n />\n {searchQuery && (\n <Button\n type=\"button\"\n className={styles.searchClearButton}\n onClick={handleSearchClear}\n aria-label=\"Clear search\"\n >\n <RemoveIcon />\n </Button>\n )}\n </div>\n )}\n\n <div className={styles.itemContent}>\n <ErrorBoundary errorMessage=\"Error loading filter\">\n {renderInput({\n definition,\n filterKey,\n filterState,\n onFilterStateChanged: handleFilterStateChanged,\n searchQuery: searchQueryForInput,\n excludeRowOpen,\n })}\n </ErrorBoundary>\n </div>\n </div>\n );\n}\n\nexport const FilterListItem = memo(\n FilterListItemInner,\n) as typeof FilterListItemInner;\n"],"mappings":"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","ignoreList":[]}
@@ -118,11 +118,6 @@
118
118
  border-radius: var(--osdk-filter-input-border-radius);
119
119
  padding: var(--osdk-filter-input-padding);
120
120
  gap: var(--osdk-filter-input-gap);
121
-
122
- &:focus-within {
123
- outline: var(--osdk-filter-input-focus-outline-width) solid var(--osdk-filter-input-focus-outline-color);
124
- outline-offset: var(--osdk-filter-input-focus-outline-offset);
125
- }
126
121
  }
127
122
 
128
123
  .searchInput {
@@ -183,7 +178,6 @@
183
178
  }
184
179
  }
185
180
 
186
- .filterItem:hover [data-exclude-row],
187
181
  .excludeRowVisible {
188
182
  opacity: 1;
189
183
  height: auto;
@@ -197,6 +191,21 @@
197
191
  margin-left: calc(var(--osdk-surface-spacing) * 0.5);
198
192
  }
199
193
 
194
+ .clearAllButton {
195
+ margin-left: auto;
196
+ background: none;
197
+ border: none;
198
+ cursor: pointer;
199
+ font-family: var(--osdk-filter-item-exclude-dropdown-font-family);
200
+ font-size: var(--osdk-filter-item-exclude-dropdown-font-size);
201
+ color: var(--osdk-filter-item-exclude-dropdown-color);
202
+ padding: 0;
203
+
204
+ &:hover {
205
+ text-decoration: underline;
206
+ }
207
+ }
208
+
200
209
  .dragging {
201
210
  opacity: var(--osdk-filter-item-dragging-opacity);
202
211
  }
@@ -17,10 +17,10 @@
17
17
  import { useSortable } from "@dnd-kit/sortable";
18
18
  import { CSS } from "@dnd-kit/utilities";
19
19
  import classnames from "classnames";
20
- import React, { useMemo } from "react";
20
+ import React, { memo, useMemo } from "react";
21
21
  import { FilterListItem } from "./FilterListItem.js";
22
22
  import styles from "./FilterListItem.module.css";
23
- export function SortableFilterListItem({
23
+ function SortableFilterListItemInner({
24
24
  id,
25
25
  definition,
26
26
  filterKey,
@@ -60,4 +60,5 @@ export function SortableFilterListItem({
60
60
  dragHandleListeners: listeners
61
61
  }));
62
62
  }
63
+ export const SortableFilterListItem = /*#__PURE__*/memo(SortableFilterListItemInner);
63
64
  //# sourceMappingURL=SortableFilterListItem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SortableFilterListItem.js","names":["useSortable","CSS","classnames","React","useMemo","FilterListItem","styles","SortableFilterListItem","id","definition","filterKey","label","filterState","onFilterStateChanged","onFilterRemoved","renderInput","attributes","listeners","setNodeRef","transform","transition","isDragging","style","Transform","toString","undefined","createElement","ref","className","dragging","dragHandleAttributes","dragHandleListeners"],"sources":["SortableFilterListItem.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 { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport classnames from \"classnames\";\nimport React, { useMemo } from \"react\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport type { RenderFilterInput } from \"./BaseFilterListApi.js\";\nimport { FilterListItem } from \"./FilterListItem.js\";\nimport styles from \"./FilterListItem.module.css\";\n\ninterface SortableFilterListItemProps<D> {\n id: string;\n definition: D;\n filterKey: string;\n label: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (\n filterKey: string,\n state: FilterState,\n ) => void;\n onFilterRemoved?: (filterKey: string) => void;\n renderInput: RenderFilterInput<D>;\n}\n\nexport function SortableFilterListItem<D>({\n id,\n definition,\n filterKey,\n label,\n filterState,\n onFilterStateChanged,\n onFilterRemoved,\n renderInput,\n}: SortableFilterListItemProps<D>): React.ReactElement {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id });\n\n const style = useMemo<React.CSSProperties>(() => ({\n transform: CSS.Transform.toString(transform),\n transition: transition ?? undefined,\n }), [transform, transition]);\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={classnames(isDragging && styles.dragging)}\n >\n <FilterListItem\n definition={definition}\n filterKey={filterKey}\n label={label}\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n onFilterRemoved={onFilterRemoved}\n renderInput={renderInput}\n dragHandleAttributes={attributes}\n dragHandleListeners={listeners}\n />\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,QAAQ,mBAAmB;AAC/C,SAASC,GAAG,QAAQ,oBAAoB;AACxC,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,OAAO,QAAQ,OAAO;AAGtC,SAASC,cAAc,QAAQ,qBAAqB;AACpD,OAAOC,MAAM,MAAM,6BAA6B;AAgBhD,OAAO,SAASC,sBAAsBA,CAAI;EACxCC,EAAE;EACFC,UAAU;EACVC,SAAS;EACTC,KAAK;EACLC,WAAW;EACXC,oBAAoB;EACpBC,eAAe;EACfC;AAC8B,CAAC,EAAsB;EACrD,MAAM;IACJC,UAAU;IACVC,SAAS;IACTC,UAAU;IACVC,SAAS;IACTC,UAAU;IACVC;EACF,CAAC,GAAGrB,WAAW,CAAC;IAAEQ;EAAG,CAAC,CAAC;EAEvB,MAAMc,KAAK,GAAGlB,OAAO,CAAsB,OAAO;IAChDe,SAAS,EAAElB,GAAG,CAACsB,SAAS,CAACC,QAAQ,CAACL,SAAS,CAAC;IAC5CC,UAAU,EAAEA,UAAU,IAAIK;EAC5B,CAAC,CAAC,EAAE,CAACN,SAAS,EAAEC,UAAU,CAAC,CAAC;EAE5B,oBACEjB,KAAA,CAAAuB,aAAA;IACEC,GAAG,EAAET,UAAW;IAChBI,KAAK,EAAEA,KAAM;IACbM,SAAS,EAAE1B,UAAU,CAACmB,UAAU,IAAIf,MAAM,CAACuB,QAAQ;EAAE,gBAErD1B,KAAA,CAAAuB,aAAA,CAACrB,cAAc;IACbI,UAAU,EAAEA,UAAW;IACvBC,SAAS,EAAEA,SAAU;IACrBC,KAAK,EAAEA,KAAM;IACbC,WAAW,EAAEA,WAAY;IACzBC,oBAAoB,EAAEA,oBAAqB;IAC3CC,eAAe,EAAEA,eAAgB;IACjCC,WAAW,EAAEA,WAAY;IACzBe,oBAAoB,EAAEd,UAAW;IACjCe,mBAAmB,EAAEd;EAAU,CAChC,CACE,CAAC;AAEV","ignoreList":[]}
1
+ {"version":3,"file":"SortableFilterListItem.js","names":["useSortable","CSS","classnames","React","memo","useMemo","FilterListItem","styles","SortableFilterListItemInner","id","definition","filterKey","label","filterState","onFilterStateChanged","onFilterRemoved","renderInput","attributes","listeners","setNodeRef","transform","transition","isDragging","style","Transform","toString","undefined","createElement","ref","className","dragging","dragHandleAttributes","dragHandleListeners","SortableFilterListItem"],"sources":["SortableFilterListItem.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 { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport classnames from \"classnames\";\nimport React, { memo, useMemo } from \"react\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport type { RenderFilterInput } from \"./BaseFilterListApi.js\";\nimport { FilterListItem } from \"./FilterListItem.js\";\nimport styles from \"./FilterListItem.module.css\";\n\ninterface SortableFilterListItemProps<D> {\n id: string;\n definition: D;\n filterKey: string;\n label: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (\n filterKey: string,\n state: FilterState,\n ) => void;\n onFilterRemoved?: (filterKey: string) => void;\n renderInput: RenderFilterInput<D>;\n}\n\nfunction SortableFilterListItemInner<D>({\n id,\n definition,\n filterKey,\n label,\n filterState,\n onFilterStateChanged,\n onFilterRemoved,\n renderInput,\n}: SortableFilterListItemProps<D>): React.ReactElement {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id });\n\n const style = useMemo<React.CSSProperties>(() => ({\n transform: CSS.Transform.toString(transform),\n transition: transition ?? undefined,\n }), [transform, transition]);\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={classnames(isDragging && styles.dragging)}\n >\n <FilterListItem\n definition={definition}\n filterKey={filterKey}\n label={label}\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n onFilterRemoved={onFilterRemoved}\n renderInput={renderInput}\n dragHandleAttributes={attributes}\n dragHandleListeners={listeners}\n />\n </div>\n );\n}\n\nexport const SortableFilterListItem = memo(\n SortableFilterListItemInner,\n) as typeof SortableFilterListItemInner;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,QAAQ,mBAAmB;AAC/C,SAASC,GAAG,QAAQ,oBAAoB;AACxC,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,OAAO,QAAQ,OAAO;AAG5C,SAASC,cAAc,QAAQ,qBAAqB;AACpD,OAAOC,MAAM,MAAM,6BAA6B;AAgBhD,SAASC,2BAA2BA,CAAI;EACtCC,EAAE;EACFC,UAAU;EACVC,SAAS;EACTC,KAAK;EACLC,WAAW;EACXC,oBAAoB;EACpBC,eAAe;EACfC;AAC8B,CAAC,EAAsB;EACrD,MAAM;IACJC,UAAU;IACVC,SAAS;IACTC,UAAU;IACVC,SAAS;IACTC,UAAU;IACVC;EACF,CAAC,GAAGtB,WAAW,CAAC;IAAES;EAAG,CAAC,CAAC;EAEvB,MAAMc,KAAK,GAAGlB,OAAO,CAAsB,OAAO;IAChDe,SAAS,EAAEnB,GAAG,CAACuB,SAAS,CAACC,QAAQ,CAACL,SAAS,CAAC;IAC5CC,UAAU,EAAEA,UAAU,IAAIK;EAC5B,CAAC,CAAC,EAAE,CAACN,SAAS,EAAEC,UAAU,CAAC,CAAC;EAE5B,oBACElB,KAAA,CAAAwB,aAAA;IACEC,GAAG,EAAET,UAAW;IAChBI,KAAK,EAAEA,KAAM;IACbM,SAAS,EAAE3B,UAAU,CAACoB,UAAU,IAAIf,MAAM,CAACuB,QAAQ;EAAE,gBAErD3B,KAAA,CAAAwB,aAAA,CAACrB,cAAc;IACbI,UAAU,EAAEA,UAAW;IACvBC,SAAS,EAAEA,SAAU;IACrBC,KAAK,EAAEA,KAAM;IACbC,WAAW,EAAEA,WAAY;IACzBC,oBAAoB,EAAEA,oBAAqB;IAC3CC,eAAe,EAAEA,eAAgB;IACjCC,WAAW,EAAEA,WAAY;IACzBe,oBAAoB,EAAEd,UAAW;IACjCe,mBAAmB,EAAEd;EAAU,CAChC,CACE,CAAC;AAEV;AAEA,OAAO,MAAMe,sBAAsB,gBAAG7B,IAAI,CACxCI,2BACF,CAAuC","ignoreList":[]}
@@ -17,6 +17,7 @@
17
17
  import { Button } from "@base-ui/react/button";
18
18
  import classnames from "classnames";
19
19
  import React, { memo, useCallback, useMemo, useState } from "react";
20
+ import { Checkbox } from "../../../base-components/checkbox/Checkbox.js";
20
21
  import { filterValuesBySearch } from "../../utils/filterValues.js";
21
22
  import styles from "./ListogramInput.module.css";
22
23
  import { ListogramSkeleton } from "./ListogramSkeleton.js";
@@ -31,6 +32,7 @@ function ListogramInputInner({
31
32
  onChange,
32
33
  colorMap,
33
34
  displayMode = "full",
35
+ isExcluding,
34
36
  className,
35
37
  style,
36
38
  maxVisibleItems,
@@ -52,11 +54,16 @@ function ListogramInputInner({
52
54
  }
53
55
  return stableValues;
54
56
  }, [stableValues, searchQuery]);
57
+ const sortedValues = useMemo(() => {
58
+ const selected = filteredValues.filter(v => selectedSet.has(v.value));
59
+ const unselected = filteredValues.filter(v => !selectedSet.has(v.value));
60
+ return [...selected, ...unselected];
61
+ }, [filteredValues, selectedSet]);
55
62
  const displayValues = useMemo(() => {
56
- if (isExpanded || !maxVisibleItems) return filteredValues;
57
- return filteredValues.slice(0, maxVisibleItems);
58
- }, [filteredValues, maxVisibleItems, isExpanded]);
59
- const hasMore = maxVisibleItems != null && filteredValues.length > maxVisibleItems;
63
+ if (isExpanded || !maxVisibleItems) return sortedValues;
64
+ return sortedValues.slice(0, maxVisibleItems);
65
+ }, [sortedValues, maxVisibleItems, isExpanded]);
66
+ const hasMore = maxVisibleItems != null && sortedValues.length > maxVisibleItems;
60
67
  return /*#__PURE__*/React.createElement("div", {
61
68
  className: classnames(styles.listogram, className),
62
69
  style: style,
@@ -85,19 +92,27 @@ function ListogramInputInner({
85
92
  } : undefined)
86
93
  } : undefined
87
94
  }, /*#__PURE__*/React.createElement("span", {
88
- className: styles.label
89
- }, value), displayMode === "full" && /*#__PURE__*/React.createElement("span", {
95
+ className: styles.checkbox,
96
+ onClick: e => e.stopPropagation()
97
+ }, /*#__PURE__*/React.createElement(Checkbox, {
98
+ checked: selectedSet.has(value),
99
+ onCheckedChange: () => toggleValue(value),
100
+ isExcluding: isExcluding
101
+ })), /*#__PURE__*/React.createElement("span", {
102
+ className: styles.label,
103
+ "data-excluding": isExcluding && selectedSet.has(value) || undefined
104
+ }, value), displayMode !== "minimal" && /*#__PURE__*/React.createElement("span", {
105
+ className: styles.count
106
+ }, count.toLocaleString()), displayMode === "full" && /*#__PURE__*/React.createElement("span", {
90
107
  className: styles.bar
91
108
  }, /*#__PURE__*/React.createElement("span", {
92
109
  className: styles.barFill
93
- })), displayMode !== "minimal" && /*#__PURE__*/React.createElement("span", {
94
- className: styles.count
95
- }, count.toLocaleString()));
110
+ })));
96
111
  }), hasMore && !isExpanded && /*#__PURE__*/React.createElement(Button, {
97
112
  type: "button",
98
- className: styles.row,
113
+ className: styles.viewAllButton,
99
114
  onClick: () => setIsExpanded(true)
100
- }, "View all (", filteredValues.length, ")")));
115
+ }, "View all (", sortedValues.length, ")")));
101
116
  }
102
117
  export const ListogramInput = /*#__PURE__*/memo(ListogramInputInner);
103
118
  //# sourceMappingURL=ListogramInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListogramInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","filterValuesBySearch","styles","ListogramSkeleton","sharedStyles","useStableData","ListogramInputInner","values","maxCount","isLoading","error","selectedValues","onChange","colorMap","displayMode","className","style","maxVisibleItems","searchQuery","isExpanded","setIsExpanded","stableValues","selectedSet","Set","toggleValue","value","has","filter","v","filteredValues","displayValues","slice","hasMore","length","createElement","listogram","errorMessage","message","emptyMessage","container","map","count","percentage","perRowColor","key","row","onClick","undefined","label","bar","barFill","toLocaleString","type","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 type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport { filterValuesBySearch } from \"../../utils/filterValues.js\";\nimport styles from \"./ListogramInput.module.css\";\nimport { ListogramSkeleton } from \"./ListogramSkeleton.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 className?: string;\n style?: React.CSSProperties;\n maxVisibleItems?: number;\n searchQuery?: string;\n}\n\nfunction ListogramInputInner({\n values,\n maxCount,\n isLoading,\n error,\n selectedValues,\n onChange,\n colorMap,\n displayMode = \"full\",\n className,\n style,\n maxVisibleItems,\n searchQuery,\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(stableValues, searchQuery, (v) => v.value);\n }\n return stableValues;\n }, [stableValues, searchQuery]);\n\n const displayValues = useMemo(() => {\n if (isExpanded || !maxVisibleItems) return filteredValues;\n return filteredValues.slice(0, maxVisibleItems);\n }, [filteredValues, maxVisibleItems, isExpanded]);\n\n const hasMore = maxVisibleItems != null\n && filteredValues.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}>\n No values available\n </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\n return (\n <Button\n key={value}\n className={styles.row}\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 className={styles.label}>{value}</span>\n {displayMode === \"full\" && (\n <span className={styles.bar}>\n <span className={styles.barFill} />\n </span>\n )}\n {displayMode !== \"minimal\" && (\n <span className={styles.count}>\n {count.toLocaleString()}\n </span>\n )}\n </Button>\n );\n })}\n\n {hasMore && !isExpanded && (\n <Button\n type=\"button\"\n className={styles.row}\n onClick={() => setIsExpanded(true)}\n >\n View all ({filteredValues.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;AAEnE,SAASC,oBAAoB,QAAQ,6BAA6B;AAClE,OAAOC,MAAM,MAAM,6BAA6B;AAChD,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,OAAOC,YAAY,MAAM,qBAAqB;AAC9C,SAASC,aAAa,QAAQ,oBAAoB;AAmBlD,SAASC,mBAAmBA,CAAC;EAC3BC,MAAM;EACNC,QAAQ;EACRC,SAAS;EACTC,KAAK;EACLC,cAAc;EACdC,QAAQ;EACRC,QAAQ;EACRC,WAAW,GAAG,MAAM;EACpBC,SAAS;EACTC,KAAK;EACLC,eAAe;EACfC;AACmB,CAAC,EAAsB;EAC1C,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAGpB,QAAQ,CAAC,KAAK,CAAC;EAEnD,MAAMqB,YAAY,GAAGhB,aAAa,CAACE,MAAM,EAAEE,SAAS,CAAC;EAErD,MAAMa,WAAW,GAAGvB,OAAO,CAAC,MAAM,IAAIwB,GAAG,CAACZ,cAAc,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;EAE5E,MAAMa,WAAW,GAAG1B,WAAW,CAC5B2B,KAAa,IAAK;IACjB,IAAIH,WAAW,CAACI,GAAG,CAACD,KAAK,CAAC,EAAE;MAC1Bb,QAAQ,CAACD,cAAc,CAACgB,MAAM,CAAEC,CAAC,IAAKA,CAAC,KAAKH,KAAK,CAAC,CAAC;IACrD,CAAC,MAAM;MACLb,QAAQ,CAAC,CAAC,GAAGD,cAAc,EAAEc,KAAK,CAAC,CAAC;IACtC;EACF,CAAC,EACD,CAACd,cAAc,EAAEW,WAAW,EAAEV,QAAQ,CACxC,CAAC;EAED,MAAMiB,cAAc,GAAG9B,OAAO,CAAC,MAAM;IACnC,IAAImB,WAAW,EAAE;MACf,OAAOjB,oBAAoB,CAACoB,YAAY,EAAEH,WAAW,EAAGU,CAAC,IAAKA,CAAC,CAACH,KAAK,CAAC;IACxE;IACA,OAAOJ,YAAY;EACrB,CAAC,EAAE,CAACA,YAAY,EAAEH,WAAW,CAAC,CAAC;EAE/B,MAAMY,aAAa,GAAG/B,OAAO,CAAC,MAAM;IAClC,IAAIoB,UAAU,IAAI,CAACF,eAAe,EAAE,OAAOY,cAAc;IACzD,OAAOA,cAAc,CAACE,KAAK,CAAC,CAAC,EAAEd,eAAe,CAAC;EACjD,CAAC,EAAE,CAACY,cAAc,EAAEZ,eAAe,EAAEE,UAAU,CAAC,CAAC;EAEjD,MAAMa,OAAO,GAAGf,eAAe,IAAI,IAAI,IAClCY,cAAc,CAACI,MAAM,GAAGhB,eAAe;EAE5C,oBACErB,KAAA,CAAAsC,aAAA;IACEnB,SAAS,EAAEpB,UAAU,CAACO,MAAM,CAACiC,SAAS,EAAEpB,SAAS,CAAE;IACnDC,KAAK,EAAEA,KAAM;IACb,gBAAcP,SAAS,IAAIoB,cAAc,CAACI,MAAM,GAAG;EAAE,GAEpDvB,KAAK,iBACJd,KAAA,CAAAsC,aAAA;IAAKnB,SAAS,EAAEX,YAAY,CAACgC;EAAa,GAAC,wBACnB,EAAC1B,KAAK,CAAC2B,OAC1B,CACN,EAEA,CAAC3B,KAAK,IAAImB,cAAc,CAACI,MAAM,KAAK,CAAC,IAAIxB,SAAS,iBACjDb,KAAA,CAAAsC,aAAA,CAAC/B,iBAAiB,MAAE,CACrB,EACA,CAACO,KAAK,IAAImB,cAAc,CAACI,MAAM,KAAK,CAAC,IAAI,CAACxB,SAAS,iBAClDb,KAAA,CAAAsC,aAAA;IAAKnB,SAAS,EAAEX,YAAY,CAACkC;EAAa,GAAC,qBAEtC,CACN,EAEAT,cAAc,CAACI,MAAM,GAAG,CAAC,iBACxBrC,KAAA,CAAAsC,aAAA;IAAKnB,SAAS,EAAEb,MAAM,CAACqC;EAAU,GAC9BT,aAAa,CAACU,GAAG,CAAC,CAAC;IAAEf,KAAK;IAAEgB;EAAM,CAAC,KAAK;IACvC,MAAMC,UAAU,GAAGlC,QAAQ,GAAG,CAAC,GAAIiC,KAAK,GAAGjC,QAAQ,GAAI,GAAG,GAAG,CAAC;IAC9D,MAAMmC,WAAW,GAAG9B,QAAQ,GAAGY,KAAK,CAAC;IAErC,oBACE7B,KAAA,CAAAsC,aAAA,CAACxC,MAAM;MACLkD,GAAG,EAAEnB,KAAM;MACXV,SAAS,EAAEb,MAAM,CAAC2C,GAAI;MACtBC,OAAO,EAAEA,CAAA,KAAMtB,WAAW,CAACC,KAAK,CAAE;MAClC,gBAAcH,WAAW,CAACI,GAAG,CAACD,KAAK,CAAE;MACrCT,KAAK,EAAE2B,WAAW,IAAID,UAAU,GAAG,CAAC,GAChC;QACA,wCAAwC,EAAEA,UAAU,GAAG,GAAG;QAC1D,IAAIC,WAAW,GACX;UACA,uCAAuC,EAAEA;QAC3C,CAAC,GACCI,SAAS;MACf,CAAC,GACCA;IAAU,gBAEdnD,KAAA,CAAAsC,aAAA;MAAMnB,SAAS,EAAEb,MAAM,CAAC8C;IAAM,GAAEvB,KAAY,CAAC,EAC5CX,WAAW,KAAK,MAAM,iBACrBlB,KAAA,CAAAsC,aAAA;MAAMnB,SAAS,EAAEb,MAAM,CAAC+C;IAAI,gBAC1BrD,KAAA,CAAAsC,aAAA;MAAMnB,SAAS,EAAEb,MAAM,CAACgD;IAAQ,CAAE,CAC9B,CACP,EACApC,WAAW,KAAK,SAAS,iBACxBlB,KAAA,CAAAsC,aAAA;MAAMnB,SAAS,EAAEb,MAAM,CAACuC;IAAM,GAC3BA,KAAK,CAACU,cAAc,CAAC,CAClB,CAEF,CAAC;EAEb,CAAC,CAAC,EAEDnB,OAAO,IAAI,CAACb,UAAU,iBACrBvB,KAAA,CAAAsC,aAAA,CAACxC,MAAM;IACL0D,IAAI,EAAC,QAAQ;IACbrC,SAAS,EAAEb,MAAM,CAAC2C,GAAI;IACtBC,OAAO,EAAEA,CAAA,KAAM1B,aAAa,CAAC,IAAI;EAAE,GACpC,YACW,EAACS,cAAc,CAACI,MAAM,EAAC,GAC3B,CAEP,CAEJ,CAAC;AAEV;AAEA,OAAO,MAAMoB,cAAc,gBAAGxD,IAAI,CAChCS,mBACF,CAA+B","ignoreList":[]}
1
+ {"version":3,"file":"ListogramInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","Checkbox","filterValuesBySearch","styles","ListogramSkeleton","sharedStyles","useStableData","ListogramInputInner","values","maxCount","isLoading","error","selectedValues","onChange","colorMap","displayMode","isExcluding","className","style","maxVisibleItems","searchQuery","isExpanded","setIsExpanded","stableValues","selectedSet","Set","toggleValue","value","has","filter","v","filteredValues","sortedValues","selected","unselected","displayValues","slice","hasMore","length","createElement","listogram","errorMessage","message","emptyMessage","container","map","count","percentage","perRowColor","key","row","onClick","undefined","checkbox","e","stopPropagation","checked","onCheckedChange","label","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 { filterValuesBySearch } from \"../../utils/filterValues.js\";\nimport styles from \"./ListogramInput.module.css\";\nimport { ListogramSkeleton } from \"./ListogramSkeleton.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 isExcluding?: boolean;\n className?: string;\n style?: React.CSSProperties;\n maxVisibleItems?: number;\n searchQuery?: string;\n}\n\nfunction ListogramInputInner({\n values,\n maxCount,\n isLoading,\n error,\n selectedValues,\n onChange,\n colorMap,\n displayMode = \"full\",\n isExcluding,\n className,\n style,\n maxVisibleItems,\n searchQuery,\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(stableValues, searchQuery, (v) => v.value);\n }\n return stableValues;\n }, [stableValues, searchQuery]);\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}>\n No values available\n </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\n return (\n <Button\n key={value}\n className={styles.row}\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 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 {value}\n </span>\n {displayMode !== \"minimal\" && (\n <span className={styles.count}>\n {count.toLocaleString()}\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 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":[]}
@@ -73,6 +73,10 @@
73
73
  white-space: nowrap;
74
74
  }
75
75
 
76
+ .label[data-excluding] {
77
+ text-decoration: line-through;
78
+ }
79
+
76
80
  .bar {
77
81
  width: var(--osdk-filter-listogram-bar-width);
78
82
  flex-shrink: 0;
@@ -87,6 +91,7 @@
87
91
  height: 100%;
88
92
  width: 100%;
89
93
  background: var(--osdk-filter-listogram-row-bar-color, var(--osdk-filter-listogram-bar-color));
94
+ border-radius: var(--osdk-filter-listogram-bar-border-radius);
90
95
  transform-origin: left;
91
96
  transform: scaleX(var(--osdk-filter-listogram-bar-fill-scale, 0));
92
97
  transition: transform var(--osdk-filter-listogram-bar-fill-transition);
@@ -96,6 +101,32 @@
96
101
  background: var(--osdk-filter-listogram-row-bar-color, var(--osdk-filter-listogram-selected-color));
97
102
  }
98
103
 
104
+ .viewAllButton {
105
+ display: flex;
106
+ align-items: center;
107
+ border: none;
108
+ background: transparent;
109
+ cursor: pointer;
110
+ font-family: var(--osdk-filter-listogram-label-font-family);
111
+ font-size: var(--osdk-filter-listogram-view-all-font-size);
112
+ color: var(--osdk-filter-listogram-view-all-color);
113
+ padding: var(--osdk-filter-listogram-row-padding);
114
+ text-align: left;
115
+
116
+ &:hover {
117
+ text-decoration: underline;
118
+ }
119
+
120
+ &:focus-visible {
121
+ outline: var(--osdk-filter-listogram-row-focus-outline);
122
+ outline-offset: var(--osdk-filter-listogram-row-focus-offset);
123
+ }
124
+ }
125
+
126
+ .checkbox {
127
+ display: flex;
128
+ }
129
+
99
130
  .count {
100
131
  font-family: var(--osdk-filter-listogram-count-font-family);
101
132
  font-size: var(--osdk-filter-listogram-count-font-size);
@@ -14,9 +14,8 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { Button } from "@base-ui/react/button";
18
17
  import classnames from "classnames";
19
- import React, { memo, useCallback } from "react";
18
+ import React, { memo, useCallback, useMemo } from "react";
20
19
  import { Combobox } from "../../../base-components/combobox/Combobox.js";
21
20
  import styles from "./MultiSelectInput.module.css";
22
21
  import sharedStyles from "./shared.module.css";
@@ -29,21 +28,33 @@ function MultiSelectInputInner({
29
28
  className,
30
29
  style,
31
30
  placeholder = "Select values...",
32
- maxDisplayedTags = 3,
33
- showClearAll = true,
34
31
  ariaLabel = "Search values"
35
32
  }) {
36
33
  const handleValueChange = useCallback(newValues => {
37
34
  onChange(newValues ?? []);
38
35
  }, [onChange]);
39
- const removeValue = useCallback(value => {
40
- onChange(selectedValues.filter(v => v !== value));
41
- }, [selectedValues, onChange]);
42
- const clearAll = useCallback(() => {
43
- onChange([]);
44
- }, [onChange]);
45
- const displayedTags = selectedValues.slice(0, maxDisplayedTags);
46
- const remainingCount = selectedValues.length - maxDisplayedTags;
36
+ const items = useMemo(() => values.map(({
37
+ value
38
+ }) => value), [values]);
39
+ const countByValue = useMemo(() => new Map(values.map(({
40
+ value,
41
+ count
42
+ }) => [value, count])), [values]);
43
+ const renderItem = useCallback(value => /*#__PURE__*/React.createElement(Combobox.Item, {
44
+ key: value,
45
+ value: value
46
+ }, /*#__PURE__*/React.createElement(Combobox.ItemIndicator, null), /*#__PURE__*/React.createElement("span", {
47
+ className: styles.itemLabel
48
+ }, value), /*#__PURE__*/React.createElement("span", {
49
+ className: styles.itemCount
50
+ }, "(", (countByValue.get(value) ?? 0).toLocaleString(), ")")), [countByValue]);
51
+ const renderChips = useCallback(selectedItems => /*#__PURE__*/React.createElement(React.Fragment, null, selectedItems.map(value => /*#__PURE__*/React.createElement(Combobox.Chip, {
52
+ key: value,
53
+ "aria-label": value
54
+ }, value, /*#__PURE__*/React.createElement(Combobox.ChipRemove, null))), /*#__PURE__*/React.createElement(Combobox.Input, {
55
+ placeholder: selectedItems.length > 0 ? "" : placeholder,
56
+ "aria-label": ariaLabel
57
+ })), [placeholder, ariaLabel]);
47
58
  return /*#__PURE__*/React.createElement("div", {
48
59
  className: classnames(styles.multiSelect, className),
49
60
  style: style,
@@ -55,39 +66,11 @@ function MultiSelectInputInner({
55
66
  }, isLoading ? "Loading options..." : "No options available"), (values.length > 0 || isLoading) && /*#__PURE__*/React.createElement(Combobox.Root, {
56
67
  multiple: true,
57
68
  value: selectedValues,
58
- onValueChange: handleValueChange
69
+ onValueChange: handleValueChange,
70
+ items: items
59
71
  }, isLoading && /*#__PURE__*/React.createElement("div", {
60
72
  className: sharedStyles.loadingMessage
61
- }, "Updating..."), selectedValues.length > 0 && /*#__PURE__*/React.createElement("div", {
62
- className: sharedStyles.tagContainer
63
- }, displayedTags.map(value => /*#__PURE__*/React.createElement("span", {
64
- key: value,
65
- className: sharedStyles.tag
66
- }, value, /*#__PURE__*/React.createElement(Button, {
67
- type: "button",
68
- className: sharedStyles.tagRemove,
69
- onClick: () => removeValue(value),
70
- "aria-label": `Remove ${value}`
71
- }, "\xD7"))), remainingCount > 0 && /*#__PURE__*/React.createElement("span", {
72
- className: sharedStyles.tag
73
- }, "+", remainingCount, " more")), /*#__PURE__*/React.createElement("div", {
74
- className: styles.inputRow
75
- }, /*#__PURE__*/React.createElement(Combobox.SearchInput, {
76
- placeholder: selectedValues.length > 0 ? `${selectedValues.length} selected` : placeholder,
77
- "aria-label": ariaLabel
78
- }), showClearAll && selectedValues.length > 0 && /*#__PURE__*/React.createElement(Combobox.Clear, {
79
- className: styles.clearButton,
80
- onClick: clearAll,
81
- "aria-label": "Clear all selections"
82
- })), /*#__PURE__*/React.createElement(Combobox.Portal, null, /*#__PURE__*/React.createElement(Combobox.Positioner, null, /*#__PURE__*/React.createElement(Combobox.Popup, null, values.length === 0 ? /*#__PURE__*/React.createElement(Combobox.Empty, null, "No options available") : values.map(({
83
- value,
84
- count
85
- }) => /*#__PURE__*/React.createElement(Combobox.Item, {
86
- key: value,
87
- value: value
88
- }, /*#__PURE__*/React.createElement("span", null, value), /*#__PURE__*/React.createElement("span", {
89
- className: styles.itemCount
90
- }, "(", count.toLocaleString(), ")"))))))));
73
+ }, "Updating..."), /*#__PURE__*/React.createElement(Combobox.Chips, null, /*#__PURE__*/React.createElement(Combobox.Value, null, renderChips)), /*#__PURE__*/React.createElement(Combobox.Portal, null, /*#__PURE__*/React.createElement(Combobox.Positioner, null, /*#__PURE__*/React.createElement(Combobox.Popup, null, /*#__PURE__*/React.createElement(Combobox.Empty, null, "No matching options"), /*#__PURE__*/React.createElement(Combobox.List, null, renderItem))))));
91
74
  }
92
75
  export const MultiSelectInput = /*#__PURE__*/memo(MultiSelectInputInner);
93
76
  //# sourceMappingURL=MultiSelectInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSelectInput.js","names":["Button","classnames","React","memo","useCallback","Combobox","styles","sharedStyles","MultiSelectInputInner","values","isLoading","error","selectedValues","onChange","className","style","placeholder","maxDisplayedTags","showClearAll","ariaLabel","handleValueChange","newValues","removeValue","value","filter","v","clearAll","displayedTags","slice","remainingCount","length","createElement","multiSelect","errorMessage","message","emptyMessage","Root","multiple","onValueChange","loadingMessage","tagContainer","map","key","tag","type","tagRemove","onClick","inputRow","SearchInput","Clear","clearButton","Portal","Positioner","Popup","Empty","count","Item","itemCount","toLocaleString","MultiSelectInput"],"sources":["MultiSelectInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback } from \"react\";\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport styles from \"./MultiSelectInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface MultiSelectInputProps {\n values: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (values: string[]) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n maxDisplayedTags?: number;\n showClearAll?: boolean;\n ariaLabel?: string;\n}\n\nfunction MultiSelectInputInner({\n values,\n isLoading,\n error,\n selectedValues,\n onChange,\n className,\n style,\n placeholder = \"Select values...\",\n maxDisplayedTags = 3,\n showClearAll = true,\n ariaLabel = \"Search values\",\n}: MultiSelectInputProps): React.ReactElement {\n const handleValueChange = useCallback(\n (newValues: string[] | null) => {\n onChange(newValues ?? []);\n },\n [onChange],\n );\n\n const removeValue = useCallback(\n (value: string) => {\n onChange(selectedValues.filter((v) => v !== value));\n },\n [selectedValues, onChange],\n );\n\n const clearAll = useCallback(() => {\n onChange([]);\n }, [onChange]);\n\n const displayedTags = selectedValues.slice(0, maxDisplayedTags);\n const remainingCount = selectedValues.length - maxDisplayedTags;\n\n return (\n <div\n className={classnames(styles.multiSelect, className)}\n style={style}\n data-loading={isLoading}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading options: {error.message}\n </div>\n )}\n\n {!error && values.length === 0 && (\n <div className={sharedStyles.emptyMessage}>\n {isLoading ? \"Loading options...\" : \"No options available\"}\n </div>\n )}\n\n {(values.length > 0 || isLoading) && (\n <Combobox.Root<string, true>\n multiple\n value={selectedValues}\n onValueChange={handleValueChange}\n >\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Updating...\n </div>\n )}\n\n {selectedValues.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {displayedTags.map((value) => (\n <span key={value} className={sharedStyles.tag}>\n {value}\n <Button\n type=\"button\"\n className={sharedStyles.tagRemove}\n onClick={() =>\n removeValue(value)}\n aria-label={`Remove ${value}`}\n >\n ×\n </Button>\n </span>\n ))}\n {remainingCount > 0 && (\n <span className={sharedStyles.tag}>\n +{remainingCount} more\n </span>\n )}\n </div>\n )}\n\n <div className={styles.inputRow}>\n <Combobox.SearchInput\n placeholder={selectedValues.length > 0\n ? `${selectedValues.length} selected`\n : placeholder}\n aria-label={ariaLabel}\n />\n {showClearAll && selectedValues.length > 0 && (\n <Combobox.Clear\n className={styles.clearButton}\n onClick={clearAll}\n aria-label=\"Clear all selections\"\n />\n )}\n </div>\n\n <Combobox.Portal>\n <Combobox.Positioner>\n <Combobox.Popup>\n {values.length === 0\n ? <Combobox.Empty>No options available</Combobox.Empty>\n : values.map(({ value, count }) => (\n <Combobox.Item key={value} value={value}>\n <span>{value}</span>\n <span className={styles.itemCount}>\n ({count.toLocaleString()})\n </span>\n </Combobox.Item>\n ))}\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n )}\n </div>\n );\n}\n\nexport const MultiSelectInput = memo(\n MultiSelectInputInner,\n) as typeof MultiSelectInputInner;\n"],"mappings":"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,QAAQ,QAAQ,+CAA+C;AAExE,OAAOC,MAAM,MAAM,+BAA+B;AAClD,OAAOC,YAAY,MAAM,qBAAqB;AAgB9C,SAASC,qBAAqBA,CAAC;EAC7BC,MAAM;EACNC,SAAS;EACTC,KAAK;EACLC,cAAc;EACdC,QAAQ;EACRC,SAAS;EACTC,KAAK;EACLC,WAAW,GAAG,kBAAkB;EAChCC,gBAAgB,GAAG,CAAC;EACpBC,YAAY,GAAG,IAAI;EACnBC,SAAS,GAAG;AACS,CAAC,EAAsB;EAC5C,MAAMC,iBAAiB,GAAGhB,WAAW,CAClCiB,SAA0B,IAAK;IAC9BR,QAAQ,CAACQ,SAAS,IAAI,EAAE,CAAC;EAC3B,CAAC,EACD,CAACR,QAAQ,CACX,CAAC;EAED,MAAMS,WAAW,GAAGlB,WAAW,CAC5BmB,KAAa,IAAK;IACjBV,QAAQ,CAACD,cAAc,CAACY,MAAM,CAAEC,CAAC,IAAKA,CAAC,KAAKF,KAAK,CAAC,CAAC;EACrD,CAAC,EACD,CAACX,cAAc,EAAEC,QAAQ,CAC3B,CAAC;EAED,MAAMa,QAAQ,GAAGtB,WAAW,CAAC,MAAM;IACjCS,QAAQ,CAAC,EAAE,CAAC;EACd,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,MAAMc,aAAa,GAAGf,cAAc,CAACgB,KAAK,CAAC,CAAC,EAAEX,gBAAgB,CAAC;EAC/D,MAAMY,cAAc,GAAGjB,cAAc,CAACkB,MAAM,GAAGb,gBAAgB;EAE/D,oBACEf,KAAA,CAAA6B,aAAA;IACEjB,SAAS,EAAEb,UAAU,CAACK,MAAM,CAAC0B,WAAW,EAAElB,SAAS,CAAE;IACrDC,KAAK,EAAEA,KAAM;IACb,gBAAcL;EAAU,GAEvBC,KAAK,iBACJT,KAAA,CAAA6B,aAAA;IAAKjB,SAAS,EAAEP,YAAY,CAAC0B;EAAa,GAAC,yBAClB,EAACtB,KAAK,CAACuB,OAC3B,CACN,EAEA,CAACvB,KAAK,IAAIF,MAAM,CAACqB,MAAM,KAAK,CAAC,iBAC5B5B,KAAA,CAAA6B,aAAA;IAAKjB,SAAS,EAAEP,YAAY,CAAC4B;EAAa,GACvCzB,SAAS,GAAG,oBAAoB,GAAG,sBACjC,CACN,EAEA,CAACD,MAAM,CAACqB,MAAM,GAAG,CAAC,IAAIpB,SAAS,kBAC9BR,KAAA,CAAA6B,aAAA,CAAC1B,QAAQ,CAAC+B,IAAI;IACZC,QAAQ;IACRd,KAAK,EAAEX,cAAe;IACtB0B,aAAa,EAAElB;EAAkB,GAEhCV,SAAS,iBACRR,KAAA,CAAA6B,aAAA;IAAKjB,SAAS,EAAEP,YAAY,CAACgC;EAAe,GAAC,aAExC,CACN,EAEA3B,cAAc,CAACkB,MAAM,GAAG,CAAC,iBACxB5B,KAAA,CAAA6B,aAAA;IAAKjB,SAAS,EAAEP,YAAY,CAACiC;EAAa,GACvCb,aAAa,CAACc,GAAG,CAAElB,KAAK,iBACvBrB,KAAA,CAAA6B,aAAA;IAAMW,GAAG,EAAEnB,KAAM;IAACT,SAAS,EAAEP,YAAY,CAACoC;EAAI,GAC3CpB,KAAK,eACNrB,KAAA,CAAA6B,aAAA,CAAC/B,MAAM;IACL4C,IAAI,EAAC,QAAQ;IACb9B,SAAS,EAAEP,YAAY,CAACsC,SAAU;IAClCC,OAAO,EAAEA,CAAA,KACPxB,WAAW,CAACC,KAAK,CAAE;IACrB,cAAY,UAAUA,KAAK;EAAG,GAC/B,MAEO,CACJ,CACP,CAAC,EACDM,cAAc,GAAG,CAAC,iBACjB3B,KAAA,CAAA6B,aAAA;IAAMjB,SAAS,EAAEP,YAAY,CAACoC;EAAI,GAAC,GAChC,EAACd,cAAc,EAAC,OACb,CAEL,CACN,eAED3B,KAAA,CAAA6B,aAAA;IAAKjB,SAAS,EAAER,MAAM,CAACyC;EAAS,gBAC9B7C,KAAA,CAAA6B,aAAA,CAAC1B,QAAQ,CAAC2C,WAAW;IACnBhC,WAAW,EAAEJ,cAAc,CAACkB,MAAM,GAAG,CAAC,GAClC,GAAGlB,cAAc,CAACkB,MAAM,WAAW,GACnCd,WAAY;IAChB,cAAYG;EAAU,CACvB,CAAC,EACDD,YAAY,IAAIN,cAAc,CAACkB,MAAM,GAAG,CAAC,iBACxC5B,KAAA,CAAA6B,aAAA,CAAC1B,QAAQ,CAAC4C,KAAK;IACbnC,SAAS,EAAER,MAAM,CAAC4C,WAAY;IAC9BJ,OAAO,EAAEpB,QAAS;IAClB,cAAW;EAAsB,CAClC,CAEA,CAAC,eAENxB,KAAA,CAAA6B,aAAA,CAAC1B,QAAQ,CAAC8C,MAAM,qBACdjD,KAAA,CAAA6B,aAAA,CAAC1B,QAAQ,CAAC+C,UAAU,qBAClBlD,KAAA,CAAA6B,aAAA,CAAC1B,QAAQ,CAACgD,KAAK,QACZ5C,MAAM,CAACqB,MAAM,KAAK,CAAC,gBAChB5B,KAAA,CAAA6B,aAAA,CAAC1B,QAAQ,CAACiD,KAAK,QAAC,sBAAoC,CAAC,GACrD7C,MAAM,CAACgC,GAAG,CAAC,CAAC;IAAElB,KAAK;IAAEgC;EAAM,CAAC,kBAC5BrD,KAAA,CAAA6B,aAAA,CAAC1B,QAAQ,CAACmD,IAAI;IAACd,GAAG,EAAEnB,KAAM;IAACA,KAAK,EAAEA;EAAM,gBACtCrB,KAAA,CAAA6B,aAAA,eAAOR,KAAY,CAAC,eACpBrB,KAAA,CAAA6B,aAAA;IAAMjB,SAAS,EAAER,MAAM,CAACmD;EAAU,GAAC,GAChC,EAACF,KAAK,CAACG,cAAc,CAAC,CAAC,EAAC,GACrB,CACO,CAChB,CACW,CACG,CACN,CACJ,CAEd,CAAC;AAEV;AAEA,OAAO,MAAMC,gBAAgB,gBAAGxD,IAAI,CAClCK,qBACF,CAAiC","ignoreList":[]}
1
+ {"version":3,"file":"MultiSelectInput.js","names":["classnames","React","memo","useCallback","useMemo","Combobox","styles","sharedStyles","MultiSelectInputInner","values","isLoading","error","selectedValues","onChange","className","style","placeholder","ariaLabel","handleValueChange","newValues","items","map","value","countByValue","Map","count","renderItem","createElement","Item","key","ItemIndicator","itemLabel","itemCount","get","toLocaleString","renderChips","selectedItems","Fragment","Chip","ChipRemove","Input","length","multiSelect","errorMessage","message","emptyMessage","Root","multiple","onValueChange","loadingMessage","Chips","Value","Portal","Positioner","Popup","Empty","List","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 styles from \"./MultiSelectInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface MultiSelectInputProps {\n values: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (values: string[]) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n ariaLabel?: string;\n}\n\nfunction MultiSelectInputInner({\n values,\n isLoading,\n error,\n selectedValues,\n onChange,\n className,\n style,\n placeholder = \"Select values...\",\n ariaLabel = \"Search values\",\n}: MultiSelectInputProps): React.ReactElement {\n const handleValueChange = useCallback(\n (newValues: string[] | null) => {\n onChange(newValues ?? []);\n },\n [onChange],\n );\n\n const items = useMemo(\n () => values.map(({ value }) => value),\n [values],\n );\n\n const countByValue = useMemo(\n () => new Map(values.map(({ value, count }) => [value, count])),\n [values],\n );\n\n const renderItem = useCallback(\n (value: string) => (\n <Combobox.Item key={value} value={value}>\n <Combobox.ItemIndicator />\n <span className={styles.itemLabel}>{value}</span>\n <span className={styles.itemCount}>\n ({(countByValue.get(value) ?? 0).toLocaleString()})\n </span>\n </Combobox.Item>\n ),\n [countByValue],\n );\n\n const renderChips = useCallback(\n (selectedItems: string[]) => (\n <>\n {selectedItems.map((value) => (\n <Combobox.Chip\n key={value}\n aria-label={value}\n >\n {value}\n <Combobox.ChipRemove />\n </Combobox.Chip>\n ))}\n <Combobox.Input\n placeholder={selectedItems.length > 0 ? \"\" : placeholder}\n aria-label={ariaLabel}\n />\n </>\n ),\n [placeholder, ariaLabel],\n );\n\n return (\n <div\n className={classnames(styles.multiSelect, className)}\n style={style}\n data-loading={isLoading}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading options: {error.message}\n </div>\n )}\n\n {!error && values.length === 0 && (\n <div className={sharedStyles.emptyMessage}>\n {isLoading ? \"Loading options...\" : \"No options available\"}\n </div>\n )}\n\n {(values.length > 0 || isLoading) && (\n <Combobox.Root<string, true>\n multiple={true}\n value={selectedValues}\n onValueChange={handleValueChange}\n items={items}\n >\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Updating...\n </div>\n )}\n\n <Combobox.Chips>\n <Combobox.Value>{renderChips}</Combobox.Value>\n </Combobox.Chips>\n\n <Combobox.Portal>\n <Combobox.Positioner>\n <Combobox.Popup>\n <Combobox.Empty>No matching options</Combobox.Empty>\n <Combobox.List>{renderItem}</Combobox.List>\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n )}\n </div>\n );\n}\n\nexport const MultiSelectInput = memo(\n MultiSelectInputInner,\n) as typeof MultiSelectInputInner;\n"],"mappings":"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","ignoreList":[]}
@@ -20,14 +20,12 @@
20
20
  gap: var(--osdk-filter-multiselect-gap);
21
21
  }
22
22
 
23
- .inputRow {
24
- display: flex;
25
- align-items: center;
26
- gap: var(--osdk-filter-multiselect-inputRow-gap);
27
- }
28
-
29
- .clearButton {
30
- flex-shrink: 0;
23
+ .itemLabel {
24
+ flex: 1;
25
+ min-width: 0;
26
+ overflow: hidden;
27
+ text-overflow: ellipsis;
28
+ white-space: nowrap;
31
29
  }
32
30
 
33
31
  .itemCount {
@@ -35,4 +33,5 @@
35
33
  font-size: var(--osdk-filter-multiselect-count-font-size);
36
34
  font-variant-numeric: tabular-nums;
37
35
  color: var(--osdk-filter-multiselect-count-color);
36
+ flex-shrink: 0;
38
37
  }
@@ -47,7 +47,7 @@ function NullValueWrapperInner({
47
47
  onCheckedChange: handleToggle
48
48
  }), /*#__PURE__*/React.createElement("span", {
49
49
  className: styles.nullLabelText
50
- }, "No value")), showNullCount && !error && nullCount > 0 && /*#__PURE__*/React.createElement("span", {
50
+ }, "No value")), showNullCount && !error && /*#__PURE__*/React.createElement("span", {
51
51
  className: styles.count
52
52
  }, nullCount.toLocaleString())), error && /*#__PURE__*/React.createElement("div", {
53
53
  className: sharedStyles.errorMessage
@@ -1 +1 @@
1
- {"version":3,"file":"NullValueWrapper.js","names":["classnames","React","memo","useCallback","Checkbox","styles","sharedStyles","NullValueWrapperInner","nullCount","isLoading","error","includeNull","onIncludeNullChange","showNullCount","children","className","style","handleToggle","createElement","nullWrapper","nullValueRow","nullLabel","checked","onCheckedChange","nullLabelText","count","toLocaleString","errorMessage","NullValueWrapper"],"sources":["NullValueWrapper.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport classnames from \"classnames\";\nimport React, { memo, useCallback } from \"react\";\nimport { Checkbox } from \"../../../base-components/checkbox/Checkbox.js\";\nimport styles from \"./NullValueWrapper.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface NullValueWrapperProps {\n nullCount: number;\n isLoading: boolean;\n error?: Error | null;\n includeNull?: boolean;\n onIncludeNullChange: (include: boolean) => void;\n showNullCount?: boolean;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction NullValueWrapperInner({\n nullCount,\n isLoading,\n error,\n includeNull = false,\n onIncludeNullChange,\n showNullCount = true,\n children,\n className,\n style,\n}: NullValueWrapperProps): React.ReactElement {\n const handleToggle = useCallback(() => {\n onIncludeNullChange(!includeNull);\n }, [includeNull, onIncludeNullChange]);\n\n return (\n <div className={classnames(styles.nullWrapper, className)} style={style}>\n {children}\n\n <div\n className={styles.nullValueRow}\n data-checked={includeNull}\n data-loading={isLoading}\n >\n <label className={styles.nullLabel}>\n <Checkbox checked={includeNull} onCheckedChange={handleToggle} />\n <span className={styles.nullLabelText}>No value</span>\n </label>\n {showNullCount && !error && nullCount > 0 && (\n <span className={styles.count}>\n {nullCount.toLocaleString()}\n </span>\n )}\n </div>\n {error && (\n <div className={sharedStyles.errorMessage}>\n Failed to load null count\n </div>\n )}\n </div>\n );\n}\n\nexport const NullValueWrapper = memo(\n NullValueWrapperInner,\n) as typeof NullValueWrapperInner;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,WAAW,QAAQ,OAAO;AAChD,SAASC,QAAQ,QAAQ,+CAA+C;AACxE,OAAOC,MAAM,MAAM,+BAA+B;AAClD,OAAOC,YAAY,MAAM,qBAAqB;AAc9C,SAASC,qBAAqBA,CAAC;EAC7BC,SAAS;EACTC,SAAS;EACTC,KAAK;EACLC,WAAW,GAAG,KAAK;EACnBC,mBAAmB;EACnBC,aAAa,GAAG,IAAI;EACpBC,QAAQ;EACRC,SAAS;EACTC;AACqB,CAAC,EAAsB;EAC5C,MAAMC,YAAY,GAAGd,WAAW,CAAC,MAAM;IACrCS,mBAAmB,CAAC,CAACD,WAAW,CAAC;EACnC,CAAC,EAAE,CAACA,WAAW,EAAEC,mBAAmB,CAAC,CAAC;EAEtC,oBACEX,KAAA,CAAAiB,aAAA;IAAKH,SAAS,EAAEf,UAAU,CAACK,MAAM,CAACc,WAAW,EAAEJ,SAAS,CAAE;IAACC,KAAK,EAAEA;EAAM,GACrEF,QAAQ,eAETb,KAAA,CAAAiB,aAAA;IACEH,SAAS,EAAEV,MAAM,CAACe,YAAa;IAC/B,gBAAcT,WAAY;IAC1B,gBAAcF;EAAU,gBAExBR,KAAA,CAAAiB,aAAA;IAAOH,SAAS,EAAEV,MAAM,CAACgB;EAAU,gBACjCpB,KAAA,CAAAiB,aAAA,CAACd,QAAQ;IAACkB,OAAO,EAAEX,WAAY;IAACY,eAAe,EAAEN;EAAa,CAAE,CAAC,eACjEhB,KAAA,CAAAiB,aAAA;IAAMH,SAAS,EAAEV,MAAM,CAACmB;EAAc,GAAC,UAAc,CAChD,CAAC,EACPX,aAAa,IAAI,CAACH,KAAK,IAAIF,SAAS,GAAG,CAAC,iBACvCP,KAAA,CAAAiB,aAAA;IAAMH,SAAS,EAAEV,MAAM,CAACoB;EAAM,GAC3BjB,SAAS,CAACkB,cAAc,CAAC,CACtB,CAEL,CAAC,EACLhB,KAAK,iBACJT,KAAA,CAAAiB,aAAA;IAAKH,SAAS,EAAET,YAAY,CAACqB;EAAa,GAAC,2BAEtC,CAEJ,CAAC;AAEV;AAEA,OAAO,MAAMC,gBAAgB,gBAAG1B,IAAI,CAClCK,qBACF,CAAiC","ignoreList":[]}
1
+ {"version":3,"file":"NullValueWrapper.js","names":["classnames","React","memo","useCallback","Checkbox","styles","sharedStyles","NullValueWrapperInner","nullCount","isLoading","error","includeNull","onIncludeNullChange","showNullCount","children","className","style","handleToggle","createElement","nullWrapper","nullValueRow","nullLabel","checked","onCheckedChange","nullLabelText","count","toLocaleString","errorMessage","NullValueWrapper"],"sources":["NullValueWrapper.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport classnames from \"classnames\";\nimport React, { memo, useCallback } from \"react\";\nimport { Checkbox } from \"../../../base-components/checkbox/Checkbox.js\";\nimport styles from \"./NullValueWrapper.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface NullValueWrapperProps {\n nullCount: number;\n isLoading: boolean;\n error?: Error | null;\n includeNull?: boolean;\n onIncludeNullChange: (include: boolean) => void;\n showNullCount?: boolean;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction NullValueWrapperInner({\n nullCount,\n isLoading,\n error,\n includeNull = false,\n onIncludeNullChange,\n showNullCount = true,\n children,\n className,\n style,\n}: NullValueWrapperProps): React.ReactElement {\n const handleToggle = useCallback(() => {\n onIncludeNullChange(!includeNull);\n }, [includeNull, onIncludeNullChange]);\n\n return (\n <div className={classnames(styles.nullWrapper, className)} style={style}>\n {children}\n\n <div\n className={styles.nullValueRow}\n data-checked={includeNull}\n data-loading={isLoading}\n >\n <label className={styles.nullLabel}>\n <Checkbox checked={includeNull} onCheckedChange={handleToggle} />\n <span className={styles.nullLabelText}>No value</span>\n </label>\n {showNullCount && !error && (\n <span className={styles.count}>\n {nullCount.toLocaleString()}\n </span>\n )}\n </div>\n {error && (\n <div className={sharedStyles.errorMessage}>\n Failed to load null count\n </div>\n )}\n </div>\n );\n}\n\nexport const NullValueWrapper = memo(\n NullValueWrapperInner,\n) as typeof NullValueWrapperInner;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,WAAW,QAAQ,OAAO;AAChD,SAASC,QAAQ,QAAQ,+CAA+C;AACxE,OAAOC,MAAM,MAAM,+BAA+B;AAClD,OAAOC,YAAY,MAAM,qBAAqB;AAc9C,SAASC,qBAAqBA,CAAC;EAC7BC,SAAS;EACTC,SAAS;EACTC,KAAK;EACLC,WAAW,GAAG,KAAK;EACnBC,mBAAmB;EACnBC,aAAa,GAAG,IAAI;EACpBC,QAAQ;EACRC,SAAS;EACTC;AACqB,CAAC,EAAsB;EAC5C,MAAMC,YAAY,GAAGd,WAAW,CAAC,MAAM;IACrCS,mBAAmB,CAAC,CAACD,WAAW,CAAC;EACnC,CAAC,EAAE,CAACA,WAAW,EAAEC,mBAAmB,CAAC,CAAC;EAEtC,oBACEX,KAAA,CAAAiB,aAAA;IAAKH,SAAS,EAAEf,UAAU,CAACK,MAAM,CAACc,WAAW,EAAEJ,SAAS,CAAE;IAACC,KAAK,EAAEA;EAAM,GACrEF,QAAQ,eAETb,KAAA,CAAAiB,aAAA;IACEH,SAAS,EAAEV,MAAM,CAACe,YAAa;IAC/B,gBAAcT,WAAY;IAC1B,gBAAcF;EAAU,gBAExBR,KAAA,CAAAiB,aAAA;IAAOH,SAAS,EAAEV,MAAM,CAACgB;EAAU,gBACjCpB,KAAA,CAAAiB,aAAA,CAACd,QAAQ;IAACkB,OAAO,EAAEX,WAAY;IAACY,eAAe,EAAEN;EAAa,CAAE,CAAC,eACjEhB,KAAA,CAAAiB,aAAA;IAAMH,SAAS,EAAEV,MAAM,CAACmB;EAAc,GAAC,UAAc,CAChD,CAAC,EACPX,aAAa,IAAI,CAACH,KAAK,iBACtBT,KAAA,CAAAiB,aAAA;IAAMH,SAAS,EAAEV,MAAM,CAACoB;EAAM,GAC3BjB,SAAS,CAACkB,cAAc,CAAC,CACtB,CAEL,CAAC,EACLhB,KAAK,iBACJT,KAAA,CAAAiB,aAAA;IAAKH,SAAS,EAAET,YAAY,CAACqB;EAAa,GAAC,2BAEtC,CAEJ,CAAC;AAEV;AAEA,OAAO,MAAMC,gBAAgB,gBAAG1B,IAAI,CAClCK,qBACF,CAAiC","ignoreList":[]}