@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":"ListogramInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","filterValuesBySearch","styles","ListogramSkeleton","sharedStyles","
|
|
1
|
+
{"version":3,"file":"ListogramInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","filterValuesBySearch","styles","ListogramSkeleton","sharedStyles","useStableData","ListogramInputInner","values","maxCount","isLoading","error","selectedValues","onChange","colorMap","displayMode","className","style","maxVisibleItems","searchQuery","isExpanded","setIsExpanded","stableValues","selectedSet","Set","toggleValue","value","has","filter","v","filteredValues","displayValues","slice","hasMore","length","createElement","listogram","errorMessage","message","emptyMessage","container","map","count","percentage","perRowColor","key","row","onClick","undefined","label","bar","barFill","toLocaleString","type","ListogramInput"],"sources":["ListogramInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo, useState } from \"react\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport { filterValuesBySearch } from \"../../utils/filterValues.js\";\nimport styles from \"./ListogramInput.module.css\";\nimport { ListogramSkeleton } from \"./ListogramSkeleton.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport { useStableData } from \"./useStableData.js\";\n\nexport type ListogramDisplayMode = \"full\" | \"count\" | \"minimal\";\n\ninterface ListogramInputProps {\n values: PropertyAggregationValue[];\n maxCount: number;\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (values: string[]) => void;\n colorMap?: Record<string, string>;\n displayMode?: ListogramDisplayMode;\n className?: string;\n style?: React.CSSProperties;\n maxVisibleItems?: number;\n searchQuery?: string;\n}\n\nfunction ListogramInputInner({\n values,\n maxCount,\n isLoading,\n error,\n selectedValues,\n onChange,\n colorMap,\n displayMode = \"full\",\n className,\n style,\n maxVisibleItems,\n searchQuery,\n}: ListogramInputProps): React.ReactElement {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const stableValues = useStableData(values, isLoading);\n\n const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);\n\n const toggleValue = useCallback(\n (value: string) => {\n if (selectedSet.has(value)) {\n onChange(selectedValues.filter((v) => v !== value));\n } else {\n onChange([...selectedValues, value]);\n }\n },\n [selectedValues, selectedSet, onChange],\n );\n\n const filteredValues = useMemo(() => {\n if (searchQuery) {\n return filterValuesBySearch(stableValues, searchQuery, (v) => v.value);\n }\n return stableValues;\n }, [stableValues, searchQuery]);\n\n const displayValues = useMemo(() => {\n if (isExpanded || !maxVisibleItems) return filteredValues;\n return filteredValues.slice(0, maxVisibleItems);\n }, [filteredValues, maxVisibleItems, isExpanded]);\n\n const hasMore = maxVisibleItems != null\n && filteredValues.length > maxVisibleItems;\n\n return (\n <div\n className={classnames(styles.listogram, className)}\n style={style}\n data-loading={isLoading && filteredValues.length > 0}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading values: {error.message}\n </div>\n )}\n\n {!error && filteredValues.length === 0 && isLoading && (\n <ListogramSkeleton />\n )}\n {!error && filteredValues.length === 0 && !isLoading && (\n <div className={sharedStyles.emptyMessage}>\n No values available\n </div>\n )}\n\n {filteredValues.length > 0 && (\n <div className={styles.container}>\n {displayValues.map(({ value, count }) => {\n const percentage = maxCount > 0 ? (count / maxCount) * 100 : 0;\n const perRowColor = colorMap?.[value];\n\n return (\n <Button\n key={value}\n className={styles.row}\n onClick={() => toggleValue(value)}\n aria-pressed={selectedSet.has(value)}\n style={perRowColor || percentage > 0\n ? {\n \"--osdk-filter-listogram-bar-fill-scale\": percentage / 100,\n ...(perRowColor\n ? {\n \"--osdk-filter-listogram-row-bar-color\": perRowColor,\n }\n : undefined),\n } as React.CSSProperties\n : undefined}\n >\n <span className={styles.label}>{value}</span>\n {displayMode === \"full\" && (\n <span className={styles.bar}>\n <span className={styles.barFill} />\n </span>\n )}\n {displayMode !== \"minimal\" && (\n <span className={styles.count}>\n {count.toLocaleString()}\n </span>\n )}\n </Button>\n );\n })}\n\n {hasMore && !isExpanded && (\n <Button\n type=\"button\"\n className={styles.row}\n onClick={() => setIsExpanded(true)}\n >\n View all ({filteredValues.length})\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const ListogramInput = memo(\n ListogramInputInner,\n) as typeof ListogramInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -21,7 +21,7 @@ import { debounce } from "lodash-es";
|
|
|
21
21
|
import React, { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
22
22
|
import { createHistogramBuckets, getMaxBucketCount } from "./createHistogramBuckets.js";
|
|
23
23
|
import styles from "./RangeInput.module.css";
|
|
24
|
-
import {
|
|
24
|
+
import { useStableData } from "./useStableData.js";
|
|
25
25
|
const DEBOUNCE_MS = 300;
|
|
26
26
|
function RangeInputInner({
|
|
27
27
|
valueCountPairs,
|
|
@@ -66,7 +66,7 @@ function RangeInputInner({
|
|
|
66
66
|
debouncedMaxChange.cancel();
|
|
67
67
|
};
|
|
68
68
|
}, [debouncedMinChange, debouncedMaxChange]);
|
|
69
|
-
const displayPairs =
|
|
69
|
+
const displayPairs = useStableData(valueCountPairs, isLoading);
|
|
70
70
|
const computedRange = useMemo(() => {
|
|
71
71
|
if (displayPairs.length === 0) return {
|
|
72
72
|
min: undefined,
|
|
@@ -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":[]}
|