@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.
Files changed (195) hide show
  1. package/README.md +2 -2
  2. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  3. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -11
  4. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  5. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +2 -2
  6. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  7. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -3
  8. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  9. package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
  10. package/dist/components/EntityPreview.d.ts +25 -7
  11. package/dist/components/EntityView.d.ts +11 -0
  12. package/dist/components/FieldCaption.d.ts +5 -0
  13. package/dist/components/HomePage/NavigationCard.d.ts +8 -0
  14. package/dist/components/HomePage/{NavigationCollectionCard.d.ts → NavigationCardBinding.d.ts} +2 -2
  15. package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
  16. package/dist/components/HomePage/index.d.ts +3 -1
  17. package/dist/components/VirtualTable/VirtualTableProps.d.ts +1 -1
  18. package/dist/components/index.d.ts +4 -3
  19. package/dist/contexts/AuthControllerContext.d.ts +1 -1
  20. package/dist/{internal/EntityView.d.ts → core/EntityEditView.d.ts} +2 -2
  21. package/dist/core/SideEntityView.d.ts +7 -0
  22. package/dist/core/index.d.ts +0 -2
  23. package/dist/form/EntityForm.d.ts +1 -1
  24. package/dist/form/components/ErrorFocus.d.ts +1 -1
  25. package/dist/form/components/StorageItemPreview.d.ts +3 -2
  26. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  27. package/dist/form/components/index.d.ts +1 -0
  28. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  29. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  30. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +4 -3
  31. package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -2
  32. package/dist/form/index.d.ts +1 -0
  33. package/dist/form/validation.d.ts +1 -1
  34. package/dist/hooks/data/delete.d.ts +2 -2
  35. package/dist/hooks/data/save.d.ts +1 -1
  36. package/dist/hooks/data/useDataSource.d.ts +2 -2
  37. package/dist/hooks/data/useEntityFetch.d.ts +3 -3
  38. package/dist/hooks/index.d.ts +3 -1
  39. package/dist/{core → hooks}/useBuildModeController.d.ts +1 -1
  40. package/dist/hooks/useBuildNavigationController.d.ts +6 -4
  41. package/dist/hooks/useProjectLog.d.ts +6 -2
  42. package/dist/hooks/useStorageSource.d.ts +2 -2
  43. package/dist/hooks/useValidateAuthenticator.d.ts +25 -0
  44. package/dist/index.es.js +8258 -7767
  45. package/dist/index.es.js.map +1 -1
  46. package/dist/index.umd.js +5 -5
  47. package/dist/index.umd.js.map +1 -1
  48. package/dist/internal/useBuildDataSource.d.ts +4 -0
  49. package/dist/preview/PropertyPreview.d.ts +1 -1
  50. package/dist/preview/PropertyPreviewProps.d.ts +1 -4
  51. package/dist/preview/components/BooleanPreview.d.ts +5 -1
  52. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  53. package/dist/preview/components/ReferencePreview.d.ts +1 -7
  54. package/dist/types/analytics.d.ts +1 -1
  55. package/dist/types/auth.d.ts +37 -1
  56. package/dist/types/collections.d.ts +22 -5
  57. package/dist/types/datasource.d.ts +1 -1
  58. package/dist/types/entities.d.ts +1 -1
  59. package/dist/types/entity_callbacks.d.ts +2 -2
  60. package/dist/types/entity_overrides.d.ts +6 -0
  61. package/dist/types/index.d.ts +2 -0
  62. package/dist/types/navigation.d.ts +14 -13
  63. package/dist/types/permissions.d.ts +5 -1
  64. package/dist/types/plugins.d.ts +20 -20
  65. package/dist/types/properties.d.ts +2 -2
  66. package/dist/types/property_config.d.ts +2 -2
  67. package/dist/types/roles.d.ts +31 -0
  68. package/dist/types/storage.d.ts +11 -3
  69. package/dist/types/user.d.ts +5 -0
  70. package/dist/util/collections.d.ts +9 -1
  71. package/dist/util/entities.d.ts +1 -1
  72. package/dist/util/icons.d.ts +8 -2
  73. package/dist/util/navigation_utils.d.ts +2 -2
  74. package/dist/util/permissions.d.ts +4 -4
  75. package/dist/util/references.d.ts +4 -2
  76. package/dist/util/resolutions.d.ts +6 -6
  77. package/dist/util/useTraceUpdate.d.ts +1 -0
  78. package/package.json +27 -24
  79. package/src/components/ClearFilterSortButton.tsx +41 -0
  80. package/src/components/DeleteEntityDialog.tsx +4 -4
  81. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +2 -2
  82. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +268 -277
  83. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +1 -1
  84. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +13 -13
  85. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +9 -16
  86. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +3 -3
  87. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +27 -32
  88. package/src/components/EntityCollectionTable/internal/default_entity_actions.tsx +9 -5
  89. package/src/components/EntityCollectionView/EntityCollectionView.tsx +51 -52
  90. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +5 -6
  91. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  92. package/src/components/EntityCollectionView/useSelectionController.tsx +30 -0
  93. package/src/components/EntityPreview.tsx +207 -70
  94. package/src/components/EntityView.tsx +84 -0
  95. package/src/components/FieldCaption.tsx +14 -0
  96. package/src/components/FireCMSAppBar.tsx +8 -0
  97. package/src/components/HomePage/DefaultHomePage.tsx +14 -10
  98. package/src/components/HomePage/NavigationCard.tsx +69 -0
  99. package/src/components/HomePage/NavigationCardBinding.tsx +116 -0
  100. package/src/components/HomePage/SmallNavigationCard.tsx +45 -0
  101. package/src/components/HomePage/index.tsx +3 -1
  102. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +3 -4
  103. package/src/components/ReferenceWidget.tsx +4 -4
  104. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +23 -8
  105. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +35 -24
  106. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +35 -15
  107. package/src/components/VirtualTable/VirtualTable.tsx +17 -7
  108. package/src/components/VirtualTable/VirtualTableProps.tsx +1 -1
  109. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +1 -1
  110. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +1 -1
  111. package/src/components/index.tsx +4 -3
  112. package/src/contexts/AuthControllerContext.tsx +1 -1
  113. package/src/core/Drawer.tsx +66 -39
  114. package/src/{internal/EntityView.tsx → core/EntityEditView.tsx} +22 -39
  115. package/src/core/EntitySidePanel.tsx +2 -2
  116. package/src/core/FireCMS.tsx +18 -3
  117. package/src/core/NavigationRoutes.tsx +8 -0
  118. package/src/core/SideEntityView.tsx +38 -0
  119. package/src/core/field_configs.tsx +1 -2
  120. package/src/core/index.tsx +0 -2
  121. package/src/form/EntityForm.tsx +20 -12
  122. package/src/form/components/StorageItemPreview.tsx +5 -3
  123. package/src/form/components/StorageUploadProgress.tsx +6 -5
  124. package/src/form/components/index.tsx +1 -0
  125. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +2 -3
  126. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +12 -15
  127. package/src/form/field_bindings/BlockFieldBinding.tsx +2 -3
  128. package/src/form/field_bindings/DateTimeFieldBinding.tsx +4 -4
  129. package/src/form/field_bindings/KeyValueFieldBinding.tsx +18 -18
  130. package/src/form/field_bindings/MapFieldBinding.tsx +17 -17
  131. package/src/form/field_bindings/MarkdownFieldBinding.tsx +1 -2
  132. package/src/form/field_bindings/MultiSelectBinding.tsx +2 -3
  133. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +3 -3
  134. package/src/form/field_bindings/ReferenceFieldBinding.tsx +5 -3
  135. package/src/form/field_bindings/RepeatFieldBinding.tsx +3 -3
  136. package/src/form/field_bindings/SelectFieldBinding.tsx +2 -3
  137. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +15 -6
  138. package/src/form/field_bindings/SwitchFieldBinding.tsx +2 -3
  139. package/src/form/field_bindings/TextFieldBinding.tsx +10 -9
  140. package/src/form/index.tsx +1 -0
  141. package/src/form/validation.ts +3 -4
  142. package/src/hooks/data/delete.ts +3 -3
  143. package/src/hooks/data/save.ts +1 -1
  144. package/src/hooks/data/useCollectionFetch.tsx +1 -1
  145. package/src/hooks/data/useDataSource.tsx +8 -3
  146. package/src/hooks/data/useEntityFetch.tsx +4 -4
  147. package/src/hooks/index.tsx +5 -1
  148. package/src/{core → hooks}/useBuildLocalConfigurationPersistence.tsx +9 -10
  149. package/src/{core → hooks}/useBuildModeController.tsx +12 -6
  150. package/src/hooks/useBuildNavigationController.tsx +197 -79
  151. package/src/hooks/useProjectLog.tsx +17 -7
  152. package/src/hooks/useReferenceDialog.tsx +2 -2
  153. package/src/hooks/useStorageSource.tsx +7 -2
  154. package/src/hooks/useValidateAuthenticator.tsx +135 -0
  155. package/src/internal/useBuildDataSource.ts +6 -1
  156. package/src/internal/useBuildSideEntityController.tsx +18 -12
  157. package/src/preview/PropertyPreview.tsx +1 -1
  158. package/src/preview/PropertyPreviewProps.tsx +1 -11
  159. package/src/preview/components/BooleanPreview.tsx +19 -4
  160. package/src/preview/components/EnumValuesChip.tsx +1 -1
  161. package/src/preview/components/ReferencePreview.tsx +55 -147
  162. package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
  163. package/src/types/analytics.ts +1 -0
  164. package/src/types/auth.tsx +50 -1
  165. package/src/types/collections.ts +24 -5
  166. package/src/types/datasource.ts +1 -1
  167. package/src/types/entities.ts +1 -1
  168. package/src/types/entity_actions.tsx +4 -0
  169. package/src/types/entity_callbacks.ts +2 -2
  170. package/src/types/entity_overrides.tsx +7 -0
  171. package/src/types/firecms.tsx +0 -1
  172. package/src/types/index.ts +2 -0
  173. package/src/types/navigation.ts +17 -16
  174. package/src/types/permissions.ts +6 -1
  175. package/src/types/plugins.tsx +26 -28
  176. package/src/types/properties.ts +3 -2
  177. package/src/types/property_config.tsx +2 -2
  178. package/src/types/roles.ts +41 -0
  179. package/src/types/side_entity_controller.tsx +1 -0
  180. package/src/types/storage.ts +12 -3
  181. package/src/types/user.ts +7 -0
  182. package/src/util/collections.ts +22 -0
  183. package/src/util/entities.ts +1 -1
  184. package/src/util/icons.tsx +11 -3
  185. package/src/util/navigation_utils.ts +6 -6
  186. package/src/util/permissions.ts +11 -8
  187. package/src/util/references.ts +36 -5
  188. package/src/util/strings.ts +2 -2
  189. package/src/util/useTraceUpdate.tsx +2 -1
  190. package/dist/internal/useLocaleConfig.d.ts +0 -1
  191. package/src/components/HomePage/NavigationCollectionCard.tsx +0 -146
  192. package/src/internal/useLocaleConfig.tsx +0 -18
  193. /package/dist/{components → form/components}/LabelWithIcon.d.ts +0 -0
  194. /package/dist/{core → hooks}/useBuildLocalConfigurationPersistence.d.ts +0 -0
  195. /package/src/{components → form/components}/LabelWithIcon.tsx +0 -0
