@firecms/core 3.0.0-canary.4 → 3.0.0-canary.41
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/components/ClearFilterSortButton.d.ts +5 -0
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -11
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +2 -2
- package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -3
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
- package/dist/components/EntityPreview.d.ts +25 -7
- package/dist/components/EntityView.d.ts +11 -0
- package/dist/components/FieldCaption.d.ts +5 -0
- package/dist/components/HomePage/NavigationCard.d.ts +8 -0
- package/dist/components/HomePage/{NavigationCollectionCard.d.ts → NavigationCardBinding.d.ts} +2 -2
- package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
- package/dist/components/HomePage/index.d.ts +3 -1
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +1 -1
- package/dist/components/index.d.ts +4 -3
- package/dist/contexts/AuthControllerContext.d.ts +1 -1
- package/dist/{internal/EntityView.d.ts → core/EntityEditView.d.ts} +2 -2
- package/dist/core/SideEntityView.d.ts +7 -0
- package/dist/core/index.d.ts +0 -2
- package/dist/form/EntityForm.d.ts +1 -1
- package/dist/form/components/ErrorFocus.d.ts +1 -1
- package/dist/form/components/StorageItemPreview.d.ts +3 -2
- package/dist/form/components/StorageUploadProgress.d.ts +1 -1
- package/dist/form/components/index.d.ts +1 -0
- 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/StorageUploadFieldBinding.d.ts +4 -3
- package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -2
- package/dist/form/index.d.ts +1 -0
- package/dist/form/validation.d.ts +1 -1
- package/dist/hooks/data/delete.d.ts +2 -2
- package/dist/hooks/data/save.d.ts +1 -1
- package/dist/hooks/data/useDataSource.d.ts +2 -2
- package/dist/hooks/data/useEntityFetch.d.ts +3 -3
- package/dist/hooks/index.d.ts +3 -1
- package/dist/{core → hooks}/useBuildModeController.d.ts +1 -1
- package/dist/hooks/useBuildNavigationController.d.ts +6 -4
- package/dist/hooks/useProjectLog.d.ts +6 -2
- package/dist/hooks/useStorageSource.d.ts +2 -2
- package/dist/hooks/useValidateAuthenticator.d.ts +25 -0
- package/dist/index.es.js +8258 -7767
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +5 -5
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +4 -0
- package/dist/preview/PropertyPreview.d.ts +1 -1
- package/dist/preview/PropertyPreviewProps.d.ts +1 -4
- package/dist/preview/components/BooleanPreview.d.ts +5 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +1 -7
- package/dist/types/analytics.d.ts +1 -1
- package/dist/types/auth.d.ts +37 -1
- package/dist/types/collections.d.ts +22 -5
- package/dist/types/datasource.d.ts +1 -1
- package/dist/types/entities.d.ts +1 -1
- package/dist/types/entity_callbacks.d.ts +2 -2
- package/dist/types/entity_overrides.d.ts +6 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/navigation.d.ts +14 -13
- package/dist/types/permissions.d.ts +5 -1
- package/dist/types/plugins.d.ts +20 -20
- package/dist/types/properties.d.ts +2 -2
- package/dist/types/property_config.d.ts +2 -2
- package/dist/types/roles.d.ts +31 -0
- package/dist/types/storage.d.ts +11 -3
- package/dist/types/user.d.ts +5 -0
- package/dist/util/collections.d.ts +9 -1
- package/dist/util/entities.d.ts +1 -1
- package/dist/util/icons.d.ts +8 -2
- package/dist/util/navigation_utils.d.ts +2 -2
- package/dist/util/permissions.d.ts +4 -4
- package/dist/util/references.d.ts +4 -2
- package/dist/util/resolutions.d.ts +6 -6
- package/dist/util/useTraceUpdate.d.ts +1 -0
- package/package.json +27 -24
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/DeleteEntityDialog.tsx +4 -4
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +2 -2
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +268 -277
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +1 -1
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +13 -13
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +9 -16
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +3 -3
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +27 -32
- package/src/components/EntityCollectionTable/internal/default_entity_actions.tsx +9 -5
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +51 -52
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +5 -6
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +30 -0
- package/src/components/EntityPreview.tsx +207 -70
- package/src/components/EntityView.tsx +84 -0
- package/src/components/FieldCaption.tsx +14 -0
- package/src/components/FireCMSAppBar.tsx +8 -0
- package/src/components/HomePage/DefaultHomePage.tsx +14 -10
- package/src/components/HomePage/NavigationCard.tsx +69 -0
- package/src/components/HomePage/NavigationCardBinding.tsx +116 -0
- package/src/components/HomePage/SmallNavigationCard.tsx +45 -0
- package/src/components/HomePage/index.tsx +3 -1
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +3 -4
- package/src/components/ReferenceWidget.tsx +4 -4
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +23 -8
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +35 -24
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +35 -15
- package/src/components/VirtualTable/VirtualTable.tsx +17 -7
- package/src/components/VirtualTable/VirtualTableProps.tsx +1 -1
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +1 -1
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +1 -1
- package/src/components/index.tsx +4 -3
- package/src/contexts/AuthControllerContext.tsx +1 -1
- package/src/core/Drawer.tsx +66 -39
- package/src/{internal/EntityView.tsx → core/EntityEditView.tsx} +22 -39
- package/src/core/EntitySidePanel.tsx +2 -2
- package/src/core/FireCMS.tsx +18 -3
- package/src/core/NavigationRoutes.tsx +8 -0
- package/src/core/SideEntityView.tsx +38 -0
- package/src/core/field_configs.tsx +1 -2
- package/src/core/index.tsx +0 -2
- package/src/form/EntityForm.tsx +20 -12
- package/src/form/components/StorageItemPreview.tsx +5 -3
- package/src/form/components/StorageUploadProgress.tsx +6 -5
- package/src/form/components/index.tsx +1 -0
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +2 -3
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +12 -15
- package/src/form/field_bindings/BlockFieldBinding.tsx +2 -3
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +4 -4
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +18 -18
- package/src/form/field_bindings/MapFieldBinding.tsx +17 -17
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +1 -2
- package/src/form/field_bindings/MultiSelectBinding.tsx +2 -3
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +3 -3
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +5 -3
- package/src/form/field_bindings/RepeatFieldBinding.tsx +3 -3
- package/src/form/field_bindings/SelectFieldBinding.tsx +2 -3
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +15 -6
- package/src/form/field_bindings/SwitchFieldBinding.tsx +2 -3
- package/src/form/field_bindings/TextFieldBinding.tsx +10 -9
- package/src/form/index.tsx +1 -0
- package/src/form/validation.ts +3 -4
- package/src/hooks/data/delete.ts +3 -3
- package/src/hooks/data/save.ts +1 -1
- package/src/hooks/data/useCollectionFetch.tsx +1 -1
- package/src/hooks/data/useDataSource.tsx +8 -3
- package/src/hooks/data/useEntityFetch.tsx +4 -4
- package/src/hooks/index.tsx +5 -1
- package/src/{core → hooks}/useBuildLocalConfigurationPersistence.tsx +9 -10
- package/src/{core → hooks}/useBuildModeController.tsx +12 -6
- package/src/hooks/useBuildNavigationController.tsx +197 -79
- package/src/hooks/useProjectLog.tsx +17 -7
- package/src/hooks/useReferenceDialog.tsx +2 -2
- package/src/hooks/useStorageSource.tsx +7 -2
- package/src/hooks/useValidateAuthenticator.tsx +135 -0
- package/src/internal/useBuildDataSource.ts +6 -1
- package/src/internal/useBuildSideEntityController.tsx +18 -12
- package/src/preview/PropertyPreview.tsx +1 -1
- package/src/preview/PropertyPreviewProps.tsx +1 -11
- package/src/preview/components/BooleanPreview.tsx +19 -4
- package/src/preview/components/EnumValuesChip.tsx +1 -1
- package/src/preview/components/ReferencePreview.tsx +55 -147
- package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
- package/src/types/analytics.ts +1 -0
- package/src/types/auth.tsx +50 -1
- package/src/types/collections.ts +24 -5
- package/src/types/datasource.ts +1 -1
- package/src/types/entities.ts +1 -1
- package/src/types/entity_actions.tsx +4 -0
- package/src/types/entity_callbacks.ts +2 -2
- package/src/types/entity_overrides.tsx +7 -0
- package/src/types/firecms.tsx +0 -1
- package/src/types/index.ts +2 -0
- package/src/types/navigation.ts +17 -16
- package/src/types/permissions.ts +6 -1
- package/src/types/plugins.tsx +26 -28
- package/src/types/properties.ts +3 -2
- package/src/types/property_config.tsx +2 -2
- package/src/types/roles.ts +41 -0
- package/src/types/side_entity_controller.tsx +1 -0
- package/src/types/storage.ts +12 -3
- package/src/types/user.ts +7 -0
- package/src/util/collections.ts +22 -0
- package/src/util/entities.ts +1 -1
- package/src/util/icons.tsx +11 -3
- package/src/util/navigation_utils.ts +6 -6
- package/src/util/permissions.ts +11 -8
- package/src/util/references.ts +36 -5
- package/src/util/strings.ts +2 -2
- package/src/util/useTraceUpdate.tsx +2 -1
- package/dist/internal/useLocaleConfig.d.ts +0 -1
- package/src/components/HomePage/NavigationCollectionCard.tsx +0 -146
- package/src/internal/useLocaleConfig.tsx +0 -18
- /package/dist/{components → form/components}/LabelWithIcon.d.ts +0 -0
- /package/dist/{core → hooks}/useBuildLocalConfigurationPersistence.d.ts +0 -0
- /package/src/{components → form/components}/LabelWithIcon.tsx +0 -0
package/src/util/icons.tsx
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { CMSView, EntityCollection } from "../types";
|
|
3
2
|
import { hashString } from "./hash";
|
|
4
3
|
import { coolIconKeys, Icon, iconKeys } from "@firecms/ui";
|
|
5
4
|
import { slugify } from "./strings";
|
|
@@ -14,8 +13,17 @@ export function getIcon(iconKey?: string, className?: string): React.ReactElemen
|
|
|
14
13
|
return iconKey in iconKeysMap ? <Icon iconKey={iconKey} size={"medium"} className={className}/> : undefined;
|
|
15
14
|
}
|
|
16
15
|
|
|
16
|
+
export type IconViewProps = {
|
|
17
|
+
path: string;
|
|
18
|
+
name: string;
|
|
19
|
+
singularName?: string;
|
|
20
|
+
group?: string;
|
|
21
|
+
icon?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
17
24
|
export const IconForView = React.memo(
|
|
18
|
-
function IconForView({ collectionOrView, className }: { collectionOrView
|
|
25
|
+
function IconForView({ collectionOrView, className }: { collectionOrView?: IconViewProps, className?: string }): React.ReactElement {
|
|
26
|
+
if (!collectionOrView) return <></>;
|
|
19
27
|
const icon = getIcon(collectionOrView.icon, className);
|
|
20
28
|
if (collectionOrView?.icon && icon)
|
|
21
29
|
return icon;
|
|
@@ -39,7 +47,7 @@ export const IconForView = React.memo(
|
|
|
39
47
|
|
|
40
48
|
return <Icon iconKey={key} size={"medium"} className={className}/>;
|
|
41
49
|
}, (prevProps, nextProps) => {
|
|
42
|
-
return equal(prevProps.collectionOrView
|
|
50
|
+
return equal(prevProps.collectionOrView?.icon, nextProps.collectionOrView?.icon);
|
|
43
51
|
});
|
|
44
52
|
|
|
45
53
|
const iconKeysMap: Record<string, string> = iconKeys.reduce((acc: Record<string, string>, key) => {
|
|
@@ -60,14 +60,14 @@ export function resolveCollectionPathIds(path: string, allCollections: EntityCol
|
|
|
60
60
|
/**
|
|
61
61
|
* Find the corresponding view at any depth for a given path.
|
|
62
62
|
* Note that path or segments of the paths can be collection aliases.
|
|
63
|
-
* @param
|
|
63
|
+
* @param pathOrId
|
|
64
64
|
* @param collections
|
|
65
65
|
*/
|
|
66
|
-
export function getCollectionByPathOrId(
|
|
66
|
+
export function getCollectionByPathOrId(pathOrId: string, collections: EntityCollection[]): EntityCollection | undefined {
|
|
67
67
|
|
|
68
|
-
const subpaths = removeInitialAndTrailingSlashes(
|
|
68
|
+
const subpaths = removeInitialAndTrailingSlashes(pathOrId).split("/");
|
|
69
69
|
if (subpaths.length % 2 === 0) {
|
|
70
|
-
throw Error(`
|
|
70
|
+
throw Error(`getCollectionByPathOrId: Collection paths must have an odd number of segments: ${pathOrId}`);
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
const subpathCombinations = getCollectionPathsCombinations(subpaths);
|
|
@@ -80,10 +80,10 @@ export function getCollectionByPathOrId(pathOrAlias: string, collections: Entity
|
|
|
80
80
|
|
|
81
81
|
if (navigationEntry) {
|
|
82
82
|
|
|
83
|
-
if (subpathCombination ===
|
|
83
|
+
if (subpathCombination === pathOrId) {
|
|
84
84
|
result = navigationEntry;
|
|
85
85
|
} else if (navigationEntry.subcollections) {
|
|
86
|
-
const newPath =
|
|
86
|
+
const newPath = pathOrId.replace(subpathCombination, "").split("/").slice(2).join("/");
|
|
87
87
|
if (newPath.length > 0)
|
|
88
88
|
result = getCollectionByPathOrId(newPath, navigationEntry.subcollections);
|
|
89
89
|
}
|
package/src/util/permissions.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AuthController, Entity, EntityCollection, Permissions, User } from "../types";
|
|
2
|
+
import { fullPathToCollectionSegments } from "./paths";
|
|
2
3
|
|
|
3
4
|
const DEFAULT_PERMISSIONS = {
|
|
4
5
|
read: true,
|
|
@@ -10,8 +11,8 @@ const DEFAULT_PERMISSIONS = {
|
|
|
10
11
|
export function resolvePermissions<M extends Record<string, any>, UserType extends User>
|
|
11
12
|
(collection: EntityCollection<M>,
|
|
12
13
|
authController: AuthController<UserType>,
|
|
13
|
-
|
|
14
|
-
entity: Entity<M> | null): Permissions {
|
|
14
|
+
path: string,
|
|
15
|
+
entity: Entity<M> | null): Permissions | undefined {
|
|
15
16
|
|
|
16
17
|
const permission = collection.permissions;
|
|
17
18
|
if (permission === undefined) {
|
|
@@ -19,8 +20,10 @@ export function resolvePermissions<M extends Record<string, any>, UserType exten
|
|
|
19
20
|
} else if (typeof permission === "object") {
|
|
20
21
|
return permission as Permissions;
|
|
21
22
|
} else if (typeof permission === "function") {
|
|
23
|
+
const pathSegments = fullPathToCollectionSegments(path);
|
|
22
24
|
return permission({
|
|
23
25
|
entity,
|
|
26
|
+
path,
|
|
24
27
|
user: authController.user,
|
|
25
28
|
authController,
|
|
26
29
|
collection,
|
|
@@ -35,27 +38,27 @@ export function canEditEntity<M extends Record<string, any>, UserType extends Us
|
|
|
35
38
|
(
|
|
36
39
|
collection: EntityCollection<M>,
|
|
37
40
|
authController: AuthController<UserType>,
|
|
38
|
-
|
|
41
|
+
path: string,
|
|
39
42
|
entity: Entity<M> | null): boolean {
|
|
40
|
-
return resolvePermissions(collection, authController,
|
|
43
|
+
return resolvePermissions(collection, authController, path, entity)?.edit ?? DEFAULT_PERMISSIONS.edit;
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
export function canCreateEntity<M extends Record<string, any>, UserType extends User>
|
|
44
47
|
(
|
|
45
48
|
collection: EntityCollection<M>,
|
|
46
49
|
authController: AuthController<UserType>,
|
|
47
|
-
|
|
50
|
+
path: string,
|
|
48
51
|
entity: Entity<M> | null): boolean {
|
|
49
|
-
return resolvePermissions(collection, authController,
|
|
52
|
+
return resolvePermissions(collection, authController, path, entity)?.create ?? DEFAULT_PERMISSIONS.create;
|
|
50
53
|
}
|
|
51
54
|
|
|
52
55
|
export function canDeleteEntity<M extends Record<string, any>, UserType extends User>
|
|
53
56
|
(
|
|
54
57
|
collection: EntityCollection<M>,
|
|
55
58
|
authController: AuthController<UserType>,
|
|
56
|
-
|
|
59
|
+
path: string,
|
|
57
60
|
entity: Entity<M> | null): boolean {
|
|
58
|
-
return resolvePermissions(collection, authController,
|
|
61
|
+
return resolvePermissions(collection, authController, path, entity)?.delete ?? DEFAULT_PERMISSIONS.delete;
|
|
59
62
|
}
|
|
60
63
|
|
|
61
64
|
// export function resolveCollectionsPermissions(roles: Role[]): Record<string, Permissions> {
|
package/src/util/references.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { EntityCollection, PropertyConfig } from "../types";
|
|
1
|
+
import { EntityCollection, PropertyConfig, ResolvedEntityCollection } from "../types";
|
|
2
2
|
import { isReferenceProperty } from "./property_utils";
|
|
3
3
|
import { isPropertyBuilder } from "./entities";
|
|
4
|
+
import { getFieldConfig } from "../core";
|
|
4
5
|
|
|
5
|
-
export function
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
export function getEntityPreviewKeys(targetCollection: EntityCollection<any>,
|
|
7
|
+
fields: Record<string, PropertyConfig>,
|
|
8
|
+
previewProperties?: string[],
|
|
9
|
+
limit = 3) {
|
|
9
10
|
const allProperties = Object.keys(targetCollection.properties);
|
|
10
11
|
let listProperties = previewProperties?.filter(p => allProperties.includes(p as string));
|
|
11
12
|
if (listProperties && listProperties.length > 0) {
|
|
@@ -18,3 +19,33 @@ export function getReferencePreviewKeys(targetCollection: EntityCollection<any>,
|
|
|
18
19
|
}).slice(0, limit);
|
|
19
20
|
}
|
|
20
21
|
}
|
|
22
|
+
|
|
23
|
+
export function getEntityTitlePropertyKey<M extends Record<string, any>>(collection: EntityCollection<M>, propertyConfigs: Record<string, PropertyConfig<any>>): string | undefined {
|
|
24
|
+
if (collection.titleProperty) {
|
|
25
|
+
return collection.titleProperty as string;
|
|
26
|
+
}
|
|
27
|
+
// find first text field property
|
|
28
|
+
for (const key in collection.properties) {
|
|
29
|
+
const property = collection.properties[key];
|
|
30
|
+
if (!isPropertyBuilder(property)) {
|
|
31
|
+
const field = getFieldConfig(property, propertyConfigs);
|
|
32
|
+
if (field?.key === "text_field") {
|
|
33
|
+
return key;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function getEntityImagePreviewPropertyKey<M extends object>(collection: ResolvedEntityCollection<M>): string | undefined {
|
|
41
|
+
|
|
42
|
+
// find first text field property
|
|
43
|
+
for (const key in collection.properties) {
|
|
44
|
+
const property = collection.properties[key];
|
|
45
|
+
if (property.dataType === "string" && property.storage?.acceptedFiles?.includes("image/*")) {
|
|
46
|
+
return key;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
package/src/util/strings.ts
CHANGED
|
@@ -56,8 +56,8 @@ export function unslugify(slug?: string): string {
|
|
|
56
56
|
const result = slug.replace(/[-_]/g, " ");
|
|
57
57
|
return result.replace(/\w\S*/g, function (txt) {
|
|
58
58
|
return txt.charAt(0).toUpperCase() + txt.substr(1);
|
|
59
|
-
});
|
|
59
|
+
}).trim();
|
|
60
60
|
} else {
|
|
61
|
-
return slug;
|
|
61
|
+
return slug.trim();
|
|
62
62
|
}
|
|
63
63
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useEffect, useRef } from "react";
|
|
2
2
|
|
|
3
|
-
function printChanged(props: any, prev: any, path = "", depth = 0, maxDepth: number) {
|
|
3
|
+
export function printChanged(props: any, prev: any, path: string | undefined = "", depth: number | undefined = 0, maxDepth: number | undefined = 10) {
|
|
4
4
|
if (depth > maxDepth) {
|
|
5
5
|
return;
|
|
6
6
|
}
|
|
@@ -17,6 +17,7 @@ function printChanged(props: any, prev: any, path = "", depth = 0, maxDepth: num
|
|
|
17
17
|
export function useTraceUpdate(props: any, maxDepth = 3) {
|
|
18
18
|
const prev = useRef(props);
|
|
19
19
|
useEffect(() => {
|
|
20
|
+
console.log("Changed props:");
|
|
20
21
|
printChanged(props, prev.current, "", 0, maxDepth);
|
|
21
22
|
prev.current = props;
|
|
22
23
|
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function useLocaleConfig(locale?: string): void;
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { useNavigate } from "react-router-dom";
|
|
2
|
-
|
|
3
|
-
import { useCustomizationController, useFireCMSContext } from "../../hooks";
|
|
4
|
-
import { PluginHomePageActionsProps, TopNavigationEntry } from "../../types";
|
|
5
|
-
import { IconForView } from "../../util";
|
|
6
|
-
import { useUserConfigurationPersistence } from "../../hooks/useUserConfigurationPersistence";
|
|
7
|
-
import { ArrowForwardIcon, Card, cn, IconButton, Markdown, StarBorderIcon, StarIcon, Typography } from "@firecms/ui";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* This is the component used in the home page to render a card for each
|
|
11
|
-
* collection.
|
|
12
|
-
* @group Components
|
|
13
|
-
* @param view
|
|
14
|
-
* @param path
|
|
15
|
-
* @param collection
|
|
16
|
-
* @param url
|
|
17
|
-
* @param name
|
|
18
|
-
* @param description
|
|
19
|
-
* @param onClick
|
|
20
|
-
* @constructor
|
|
21
|
-
*/
|
|
22
|
-
export function NavigationCollectionCard({
|
|
23
|
-
view,
|
|
24
|
-
path,
|
|
25
|
-
collection,
|
|
26
|
-
url,
|
|
27
|
-
name,
|
|
28
|
-
description,
|
|
29
|
-
onClick
|
|
30
|
-
}: TopNavigationEntry & {
|
|
31
|
-
onClick?: () => void
|
|
32
|
-
}) {
|
|
33
|
-
|
|
34
|
-
const userConfigurationPersistence = useUserConfigurationPersistence();
|
|
35
|
-
const collectionIcon = <IconForView collectionOrView={collection ?? view}/>;
|
|
36
|
-
|
|
37
|
-
const navigate = useNavigate();
|
|
38
|
-
const context = useFireCMSContext();
|
|
39
|
-
const customizationController = useCustomizationController();
|
|
40
|
-
|
|
41
|
-
const favourite = (userConfigurationPersistence?.favouritePaths ?? []).includes(path);
|
|
42
|
-
|
|
43
|
-
let actions: React.ReactNode | undefined;
|
|
44
|
-
if (customizationController.plugins && collection) {
|
|
45
|
-
const actionProps: PluginHomePageActionsProps = {
|
|
46
|
-
path,
|
|
47
|
-
collection,
|
|
48
|
-
context
|
|
49
|
-
};
|
|
50
|
-
actions = <>
|
|
51
|
-
{customizationController.plugins.map((plugin, i) => (
|
|
52
|
-
plugin.homePage?.CollectionActions
|
|
53
|
-
? <plugin.homePage.CollectionActions
|
|
54
|
-
key={`actions_${i}`}
|
|
55
|
-
{...actionProps}
|
|
56
|
-
extraProps={plugin.homePage.extraProps}
|
|
57
|
-
/>
|
|
58
|
-
: null
|
|
59
|
-
))}
|
|
60
|
-
</>
|
|
61
|
-
;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return (
|
|
65
|
-
<Card
|
|
66
|
-
className={cn("h-full p-4 cursor-pointer min-h-[230px]")}
|
|
67
|
-
onClick={() => {
|
|
68
|
-
onClick?.();
|
|
69
|
-
navigate(url);
|
|
70
|
-
if (userConfigurationPersistence) {
|
|
71
|
-
userConfigurationPersistence.setRecentlyVisitedPaths(
|
|
72
|
-
[path, ...(userConfigurationPersistence.recentlyVisitedPaths ?? []).filter(p => p !== path)]
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
}}>
|
|
76
|
-
|
|
77
|
-
<div className="flex flex-col items-start h-full">
|
|
78
|
-
<div
|
|
79
|
-
className="flex-grow w-full">
|
|
80
|
-
|
|
81
|
-
<div
|
|
82
|
-
className="h-10 flex items-center w-full justify-between text-gray-300 dark:text-gray-600">
|
|
83
|
-
|
|
84
|
-
{collectionIcon}
|
|
85
|
-
|
|
86
|
-
<div
|
|
87
|
-
className="flex items-center gap-1"
|
|
88
|
-
onClick={(event: React.MouseEvent) => {
|
|
89
|
-
event.preventDefault();
|
|
90
|
-
event.stopPropagation();
|
|
91
|
-
}}>
|
|
92
|
-
|
|
93
|
-
{actions}
|
|
94
|
-
|
|
95
|
-
{userConfigurationPersistence &&
|
|
96
|
-
<IconButton
|
|
97
|
-
onClick={(e) => {
|
|
98
|
-
e.preventDefault();
|
|
99
|
-
e.stopPropagation();
|
|
100
|
-
if (favourite) {
|
|
101
|
-
userConfigurationPersistence.setFavouritePaths(
|
|
102
|
-
userConfigurationPersistence.favouritePaths.filter(p => p !== path)
|
|
103
|
-
);
|
|
104
|
-
} else {
|
|
105
|
-
userConfigurationPersistence.setFavouritePaths(
|
|
106
|
-
[...userConfigurationPersistence.favouritePaths, path]
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
}}>
|
|
110
|
-
{
|
|
111
|
-
favourite
|
|
112
|
-
? <StarIcon
|
|
113
|
-
size={18}
|
|
114
|
-
className={"text-secondary"}/>
|
|
115
|
-
: <StarBorderIcon
|
|
116
|
-
size={18}
|
|
117
|
-
className={"text-gray-400 dark:text-gray-500"}/>}
|
|
118
|
-
</IconButton>}
|
|
119
|
-
|
|
120
|
-
</div>
|
|
121
|
-
|
|
122
|
-
</div>
|
|
123
|
-
|
|
124
|
-
<Typography gutterBottom variant="h5"
|
|
125
|
-
component="h2">
|
|
126
|
-
{name}
|
|
127
|
-
</Typography>
|
|
128
|
-
|
|
129
|
-
{description && <Typography variant="body2"
|
|
130
|
-
color="secondary"
|
|
131
|
-
component="div">
|
|
132
|
-
<Markdown source={description}/>
|
|
133
|
-
</Typography>}
|
|
134
|
-
</div>
|
|
135
|
-
|
|
136
|
-
<div style={{ alignSelf: "flex-end" }}>
|
|
137
|
-
|
|
138
|
-
<div className={"p-4"}>
|
|
139
|
-
<ArrowForwardIcon className="text-primary"/>
|
|
140
|
-
</div>
|
|
141
|
-
</div>
|
|
142
|
-
|
|
143
|
-
</div>
|
|
144
|
-
|
|
145
|
-
</Card>);
|
|
146
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as locales from "date-fns/locale";
|
|
2
|
-
// @ts-ignore
|
|
3
|
-
import { registerLocale, setDefaultLocale } from "react-datepicker";
|
|
4
|
-
import { useEffect } from "react";
|
|
5
|
-
|
|
6
|
-
export function useLocaleConfig(locale?: string) {
|
|
7
|
-
useEffect(() => {
|
|
8
|
-
if (!locale) {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
// @ts-ignore
|
|
12
|
-
const dateFnsLocale = locales[locale];
|
|
13
|
-
if (dateFnsLocale) {
|
|
14
|
-
registerLocale(locale, dateFnsLocale);
|
|
15
|
-
setDefaultLocale(locale);
|
|
16
|
-
}
|
|
17
|
-
}, [locale])
|
|
18
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|