@firecms/core 3.0.0-canary.21 → 3.0.0-canary.210
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/README.md +3 -3
- package/dist/app/AppBar.d.ts +12 -0
- package/dist/app/Drawer.d.ts +16 -0
- package/dist/app/Scaffold.d.ts +34 -0
- package/dist/app/index.d.ts +4 -0
- package/dist/app/useApp.d.ts +16 -0
- package/dist/components/ArrayContainer.d.ts +23 -6
- package/dist/components/CircularProgressCenter.d.ts +1 -1
- package/dist/components/ClearFilterSortButton.d.ts +5 -0
- package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +13 -13
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
- package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
- package/dist/components/EntityCollectionTable/index.d.ts +1 -1
- package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
- package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
- package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +16 -2
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityCollectionView/utils.d.ts +3 -0
- package/dist/components/EntityPreview.d.ts +5 -4
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
- package/dist/components/PropertyConfigBadge.d.ts +2 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/ReferenceWidget.d.ts +3 -1
- package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
- package/dist/components/UnsavedChangesDialog.d.ts +8 -0
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +28 -12
- package/dist/components/VirtualTable/types.d.ts +3 -3
- package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
- package/dist/components/common/index.d.ts +2 -1
- package/dist/components/common/table_height.d.ts +5 -0
- package/dist/components/common/types.d.ts +4 -6
- package/dist/components/common/useColumnsIds.d.ts +3 -1
- package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
- package/dist/components/common/useDebouncedCallback.d.ts +1 -0
- package/dist/components/common/useScrollRestoration.d.ts +14 -0
- package/dist/components/index.d.ts +4 -2
- package/dist/contexts/BreacrumbsContext.d.ts +8 -0
- package/dist/core/DefaultAppBar.d.ts +29 -0
- package/dist/core/DefaultDrawer.d.ts +19 -0
- package/dist/core/DrawerNavigationItem.d.ts +10 -0
- package/dist/core/EntityEditView.d.ts +33 -11
- package/dist/core/EntityEditViewFormActions.d.ts +2 -0
- package/dist/core/FireCMS.d.ts +3 -3
- package/dist/core/FireCMSRouter.d.ts +4 -0
- package/dist/core/NavigationRoutes.d.ts +2 -3
- package/dist/core/SideDialogs.d.ts +4 -2
- package/dist/core/index.d.ts +4 -4
- package/dist/form/EntityForm.d.ts +37 -69
- package/dist/form/EntityFormActions.d.ts +17 -0
- package/dist/form/PropertyFieldBinding.d.ts +1 -1
- package/dist/form/components/ErrorFocus.d.ts +1 -1
- package/dist/form/components/FieldHelperText.d.ts +3 -3
- package/dist/form/components/FormEntry.d.ts +6 -0
- package/dist/form/components/FormLayout.d.ts +5 -0
- package/dist/form/components/LabelWithIcon.d.ts +1 -1
- package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
- package/dist/form/components/StorageItemPreview.d.ts +4 -4
- package/dist/form/components/index.d.ts +3 -1
- package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
- package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
- package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
- package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
- package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
- package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
- package/dist/form/index.d.ts +16 -18
- package/dist/form/useClearRestoreValue.d.ts +2 -2
- package/dist/hooks/data/delete.d.ts +4 -4
- package/dist/hooks/data/save.d.ts +4 -5
- package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
- package/dist/hooks/data/useEntityFetch.d.ts +4 -3
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useAuthController.d.ts +1 -1
- package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
- package/dist/hooks/useBuildNavigationController.d.ts +7 -5
- package/dist/hooks/useFireCMSContext.d.ts +1 -1
- package/dist/hooks/useModeController.d.ts +1 -2
- package/dist/hooks/useProjectLog.d.ts +8 -2
- package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
- package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +21823 -14330
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +24174 -588
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +1 -16
- package/dist/internal/useBuildSideEntityController.d.ts +2 -2
- package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
- package/dist/preview/PropertyPreviewProps.d.ts +6 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +3 -2
- package/dist/preview/components/StorageThumbnail.d.ts +2 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/preview/util.d.ts +3 -3
- package/dist/routes/CustomCMSRoute.d.ts +4 -0
- package/dist/routes/FireCMSRoute.d.ts +1 -0
- package/dist/routes/HomePageRoute.d.ts +3 -0
- package/dist/types/auth.d.ts +8 -10
- package/dist/types/collections.d.ts +77 -22
- package/dist/types/datasource.d.ts +52 -36
- package/dist/types/dialogs_controller.d.ts +7 -3
- package/dist/types/entities.d.ts +7 -2
- package/dist/types/entity_actions.d.ts +28 -4
- package/dist/types/entity_callbacks.d.ts +16 -16
- package/dist/types/entity_overrides.d.ts +2 -2
- package/dist/types/export_import.d.ts +4 -4
- package/dist/types/fields.d.ts +71 -42
- package/dist/types/firecms.d.ts +6 -2
- package/dist/types/firecms_context.d.ts +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/navigation.d.ts +32 -14
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +23 -12
- package/dist/types/properties.d.ts +52 -24
- package/dist/types/property_config.d.ts +0 -2
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/side_entity_controller.d.ts +6 -1
- package/dist/types/storage.d.ts +86 -3
- package/dist/types/user.d.ts +1 -0
- package/dist/util/builders.d.ts +3 -3
- package/dist/util/entities.d.ts +3 -3
- package/dist/util/entity_actions.d.ts +2 -0
- package/dist/util/entity_cache.d.ts +23 -0
- package/dist/util/icon_list.d.ts +5 -1
- package/dist/util/icon_synonyms.d.ts +1 -98
- package/dist/util/icons.d.ts +6 -3
- package/dist/util/index.d.ts +2 -0
- package/dist/util/navigation_from_path.d.ts +6 -1
- package/dist/util/navigation_utils.d.ts +14 -3
- package/dist/util/objects.d.ts +2 -1
- package/dist/util/permissions.d.ts +4 -4
- package/dist/util/plurals.d.ts +0 -2
- package/dist/util/property_utils.d.ts +3 -3
- package/dist/util/resolutions.d.ts +36 -17
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/useStorageUploadController.d.ts +3 -3
- package/package.json +61 -48
- package/src/app/AppBar.tsx +18 -0
- package/src/app/Drawer.tsx +24 -0
- package/src/app/Scaffold.tsx +253 -0
- package/src/app/index.ts +4 -0
- package/src/app/useApp.tsx +32 -0
- package/src/components/ArrayContainer.tsx +127 -41
- package/src/components/CircularProgressCenter.tsx +2 -2
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
- package/src/components/DeleteEntityDialog.tsx +10 -19
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +54 -37
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
- package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
- package/src/components/EntityCollectionTable/index.tsx +1 -1
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +81 -80
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +207 -113
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
- package/src/components/EntityCollectionView/utils.ts +19 -0
- package/src/components/EntityPreview.tsx +62 -52
- package/src/components/EntityView.tsx +10 -10
- package/src/components/ErrorView.tsx +4 -4
- package/src/components/HomePage/DefaultHomePage.tsx +26 -19
- package/src/components/HomePage/FavouritesView.tsx +6 -11
- package/src/components/HomePage/NavigationCard.tsx +3 -3
- package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
- package/src/components/HomePage/NavigationGroup.tsx +2 -2
- package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
- package/src/components/NotFoundPage.tsx +2 -2
- package/src/components/PropertyConfigBadge.tsx +9 -3
- package/src/components/PropertyIdCopyTooltip.tsx +47 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +19 -13
- package/src/components/ReferenceWidget.tsx +21 -11
- package/src/components/SearchIconsView.tsx +10 -7
- package/src/components/SelectableTable/SelectableTable.tsx +27 -12
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
- package/src/components/UnsavedChangesDialog.tsx +42 -0
- package/src/components/VirtualTable/VirtualTable.tsx +96 -48
- package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
- package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
- package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
- package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
- package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
- package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
- package/src/components/VirtualTable/types.tsx +2 -3
- package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +33 -40
- package/src/components/common/index.ts +2 -1
- package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
- package/src/components/common/types.tsx +4 -6
- package/src/components/common/useColumnsIds.tsx +24 -3
- package/src/components/common/useDataSourceTableController.tsx +420 -0
- package/src/components/common/useDebouncedCallback.tsx +20 -0
- package/src/components/common/useScrollRestoration.tsx +68 -0
- package/src/components/common/useTableSearchHelper.ts +53 -12
- package/src/components/index.tsx +4 -2
- package/src/contexts/BreacrumbsContext.tsx +38 -0
- package/src/contexts/DialogsProvider.tsx +5 -4
- package/src/contexts/ModeController.tsx +1 -3
- package/src/contexts/SnackbarProvider.tsx +2 -0
- package/src/core/DefaultAppBar.tsx +219 -0
- package/src/core/DefaultDrawer.tsx +185 -0
- package/src/core/DrawerNavigationItem.tsx +66 -0
- package/src/core/EntityEditView.tsx +321 -479
- package/src/core/EntityEditViewFormActions.tsx +199 -0
- package/src/core/EntitySidePanel.tsx +86 -17
- package/src/core/FireCMS.tsx +56 -49
- package/src/core/FireCMSRouter.tsx +17 -0
- package/src/core/NavigationRoutes.tsx +28 -38
- package/src/core/SideDialogs.tsx +22 -12
- package/src/core/field_configs.tsx +11 -12
- package/src/core/index.tsx +6 -5
- package/src/form/EntityForm.tsx +585 -539
- package/src/form/EntityFormActions.tsx +169 -0
- package/src/form/PropertyFieldBinding.tsx +85 -44
- package/src/form/components/CustomIdField.tsx +6 -2
- package/src/form/components/FieldHelperText.tsx +4 -4
- package/src/form/components/FormEntry.tsx +22 -0
- package/src/form/components/FormLayout.tsx +16 -0
- package/src/form/components/LabelWithIcon.tsx +30 -19
- package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
- package/src/form/components/StorageItemPreview.tsx +22 -12
- package/src/form/components/StorageUploadProgress.tsx +4 -5
- package/src/form/components/index.tsx +3 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +31 -19
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
- package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
- package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
- package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
- package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -35
- package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +42 -50
- package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
- package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
- package/src/form/index.tsx +16 -37
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +13 -23
- package/src/hooks/data/delete.ts +6 -5
- package/src/hooks/data/save.ts +13 -9
- package/src/hooks/data/useCollectionFetch.tsx +3 -3
- package/src/hooks/data/useDataSource.tsx +11 -3
- package/src/hooks/data/useEntityFetch.tsx +10 -6
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useAuthController.tsx +1 -1
- package/src/hooks/useBreadcrumbsController.tsx +31 -0
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/hooks/useBuildModeController.tsx +22 -29
- package/src/hooks/useBuildNavigationController.tsx +159 -54
- package/src/hooks/useFireCMSContext.tsx +5 -5
- package/src/hooks/useLargeLayout.tsx +0 -35
- package/src/hooks/useModeController.tsx +1 -2
- package/src/hooks/useProjectLog.tsx +32 -10
- package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
- package/src/hooks/useValidateAuthenticator.tsx +17 -37
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +72 -82
- package/src/internal/useBuildSideDialogsController.tsx +4 -2
- package/src/internal/useBuildSideEntityController.tsx +193 -73
- package/src/internal/useUnsavedChangesDialog.tsx +127 -91
- package/src/preview/PropertyPreview.tsx +17 -24
- package/src/preview/PropertyPreviewProps.tsx +7 -1
- package/src/preview/components/BooleanPreview.tsx +2 -2
- package/src/preview/components/EmptyValue.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +2 -2
- package/src/preview/components/ImagePreview.tsx +25 -36
- package/src/preview/components/ReferencePreview.tsx +22 -33
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +60 -28
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
- package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
- package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
- package/src/preview/util.ts +10 -10
- package/src/routes/CustomCMSRoute.tsx +21 -0
- package/src/routes/FireCMSRoute.tsx +235 -0
- package/src/routes/HomePageRoute.tsx +17 -0
- package/src/types/auth.tsx +9 -13
- package/src/types/collections.ts +94 -27
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +61 -43
- package/src/types/dialogs_controller.tsx +7 -3
- package/src/types/entities.ts +12 -2
- package/src/types/entity_actions.tsx +32 -7
- package/src/types/entity_callbacks.ts +18 -18
- package/src/types/entity_overrides.tsx +2 -2
- package/src/types/export_import.ts +4 -4
- package/src/types/fields.tsx +81 -46
- package/src/types/firecms.tsx +7 -2
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +38 -18
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +25 -14
- package/src/types/properties.ts +60 -25
- package/src/types/property_config.tsx +0 -2
- package/src/types/side_dialogs_controller.tsx +15 -0
- package/src/types/side_entity_controller.tsx +6 -1
- package/src/types/storage.ts +94 -3
- package/src/types/user.ts +2 -0
- package/src/util/builders.ts +10 -8
- package/src/util/entities.ts +9 -6
- package/src/util/entity_actions.ts +28 -0
- package/src/util/entity_cache.ts +204 -0
- package/src/util/enums.ts +1 -1
- package/src/util/icon_list.ts +16 -10
- package/src/util/icon_synonyms.ts +3 -100
- package/src/util/icons.tsx +17 -7
- package/src/util/index.ts +2 -0
- package/src/util/join_collections.ts +3 -0
- package/src/util/make_properties_editable.ts +13 -5
- package/src/util/navigation_from_path.ts +13 -6
- package/src/util/navigation_utils.ts +59 -7
- package/src/util/objects.ts +48 -28
- package/src/util/parent_references_from_path.ts +3 -3
- package/src/util/permissions.ts +9 -8
- package/src/util/plurals.ts +0 -2
- package/src/util/property_utils.tsx +11 -4
- package/src/util/references.ts +11 -2
- package/src/util/resolutions.ts +100 -46
- package/src/util/storage.ts +79 -21
- package/src/util/strings.ts +2 -2
- package/src/util/useStorageUploadController.tsx +71 -27
- package/dist/components/FireCMSAppBar.d.ts +0 -26
- package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
- package/dist/components/VirtualTable/common.d.ts +0 -2
- package/dist/core/Drawer.d.ts +0 -23
- package/dist/core/Scaffold.d.ts +0 -55
- package/dist/core/SideEntityView.d.ts +0 -7
- package/dist/form/components/FormikArrayContainer.d.ts +0 -18
- package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
- package/dist/internal/useBuildCustomizationController.d.ts +0 -2
- package/dist/internal/useLocaleConfig.d.ts +0 -1
- package/dist/types/appcheck.d.ts +0 -26
- package/src/components/FireCMSAppBar.tsx +0 -165
- package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
- package/src/core/Drawer.tsx +0 -191
- package/src/core/Scaffold.tsx +0 -281
- package/src/core/SideEntityView.tsx +0 -38
- package/src/form/components/FormikArrayContainer.tsx +0 -44
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
- package/src/internal/useBuildCustomizationController.tsx +0 -5
- package/src/internal/useLocaleConfig.tsx +0 -18
- package/src/types/appcheck.ts +0 -29
- /package/src/util/{common.tsx → common.ts} +0 -0
|
@@ -4,7 +4,7 @@ import { Entity, EntityCollection, EntityReference } from "../../../types";
|
|
|
4
4
|
import { ReferencePreview } from "../../../preview";
|
|
5
5
|
import { getReferenceFrom } from "../../../util";
|
|
6
6
|
import { useNavigationController, useReferenceDialog } from "../../../hooks";
|
|
7
|
-
import { Button, Select, SelectItem } from "@firecms/ui";
|
|
7
|
+
import { Button, Checkbox, Label, Select, SelectItem } from "@firecms/ui";
|
|
8
8
|
|
|
9
9
|
interface ReferenceFilterFieldProps {
|
|
10
10
|
name: string,
|
|
@@ -13,6 +13,7 @@ interface ReferenceFilterFieldProps {
|
|
|
13
13
|
isArray?: boolean;
|
|
14
14
|
path?: string;
|
|
15
15
|
title?: string;
|
|
16
|
+
includeId?: boolean;
|
|
16
17
|
previewProperties?: string[];
|
|
17
18
|
hidden: boolean;
|
|
18
19
|
setHidden: (hidden: boolean) => void;
|
|
@@ -34,12 +35,11 @@ const operationLabels = {
|
|
|
34
35
|
const multipleSelectOperations = ["array-contains-any", "in", "not-in"];
|
|
35
36
|
|
|
36
37
|
export function ReferenceFilterField({
|
|
37
|
-
name,
|
|
38
38
|
value,
|
|
39
39
|
setValue,
|
|
40
40
|
isArray,
|
|
41
41
|
path,
|
|
42
|
-
|
|
42
|
+
includeId = true,
|
|
43
43
|
previewProperties,
|
|
44
44
|
setHidden
|
|
45
45
|
}: ReferenceFilterFieldProps) {
|
|
@@ -48,13 +48,15 @@ export function ReferenceFilterField({
|
|
|
48
48
|
? ["array-contains"]
|
|
49
49
|
: ["==", "!=", ">", "<", ">=", "<="];
|
|
50
50
|
|
|
51
|
-
isArray
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
if (isArray) {
|
|
52
|
+
possibleOperations.push("array-contains-any");
|
|
53
|
+
} else {
|
|
54
|
+
possibleOperations.push("in", "not-in");
|
|
55
|
+
}
|
|
54
56
|
|
|
55
57
|
const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
|
|
56
58
|
const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
|
|
57
|
-
const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined>(fieldValue);
|
|
59
|
+
const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined | null>(fieldValue);
|
|
58
60
|
|
|
59
61
|
const selectedEntityIds = internalValue
|
|
60
62
|
? (Array.isArray(internalValue) ? internalValue.map((ref) => {
|
|
@@ -65,7 +67,7 @@ export function ReferenceFilterField({
|
|
|
65
67
|
}).filter(Boolean) as string[] : [internalValue.id])
|
|
66
68
|
: [];
|
|
67
69
|
|
|
68
|
-
function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityReference | EntityReference[]) {
|
|
70
|
+
function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityReference | EntityReference[] | null) {
|
|
69
71
|
|
|
70
72
|
const prevOpIsArray = multipleSelectOperations.includes(operation);
|
|
71
73
|
const newOpIsArray = multipleSelectOperations.includes(op);
|
|
@@ -134,16 +136,19 @@ export function ReferenceFilterField({
|
|
|
134
136
|
onClick={doOpenDialog}
|
|
135
137
|
reference={reference}
|
|
136
138
|
hover={true}
|
|
137
|
-
|
|
139
|
+
includeId={includeId}
|
|
140
|
+
includeEntityLink={false}
|
|
138
141
|
/>
|
|
139
142
|
);
|
|
140
143
|
};
|
|
141
144
|
|
|
142
145
|
return (
|
|
143
146
|
|
|
144
|
-
<div className="flex w-[
|
|
145
|
-
<div className="w-[
|
|
147
|
+
<div className="flex w-[480px] flex-row">
|
|
148
|
+
<div className="w-[140px]">
|
|
146
149
|
<Select value={operation}
|
|
150
|
+
size={"large"}
|
|
151
|
+
fullWidth={true}
|
|
147
152
|
onValueChange={(value) => {
|
|
148
153
|
updateFilter(value as VirtualTableWhereFilterOp, internalValue);
|
|
149
154
|
}}
|
|
@@ -156,21 +161,40 @@ export function ReferenceFilterField({
|
|
|
156
161
|
</Select>
|
|
157
162
|
</div>
|
|
158
163
|
|
|
159
|
-
<div className="flex-grow ml-2 h-full">
|
|
164
|
+
<div className="flex-grow ml-2 h-full gap-2 flex flex-col w-[340px]">
|
|
160
165
|
|
|
161
166
|
{internalValue && Array.isArray(internalValue) && <div>
|
|
162
167
|
{internalValue.map((ref, index) => buildEntry(ref))}
|
|
163
168
|
</div>}
|
|
169
|
+
|
|
164
170
|
{internalValue && !Array.isArray(internalValue) && <div>
|
|
165
171
|
{buildEntry(internalValue)}
|
|
166
172
|
</div>}
|
|
173
|
+
|
|
167
174
|
{(!internalValue || (Array.isArray(internalValue) && internalValue.length === 0)) &&
|
|
168
175
|
<Button onClick={doOpenDialog}
|
|
169
176
|
variant={"outlined"}
|
|
177
|
+
size={"large"}
|
|
170
178
|
className="h-full w-full">
|
|
171
179
|
{multiple ? "Select references" : "Select reference"}
|
|
172
180
|
</Button>
|
|
173
181
|
}
|
|
182
|
+
|
|
183
|
+
{!isArray && <Label
|
|
184
|
+
className="border cursor-pointer rounded-md p-2 flex items-center gap-2 [&:has(:checked)]:bg-surface-100 dark:[&:has(:checked)]:bg-surface-800"
|
|
185
|
+
htmlFor="null-filter"
|
|
186
|
+
>
|
|
187
|
+
<Checkbox id="null-filter"
|
|
188
|
+
checked={internalValue === null}
|
|
189
|
+
size={"small"}
|
|
190
|
+
onCheckedChange={(checked) => {
|
|
191
|
+
if (internalValue !== null)
|
|
192
|
+
updateFilter(operation, null);
|
|
193
|
+
else updateFilter(operation, undefined);
|
|
194
|
+
}}/>
|
|
195
|
+
Filter for null values
|
|
196
|
+
</Label>}
|
|
197
|
+
|
|
174
198
|
</div>
|
|
175
199
|
|
|
176
200
|
</div>
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import React, { useState } from "react";
|
|
2
2
|
import { EnumValuesChip } from "../../../preview";
|
|
3
3
|
import { VirtualTableWhereFilterOp } from "../../VirtualTable";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
Checkbox,
|
|
6
|
+
CloseIcon,
|
|
7
|
+
IconButton,
|
|
8
|
+
Label,
|
|
9
|
+
MultiSelect,
|
|
10
|
+
MultiSelectItem,
|
|
11
|
+
Select,
|
|
12
|
+
SelectItem,
|
|
13
|
+
TextField
|
|
14
|
+
} from "@firecms/ui";
|
|
5
15
|
import { EnumValueConfig } from "../../../types";
|
|
6
16
|
|
|
7
17
|
interface StringNumberFilterFieldProps {
|
|
@@ -50,15 +60,15 @@ export function StringNumberFilterField({
|
|
|
50
60
|
|
|
51
61
|
const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
|
|
52
62
|
const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
|
|
53
|
-
const [internalValue, setInternalValue] = useState<string | number | string[] | number[] | undefined>(fieldValue);
|
|
63
|
+
const [internalValue, setInternalValue] = useState<string | number | string[] | number[] | null | undefined>(fieldValue);
|
|
54
64
|
|
|
55
|
-
function updateFilter(op: VirtualTableWhereFilterOp, val: string | number | string[] | number[] | undefined) {
|
|
65
|
+
function updateFilter(op: VirtualTableWhereFilterOp, val: string | number | string[] | number[] | null | undefined) {
|
|
56
66
|
let newValue = val;
|
|
57
67
|
const prevOpIsArray = multipleSelectOperations.includes(operation);
|
|
58
68
|
const newOpIsArray = multipleSelectOperations.includes(op);
|
|
59
69
|
if (prevOpIsArray !== newOpIsArray) {
|
|
60
70
|
// @ts-ignore
|
|
61
|
-
newValue = newOpIsArray ? (typeof val === "string" || typeof val === "number" ? [val] : []) :
|
|
71
|
+
newValue = newOpIsArray ? (typeof val === "string" || typeof val === "number" ? [val] : []) : undefined;
|
|
62
72
|
}
|
|
63
73
|
|
|
64
74
|
if (typeof newValue === "number" && isNaN(newValue))
|
|
@@ -82,11 +92,13 @@ export function StringNumberFilterField({
|
|
|
82
92
|
}
|
|
83
93
|
|
|
84
94
|
const multiple = multipleSelectOperations.includes(operation);
|
|
95
|
+
|
|
85
96
|
return (
|
|
86
97
|
|
|
87
|
-
<div className="flex w-[440px]
|
|
98
|
+
<div className="flex w-[440px]">
|
|
88
99
|
<div className={"w-[80px]"}>
|
|
89
100
|
<Select value={operation}
|
|
101
|
+
fullWidth={true}
|
|
90
102
|
position={"item-aligned"}
|
|
91
103
|
onValueChange={(value) => {
|
|
92
104
|
updateFilter(value as VirtualTableWhereFilterOp, internalValue);
|
|
@@ -100,11 +112,11 @@ export function StringNumberFilterField({
|
|
|
100
112
|
</Select>
|
|
101
113
|
</div>
|
|
102
114
|
|
|
103
|
-
<div className="flex-grow ml-2">
|
|
115
|
+
<div className="flex-grow ml-2 flex flex-col gap-2">
|
|
104
116
|
|
|
105
117
|
{!enumValues && <TextField
|
|
106
118
|
type={dataType === "number" ? "number" : undefined}
|
|
107
|
-
value={internalValue !== undefined ? String(internalValue) : ""}
|
|
119
|
+
value={internalValue !== undefined && internalValue != null ? String(internalValue) : ""}
|
|
108
120
|
onChange={(evt) => {
|
|
109
121
|
const val = dataType === "number"
|
|
110
122
|
? parseFloat(evt.target.value)
|
|
@@ -113,33 +125,38 @@ export function StringNumberFilterField({
|
|
|
113
125
|
}}
|
|
114
126
|
endAdornment={internalValue && <IconButton
|
|
115
127
|
onClick={(e) => updateFilter(operation, undefined)}>
|
|
116
|
-
<
|
|
128
|
+
<CloseIcon/>
|
|
117
129
|
</IconButton>}
|
|
118
130
|
/>}
|
|
119
131
|
|
|
120
|
-
{enumValues &&
|
|
121
|
-
|
|
132
|
+
{enumValues && !multiple &&
|
|
122
133
|
<Select
|
|
123
134
|
position={"item-aligned"}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
: isArray ? [] : ""}
|
|
135
|
+
fullWidth={true}
|
|
136
|
+
value={typeof internalValue === "string" ? internalValue : ""}
|
|
127
137
|
onValueChange={(value) => {
|
|
128
|
-
|
|
138
|
+
if (value !== "")
|
|
139
|
+
updateFilter(operation, dataType === "number" ? parseInt(value as string) : value as string)
|
|
129
140
|
}}
|
|
130
|
-
multiple={multiple}
|
|
131
141
|
endAdornment={internalValue && <IconButton
|
|
132
|
-
className="absolute right-
|
|
142
|
+
className="absolute right-2 top-3"
|
|
133
143
|
onClick={(e) => updateFilter(operation, undefined)}>
|
|
134
|
-
<
|
|
144
|
+
<CloseIcon/>
|
|
135
145
|
</IconButton>}
|
|
136
|
-
renderValue={(enumKey) =>
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
146
|
+
renderValue={(enumKey) => {
|
|
147
|
+
if (enumKey === null)
|
|
148
|
+
return "Filter for null values";
|
|
149
|
+
if (enumKey === undefined)
|
|
150
|
+
return null;
|
|
151
|
+
|
|
152
|
+
return <EnumValuesChip
|
|
153
|
+
key={`select_value_${name}_${enumKey}`}
|
|
154
|
+
enumKey={enumKey}
|
|
155
|
+
enumValues={enumValues}
|
|
156
|
+
size={"small"}/>;
|
|
157
|
+
}}>
|
|
141
158
|
{enumValues.map((enumConfig) => (
|
|
142
|
-
<SelectItem key={`
|
|
159
|
+
<SelectItem key={`select_item_${name}_${enumConfig.id}`}
|
|
143
160
|
value={String(enumConfig.id)}>
|
|
144
161
|
<EnumValuesChip
|
|
145
162
|
enumKey={String(enumConfig.id)}
|
|
@@ -150,6 +167,58 @@ export function StringNumberFilterField({
|
|
|
150
167
|
</Select>
|
|
151
168
|
}
|
|
152
169
|
|
|
170
|
+
{enumValues && multiple &&
|
|
171
|
+
<MultiSelect
|
|
172
|
+
position={"item-aligned"}
|
|
173
|
+
value={Array.isArray(internalValue) ? internalValue.map(e => String(e)) : []}
|
|
174
|
+
onValueChange={(value) => {
|
|
175
|
+
updateFilter(operation, dataType === "number" ? value.map(v => parseInt(v)) : value)
|
|
176
|
+
}}
|
|
177
|
+
multiple={multiple}
|
|
178
|
+
endAdornment={internalValue && <IconButton
|
|
179
|
+
className="absolute right-2 top-3"
|
|
180
|
+
onClick={(e) => updateFilter(operation, undefined)}>
|
|
181
|
+
<CloseIcon/>
|
|
182
|
+
</IconButton>}
|
|
183
|
+
// renderValues={(enumKeys) => {
|
|
184
|
+
// console.log("renderValues", enumKeys);
|
|
185
|
+
// if (enumKeys === null)
|
|
186
|
+
// return "Filter for null values";
|
|
187
|
+
//
|
|
188
|
+
// return enumKeys.map(key => <EnumValuesChip
|
|
189
|
+
// key={`select_value_${name}_${enumKeys}`}
|
|
190
|
+
// enumKey={key}
|
|
191
|
+
// enumValues={enumValues}
|
|
192
|
+
// size={"small"}/>);
|
|
193
|
+
// }}
|
|
194
|
+
>
|
|
195
|
+
{enumValues.map((enumConfig) => (
|
|
196
|
+
<MultiSelectItem key={`select_value_${name}_${enumConfig.id}`}
|
|
197
|
+
value={String(enumConfig.id)}>
|
|
198
|
+
<EnumValuesChip
|
|
199
|
+
enumKey={String(enumConfig.id)}
|
|
200
|
+
enumValues={enumValues}
|
|
201
|
+
size={"small"}/>
|
|
202
|
+
</MultiSelectItem>
|
|
203
|
+
))}
|
|
204
|
+
</MultiSelect>
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
{!isArray && <Label
|
|
208
|
+
className="border cursor-pointer rounded-md p-2 flex items-center gap-2 [&:has(:checked)]:bg-surface-100 dark:[&:has(:checked)]:bg-surface-800"
|
|
209
|
+
htmlFor="null-filter"
|
|
210
|
+
>
|
|
211
|
+
<Checkbox id="null-filter"
|
|
212
|
+
checked={internalValue === null}
|
|
213
|
+
size={"small"}
|
|
214
|
+
onCheckedChange={(checked) => {
|
|
215
|
+
if (internalValue !== null)
|
|
216
|
+
updateFilter(operation, null);
|
|
217
|
+
else updateFilter(operation, undefined);
|
|
218
|
+
}}/>
|
|
219
|
+
Filter for null values
|
|
220
|
+
</Label>}
|
|
221
|
+
|
|
153
222
|
</div>
|
|
154
223
|
|
|
155
224
|
</div>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography } from "@firecms/ui";
|
|
2
|
+
|
|
3
|
+
export interface UnsavedChangesDialogProps {
|
|
4
|
+
open: boolean;
|
|
5
|
+
body?: React.ReactNode;
|
|
6
|
+
title?: string;
|
|
7
|
+
handleOk: () => void;
|
|
8
|
+
handleCancel: () => void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function UnsavedChangesDialog({
|
|
12
|
+
open,
|
|
13
|
+
handleOk,
|
|
14
|
+
handleCancel,
|
|
15
|
+
body,
|
|
16
|
+
title
|
|
17
|
+
}: UnsavedChangesDialogProps) {
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<Dialog
|
|
21
|
+
onEscapeKeyDown={() => {
|
|
22
|
+
handleCancel();
|
|
23
|
+
}}
|
|
24
|
+
open={open}
|
|
25
|
+
>
|
|
26
|
+
<DialogTitle variant={"h6"}>{title}</DialogTitle>
|
|
27
|
+
<DialogContent>
|
|
28
|
+
|
|
29
|
+
{body}
|
|
30
|
+
|
|
31
|
+
<Typography>
|
|
32
|
+
Are you sure you want to leave this page?
|
|
33
|
+
</Typography>
|
|
34
|
+
|
|
35
|
+
</DialogContent>
|
|
36
|
+
<DialogActions>
|
|
37
|
+
<Button variant="text" onClick={handleCancel} autoFocus> Cancel </Button>
|
|
38
|
+
<Button onClick={handleOk}> Ok </Button>
|
|
39
|
+
</DialogActions>
|
|
40
|
+
</Dialog>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
@@ -15,12 +15,12 @@ import {
|
|
|
15
15
|
VirtualTableWhereFilterOp
|
|
16
16
|
} from "./VirtualTableProps";
|
|
17
17
|
|
|
18
|
-
import { getRowHeight } from "./common";
|
|
19
18
|
import { VirtualTableContextProps } from "./types";
|
|
20
19
|
import { VirtualTableHeaderRow } from "./VirtualTableHeaderRow";
|
|
21
20
|
import { VirtualTableRow } from "./VirtualTableRow";
|
|
22
21
|
import { VirtualTableCell } from "./VirtualTableCell";
|
|
23
|
-
import { AssignmentIcon,
|
|
22
|
+
import { AssignmentIcon, CenteredView, cls, Typography } from "@firecms/ui";
|
|
23
|
+
import { useDebounceCallback } from "../common/useDebouncedCallback";
|
|
24
24
|
|
|
25
25
|
const VirtualListContext = createContext<VirtualTableContextProps<any>>({} as any);
|
|
26
26
|
VirtualListContext.displayName = "VirtualListContext";
|
|
@@ -64,10 +64,10 @@ const innerElementType = forwardRef<HTMLDivElement, InnerElementProps>(({
|
|
|
64
64
|
|
|
65
65
|
{customView && <div style={{
|
|
66
66
|
position: "sticky",
|
|
67
|
-
top: "
|
|
67
|
+
top: "48px",
|
|
68
68
|
flexGrow: 1,
|
|
69
|
-
height: "calc(100% -
|
|
70
|
-
marginTop: "calc(
|
|
69
|
+
height: "calc(100% - 48px)",
|
|
70
|
+
marginTop: "calc(48px - 100vh)",
|
|
71
71
|
left: 0
|
|
72
72
|
}}>{customView}</div>}
|
|
73
73
|
|
|
@@ -92,7 +92,8 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
|
|
|
92
92
|
data,
|
|
93
93
|
onResetPagination,
|
|
94
94
|
onEndReached,
|
|
95
|
-
|
|
95
|
+
endOffset = 600,
|
|
96
|
+
rowHeight = 54,
|
|
96
97
|
columns: columnsProp,
|
|
97
98
|
onRowClick,
|
|
98
99
|
onColumnResize,
|
|
@@ -103,14 +104,18 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
|
|
|
103
104
|
error,
|
|
104
105
|
emptyComponent,
|
|
105
106
|
onSortByUpdate,
|
|
107
|
+
onScroll: onScrollProp,
|
|
106
108
|
loading,
|
|
107
109
|
cellRenderer,
|
|
108
110
|
hoverRow,
|
|
109
111
|
createFilterField,
|
|
110
112
|
rowClassName,
|
|
113
|
+
style,
|
|
111
114
|
className,
|
|
112
115
|
endAdornment,
|
|
113
|
-
AddColumnComponent
|
|
116
|
+
AddColumnComponent,
|
|
117
|
+
initialScroll = 0,
|
|
118
|
+
debug
|
|
114
119
|
}: VirtualTableProps<T>) {
|
|
115
120
|
|
|
116
121
|
const sortByProperty: string | undefined = sortBy ? sortBy[0] : undefined;
|
|
@@ -121,6 +126,15 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
|
|
|
121
126
|
const tableRef = useRef<HTMLDivElement>(null);
|
|
122
127
|
const endReachCallbackThreshold = useRef<number>(0);
|
|
123
128
|
|
|
129
|
+
const debouncedScroll = useDebounceCallback(onScrollProp, 200);
|
|
130
|
+
|
|
131
|
+
// Set initial scroll position
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
if (tableRef.current && initialScroll) {
|
|
134
|
+
tableRef.current.scrollTo(0, initialScroll);
|
|
135
|
+
}
|
|
136
|
+
}, [tableRef, initialScroll]);
|
|
137
|
+
|
|
124
138
|
useEffect(() => {
|
|
125
139
|
setColumns(columnsProp);
|
|
126
140
|
}, [columnsProp]);
|
|
@@ -128,10 +142,14 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
|
|
|
128
142
|
const [measureRef, bounds] = useMeasure();
|
|
129
143
|
|
|
130
144
|
const onColumnResizeInternal = useCallback((params: OnVirtualTableColumnResizeParams) => {
|
|
145
|
+
if (debug)
|
|
146
|
+
console.log("onColumnResizeInternal", params);
|
|
131
147
|
setColumns(columns.map((column) => column.key === params.column.key ? params.column : column));
|
|
132
148
|
}, [columns]);
|
|
133
149
|
|
|
134
150
|
const onColumnResizeEndInternal = useCallback((params: OnVirtualTableColumnResizeParams) => {
|
|
151
|
+
if (debug)
|
|
152
|
+
console.log("onColumnResizeEndInternal", params);
|
|
135
153
|
setColumns(columns.map((column) => column.key === params.column.key ? params.column : column));
|
|
136
154
|
if (onColumnResize) {
|
|
137
155
|
onColumnResize(params);
|
|
@@ -142,19 +160,25 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
|
|
|
142
160
|
const filterRef = useRef<VirtualTableFilterValues<any> | undefined>();
|
|
143
161
|
|
|
144
162
|
useEffect(() => {
|
|
163
|
+
if (debug)
|
|
164
|
+
console.log("Filter updated", filterInput);
|
|
145
165
|
filterRef.current = filterInput;
|
|
146
166
|
}, [filterInput]);
|
|
147
167
|
|
|
148
168
|
const scrollToTop = useCallback(() => {
|
|
169
|
+
if (debug)
|
|
170
|
+
console.log("scrollToTop");
|
|
149
171
|
endReachCallbackThreshold.current = 0;
|
|
150
172
|
if (tableRef.current) {
|
|
151
|
-
// scrollRef.current = [scrollRef.current[0], 0];
|
|
152
173
|
tableRef.current.scrollTo(tableRef.current?.scrollLeft, 0);
|
|
153
174
|
}
|
|
154
175
|
}, []);
|
|
155
176
|
|
|
156
177
|
const onColumnSort = useCallback((key: string) => {
|
|
157
178
|
|
|
179
|
+
if (debug)
|
|
180
|
+
console.log("onColumnSort", key);
|
|
181
|
+
|
|
158
182
|
const isDesc = sortByProperty === key && currentSort === "desc";
|
|
159
183
|
const isAsc = sortByProperty === key && currentSort === "asc";
|
|
160
184
|
const newSort = isAsc ? "desc" : (isDesc ? undefined : "asc");
|
|
@@ -181,21 +205,21 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
|
|
|
181
205
|
scrollToTop();
|
|
182
206
|
}, [checkFilterCombination, currentSort, onFilterUpdate, onResetPagination, onSortByUpdate, scrollToTop, sortByProperty]);
|
|
183
207
|
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
onSortByUpdate(undefined);
|
|
188
|
-
}, [onSortByUpdate]);
|
|
208
|
+
const maxScroll = Math.max((data?.length ?? 0) * rowHeight - bounds.height, 0);
|
|
209
|
+
if (debug)
|
|
210
|
+
console.log("maxScroll", maxScroll);
|
|
189
211
|
|
|
190
|
-
const maxScroll = Math.max((data?.length ?? 0) * getRowHeight(size) - bounds.height, 0);
|
|
191
212
|
const onEndReachedInternal = useCallback((scrollOffset: number) => {
|
|
192
|
-
if (
|
|
213
|
+
if (debug)
|
|
214
|
+
console.log("onEndReachedInternal", scrollOffset, endReachCallbackThreshold.current + endOffset);
|
|
215
|
+
if (onEndReached && (data?.length ?? 0) > 0 && scrollOffset > endReachCallbackThreshold.current + endOffset) {
|
|
193
216
|
endReachCallbackThreshold.current = scrollOffset;
|
|
194
217
|
onEndReached();
|
|
195
218
|
}
|
|
196
219
|
}, [data?.length, onEndReached]);
|
|
197
220
|
|
|
198
221
|
const onScroll = useCallback(({
|
|
222
|
+
scrollDirection,
|
|
199
223
|
scrollOffset,
|
|
200
224
|
scrollUpdateWasRequested
|
|
201
225
|
}: {
|
|
@@ -203,11 +227,26 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
|
|
|
203
227
|
scrollOffset: number,
|
|
204
228
|
scrollUpdateWasRequested: boolean;
|
|
205
229
|
}) => {
|
|
206
|
-
if (
|
|
230
|
+
if (debug)
|
|
231
|
+
console.log("onScroll", {
|
|
232
|
+
scrollDirection,
|
|
233
|
+
scrollOffset,
|
|
234
|
+
scrollUpdateWasRequested
|
|
235
|
+
});
|
|
236
|
+
if (onScrollProp) {
|
|
237
|
+
debouncedScroll({
|
|
238
|
+
scrollDirection,
|
|
239
|
+
scrollOffset,
|
|
240
|
+
scrollUpdateWasRequested
|
|
241
|
+
})
|
|
242
|
+
}
|
|
243
|
+
if (!scrollUpdateWasRequested && (scrollOffset >= maxScroll - endOffset))
|
|
207
244
|
onEndReachedInternal(scrollOffset);
|
|
208
245
|
}, [maxScroll, onEndReachedInternal]);
|
|
209
246
|
|
|
210
247
|
const onFilterUpdateInternal = useCallback((column: VirtualTableColumn, filterForProperty?: [VirtualTableWhereFilterOp, any]) => {
|
|
248
|
+
if (debug)
|
|
249
|
+
console.log("onFilterUpdateInternal", column, filterForProperty);
|
|
211
250
|
|
|
212
251
|
endReachCallbackThreshold.current = 0;
|
|
213
252
|
const filter = filterRef.current;
|
|
@@ -225,41 +264,33 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
|
|
|
225
264
|
}
|
|
226
265
|
|
|
227
266
|
if (onFilterUpdate) onFilterUpdate(newFilterValue);
|
|
267
|
+
}, [checkFilterCombination, currentSort, onFilterUpdate, sortByProperty]);
|
|
228
268
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
const buildErrorView = useCallback(() => (
|
|
235
|
-
<div
|
|
236
|
-
className="h-full flex flex-col items-center justify-center sticky left-0">
|
|
269
|
+
const empty = !loading && (data?.length ?? 0) === 0;
|
|
270
|
+
const customView = error
|
|
271
|
+
? <CenteredView maxWidth={"2xl"}
|
|
272
|
+
className="flex flex-col gap-2">
|
|
237
273
|
|
|
238
274
|
<Typography variant={"h6"}>
|
|
239
|
-
{"Error
|
|
275
|
+
{"Error"}
|
|
240
276
|
</Typography>
|
|
241
277
|
|
|
242
|
-
{error?.message && <
|
|
243
|
-
|
|
244
|
-
</div>
|
|
245
|
-
), [error?.message]);
|
|
246
|
-
|
|
247
|
-
const buildEmptyView = useCallback(() => {
|
|
248
|
-
if (loading)
|
|
249
|
-
return <CircularProgressCenter/>;
|
|
250
|
-
return <div
|
|
251
|
-
className="flex flex-col overflow-auto items-center justify-center p-2 gap-2 h-full">
|
|
252
|
-
<AssignmentIcon/>
|
|
253
|
-
{emptyComponent}
|
|
254
|
-
</div>;
|
|
255
|
-
}, [emptyComponent, loading]);
|
|
278
|
+
{error?.message && <SafeLinkRenderer text={error.message}/>}
|
|
256
279
|
|
|
257
|
-
|
|
258
|
-
|
|
280
|
+
</CenteredView>
|
|
281
|
+
: (empty
|
|
282
|
+
? (loading
|
|
283
|
+
? <CircularProgressCenter/>
|
|
284
|
+
: <div
|
|
285
|
+
className="flex flex-col overflow-auto items-center justify-center p-2 gap-2 h-full">
|
|
286
|
+
<AssignmentIcon/>
|
|
287
|
+
{emptyComponent}
|
|
288
|
+
</div>)
|
|
289
|
+
: undefined);
|
|
259
290
|
|
|
260
291
|
const virtualListController = {
|
|
261
292
|
data,
|
|
262
|
-
|
|
293
|
+
rowHeight: rowHeight,
|
|
263
294
|
cellRenderer,
|
|
264
295
|
columns,
|
|
265
296
|
currentSort,
|
|
@@ -278,23 +309,26 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
|
|
|
278
309
|
AddColumnComponent
|
|
279
310
|
};
|
|
280
311
|
|
|
281
|
-
|
|
312
|
+
if (debug)
|
|
313
|
+
console.log("VirtualTable render", virtualListController);
|
|
314
|
+
|
|
282
315
|
return (
|
|
283
316
|
<div
|
|
284
317
|
ref={measureRef}
|
|
285
|
-
|
|
318
|
+
style={style}
|
|
319
|
+
className={cls("h-full w-full", className)}>
|
|
286
320
|
<VirtualListContext.Provider
|
|
287
321
|
value={virtualListController}>
|
|
288
322
|
|
|
289
323
|
<MemoizedList
|
|
290
324
|
outerRef={tableRef}
|
|
291
|
-
key={
|
|
325
|
+
key={rowHeight}
|
|
292
326
|
width={bounds.width}
|
|
293
327
|
height={bounds.height}
|
|
294
328
|
itemCount={(data?.length ?? 0) + (endAdornment ? 1 : 0)}
|
|
295
329
|
onScroll={onScroll}
|
|
296
330
|
includeAddColumn={Boolean(AddColumnComponent)}
|
|
297
|
-
itemSize={
|
|
331
|
+
itemSize={rowHeight}/>
|
|
298
332
|
|
|
299
333
|
</VirtualListContext.Provider>
|
|
300
334
|
</div>
|
|
@@ -334,7 +368,7 @@ function MemoizedList({
|
|
|
334
368
|
onRowClick,
|
|
335
369
|
data,
|
|
336
370
|
columns,
|
|
337
|
-
|
|
371
|
+
rowHeight = 54,
|
|
338
372
|
cellRenderer,
|
|
339
373
|
hoverRow,
|
|
340
374
|
rowClassName,
|
|
@@ -367,7 +401,7 @@ function MemoizedList({
|
|
|
367
401
|
...style,
|
|
368
402
|
top: `calc(${style.top}px + 48px)`
|
|
369
403
|
}}
|
|
370
|
-
|
|
404
|
+
rowHeight={rowHeight}>
|
|
371
405
|
|
|
372
406
|
{columns.map((column: VirtualTableColumn, columnIndex: number) => {
|
|
373
407
|
const cellData = rowData && rowData[column.key];
|
|
@@ -403,3 +437,17 @@ function MemoizedList({
|
|
|
403
437
|
{Row}
|
|
404
438
|
</List>;
|
|
405
439
|
}
|
|
440
|
+
|
|
441
|
+
const SafeLinkRenderer: React.FC<{
|
|
442
|
+
text: string;
|
|
443
|
+
}> = ({ text }) => {
|
|
444
|
+
const urlRegex = /https?:\/\/[^\s]+/g;
|
|
445
|
+
const htmlContent = text.replace(urlRegex, (url) => {
|
|
446
|
+
// For each URL found, replace it with an HTML <a> tag
|
|
447
|
+
return `<a href="${url}" class="underline" target="_blank">Link</a><br/>`;
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
return (
|
|
451
|
+
<div className={"break-all"} dangerouslySetInnerHTML={{ __html: htmlContent }}/>
|
|
452
|
+
);
|
|
453
|
+
};
|
|
@@ -16,7 +16,7 @@ type VirtualTableCellProps<T extends any> = {
|
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
export const VirtualTableCell = React.memo<VirtualTableCellProps<any>>(
|
|
19
|
-
function VirtualTableCell<T
|
|
19
|
+
function VirtualTableCell<T>(props: VirtualTableCellProps<T>) {
|
|
20
20
|
// @ts-ignore
|
|
21
21
|
return props.rowData && props.cellRenderer(
|
|
22
22
|
{
|
|
@@ -30,14 +30,6 @@ export const VirtualTableCell = React.memo<VirtualTableCellProps<any>>(
|
|
|
30
30
|
width: props.column.width
|
|
31
31
|
} as CellRendererParams<T>
|
|
32
32
|
);
|
|
33
|
-
// return props.rowData && <props.cellRenderer
|
|
34
|
-
// rowData={props.rowData}
|
|
35
|
-
// rowIndex={props.rowIndex}
|
|
36
|
-
// isScrolling={false}
|
|
37
|
-
// column={props.column}
|
|
38
|
-
// columns={props.columns}
|
|
39
|
-
// columnIndex={props.columnIndex}
|
|
40
|
-
// width={props.column.width}/>
|
|
41
33
|
},
|
|
42
34
|
(a, b) => {
|
|
43
35
|
return equal(a.rowData, b.rowData) &&
|