@osdk/react-components 0.2.0-beta.21 → 0.2.0-beta.22
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/AGENTS.md +14 -97
- package/CHANGELOG.md +19 -0
- package/README.md +1 -1
- package/build/browser/action-form/ActionFormApi.js.map +1 -1
- package/build/browser/action-form/BaseForm.js +18 -5
- package/build/browser/action-form/BaseForm.js.map +1 -1
- package/build/browser/action-form/BaseForm.module.css +38 -0
- package/build/browser/action-form/BaseForm.module.css.js +8 -0
- package/build/browser/action-form/FormField.js +42 -0
- package/build/browser/action-form/FormField.js.map +1 -0
- package/build/browser/action-form/FormField.module.css +41 -0
- package/build/browser/action-form/FormField.module.css.js +10 -0
- package/build/browser/action-form/FormFieldApi.js.map +1 -1
- package/build/browser/action-form/FormHeader.js +26 -0
- package/build/browser/action-form/FormHeader.js.map +1 -0
- package/build/browser/action-form/FormHeader.module.css +26 -0
- package/build/browser/action-form/FormHeader.module.css.js +6 -0
- package/build/browser/action-form/fields/FormFieldRenderer.js +7 -5
- package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/browser/action-form/fields/TextInputField.js +2 -0
- package/build/browser/action-form/fields/TextInputField.js.map +1 -1
- package/build/browser/action-form/fields/TextInputField.module.css +56 -0
- package/build/browser/action-form/fields/TextInputField.module.css.js +6 -0
- package/build/browser/base-components/checkbox/Checkbox.js +2 -2
- package/build/browser/base-components/checkbox/Checkbox.js.map +1 -1
- package/build/browser/base-components/checkbox/Checkbox.module.css +0 -4
- package/build/browser/base-components/combobox/Combobox.js +3 -8
- package/build/browser/base-components/combobox/Combobox.js.map +1 -1
- package/build/browser/base-components/combobox/Combobox.module.css +0 -3
- package/build/browser/base-components/draggable-list/DraggableList.js +2 -4
- package/build/browser/base-components/draggable-list/DraggableList.js.map +1 -1
- package/build/browser/base-components/search-bar/SearchBar.module.css +2 -2
- package/build/browser/base-components/select/Select.js +1 -3
- package/build/browser/base-components/select/Select.js.map +1 -1
- package/build/browser/base-components/select/Select.module.css +0 -2
- package/build/browser/base-components/switch/Switch.module.css +0 -1
- package/build/browser/filter-list/FilterInput.js +14 -5
- package/build/browser/filter-list/FilterInput.js.map +1 -1
- package/build/browser/filter-list/FilterList.js +13 -5
- 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/base/AddFilterPopover.js +4 -3
- package/build/browser/filter-list/base/AddFilterPopover.js.map +1 -1
- package/build/browser/filter-list/base/BaseFilterListApi.js.map +1 -1
- package/build/browser/filter-list/base/ExcludeDropdown.js +61 -0
- package/build/browser/filter-list/base/ExcludeDropdown.js.map +1 -0
- package/build/browser/filter-list/base/ExcludeDropdown.module.css +94 -0
- package/build/browser/filter-list/base/ExcludeDropdown.module.css.js +12 -0
- package/build/browser/filter-list/base/FilterIcons.js +0 -39
- package/build/browser/filter-list/base/FilterIcons.js.map +1 -1
- package/build/browser/filter-list/base/FilterInputExcludeRow.js +55 -0
- package/build/browser/filter-list/base/FilterInputExcludeRow.js.map +1 -0
- package/build/browser/filter-list/base/FilterListItem.js +72 -23
- package/build/browser/filter-list/base/FilterListItem.js.map +1 -1
- package/build/browser/filter-list/base/FilterListItem.module.css +96 -20
- package/build/browser/filter-list/base/FilterListItem.module.css.js +7 -2
- package/build/browser/filter-list/base/inputs/CheckboxListInput.js +2 -2
- package/build/browser/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/ContainsTextInput.js +2 -6
- package/build/browser/filter-list/base/inputs/ContainsTextInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/ListogramInput.js +2 -2
- package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/RangeInput.js +2 -2
- package/build/browser/filter-list/base/inputs/RangeInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/SingleSelectInput.js +1 -3
- package/build/browser/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/{useStaleData.js → useStableData.js} +5 -5
- package/build/browser/filter-list/base/inputs/useStableData.js.map +1 -0
- package/build/browser/filter-list/hooks/usePropertyAggregation.js +3 -2
- package/build/browser/filter-list/hooks/usePropertyAggregation.js.map +1 -1
- package/build/browser/filter-list/inputs/CheckboxListFilterInput.js +15 -5
- package/build/browser/filter-list/inputs/CheckboxListFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/DateRangeFilterInput.js +10 -6
- package/build/browser/filter-list/inputs/DateRangeFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/LinkedPropertyInput.js +41 -18
- package/build/browser/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
- package/build/browser/filter-list/inputs/ListogramFilterInput.js +15 -5
- package/build/browser/filter-list/inputs/ListogramFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/MultiSelectFilterInput.js +12 -4
- package/build/browser/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/NumberRangeFilterInput.js +10 -6
- package/build/browser/filter-list/inputs/NumberRangeFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/PropertyFilterInput.js +36 -10
- package/build/browser/filter-list/inputs/PropertyFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/SingleSelectFilterInput.js +12 -4
- package/build/browser/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
- package/build/browser/filter-list/inputs/TextTagsFilterInput.js +12 -4
- package/build/browser/filter-list/inputs/TextTagsFilterInput.js.map +1 -1
- package/build/browser/filter-list/utils/filterValues.js +29 -1
- package/build/browser/filter-list/utils/filterValues.js.map +1 -1
- package/build/browser/object-table/LoadingCell.module.css +0 -1
- package/build/browser/object-table/MultiColumnSortDialog.js +1 -3
- package/build/browser/object-table/MultiColumnSortDialog.js.map +1 -1
- package/build/browser/object-table/MultiColumnSortDialog.module.css +0 -1
- package/build/browser/object-table/TableCell.module.css +1 -1
- package/build/browser/object-table/TableHeader.module.css +2 -2
- package/build/browser/object-table/TableHeaderWithPopover.js +2 -4
- package/build/browser/object-table/TableHeaderWithPopover.js.map +1 -1
- package/build/browser/object-table/TableHeaderWithPopover.module.css +1 -0
- package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.module.css +0 -1
- package/build/browser/public/experimental.js +2 -0
- package/build/browser/public/experimental.js.map +1 -1
- package/build/browser/styles.css +372 -38
- package/build/cjs/public/experimental.cjs +1882 -1068
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.css +244 -38
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/experimental.d.cts +420 -11
- package/build/esm/action-form/ActionFormApi.js.map +1 -1
- package/build/esm/action-form/BaseForm.js +18 -5
- package/build/esm/action-form/BaseForm.js.map +1 -1
- package/build/esm/action-form/BaseForm.module.css +38 -0
- package/build/esm/action-form/FormField.js +42 -0
- package/build/esm/action-form/FormField.js.map +1 -0
- package/build/esm/action-form/FormField.module.css +41 -0
- package/build/esm/action-form/FormFieldApi.js.map +1 -1
- package/build/esm/action-form/FormHeader.js +26 -0
- package/build/esm/action-form/FormHeader.js.map +1 -0
- package/build/esm/action-form/FormHeader.module.css +26 -0
- package/build/esm/action-form/fields/FormFieldRenderer.js +7 -5
- package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/esm/action-form/fields/TextInputField.js +2 -0
- package/build/esm/action-form/fields/TextInputField.js.map +1 -1
- package/build/esm/action-form/fields/TextInputField.module.css +56 -0
- package/build/esm/base-components/checkbox/Checkbox.js +2 -2
- package/build/esm/base-components/checkbox/Checkbox.js.map +1 -1
- package/build/esm/base-components/checkbox/Checkbox.module.css +0 -4
- package/build/esm/base-components/combobox/Combobox.js +3 -8
- package/build/esm/base-components/combobox/Combobox.js.map +1 -1
- package/build/esm/base-components/combobox/Combobox.module.css +0 -3
- package/build/esm/base-components/draggable-list/DraggableList.js +2 -4
- package/build/esm/base-components/draggable-list/DraggableList.js.map +1 -1
- package/build/esm/base-components/search-bar/SearchBar.module.css +2 -2
- package/build/esm/base-components/select/Select.js +1 -3
- package/build/esm/base-components/select/Select.js.map +1 -1
- package/build/esm/base-components/select/Select.module.css +0 -2
- package/build/esm/base-components/switch/Switch.module.css +0 -1
- package/build/esm/filter-list/FilterInput.js +14 -5
- package/build/esm/filter-list/FilterInput.js.map +1 -1
- package/build/esm/filter-list/FilterList.js +13 -5
- 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/base/AddFilterPopover.js +4 -3
- package/build/esm/filter-list/base/AddFilterPopover.js.map +1 -1
- package/build/esm/filter-list/base/BaseFilterListApi.js.map +1 -1
- package/build/esm/filter-list/base/ExcludeDropdown.js +61 -0
- package/build/esm/filter-list/base/ExcludeDropdown.js.map +1 -0
- package/build/esm/filter-list/base/ExcludeDropdown.module.css +94 -0
- package/build/esm/filter-list/base/FilterIcons.js +0 -39
- package/build/esm/filter-list/base/FilterIcons.js.map +1 -1
- package/build/esm/filter-list/base/FilterInputExcludeRow.js +55 -0
- package/build/esm/filter-list/base/FilterInputExcludeRow.js.map +1 -0
- package/build/esm/filter-list/base/FilterListItem.js +72 -23
- package/build/esm/filter-list/base/FilterListItem.js.map +1 -1
- package/build/esm/filter-list/base/FilterListItem.module.css +96 -20
- package/build/esm/filter-list/base/inputs/CheckboxListInput.js +2 -2
- package/build/esm/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/ContainsTextInput.js +2 -6
- package/build/esm/filter-list/base/inputs/ContainsTextInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/ListogramInput.js +2 -2
- package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/RangeInput.js +2 -2
- package/build/esm/filter-list/base/inputs/RangeInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/SingleSelectInput.js +1 -3
- package/build/esm/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/{useStaleData.js → useStableData.js} +5 -5
- package/build/esm/filter-list/base/inputs/useStableData.js.map +1 -0
- package/build/esm/filter-list/hooks/usePropertyAggregation.js +3 -2
- package/build/esm/filter-list/hooks/usePropertyAggregation.js.map +1 -1
- package/build/esm/filter-list/inputs/CheckboxListFilterInput.js +15 -5
- package/build/esm/filter-list/inputs/CheckboxListFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/DateRangeFilterInput.js +10 -6
- package/build/esm/filter-list/inputs/DateRangeFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/LinkedPropertyInput.js +41 -18
- package/build/esm/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
- package/build/esm/filter-list/inputs/ListogramFilterInput.js +15 -5
- package/build/esm/filter-list/inputs/ListogramFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/MultiSelectFilterInput.js +12 -4
- package/build/esm/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/NumberRangeFilterInput.js +10 -6
- package/build/esm/filter-list/inputs/NumberRangeFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/PropertyFilterInput.js +36 -10
- package/build/esm/filter-list/inputs/PropertyFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/SingleSelectFilterInput.js +12 -4
- package/build/esm/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
- package/build/esm/filter-list/inputs/TextTagsFilterInput.js +12 -4
- package/build/esm/filter-list/inputs/TextTagsFilterInput.js.map +1 -1
- package/build/esm/filter-list/utils/filterValues.js +29 -1
- package/build/esm/filter-list/utils/filterValues.js.map +1 -1
- package/build/esm/object-table/LoadingCell.module.css +0 -1
- package/build/esm/object-table/MultiColumnSortDialog.js +1 -3
- package/build/esm/object-table/MultiColumnSortDialog.js.map +1 -1
- package/build/esm/object-table/MultiColumnSortDialog.module.css +0 -1
- package/build/esm/object-table/TableCell.module.css +1 -1
- package/build/esm/object-table/TableHeader.module.css +2 -2
- package/build/esm/object-table/TableHeaderWithPopover.js +2 -4
- package/build/esm/object-table/TableHeaderWithPopover.js.map +1 -1
- package/build/esm/object-table/TableHeaderWithPopover.module.css +1 -0
- package/build/esm/pdf-viewer/PdfViewerAnnotationLayer.module.css +0 -1
- package/build/esm/public/experimental.js +2 -0
- package/build/esm/public/experimental.js.map +1 -1
- package/build/types/action-form/ActionFormApi.d.ts +1 -0
- package/build/types/action-form/ActionFormApi.d.ts.map +1 -1
- package/build/types/action-form/BaseForm.d.ts.map +1 -1
- package/build/types/action-form/FormField.d.ts +11 -0
- package/build/types/action-form/FormField.d.ts.map +1 -0
- package/build/types/action-form/FormFieldApi.d.ts +1 -1
- package/build/types/action-form/FormHeader.d.ts +6 -0
- package/build/types/action-form/FormHeader.d.ts.map +1 -0
- package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -1
- package/build/types/action-form/fields/TextInputField.d.ts.map +1 -1
- package/build/types/filter-list/FilterInput.d.ts +3 -1
- package/build/types/filter-list/FilterInput.d.ts.map +1 -1
- package/build/types/filter-list/FilterListApi.d.ts +12 -9
- package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
- package/build/types/filter-list/base/AddFilterPopover.d.ts +2 -1
- package/build/types/filter-list/base/AddFilterPopover.d.ts.map +1 -1
- package/build/types/filter-list/base/BaseFilterListApi.d.ts +2 -0
- package/build/types/filter-list/base/BaseFilterListApi.d.ts.map +1 -1
- package/build/types/filter-list/base/ExcludeDropdown.d.ts +8 -0
- package/build/types/filter-list/base/ExcludeDropdown.d.ts.map +1 -0
- package/build/types/filter-list/base/FilterIcons.d.ts +0 -2
- package/build/types/filter-list/base/FilterIcons.d.ts.map +1 -1
- package/build/types/filter-list/base/FilterInputExcludeRow.d.ts +12 -0
- package/build/types/filter-list/base/FilterInputExcludeRow.d.ts.map +1 -0
- package/build/types/filter-list/base/FilterListItem.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/useStableData.d.ts +1 -0
- package/build/types/filter-list/base/inputs/useStableData.d.ts.map +1 -0
- package/build/types/filter-list/hooks/usePropertyAggregation.d.ts +2 -2
- package/build/types/filter-list/hooks/usePropertyAggregation.d.ts.map +1 -1
- package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts +5 -2
- package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/DateRangeFilterInput.d.ts +3 -2
- package/build/types/filter-list/inputs/DateRangeFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts +2 -1
- package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/ListogramFilterInput.d.ts +5 -2
- package/build/types/filter-list/inputs/ListogramFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts +4 -2
- package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/NumberRangeFilterInput.d.ts +3 -2
- package/build/types/filter-list/inputs/NumberRangeFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/PropertyFilterInput.d.ts +3 -1
- package/build/types/filter-list/inputs/PropertyFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts +4 -2
- package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/inputs/TextTagsFilterInput.d.ts +4 -2
- package/build/types/filter-list/inputs/TextTagsFilterInput.d.ts.map +1 -1
- package/build/types/filter-list/utils/filterValues.d.ts +2 -0
- package/build/types/filter-list/utils/filterValues.d.ts.map +1 -1
- package/build/types/public/experimental.d.ts +4 -0
- package/build/types/public/experimental.d.ts.map +1 -1
- package/package.json +4 -4
- package/build/browser/filter-list/base/inputs/useStaleData.js.map +0 -1
- package/build/esm/filter-list/base/inputs/useStaleData.js.map +0 -1
- package/build/types/filter-list/base/inputs/useStaleData.d.ts +0 -1
- package/build/types/filter-list/base/inputs/useStaleData.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RangeInput.js","names":["Input","classnames","debounce","React","memo","useCallback","useEffect","useId","useMemo","useRef","useState","createHistogramBuckets","getMaxBucketCount","styles","useStaleData","DEBOUNCE_MS","RangeInputInner","valueCountPairs","isLoading","minValue","maxValue","onChange","showHistogram","className","style","config","minInputId","maxInputId","localMin","setLocalMin","formatValue","localMax","setLocalMax","onChangeRef","current","minValueRef","maxValueRef","debouncedMinChange","newValue","parsed","parseValue","debouncedMaxChange","cancel","displayPairs","computedRange","length","min","undefined","max","reduce","acc","p","Math","toNumber","value","Infinity","fromNumber","dataRange","dataMin","dataMax","buckets","maxBucketCount","handleMinChange","e","target","handleMaxChange","createElement","rangeInput","histogramContainer","map","bucket","index","height","count","isInRange","key","histogramBar","title","formatTooltip","rangeInputs","inputWrapper","htmlFor","inputLabel","minLabel","_extends","id","type","inputType","input","placeholder","formatPlaceholder","inputProps","separator","maxLabel","RangeInput"],"sources":["RangeInput.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 { Input } from \"@base-ui/react/input\";\nimport classnames from \"classnames\";\nimport { debounce } from \"lodash-es\";\nimport React, {\n memo,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n createHistogramBuckets,\n getMaxBucketCount,\n type HistogramBucket,\n} from \"./createHistogramBuckets.js\";\nimport styles from \"./RangeInput.module.css\";\nimport { useStaleData } from \"./useStaleData.js\";\n\nconst DEBOUNCE_MS = 300;\n\nexport interface RangeInputConfig<T> {\n inputType: \"number\" | \"date\";\n formatValue: (value: T | undefined) => string;\n parseValue: (value: string) => T | undefined;\n toNumber: (value: T) => number;\n fromNumber: (value: number) => T;\n minLabel: string;\n maxLabel: string;\n formatTooltip: (min: T, max: T, count: number) => string;\n formatPlaceholder?: (value: T) => string;\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n}\n\nexport interface RangeInputProps<T> {\n valueCountPairs: Array<{ value: T; count: number }>;\n isLoading: boolean;\n minValue: T | undefined;\n maxValue: T | undefined;\n onChange: (min: T | undefined, max: T | undefined) => void;\n showHistogram?: boolean;\n className?: string;\n style?: React.CSSProperties;\n config: RangeInputConfig<T>;\n}\n\nfunction RangeInputInner<T>({\n valueCountPairs,\n isLoading,\n minValue,\n maxValue,\n onChange,\n showHistogram = true,\n className,\n style,\n config,\n}: RangeInputProps<T>): React.ReactElement {\n const minInputId = useId();\n const maxInputId = useId();\n\n const [localMin, setLocalMin] = useState<string>(\n config.formatValue(minValue),\n );\n const [localMax, setLocalMax] = useState<string>(\n config.formatValue(maxValue),\n );\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const minValueRef = useRef(minValue);\n minValueRef.current = minValue;\n const maxValueRef = useRef(maxValue);\n maxValueRef.current = maxValue;\n\n const debouncedMinChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(parsed, maxValueRef.current);\n }, DEBOUNCE_MS),\n [config],\n );\n\n const debouncedMaxChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(minValueRef.current, parsed);\n }, DEBOUNCE_MS),\n [config],\n );\n\n useEffect(() => {\n setLocalMin(config.formatValue(minValue));\n debouncedMinChange.cancel();\n }, [minValue, config, debouncedMinChange]);\n\n useEffect(() => {\n setLocalMax(config.formatValue(maxValue));\n debouncedMaxChange.cancel();\n }, [maxValue, config, debouncedMaxChange]);\n\n useEffect(() => {\n return () => {\n debouncedMinChange.cancel();\n debouncedMaxChange.cancel();\n };\n }, [debouncedMinChange, debouncedMaxChange]);\n\n const displayPairs = useStaleData(valueCountPairs, isLoading);\n\n const computedRange = useMemo(() => {\n if (displayPairs.length === 0) return { min: undefined, max: undefined };\n const min = displayPairs.reduce(\n (acc, p) => Math.min(acc, config.toNumber(p.value)),\n Infinity,\n );\n const max = displayPairs.reduce(\n (acc, p) => Math.max(acc, config.toNumber(p.value)),\n -Infinity,\n );\n return {\n min: config.fromNumber(min),\n max: config.fromNumber(max),\n };\n }, [displayPairs, config]);\n\n const dataRange = useMemo(() => ({\n dataMin: computedRange.min,\n dataMax: computedRange.max,\n }), [computedRange.min, computedRange.max]);\n\n const buckets = useMemo<Array<HistogramBucket<T>>>(() => {\n if (\n !showHistogram\n || displayPairs.length === 0\n || computedRange.min === undefined\n || computedRange.max === undefined\n ) {\n return [];\n }\n\n return createHistogramBuckets(\n displayPairs,\n { min: computedRange.min, max: computedRange.max },\n config.toNumber,\n config.fromNumber,\n );\n }, [showHistogram, displayPairs, computedRange, config]);\n\n const maxBucketCount = useMemo(() => getMaxBucketCount(buckets), [buckets]);\n\n const handleMinChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMin(newValue);\n debouncedMinChange(newValue);\n },\n [debouncedMinChange],\n );\n\n const handleMaxChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMax(newValue);\n debouncedMaxChange(newValue);\n },\n [debouncedMaxChange],\n );\n\n return (\n <div\n className={classnames(styles.rangeInput, className)}\n style={style}\n data-loading={isLoading}\n >\n {showHistogram && (\n <div\n className={styles.histogramContainer}\n data-empty={buckets.length === 0}\n >\n {buckets.map((bucket, index) => {\n const height = (bucket.count / maxBucketCount) * 100;\n const isInRange = (minValue === undefined\n || config.toNumber(bucket.max) >= config.toNumber(minValue))\n && (maxValue === undefined\n || config.toNumber(bucket.min) <= config.toNumber(maxValue));\n\n return (\n <div\n key={index}\n className={styles.histogramBar}\n data-in-range={isInRange}\n style={{ height: `${Math.max(height, 2)}%` }}\n title={config.formatTooltip(\n bucket.min,\n bucket.max,\n bucket.count,\n )}\n />\n );\n })}\n </div>\n )}\n\n <div className={styles.rangeInputs}>\n <div className={styles.inputWrapper}>\n <label htmlFor={minInputId} className={styles.inputLabel}>\n {config.minLabel}\n </label>\n <Input\n id={minInputId}\n type={config.inputType}\n className={styles.input}\n value={localMin}\n onChange={handleMinChange}\n placeholder={dataRange.dataMin !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMin)\n : undefined}\n {...config.inputProps}\n />\n </div>\n\n <span className={styles.separator} aria-hidden=\"true\">\n –\n </span>\n\n <div className={styles.inputWrapper}>\n <label htmlFor={maxInputId} className={styles.inputLabel}>\n {config.maxLabel}\n </label>\n <Input\n id={maxInputId}\n type={config.inputType}\n className={styles.input}\n value={localMax}\n onChange={handleMaxChange}\n placeholder={dataRange.dataMax !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMax)\n : undefined}\n {...config.inputProps}\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport const RangeInput = memo(RangeInputInner) as typeof RangeInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"RangeInput.js","names":["Input","classnames","debounce","React","memo","useCallback","useEffect","useId","useMemo","useRef","useState","createHistogramBuckets","getMaxBucketCount","styles","useStableData","DEBOUNCE_MS","RangeInputInner","valueCountPairs","isLoading","minValue","maxValue","onChange","showHistogram","className","style","config","minInputId","maxInputId","localMin","setLocalMin","formatValue","localMax","setLocalMax","onChangeRef","current","minValueRef","maxValueRef","debouncedMinChange","newValue","parsed","parseValue","debouncedMaxChange","cancel","displayPairs","computedRange","length","min","undefined","max","reduce","acc","p","Math","toNumber","value","Infinity","fromNumber","dataRange","dataMin","dataMax","buckets","maxBucketCount","handleMinChange","e","target","handleMaxChange","createElement","rangeInput","histogramContainer","map","bucket","index","height","count","isInRange","key","histogramBar","title","formatTooltip","rangeInputs","inputWrapper","htmlFor","inputLabel","minLabel","_extends","id","type","inputType","input","placeholder","formatPlaceholder","inputProps","separator","maxLabel","RangeInput"],"sources":["RangeInput.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 { Input } from \"@base-ui/react/input\";\nimport classnames from \"classnames\";\nimport { debounce } from \"lodash-es\";\nimport React, {\n memo,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n createHistogramBuckets,\n getMaxBucketCount,\n type HistogramBucket,\n} from \"./createHistogramBuckets.js\";\nimport styles from \"./RangeInput.module.css\";\nimport { useStableData } from \"./useStableData.js\";\n\nconst DEBOUNCE_MS = 300;\n\nexport interface RangeInputConfig<T> {\n inputType: \"number\" | \"date\";\n formatValue: (value: T | undefined) => string;\n parseValue: (value: string) => T | undefined;\n toNumber: (value: T) => number;\n fromNumber: (value: number) => T;\n minLabel: string;\n maxLabel: string;\n formatTooltip: (min: T, max: T, count: number) => string;\n formatPlaceholder?: (value: T) => string;\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n}\n\nexport interface RangeInputProps<T> {\n valueCountPairs: Array<{ value: T; count: number }>;\n isLoading: boolean;\n minValue: T | undefined;\n maxValue: T | undefined;\n onChange: (min: T | undefined, max: T | undefined) => void;\n showHistogram?: boolean;\n className?: string;\n style?: React.CSSProperties;\n config: RangeInputConfig<T>;\n}\n\nfunction RangeInputInner<T>({\n valueCountPairs,\n isLoading,\n minValue,\n maxValue,\n onChange,\n showHistogram = true,\n className,\n style,\n config,\n}: RangeInputProps<T>): React.ReactElement {\n const minInputId = useId();\n const maxInputId = useId();\n\n const [localMin, setLocalMin] = useState<string>(\n config.formatValue(minValue),\n );\n const [localMax, setLocalMax] = useState<string>(\n config.formatValue(maxValue),\n );\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const minValueRef = useRef(minValue);\n minValueRef.current = minValue;\n const maxValueRef = useRef(maxValue);\n maxValueRef.current = maxValue;\n\n const debouncedMinChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(parsed, maxValueRef.current);\n }, DEBOUNCE_MS),\n [config],\n );\n\n const debouncedMaxChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(minValueRef.current, parsed);\n }, DEBOUNCE_MS),\n [config],\n );\n\n useEffect(() => {\n setLocalMin(config.formatValue(minValue));\n debouncedMinChange.cancel();\n }, [minValue, config, debouncedMinChange]);\n\n useEffect(() => {\n setLocalMax(config.formatValue(maxValue));\n debouncedMaxChange.cancel();\n }, [maxValue, config, debouncedMaxChange]);\n\n useEffect(() => {\n return () => {\n debouncedMinChange.cancel();\n debouncedMaxChange.cancel();\n };\n }, [debouncedMinChange, debouncedMaxChange]);\n\n const displayPairs = useStableData(valueCountPairs, isLoading);\n\n const computedRange = useMemo(() => {\n if (displayPairs.length === 0) return { min: undefined, max: undefined };\n const min = displayPairs.reduce(\n (acc, p) => Math.min(acc, config.toNumber(p.value)),\n Infinity,\n );\n const max = displayPairs.reduce(\n (acc, p) => Math.max(acc, config.toNumber(p.value)),\n -Infinity,\n );\n return {\n min: config.fromNumber(min),\n max: config.fromNumber(max),\n };\n }, [displayPairs, config]);\n\n const dataRange = useMemo(() => ({\n dataMin: computedRange.min,\n dataMax: computedRange.max,\n }), [computedRange.min, computedRange.max]);\n\n const buckets = useMemo<Array<HistogramBucket<T>>>(() => {\n if (\n !showHistogram\n || displayPairs.length === 0\n || computedRange.min === undefined\n || computedRange.max === undefined\n ) {\n return [];\n }\n\n return createHistogramBuckets(\n displayPairs,\n { min: computedRange.min, max: computedRange.max },\n config.toNumber,\n config.fromNumber,\n );\n }, [showHistogram, displayPairs, computedRange, config]);\n\n const maxBucketCount = useMemo(() => getMaxBucketCount(buckets), [buckets]);\n\n const handleMinChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMin(newValue);\n debouncedMinChange(newValue);\n },\n [debouncedMinChange],\n );\n\n const handleMaxChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMax(newValue);\n debouncedMaxChange(newValue);\n },\n [debouncedMaxChange],\n );\n\n return (\n <div\n className={classnames(styles.rangeInput, className)}\n style={style}\n data-loading={isLoading}\n >\n {showHistogram && (\n <div\n className={styles.histogramContainer}\n data-empty={buckets.length === 0}\n >\n {buckets.map((bucket, index) => {\n const height = (bucket.count / maxBucketCount) * 100;\n const isInRange = (minValue === undefined\n || config.toNumber(bucket.max) >= config.toNumber(minValue))\n && (maxValue === undefined\n || config.toNumber(bucket.min) <= config.toNumber(maxValue));\n\n return (\n <div\n key={index}\n className={styles.histogramBar}\n data-in-range={isInRange}\n style={{ height: `${Math.max(height, 2)}%` }}\n title={config.formatTooltip(\n bucket.min,\n bucket.max,\n bucket.count,\n )}\n />\n );\n })}\n </div>\n )}\n\n <div className={styles.rangeInputs}>\n <div className={styles.inputWrapper}>\n <label htmlFor={minInputId} className={styles.inputLabel}>\n {config.minLabel}\n </label>\n <Input\n id={minInputId}\n type={config.inputType}\n className={styles.input}\n value={localMin}\n onChange={handleMinChange}\n placeholder={dataRange.dataMin !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMin)\n : undefined}\n {...config.inputProps}\n />\n </div>\n\n <span className={styles.separator} aria-hidden=\"true\">\n –\n </span>\n\n <div className={styles.inputWrapper}>\n <label htmlFor={maxInputId} className={styles.inputLabel}>\n {config.maxLabel}\n </label>\n <Input\n id={maxInputId}\n type={config.inputType}\n className={styles.input}\n value={localMax}\n onChange={handleMaxChange}\n placeholder={dataRange.dataMax !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMax)\n : undefined}\n {...config.inputProps}\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport const RangeInput = memo(RangeInputInner) as typeof RangeInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -80,9 +80,7 @@ function SingleSelectInputInner({
|
|
|
80
80
|
className: styles.clearButton,
|
|
81
81
|
onClick: handleClear,
|
|
82
82
|
"aria-label": "Clear selection"
|
|
83
|
-
}, /*#__PURE__*/React.createElement(Cross,
|
|
84
|
-
color: "currentColor"
|
|
85
|
-
}))));
|
|
83
|
+
}, /*#__PURE__*/React.createElement(Cross, null))));
|
|
86
84
|
}
|
|
87
85
|
export const SingleSelectInput = /*#__PURE__*/memo(SingleSelectInputInner);
|
|
88
86
|
//# sourceMappingURL=SingleSelectInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SingleSelectInput.js","names":["Button","Cross","classnames","React","memo","useCallback","useMemo","Select","sharedStyles","styles","SingleSelectInputInner","values","isLoading","error","selectedValue","onChange","className","style","placeholder","showClearButton","showCounts","ariaLabel","handleValueChange","value","undefined","handleClear","items","result","count","toLocaleString","createElement","singleSelect","loadingMessage","errorMessage","message","length","emptyMessage","selectContainer","Root","onValueChange","Trigger","Portal","Positioner","Popup","map","Item","key","type","clearButton","onClick","
|
|
1
|
+
{"version":3,"file":"SingleSelectInput.js","names":["Button","Cross","classnames","React","memo","useCallback","useMemo","Select","sharedStyles","styles","SingleSelectInputInner","values","isLoading","error","selectedValue","onChange","className","style","placeholder","showClearButton","showCounts","ariaLabel","handleValueChange","value","undefined","handleClear","items","result","count","toLocaleString","createElement","singleSelect","loadingMessage","errorMessage","message","length","emptyMessage","selectContainer","Root","onValueChange","Trigger","Portal","Positioner","Popup","map","Item","key","type","clearButton","onClick","SingleSelectInput"],"sources":["SingleSelectInput.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 { Cross } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { Select } from \"../../../base-components/select/Select.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport styles from \"./SingleSelectInput.module.css\";\n\ninterface SingleSelectInputProps {\n values: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n selectedValue: string | undefined;\n onChange: (value: string | undefined) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n showClearButton?: boolean;\n showCounts?: boolean;\n ariaLabel?: string;\n}\n\nfunction SingleSelectInputInner({\n values,\n isLoading,\n error,\n selectedValue,\n onChange,\n className,\n style,\n placeholder = \"Select a value...\",\n showClearButton = true,\n showCounts = false,\n ariaLabel = \"Select value\",\n}: SingleSelectInputProps): React.ReactElement {\n const handleValueChange = useCallback(\n (value: string | null) => {\n onChange(value ?? undefined);\n },\n [onChange],\n );\n\n const handleClear = useCallback(() => {\n onChange(undefined);\n }, [onChange]);\n\n const items = useMemo(() => {\n const result: Record<string, string> = {};\n for (const { value, count } of values) {\n result[value] = showCounts\n ? `${value} (${count.toLocaleString()})`\n : value;\n }\n return result;\n }, [values, showCounts]);\n\n return (\n <div\n className={classnames(styles.singleSelect, className)}\n style={style}\n data-loading={isLoading}\n >\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Loading options...\n </div>\n )}\n\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading options: {error.message}\n </div>\n )}\n\n {!isLoading && !error && values.length === 0 && (\n <div className={sharedStyles.emptyMessage}>\n No options available\n </div>\n )}\n\n {(values.length > 0 || isLoading) && (\n <div className={styles.selectContainer}>\n <Select.Root<string>\n value={selectedValue ?? null}\n onValueChange={handleValueChange}\n items={items}\n >\n <Select.Trigger\n placeholder={placeholder}\n aria-label={ariaLabel}\n />\n <Select.Portal>\n <Select.Positioner>\n <Select.Popup>\n {values.map(({ value, count }) => (\n <Select.Item key={value} value={value}>\n {showCounts\n ? `${value} (${count.toLocaleString()})`\n : value}\n </Select.Item>\n ))}\n </Select.Popup>\n </Select.Positioner>\n </Select.Portal>\n </Select.Root>\n {showClearButton && selectedValue !== undefined && (\n <Button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClear}\n aria-label=\"Clear selection\"\n >\n <Cross />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const SingleSelectInput = memo(\n SingleSelectInputInner,\n) as typeof SingleSelectInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,14 +16,14 @@
|
|
|
16
16
|
|
|
17
17
|
import { useRef } from "react";
|
|
18
18
|
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
export function
|
|
19
|
+
// Preserves the last non-loading data value so filter inputs don't flash
|
|
20
|
+
// blank during revalidation. @osdk/react hooks don't provide stale-while-
|
|
21
|
+
// revalidate behavior natively, so this bridges the gap at the UI layer.
|
|
22
|
+
export function useStableData(data, isLoading) {
|
|
23
23
|
const ref = useRef(data);
|
|
24
24
|
if (!isLoading) {
|
|
25
25
|
ref.current = data;
|
|
26
26
|
}
|
|
27
27
|
return ref.current;
|
|
28
28
|
}
|
|
29
|
-
//# sourceMappingURL=
|
|
29
|
+
//# sourceMappingURL=useStableData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStableData.js","names":["useRef","useStableData","data","isLoading","ref","current"],"sources":["useStableData.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useRef } from \"react\";\n\n// Preserves the last non-loading data value so filter inputs don't flash\n// blank during revalidation. @osdk/react hooks don't provide stale-while-\n// revalidate behavior natively, so this bridges the gap at the UI layer.\nexport function useStableData<T>(data: T, isLoading: boolean): T {\n const ref = useRef(data);\n if (!isLoading) {\n ref.current = data;\n }\n return ref.current;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,OAAO;;AAE9B;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAAIC,IAAO,EAAEC,SAAkB,EAAK;EAC/D,MAAMC,GAAG,GAAGJ,MAAM,CAACE,IAAI,CAAC;EACxB,IAAI,CAACC,SAAS,EAAE;IACdC,GAAG,CAACC,OAAO,GAAGH,IAAI;EACpB;EACA,OAAOE,GAAG,CAACC,OAAO;AACpB","ignoreList":[]}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import { useOsdkAggregation } from "@osdk/react/experimental";
|
|
18
18
|
import { useMemo } from "react";
|
|
19
|
-
export function usePropertyAggregation(objectType, propertyKey, options) {
|
|
19
|
+
export function usePropertyAggregation(objectType, propertyKey, objectSet, options) {
|
|
20
20
|
// AggregateOpts requires specific property keys from Q, but we're dynamically
|
|
21
21
|
// using propertyKey. The cast is unavoidable for this dynamic filter pattern.
|
|
22
22
|
const aggregateOptions = useMemo(() => ({
|
|
@@ -37,7 +37,8 @@ export function usePropertyAggregation(objectType, propertyKey, options) {
|
|
|
37
37
|
error
|
|
38
38
|
} = useOsdkAggregation(objectType, {
|
|
39
39
|
aggregate: aggregateOptions,
|
|
40
|
-
where: options?.where
|
|
40
|
+
where: options?.where,
|
|
41
|
+
objectSet
|
|
41
42
|
});
|
|
42
43
|
const result = useMemo(() => {
|
|
43
44
|
if (!countData) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePropertyAggregation.js","names":["useOsdkAggregation","useMemo","usePropertyAggregation","objectType","propertyKey","options","aggregateOptions","$select","$count","$groupBy","$exact","$includeNullValue","data","countData","isLoading","error","aggregate","where","result","maxCount","values","item","rawValue","$group","count","push","value","isNull","String","Math","max","sort","a","b","limit","length","slice"],"sources":["usePropertyAggregation.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 AggregateOpts,\n ObjectTypeDefinition,\n PropertyKeys,\n WhereClause,\n} from \"@osdk/api\";\nimport { useOsdkAggregation } from \"@osdk/react/experimental\";\nimport { useMemo } from \"react\";\nimport type { AggregationGroupResult } from \"../utils/aggregationHelpers.js\";\n\nexport type { PropertyAggregationValue } from \"../types/AggregationTypes.js\";\n\nimport type { PropertyAggregationValue } from \"../types/AggregationTypes.js\";\n\nexport interface UsePropertyAggregationResult {\n data: PropertyAggregationValue[];\n maxCount: number;\n isLoading: boolean;\n error: Error | null;\n}\n\nexport interface UsePropertyAggregationOptions<\n Q extends ObjectTypeDefinition = ObjectTypeDefinition,\n> {\n limit?: number;\n where?: WhereClause<Q>;\n}\n\nexport function usePropertyAggregation<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n>(\n objectType: Q,\n propertyKey: K,\n options?: UsePropertyAggregationOptions<Q>,\n): UsePropertyAggregationResult {\n // AggregateOpts requires specific property keys from Q, but we're dynamically\n // using propertyKey. The cast is unavoidable for this dynamic filter pattern.\n const aggregateOptions = useMemo(\n () =>\n ({\n $select: { $count: \"unordered\" as const },\n $groupBy: {\n [propertyKey as string]: {\n $exact: { $includeNullValue: true },\n },\n },\n }) as AggregateOpts<Q>,\n [propertyKey],\n );\n\n const { data: countData, isLoading, error } = useOsdkAggregation(objectType, {\n aggregate: aggregateOptions,\n where: options?.where,\n });\n\n const result = useMemo(\n (): { data: PropertyAggregationValue[]; maxCount: number } => {\n if (!countData) {\n return { data: [], maxCount: 0 };\n }\n\n const values: PropertyAggregationValue[] = [];\n let maxCount = 0;\n\n // The aggregation result type varies by query structure. Since we're building\n // the query dynamically based on propertyKey, we cast to a known shape that\n // matches the $groupBy + $count aggregation pattern.\n const dataArray = countData as AggregationGroupResult;\n\n for (const item of dataArray) {\n const rawValue = item.$group[propertyKey as string];\n const count = item.$count ?? 0;\n\n if (rawValue == null) {\n values.push({ value: \"\", count, isNull: true });\n } else {\n values.push({ value: String(rawValue), count });\n }\n maxCount = Math.max(maxCount, count);\n }\n\n values.sort((a, b) => b.count - a.count);\n\n if (options?.limit && values.length > options.limit) {\n return { data: values.slice(0, options.limit), maxCount };\n }\n\n return { data: values, maxCount };\n },\n [countData, propertyKey, options?.limit],\n );\n\n return {\n data: result.data,\n maxCount: result.maxCount,\n isLoading,\n error: error ?? null,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;
|
|
1
|
+
{"version":3,"file":"usePropertyAggregation.js","names":["useOsdkAggregation","useMemo","usePropertyAggregation","objectType","propertyKey","objectSet","options","aggregateOptions","$select","$count","$groupBy","$exact","$includeNullValue","data","countData","isLoading","error","aggregate","where","result","maxCount","values","item","rawValue","$group","count","push","value","isNull","String","Math","max","sort","a","b","limit","length","slice"],"sources":["usePropertyAggregation.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 AggregateOpts,\n ObjectSet,\n ObjectTypeDefinition,\n PropertyKeys,\n WhereClause,\n} from \"@osdk/api\";\nimport { useOsdkAggregation } from \"@osdk/react/experimental\";\nimport { useMemo } from \"react\";\nimport type { AggregationGroupResult } from \"../utils/aggregationHelpers.js\";\n\nexport type { PropertyAggregationValue } from \"../types/AggregationTypes.js\";\n\nimport type { PropertyAggregationValue } from \"../types/AggregationTypes.js\";\n\nexport interface UsePropertyAggregationResult {\n data: PropertyAggregationValue[];\n maxCount: number;\n isLoading: boolean;\n error: Error | null;\n}\n\nexport interface UsePropertyAggregationOptions<\n Q extends ObjectTypeDefinition = ObjectTypeDefinition,\n> {\n limit?: number;\n where?: WhereClause<Q>;\n}\n\nexport function usePropertyAggregation<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n>(\n objectType: Q,\n propertyKey: K,\n objectSet: ObjectSet<Q>,\n options?: UsePropertyAggregationOptions<Q>,\n): UsePropertyAggregationResult {\n // AggregateOpts requires specific property keys from Q, but we're dynamically\n // using propertyKey. The cast is unavoidable for this dynamic filter pattern.\n const aggregateOptions = useMemo(\n () =>\n ({\n $select: { $count: \"unordered\" as const },\n $groupBy: {\n [propertyKey as string]: {\n $exact: { $includeNullValue: true },\n },\n },\n }) as AggregateOpts<Q>,\n [propertyKey],\n );\n\n const { data: countData, isLoading, error } = useOsdkAggregation(objectType, {\n aggregate: aggregateOptions,\n where: options?.where,\n objectSet,\n });\n\n const result = useMemo(\n (): { data: PropertyAggregationValue[]; maxCount: number } => {\n if (!countData) {\n return { data: [], maxCount: 0 };\n }\n\n const values: PropertyAggregationValue[] = [];\n let maxCount = 0;\n\n // The aggregation result type varies by query structure. Since we're building\n // the query dynamically based on propertyKey, we cast to a known shape that\n // matches the $groupBy + $count aggregation pattern.\n const dataArray = countData as AggregationGroupResult;\n\n for (const item of dataArray) {\n const rawValue = item.$group[propertyKey as string];\n const count = item.$count ?? 0;\n\n if (rawValue == null) {\n values.push({ value: \"\", count, isNull: true });\n } else {\n values.push({ value: String(rawValue), count });\n }\n maxCount = Math.max(maxCount, count);\n }\n\n values.sort((a, b) => b.count - a.count);\n\n if (options?.limit && values.length > options.limit) {\n return { data: values.slice(0, options.limit), maxCount };\n }\n\n return { data: values, maxCount };\n },\n [countData, propertyKey, options?.limit],\n );\n\n return {\n data: result.data,\n maxCount: result.maxCount,\n isLoading,\n error: error ?? null,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA,SAASA,kBAAkB,QAAQ,0BAA0B;AAC7D,SAASC,OAAO,QAAQ,OAAO;AAqB/B,OAAO,SAASC,sBAAsBA,CAIpCC,UAAa,EACbC,WAAc,EACdC,SAAuB,EACvBC,OAA0C,EACZ;EAC9B;EACA;EACA,MAAMC,gBAAgB,GAAGN,OAAO,CAC9B,OACG;IACCO,OAAO,EAAE;MAAEC,MAAM,EAAE;IAAqB,CAAC;IACzCC,QAAQ,EAAE;MACR,CAACN,WAAW,GAAa;QACvBO,MAAM,EAAE;UAAEC,iBAAiB,EAAE;QAAK;MACpC;IACF;EACF,CAAC,CAAqB,EACxB,CAACR,WAAW,CACd,CAAC;EAED,MAAM;IAAES,IAAI,EAAEC,SAAS;IAAEC,SAAS;IAAEC;EAAM,CAAC,GAAGhB,kBAAkB,CAACG,UAAU,EAAE;IAC3Ec,SAAS,EAAEV,gBAAgB;IAC3BW,KAAK,EAAEZ,OAAO,EAAEY,KAAK;IACrBb;EACF,CAAC,CAAC;EAEF,MAAMc,MAAM,GAAGlB,OAAO,CACpB,MAA8D;IAC5D,IAAI,CAACa,SAAS,EAAE;MACd,OAAO;QAAED,IAAI,EAAE,EAAE;QAAEO,QAAQ,EAAE;MAAE,CAAC;IAClC;IAEA,MAAMC,MAAkC,GAAG,EAAE;IAC7C,IAAID,QAAQ,GAAG,CAAC;;IAEhB;IACA;IACA;;IAGA,KAAK,MAAME,IAAI,IAFGR,SAAS,EAEG;MAC5B,MAAMS,QAAQ,GAAGD,IAAI,CAACE,MAAM,CAACpB,WAAW,CAAW;MACnD,MAAMqB,KAAK,GAAGH,IAAI,CAACb,MAAM,IAAI,CAAC;MAE9B,IAAIc,QAAQ,IAAI,IAAI,EAAE;QACpBF,MAAM,CAACK,IAAI,CAAC;UAAEC,KAAK,EAAE,EAAE;UAAEF,KAAK;UAAEG,MAAM,EAAE;QAAK,CAAC,CAAC;MACjD,CAAC,MAAM;QACLP,MAAM,CAACK,IAAI,CAAC;UAAEC,KAAK,EAAEE,MAAM,CAACN,QAAQ,CAAC;UAAEE;QAAM,CAAC,CAAC;MACjD;MACAL,QAAQ,GAAGU,IAAI,CAACC,GAAG,CAACX,QAAQ,EAAEK,KAAK,CAAC;IACtC;IAEAJ,MAAM,CAACW,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAACT,KAAK,GAAGQ,CAAC,CAACR,KAAK,CAAC;IAExC,IAAInB,OAAO,EAAE6B,KAAK,IAAId,MAAM,CAACe,MAAM,GAAG9B,OAAO,CAAC6B,KAAK,EAAE;MACnD,OAAO;QAAEtB,IAAI,EAAEQ,MAAM,CAACgB,KAAK,CAAC,CAAC,EAAE/B,OAAO,CAAC6B,KAAK,CAAC;QAAEf;MAAS,CAAC;IAC3D;IAEA,OAAO;MAAEP,IAAI,EAAEQ,MAAM;MAAED;IAAS,CAAC;EACnC,CAAC,EACD,CAACN,SAAS,EAAEV,WAAW,EAAEE,OAAO,EAAE6B,KAAK,CACzC,CAAC;EAED,OAAO;IACLtB,IAAI,EAAEM,MAAM,CAACN,IAAI;IACjBO,QAAQ,EAAED,MAAM,CAACC,QAAQ;IACzBL,SAAS;IACTC,KAAK,EAAEA,KAAK,IAAI;EAClB,CAAC;AACH","ignoreList":[]}
|
|
@@ -15,16 +15,20 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import React, { memo, useCallback, useMemo } from "react";
|
|
18
|
+
import { FilterInputExcludeRow } from "../base/FilterInputExcludeRow.js";
|
|
18
19
|
import { CheckboxListInput } from "../base/inputs/CheckboxListInput.js";
|
|
19
20
|
import { usePropertyAggregation } from "../hooks/usePropertyAggregation.js";
|
|
20
21
|
import { coerceToStringArray } from "../utils/coerceFilterValue.js";
|
|
21
22
|
function CheckboxListFilterInputInner({
|
|
22
23
|
objectType,
|
|
24
|
+
objectSet,
|
|
23
25
|
propertyKey,
|
|
24
26
|
filterState,
|
|
25
27
|
onFilterStateChanged,
|
|
26
28
|
whereClause,
|
|
27
|
-
colorMap
|
|
29
|
+
colorMap,
|
|
30
|
+
searchQuery,
|
|
31
|
+
excludeRowOpen
|
|
28
32
|
}) {
|
|
29
33
|
const selectedValues = useMemo(() => filterState?.type === "SELECT" ? coerceToStringArray(filterState.selectedValues) : [], [filterState]);
|
|
30
34
|
const isExcluding = filterState?.isExcluding ?? false;
|
|
@@ -42,15 +46,21 @@ function CheckboxListFilterInputInner({
|
|
|
42
46
|
data,
|
|
43
47
|
isLoading,
|
|
44
48
|
error
|
|
45
|
-
} = usePropertyAggregation(objectType, propertyKey, aggregationOptions);
|
|
46
|
-
return /*#__PURE__*/React.createElement(
|
|
49
|
+
} = usePropertyAggregation(objectType, propertyKey, objectSet, aggregationOptions);
|
|
50
|
+
return /*#__PURE__*/React.createElement(FilterInputExcludeRow, {
|
|
51
|
+
excludeRowOpen: excludeRowOpen,
|
|
52
|
+
filterState: filterState,
|
|
53
|
+
onFilterStateChanged: onFilterStateChanged,
|
|
54
|
+
totalValueCount: data.length
|
|
55
|
+
}, /*#__PURE__*/React.createElement(CheckboxListInput, {
|
|
47
56
|
values: data,
|
|
48
57
|
isLoading: isLoading,
|
|
49
58
|
error: error,
|
|
50
59
|
selectedValues: selectedValues,
|
|
51
60
|
onChange: handleChange,
|
|
52
|
-
colorMap: colorMap
|
|
53
|
-
|
|
61
|
+
colorMap: colorMap,
|
|
62
|
+
searchQuery: searchQuery
|
|
63
|
+
}));
|
|
54
64
|
}
|
|
55
65
|
export const CheckboxListFilterInput = /*#__PURE__*/memo(CheckboxListFilterInputInner);
|
|
56
66
|
//# sourceMappingURL=CheckboxListFilterInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckboxListFilterInput.js","names":["React","memo","useCallback","useMemo","CheckboxListInput","usePropertyAggregation","coerceToStringArray","CheckboxListFilterInputInner","objectType","propertyKey","filterState","onFilterStateChanged","whereClause","colorMap","selectedValues","type","isExcluding","handleChange","newSelectedValues","aggregationOptions","where","data","isLoading","error","createElement","values","onChange","CheckboxListFilterInput"],"sources":["CheckboxListFilterInput.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 {\n ObjectTypeDefinition,\n PropertyKeys,\n WhereClause,\n} from \"@osdk/api\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { CheckboxListInput } from \"../base/inputs/CheckboxListInput.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { usePropertyAggregation } from \"../hooks/usePropertyAggregation.js\";\nimport { coerceToStringArray } from \"../utils/coerceFilterValue.js\";\n\ninterface CheckboxListFilterInputProps<Q extends ObjectTypeDefinition> {\n objectType: Q;\n propertyKey: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n whereClause: WhereClause<Q>;\n colorMap?: Record<string, string>;\n}\n\nfunction CheckboxListFilterInputInner<Q extends ObjectTypeDefinition>({\n objectType,\n propertyKey,\n filterState,\n onFilterStateChanged,\n whereClause,\n colorMap,\n}: CheckboxListFilterInputProps<Q>): React.ReactElement {\n const selectedValues = useMemo(\n () =>\n filterState?.type === \"SELECT\"\n ? coerceToStringArray(filterState.selectedValues)\n : [],\n [filterState],\n );\n const isExcluding = filterState?.isExcluding ?? false;\n\n const handleChange = useCallback(\n (newSelectedValues: string[]) => {\n onFilterStateChanged({\n type: \"SELECT\",\n selectedValues: newSelectedValues,\n isExcluding,\n });\n },\n [onFilterStateChanged, isExcluding],\n );\n\n const aggregationOptions = useMemo(\n () => ({ where: whereClause }),\n [whereClause],\n );\n\n const { data, isLoading, error } = usePropertyAggregation(\n objectType,\n propertyKey as PropertyKeys<Q>,\n aggregationOptions,\n );\n\n return (\n <CheckboxListInput\n
|
|
1
|
+
{"version":3,"file":"CheckboxListFilterInput.js","names":["React","memo","useCallback","useMemo","FilterInputExcludeRow","CheckboxListInput","usePropertyAggregation","coerceToStringArray","CheckboxListFilterInputInner","objectType","objectSet","propertyKey","filterState","onFilterStateChanged","whereClause","colorMap","searchQuery","excludeRowOpen","selectedValues","type","isExcluding","handleChange","newSelectedValues","aggregationOptions","where","data","isLoading","error","createElement","totalValueCount","length","values","onChange","CheckboxListFilterInput"],"sources":["CheckboxListFilterInput.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 {\n ObjectSet,\n ObjectTypeDefinition,\n PropertyKeys,\n WhereClause,\n} from \"@osdk/api\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { FilterInputExcludeRow } from \"../base/FilterInputExcludeRow.js\";\nimport { CheckboxListInput } from \"../base/inputs/CheckboxListInput.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { usePropertyAggregation } from \"../hooks/usePropertyAggregation.js\";\nimport { coerceToStringArray } from \"../utils/coerceFilterValue.js\";\n\ninterface CheckboxListFilterInputProps<Q extends ObjectTypeDefinition> {\n objectType: Q;\n objectSet: ObjectSet<Q>;\n propertyKey: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n whereClause: WhereClause<Q>;\n colorMap?: Record<string, string>;\n searchQuery?: string;\n excludeRowOpen?: boolean;\n}\n\nfunction CheckboxListFilterInputInner<Q extends ObjectTypeDefinition>({\n objectType,\n objectSet,\n propertyKey,\n filterState,\n onFilterStateChanged,\n whereClause,\n colorMap,\n searchQuery,\n excludeRowOpen,\n}: CheckboxListFilterInputProps<Q>): React.ReactElement {\n const selectedValues = useMemo(\n () =>\n filterState?.type === \"SELECT\"\n ? coerceToStringArray(filterState.selectedValues)\n : [],\n [filterState],\n );\n const isExcluding = filterState?.isExcluding ?? false;\n\n const handleChange = useCallback(\n (newSelectedValues: string[]) => {\n onFilterStateChanged({\n type: \"SELECT\",\n selectedValues: newSelectedValues,\n isExcluding,\n });\n },\n [onFilterStateChanged, isExcluding],\n );\n\n const aggregationOptions = useMemo(\n () => ({ where: whereClause }),\n [whereClause],\n );\n\n const { data, isLoading, error } = usePropertyAggregation(\n objectType,\n propertyKey as PropertyKeys<Q>,\n objectSet,\n aggregationOptions,\n );\n\n return (\n <FilterInputExcludeRow\n excludeRowOpen={excludeRowOpen}\n filterState={filterState}\n onFilterStateChanged={onFilterStateChanged}\n totalValueCount={data.length}\n >\n <CheckboxListInput\n values={data}\n isLoading={isLoading}\n error={error}\n selectedValues={selectedValues}\n onChange={handleChange}\n colorMap={colorMap}\n searchQuery={searchQuery}\n />\n </FilterInputExcludeRow>\n );\n}\n\nexport const CheckboxListFilterInput: typeof CheckboxListFilterInputInner =\n memo(CheckboxListFilterInputInner) as typeof CheckboxListFilterInputInner;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA,OAAOA,KAAK,IAAIC,IAAI,EAAEC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AACzD,SAASC,qBAAqB,QAAQ,kCAAkC;AACxE,SAASC,iBAAiB,QAAQ,qCAAqC;AAEvE,SAASC,sBAAsB,QAAQ,oCAAoC;AAC3E,SAASC,mBAAmB,QAAQ,+BAA+B;AAcnE,SAASC,4BAA4BA,CAAiC;EACpEC,UAAU;EACVC,SAAS;EACTC,WAAW;EACXC,WAAW;EACXC,oBAAoB;EACpBC,WAAW;EACXC,QAAQ;EACRC,WAAW;EACXC;AAC+B,CAAC,EAAsB;EACtD,MAAMC,cAAc,GAAGf,OAAO,CAC5B,MACES,WAAW,EAAEO,IAAI,KAAK,QAAQ,GAC1BZ,mBAAmB,CAACK,WAAW,CAACM,cAAc,CAAC,GAC/C,EAAE,EACR,CAACN,WAAW,CACd,CAAC;EACD,MAAMQ,WAAW,GAAGR,WAAW,EAAEQ,WAAW,IAAI,KAAK;EAErD,MAAMC,YAAY,GAAGnB,WAAW,CAC7BoB,iBAA2B,IAAK;IAC/BT,oBAAoB,CAAC;MACnBM,IAAI,EAAE,QAAQ;MACdD,cAAc,EAAEI,iBAAiB;MACjCF;IACF,CAAC,CAAC;EACJ,CAAC,EACD,CAACP,oBAAoB,EAAEO,WAAW,CACpC,CAAC;EAED,MAAMG,kBAAkB,GAAGpB,OAAO,CAChC,OAAO;IAAEqB,KAAK,EAAEV;EAAY,CAAC,CAAC,EAC9B,CAACA,WAAW,CACd,CAAC;EAED,MAAM;IAAEW,IAAI;IAAEC,SAAS;IAAEC;EAAM,CAAC,GAAGrB,sBAAsB,CACvDG,UAAU,EACVE,WAAW,EACXD,SAAS,EACTa,kBACF,CAAC;EAED,oBACEvB,KAAA,CAAA4B,aAAA,CAACxB,qBAAqB;IACpBa,cAAc,EAAEA,cAAe;IAC/BL,WAAW,EAAEA,WAAY;IACzBC,oBAAoB,EAAEA,oBAAqB;IAC3CgB,eAAe,EAAEJ,IAAI,CAACK;EAAO,gBAE7B9B,KAAA,CAAA4B,aAAA,CAACvB,iBAAiB;IAChB0B,MAAM,EAAEN,IAAK;IACbC,SAAS,EAAEA,SAAU;IACrBC,KAAK,EAAEA,KAAM;IACbT,cAAc,EAAEA,cAAe;IAC/Bc,QAAQ,EAAEX,YAAa;IACvBN,QAAQ,EAAEA,QAAS;IACnBC,WAAW,EAAEA;EAAY,CAC1B,CACoB,CAAC;AAE5B;AAEA,OAAO,MAAMiB,uBAA4D,gBACvEhC,IAAI,CAACO,4BAA4B,CAAwC","ignoreList":[]}
|
|
@@ -21,6 +21,7 @@ import { NullValueWrapper } from "../base/inputs/NullValueWrapper.js";
|
|
|
21
21
|
import { createGroupByAggregateOptions, createNullCountAggregateOptions, createNullWhereClause } from "../utils/aggregationHelpers.js";
|
|
22
22
|
function DateRangeFilterInputInner({
|
|
23
23
|
objectType,
|
|
24
|
+
objectSet,
|
|
24
25
|
propertyKey,
|
|
25
26
|
filterState,
|
|
26
27
|
onFilterStateChanged
|
|
@@ -45,8 +46,9 @@ function DateRangeFilterInputInner({
|
|
|
45
46
|
}, [onFilterStateChanged, includeNull]);
|
|
46
47
|
const aggregateOptions = useMemo(() => createGroupByAggregateOptions(propertyKey), [propertyKey]);
|
|
47
48
|
const histogramArgs = useMemo(() => ({
|
|
48
|
-
aggregate: aggregateOptions
|
|
49
|
-
|
|
49
|
+
aggregate: aggregateOptions,
|
|
50
|
+
objectSet
|
|
51
|
+
}), [aggregateOptions, objectSet]);
|
|
50
52
|
const {
|
|
51
53
|
data: aggregateData,
|
|
52
54
|
isLoading: histLoading
|
|
@@ -72,8 +74,9 @@ function DateRangeFilterInputInner({
|
|
|
72
74
|
const nullWhereClause = useMemo(() => createNullWhereClause(propertyKey), [propertyKey]);
|
|
73
75
|
const nullCountArgs = useMemo(() => ({
|
|
74
76
|
where: nullWhereClause,
|
|
75
|
-
aggregate: nullCountAggregateOptions
|
|
76
|
-
|
|
77
|
+
aggregate: nullCountAggregateOptions,
|
|
78
|
+
objectSet
|
|
79
|
+
}), [nullWhereClause, nullCountAggregateOptions, objectSet]);
|
|
77
80
|
const {
|
|
78
81
|
data: nullCountData,
|
|
79
82
|
isLoading: nullLoading,
|
|
@@ -87,15 +90,16 @@ function DateRangeFilterInputInner({
|
|
|
87
90
|
}
|
|
88
91
|
return 0;
|
|
89
92
|
}, [nullCountData]);
|
|
93
|
+
const isLoading = histLoading || nullLoading;
|
|
90
94
|
return /*#__PURE__*/React.createElement(NullValueWrapper, {
|
|
91
95
|
nullCount: nullCount,
|
|
92
|
-
isLoading:
|
|
96
|
+
isLoading: isLoading,
|
|
93
97
|
error: nullError,
|
|
94
98
|
includeNull: includeNull,
|
|
95
99
|
onIncludeNullChange: handleNullChange
|
|
96
100
|
}, /*#__PURE__*/React.createElement(DateRangeInput, {
|
|
97
101
|
valueCountPairs: valueCountPairs,
|
|
98
|
-
isLoading:
|
|
102
|
+
isLoading: isLoading,
|
|
99
103
|
minValue: dateRangeState?.minValue,
|
|
100
104
|
maxValue: dateRangeState?.maxValue,
|
|
101
105
|
onChange: handleRangeChange
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateRangeFilterInput.js","names":["useOsdkAggregation","React","memo","useCallback","useMemo","DateRangeInput","NullValueWrapper","createGroupByAggregateOptions","createNullCountAggregateOptions","createNullWhereClause","DateRangeFilterInputInner","objectType","propertyKey","filterState","onFilterStateChanged","dateRangeState","type","undefined","includeNull","handleNullChange","minValue","maxValue","handleRangeChange","aggregateOptions","histogramArgs","aggregate","data","aggregateData","isLoading","histLoading","valueCountPairs","pairs","item","rawValue","$group","date","Date","String","isNaN","getTime","push","value","count","$count","nullCountAggregateOptions","nullWhereClause","nullCountArgs","where","nullCountData","nullLoading","error","nullError","nullCount","result","createElement","onIncludeNullChange","onChange","DateRangeFilterInput"],"sources":["DateRangeFilterInput.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 { useOsdkAggregation } from \"@osdk/react/experimental\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { DateRangeInput } from \"../base/inputs/DateRangeInput.js\";\nimport { NullValueWrapper } from \"../base/inputs/NullValueWrapper.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport {\n createGroupByAggregateOptions,\n createNullCountAggregateOptions,\n createNullWhereClause,\n} from \"../utils/aggregationHelpers.js\";\n\ninterface DateRangeFilterInputProps<Q extends ObjectTypeDefinition> {\n objectType: Q;\n propertyKey: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n}\n\nfunction DateRangeFilterInputInner<Q extends ObjectTypeDefinition>({\n objectType,\n propertyKey,\n filterState,\n onFilterStateChanged,\n}: DateRangeFilterInputProps<Q>): React.ReactElement {\n const dateRangeState = filterState?.type === \"DATE_RANGE\"\n ? filterState\n : undefined;\n const includeNull = filterState?.includeNull;\n\n const handleNullChange = useCallback(\n (includeNull: boolean) => {\n onFilterStateChanged({\n type: \"DATE_RANGE\",\n minValue: dateRangeState?.minValue,\n maxValue: dateRangeState?.maxValue,\n includeNull,\n });\n },\n [onFilterStateChanged, dateRangeState?.minValue, dateRangeState?.maxValue],\n );\n\n const handleRangeChange = useCallback(\n (minValue: Date | undefined, maxValue: Date | undefined) => {\n onFilterStateChanged({\n type: \"DATE_RANGE\",\n minValue,\n maxValue,\n includeNull,\n });\n },\n [onFilterStateChanged, includeNull],\n );\n\n const aggregateOptions = useMemo(\n () => createGroupByAggregateOptions<Q>(propertyKey),\n [propertyKey],\n );\n\n const histogramArgs = useMemo(\n () => ({ aggregate: aggregateOptions }),\n [aggregateOptions],\n );\n\n const { data: aggregateData, isLoading: histLoading } = useOsdkAggregation(\n objectType,\n histogramArgs,\n );\n\n const valueCountPairs = useMemo<Array<{ value: Date; count: number }>>(\n () => {\n if (!aggregateData) return [];\n const dataArray = aggregateData as Iterable<{\n $group: Record<string, unknown>;\n $count?: number;\n }>;\n const pairs: Array<{ value: Date; count: number }> = [];\n for (const item of dataArray) {\n const rawValue = item.$group[propertyKey];\n if (rawValue != null) {\n const date = new Date(String(rawValue));\n if (!isNaN(date.getTime())) {\n pairs.push({ value: date, count: item.$count ?? 0 });\n }\n }\n }\n return pairs;\n },\n [aggregateData, propertyKey],\n );\n\n const nullCountAggregateOptions = useMemo(\n () => createNullCountAggregateOptions<Q>(),\n [],\n );\n\n const nullWhereClause = useMemo(\n () => createNullWhereClause<Q>(propertyKey),\n [propertyKey],\n );\n\n const nullCountArgs = useMemo(\n () => ({
|
|
1
|
+
{"version":3,"file":"DateRangeFilterInput.js","names":["useOsdkAggregation","React","memo","useCallback","useMemo","DateRangeInput","NullValueWrapper","createGroupByAggregateOptions","createNullCountAggregateOptions","createNullWhereClause","DateRangeFilterInputInner","objectType","objectSet","propertyKey","filterState","onFilterStateChanged","dateRangeState","type","undefined","includeNull","handleNullChange","minValue","maxValue","handleRangeChange","aggregateOptions","histogramArgs","aggregate","data","aggregateData","isLoading","histLoading","valueCountPairs","pairs","item","rawValue","$group","date","Date","String","isNaN","getTime","push","value","count","$count","nullCountAggregateOptions","nullWhereClause","nullCountArgs","where","nullCountData","nullLoading","error","nullError","nullCount","result","createElement","onIncludeNullChange","onChange","DateRangeFilterInput"],"sources":["DateRangeFilterInput.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 } from \"@osdk/api\";\nimport { useOsdkAggregation } from \"@osdk/react/experimental\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { DateRangeInput } from \"../base/inputs/DateRangeInput.js\";\nimport { NullValueWrapper } from \"../base/inputs/NullValueWrapper.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport {\n createGroupByAggregateOptions,\n createNullCountAggregateOptions,\n createNullWhereClause,\n} from \"../utils/aggregationHelpers.js\";\n\ninterface DateRangeFilterInputProps<Q extends ObjectTypeDefinition> {\n objectType: Q;\n objectSet: ObjectSet<Q>;\n propertyKey: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (state: FilterState) => void;\n}\n\nfunction DateRangeFilterInputInner<Q extends ObjectTypeDefinition>({\n objectType,\n objectSet,\n propertyKey,\n filterState,\n onFilterStateChanged,\n}: DateRangeFilterInputProps<Q>): React.ReactElement {\n const dateRangeState = filterState?.type === \"DATE_RANGE\"\n ? filterState\n : undefined;\n const includeNull = filterState?.includeNull;\n\n const handleNullChange = useCallback(\n (includeNull: boolean) => {\n onFilterStateChanged({\n type: \"DATE_RANGE\",\n minValue: dateRangeState?.minValue,\n maxValue: dateRangeState?.maxValue,\n includeNull,\n });\n },\n [onFilterStateChanged, dateRangeState?.minValue, dateRangeState?.maxValue],\n );\n\n const handleRangeChange = useCallback(\n (minValue: Date | undefined, maxValue: Date | undefined) => {\n onFilterStateChanged({\n type: \"DATE_RANGE\",\n minValue,\n maxValue,\n includeNull,\n });\n },\n [onFilterStateChanged, includeNull],\n );\n\n const aggregateOptions = useMemo(\n () => createGroupByAggregateOptions<Q>(propertyKey),\n [propertyKey],\n );\n\n const histogramArgs = useMemo(\n () => ({ aggregate: aggregateOptions, objectSet }),\n [aggregateOptions, objectSet],\n );\n\n const { data: aggregateData, isLoading: histLoading } = useOsdkAggregation(\n objectType,\n histogramArgs,\n );\n\n const valueCountPairs = useMemo<Array<{ value: Date; count: number }>>(\n () => {\n if (!aggregateData) return [];\n const dataArray = aggregateData as Iterable<{\n $group: Record<string, unknown>;\n $count?: number;\n }>;\n const pairs: Array<{ value: Date; count: number }> = [];\n for (const item of dataArray) {\n const rawValue = item.$group[propertyKey];\n if (rawValue != null) {\n const date = new Date(String(rawValue));\n if (!isNaN(date.getTime())) {\n pairs.push({ value: date, count: item.$count ?? 0 });\n }\n }\n }\n return pairs;\n },\n [aggregateData, propertyKey],\n );\n\n const nullCountAggregateOptions = useMemo(\n () => createNullCountAggregateOptions<Q>(),\n [],\n );\n\n const nullWhereClause = useMemo(\n () => createNullWhereClause<Q>(propertyKey),\n [propertyKey],\n );\n\n const nullCountArgs = useMemo(\n () => ({\n where: nullWhereClause,\n aggregate: nullCountAggregateOptions,\n objectSet,\n }),\n [nullWhereClause, nullCountAggregateOptions, objectSet],\n );\n\n const {\n data: nullCountData,\n isLoading: nullLoading,\n error: nullError,\n } = useOsdkAggregation(\n objectType,\n nullCountArgs,\n );\n\n const nullCount = useMemo(() => {\n if (!nullCountData) return 0;\n const result = nullCountData as { $count?: number } | Iterable<unknown>;\n if (\"$count\" in result && typeof result.$count === \"number\") {\n return result.$count;\n }\n return 0;\n }, [nullCountData]);\n\n const isLoading = histLoading || nullLoading;\n\n return (\n <NullValueWrapper\n nullCount={nullCount}\n isLoading={isLoading}\n error={nullError}\n includeNull={includeNull}\n onIncludeNullChange={handleNullChange}\n >\n <DateRangeInput\n valueCountPairs={valueCountPairs}\n isLoading={isLoading}\n minValue={dateRangeState?.minValue}\n maxValue={dateRangeState?.maxValue}\n onChange={handleRangeChange}\n />\n </NullValueWrapper>\n );\n}\n\nexport const DateRangeFilterInput: typeof DateRangeFilterInputInner = memo(\n DateRangeFilterInputInner,\n) as typeof DateRangeFilterInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -40,6 +40,7 @@ function LinkedPropertyInputInner({
|
|
|
40
40
|
definition,
|
|
41
41
|
filterState,
|
|
42
42
|
onFilterStateChanged,
|
|
43
|
+
searchQuery,
|
|
43
44
|
className,
|
|
44
45
|
style
|
|
45
46
|
}) {
|
|
@@ -152,9 +153,11 @@ function LinkedPropertyInputInner({
|
|
|
152
153
|
const selectedValues = innerState?.type === "SELECT" ? coerceToStringArray(innerState.selectedValues) : [];
|
|
153
154
|
return /*#__PURE__*/React.createElement(LinkedCheckboxListInput, {
|
|
154
155
|
objectType: linkedObjectType,
|
|
156
|
+
objectSet: linkedObjectSet,
|
|
155
157
|
propertyKey: linkedPropertyKey,
|
|
156
158
|
selectedValues: selectedValues,
|
|
157
|
-
onChange: onSelectChange
|
|
159
|
+
onChange: onSelectChange,
|
|
160
|
+
searchQuery: searchQuery
|
|
158
161
|
});
|
|
159
162
|
}
|
|
160
163
|
case "MULTI_SELECT":
|
|
@@ -162,6 +165,7 @@ function LinkedPropertyInputInner({
|
|
|
162
165
|
const values = innerState?.type === "SELECT" ? coerceToStringArray(innerState.selectedValues) : [];
|
|
163
166
|
return /*#__PURE__*/React.createElement(LinkedMultiSelectInput, {
|
|
164
167
|
objectType: linkedObjectType,
|
|
168
|
+
objectSet: linkedObjectSet,
|
|
165
169
|
propertyKey: linkedPropertyKey,
|
|
166
170
|
selectedValues: values,
|
|
167
171
|
onChange: onSelectChange
|
|
@@ -172,6 +176,7 @@ function LinkedPropertyInputInner({
|
|
|
172
176
|
const value = innerState?.type === "SELECT" ? coerceToString(innerState.selectedValues[0]) : undefined;
|
|
173
177
|
return /*#__PURE__*/React.createElement(LinkedSingleSelectInput, {
|
|
174
178
|
objectType: linkedObjectType,
|
|
179
|
+
objectSet: linkedObjectSet,
|
|
175
180
|
propertyKey: linkedPropertyKey,
|
|
176
181
|
selectedValue: value,
|
|
177
182
|
onChange: onSingleSelectChange
|
|
@@ -199,6 +204,7 @@ function LinkedPropertyInputInner({
|
|
|
199
204
|
const nr = innerState?.type === "NUMBER_RANGE" ? innerState : undefined;
|
|
200
205
|
return /*#__PURE__*/React.createElement(LinkedNumberRangeInput, {
|
|
201
206
|
objectType: linkedObjectType,
|
|
207
|
+
objectSet: linkedObjectSet,
|
|
202
208
|
propertyKey: linkedPropertyKey,
|
|
203
209
|
minValue: nr?.minValue,
|
|
204
210
|
maxValue: nr?.maxValue,
|
|
@@ -212,6 +218,7 @@ function LinkedPropertyInputInner({
|
|
|
212
218
|
const dr = innerState?.type === "DATE_RANGE" ? innerState : undefined;
|
|
213
219
|
return /*#__PURE__*/React.createElement(LinkedDateRangeInput, {
|
|
214
220
|
objectType: linkedObjectType,
|
|
221
|
+
objectSet: linkedObjectSet,
|
|
215
222
|
propertyKey: linkedPropertyKey,
|
|
216
223
|
minValue: dr?.minValue,
|
|
217
224
|
maxValue: dr?.maxValue,
|
|
@@ -226,9 +233,11 @@ function LinkedPropertyInputInner({
|
|
|
226
233
|
const selectedValues = exactState ? coerceToStringArray(exactState.values) : [];
|
|
227
234
|
return /*#__PURE__*/React.createElement(LinkedListogramInput, {
|
|
228
235
|
objectType: linkedObjectType,
|
|
236
|
+
objectSet: linkedObjectSet,
|
|
229
237
|
propertyKey: linkedPropertyKey,
|
|
230
238
|
selectedValues: selectedValues,
|
|
231
|
-
onChange: onExactMatchChange
|
|
239
|
+
onChange: onExactMatchChange,
|
|
240
|
+
searchQuery: searchQuery
|
|
232
241
|
});
|
|
233
242
|
}
|
|
234
243
|
case "TEXT_TAGS":
|
|
@@ -237,6 +246,7 @@ function LinkedPropertyInputInner({
|
|
|
237
246
|
const tags = exactState ? coerceToStringArray(exactState.values) : [];
|
|
238
247
|
return /*#__PURE__*/React.createElement(LinkedTextTagsInput, {
|
|
239
248
|
objectType: linkedObjectType,
|
|
249
|
+
objectSet: linkedObjectSet,
|
|
240
250
|
propertyKey: linkedPropertyKey,
|
|
241
251
|
tags: tags,
|
|
242
252
|
onChange: onExactMatchChange
|
|
@@ -281,25 +291,29 @@ function LinkedPropertyInputInner({
|
|
|
281
291
|
export const LinkedPropertyInput = /*#__PURE__*/memo(LinkedPropertyInputInner);
|
|
282
292
|
function LinkedCheckboxListInput({
|
|
283
293
|
objectType,
|
|
294
|
+
objectSet,
|
|
284
295
|
propertyKey,
|
|
285
296
|
selectedValues,
|
|
286
|
-
onChange
|
|
297
|
+
onChange,
|
|
298
|
+
searchQuery
|
|
287
299
|
}) {
|
|
288
300
|
const {
|
|
289
301
|
data,
|
|
290
302
|
isLoading,
|
|
291
303
|
error
|
|
292
|
-
} = usePropertyAggregation(objectType, propertyKey);
|
|
304
|
+
} = usePropertyAggregation(objectType, propertyKey, objectSet);
|
|
293
305
|
return /*#__PURE__*/React.createElement(CheckboxListInput, {
|
|
294
306
|
values: data,
|
|
295
307
|
isLoading: isLoading,
|
|
296
308
|
error: error,
|
|
297
309
|
selectedValues: selectedValues,
|
|
298
|
-
onChange: onChange
|
|
310
|
+
onChange: onChange,
|
|
311
|
+
searchQuery: searchQuery
|
|
299
312
|
});
|
|
300
313
|
}
|
|
301
314
|
function LinkedMultiSelectInput({
|
|
302
315
|
objectType,
|
|
316
|
+
objectSet,
|
|
303
317
|
propertyKey,
|
|
304
318
|
selectedValues,
|
|
305
319
|
onChange
|
|
@@ -308,7 +322,7 @@ function LinkedMultiSelectInput({
|
|
|
308
322
|
data,
|
|
309
323
|
isLoading,
|
|
310
324
|
error
|
|
311
|
-
} = usePropertyAggregation(objectType, propertyKey);
|
|
325
|
+
} = usePropertyAggregation(objectType, propertyKey, objectSet);
|
|
312
326
|
return /*#__PURE__*/React.createElement(MultiSelectInput, {
|
|
313
327
|
values: data,
|
|
314
328
|
isLoading: isLoading,
|
|
@@ -319,6 +333,7 @@ function LinkedMultiSelectInput({
|
|
|
319
333
|
}
|
|
320
334
|
function LinkedSingleSelectInput({
|
|
321
335
|
objectType,
|
|
336
|
+
objectSet,
|
|
322
337
|
propertyKey,
|
|
323
338
|
selectedValue,
|
|
324
339
|
onChange
|
|
@@ -327,7 +342,7 @@ function LinkedSingleSelectInput({
|
|
|
327
342
|
data,
|
|
328
343
|
isLoading,
|
|
329
344
|
error
|
|
330
|
-
} = usePropertyAggregation(objectType, propertyKey);
|
|
345
|
+
} = usePropertyAggregation(objectType, propertyKey, objectSet);
|
|
331
346
|
return /*#__PURE__*/React.createElement(SingleSelectInput, {
|
|
332
347
|
values: data,
|
|
333
348
|
isLoading: isLoading,
|
|
@@ -339,27 +354,31 @@ function LinkedSingleSelectInput({
|
|
|
339
354
|
}
|
|
340
355
|
function LinkedListogramInput({
|
|
341
356
|
objectType,
|
|
357
|
+
objectSet,
|
|
342
358
|
propertyKey,
|
|
343
359
|
selectedValues,
|
|
344
|
-
onChange
|
|
360
|
+
onChange,
|
|
361
|
+
searchQuery
|
|
345
362
|
}) {
|
|
346
363
|
const {
|
|
347
364
|
data,
|
|
348
365
|
maxCount,
|
|
349
366
|
isLoading,
|
|
350
367
|
error
|
|
351
|
-
} = usePropertyAggregation(objectType, propertyKey);
|
|
368
|
+
} = usePropertyAggregation(objectType, propertyKey, objectSet);
|
|
352
369
|
return /*#__PURE__*/React.createElement(ListogramInput, {
|
|
353
370
|
values: data,
|
|
354
371
|
maxCount: maxCount,
|
|
355
372
|
isLoading: isLoading,
|
|
356
373
|
error: error,
|
|
357
374
|
selectedValues: selectedValues,
|
|
358
|
-
onChange: onChange
|
|
375
|
+
onChange: onChange,
|
|
376
|
+
searchQuery: searchQuery
|
|
359
377
|
});
|
|
360
378
|
}
|
|
361
379
|
function LinkedTextTagsInput({
|
|
362
380
|
objectType,
|
|
381
|
+
objectSet,
|
|
363
382
|
propertyKey,
|
|
364
383
|
tags,
|
|
365
384
|
onChange
|
|
@@ -371,7 +390,7 @@ function LinkedTextTagsInput({
|
|
|
371
390
|
data,
|
|
372
391
|
isLoading,
|
|
373
392
|
error
|
|
374
|
-
} = usePropertyAggregation(objectType, propertyKey, aggregationOptions);
|
|
393
|
+
} = usePropertyAggregation(objectType, propertyKey, objectSet, aggregationOptions);
|
|
375
394
|
return /*#__PURE__*/React.createElement(TextTagsInput, {
|
|
376
395
|
suggestions: data,
|
|
377
396
|
isLoading: isLoading,
|
|
@@ -381,11 +400,12 @@ function LinkedTextTagsInput({
|
|
|
381
400
|
suggestionLimit: 10
|
|
382
401
|
});
|
|
383
402
|
}
|
|
384
|
-
function useLinkedRangeData(objectType, propertyKey) {
|
|
403
|
+
function useLinkedRangeData(objectType, propertyKey, objectSet) {
|
|
385
404
|
const aggregateOptions = useMemo(() => createGroupByAggregateOptions(propertyKey), [propertyKey]);
|
|
386
405
|
const histogramArgs = useMemo(() => ({
|
|
387
|
-
aggregate: aggregateOptions
|
|
388
|
-
|
|
406
|
+
aggregate: aggregateOptions,
|
|
407
|
+
objectSet
|
|
408
|
+
}), [aggregateOptions, objectSet]);
|
|
389
409
|
const {
|
|
390
410
|
data: aggregateData,
|
|
391
411
|
isLoading: histLoading
|
|
@@ -394,8 +414,9 @@ function useLinkedRangeData(objectType, propertyKey) {
|
|
|
394
414
|
const nullWhereClause = useMemo(() => createNullWhereClause(propertyKey), [propertyKey]);
|
|
395
415
|
const nullCountArgs = useMemo(() => ({
|
|
396
416
|
where: nullWhereClause,
|
|
397
|
-
aggregate: nullCountAggregateOptions
|
|
398
|
-
|
|
417
|
+
aggregate: nullCountAggregateOptions,
|
|
418
|
+
objectSet
|
|
419
|
+
}), [nullWhereClause, nullCountAggregateOptions, objectSet]);
|
|
399
420
|
const {
|
|
400
421
|
data: nullCountData,
|
|
401
422
|
isLoading: nullLoading
|
|
@@ -417,6 +438,7 @@ function useLinkedRangeData(objectType, propertyKey) {
|
|
|
417
438
|
}
|
|
418
439
|
function LinkedNumberRangeInput({
|
|
419
440
|
objectType,
|
|
441
|
+
objectSet,
|
|
420
442
|
propertyKey,
|
|
421
443
|
minValue,
|
|
422
444
|
maxValue,
|
|
@@ -429,7 +451,7 @@ function LinkedNumberRangeInput({
|
|
|
429
451
|
histLoading,
|
|
430
452
|
nullCount,
|
|
431
453
|
nullLoading
|
|
432
|
-
} = useLinkedRangeData(objectType, propertyKey);
|
|
454
|
+
} = useLinkedRangeData(objectType, propertyKey, objectSet);
|
|
433
455
|
const valueCountPairs = useMemo(() => {
|
|
434
456
|
if (!aggregateData) return [];
|
|
435
457
|
const pairs = [];
|
|
@@ -462,6 +484,7 @@ function LinkedNumberRangeInput({
|
|
|
462
484
|
}
|
|
463
485
|
function LinkedDateRangeInput({
|
|
464
486
|
objectType,
|
|
487
|
+
objectSet,
|
|
465
488
|
propertyKey,
|
|
466
489
|
minValue,
|
|
467
490
|
maxValue,
|
|
@@ -474,7 +497,7 @@ function LinkedDateRangeInput({
|
|
|
474
497
|
histLoading,
|
|
475
498
|
nullCount,
|
|
476
499
|
nullLoading
|
|
477
|
-
} = useLinkedRangeData(objectType, propertyKey);
|
|
500
|
+
} = useLinkedRangeData(objectType, propertyKey, objectSet);
|
|
478
501
|
const valueCountPairs = useMemo(() => {
|
|
479
502
|
if (!aggregateData) return [];
|
|
480
503
|
const pairs = [];
|