@osdk/react-components 0.19.0 → 0.20.0-main-dfc4226e9cc74916b8b3999cc6bed259f8649393
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.
- package/CHANGELOG.md +25 -0
- package/build/browser/filter-list/FilterInput.js +7 -0
- package/build/browser/filter-list/FilterInput.js.map +1 -1
- package/build/browser/filter-list/FilterList.js +8 -2
- package/build/browser/filter-list/FilterList.js.map +1 -1
- package/build/browser/filter-list/FilterListApi.js.map +1 -1
- package/build/browser/filter-list/FilterListItemApi.js.map +1 -1
- package/build/browser/filter-list/__tests__/aggregationMocks.js +50 -0
- package/build/browser/filter-list/__tests__/aggregationMocks.js.map +1 -0
- package/build/browser/filter-list/base/BaseFilterList.js.map +1 -1
- package/build/browser/filter-list/base/BaseFilterListApi.js.map +1 -1
- package/build/browser/filter-list/base/FilterInputExcludeRow.js +12 -16
- package/build/browser/filter-list/base/FilterInputExcludeRow.js.map +1 -1
- package/build/browser/filter-list/base/FilterListContent.js +42 -40
- package/build/browser/filter-list/base/FilterListContent.js.map +1 -1
- package/build/browser/filter-list/base/FilterListItem.js +8 -36
- package/build/browser/filter-list/base/FilterListItem.js.map +1 -1
- package/build/browser/filter-list/base/SortableFilterListItem.js +3 -1
- package/build/browser/filter-list/base/SortableFilterListItem.js.map +1 -1
- package/build/browser/filter-list/base/inputs/ListogramInput.js +3 -1
- package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/ListogramInput.module.css +6 -0
- package/build/browser/filter-list/base/inputs/MultiDateInput.js +2 -1
- package/build/browser/filter-list/base/inputs/MultiDateInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js +7 -3
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css +6 -0
- package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css.js +1 -0
- package/build/browser/filter-list/base/inputs/SingleDateInput.js +4 -2
- package/build/browser/filter-list/base/inputs/SingleDateInput.js.map +1 -1
- package/build/browser/filter-list/hooks/useDualScopeAggregation.js +70 -0
- package/build/browser/filter-list/hooks/useDualScopeAggregation.js.map +1 -0
- package/build/browser/filter-list/hooks/useFilterListState.js +35 -17
- package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/browser/filter-list/hooks/useFilterPropertyAggregation.js +37 -0
- package/build/browser/filter-list/hooks/useFilterPropertyAggregation.js.map +1 -0
- package/build/browser/filter-list/hooks/usePropertyAggregation.js +7 -6
- package/build/browser/filter-list/hooks/usePropertyAggregation.js.map +1 -1
- package/build/browser/filter-list/inputs/LinkedPropertyInput.js +45 -22
- package/build/browser/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
- package/build/browser/filter-list/inputs/ListogramFilterInput.js +9 -7
- package/build/browser/filter-list/inputs/ListogramFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/MultiSelectFilterInput.js +8 -6
- package/build/browser/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/PropertyFilterInput.js +10 -1
- package/build/browser/filter-list/inputs/PropertyFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/SingleDateFilterInput.js +4 -2
- package/build/browser/filter-list/inputs/SingleDateFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/SingleSelectFilterInput.js +9 -6
- package/build/browser/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/StaticValuesFilterInput.js.map +1 -1
- package/build/browser/filter-list/types/CustomRendererTypes.js.map +1 -1
- package/build/browser/filter-list/types/KeywordSearchTypes.js.map +1 -1
- package/build/browser/filter-list/types/LinkedFilterTypes.js +42 -1
- package/build/browser/filter-list/types/LinkedFilterTypes.js.map +1 -1
- package/build/browser/filter-list/types/StaticValuesTypes.js.map +1 -1
- package/build/browser/filter-list/utils/filterStateToWhereClause.js +58 -22
- package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -1
- package/build/browser/filter-list/utils/filterValues.js +148 -2
- package/build/browser/filter-list/utils/filterValues.js.map +1 -1
- package/build/browser/filter-list/utils/narrowObjectSet.js +48 -0
- package/build/browser/filter-list/utils/narrowObjectSet.js.map +1 -0
- package/build/browser/public/experimental/filter-list.js +1 -0
- package/build/browser/public/experimental/filter-list.js.map +1 -1
- package/build/browser/styles.css +17 -0
- package/build/browser/tokens/component-tokens/filter-list.css +5 -0
- package/build/browser/util/UserAgent.js +1 -1
- package/build/browser/util/UserAgent.js.map +1 -1
- package/build/cjs/chunk-3JFSJIGK.cjs +11 -0
- package/build/cjs/{chunk-62DGPKOC.cjs.map → chunk-3JFSJIGK.cjs.map} +1 -1
- package/build/cjs/{chunk-FIAYYZHY.cjs → chunk-FDTIKXCC.cjs} +4 -4
- package/build/cjs/{chunk-FIAYYZHY.cjs.map → chunk-FDTIKXCC.cjs.map} +1 -1
- package/build/cjs/{chunk-DKPG7O4B.cjs → chunk-FWBWOVLE.cjs} +4 -4
- package/build/cjs/{chunk-DKPG7O4B.cjs.map → chunk-FWBWOVLE.cjs.map} +1 -1
- package/build/cjs/chunk-HD4KNWOE.cjs +11 -0
- package/build/cjs/{chunk-774FGQHO.cjs.map → chunk-HD4KNWOE.cjs.map} +1 -1
- package/build/cjs/chunk-N7WWFZAR.cjs +11 -0
- package/build/cjs/{chunk-S25XCKOA.cjs.map → chunk-N7WWFZAR.cjs.map} +1 -1
- package/build/cjs/chunk-PLVRLATT.cjs +11 -0
- package/build/cjs/{chunk-SLHKSOQC.cjs.map → chunk-PLVRLATT.cjs.map} +1 -1
- package/build/cjs/{chunk-L6QDNMMG.cjs → chunk-PT65WQ3B.cjs} +4 -4
- package/build/cjs/{chunk-L6QDNMMG.cjs.map → chunk-PT65WQ3B.cjs.map} +1 -1
- package/build/cjs/{chunk-P7R4RWMU.cjs → chunk-QEW4B25T.cjs} +4 -4
- package/build/cjs/{chunk-P7R4RWMU.cjs.map → chunk-QEW4B25T.cjs.map} +1 -1
- package/build/cjs/chunk-RFBKIZXD.cjs +11 -0
- package/build/cjs/{chunk-3Y4W37E3.cjs.map → chunk-RFBKIZXD.cjs.map} +1 -1
- package/build/cjs/{chunk-QOI2FQSL.cjs → chunk-RKOMLESE.cjs} +372 -157
- package/build/cjs/chunk-RKOMLESE.cjs.map +1 -0
- package/build/cjs/{chunk-BXCHISUQ.cjs → chunk-UBPRZEAH.cjs} +3 -3
- package/build/cjs/chunk-UBPRZEAH.cjs.map +1 -0
- package/build/cjs/{chunk-6XRF4IAL.cjs → chunk-VVX3EC6Y.cjs} +4 -4
- package/build/cjs/{chunk-6XRF4IAL.cjs.map → chunk-VVX3EC6Y.cjs.map} +1 -1
- package/build/cjs/{chunk-3OUALM3K.cjs → chunk-XHEOL2WO.cjs} +4 -4
- package/build/cjs/{chunk-3OUALM3K.cjs.map → chunk-XHEOL2WO.cjs.map} +1 -1
- package/build/cjs/public/experimental/action-form.cjs +4 -4
- package/build/cjs/public/experimental/document-viewer.cjs +4 -4
- package/build/cjs/public/experimental/email-viewer.cjs +3 -3
- package/build/cjs/public/experimental/excel-viewer.cjs +3 -3
- package/build/cjs/public/experimental/filter-list.cjs +17 -13
- package/build/cjs/public/experimental/filter-list.css +8 -0
- package/build/cjs/public/experimental/filter-list.css.map +1 -1
- package/build/cjs/public/experimental/filter-list.d.cts +95 -25
- package/build/cjs/public/experimental/image-viewer.cjs +3 -3
- package/build/cjs/public/experimental/markdown-renderer.cjs +3 -3
- package/build/cjs/public/experimental/object-table.cjs +8 -8
- package/build/cjs/public/experimental/pdf-viewer.cjs +7 -7
- package/build/cjs/public/experimental/tiff-renderer.cjs +3 -3
- package/build/cjs/public/experimental/video-viewer.cjs +3 -3
- package/build/cjs/public/experimental/xml-viewer.cjs +3 -3
- package/build/cjs/public/experimental.cjs +50 -46
- package/build/cjs/public/experimental.css +8 -0
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/experimental.d.cts +1 -1
- package/build/esm/filter-list/FilterInput.js +7 -0
- package/build/esm/filter-list/FilterInput.js.map +1 -1
- package/build/esm/filter-list/FilterList.js +8 -2
- package/build/esm/filter-list/FilterList.js.map +1 -1
- package/build/esm/filter-list/FilterListApi.js.map +1 -1
- package/build/esm/filter-list/FilterListItemApi.js.map +1 -1
- package/build/esm/filter-list/__tests__/aggregationMocks.js +50 -0
- package/build/esm/filter-list/__tests__/aggregationMocks.js.map +1 -0
- package/build/esm/filter-list/base/BaseFilterList.js.map +1 -1
- package/build/esm/filter-list/base/BaseFilterListApi.js.map +1 -1
- package/build/esm/filter-list/base/FilterInputExcludeRow.js +12 -16
- package/build/esm/filter-list/base/FilterInputExcludeRow.js.map +1 -1
- package/build/esm/filter-list/base/FilterListContent.js +42 -40
- package/build/esm/filter-list/base/FilterListContent.js.map +1 -1
- package/build/esm/filter-list/base/FilterListItem.js +8 -36
- package/build/esm/filter-list/base/FilterListItem.js.map +1 -1
- package/build/esm/filter-list/base/SortableFilterListItem.js +3 -1
- package/build/esm/filter-list/base/SortableFilterListItem.js.map +1 -1
- package/build/esm/filter-list/base/inputs/ListogramInput.js +3 -1
- package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/ListogramInput.module.css +6 -0
- package/build/esm/filter-list/base/inputs/MultiDateInput.js +2 -1
- package/build/esm/filter-list/base/inputs/MultiDateInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js +7 -3
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/MultiSelectInput.module.css +6 -0
- package/build/esm/filter-list/base/inputs/SingleDateInput.js +4 -2
- package/build/esm/filter-list/base/inputs/SingleDateInput.js.map +1 -1
- package/build/esm/filter-list/hooks/useDualScopeAggregation.js +70 -0
- package/build/esm/filter-list/hooks/useDualScopeAggregation.js.map +1 -0
- package/build/esm/filter-list/hooks/useFilterListState.js +35 -17
- package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/esm/filter-list/hooks/useFilterPropertyAggregation.js +37 -0
- package/build/esm/filter-list/hooks/useFilterPropertyAggregation.js.map +1 -0
- package/build/esm/filter-list/hooks/usePropertyAggregation.js +7 -6
- package/build/esm/filter-list/hooks/usePropertyAggregation.js.map +1 -1
- package/build/esm/filter-list/inputs/LinkedPropertyInput.js +45 -22
- package/build/esm/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
- package/build/esm/filter-list/inputs/ListogramFilterInput.js +9 -7
- package/build/esm/filter-list/inputs/ListogramFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/MultiSelectFilterInput.js +8 -6
- package/build/esm/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/PropertyFilterInput.js +10 -1
- package/build/esm/filter-list/inputs/PropertyFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/SingleDateFilterInput.js +4 -2
- package/build/esm/filter-list/inputs/SingleDateFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/SingleSelectFilterInput.js +9 -6
- package/build/esm/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/StaticValuesFilterInput.js.map +1 -1
- package/build/esm/filter-list/types/CustomRendererTypes.js.map +1 -1
- package/build/esm/filter-list/types/KeywordSearchTypes.js.map +1 -1
- package/build/esm/filter-list/types/LinkedFilterTypes.js +42 -1
- package/build/esm/filter-list/types/LinkedFilterTypes.js.map +1 -1
- package/build/esm/filter-list/types/StaticValuesTypes.js.map +1 -1
- package/build/esm/filter-list/utils/filterStateToWhereClause.js +58 -22
- package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -1
- package/build/esm/filter-list/utils/filterValues.js +148 -2
- package/build/esm/filter-list/utils/filterValues.js.map +1 -1
- package/build/esm/filter-list/utils/narrowObjectSet.js +48 -0
- package/build/esm/filter-list/utils/narrowObjectSet.js.map +1 -0
- package/build/esm/public/experimental/filter-list.js +1 -0
- package/build/esm/public/experimental/filter-list.js.map +1 -1
- package/build/esm/tokens/component-tokens/filter-list.css +5 -0
- package/build/esm/util/UserAgent.js +1 -1
- package/build/esm/util/UserAgent.js.map +1 -1
- package/build/types/filter-list/FilterInput.d.ts +6 -1
- package/build/types/filter-list/FilterInput.d.ts.map +1 -1
- package/build/types/filter-list/FilterList.d.ts.map +1 -1
- package/build/types/filter-list/FilterListApi.d.ts +30 -15
- package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
- package/build/types/filter-list/FilterListItemApi.d.ts +15 -1
- package/build/types/filter-list/FilterListItemApi.d.ts.map +1 -1
- package/build/types/filter-list/__tests__/aggregationMocks.d.ts +11 -0
- package/build/types/filter-list/__tests__/aggregationMocks.d.ts.map +1 -0
- package/build/types/filter-list/base/BaseFilterList.d.ts +2 -1
- package/build/types/filter-list/base/BaseFilterList.d.ts.map +1 -1
- package/build/types/filter-list/base/BaseFilterListApi.d.ts +2 -2
- package/build/types/filter-list/base/BaseFilterListApi.d.ts.map +1 -1
- package/build/types/filter-list/base/FilterInputExcludeRow.d.ts.map +1 -1
- package/build/types/filter-list/base/FilterListContent.d.ts +3 -3
- package/build/types/filter-list/base/FilterListContent.d.ts.map +1 -1
- package/build/types/filter-list/base/FilterListItem.d.ts +2 -1
- package/build/types/filter-list/base/FilterListItem.d.ts.map +1 -1
- package/build/types/filter-list/base/SortableFilterListItem.d.ts +2 -1
- package/build/types/filter-list/base/SortableFilterListItem.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/MultiDateInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/SingleDateInput.d.ts +2 -0
- package/build/types/filter-list/base/inputs/SingleDateInput.d.ts.map +1 -1
- package/build/types/filter-list/hooks/useDualScopeAggregation.d.ts +32 -0
- package/build/types/filter-list/hooks/useDualScopeAggregation.d.ts.map +1 -0
- package/build/types/filter-list/hooks/useFilterListState.d.ts +7 -0
- package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
- package/build/types/filter-list/hooks/useFilterPropertyAggregation.d.ts +13 -0
- package/build/types/filter-list/hooks/useFilterPropertyAggregation.d.ts.map +1 -0
- package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts +6 -4
- package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/ListogramFilterInput.d.ts +4 -1
- package/build/types/filter-list/inputs/ListogramFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts +4 -1
- package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/PropertyFilterInput.d.ts +4 -1
- package/build/types/filter-list/inputs/PropertyFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/SingleDateFilterInput.d.ts +7 -1
- package/build/types/filter-list/inputs/SingleDateFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts +4 -1
- package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/StaticValuesFilterInput.d.ts +1 -1
- package/build/types/filter-list/types/CustomRendererTypes.d.ts +2 -2
- package/build/types/filter-list/types/CustomRendererTypes.d.ts.map +1 -1
- package/build/types/filter-list/types/KeywordSearchTypes.d.ts +2 -2
- package/build/types/filter-list/types/KeywordSearchTypes.d.ts.map +1 -1
- package/build/types/filter-list/types/LinkedFilterTypes.d.ts +34 -4
- package/build/types/filter-list/types/LinkedFilterTypes.d.ts.map +1 -1
- package/build/types/filter-list/types/StaticValuesTypes.d.ts +2 -2
- package/build/types/filter-list/types/StaticValuesTypes.d.ts.map +1 -1
- package/build/types/filter-list/utils/filterStateToWhereClause.d.ts +24 -1
- package/build/types/filter-list/utils/filterStateToWhereClause.d.ts.map +1 -1
- package/build/types/filter-list/utils/filterValues.d.ts +26 -0
- package/build/types/filter-list/utils/filterValues.d.ts.map +1 -1
- package/build/types/filter-list/utils/narrowObjectSet.d.ts +7 -0
- package/build/types/filter-list/utils/narrowObjectSet.d.ts.map +1 -0
- package/build/types/public/experimental/filter-list.d.ts +3 -1
- package/build/types/public/experimental/filter-list.d.ts.map +1 -1
- package/docs/CSSVariables.md +78 -17
- package/docs/FilterList.md +52 -6
- package/package.json +7 -7
- package/build/cjs/chunk-3Y4W37E3.cjs +0 -11
- package/build/cjs/chunk-62DGPKOC.cjs +0 -11
- package/build/cjs/chunk-774FGQHO.cjs +0 -11
- package/build/cjs/chunk-BXCHISUQ.cjs.map +0 -1
- package/build/cjs/chunk-QOI2FQSL.cjs.map +0 -1
- package/build/cjs/chunk-S25XCKOA.cjs +0 -11
- package/build/cjs/chunk-SLHKSOQC.cjs +0 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# @osdk/react-components
|
|
2
2
|
|
|
3
|
+
## 0.20.0-main-dfc4226e9cc74916b8b3999cc6bed259f8649393
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- dfc4226: `FilterList` now supports combining linked-property and direct-property filters via a single objectSet. Pass the unfiltered scope as `objectSet` and the new `onEffectiveObjectSet` observer receives the fully-narrowed `ObjectSet` (direct + linked filters applied) on every filter change. Adds optional `LinkedPropertyFilterDefinition.reverseLinkName` (opt-in: set it to make the filter narrow `objectSet` via a pivot round-trip; omit it for UI-only behavior) and `showFilteredOutValues`, which renders count=0 greyed-out rows for values present in the unfiltered scope but absent under an active filter. Filtered-out rows apply symmetrically to both direct-property facets (Listogram, MultiSelect, SingleSelect) and linked-property facets configured with `MULTI_SELECT` / `SINGLE_SELECT` / `LISTOGRAM` sub-components.
|
|
8
|
+
|
|
9
|
+
Existing `filterClause` / `onFilterClauseChanged` props still work and continue to emit a `WhereClause<Q>` covering direct filters (LINKED_PROPERTY narrowing cannot be expressed as a `WhereClause<Q>` and surfaces only through `onEffectiveObjectSet`). Linked filters are composed via the new exported `narrowObjectSet(objectSet, whereClause, linkedFilters)` helper for consumers building their own headless pipelines.
|
|
10
|
+
|
|
11
|
+
Linked-property facets compare against the raw unfiltered `objectSet` when computing filtered-out rows, so a value whose source rows were filtered out by either direct or linked sibling filters still renders as a count=0 row.
|
|
12
|
+
|
|
13
|
+
- 7c1c639: FilterList: extend per-item actions to every filter type and fix linkedProperty exclude toggle.
|
|
14
|
+
|
|
15
|
+
• every filter type that supports excluding renders the `...` toggle for the inline Keep / Exclude row, including linked-property filters (toggle now flips `isExcluding` on the inner wrapped state)
|
|
16
|
+
• new `searchField` flag on `FilterDefinition` hides the header monocle for filters that already have their own inline search (e.g. `MULTI_SELECT`)
|
|
17
|
+
• extracted reusable helpers `toggleIsExcluding`, `clearFilterState`, `filterHasActiveState`, `getEffectiveFilterState`, and `getSelectedCount` from inline component logic into `filterValues.ts`
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- 2c491f4: filter-list: forward formatDate to single-date, multi-date, and timeline inputs so date formatting is consistent across all date-typed filters
|
|
22
|
+
- 7f8e93b: thread `renderValue` through `LinkedPropertyFilter` inputs
|
|
23
|
+
- Updated dependencies [60aff19]
|
|
24
|
+
- @osdk/client@2.23.1-main-dfc4226e9cc74916b8b3999cc6bed259f8649393
|
|
25
|
+
- @osdk/react@2.23.1-main-dfc4226e9cc74916b8b3999cc6bed259f8649393
|
|
26
|
+
- @osdk/api@2.23.1-main-dfc4226e9cc74916b8b3999cc6bed259f8649393
|
|
27
|
+
|
|
3
28
|
## 0.19.0
|
|
4
29
|
|
|
5
30
|
### Minor Changes
|
|
@@ -27,6 +27,8 @@ function FilterInputInner({
|
|
|
27
27
|
filterState,
|
|
28
28
|
onFilterStateChanged,
|
|
29
29
|
whereClause,
|
|
30
|
+
linkedFilters,
|
|
31
|
+
showFilteredOutValues,
|
|
30
32
|
searchQuery,
|
|
31
33
|
excludeRowOpen,
|
|
32
34
|
layout
|
|
@@ -47,6 +49,9 @@ function FilterInputInner({
|
|
|
47
49
|
definition: definition,
|
|
48
50
|
filterState: filterState,
|
|
49
51
|
onFilterStateChanged: onFilterStateChanged,
|
|
52
|
+
whereClause: whereClause,
|
|
53
|
+
linkedFilters: linkedFilters,
|
|
54
|
+
showFilteredOutValues: showFilteredOutValues,
|
|
50
55
|
searchQuery: searchQuery,
|
|
51
56
|
layout: layout
|
|
52
57
|
});
|
|
@@ -80,6 +85,8 @@ function FilterInputInner({
|
|
|
80
85
|
filterState: filterState,
|
|
81
86
|
onFilterStateChanged: onFilterStateChanged,
|
|
82
87
|
whereClause: whereClause,
|
|
88
|
+
linkedFilters: linkedFilters,
|
|
89
|
+
showFilteredOutValues: showFilteredOutValues,
|
|
83
90
|
searchQuery: searchQuery,
|
|
84
91
|
excludeRowOpen: excludeRowOpen,
|
|
85
92
|
layout: layout
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterInput.js","names":["React","memo","useCallback","ContainsTextInput","ToggleInput","LinkedPropertyInput","PropertyFilterInput","StaticValuesFilterInput","FilterInputInner","objectType","objectSet","definition","filterState","onFilterStateChanged","whereClause","searchQuery","excludeRowOpen","layout","type","createElement","HasLinkInput","Fragment","KeywordSearchInput","placeholder","label","renderInput","customFilterState","state","FilterInput","hasLink","handleChange","enabled","onChange","searchTerm","undefined","operator","newSearchTerm","value"],"sources":["FilterInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectSet, ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport React, { memo, useCallback } from \"react\";\nimport { ContainsTextInput } from \"./base/inputs/ContainsTextInput.js\";\nimport type { MultiSelectInputLayout } from \"./base/inputs/MultiSelectInput.js\";\nimport { ToggleInput } from \"./base/inputs/ToggleInput.js\";\nimport type { FilterDefinitionUnion } from \"./FilterListApi.js\";\nimport type { FilterState } from \"./FilterListItemApi.js\";\nimport { LinkedPropertyInput } from \"./inputs/LinkedPropertyInput.js\";\nimport { PropertyFilterInput } from \"./inputs/PropertyFilterInput.js\";\nimport { StaticValuesFilterInput } from \"./inputs/StaticValuesFilterInput.js\";\n\nexport interface FilterInputProps<Q extends ObjectTypeDefinition> {\n objectType: Q;\n objectSet?: ObjectSet<Q>;\n definition: FilterDefinitionUnion<Q>;\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n whereClause: WhereClause<Q>;\n searchQuery?: string;\n excludeRowOpen?: boolean;\n /**\n * Layout for `MULTI_SELECT` filter components. Pass `\"inline\"` when this\n * input renders inside a popover (or any container where chips would feel\n * redundant) so the value list is always visible. Defaults to `\"dropdown\"`,\n * which renders chips + a portaled Combobox popup. Ignored by other\n * filter components.\n */\n layout?: MultiSelectInputLayout;\n}\n\nfunction FilterInputInner<Q extends ObjectTypeDefinition>({\n objectType,\n objectSet,\n definition,\n filterState,\n onFilterStateChanged,\n whereClause,\n searchQuery,\n excludeRowOpen,\n layout,\n}: FilterInputProps<Q>): React.ReactElement {\n switch (definition.type) {\n case \"HAS_LINK\":\n return (\n <HasLinkInput\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n />\n );\n\n case \"LINKED_PROPERTY\": {\n if (objectSet == null) {\n return <></>;\n }\n return (\n <LinkedPropertyInput\n objectSet={objectSet}\n definition={definition}\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n searchQuery={searchQuery}\n layout={layout}\n />\n );\n }\n\n case \"KEYWORD_SEARCH\":\n return (\n <KeywordSearchInput\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n placeholder={definition.label ?? \"Search...\"}\n />\n );\n\n case \"CUSTOM\": {\n if (!definition.renderInput) {\n return (\n <div data-unsupported=\"true\">Custom filter missing renderInput</div>\n );\n }\n const customFilterState = filterState?.type === \"custom\"\n ? filterState\n : definition.filterState;\n return (\n <>\n {definition.renderInput({\n objectType,\n objectSet,\n filterState: customFilterState,\n onFilterStateChanged: (state) => onFilterStateChanged(state),\n })}\n </>\n );\n }\n\n case \"PROPERTY\":\n return (\n <PropertyFilterInput\n objectType={objectType}\n objectSet={objectSet}\n definition={definition}\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n whereClause={whereClause}\n searchQuery={searchQuery}\n excludeRowOpen={excludeRowOpen}\n layout={layout}\n />\n );\n\n case \"STATIC_VALUES\":\n return (\n <StaticValuesFilterInput\n definition={definition}\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n searchQuery={searchQuery}\n excludeRowOpen={excludeRowOpen}\n layout={layout}\n />\n );\n\n default:\n return <div data-unsupported=\"true\">Unsupported filter type</div>;\n }\n}\n\nexport const FilterInput = memo(FilterInputInner) as typeof FilterInputInner;\n\ninterface HasLinkInputProps {\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n}\n\nconst HasLinkInput = memo(function HasLinkInput({\n filterState,\n onFilterStateChanged,\n}: HasLinkInputProps): React.ReactElement {\n const hasLink = filterState?.type === \"hasLink\"\n ? filterState.hasLink\n : false;\n\n const handleChange = useCallback(\n (hasLink: boolean) => {\n onFilterStateChanged({ type: \"hasLink\", hasLink });\n },\n [onFilterStateChanged],\n );\n\n return <ToggleInput enabled={hasLink} onChange={handleChange} />;\n});\n\ninterface KeywordSearchInputProps {\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n placeholder: string;\n}\n\nconst KeywordSearchInput = memo(function KeywordSearchInput({\n filterState,\n onFilterStateChanged,\n placeholder,\n}: KeywordSearchInputProps): React.ReactElement {\n const searchTerm = filterState?.type === \"keywordSearch\"\n ? filterState.searchTerm\n : undefined;\n const operator = filterState?.type === \"keywordSearch\"\n ? filterState.operator\n : \"AND\";\n\n const handleChange = useCallback(\n (newSearchTerm: string | undefined) => {\n onFilterStateChanged({\n type: \"keywordSearch\",\n searchTerm: newSearchTerm ?? \"\",\n operator,\n });\n },\n [onFilterStateChanged, operator],\n );\n\n return (\n <ContainsTextInput\n value={searchTerm}\n onChange={handleChange}\n placeholder={placeholder}\n />\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FilterInput.js","names":["React","memo","useCallback","ContainsTextInput","ToggleInput","LinkedPropertyInput","PropertyFilterInput","StaticValuesFilterInput","FilterInputInner","objectType","objectSet","definition","filterState","onFilterStateChanged","whereClause","linkedFilters","showFilteredOutValues","searchQuery","excludeRowOpen","layout","type","createElement","HasLinkInput","Fragment","KeywordSearchInput","placeholder","label","renderInput","customFilterState","state","FilterInput","hasLink","handleChange","enabled","onChange","searchTerm","undefined","operator","newSearchTerm","value"],"sources":["FilterInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectSet, ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport React, { memo, useCallback } from \"react\";\nimport { ContainsTextInput } from \"./base/inputs/ContainsTextInput.js\";\nimport type { MultiSelectInputLayout } from \"./base/inputs/MultiSelectInput.js\";\nimport { ToggleInput } from \"./base/inputs/ToggleInput.js\";\nimport type { FilterDefinitionUnion } from \"./FilterListApi.js\";\nimport type { FilterState } from \"./FilterListItemApi.js\";\nimport { LinkedPropertyInput } from \"./inputs/LinkedPropertyInput.js\";\nimport { PropertyFilterInput } from \"./inputs/PropertyFilterInput.js\";\nimport { StaticValuesFilterInput } from \"./inputs/StaticValuesFilterInput.js\";\nimport type { LinkedFilter } from \"./types/LinkedFilterTypes.js\";\n\nexport interface FilterInputProps<Q extends ObjectTypeDefinition> {\n objectType: Q;\n objectSet?: ObjectSet<Q>;\n definition: FilterDefinitionUnion<Q>;\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n /** Per-filter excluding-self where clause (direct filters only). */\n whereClause: WhereClause<Q>;\n /** Per-filter excluding-self linked-filter records. */\n linkedFilters?: ReadonlyArray<LinkedFilter<Q>>;\n showFilteredOutValues?: boolean;\n searchQuery?: string;\n excludeRowOpen?: boolean;\n /**\n * Layout for `MULTI_SELECT` filter components. Pass `\"inline\"` when this\n * input renders inside a popover (or any container where chips would feel\n * redundant) so the value list is always visible. Defaults to `\"dropdown\"`,\n * which renders chips + a portaled Combobox popup. Ignored by other\n * filter components.\n */\n layout?: MultiSelectInputLayout;\n}\n\nfunction FilterInputInner<Q extends ObjectTypeDefinition>({\n objectType,\n objectSet,\n definition,\n filterState,\n onFilterStateChanged,\n whereClause,\n linkedFilters,\n showFilteredOutValues,\n searchQuery,\n excludeRowOpen,\n layout,\n}: FilterInputProps<Q>): React.ReactElement {\n switch (definition.type) {\n case \"HAS_LINK\":\n return (\n <HasLinkInput\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n />\n );\n\n case \"LINKED_PROPERTY\": {\n if (objectSet == null) {\n return <></>;\n }\n return (\n <LinkedPropertyInput\n objectSet={objectSet}\n definition={definition}\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n whereClause={whereClause}\n linkedFilters={linkedFilters}\n showFilteredOutValues={showFilteredOutValues}\n searchQuery={searchQuery}\n layout={layout}\n />\n );\n }\n\n case \"KEYWORD_SEARCH\":\n return (\n <KeywordSearchInput\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n placeholder={definition.label ?? \"Search...\"}\n />\n );\n\n case \"CUSTOM\": {\n if (!definition.renderInput) {\n return (\n <div data-unsupported=\"true\">Custom filter missing renderInput</div>\n );\n }\n const customFilterState = filterState?.type === \"custom\"\n ? filterState\n : definition.filterState;\n return (\n <>\n {definition.renderInput({\n objectType,\n objectSet,\n filterState: customFilterState,\n onFilterStateChanged: (state) => onFilterStateChanged(state),\n })}\n </>\n );\n }\n\n case \"PROPERTY\":\n return (\n <PropertyFilterInput\n objectType={objectType}\n objectSet={objectSet}\n definition={definition}\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n whereClause={whereClause}\n linkedFilters={linkedFilters}\n showFilteredOutValues={showFilteredOutValues}\n searchQuery={searchQuery}\n excludeRowOpen={excludeRowOpen}\n layout={layout}\n />\n );\n\n case \"STATIC_VALUES\":\n return (\n <StaticValuesFilterInput\n definition={definition}\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n searchQuery={searchQuery}\n excludeRowOpen={excludeRowOpen}\n layout={layout}\n />\n );\n\n default:\n return <div data-unsupported=\"true\">Unsupported filter type</div>;\n }\n}\n\nexport const FilterInput = memo(FilterInputInner) as typeof FilterInputInner;\n\ninterface HasLinkInputProps {\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n}\n\nconst HasLinkInput = memo(function HasLinkInput({\n filterState,\n onFilterStateChanged,\n}: HasLinkInputProps): React.ReactElement {\n const hasLink = filterState?.type === \"hasLink\"\n ? filterState.hasLink\n : false;\n\n const handleChange = useCallback(\n (hasLink: boolean) => {\n onFilterStateChanged({ type: \"hasLink\", hasLink });\n },\n [onFilterStateChanged],\n );\n\n return <ToggleInput enabled={hasLink} onChange={handleChange} />;\n});\n\ninterface KeywordSearchInputProps {\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n placeholder: string;\n}\n\nconst KeywordSearchInput = memo(function KeywordSearchInput({\n filterState,\n onFilterStateChanged,\n placeholder,\n}: KeywordSearchInputProps): React.ReactElement {\n const searchTerm = filterState?.type === \"keywordSearch\"\n ? filterState.searchTerm\n : undefined;\n const operator = filterState?.type === \"keywordSearch\"\n ? filterState.operator\n : \"AND\";\n\n const handleChange = useCallback(\n (newSearchTerm: string | undefined) => {\n onFilterStateChanged({\n type: \"keywordSearch\",\n searchTerm: newSearchTerm ?? \"\",\n operator,\n });\n },\n [onFilterStateChanged, operator],\n );\n\n return (\n <ContainsTextInput\n value={searchTerm}\n onChange={handleChange}\n placeholder={placeholder}\n />\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -20,8 +20,10 @@ import { BaseFilterList } from "./base/BaseFilterList.js";
|
|
|
20
20
|
import { FilterInput } from "./FilterInput.js";
|
|
21
21
|
import { useFilterListState } from "./hooks/useFilterListState.js";
|
|
22
22
|
import { useFilterVisibility } from "./hooks/useFilterVisibility.js";
|
|
23
|
+
import { EMPTY_LINKED_FILTERS } from "./types/LinkedFilterTypes.js";
|
|
23
24
|
import { getFilterKey } from "./utils/getFilterKey.js";
|
|
24
25
|
import { getFilterLabel } from "./utils/getFilterLabel.js";
|
|
26
|
+
const EMPTY_WHERE = {};
|
|
25
27
|
export function FilterList(props) {
|
|
26
28
|
const {
|
|
27
29
|
objectType,
|
|
@@ -35,6 +37,7 @@ export function FilterList(props) {
|
|
|
35
37
|
showResetButton = false,
|
|
36
38
|
onReset,
|
|
37
39
|
showActiveFilterCount = false,
|
|
40
|
+
showFilteredOutValues = false,
|
|
38
41
|
className,
|
|
39
42
|
enableSorting,
|
|
40
43
|
onFilterAdded,
|
|
@@ -47,6 +50,7 @@ export function FilterList(props) {
|
|
|
47
50
|
setFilterState,
|
|
48
51
|
clearFilterState,
|
|
49
52
|
perFilterWhereClauses,
|
|
53
|
+
perFilterLinkedFilters,
|
|
50
54
|
activeFilterCount,
|
|
51
55
|
reset
|
|
52
56
|
} = useFilterListState(props);
|
|
@@ -130,10 +134,12 @@ export function FilterList(props) {
|
|
|
130
134
|
definition: definition,
|
|
131
135
|
filterState: filterState,
|
|
132
136
|
onFilterStateChanged: onFilterStateChanged,
|
|
133
|
-
whereClause: perFilterWhereClauses.get(filterKey) ??
|
|
137
|
+
whereClause: perFilterWhereClauses.get(filterKey) ?? EMPTY_WHERE,
|
|
138
|
+
linkedFilters: perFilterLinkedFilters.get(filterKey) ?? EMPTY_LINKED_FILTERS,
|
|
139
|
+
showFilteredOutValues: showFilteredOutValues,
|
|
134
140
|
searchQuery: searchQuery,
|
|
135
141
|
excludeRowOpen: excludeRowOpen
|
|
136
|
-
}), [objectType, objectSet, perFilterWhereClauses]);
|
|
142
|
+
}), [objectType, objectSet, perFilterWhereClauses, perFilterLinkedFilters, showFilteredOutValues]);
|
|
137
143
|
return /*#__PURE__*/React.createElement(BaseFilterList, {
|
|
138
144
|
title: title,
|
|
139
145
|
titleIcon: titleIcon,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterList.js","names":["React","useCallback","useMemo","AddFilterPopover","BaseFilterList","FilterInput","useFilterListState","useFilterVisibility","getFilterKey","getFilterLabel","FilterList","props","objectType","objectSet","title","titleIcon","collapsed","onCollapsedChange","filterDefinitions","addFilterMode","showResetButton","onReset","showActiveFilterCount","className","enableSorting","onFilterAdded","onFilterRemoved","onFilterVisibilityChange","renderAddFilterButton","filterStates","setFilterState","clearFilterState","perFilterWhereClauses","activeFilterCount","reset","uncontrolledAddFilterMode","handleVisibilityChange","visibleKeys","hiddenKeys","states","map","key","filterKey","isVisible","visibleDefinitions","managedVisibleDefinitions","hiddenDefinitions","managedHiddenDefinitions","showFilter","hideFilter","reorderVisible","hasVisibilityChanges","resetVisibility","undefined","handleReset","simpleVisibleDefinitions","filter","def","effectiveVisibleDefinitions","handleFilterRemoved","handleFilterShown","handleOrderChange","orderedKeys","hiddenFilterItems","label","effectiveRenderAddFilterButton","length","createElement","onShowFilter","renderTrigger","effectiveOnFilterRemoved","renderInput","definition","filterState","onFilterStateChanged","searchQuery","excludeRowOpen","whereClause","get","onOrderChange"],"sources":["FilterList.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport React, { useCallback, useMemo } from \"react\";\nimport { AddFilterPopover } from \"./base/AddFilterPopover.js\";\nimport { BaseFilterList } from \"./base/BaseFilterList.js\";\nimport type { RenderFilterInput } from \"./base/BaseFilterListApi.js\";\nimport { FilterInput } from \"./FilterInput.js\";\nimport type {\n FilterDefinitionUnion,\n FilterKey,\n FilterListProps,\n} from \"./FilterListApi.js\";\nimport { useFilterListState } from \"./hooks/useFilterListState.js\";\nimport { useFilterVisibility } from \"./hooks/useFilterVisibility.js\";\nimport { getFilterKey } from \"./utils/getFilterKey.js\";\nimport { getFilterLabel } from \"./utils/getFilterLabel.js\";\n\nexport function FilterList<Q extends ObjectTypeDefinition>(\n props: FilterListProps<Q>,\n): React.ReactElement {\n const {\n objectType,\n objectSet,\n title,\n titleIcon,\n collapsed,\n onCollapsedChange,\n filterDefinitions,\n addFilterMode = \"uncontrolled\",\n showResetButton = false,\n onReset,\n showActiveFilterCount = false,\n className,\n enableSorting,\n onFilterAdded,\n onFilterRemoved,\n onFilterVisibilityChange,\n renderAddFilterButton,\n } = props;\n\n const {\n filterStates,\n setFilterState,\n clearFilterState,\n perFilterWhereClauses,\n activeFilterCount,\n reset,\n } = useFilterListState(props);\n\n const uncontrolledAddFilterMode = addFilterMode === \"uncontrolled\";\n\n const handleVisibilityChange = useCallback(\n (visibleKeys: string[], hiddenKeys: string[]) => {\n if (!onFilterVisibilityChange) {\n return;\n }\n const states: Array<{ filterKey: FilterKey<Q>; isVisible: boolean }> = [\n ...visibleKeys.map((key) => ({\n filterKey: key as FilterKey<Q>,\n isVisible: true,\n })),\n ...hiddenKeys.map((key) => ({\n filterKey: key as FilterKey<Q>,\n isVisible: false,\n })),\n ];\n onFilterVisibilityChange(states);\n },\n [onFilterVisibilityChange],\n );\n\n const {\n visibleDefinitions: managedVisibleDefinitions,\n hiddenDefinitions: managedHiddenDefinitions,\n showFilter,\n hideFilter,\n reorderVisible,\n hasVisibilityChanges,\n resetVisibility,\n } = useFilterVisibility(\n filterDefinitions,\n uncontrolledAddFilterMode ? handleVisibilityChange : undefined,\n );\n\n const handleReset = useCallback(() => {\n reset();\n resetVisibility();\n onReset?.();\n }, [reset, resetVisibility, onReset]);\n\n const simpleVisibleDefinitions = useMemo(() => {\n if (filterDefinitions == null) {\n return undefined;\n }\n return filterDefinitions.filter(\n (def: FilterDefinitionUnion<Q>) => def.isVisible !== false,\n );\n }, [filterDefinitions]);\n\n const effectiveVisibleDefinitions = uncontrolledAddFilterMode\n ? managedVisibleDefinitions\n : simpleVisibleDefinitions;\n\n const handleFilterRemoved = useCallback(\n (filterKey: string) => {\n clearFilterState(filterKey);\n if (uncontrolledAddFilterMode) {\n hideFilter(filterKey);\n }\n onFilterRemoved?.(filterKey);\n },\n [clearFilterState, uncontrolledAddFilterMode, hideFilter, onFilterRemoved],\n );\n\n const handleFilterShown = useCallback(\n (filterKey: string) => {\n showFilter(filterKey);\n onFilterAdded?.(filterKey, filterDefinitions ?? []);\n },\n [showFilter, onFilterAdded, filterDefinitions],\n );\n\n const handleOrderChange = useCallback(\n (orderedKeys: string[]) => {\n reorderVisible(orderedKeys);\n },\n [reorderVisible],\n );\n\n const hiddenFilterItems = useMemo(\n () =>\n managedHiddenDefinitions.map((def) => ({\n key: getFilterKey(def),\n label: getFilterLabel(def),\n })),\n [managedHiddenDefinitions],\n );\n\n const effectiveRenderAddFilterButton = useMemo(() => {\n if (uncontrolledAddFilterMode) {\n if (managedHiddenDefinitions.length === 0) {\n return undefined;\n }\n return () => (\n <AddFilterPopover\n hiddenDefinitions={hiddenFilterItems}\n onShowFilter={handleFilterShown}\n renderTrigger={renderAddFilterButton}\n />\n );\n }\n return renderAddFilterButton;\n }, [\n uncontrolledAddFilterMode,\n managedHiddenDefinitions.length,\n hiddenFilterItems,\n handleFilterShown,\n renderAddFilterButton,\n ]);\n\n const effectiveOnFilterRemoved = uncontrolledAddFilterMode\n ? handleFilterRemoved\n : onFilterRemoved;\n\n const renderInput = useCallback<RenderFilterInput<FilterDefinitionUnion<Q>>>(\n (\n {\n definition,\n filterKey,\n filterState,\n onFilterStateChanged,\n searchQuery,\n excludeRowOpen,\n },\n ) => (\n <FilterInput\n objectType={objectType}\n objectSet={objectSet}\n definition={definition}\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n whereClause={perFilterWhereClauses.get(filterKey)\n ?? ({} as WhereClause<Q>)}\n searchQuery={searchQuery}\n excludeRowOpen={excludeRowOpen}\n />\n ),\n [objectType, objectSet, perFilterWhereClauses],\n );\n\n return (\n <BaseFilterList\n title={title}\n titleIcon={titleIcon}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n filterDefinitions={effectiveVisibleDefinitions}\n filterStates={filterStates}\n onFilterStateChanged={setFilterState}\n renderInput={renderInput}\n getFilterKey={getFilterKey}\n getFilterLabel={getFilterLabel}\n activeFilterCount={activeFilterCount}\n onReset={handleReset}\n showResetButton={showResetButton}\n showActiveFilterCount={showActiveFilterCount}\n hasVisibilityChanges={hasVisibilityChanges}\n enableSorting={enableSorting}\n onFilterRemoved={effectiveOnFilterRemoved}\n onOrderChange={handleOrderChange}\n className={className}\n renderAddFilterButton={effectiveRenderAddFilterButton}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FilterList.js","names":["React","useCallback","useMemo","AddFilterPopover","BaseFilterList","FilterInput","useFilterListState","useFilterVisibility","EMPTY_LINKED_FILTERS","getFilterKey","getFilterLabel","EMPTY_WHERE","FilterList","props","objectType","objectSet","title","titleIcon","collapsed","onCollapsedChange","filterDefinitions","addFilterMode","showResetButton","onReset","showActiveFilterCount","showFilteredOutValues","className","enableSorting","onFilterAdded","onFilterRemoved","onFilterVisibilityChange","renderAddFilterButton","filterStates","setFilterState","clearFilterState","perFilterWhereClauses","perFilterLinkedFilters","activeFilterCount","reset","uncontrolledAddFilterMode","handleVisibilityChange","visibleKeys","hiddenKeys","states","map","key","filterKey","isVisible","visibleDefinitions","managedVisibleDefinitions","hiddenDefinitions","managedHiddenDefinitions","showFilter","hideFilter","reorderVisible","hasVisibilityChanges","resetVisibility","undefined","handleReset","simpleVisibleDefinitions","filter","def","effectiveVisibleDefinitions","handleFilterRemoved","handleFilterShown","handleOrderChange","orderedKeys","hiddenFilterItems","label","effectiveRenderAddFilterButton","length","createElement","onShowFilter","renderTrigger","effectiveOnFilterRemoved","renderInput","definition","filterState","onFilterStateChanged","searchQuery","excludeRowOpen","whereClause","get","linkedFilters","onOrderChange"],"sources":["FilterList.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition } from \"@osdk/api\";\nimport React, { useCallback, useMemo } from \"react\";\nimport { AddFilterPopover } from \"./base/AddFilterPopover.js\";\nimport { BaseFilterList } from \"./base/BaseFilterList.js\";\nimport type { RenderFilterInput } from \"./base/BaseFilterListApi.js\";\nimport { FilterInput } from \"./FilterInput.js\";\nimport type {\n FilterDefinitionUnion,\n FilterKey,\n FilterListProps,\n} from \"./FilterListApi.js\";\nimport { useFilterListState } from \"./hooks/useFilterListState.js\";\nimport { useFilterVisibility } from \"./hooks/useFilterVisibility.js\";\nimport { EMPTY_LINKED_FILTERS } from \"./types/LinkedFilterTypes.js\";\nimport { getFilterKey } from \"./utils/getFilterKey.js\";\nimport { getFilterLabel } from \"./utils/getFilterLabel.js\";\n\nconst EMPTY_WHERE = {};\n\nexport function FilterList<Q extends ObjectTypeDefinition>(\n props: FilterListProps<Q>,\n): React.ReactElement {\n const {\n objectType,\n objectSet,\n title,\n titleIcon,\n collapsed,\n onCollapsedChange,\n filterDefinitions,\n addFilterMode = \"uncontrolled\",\n showResetButton = false,\n onReset,\n showActiveFilterCount = false,\n showFilteredOutValues = false,\n className,\n enableSorting,\n onFilterAdded,\n onFilterRemoved,\n onFilterVisibilityChange,\n renderAddFilterButton,\n } = props;\n\n const {\n filterStates,\n setFilterState,\n clearFilterState,\n perFilterWhereClauses,\n perFilterLinkedFilters,\n activeFilterCount,\n reset,\n } = useFilterListState(props);\n\n const uncontrolledAddFilterMode = addFilterMode === \"uncontrolled\";\n\n const handleVisibilityChange = useCallback(\n (visibleKeys: string[], hiddenKeys: string[]) => {\n if (!onFilterVisibilityChange) {\n return;\n }\n const states: Array<{ filterKey: FilterKey<Q>; isVisible: boolean }> = [\n ...visibleKeys.map((key) => ({\n filterKey: key as FilterKey<Q>,\n isVisible: true,\n })),\n ...hiddenKeys.map((key) => ({\n filterKey: key as FilterKey<Q>,\n isVisible: false,\n })),\n ];\n onFilterVisibilityChange(states);\n },\n [onFilterVisibilityChange],\n );\n\n const {\n visibleDefinitions: managedVisibleDefinitions,\n hiddenDefinitions: managedHiddenDefinitions,\n showFilter,\n hideFilter,\n reorderVisible,\n hasVisibilityChanges,\n resetVisibility,\n } = useFilterVisibility(\n filterDefinitions,\n uncontrolledAddFilterMode ? handleVisibilityChange : undefined,\n );\n\n const handleReset = useCallback(() => {\n reset();\n resetVisibility();\n onReset?.();\n }, [reset, resetVisibility, onReset]);\n\n const simpleVisibleDefinitions = useMemo(() => {\n if (filterDefinitions == null) {\n return undefined;\n }\n return filterDefinitions.filter(\n (def: FilterDefinitionUnion<Q>) => def.isVisible !== false,\n );\n }, [filterDefinitions]);\n\n const effectiveVisibleDefinitions = uncontrolledAddFilterMode\n ? managedVisibleDefinitions\n : simpleVisibleDefinitions;\n\n const handleFilterRemoved = useCallback(\n (filterKey: string) => {\n clearFilterState(filterKey);\n if (uncontrolledAddFilterMode) {\n hideFilter(filterKey);\n }\n onFilterRemoved?.(filterKey);\n },\n [clearFilterState, uncontrolledAddFilterMode, hideFilter, onFilterRemoved],\n );\n\n const handleFilterShown = useCallback(\n (filterKey: string) => {\n showFilter(filterKey);\n onFilterAdded?.(filterKey, filterDefinitions ?? []);\n },\n [showFilter, onFilterAdded, filterDefinitions],\n );\n\n const handleOrderChange = useCallback(\n (orderedKeys: string[]) => {\n reorderVisible(orderedKeys);\n },\n [reorderVisible],\n );\n\n const hiddenFilterItems = useMemo(\n () =>\n managedHiddenDefinitions.map((def) => ({\n key: getFilterKey(def),\n label: getFilterLabel(def),\n })),\n [managedHiddenDefinitions],\n );\n\n const effectiveRenderAddFilterButton = useMemo(() => {\n if (uncontrolledAddFilterMode) {\n if (managedHiddenDefinitions.length === 0) {\n return undefined;\n }\n return () => (\n <AddFilterPopover\n hiddenDefinitions={hiddenFilterItems}\n onShowFilter={handleFilterShown}\n renderTrigger={renderAddFilterButton}\n />\n );\n }\n return renderAddFilterButton;\n }, [\n uncontrolledAddFilterMode,\n managedHiddenDefinitions.length,\n hiddenFilterItems,\n handleFilterShown,\n renderAddFilterButton,\n ]);\n\n const effectiveOnFilterRemoved = uncontrolledAddFilterMode\n ? handleFilterRemoved\n : onFilterRemoved;\n\n const renderInput = useCallback<RenderFilterInput<FilterDefinitionUnion<Q>>>(\n (\n {\n definition,\n filterKey,\n filterState,\n onFilterStateChanged,\n searchQuery,\n excludeRowOpen,\n },\n ) => (\n <FilterInput\n objectType={objectType}\n objectSet={objectSet}\n definition={definition}\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n whereClause={perFilterWhereClauses.get(filterKey) ?? EMPTY_WHERE}\n linkedFilters={perFilterLinkedFilters.get(filterKey)\n ?? EMPTY_LINKED_FILTERS}\n showFilteredOutValues={showFilteredOutValues}\n searchQuery={searchQuery}\n excludeRowOpen={excludeRowOpen}\n />\n ),\n [\n objectType,\n objectSet,\n perFilterWhereClauses,\n perFilterLinkedFilters,\n showFilteredOutValues,\n ],\n );\n\n return (\n <BaseFilterList\n title={title}\n titleIcon={titleIcon}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n filterDefinitions={effectiveVisibleDefinitions}\n filterStates={filterStates}\n onFilterStateChanged={setFilterState}\n renderInput={renderInput}\n getFilterKey={getFilterKey}\n getFilterLabel={getFilterLabel}\n activeFilterCount={activeFilterCount}\n onReset={handleReset}\n showResetButton={showResetButton}\n showActiveFilterCount={showActiveFilterCount}\n hasVisibilityChanges={hasVisibilityChanges}\n enableSorting={enableSorting}\n onFilterRemoved={effectiveOnFilterRemoved}\n onOrderChange={handleOrderChange}\n className={className}\n renderAddFilterButton={effectiveRenderAddFilterButton}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterListApi.js","names":[],"sources":["FilterListApi.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n LinkNames,\n ObjectSet,\n ObjectTypeDefinition,\n WhereClause,\n} from \"@osdk/api\";\nimport type React from \"react\";\nimport type { ReactNode } from \"react\";\nimport type {\n FilterState as FilterStateType,\n PropertyFilterDefinition,\n} from \"./FilterListItemApi.js\";\nimport type { CustomFilterDefinition } from \"./types/CustomRendererTypes.js\";\nimport type { KeywordSearchFilterDefinition } from \"./types/KeywordSearchTypes.js\";\nimport type {\n HasLinkFilterDefinition,\n LinkedPropertyFilterDefinition,\n} from \"./types/LinkedFilterTypes.js\";\nimport type { StaticValuesFilterDefinition } from \"./types/StaticValuesTypes.js\";\n\n/**\n * Distributes LinkedPropertyFilterDefinition over each link name individually,\n * so that LinkedQ/LinkedK/LinkedC defaults resolve correctly per link.\n */\ntype DistributeLinkedProperty<\n Q extends ObjectTypeDefinition,\n L extends LinkNames<Q>,\n> = L extends LinkNames<Q> ? LinkedPropertyFilterDefinition<Q, L> : never;\n\n/**\n * Union type of all filter definition types\n */\nexport type FilterDefinitionUnion<Q extends ObjectTypeDefinition> =\n | PropertyFilterDefinition<Q>\n | HasLinkFilterDefinition<Q>\n | DistributeLinkedProperty<Q, LinkNames<Q>>\n | KeywordSearchFilterDefinition<Q>\n | CustomFilterDefinition<Q>\n | StaticValuesFilterDefinition<Q>;\n\n/**\n * Extract the key from a filter definition union\n */\ntype ExtractFilterKey<D> = D extends { key: infer K } ? K\n : D extends { linkName: infer L } ? L\n : never;\n\nexport type FilterKey<Q extends ObjectTypeDefinition> = ExtractFilterKey<\n FilterDefinitionUnion<Q>\n>;\n\n/**\n * Extract the filter state from a filter definition union\n */\ntype ExtractFilterState<D> = D extends { filterState: infer S } ? S : never;\n\nexport type FilterState<Q extends ObjectTypeDefinition> = ExtractFilterState<\n FilterDefinitionUnion<Q>\n>;\n\n/**\n * Map from filter definition objects to their current state.\n * Uses object identity for keys, ensuring stable lookups across reorders.\n */\nexport type FilterStatesMap<Q extends ObjectTypeDefinition> = Map<\n FilterDefinitionUnion<Q>,\n FilterStateType\n>;\n\nexport interface FilterListProps<Q extends ObjectTypeDefinition> {\n /**\n * The object type definition for the objects being filtered.\n * Used for metadata resolution (property types, display names).\n */\n objectType: Q;\n\n /**\n * Optional object set to scope aggregation queries.\n *
|
|
1
|
+
{"version":3,"file":"FilterListApi.js","names":[],"sources":["FilterListApi.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n LinkNames,\n ObjectSet,\n ObjectTypeDefinition,\n WhereClause,\n} from \"@osdk/api\";\nimport type React from \"react\";\nimport type { ReactNode } from \"react\";\nimport type {\n FilterState as FilterStateType,\n PropertyFilterDefinition,\n} from \"./FilterListItemApi.js\";\nimport type { CustomFilterDefinition } from \"./types/CustomRendererTypes.js\";\nimport type { KeywordSearchFilterDefinition } from \"./types/KeywordSearchTypes.js\";\nimport type {\n HasLinkFilterDefinition,\n LinkedPropertyFilterDefinition,\n} from \"./types/LinkedFilterTypes.js\";\nimport type { StaticValuesFilterDefinition } from \"./types/StaticValuesTypes.js\";\n\n/**\n * Distributes LinkedPropertyFilterDefinition over each link name individually,\n * so that LinkedQ/LinkedK/LinkedC defaults resolve correctly per link.\n */\ntype DistributeLinkedProperty<\n Q extends ObjectTypeDefinition,\n L extends LinkNames<Q>,\n> = L extends LinkNames<Q> ? LinkedPropertyFilterDefinition<Q, L> : never;\n\n/**\n * Union type of all filter definition types\n */\nexport type FilterDefinitionUnion<Q extends ObjectTypeDefinition> =\n | PropertyFilterDefinition<Q>\n | HasLinkFilterDefinition<Q>\n | DistributeLinkedProperty<Q, LinkNames<Q>>\n | KeywordSearchFilterDefinition<Q>\n | CustomFilterDefinition<Q>\n | StaticValuesFilterDefinition<Q>;\n\n/**\n * Extract the key from a filter definition union\n */\ntype ExtractFilterKey<D> = D extends { key: infer K } ? K\n : D extends { linkName: infer L } ? L\n : never;\n\nexport type FilterKey<Q extends ObjectTypeDefinition> = ExtractFilterKey<\n FilterDefinitionUnion<Q>\n>;\n\n/**\n * Extract the filter state from a filter definition union\n */\ntype ExtractFilterState<D> = D extends { filterState: infer S } ? S : never;\n\nexport type FilterState<Q extends ObjectTypeDefinition> = ExtractFilterState<\n FilterDefinitionUnion<Q>\n>;\n\n/**\n * Map from filter definition objects to their current state.\n * Uses object identity for keys, ensuring stable lookups across reorders.\n */\nexport type FilterStatesMap<Q extends ObjectTypeDefinition> = Map<\n FilterDefinitionUnion<Q>,\n FilterStateType\n>;\n\nexport interface FilterListProps<Q extends ObjectTypeDefinition> {\n /**\n * The object type definition for the objects being filtered.\n * Used for metadata resolution (property types, display names).\n */\n objectType: Q;\n\n /**\n * Optional object set to scope aggregation queries. When omitted,\n * aggregations run against the full object type.\n */\n objectSet?: ObjectSet<Q>;\n\n /**\n * The current where clause to filter the objectSet.\n * If provided, the filter clause is controlled.\n * LINKED_PROPERTY filters are not included; use `onEffectiveObjectSet`.\n */\n filterClause?: WhereClause<Q>;\n\n /**\n * Called when the filter clause changes.\n * Required in controlled mode.\n *\n * @param newClause The updated filter clause\n */\n onFilterClauseChanged?: (newClause: WhereClause<Q>) => void;\n\n /**\n * Optional title to display in the filter list header\n */\n title?: ReactNode;\n\n /**\n * Optional icon to display next to the title\n */\n titleIcon?: React.ReactNode;\n\n /**\n * The definition for all supported filter items in the list\n * If not supplied, all filterable properties will be available\n */\n filterDefinitions?: Array<FilterDefinitionUnion<Q>>;\n\n /**\n * Called when filter state changes\n *\n * @param definition The filter definition whose state changed\n * @param newState The updated filter state\n */\n onFilterStateChanged?: (\n definition: FilterDefinitionUnion<Q>,\n newState: FilterStateType,\n ) => void;\n\n /**\n * Called with the narrowed `ObjectSet` whenever filters change. Requires\n * `objectSet` to be set.\n *\n * A linked filter only narrows the set when its definition has\n * `reverseLinkName`. Linked filters without it are skipped here; read their\n * state from `onFilterStateChanged` instead.\n */\n onEffectiveObjectSet?: (objectSet: ObjectSet<Q>) => void;\n\n /**\n * When `true`, facets render greyed-out count=0 rows for values present in\n * the unfiltered data but excluded by other active filters.\n * @default false\n */\n showFilteredOutValues?: boolean;\n\n /**\n * Controls how filter visibility (add/remove) is managed.\n *\n * - `\"uncontrolled\"` (default): FilterList manages visibility internally.\n * An \"Add filter\" popover is rendered for filters with `isVisible: false`,\n * and each visible filter shows a remove button.\n * - `\"controlled\"`: The consumer manages which filters are visible via\n * `filterDefinitions`. Filters with `isVisible: false` are excluded from\n * the rendered list.\n *\n * @default \"uncontrolled\"\n */\n addFilterMode?: \"controlled\" | \"uncontrolled\";\n\n /**\n * Called when a filter is added (shown).\n *\n * In uncontrolled mode, this fires when a user selects a hidden filter\n * from the \"Add filter\" popover.\n *\n * @param filterKey The key of the added filter\n * @param newDefinitions The current filter definitions array\n */\n onFilterAdded?: (\n filterKey: FilterKey<Q>,\n newDefinitions: Array<FilterDefinitionUnion<Q>>,\n ) => void;\n\n /**\n * Called when a filter is removed (hidden).\n *\n * In uncontrolled mode, this fires as a notification after the filter\n * is hidden internally.\n *\n * @param filterKey The key of the removed filter\n */\n onFilterRemoved?: (filterKey: FilterKey<Q>) => void;\n\n /**\n * Called when filter visibility or ordering changes, i.e. when filters\n * are reordered, or (in uncontrolled mode) added or\n * removed via the built-in show/remove controls.\n *\n * @param newStates The filters in current display order with their visibility state\n */\n onFilterVisibilityChange?: (\n newStates: Array<{\n filterKey: FilterKey<Q>;\n isVisible: boolean;\n }>,\n ) => void;\n\n /**\n * Enable drag-and-drop reordering of filters.\n * When true, drag handles are rendered and filters can be reordered.\n * Reorder state is managed internally; consumers who need to track order\n * should use controlled filterDefinitions.\n */\n enableSorting?: boolean;\n\n /**\n * Whether the filter list panel is collapsed\n */\n collapsed?: boolean;\n\n /**\n * Called when the collapsed state changes\n */\n onCollapsedChange?: (collapsed: boolean) => void;\n\n /**\n * Initial filter states for hydrating from external storage.\n * These states are merged over definition defaults on mount.\n * Use onFilterStateChanged to persist state changes externally.\n */\n initialFilterStates?: Map<string, FilterStateType>;\n\n /**\n * Show reset filters button in header\n */\n showResetButton?: boolean;\n\n /**\n * Called when reset button is clicked\n */\n onReset?: () => void;\n\n /**\n * Show count of active filters in header\n */\n showActiveFilterCount?: boolean;\n\n /**\n * Additional CSS class name\n */\n className?: string;\n\n /**\n * Custom render function for the \"Add filter\" button.\n *\n * - In uncontrolled mode: customizes the trigger element for the built-in\n * add-filter popover. The popover behavior is handled automatically.\n * - In controlled mode: replaces the entire add-filter button area.\n * The consumer is responsible for all add-filter behavior.\n */\n renderAddFilterButton?: () => React.ReactNode;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterListItemApi.js","names":[],"sources":["FilterListItemApi.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n CompileTimeMetadata,\n ObjectSet,\n ObjectTypeDefinition,\n PropertyKeys,\n WirePropertyTypes,\n} from \"@osdk/api\";\nimport type { ReactNode } from \"react\";\nimport type { CustomFilterState } from \"./types/CustomRendererTypes.js\";\nimport type { KeywordSearchFilterState } from \"./types/KeywordSearchTypes.js\";\nimport type {\n HasLinkFilterState,\n LinkedPropertyFilterState,\n} from \"./types/LinkedFilterTypes.js\";\n\n/**\n * Helper type to extract the property type from an ObjectTypeDefinition given a property key\n */\nexport type PropertyTypeFromKey<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n> = CompileTimeMetadata<Q>[\"properties\"][K][\"type\"];\n\n/**\n * All available filter component types\n */\nexport type FilterComponentType =\n | \"LISTOGRAM\"\n | \"DATE_RANGE\"\n | \"NUMBER_RANGE\"\n | \"TEXT_TAGS\"\n | \"CONTAINS_TEXT\"\n | \"SINGLE_SELECT\"\n | \"MULTI_SELECT\"\n | \"SINGLE_DATE\"\n | \"MULTI_DATE\"\n | \"TIMELINE\"\n | \"TOGGLE\";\n\n/**\n * Gets valid component types for a given property type\n */\nexport type ValidComponentsForPropertyType<P extends WirePropertyTypes> =\n P extends \"boolean\" ? \"LISTOGRAM\" | \"SINGLE_SELECT\" | \"TOGGLE\"\n : P extends \"string\" ?\n | \"LISTOGRAM\"\n | \"TEXT_TAGS\"\n | \"CONTAINS_TEXT\"\n | \"SINGLE_SELECT\"\n | \"MULTI_SELECT\"\n : P extends \"datetime\" | \"timestamp\"\n ? \"DATE_RANGE\" | \"SINGLE_DATE\" | \"MULTI_DATE\" | \"TIMELINE\"\n : P extends\n | \"double\"\n | \"integer\"\n | \"long\"\n | \"float\"\n | \"short\"\n | \"byte\"\n | \"decimal\" ? \"NUMBER_RANGE\" | \"SINGLE_SELECT\" | \"MULTI_SELECT\"\n : never;\n\n/**\n * Union of all possible filter states\n */\nexport type FilterState =\n | ExactMatchFilterState<string | boolean>\n | DateRangeFilterState\n | ContainsTextFilterState\n | NumberRangeFilterState\n | SelectFilterState<string | boolean | number>\n | SelectFilterState<Date>\n | TimelineFilterState\n | ToggleFilterState\n | HasLinkFilterState\n | LinkedPropertyFilterState\n | KeywordSearchFilterState\n | CustomFilterState;\n\n/**\n * Maps component types to their corresponding state types\n */\nexport interface FilterStateByComponentType {\n LISTOGRAM: ExactMatchFilterState<string | boolean>;\n DATE_RANGE: DateRangeFilterState;\n TEXT_TAGS: ExactMatchFilterState<string>;\n CONTAINS_TEXT: ContainsTextFilterState;\n NUMBER_RANGE: NumberRangeFilterState;\n SINGLE_SELECT: SelectFilterState<string | boolean | number>;\n MULTI_SELECT: SelectFilterState<string | boolean | number>;\n SINGLE_DATE: SelectFilterState<Date>;\n MULTI_DATE: SelectFilterState<Date>;\n TIMELINE: TimelineFilterState;\n TOGGLE: ToggleFilterState;\n}\n\n/**\n * All filter state discriminator types\n */\nexport type FilterStateType =\n | \"EXACT_MATCH\"\n | \"DATE_RANGE\"\n | \"NUMBER_RANGE\"\n | \"CONTAINS_TEXT\"\n | \"SELECT\"\n | \"TIMELINE\"\n | \"TOGGLE\"\n | \"hasLink\"\n | \"linkedProperty\"\n | \"keywordSearch\"\n | \"custom\";\n\n/**\n * Base interface for all filter states\n * Contains common properties shared across all filter types\n */\nexport interface BaseFilterState {\n /**\n * The type of filter component\n */\n type: FilterStateType;\n\n /**\n * If true, the objects satisfying the filter are excluded\n * @default false\n */\n isExcluding?: boolean;\n\n /**\n * If true, include objects that have no value\n * @default false\n */\n includeNull?: boolean;\n}\n\nexport interface ExactMatchFilterState<T = string | boolean>\n extends BaseFilterState\n{\n type: \"EXACT_MATCH\";\n values: T[];\n}\n\nexport interface DateRangeFilterState extends BaseFilterState {\n type: \"DATE_RANGE\";\n /**\n * The earliest date the user can select\n */\n minValue?: Date;\n /**\n * The latest date the user can select\n */\n maxValue?: Date;\n}\n\nexport interface ContainsTextFilterState extends BaseFilterState {\n type: \"CONTAINS_TEXT\";\n value?: string;\n}\n\nexport interface NumberRangeFilterState extends BaseFilterState {\n type: \"NUMBER_RANGE\";\n /**\n * Minimum numeric value (inclusive)\n */\n minValue?: number;\n /**\n * Maximum numeric value (inclusive)\n */\n maxValue?: number;\n}\n\n/**\n * Consolidated state type for select-based filters.\n * Used by SINGLE_SELECT, MULTI_SELECT, SINGLE_DATE, and MULTI_DATE.\n */\nexport interface SelectFilterState<T = string | boolean | number | Date>\n extends BaseFilterState\n{\n type: \"SELECT\";\n selectedValues: T[];\n}\n\nexport interface TimelineFilterState extends BaseFilterState {\n type: \"TIMELINE\";\n startDate?: Date;\n endDate?: Date;\n granularity?: \"day\" | \"week\" | \"month\" | \"quarter\" | \"year\";\n}\n\nexport interface ToggleFilterState extends BaseFilterState {\n type: \"TOGGLE\";\n enabled: boolean;\n}\n\n/**\n * Optional date display formatter. Mixed into `PropertyFilterDefinition`\n * only when the property is `datetime` or `timestamp` — see\n * {@link PropertyFilterDateExtras}.\n *\n * `formatDate` overrides the displayed string everywhere the filter\n * surfaces a date: the shared `DateRangePicker` / `DatePicker` idle text,\n * the date-range histogram tooltip and period subtitle, the histogram\n * x-tick labels (when no `formatTickLabel` is provided), the multi-date\n * chip text, and timeline labels. The picker's internal value remains ISO\n * `YYYY-MM-DD` so cross-locale viewers see a consistent input format\n * regardless of `formatDate`.\n *\n * Receives a `Date` in local time. If the property is a UTC ISO string and\n * you want a different timezone, do that conversion inside your callback.\n */\nexport interface DateFormattingProps {\n formatDate?: (date: Date) => string;\n}\n\n/**\n * Conditionally adds `formatDate` to a property filter definition only for\n * `datetime` / `timestamp` properties. For other property types this field\n * is typed as `never` so attempting to set it is a TypeScript error.\n */\nexport type PropertyFilterDateExtras<P extends WirePropertyTypes> = P extends\n \"datetime\" | \"timestamp\" ? DateFormattingProps\n : { formatDate?: never };\n\ninterface PropertyFilterDefinitionBase<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q> = PropertyKeys<Q>,\n C extends ValidComponentsForPropertyType<\n PropertyTypeFromKey<Q, K>\n > = ValidComponentsForPropertyType<PropertyTypeFromKey<Q, K>>,\n> {\n /**\n * Discriminator for filter definition type\n */\n type: \"PROPERTY\";\n\n /**\n * Optional unique identifier for stable keying across filter reorders.\n */\n id?: string;\n\n /**\n * The property key to filter on\n */\n key: K;\n\n /**\n * Display label for the filter\n */\n label?: string;\n\n /**\n * The filter component type to render\n * Must be compatible with the property type derived from the key, see ValidComponentsForPropertyType\n */\n filterComponent: C;\n\n /**\n * The current state of the filter.\n * If provided, the filter is controlled.\n */\n filterState: FilterStateByComponentType[C];\n\n /**\n * Maps filter values to colors for visual differentiation.\n * Used by LISTOGRAM (per-row bar colors).\n */\n colorMap?: Record<string, string>;\n\n /**\n * Configuration for LISTOGRAM display mode.\n * Only applies when filterComponent is \"LISTOGRAM\".\n */\n listogramConfig?: {\n displayMode?: \"full\" | \"count\" | \"minimal\";\n /**\n * Number of items shown before \"View all\" link appears\n * @default 5\n */\n maxVisibleItems?: number;\n };\n\n /**\n * Custom display function for filter values.\n * Replaces the default string display in dropdown items, chips, and listogram rows.\n * When the function returns a string, that string is also used for search matching\n * within filter dropdowns. When it returns a non-string `ReactNode`, search falls\n * back to the raw value.\n */\n renderValue?: (value: string) => ReactNode;\n\n /**\n * Show aggregation counts next to filter option values.\n * Applies to LISTOGRAM, SINGLE_SELECT, and MULTI_SELECT components.\n * @default true for LISTOGRAM and MULTI_SELECT, false for SINGLE_SELECT\n */\n showCount?: boolean;\n\n /**\n * When true, clicking a bar in the histogram replaces the filter range\n * with that bucket's `[min, max]`. Only applies to histogram-rendering\n * filter components (`NUMBER_RANGE` and `DATE_RANGE`); ignored on other\n * component types.\n *\n * Click replaces the current range — clicking a second bar discards the\n * previous selection. Multi-bucket selection / shift+click union is NOT\n * supported in v1.\n *\n * @default false\n */\n clickToFilter?: boolean;\n\n /**\n * Controls whether this filter is rendered.\n * When false, the filter is hidden but its state is preserved.\n * @default true\n */\n isVisible?: boolean;\n}\n\n/**\n * A property filter definition specifies configuration for filtering on a single property\n *\n * The component type C must be compatible with the property type derived from the key.\n * For example, boolean properties can only use LISTOGRAM or SINGLE_SELECT,\n * while string properties can use LISTOGRAM, TEXT_TAGS, CONTAINS_TEXT, SINGLE_SELECT, or MULTI_SELECT.\n *\n * Date and datetime properties may additionally specify `formatDate` — see\n * {@link PropertyFilterDateExtras}.\n */\nexport type PropertyFilterDefinition<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q> = PropertyKeys<Q>,\n C extends ValidComponentsForPropertyType<\n PropertyTypeFromKey<Q, K>\n > = ValidComponentsForPropertyType<PropertyTypeFromKey<Q, K>>,\n> =\n & PropertyFilterDefinitionBase<Q, K, C>\n & PropertyFilterDateExtras<PropertyTypeFromKey<Q, K>>;\n\n/**\n * Props for a single filter list item component.\n * Extends PropertyFilterDefinition with runtime props for rendering.\n */\nexport type FilterListItemProps<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q> = PropertyKeys<Q>,\n C extends ValidComponentsForPropertyType<\n PropertyTypeFromKey<Q, K>\n > = ValidComponentsForPropertyType<PropertyTypeFromKey<Q, K>>,\n> = PropertyFilterDefinition<Q, K, C> & {\n objectSet: ObjectSet<Q>;\n\n /**\n * Called when the state of the filter changes.\n * Required in controlled mode.\n */\n onFilterStateChanged: (state: FilterStateByComponentType[C]) => void;\n\n onFilterRemoved?: (key: PropertyKeys<Q>) => void;\n};\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FilterListItemApi.js","names":[],"sources":["FilterListItemApi.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n CompileTimeMetadata,\n ObjectSet,\n ObjectTypeDefinition,\n PropertyKeys,\n WirePropertyTypes,\n} from \"@osdk/api\";\nimport type { ReactNode } from \"react\";\nimport type { CustomFilterState } from \"./types/CustomRendererTypes.js\";\nimport type { KeywordSearchFilterState } from \"./types/KeywordSearchTypes.js\";\nimport type {\n HasLinkFilterState,\n LinkedPropertyFilterState,\n} from \"./types/LinkedFilterTypes.js\";\n\n/**\n * Helper type to extract the property type from an ObjectTypeDefinition given a property key\n */\nexport type PropertyTypeFromKey<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n> = CompileTimeMetadata<Q>[\"properties\"][K][\"type\"];\n\n/**\n * Common mix-in for filter definitions: opt-out flag for the header search\n * monocle.\n */\nexport interface FilterDefinitionControls {\n /**\n * When `false`, the header monocle (search-values icon) is hidden even for\n * filter components that ordinarily support in-filter search. Useful for\n * `MULTI_SELECT`, which already has its own inline search field.\n *\n * @default true\n */\n searchField?: boolean;\n}\n\n/**\n * All available filter component types\n */\nexport type FilterComponentType =\n | \"LISTOGRAM\"\n | \"DATE_RANGE\"\n | \"NUMBER_RANGE\"\n | \"TEXT_TAGS\"\n | \"CONTAINS_TEXT\"\n | \"SINGLE_SELECT\"\n | \"MULTI_SELECT\"\n | \"SINGLE_DATE\"\n | \"MULTI_DATE\"\n | \"TIMELINE\"\n | \"TOGGLE\";\n\n/**\n * Gets valid component types for a given property type\n */\nexport type ValidComponentsForPropertyType<P extends WirePropertyTypes> =\n P extends \"boolean\" ? \"LISTOGRAM\" | \"SINGLE_SELECT\" | \"TOGGLE\"\n : P extends \"string\" ?\n | \"LISTOGRAM\"\n | \"TEXT_TAGS\"\n | \"CONTAINS_TEXT\"\n | \"SINGLE_SELECT\"\n | \"MULTI_SELECT\"\n : P extends \"datetime\" | \"timestamp\"\n ? \"DATE_RANGE\" | \"SINGLE_DATE\" | \"MULTI_DATE\" | \"TIMELINE\"\n : P extends\n | \"double\"\n | \"integer\"\n | \"long\"\n | \"float\"\n | \"short\"\n | \"byte\"\n | \"decimal\" ? \"NUMBER_RANGE\" | \"SINGLE_SELECT\" | \"MULTI_SELECT\"\n : never;\n\n/**\n * Union of all possible filter states\n */\nexport type FilterState =\n | ExactMatchFilterState<string | boolean>\n | DateRangeFilterState\n | ContainsTextFilterState\n | NumberRangeFilterState\n | SelectFilterState<string | boolean | number>\n | SelectFilterState<Date>\n | TimelineFilterState\n | ToggleFilterState\n | HasLinkFilterState\n | LinkedPropertyFilterState\n | KeywordSearchFilterState\n | CustomFilterState;\n\n/**\n * Maps component types to their corresponding state types\n */\nexport interface FilterStateByComponentType {\n LISTOGRAM: ExactMatchFilterState<string | boolean>;\n DATE_RANGE: DateRangeFilterState;\n TEXT_TAGS: ExactMatchFilterState<string>;\n CONTAINS_TEXT: ContainsTextFilterState;\n NUMBER_RANGE: NumberRangeFilterState;\n SINGLE_SELECT: SelectFilterState<string | boolean | number>;\n MULTI_SELECT: SelectFilterState<string | boolean | number>;\n SINGLE_DATE: SelectFilterState<Date>;\n MULTI_DATE: SelectFilterState<Date>;\n TIMELINE: TimelineFilterState;\n TOGGLE: ToggleFilterState;\n}\n\n/**\n * All filter state discriminator types\n */\nexport type FilterStateType =\n | \"EXACT_MATCH\"\n | \"DATE_RANGE\"\n | \"NUMBER_RANGE\"\n | \"CONTAINS_TEXT\"\n | \"SELECT\"\n | \"TIMELINE\"\n | \"TOGGLE\"\n | \"hasLink\"\n | \"linkedProperty\"\n | \"keywordSearch\"\n | \"custom\";\n\n/**\n * Base interface for all filter states\n * Contains common properties shared across all filter types\n */\nexport interface BaseFilterState {\n /**\n * The type of filter component\n */\n type: FilterStateType;\n\n /**\n * If true, the objects satisfying the filter are excluded\n * @default false\n */\n isExcluding?: boolean;\n\n /**\n * If true, include objects that have no value\n * @default false\n */\n includeNull?: boolean;\n}\n\nexport interface ExactMatchFilterState<T = string | boolean>\n extends BaseFilterState\n{\n type: \"EXACT_MATCH\";\n values: T[];\n}\n\nexport interface DateRangeFilterState extends BaseFilterState {\n type: \"DATE_RANGE\";\n /**\n * The earliest date the user can select\n */\n minValue?: Date;\n /**\n * The latest date the user can select\n */\n maxValue?: Date;\n}\n\nexport interface ContainsTextFilterState extends BaseFilterState {\n type: \"CONTAINS_TEXT\";\n value?: string;\n}\n\nexport interface NumberRangeFilterState extends BaseFilterState {\n type: \"NUMBER_RANGE\";\n /**\n * Minimum numeric value (inclusive)\n */\n minValue?: number;\n /**\n * Maximum numeric value (inclusive)\n */\n maxValue?: number;\n}\n\n/**\n * Consolidated state type for select-based filters.\n * Used by SINGLE_SELECT, MULTI_SELECT, SINGLE_DATE, and MULTI_DATE.\n */\nexport interface SelectFilterState<T = string | boolean | number | Date>\n extends BaseFilterState\n{\n type: \"SELECT\";\n selectedValues: T[];\n}\n\nexport interface TimelineFilterState extends BaseFilterState {\n type: \"TIMELINE\";\n startDate?: Date;\n endDate?: Date;\n granularity?: \"day\" | \"week\" | \"month\" | \"quarter\" | \"year\";\n}\n\nexport interface ToggleFilterState extends BaseFilterState {\n type: \"TOGGLE\";\n enabled: boolean;\n}\n\n/**\n * Optional date display formatter. Mixed into `PropertyFilterDefinition`\n * only when the property is `datetime` or `timestamp` — see\n * {@link PropertyFilterDateExtras}.\n *\n * `formatDate` overrides the displayed string everywhere the filter\n * surfaces a date: the shared `DateRangePicker` / `DatePicker` idle text,\n * the date-range histogram tooltip and period subtitle, the histogram\n * x-tick labels (when no `formatTickLabel` is provided), the multi-date\n * chip text, and timeline labels. The picker's internal value remains ISO\n * `YYYY-MM-DD` so cross-locale viewers see a consistent input format\n * regardless of `formatDate`.\n *\n * Receives a `Date` in local time. If the property is a UTC ISO string and\n * you want a different timezone, do that conversion inside your callback.\n */\nexport interface DateFormattingProps {\n formatDate?: (date: Date) => string;\n}\n\n/**\n * Conditionally adds `formatDate` to a property filter definition only for\n * `datetime` / `timestamp` properties. For other property types this field\n * is typed as `never` so attempting to set it is a TypeScript error.\n */\nexport type PropertyFilterDateExtras<P extends WirePropertyTypes> = P extends\n \"datetime\" | \"timestamp\" ? DateFormattingProps\n : { formatDate?: never };\n\ninterface PropertyFilterDefinitionBase<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q> = PropertyKeys<Q>,\n C extends ValidComponentsForPropertyType<\n PropertyTypeFromKey<Q, K>\n > = ValidComponentsForPropertyType<PropertyTypeFromKey<Q, K>>,\n> extends FilterDefinitionControls {\n /**\n * Discriminator for filter definition type\n */\n type: \"PROPERTY\";\n\n /**\n * Optional unique identifier for stable keying across filter reorders.\n */\n id?: string;\n\n /**\n * The property key to filter on\n */\n key: K;\n\n /**\n * Display label for the filter\n */\n label?: string;\n\n /**\n * The filter component type to render\n * Must be compatible with the property type derived from the key, see ValidComponentsForPropertyType\n */\n filterComponent: C;\n\n /**\n * The current state of the filter.\n * If provided, the filter is controlled.\n */\n filterState: FilterStateByComponentType[C];\n\n /**\n * Maps filter values to colors for visual differentiation.\n * Used by LISTOGRAM (per-row bar colors).\n */\n colorMap?: Record<string, string>;\n\n /**\n * Configuration for LISTOGRAM display mode.\n * Only applies when filterComponent is \"LISTOGRAM\".\n */\n listogramConfig?: {\n displayMode?: \"full\" | \"count\" | \"minimal\";\n /**\n * Number of items shown before \"View all\" link appears\n * @default 5\n */\n maxVisibleItems?: number;\n };\n\n /**\n * Custom display function for filter values.\n * Replaces the default string display in dropdown items, chips, and listogram rows.\n * When the function returns a string, that string is also used for search matching\n * within filter dropdowns. When it returns a non-string `ReactNode`, search falls\n * back to the raw value.\n */\n renderValue?: (value: string) => ReactNode;\n\n /**\n * Show aggregation counts next to filter option values.\n * Applies to LISTOGRAM, SINGLE_SELECT, and MULTI_SELECT components.\n * @default true for LISTOGRAM and MULTI_SELECT, false for SINGLE_SELECT\n */\n showCount?: boolean;\n\n /**\n * When true, clicking a bar in the histogram replaces the filter range\n * with that bucket's `[min, max]`. Only applies to histogram-rendering\n * filter components (`NUMBER_RANGE` and `DATE_RANGE`); ignored on other\n * component types.\n *\n * Click replaces the current range — clicking a second bar discards the\n * previous selection. Multi-bucket selection / shift+click union is NOT\n * supported in v1.\n *\n * @default false\n */\n clickToFilter?: boolean;\n\n /**\n * Controls whether this filter is rendered.\n * When false, the filter is hidden but its state is preserved.\n * @default true\n */\n isVisible?: boolean;\n}\n\n/**\n * A property filter definition specifies configuration for filtering on a single property\n *\n * The component type C must be compatible with the property type derived from the key.\n * For example, boolean properties can only use LISTOGRAM or SINGLE_SELECT,\n * while string properties can use LISTOGRAM, TEXT_TAGS, CONTAINS_TEXT, SINGLE_SELECT, or MULTI_SELECT.\n *\n * Date and datetime properties may additionally specify `formatDate` — see\n * {@link PropertyFilterDateExtras}.\n */\nexport type PropertyFilterDefinition<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q> = PropertyKeys<Q>,\n C extends ValidComponentsForPropertyType<\n PropertyTypeFromKey<Q, K>\n > = ValidComponentsForPropertyType<PropertyTypeFromKey<Q, K>>,\n> =\n & PropertyFilterDefinitionBase<Q, K, C>\n & PropertyFilterDateExtras<PropertyTypeFromKey<Q, K>>;\n\n/**\n * Props for a single filter list item component.\n * Extends PropertyFilterDefinition with runtime props for rendering.\n */\nexport type FilterListItemProps<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q> = PropertyKeys<Q>,\n C extends ValidComponentsForPropertyType<\n PropertyTypeFromKey<Q, K>\n > = ValidComponentsForPropertyType<PropertyTypeFromKey<Q, K>>,\n> = PropertyFilterDefinition<Q, K, C> & {\n objectSet: ObjectSet<Q>;\n\n /**\n * Called when the state of the filter changes.\n * Required in controlled mode.\n */\n onFilterStateChanged: (state: FilterStateByComponentType[C]) => void;\n\n onFilterRemoved?: (key: PropertyKeys<Q>) => void;\n};\n"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { useOsdkAggregation } from "@osdk/react";
|
|
18
|
+
import { vi } from "vitest";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Scripts `useOsdkAggregation` to return per-bucket group data based on the
|
|
22
|
+
* `_kind` tag carried on the call's `objectSet`. Buckets without an entry in
|
|
23
|
+
* `map` resolve to a loading/empty response.
|
|
24
|
+
*/
|
|
25
|
+
export function mockAggregationByObjectSetKind(map) {
|
|
26
|
+
vi.mocked(useOsdkAggregation).mockImplementation((_objType, args) => {
|
|
27
|
+
const kind = args.objectSet?._kind;
|
|
28
|
+
const groups = kind != null ? map[kind] : undefined;
|
|
29
|
+
if (!groups) {
|
|
30
|
+
return {
|
|
31
|
+
data: undefined,
|
|
32
|
+
isLoading: false,
|
|
33
|
+
error: null,
|
|
34
|
+
refetch: vi.fn()
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
data: groups.map(g => ({
|
|
39
|
+
$group: {
|
|
40
|
+
name: g.name
|
|
41
|
+
},
|
|
42
|
+
$count: g.count
|
|
43
|
+
})),
|
|
44
|
+
isLoading: false,
|
|
45
|
+
error: null,
|
|
46
|
+
refetch: vi.fn()
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=aggregationMocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregationMocks.js","names":["useOsdkAggregation","vi","mockAggregationByObjectSetKind","map","mocked","mockImplementation","_objType","args","kind","objectSet","_kind","groups","undefined","data","isLoading","error","refetch","fn","g","$group","name","$count","count"],"sources":["aggregationMocks.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useOsdkAggregation } from \"@osdk/react\";\nimport { vi } from \"vitest\";\n\n/**\n * Scripts `useOsdkAggregation` to return per-bucket group data based on the\n * `_kind` tag carried on the call's `objectSet`. Buckets without an entry in\n * `map` resolve to a loading/empty response.\n */\nexport function mockAggregationByObjectSetKind(map: {\n [kind: string]: Array<{ name: string; count: number }>;\n}): void {\n vi.mocked(useOsdkAggregation).mockImplementation((_objType, args) => {\n const kind = (args as { objectSet?: { _kind?: string } }).objectSet?._kind;\n const groups = kind != null ? map[kind] : undefined;\n if (!groups) {\n return {\n data: undefined,\n isLoading: false,\n error: null,\n refetch: vi.fn(),\n } as unknown as ReturnType<typeof useOsdkAggregation>;\n }\n return {\n data: groups.map((g) => ({ $group: { name: g.name }, $count: g.count })),\n isLoading: false,\n error: null,\n refetch: vi.fn(),\n } as unknown as ReturnType<typeof useOsdkAggregation>;\n });\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,kBAAkB,QAAQ,aAAa;AAChD,SAASC,EAAE,QAAQ,QAAQ;;AAE3B;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,8BAA8BA,CAACC,GAE9C,EAAQ;EACPF,EAAE,CAACG,MAAM,CAACJ,kBAAkB,CAAC,CAACK,kBAAkB,CAAC,CAACC,QAAQ,EAAEC,IAAI,KAAK;IACnE,MAAMC,IAAI,GAAID,IAAI,CAAwCE,SAAS,EAAEC,KAAK;IAC1E,MAAMC,MAAM,GAAGH,IAAI,IAAI,IAAI,GAAGL,GAAG,CAACK,IAAI,CAAC,GAAGI,SAAS;IACnD,IAAI,CAACD,MAAM,EAAE;MACX,OAAO;QACLE,IAAI,EAAED,SAAS;QACfE,SAAS,EAAE,KAAK;QAChBC,KAAK,EAAE,IAAI;QACXC,OAAO,EAAEf,EAAE,CAACgB,EAAE,CAAC;MACjB,CAAC;IACH;IACA,OAAO;MACLJ,IAAI,EAAEF,MAAM,CAACR,GAAG,CAAEe,CAAC,KAAM;QAAEC,MAAM,EAAE;UAAEC,IAAI,EAAEF,CAAC,CAACE;QAAK,CAAC;QAAEC,MAAM,EAAEH,CAAC,CAACI;MAAM,CAAC,CAAC,CAAC;MACxER,SAAS,EAAE,KAAK;MAChBC,KAAK,EAAE,IAAI;MACXC,OAAO,EAAEf,EAAE,CAACgB,EAAE,CAAC;IACjB,CAAC;EACH,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseFilterList.js","names":["Button","classnames","React","useCallback","useState","ExpandIcon","styles","FilterListBoundaryProvider","FilterListContent","FilterListHeader","BaseFilterList","props","title","titleIcon","collapsed","onCollapsedChange","filterDefinitions","filterStates","onFilterStateChanged","renderInput","getFilterKey","getFilterLabel","activeFilterCount","onReset","onFilterAdded","onFilterRemoved","onOrderChange","showResetButton","showActiveFilterCount","hasVisibilityChanges","enableSorting","className","renderAddFilterButton","boundaryElement","setBoundaryElement","handleExpand","isCollapsed","createElement","filterList","filterListCollapsed","expandButton","onClick","collapsedLabel","ref","expandedContent","hiddenContent","value","scrollableContent","addButtonContainer","type","addButton"],"sources":["BaseFilterList.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, { useCallback, useState } from \"react\";\nimport type { BaseFilterListProps } from \"./BaseFilterListApi.js\";\nimport { ExpandIcon } from \"./FilterIcons.js\";\nimport styles from \"./FilterList.module.css\";\nimport { FilterListBoundaryProvider } from \"./FilterListBoundaryContext.js\";\nimport { FilterListContent } from \"./FilterListContent.js\";\nimport { FilterListHeader } from \"./FilterListHeader.js\";\n\nexport function BaseFilterList<D>(\n props: BaseFilterListProps<D>,\n): React.ReactElement {\n const {\n title,\n titleIcon,\n collapsed = false,\n onCollapsedChange,\n filterDefinitions,\n filterStates,\n onFilterStateChanged,\n renderInput,\n getFilterKey,\n getFilterLabel,\n activeFilterCount,\n onReset,\n onFilterAdded,\n onFilterRemoved,\n onOrderChange,\n showResetButton = false,\n showActiveFilterCount = false,\n hasVisibilityChanges,\n enableSorting,\n className,\n renderAddFilterButton,\n } = props;\n\n const [boundaryElement, setBoundaryElement] = useState<HTMLDivElement | null>(\n null,\n );\n\n const showHeader = title || titleIcon || showResetButton\n || showActiveFilterCount || onCollapsedChange;\n\n const showAddButton = renderAddFilterButton != null || onFilterAdded != null;\n\n const handleExpand = useCallback(() => {\n onCollapsedChange?.(false);\n }, [onCollapsedChange]);\n\n const isCollapsed = collapsed && onCollapsedChange != null;\n\n return (\n <div className={classnames(styles.filterList, className)}>\n {isCollapsed && (\n <div\n className={styles.filterListCollapsed}\n data-collapsed=\"true\"\n >\n <Button\n className={styles.expandButton}\n onClick={handleExpand}\n aria-label=\"Expand filters\"\n >\n <ExpandIcon />\n </Button>\n <span className={styles.collapsedLabel}>{title ?? \"Filters\"}</span>\n </div>\n )}\n <div\n ref={setBoundaryElement}\n className={classnames(\n styles.expandedContent,\n isCollapsed && styles.hiddenContent,\n )}\n data-active-count={activeFilterCount}\n >\n <FilterListBoundaryProvider value={boundaryElement}>\n {showHeader && (\n <FilterListHeader\n title={title}\n titleIcon={titleIcon}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n showResetButton={showResetButton}\n onReset={onReset}\n showActiveFilterCount={showActiveFilterCount}\n activeFilterCount={activeFilterCount}\n hasVisibilityChanges={hasVisibilityChanges}\n />\n )}\n\n <div className={styles.scrollableContent}>\n <FilterListContent\n filterDefinitions={filterDefinitions}\n filterStates={filterStates}\n onFilterStateChanged={onFilterStateChanged}\n onFilterRemoved={onFilterRemoved}\n onOrderChange={onOrderChange}\n renderInput={renderInput}\n getFilterKey={getFilterKey}\n getFilterLabel={getFilterLabel}\n enableSorting={enableSorting}\n />\n </div>\n\n {showAddButton && (\n <div className={styles.addButtonContainer}>\n {renderAddFilterButton\n ? renderAddFilterButton()\n : (\n <Button\n type=\"button\"\n className={styles.addButton}\n onClick={onFilterAdded}\n >\n + Add filter\n </Button>\n )}\n </div>\n )}\n </FilterListBoundaryProvider>\n </div>\n </div>\n );\n}\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,WAAW,EAAEC,QAAQ,QAAQ,OAAO;
|
|
1
|
+
{"version":3,"file":"BaseFilterList.js","names":["Button","classnames","React","useCallback","useState","ExpandIcon","styles","FilterListBoundaryProvider","FilterListContent","FilterListHeader","BaseFilterList","props","title","titleIcon","collapsed","onCollapsedChange","filterDefinitions","filterStates","onFilterStateChanged","renderInput","getFilterKey","getFilterLabel","activeFilterCount","onReset","onFilterAdded","onFilterRemoved","onOrderChange","showResetButton","showActiveFilterCount","hasVisibilityChanges","enableSorting","className","renderAddFilterButton","boundaryElement","setBoundaryElement","handleExpand","isCollapsed","createElement","filterList","filterListCollapsed","expandButton","onClick","collapsedLabel","ref","expandedContent","hiddenContent","value","scrollableContent","addButtonContainer","type","addButton"],"sources":["BaseFilterList.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, { useCallback, useState } from \"react\";\nimport type { FilterDefinitionControls } from \"../FilterListItemApi.js\";\nimport type { BaseFilterListProps } from \"./BaseFilterListApi.js\";\nimport { ExpandIcon } from \"./FilterIcons.js\";\nimport styles from \"./FilterList.module.css\";\nimport { FilterListBoundaryProvider } from \"./FilterListBoundaryContext.js\";\nimport { FilterListContent } from \"./FilterListContent.js\";\nimport { FilterListHeader } from \"./FilterListHeader.js\";\n\nexport function BaseFilterList<D extends FilterDefinitionControls>(\n props: BaseFilterListProps<D>,\n): React.ReactElement {\n const {\n title,\n titleIcon,\n collapsed = false,\n onCollapsedChange,\n filterDefinitions,\n filterStates,\n onFilterStateChanged,\n renderInput,\n getFilterKey,\n getFilterLabel,\n activeFilterCount,\n onReset,\n onFilterAdded,\n onFilterRemoved,\n onOrderChange,\n showResetButton = false,\n showActiveFilterCount = false,\n hasVisibilityChanges,\n enableSorting,\n className,\n renderAddFilterButton,\n } = props;\n\n const [boundaryElement, setBoundaryElement] = useState<HTMLDivElement | null>(\n null,\n );\n\n const showHeader = title || titleIcon || showResetButton\n || showActiveFilterCount || onCollapsedChange;\n\n const showAddButton = renderAddFilterButton != null || onFilterAdded != null;\n\n const handleExpand = useCallback(() => {\n onCollapsedChange?.(false);\n }, [onCollapsedChange]);\n\n const isCollapsed = collapsed && onCollapsedChange != null;\n\n return (\n <div className={classnames(styles.filterList, className)}>\n {isCollapsed && (\n <div\n className={styles.filterListCollapsed}\n data-collapsed=\"true\"\n >\n <Button\n className={styles.expandButton}\n onClick={handleExpand}\n aria-label=\"Expand filters\"\n >\n <ExpandIcon />\n </Button>\n <span className={styles.collapsedLabel}>{title ?? \"Filters\"}</span>\n </div>\n )}\n <div\n ref={setBoundaryElement}\n className={classnames(\n styles.expandedContent,\n isCollapsed && styles.hiddenContent,\n )}\n data-active-count={activeFilterCount}\n >\n <FilterListBoundaryProvider value={boundaryElement}>\n {showHeader && (\n <FilterListHeader\n title={title}\n titleIcon={titleIcon}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n showResetButton={showResetButton}\n onReset={onReset}\n showActiveFilterCount={showActiveFilterCount}\n activeFilterCount={activeFilterCount}\n hasVisibilityChanges={hasVisibilityChanges}\n />\n )}\n\n <div className={styles.scrollableContent}>\n <FilterListContent\n filterDefinitions={filterDefinitions}\n filterStates={filterStates}\n onFilterStateChanged={onFilterStateChanged}\n onFilterRemoved={onFilterRemoved}\n onOrderChange={onOrderChange}\n renderInput={renderInput}\n getFilterKey={getFilterKey}\n getFilterLabel={getFilterLabel}\n enableSorting={enableSorting}\n />\n </div>\n\n {showAddButton && (\n <div className={styles.addButtonContainer}>\n {renderAddFilterButton\n ? renderAddFilterButton()\n : (\n <Button\n type=\"button\"\n className={styles.addButton}\n onClick={onFilterAdded}\n >\n + Add filter\n </Button>\n )}\n </div>\n )}\n </FilterListBoundaryProvider>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseFilterListApi.js","names":[],"sources":["BaseFilterListApi.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type React from \"react\";\nimport type {
|
|
1
|
+
{"version":3,"file":"BaseFilterListApi.js","names":[],"sources":["BaseFilterListApi.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type React from \"react\";\nimport type {\n FilterDefinitionControls,\n FilterState,\n} from \"../FilterListItemApi.js\";\n\nexport type RenderFilterInput<D> = (props: {\n definition: D;\n filterKey: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n searchQuery?: string;\n excludeRowOpen?: boolean;\n}) => React.ReactNode;\n\nexport interface BaseFilterListProps<D extends FilterDefinitionControls> {\n filterDefinitions?: Array<D>;\n filterStates: Map<string, FilterState>;\n onFilterStateChanged: (filterKey: string, state: FilterState) => void;\n renderInput: RenderFilterInput<D>;\n getFilterKey: (definition: D) => string;\n getFilterLabel: (definition: D) => string;\n activeFilterCount: number;\n onReset?: () => void;\n onFilterAdded?: () => void;\n onFilterRemoved?: (filterKey: string) => void;\n onOrderChange?: (orderedKeys: string[]) => void;\n\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n title?: React.ReactNode;\n titleIcon?: React.ReactNode;\n showResetButton?: boolean;\n showActiveFilterCount?: boolean;\n hasVisibilityChanges?: boolean;\n enableSorting?: boolean;\n className?: string;\n renderAddFilterButton?: () => React.ReactNode;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -16,16 +16,10 @@
|
|
|
16
16
|
|
|
17
17
|
import { Button } from "@base-ui/react/button";
|
|
18
18
|
import classnames from "classnames";
|
|
19
|
-
import React, { memo, useCallback
|
|
20
|
-
import { supportsExcluding } from "../utils/filterValues.js";
|
|
19
|
+
import React, { memo, useCallback } from "react";
|
|
20
|
+
import { getEffectiveFilterState, getSelectedCount, supportsExcluding, toggleIsExcluding } from "../utils/filterValues.js";
|
|
21
21
|
import { ExcludeDropdown } from "./ExcludeDropdown.js";
|
|
22
22
|
import styles from "./FilterListItem.module.css.js";
|
|
23
|
-
function getSelectedCount(filterState) {
|
|
24
|
-
if (!filterState) return 0;
|
|
25
|
-
if (filterState.type === "EXACT_MATCH") return filterState.values.length;
|
|
26
|
-
if (filterState.type === "SELECT") return filterState.selectedValues.length;
|
|
27
|
-
return 0;
|
|
28
|
-
}
|
|
29
23
|
function FilterInputExcludeRowInner({
|
|
30
24
|
excludeRowOpen,
|
|
31
25
|
filterState,
|
|
@@ -35,16 +29,18 @@ function FilterInputExcludeRowInner({
|
|
|
35
29
|
children
|
|
36
30
|
}) {
|
|
37
31
|
const handleToggleExclude = useCallback(() => {
|
|
38
|
-
if (filterState) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
32
|
+
if (filterState == null) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const next = toggleIsExcluding(filterState);
|
|
36
|
+
if (next != null) {
|
|
37
|
+
onFilterStateChanged(next);
|
|
43
38
|
}
|
|
44
39
|
}, [filterState, onFilterStateChanged]);
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
|
|
40
|
+
const effectiveState = getEffectiveFilterState(filterState);
|
|
41
|
+
const isExcluding = effectiveState?.isExcluding ?? false;
|
|
42
|
+
const selectedCount = getSelectedCount(effectiveState);
|
|
43
|
+
if (!supportsExcluding(effectiveState)) {
|
|
48
44
|
return /*#__PURE__*/React.createElement(React.Fragment, null, children);
|
|
49
45
|
}
|
|
50
46
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterInputExcludeRow.js","names":["Button","classnames","React","memo","useCallback","
|
|
1
|
+
{"version":3,"file":"FilterInputExcludeRow.js","names":["Button","classnames","React","memo","useCallback","getEffectiveFilterState","getSelectedCount","supportsExcluding","toggleIsExcluding","ExcludeDropdown","styles","FilterInputExcludeRowInner","excludeRowOpen","filterState","onFilterStateChanged","totalValueCount","onClearAll","children","handleToggleExclude","next","effectiveState","isExcluding","selectedCount","createElement","Fragment","className","excludeRow","excludeRowVisible","onToggleExclude","excludeCountLabel","title","toLocaleString","clearAllButton","onClick","FilterInputExcludeRow"],"sources":["FilterInputExcludeRow.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 type { FilterState } from \"../FilterListItemApi.js\";\nimport {\n getEffectiveFilterState,\n getSelectedCount,\n supportsExcluding,\n toggleIsExcluding,\n} from \"../utils/filterValues.js\";\nimport { ExcludeDropdown } from \"./ExcludeDropdown.js\";\nimport styles from \"./FilterListItem.module.css\";\n\ninterface FilterInputExcludeRowProps {\n excludeRowOpen?: boolean;\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n totalValueCount?: number;\n onClearAll?: () => void;\n children: React.ReactNode;\n}\n\nfunction FilterInputExcludeRowInner({\n excludeRowOpen,\n filterState,\n onFilterStateChanged,\n totalValueCount,\n onClearAll,\n children,\n}: FilterInputExcludeRowProps): React.ReactElement {\n const handleToggleExclude = useCallback(() => {\n if (filterState == null) {\n return;\n }\n const next = toggleIsExcluding(filterState);\n if (next != null) {\n onFilterStateChanged(next);\n }\n }, [filterState, onFilterStateChanged]);\n\n const effectiveState = getEffectiveFilterState(filterState);\n const isExcluding = effectiveState?.isExcluding ?? false;\n const isOpen = excludeRowOpen ?? false;\n const selectedCount = getSelectedCount(effectiveState);\n\n if (!supportsExcluding(effectiveState)) {\n return <>{children}</>;\n }\n\n return (\n <>\n <div\n data-exclude-row={true}\n className={classnames(styles.excludeRow, {\n [styles.excludeRowVisible]: isOpen,\n })}\n >\n <ExcludeDropdown\n isExcluding={isExcluding}\n onToggleExclude={handleToggleExclude}\n />\n {totalValueCount != null && totalValueCount > 0 && (\n <span\n className={styles.excludeCountLabel}\n title=\"Approximate count of unique values\"\n >\n {selectedCount.toLocaleString()} of{\" \"}\n {totalValueCount.toLocaleString()} values\n </span>\n )}\n {onClearAll && selectedCount > 0 && (\n <Button\n className={styles.clearAllButton}\n onClick={onClearAll}\n >\n Clear all\n </Button>\n )}\n </div>\n {children}\n </>\n );\n}\n\nexport const FilterInputExcludeRow: React.MemoExoticComponent<\n typeof FilterInputExcludeRowInner\n> = memo(FilterInputExcludeRowInner);\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;AAEhD,SACEC,uBAAuB,EACvBC,gBAAgB,EAChBC,iBAAiB,EACjBC,iBAAiB,QACZ,0BAA0B;AACjC,SAASC,eAAe,QAAQ,sBAAsB;AACtD,OAAOC,MAAM,MAAM,6BAA6B;AAWhD,SAASC,0BAA0BA,CAAC;EAClCC,cAAc;EACdC,WAAW;EACXC,oBAAoB;EACpBC,eAAe;EACfC,UAAU;EACVC;AAC0B,CAAC,EAAsB;EACjD,MAAMC,mBAAmB,GAAGd,WAAW,CAAC,MAAM;IAC5C,IAAIS,WAAW,IAAI,IAAI,EAAE;MACvB;IACF;IACA,MAAMM,IAAI,GAAGX,iBAAiB,CAACK,WAAW,CAAC;IAC3C,IAAIM,IAAI,IAAI,IAAI,EAAE;MAChBL,oBAAoB,CAACK,IAAI,CAAC;IAC5B;EACF,CAAC,EAAE,CAACN,WAAW,EAAEC,oBAAoB,CAAC,CAAC;EAEvC,MAAMM,cAAc,GAAGf,uBAAuB,CAACQ,WAAW,CAAC;EAC3D,MAAMQ,WAAW,GAAGD,cAAc,EAAEC,WAAW,IAAI,KAAK;EAExD,MAAMC,aAAa,GAAGhB,gBAAgB,CAACc,cAAc,CAAC;EAEtD,IAAI,CAACb,iBAAiB,CAACa,cAAc,CAAC,EAAE;IACtC,oBAAOlB,KAAA,CAAAqB,aAAA,CAAArB,KAAA,CAAAsB,QAAA,QAAGP,QAAW,CAAC;EACxB;EAEA,oBACEf,KAAA,CAAAqB,aAAA,CAAArB,KAAA,CAAAsB,QAAA,qBACEtB,KAAA,CAAAqB,aAAA;IACE,oBAAkB,IAAK;IACvBE,SAAS,EAAExB,UAAU,CAACS,MAAM,CAACgB,UAAU,EAAE;MACvC,CAAChB,MAAM,CAACiB,iBAAiB,GAZlBf,cAAc,IAAI;IAa3B,CAAC;EAAE,gBAEHV,KAAA,CAAAqB,aAAA,CAACd,eAAe;IACdY,WAAW,EAAEA,WAAY;IACzBO,eAAe,EAAEV;EAAoB,CACtC,CAAC,EACDH,eAAe,IAAI,IAAI,IAAIA,eAAe,GAAG,CAAC,iBAC7Cb,KAAA,CAAAqB,aAAA;IACEE,SAAS,EAAEf,MAAM,CAACmB,iBAAkB;IACpCC,KAAK,EAAC;EAAoC,GAEzCR,aAAa,CAACS,cAAc,CAAC,CAAC,EAAC,KAAG,EAAC,GAAG,EACtChB,eAAe,CAACgB,cAAc,CAAC,CAAC,EAAC,SAC9B,CACP,EACAf,UAAU,IAAIM,aAAa,GAAG,CAAC,iBAC9BpB,KAAA,CAAAqB,aAAA,CAACvB,MAAM;IACLyB,SAAS,EAAEf,MAAM,CAACsB,cAAe;IACjCC,OAAO,EAAEjB;EAAW,GACrB,WAEO,CAEP,CAAC,EACLC,QACD,CAAC;AAEP;AAEA,OAAO,MAAMiB,qBAEZ,gBAAG/B,IAAI,CAACQ,0BAA0B,CAAC","ignoreList":[]}
|