@firecms/core 3.0.0-canary.16 → 3.0.0-canary.160
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 +30 -0
- package/dist/app/index.d.ts +4 -0
- package/dist/app/useApp.d.ts +16 -0
- package/dist/components/ArrayContainer.d.ts +19 -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 +11 -12
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +7 -5
- 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/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 +12 -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 +7 -6
- 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 +1 -1
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +15 -12
- package/dist/components/VirtualTable/types.d.ts +3 -3
- package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
- package/dist/components/common/index.d.ts +1 -0
- 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 +2 -1
- package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +4 -1
- package/dist/components/index.d.ts +4 -2
- package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
- package/dist/core/DefaultDrawer.d.ts +19 -0
- package/dist/core/DrawerNavigationItem.d.ts +10 -0
- package/dist/core/EntityEditView.d.ts +18 -4
- package/dist/core/FireCMS.d.ts +2 -2
- package/dist/core/NavigationRoutes.d.ts +3 -3
- package/dist/core/index.d.ts +3 -4
- 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/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 +1 -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 +3 -5
- 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 +3 -3
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useAuthController.d.ts +1 -1
- package/dist/hooks/useBuildNavigationController.d.ts +3 -4
- package/dist/hooks/useFireCMSContext.d.ts +1 -1
- package/dist/hooks/useProjectLog.d.ts +8 -2
- package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
- package/dist/hooks/useValidateAuthenticator.d.ts +5 -9
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +20202 -14110
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +22773 -588
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +1 -16
- 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/types/auth.d.ts +8 -10
- package/dist/types/collections.d.ts +53 -18
- package/dist/types/datasource.d.ts +51 -35
- package/dist/types/entities.d.ts +6 -1
- package/dist/types/entity_actions.d.ts +18 -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 +63 -41
- 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 +6 -5
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +22 -12
- package/dist/types/properties.d.ts +34 -21
- package/dist/types/property_config.d.ts +0 -2
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/storage.d.ts +86 -3
- package/dist/types/user.d.ts +1 -0
- package/dist/util/builders.d.ts +2 -2
- package/dist/util/entities.d.ts +2 -2
- package/dist/util/icon_list.d.ts +5 -1
- package/dist/util/icon_synonyms.d.ts +1 -97
- package/dist/util/icons.d.ts +6 -3
- package/dist/util/index.d.ts +1 -0
- package/dist/util/navigation_utils.d.ts +2 -2
- 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 +30 -16
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/useStorageUploadController.d.ts +3 -3
- package/package.json +59 -44
- package/src/app/AppBar.tsx +18 -0
- package/src/app/Drawer.tsx +24 -0
- package/src/app/Scaffold.tsx +243 -0
- package/src/app/index.ts +4 -0
- package/src/app/useApp.tsx +32 -0
- package/src/components/ArrayContainer.tsx +92 -25
- 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 +9 -18
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +13 -20
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +28 -25
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +12 -8
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
- package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +31 -17
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +16 -8
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +30 -35
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +19 -7
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +82 -75
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +139 -87
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
- package/src/components/EntityCollectionView/utils.ts +19 -0
- package/src/components/EntityPreview.tsx +55 -51
- 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 +1 -1
- package/src/components/HomePage/NavigationCard.tsx +4 -4
- package/src/components/HomePage/NavigationCardBinding.tsx +2 -2
- package/src/components/HomePage/NavigationGroup.tsx +2 -2
- package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
- package/src/components/PropertyConfigBadge.tsx +9 -3
- package/src/components/PropertyIdCopyTooltip.tsx +48 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +8 -7
- package/src/components/ReferenceWidget.tsx +22 -12
- package/src/components/SearchIconsView.tsx +10 -7
- package/src/components/SelectableTable/SelectableTable.tsx +9 -9
- 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 +30 -6
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +90 -21
- package/src/components/VirtualTable/VirtualTable.tsx +77 -46
- 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 +18 -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 +2 -1
- 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 +8 -4
- package/src/components/common/index.ts +1 -0
- 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 +23 -2
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +25 -14
- package/src/components/common/useTableSearchHelper.ts +53 -12
- package/src/components/index.tsx +4 -2
- package/src/contexts/DialogsProvider.tsx +2 -2
- package/src/contexts/SnackbarProvider.tsx +2 -0
- package/src/core/DefaultAppBar.tsx +178 -0
- package/src/core/DefaultDrawer.tsx +183 -0
- package/src/core/DrawerNavigationItem.tsx +66 -0
- package/src/core/EntityEditView.tsx +721 -156
- package/src/core/EntitySidePanel.tsx +1 -2
- package/src/core/FireCMS.tsx +57 -53
- package/src/core/NavigationRoutes.tsx +7 -8
- package/src/core/SideDialogs.tsx +2 -1
- package/src/core/field_configs.tsx +9 -10
- package/src/core/index.tsx +3 -4
- package/src/form/PropertyFieldBinding.tsx +74 -35
- package/src/form/components/CustomIdField.tsx +6 -2
- package/src/form/components/FieldHelperText.tsx +4 -4
- package/src/form/components/LabelWithIcon.tsx +27 -19
- package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
- package/src/form/components/StorageItemPreview.tsx +22 -12
- package/src/form/components/StorageUploadProgress.tsx +3 -4
- package/src/form/components/index.tsx +1 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +29 -17
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +45 -35
- package/src/form/field_bindings/BlockFieldBinding.tsx +53 -33
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +17 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
- package/src/form/field_bindings/MapFieldBinding.tsx +67 -48
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -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 +52 -34
- package/src/form/field_bindings/SelectFieldBinding.tsx +21 -13
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +37 -47
- package/src/form/field_bindings/SwitchFieldBinding.tsx +28 -24
- package/src/form/field_bindings/TextFieldBinding.tsx +26 -23
- package/src/form/index.tsx +4 -9
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +1 -17
- package/src/hooks/data/delete.ts +6 -5
- package/src/hooks/data/save.ts +12 -8
- package/src/hooks/data/useCollectionFetch.tsx +2 -2
- package/src/hooks/data/useDataSource.tsx +11 -3
- package/src/hooks/data/useEntityFetch.tsx +5 -5
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useAuthController.tsx +1 -1
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/hooks/useBuildModeController.tsx +11 -5
- package/src/hooks/useBuildNavigationController.tsx +92 -34
- package/src/hooks/useFireCMSContext.tsx +5 -5
- package/src/hooks/useProjectLog.tsx +32 -10
- package/src/hooks/useResolvedNavigationFrom.tsx +6 -6
- package/src/hooks/useValidateAuthenticator.tsx +21 -41
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +72 -82
- package/src/internal/useBuildSideDialogsController.tsx +1 -0
- package/src/internal/useBuildSideEntityController.tsx +102 -22
- package/src/internal/useUnsavedChangesDialog.tsx +5 -3
- package/src/preview/PropertyPreview.tsx +11 -18
- 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 -35
- package/src/preview/components/ReferencePreview.tsx +23 -34
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +44 -11
- 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 +9 -9
- 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/types/auth.tsx +9 -13
- package/src/types/collections.ts +62 -20
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +60 -43
- package/src/types/entities.ts +11 -1
- package/src/types/entity_actions.tsx +20 -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 +69 -45
- 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 +7 -7
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +24 -14
- package/src/types/properties.ts +39 -22
- package/src/types/property_config.tsx +0 -2
- package/src/types/side_dialogs_controller.tsx +13 -0
- package/src/types/storage.ts +94 -3
- package/src/types/user.ts +2 -0
- package/src/util/builders.ts +6 -6
- package/src/util/entities.ts +6 -5
- package/src/util/enums.ts +1 -1
- package/src/util/icon_list.ts +15 -10
- package/src/util/icon_synonyms.ts +3 -99
- package/src/util/icons.tsx +17 -7
- package/src/util/index.ts +1 -0
- package/src/util/make_properties_editable.ts +13 -5
- package/src/util/navigation_utils.ts +6 -6
- package/src/util/objects.ts +45 -28
- 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 +3 -0
- package/src/util/resolutions.ts +79 -46
- package/src/util/storage.ts +79 -21
- package/src/util/strings.ts +2 -2
- package/src/util/useStorageUploadController.tsx +34 -8
- package/src/util/useTraceUpdate.tsx +1 -0
- 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/EntityForm.d.ts +0 -77
- 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/core/Drawer.tsx +0 -191
- package/src/core/Scaffold.tsx +0 -281
- package/src/core/SideEntityView.tsx +0 -38
- package/src/form/EntityForm.tsx +0 -728
- 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
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This context represents the state of the app in terms of layout.
|
|
5
|
+
* @group Core
|
|
6
|
+
*/
|
|
7
|
+
export type AppState = {
|
|
8
|
+
hasDrawer: boolean,
|
|
9
|
+
drawerHovered: boolean,
|
|
10
|
+
drawerOpen: boolean,
|
|
11
|
+
openDrawer: () => void,
|
|
12
|
+
closeDrawer: () => void,
|
|
13
|
+
autoOpenDrawer?: boolean,
|
|
14
|
+
logo?: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const AppContext = React.createContext<AppState>({
|
|
18
|
+
hasDrawer: false,
|
|
19
|
+
drawerHovered: false,
|
|
20
|
+
drawerOpen: false,
|
|
21
|
+
openDrawer: () => {
|
|
22
|
+
throw new Error("openDrawer not implemented");
|
|
23
|
+
},
|
|
24
|
+
closeDrawer: () => {
|
|
25
|
+
throw new Error("closeDrawer not implemented");
|
|
26
|
+
},
|
|
27
|
+
autoOpenDrawer: false
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export function useApp() {
|
|
31
|
+
return React.useContext(AppContext);
|
|
32
|
+
}
|
|
@@ -6,9 +6,12 @@ import { getHashValue } from "../util";
|
|
|
6
6
|
import {
|
|
7
7
|
AddIcon,
|
|
8
8
|
Button,
|
|
9
|
+
cls,
|
|
9
10
|
ContentCopyIcon,
|
|
10
|
-
|
|
11
|
+
HandleIcon,
|
|
11
12
|
IconButton,
|
|
13
|
+
KeyboardArrowDownIcon,
|
|
14
|
+
KeyboardArrowUpIcon,
|
|
12
15
|
Menu,
|
|
13
16
|
MenuItem,
|
|
14
17
|
RemoveIcon,
|
|
@@ -16,17 +19,28 @@ import {
|
|
|
16
19
|
useOutsideAlerter
|
|
17
20
|
} from "@firecms/ui";
|
|
18
21
|
|
|
19
|
-
|
|
22
|
+
export type ArrayEntryParams = {
|
|
23
|
+
index: number,
|
|
24
|
+
internalId: number,
|
|
25
|
+
isDragging: boolean,
|
|
26
|
+
storedProps?: object,
|
|
27
|
+
storeProps: (props: object) => void
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export type ArrayEntryBuilder = (params: ArrayEntryParams) => React.ReactNode;
|
|
31
|
+
|
|
32
|
+
export interface ArrayContainerProps<T> {
|
|
20
33
|
droppableId: string;
|
|
21
34
|
value: T[];
|
|
22
35
|
addLabel: string;
|
|
23
|
-
buildEntry:
|
|
36
|
+
buildEntry: ArrayEntryBuilder;
|
|
24
37
|
disabled?: boolean;
|
|
25
38
|
size?: "small" | "medium";
|
|
26
39
|
onInternalIdAdded?: (id: number) => void;
|
|
27
40
|
includeAddButton?: boolean;
|
|
28
41
|
newDefaultEntry: T;
|
|
29
|
-
onValueChange: (value: T[]) => void
|
|
42
|
+
onValueChange: (value: T[]) => void,
|
|
43
|
+
className?: string;
|
|
30
44
|
}
|
|
31
45
|
|
|
32
46
|
const buildIdsMap = (value: any[]) =>
|
|
@@ -52,7 +66,8 @@ export function ArrayContainer<T>({
|
|
|
52
66
|
onInternalIdAdded,
|
|
53
67
|
includeAddButton,
|
|
54
68
|
newDefaultEntry,
|
|
55
|
-
onValueChange
|
|
69
|
+
onValueChange,
|
|
70
|
+
className
|
|
56
71
|
}: ArrayContainerProps<T>) {
|
|
57
72
|
|
|
58
73
|
const hasValue = value && Array.isArray(value) && value.length > 0;
|
|
@@ -65,6 +80,12 @@ export function ArrayContainer<T>({
|
|
|
65
80
|
? Object.values(internalIdsRef.current)
|
|
66
81
|
: []);
|
|
67
82
|
|
|
83
|
+
const itemCustomPropsRef = useRef<Record<number, object>>({});
|
|
84
|
+
|
|
85
|
+
const updateItemCustomProps = useCallback((internalId: number, customProps: object) => {
|
|
86
|
+
itemCustomPropsRef.current[internalId] = customProps;
|
|
87
|
+
}, []);
|
|
88
|
+
|
|
68
89
|
useEffect(() => {
|
|
69
90
|
if (hasValue && value && value.length !== internalIds.length) {
|
|
70
91
|
const newInternalIds = value.map((v, index) => {
|
|
@@ -113,6 +134,18 @@ export function ArrayContainer<T>({
|
|
|
113
134
|
onValueChange([...value.slice(0, index + 1), copyingItem, ...value.slice(index + 1)]);
|
|
114
135
|
};
|
|
115
136
|
|
|
137
|
+
const addInIndex = (index: number) => {
|
|
138
|
+
const id = getRandomId();
|
|
139
|
+
const newIds: number[] = [
|
|
140
|
+
...internalIds.splice(0, index),
|
|
141
|
+
id,
|
|
142
|
+
...internalIds.slice(index)];
|
|
143
|
+
if (onInternalIdAdded)
|
|
144
|
+
onInternalIdAdded(id);
|
|
145
|
+
setInternalIds(newIds);
|
|
146
|
+
onValueChange([...value.slice(0, index), newDefaultEntry, ...value.slice(index)]);
|
|
147
|
+
}
|
|
148
|
+
|
|
116
149
|
const onDragEnd = (result: any) => {
|
|
117
150
|
// dropped outside the list
|
|
118
151
|
if (!result.destination) {
|
|
@@ -147,12 +180,16 @@ export function ArrayContainer<T>({
|
|
|
147
180
|
remove={remove}
|
|
148
181
|
copy={copy}
|
|
149
182
|
isDragging={snapshot.isDragging}
|
|
183
|
+
storedProps={itemCustomPropsRef.current[internalId]}
|
|
184
|
+
updateItemCustomProps={updateItemCustomProps}
|
|
185
|
+
addInIndex={addInIndex}
|
|
150
186
|
/>
|
|
151
187
|
);
|
|
152
188
|
}}
|
|
153
189
|
>
|
|
154
190
|
{(droppableProvided, droppableSnapshot) => (
|
|
155
191
|
<div
|
|
192
|
+
className={cls("space-y-1", className)}
|
|
156
193
|
{...droppableProvided.droppableProps}
|
|
157
194
|
ref={droppableProvided.innerRef}>
|
|
158
195
|
{hasValue && internalIds.map((internalId: number, index: number) => {
|
|
@@ -173,6 +210,9 @@ export function ArrayContainer<T>({
|
|
|
173
210
|
remove={remove}
|
|
174
211
|
copy={copy}
|
|
175
212
|
isDragging={snapshot.isDragging}
|
|
213
|
+
storedProps={itemCustomPropsRef.current[internalId]}
|
|
214
|
+
updateItemCustomProps={updateItemCustomProps}
|
|
215
|
+
addInIndex={addInIndex}
|
|
176
216
|
/>
|
|
177
217
|
)}
|
|
178
218
|
</Draggable>
|
|
@@ -205,10 +245,13 @@ type ArrayContainerItemProps = {
|
|
|
205
245
|
internalId: number,
|
|
206
246
|
size?: "small" | "medium",
|
|
207
247
|
disabled: boolean,
|
|
208
|
-
buildEntry:
|
|
248
|
+
buildEntry: ArrayEntryBuilder,
|
|
209
249
|
remove: (index: number) => void,
|
|
210
250
|
copy: (index: number) => void,
|
|
251
|
+
addInIndex?: (index: number) => void,
|
|
211
252
|
isDragging: boolean,
|
|
253
|
+
storedProps?: object,
|
|
254
|
+
updateItemCustomProps: (internalId: number, props: object) => void
|
|
212
255
|
};
|
|
213
256
|
|
|
214
257
|
export function ArrayContainerItem({
|
|
@@ -219,41 +262,44 @@ export function ArrayContainerItem({
|
|
|
219
262
|
disabled,
|
|
220
263
|
buildEntry,
|
|
221
264
|
remove,
|
|
265
|
+
addInIndex,
|
|
222
266
|
copy,
|
|
223
|
-
isDragging
|
|
267
|
+
isDragging,
|
|
268
|
+
storedProps,
|
|
269
|
+
updateItemCustomProps
|
|
224
270
|
}: ArrayContainerItemProps) {
|
|
225
271
|
|
|
226
|
-
const [onHover, setOnHover] = React.useState(false);
|
|
227
|
-
const setOnHoverTrue = useCallback(() => setOnHover(true), []);
|
|
228
|
-
const setOnHoverFalse = useCallback(() => setOnHover(false), []);
|
|
229
|
-
|
|
230
272
|
return <div
|
|
231
|
-
onMouseEnter={setOnHoverTrue}
|
|
232
|
-
onMouseMove={setOnHoverTrue}
|
|
233
|
-
onMouseLeave={setOnHoverFalse}
|
|
234
273
|
ref={provided.innerRef}
|
|
235
274
|
{...provided.draggableProps}
|
|
236
275
|
style={provided.draggableProps.style}
|
|
237
276
|
className={`${
|
|
238
|
-
|
|
239
|
-
}
|
|
277
|
+
!isDragging ? "hover:bg-surface-accent-50 dark:hover:bg-surface-800 dark:hover:bg-opacity-20" : ""
|
|
278
|
+
} rounded-md opacity-100`}
|
|
240
279
|
>
|
|
241
280
|
<div
|
|
242
281
|
className="flex items-start">
|
|
243
|
-
<div
|
|
244
|
-
|
|
282
|
+
<div
|
|
283
|
+
className="flex-grow w-[calc(100%-48px)] text-text-primary dark:text-text-primary-dark">
|
|
284
|
+
{buildEntry({
|
|
285
|
+
index,
|
|
286
|
+
internalId,
|
|
287
|
+
isDragging,
|
|
288
|
+
storedProps,
|
|
289
|
+
storeProps: (props: object) => updateItemCustomProps(internalId, props)
|
|
290
|
+
})}
|
|
245
291
|
</div>
|
|
246
292
|
<ArrayItemOptions direction={size === "small" ? "row" : "column"}
|
|
247
293
|
disabled={disabled}
|
|
248
294
|
remove={remove}
|
|
249
295
|
index={index}
|
|
250
296
|
provided={provided}
|
|
297
|
+
addInIndex={addInIndex}
|
|
251
298
|
copy={copy}/>
|
|
252
299
|
</div>
|
|
253
300
|
</div>;
|
|
254
301
|
}
|
|
255
302
|
|
|
256
|
-
|
|
257
303
|
export function ArrayItemOptions({
|
|
258
304
|
direction,
|
|
259
305
|
disabled,
|
|
@@ -261,13 +307,15 @@ export function ArrayItemOptions({
|
|
|
261
307
|
index,
|
|
262
308
|
provided,
|
|
263
309
|
copy,
|
|
310
|
+
addInIndex
|
|
264
311
|
}: {
|
|
265
312
|
direction?: "row" | "column",
|
|
266
313
|
disabled: boolean,
|
|
267
314
|
remove: (index: number) => void,
|
|
268
315
|
index: number,
|
|
269
316
|
provided: any,
|
|
270
|
-
copy: (index: number) => void
|
|
317
|
+
copy: (index: number) => void,
|
|
318
|
+
addInIndex?: (index: number) => void
|
|
271
319
|
}) {
|
|
272
320
|
|
|
273
321
|
const [menuOpen, setMenuOpen] = useState(false);
|
|
@@ -275,7 +323,7 @@ export function ArrayItemOptions({
|
|
|
275
323
|
const iconRef = React.useRef<HTMLDivElement>(null);
|
|
276
324
|
useOutsideAlerter(iconRef, () => setMenuOpen(false));
|
|
277
325
|
|
|
278
|
-
return <div className={`pl-2 pt-1 pb-
|
|
326
|
+
return <div className={`pl-2 pt-1 pb-1 flex ${direction === "row" ? "flex-row-reverse" : "flex-col"} items-center`}
|
|
279
327
|
ref={iconRef}
|
|
280
328
|
{...provided.dragHandleProps}>
|
|
281
329
|
<Tooltip
|
|
@@ -283,11 +331,13 @@ export function ArrayItemOptions({
|
|
|
283
331
|
open={menuOpen ? false : undefined}
|
|
284
332
|
side={direction === "column" ? "left" : undefined}
|
|
285
333
|
title="Drag to move. Click for more options">
|
|
286
|
-
|
|
287
334
|
<IconButton
|
|
288
335
|
size="small"
|
|
289
336
|
disabled={disabled}
|
|
290
|
-
onClick={() =>
|
|
337
|
+
onClick={(e) => {
|
|
338
|
+
e.preventDefault();
|
|
339
|
+
setMenuOpen(true);
|
|
340
|
+
}}
|
|
291
341
|
onDragStart={(e: any) => {
|
|
292
342
|
setMenuOpen(false);
|
|
293
343
|
}}
|
|
@@ -298,7 +348,7 @@ export function ArrayItemOptions({
|
|
|
298
348
|
<Menu
|
|
299
349
|
portalContainer={iconRef.current}
|
|
300
350
|
open={menuOpen}
|
|
301
|
-
trigger={<div/>}>
|
|
351
|
+
trigger={<div tabIndex={-1}/>}>
|
|
302
352
|
|
|
303
353
|
<MenuItem dense onClick={(e) => {
|
|
304
354
|
setMenuOpen(false);
|
|
@@ -315,8 +365,25 @@ export function ArrayItemOptions({
|
|
|
315
365
|
Copy
|
|
316
366
|
</MenuItem>
|
|
317
367
|
|
|
318
|
-
|
|
368
|
+
{addInIndex && <MenuItem dense
|
|
369
|
+
onClick={() => {
|
|
370
|
+
setMenuOpen(false);
|
|
371
|
+
addInIndex(index);
|
|
372
|
+
}}>
|
|
373
|
+
<KeyboardArrowUpIcon size={"small"}/>
|
|
374
|
+
Add on top
|
|
375
|
+
</MenuItem>}
|
|
376
|
+
|
|
377
|
+
{addInIndex && <MenuItem dense
|
|
378
|
+
onClick={() => {
|
|
379
|
+
setMenuOpen(false);
|
|
380
|
+
addInIndex(index + 1);
|
|
381
|
+
}}>
|
|
382
|
+
<KeyboardArrowDownIcon size={"small"}/>
|
|
383
|
+
Add below
|
|
384
|
+
</MenuItem>}
|
|
319
385
|
|
|
386
|
+
</Menu>
|
|
320
387
|
</Tooltip>
|
|
321
388
|
|
|
322
389
|
</div>;
|
|
@@ -5,7 +5,7 @@ import { CircularProgress, CircularProgressProps, Typography } from "@firecms/ui
|
|
|
5
5
|
*
|
|
6
6
|
* @param text
|
|
7
7
|
* @param props
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
* @ignore
|
|
10
10
|
*/
|
|
11
11
|
export function CircularProgressCenter({ text, ...props }: CircularProgressProps & {
|
|
@@ -13,7 +13,7 @@ export function CircularProgressCenter({ text, ...props }: CircularProgressProps
|
|
|
13
13
|
}) {
|
|
14
14
|
return (
|
|
15
15
|
<div
|
|
16
|
-
className="flex w-full h-screen max-h-full max-w-full bg-
|
|
16
|
+
className="flex w-full h-screen max-h-full max-w-full bg-surface-50 dark:bg-surface-900 gap-4">
|
|
17
17
|
<div className="m-auto flex flex-col gap-2 items-center">
|
|
18
18
|
<CircularProgress {...props}/>
|
|
19
19
|
{text && <Typography
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Button, FilterListOffIcon } from "@firecms/ui";
|
|
2
|
+
import { EntityTableController } from "../types";
|
|
3
|
+
|
|
4
|
+
export function ClearFilterSortButton({
|
|
5
|
+
tableController,
|
|
6
|
+
enabled
|
|
7
|
+
}: {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
tableController: EntityTableController
|
|
10
|
+
}) {
|
|
11
|
+
if (!enabled) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const filterIsSet = !!tableController.filterValues && Object.keys(tableController.filterValues).length > 0;
|
|
16
|
+
const sortIsSet = !!tableController.sortBy && tableController.sortBy.length > 0;
|
|
17
|
+
|
|
18
|
+
if ((filterIsSet || sortIsSet) && (tableController.clearFilter || tableController.setSortBy)) {
|
|
19
|
+
let label;
|
|
20
|
+
if (filterIsSet && sortIsSet) {
|
|
21
|
+
label = "Clear filter and sort";
|
|
22
|
+
} else if (filterIsSet) {
|
|
23
|
+
label = "Clear filter";
|
|
24
|
+
} else {
|
|
25
|
+
label = "Clear sort";
|
|
26
|
+
}
|
|
27
|
+
return <Button
|
|
28
|
+
variant={"outlined"}
|
|
29
|
+
className="h-fit-content"
|
|
30
|
+
aria-label="filter clear"
|
|
31
|
+
onClick={() => {
|
|
32
|
+
tableController.clearFilter?.();
|
|
33
|
+
tableController.setSortBy?.(undefined);
|
|
34
|
+
}}
|
|
35
|
+
size={"small"}>
|
|
36
|
+
<FilterListOffIcon/>
|
|
37
|
+
{label}
|
|
38
|
+
</Button>
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
|
|
3
|
-
import { Button, Dialog, DialogActions, DialogContent, LoadingButton, Typography } from "@firecms/ui";
|
|
3
|
+
import { Button, Dialog, DialogActions, DialogContent, DialogTitle, LoadingButton, Typography } from "@firecms/ui";
|
|
4
4
|
|
|
5
|
-
export function
|
|
5
|
+
export function ConfirmationDialog({
|
|
6
6
|
open,
|
|
7
7
|
onAccept,
|
|
8
8
|
onCancel,
|
|
@@ -22,8 +22,8 @@ export function DeleteConfirmationDialog({
|
|
|
22
22
|
open={open}
|
|
23
23
|
onOpenChange={(open) => !open ? onCancel() : undefined}
|
|
24
24
|
>
|
|
25
|
+
<DialogTitle variant={"h6"} className={"mb-2"}>{title}</DialogTitle>
|
|
25
26
|
<DialogContent>
|
|
26
|
-
<Typography variant={"h6"} className={"mb-2"}>{title}</Typography>
|
|
27
27
|
{body}
|
|
28
28
|
</DialogContent>
|
|
29
29
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Entity, EntityCallbacks, EntityCollection } from "../types";
|
|
2
2
|
import React, { useCallback, useMemo, useState } from "react";
|
|
3
|
-
import { Button, CircularProgress, Dialog, DialogActions, DialogContent,
|
|
3
|
+
import { Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle } from "@firecms/ui";
|
|
4
4
|
import {
|
|
5
5
|
deleteEntityWithCallbacks,
|
|
6
6
|
useCustomizationController,
|
|
@@ -40,25 +40,17 @@ export function DeleteEntityDialog<M extends Record<string, any>>({
|
|
|
40
40
|
const snackbarController = useSnackbarController();
|
|
41
41
|
const [loading, setLoading] = useState(false);
|
|
42
42
|
|
|
43
|
-
const [entityOrEntities, setUsedEntityOrEntities] = React.useState<Entity<M> | Entity<M>[]>();
|
|
44
|
-
|
|
45
|
-
const [multipleEntities, setMultipleEntities] = React.useState<boolean>();
|
|
46
43
|
const context = useFireCMSContext();
|
|
44
|
+
const entityOrEntities = Array.isArray(entityOrEntitiesToDelete) && entityOrEntitiesToDelete.length === 1
|
|
45
|
+
? entityOrEntitiesToDelete[0]
|
|
46
|
+
: entityOrEntitiesToDelete;
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
if (entityOrEntitiesToDelete) {
|
|
50
|
-
const revisedEntityOrEntities = Array.isArray(entityOrEntitiesToDelete) && entityOrEntitiesToDelete.length === 1
|
|
51
|
-
? entityOrEntitiesToDelete[0]
|
|
52
|
-
: entityOrEntitiesToDelete;
|
|
53
|
-
setUsedEntityOrEntities(revisedEntityOrEntities);
|
|
54
|
-
setMultipleEntities(Array.isArray(revisedEntityOrEntities));
|
|
55
|
-
}
|
|
56
|
-
}, [entityOrEntitiesToDelete]);
|
|
48
|
+
const multipleEntities = Array.isArray(entityOrEntities);
|
|
57
49
|
|
|
58
50
|
const resolvedCollection = useMemo(() => resolveCollection<M>({
|
|
59
51
|
collection,
|
|
60
52
|
path,
|
|
61
|
-
|
|
53
|
+
propertyConfigs: customizationController.propertyConfigs
|
|
62
54
|
}), [collection, path]);
|
|
63
55
|
|
|
64
56
|
const handleCancel = useCallback(() => {
|
|
@@ -181,11 +173,10 @@ export function DeleteEntityDialog<M extends Record<string, any>>({
|
|
|
181
173
|
open={open}
|
|
182
174
|
onOpenChange={(open) => !open ? onClose() : undefined}
|
|
183
175
|
>
|
|
176
|
+
<DialogTitle id="delete-dialog-title">
|
|
177
|
+
{dialogTitle}
|
|
178
|
+
</DialogTitle>
|
|
184
179
|
<DialogContent fullHeight={true}>
|
|
185
|
-
<Typography variant={"subtitle2"} className={"p-4"}>
|
|
186
|
-
{dialogTitle}
|
|
187
|
-
</Typography>
|
|
188
|
-
|
|
189
180
|
{!multipleEntities && <div className={"p-4"}>{content}</div>}
|
|
190
181
|
</DialogContent>
|
|
191
182
|
<DialogActions>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { MouseEvent, useCallback } from "react";
|
|
2
2
|
|
|
3
3
|
import { CollectionSize, Entity, EntityAction, EntityCollection, SelectionController } from "../../types";
|
|
4
|
-
import { Checkbox,
|
|
4
|
+
import { Checkbox, cls, IconButton, Menu, MenuItem, MoreVertIcon, Skeleton, Tooltip } from "@firecms/ui";
|
|
5
5
|
import { useFireCMSContext, useLargeLayout } from "../../hooks";
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -14,7 +14,6 @@ import { useFireCMSContext, useLargeLayout } from "../../hooks";
|
|
|
14
14
|
* @param size
|
|
15
15
|
* @param toggleEntitySelection
|
|
16
16
|
* @param hideId
|
|
17
|
-
* @constructor
|
|
18
17
|
*
|
|
19
18
|
* @group Collection components
|
|
20
19
|
*/
|
|
@@ -56,12 +55,7 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
|
|
|
56
55
|
const context = useFireCMSContext();
|
|
57
56
|
|
|
58
57
|
const onCheckedChange = useCallback((checked: boolean) => {
|
|
59
|
-
selectionController?.toggleEntitySelection(entity);
|
|
60
|
-
}, [entity, selectionController?.toggleEntitySelection]);
|
|
61
|
-
|
|
62
|
-
const onClick = useCallback((event: MouseEvent) => {
|
|
63
|
-
event.stopPropagation();
|
|
64
|
-
selectionController?.toggleEntitySelection(entity);
|
|
58
|
+
selectionController?.toggleEntitySelection(entity, checked);
|
|
65
59
|
}, [entity, selectionController?.toggleEntitySelection]);
|
|
66
60
|
|
|
67
61
|
const hasActions = actions.length > 0;
|
|
@@ -71,9 +65,8 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
|
|
|
71
65
|
const uncollapsedActions = actions.filter(a => a.collapsed === false);
|
|
72
66
|
return (
|
|
73
67
|
<div
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
"h-full flex items-center justify-center flex-col bg-gray-50 dark:bg-gray-900 bg-opacity-90 dark:bg-opacity-90 z-10",
|
|
68
|
+
className={cls(
|
|
69
|
+
"h-full flex items-center justify-center flex-col bg-surface-50 dark:bg-surface-900 bg-opacity-90 dark:bg-opacity-90 z-10",
|
|
77
70
|
frozen ? "sticky left-0" : ""
|
|
78
71
|
)}
|
|
79
72
|
style={{
|
|
@@ -87,7 +80,9 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
|
|
|
87
80
|
<div className="w-34 flex justify-center">
|
|
88
81
|
|
|
89
82
|
{uncollapsedActions.map((action, index) => (
|
|
90
|
-
<Tooltip key={index}
|
|
83
|
+
<Tooltip key={index}
|
|
84
|
+
title={action.name}
|
|
85
|
+
asChild={true}>
|
|
91
86
|
<IconButton
|
|
92
87
|
onClick={(event: MouseEvent) => {
|
|
93
88
|
event.stopPropagation();
|
|
@@ -149,16 +144,14 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
|
|
|
149
144
|
</div>}
|
|
150
145
|
|
|
151
146
|
{!hideId && size !== "xs" && (
|
|
152
|
-
<div
|
|
147
|
+
<div
|
|
148
|
+
className="w-[138px] text-center overflow-hidden truncate font-mono text-xs text-text-secondary dark:text-text-secondary-dark max-w-full text-ellipsis px-2"
|
|
149
|
+
onClick={(event) => {
|
|
150
|
+
event.stopPropagation();
|
|
151
|
+
}}>
|
|
153
152
|
|
|
154
153
|
{entity
|
|
155
|
-
?
|
|
156
|
-
onClick={(event) => {
|
|
157
|
-
event.stopPropagation();
|
|
158
|
-
}}
|
|
159
|
-
className={"font-mono select-all"}
|
|
160
|
-
variant={"caption"}
|
|
161
|
-
color={"secondary"}> {entity.id} </Typography>
|
|
154
|
+
? entity.id
|
|
162
155
|
: <Skeleton/>
|
|
163
156
|
}
|
|
164
157
|
</div>
|
|
@@ -5,7 +5,6 @@ import { ErrorBoundary } from "../ErrorBoundary";
|
|
|
5
5
|
import { useFireCMSContext, useLargeLayout } from "../../hooks";
|
|
6
6
|
import { CellRendererParams, VirtualTableColumn } from "../VirtualTable";
|
|
7
7
|
import { getValueInPath } from "../../util";
|
|
8
|
-
import { getRowHeight } from "../VirtualTable/common";
|
|
9
8
|
import { EntityCollectionRowActions } from "./EntityCollectionRowActions";
|
|
10
9
|
import { CollectionTableToolbar } from "./internal/CollectionTableToolbar";
|
|
11
10
|
import { EntityCollectionTableProps } from "./EntityCollectionTableProps";
|
|
@@ -15,7 +14,8 @@ import { renderSkeletonText } from "../../preview";
|
|
|
15
14
|
import { propertiesToColumns } from "./column_utils";
|
|
16
15
|
import { ErrorView } from "../ErrorView";
|
|
17
16
|
import { SelectableTable } from "../SelectableTable/SelectableTable";
|
|
18
|
-
|
|
17
|
+
import { cls } from "@firecms/ui";
|
|
18
|
+
import { getRowHeight } from "../common/table_height";
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* This component is in charge of rendering a collection table with a high
|
|
@@ -41,8 +41,10 @@ import { SelectableTable } from "../SelectableTable/SelectableTable";
|
|
|
41
41
|
* @see VirtualTable
|
|
42
42
|
* @group Components
|
|
43
43
|
*/
|
|
44
|
-
export const EntityCollectionTable = function EntityCollectionTable<M extends Record<string, any>,
|
|
44
|
+
export const EntityCollectionTable = function EntityCollectionTable<M extends Record<string, any>, USER extends User>
|
|
45
45
|
({
|
|
46
|
+
className,
|
|
47
|
+
style,
|
|
46
48
|
forceFilter,
|
|
47
49
|
actionsStart,
|
|
48
50
|
actions,
|
|
@@ -73,23 +75,21 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
73
75
|
emptyComponent,
|
|
74
76
|
getIdColumnWidth,
|
|
75
77
|
onTextSearchClick,
|
|
76
|
-
textSearchLoading
|
|
78
|
+
textSearchLoading,
|
|
79
|
+
enablePopupIcon
|
|
77
80
|
}: EntityCollectionTableProps<M>) {
|
|
78
81
|
|
|
79
82
|
const ref = useRef<HTMLDivElement>(null);
|
|
80
83
|
|
|
81
84
|
const largeLayout = useLargeLayout();
|
|
82
|
-
const disabledFilterChange = Boolean(forceFilter);
|
|
83
85
|
const selectedEntities = (selectionController?.selectedEntities?.length > 0 ? selectionController?.selectedEntities : highlightedEntities)?.filter(Boolean);
|
|
84
86
|
|
|
85
|
-
const context: FireCMSContext<
|
|
87
|
+
const context: FireCMSContext<USER> = useFireCMSContext();
|
|
86
88
|
|
|
87
89
|
const [size, setSize] = React.useState<CollectionSize>(defaultSize ?? "m");
|
|
88
90
|
|
|
89
91
|
const selectedEntityIds = selectedEntities?.map(e => e.id);
|
|
90
92
|
|
|
91
|
-
const filterIsSet = !!tableController.filterValues && Object.keys(tableController.filterValues).length > 0;
|
|
92
|
-
|
|
93
93
|
const updateSize = useCallback((size: CollectionSize) => {
|
|
94
94
|
if (onSizeChanged)
|
|
95
95
|
onSizeChanged(size);
|
|
@@ -98,12 +98,12 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
98
98
|
|
|
99
99
|
const onTextSearch = useCallback((newSearchString?: string) => tableController.setSearchString?.(newSearchString), []);
|
|
100
100
|
|
|
101
|
-
const additionalFieldsMap: Record<string, AdditionalFieldDelegate<M,
|
|
101
|
+
const additionalFieldsMap: Record<string, AdditionalFieldDelegate<M, USER>> = useMemo(() => {
|
|
102
102
|
return (additionalFields
|
|
103
103
|
? additionalFields
|
|
104
104
|
.map((aC) => ({ [aC.key]: aC as AdditionalFieldDelegate<M, any> }))
|
|
105
105
|
.reduce((a, b) => ({ ...a, ...b }), {})
|
|
106
|
-
: {}) as Record<string, AdditionalFieldDelegate<M,
|
|
106
|
+
: {}) as Record<string, AdditionalFieldDelegate<M, USER>>;
|
|
107
107
|
}, [additionalFields]);
|
|
108
108
|
|
|
109
109
|
const customFieldValidator: CustomFieldValidator | undefined = uniqueFieldValidator;
|
|
@@ -120,10 +120,8 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
120
120
|
const propertyKey = column.key;
|
|
121
121
|
|
|
122
122
|
let disabled = column.custom?.disabled;
|
|
123
|
-
const propertyValue = entity.values ? getValueInPath(entity.values, propertyKey) : undefined;
|
|
124
123
|
const property = getPropertyFor?.({
|
|
125
124
|
propertyKey,
|
|
126
|
-
propertyValue,
|
|
127
125
|
entity
|
|
128
126
|
}) ?? column.custom.resolvedProperty;
|
|
129
127
|
if (!property?.disabled) {
|
|
@@ -150,6 +148,7 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
150
148
|
height={getRowHeight(size)}
|
|
151
149
|
entity={entity}
|
|
152
150
|
disabled={disabled}
|
|
151
|
+
enablePopupIcon={enablePopupIcon}
|
|
153
152
|
path={entity.path}/>
|
|
154
153
|
: renderSkeletonText()
|
|
155
154
|
}
|
|
@@ -177,9 +176,14 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
177
176
|
throw new Error("When using additional fields you need to provide a Builder or a value");
|
|
178
177
|
}
|
|
179
178
|
|
|
180
|
-
const child = Builder
|
|
179
|
+
const child: React.ReactNode = Builder
|
|
181
180
|
? <Builder entity={entity} context={context}/>
|
|
182
|
-
: <>
|
|
181
|
+
: <>
|
|
182
|
+
{additionalField.value?.({
|
|
183
|
+
entity,
|
|
184
|
+
context
|
|
185
|
+
})?.toString()}
|
|
186
|
+
</>;
|
|
183
187
|
|
|
184
188
|
return (
|
|
185
189
|
<EntityTableCell
|
|
@@ -207,7 +211,6 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
207
211
|
properties,
|
|
208
212
|
sortable,
|
|
209
213
|
forceFilter,
|
|
210
|
-
disabledFilter: disabledFilterChange,
|
|
211
214
|
AdditionalHeaderWidget
|
|
212
215
|
});
|
|
213
216
|
|
|
@@ -237,13 +240,15 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
237
240
|
|
|
238
241
|
const columns: VirtualTableColumn[] = [
|
|
239
242
|
idColumn,
|
|
240
|
-
...displayedColumnIds
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
243
|
+
...(displayedColumnIds
|
|
244
|
+
? displayedColumnIds
|
|
245
|
+
.map((p) => {
|
|
246
|
+
return collectionColumns.find(c => c.key === p.key);
|
|
247
|
+
}).filter(Boolean)
|
|
248
|
+
: collectionColumns) as VirtualTableColumn[]
|
|
244
249
|
];
|
|
245
250
|
|
|
246
|
-
const cellRenderer = (props: CellRendererParams<any>) => {
|
|
251
|
+
const cellRenderer = useCallback((props: CellRendererParams<any>) => {
|
|
247
252
|
const column = props.column;
|
|
248
253
|
const columns = props.columns;
|
|
249
254
|
const columnKey = column.key;
|
|
@@ -283,20 +288,18 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
283
288
|
<ErrorView error={e}/>
|
|
284
289
|
</EntityTableCell>;
|
|
285
290
|
}
|
|
286
|
-
}
|
|
291
|
+
}, [tableRowActionsBuilder, additionalCellRenderer, propertyCellRenderer, size]);
|
|
287
292
|
|
|
288
293
|
return (
|
|
289
294
|
|
|
290
295
|
<div ref={ref}
|
|
291
|
-
|
|
296
|
+
style={style}
|
|
297
|
+
className={cls("h-full w-full flex flex-col bg-white dark:bg-surface-950", className)}>
|
|
292
298
|
|
|
293
299
|
<CollectionTableToolbar
|
|
294
|
-
forceFilter={disabledFilterChange}
|
|
295
|
-
filterIsSet={filterIsSet}
|
|
296
300
|
onTextSearch={textSearchEnabled ? onTextSearch : undefined}
|
|
297
301
|
textSearchLoading={textSearchLoading}
|
|
298
302
|
onTextSearchClick={textSearchEnabled ? onTextSearchClick : undefined}
|
|
299
|
-
clearFilter={tableController.clearFilter}
|
|
300
303
|
size={size}
|
|
301
304
|
onSizeChanged={updateSize}
|
|
302
305
|
title={title}
|