@osdk/react-components 0.2.0-beta.19 → 0.2.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/build/browser/action-form/ActionForm.js +5 -1
- package/build/browser/action-form/ActionForm.js.map +1 -1
- package/build/browser/action-form/BaseForm.js +4 -8
- package/build/browser/action-form/BaseForm.js.map +1 -1
- package/build/browser/action-form/FormFieldApi.js.map +1 -1
- package/build/browser/action-form/fields/DropdownField.js +104 -0
- package/build/browser/action-form/fields/DropdownField.js.map +1 -0
- package/build/browser/action-form/fields/FormFieldRenderer.js +23 -12
- package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/browser/action-form/fields/TextInputField.js +8 -9
- package/build/browser/action-form/fields/TextInputField.js.map +1 -1
- package/build/browser/base-components/combobox/Combobox.js +25 -3
- package/build/browser/base-components/combobox/Combobox.js.map +1 -1
- package/build/browser/base-components/combobox/Combobox.module.css +226 -46
- package/build/browser/base-components/combobox/Combobox.module.css.js +1 -0
- package/build/browser/base-components/select/Select.js +7 -1
- package/build/browser/base-components/select/Select.js.map +1 -1
- package/build/browser/base-components/select/Select.module.css +132 -35
- package/build/browser/base-components/select/Select.module.css.js +2 -0
- package/build/browser/base-components/skeleton/SkeletonBar.js +36 -0
- package/build/browser/base-components/skeleton/SkeletonBar.js.map +1 -0
- package/build/browser/base-components/skeleton/SkeletonBar.module.css +39 -0
- package/build/browser/base-components/skeleton/SkeletonBar.module.css.js +7 -0
- package/build/browser/filter-list/FilterList.js +42 -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 +45 -0
- package/build/browser/filter-list/base/AddFilterPopover.js.map +1 -0
- package/build/browser/filter-list/base/AddFilterPopover.module.css +83 -0
- package/build/browser/filter-list/base/AddFilterPopover.module.css.js +9 -0
- package/build/browser/filter-list/base/inputs/CheckboxListInput.js +16 -27
- package/build/browser/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/CheckboxListInput.module.css +15 -5
- package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.js +46 -0
- package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.js.map +1 -0
- package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.module.css +32 -0
- package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.module.css.js +8 -0
- package/build/browser/filter-list/base/inputs/ListogramInput.js +21 -12
- package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/ListogramInput.module.css +13 -1
- package/build/browser/filter-list/base/inputs/ListogramSkeleton.js +45 -0
- package/build/browser/filter-list/base/inputs/ListogramSkeleton.js.map +1 -0
- package/build/browser/filter-list/base/inputs/ListogramSkeleton.module.css +32 -0
- package/build/browser/filter-list/base/inputs/ListogramSkeleton.module.css.js +8 -0
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js +1 -1
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/RangeInput.js +13 -13
- package/build/browser/filter-list/base/inputs/RangeInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/RangeInput.module.css +23 -0
- package/build/browser/filter-list/base/inputs/TextTagsInput.js +1 -1
- package/build/browser/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/useStaleData.js +29 -0
- package/build/browser/filter-list/base/inputs/useStaleData.js.map +1 -0
- package/build/browser/filter-list/hooks/useFilterVisibility.js +68 -0
- package/build/browser/filter-list/hooks/useFilterVisibility.js.map +1 -0
- package/build/browser/object-table/DefaultCellRenderer.js +13 -3
- package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/browser/object-table/EditableCell.js +7 -6
- package/build/browser/object-table/EditableCell.js.map +1 -1
- package/build/browser/object-table/LoadingCell.js +6 -3
- package/build/browser/object-table/LoadingCell.js.map +1 -1
- package/build/browser/object-table/LoadingRow.js +2 -1
- package/build/browser/object-table/LoadingRow.js.map +1 -1
- package/build/browser/object-table/ObjectTableApi.js.map +1 -1
- package/build/browser/object-table/Table.js.map +1 -1
- package/build/browser/object-table/TableCell.module.css +1 -0
- package/build/browser/object-table/components/AsyncValueCell.js +35 -0
- package/build/browser/object-table/components/AsyncValueCell.js.map +1 -0
- package/build/browser/object-table/hooks/useColumnDefs.js +3 -1
- package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/browser/object-table/hooks/useFunctionColumnsData.js +270 -0
- package/build/browser/object-table/hooks/useFunctionColumnsData.js.map +1 -0
- package/build/browser/object-table/hooks/useObjectTableData.js +34 -13
- package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
- package/build/browser/object-table/utils/AsyncCellData.js +30 -0
- package/build/browser/object-table/utils/AsyncCellData.js.map +1 -0
- package/build/browser/object-table/utils/constants.js +1 -0
- package/build/browser/object-table/utils/constants.js.map +1 -1
- package/build/browser/pdf-viewer/PdfRenderer.js +88 -0
- package/build/browser/pdf-viewer/PdfRenderer.js.map +1 -0
- package/build/browser/pdf-viewer/PdfViewer.js +197 -0
- package/build/browser/pdf-viewer/PdfViewer.js.map +1 -0
- package/build/browser/pdf-viewer/PdfViewer.module.css +95 -0
- package/build/browser/pdf-viewer/PdfViewer.module.css.js +16 -0
- package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.js +74 -0
- package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.js.map +1 -0
- package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.module.css +65 -0
- package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.module.css.js +11 -0
- package/build/browser/pdf-viewer/PdfViewerSearchBar.js +84 -0
- package/build/browser/pdf-viewer/PdfViewerSearchBar.js.map +1 -0
- package/build/browser/pdf-viewer/PdfViewerSearchBar.module.css +65 -0
- package/build/browser/pdf-viewer/PdfViewerSearchBar.module.css.js +10 -0
- package/build/browser/pdf-viewer/PdfViewerSidebar.js +74 -0
- package/build/browser/pdf-viewer/PdfViewerSidebar.js.map +1 -0
- package/build/browser/pdf-viewer/PdfViewerSidebar.module.css +46 -0
- package/build/browser/pdf-viewer/PdfViewerSidebar.module.css.js +11 -0
- package/build/browser/pdf-viewer/PdfViewerThumbnail.js +100 -0
- package/build/browser/pdf-viewer/PdfViewerThumbnail.js.map +1 -0
- package/build/browser/pdf-viewer/PdfViewerThumbnail.module.css +26 -0
- package/build/browser/pdf-viewer/PdfViewerThumbnail.module.css.js +8 -0
- package/build/browser/pdf-viewer/PdfViewerToolbar.js +167 -0
- package/build/browser/pdf-viewer/PdfViewerToolbar.js.map +1 -0
- package/build/browser/pdf-viewer/PdfViewerToolbar.module.css +86 -0
- package/build/browser/pdf-viewer/PdfViewerToolbar.module.css.js +12 -0
- package/build/browser/pdf-viewer/constants.js +43 -0
- package/build/browser/pdf-viewer/constants.js.map +1 -0
- package/build/browser/pdf-viewer/hooks/usePdfAnnotationPortals.js +54 -0
- package/build/browser/pdf-viewer/hooks/usePdfAnnotationPortals.js.map +1 -0
- package/build/browser/pdf-viewer/hooks/usePdfDocument.js +67 -0
- package/build/browser/pdf-viewer/hooks/usePdfDocument.js.map +1 -0
- package/build/browser/pdf-viewer/hooks/usePdfViewer.js +69 -0
- package/build/browser/pdf-viewer/hooks/usePdfViewer.js.map +1 -0
- package/build/browser/pdf-viewer/hooks/usePdfViewerSearch.js +106 -0
- package/build/browser/pdf-viewer/hooks/usePdfViewerSearch.js.map +1 -0
- package/build/browser/pdf-viewer/hooks/usePdfViewerSync.js +71 -0
- package/build/browser/pdf-viewer/hooks/usePdfViewerSync.js.map +1 -0
- package/build/browser/pdf-viewer/types.js +2 -0
- package/build/browser/pdf-viewer/types.js.map +1 -0
- package/build/browser/public/experimental.js +4 -0
- package/build/browser/public/experimental.js.map +1 -1
- package/build/browser/styles.css +1008 -87
- package/build/cjs/public/experimental.cjs +2311 -895
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.css +678 -153
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/experimental.d.cts +114 -13
- package/build/esm/action-form/ActionForm.js +5 -1
- package/build/esm/action-form/ActionForm.js.map +1 -1
- package/build/esm/action-form/BaseForm.js +4 -8
- package/build/esm/action-form/BaseForm.js.map +1 -1
- package/build/esm/action-form/FormFieldApi.js.map +1 -1
- package/build/esm/action-form/fields/DropdownField.js +104 -0
- package/build/esm/action-form/fields/DropdownField.js.map +1 -0
- package/build/esm/action-form/fields/FormFieldRenderer.js +23 -12
- package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/esm/action-form/fields/TextInputField.js +8 -9
- package/build/esm/action-form/fields/TextInputField.js.map +1 -1
- package/build/esm/base-components/combobox/Combobox.js +25 -3
- package/build/esm/base-components/combobox/Combobox.js.map +1 -1
- package/build/esm/base-components/combobox/Combobox.module.css +226 -46
- package/build/esm/base-components/select/Select.js +7 -1
- package/build/esm/base-components/select/Select.js.map +1 -1
- package/build/esm/base-components/select/Select.module.css +132 -35
- package/build/esm/base-components/skeleton/SkeletonBar.js +36 -0
- package/build/esm/base-components/skeleton/SkeletonBar.js.map +1 -0
- package/build/esm/base-components/skeleton/SkeletonBar.module.css +39 -0
- package/build/esm/filter-list/FilterList.js +42 -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 +45 -0
- package/build/esm/filter-list/base/AddFilterPopover.js.map +1 -0
- package/build/esm/filter-list/base/AddFilterPopover.module.css +83 -0
- package/build/esm/filter-list/base/inputs/CheckboxListInput.js +16 -27
- package/build/esm/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/CheckboxListInput.module.css +15 -5
- package/build/esm/filter-list/base/inputs/CheckboxListSkeleton.js +46 -0
- package/build/esm/filter-list/base/inputs/CheckboxListSkeleton.js.map +1 -0
- package/build/esm/filter-list/base/inputs/CheckboxListSkeleton.module.css +32 -0
- package/build/esm/filter-list/base/inputs/ListogramInput.js +21 -12
- package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/ListogramInput.module.css +13 -1
- package/build/esm/filter-list/base/inputs/ListogramSkeleton.js +45 -0
- package/build/esm/filter-list/base/inputs/ListogramSkeleton.js.map +1 -0
- package/build/esm/filter-list/base/inputs/ListogramSkeleton.module.css +32 -0
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js +1 -1
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/RangeInput.js +13 -13
- package/build/esm/filter-list/base/inputs/RangeInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/RangeInput.module.css +23 -0
- package/build/esm/filter-list/base/inputs/TextTagsInput.js +1 -1
- package/build/esm/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/useStaleData.js +29 -0
- package/build/esm/filter-list/base/inputs/useStaleData.js.map +1 -0
- package/build/esm/filter-list/hooks/useFilterVisibility.js +68 -0
- package/build/esm/filter-list/hooks/useFilterVisibility.js.map +1 -0
- package/build/esm/object-table/DefaultCellRenderer.js +13 -3
- package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/esm/object-table/EditableCell.js +7 -6
- package/build/esm/object-table/EditableCell.js.map +1 -1
- package/build/esm/object-table/LoadingCell.js +6 -3
- package/build/esm/object-table/LoadingCell.js.map +1 -1
- package/build/esm/object-table/LoadingRow.js +2 -1
- package/build/esm/object-table/LoadingRow.js.map +1 -1
- package/build/esm/object-table/ObjectTableApi.js.map +1 -1
- package/build/esm/object-table/Table.js.map +1 -1
- package/build/esm/object-table/TableCell.module.css +1 -0
- package/build/esm/object-table/components/AsyncValueCell.js +35 -0
- package/build/esm/object-table/components/AsyncValueCell.js.map +1 -0
- package/build/esm/object-table/hooks/useColumnDefs.js +3 -1
- package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/esm/object-table/hooks/useFunctionColumnsData.js +270 -0
- package/build/esm/object-table/hooks/useFunctionColumnsData.js.map +1 -0
- package/build/esm/object-table/hooks/useObjectTableData.js +34 -13
- package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
- package/build/esm/object-table/utils/AsyncCellData.js +30 -0
- package/build/esm/object-table/utils/AsyncCellData.js.map +1 -0
- package/build/esm/object-table/utils/constants.js +1 -0
- package/build/esm/object-table/utils/constants.js.map +1 -1
- package/build/esm/pdf-viewer/PdfRenderer.js +88 -0
- package/build/esm/pdf-viewer/PdfRenderer.js.map +1 -0
- package/build/esm/pdf-viewer/PdfViewer.js +197 -0
- package/build/esm/pdf-viewer/PdfViewer.js.map +1 -0
- package/build/esm/pdf-viewer/PdfViewer.module.css +95 -0
- package/build/esm/pdf-viewer/PdfViewerAnnotationLayer.js +74 -0
- package/build/esm/pdf-viewer/PdfViewerAnnotationLayer.js.map +1 -0
- package/build/esm/pdf-viewer/PdfViewerAnnotationLayer.module.css +65 -0
- package/build/esm/pdf-viewer/PdfViewerSearchBar.js +84 -0
- package/build/esm/pdf-viewer/PdfViewerSearchBar.js.map +1 -0
- package/build/esm/pdf-viewer/PdfViewerSearchBar.module.css +65 -0
- package/build/esm/pdf-viewer/PdfViewerSidebar.js +74 -0
- package/build/esm/pdf-viewer/PdfViewerSidebar.js.map +1 -0
- package/build/esm/pdf-viewer/PdfViewerSidebar.module.css +46 -0
- package/build/esm/pdf-viewer/PdfViewerThumbnail.js +100 -0
- package/build/esm/pdf-viewer/PdfViewerThumbnail.js.map +1 -0
- package/build/esm/pdf-viewer/PdfViewerThumbnail.module.css +26 -0
- package/build/esm/pdf-viewer/PdfViewerToolbar.js +167 -0
- package/build/esm/pdf-viewer/PdfViewerToolbar.js.map +1 -0
- package/build/esm/pdf-viewer/PdfViewerToolbar.module.css +86 -0
- package/build/esm/pdf-viewer/constants.js +43 -0
- package/build/esm/pdf-viewer/constants.js.map +1 -0
- package/build/esm/pdf-viewer/hooks/usePdfAnnotationPortals.js +54 -0
- package/build/esm/pdf-viewer/hooks/usePdfAnnotationPortals.js.map +1 -0
- package/build/esm/pdf-viewer/hooks/usePdfDocument.js +67 -0
- package/build/esm/pdf-viewer/hooks/usePdfDocument.js.map +1 -0
- package/build/esm/pdf-viewer/hooks/usePdfViewer.js +69 -0
- package/build/esm/pdf-viewer/hooks/usePdfViewer.js.map +1 -0
- package/build/esm/pdf-viewer/hooks/usePdfViewerSearch.js +106 -0
- package/build/esm/pdf-viewer/hooks/usePdfViewerSearch.js.map +1 -0
- package/build/esm/pdf-viewer/hooks/usePdfViewerSync.js +71 -0
- package/build/esm/pdf-viewer/hooks/usePdfViewerSync.js.map +1 -0
- package/build/esm/pdf-viewer/types.js +2 -0
- package/build/esm/pdf-viewer/types.js.map +1 -0
- package/build/esm/public/experimental.js +4 -0
- package/build/esm/public/experimental.js.map +1 -1
- package/build/types/action-form/FormFieldApi.d.ts +48 -37
- package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
- package/build/types/action-form/fields/DropdownField.d.ts +6 -0
- package/build/types/action-form/fields/DropdownField.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 +3 -1
- package/build/types/action-form/fields/TextInputField.d.ts.map +1 -1
- package/build/types/base-components/combobox/Combobox.d.ts +9 -1
- package/build/types/base-components/combobox/Combobox.d.ts.map +1 -1
- package/build/types/base-components/select/Select.d.ts +8 -2
- package/build/types/base-components/select/Select.d.ts.map +1 -1
- package/build/types/base-components/skeleton/SkeletonBar.d.ts +9 -0
- package/build/types/base-components/skeleton/SkeletonBar.d.ts.map +1 -0
- package/build/types/filter-list/FilterList.d.ts.map +1 -1
- package/build/types/filter-list/FilterListApi.d.ts +24 -6
- package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
- package/build/types/filter-list/base/AddFilterPopover.d.ts +12 -0
- package/build/types/filter-list/base/AddFilterPopover.d.ts.map +1 -0
- package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts +2 -1
- package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/CheckboxListSkeleton.d.ts +2 -0
- package/build/types/filter-list/base/inputs/CheckboxListSkeleton.d.ts.map +1 -0
- package/build/types/filter-list/base/inputs/ListogramInput.d.ts +2 -1
- package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/ListogramSkeleton.d.ts +2 -0
- package/build/types/filter-list/base/inputs/ListogramSkeleton.d.ts.map +1 -0
- package/build/types/filter-list/base/inputs/RangeInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/useStaleData.d.ts +1 -0
- package/build/types/filter-list/base/inputs/useStaleData.d.ts.map +1 -0
- package/build/types/filter-list/hooks/useFilterVisibility.d.ts +8 -0
- package/build/types/filter-list/hooks/useFilterVisibility.d.ts.map +1 -0
- package/build/types/object-table/DefaultCellRenderer.d.ts.map +1 -1
- package/build/types/object-table/EditableCell.d.ts.map +1 -1
- package/build/types/object-table/LoadingCell.d.ts +1 -0
- package/build/types/object-table/LoadingCell.d.ts.map +1 -1
- package/build/types/object-table/LoadingRow.d.ts.map +1 -1
- package/build/types/object-table/ObjectTableApi.d.ts +51 -15
- package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
- package/build/types/object-table/Table.d.ts +1 -0
- package/build/types/object-table/Table.d.ts.map +1 -1
- package/build/types/object-table/components/AsyncValueCell.d.ts +5 -0
- package/build/types/object-table/components/AsyncValueCell.d.ts.map +1 -0
- package/build/types/object-table/hooks/useFunctionColumnsData.d.ts +13 -0
- package/build/types/object-table/hooks/useFunctionColumnsData.d.ts.map +1 -0
- package/build/types/object-table/hooks/useObjectTableData.d.ts +8 -1
- package/build/types/object-table/hooks/useObjectTableData.d.ts.map +1 -1
- package/build/types/object-table/utils/AsyncCellData.d.ts +8 -0
- package/build/types/object-table/utils/AsyncCellData.d.ts.map +1 -0
- package/build/types/object-table/utils/constants.d.ts +1 -0
- package/build/types/object-table/utils/constants.d.ts.map +1 -1
- package/build/types/pdf-viewer/PdfRenderer.d.ts +8 -0
- package/build/types/pdf-viewer/PdfRenderer.d.ts.map +1 -0
- package/build/types/pdf-viewer/PdfViewer.d.ts +4 -0
- package/build/types/pdf-viewer/PdfViewer.d.ts.map +1 -0
- package/build/types/pdf-viewer/PdfViewerAnnotationLayer.d.ts +10 -0
- package/build/types/pdf-viewer/PdfViewerAnnotationLayer.d.ts.map +1 -0
- package/build/types/pdf-viewer/PdfViewerSearchBar.d.ts +12 -0
- package/build/types/pdf-viewer/PdfViewerSearchBar.d.ts.map +1 -0
- package/build/types/pdf-viewer/PdfViewerSidebar.d.ts +10 -0
- package/build/types/pdf-viewer/PdfViewerSidebar.d.ts.map +1 -0
- package/build/types/pdf-viewer/PdfViewerThumbnail.d.ts +10 -0
- package/build/types/pdf-viewer/PdfViewerThumbnail.d.ts.map +1 -0
- package/build/types/pdf-viewer/PdfViewerToolbar.d.ts +14 -0
- package/build/types/pdf-viewer/PdfViewerToolbar.d.ts.map +1 -0
- package/build/types/pdf-viewer/constants.d.ts +17 -0
- package/build/types/pdf-viewer/constants.d.ts.map +1 -0
- package/build/types/pdf-viewer/hooks/usePdfAnnotationPortals.d.ts +10 -0
- package/build/types/pdf-viewer/hooks/usePdfAnnotationPortals.d.ts.map +1 -0
- package/build/types/pdf-viewer/hooks/usePdfDocument.d.ts +9 -0
- package/build/types/pdf-viewer/hooks/usePdfDocument.d.ts.map +1 -0
- package/build/types/pdf-viewer/hooks/usePdfViewer.d.ts +9 -0
- package/build/types/pdf-viewer/hooks/usePdfViewer.d.ts.map +1 -0
- package/build/types/pdf-viewer/hooks/usePdfViewerSearch.d.ts +15 -0
- package/build/types/pdf-viewer/hooks/usePdfViewerSearch.d.ts.map +1 -0
- package/build/types/pdf-viewer/hooks/usePdfViewerSync.d.ts +15 -0
- package/build/types/pdf-viewer/hooks/usePdfViewerSync.d.ts.map +1 -0
- package/build/types/pdf-viewer/types.d.ts +44 -0
- package/build/types/pdf-viewer/types.d.ts.map +1 -0
- package/build/types/public/experimental.d.ts +4 -1
- package/build/types/public/experimental.d.ts.map +1 -1
- package/package.json +5 -4
|
@@ -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 { useStaleData } from "./useStaleData.js";
|
|
25
25
|
const DEBOUNCE_MS = 300;
|
|
26
26
|
function RangeInputInner({
|
|
27
27
|
valueCountPairs,
|
|
@@ -66,31 +66,32 @@ function RangeInputInner({
|
|
|
66
66
|
debouncedMaxChange.cancel();
|
|
67
67
|
};
|
|
68
68
|
}, [debouncedMinChange, debouncedMaxChange]);
|
|
69
|
+
const displayPairs = useStaleData(valueCountPairs, isLoading);
|
|
69
70
|
const computedRange = useMemo(() => {
|
|
70
|
-
if (
|
|
71
|
+
if (displayPairs.length === 0) return {
|
|
71
72
|
min: undefined,
|
|
72
73
|
max: undefined
|
|
73
74
|
};
|
|
74
|
-
const min =
|
|
75
|
-
const max =
|
|
75
|
+
const min = displayPairs.reduce((acc, p) => Math.min(acc, config.toNumber(p.value)), Infinity);
|
|
76
|
+
const max = displayPairs.reduce((acc, p) => Math.max(acc, config.toNumber(p.value)), -Infinity);
|
|
76
77
|
return {
|
|
77
78
|
min: config.fromNumber(min),
|
|
78
79
|
max: config.fromNumber(max)
|
|
79
80
|
};
|
|
80
|
-
}, [
|
|
81
|
+
}, [displayPairs, config]);
|
|
81
82
|
const dataRange = useMemo(() => ({
|
|
82
83
|
dataMin: computedRange.min,
|
|
83
84
|
dataMax: computedRange.max
|
|
84
85
|
}), [computedRange.min, computedRange.max]);
|
|
85
86
|
const buckets = useMemo(() => {
|
|
86
|
-
if (!showHistogram ||
|
|
87
|
+
if (!showHistogram || displayPairs.length === 0 || computedRange.min === undefined || computedRange.max === undefined) {
|
|
87
88
|
return [];
|
|
88
89
|
}
|
|
89
|
-
return createHistogramBuckets(
|
|
90
|
+
return createHistogramBuckets(displayPairs, {
|
|
90
91
|
min: computedRange.min,
|
|
91
92
|
max: computedRange.max
|
|
92
93
|
}, config.toNumber, config.fromNumber);
|
|
93
|
-
}, [showHistogram,
|
|
94
|
+
}, [showHistogram, displayPairs, computedRange, config]);
|
|
94
95
|
const maxBucketCount = useMemo(() => getMaxBucketCount(buckets), [buckets]);
|
|
95
96
|
const handleMinChange = useCallback(e => {
|
|
96
97
|
const newValue = e.target.value;
|
|
@@ -106,8 +107,9 @@ function RangeInputInner({
|
|
|
106
107
|
className: classnames(styles.rangeInput, className),
|
|
107
108
|
style: style,
|
|
108
109
|
"data-loading": isLoading
|
|
109
|
-
}, showHistogram &&
|
|
110
|
-
className: styles.histogramContainer
|
|
110
|
+
}, showHistogram && /*#__PURE__*/React.createElement("div", {
|
|
111
|
+
className: styles.histogramContainer,
|
|
112
|
+
"data-empty": buckets.length === 0
|
|
111
113
|
}, buckets.map((bucket, index) => {
|
|
112
114
|
const height = bucket.count / maxBucketCount * 100;
|
|
113
115
|
const isInRange = (minValue === undefined || config.toNumber(bucket.max) >= config.toNumber(minValue)) && (maxValue === undefined || config.toNumber(bucket.min) <= config.toNumber(maxValue));
|
|
@@ -149,9 +151,7 @@ function RangeInputInner({
|
|
|
149
151
|
value: localMax,
|
|
150
152
|
onChange: handleMaxChange,
|
|
151
153
|
placeholder: dataRange.dataMax !== undefined && config.formatPlaceholder ? config.formatPlaceholder(dataRange.dataMax) : undefined
|
|
152
|
-
}, config.inputProps))))
|
|
153
|
-
className: sharedStyles.loadingMessage
|
|
154
|
-
}, "Loading..."));
|
|
154
|
+
}, config.inputProps)))));
|
|
155
155
|
}
|
|
156
156
|
export const RangeInput = /*#__PURE__*/memo(RangeInputInner);
|
|
157
157
|
//# sourceMappingURL=RangeInput.js.map
|
|
@@ -1 +1 @@
|
|
|
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":[]}
|
|
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":[]}
|
|
@@ -18,6 +18,12 @@
|
|
|
18
18
|
display: flex;
|
|
19
19
|
flex-direction: column;
|
|
20
20
|
gap: var(--osdk-filter-range-gap);
|
|
21
|
+
min-width: 0;
|
|
22
|
+
transition: opacity var(--osdk-filter-content-fade-duration);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.rangeInput[data-loading="true"] {
|
|
26
|
+
opacity: 0.5;
|
|
21
27
|
}
|
|
22
28
|
|
|
23
29
|
.histogramContainer {
|
|
@@ -25,6 +31,13 @@
|
|
|
25
31
|
align-items: flex-end;
|
|
26
32
|
height: var(--osdk-filter-range-histogram-height);
|
|
27
33
|
gap: var(--osdk-filter-range-histogram-bar-gap);
|
|
34
|
+
overflow: hidden;
|
|
35
|
+
opacity: 0;
|
|
36
|
+
transition: opacity var(--osdk-filter-content-fade-duration);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.histogramContainer:not([data-empty="true"]) {
|
|
40
|
+
opacity: 1;
|
|
28
41
|
}
|
|
29
42
|
|
|
30
43
|
.histogramBar {
|
|
@@ -42,6 +55,7 @@
|
|
|
42
55
|
display: flex;
|
|
43
56
|
align-items: flex-end;
|
|
44
57
|
gap: var(--osdk-filter-range-inputs-gap);
|
|
58
|
+
min-width: 0;
|
|
45
59
|
}
|
|
46
60
|
|
|
47
61
|
.inputWrapper {
|
|
@@ -49,6 +63,7 @@
|
|
|
49
63
|
display: flex;
|
|
50
64
|
flex-direction: column;
|
|
51
65
|
gap: var(--osdk-filter-range-input-wrapper-gap);
|
|
66
|
+
min-width: 0;
|
|
52
67
|
}
|
|
53
68
|
|
|
54
69
|
.inputLabel {
|
|
@@ -65,6 +80,7 @@
|
|
|
65
80
|
border-radius: var(--osdk-filter-input-border-radius);
|
|
66
81
|
background: var(--osdk-filter-input-bg);
|
|
67
82
|
color: var(--osdk-filter-input-color);
|
|
83
|
+
min-width: 0;
|
|
68
84
|
|
|
69
85
|
&:focus {
|
|
70
86
|
border-color: var(--osdk-filter-input-focus-border);
|
|
@@ -81,3 +97,10 @@
|
|
|
81
97
|
padding-bottom: calc(var(--osdk-filter-range-inputs-gap) * 0.75);
|
|
82
98
|
color: var(--osdk-filter-range-separator-color);
|
|
83
99
|
}
|
|
100
|
+
|
|
101
|
+
@media (prefers-reduced-motion: reduce) {
|
|
102
|
+
.histogramContainer,
|
|
103
|
+
.rangeInput {
|
|
104
|
+
transition: none;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -113,7 +113,7 @@ function TextTagsInputInner({
|
|
|
113
113
|
key: tag,
|
|
114
114
|
tag: tag,
|
|
115
115
|
onRemove: removeTag
|
|
116
|
-
}))), /*#__PURE__*/React.createElement(Combobox.
|
|
116
|
+
}))), /*#__PURE__*/React.createElement(Combobox.SearchInput, {
|
|
117
117
|
className: styles.input,
|
|
118
118
|
placeholder: tags.length > 0 ? "" : placeholder,
|
|
119
119
|
onKeyDown: handleKeyDown,
|
|
@@ -1 +1 @@
|
|
|
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":[]}
|
|
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","SearchInput","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.SearchInput\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":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { useRef } from "react";
|
|
18
|
+
|
|
19
|
+
// TODO: revisit whether this hook is necessary. It may be possible to handle
|
|
20
|
+
// loading states inline (render data if present, show skeleton if loading)
|
|
21
|
+
// instead of preserving stale data in a ref.
|
|
22
|
+
export function useStaleData(data, isLoading) {
|
|
23
|
+
const ref = useRef(data);
|
|
24
|
+
if (!isLoading) {
|
|
25
|
+
ref.current = data;
|
|
26
|
+
}
|
|
27
|
+
return ref.current;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=useStaleData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStaleData.js","names":["useRef","useStaleData","data","isLoading","ref","current"],"sources":["useStaleData.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// TODO: revisit whether this hook is necessary. It may be possible to handle\n// loading states inline (render data if present, show skeleton if loading)\n// instead of preserving stale data in a ref.\nexport function useStaleData<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,YAAYA,CAAIC,IAAO,EAAEC,SAAkB,EAAK;EAC9D,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":[]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { useCallback, useMemo, useState } from "react";
|
|
18
|
+
export function useFilterVisibility(filterDefinitions, getFilterKey, getIsVisible) {
|
|
19
|
+
const [visibilityOverrides, setVisibilityOverrides] = useState(() => new Map());
|
|
20
|
+
const {
|
|
21
|
+
visibleDefinitions,
|
|
22
|
+
hiddenDefinitions
|
|
23
|
+
} = useMemo(() => {
|
|
24
|
+
if (filterDefinitions == null) {
|
|
25
|
+
return {
|
|
26
|
+
visibleDefinitions: [],
|
|
27
|
+
hiddenDefinitions: []
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const visible = [];
|
|
31
|
+
const hidden = [];
|
|
32
|
+
for (const def of filterDefinitions) {
|
|
33
|
+
const key = getFilterKey(def);
|
|
34
|
+
const override = visibilityOverrides.get(key);
|
|
35
|
+
const isVisible = override ?? getIsVisible(def);
|
|
36
|
+
if (isVisible) {
|
|
37
|
+
visible.push(def);
|
|
38
|
+
} else {
|
|
39
|
+
hidden.push(def);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
visibleDefinitions: visible,
|
|
44
|
+
hiddenDefinitions: hidden
|
|
45
|
+
};
|
|
46
|
+
}, [filterDefinitions, getFilterKey, getIsVisible, visibilityOverrides]);
|
|
47
|
+
const showFilter = useCallback(key => {
|
|
48
|
+
setVisibilityOverrides(prev => {
|
|
49
|
+
const next = new Map(prev);
|
|
50
|
+
next.set(key, true);
|
|
51
|
+
return next;
|
|
52
|
+
});
|
|
53
|
+
}, []);
|
|
54
|
+
const hideFilter = useCallback(key => {
|
|
55
|
+
setVisibilityOverrides(prev => {
|
|
56
|
+
const next = new Map(prev);
|
|
57
|
+
next.set(key, false);
|
|
58
|
+
return next;
|
|
59
|
+
});
|
|
60
|
+
}, []);
|
|
61
|
+
return {
|
|
62
|
+
visibleDefinitions,
|
|
63
|
+
hiddenDefinitions,
|
|
64
|
+
showFilter,
|
|
65
|
+
hideFilter
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=useFilterVisibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFilterVisibility.js","names":["useCallback","useMemo","useState","useFilterVisibility","filterDefinitions","getFilterKey","getIsVisible","visibilityOverrides","setVisibilityOverrides","Map","visibleDefinitions","hiddenDefinitions","visible","hidden","def","key","override","get","isVisible","push","showFilter","prev","next","set","hideFilter"],"sources":["useFilterVisibility.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 { useCallback, useMemo, useState } from \"react\";\n\ninterface FilterVisibilityResult<D> {\n visibleDefinitions: Array<D>;\n hiddenDefinitions: Array<D>;\n showFilter: (key: string) => void;\n hideFilter: (key: string) => void;\n}\n\nexport function useFilterVisibility<D>(\n filterDefinitions: Array<D> | undefined,\n getFilterKey: (definition: D) => string,\n getIsVisible: (definition: D) => boolean,\n): FilterVisibilityResult<D> {\n const [visibilityOverrides, setVisibilityOverrides] = useState<\n Map<string, boolean>\n >(() => new Map());\n\n const { visibleDefinitions, hiddenDefinitions } = useMemo(() => {\n if (filterDefinitions == null) {\n return {\n visibleDefinitions: [] as Array<D>,\n hiddenDefinitions: [] as Array<D>,\n };\n }\n\n const visible: Array<D> = [];\n const hidden: Array<D> = [];\n\n for (const def of filterDefinitions) {\n const key = getFilterKey(def);\n const override = visibilityOverrides.get(key);\n const isVisible = override ?? getIsVisible(def);\n\n if (isVisible) {\n visible.push(def);\n } else {\n hidden.push(def);\n }\n }\n\n return { visibleDefinitions: visible, hiddenDefinitions: hidden };\n }, [filterDefinitions, getFilterKey, getIsVisible, visibilityOverrides]);\n\n const showFilter = useCallback((key: string) => {\n setVisibilityOverrides((prev) => {\n const next = new Map(prev);\n next.set(key, true);\n return next;\n });\n }, []);\n\n const hideFilter = useCallback((key: string) => {\n setVisibilityOverrides((prev) => {\n const next = new Map(prev);\n next.set(key, false);\n return next;\n });\n }, []);\n\n return { visibleDefinitions, hiddenDefinitions, showFilter, hideFilter };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAStD,OAAO,SAASC,mBAAmBA,CACjCC,iBAAuC,EACvCC,YAAuC,EACvCC,YAAwC,EACb;EAC3B,MAAM,CAACC,mBAAmB,EAAEC,sBAAsB,CAAC,GAAGN,QAAQ,CAE5D,MAAM,IAAIO,GAAG,CAAC,CAAC,CAAC;EAElB,MAAM;IAAEC,kBAAkB;IAAEC;EAAkB,CAAC,GAAGV,OAAO,CAAC,MAAM;IAC9D,IAAIG,iBAAiB,IAAI,IAAI,EAAE;MAC7B,OAAO;QACLM,kBAAkB,EAAE,EAAc;QAClCC,iBAAiB,EAAE;MACrB,CAAC;IACH;IAEA,MAAMC,OAAiB,GAAG,EAAE;IAC5B,MAAMC,MAAgB,GAAG,EAAE;IAE3B,KAAK,MAAMC,GAAG,IAAIV,iBAAiB,EAAE;MACnC,MAAMW,GAAG,GAAGV,YAAY,CAACS,GAAG,CAAC;MAC7B,MAAME,QAAQ,GAAGT,mBAAmB,CAACU,GAAG,CAACF,GAAG,CAAC;MAC7C,MAAMG,SAAS,GAAGF,QAAQ,IAAIV,YAAY,CAACQ,GAAG,CAAC;MAE/C,IAAII,SAAS,EAAE;QACbN,OAAO,CAACO,IAAI,CAACL,GAAG,CAAC;MACnB,CAAC,MAAM;QACLD,MAAM,CAACM,IAAI,CAACL,GAAG,CAAC;MAClB;IACF;IAEA,OAAO;MAAEJ,kBAAkB,EAAEE,OAAO;MAAED,iBAAiB,EAAEE;IAAO,CAAC;EACnE,CAAC,EAAE,CAACT,iBAAiB,EAAEC,YAAY,EAAEC,YAAY,EAAEC,mBAAmB,CAAC,CAAC;EAExE,MAAMa,UAAU,GAAGpB,WAAW,CAAEe,GAAW,IAAK;IAC9CP,sBAAsB,CAAEa,IAAI,IAAK;MAC/B,MAAMC,IAAI,GAAG,IAAIb,GAAG,CAACY,IAAI,CAAC;MAC1BC,IAAI,CAACC,GAAG,CAACR,GAAG,EAAE,IAAI,CAAC;MACnB,OAAOO,IAAI;IACb,CAAC,CAAC;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,UAAU,GAAGxB,WAAW,CAAEe,GAAW,IAAK;IAC9CP,sBAAsB,CAAEa,IAAI,IAAK;MAC/B,MAAMC,IAAI,GAAG,IAAIb,GAAG,CAACY,IAAI,CAAC;MAC1BC,IAAI,CAACC,GAAG,CAACR,GAAG,EAAE,KAAK,CAAC;MACpB,OAAOO,IAAI;IACb,CAAC,CAAC;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IAAEZ,kBAAkB;IAAEC,iBAAiB;IAAES,UAAU;IAAEI;EAAW,CAAC;AAC1E","ignoreList":[]}
|
|
@@ -15,13 +15,23 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import React from "react";
|
|
18
|
+
import { AsyncValueCell } from "./components/AsyncValueCell.js";
|
|
18
19
|
import { EditableCell } from "./EditableCell.js";
|
|
20
|
+
import { isAsyncCellData } from "./utils/AsyncCellData.js";
|
|
19
21
|
import { getCellId } from "./utils/getCellId.js";
|
|
20
22
|
export function renderDefaultCell(cellContext) {
|
|
21
23
|
const meta = cellContext.table.options.meta;
|
|
22
24
|
const columnMeta = cellContext.column.columnDef.meta;
|
|
25
|
+
const cellValue = cellContext.getValue();
|
|
26
|
+
const asyncCellData = isAsyncCellData(cellValue) ? cellValue : undefined;
|
|
27
|
+
|
|
28
|
+
// Function-backed columns are read-only: the value is server-computed
|
|
29
|
+
// and cannot be edited in the table. Return the async cell directly.
|
|
30
|
+
if (columnMeta?.isAsyncColumn && asyncCellData) {
|
|
31
|
+
return /*#__PURE__*/React.createElement(AsyncValueCell, asyncCellData);
|
|
32
|
+
}
|
|
23
33
|
if (!columnMeta?.editable || !meta?.onCellEdit || !meta?.isInEditMode) {
|
|
24
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null,
|
|
34
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, cellValue);
|
|
25
35
|
}
|
|
26
36
|
const rowId = cellContext.row.id;
|
|
27
37
|
const columnId = cellContext.column.id;
|
|
@@ -31,10 +41,10 @@ export function renderDefaultCell(cellContext) {
|
|
|
31
41
|
});
|
|
32
42
|
const cellEdits = meta.cellEdits;
|
|
33
43
|
const editedValue = cellEdits?.[cellId];
|
|
34
|
-
const currentValue = editedValue?.newValue ??
|
|
44
|
+
const currentValue = editedValue?.newValue ?? cellValue;
|
|
35
45
|
const validationError = meta.validationErrors?.get(cellId);
|
|
36
46
|
return /*#__PURE__*/React.createElement(EditableCell, {
|
|
37
|
-
initialValue:
|
|
47
|
+
initialValue: cellValue,
|
|
38
48
|
currentValue: currentValue,
|
|
39
49
|
cellId: cellId,
|
|
40
50
|
dataType: columnMeta?.dataType,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultCellRenderer.js","names":["React","EditableCell","getCellId","renderDefaultCell","cellContext","meta","table","options","columnMeta","column","columnDef","
|
|
1
|
+
{"version":3,"file":"DefaultCellRenderer.js","names":["React","AsyncValueCell","EditableCell","isAsyncCellData","getCellId","renderDefaultCell","cellContext","meta","table","options","columnMeta","column","columnDef","cellValue","getValue","asyncCellData","undefined","isAsyncColumn","createElement","editable","onCellEdit","isInEditMode","Fragment","rowId","row","id","columnId","cellId","cellEdits","editedValue","currentValue","newValue","validationError","validationErrors","get","initialValue","dataType","onCellValidationError","clearCellValidationError","originalRowData","original","validateEdit"],"sources":["DefaultCellRenderer.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 { CellContext, RowData } from \"@tanstack/react-table\";\nimport React from \"react\";\nimport { AsyncValueCell } from \"./components/AsyncValueCell.js\";\nimport { EditableCell } from \"./EditableCell.js\";\nimport { isAsyncCellData } from \"./utils/AsyncCellData.js\";\nimport { getCellId } from \"./utils/getCellId.js\";\n\nexport function renderDefaultCell<TData extends RowData>(\n cellContext: CellContext<TData, unknown>,\n): React.ReactNode {\n const meta = cellContext.table.options.meta;\n const columnMeta = cellContext.column.columnDef.meta;\n\n const cellValue = cellContext.getValue();\n\n const asyncCellData = isAsyncCellData(cellValue)\n ? cellValue\n : undefined;\n\n // Function-backed columns are read-only: the value is server-computed\n // and cannot be edited in the table. Return the async cell directly.\n if (columnMeta?.isAsyncColumn && asyncCellData) {\n return <AsyncValueCell {...asyncCellData} />;\n }\n\n if (!columnMeta?.editable || !meta?.onCellEdit || !meta?.isInEditMode) {\n return <>{cellValue}</>;\n }\n\n const rowId = cellContext.row.id;\n const columnId = cellContext.column.id;\n const cellId = getCellId({ rowId, columnId });\n\n const cellEdits = meta.cellEdits;\n const editedValue = cellEdits?.[cellId];\n const currentValue = editedValue?.newValue ?? cellValue;\n const validationError = meta.validationErrors?.get(cellId);\n\n return (\n <EditableCell<TData>\n initialValue={cellValue}\n currentValue={currentValue}\n cellId={cellId}\n dataType={columnMeta?.dataType}\n onCellEdit={meta.onCellEdit}\n onCellValidationError={meta.onCellValidationError}\n clearCellValidationError={meta.clearCellValidationError}\n originalRowData={cellContext.row.original}\n rowId={rowId}\n columnId={columnId}\n validateEdit={columnMeta?.validateEdit}\n validationError={validationError}\n />\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,YAAY,QAAQ,mBAAmB;AAChD,SAASC,eAAe,QAAQ,0BAA0B;AAC1D,SAASC,SAAS,QAAQ,sBAAsB;AAEhD,OAAO,SAASC,iBAAiBA,CAC/BC,WAAwC,EACvB;EACjB,MAAMC,IAAI,GAAGD,WAAW,CAACE,KAAK,CAACC,OAAO,CAACF,IAAI;EAC3C,MAAMG,UAAU,GAAGJ,WAAW,CAACK,MAAM,CAACC,SAAS,CAACL,IAAI;EAEpD,MAAMM,SAAS,GAAGP,WAAW,CAACQ,QAAQ,CAAC,CAAC;EAExC,MAAMC,aAAa,GAAGZ,eAAe,CAACU,SAAS,CAAC,GAC5CA,SAAS,GACTG,SAAS;;EAEb;EACA;EACA,IAAIN,UAAU,EAAEO,aAAa,IAAIF,aAAa,EAAE;IAC9C,oBAAOf,KAAA,CAAAkB,aAAA,CAACjB,cAAc,EAAKc,aAAgB,CAAC;EAC9C;EAEA,IAAI,CAACL,UAAU,EAAES,QAAQ,IAAI,CAACZ,IAAI,EAAEa,UAAU,IAAI,CAACb,IAAI,EAAEc,YAAY,EAAE;IACrE,oBAAOrB,KAAA,CAAAkB,aAAA,CAAAlB,KAAA,CAAAsB,QAAA,QAAGT,SAAY,CAAC;EACzB;EAEA,MAAMU,KAAK,GAAGjB,WAAW,CAACkB,GAAG,CAACC,EAAE;EAChC,MAAMC,QAAQ,GAAGpB,WAAW,CAACK,MAAM,CAACc,EAAE;EACtC,MAAME,MAAM,GAAGvB,SAAS,CAAC;IAAEmB,KAAK;IAAEG;EAAS,CAAC,CAAC;EAE7C,MAAME,SAAS,GAAGrB,IAAI,CAACqB,SAAS;EAChC,MAAMC,WAAW,GAAGD,SAAS,GAAGD,MAAM,CAAC;EACvC,MAAMG,YAAY,GAAGD,WAAW,EAAEE,QAAQ,IAAIlB,SAAS;EACvD,MAAMmB,eAAe,GAAGzB,IAAI,CAAC0B,gBAAgB,EAAEC,GAAG,CAACP,MAAM,CAAC;EAE1D,oBACE3B,KAAA,CAAAkB,aAAA,CAAChB,YAAY;IACXiC,YAAY,EAAEtB,SAAU;IACxBiB,YAAY,EAAEA,YAAa;IAC3BH,MAAM,EAAEA,MAAO;IACfS,QAAQ,EAAE1B,UAAU,EAAE0B,QAAS;IAC/BhB,UAAU,EAAEb,IAAI,CAACa,UAAW;IAC5BiB,qBAAqB,EAAE9B,IAAI,CAAC8B,qBAAsB;IAClDC,wBAAwB,EAAE/B,IAAI,CAAC+B,wBAAyB;IACxDC,eAAe,EAAEjC,WAAW,CAACkB,GAAG,CAACgB,QAAS;IAC1CjB,KAAK,EAAEA,KAAM;IACbG,QAAQ,EAAEA,QAAS;IACnBe,YAAY,EAAE/B,UAAU,EAAE+B,YAAa;IACvCT,eAAe,EAAEA;EAAgB,CAClC,CAAC;AAEN","ignoreList":[]}
|
|
@@ -107,12 +107,13 @@ function EditableCellInner({
|
|
|
107
107
|
reject(new DOMException("Aborted", "AbortError"));
|
|
108
108
|
});
|
|
109
109
|
})]).then(errorMessage => {
|
|
110
|
-
if (
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
110
|
+
if (abortController.signal.aborted) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (errorMessage) {
|
|
114
|
+
onCellValidationError?.(cellId, errorMessage);
|
|
115
|
+
} else {
|
|
116
|
+
clearCellValidationError?.(cellId);
|
|
116
117
|
}
|
|
117
118
|
}, error => {
|
|
118
119
|
if (!abortController.signal.aborted && error.name !== "AbortError") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableCell.js","names":["Input","Error","classNames","React","useCallback","useEffect","useRef","useState","Tooltip","styles","NUMBER_TYPES","valueToString","value","JSON","stringify","String","parseValueByType","dataType","includes","parsedNumber","Number","isNaN","VALIDATION_ERROR_MESSAGE","EditableCellInner","initialValue","currentValue","cellId","onCellEdit","onCellValidationError","clearCellValidationError","originalRowData","rowId","columnId","validateEdit","validationError","inputValue","setInputValue","isCancelled","validationAbortControllerRef","abortController","current","abort","hasValidationError","handleBlur","parsedValue","newValue","oldValue","AbortController","validationPromise","Promise","race","_","reject","signal","addEventListener","DOMException","then","errorMessage","aborted","error","name","handleChange","handleKeyDown","e","key","currentTarget","blur","inputType","createElement","Provider","Root","disabled","Trigger","className","osdkEditableCell","osdkEditedInput","type","osdkEditableInput","onValueChange","onBlur","onKeyDown","errorIcon","Portal","Positioner","sideOffset","side","Popup","Arrow","EditableCell","memo"],"sources":["EditableCell.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 { Error } from \"@blueprintjs/icons\";\nimport type { RowData } from \"@tanstack/react-table\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"../base-components/tooltip/Tooltip.js\";\nimport styles from \"./EditableCell.module.css\";\nimport type { CellEditInfo } from \"./utils/types.js\";\n\nexport interface EditableCellProps<TData extends RowData, CellValue = unknown> {\n initialValue: CellValue;\n currentValue: CellValue;\n cellId: string;\n dataType?: string;\n onCellEdit: (cellId: string, info: CellEditInfo<TData, CellValue>) => void;\n onCellValidationError?: (\n cellId: string,\n error: string,\n ) => void;\n clearCellValidationError?: (cellId: string) => void;\n validationError?: string;\n originalRowData: TData;\n rowId: string;\n columnId: string;\n validateEdit?: (value: unknown) => Promise<string | undefined>;\n}\n\nconst NUMBER_TYPES: string[] = [\n \"double\",\n \"integer\",\n \"long\",\n \"float\",\n \"decimal\",\n \"byte\",\n \"short\",\n];\n\nfunction valueToString(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n // At this point, value is a primitive (string, number, boolean, symbol, bigint)\n return String(value as string | number | boolean | symbol | bigint);\n}\n\nfunction parseValueByType<CellValue = unknown>(\n value: string,\n dataType?: string,\n): CellValue | null {\n if (!dataType || !NUMBER_TYPES.includes(dataType)) {\n return value as unknown as CellValue;\n }\n\n if (value === \"\") {\n return null;\n }\n\n const parsedNumber = Number(value);\n\n if (isNaN(parsedNumber)) {\n return value as unknown as CellValue;\n }\n\n return parsedNumber as unknown as CellValue;\n}\n\nconst VALIDATION_ERROR_MESSAGE = \"Validation error\";\n\nfunction EditableCellInner<TData extends RowData, CellValue = unknown>({\n initialValue,\n currentValue,\n cellId,\n dataType,\n onCellEdit,\n onCellValidationError,\n clearCellValidationError,\n originalRowData,\n rowId,\n columnId,\n validateEdit,\n validationError,\n}: EditableCellProps<TData, CellValue>): React.ReactElement {\n const [inputValue, setInputValue] = useState<string>(\n valueToString(currentValue),\n );\n const isCancelled = useRef(false);\n const validationAbortControllerRef = useRef<AbortController | null>(null);\n\n const abortController = useCallback(() => {\n if (validationAbortControllerRef.current) {\n validationAbortControllerRef.current.abort();\n validationAbortControllerRef.current = null;\n }\n }, []);\n\n const hasValidationError = validationError != null;\n const isEdited = currentValue !== initialValue;\n\n useEffect(() => {\n setInputValue(valueToString(currentValue));\n }, [currentValue]);\n\n useEffect(() => {\n // Cleanup abort controller on unmount\n return () => {\n abortController();\n };\n }, [abortController]);\n\n const handleBlur = useCallback(() => {\n // Do not commit the edit if it was cancelled with Escape key\n if (isCancelled.current) {\n isCancelled.current = false;\n return;\n }\n\n // Cancel any in-flight validation\n abortController();\n\n const parsedValue = parseValueByType<CellValue>(inputValue, dataType);\n\n onCellEdit(cellId, {\n rowId,\n columnId,\n newValue: parsedValue,\n oldValue: initialValue,\n originalRowData,\n });\n\n if (validateEdit) {\n // Create new AbortController for this validation\n const abortController = new AbortController();\n validationAbortControllerRef.current = abortController;\n\n const validationPromise = validateEdit(parsedValue);\n\n // Race between validation and abort\n Promise.race([\n validationPromise,\n new Promise<string | undefined>((_, reject) => {\n abortController.signal.addEventListener(\"abort\", () => {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n });\n }),\n ]).then(\n (errorMessage) => {\n if (!abortController.signal.aborted) {\n if (errorMessage) {\n onCellValidationError?.(cellId, errorMessage);\n } else {\n clearCellValidationError?.(cellId);\n }\n }\n },\n (error) => {\n if (!abortController.signal.aborted && error.name !== \"AbortError\") {\n onCellValidationError?.(cellId, VALIDATION_ERROR_MESSAGE);\n }\n },\n );\n }\n }, [\n abortController,\n inputValue,\n dataType,\n onCellEdit,\n cellId,\n rowId,\n columnId,\n initialValue,\n originalRowData,\n validateEdit,\n onCellValidationError,\n clearCellValidationError,\n ]);\n\n const handleChange = useCallback((value: string) => {\n // Cancel any in-flight validation\n abortController();\n setInputValue(value);\n }, [abortController]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.currentTarget.blur();\n }\n if (e.key === \"Escape\") {\n isCancelled.current = true;\n setInputValue(valueToString(currentValue));\n e.currentTarget.blur();\n }\n },\n [currentValue],\n );\n\n const inputType = dataType && NUMBER_TYPES.includes(dataType)\n ? \"number\"\n : \"text\";\n\n return (\n <Tooltip.Provider>\n <Tooltip.Root disabled={!hasValidationError}>\n <Tooltip.Trigger>\n <div\n className={classNames(styles.osdkEditableCell, {\n [styles.error]: hasValidationError,\n [styles.osdkEditedInput]: isEdited,\n })}\n >\n <Input\n type={inputType}\n value={inputValue}\n className={styles.osdkEditableInput}\n onValueChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n aria-invalid={hasValidationError}\n />\n {hasValidationError && <Error className={styles.errorIcon} />}\n </div>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Positioner sideOffset={4} side={\"bottom\"}>\n <Tooltip.Popup>\n <div className={styles.validationError}>\n <Error className={styles.errorIcon} />\n {validationError}\n </div>\n <Tooltip.Arrow />\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n </Tooltip.Provider>\n );\n}\n\nexport const EditableCell = React.memo(\n EditableCellInner,\n) as typeof EditableCellInner;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"EditableCell.js","names":["Input","Error","classNames","React","useCallback","useEffect","useRef","useState","Tooltip","styles","NUMBER_TYPES","valueToString","value","JSON","stringify","String","parseValueByType","dataType","includes","parsedNumber","Number","isNaN","VALIDATION_ERROR_MESSAGE","EditableCellInner","initialValue","currentValue","cellId","onCellEdit","onCellValidationError","clearCellValidationError","originalRowData","rowId","columnId","validateEdit","validationError","inputValue","setInputValue","isCancelled","validationAbortControllerRef","abortController","current","abort","hasValidationError","handleBlur","parsedValue","newValue","oldValue","AbortController","validationPromise","Promise","race","_","reject","signal","addEventListener","DOMException","then","errorMessage","aborted","error","name","handleChange","handleKeyDown","e","key","currentTarget","blur","inputType","createElement","Provider","Root","disabled","Trigger","className","osdkEditableCell","osdkEditedInput","type","osdkEditableInput","onValueChange","onBlur","onKeyDown","errorIcon","Portal","Positioner","sideOffset","side","Popup","Arrow","EditableCell","memo"],"sources":["EditableCell.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 { Error } from \"@blueprintjs/icons\";\nimport type { RowData } from \"@tanstack/react-table\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"../base-components/tooltip/Tooltip.js\";\nimport styles from \"./EditableCell.module.css\";\nimport type { CellEditInfo } from \"./utils/types.js\";\n\nexport interface EditableCellProps<TData extends RowData, CellValue = unknown> {\n initialValue: CellValue;\n currentValue: CellValue;\n cellId: string;\n dataType?: string;\n onCellEdit: (cellId: string, info: CellEditInfo<TData, CellValue>) => void;\n onCellValidationError?: (\n cellId: string,\n error: string,\n ) => void;\n clearCellValidationError?: (cellId: string) => void;\n validationError?: string;\n originalRowData: TData;\n rowId: string;\n columnId: string;\n validateEdit?: (value: unknown) => Promise<string | undefined>;\n}\n\nconst NUMBER_TYPES: string[] = [\n \"double\",\n \"integer\",\n \"long\",\n \"float\",\n \"decimal\",\n \"byte\",\n \"short\",\n];\n\nfunction valueToString(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n // At this point, value is a primitive (string, number, boolean, symbol, bigint)\n return String(value as string | number | boolean | symbol | bigint);\n}\n\nfunction parseValueByType(\n value: string,\n dataType?: string,\n): unknown {\n if (!dataType || !NUMBER_TYPES.includes(dataType)) {\n return value;\n }\n\n if (value === \"\") {\n return null;\n }\n\n const parsedNumber = Number(value);\n\n if (isNaN(parsedNumber)) {\n return value;\n }\n\n return parsedNumber;\n}\n\nconst VALIDATION_ERROR_MESSAGE = \"Validation error\";\n\nfunction EditableCellInner<TData extends RowData, CellValue = unknown>({\n initialValue,\n currentValue,\n cellId,\n dataType,\n onCellEdit,\n onCellValidationError,\n clearCellValidationError,\n originalRowData,\n rowId,\n columnId,\n validateEdit,\n validationError,\n}: EditableCellProps<TData, CellValue>): React.ReactElement {\n const [inputValue, setInputValue] = useState<string>(\n valueToString(currentValue),\n );\n const isCancelled = useRef(false);\n const validationAbortControllerRef = useRef<AbortController | null>(null);\n\n const abortController = useCallback(() => {\n if (validationAbortControllerRef.current) {\n validationAbortControllerRef.current.abort();\n validationAbortControllerRef.current = null;\n }\n }, []);\n\n const hasValidationError = validationError != null;\n const isEdited = currentValue !== initialValue;\n\n useEffect(() => {\n setInputValue(valueToString(currentValue));\n }, [currentValue]);\n\n useEffect(() => {\n // Cleanup abort controller on unmount\n return () => {\n abortController();\n };\n }, [abortController]);\n\n const handleBlur = useCallback(() => {\n // Do not commit the edit if it was cancelled with Escape key\n if (isCancelled.current) {\n isCancelled.current = false;\n return;\n }\n\n // Cancel any in-flight validation\n abortController();\n\n const parsedValue = parseValueByType(inputValue, dataType) as CellValue;\n\n onCellEdit(cellId, {\n rowId,\n columnId,\n newValue: parsedValue,\n oldValue: initialValue,\n originalRowData,\n });\n\n if (validateEdit) {\n // Create new AbortController for this validation\n const abortController = new AbortController();\n validationAbortControllerRef.current = abortController;\n\n const validationPromise = validateEdit(parsedValue);\n\n // Race between validation and abort\n Promise.race([\n validationPromise,\n new Promise<string | undefined>((_, reject) => {\n abortController.signal.addEventListener(\"abort\", () => {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n });\n }),\n ]).then(\n (errorMessage) => {\n if (abortController.signal.aborted) {\n return;\n }\n if (errorMessage) {\n onCellValidationError?.(cellId, errorMessage);\n } else {\n clearCellValidationError?.(cellId);\n }\n },\n (error) => {\n if (!abortController.signal.aborted && error.name !== \"AbortError\") {\n onCellValidationError?.(cellId, VALIDATION_ERROR_MESSAGE);\n }\n },\n );\n }\n }, [\n abortController,\n inputValue,\n dataType,\n onCellEdit,\n cellId,\n rowId,\n columnId,\n initialValue,\n originalRowData,\n validateEdit,\n onCellValidationError,\n clearCellValidationError,\n ]);\n\n const handleChange = useCallback((value: string) => {\n // Cancel any in-flight validation\n abortController();\n setInputValue(value);\n }, [abortController]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.currentTarget.blur();\n }\n if (e.key === \"Escape\") {\n isCancelled.current = true;\n setInputValue(valueToString(currentValue));\n e.currentTarget.blur();\n }\n },\n [currentValue],\n );\n\n const inputType = dataType && NUMBER_TYPES.includes(dataType)\n ? \"number\"\n : \"text\";\n\n return (\n <Tooltip.Provider>\n <Tooltip.Root disabled={!hasValidationError}>\n <Tooltip.Trigger>\n <div\n className={classNames(styles.osdkEditableCell, {\n [styles.error]: hasValidationError,\n [styles.osdkEditedInput]: isEdited,\n })}\n >\n <Input\n type={inputType}\n value={inputValue}\n className={styles.osdkEditableInput}\n onValueChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n aria-invalid={hasValidationError}\n />\n {hasValidationError && <Error className={styles.errorIcon} />}\n </div>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Positioner sideOffset={4} side={\"bottom\"}>\n <Tooltip.Popup>\n <div className={styles.validationError}>\n <Error className={styles.errorIcon} />\n {validationError}\n </div>\n <Tooltip.Arrow />\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n </Tooltip.Provider>\n );\n}\n\nexport const EditableCell = React.memo(\n EditableCellInner,\n) as typeof EditableCellInner;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -18,6 +18,11 @@ import classNames from "classnames";
|
|
|
18
18
|
import React from "react";
|
|
19
19
|
import styles from "./LoadingCell.module.css";
|
|
20
20
|
import cellStyles from "./TableCell.module.css";
|
|
21
|
+
export function LoadingCellContent() {
|
|
22
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
23
|
+
className: classNames(styles.osdkLoadingCell, styles.osdkCellSkeleton)
|
|
24
|
+
});
|
|
25
|
+
}
|
|
21
26
|
export function LoadingCell({
|
|
22
27
|
width
|
|
23
28
|
}) {
|
|
@@ -26,8 +31,6 @@ export function LoadingCell({
|
|
|
26
31
|
style: {
|
|
27
32
|
width
|
|
28
33
|
}
|
|
29
|
-
}, /*#__PURE__*/React.createElement(
|
|
30
|
-
className: classNames(styles.osdkLoadingCell, styles.osdkCellSkeleton)
|
|
31
|
-
}));
|
|
34
|
+
}, /*#__PURE__*/React.createElement(LoadingCellContent, null));
|
|
32
35
|
}
|
|
33
36
|
//# sourceMappingURL=LoadingCell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoadingCell.js","names":["classNames","React","styles","cellStyles","
|
|
1
|
+
{"version":3,"file":"LoadingCell.js","names":["classNames","React","styles","cellStyles","LoadingCellContent","createElement","className","osdkLoadingCell","osdkCellSkeleton","LoadingCell","width","osdkTableCell","style"],"sources":["LoadingCell.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 classNames from \"classnames\";\nimport React from \"react\";\nimport styles from \"./LoadingCell.module.css\";\nimport cellStyles from \"./TableCell.module.css\";\n\nexport function LoadingCellContent(): React.ReactElement {\n return (\n <div\n className={classNames(\n styles.osdkLoadingCell,\n styles.osdkCellSkeleton,\n )}\n />\n );\n}\n\nexport function LoadingCell({ width }: { width: number }): React.ReactElement {\n return (\n <td\n className={cellStyles.osdkTableCell}\n style={{ width }}\n >\n <LoadingCellContent />\n </td>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,MAAM,OAAO;AACzB,OAAOC,MAAM,MAAM,0BAA0B;AAC7C,OAAOC,UAAU,MAAM,wBAAwB;AAE/C,OAAO,SAASC,kBAAkBA,CAAA,EAAuB;EACvD,oBACEH,KAAA,CAAAI,aAAA;IACEC,SAAS,EAAEN,UAAU,CACnBE,MAAM,CAACK,eAAe,EACtBL,MAAM,CAACM,gBACT;EAAE,CACH,CAAC;AAEN;AAEA,OAAO,SAASC,WAAWA,CAAC;EAAEC;AAAyB,CAAC,EAAsB;EAC5E,oBACET,KAAA,CAAAI,aAAA;IACEC,SAAS,EAAEH,UAAU,CAACQ,aAAc;IACpCC,KAAK,EAAE;MAAEF;IAAM;EAAE,gBAEjBT,KAAA,CAAAI,aAAA,CAACD,kBAAkB,MAAE,CACnB,CAAC;AAET","ignoreList":[]}
|
|
@@ -17,12 +17,13 @@
|
|
|
17
17
|
import React from "react";
|
|
18
18
|
import { LoadingCell } from "./LoadingCell.js";
|
|
19
19
|
import rowStyles from "./TableRow.module.css";
|
|
20
|
+
import { DEFAULT_COLUMN_WIDTH } from "./utils/constants.js";
|
|
20
21
|
export function LoadingRow({
|
|
21
22
|
headers,
|
|
22
23
|
columnCount,
|
|
23
24
|
translateY,
|
|
24
25
|
rowHeight = 40,
|
|
25
|
-
columnWidth =
|
|
26
|
+
columnWidth = DEFAULT_COLUMN_WIDTH
|
|
26
27
|
}) {
|
|
27
28
|
return /*#__PURE__*/React.createElement("tr", {
|
|
28
29
|
className: rowStyles.osdkTableRow,
|