@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
|
@@ -8,10 +8,10 @@ export declare function resolveCollectionPathIds(path: string, allCollections: E
|
|
|
8
8
|
/**
|
|
9
9
|
* Find the corresponding view at any depth for a given path.
|
|
10
10
|
* Note that path or segments of the paths can be collection aliases.
|
|
11
|
-
* @param
|
|
11
|
+
* @param pathOrId
|
|
12
12
|
* @param collections
|
|
13
13
|
*/
|
|
14
|
-
export declare function getCollectionByPathOrId(
|
|
14
|
+
export declare function getCollectionByPathOrId(pathOrId: string, collections: EntityCollection[]): EntityCollection | undefined;
|
|
15
15
|
/**
|
|
16
16
|
* Get the subcollection combinations from a path:
|
|
17
17
|
* "sites/es/locales" => ["sites/es/locales", "sites"]
|
package/dist/util/objects.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
export declare const pick: <T>(obj: T, ...args: any[]) => T;
|
|
2
2
|
export declare function isObject(item: any): any;
|
|
3
|
-
export declare function mergeDeep<T extends
|
|
3
|
+
export declare function mergeDeep<T extends Record<any, any>, U extends Record<any, any>>(target: T, source: U): T & U;
|
|
4
4
|
export declare function getValueInPath(o: object | undefined, path: string): any;
|
|
5
5
|
export declare function removeInPath(o: object, path: string): object | undefined;
|
|
6
6
|
export declare function removeFunctions(o: object | undefined): any;
|
|
7
7
|
export declare function getHashValue<T>(v: T): any;
|
|
8
8
|
export declare function removeUndefined(value: any, removeEmptyStrings?: boolean): any;
|
|
9
|
+
export declare function removeNulls(value: any): any;
|
|
9
10
|
export declare function isEmptyObject(obj: object): boolean;
|
|
10
11
|
export declare function removePropsIfExisting(source: any, comparison: any): any;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AuthController, Entity, EntityCollection, Permissions, User } from "../types";
|
|
2
|
-
export declare function resolvePermissions<M extends Record<string, any>,
|
|
3
|
-
export declare function canEditEntity<M extends Record<string, any>,
|
|
4
|
-
export declare function canCreateEntity<M extends Record<string, any>,
|
|
5
|
-
export declare function canDeleteEntity<M extends Record<string, any>,
|
|
2
|
+
export declare function resolvePermissions<M extends Record<string, any>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>, path: string, entity: Entity<M> | null): Permissions | undefined;
|
|
3
|
+
export declare function canEditEntity<M extends Record<string, any>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>, path: string, entity: Entity<M> | null): boolean;
|
|
4
|
+
export declare function canCreateEntity<M extends Record<string, any>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>, path: string, entity: Entity<M> | null): boolean;
|
|
5
|
+
export declare function canDeleteEntity<M extends Record<string, any>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>, path: string, entity: Entity<M> | null): boolean;
|
package/dist/util/plurals.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Returns the plural of an English word.
|
|
3
3
|
*
|
|
4
|
-
* @export
|
|
5
4
|
* @param {string} word
|
|
6
5
|
* @param {number} [amount]
|
|
7
6
|
* @returns {string}
|
|
@@ -10,7 +9,6 @@ export declare function plural(word: string, amount?: number): string;
|
|
|
10
9
|
/**
|
|
11
10
|
* Returns the singular of an English word.
|
|
12
11
|
*
|
|
13
|
-
* @export
|
|
14
12
|
* @param {string} word
|
|
15
13
|
* @param {number} [amount]
|
|
16
14
|
* @returns {string}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { EntityCollection, PropertiesOrBuilders, PropertyConfig, PropertyOrBuilder, ResolvedProperty } from "../types";
|
|
2
|
+
import { EntityCollection, PropertiesOrBuilders, PropertyConfig, PropertyOrBuilder, ResolvedProperties, ResolvedProperty } from "../types";
|
|
3
3
|
export declare function isReferenceProperty(propertyOrBuilder: PropertyOrBuilder, fields: Record<string, PropertyConfig>): boolean | null;
|
|
4
4
|
export declare function getIdIcon(size: "small" | "medium" | "large"): React.ReactNode;
|
|
5
5
|
export declare function getIconForWidget(widget: PropertyConfig | undefined, size: "small" | "medium" | "large"): import("react/jsx-runtime").JSX.Element;
|
|
6
|
-
export declare function getIconForProperty(property: PropertyOrBuilder | ResolvedProperty
|
|
6
|
+
export declare function getIconForProperty(property: PropertyOrBuilder<any> | ResolvedProperty<any>, size?: "small" | "medium" | "large", fields?: Record<string, PropertyConfig>): React.ReactNode;
|
|
7
7
|
export declare function getColorForProperty(property: PropertyOrBuilder, fields: Record<string, PropertyConfig>): string;
|
|
8
8
|
/**
|
|
9
9
|
* Get a property in a property tree from a path like
|
|
@@ -11,7 +11,7 @@ export declare function getColorForProperty(property: PropertyOrBuilder, fields:
|
|
|
11
11
|
* @param properties
|
|
12
12
|
* @param path
|
|
13
13
|
*/
|
|
14
|
-
export declare function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M
|
|
14
|
+
export declare function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M> | ResolvedProperties, path: string): PropertyOrBuilder<any, M> | undefined;
|
|
15
15
|
export declare function getResolvedPropertyInPath(properties: Record<string, ResolvedProperty>, path: string): ResolvedProperty | undefined;
|
|
16
16
|
export declare function getBracketNotation(path: string): string;
|
|
17
17
|
/**
|
|
@@ -1,58 +1,72 @@
|
|
|
1
1
|
import { ArrayProperty, CMSType, EntityCollection, EntityCustomView, EntityValues, EnumValueConfig, EnumValues, NumberProperty, PropertiesOrBuilders, PropertyConfig, PropertyOrBuilder, ResolvedArrayProperty, ResolvedEntityCollection, ResolvedNumberProperty, ResolvedProperties, ResolvedProperty, ResolvedStringProperty, StringProperty, UserConfigurationPersistence } from "../types";
|
|
2
|
-
export declare const resolveCollection: <M extends Record<string, any>>({ collection, path, entityId, values, previousValues, userConfigPersistence,
|
|
2
|
+
export declare const resolveCollection: <M extends Record<string, any>>({ collection, path, entityId, values, previousValues, userConfigPersistence, propertyConfigs, ignoreMissingFields }: {
|
|
3
3
|
collection: EntityCollection<M> | ResolvedEntityCollection<M>;
|
|
4
4
|
path: string;
|
|
5
|
-
entityId?: string
|
|
6
|
-
values?: Partial<M
|
|
7
|
-
previousValues?: Partial<M
|
|
8
|
-
userConfigPersistence?: UserConfigurationPersistence
|
|
9
|
-
|
|
5
|
+
entityId?: string;
|
|
6
|
+
values?: Partial<EntityValues<M>>;
|
|
7
|
+
previousValues?: Partial<EntityValues<M>>;
|
|
8
|
+
userConfigPersistence?: UserConfigurationPersistence;
|
|
9
|
+
propertyConfigs?: Record<string, PropertyConfig>;
|
|
10
|
+
ignoreMissingFields?: boolean;
|
|
10
11
|
}) => ResolvedEntityCollection<M>;
|
|
11
12
|
/**
|
|
12
13
|
* Resolve property builders, enums and arrays.
|
|
13
14
|
* @param propertyOrBuilder
|
|
14
15
|
* @param propertyValue
|
|
15
|
-
* @param values
|
|
16
16
|
*/
|
|
17
|
-
export declare function resolveProperty<T extends CMSType = CMSType, M extends Record<string, any> = any>({ propertyOrBuilder,
|
|
17
|
+
export declare function resolveProperty<T extends CMSType = CMSType, M extends Record<string, any> = any>({ propertyOrBuilder, fromBuilder, ignoreMissingFields, ...props }: {
|
|
18
18
|
propertyKey?: string;
|
|
19
19
|
propertyOrBuilder: PropertyOrBuilder<T, M> | ResolvedProperty<T>;
|
|
20
|
-
propertyValue?: unknown;
|
|
21
20
|
values?: Partial<M>;
|
|
22
21
|
previousValues?: Partial<M>;
|
|
23
22
|
path?: string;
|
|
24
23
|
entityId?: string;
|
|
25
24
|
index?: number;
|
|
26
25
|
fromBuilder?: boolean;
|
|
27
|
-
|
|
26
|
+
propertyConfigs?: Record<string, PropertyConfig<any>>;
|
|
27
|
+
ignoreMissingFields?: boolean;
|
|
28
28
|
}): ResolvedProperty<T> | null;
|
|
29
|
-
export declare function
|
|
29
|
+
export declare function getArrayResolvedProperties<M>({ propertyKey, propertyValue, property, ...props }: {
|
|
30
|
+
propertyValue: any;
|
|
31
|
+
propertyKey?: string;
|
|
32
|
+
property: ArrayProperty<any> | ResolvedArrayProperty<any>;
|
|
33
|
+
ignoreMissingFields: boolean;
|
|
34
|
+
values?: Partial<M>;
|
|
35
|
+
previousValues?: Partial<M>;
|
|
36
|
+
path?: string;
|
|
37
|
+
entityId?: string;
|
|
38
|
+
index?: number;
|
|
39
|
+
fromBuilder?: boolean;
|
|
40
|
+
propertyConfigs?: Record<string, PropertyConfig>;
|
|
41
|
+
}): ResolvedProperty[];
|
|
42
|
+
export declare function resolveArrayProperty<T extends any[], M>({ propertyKey, property, ignoreMissingFields, ...props }: {
|
|
30
43
|
propertyKey?: string;
|
|
31
44
|
property: ArrayProperty<T> | ResolvedArrayProperty<T>;
|
|
32
|
-
propertyValue: any;
|
|
33
45
|
values?: Partial<M>;
|
|
34
46
|
previousValues?: Partial<M>;
|
|
35
47
|
path?: string;
|
|
36
48
|
entityId?: string;
|
|
37
49
|
index?: number;
|
|
38
50
|
fromBuilder?: boolean;
|
|
39
|
-
|
|
51
|
+
propertyConfigs?: Record<string, PropertyConfig>;
|
|
52
|
+
ignoreMissingFields?: boolean;
|
|
40
53
|
}): ResolvedArrayProperty;
|
|
41
54
|
/**
|
|
42
55
|
* Resolve enums and arrays for properties
|
|
43
56
|
* @param properties
|
|
44
57
|
* @param value
|
|
45
58
|
*/
|
|
46
|
-
export declare function resolveProperties<M extends Record<string, any>>({ properties,
|
|
59
|
+
export declare function resolveProperties<M extends Record<string, any>>({ propertyKey, properties, ignoreMissingFields, ...props }: {
|
|
60
|
+
propertyKey?: string;
|
|
47
61
|
properties: PropertiesOrBuilders<M>;
|
|
48
|
-
propertyValue: unknown;
|
|
49
62
|
values?: Partial<M>;
|
|
50
63
|
previousValues?: Partial<M>;
|
|
51
64
|
path?: string;
|
|
52
65
|
entityId?: string;
|
|
53
66
|
index?: number;
|
|
54
67
|
fromBuilder?: boolean;
|
|
55
|
-
|
|
68
|
+
propertyConfigs?: Record<string, PropertyConfig>;
|
|
69
|
+
ignoreMissingFields?: boolean;
|
|
56
70
|
}): ResolvedProperties<M>;
|
|
57
71
|
/**
|
|
58
72
|
* Resolve enum aliases for a string or number property
|
package/dist/util/storage.d.ts
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
1
|
import { EntityValues, ResolvedArrayProperty, ResolvedStringProperty, StorageConfig, UploadedFileContext } from "../types";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
interface ResolveFilenameStringParams<M extends object> {
|
|
3
|
+
input: string | ((context: UploadedFileContext) => (Promise<string> | string));
|
|
4
|
+
storage: StorageConfig;
|
|
5
|
+
values: EntityValues<M>;
|
|
6
|
+
entityId: string;
|
|
7
|
+
path?: string;
|
|
8
|
+
property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
|
|
9
|
+
file: File;
|
|
10
|
+
propertyKey: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function resolveStorageFilenameString<M extends object>({ input, storage, values, entityId, path, property, file, propertyKey }: ResolveFilenameStringParams<M>): Promise<string>;
|
|
13
|
+
interface ResolveStoragePathStringParams<M extends object> {
|
|
14
|
+
input: string | ((context: UploadedFileContext) => string);
|
|
15
|
+
storage: StorageConfig;
|
|
16
|
+
values: EntityValues<M>;
|
|
17
|
+
entityId: string;
|
|
18
|
+
path?: string;
|
|
19
|
+
property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
|
|
20
|
+
file: File;
|
|
21
|
+
propertyKey: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function resolveStoragePathString<M extends object>({ input, storage, values, entityId, path, property, file, propertyKey }: ResolveStoragePathStringParams<M>): string;
|
|
24
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntityValues, ResolvedArrayProperty, ResolvedStringProperty, StorageConfig, StorageSource } from "../types";
|
|
1
|
+
import { ArrayProperty, EntityValues, ResolvedArrayProperty, ResolvedStringProperty, StorageConfig, StorageSource, StringProperty } from "../types";
|
|
2
2
|
import { PreviewSize } from "../preview";
|
|
3
3
|
/**
|
|
4
4
|
* Internal representation of an item in the storage
|
|
@@ -18,9 +18,9 @@ export declare function useStorageUploadController<M extends object>({ entityId,
|
|
|
18
18
|
entityId: string;
|
|
19
19
|
entityValues: EntityValues<M>;
|
|
20
20
|
value: string | string[] | null;
|
|
21
|
-
path
|
|
21
|
+
path?: string;
|
|
22
22
|
propertyKey: string;
|
|
23
|
-
property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
|
|
23
|
+
property: StringProperty | ArrayProperty<string[]> | ResolvedStringProperty | ResolvedArrayProperty<string[]>;
|
|
24
24
|
storageSource: StorageSource;
|
|
25
25
|
disabled: boolean;
|
|
26
26
|
onChange: (value: string | string[] | null) => void;
|
package/package.json
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@firecms/core",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "3.0.0-canary.
|
|
4
|
+
"version": "3.0.0-canary.160",
|
|
5
5
|
"description": "Awesome Firebase/Firestore-based headless open-source CMS",
|
|
6
6
|
"funding": {
|
|
7
7
|
"url": "https://github.com/sponsors/firecmsco"
|
|
8
8
|
},
|
|
9
9
|
"author": "FireCMS",
|
|
10
10
|
"license": "MIT",
|
|
11
|
-
"repository":
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/firecmsco/firecms.git",
|
|
14
|
+
"directory": "packages/firecms_core"
|
|
15
|
+
},
|
|
12
16
|
"main": "./dist/index.umd.js",
|
|
13
17
|
"module": "./dist/index.es.js",
|
|
14
18
|
"types": "./dist/index.d.ts",
|
|
@@ -46,77 +50,88 @@
|
|
|
46
50
|
"./package.json": "./package.json"
|
|
47
51
|
},
|
|
48
52
|
"dependencies": {
|
|
49
|
-
"@firecms/
|
|
50
|
-
"@firecms/
|
|
51
|
-
"@
|
|
52
|
-
"@
|
|
53
|
-
"@
|
|
53
|
+
"@firecms/editor": "^3.0.0-canary.160",
|
|
54
|
+
"@firecms/formex": "^3.0.0-canary.160",
|
|
55
|
+
"@firecms/ui": "^3.0.0-canary.159",
|
|
56
|
+
"@hello-pangea/dnd": "^17.0.0",
|
|
57
|
+
"@radix-ui/react-portal": "^1.1.2",
|
|
58
|
+
"clsx": "^2.1.1",
|
|
54
59
|
"date-fns": "^3.6.0",
|
|
60
|
+
"fuse.js": "^7.0.0",
|
|
55
61
|
"history": "^5.3.0",
|
|
56
|
-
"js-search": "^2.0.1",
|
|
57
62
|
"markdown-it": "^14.1.0",
|
|
58
63
|
"notistack": "^3.0.1",
|
|
59
64
|
"object-hash": "^3.0.0",
|
|
65
|
+
"react-dropzone": "^14.3.5",
|
|
66
|
+
"react-fast-compare": "^3.2.2",
|
|
60
67
|
"react-image-file-resizer": "^0.4.8",
|
|
61
|
-
"react-markdown-editor-lite": "^1.3.4",
|
|
62
68
|
"react-transition-group": "^4.4.5",
|
|
63
69
|
"react-use-measure": "^2.1.1",
|
|
64
70
|
"react-window": "^1.8.10",
|
|
65
|
-
"typeface-rubik": "^1.1.13",
|
|
66
71
|
"yup": "^0.32.11"
|
|
67
72
|
},
|
|
68
73
|
"peerDependencies": {
|
|
69
74
|
"firebase": "^10.5.2",
|
|
70
|
-
"react": "^18.
|
|
71
|
-
"react-dom": "^18.
|
|
72
|
-
"react-router": "^6.
|
|
73
|
-
"react-router-dom": "^6.
|
|
74
|
-
},
|
|
75
|
-
"eslintConfig": {
|
|
76
|
-
"extends": [
|
|
77
|
-
"react-app",
|
|
78
|
-
"react-app/jest"
|
|
79
|
-
]
|
|
75
|
+
"react": "^18.3.1",
|
|
76
|
+
"react-dom": "^18.3.1",
|
|
77
|
+
"react-router": "^6.28.0",
|
|
78
|
+
"react-router-dom": "^6.28.0"
|
|
80
79
|
},
|
|
81
80
|
"devDependencies": {
|
|
82
81
|
"@jest/globals": "^29.7.0",
|
|
83
|
-
"@testing-library/
|
|
84
|
-
"@testing-library/react": "^14.2.1",
|
|
82
|
+
"@testing-library/react": "^16.0.1",
|
|
85
83
|
"@testing-library/user-event": "^14.5.2",
|
|
86
|
-
"@types/jest": "^29.5.
|
|
87
|
-
"@types/node": "^20.
|
|
84
|
+
"@types/jest": "^29.5.14",
|
|
85
|
+
"@types/node": "^20.17.9",
|
|
88
86
|
"@types/object-hash": "^3.0.6",
|
|
89
|
-
"@types/react": "^18.
|
|
90
|
-
"@types/react-dom": "^18.
|
|
87
|
+
"@types/react": "^18.3.11",
|
|
88
|
+
"@types/react-dom": "^18.3.1",
|
|
91
89
|
"@types/react-measure": "^2.0.12",
|
|
92
|
-
"@
|
|
93
|
-
"
|
|
94
|
-
"@vitejs/plugin-react": "^4.2.1",
|
|
90
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
91
|
+
"babel-plugin-react-compiler": "beta",
|
|
95
92
|
"cross-env": "^7.0.3",
|
|
96
|
-
"eslint": "
|
|
97
|
-
"
|
|
98
|
-
"eslint-plugin-import": "^2.29.1",
|
|
99
|
-
"eslint-plugin-n": "^16.6.2",
|
|
100
|
-
"eslint-plugin-promise": "^6.1.1",
|
|
101
|
-
"eslint-plugin-react": "^7.34.1",
|
|
102
|
-
"eslint-plugin-react-hooks": "^4.6.0",
|
|
103
|
-
"firebase": "^10.9.0",
|
|
93
|
+
"eslint-plugin-react-compiler": "beta",
|
|
94
|
+
"firebase": "^10.14.1",
|
|
104
95
|
"jest": "^29.7.0",
|
|
105
96
|
"npm-run-all": "^4.1.5",
|
|
106
|
-
"react-router": "^6.
|
|
107
|
-
"react-router-dom": "^6.
|
|
108
|
-
"ts-jest": "^29.
|
|
97
|
+
"react-router": "^6.28.0",
|
|
98
|
+
"react-router-dom": "^6.28.0",
|
|
99
|
+
"ts-jest": "^29.2.5",
|
|
109
100
|
"ts-node": "^10.9.2",
|
|
110
|
-
"tsd": "^0.
|
|
111
|
-
"typescript": "^5.
|
|
112
|
-
"vite": "^5.
|
|
101
|
+
"tsd": "^0.31.2",
|
|
102
|
+
"typescript": "^5.7.2",
|
|
103
|
+
"vite": "^5.4.11"
|
|
113
104
|
},
|
|
114
105
|
"files": [
|
|
115
106
|
"dist",
|
|
116
107
|
"src"
|
|
117
108
|
],
|
|
118
|
-
"gitHead": "
|
|
109
|
+
"gitHead": "840f2733672a90a6a56aed89259eaa5365589512",
|
|
119
110
|
"publishConfig": {
|
|
120
111
|
"access": "public"
|
|
112
|
+
},
|
|
113
|
+
"eslintConfig": {
|
|
114
|
+
"extends": [
|
|
115
|
+
"react-app",
|
|
116
|
+
"react-app/jest"
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
"jest": {
|
|
120
|
+
"transform": {
|
|
121
|
+
"^.+\\.tsx?$": "ts-jest"
|
|
122
|
+
},
|
|
123
|
+
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
|
|
124
|
+
"moduleFileExtensions": [
|
|
125
|
+
"ts",
|
|
126
|
+
"tsx",
|
|
127
|
+
"js",
|
|
128
|
+
"jsx",
|
|
129
|
+
"json",
|
|
130
|
+
"node"
|
|
131
|
+
],
|
|
132
|
+
"testEnvironment": "node",
|
|
133
|
+
"moduleNameMapper": {
|
|
134
|
+
"\\.(css|less)$": "<rootDir>/test/__mocks__/styleMock.js"
|
|
135
|
+
}
|
|
121
136
|
}
|
|
122
137
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { DefaultAppBar, DefaultAppBarProps } from "../core/DefaultAppBar";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This component renders the main app bar of FireCMS.
|
|
5
|
+
*/
|
|
6
|
+
export function AppBar({
|
|
7
|
+
children,
|
|
8
|
+
...props
|
|
9
|
+
}: {
|
|
10
|
+
children?: React.ReactNode,
|
|
11
|
+
className?: string,
|
|
12
|
+
style?: React.CSSProperties
|
|
13
|
+
} & DefaultAppBarProps) {
|
|
14
|
+
const usedChildren = children ?? <DefaultAppBar {...props}/>;
|
|
15
|
+
return <>{usedChildren}</>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
AppBar.componentType = "AppBar";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { DefaultDrawer } from "../core";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This component is in charge of rendering the drawer.
|
|
5
|
+
* If you add this component under your {@link Scaffold}, it will be rendered
|
|
6
|
+
* as a drawer, and the open and close functionality will be handled automatically.
|
|
7
|
+
* If you want to customise the drawer, you can create your own component and pass it as a child.
|
|
8
|
+
* For custom drawers, you can use the {@link useApp} to open and close the drawer.
|
|
9
|
+
*
|
|
10
|
+
*/
|
|
11
|
+
export function Drawer({
|
|
12
|
+
children,
|
|
13
|
+
className,
|
|
14
|
+
style
|
|
15
|
+
}: {
|
|
16
|
+
children?: React.ReactNode,
|
|
17
|
+
className?: string,
|
|
18
|
+
style?: React.CSSProperties
|
|
19
|
+
}) {
|
|
20
|
+
const usedChildren = children ?? <DefaultDrawer className={className} style={style}/>;
|
|
21
|
+
return <>{usedChildren}</>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
Drawer.componentType = "Drawer";
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import React, { PropsWithChildren, useCallback } from "react";
|
|
2
|
+
import { ChevronLeftIcon, cls, defaultBorderMixin, IconButton, MenuIcon, Sheet, Tooltip } from "@firecms/ui";
|
|
3
|
+
import equal from "react-fast-compare"
|
|
4
|
+
import { useLargeLayout } from "../hooks";
|
|
5
|
+
import { ErrorBoundary } from "../components";
|
|
6
|
+
import { AppContext } from "./useApp";
|
|
7
|
+
|
|
8
|
+
export const DRAWER_WIDTH = 280;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @group Core
|
|
12
|
+
*/
|
|
13
|
+
export interface ScaffoldProps {
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Open the drawer on hover
|
|
17
|
+
*/
|
|
18
|
+
autoOpenDrawer?: boolean;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Logo to be displayed in the top bar and drawer.
|
|
22
|
+
* Note that this has no effect if you are using a custom AppBar or Drawer.
|
|
23
|
+
*/
|
|
24
|
+
logo?: string;
|
|
25
|
+
|
|
26
|
+
className?: string;
|
|
27
|
+
|
|
28
|
+
style?: React.CSSProperties;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* This view acts as a scaffold for FireCMS.
|
|
33
|
+
*
|
|
34
|
+
* It is in charge of displaying the navigation drawer, top bar and main
|
|
35
|
+
* collection views.
|
|
36
|
+
* This component needs a parent {@link FireCMS}
|
|
37
|
+
*
|
|
38
|
+
* @param props
|
|
39
|
+
|
|
40
|
+
* @group Core
|
|
41
|
+
*/
|
|
42
|
+
export const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(
|
|
43
|
+
function Scaffold(props: PropsWithChildren<ScaffoldProps>) {
|
|
44
|
+
|
|
45
|
+
const {
|
|
46
|
+
children,
|
|
47
|
+
autoOpenDrawer,
|
|
48
|
+
logo,
|
|
49
|
+
className,
|
|
50
|
+
style
|
|
51
|
+
} = props;
|
|
52
|
+
|
|
53
|
+
const drawerChildren = React.Children.toArray(children).filter((child: any) => child.type.componentType === "Drawer");
|
|
54
|
+
if (drawerChildren.length > 1) {
|
|
55
|
+
throw Error("Only one Drawer component is allowed in Scaffold");
|
|
56
|
+
}
|
|
57
|
+
const appBarChildren = React.Children.toArray(children).filter((child: any) => child.type.componentType === "AppBar");
|
|
58
|
+
if (appBarChildren.length > 1) {
|
|
59
|
+
throw Error("Only one AppBar component is allowed in Scaffold");
|
|
60
|
+
}
|
|
61
|
+
const otherChildren = React.Children.toArray(children)
|
|
62
|
+
.filter((child: any) => child.type.componentType !== "Drawer" && child.type.componentType !== "AppBar");
|
|
63
|
+
const includeDrawer = drawerChildren.length > 0;
|
|
64
|
+
const largeLayout = useLargeLayout();
|
|
65
|
+
|
|
66
|
+
const [drawerOpen, setDrawerOpen] = React.useState(false);
|
|
67
|
+
const [onHover, setOnHover] = React.useState(false);
|
|
68
|
+
|
|
69
|
+
const setOnHoverTrue = useCallback(() => setOnHover(true), []);
|
|
70
|
+
const setOnHoverFalse = useCallback(() => setOnHover(false), []);
|
|
71
|
+
|
|
72
|
+
const handleDrawerOpen = useCallback(() => {
|
|
73
|
+
setDrawerOpen(true);
|
|
74
|
+
}, []);
|
|
75
|
+
|
|
76
|
+
const handleDrawerClose = useCallback(() => {
|
|
77
|
+
setDrawerOpen(false);
|
|
78
|
+
}, []);
|
|
79
|
+
|
|
80
|
+
const computedDrawerOpen: boolean = drawerOpen || Boolean(largeLayout && autoOpenDrawer && onHover);
|
|
81
|
+
|
|
82
|
+
const hasAppBar = Boolean(appBarChildren.length > 0);
|
|
83
|
+
return (
|
|
84
|
+
<AppContext.Provider value={{
|
|
85
|
+
logo,
|
|
86
|
+
hasDrawer: includeDrawer,
|
|
87
|
+
drawerHovered: onHover,
|
|
88
|
+
drawerOpen: computedDrawerOpen,
|
|
89
|
+
closeDrawer: handleDrawerClose,
|
|
90
|
+
openDrawer: handleDrawerOpen,
|
|
91
|
+
autoOpenDrawer
|
|
92
|
+
}}>
|
|
93
|
+
<div
|
|
94
|
+
className={cls("flex h-screen w-screen bg-surface-50 dark:bg-surface-900 text-surface-900 dark:text-white overflow-hidden", className)}
|
|
95
|
+
style={{
|
|
96
|
+
paddingTop: "env(safe-area-inset-top)",
|
|
97
|
+
paddingLeft: "env(safe-area-inset-left)",
|
|
98
|
+
paddingRight: "env(safe-area-inset-right)",
|
|
99
|
+
paddingBottom: "env(safe-area-inset-bottom)",
|
|
100
|
+
height: "100dvh",
|
|
101
|
+
...style
|
|
102
|
+
}}>
|
|
103
|
+
|
|
104
|
+
{appBarChildren}
|
|
105
|
+
|
|
106
|
+
<DrawerWrapper
|
|
107
|
+
displayed={includeDrawer}
|
|
108
|
+
onMouseEnter={setOnHoverTrue}
|
|
109
|
+
onMouseMove={setOnHoverTrue}
|
|
110
|
+
onMouseLeave={setOnHoverFalse}
|
|
111
|
+
open={computedDrawerOpen}
|
|
112
|
+
hovered={onHover}
|
|
113
|
+
setDrawerOpen={setDrawerOpen}>
|
|
114
|
+
{includeDrawer && drawerChildren}
|
|
115
|
+
</DrawerWrapper>
|
|
116
|
+
|
|
117
|
+
<main
|
|
118
|
+
className="flex flex-col flex-grow overflow-auto">
|
|
119
|
+
{hasAppBar && <DrawerHeader/>}
|
|
120
|
+
<div
|
|
121
|
+
className={cls(defaultBorderMixin, "flex-grow overflow-auto lg:m-0 lg:mx-4 lg:mb-4 lg:rounded-lg lg:border lg:border-solid m-0 mt-1", {
|
|
122
|
+
"lg:mt-4": !hasAppBar
|
|
123
|
+
})}>
|
|
124
|
+
|
|
125
|
+
<ErrorBoundary>
|
|
126
|
+
{otherChildren}
|
|
127
|
+
</ErrorBoundary>
|
|
128
|
+
|
|
129
|
+
</div>
|
|
130
|
+
</main>
|
|
131
|
+
</div>
|
|
132
|
+
</AppContext.Provider>
|
|
133
|
+
);
|
|
134
|
+
},
|
|
135
|
+
equal
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
const DrawerHeader = () => {
|
|
139
|
+
return (
|
|
140
|
+
<div className="flex flex-col min-h-16"></div>
|
|
141
|
+
);
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
function DrawerWrapper(props: {
|
|
145
|
+
children: React.ReactNode,
|
|
146
|
+
displayed: boolean,
|
|
147
|
+
open: boolean,
|
|
148
|
+
logo?: string,
|
|
149
|
+
hovered: boolean,
|
|
150
|
+
setDrawerOpen: (open: boolean) => void,
|
|
151
|
+
onMouseEnter: () => void,
|
|
152
|
+
onMouseMove: () => void,
|
|
153
|
+
onMouseLeave: () => void
|
|
154
|
+
}) {
|
|
155
|
+
|
|
156
|
+
const width = !props.displayed ? 0 : (props.open ? DRAWER_WIDTH : 72);
|
|
157
|
+
const innerDrawer = <div
|
|
158
|
+
className={"relative h-full no-scrollbar overflow-y-auto overflow-x-hidden"}
|
|
159
|
+
style={{
|
|
160
|
+
width,
|
|
161
|
+
transition: "left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms"
|
|
162
|
+
}}
|
|
163
|
+
>
|
|
164
|
+
|
|
165
|
+
{!props.open && props.displayed && (
|
|
166
|
+
<Tooltip title="Open menu"
|
|
167
|
+
side="right"
|
|
168
|
+
sideOffset={12}
|
|
169
|
+
asChild={true}>
|
|
170
|
+
<div
|
|
171
|
+
className="ml-2 fixed top-1 left-2 sm:top-2 sm:left-2 !bg-surface-50 dark:!bg-surface-900 rounded-full w-fit z-20">
|
|
172
|
+
<IconButton
|
|
173
|
+
color="inherit"
|
|
174
|
+
aria-label="Open menu"
|
|
175
|
+
onClick={() => props.setDrawerOpen(true)}
|
|
176
|
+
size="large"
|
|
177
|
+
>
|
|
178
|
+
<MenuIcon/>
|
|
179
|
+
</IconButton>
|
|
180
|
+
</div>
|
|
181
|
+
</Tooltip>
|
|
182
|
+
)}
|
|
183
|
+
|
|
184
|
+
<div
|
|
185
|
+
className={`z-20 absolute right-0 top-4 ${
|
|
186
|
+
props.open ? "opacity-100" : "opacity-0 invisible"
|
|
187
|
+
} transition-opacity duration-200 ease-in-out`}>
|
|
188
|
+
<IconButton
|
|
189
|
+
aria-label="Close drawer"
|
|
190
|
+
onClick={() => props.setDrawerOpen(false)}
|
|
191
|
+
>
|
|
192
|
+
<ChevronLeftIcon/>
|
|
193
|
+
</IconButton>
|
|
194
|
+
</div>
|
|
195
|
+
|
|
196
|
+
<div className={"flex flex-col h-full"}>
|
|
197
|
+
{props.children}
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
</div>;
|
|
201
|
+
|
|
202
|
+
const largeLayout = useLargeLayout();
|
|
203
|
+
if (!largeLayout) {
|
|
204
|
+
if (!props.displayed)
|
|
205
|
+
return null;
|
|
206
|
+
return <>
|
|
207
|
+
<IconButton
|
|
208
|
+
color="inherit"
|
|
209
|
+
aria-label="Open drawer"
|
|
210
|
+
onClick={() => props.setDrawerOpen(true)}
|
|
211
|
+
size="large"
|
|
212
|
+
className="absolute sm:top-2 sm:left-4 top-1 left-2"
|
|
213
|
+
>
|
|
214
|
+
<MenuIcon/>
|
|
215
|
+
</IconButton>
|
|
216
|
+
<Sheet side={"left"}
|
|
217
|
+
transparent={true}
|
|
218
|
+
open={props.open}
|
|
219
|
+
onOpenChange={props.setDrawerOpen}
|
|
220
|
+
title={"Navigation drawer"}
|
|
221
|
+
overlayClassName={"bg-white bg-opacity-80"}
|
|
222
|
+
>
|
|
223
|
+
{innerDrawer}
|
|
224
|
+
</Sheet>
|
|
225
|
+
</>;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return (
|
|
229
|
+
<div
|
|
230
|
+
className="z-20 relative"
|
|
231
|
+
onMouseEnter={props.onMouseEnter}
|
|
232
|
+
onMouseMove={props.onMouseMove}
|
|
233
|
+
onMouseLeave={props.onMouseLeave}
|
|
234
|
+
style={{
|
|
235
|
+
width,
|
|
236
|
+
transition: "left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms"
|
|
237
|
+
}}>
|
|
238
|
+
|
|
239
|
+
{innerDrawer}
|
|
240
|
+
|
|
241
|
+
</div>
|
|
242
|
+
);
|
|
243
|
+
}
|
package/src/app/index.ts
ADDED