@osdk/react-components 0.2.0-beta.17 → 0.2.0-beta.18
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 +18 -0
- package/README.md +86 -0
- package/build/browser/action-form/ActionForm.js +109 -0
- package/build/browser/action-form/ActionForm.js.map +1 -0
- package/build/browser/action-form/ActionFormApi.js.map +1 -1
- package/build/browser/action-form/BaseForm.js +74 -0
- package/build/browser/action-form/BaseForm.js.map +1 -0
- package/build/browser/action-form/FormFieldApi.js.map +1 -1
- package/build/browser/action-form/fields/FieldBridge.js +45 -0
- package/build/browser/action-form/fields/FieldBridge.js.map +1 -0
- package/build/browser/action-form/fields/FormFieldRenderer.js +68 -0
- package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -0
- package/build/browser/action-form/fields/TextInputField.js +38 -0
- package/build/browser/action-form/fields/TextInputField.js.map +1 -0
- package/build/browser/action-form/utils/coerceFieldValue.js +93 -0
- package/build/browser/action-form/utils/coerceFieldValue.js.map +1 -0
- package/build/browser/action-form/utils/getDefaultFieldComponent.js +56 -0
- package/build/browser/action-form/utils/getDefaultFieldComponent.js.map +1 -0
- package/build/browser/action-form/utils/getDefaultFieldDefinitions.js +33 -0
- package/build/browser/action-form/utils/getDefaultFieldDefinitions.js.map +1 -0
- package/build/browser/filter-list/base/BaseFilterList.js +23 -11
- package/build/browser/filter-list/base/BaseFilterList.js.map +1 -1
- package/build/browser/filter-list/base/FilterIcons.js +48 -13
- package/build/browser/filter-list/base/FilterIcons.js.map +1 -1
- package/build/browser/filter-list/base/FilterList.module.css +57 -13
- package/build/browser/filter-list/base/FilterList.module.css.js +5 -2
- package/build/browser/filter-list/base/FilterListHeader.js +10 -15
- package/build/browser/filter-list/base/FilterListHeader.js.map +1 -1
- package/build/browser/filter-list/base/FilterListHeader.module.css +13 -41
- package/build/browser/filter-list/base/FilterListHeader.module.css.js +1 -4
- package/build/browser/filter-list/hooks/useFilterListState.js +29 -10
- package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/browser/filter-list/utils/assertUnreachable.js +1 -8
- package/build/browser/filter-list/utils/assertUnreachable.js.map +1 -1
- package/build/browser/filter-list/utils/filterStateToWhereClause.js +119 -104
- package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -1
- package/build/browser/object-table/TableHeader.js +4 -1
- package/build/browser/object-table/TableHeader.js.map +1 -1
- package/build/browser/object-table/TableHeader.module.css +2 -1
- package/build/browser/object-table/TableHeader.module.css.js +1 -0
- package/build/browser/shared/assertUnreachable.js +25 -0
- package/build/browser/shared/assertUnreachable.js.map +1 -0
- package/build/browser/shared/typedMemo.js +25 -0
- package/build/browser/shared/typedMemo.js.map +1 -0
- package/build/browser/styles.css +72 -55
- package/build/cjs/public/experimental.cjs +289 -240
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.css +64 -47
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/esm/action-form/ActionForm.js +109 -0
- package/build/esm/action-form/ActionForm.js.map +1 -0
- package/build/esm/action-form/ActionFormApi.js.map +1 -1
- package/build/esm/action-form/BaseForm.js +74 -0
- package/build/esm/action-form/BaseForm.js.map +1 -0
- package/build/esm/action-form/FormFieldApi.js.map +1 -1
- package/build/esm/action-form/fields/FieldBridge.js +45 -0
- package/build/esm/action-form/fields/FieldBridge.js.map +1 -0
- package/build/esm/action-form/fields/FormFieldRenderer.js +68 -0
- package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -0
- package/build/esm/action-form/fields/TextInputField.js +38 -0
- package/build/esm/action-form/fields/TextInputField.js.map +1 -0
- package/build/esm/action-form/utils/coerceFieldValue.js +93 -0
- package/build/esm/action-form/utils/coerceFieldValue.js.map +1 -0
- package/build/esm/action-form/utils/getDefaultFieldComponent.js +56 -0
- package/build/esm/action-form/utils/getDefaultFieldComponent.js.map +1 -0
- package/build/esm/action-form/utils/getDefaultFieldDefinitions.js +33 -0
- package/build/esm/action-form/utils/getDefaultFieldDefinitions.js.map +1 -0
- package/build/esm/filter-list/base/BaseFilterList.js +23 -11
- package/build/esm/filter-list/base/BaseFilterList.js.map +1 -1
- package/build/esm/filter-list/base/FilterIcons.js +48 -13
- package/build/esm/filter-list/base/FilterIcons.js.map +1 -1
- package/build/esm/filter-list/base/FilterList.module.css +57 -13
- package/build/esm/filter-list/base/FilterListHeader.js +10 -15
- package/build/esm/filter-list/base/FilterListHeader.js.map +1 -1
- package/build/esm/filter-list/base/FilterListHeader.module.css +13 -41
- package/build/esm/filter-list/hooks/useFilterListState.js +29 -10
- package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/esm/filter-list/utils/assertUnreachable.js +1 -8
- package/build/esm/filter-list/utils/assertUnreachable.js.map +1 -1
- package/build/esm/filter-list/utils/filterStateToWhereClause.js +119 -104
- package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -1
- package/build/esm/object-table/TableHeader.js +4 -1
- package/build/esm/object-table/TableHeader.js.map +1 -1
- package/build/esm/object-table/TableHeader.module.css +2 -1
- package/build/esm/shared/assertUnreachable.js +25 -0
- package/build/esm/shared/assertUnreachable.js.map +1 -0
- package/build/esm/shared/typedMemo.js +25 -0
- package/build/esm/shared/typedMemo.js.map +1 -0
- package/build/types/action-form/ActionForm.d.ts +4 -0
- package/build/types/action-form/ActionForm.d.ts.map +1 -0
- package/build/types/action-form/ActionFormApi.d.ts +48 -32
- package/build/types/action-form/ActionFormApi.d.ts.map +1 -1
- package/build/types/action-form/BaseForm.d.ts +3 -0
- package/build/types/action-form/BaseForm.d.ts.map +1 -0
- package/build/types/action-form/FormFieldApi.d.ts +58 -18
- package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
- package/build/types/action-form/fields/FieldBridge.d.ts +9 -0
- package/build/types/action-form/fields/FieldBridge.d.ts.map +1 -0
- package/build/types/action-form/fields/FormFieldRenderer.d.ts +8 -0
- package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -0
- package/build/types/action-form/fields/TextInputField.d.ts +3 -0
- package/build/types/action-form/fields/TextInputField.d.ts.map +1 -0
- package/build/types/action-form/utils/coerceFieldValue.d.ts +10 -0
- package/build/types/action-form/utils/coerceFieldValue.d.ts.map +1 -0
- package/build/types/action-form/utils/getDefaultFieldComponent.d.ts +6 -0
- package/build/types/action-form/utils/getDefaultFieldComponent.d.ts.map +1 -0
- package/build/types/action-form/utils/getDefaultFieldDefinitions.d.ts +6 -0
- package/build/types/action-form/utils/getDefaultFieldDefinitions.d.ts.map +1 -0
- package/build/types/filter-list/base/BaseFilterList.d.ts.map +1 -1
- package/build/types/filter-list/base/FilterIcons.d.ts +7 -0
- package/build/types/filter-list/base/FilterIcons.d.ts.map +1 -1
- package/build/types/filter-list/base/FilterListHeader.d.ts.map +1 -1
- package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
- package/build/types/filter-list/utils/assertUnreachable.d.ts +1 -6
- package/build/types/filter-list/utils/assertUnreachable.d.ts.map +1 -1
- package/build/types/filter-list/utils/filterStateToWhereClause.d.ts +5 -1
- package/build/types/filter-list/utils/filterStateToWhereClause.d.ts.map +1 -1
- package/build/types/object-table/TableHeader.d.ts.map +1 -1
- package/build/types/shared/assertUnreachable.d.ts +6 -0
- package/build/types/shared/assertUnreachable.d.ts.map +1 -0
- package/build/types/shared/typedMemo.d.ts +6 -0
- package/build/types/shared/typedMemo.d.ts.map +1 -0
- package/package.json +7 -6
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { useOsdkMetadata } from "@osdk/react";
|
|
17
18
|
import { useCallback, useMemo, useState } from "react";
|
|
18
19
|
import { assertUnreachable } from "../utils/assertUnreachable.js";
|
|
19
20
|
import { buildWhereClause } from "../utils/filterStateToWhereClause.js";
|
|
@@ -76,6 +77,23 @@ export function useFilterListState(props) {
|
|
|
76
77
|
initialFilterStates
|
|
77
78
|
} = props;
|
|
78
79
|
const objectType = objectSet.$objectSetInternals.def;
|
|
80
|
+
const {
|
|
81
|
+
metadata
|
|
82
|
+
} = useOsdkMetadata(objectType);
|
|
83
|
+
const propertyTypes = useMemo(() => {
|
|
84
|
+
const map = new Map();
|
|
85
|
+
if (metadata?.properties) {
|
|
86
|
+
for (const [key, prop] of Object.entries(metadata.properties)) {
|
|
87
|
+
if (typeof prop.type === "string") {
|
|
88
|
+
map.set(key, {
|
|
89
|
+
type: prop.type,
|
|
90
|
+
multiplicity: prop.multiplicity === true
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return map;
|
|
96
|
+
}, [metadata?.properties]);
|
|
79
97
|
const [filterStates, setFilterStates] = useState(() => {
|
|
80
98
|
const states = buildInitialStates(filterDefinitions);
|
|
81
99
|
if (initialFilterStates) {
|
|
@@ -86,22 +104,22 @@ export function useFilterListState(props) {
|
|
|
86
104
|
return states;
|
|
87
105
|
});
|
|
88
106
|
const setFilterState = useCallback((filterKey, state) => {
|
|
89
|
-
let
|
|
107
|
+
let newWhereClause;
|
|
90
108
|
setFilterStates(prev => {
|
|
91
109
|
const next = new Map(prev);
|
|
92
110
|
next.set(filterKey, state);
|
|
93
|
-
|
|
111
|
+
newWhereClause = buildWhereClause(filterDefinitions, next, filterOperator, propertyTypes);
|
|
94
112
|
return next;
|
|
95
113
|
});
|
|
96
|
-
if (
|
|
97
|
-
onFilterClauseChanged?.(
|
|
114
|
+
if (newWhereClause !== undefined) {
|
|
115
|
+
onFilterClauseChanged?.(newWhereClause);
|
|
98
116
|
}
|
|
99
117
|
const definition = filterDefinitions?.find(d => getFilterKey(d) === filterKey);
|
|
100
118
|
if (definition) {
|
|
101
119
|
onFilterStateChanged?.(definition, state);
|
|
102
120
|
}
|
|
103
|
-
}, [filterDefinitions, filterOperator,
|
|
104
|
-
const whereClause = useMemo(() => buildWhereClause(filterDefinitions, filterStates, filterOperator,
|
|
121
|
+
}, [filterDefinitions, filterOperator, propertyTypes, onFilterClauseChanged, onFilterStateChanged]);
|
|
122
|
+
const whereClause = useMemo(() => buildWhereClause(filterDefinitions, filterStates, filterOperator, propertyTypes), [filterDefinitions, filterStates, filterOperator, propertyTypes]);
|
|
105
123
|
const perFilterWhereClauses = useMemo(() => {
|
|
106
124
|
const map = new Map();
|
|
107
125
|
if (!filterDefinitions) {
|
|
@@ -109,10 +127,10 @@ export function useFilterListState(props) {
|
|
|
109
127
|
}
|
|
110
128
|
for (const definition of filterDefinitions) {
|
|
111
129
|
const key = getFilterKey(definition);
|
|
112
|
-
map.set(key, buildWhereClause(filterDefinitions, filterStates, filterOperator,
|
|
130
|
+
map.set(key, buildWhereClause(filterDefinitions, filterStates, filterOperator, propertyTypes, key));
|
|
113
131
|
}
|
|
114
132
|
return map;
|
|
115
|
-
}, [filterDefinitions, filterStates, filterOperator,
|
|
133
|
+
}, [filterDefinitions, filterStates, filterOperator, propertyTypes]);
|
|
116
134
|
const activeFilterCount = useMemo(() => {
|
|
117
135
|
let count = 0;
|
|
118
136
|
for (const state of filterStates.values()) {
|
|
@@ -125,8 +143,9 @@ export function useFilterListState(props) {
|
|
|
125
143
|
const reset = useCallback(() => {
|
|
126
144
|
const initialStates = buildInitialStates(filterDefinitions);
|
|
127
145
|
setFilterStates(initialStates);
|
|
128
|
-
|
|
129
|
-
|
|
146
|
+
const newWhereClause = buildWhereClause(filterDefinitions, initialStates, filterOperator, propertyTypes);
|
|
147
|
+
onFilterClauseChanged?.(newWhereClause);
|
|
148
|
+
}, [filterDefinitions, filterOperator, propertyTypes, onFilterClauseChanged]);
|
|
130
149
|
return useMemo(() => ({
|
|
131
150
|
filterStates,
|
|
132
151
|
setFilterState,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFilterListState.js","names":["useCallback","useMemo","useState","assertUnreachable","buildWhereClause","filterHasActiveState","getFilterKey","buildInitialStates","definitions","states","Map","definition","key","type","state","filterState","set","defaultFilterState","innerState","defaultLinkedFilterState","linkedFilterState","useFilterListState","props","objectSet","filterDefinitions","filterOperator","onFilterStateChanged","onFilterClauseChanged","initialFilterStates","objectType","$objectSetInternals","def","filterStates","setFilterStates","setFilterState","filterKey","computedClause","prev","next","undefined","find","d","whereClause","perFilterWhereClauses","map","activeFilterCount","count","values","reset","initialStates"],"sources":["useFilterListState.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { FilterListProps } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport type { LinkedPropertyFilterState } from \"../types/LinkedFilterTypes.js\";\nimport { assertUnreachable } from \"../utils/assertUnreachable.js\";\nimport { buildWhereClause } from \"../utils/filterStateToWhereClause.js\";\nimport { filterHasActiveState } from \"../utils/filterValues.js\";\nimport { getFilterKey } from \"../utils/getFilterKey.js\";\n\nexport interface UseFilterListStateResult<Q extends ObjectTypeDefinition> {\n filterStates: Map<string, FilterState>;\n setFilterState: (\n filterKey: string,\n state: FilterState,\n ) => void;\n whereClause: WhereClause<Q>;\n perFilterWhereClauses: Map<string, WhereClause<Q>>;\n activeFilterCount: number;\n reset: () => void;\n}\n\n/**\n * Build initial states from filter definitions.\n * Uses string keys derived from getFilterKey() for stable lookups.\n */\nfunction buildInitialStates<Q extends ObjectTypeDefinition>(\n definitions: FilterListProps<Q>[\"filterDefinitions\"],\n): Map<string, FilterState> {\n const states = new Map<string, FilterState>();\n\n if (!definitions) {\n return states;\n }\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n switch (definition.type) {\n case \"PROPERTY\": {\n const state = definition.filterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"HAS_LINK\":\n case \"KEYWORD_SEARCH\":\n case \"CUSTOM\": {\n const state = definition.defaultFilterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"LINKED_PROPERTY\": {\n const innerState = definition.defaultLinkedFilterState;\n if (innerState) {\n const state: LinkedPropertyFilterState = {\n type: \"linkedProperty\",\n linkedFilterState: innerState,\n };\n states.set(key, state);\n }\n break;\n }\n default:\n assertUnreachable(definition);\n }\n }\n\n return states;\n}\n\nexport function useFilterListState<Q extends ObjectTypeDefinition>(\n props: FilterListProps<Q>,\n): UseFilterListStateResult<Q> {\n const {\n objectSet,\n filterDefinitions,\n filterOperator = \"and\",\n onFilterStateChanged,\n onFilterClauseChanged,\n initialFilterStates,\n } = props;\n\n const objectType = objectSet.$objectSetInternals.def;\n\n const [filterStates, setFilterStates] = useState<\n Map<string, FilterState>\n >(() => {\n const states = buildInitialStates(filterDefinitions);\n if (initialFilterStates) {\n for (const [key, state] of initialFilterStates) {\n states.set(key, state);\n }\n }\n return states;\n });\n\n const setFilterState = useCallback(\n (filterKey: string, state: FilterState) => {\n let computedClause: WhereClause<Q> | undefined;\n\n setFilterStates((prev) => {\n const next = new Map(prev);\n next.set(filterKey, state);\n computedClause = buildWhereClause(\n filterDefinitions,\n next,\n filterOperator,\n objectType,\n );\n return next;\n });\n\n if (computedClause !== undefined) {\n onFilterClauseChanged?.(computedClause);\n }\n\n const definition = filterDefinitions?.find(\n (d) => getFilterKey(d) === filterKey,\n );\n if (definition) {\n onFilterStateChanged?.(definition, state);\n }\n },\n [\n filterDefinitions,\n filterOperator,\n objectType,\n onFilterClauseChanged,\n onFilterStateChanged,\n ],\n );\n\n const whereClause = useMemo(\n () =>\n buildWhereClause(\n filterDefinitions,\n filterStates,\n filterOperator,\n objectType,\n ),\n [filterDefinitions, filterStates, filterOperator, objectType],\n );\n\n const perFilterWhereClauses = useMemo(() => {\n const map = new Map<string, WhereClause<Q>>();\n if (!filterDefinitions) {\n return map;\n }\n for (const definition of filterDefinitions) {\n const key = getFilterKey(definition);\n map.set(\n key,\n buildWhereClause(\n filterDefinitions,\n filterStates,\n filterOperator,\n objectType,\n key,\n ),\n );\n }\n return map;\n }, [filterDefinitions, filterStates, filterOperator, objectType]);\n\n const activeFilterCount = useMemo(() => {\n let count = 0;\n for (const state of filterStates.values()) {\n if (filterHasActiveState(state)) {\n count++;\n }\n }\n return count;\n }, [filterStates]);\n\n const reset = useCallback(() => {\n const initialStates = buildInitialStates(filterDefinitions);\n setFilterStates(initialStates);\n onFilterClauseChanged?.(\n buildWhereClause(\n filterDefinitions,\n initialStates,\n filterOperator,\n objectType,\n ),\n );\n }, [filterDefinitions, filterOperator, objectType, onFilterClauseChanged]);\n\n return useMemo(() => ({\n filterStates,\n setFilterState,\n whereClause,\n perFilterWhereClauses,\n activeFilterCount,\n reset,\n }), [\n filterStates,\n setFilterState,\n whereClause,\n perFilterWhereClauses,\n activeFilterCount,\n reset,\n ]);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAItD,SAASC,iBAAiB,QAAQ,+BAA+B;AACjE,SAASC,gBAAgB,QAAQ,sCAAsC;AACvE,SAASC,oBAAoB,QAAQ,0BAA0B;AAC/D,SAASC,YAAY,QAAQ,0BAA0B;AAcvD;AACA;AACA;AACA;AACA,SAASC,kBAAkBA,CACzBC,WAAoD,EAC1B;EAC1B,MAAMC,MAAM,GAAG,IAAIC,GAAG,CAAsB,CAAC;EAE7C,IAAI,CAACF,WAAW,EAAE;IAChB,OAAOC,MAAM;EACf;EAEA,KAAK,MAAME,UAAU,IAAIH,WAAW,EAAE;IACpC,MAAMI,GAAG,GAAGN,YAAY,CAACK,UAAU,CAAC;IACpC,QAAQA,UAAU,CAACE,IAAI;MACrB,KAAK,UAAU;QAAE;UACf,MAAMC,KAAK,GAAGH,UAAU,CAACI,WAAW;UACpC,IAAID,KAAK,EAAE;YACTL,MAAM,CAACO,GAAG,CAACJ,GAAG,EAAEE,KAAK,CAAC;UACxB;UACA;QACF;MACA,KAAK,UAAU;MACf,KAAK,gBAAgB;MACrB,KAAK,QAAQ;QAAE;UACb,MAAMA,KAAK,GAAGH,UAAU,CAACM,kBAAkB;UAC3C,IAAIH,KAAK,EAAE;YACTL,MAAM,CAACO,GAAG,CAACJ,GAAG,EAAEE,KAAK,CAAC;UACxB;UACA;QACF;MACA,KAAK,iBAAiB;QAAE;UACtB,MAAMI,UAAU,GAAGP,UAAU,CAACQ,wBAAwB;UACtD,IAAID,UAAU,EAAE;YAKdT,MAAM,CAACO,GAAG,CAACJ,GAAG,EAJ2B;cACvCC,IAAI,EAAE,gBAAgB;cACtBO,iBAAiB,EAAEF;YACrB,CACqB,CAAC;UACxB;UACA;QACF;MACA;QACEf,iBAAiB,CAACQ,UAAU,CAAC;IACjC;EACF;EAEA,OAAOF,MAAM;AACf;AAEA,OAAO,SAASY,kBAAkBA,CAChCC,KAAyB,EACI;EAC7B,MAAM;IACJC,SAAS;IACTC,iBAAiB;IACjBC,cAAc,GAAG,KAAK;IACtBC,oBAAoB;IACpBC,qBAAqB;IACrBC;EACF,CAAC,GAAGN,KAAK;EAET,MAAMO,UAAU,GAAGN,SAAS,CAACO,mBAAmB,CAACC,GAAG;EAEpD,MAAM,CAACC,YAAY,EAAEC,eAAe,CAAC,GAAG/B,QAAQ,CAE9C,MAAM;IACN,MAAMO,MAAM,GAAGF,kBAAkB,CAACiB,iBAAiB,CAAC;IACpD,IAAII,mBAAmB,EAAE;MACvB,KAAK,MAAM,CAAChB,GAAG,EAAEE,KAAK,CAAC,IAAIc,mBAAmB,EAAE;QAC9CnB,MAAM,CAACO,GAAG,CAACJ,GAAG,EAAEE,KAAK,CAAC;MACxB;IACF;IACA,OAAOL,MAAM;EACf,CAAC,CAAC;EAEF,MAAMyB,cAAc,GAAGlC,WAAW,CAChC,CAACmC,SAAiB,EAAErB,KAAkB,KAAK;IACzC,IAAIsB,cAA0C;IAE9CH,eAAe,CAAEI,IAAI,IAAK;MACxB,MAAMC,IAAI,GAAG,IAAI5B,GAAG,CAAC2B,IAAI,CAAC;MAC1BC,IAAI,CAACtB,GAAG,CAACmB,SAAS,EAAErB,KAAK,CAAC;MAC1BsB,cAAc,GAAGhC,gBAAgB,CAC/BoB,iBAAiB,EACjBc,IAAI,EACJb,cAAc,EACdI,UACF,CAAC;MACD,OAAOS,IAAI;IACb,CAAC,CAAC;IAEF,IAAIF,cAAc,KAAKG,SAAS,EAAE;MAChCZ,qBAAqB,GAAGS,cAAc,CAAC;IACzC;IAEA,MAAMzB,UAAU,GAAGa,iBAAiB,EAAEgB,IAAI,CACvCC,CAAC,IAAKnC,YAAY,CAACmC,CAAC,CAAC,KAAKN,SAC7B,CAAC;IACD,IAAIxB,UAAU,EAAE;MACde,oBAAoB,GAAGf,UAAU,EAAEG,KAAK,CAAC;IAC3C;EACF,CAAC,EACD,CACEU,iBAAiB,EACjBC,cAAc,EACdI,UAAU,EACVF,qBAAqB,EACrBD,oBAAoB,CAExB,CAAC;EAED,MAAMgB,WAAW,GAAGzC,OAAO,CACzB,MACEG,gBAAgB,CACdoB,iBAAiB,EACjBQ,YAAY,EACZP,cAAc,EACdI,UACF,CAAC,EACH,CAACL,iBAAiB,EAAEQ,YAAY,EAAEP,cAAc,EAAEI,UAAU,CAC9D,CAAC;EAED,MAAMc,qBAAqB,GAAG1C,OAAO,CAAC,MAAM;IAC1C,MAAM2C,GAAG,GAAG,IAAIlC,GAAG,CAAyB,CAAC;IAC7C,IAAI,CAACc,iBAAiB,EAAE;MACtB,OAAOoB,GAAG;IACZ;IACA,KAAK,MAAMjC,UAAU,IAAIa,iBAAiB,EAAE;MAC1C,MAAMZ,GAAG,GAAGN,YAAY,CAACK,UAAU,CAAC;MACpCiC,GAAG,CAAC5B,GAAG,CACLJ,GAAG,EACHR,gBAAgB,CACdoB,iBAAiB,EACjBQ,YAAY,EACZP,cAAc,EACdI,UAAU,EACVjB,GACF,CACF,CAAC;IACH;IACA,OAAOgC,GAAG;EACZ,CAAC,EAAE,CAACpB,iBAAiB,EAAEQ,YAAY,EAAEP,cAAc,EAAEI,UAAU,CAAC,CAAC;EAEjE,MAAMgB,iBAAiB,GAAG5C,OAAO,CAAC,MAAM;IACtC,IAAI6C,KAAK,GAAG,CAAC;IACb,KAAK,MAAMhC,KAAK,IAAIkB,YAAY,CAACe,MAAM,CAAC,CAAC,EAAE;MACzC,IAAI1C,oBAAoB,CAACS,KAAK,CAAC,EAAE;QAC/BgC,KAAK,EAAE;MACT;IACF;IACA,OAAOA,KAAK;EACd,CAAC,EAAE,CAACd,YAAY,CAAC,CAAC;EAElB,MAAMgB,KAAK,GAAGhD,WAAW,CAAC,MAAM;IAC9B,MAAMiD,aAAa,GAAG1C,kBAAkB,CAACiB,iBAAiB,CAAC;IAC3DS,eAAe,CAACgB,aAAa,CAAC;IAC9BtB,qBAAqB,GACnBvB,gBAAgB,CACdoB,iBAAiB,EACjByB,aAAa,EACbxB,cAAc,EACdI,UACF,CACF,CAAC;EACH,CAAC,EAAE,CAACL,iBAAiB,EAAEC,cAAc,EAAEI,UAAU,EAAEF,qBAAqB,CAAC,CAAC;EAE1E,OAAO1B,OAAO,CAAC,OAAO;IACpB+B,YAAY;IACZE,cAAc;IACdQ,WAAW;IACXC,qBAAqB;IACrBE,iBAAiB;IACjBG;EACF,CAAC,CAAC,EAAE,CACFhB,YAAY,EACZE,cAAc,EACdQ,WAAW,EACXC,qBAAqB,EACrBE,iBAAiB,EACjBG,KAAK,CACN,CAAC;AACJ","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useFilterListState.js","names":["useOsdkMetadata","useCallback","useMemo","useState","assertUnreachable","buildWhereClause","filterHasActiveState","getFilterKey","buildInitialStates","definitions","states","Map","definition","key","type","state","filterState","set","defaultFilterState","innerState","defaultLinkedFilterState","linkedFilterState","useFilterListState","props","objectSet","filterDefinitions","filterOperator","onFilterStateChanged","onFilterClauseChanged","initialFilterStates","objectType","$objectSetInternals","def","metadata","propertyTypes","map","properties","prop","Object","entries","multiplicity","filterStates","setFilterStates","setFilterState","filterKey","newWhereClause","prev","next","undefined","find","d","whereClause","perFilterWhereClauses","activeFilterCount","count","values","reset","initialStates"],"sources":["useFilterListState.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport { useOsdkMetadata } from \"@osdk/react\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { FilterListProps } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport type { LinkedPropertyFilterState } from \"../types/LinkedFilterTypes.js\";\nimport { assertUnreachable } from \"../utils/assertUnreachable.js\";\nimport {\n buildWhereClause,\n type PropertyTypeInfo,\n} from \"../utils/filterStateToWhereClause.js\";\nimport { filterHasActiveState } from \"../utils/filterValues.js\";\nimport { getFilterKey } from \"../utils/getFilterKey.js\";\n\nexport interface UseFilterListStateResult<Q extends ObjectTypeDefinition> {\n filterStates: Map<string, FilterState>;\n setFilterState: (\n filterKey: string,\n state: FilterState,\n ) => void;\n whereClause: WhereClause<Q>;\n perFilterWhereClauses: Map<string, WhereClause<Q>>;\n activeFilterCount: number;\n reset: () => void;\n}\n\n/**\n * Build initial states from filter definitions.\n * Uses string keys derived from getFilterKey() for stable lookups.\n */\nfunction buildInitialStates<Q extends ObjectTypeDefinition>(\n definitions: FilterListProps<Q>[\"filterDefinitions\"],\n): Map<string, FilterState> {\n const states = new Map<string, FilterState>();\n\n if (!definitions) {\n return states;\n }\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n switch (definition.type) {\n case \"PROPERTY\": {\n const state = definition.filterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"HAS_LINK\":\n case \"KEYWORD_SEARCH\":\n case \"CUSTOM\": {\n const state = definition.defaultFilterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"LINKED_PROPERTY\": {\n const innerState = definition.defaultLinkedFilterState;\n if (innerState) {\n const state: LinkedPropertyFilterState = {\n type: \"linkedProperty\",\n linkedFilterState: innerState,\n };\n states.set(key, state);\n }\n break;\n }\n default:\n assertUnreachable(definition);\n }\n }\n\n return states;\n}\n\nexport function useFilterListState<Q extends ObjectTypeDefinition>(\n props: FilterListProps<Q>,\n): UseFilterListStateResult<Q> {\n const {\n objectSet,\n filterDefinitions,\n filterOperator = \"and\",\n onFilterStateChanged,\n onFilterClauseChanged,\n initialFilterStates,\n } = props;\n\n const objectType = objectSet.$objectSetInternals.def;\n const { metadata } = useOsdkMetadata(objectType);\n\n const propertyTypes = useMemo(() => {\n const map = new Map<string, PropertyTypeInfo>();\n if (metadata?.properties) {\n for (const [key, prop] of Object.entries(metadata.properties)) {\n if (typeof prop.type === \"string\") {\n map.set(key, {\n type: prop.type,\n multiplicity: prop.multiplicity === true,\n });\n }\n }\n }\n return map;\n }, [metadata?.properties]);\n\n const [filterStates, setFilterStates] = useState<\n Map<string, FilterState>\n >(() => {\n const states = buildInitialStates(filterDefinitions);\n if (initialFilterStates) {\n for (const [key, state] of initialFilterStates) {\n states.set(key, state);\n }\n }\n return states;\n });\n\n const setFilterState = useCallback(\n (filterKey: string, state: FilterState) => {\n let newWhereClause: WhereClause<Q> | undefined;\n\n setFilterStates((prev) => {\n const next = new Map(prev);\n next.set(filterKey, state);\n\n newWhereClause = buildWhereClause(\n filterDefinitions,\n next,\n filterOperator,\n propertyTypes,\n );\n\n return next;\n });\n\n if (newWhereClause !== undefined) {\n onFilterClauseChanged?.(newWhereClause);\n }\n const definition = filterDefinitions?.find(\n (d) => getFilterKey(d) === filterKey,\n );\n if (definition) {\n onFilterStateChanged?.(definition, state);\n }\n },\n [\n filterDefinitions,\n filterOperator,\n propertyTypes,\n onFilterClauseChanged,\n onFilterStateChanged,\n ],\n );\n\n const whereClause = useMemo(\n () =>\n buildWhereClause(\n filterDefinitions,\n filterStates,\n filterOperator,\n propertyTypes,\n ),\n [filterDefinitions, filterStates, filterOperator, propertyTypes],\n );\n\n const perFilterWhereClauses = useMemo(() => {\n const map = new Map<string, WhereClause<Q>>();\n if (!filterDefinitions) {\n return map;\n }\n for (const definition of filterDefinitions) {\n const key = getFilterKey(definition);\n map.set(\n key,\n buildWhereClause(\n filterDefinitions,\n filterStates,\n filterOperator,\n propertyTypes,\n key,\n ),\n );\n }\n return map;\n }, [filterDefinitions, filterStates, filterOperator, propertyTypes]);\n\n const activeFilterCount = useMemo(() => {\n let count = 0;\n for (const state of filterStates.values()) {\n if (filterHasActiveState(state)) {\n count++;\n }\n }\n return count;\n }, [filterStates]);\n\n const reset = useCallback(() => {\n const initialStates = buildInitialStates(filterDefinitions);\n setFilterStates(initialStates);\n\n const newWhereClause = buildWhereClause(\n filterDefinitions,\n initialStates,\n filterOperator,\n propertyTypes,\n );\n onFilterClauseChanged?.(newWhereClause);\n }, [filterDefinitions, filterOperator, propertyTypes, onFilterClauseChanged]);\n\n return useMemo(() => ({\n filterStates,\n setFilterState,\n whereClause,\n perFilterWhereClauses,\n activeFilterCount,\n reset,\n }), [\n filterStates,\n setFilterState,\n whereClause,\n perFilterWhereClauses,\n activeFilterCount,\n reset,\n ]);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,12 +14,5 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
* Exhaustive type checking helper.
|
|
19
|
-
* Use in default cases of switch statements to ensure all cases are handled.
|
|
20
|
-
* TypeScript will error if a case is missing.
|
|
21
|
-
*/
|
|
22
|
-
export function assertUnreachable(value) {
|
|
23
|
-
throw new Error(`Unhandled value: ${String(value)}`);
|
|
24
|
-
}
|
|
17
|
+
export { assertUnreachable } from "../../shared/assertUnreachable.js";
|
|
25
18
|
//# sourceMappingURL=assertUnreachable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertUnreachable.js","names":["assertUnreachable"
|
|
1
|
+
{"version":3,"file":"assertUnreachable.js","names":["assertUnreachable"],"sources":["assertUnreachable.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { assertUnreachable } from \"../../shared/assertUnreachable.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,iBAAiB,QAAQ,mCAAmC","ignoreList":[]}
|
|
@@ -14,41 +14,56 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { formatDateForInput } from "../base/inputs/dateUtils.js";
|
|
17
18
|
import { assertUnreachable } from "./assertUnreachable.js";
|
|
18
19
|
import { getFilterKey } from "./getFilterKey.js";
|
|
19
|
-
function
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
20
|
+
function isCompoundFilter(f) {
|
|
21
|
+
return typeof f === "object" && f != null && "__compound" in f;
|
|
22
|
+
}
|
|
23
|
+
const NUMERIC_BOUNDS = {
|
|
24
|
+
byte: {
|
|
25
|
+
min: -128,
|
|
26
|
+
max: 127
|
|
27
|
+
},
|
|
28
|
+
short: {
|
|
29
|
+
min: -32_768,
|
|
30
|
+
max: 32_767
|
|
31
|
+
},
|
|
32
|
+
integer: {
|
|
33
|
+
min: -2_147_483_648,
|
|
34
|
+
max: 2_147_483_647
|
|
35
|
+
},
|
|
36
|
+
long: {
|
|
37
|
+
min: Number.MIN_SAFE_INTEGER,
|
|
38
|
+
max: Number.MAX_SAFE_INTEGER
|
|
31
39
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
};
|
|
41
|
+
function clampToPropertyBounds(value, propertyType) {
|
|
42
|
+
if (propertyType === undefined) {
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
const bounds = NUMERIC_BOUNDS[propertyType];
|
|
46
|
+
if (bounds === undefined) {
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
return Math.max(bounds.min, Math.min(bounds.max, value));
|
|
50
|
+
}
|
|
51
|
+
function formatDateValue(date, propertyType) {
|
|
52
|
+
if (propertyType === "datetime") {
|
|
53
|
+
return formatDateForInput(date);
|
|
54
|
+
}
|
|
55
|
+
return date.toISOString();
|
|
35
56
|
}
|
|
36
|
-
function filterStateToPropertyFilter(state) {
|
|
57
|
+
function filterStateToPropertyFilter(state, propertyType) {
|
|
37
58
|
switch (state.type) {
|
|
38
59
|
case "CONTAINS_TEXT":
|
|
39
60
|
{
|
|
40
61
|
if (!state.value) {
|
|
41
62
|
return undefined;
|
|
42
63
|
}
|
|
43
|
-
|
|
64
|
+
return {
|
|
44
65
|
$containsAnyTerm: state.value
|
|
45
66
|
};
|
|
46
|
-
if (state.isExcluding) {
|
|
47
|
-
return {
|
|
48
|
-
$not: filter
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
return filter;
|
|
52
67
|
}
|
|
53
68
|
case "TOGGLE":
|
|
54
69
|
{
|
|
@@ -59,138 +74,104 @@ function filterStateToPropertyFilter(state) {
|
|
|
59
74
|
const conditions = [];
|
|
60
75
|
if (state.minValue !== undefined) {
|
|
61
76
|
conditions.push({
|
|
62
|
-
$gte: state.minValue
|
|
77
|
+
$gte: formatDateValue(state.minValue, propertyType)
|
|
63
78
|
});
|
|
64
79
|
}
|
|
65
80
|
if (state.maxValue !== undefined) {
|
|
66
81
|
conditions.push({
|
|
67
|
-
$lte: state.maxValue
|
|
82
|
+
$lte: formatDateValue(state.maxValue, propertyType)
|
|
68
83
|
});
|
|
69
84
|
}
|
|
70
85
|
if (conditions.length === 0 && !state.includeNull) {
|
|
71
86
|
return undefined;
|
|
72
87
|
}
|
|
73
|
-
|
|
74
|
-
if (conditions.length === 1) {
|
|
75
|
-
rangeFilter = conditions[0];
|
|
76
|
-
} else if (conditions.length > 1) {
|
|
77
|
-
rangeFilter = {
|
|
78
|
-
$and: conditions
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
if (state.includeNull) {
|
|
82
|
-
if (rangeFilter) {
|
|
83
|
-
return {
|
|
84
|
-
$or: [rangeFilter, {
|
|
85
|
-
$isNull: true
|
|
86
|
-
}]
|
|
87
|
-
};
|
|
88
|
-
}
|
|
88
|
+
if (conditions.length === 0 && state.includeNull) {
|
|
89
89
|
return {
|
|
90
90
|
$isNull: true
|
|
91
91
|
};
|
|
92
92
|
}
|
|
93
|
-
|
|
93
|
+
if (conditions.length === 1 && !state.includeNull) {
|
|
94
|
+
return conditions[0];
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
__compound: true,
|
|
98
|
+
conditions,
|
|
99
|
+
includeNull: state.includeNull ?? false
|
|
100
|
+
};
|
|
94
101
|
}
|
|
95
102
|
case "NUMBER_RANGE":
|
|
96
103
|
{
|
|
97
104
|
const conditions = [];
|
|
98
105
|
if (state.minValue !== undefined) {
|
|
99
106
|
conditions.push({
|
|
100
|
-
$gte: state.minValue
|
|
107
|
+
$gte: clampToPropertyBounds(state.minValue, propertyType)
|
|
101
108
|
});
|
|
102
109
|
}
|
|
103
110
|
if (state.maxValue !== undefined) {
|
|
104
111
|
conditions.push({
|
|
105
|
-
$lte: state.maxValue
|
|
112
|
+
$lte: clampToPropertyBounds(state.maxValue, propertyType)
|
|
106
113
|
});
|
|
107
114
|
}
|
|
108
115
|
if (conditions.length === 0 && !state.includeNull) {
|
|
109
116
|
return undefined;
|
|
110
117
|
}
|
|
111
|
-
|
|
112
|
-
if (conditions.length === 1) {
|
|
113
|
-
rangeFilter = conditions[0];
|
|
114
|
-
} else if (conditions.length > 1) {
|
|
115
|
-
rangeFilter = {
|
|
116
|
-
$and: conditions
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
if (state.includeNull) {
|
|
120
|
-
if (rangeFilter) {
|
|
121
|
-
return {
|
|
122
|
-
$or: [rangeFilter, {
|
|
123
|
-
$isNull: true
|
|
124
|
-
}]
|
|
125
|
-
};
|
|
126
|
-
}
|
|
118
|
+
if (conditions.length === 0 && state.includeNull) {
|
|
127
119
|
return {
|
|
128
120
|
$isNull: true
|
|
129
121
|
};
|
|
130
122
|
}
|
|
131
|
-
|
|
123
|
+
if (conditions.length === 1 && !state.includeNull) {
|
|
124
|
+
return conditions[0];
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
__compound: true,
|
|
128
|
+
conditions,
|
|
129
|
+
includeNull: state.includeNull ?? false
|
|
130
|
+
};
|
|
132
131
|
}
|
|
133
132
|
case "EXACT_MATCH":
|
|
134
133
|
{
|
|
135
134
|
if (state.values.length === 0) {
|
|
136
135
|
return undefined;
|
|
137
136
|
}
|
|
138
|
-
|
|
137
|
+
return state.values.length === 1 ? state.values[0] : {
|
|
139
138
|
$in: state.values
|
|
140
139
|
};
|
|
141
|
-
if (state.isExcluding) {
|
|
142
|
-
return {
|
|
143
|
-
$not: filter
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
return filter;
|
|
147
140
|
}
|
|
148
141
|
case "SELECT":
|
|
149
142
|
{
|
|
150
143
|
if (state.selectedValues.length === 0) {
|
|
151
144
|
return undefined;
|
|
152
145
|
}
|
|
153
|
-
const values = state.selectedValues.map(v => v instanceof Date ? v
|
|
154
|
-
|
|
146
|
+
const values = state.selectedValues.map(v => v instanceof Date ? formatDateValue(v, propertyType) : v);
|
|
147
|
+
return values.length === 1 ? values[0] : {
|
|
155
148
|
$in: values
|
|
156
149
|
};
|
|
157
|
-
if (state.isExcluding) {
|
|
158
|
-
return {
|
|
159
|
-
$not: filter
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
return filter;
|
|
163
150
|
}
|
|
164
151
|
case "TIMELINE":
|
|
165
152
|
{
|
|
166
153
|
const conditions = [];
|
|
167
154
|
if (state.startDate !== undefined) {
|
|
168
155
|
conditions.push({
|
|
169
|
-
$gte: state.startDate
|
|
156
|
+
$gte: formatDateValue(state.startDate, propertyType)
|
|
170
157
|
});
|
|
171
158
|
}
|
|
172
159
|
if (state.endDate !== undefined) {
|
|
173
160
|
conditions.push({
|
|
174
|
-
$lte: state.endDate
|
|
161
|
+
$lte: formatDateValue(state.endDate, propertyType)
|
|
175
162
|
});
|
|
176
163
|
}
|
|
177
164
|
if (conditions.length === 0) {
|
|
178
165
|
return undefined;
|
|
179
166
|
}
|
|
180
|
-
let rangeFilter;
|
|
181
167
|
if (conditions.length === 1) {
|
|
182
|
-
|
|
183
|
-
} else {
|
|
184
|
-
rangeFilter = {
|
|
185
|
-
$and: conditions
|
|
186
|
-
};
|
|
168
|
+
return conditions[0];
|
|
187
169
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
}
|
|
193
|
-
return rangeFilter;
|
|
170
|
+
return {
|
|
171
|
+
__compound: true,
|
|
172
|
+
conditions,
|
|
173
|
+
includeNull: false
|
|
174
|
+
};
|
|
194
175
|
}
|
|
195
176
|
|
|
196
177
|
// These filter types are handled separately in buildWhereClause
|
|
@@ -217,7 +198,8 @@ function filterStateToPropertyFilter(state) {
|
|
|
217
198
|
* cannot verify that the constructed clause structure matches the generic Q's
|
|
218
199
|
* expected shape, but the structure is guaranteed to be valid by construction.
|
|
219
200
|
*/
|
|
220
|
-
|
|
201
|
+
|
|
202
|
+
export function buildWhereClause(definitions, filterStates, operator, propertyTypes, excludeFilterKey) {
|
|
221
203
|
if (!definitions || definitions.length === 0) {
|
|
222
204
|
return {};
|
|
223
205
|
}
|
|
@@ -234,9 +216,37 @@ export function buildWhereClause(definitions, filterStates, operator, objectType
|
|
|
234
216
|
switch (definition.type) {
|
|
235
217
|
case "PROPERTY":
|
|
236
218
|
{
|
|
237
|
-
const
|
|
219
|
+
const propertyType = propertyTypes?.get(definition.key)?.type;
|
|
220
|
+
const filter = filterStateToPropertyFilter(state, propertyType);
|
|
238
221
|
if (filter !== undefined) {
|
|
239
|
-
|
|
222
|
+
const isExcluding = "isExcluding" in state && state.isExcluding;
|
|
223
|
+
if (isCompoundFilter(filter)) {
|
|
224
|
+
const fieldClauses = filter.conditions.map(c => ({
|
|
225
|
+
[definition.key]: c
|
|
226
|
+
}));
|
|
227
|
+
let rangeClause = fieldClauses.length === 1 ? fieldClauses[0] : {
|
|
228
|
+
$and: fieldClauses
|
|
229
|
+
};
|
|
230
|
+
if (filter.includeNull) {
|
|
231
|
+
rangeClause = {
|
|
232
|
+
$or: [rangeClause, {
|
|
233
|
+
[definition.key]: {
|
|
234
|
+
$isNull: true
|
|
235
|
+
}
|
|
236
|
+
}]
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
clauses.push(isExcluding ? {
|
|
240
|
+
$not: rangeClause
|
|
241
|
+
} : rangeClause);
|
|
242
|
+
} else {
|
|
243
|
+
const clause = {
|
|
244
|
+
[definition.key]: filter
|
|
245
|
+
};
|
|
246
|
+
clauses.push(isExcluding ? {
|
|
247
|
+
$not: clause
|
|
248
|
+
} : clause);
|
|
249
|
+
}
|
|
240
250
|
}
|
|
241
251
|
break;
|
|
242
252
|
}
|
|
@@ -288,12 +298,17 @@ export function buildWhereClause(definitions, filterStates, operator, objectType
|
|
|
288
298
|
const properties = definition.properties;
|
|
289
299
|
let propertiesToSearch;
|
|
290
300
|
if (properties === "all") {
|
|
291
|
-
if (
|
|
292
|
-
propertiesToSearch =
|
|
301
|
+
if (propertyTypes && propertyTypes.size > 0) {
|
|
302
|
+
propertiesToSearch = [];
|
|
303
|
+
for (const [key, info] of propertyTypes) {
|
|
304
|
+
if (info.type === "string" && !info.multiplicity) {
|
|
305
|
+
propertiesToSearch.push(key);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
293
308
|
} else {
|
|
294
309
|
if (process.env.NODE_ENV !== "production") {
|
|
295
310
|
// eslint-disable-next-line no-console
|
|
296
|
-
console.warn("[FilterList] Keyword search with properties: 'all' requires
|
|
311
|
+
console.warn("[FilterList] Keyword search with properties: 'all' requires propertyTypes to be provided. Filter will be skipped.");
|
|
297
312
|
}
|
|
298
313
|
break;
|
|
299
314
|
}
|
|
@@ -305,21 +320,21 @@ export function buildWhereClause(definitions, filterStates, operator, objectType
|
|
|
305
320
|
}
|
|
306
321
|
const containsOp = state.operator === "AND" ? "$containsAllTerms" : "$containsAnyTerm";
|
|
307
322
|
const propertySearches = propertiesToSearch.map(prop => ({
|
|
308
|
-
[prop]:
|
|
309
|
-
$not: {
|
|
310
|
-
[containsOp]: searchTerm
|
|
311
|
-
}
|
|
312
|
-
} : {
|
|
323
|
+
[prop]: {
|
|
313
324
|
[containsOp]: searchTerm
|
|
314
325
|
}
|
|
315
326
|
}));
|
|
327
|
+
let searchClause;
|
|
316
328
|
if (propertySearches.length === 1) {
|
|
317
|
-
|
|
329
|
+
searchClause = propertySearches[0];
|
|
318
330
|
} else {
|
|
319
|
-
|
|
331
|
+
searchClause = {
|
|
320
332
|
$or: propertySearches
|
|
321
|
-
}
|
|
333
|
+
};
|
|
322
334
|
}
|
|
335
|
+
clauses.push(state.isExcluding ? {
|
|
336
|
+
$not: searchClause
|
|
337
|
+
} : searchClause);
|
|
323
338
|
break;
|
|
324
339
|
}
|
|
325
340
|
case "CUSTOM":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterStateToWhereClause.js","names":["assertUnreachable","getFilterKey","liftCompoundPropertyFilter","propertyKey","filter","Array","isArray","$and","map","f","$or","filterStateToPropertyFilter","state","type","value","undefined","$containsAnyTerm","isExcluding","$not","enabled","conditions","minValue","push","$gte","toISOString","maxValue","$lte","length","includeNull","rangeFilter","$isNull","values","$in","selectedValues","v","Date","startDate","endDate","buildWhereClause","definitions","filterStates","operator","objectType","excludeFilterKey","clauses","definition","key","get","process","env","NODE_ENV","console","warn","linkName","hasLink","$isNotNull","searchTerm","trim","properties","propertiesToSearch","__DefinitionMetadata","Object","entries","prop","multiplicity","containsOp","propertySearches","customClause","toWhereClause","keys"],"sources":["filterStateToWhereClause.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { assertUnreachable } from \"./assertUnreachable.js\";\nimport { getFilterKey } from \"./getFilterKey.js\";\n\ntype PropertyFilter = Record<string, unknown> | boolean | string | number;\n\nfunction liftCompoundPropertyFilter(\n propertyKey: string,\n filter: PropertyFilter,\n): Record<string, unknown> {\n if (typeof filter === \"object\" && !Array.isArray(filter)) {\n if (\"$and\" in filter && Array.isArray(filter.$and)) {\n return {\n $and: (filter.$and as PropertyFilter[]).map((f) =>\n liftCompoundPropertyFilter(propertyKey, f)\n ),\n };\n }\n if (\"$or\" in filter && Array.isArray(filter.$or)) {\n return {\n $or: (filter.$or as PropertyFilter[]).map((f) =>\n liftCompoundPropertyFilter(propertyKey, f)\n ),\n };\n }\n }\n return { [propertyKey]: filter };\n}\n\nfunction filterStateToPropertyFilter(\n state: FilterState,\n): PropertyFilter | undefined {\n switch (state.type) {\n case \"CONTAINS_TEXT\": {\n if (!state.value) {\n return undefined;\n }\n const filter = { $containsAnyTerm: state.value };\n if (state.isExcluding) {\n return { $not: filter };\n }\n return filter;\n }\n\n case \"TOGGLE\": {\n return state.enabled;\n }\n\n case \"DATE_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({ $gte: state.minValue.toISOString() });\n }\n if (state.maxValue !== undefined) {\n conditions.push({ $lte: state.maxValue.toISOString() });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n let rangeFilter: PropertyFilter | undefined;\n if (conditions.length === 1) {\n rangeFilter = conditions[0];\n } else if (conditions.length > 1) {\n rangeFilter = { $and: conditions };\n }\n\n if (state.includeNull) {\n if (rangeFilter) {\n return { $or: [rangeFilter, { $isNull: true }] };\n }\n return { $isNull: true };\n }\n\n return rangeFilter;\n }\n\n case \"NUMBER_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({ $gte: state.minValue });\n }\n if (state.maxValue !== undefined) {\n conditions.push({ $lte: state.maxValue });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n let rangeFilter: PropertyFilter | undefined;\n if (conditions.length === 1) {\n rangeFilter = conditions[0];\n } else if (conditions.length > 1) {\n rangeFilter = { $and: conditions };\n }\n\n if (state.includeNull) {\n if (rangeFilter) {\n return { $or: [rangeFilter, { $isNull: true }] };\n }\n return { $isNull: true };\n }\n\n return rangeFilter;\n }\n\n case \"EXACT_MATCH\": {\n if (state.values.length === 0) {\n return undefined;\n }\n const filter = state.values.length === 1\n ? state.values[0]\n : { $in: state.values };\n if (state.isExcluding) {\n return { $not: filter };\n }\n return filter;\n }\n\n case \"SELECT\": {\n if (state.selectedValues.length === 0) {\n return undefined;\n }\n const values: (string | number | boolean)[] = state.selectedValues.map(\n (v) =>\n v instanceof Date ? v.toISOString() : v as string | number | boolean,\n );\n const filter = values.length === 1 ? values[0] : { $in: values };\n if (state.isExcluding) {\n return { $not: filter };\n }\n return filter;\n }\n\n case \"TIMELINE\": {\n const conditions: PropertyFilter[] = [];\n if (state.startDate !== undefined) {\n conditions.push({ $gte: state.startDate.toISOString() });\n }\n if (state.endDate !== undefined) {\n conditions.push({ $lte: state.endDate.toISOString() });\n }\n if (conditions.length === 0) {\n return undefined;\n }\n let rangeFilter: PropertyFilter;\n if (conditions.length === 1) {\n rangeFilter = conditions[0];\n } else {\n rangeFilter = { $and: conditions };\n }\n if (state.isExcluding) {\n return { $not: rangeFilter };\n }\n return rangeFilter;\n }\n\n // These filter types are handled separately in buildWhereClause\n // since they need access to the full definition, not just state\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"custom\":\n return undefined;\n\n default:\n return assertUnreachable(state);\n }\n}\n\n/**\n * Builds a WhereClause from filter definitions and their current states.\n *\n * The filterStates map uses string keys derived from filter definitions via\n * getFilterKey(). This ensures stable state lookups even when filters are\n * reordered or definition object references change.\n *\n * Note: The `as WhereClause<Q>` casts are necessary because we're building\n * clauses dynamically from property keys determined at runtime. TypeScript\n * cannot verify that the constructed clause structure matches the generic Q's\n * expected shape, but the structure is guaranteed to be valid by construction.\n */\nexport function buildWhereClause<Q extends ObjectTypeDefinition>(\n definitions: Array<FilterDefinitionUnion<Q>> | undefined,\n filterStates: Map<string, FilterState>,\n operator: \"and\" | \"or\",\n objectType?: Q,\n excludeFilterKey?: string,\n): WhereClause<Q> {\n if (!definitions || definitions.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n const clauses: Array<Record<string, unknown>> = [];\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n if (key === excludeFilterKey) {\n continue;\n }\n const state = filterStates.get(key);\n\n if (!state) {\n continue;\n }\n\n switch (definition.type) {\n case \"PROPERTY\": {\n const filter = filterStateToPropertyFilter(state);\n if (filter !== undefined) {\n clauses.push(\n liftCompoundPropertyFilter(definition.key as string, filter),\n );\n }\n break;\n }\n\n case \"HAS_LINK\": {\n if (state.type !== \"hasLink\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for hasLink filter \"${definition.linkName}\": expected hasLink, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.hasLink) {\n break;\n }\n clauses.push({ [definition.linkName]: { $isNotNull: true } });\n break;\n }\n\n case \"LINKED_PROPERTY\": {\n // OSDK WhereClause does not support filtering through links.\n // Link-based filtering requires ObjectSet operations (pivotTo/intersect).\n // LinkedProperty filters render UI for selection but cannot be included\n // in the where clause. Consumers needing linked property filtering must\n // implement it using ObjectSet.pivotTo() and intersect().\n break;\n }\n\n case \"KEYWORD_SEARCH\": {\n if (state.type !== \"keywordSearch\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for keywordSearch filter: expected keywordSearch, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.searchTerm) {\n break;\n }\n // TypeScript narrows state to KeywordSearchFilterState\n const searchTerm = state.searchTerm.trim();\n if (!searchTerm) {\n break;\n }\n\n const properties = definition.properties;\n let propertiesToSearch: string[];\n\n if (properties === \"all\") {\n if (objectType?.__DefinitionMetadata?.properties) {\n propertiesToSearch = Object.entries(\n objectType.__DefinitionMetadata.properties,\n )\n .filter(([, prop]) =>\n prop.type === \"string\" && !prop.multiplicity\n )\n .map(([key]) => key);\n } else {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"[FilterList] Keyword search with properties: 'all' requires objectType to be provided. Filter will be skipped.\",\n );\n }\n break;\n }\n } else {\n propertiesToSearch = properties;\n }\n\n if (propertiesToSearch.length === 0) {\n break;\n }\n\n const containsOp = state.operator === \"AND\"\n ? \"$containsAllTerms\"\n : \"$containsAnyTerm\";\n\n const propertySearches = propertiesToSearch.map((prop) => ({\n [prop]: state.isExcluding\n ? { $not: { [containsOp]: searchTerm } }\n : { [containsOp]: searchTerm },\n }));\n\n if (propertySearches.length === 1) {\n clauses.push(propertySearches[0]);\n } else {\n clauses.push({ $or: propertySearches });\n }\n break;\n }\n\n case \"CUSTOM\": {\n if (state.type !== \"custom\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for custom filter \"${definition.key}\": expected custom, got ${state.type}`,\n );\n }\n break;\n }\n // TypeScript narrows state to CustomFilterState\n const customClause = definition.toWhereClause(state);\n if (customClause && Object.keys(customClause).length > 0) {\n clauses.push(customClause as Record<string, unknown>);\n }\n break;\n }\n\n default:\n assertUnreachable(definition);\n }\n }\n\n if (clauses.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n if (clauses.length === 1) {\n return clauses[0] as WhereClause<Q>;\n }\n\n if (operator === \"and\") {\n return { $and: clauses } as WhereClause<Q>;\n }\n\n return { $or: clauses } as WhereClause<Q>;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"filterStateToWhereClause.js","names":["formatDateForInput","assertUnreachable","getFilterKey","isCompoundFilter","f","NUMERIC_BOUNDS","byte","min","max","short","integer","long","Number","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","clampToPropertyBounds","value","propertyType","undefined","bounds","Math","formatDateValue","date","toISOString","filterStateToPropertyFilter","state","type","$containsAnyTerm","enabled","conditions","minValue","push","$gte","maxValue","$lte","length","includeNull","$isNull","__compound","values","$in","selectedValues","map","v","Date","startDate","endDate","buildWhereClause","definitions","filterStates","operator","propertyTypes","excludeFilterKey","clauses","definition","key","get","filter","isExcluding","fieldClauses","c","rangeClause","$and","$or","$not","clause","process","env","NODE_ENV","console","warn","linkName","hasLink","$isNotNull","searchTerm","trim","properties","propertiesToSearch","size","info","multiplicity","containsOp","propertySearches","prop","searchClause","customClause","toWhereClause","Object","keys"],"sources":["filterStateToWhereClause.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport { formatDateForInput } from \"../base/inputs/dateUtils.js\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { assertUnreachable } from \"./assertUnreachable.js\";\nimport { getFilterKey } from \"./getFilterKey.js\";\n\ntype PropertyFilter = Record<string, unknown> | boolean | string | number;\n\ninterface CompoundFilter {\n __compound: true;\n conditions: PropertyFilter[];\n includeNull: boolean;\n}\n\nfunction isCompoundFilter(\n f: PropertyFilter | CompoundFilter,\n): f is CompoundFilter {\n return typeof f === \"object\" && f != null && \"__compound\" in f;\n}\n\nconst NUMERIC_BOUNDS: Record<string, { min: number; max: number }> = {\n byte: { min: -128, max: 127 },\n short: { min: -32_768, max: 32_767 },\n integer: { min: -2_147_483_648, max: 2_147_483_647 },\n long: { min: Number.MIN_SAFE_INTEGER, max: Number.MAX_SAFE_INTEGER },\n};\n\nfunction clampToPropertyBounds(\n value: number,\n propertyType: string | undefined,\n): number {\n if (propertyType === undefined) {\n return value;\n }\n const bounds = NUMERIC_BOUNDS[propertyType];\n if (bounds === undefined) {\n return value;\n }\n return Math.max(bounds.min, Math.min(bounds.max, value));\n}\n\nfunction formatDateValue(\n date: Date,\n propertyType: string | undefined,\n): string {\n if (propertyType === \"datetime\") {\n return formatDateForInput(date);\n }\n return date.toISOString();\n}\n\nfunction filterStateToPropertyFilter(\n state: FilterState,\n propertyType?: string,\n): PropertyFilter | CompoundFilter | undefined {\n switch (state.type) {\n case \"CONTAINS_TEXT\": {\n if (!state.value) {\n return undefined;\n }\n return { $containsAnyTerm: state.value };\n }\n\n case \"TOGGLE\": {\n return state.enabled;\n }\n\n case \"DATE_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({\n $gte: formatDateValue(state.minValue, propertyType),\n });\n }\n if (state.maxValue !== undefined) {\n conditions.push({\n $lte: formatDateValue(state.maxValue, propertyType),\n });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n if (conditions.length === 0 && state.includeNull) {\n return { $isNull: true };\n }\n\n if (conditions.length === 1 && !state.includeNull) {\n return conditions[0];\n }\n\n return {\n __compound: true,\n conditions,\n includeNull: state.includeNull ?? false,\n };\n }\n\n case \"NUMBER_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({\n $gte: clampToPropertyBounds(state.minValue, propertyType),\n });\n }\n if (state.maxValue !== undefined) {\n conditions.push({\n $lte: clampToPropertyBounds(state.maxValue, propertyType),\n });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n if (conditions.length === 0 && state.includeNull) {\n return { $isNull: true };\n }\n\n if (conditions.length === 1 && !state.includeNull) {\n return conditions[0];\n }\n\n return {\n __compound: true,\n conditions,\n includeNull: state.includeNull ?? false,\n };\n }\n\n case \"EXACT_MATCH\": {\n if (state.values.length === 0) {\n return undefined;\n }\n return state.values.length === 1\n ? state.values[0]\n : { $in: state.values };\n }\n\n case \"SELECT\": {\n if (state.selectedValues.length === 0) {\n return undefined;\n }\n const values: (string | number | boolean)[] = state.selectedValues.map(\n (v) =>\n v instanceof Date\n ? formatDateValue(v, propertyType)\n : v as string | number | boolean,\n );\n return values.length === 1 ? values[0] : { $in: values };\n }\n\n case \"TIMELINE\": {\n const conditions: PropertyFilter[] = [];\n if (state.startDate !== undefined) {\n conditions.push({\n $gte: formatDateValue(state.startDate, propertyType),\n });\n }\n if (state.endDate !== undefined) {\n conditions.push({\n $lte: formatDateValue(state.endDate, propertyType),\n });\n }\n if (conditions.length === 0) {\n return undefined;\n }\n if (conditions.length === 1) {\n return conditions[0];\n }\n return {\n __compound: true,\n conditions,\n includeNull: false,\n };\n }\n\n // These filter types are handled separately in buildWhereClause\n // since they need access to the full definition, not just state\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"custom\":\n return undefined;\n\n default:\n return assertUnreachable(state);\n }\n}\n\n/**\n * Builds a WhereClause from filter definitions and their current states.\n *\n * The filterStates map uses string keys derived from filter definitions via\n * getFilterKey(). This ensures stable state lookups even when filters are\n * reordered or definition object references change.\n *\n * Note: The `as WhereClause<Q>` casts are necessary because we're building\n * clauses dynamically from property keys determined at runtime. TypeScript\n * cannot verify that the constructed clause structure matches the generic Q's\n * expected shape, but the structure is guaranteed to be valid by construction.\n */\nexport interface PropertyTypeInfo {\n type: string;\n multiplicity: boolean;\n}\n\nexport function buildWhereClause<Q extends ObjectTypeDefinition>(\n definitions: Array<FilterDefinitionUnion<Q>> | undefined,\n filterStates: Map<string, FilterState>,\n operator: \"and\" | \"or\",\n propertyTypes?: Map<string, PropertyTypeInfo>,\n excludeFilterKey?: string,\n): WhereClause<Q> {\n if (!definitions || definitions.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n const clauses: Array<Record<string, unknown>> = [];\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n if (key === excludeFilterKey) {\n continue;\n }\n const state = filterStates.get(key);\n\n if (!state) {\n continue;\n }\n\n switch (definition.type) {\n case \"PROPERTY\": {\n const propertyType = propertyTypes?.get(definition.key as string)\n ?.type;\n const filter = filterStateToPropertyFilter(state, propertyType);\n if (filter !== undefined) {\n const isExcluding = \"isExcluding\" in state && state.isExcluding;\n if (isCompoundFilter(filter)) {\n const fieldClauses = filter.conditions.map(c => ({\n [definition.key]: c,\n }));\n let rangeClause: Record<string, unknown> = fieldClauses.length === 1\n ? fieldClauses[0]\n : { $and: fieldClauses };\n if (filter.includeNull) {\n rangeClause = {\n $or: [rangeClause, { [definition.key]: { $isNull: true } }],\n };\n }\n clauses.push(isExcluding ? { $not: rangeClause } : rangeClause);\n } else {\n const clause = { [definition.key]: filter };\n clauses.push(isExcluding ? { $not: clause } : clause);\n }\n }\n break;\n }\n\n case \"HAS_LINK\": {\n if (state.type !== \"hasLink\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for hasLink filter \"${definition.linkName}\": expected hasLink, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.hasLink) {\n break;\n }\n clauses.push({ [definition.linkName]: { $isNotNull: true } });\n break;\n }\n\n case \"LINKED_PROPERTY\": {\n // OSDK WhereClause does not support filtering through links.\n // Link-based filtering requires ObjectSet operations (pivotTo/intersect).\n // LinkedProperty filters render UI for selection but cannot be included\n // in the where clause. Consumers needing linked property filtering must\n // implement it using ObjectSet.pivotTo() and intersect().\n break;\n }\n\n case \"KEYWORD_SEARCH\": {\n if (state.type !== \"keywordSearch\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for keywordSearch filter: expected keywordSearch, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.searchTerm) {\n break;\n }\n // TypeScript narrows state to KeywordSearchFilterState\n const searchTerm = state.searchTerm.trim();\n if (!searchTerm) {\n break;\n }\n\n const properties = definition.properties;\n let propertiesToSearch: string[];\n\n if (properties === \"all\") {\n if (propertyTypes && propertyTypes.size > 0) {\n propertiesToSearch = [];\n for (const [key, info] of propertyTypes) {\n if (info.type === \"string\" && !info.multiplicity) {\n propertiesToSearch.push(key);\n }\n }\n } else {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"[FilterList] Keyword search with properties: 'all' requires propertyTypes to be provided. Filter will be skipped.\",\n );\n }\n break;\n }\n } else {\n propertiesToSearch = properties;\n }\n\n if (propertiesToSearch.length === 0) {\n break;\n }\n\n const containsOp = state.operator === \"AND\"\n ? \"$containsAllTerms\"\n : \"$containsAnyTerm\";\n\n const propertySearches = propertiesToSearch.map((prop) => ({\n [prop]: { [containsOp]: searchTerm },\n }));\n\n let searchClause: Record<string, unknown>;\n if (propertySearches.length === 1) {\n searchClause = propertySearches[0];\n } else {\n searchClause = { $or: propertySearches };\n }\n clauses.push(\n state.isExcluding ? { $not: searchClause } : searchClause,\n );\n break;\n }\n\n case \"CUSTOM\": {\n if (state.type !== \"custom\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for custom filter \"${definition.key}\": expected custom, got ${state.type}`,\n );\n }\n break;\n }\n // TypeScript narrows state to CustomFilterState\n const customClause = definition.toWhereClause(state);\n if (customClause && Object.keys(customClause).length > 0) {\n clauses.push(customClause as Record<string, unknown>);\n }\n break;\n }\n\n default:\n assertUnreachable(definition);\n }\n }\n\n if (clauses.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n if (clauses.length === 1) {\n return clauses[0] as WhereClause<Q>;\n }\n\n if (operator === \"and\") {\n return { $and: clauses } as WhereClause<Q>;\n }\n\n return { $or: clauses } as WhereClause<Q>;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import classNames from "classnames";
|
|
17
18
|
import React, { useCallback, useMemo, useState } from "react";
|
|
18
19
|
import { ColumnConfigDialog } from "./ColumnConfigDialog.js";
|
|
19
20
|
import { MultiColumnSortDialog } from "./MultiColumnSortDialog.js";
|
|
@@ -111,7 +112,9 @@ export function TableHeader({
|
|
|
111
112
|
return /*#__PURE__*/React.createElement("th", {
|
|
112
113
|
key: header.id,
|
|
113
114
|
"data-pinned": header.column.getIsPinned(),
|
|
114
|
-
className: styles.osdkTableHeaderCell,
|
|
115
|
+
className: classNames(styles.osdkTableHeaderCell, {
|
|
116
|
+
[styles.osdkTableSelectionHeaderCell]: isSelectColumn
|
|
117
|
+
}),
|
|
115
118
|
style: columnStyles
|
|
116
119
|
}, header.isPlaceholder ? null : isSelectColumn ? /*#__PURE__*/React.createElement(TableHeaderContent, {
|
|
117
120
|
header: header
|