@@ -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: EntityCollection | CMSView, className?: string }): React.ReactElement {
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.icon, nextProps.collectionOrView.icon);
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 pathOrAlias
63
+ * @param pathOrId
64
64
  * @param collections
65
65
  */
66
- export function getCollectionByPathOrId(pathOrAlias: string, collections: EntityCollection[]): EntityCollection | undefined {
66
+ export function getCollectionByPathOrId(pathOrId: string, collections: EntityCollection[]): EntityCollection | undefined {
67
67
 
68
- const subpaths = removeInitialAndTrailingSlashes(pathOrAlias).split("/");
68
+ const subpaths = removeInitialAndTrailingSlashes(pathOrId).split("/");
69
69
  if (subpaths.length % 2 === 0) {
70
- throw Error(`getCollectionByPathOrAlias: Collection paths must have an odd number of segments: ${pathOrAlias}`);
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 === pathOrAlias) {
83
+ if (subpathCombination === pathOrId) {
84
84
  result = navigationEntry;
85
85
  } else if (navigationEntry.subcollections) {
86
- const newPath = pathOrAlias.replace(subpathCombination, "").split("/").slice(2).join("/");
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
  }
@@ -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
- pathSegments: string[],
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
- paths: string[],
41
+ path: string,
39
42
  entity: Entity<M> | null): boolean {
40
- return resolvePermissions(collection, authController, paths, entity).edit ?? DEFAULT_PERMISSIONS.edit;
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
- paths: string[],
50
+ path: string,
48
51
  entity: Entity<M> | null): boolean {
49
- return resolvePermissions(collection, authController, paths, entity).create ?? DEFAULT_PERMISSIONS.create;
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
- paths: string[],
59
+ path: string,
57
60
  entity: Entity<M> | null): boolean {
58
- return resolvePermissions(collection, authController, paths, entity).delete ?? DEFAULT_PERMISSIONS.delete;
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> {
@@ -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 getReferencePreviewKeys(targetCollection: EntityCollection<any>,
6
- fields: Record<string, PropertyConfig>,
7
- previewProperties?: string[],
8
- limit = 3) {
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
+ }
@@ -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
- }