@firecms/core 3.0.0-canary.98 → 3.0.0-rc.1
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 +2 -2
- package/dist/app/Drawer.d.ts +0 -1
- package/dist/app/Scaffold.d.ts +4 -0
- package/dist/components/ArrayContainer.d.ts +31 -12
- package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +3 -1
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +17 -3
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +1 -1
- package/dist/components/EntityCollectionTable/index.d.ts +1 -1
- package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +6 -3
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +8 -0
- package/dist/components/EntityCollectionView/utils.d.ts +3 -0
- package/dist/components/EntityJsonPreview.d.ts +3 -0
- package/dist/components/EntityPreview.d.ts +8 -6
- package/dist/components/HomePage/DefaultHomePage.d.ts +2 -15
- package/dist/components/HomePage/HomePageDnD.d.ts +76 -0
- package/dist/components/HomePage/NavigationCard.d.ts +3 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +3 -2
- package/dist/components/HomePage/NavigationGroup.d.ts +8 -1
- package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
- package/dist/components/PropertyConfigBadge.d.ts +2 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +1 -1
- package/dist/components/UnsavedChangesDialog.d.ts +8 -0
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +11 -2
- package/dist/components/common/default_entity_actions.d.ts +0 -2
- package/dist/components/common/index.d.ts +1 -1
- package/dist/components/common/useColumnsIds.d.ts +1 -0
- package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +10 -2
- package/dist/components/common/useDebouncedCallback.d.ts +1 -0
- package/dist/components/common/useScrollRestoration.d.ts +14 -0
- package/dist/components/index.d.ts +3 -1
- package/dist/contexts/BreacrumbsContext.d.ts +8 -0
- package/dist/core/DefaultAppBar.d.ts +8 -2
- package/dist/core/DrawerNavigationItem.d.ts +2 -1
- package/dist/core/EntityEditView.d.ts +40 -22
- package/dist/core/EntityEditViewFormActions.d.ts +2 -0
- package/dist/core/FireCMS.d.ts +2 -2
- package/dist/core/FireCMSRouter.d.ts +4 -0
- package/dist/core/NavigationRoutes.d.ts +0 -1
- package/dist/core/SideDialogs.d.ts +4 -2
- package/dist/core/field_configs.d.ts +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/form/EntityForm.d.ts +50 -0
- package/dist/form/EntityFormActions.d.ts +21 -0
- package/dist/form/PropertyFieldBinding.d.ts +1 -1
- package/dist/form/components/FormEntry.d.ts +6 -0
- package/dist/form/components/FormLayout.d.ts +5 -0
- package/dist/form/components/LabelWithIcon.d.ts +1 -1
- package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
- package/dist/form/components/index.d.ts +3 -1
- package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
- package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
- package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
- 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 +4 -10
- 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 +17 -16
- package/dist/form/useClearRestoreValue.d.ts +2 -2
- package/dist/hooks/data/delete.d.ts +4 -4
- package/dist/hooks/data/save.d.ts +3 -3
- package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
- package/dist/hooks/data/useEntityFetch.d.ts +4 -3
- package/dist/hooks/useAuthController.d.ts +1 -1
- package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
- package/dist/hooks/useBuildNavigationController.d.ts +57 -12
- package/dist/hooks/useFireCMSContext.d.ts +1 -1
- package/dist/hooks/useModeController.d.ts +1 -2
- package/dist/hooks/useProjectLog.d.ts +7 -1
- package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
- package/dist/hooks/useValidateAuthenticator.d.ts +3 -3
- package/dist/index.es.js +20108 -14471
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +20039 -14407
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +3 -2
- package/dist/internal/useBuildSideEntityController.d.ts +3 -3
- package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
- package/dist/preview/PropertyPreviewProps.d.ts +1 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +2 -2
- package/dist/preview/util.d.ts +3 -3
- package/dist/routes/CustomCMSRoute.d.ts +4 -0
- package/dist/routes/FireCMSRoute.d.ts +1 -0
- package/dist/routes/HomePageRoute.d.ts +3 -0
- package/dist/types/analytics.d.ts +1 -1
- package/dist/types/auth.d.ts +7 -9
- package/dist/types/collections.d.ts +86 -25
- package/dist/types/customization_controller.d.ts +8 -0
- package/dist/types/datasource.d.ts +19 -17
- package/dist/types/dialogs_controller.d.ts +7 -3
- package/dist/types/entities.d.ts +2 -1
- package/dist/types/entity_actions.d.ts +58 -8
- 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 +43 -17
- package/dist/types/firecms.d.ts +16 -3
- package/dist/types/firecms_context.d.ts +1 -1
- package/dist/types/navigation.d.ts +60 -17
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +42 -9
- package/dist/types/properties.d.ts +65 -22
- package/dist/types/property_config.d.ts +1 -3
- package/dist/types/roles.d.ts +3 -0
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/side_entity_controller.d.ts +14 -1
- package/dist/types/storage.d.ts +75 -0
- package/dist/types/user.d.ts +1 -0
- package/dist/util/builders.d.ts +3 -3
- package/dist/util/callbacks.d.ts +2 -0
- package/dist/util/createFormexStub.d.ts +2 -0
- package/dist/util/entities.d.ts +2 -2
- package/dist/util/entity_actions.d.ts +2 -0
- package/dist/util/entity_cache.d.ts +23 -0
- package/dist/util/icon_synonyms.d.ts +0 -1
- package/dist/util/icons.d.ts +5 -2
- package/dist/util/index.d.ts +3 -0
- package/dist/util/navigation_from_path.d.ts +10 -1
- package/dist/util/navigation_utils.d.ts +13 -1
- package/dist/util/objects.d.ts +2 -1
- package/dist/util/permissions.d.ts +4 -4
- package/dist/util/property_utils.d.ts +4 -4
- package/dist/util/references.d.ts +2 -2
- package/dist/util/resolutions.d.ts +30 -6
- package/dist/util/storage.d.ts +1 -1
- package/dist/util/useStorageUploadController.d.ts +2 -2
- package/package.json +133 -125
- package/src/app/Drawer.tsx +0 -1
- package/src/app/Scaffold.tsx +33 -29
- package/src/components/ArrayContainer.tsx +447 -229
- package/src/components/CircularProgressCenter.tsx +1 -1
- package/src/components/ClearFilterSortButton.tsx +1 -1
- package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
- package/src/components/DeleteEntityDialog.tsx +13 -20
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -25
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +23 -17
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +20 -3
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +35 -9
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +21 -16
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +6 -12
- package/src/components/EntityCollectionTable/index.tsx +1 -1
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +6 -6
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +35 -26
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +132 -101
- package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +178 -85
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
- package/src/components/EntityCollectionView/useSelectionController.tsx +5 -4
- package/src/components/EntityCollectionView/utils.ts +19 -0
- package/src/components/EntityJsonPreview.tsx +66 -0
- package/src/components/EntityPreview.tsx +75 -57
- package/src/components/EntityView.tsx +8 -5
- package/src/components/ErrorView.tsx +3 -3
- package/src/components/FireCMSLogo.tsx +7 -51
- package/src/components/HomePage/DefaultHomePage.tsx +522 -160
- package/src/components/HomePage/FavouritesView.tsx +9 -14
- package/src/components/HomePage/HomePageDnD.tsx +642 -0
- package/src/components/HomePage/NavigationCard.tsx +47 -38
- package/src/components/HomePage/NavigationCardBinding.tsx +16 -15
- package/src/components/HomePage/NavigationGroup.tsx +144 -30
- package/src/components/HomePage/RenameGroupDialog.tsx +117 -0
- package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
- package/src/components/NotFoundPage.tsx +2 -2
- package/src/components/PropertyConfigBadge.tsx +9 -3
- package/src/components/PropertyIdCopyTooltip.tsx +47 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +22 -13
- package/src/components/SearchIconsView.tsx +2 -2
- package/src/components/SelectableTable/SelectableTable.tsx +154 -142
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +4 -2
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +10 -8
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +59 -10
- package/src/components/UnsavedChangesDialog.tsx +46 -0
- package/src/components/VirtualTable/VirtualTable.tsx +65 -44
- package/src/components/VirtualTable/VirtualTableCell.tsx +0 -8
- package/src/components/VirtualTable/VirtualTableHeader.tsx +8 -8
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +1 -1
- package/src/components/VirtualTable/VirtualTableProps.tsx +12 -2
- package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
- package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
- package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
- package/src/components/common/default_entity_actions.tsx +62 -42
- package/src/components/common/index.ts +1 -1
- package/src/components/common/useColumnsIds.tsx +1 -1
- package/src/components/common/useDataSourceTableController.tsx +420 -0
- package/src/components/common/useDebouncedCallback.tsx +20 -0
- package/src/components/common/useScrollRestoration.tsx +68 -0
- package/src/components/common/useTableSearchHelper.ts +1 -0
- package/src/components/index.tsx +4 -1
- package/src/contexts/BreacrumbsContext.tsx +38 -0
- package/src/contexts/DialogsProvider.tsx +3 -2
- package/src/contexts/ModeController.tsx +1 -3
- package/src/contexts/SnackbarProvider.tsx +2 -0
- package/src/core/DefaultAppBar.tsx +124 -85
- package/src/core/DefaultDrawer.tsx +30 -22
- package/src/core/DrawerNavigationItem.tsx +32 -28
- package/src/core/EntityEditView.tsx +388 -995
- package/src/core/EntityEditViewFormActions.tsx +329 -0
- package/src/core/EntitySidePanel.tsx +88 -20
- package/src/core/FireCMS.tsx +46 -25
- package/src/core/FireCMSRouter.tsx +17 -0
- package/src/core/NavigationRoutes.tsx +23 -32
- package/src/core/SideDialogs.tsx +22 -12
- package/src/core/field_configs.tsx +24 -10
- package/src/core/index.tsx +4 -2
- package/src/form/EntityForm.tsx +814 -0
- package/src/form/EntityFormActions.tsx +211 -0
- package/src/form/PropertyFieldBinding.tsx +55 -41
- package/src/form/components/CustomIdField.tsx +9 -3
- package/src/form/components/FieldHelperText.tsx +1 -1
- package/src/form/components/FormEntry.tsx +22 -0
- package/src/form/components/FormLayout.tsx +16 -0
- package/src/form/components/LabelWithIcon.tsx +30 -19
- package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
- package/src/form/components/StorageItemPreview.tsx +5 -4
- package/src/form/components/StorageUploadProgress.tsx +2 -3
- package/src/form/components/index.tsx +3 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +30 -18
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -36
- package/src/form/field_bindings/BlockFieldBinding.tsx +55 -33
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +19 -15
- package/src/form/field_bindings/MapFieldBinding.tsx +72 -62
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
- package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +10 -8
- package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +28 -19
- package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -32
- package/src/form/field_bindings/SelectFieldBinding.tsx +22 -13
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +247 -168
- package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
- package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
- package/src/form/index.tsx +17 -37
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +12 -6
- package/src/hooks/data/delete.ts +6 -5
- package/src/hooks/data/save.ts +26 -35
- package/src/hooks/data/useCollectionFetch.tsx +3 -3
- package/src/hooks/data/useDataSource.tsx +10 -2
- package/src/hooks/data/useEntityFetch.tsx +10 -6
- package/src/hooks/useAuthController.tsx +1 -1
- package/src/hooks/useBreadcrumbsController.tsx +31 -0
- package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
- package/src/hooks/useBuildModeController.tsx +15 -28
- package/src/hooks/useBuildNavigationController.tsx +386 -124
- package/src/hooks/useFireCMSContext.tsx +3 -33
- package/src/hooks/useLargeLayout.tsx +0 -35
- package/src/hooks/useModeController.tsx +1 -2
- package/src/hooks/useProjectLog.tsx +16 -5
- package/src/hooks/useResolvedNavigationFrom.tsx +9 -11
- package/src/hooks/useValidateAuthenticator.tsx +3 -3
- package/src/internal/useBuildDataSource.ts +67 -80
- package/src/internal/useBuildSideDialogsController.tsx +4 -2
- package/src/internal/useBuildSideEntityController.tsx +149 -86
- package/src/internal/useUnsavedChangesDialog.tsx +127 -91
- package/src/preview/PropertyPreview.tsx +28 -12
- package/src/preview/PropertyPreviewProps.tsx +1 -1
- package/src/preview/components/BooleanPreview.tsx +1 -1
- package/src/preview/components/EmptyValue.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +1 -1
- package/src/preview/components/ImagePreview.tsx +10 -9
- package/src/preview/components/ReferencePreview.tsx +6 -16
- package/src/preview/components/UrlComponentPreview.tsx +20 -21
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -5
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -4
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -3
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -3
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +6 -4
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +5 -3
- package/src/preview/property_previews/MapPropertyPreview.tsx +7 -6
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
- package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
- package/src/preview/util.ts +10 -10
- package/src/routes/CustomCMSRoute.tsx +21 -0
- package/src/routes/FireCMSRoute.tsx +246 -0
- package/src/routes/HomePageRoute.tsx +17 -0
- package/src/types/analytics.ts +3 -0
- package/src/types/auth.tsx +8 -12
- package/src/types/collections.ts +101 -28
- package/src/types/customization_controller.tsx +9 -0
- package/src/types/datasource.ts +21 -20
- package/src/types/dialogs_controller.tsx +7 -3
- package/src/types/entities.ts +3 -1
- package/src/types/entity_actions.tsx +71 -8
- 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 +52 -19
- package/src/types/firecms.tsx +18 -4
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/navigation.ts +76 -22
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +50 -9
- package/src/types/properties.ts +74 -22
- package/src/types/property_config.tsx +1 -2
- package/src/types/roles.ts +3 -0
- package/src/types/side_dialogs_controller.tsx +15 -0
- package/src/types/side_entity_controller.tsx +16 -1
- package/src/types/storage.ts +82 -0
- package/src/types/user.ts +2 -0
- package/src/util/builders.ts +10 -8
- package/src/util/callbacks.ts +119 -0
- package/src/util/createFormexStub.tsx +62 -0
- package/src/util/entities.ts +5 -3
- package/src/util/entity_actions.ts +28 -0
- package/src/util/entity_cache.ts +204 -0
- package/src/util/icon_list.ts +1 -1
- package/src/util/icon_synonyms.ts +0 -1
- package/src/util/icons.tsx +36 -11
- package/src/util/index.ts +3 -0
- package/src/util/join_collections.ts +9 -2
- package/src/util/make_properties_editable.ts +13 -5
- package/src/util/navigation_from_path.ts +33 -12
- package/src/util/navigation_utils.ts +135 -19
- package/src/util/objects.ts +74 -14
- package/src/util/parent_references_from_path.ts +3 -3
- package/src/util/permissions.ts +8 -8
- package/src/util/property_utils.tsx +17 -6
- package/src/util/references.ts +19 -8
- package/src/util/resolutions.ts +93 -24
- package/src/util/storage.ts +6 -2
- package/src/util/useStorageUploadController.tsx +74 -29
- package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
- package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
- package/dist/form/PropertiesForm.d.ts +0 -8
- package/dist/form/components/FormikArrayContainer.d.ts +0 -18
- package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
- package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
- package/src/components/PropertyIdCopyTooltipContent.tsx +0 -27
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -236
- package/src/form/PropertiesForm.tsx +0 -81
- package/src/form/components/FormikArrayContainer.tsx +0 -44
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
- /package/src/util/{common.tsx → common.ts} +0 -0
package/src/types/storage.ts
CHANGED
|
@@ -102,4 +102,86 @@ export interface StorageSource {
|
|
|
102
102
|
* @param bucket
|
|
103
103
|
*/
|
|
104
104
|
getFile: (path: string, bucket?: string) => Promise<File | null>;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Delete a file.
|
|
108
|
+
* @param path
|
|
109
|
+
* @param bucket
|
|
110
|
+
*/
|
|
111
|
+
deleteFile: (path: string, bucket?: string) => Promise<void>;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* List the contents of a path.
|
|
115
|
+
* @param path
|
|
116
|
+
* @param options
|
|
117
|
+
*/
|
|
118
|
+
list: (path: string, options?: {
|
|
119
|
+
bucket?: string,
|
|
120
|
+
maxResults?: number,
|
|
121
|
+
pageToken?: string
|
|
122
|
+
}) => Promise<StorageListResult>;
|
|
123
|
+
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Result returned by list().
|
|
128
|
+
* @public
|
|
129
|
+
*/
|
|
130
|
+
export declare interface StorageListResult {
|
|
131
|
+
/**
|
|
132
|
+
* References to prefixes (sub-folders). You can call list() on them to
|
|
133
|
+
* get its contents.
|
|
134
|
+
*
|
|
135
|
+
* Folders are implicit based on '/' in the object paths.
|
|
136
|
+
* For example, if a bucket has two objects '/a/b/1' and '/a/b/2', list('/a')
|
|
137
|
+
* will return '/a/b' as a prefix.
|
|
138
|
+
*/
|
|
139
|
+
prefixes: StorageReference[];
|
|
140
|
+
/**
|
|
141
|
+
* Objects in this directory.
|
|
142
|
+
* You can call getMetadata() and getDownloadUrl() on them.
|
|
143
|
+
*/
|
|
144
|
+
items: StorageReference[];
|
|
145
|
+
/**
|
|
146
|
+
* If set, there might be more results for this list. Use this token to resume the list.
|
|
147
|
+
*/
|
|
148
|
+
nextPageToken?: string;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Represents a reference to a Google Cloud Storage object. Developers can
|
|
153
|
+
* upload, download, and delete objects, as well as get/set object metadata.
|
|
154
|
+
* @public
|
|
155
|
+
*/
|
|
156
|
+
export declare interface StorageReference {
|
|
157
|
+
/**
|
|
158
|
+
* Returns a gs:// URL for this object in the form
|
|
159
|
+
* `gs://<bucket>/<path>/<to>/<object>`
|
|
160
|
+
* @returns The gs:// URL.
|
|
161
|
+
*/
|
|
162
|
+
toString(): string;
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* A reference to the root of this object's bucket.
|
|
166
|
+
*/
|
|
167
|
+
root: StorageReference;
|
|
168
|
+
/**
|
|
169
|
+
* The name of the bucket containing this reference's object.
|
|
170
|
+
*/
|
|
171
|
+
bucket: string;
|
|
172
|
+
/**
|
|
173
|
+
* The full path of this object.
|
|
174
|
+
*/
|
|
175
|
+
fullPath: string;
|
|
176
|
+
/**
|
|
177
|
+
* The short name of this object, which is the last component of the full path.
|
|
178
|
+
* For example, if fullPath is 'full/path/image.png', name is 'image.png'.
|
|
179
|
+
*/
|
|
180
|
+
name: string;
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* A reference pointing to the parent location of this reference, or null if
|
|
184
|
+
* this reference is the root.
|
|
185
|
+
*/
|
|
186
|
+
parent: StorageReference | null;
|
|
105
187
|
}
|
package/src/types/user.ts
CHANGED
package/src/util/builders.ts
CHANGED
|
@@ -26,10 +26,12 @@ import {
|
|
|
26
26
|
* @param collection
|
|
27
27
|
* @group Builder
|
|
28
28
|
*/
|
|
29
|
-
export function buildCollection<
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
export function buildCollection<
|
|
30
|
+
M extends Record<string, any> = any,
|
|
31
|
+
USER extends User = User>
|
|
32
|
+
(
|
|
33
|
+
collection: EntityCollection<M, USER>
|
|
34
|
+
): EntityCollection<M, USER> {
|
|
33
35
|
return collection;
|
|
34
36
|
}
|
|
35
37
|
|
|
@@ -39,7 +41,7 @@ export function buildCollection<M extends Record<string, any> = any,
|
|
|
39
41
|
* @param property
|
|
40
42
|
* @group Builder
|
|
41
43
|
*/
|
|
42
|
-
export function buildProperty<T extends CMSType = CMSType, P extends PropertyOrBuilder<T> = PropertyOrBuilder<T>, M extends Record<string, any> =
|
|
44
|
+
export function buildProperty<T extends CMSType = CMSType, P extends PropertyOrBuilder<T> = PropertyOrBuilder<T>, M extends Record<string, any> = any>(
|
|
43
45
|
property: P
|
|
44
46
|
):
|
|
45
47
|
P extends StringProperty ? StringProperty :
|
|
@@ -120,9 +122,9 @@ export function buildEntityCallbacks<M extends Record<string, any> = any>(
|
|
|
120
122
|
* @param additionalFieldDelegate
|
|
121
123
|
* @group Builder
|
|
122
124
|
*/
|
|
123
|
-
export function buildAdditionalFieldDelegate<M extends Record<string, any>,
|
|
124
|
-
additionalFieldDelegate: AdditionalFieldDelegate<M,
|
|
125
|
-
): AdditionalFieldDelegate<M,
|
|
125
|
+
export function buildAdditionalFieldDelegate<M extends Record<string, any>, USER extends User = User>(
|
|
126
|
+
additionalFieldDelegate: AdditionalFieldDelegate<M, USER>
|
|
127
|
+
): AdditionalFieldDelegate<M, USER> {
|
|
126
128
|
return additionalFieldDelegate;
|
|
127
129
|
}
|
|
128
130
|
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { EntityCallbacks } from "../types";
|
|
2
|
+
|
|
3
|
+
export const mergeCallbacks = (
|
|
4
|
+
baseCallbacks: EntityCallbacks = {},
|
|
5
|
+
pluginCallbacks: EntityCallbacks = {}
|
|
6
|
+
): EntityCallbacks | undefined => {
|
|
7
|
+
|
|
8
|
+
if (!baseCallbacks && !pluginCallbacks) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const mergedCallbacks: EntityCallbacks = {};
|
|
13
|
+
|
|
14
|
+
// Handle onFetch - returns Entity<M> or Promise<Entity<M>>
|
|
15
|
+
if (baseCallbacks.onFetch || pluginCallbacks.onFetch) {
|
|
16
|
+
mergedCallbacks.onFetch = async (props) => {
|
|
17
|
+
let entity = props.entity;
|
|
18
|
+
if (baseCallbacks.onFetch) {
|
|
19
|
+
entity = await Promise.resolve(baseCallbacks.onFetch(props));
|
|
20
|
+
}
|
|
21
|
+
if (pluginCallbacks.onFetch) {
|
|
22
|
+
entity = await Promise.resolve(pluginCallbacks.onFetch({
|
|
23
|
+
...props,
|
|
24
|
+
entity
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
return entity;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Handle onSaveSuccess - returns void or Promise<void>
|
|
32
|
+
if (baseCallbacks.onSaveSuccess || pluginCallbacks.onSaveSuccess) {
|
|
33
|
+
mergedCallbacks.onSaveSuccess = async (props) => {
|
|
34
|
+
if (baseCallbacks.onSaveSuccess) {
|
|
35
|
+
await Promise.resolve(baseCallbacks.onSaveSuccess(props));
|
|
36
|
+
}
|
|
37
|
+
if (pluginCallbacks.onSaveSuccess) {
|
|
38
|
+
await Promise.resolve(pluginCallbacks.onSaveSuccess(props));
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Handle onSaveFailure - returns void or Promise<void>
|
|
44
|
+
if (baseCallbacks.onSaveFailure || pluginCallbacks.onSaveFailure) {
|
|
45
|
+
mergedCallbacks.onSaveFailure = async (props) => {
|
|
46
|
+
if (baseCallbacks.onSaveFailure) {
|
|
47
|
+
await Promise.resolve(baseCallbacks.onSaveFailure(props));
|
|
48
|
+
}
|
|
49
|
+
if (pluginCallbacks.onSaveFailure) {
|
|
50
|
+
await Promise.resolve(pluginCallbacks.onSaveFailure(props));
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Handle onPreSave - returns Partial<EntityValues<M>> or Promise<Partial<EntityValues<M>>>
|
|
56
|
+
if (baseCallbacks.onPreSave || pluginCallbacks.onPreSave) {
|
|
57
|
+
mergedCallbacks.onPreSave = async (props) => {
|
|
58
|
+
let values = { ...props.values };
|
|
59
|
+
if (baseCallbacks.onPreSave) {
|
|
60
|
+
const baseValues = await Promise.resolve(baseCallbacks.onPreSave(props));
|
|
61
|
+
values = { ...values, ...baseValues };
|
|
62
|
+
}
|
|
63
|
+
if (pluginCallbacks.onPreSave) {
|
|
64
|
+
const pluginValues = await Promise.resolve(pluginCallbacks.onPreSave({
|
|
65
|
+
...props,
|
|
66
|
+
values
|
|
67
|
+
}));
|
|
68
|
+
values = { ...values, ...pluginValues };
|
|
69
|
+
}
|
|
70
|
+
return values;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Handle onPreDelete - returns void
|
|
75
|
+
if (baseCallbacks.onPreDelete || pluginCallbacks.onPreDelete) {
|
|
76
|
+
mergedCallbacks.onPreDelete = (props) => {
|
|
77
|
+
if (baseCallbacks.onPreDelete) {
|
|
78
|
+
baseCallbacks.onPreDelete(props);
|
|
79
|
+
}
|
|
80
|
+
if (pluginCallbacks.onPreDelete) {
|
|
81
|
+
pluginCallbacks.onPreDelete(props);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Handle onDelete - returns void
|
|
87
|
+
if (baseCallbacks.onDelete || pluginCallbacks.onDelete) {
|
|
88
|
+
mergedCallbacks.onDelete = (props) => {
|
|
89
|
+
if (baseCallbacks.onDelete) {
|
|
90
|
+
baseCallbacks.onDelete(props);
|
|
91
|
+
}
|
|
92
|
+
if (pluginCallbacks.onDelete) {
|
|
93
|
+
pluginCallbacks.onDelete(props);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Handle onIdUpdate - returns string or Promise<string>
|
|
99
|
+
if (baseCallbacks.onIdUpdate || pluginCallbacks.onIdUpdate) {
|
|
100
|
+
mergedCallbacks.onIdUpdate = async (props) => {
|
|
101
|
+
let id = props.entityId || "";
|
|
102
|
+
|
|
103
|
+
if (baseCallbacks.onIdUpdate) {
|
|
104
|
+
id = await Promise.resolve(baseCallbacks.onIdUpdate(props));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (pluginCallbacks.onIdUpdate) {
|
|
108
|
+
id = await Promise.resolve(pluginCallbacks.onIdUpdate({
|
|
109
|
+
...props,
|
|
110
|
+
entityId: id
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return id;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return Object.keys(mergedCallbacks).length > 0 ? mergedCallbacks : undefined;
|
|
119
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { FormexController } from "@firecms/formex";
|
|
2
|
+
|
|
3
|
+
export function createFormexStub<T extends object>(values: T): FormexController<T> {
|
|
4
|
+
const errorMessage = "You are in a read-only context. You cannot modify the formex controller.";
|
|
5
|
+
|
|
6
|
+
return {
|
|
7
|
+
values,
|
|
8
|
+
initialValues: values,
|
|
9
|
+
touched: {} as Record<string, boolean>,
|
|
10
|
+
dirty: false,
|
|
11
|
+
errors: {} as Record<string, string>,
|
|
12
|
+
submitCount: 0,
|
|
13
|
+
isSubmitting: false,
|
|
14
|
+
isValidating: false,
|
|
15
|
+
version: 0,
|
|
16
|
+
canUndo: false,
|
|
17
|
+
canRedo: false,
|
|
18
|
+
|
|
19
|
+
setValues: () => {
|
|
20
|
+
throw new Error(errorMessage);
|
|
21
|
+
},
|
|
22
|
+
setFieldValue: () => {
|
|
23
|
+
throw new Error(errorMessage);
|
|
24
|
+
},
|
|
25
|
+
setFieldTouched: () => {
|
|
26
|
+
throw new Error(errorMessage);
|
|
27
|
+
},
|
|
28
|
+
setDirty: () => {
|
|
29
|
+
throw new Error(errorMessage);
|
|
30
|
+
},
|
|
31
|
+
setSubmitCount: () => {
|
|
32
|
+
throw new Error(errorMessage);
|
|
33
|
+
},
|
|
34
|
+
setFieldError: () => {
|
|
35
|
+
throw new Error(errorMessage);
|
|
36
|
+
},
|
|
37
|
+
handleChange: () => {
|
|
38
|
+
throw new Error(errorMessage);
|
|
39
|
+
},
|
|
40
|
+
handleBlur: () => {
|
|
41
|
+
throw new Error(errorMessage);
|
|
42
|
+
},
|
|
43
|
+
handleSubmit: () => {
|
|
44
|
+
throw new Error(errorMessage);
|
|
45
|
+
},
|
|
46
|
+
validate: () => {
|
|
47
|
+
throw new Error(errorMessage);
|
|
48
|
+
},
|
|
49
|
+
resetForm: () => {
|
|
50
|
+
throw new Error(errorMessage);
|
|
51
|
+
},
|
|
52
|
+
setSubmitting: () => {
|
|
53
|
+
throw new Error(errorMessage);
|
|
54
|
+
},
|
|
55
|
+
undo: () => {
|
|
56
|
+
throw new Error(errorMessage);
|
|
57
|
+
},
|
|
58
|
+
redo: () => {
|
|
59
|
+
throw new Error(errorMessage);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
package/src/util/entities.ts
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
} from "../types";
|
|
16
16
|
import { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from "./common";
|
|
17
17
|
|
|
18
|
-
export function isReadOnly(property: Property | ResolvedProperty): boolean {
|
|
18
|
+
export function isReadOnly(property: Property<any> | ResolvedProperty<any>): boolean {
|
|
19
19
|
if (property.readOnly)
|
|
20
20
|
return true;
|
|
21
21
|
if (property.dataType === "date") {
|
|
@@ -23,7 +23,7 @@ export function isReadOnly(property: Property | ResolvedProperty): boolean {
|
|
|
23
23
|
return true;
|
|
24
24
|
}
|
|
25
25
|
if (property.dataType === "reference") {
|
|
26
|
-
return !property.path;
|
|
26
|
+
return !property.path && !property.Field;
|
|
27
27
|
}
|
|
28
28
|
return false;
|
|
29
29
|
}
|
|
@@ -40,13 +40,15 @@ export function getDefaultValuesFor<M extends Record<string, any>>(properties: P
|
|
|
40
40
|
if (!properties) return {};
|
|
41
41
|
return Object.entries(properties)
|
|
42
42
|
.map(([key, property]) => {
|
|
43
|
+
if (!property) return {};
|
|
43
44
|
const value = getDefaultValueFor(property as PropertyOrBuilder);
|
|
44
45
|
return value === undefined ? {} : { [key]: value };
|
|
45
46
|
})
|
|
46
47
|
.reduce((a, b) => ({ ...a, ...b }), {}) as EntityValues<M>;
|
|
47
48
|
}
|
|
48
49
|
|
|
49
|
-
export function getDefaultValueFor(property
|
|
50
|
+
export function getDefaultValueFor(property?: PropertyOrBuilder) {
|
|
51
|
+
if (!property) return undefined;
|
|
50
52
|
if (isPropertyBuilder(property)) return undefined;
|
|
51
53
|
if (property.defaultValue || property.defaultValue === null) {
|
|
52
54
|
return property.defaultValue;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { EntityAction } from "../types";
|
|
2
|
+
|
|
3
|
+
const reservedKeys = ["edit", "copy", "delete"];
|
|
4
|
+
|
|
5
|
+
export function mergeEntityActions(currentActions: EntityAction[], newActions: EntityAction[]): EntityAction[] {
|
|
6
|
+
// given the current actions, replace the ones with the same key
|
|
7
|
+
// and append the new ones
|
|
8
|
+
const updatedActions: EntityAction[] = [];
|
|
9
|
+
currentActions.forEach(action => {
|
|
10
|
+
const newAction = newActions.find(a => a.key === action.key);
|
|
11
|
+
if (newAction) {
|
|
12
|
+
const mergedAction = {
|
|
13
|
+
...action,
|
|
14
|
+
...newAction
|
|
15
|
+
}
|
|
16
|
+
updatedActions.push(mergedAction);
|
|
17
|
+
} else {
|
|
18
|
+
updatedActions.push(action);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
newActions.forEach(action => {
|
|
22
|
+
if (!currentActions.find(a => a.key === action.key) && (!action.key || !reservedKeys.includes(action.key))) {
|
|
23
|
+
updatedActions.push(action);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return updatedActions;
|
|
27
|
+
|
|
28
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { EntityReference, GeoPoint, Vector } from "../types";
|
|
2
|
+
|
|
3
|
+
// Define a unique prefix for entity keys in localStorage to avoid key collisions
|
|
4
|
+
const LOCAL_STORAGE_PREFIX = "entity_cache::";
|
|
5
|
+
|
|
6
|
+
// In-memory cache to store entities for quick access
|
|
7
|
+
const entityCache: Map<string, object> = new Map();
|
|
8
|
+
|
|
9
|
+
// Check `localStorage` availability once during initialization
|
|
10
|
+
const isLocalStorageAvailable = typeof localStorage !== "undefined";
|
|
11
|
+
|
|
12
|
+
// Define custom replacer for JSON.stringify
|
|
13
|
+
function customReplacer(key: string): any {
|
|
14
|
+
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
const value = this[key];
|
|
17
|
+
|
|
18
|
+
// Handle Date objects
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
if (value instanceof Date) {
|
|
21
|
+
return { __type: "Date", value: value.toISOString() };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Handle EntityReference
|
|
25
|
+
// @ts-ignore
|
|
26
|
+
if (value instanceof EntityReference) {
|
|
27
|
+
return { __type: "EntityReference", id: value.id, path: value.path };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Handle GeoPoint
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
if (value instanceof GeoPoint) {
|
|
33
|
+
return { __type: "GeoPoint", latitude: value.latitude, longitude: value.longitude };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Handle Vector
|
|
37
|
+
// @ts-ignore
|
|
38
|
+
if (value instanceof Vector) {
|
|
39
|
+
return { __type: "Vector", value: value.value };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Define custom reviver for JSON.parse
|
|
46
|
+
function customReviver(key: string, value: any): any {
|
|
47
|
+
if (value && typeof value === "object" && "__type" in value) {
|
|
48
|
+
switch (value.__type) {
|
|
49
|
+
case "Date":
|
|
50
|
+
return new Date(value.value);
|
|
51
|
+
case "EntityReference":
|
|
52
|
+
return new EntityReference(value.id, value.path);
|
|
53
|
+
case "GeoPoint":
|
|
54
|
+
return new GeoPoint(value.latitude, value.longitude);
|
|
55
|
+
case "Vector":
|
|
56
|
+
return new Vector(value.value);
|
|
57
|
+
default:
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Initialize the in-memory cache by loading entities from `localStorage`
|
|
65
|
+
if (isLocalStorageAvailable) {
|
|
66
|
+
try {
|
|
67
|
+
// Iterate over all keys in localStorage to find those with the specified prefix
|
|
68
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
69
|
+
const fullKey = localStorage.key(i);
|
|
70
|
+
if (fullKey && fullKey.startsWith(LOCAL_STORAGE_PREFIX)) {
|
|
71
|
+
const path = fullKey.substring(LOCAL_STORAGE_PREFIX.length);
|
|
72
|
+
const entityString = localStorage.getItem(fullKey);
|
|
73
|
+
if (entityString) {
|
|
74
|
+
try {
|
|
75
|
+
const entity: object = JSON.parse(entityString, customReviver);
|
|
76
|
+
entityCache.set(path, entity);
|
|
77
|
+
} catch (parseError) {
|
|
78
|
+
console.error(
|
|
79
|
+
`Failed to parse entity for path "${path}" from localStorage:`,
|
|
80
|
+
parseError
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.error("Error accessing localStorage during initialization:", error);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Saves data to the in-memory cache and persists it individually in `localStorage`.
|
|
93
|
+
* @param path - The unique path/key for the data.
|
|
94
|
+
* @param data - The data to cache and persist.
|
|
95
|
+
*/
|
|
96
|
+
export function saveEntityToCache(path: string, data: object): void {
|
|
97
|
+
// Update the in-memory cache
|
|
98
|
+
entityCache.set(path, data);
|
|
99
|
+
|
|
100
|
+
// Persist the data individually in localStorage
|
|
101
|
+
if (isLocalStorageAvailable) {
|
|
102
|
+
try {
|
|
103
|
+
const key = LOCAL_STORAGE_PREFIX + path;
|
|
104
|
+
const entityString = JSON.stringify(data, customReplacer);
|
|
105
|
+
localStorage.setItem(key, entityString);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error(
|
|
108
|
+
`Failed to save entity for path "${path}" to localStorage:`,
|
|
109
|
+
error
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Retrieves an entity from the in-memory cache or `localStorage`.
|
|
117
|
+
* If the entity is not in the cache but exists in `localStorage`, it loads it into the cache.
|
|
118
|
+
* @param path - The unique path/key for the entity.
|
|
119
|
+
* @returns The cached entity or `undefined` if not found.
|
|
120
|
+
*/
|
|
121
|
+
export function getEntityFromCache(path: string): object | undefined {
|
|
122
|
+
|
|
123
|
+
// Attempt to retrieve the entity from the in-memory cache
|
|
124
|
+
if (entityCache.has(path)) {
|
|
125
|
+
return entityCache.get(path);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// If not in the cache, attempt to load it from localStorage
|
|
129
|
+
if (isLocalStorageAvailable) {
|
|
130
|
+
try {
|
|
131
|
+
const key = LOCAL_STORAGE_PREFIX + path;
|
|
132
|
+
const entityString = localStorage.getItem(key);
|
|
133
|
+
if (entityString) {
|
|
134
|
+
const entity: object = JSON.parse(entityString, customReviver);
|
|
135
|
+
entityCache.set(path, entity); // Update the cache
|
|
136
|
+
return entity;
|
|
137
|
+
}
|
|
138
|
+
} catch (error) {
|
|
139
|
+
console.error(
|
|
140
|
+
`Failed to load entity for path "${path}" from localStorage:`,
|
|
141
|
+
error
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Entity not found
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function hasEntityInCache(path: string): boolean {
|
|
151
|
+
return entityCache.has(path);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Removes an entity from both the in-memory cache and `localStorage`.
|
|
156
|
+
* @param path - The unique path/key for the entity to remove.
|
|
157
|
+
*/
|
|
158
|
+
export function removeEntityFromCache(path: string): void {
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
console.debug("Removing entity from cache", path);
|
|
162
|
+
|
|
163
|
+
// Remove from the in-memory cache
|
|
164
|
+
entityCache.delete(path);
|
|
165
|
+
|
|
166
|
+
// Remove from localStorage
|
|
167
|
+
if (isLocalStorageAvailable) {
|
|
168
|
+
try {
|
|
169
|
+
const key = LOCAL_STORAGE_PREFIX + path;
|
|
170
|
+
localStorage.removeItem(key);
|
|
171
|
+
} catch (error) {
|
|
172
|
+
console.error(
|
|
173
|
+
`Failed to remove entity for path "${path}" from localStorage:`,
|
|
174
|
+
error
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Clears the entire in-memory cache and removes all related entities from `localStorage`.
|
|
182
|
+
*/
|
|
183
|
+
export function clearEntityCache(): void {
|
|
184
|
+
// Clear the in-memory cache
|
|
185
|
+
entityCache.clear();
|
|
186
|
+
|
|
187
|
+
// Remove all entities with the specified prefix from localStorage
|
|
188
|
+
if (isLocalStorageAvailable) {
|
|
189
|
+
try {
|
|
190
|
+
const keysToRemove: string[] = [];
|
|
191
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
192
|
+
const fullKey = localStorage.key(i);
|
|
193
|
+
if (fullKey && fullKey.startsWith(LOCAL_STORAGE_PREFIX)) {
|
|
194
|
+
keysToRemove.push(fullKey);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Remove the keys after collecting them to avoid issues while iterating
|
|
199
|
+
keysToRemove.forEach((key) => localStorage.removeItem(key));
|
|
200
|
+
} catch (error) {
|
|
201
|
+
console.error("Failed to clear entity cache from localStorage:", error);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
package/src/util/icon_list.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { iconKeys } from "@firecms/ui";
|
|
|
3
3
|
import Fuse from "fuse.js";
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
console.log("iconKeys", iconKeys);
|
|
7
6
|
const map = iconKeys
|
|
8
7
|
.map((importName) => {
|
|
9
8
|
// @ts-ignore
|
|
@@ -16,6 +15,7 @@ const map = iconKeys
|
|
|
16
15
|
export const iconsSearch = new Fuse(map, {
|
|
17
16
|
isCaseSensitive: false,
|
|
18
17
|
shouldSort: true,
|
|
18
|
+
ignoreLocation: true,
|
|
19
19
|
distance: 0,
|
|
20
20
|
keys: ["key", "synonyms"]
|
|
21
21
|
})
|
|
@@ -1222,7 +1222,6 @@ export const iconSynonyms = {
|
|
|
1222
1222
|
picture_in_picture_alt: "cropped overlap photo position shape",
|
|
1223
1223
|
pie_chart: "analytics bars data diagram infographic measure metrics statistics tracking",
|
|
1224
1224
|
pie_chart_outline: "analytics bars data diagram infographic measure metrics statistics tracking",
|
|
1225
|
-
pie_chart_outlined: "graph",
|
|
1226
1225
|
pin: "1 2 3 digit key login logout number password pattern security star symbol unlock",
|
|
1227
1226
|
pinch: "arrows compress direction finger grasp hand navigation nip squeeze tweak",
|
|
1228
1227
|
pin_drop: "destination direction gps location maps navigation place stop",
|
package/src/util/icons.tsx
CHANGED
|
@@ -1,16 +1,31 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { hashString } from "./hash";
|
|
3
|
-
import { coolIconKeys, Icon, iconKeys } from "@firecms/ui";
|
|
3
|
+
import { coolIconKeys, Icon, IconColor, iconKeys } from "@firecms/ui";
|
|
4
4
|
import { slugify } from "./strings";
|
|
5
5
|
import equal from "react-fast-compare"
|
|
6
6
|
|
|
7
|
-
export function getIcon(iconKey?: string
|
|
7
|
+
export function getIcon(iconKey?: string | React.ReactNode,
|
|
8
|
+
className?: string,
|
|
9
|
+
color?: IconColor,
|
|
10
|
+
size?: "smallest" | "small" | "medium" | "large" | number,): React.ReactElement | undefined {
|
|
11
|
+
|
|
12
|
+
if (React.isValidElement(iconKey)) {
|
|
13
|
+
return iconKey;
|
|
14
|
+
}
|
|
15
|
+
|
|
8
16
|
if (!iconKey) return undefined;
|
|
9
|
-
iconKey
|
|
10
|
-
|
|
11
|
-
|
|
17
|
+
if (typeof iconKey === "string") {
|
|
18
|
+
|
|
19
|
+
const usedIconKey = slugify(iconKey);
|
|
20
|
+
if (!(usedIconKey in iconKeysMap)) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return usedIconKey in iconKeysMap ?
|
|
24
|
+
<Icon iconKey={usedIconKey} size={size} className={className} color={color}/> : undefined;
|
|
12
25
|
}
|
|
13
|
-
|
|
26
|
+
|
|
27
|
+
console.warn("Invalid icon key provided:", iconKey);
|
|
28
|
+
return undefined;
|
|
14
29
|
}
|
|
15
30
|
|
|
16
31
|
export type IconViewProps = {
|
|
@@ -18,13 +33,23 @@ export type IconViewProps = {
|
|
|
18
33
|
name: string;
|
|
19
34
|
singularName?: string;
|
|
20
35
|
group?: string;
|
|
21
|
-
icon?: string;
|
|
36
|
+
icon?: string | React.ReactNode;
|
|
22
37
|
}
|
|
23
38
|
|
|
24
39
|
export const IconForView = React.memo(
|
|
25
|
-
function IconForView({
|
|
40
|
+
function IconForView({
|
|
41
|
+
collectionOrView,
|
|
42
|
+
className,
|
|
43
|
+
color,
|
|
44
|
+
size = "medium",
|
|
45
|
+
}: {
|
|
46
|
+
collectionOrView?: IconViewProps,
|
|
47
|
+
color?: IconColor,
|
|
48
|
+
className?: string,
|
|
49
|
+
size?: "smallest" | "small" | "medium" | "large" | number,
|
|
50
|
+
}): React.ReactElement {
|
|
26
51
|
if (!collectionOrView) return <></>;
|
|
27
|
-
const icon = getIcon(collectionOrView.icon, className);
|
|
52
|
+
const icon = getIcon(collectionOrView.icon, className, color, size);
|
|
28
53
|
if (collectionOrView?.icon && icon)
|
|
29
54
|
return icon;
|
|
30
55
|
|
|
@@ -45,9 +70,9 @@ export const IconForView = React.memo(
|
|
|
45
70
|
if (!key)
|
|
46
71
|
key = coolIconKeys[hashString(collectionOrView.path) % iconsCount];
|
|
47
72
|
|
|
48
|
-
return <Icon iconKey={key} size={
|
|
73
|
+
return <Icon iconKey={key} size={size} className={className} color={color}/>;
|
|
49
74
|
}, (prevProps, nextProps) => {
|
|
50
|
-
return equal(prevProps.collectionOrView?.icon, nextProps.collectionOrView?.icon);
|
|
75
|
+
return equal(prevProps.collectionOrView?.icon, nextProps.collectionOrView?.icon) && equal(prevProps.color, nextProps.color);
|
|
51
76
|
});
|
|
52
77
|
|
|
53
78
|
const iconKeysMap: Record<string, string> = iconKeys.reduce((acc: Record<string, string>, key) => {
|