@osdk/react-components 0.2.0-beta.15 → 0.2.0-beta.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +5 -3
- package/build/browser/base-components/action-button/ActionButton.module.css +0 -4
- package/build/browser/base-components/checkbox/Checkbox.module.css +0 -4
- package/build/browser/base-components/dialog/Dialog.module.css +0 -8
- package/build/browser/base-components/draggable-list/DraggableList.js +4 -2
- package/build/browser/base-components/draggable-list/DraggableList.js.map +1 -1
- package/build/browser/base-components/draggable-list/DraggableList.module.css +0 -8
- package/build/browser/base-components/tooltip/Tooltip.js +91 -0
- package/build/browser/base-components/tooltip/Tooltip.js.map +1 -0
- package/build/browser/base-components/tooltip/Tooltip.module.css +70 -0
- package/build/browser/base-components/tooltip/Tooltip.module.css.js +11 -0
- package/build/browser/base-components/tooltip/index.js +18 -0
- package/build/browser/base-components/tooltip/index.js.map +1 -0
- package/build/browser/filter-list/FilterInput.js +132 -0
- package/build/browser/filter-list/FilterInput.js.map +1 -0
- package/build/browser/filter-list/FilterList.js +91 -0
- package/build/browser/filter-list/FilterList.js.map +1 -0
- package/build/browser/filter-list/FilterListApi.js.map +1 -1
- package/build/browser/filter-list/FilterListItemApi.js.map +1 -1
- package/build/browser/filter-list/base/{FilterList.js → BaseFilterList.js} +30 -31
- package/build/browser/filter-list/base/BaseFilterList.js.map +1 -0
- package/build/browser/filter-list/base/BaseFilterListApi.js +2 -0
- package/build/browser/filter-list/base/BaseFilterListApi.js.map +1 -0
- package/build/browser/filter-list/base/FilterIcons.js +63 -0
- package/build/browser/filter-list/base/FilterIcons.js.map +1 -0
- package/build/browser/filter-list/base/FilterList.module.css +22 -1
- package/build/browser/filter-list/base/FilterList.module.css.js +2 -0
- package/build/browser/filter-list/base/FilterListContent.js +21 -20
- package/build/browser/filter-list/base/FilterListContent.js.map +1 -1
- package/build/browser/filter-list/base/FilterListHeader.js +8 -3
- package/build/browser/filter-list/base/FilterListHeader.js.map +1 -1
- package/build/browser/filter-list/base/FilterListHeader.module.css +25 -1
- package/build/browser/filter-list/base/FilterListHeader.module.css.js +3 -0
- package/build/browser/filter-list/base/FilterListItem.js +36 -17
- package/build/browser/filter-list/base/FilterListItem.js.map +1 -1
- package/build/browser/filter-list/base/FilterListItem.module.css +58 -2
- package/build/browser/filter-list/base/FilterListItem.module.css.js +2 -0
- package/build/browser/filter-list/base/SortableFilterListItem.js +6 -6
- package/build/browser/filter-list/base/SortableFilterListItem.js.map +1 -1
- package/build/browser/filter-list/base/index.js +1 -2
- package/build/browser/filter-list/base/index.js.map +1 -1
- package/build/browser/filter-list/base/inputs/CheckboxListInput.js +34 -15
- package/build/browser/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/CheckboxListInput.module.css +13 -0
- package/build/browser/filter-list/base/inputs/CheckboxListInput.module.css.js +2 -1
- package/build/browser/filter-list/base/inputs/DateRangeInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/ListogramInput.js +17 -21
- package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/ListogramInput.module.css +25 -19
- package/build/browser/filter-list/base/inputs/MultiDateInput.module.css +6 -4
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js +7 -14
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css +4 -1
- package/build/browser/filter-list/base/inputs/MultiSelectInput.module.css.js +1 -1
- package/build/browser/filter-list/base/inputs/NullValueWrapper.js +4 -23
- package/build/browser/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
- package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css +3 -2
- package/build/browser/filter-list/base/inputs/NumberRangeInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/RangeInput.js +2 -32
- package/build/browser/filter-list/base/inputs/RangeInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/RangeInput.module.css +16 -14
- package/build/browser/filter-list/base/inputs/SingleDateInput.module.css +2 -1
- package/build/browser/filter-list/base/inputs/SingleSelectInput.js +6 -13
- package/build/browser/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/TextTagsInput.js +6 -14
- package/build/browser/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/TimelineInput.js +2 -2
- package/build/browser/filter-list/base/inputs/TimelineInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/TimelineInput.module.css +14 -12
- package/build/browser/filter-list/base/inputs/shared.module.css +5 -4
- package/build/browser/filter-list/hooks/useFilterListState.js +29 -9
- package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/browser/filter-list/hooks/usePropertyAggregation.js.map +1 -1
- package/build/browser/filter-list/inputs/CheckboxListFilterInput.js +56 -0
- package/build/browser/filter-list/inputs/CheckboxListFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/ContainsTextFilterInput.js +38 -0
- package/build/browser/filter-list/inputs/ContainsTextFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/DateRangeFilterInput.js +105 -0
- package/build/browser/filter-list/inputs/DateRangeFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/LinkedPropertyInput.js +508 -0
- package/build/browser/filter-list/inputs/LinkedPropertyInput.js.map +1 -0
- package/build/browser/filter-list/inputs/ListogramFilterInput.js +62 -0
- package/build/browser/filter-list/inputs/ListogramFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/MultiDateFilterInput.js +38 -0
- package/build/browser/filter-list/inputs/MultiDateFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/MultiSelectFilterInput.js +55 -0
- package/build/browser/filter-list/inputs/MultiSelectFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/NumberRangeFilterInput.js +105 -0
- package/build/browser/filter-list/inputs/NumberRangeFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/PropertyFilterInput.js +129 -0
- package/build/browser/filter-list/inputs/PropertyFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/SingleDateFilterInput.js +38 -0
- package/build/browser/filter-list/inputs/SingleDateFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/SingleSelectFilterInput.js +55 -0
- package/build/browser/filter-list/inputs/SingleSelectFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/TextTagsFilterInput.js +54 -0
- package/build/browser/filter-list/inputs/TextTagsFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/TimelineFilterInput.js +49 -0
- package/build/browser/filter-list/inputs/TimelineFilterInput.js.map +1 -0
- package/build/browser/filter-list/inputs/ToggleFilterInput.js +36 -0
- package/build/browser/filter-list/inputs/ToggleFilterInput.js.map +1 -0
- package/build/browser/filter-list/types/AggregationTypes.js +2 -0
- package/build/browser/filter-list/types/AggregationTypes.js.map +1 -0
- package/build/browser/filter-list/types/LinkedFilterTypes.js.map +1 -1
- package/build/browser/filter-list/types/index.js +0 -2
- package/build/browser/filter-list/types/index.js.map +1 -1
- package/build/browser/filter-list/utils/filterStateSerialization.js +42 -0
- package/build/browser/filter-list/utils/filterStateSerialization.js.map +1 -0
- package/build/browser/filter-list/utils/filterStateToWhereClause.js +36 -13
- package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -1
- package/build/browser/filter-list/utils/filterValues.js +26 -0
- package/build/browser/filter-list/utils/filterValues.js.map +1 -1
- package/build/browser/object-table/ColumnConfigDialog.module.css +0 -9
- package/build/browser/object-table/DefaultCellRenderer.js +6 -1
- package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/browser/object-table/EditableCell.js +76 -9
- package/build/browser/object-table/EditableCell.js.map +1 -1
- package/build/browser/object-table/EditableCell.module.css +47 -8
- package/build/browser/object-table/EditableCell.module.css.js +5 -1
- package/build/browser/object-table/MultiColumnSortDialog.js +4 -1
- package/build/browser/object-table/MultiColumnSortDialog.js.map +1 -1
- package/build/browser/object-table/MultiColumnSortDialog.module.css +0 -4
- package/build/browser/object-table/ObjectTable.js +4 -1
- package/build/browser/object-table/ObjectTable.js.map +1 -1
- package/build/browser/object-table/ObjectTableApi.js.map +1 -1
- package/build/browser/object-table/SelectionCells.js +1 -0
- package/build/browser/object-table/SelectionCells.js.map +1 -1
- package/build/browser/object-table/Table.js +2 -2
- package/build/browser/object-table/Table.js.map +1 -1
- package/build/browser/object-table/TableBody.js +1 -1
- package/build/browser/object-table/TableBody.js.map +1 -1
- package/build/browser/object-table/TableEditContainer.js +27 -16
- package/build/browser/object-table/TableEditContainer.js.map +1 -1
- package/build/browser/object-table/TableEditContainer.module.css +27 -0
- package/build/browser/object-table/TableEditContainer.module.css.js +5 -1
- package/build/browser/object-table/TableHeaderWithPopover.module.css +0 -12
- package/build/browser/object-table/TableRow.js +2 -2
- package/build/browser/object-table/TableRow.js.map +1 -1
- package/build/browser/object-table/hooks/useColumnDefs.js +2 -1
- package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/browser/object-table/hooks/useEditableTable.js +21 -2
- package/build/browser/object-table/hooks/useEditableTable.js.map +1 -1
- package/build/browser/object-table/utils/types.js.map +1 -1
- package/build/browser/public/experimental.js +4 -1
- package/build/browser/public/experimental.js.map +1 -1
- package/build/browser/shared/ErrorBoundary.module.css +14 -14
- package/build/browser/styles.css +354 -132
- package/build/cjs/public/experimental.cjs +2955 -2165
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.css +669 -496
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/experimental.d.cts +80 -6
- package/build/esm/base-components/action-button/ActionButton.module.css +0 -4
- package/build/esm/base-components/checkbox/Checkbox.module.css +0 -4
- package/build/esm/base-components/dialog/Dialog.module.css +0 -8
- package/build/esm/base-components/draggable-list/DraggableList.js +4 -2
- package/build/esm/base-components/draggable-list/DraggableList.js.map +1 -1
- package/build/esm/base-components/draggable-list/DraggableList.module.css +0 -8
- package/build/esm/base-components/tooltip/Tooltip.js +91 -0
- package/build/esm/base-components/tooltip/Tooltip.js.map +1 -0
- package/build/esm/base-components/tooltip/Tooltip.module.css +70 -0
- package/build/esm/base-components/tooltip/index.js +18 -0
- package/build/esm/base-components/tooltip/index.js.map +1 -0
- package/build/esm/filter-list/FilterInput.js +132 -0
- package/build/esm/filter-list/FilterInput.js.map +1 -0
- package/build/esm/filter-list/FilterList.js +91 -0
- package/build/esm/filter-list/FilterList.js.map +1 -0
- package/build/esm/filter-list/FilterListApi.js.map +1 -1
- package/build/esm/filter-list/FilterListItemApi.js.map +1 -1
- package/build/esm/filter-list/base/{FilterList.js → BaseFilterList.js} +30 -31
- package/build/esm/filter-list/base/BaseFilterList.js.map +1 -0
- package/build/esm/filter-list/base/BaseFilterListApi.js +2 -0
- package/build/esm/filter-list/base/BaseFilterListApi.js.map +1 -0
- package/build/esm/filter-list/base/FilterIcons.js +63 -0
- package/build/esm/filter-list/base/FilterIcons.js.map +1 -0
- package/build/esm/filter-list/base/FilterList.module.css +22 -1
- package/build/esm/filter-list/base/FilterListContent.js +21 -20
- package/build/esm/filter-list/base/FilterListContent.js.map +1 -1
- package/build/esm/filter-list/base/FilterListHeader.js +8 -3
- package/build/esm/filter-list/base/FilterListHeader.js.map +1 -1
- package/build/esm/filter-list/base/FilterListHeader.module.css +25 -1
- package/build/esm/filter-list/base/FilterListItem.js +36 -17
- package/build/esm/filter-list/base/FilterListItem.js.map +1 -1
- package/build/esm/filter-list/base/FilterListItem.module.css +58 -2
- package/build/esm/filter-list/base/SortableFilterListItem.js +6 -6
- package/build/esm/filter-list/base/SortableFilterListItem.js.map +1 -1
- package/build/esm/filter-list/base/index.js +1 -2
- package/build/esm/filter-list/base/index.js.map +1 -1
- package/build/esm/filter-list/base/inputs/CheckboxListInput.js +34 -15
- package/build/esm/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/CheckboxListInput.module.css +13 -0
- package/build/esm/filter-list/base/inputs/DateRangeInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/ListogramInput.js +17 -21
- package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/ListogramInput.module.css +25 -19
- package/build/esm/filter-list/base/inputs/MultiDateInput.module.css +6 -4
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js +7 -14
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/MultiSelectInput.module.css +4 -1
- package/build/esm/filter-list/base/inputs/NullValueWrapper.js +4 -23
- package/build/esm/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
- package/build/esm/filter-list/base/inputs/NullValueWrapper.module.css +3 -2
- package/build/esm/filter-list/base/inputs/NumberRangeInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/RangeInput.js +2 -32
- package/build/esm/filter-list/base/inputs/RangeInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/RangeInput.module.css +16 -14
- package/build/esm/filter-list/base/inputs/SingleDateInput.module.css +2 -1
- package/build/esm/filter-list/base/inputs/SingleSelectInput.js +6 -13
- package/build/esm/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/TextTagsInput.js +6 -14
- package/build/esm/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/TimelineInput.js +2 -2
- package/build/esm/filter-list/base/inputs/TimelineInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/TimelineInput.module.css +14 -12
- package/build/esm/filter-list/base/inputs/shared.module.css +5 -4
- package/build/esm/filter-list/hooks/useFilterListState.js +29 -9
- package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/esm/filter-list/hooks/usePropertyAggregation.js.map +1 -1
- package/build/esm/filter-list/inputs/CheckboxListFilterInput.js +56 -0
- package/build/esm/filter-list/inputs/CheckboxListFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/ContainsTextFilterInput.js +38 -0
- package/build/esm/filter-list/inputs/ContainsTextFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/DateRangeFilterInput.js +105 -0
- package/build/esm/filter-list/inputs/DateRangeFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/LinkedPropertyInput.js +508 -0
- package/build/esm/filter-list/inputs/LinkedPropertyInput.js.map +1 -0
- package/build/esm/filter-list/inputs/ListogramFilterInput.js +62 -0
- package/build/esm/filter-list/inputs/ListogramFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/MultiDateFilterInput.js +38 -0
- package/build/esm/filter-list/inputs/MultiDateFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/MultiSelectFilterInput.js +55 -0
- package/build/esm/filter-list/inputs/MultiSelectFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/NumberRangeFilterInput.js +105 -0
- package/build/esm/filter-list/inputs/NumberRangeFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/PropertyFilterInput.js +129 -0
- package/build/esm/filter-list/inputs/PropertyFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/SingleDateFilterInput.js +38 -0
- package/build/esm/filter-list/inputs/SingleDateFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/SingleSelectFilterInput.js +55 -0
- package/build/esm/filter-list/inputs/SingleSelectFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/TextTagsFilterInput.js +54 -0
- package/build/esm/filter-list/inputs/TextTagsFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/TimelineFilterInput.js +49 -0
- package/build/esm/filter-list/inputs/TimelineFilterInput.js.map +1 -0
- package/build/esm/filter-list/inputs/ToggleFilterInput.js +36 -0
- package/build/esm/filter-list/inputs/ToggleFilterInput.js.map +1 -0
- package/build/esm/filter-list/types/AggregationTypes.js +2 -0
- package/build/esm/filter-list/types/AggregationTypes.js.map +1 -0
- package/build/esm/filter-list/types/LinkedFilterTypes.js.map +1 -1
- package/build/esm/filter-list/types/index.js +0 -2
- package/build/esm/filter-list/types/index.js.map +1 -1
- package/build/esm/filter-list/utils/filterStateSerialization.js +42 -0
- package/build/esm/filter-list/utils/filterStateSerialization.js.map +1 -0
- package/build/esm/filter-list/utils/filterStateToWhereClause.js +36 -13
- package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -1
- package/build/esm/filter-list/utils/filterValues.js +26 -0
- package/build/esm/filter-list/utils/filterValues.js.map +1 -1
- package/build/esm/object-table/ColumnConfigDialog.module.css +0 -9
- package/build/esm/object-table/DefaultCellRenderer.js +6 -1
- package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/esm/object-table/EditableCell.js +76 -9
- package/build/esm/object-table/EditableCell.js.map +1 -1
- package/build/esm/object-table/EditableCell.module.css +47 -8
- package/build/esm/object-table/MultiColumnSortDialog.js +4 -1
- package/build/esm/object-table/MultiColumnSortDialog.js.map +1 -1
- package/build/esm/object-table/MultiColumnSortDialog.module.css +0 -4
- package/build/esm/object-table/ObjectTable.js +4 -1
- package/build/esm/object-table/ObjectTable.js.map +1 -1
- package/build/esm/object-table/ObjectTableApi.js.map +1 -1
- package/build/esm/object-table/SelectionCells.js +1 -0
- package/build/esm/object-table/SelectionCells.js.map +1 -1
- package/build/esm/object-table/Table.js +2 -2
- package/build/esm/object-table/Table.js.map +1 -1
- package/build/esm/object-table/TableBody.js +1 -1
- package/build/esm/object-table/TableBody.js.map +1 -1
- package/build/esm/object-table/TableEditContainer.js +27 -16
- package/build/esm/object-table/TableEditContainer.js.map +1 -1
- package/build/esm/object-table/TableEditContainer.module.css +27 -0
- package/build/esm/object-table/TableHeaderWithPopover.module.css +0 -12
- package/build/esm/object-table/TableRow.js +2 -2
- package/build/esm/object-table/TableRow.js.map +1 -1
- package/build/esm/object-table/hooks/useColumnDefs.js +2 -1
- package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/esm/object-table/hooks/useEditableTable.js +21 -2
- package/build/esm/object-table/hooks/useEditableTable.js.map +1 -1
- package/build/esm/object-table/utils/types.js.map +1 -1
- package/build/esm/public/experimental.js +4 -1
- package/build/esm/public/experimental.js.map +1 -1
- package/build/esm/shared/ErrorBoundary.module.css +14 -14
- package/build/types/base-components/tooltip/Tooltip.d.ts +31 -0
- package/build/types/base-components/tooltip/Tooltip.d.ts.map +1 -0
- package/build/types/base-components/tooltip/index.d.ts +1 -0
- package/build/types/base-components/tooltip/index.d.ts.map +1 -0
- package/build/types/filter-list/{base/FilterInput.d.ts → FilterInput.d.ts} +2 -2
- package/build/types/filter-list/FilterInput.d.ts.map +1 -0
- package/build/types/filter-list/{base/FilterList.d.ts → FilterList.d.ts} +1 -1
- package/build/types/filter-list/FilterList.d.ts.map +1 -0
- package/build/types/filter-list/FilterListApi.d.ts +14 -0
- package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
- package/build/types/filter-list/FilterListItemApi.d.ts +13 -0
- package/build/types/filter-list/FilterListItemApi.d.ts.map +1 -1
- package/build/types/filter-list/base/BaseFilterList.d.ts +3 -0
- package/build/types/filter-list/base/BaseFilterList.d.ts.map +1 -0
- package/build/types/filter-list/base/BaseFilterListApi.d.ts +29 -0
- package/build/types/filter-list/base/BaseFilterListApi.d.ts.map +1 -0
- package/build/types/filter-list/base/FilterIcons.d.ts +4 -0
- package/build/types/filter-list/base/FilterIcons.d.ts.map +1 -0
- package/build/types/filter-list/base/FilterListContent.d.ts +8 -8
- package/build/types/filter-list/base/FilterListContent.d.ts.map +1 -1
- package/build/types/filter-list/base/FilterListHeader.d.ts.map +1 -1
- package/build/types/filter-list/base/FilterListItem.d.ts +7 -8
- package/build/types/filter-list/base/FilterListItem.d.ts.map +1 -1
- package/build/types/filter-list/base/SortableFilterListItem.d.ts +7 -8
- package/build/types/filter-list/base/SortableFilterListItem.d.ts.map +1 -1
- package/build/types/filter-list/base/index.d.ts +2 -2
- package/build/types/filter-list/base/index.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts +7 -13
- package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/DateRangeInput.d.ts +7 -12
- package/build/types/filter-list/base/inputs/DateRangeInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/ListogramInput.d.ts +10 -13
- package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts +7 -13
- package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/NullValueWrapper.d.ts +5 -11
- package/build/types/filter-list/base/inputs/NullValueWrapper.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/NumberRangeInput.d.ts +7 -12
- package/build/types/filter-list/base/inputs/NumberRangeInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/RangeInput.d.ts +7 -14
- package/build/types/filter-list/base/inputs/RangeInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/SingleSelectInput.d.ts +7 -13
- package/build/types/filter-list/base/inputs/SingleSelectInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/TextTagsInput.d.ts +7 -13
- package/build/types/filter-list/base/inputs/TextTagsInput.d.ts.map +1 -1
- package/build/types/filter-list/hooks/useFilterListState.d.ts +1 -0
- package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
- package/build/types/filter-list/hooks/usePropertyAggregation.d.ts +2 -5
- package/build/types/filter-list/hooks/usePropertyAggregation.d.ts.map +1 -1
- package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts +14 -0
- package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/ContainsTextFilterInput.d.ts +10 -0
- package/build/types/filter-list/inputs/ContainsTextFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/DateRangeFilterInput.d.ts +12 -0
- package/build/types/filter-list/inputs/DateRangeFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/{base/inputs → inputs}/LinkedPropertyInput.d.ts +2 -2
- package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/ListogramFilterInput.d.ts +16 -0
- package/build/types/filter-list/inputs/ListogramFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/MultiDateFilterInput.d.ts +9 -0
- package/build/types/filter-list/inputs/MultiDateFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts +13 -0
- package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/NumberRangeFilterInput.d.ts +12 -0
- package/build/types/filter-list/inputs/NumberRangeFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/PropertyFilterInput.d.ts +17 -0
- package/build/types/filter-list/inputs/PropertyFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/SingleDateFilterInput.d.ts +9 -0
- package/build/types/filter-list/inputs/SingleDateFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts +13 -0
- package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/TextTagsFilterInput.d.ts +13 -0
- package/build/types/filter-list/inputs/TextTagsFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/TimelineFilterInput.d.ts +9 -0
- package/build/types/filter-list/inputs/TimelineFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/inputs/ToggleFilterInput.d.ts +9 -0
- package/build/types/filter-list/inputs/ToggleFilterInput.d.ts.map +1 -0
- package/build/types/filter-list/types/AggregationTypes.d.ts +5 -0
- package/build/types/filter-list/types/AggregationTypes.d.ts.map +1 -0
- package/build/types/filter-list/types/LinkedFilterTypes.d.ts +0 -19
- package/build/types/filter-list/types/LinkedFilterTypes.d.ts.map +1 -1
- package/build/types/filter-list/types/index.d.ts +0 -2
- package/build/types/filter-list/types/index.d.ts.map +1 -1
- package/build/types/filter-list/utils/filterStateSerialization.d.ts +3 -0
- package/build/types/filter-list/utils/filterStateSerialization.d.ts.map +1 -0
- package/build/types/filter-list/utils/filterStateToWhereClause.d.ts +1 -1
- package/build/types/filter-list/utils/filterStateToWhereClause.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/object-table/EditableCell.d.ts +8 -2
- package/build/types/object-table/EditableCell.d.ts.map +1 -1
- package/build/types/object-table/ObjectTableApi.d.ts +7 -0
- package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
- package/build/types/object-table/Table.d.ts +4 -0
- package/build/types/object-table/Table.d.ts.map +1 -1
- package/build/types/object-table/TableEditContainer.d.ts +1 -1
- package/build/types/object-table/TableEditContainer.d.ts.map +1 -1
- package/build/types/object-table/TableRow.d.ts +2 -2
- package/build/types/object-table/TableRow.d.ts.map +1 -1
- package/build/types/object-table/hooks/useEditableTable.d.ts.map +1 -1
- package/build/types/object-table/utils/types.d.ts +7 -4
- package/build/types/object-table/utils/types.d.ts.map +1 -1
- package/build/types/public/experimental.d.ts +4 -1
- package/build/types/public/experimental.d.ts.map +1 -1
- package/package.json +5 -5
- package/build/browser/filter-list/base/FilterInput.js +0 -542
- package/build/browser/filter-list/base/FilterInput.js.map +0 -1
- package/build/browser/filter-list/base/FilterList.js.map +0 -1
- package/build/browser/filter-list/base/inputs/LinkedPropertyInput.js +0 -237
- package/build/browser/filter-list/base/inputs/LinkedPropertyInput.js.map +0 -1
- package/build/browser/filter-list/types/AddFilterMenuTypes.js +0 -2
- package/build/browser/filter-list/types/AddFilterMenuTypes.js.map +0 -1
- package/build/browser/filter-list/types/FilterPanelTypes.js +0 -2
- package/build/browser/filter-list/types/FilterPanelTypes.js.map +0 -1
- package/build/esm/filter-list/base/FilterInput.js +0 -542
- package/build/esm/filter-list/base/FilterInput.js.map +0 -1
- package/build/esm/filter-list/base/FilterList.js.map +0 -1
- package/build/esm/filter-list/base/inputs/LinkedPropertyInput.js +0 -237
- package/build/esm/filter-list/base/inputs/LinkedPropertyInput.js.map +0 -1
- package/build/esm/filter-list/types/AddFilterMenuTypes.js +0 -2
- package/build/esm/filter-list/types/AddFilterMenuTypes.js.map +0 -1
- package/build/esm/filter-list/types/FilterPanelTypes.js +0 -2
- package/build/esm/filter-list/types/FilterPanelTypes.js.map +0 -1
- package/build/types/filter-list/base/FilterInput.d.ts.map +0 -1
- package/build/types/filter-list/base/FilterList.d.ts.map +0 -1
- package/build/types/filter-list/base/inputs/LinkedPropertyInput.d.ts.map +0 -1
- package/build/types/filter-list/types/AddFilterMenuTypes.d.ts +0 -56
- package/build/types/filter-list/types/AddFilterMenuTypes.d.ts.map +0 -1
- package/build/types/filter-list/types/FilterPanelTypes.d.ts +0 -18
- package/build/types/filter-list/types/FilterPanelTypes.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RangeInput.js","names":["Input","useOsdkAggregation","classnames","debounce","React","memo","useCallback","useEffect","useId","useMemo","useRef","useState","createGroupByAggregateOptions","createHistogramBuckets","getMaxBucketCount","styles","sharedStyles","DEBOUNCE_MS","RangeInputInner","objectType","propertyKey","minValue","maxValue","onChange","objectSet","showHistogram","className","style","config","minInputId","maxInputId","localMin","setLocalMin","formatValue","localMax","setLocalMax","onChangeRef","current","minValueRef","maxValueRef","debouncedMinChange","newValue","parsed","parseValue","debouncedMaxChange","cancel","aggregateOptions","data","aggregateData","isLoading","aggregate","valueCountPairs","pairs","item","rawValue","$group","String","undefined","push","value","count","$count","computedRange","length","min","max","reduce","acc","p","Math","toNumber","Infinity","fromNumber","dataRange","dataMin","dataMax","buckets","maxBucketCount","handleMinChange","e","target","handleMaxChange","createElement","rangeInput","histogramContainer","map","bucket","index","height","isInRange","key","histogramBar","title","formatTooltip","rangeInputs","inputWrapper","htmlFor","inputLabel","minLabel","_extends","id","type","inputType","input","placeholder","formatPlaceholder","inputProps","separator","maxLabel","loadingMessage","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 type { ObjectSet, ObjectTypeDefinition, PropertyKeys } from \"@osdk/api\";\nimport { useOsdkAggregation } from \"@osdk/react/experimental\";\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 type AggregationGroupResult,\n createGroupByAggregateOptions,\n} from \"../../utils/aggregationHelpers.js\";\nimport {\n createHistogramBuckets,\n getMaxBucketCount,\n type HistogramBucket,\n} from \"./createHistogramBuckets.js\";\nimport styles from \"./RangeInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\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<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n T,\n> {\n objectType: Q;\n propertyKey: K;\n minValue: T | undefined;\n maxValue: T | undefined;\n onChange: (min: T | undefined, max: T | undefined) => void;\n objectSet?: ObjectSet<Q>;\n showHistogram?: boolean;\n className?: string;\n style?: React.CSSProperties;\n config: RangeInputConfig<T>;\n}\n\nfunction RangeInputInner<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n T,\n>({\n objectType,\n propertyKey,\n minValue,\n maxValue,\n onChange,\n objectSet,\n showHistogram = true,\n className,\n style,\n config,\n}: RangeInputProps<Q, K, 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 aggregateOptions = useMemo(\n () => createGroupByAggregateOptions<Q>(propertyKey as string),\n [propertyKey],\n );\n\n const { data: aggregateData, isLoading } = useOsdkAggregation(objectType, {\n aggregate: aggregateOptions,\n });\n\n const valueCountPairs = useMemo<Array<{ value: T; count: number }>>(() => {\n if (!aggregateData) return [];\n\n // Same dynamic $groupBy + $count pattern as usePropertyAggregation\n const dataArray = aggregateData as AggregationGroupResult;\n\n const pairs: Array<{ value: T; count: number }> = [];\n for (const item of dataArray) {\n const rawValue = item.$group[propertyKey as string];\n if (rawValue != null) {\n const parsed = config.parseValue(String(rawValue));\n if (parsed !== undefined) {\n pairs.push({ value: parsed, count: item.$count ?? 0 });\n }\n }\n }\n\n return pairs;\n }, [aggregateData, propertyKey, config]);\n\n const computedRange = useMemo(() => {\n if (valueCountPairs.length === 0) return { min: undefined, max: undefined };\n const min = valueCountPairs.reduce(\n (acc, p) => Math.min(acc, config.toNumber(p.value)),\n Infinity,\n );\n const max = valueCountPairs.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 }, [valueCountPairs, 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 || valueCountPairs.length === 0\n || computedRange.min === undefined\n || computedRange.max === undefined\n ) {\n return [];\n }\n\n return createHistogramBuckets(\n valueCountPairs,\n { min: computedRange.min, max: computedRange.max },\n config.toNumber,\n config.fromNumber,\n );\n }, [showHistogram, valueCountPairs, 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 && buckets.length > 0 && (\n <div className={styles.histogramContainer}>\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\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Loading...\n </div>\n )}\n </div>\n );\n}\n\nexport const RangeInput = memo(RangeInputInner) as typeof RangeInputInner;\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,KAAK,QAAQ,sBAAsB;AAE5C,SAASC,kBAAkB,QAAQ,0BAA0B;AAC7D,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,QAAQ,QAAQ,WAAW;AACpC,OAAOC,KAAK,IACVC,IAAI,EACJC,WAAW,EACXC,SAAS,EACTC,KAAK,EACLC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,SAEEC,6BAA6B,QACxB,mCAAmC;AAC1C,SACEC,sBAAsB,EACtBC,iBAAiB,QAEZ,6BAA6B;AACpC,OAAOC,MAAM,MAAM,yBAAyB;AAC5C,OAAOC,YAAY,MAAM,qBAAqB;AAE9C,MAAMC,WAAW,GAAG,GAAG;AAgCvB,SAASC,eAAeA,CAItB;EACAC,UAAU;EACVC,WAAW;EACXC,QAAQ;EACRC,QAAQ;EACRC,QAAQ;EACRC,SAAS;EACTC,aAAa,GAAG,IAAI;EACpBC,SAAS;EACTC,KAAK;EACLC;AACwB,CAAC,EAAsB;EAC/C,MAAMC,UAAU,GAAGrB,KAAK,CAAC,CAAC;EAC1B,MAAMsB,UAAU,GAAGtB,KAAK,CAAC,CAAC;EAE1B,MAAM,CAACuB,QAAQ,EAAEC,WAAW,CAAC,GAAGrB,QAAQ,CACtCiB,MAAM,CAACK,WAAW,CAACZ,QAAQ,CAC7B,CAAC;EACD,MAAM,CAACa,QAAQ,EAAEC,WAAW,CAAC,GAAGxB,QAAQ,CACtCiB,MAAM,CAACK,WAAW,CAACX,QAAQ,CAC7B,CAAC;EACD,MAAMc,WAAW,GAAG1B,MAAM,CAACa,QAAQ,CAAC;EACpCa,WAAW,CAACC,OAAO,GAAGd,QAAQ;EAC9B,MAAMe,WAAW,GAAG5B,MAAM,CAACW,QAAQ,CAAC;EACpCiB,WAAW,CAACD,OAAO,GAAGhB,QAAQ;EAC9B,MAAMkB,WAAW,GAAG7B,MAAM,CAACY,QAAQ,CAAC;EACpCiB,WAAW,CAACF,OAAO,GAAGf,QAAQ;EAE9B,MAAMkB,kBAAkB,GAAG/B,OAAO,CAChC,MACEN,QAAQ,CAAEsC,QAAgB,IAAK;IAC7B,MAAMC,MAAM,GAAGd,MAAM,CAACe,UAAU,CAACF,QAAQ,CAAC;IAC1CL,WAAW,CAACC,OAAO,CAACK,MAAM,EAAEH,WAAW,CAACF,OAAO,CAAC;EAClD,CAAC,EAAEpB,WAAW,CAAC,EACjB,CAACW,MAAM,CACT,CAAC;EAED,MAAMgB,kBAAkB,GAAGnC,OAAO,CAChC,MACEN,QAAQ,CAAEsC,QAAgB,IAAK;IAC7B,MAAMC,MAAM,GAAGd,MAAM,CAACe,UAAU,CAACF,QAAQ,CAAC;IAC1CL,WAAW,CAACC,OAAO,CAACC,WAAW,CAACD,OAAO,EAAEK,MAAM,CAAC;EAClD,CAAC,EAAEzB,WAAW,CAAC,EACjB,CAACW,MAAM,CACT,CAAC;EAEDrB,SAAS,CAAC,MAAM;IACdyB,WAAW,CAACJ,MAAM,CAACK,WAAW,CAACZ,QAAQ,CAAC,CAAC;IACzCmB,kBAAkB,CAACK,MAAM,CAAC,CAAC;EAC7B,CAAC,EAAE,CAACxB,QAAQ,EAAEO,MAAM,EAAEY,kBAAkB,CAAC,CAAC;EAE1CjC,SAAS,CAAC,MAAM;IACd4B,WAAW,CAACP,MAAM,CAACK,WAAW,CAACX,QAAQ,CAAC,CAAC;IACzCsB,kBAAkB,CAACC,MAAM,CAAC,CAAC;EAC7B,CAAC,EAAE,CAACvB,QAAQ,EAAEM,MAAM,EAAEgB,kBAAkB,CAAC,CAAC;EAE1CrC,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACXiC,kBAAkB,CAACK,MAAM,CAAC,CAAC;MAC3BD,kBAAkB,CAACC,MAAM,CAAC,CAAC;IAC7B,CAAC;EACH,CAAC,EAAE,CAACL,kBAAkB,EAAEI,kBAAkB,CAAC,CAAC;EAE5C,MAAME,gBAAgB,GAAGrC,OAAO,CAC9B,MAAMG,6BAA6B,CAAIQ,WAAqB,CAAC,EAC7D,CAACA,WAAW,CACd,CAAC;EAED,MAAM;IAAE2B,IAAI,EAAEC,aAAa;IAAEC;EAAU,CAAC,GAAGhD,kBAAkB,CAACkB,UAAU,EAAE;IACxE+B,SAAS,EAAEJ;EACb,CAAC,CAAC;EAEF,MAAMK,eAAe,GAAG1C,OAAO,CAAqC,MAAM;IACxE,IAAI,CAACuC,aAAa,EAAE,OAAO,EAAE;;IAE7B;;IAGA,MAAMI,KAAyC,GAAG,EAAE;IACpD,KAAK,MAAMC,IAAI,IAHGL,aAAa,EAGD;MAC5B,MAAMM,QAAQ,GAAGD,IAAI,CAACE,MAAM,CAACnC,WAAW,CAAW;MACnD,IAAIkC,QAAQ,IAAI,IAAI,EAAE;QACpB,MAAMZ,MAAM,GAAGd,MAAM,CAACe,UAAU,CAACa,MAAM,CAACF,QAAQ,CAAC,CAAC;QAClD,IAAIZ,MAAM,KAAKe,SAAS,EAAE;UACxBL,KAAK,CAACM,IAAI,CAAC;YAAEC,KAAK,EAAEjB,MAAM;YAAEkB,KAAK,EAAEP,IAAI,CAACQ,MAAM,IAAI;UAAE,CAAC,CAAC;QACxD;MACF;IACF;IAEA,OAAOT,KAAK;EACd,CAAC,EAAE,CAACJ,aAAa,EAAE5B,WAAW,EAAEQ,MAAM,CAAC,CAAC;EAExC,MAAMkC,aAAa,GAAGrD,OAAO,CAAC,MAAM;IAClC,IAAI0C,eAAe,CAACY,MAAM,KAAK,CAAC,EAAE,OAAO;MAAEC,GAAG,EAAEP,SAAS;MAAEQ,GAAG,EAAER;IAAU,CAAC;IAC3E,MAAMO,GAAG,GAAGb,eAAe,CAACe,MAAM,CAChC,CAACC,GAAG,EAAEC,CAAC,KAAKC,IAAI,CAACL,GAAG,CAACG,GAAG,EAAEvC,MAAM,CAAC0C,QAAQ,CAACF,CAAC,CAACT,KAAK,CAAC,CAAC,EACnDY,QACF,CAAC;IACD,MAAMN,GAAG,GAAGd,eAAe,CAACe,MAAM,CAChC,CAACC,GAAG,EAAEC,CAAC,KAAKC,IAAI,CAACJ,GAAG,CAACE,GAAG,EAAEvC,MAAM,CAAC0C,QAAQ,CAACF,CAAC,CAACT,KAAK,CAAC,CAAC,EACnD,CAACY,QACH,CAAC;IACD,OAAO;MACLP,GAAG,EAAEpC,MAAM,CAAC4C,UAAU,CAACR,GAAG,CAAC;MAC3BC,GAAG,EAAErC,MAAM,CAAC4C,UAAU,CAACP,GAAG;IAC5B,CAAC;EACH,CAAC,EAAE,CAACd,eAAe,EAAEvB,MAAM,CAAC,CAAC;EAE7B,MAAM6C,SAAS,GAAGhE,OAAO,CAAC,OAAO;IAC/BiE,OAAO,EAAEZ,aAAa,CAACE,GAAG;IAC1BW,OAAO,EAAEb,aAAa,CAACG;EACzB,CAAC,CAAC,EAAE,CAACH,aAAa,CAACE,GAAG,EAAEF,aAAa,CAACG,GAAG,CAAC,CAAC;EAE3C,MAAMW,OAAO,GAAGnE,OAAO,CAA4B,MAAM;IACvD,IACE,CAACgB,aAAa,IACX0B,eAAe,CAACY,MAAM,KAAK,CAAC,IAC5BD,aAAa,CAACE,GAAG,KAAKP,SAAS,IAC/BK,aAAa,CAACG,GAAG,KAAKR,SAAS,EAClC;MACA,OAAO,EAAE;IACX;IAEA,OAAO5C,sBAAsB,CAC3BsC,eAAe,EACf;MAAEa,GAAG,EAAEF,aAAa,CAACE,GAAG;MAAEC,GAAG,EAAEH,aAAa,CAACG;IAAI,CAAC,EAClDrC,MAAM,CAAC0C,QAAQ,EACf1C,MAAM,CAAC4C,UACT,CAAC;EACH,CAAC,EAAE,CAAC/C,aAAa,EAAE0B,eAAe,EAAEW,aAAa,EAAElC,MAAM,CAAC,CAAC;EAE3D,MAAMiD,cAAc,GAAGpE,OAAO,CAAC,MAAMK,iBAAiB,CAAC8D,OAAO,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;EAE3E,MAAME,eAAe,GAAGxE,WAAW,CAChCyE,CAAsC,IAAK;IAC1C,MAAMtC,QAAQ,GAAGsC,CAAC,CAACC,MAAM,CAACrB,KAAK;IAC/B3B,WAAW,CAACS,QAAQ,CAAC;IACrBD,kBAAkB,CAACC,QAAQ,CAAC;EAC9B,CAAC,EACD,CAACD,kBAAkB,CACrB,CAAC;EAED,MAAMyC,eAAe,GAAG3E,WAAW,CAChCyE,CAAsC,IAAK;IAC1C,MAAMtC,QAAQ,GAAGsC,CAAC,CAACC,MAAM,CAACrB,KAAK;IAC/BxB,WAAW,CAACM,QAAQ,CAAC;IACrBG,kBAAkB,CAACH,QAAQ,CAAC;EAC9B,CAAC,EACD,CAACG,kBAAkB,CACrB,CAAC;EAED,oBACExC,KAAA,CAAA8E,aAAA;IACExD,SAAS,EAAExB,UAAU,CAACa,MAAM,CAACoE,UAAU,EAAEzD,SAAS,CAAE;IACpDC,KAAK,EAAEA,KAAM;IACb,gBAAcsB;EAAU,GAEvBxB,aAAa,IAAImD,OAAO,CAACb,MAAM,GAAG,CAAC,iBAClC3D,KAAA,CAAA8E,aAAA;IAAKxD,SAAS,EAAEX,MAAM,CAACqE;EAAmB,GACvCR,OAAO,CAACS,GAAG,CAAC,CAACC,MAAM,EAAEC,KAAK,KAAK;IAC9B,MAAMC,MAAM,GAAIF,MAAM,CAAC1B,KAAK,GAAGiB,cAAc,GAAI,GAAG;IACpD,MAAMY,SAAS,GAAG,CAACpE,QAAQ,KAAKoC,SAAS,IACpC7B,MAAM,CAAC0C,QAAQ,CAACgB,MAAM,CAACrB,GAAG,CAAC,IAAIrC,MAAM,CAAC0C,QAAQ,CAACjD,QAAQ,CAAC,MACvDC,QAAQ,KAAKmC,SAAS,IACrB7B,MAAM,CAAC0C,QAAQ,CAACgB,MAAM,CAACtB,GAAG,CAAC,IAAIpC,MAAM,CAAC0C,QAAQ,CAAChD,QAAQ,CAAC,CAAC;IAEhE,oBACElB,KAAA,CAAA8E,aAAA;MACEQ,GAAG,EAAEH,KAAM;MACX7D,SAAS,EAAEX,MAAM,CAAC4E,YAAa;MAC/B,iBAAeF,SAAU;MACzB9D,KAAK,EAAE;QAAE6D,MAAM,EAAE,GAAGnB,IAAI,CAACJ,GAAG,CAACuB,MAAM,EAAE,CAAC,CAAC;MAAI,CAAE;MAC7CI,KAAK,EAAEhE,MAAM,CAACiE,aAAa,CACzBP,MAAM,CAACtB,GAAG,EACVsB,MAAM,CAACrB,GAAG,EACVqB,MAAM,CAAC1B,KACT;IAAE,CACH,CAAC;EAEN,CAAC,CACE,CACN,eAEDxD,KAAA,CAAA8E,aAAA;IAAKxD,SAAS,EAAEX,MAAM,CAAC+E;EAAY,gBACjC1F,KAAA,CAAA8E,aAAA;IAAKxD,SAAS,EAAEX,MAAM,CAACgF;EAAa,gBAClC3F,KAAA,CAAA8E,aAAA;IAAOc,OAAO,EAAEnE,UAAW;IAACH,SAAS,EAAEX,MAAM,CAACkF;EAAW,GACtDrE,MAAM,CAACsE,QACH,CAAC,eACR9F,KAAA,CAAA8E,aAAA,CAAClF,KAAK,EAAAmG,QAAA;IACJC,EAAE,EAAEvE,UAAW;IACfwE,IAAI,EAAEzE,MAAM,CAAC0E,SAAU;IACvB5E,SAAS,EAAEX,MAAM,CAACwF,KAAM;IACxB5C,KAAK,EAAE5B,QAAS;IAChBR,QAAQ,EAAEuD,eAAgB;IAC1B0B,WAAW,EAAE/B,SAAS,CAACC,OAAO,KAAKjB,SAAS,IACrC7B,MAAM,CAAC6E,iBAAiB,GAC3B7E,MAAM,CAAC6E,iBAAiB,CAAChC,SAAS,CAACC,OAAO,CAAC,GAC3CjB;EAAU,GACV7B,MAAM,CAAC8E,UAAU,CACtB,CACE,CAAC,eAENtG,KAAA,CAAA8E,aAAA;IAAMxD,SAAS,EAAEX,MAAM,CAAC4F,SAAU;IAAC,eAAY;EAAM,GAAC,QAEhD,CAAC,eAEPvG,KAAA,CAAA8E,aAAA;IAAKxD,SAAS,EAAEX,MAAM,CAACgF;EAAa,gBAClC3F,KAAA,CAAA8E,aAAA;IAAOc,OAAO,EAAElE,UAAW;IAACJ,SAAS,EAAEX,MAAM,CAACkF;EAAW,GACtDrE,MAAM,CAACgF,QACH,CAAC,eACRxG,KAAA,CAAA8E,aAAA,CAAClF,KAAK,EAAAmG,QAAA;IACJC,EAAE,EAAEtE,UAAW;IACfuE,IAAI,EAAEzE,MAAM,CAAC0E,SAAU;IACvB5E,SAAS,EAAEX,MAAM,CAACwF,KAAM;IACxB5C,KAAK,EAAEzB,QAAS;IAChBX,QAAQ,EAAE0D,eAAgB;IAC1BuB,WAAW,EAAE/B,SAAS,CAACE,OAAO,KAAKlB,SAAS,IACrC7B,MAAM,CAAC6E,iBAAiB,GAC3B7E,MAAM,CAAC6E,iBAAiB,CAAChC,SAAS,CAACE,OAAO,CAAC,GAC3ClB;EAAU,GACV7B,MAAM,CAAC8E,UAAU,CACtB,CACE,CACF,CAAC,EAELzD,SAAS,iBACR7C,KAAA,CAAA8E,aAAA;IAAKxD,SAAS,EAAEV,YAAY,CAAC6F;EAAe,GAAC,YAExC,CAEJ,CAAC;AAEV;AAEA,OAAO,MAAMC,UAAU,gBAAGzG,IAAI,CAACa,eAAe,CAA2B","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"RangeInput.js","names":["Input","classnames","debounce","React","memo","useCallback","useEffect","useId","useMemo","useRef","useState","createHistogramBuckets","getMaxBucketCount","styles","sharedStyles","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","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","loadingMessage","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 sharedStyles from \"./shared.module.css\";\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 computedRange = useMemo(() => {\n if (valueCountPairs.length === 0) return { min: undefined, max: undefined };\n const min = valueCountPairs.reduce(\n (acc, p) => Math.min(acc, config.toNumber(p.value)),\n Infinity,\n );\n const max = valueCountPairs.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 }, [valueCountPairs, 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 || valueCountPairs.length === 0\n || computedRange.min === undefined\n || computedRange.max === undefined\n ) {\n return [];\n }\n\n return createHistogramBuckets(\n valueCountPairs,\n { min: computedRange.min, max: computedRange.max },\n config.toNumber,\n config.fromNumber,\n );\n }, [showHistogram, valueCountPairs, 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 && buckets.length > 0 && (\n <div className={styles.histogramContainer}>\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\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Loading...\n </div>\n )}\n </div>\n );\n}\n\nexport const RangeInput = memo(RangeInputInner) as typeof RangeInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,47 +17,49 @@
|
|
|
17
17
|
.rangeInput {
|
|
18
18
|
display: flex;
|
|
19
19
|
flex-direction: column;
|
|
20
|
-
gap: var(--osdk-filter-range-gap
|
|
20
|
+
gap: var(--osdk-filter-range-gap);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
.histogramContainer {
|
|
24
24
|
display: flex;
|
|
25
25
|
align-items: flex-end;
|
|
26
|
-
height: var(--osdk-filter-range-histogram-height
|
|
27
|
-
gap: var(--osdk-filter-range-histogram-bar-gap
|
|
26
|
+
height: var(--osdk-filter-range-histogram-height);
|
|
27
|
+
gap: var(--osdk-filter-range-histogram-bar-gap);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
.histogramBar {
|
|
31
31
|
flex: 1;
|
|
32
|
-
background: var(--osdk-filter-range-histogram-bar-color
|
|
33
|
-
min-width: var(--osdk-filter-range-histogram-bar-min-width
|
|
34
|
-
transition: background-color var(--osdk-
|
|
32
|
+
background: var(--osdk-filter-range-histogram-bar-color);
|
|
33
|
+
min-width: var(--osdk-filter-range-histogram-bar-min-width);
|
|
34
|
+
transition: background-color var(--osdk-filter-range-histogram-bar-transition);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
.histogramBar[data-in-range="true"] {
|
|
38
|
-
background: var(--osdk-filter-range-histogram-bar-active-color
|
|
38
|
+
background: var(--osdk-filter-range-histogram-bar-active-color);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
.rangeInputs {
|
|
42
42
|
display: flex;
|
|
43
43
|
align-items: flex-end;
|
|
44
|
-
gap: var(--osdk-filter-range-inputs-gap
|
|
44
|
+
gap: var(--osdk-filter-range-inputs-gap);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
.inputWrapper {
|
|
48
48
|
flex: 1;
|
|
49
49
|
display: flex;
|
|
50
50
|
flex-direction: column;
|
|
51
|
-
gap: var(--osdk-filter-range-input-wrapper-gap
|
|
51
|
+
gap: var(--osdk-filter-range-input-wrapper-gap);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
.inputLabel {
|
|
55
|
-
font-
|
|
56
|
-
|
|
55
|
+
font-family: var(--osdk-filter-range-label-font-family);
|
|
56
|
+
font-size: var(--osdk-filter-range-label-font-size);
|
|
57
|
+
color: var(--osdk-filter-range-label-color);
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
.input {
|
|
60
|
-
font-
|
|
61
|
+
font-family: var(--osdk-filter-input-font-family);
|
|
62
|
+
font-size: var(--osdk-filter-input-font-size);
|
|
61
63
|
padding: var(--osdk-filter-input-padding);
|
|
62
64
|
border: var(--osdk-filter-input-border);
|
|
63
65
|
border-radius: var(--osdk-filter-input-border-radius);
|
|
@@ -76,6 +78,6 @@
|
|
|
76
78
|
}
|
|
77
79
|
|
|
78
80
|
.separator {
|
|
79
|
-
padding-bottom: calc(var(--osdk-
|
|
80
|
-
color: var(--osdk-
|
|
81
|
+
padding-bottom: calc(var(--osdk-filter-range-inputs-gap) * 0.75);
|
|
82
|
+
color: var(--osdk-filter-range-separator-color);
|
|
81
83
|
}
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
|
|
28
28
|
.input {
|
|
29
29
|
flex: 1;
|
|
30
|
-
font-
|
|
30
|
+
font-family: var(--osdk-filter-input-font-family);
|
|
31
|
+
font-size: var(--osdk-filter-timeline-input-font-size);
|
|
31
32
|
padding: var(--osdk-filter-input-padding);
|
|
32
33
|
border: var(--osdk-filter-input-border);
|
|
33
34
|
border-radius: var(--osdk-filter-input-border-radius);
|
|
@@ -19,28 +19,21 @@ import { Cross } from "@blueprintjs/icons";
|
|
|
19
19
|
import classnames from "classnames";
|
|
20
20
|
import React, { memo, useCallback, useMemo } from "react";
|
|
21
21
|
import { Select } from "../../../base-components/select/Select.js";
|
|
22
|
-
import { usePropertyAggregation } from "../../hooks/usePropertyAggregation.js";
|
|
23
22
|
import sharedStyles from "./shared.module.css";
|
|
24
23
|
import styles from "./SingleSelectInput.module.css";
|
|
25
24
|
function SingleSelectInputInner({
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
values,
|
|
26
|
+
isLoading,
|
|
27
|
+
error,
|
|
28
28
|
selectedValue,
|
|
29
29
|
onChange,
|
|
30
|
-
whereClause,
|
|
31
30
|
className,
|
|
32
31
|
style,
|
|
33
32
|
placeholder = "Select a value...",
|
|
34
33
|
showClearButton = true,
|
|
35
|
-
showCounts = false
|
|
34
|
+
showCounts = false,
|
|
35
|
+
ariaLabel = "Select value"
|
|
36
36
|
}) {
|
|
37
|
-
const {
|
|
38
|
-
data: values,
|
|
39
|
-
isLoading,
|
|
40
|
-
error
|
|
41
|
-
} = usePropertyAggregation(objectType, propertyKey, {
|
|
42
|
-
where: whereClause
|
|
43
|
-
});
|
|
44
37
|
const handleValueChange = useCallback(value => {
|
|
45
38
|
onChange(value ?? undefined);
|
|
46
39
|
}, [onChange]);
|
|
@@ -75,7 +68,7 @@ function SingleSelectInputInner({
|
|
|
75
68
|
items: items
|
|
76
69
|
}, /*#__PURE__*/React.createElement(Select.Trigger, {
|
|
77
70
|
placeholder: placeholder,
|
|
78
|
-
"aria-label":
|
|
71
|
+
"aria-label": ariaLabel
|
|
79
72
|
}), /*#__PURE__*/React.createElement(Select.Portal, null, /*#__PURE__*/React.createElement(Select.Positioner, null, /*#__PURE__*/React.createElement(Select.Popup, null, values.map(({
|
|
80
73
|
value,
|
|
81
74
|
count
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SingleSelectInput.js","names":["Button","Cross","classnames","React","memo","useCallback","useMemo","Select","
|
|
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","color","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 color=\"currentColor\" />\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":[]}
|
|
@@ -18,7 +18,6 @@ import { Button } from "@base-ui/react/button";
|
|
|
18
18
|
import classnames from "classnames";
|
|
19
19
|
import React, { memo, useCallback, useMemo, useState } from "react";
|
|
20
20
|
import { Combobox } from "../../../base-components/combobox/Combobox.js";
|
|
21
|
-
import { usePropertyAggregation } from "../../hooks/usePropertyAggregation.js";
|
|
22
21
|
import sharedStyles from "./shared.module.css";
|
|
23
22
|
import styles from "./TextTagsInput.module.css";
|
|
24
23
|
const TAG_SEPARATOR_PATTERN = /[,\n]/;
|
|
@@ -39,26 +38,19 @@ const TagItem = /*#__PURE__*/memo(function ({
|
|
|
39
38
|
}, "\xD7"));
|
|
40
39
|
});
|
|
41
40
|
function TextTagsInputInner({
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
suggestions,
|
|
42
|
+
isLoading,
|
|
43
|
+
error,
|
|
44
44
|
tags,
|
|
45
45
|
onChange,
|
|
46
|
-
whereClause,
|
|
47
46
|
className,
|
|
48
47
|
style,
|
|
49
48
|
placeholder = "Add a tag...",
|
|
50
49
|
allowCustomTags = true,
|
|
51
|
-
suggestionLimit = 10
|
|
50
|
+
suggestionLimit = 10,
|
|
51
|
+
ariaLabel = "Add tag"
|
|
52
52
|
}) {
|
|
53
53
|
const [inputValue, setInputValue] = useState("");
|
|
54
|
-
const {
|
|
55
|
-
data: suggestions,
|
|
56
|
-
isLoading,
|
|
57
|
-
error
|
|
58
|
-
} = usePropertyAggregation(objectType, propertyKey, {
|
|
59
|
-
limit: suggestionLimit ?? 0,
|
|
60
|
-
where: whereClause
|
|
61
|
-
});
|
|
62
54
|
const filteredSuggestions = useMemo(() => {
|
|
63
55
|
if (!suggestionLimit) return [];
|
|
64
56
|
const lowerInput = inputValue.toLowerCase();
|
|
@@ -126,7 +118,7 @@ function TextTagsInputInner({
|
|
|
126
118
|
placeholder: tags.length > 0 ? "" : placeholder,
|
|
127
119
|
onKeyDown: handleKeyDown,
|
|
128
120
|
onPaste: handlePaste,
|
|
129
|
-
"aria-label":
|
|
121
|
+
"aria-label": ariaLabel
|
|
130
122
|
}), /*#__PURE__*/React.createElement(Combobox.Portal, null, /*#__PURE__*/React.createElement(Combobox.Positioner, null, /*#__PURE__*/React.createElement(Combobox.Popup, null, filteredSuggestions.length === 0 ? allowCustomTags && inputValue.trim() ? /*#__PURE__*/React.createElement(Combobox.Empty, null, "Press Enter to add \"", inputValue, "\"") : /*#__PURE__*/React.createElement(Combobox.Empty, null, suggestionLimit ? "No suggestions" : "Type to add a tag") : filteredSuggestions.map(({
|
|
131
123
|
value,
|
|
132
124
|
count
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextTagsInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","Combobox","usePropertyAggregation","sharedStyles","styles","TAG_SEPARATOR_PATTERN","TagItem","tag","onRemove","handleRemove","createElement","className","type","tagRemove","onClick","TextTagsInputInner","objectType","propertyKey","tags","onChange","whereClause","style","placeholder","allowCustomTags","suggestionLimit","inputValue","setInputValue","data","suggestions","isLoading","error","limit","where","filteredSuggestions","lowerInput","toLowerCase","filter","s","trim","value","includes","slice","addTag","trimmedTag","removeTag","t","handleValueChange","newTags","handleInputValueChange","handleKeyDown","e","key","length","preventDefault","handlePaste","pastedText","clipboardData","getData","test","split","map","textTags","errorMessage","message","Root","multiple","onValueChange","onInputValueChange","tagContainer","Input","input","onKeyDown","onPaste","Portal","Positioner","Popup","Empty","count","Item","toLocaleString","loadingMessage","TextTagsInput"],"sources":["TextTagsInput.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 type {\n ObjectSet,\n ObjectTypeDefinition,\n PropertyKeys,\n WhereClause,\n} from \"@osdk/api\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo, useState } from \"react\";\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport { usePropertyAggregation } from \"../../hooks/usePropertyAggregation.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport styles from \"./TextTagsInput.module.css\";\n\nconst TAG_SEPARATOR_PATTERN = /[,\\n]/;\n\ninterface TagItemProps {\n tag: string;\n onRemove: (tag: string) => void;\n}\n\nconst TagItem = memo(function TagItem({ tag, onRemove }: TagItemProps) {\n const handleRemove = useCallback(() => {\n onRemove(tag);\n }, [tag, onRemove]);\n\n return (\n <span className={sharedStyles.tag}>\n {tag}\n <Button\n type=\"button\"\n className={sharedStyles.tagRemove}\n onClick={handleRemove}\n aria-label={`Remove ${tag}`}\n >\n ×\n </Button>\n </span>\n );\n});\n\ninterface TextTagsInputProps<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n> {\n objectType: Q;\n propertyKey: K;\n tags: string[];\n onChange: (tags: string[]) => void;\n objectSet?: ObjectSet<Q>;\n whereClause?: WhereClause<Q>;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n allowCustomTags?: boolean;\n suggestionLimit?: number;\n}\n\nfunction TextTagsInputInner<\n Q extends ObjectTypeDefinition,\n K extends PropertyKeys<Q>,\n>({\n objectType,\n propertyKey,\n tags,\n onChange,\n whereClause,\n className,\n style,\n placeholder = \"Add a tag...\",\n allowCustomTags = true,\n suggestionLimit = 10,\n}: TextTagsInputProps<Q, K>): React.ReactElement {\n const [inputValue, setInputValue] = useState(\"\");\n\n const { data: suggestions, isLoading, error } = usePropertyAggregation(\n objectType,\n propertyKey,\n { limit: suggestionLimit ?? 0, where: whereClause },\n );\n\n const filteredSuggestions = useMemo(() => {\n if (!suggestionLimit) return [];\n const lowerInput = inputValue.toLowerCase();\n return suggestions\n .filter(\n (s) =>\n (!inputValue.trim()\n || s.value.toLowerCase().includes(lowerInput))\n && !tags.includes(s.value),\n )\n .slice(0, suggestionLimit);\n }, [suggestions, inputValue, tags, suggestionLimit]);\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmedTag = tag.trim();\n if (trimmedTag && !tags.includes(trimmedTag)) {\n onChange([...tags, trimmedTag]);\n }\n setInputValue(\"\");\n },\n [tags, onChange],\n );\n\n const removeTag = useCallback(\n (tag: string) => {\n onChange(tags.filter((t) => t !== tag));\n },\n [tags, onChange],\n );\n\n const handleValueChange = useCallback(\n (newTags: string[] | null) => {\n onChange(newTags ?? []);\n },\n [onChange],\n );\n\n const handleInputValueChange = useCallback(\n (value: string) => {\n setInputValue(value);\n },\n [],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && inputValue.trim()) {\n if (filteredSuggestions.length > 0) {\n return;\n }\n e.preventDefault();\n if (allowCustomTags) {\n addTag(inputValue);\n }\n } else if (e.key === \"Backspace\" && !inputValue && tags.length > 0) {\n removeTag(tags[tags.length - 1]);\n }\n },\n [inputValue, tags, addTag, removeTag, allowCustomTags, filteredSuggestions],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n const pastedText = e.clipboardData.getData(\"text\");\n if (TAG_SEPARATOR_PATTERN.test(pastedText)) {\n e.preventDefault();\n const newTags = pastedText\n .split(TAG_SEPARATOR_PATTERN)\n .map((t) => t.trim())\n .filter((t) => t && !tags.includes(t));\n if (newTags.length > 0) {\n onChange([...tags, ...newTags]);\n }\n }\n },\n [tags, onChange],\n );\n\n return (\n <div\n className={classnames(styles.textTags, className)}\n style={style}\n data-loading={isLoading}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading suggestions: {error.message}\n </div>\n )}\n\n <Combobox.Root<string, true>\n multiple\n value={tags}\n onValueChange={handleValueChange}\n inputValue={inputValue}\n onInputValueChange={handleInputValueChange}\n >\n {tags.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {tags.map((tag) => (\n <TagItem key={tag} tag={tag} onRemove={removeTag} />\n ))}\n </div>\n )}\n\n <Combobox.Input\n className={styles.input}\n placeholder={tags.length > 0 ? \"\" : placeholder}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n aria-label={`Add ${propertyKey} tag`}\n />\n\n <Combobox.Portal>\n <Combobox.Positioner>\n <Combobox.Popup>\n {filteredSuggestions.length === 0\n ? (\n allowCustomTags && inputValue.trim()\n ? (\n <Combobox.Empty>\n Press Enter to add \"{inputValue}\"\n </Combobox.Empty>\n )\n : (\n <Combobox.Empty>\n {suggestionLimit\n ? \"No suggestions\"\n : \"Type to add a tag\"}\n </Combobox.Empty>\n )\n )\n : filteredSuggestions.map(({ value, count }) => (\n <Combobox.Item key={value} value={value}>\n {value} ({count.toLocaleString()})\n </Combobox.Item>\n ))}\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n\n {isLoading && !!suggestionLimit && (\n <div className={sharedStyles.loadingMessage}>\n Loading suggestions...\n </div>\n )}\n </div>\n );\n}\n\nexport const TextTagsInput = memo(\n TextTagsInputInner,\n) as typeof TextTagsInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"TextTagsInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","Combobox","sharedStyles","styles","TAG_SEPARATOR_PATTERN","TagItem","tag","onRemove","handleRemove","createElement","className","type","tagRemove","onClick","TextTagsInputInner","suggestions","isLoading","error","tags","onChange","style","placeholder","allowCustomTags","suggestionLimit","ariaLabel","inputValue","setInputValue","filteredSuggestions","lowerInput","toLowerCase","filter","s","trim","value","includes","slice","addTag","trimmedTag","removeTag","t","handleValueChange","newTags","handleInputValueChange","handleKeyDown","e","key","length","preventDefault","handlePaste","pastedText","clipboardData","getData","test","split","map","textTags","errorMessage","message","Root","multiple","onValueChange","onInputValueChange","tagContainer","Input","input","onKeyDown","onPaste","Portal","Positioner","Popup","Empty","count","Item","toLocaleString","loadingMessage","TextTagsInput"],"sources":["TextTagsInput.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 { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport styles from \"./TextTagsInput.module.css\";\n\nconst TAG_SEPARATOR_PATTERN = /[,\\n]/;\n\ninterface TagItemProps {\n tag: string;\n onRemove: (tag: string) => void;\n}\n\nconst TagItem = memo(function TagItem({ tag, onRemove }: TagItemProps) {\n const handleRemove = useCallback(() => {\n onRemove(tag);\n }, [tag, onRemove]);\n\n return (\n <span className={sharedStyles.tag}>\n {tag}\n <Button\n type=\"button\"\n className={sharedStyles.tagRemove}\n onClick={handleRemove}\n aria-label={`Remove ${tag}`}\n >\n ×\n </Button>\n </span>\n );\n});\n\ninterface TextTagsInputProps {\n suggestions: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n tags: string[];\n onChange: (tags: string[]) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n allowCustomTags?: boolean;\n suggestionLimit?: number;\n ariaLabel?: string;\n}\n\nfunction TextTagsInputInner({\n suggestions,\n isLoading,\n error,\n tags,\n onChange,\n className,\n style,\n placeholder = \"Add a tag...\",\n allowCustomTags = true,\n suggestionLimit = 10,\n ariaLabel = \"Add tag\",\n}: TextTagsInputProps): React.ReactElement {\n const [inputValue, setInputValue] = useState(\"\");\n\n const filteredSuggestions = useMemo(() => {\n if (!suggestionLimit) return [];\n const lowerInput = inputValue.toLowerCase();\n return suggestions\n .filter(\n (s) =>\n (!inputValue.trim()\n || s.value.toLowerCase().includes(lowerInput))\n && !tags.includes(s.value),\n )\n .slice(0, suggestionLimit);\n }, [suggestions, inputValue, tags, suggestionLimit]);\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmedTag = tag.trim();\n if (trimmedTag && !tags.includes(trimmedTag)) {\n onChange([...tags, trimmedTag]);\n }\n setInputValue(\"\");\n },\n [tags, onChange],\n );\n\n const removeTag = useCallback(\n (tag: string) => {\n onChange(tags.filter((t) => t !== tag));\n },\n [tags, onChange],\n );\n\n const handleValueChange = useCallback(\n (newTags: string[] | null) => {\n onChange(newTags ?? []);\n },\n [onChange],\n );\n\n const handleInputValueChange = useCallback(\n (value: string) => {\n setInputValue(value);\n },\n [],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && inputValue.trim()) {\n if (filteredSuggestions.length > 0) {\n return;\n }\n e.preventDefault();\n if (allowCustomTags) {\n addTag(inputValue);\n }\n } else if (e.key === \"Backspace\" && !inputValue && tags.length > 0) {\n removeTag(tags[tags.length - 1]);\n }\n },\n [inputValue, tags, addTag, removeTag, allowCustomTags, filteredSuggestions],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n const pastedText = e.clipboardData.getData(\"text\");\n if (TAG_SEPARATOR_PATTERN.test(pastedText)) {\n e.preventDefault();\n const newTags = pastedText\n .split(TAG_SEPARATOR_PATTERN)\n .map((t) => t.trim())\n .filter((t) => t && !tags.includes(t));\n if (newTags.length > 0) {\n onChange([...tags, ...newTags]);\n }\n }\n },\n [tags, onChange],\n );\n\n return (\n <div\n className={classnames(styles.textTags, className)}\n style={style}\n data-loading={isLoading}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading suggestions: {error.message}\n </div>\n )}\n\n <Combobox.Root<string, true>\n multiple\n value={tags}\n onValueChange={handleValueChange}\n inputValue={inputValue}\n onInputValueChange={handleInputValueChange}\n >\n {tags.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {tags.map((tag) => (\n <TagItem key={tag} tag={tag} onRemove={removeTag} />\n ))}\n </div>\n )}\n\n <Combobox.Input\n className={styles.input}\n placeholder={tags.length > 0 ? \"\" : placeholder}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n aria-label={ariaLabel}\n />\n\n <Combobox.Portal>\n <Combobox.Positioner>\n <Combobox.Popup>\n {filteredSuggestions.length === 0\n ? (\n allowCustomTags && inputValue.trim()\n ? (\n <Combobox.Empty>\n Press Enter to add \"{inputValue}\"\n </Combobox.Empty>\n )\n : (\n <Combobox.Empty>\n {suggestionLimit\n ? \"No suggestions\"\n : \"Type to add a tag\"}\n </Combobox.Empty>\n )\n )\n : filteredSuggestions.map(({ value, count }) => (\n <Combobox.Item key={value} value={value}>\n {value} ({count.toLocaleString()})\n </Combobox.Item>\n ))}\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n\n {isLoading && !!suggestionLimit && (\n <div className={sharedStyles.loadingMessage}>\n Loading suggestions...\n </div>\n )}\n </div>\n );\n}\n\nexport const TextTagsInput = memo(\n TextTagsInputInner,\n) as typeof TextTagsInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -47,9 +47,9 @@ function TimelineInputInner({
|
|
|
47
47
|
className: styles.labels
|
|
48
48
|
}, /*#__PURE__*/React.createElement("span", null, formatDateForDisplay(startDate, "—")), /*#__PURE__*/React.createElement("span", null, "to"), /*#__PURE__*/React.createElement("span", null, formatDateForDisplay(endDate, "—")), (startDate || endDate) && /*#__PURE__*/React.createElement(Button, {
|
|
49
49
|
type: "button",
|
|
50
|
-
className: styles.clearButton,
|
|
51
50
|
onClick: handleClear,
|
|
52
|
-
"aria-label": "Clear range"
|
|
51
|
+
"aria-label": "Clear range",
|
|
52
|
+
className: styles.clearButton
|
|
53
53
|
}, "\xD7")), /*#__PURE__*/React.createElement("div", {
|
|
54
54
|
className: styles.brush
|
|
55
55
|
}, /*#__PURE__*/React.createElement(Input, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimelineInput.js","names":["Button","Input","classnames","React","memo","useCallback","useMemo","formatDateForDisplay","formatDateForInput","parseDateFromInput","styles","TimelineInputInner","startDate","endDate","onChange","className","minDate","maxDate","handleStartChange","e","date","target","value","handleEndChange","handleClear","undefined","startInputMax","endInputMin","createElement","timeline","labels","type","
|
|
1
|
+
{"version":3,"file":"TimelineInput.js","names":["Button","Input","classnames","React","memo","useCallback","useMemo","formatDateForDisplay","formatDateForInput","parseDateFromInput","styles","TimelineInputInner","startDate","endDate","onChange","className","minDate","maxDate","handleStartChange","e","date","target","value","handleEndChange","handleClear","undefined","startInputMax","endInputMin","createElement","timeline","labels","type","onClick","clearButton","brush","input","min","max","TimelineInput"],"sources":["TimelineInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport { Input } from \"@base-ui/react/input\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport {\n formatDateForDisplay,\n formatDateForInput,\n parseDateFromInput,\n} from \"./dateUtils.js\";\nimport styles from \"./TimelineInput.module.css\";\n\ninterface TimelineInputProps {\n startDate: Date | undefined;\n endDate: Date | undefined;\n onChange: (startDate: Date | undefined, endDate: Date | undefined) => void;\n className?: string;\n minDate?: Date;\n maxDate?: Date;\n}\n\nfunction TimelineInputInner({\n startDate,\n endDate,\n onChange,\n className,\n minDate,\n maxDate,\n}: TimelineInputProps): React.ReactElement {\n const handleStartChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const date = parseDateFromInput(e.target.value);\n onChange(date, endDate);\n },\n [onChange, endDate],\n );\n\n const handleEndChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const date = parseDateFromInput(e.target.value);\n onChange(startDate, date);\n },\n [onChange, startDate],\n );\n\n const handleClear = useCallback(() => {\n onChange(undefined, undefined);\n }, [onChange]);\n\n const startInputMax = useMemo(\n () => endDate ?? maxDate,\n [endDate, maxDate],\n );\n const endInputMin = useMemo(\n () => startDate ?? minDate,\n [startDate, minDate],\n );\n\n return (\n <div className={classnames(styles.timeline, className)}>\n <div className={styles.labels}>\n <span>{formatDateForDisplay(startDate, \"—\")}</span>\n <span>to</span>\n <span>{formatDateForDisplay(endDate, \"—\")}</span>\n {(startDate || endDate) && (\n <Button\n type=\"button\"\n onClick={handleClear}\n aria-label=\"Clear range\"\n className={styles.clearButton}\n >\n ×\n </Button>\n )}\n </div>\n\n <div className={styles.brush}>\n <Input\n type=\"date\"\n className={styles.input}\n value={formatDateForInput(startDate)}\n onChange={handleStartChange}\n min={minDate ? formatDateForInput(minDate) : undefined}\n max={startInputMax ? formatDateForInput(startInputMax) : undefined}\n aria-label=\"Start date\"\n />\n <span>—</span>\n <Input\n type=\"date\"\n className={styles.input}\n value={formatDateForInput(endDate)}\n onChange={handleEndChange}\n min={endInputMin ? formatDateForInput(endInputMin) : undefined}\n max={maxDate ? formatDateForInput(maxDate) : undefined}\n aria-label=\"End date\"\n />\n </div>\n </div>\n );\n}\n\nexport const TimelineInput: React.NamedExoticComponent<TimelineInputProps> =\n memo(TimelineInputInner);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,48 +17,50 @@
|
|
|
17
17
|
.timeline {
|
|
18
18
|
display: flex;
|
|
19
19
|
flex-direction: column;
|
|
20
|
-
gap: var(--osdk-filter-range-gap
|
|
20
|
+
gap: var(--osdk-filter-range-gap);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
.labels {
|
|
24
24
|
display: flex;
|
|
25
25
|
align-items: center;
|
|
26
|
-
gap: var(--osdk-
|
|
27
|
-
font-
|
|
28
|
-
|
|
26
|
+
gap: var(--osdk-filter-timeline-labels-gap);
|
|
27
|
+
font-family: var(--osdk-filter-timeline-labels-font-family);
|
|
28
|
+
font-size: var(--osdk-filter-timeline-labels-font-size);
|
|
29
|
+
color: var(--osdk-filter-timeline-labels-color);
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
.clearButton {
|
|
32
33
|
display: flex;
|
|
33
34
|
align-items: center;
|
|
34
35
|
justify-content: center;
|
|
35
|
-
padding:
|
|
36
|
+
padding: var(--osdk-filter-timeline-button-padding);
|
|
36
37
|
border: none;
|
|
37
38
|
background: transparent;
|
|
38
39
|
cursor: pointer;
|
|
39
|
-
color: var(--osdk-
|
|
40
|
-
border-radius: var(--osdk-
|
|
40
|
+
color: var(--osdk-filter-timeline-button-color);
|
|
41
|
+
border-radius: var(--osdk-filter-timeline-button-border-radius);
|
|
41
42
|
margin-left: auto;
|
|
42
43
|
|
|
43
44
|
&:hover {
|
|
44
|
-
background: var(--osdk-
|
|
45
|
-
color: var(--osdk-
|
|
45
|
+
background: var(--osdk-filter-timeline-button-bg-hover);
|
|
46
|
+
color: var(--osdk-filter-timeline-button-color-hover);
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
.brush {
|
|
50
51
|
display: flex;
|
|
51
52
|
align-items: center;
|
|
52
|
-
gap: var(--osdk-
|
|
53
|
+
gap: var(--osdk-filter-timeline-labels-gap);
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
.brush span {
|
|
56
|
-
color: var(--osdk-
|
|
57
|
+
color: var(--osdk-filter-timeline-brush-color);
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
.input {
|
|
60
61
|
flex: 1;
|
|
61
|
-
font-
|
|
62
|
+
font-family: var(--osdk-filter-input-font-family);
|
|
63
|
+
font-size: var(--osdk-filter-timeline-input-font-size);
|
|
62
64
|
padding: var(--osdk-filter-input-padding);
|
|
63
65
|
border: var(--osdk-filter-input-border);
|
|
64
66
|
border-radius: var(--osdk-filter-input-border-radius);
|
|
@@ -18,17 +18,18 @@
|
|
|
18
18
|
.loadingMessage,
|
|
19
19
|
.errorMessage,
|
|
20
20
|
.emptyMessage {
|
|
21
|
-
font-
|
|
22
|
-
|
|
21
|
+
font-family: var(--osdk-filter-message-font-family);
|
|
22
|
+
font-size: var(--osdk-filter-message-font-size);
|
|
23
|
+
padding: var(--osdk-filter-message-padding);
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
.loadingMessage,
|
|
26
27
|
.emptyMessage {
|
|
27
|
-
color: var(--osdk-
|
|
28
|
+
color: var(--osdk-filter-message-color-muted);
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
.errorMessage {
|
|
31
|
-
color: var(--osdk-
|
|
32
|
+
color: var(--osdk-filter-message-color-danger);
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
/* Shared tag styles */
|
|
@@ -72,20 +72,29 @@ export function useFilterListState(props) {
|
|
|
72
72
|
filterDefinitions,
|
|
73
73
|
filterOperator = "and",
|
|
74
74
|
onFilterStateChanged,
|
|
75
|
-
onFilterClauseChanged
|
|
75
|
+
onFilterClauseChanged,
|
|
76
|
+
initialFilterStates
|
|
76
77
|
} = props;
|
|
77
78
|
const objectType = objectSet.$objectSetInternals.def;
|
|
78
|
-
const [filterStates, setFilterStates] = useState(() =>
|
|
79
|
+
const [filterStates, setFilterStates] = useState(() => {
|
|
80
|
+
const states = buildInitialStates(filterDefinitions);
|
|
81
|
+
if (initialFilterStates) {
|
|
82
|
+
for (const [key, state] of initialFilterStates) {
|
|
83
|
+
states.set(key, state);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return states;
|
|
87
|
+
});
|
|
79
88
|
const setFilterState = useCallback((filterKey, state) => {
|
|
80
|
-
let
|
|
89
|
+
let computedClause;
|
|
81
90
|
setFilterStates(prev => {
|
|
82
91
|
const next = new Map(prev);
|
|
83
92
|
next.set(filterKey, state);
|
|
84
|
-
|
|
93
|
+
computedClause = buildWhereClause(filterDefinitions, next, filterOperator, objectType);
|
|
85
94
|
return next;
|
|
86
95
|
});
|
|
87
|
-
if (
|
|
88
|
-
onFilterClauseChanged?.(
|
|
96
|
+
if (computedClause !== undefined) {
|
|
97
|
+
onFilterClauseChanged?.(computedClause);
|
|
89
98
|
}
|
|
90
99
|
const definition = filterDefinitions?.find(d => getFilterKey(d) === filterKey);
|
|
91
100
|
if (definition) {
|
|
@@ -93,6 +102,17 @@ export function useFilterListState(props) {
|
|
|
93
102
|
}
|
|
94
103
|
}, [filterDefinitions, filterOperator, objectType, onFilterClauseChanged, onFilterStateChanged]);
|
|
95
104
|
const whereClause = useMemo(() => buildWhereClause(filterDefinitions, filterStates, filterOperator, objectType), [filterDefinitions, filterStates, filterOperator, objectType]);
|
|
105
|
+
const perFilterWhereClauses = useMemo(() => {
|
|
106
|
+
const map = new Map();
|
|
107
|
+
if (!filterDefinitions) {
|
|
108
|
+
return map;
|
|
109
|
+
}
|
|
110
|
+
for (const definition of filterDefinitions) {
|
|
111
|
+
const key = getFilterKey(definition);
|
|
112
|
+
map.set(key, buildWhereClause(filterDefinitions, filterStates, filterOperator, objectType, key));
|
|
113
|
+
}
|
|
114
|
+
return map;
|
|
115
|
+
}, [filterDefinitions, filterStates, filterOperator, objectType]);
|
|
96
116
|
const activeFilterCount = useMemo(() => {
|
|
97
117
|
let count = 0;
|
|
98
118
|
for (const state of filterStates.values()) {
|
|
@@ -105,15 +125,15 @@ export function useFilterListState(props) {
|
|
|
105
125
|
const reset = useCallback(() => {
|
|
106
126
|
const initialStates = buildInitialStates(filterDefinitions);
|
|
107
127
|
setFilterStates(initialStates);
|
|
108
|
-
|
|
109
|
-
onFilterClauseChanged?.(newWhereClause);
|
|
128
|
+
onFilterClauseChanged?.(buildWhereClause(filterDefinitions, initialStates, filterOperator, objectType));
|
|
110
129
|
}, [filterDefinitions, filterOperator, objectType, onFilterClauseChanged]);
|
|
111
130
|
return useMemo(() => ({
|
|
112
131
|
filterStates,
|
|
113
132
|
setFilterState,
|
|
114
133
|
whereClause,
|
|
134
|
+
perFilterWhereClauses,
|
|
115
135
|
activeFilterCount,
|
|
116
136
|
reset
|
|
117
|
-
}), [filterStates, setFilterState, whereClause, activeFilterCount, reset]);
|
|
137
|
+
}), [filterStates, setFilterState, whereClause, perFilterWhereClauses, activeFilterCount, reset]);
|
|
118
138
|
}
|
|
119
139
|
//# sourceMappingURL=useFilterListState.js.map
|