@firecms/core 3.0.0-canary.9 → 3.0.0-canary.90

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 (246) hide show
  1. package/README.md +1 -1
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +17 -0
  4. package/dist/app/Scaffold.d.ts +30 -0
  5. package/dist/app/index.d.ts +4 -0
  6. package/dist/app/useApp.d.ts +16 -0
  7. package/dist/components/CircularProgressCenter.d.ts +1 -1
  8. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  9. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -12
  10. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +5 -3
  12. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  13. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  14. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +2 -0
  15. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  16. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  17. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +1 -1
  18. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -2
  19. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  20. package/dist/components/EntityPreview.d.ts +5 -4
  21. package/dist/components/ErrorView.d.ts +1 -1
  22. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  23. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  24. package/dist/components/ReferenceWidget.d.ts +3 -1
  25. package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
  26. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  27. package/dist/components/VirtualTable/VirtualTableProps.d.ts +15 -12
  28. package/dist/components/VirtualTable/types.d.ts +3 -3
  29. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
  30. package/dist/components/common/index.d.ts +1 -0
  31. package/dist/components/common/table_height.d.ts +5 -0
  32. package/dist/components/common/types.d.ts +4 -6
  33. package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +3 -0
  34. package/dist/components/index.d.ts +2 -1
  35. package/dist/contexts/AuthControllerContext.d.ts +1 -1
  36. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  37. package/dist/core/DefaultDrawer.d.ts +19 -0
  38. package/dist/core/DrawerNavigationItem.d.ts +9 -0
  39. package/dist/core/EntityEditView.d.ts +17 -3
  40. package/dist/core/FireCMS.d.ts +1 -1
  41. package/dist/core/NavigationRoutes.d.ts +3 -3
  42. package/dist/core/index.d.ts +3 -4
  43. package/dist/form/PropertiesForm.d.ts +8 -0
  44. package/dist/form/components/ErrorFocus.d.ts +1 -1
  45. package/dist/form/components/FieldHelperText.d.ts +3 -3
  46. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  47. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  48. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +2 -4
  49. package/dist/form/index.d.ts +0 -2
  50. package/dist/hooks/data/delete.d.ts +2 -2
  51. package/dist/hooks/data/save.d.ts +2 -3
  52. package/dist/hooks/data/useDataSource.d.ts +1 -1
  53. package/dist/hooks/data/useEntityFetch.d.ts +3 -3
  54. package/dist/hooks/index.d.ts +2 -0
  55. package/dist/hooks/useBuildNavigationController.d.ts +1 -2
  56. package/dist/hooks/useProjectLog.d.ts +2 -2
  57. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  58. package/dist/index.d.ts +1 -0
  59. package/dist/index.es.js +15552 -11933
  60. package/dist/index.es.js.map +1 -1
  61. package/dist/index.umd.js +19643 -7
  62. package/dist/index.umd.js.map +1 -1
  63. package/dist/internal/useBuildDataSource.d.ts +1 -16
  64. package/dist/internal/useRestoreScroll.d.ts +1 -1
  65. package/dist/preview/PropertyPreviewProps.d.ts +6 -4
  66. package/dist/preview/components/ReferencePreview.d.ts +2 -1
  67. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  68. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  69. package/dist/types/auth.d.ts +26 -2
  70. package/dist/types/collections.d.ts +31 -7
  71. package/dist/types/datasource.d.ts +34 -20
  72. package/dist/types/entities.d.ts +5 -1
  73. package/dist/types/entity_actions.d.ts +14 -0
  74. package/dist/types/entity_callbacks.d.ts +2 -2
  75. package/dist/types/fields.d.ts +31 -30
  76. package/dist/types/index.d.ts +0 -1
  77. package/dist/types/navigation.d.ts +5 -5
  78. package/dist/types/plugins.d.ts +16 -6
  79. package/dist/types/properties.d.ts +17 -4
  80. package/dist/types/storage.d.ts +11 -3
  81. package/dist/util/collections.d.ts +1 -1
  82. package/dist/util/entities.d.ts +1 -1
  83. package/dist/util/icon_synonyms.d.ts +1 -97
  84. package/dist/util/icons.d.ts +2 -2
  85. package/dist/util/navigation_utils.d.ts +2 -2
  86. package/dist/util/objects.d.ts +1 -1
  87. package/dist/util/plurals.d.ts +0 -2
  88. package/dist/util/resolutions.d.ts +13 -13
  89. package/dist/util/storage.d.ts +23 -2
  90. package/dist/util/useStorageUploadController.d.ts +1 -1
  91. package/dist/util/useTraceUpdate.d.ts +1 -0
  92. package/package.json +130 -119
  93. package/src/app/AppBar.tsx +18 -0
  94. package/src/app/Drawer.tsx +25 -0
  95. package/src/app/Scaffold.tsx +249 -0
  96. package/src/app/index.ts +4 -0
  97. package/src/app/useApp.tsx +32 -0
  98. package/src/components/CircularProgressCenter.tsx +1 -1
  99. package/src/components/ClearFilterSortButton.tsx +41 -0
  100. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +9 -18
  101. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +21 -20
  102. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +10 -6
  103. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +38 -34
  104. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  105. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +11 -2
  106. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +14 -6
  107. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +29 -34
  108. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +16 -12
  109. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +4 -5
  110. package/src/components/EntityCollectionView/EntityCollectionView.tsx +69 -45
  111. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  112. package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
  113. package/src/components/EntityPreview.tsx +15 -9
  114. package/src/components/EntityView.tsx +5 -5
  115. package/src/components/ErrorView.tsx +1 -1
  116. package/src/components/HomePage/DefaultHomePage.tsx +3 -3
  117. package/src/components/HomePage/NavigationCard.tsx +3 -3
  118. package/src/components/HomePage/NavigationCardBinding.tsx +1 -1
  119. package/src/components/HomePage/SmallNavigationCard.tsx +5 -5
  120. package/src/components/PropertyIdCopyTooltipContent.tsx +2 -3
  121. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +1 -0
  122. package/src/components/ReferenceWidget.tsx +22 -12
  123. package/src/components/SearchIconsView.tsx +5 -5
  124. package/src/components/SelectableTable/SelectableTable.tsx +7 -7
  125. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  126. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +22 -7
  127. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +28 -6
  128. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +35 -15
  129. package/src/components/VirtualTable/VirtualTable.tsx +70 -37
  130. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -1
  131. package/src/components/VirtualTable/VirtualTableHeader.tsx +4 -4
  132. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  133. package/src/components/VirtualTable/VirtualTableProps.tsx +18 -14
  134. package/src/components/VirtualTable/VirtualTableRow.tsx +4 -5
  135. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +1 -1
  136. package/src/components/VirtualTable/types.tsx +2 -3
  137. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +2 -2
  138. package/src/components/common/index.ts +1 -0
  139. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  140. package/src/components/common/types.tsx +4 -6
  141. package/src/components/common/useColumnsIds.tsx +10 -2
  142. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +11 -0
  143. package/src/components/common/useTableSearchHelper.ts +52 -12
  144. package/src/components/index.tsx +2 -1
  145. package/src/contexts/AuthControllerContext.tsx +1 -1
  146. package/src/contexts/DialogsProvider.tsx +2 -2
  147. package/src/{components/FireCMSAppBar.tsx → core/DefaultAppBar.tsx} +52 -37
  148. package/src/core/DefaultDrawer.tsx +177 -0
  149. package/src/core/DrawerNavigationItem.tsx +62 -0
  150. package/src/core/EntityEditView.tsx +676 -133
  151. package/src/core/EntitySidePanel.tsx +1 -2
  152. package/src/core/FireCMS.tsx +39 -44
  153. package/src/core/NavigationRoutes.tsx +7 -8
  154. package/src/core/field_configs.tsx +2 -3
  155. package/src/core/index.tsx +3 -4
  156. package/src/form/PropertiesForm.tsx +81 -0
  157. package/src/form/PropertyFieldBinding.tsx +29 -7
  158. package/src/form/components/FieldHelperText.tsx +3 -3
  159. package/src/form/components/StorageItemPreview.tsx +20 -11
  160. package/src/form/components/StorageUploadProgress.tsx +3 -3
  161. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +8 -5
  162. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +8 -5
  163. package/src/form/field_bindings/BlockFieldBinding.tsx +2 -2
  164. package/src/form/field_bindings/KeyValueFieldBinding.tsx +44 -39
  165. package/src/form/field_bindings/MapFieldBinding.tsx +11 -3
  166. package/src/form/field_bindings/MarkdownFieldBinding.tsx +2 -2
  167. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +2 -9
  168. package/src/form/field_bindings/ReferenceFieldBinding.tsx +15 -13
  169. package/src/form/field_bindings/RepeatFieldBinding.tsx +10 -7
  170. package/src/form/field_bindings/SelectFieldBinding.tsx +3 -3
  171. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +22 -43
  172. package/src/form/field_bindings/SwitchFieldBinding.tsx +1 -1
  173. package/src/form/index.tsx +4 -4
  174. package/src/form/validation.ts +1 -17
  175. package/src/hooks/data/delete.ts +3 -3
  176. package/src/hooks/data/save.ts +4 -2
  177. package/src/hooks/data/useDataSource.tsx +2 -2
  178. package/src/hooks/data/useEntityFetch.tsx +3 -3
  179. package/src/hooks/index.tsx +3 -0
  180. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  181. package/src/hooks/useBuildModeController.tsx +11 -5
  182. package/src/hooks/useBuildNavigationController.tsx +137 -61
  183. package/src/hooks/useProjectLog.tsx +21 -8
  184. package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
  185. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  186. package/src/index.ts +1 -0
  187. package/src/internal/useBuildDataSource.ts +56 -49
  188. package/src/internal/useBuildSideEntityController.tsx +88 -21
  189. package/src/preview/PropertyPreview.tsx +9 -16
  190. package/src/preview/PropertyPreviewProps.tsx +4 -8
  191. package/src/preview/components/BooleanPreview.tsx +4 -2
  192. package/src/preview/components/EnumValuesChip.tsx +1 -1
  193. package/src/preview/components/ImagePreview.tsx +21 -33
  194. package/src/preview/components/ReferencePreview.tsx +23 -23
  195. package/src/preview/components/StorageThumbnail.tsx +5 -1
  196. package/src/preview/components/UrlComponentPreview.tsx +44 -11
  197. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -1
  198. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +2 -1
  199. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -1
  200. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
  201. package/src/preview/property_previews/ArrayOneOfPreview.tsx +2 -3
  202. package/src/preview/property_previews/ArrayPropertyPreview.tsx +2 -3
  203. package/src/preview/property_previews/MapPropertyPreview.tsx +5 -5
  204. package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
  205. package/src/types/auth.tsx +35 -2
  206. package/src/types/collections.ts +37 -8
  207. package/src/types/customization_controller.tsx +0 -1
  208. package/src/types/datasource.ts +41 -24
  209. package/src/types/entities.ts +9 -1
  210. package/src/types/entity_actions.tsx +16 -3
  211. package/src/types/entity_callbacks.ts +2 -2
  212. package/src/types/fields.tsx +33 -33
  213. package/src/types/index.ts +0 -1
  214. package/src/types/navigation.ts +6 -7
  215. package/src/types/plugins.tsx +18 -8
  216. package/src/types/properties.ts +22 -6
  217. package/src/types/storage.ts +12 -3
  218. package/src/util/collections.ts +1 -1
  219. package/src/util/entities.ts +5 -4
  220. package/src/util/enums.ts +1 -1
  221. package/src/util/icon_list.ts +2 -2
  222. package/src/util/icon_synonyms.ts +3 -99
  223. package/src/util/navigation_utils.ts +6 -6
  224. package/src/util/objects.ts +25 -28
  225. package/src/util/permissions.ts +1 -0
  226. package/src/util/plurals.ts +0 -2
  227. package/src/util/resolutions.ts +32 -31
  228. package/src/util/storage.ts +75 -21
  229. package/src/util/strings.ts +2 -2
  230. package/src/util/useStorageUploadController.tsx +21 -3
  231. package/src/util/useTraceUpdate.tsx +2 -1
  232. package/dist/components/VirtualTable/common.d.ts +0 -2
  233. package/dist/core/Drawer.d.ts +0 -23
  234. package/dist/core/Scaffold.d.ts +0 -55
  235. package/dist/core/SideEntityView.d.ts +0 -7
  236. package/dist/form/EntityForm.d.ts +0 -77
  237. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  238. package/dist/internal/useLocaleConfig.d.ts +0 -1
  239. package/dist/types/appcheck.d.ts +0 -26
  240. package/src/core/Drawer.tsx +0 -191
  241. package/src/core/Scaffold.tsx +0 -281
  242. package/src/core/SideEntityView.tsx +0 -38
  243. package/src/form/EntityForm.tsx +0 -728
  244. package/src/internal/useBuildCustomizationController.tsx +0 -5
  245. package/src/internal/useLocaleConfig.tsx +0 -18
  246. package/src/types/appcheck.ts +0 -29
@@ -1,4 +1,4 @@
1
- import React, { CSSProperties, useMemo, useState } from "react";
1
+ import React, { CSSProperties, useMemo } from "react";
2
2
 
3
3
  import { getThumbnailMeasure } from "../util";
4
4
  import { PreviewSize } from "../PropertyPreviewProps";
@@ -20,8 +20,6 @@ export function ImagePreview({
20
20
  url
21
21
  }: ImagePreviewProps) {
22
22
 
23
- const [onHover, setOnHover] = useState(false);
24
-
25
23
  const imageSize = useMemo(() => getThumbnailMeasure(size), [size]);
26
24
 
27
25
  if (size === "tiny") {
@@ -47,60 +45,50 @@ export function ImagePreview({
47
45
 
48
46
  return (
49
47
  <div
50
- className="relative flex items-center justify-center max-w-full max-h-full"
48
+ className="relative flex items-center justify-center max-w-full max-h-full group"
51
49
  style={{
52
50
  width: imageSize,
53
51
  height: imageSize
54
52
  }}
55
- key={"image_preview_" + url}
56
- onMouseEnter={() => setOnHover(true)}
57
- onMouseMove={() => setOnHover(true)}
58
- onMouseLeave={() => setOnHover(false)}>
53
+ key={"image_preview_" + url}>
59
54
 
60
55
  <img src={url}
61
56
  className={"rounded-md"}
62
57
  style={imageStyle}/>
63
58
 
64
- {onHover && <>
65
59
 
66
- {navigator && <Tooltip title="Copy url to clipboard">
67
- <div
68
- className="rounded-full absolute bottom-[-4px] right-8">
69
- <IconButton
70
- variant={"filled"}
71
- size={"small"}
72
- onClick={(e) => {
73
- e.stopPropagation();
74
- e.preventDefault();
75
- return navigator.clipboard.writeText(url);
76
- }}>
77
- <ContentCopyIcon className={"text-gray-500"}
78
- size={"small"}/>
79
- </IconButton>
80
- </div>
60
+ <div className={"flex flex-row gap-2 absolute bottom-[-4px] right-[-4px] invisible group-hover:visible"}>
61
+ {navigator && <Tooltip title="Copy url to clipboard" side={"bottom"}>
62
+ <IconButton
63
+ variant={"filled"}
64
+ size={"small"}
65
+ onClick={(e) => {
66
+ e.stopPropagation();
67
+ e.preventDefault();
68
+ return navigator.clipboard.writeText(url);
69
+ }}>
70
+ <ContentCopyIcon className={"text-gray-700 dark:text-gray-300"}
71
+ size={"small"}/>
72
+ </IconButton>
81
73
  </Tooltip>}
82
74
 
83
- <Tooltip title="Open image in new tab">
75
+ <Tooltip title="Open image in new tab" side={"bottom"}>
84
76
  <IconButton
77
+ className="invisible group-hover:visible"
85
78
  variant={"filled"}
86
79
  component={"a" as React.ElementType}
87
- style={{
88
- position: "absolute",
89
- bottom: -4,
90
- right: -4
91
- }}
92
80
  href={url}
93
81
  rel="noopener noreferrer"
94
82
  target="_blank"
95
83
  size={"small"}
96
84
  onClick={(e: any) => e.stopPropagation()}
97
85
  >
98
- <OpenInNewIcon className={"text-gray-500"}
86
+ <OpenInNewIcon className={"text-gray-700 dark:text-gray-300"}
99
87
  size={"small"}/>
100
88
  </IconButton>
101
89
  </Tooltip>
102
- </>
103
- }
90
+ </div>
91
+
104
92
  </div>
105
93
  );
106
94
  }
@@ -1,16 +1,10 @@
1
1
  import * as React from "react";
2
2
 
3
3
  import { Entity, EntityCollection, EntityReference } from "../../types";
4
- import {
5
- useCustomizationController,
6
- useEntityFetch,
7
- useNavigationController,
8
- useSideEntityController
9
- } from "../../hooks";
4
+ import { useCustomizationController, useEntityFetch, useNavigationController } from "../../hooks";
10
5
  import { PreviewSize } from "../PropertyPreviewProps";
11
- import { IconButton, KeyboardTabIcon, Skeleton, Tooltip } from "@firecms/ui";
6
+ import { Skeleton } from "@firecms/ui";
12
7
  import { ErrorView } from "../../components";
13
- import { useAnalyticsController } from "../../hooks/useAnalyticsController";
14
8
  import { EntityPreview, EntityPreviewContainer } from "../../components/EntityPreview";
15
9
 
16
10
  export type ReferencePreviewProps = {
@@ -20,7 +14,8 @@ export type ReferencePreviewProps = {
20
14
  previewProperties?: string[];
21
15
  onClick?: (e: React.SyntheticEvent) => void;
22
16
  hover?: boolean;
23
- allowEntityNavigation?: boolean;
17
+ includeEntityLink?: boolean;
18
+ includeId?: boolean;
24
19
  };
25
20
 
26
21
  /**
@@ -46,25 +41,27 @@ function areEqual(prevProps: ReferencePreviewProps, nextProps: ReferencePreviewP
46
41
  prevProps.hover === nextProps.hover &&
47
42
  prevProps.reference?.id === nextProps.reference?.id &&
48
43
  prevProps.reference?.path === nextProps.reference?.path &&
49
- prevProps.allowEntityNavigation === nextProps.allowEntityNavigation
44
+ prevProps.includeEntityLink === nextProps.includeEntityLink &&
45
+ prevProps.onClick === nextProps.onClick
50
46
  ;
51
47
  }
52
48
 
53
- function ReferencePreviewInternal<M extends Record<string, any>>({
54
- disabled,
55
- reference,
56
- previewProperties,
57
- size,
58
- hover,
59
- onClick,
60
- allowEntityNavigation = true
61
- }: ReferencePreviewProps) {
49
+ function ReferencePreviewInternal({
50
+ disabled,
51
+ reference,
52
+ previewProperties,
53
+ size,
54
+ hover,
55
+ onClick,
56
+ includeEntityLink = true,
57
+ includeId = true
58
+ }: ReferencePreviewProps) {
62
59
 
63
60
  const customizationController = useCustomizationController();
64
61
 
65
62
  const navigationController = useNavigationController();
66
63
 
67
- const collection = navigationController.getCollection<EntityCollection<M>>(reference.path);
64
+ const collection = navigationController.getCollection(reference.path);
68
65
  if (!collection) {
69
66
  if (customizationController.components?.missingReference) {
70
67
  return <customizationController.components.missingReference path={reference.path}/>;
@@ -79,7 +76,8 @@ function ReferencePreviewInternal<M extends Record<string, any>>({
79
76
  previewProperties={previewProperties}
80
77
  size={size}
81
78
  disabled={disabled}
82
- allowEntityNavigation={allowEntityNavigation}
79
+ includeEntityLink={includeEntityLink}
80
+ includeId={includeId}
83
81
  onClick={onClick}
84
82
  hover={hover}/>
85
83
  }
@@ -90,7 +88,8 @@ function ReferencePreviewExisting<M extends Record<string, any> = any>({
90
88
  previewProperties,
91
89
  size,
92
90
  disabled,
93
- allowEntityNavigation,
91
+ includeEntityLink,
92
+ includeId,
94
93
  onClick,
95
94
  hover
96
95
  }: ReferencePreviewProps & {
@@ -158,7 +157,8 @@ function ReferencePreviewExisting<M extends Record<string, any> = any>({
158
157
  entity={usedEntity}
159
158
  collection={collection}
160
159
  onClick={onClick}
161
- includeEntityNavigation={allowEntityNavigation}
160
+ includeEntityLink={includeEntityLink}
161
+ includeId={includeId}
162
162
  hover={hover}/>;
163
163
 
164
164
  }
@@ -11,6 +11,7 @@ type StorageThumbnailProps = {
11
11
  storagePathOrDownloadUrl: string;
12
12
  storeUrl: boolean;
13
13
  size: PreviewSize;
14
+ interactive?: boolean;
14
15
  };
15
16
 
16
17
  /**
@@ -21,13 +22,15 @@ export const StorageThumbnail = React.memo<StorageThumbnailProps>(StorageThumbna
21
22
  function areEqual(prevProps: StorageThumbnailProps, nextProps: StorageThumbnailProps) {
22
23
  return prevProps.size === nextProps.size &&
23
24
  prevProps.storagePathOrDownloadUrl === nextProps.storagePathOrDownloadUrl &&
24
- prevProps.storeUrl === nextProps.storeUrl;
25
+ prevProps.storeUrl === nextProps.storeUrl&&
26
+ prevProps.interactive === nextProps.interactive;
25
27
  }
26
28
 
27
29
  const URL_CACHE: Record<string, DownloadConfig> = {};
28
30
 
29
31
  export function StorageThumbnailInternal({
30
32
  storeUrl,
33
+ interactive,
31
34
  storagePathOrDownloadUrl,
32
35
  size
33
36
  }: StorageThumbnailProps) {
@@ -68,6 +71,7 @@ export function StorageThumbnailInternal({
68
71
  return downloadConfig?.url
69
72
  ? <UrlComponentPreview previewType={previewType}
70
73
  url={downloadConfig.url}
74
+ interactive={interactive}
71
75
  size={size}
72
76
  hint={storagePathOrDownloadUrl}/>
73
77
  : renderSkeletonImageThumbnail(size);
@@ -1,10 +1,10 @@
1
- import React from "react";
1
+ import React, { useMemo } from "react";
2
2
 
3
3
  import { ImagePreview } from "./ImagePreview";
4
4
  import { getThumbnailMeasure } from "../util";
5
5
  import { PreviewType } from "../../types";
6
6
  import { PreviewSize } from "../PropertyPreviewProps";
7
- import { DescriptionIcon, OpenInNewIcon, Tooltip, Typography } from "@firecms/ui";
7
+ import { cls, DescriptionIcon, OpenInNewIcon, Tooltip, Typography } from "@firecms/ui";
8
8
  import { EmptyValue } from "./EmptyValue";
9
9
 
10
10
  /**
@@ -14,12 +14,15 @@ export function UrlComponentPreview({
14
14
  url,
15
15
  previewType,
16
16
  size,
17
- hint
17
+ hint,
18
+ interactive = true
18
19
  }: {
19
20
  url: string,
20
21
  previewType?: PreviewType,
21
22
  size: PreviewSize,
22
- hint?: string
23
+ hint?: string,
24
+ // for video controls
25
+ interactive?: boolean
23
26
  }): React.ReactElement {
24
27
 
25
28
  if (!previewType) {
@@ -43,17 +46,13 @@ export function UrlComponentPreview({
43
46
  size={size}/>;
44
47
  } else if (previewType === "audio") {
45
48
  return <audio controls
49
+ className={"max-w-100%"}
46
50
  src={url}>
47
51
  Your browser does not support the
48
52
  <code>audio</code> element.
49
53
  </audio>;
50
54
  } else if (previewType === "video") {
51
- return <video
52
- className={`max-w-${size === "small" ? "sm" : "md"}`}
53
- controls
54
- >
55
- <source src={url}/>
56
- </video>;
55
+ return <VideoPreview size={size} src={url} interactive={interactive}/>;
57
56
  } else {
58
57
  return (
59
58
  <a
@@ -66,7 +65,7 @@ export function UrlComponentPreview({
66
65
  width: getThumbnailMeasure(size),
67
66
  height: getThumbnailMeasure(size)
68
67
  }}>
69
- <DescriptionIcon className="flex-grow"/>
68
+ <DescriptionIcon className="text-gray-700 dark:text-gray-300"/>
70
69
  {hint &&
71
70
  <Tooltip title={hint}>
72
71
  <Typography
@@ -77,3 +76,37 @@ export function UrlComponentPreview({
77
76
  );
78
77
  }
79
78
  }
79
+
80
+ function VideoPreview({
81
+ size,
82
+ src,
83
+ interactive
84
+ }: { size: PreviewSize, src: string, interactive: boolean }) {
85
+
86
+ const imageSize = useMemo(() => {
87
+ if (size === "tiny")
88
+ return "140px";
89
+ else if (size === "small")
90
+ return "240px";
91
+ else if (size === "medium")
92
+ return "100%";
93
+ else throw new Error("Invalid size");
94
+ }, [size]);
95
+
96
+ const videoProps = {
97
+ controls: interactive
98
+ };
99
+ return <video
100
+ style={{
101
+ position: "relative",
102
+ objectFit: "cover",
103
+ width: imageSize,
104
+ minWidth: "140px",
105
+ // height: imageSize,
106
+ maxHeight: "100%"
107
+ }}
108
+ {...videoProps}
109
+ className={cls("max-w-100% rounded", { "pointer-events-none": !interactive })}>
110
+ <source src={src}/>
111
+ </video>;
112
+ }
@@ -20,7 +20,6 @@ export function ArrayOfMapsPreview({
20
20
  const property = resolveArrayProperty({
21
21
  propertyKey,
22
22
  property: inputProperty,
23
- propertyValue: value,
24
23
  fields: customizationController.propertyConfigs
25
24
  });
26
25
 
@@ -18,7 +18,6 @@ export function ArrayOfReferencesPreview({
18
18
  const property = resolveArrayProperty({
19
19
  propertyKey,
20
20
  property: inputProperty,
21
- propertyValue: value,
22
21
  fields: customizationController.propertyConfigs
23
22
  });
24
23
 
@@ -43,6 +42,8 @@ export function ArrayOfReferencesPreview({
43
42
  previewProperties={ofProperty.previewProperties}
44
43
  size={childSize}
45
44
  reference={reference}
45
+ includeId={ofProperty.includeId}
46
+ includeEntityLink={ofProperty.includeEntityLink}
46
47
  />
47
48
  </div>;
48
49
  }
@@ -23,7 +23,6 @@ export function ArrayOfStorageComponentsPreview({
23
23
  const property = resolveArrayProperty({
24
24
  propertyKey,
25
25
  property: inputProperty,
26
- propertyValue: value,
27
26
  fields: customizationController.propertyConfigs
28
27
  });
29
28
 
@@ -21,7 +21,6 @@ export function ArrayOfStringsPreview({
21
21
  const property = resolveArrayProperty({
22
22
  propertyKey,
23
23
  property: inputProperty,
24
- propertyValue: value,
25
24
  fields: customizationController.propertyConfigs
26
25
  });
27
26
 
@@ -4,7 +4,7 @@ import { ResolvedProperty } from "../../types";
4
4
  import { useCustomizationController } from "../../hooks";
5
5
  import { PreviewSize, PropertyPreviewProps } from "../PropertyPreviewProps";
6
6
  import { PropertyPreview } from "../PropertyPreview";
7
- import { cn, defaultBorderMixin } from "@firecms/ui";
7
+ import { cls, defaultBorderMixin } from "@firecms/ui";
8
8
  import { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from "../../util/common";
9
9
  import { ErrorBoundary } from "../../components";
10
10
 
@@ -23,7 +23,6 @@ export function ArrayOneOfPreview({
23
23
  const property = resolveArrayProperty({
24
24
  propertyKey,
25
25
  property: inputProperty,
26
- propertyValue: value,
27
26
  fields: customizationController.propertyConfigs
28
27
  });
29
28
 
@@ -50,7 +49,7 @@ export function ArrayOneOfPreview({
50
49
  values.map((value, index) =>
51
50
  <React.Fragment
52
51
  key={"preview_array_" + value + "_" + index}>
53
- <div className={cn(defaultBorderMixin, "m-1 border-b last:border-b-0")}>
52
+ <div className={cls(defaultBorderMixin, "m-1 border-b last:border-b-0")}>
54
53
  <ErrorBoundary>
55
54
  {value && <PropertyPreview
56
55
  propertyKey={propertyKey}
@@ -5,7 +5,7 @@ import { ResolvedProperty } from "../../types";
5
5
  import { useCustomizationController } from "../../hooks";
6
6
  import { PreviewSize, PropertyPreviewProps } from "../PropertyPreviewProps";
7
7
  import { PropertyPreview } from "../PropertyPreview";
8
- import { cn, defaultBorderMixin } from "@firecms/ui";
8
+ import { cls, defaultBorderMixin } from "@firecms/ui";
9
9
  import { ErrorBoundary } from "../../components";
10
10
 
11
11
  /**
@@ -23,7 +23,6 @@ export function ArrayPropertyPreview({
23
23
  const property = resolveArrayProperty({
24
24
  propertyKey,
25
25
  property: inputProperty,
26
- propertyValue: value,
27
26
  fields: customizationController.propertyConfigs
28
27
  });
29
28
 
@@ -49,7 +48,7 @@ export function ArrayPropertyPreview({
49
48
  return of
50
49
  ? <React.Fragment
51
50
  key={"preview_array_" + index}>
52
- <div className={cn(defaultBorderMixin, "m-1 border-b last:border-b-0")}>
51
+ <div className={cls(defaultBorderMixin, "m-1 border-b last:border-b-0")}>
53
52
  <ErrorBoundary>
54
53
  <PropertyPreview
55
54
  propertyKey={propertyKey}
@@ -3,7 +3,7 @@ import React from "react";
3
3
  import { ResolvedMapProperty } from "../../types";
4
4
  import { PropertyPreviewProps } from "../PropertyPreviewProps";
5
5
  import { PropertyPreview } from "../PropertyPreview";
6
- import { cn, defaultBorderMixin, Typography } from "@firecms/ui";
6
+ import { cls, defaultBorderMixin, Typography } from "@firecms/ui";
7
7
  import { ErrorBoundary } from "../../components";
8
8
  import { EmptyValue } from "../components/EmptyValue";
9
9
 
@@ -61,7 +61,7 @@ export function MapPropertyPreview<T extends Record<string, any> = Record<string
61
61
  return (
62
62
  <div
63
63
  key={`map_preview_table_${key}}`}
64
- className={cn(defaultBorderMixin, "last:border-b-0 border-b")}>
64
+ className={cls(defaultBorderMixin, "last:border-b-0 border-b")}>
65
65
  <div
66
66
  className={"flex flex-row pt-0.5 pb-0.5 gap-2"}>
67
67
  <div
@@ -87,7 +87,7 @@ export function MapPropertyPreview<T extends Record<string, any> = Record<string
87
87
  </div>
88
88
 
89
89
  {(childProperty.dataType === "map" || childProperty === "array") &&
90
- <div className={cn(defaultBorderMixin, "border-l pl-4 ml-2 my-2")}>
90
+ <div className={cls(defaultBorderMixin, "border-l pl-4 ml-2 my-2")}>
91
91
  <PropertyPreview
92
92
  propertyKey={key}
93
93
  value={(value)[key]}
@@ -113,7 +113,7 @@ export function KeyValuePreview({ value }: { value: any }) {
113
113
  Object.entries(value).map(([key, childValue]) => (
114
114
  <div
115
115
  key={`map_preview_table_${key}}`}
116
- className={cn(defaultBorderMixin, "last:border-b-0 border-b")}>
116
+ className={cls(defaultBorderMixin, "last:border-b-0 border-b")}>
117
117
  <div
118
118
  className={"flex flex-row pt-0.5 pb-0.5 gap-2"}>
119
119
  <div
@@ -135,7 +135,7 @@ export function KeyValuePreview({ value }: { value: any }) {
135
135
  </div>
136
136
  </div>
137
137
  {typeof childValue === "object" &&
138
- <div className={cn(defaultBorderMixin, "border-l pl-4")}>
138
+ <div className={cls(defaultBorderMixin, "border-l pl-4")}>
139
139
  <KeyValuePreview value={childValue}/>
140
140
  </div>
141
141
  }
@@ -6,7 +6,7 @@ import { PreviewType } from "../../types";
6
6
  import { UrlComponentPreview } from "../components/UrlComponentPreview";
7
7
  import { PropertyPreviewProps } from "../PropertyPreviewProps";
8
8
  import { ErrorBoundary } from "../../components";
9
- import { Chip, cn, getColorSchemeForSeed } from "@firecms/ui";
9
+ import { Chip, cls, getColorSchemeForSeed } from "@firecms/ui";
10
10
 
11
11
  /**
12
12
  * @group Preview components
@@ -45,7 +45,7 @@ export function StringPropertyPreview({
45
45
  if (!value) return <></>;
46
46
  const lines = value.split("\n");
47
47
  return value && value.includes("\n")
48
- ? <div className={cn("overflow-x-scroll", size === "tiny" ? "text-sm" : "")}>
48
+ ? <div className={cls("overflow-x-scroll", size === "tiny" ? "text-sm" : "")}>
49
49
  {lines.map((str, index) =>
50
50
  <React.Fragment key={`string_preview_${index}`}>
51
51
  <span>{str}</span>
@@ -1,5 +1,7 @@
1
1
  import { User } from "./user";
2
2
  import { Role } from "./roles";
3
+ import { DataSourceDelegate } from "./datasource";
4
+ import { StorageSource } from "./storage";
3
5
 
4
6
  /**
5
7
  * Controller for retrieving the logged user or performing auth related operations.
@@ -7,7 +9,7 @@ import { Role } from "./roles";
7
9
  * to do it as the result of a hook.
8
10
  * @group Hooks and utilities
9
11
  */
10
- export type AuthController<UserType extends User = User, ExtraData extends any = any> = {
12
+ export type AuthController<UserType extends User = any, ExtraData = any> = {
11
13
 
12
14
  /**
13
15
  * The user currently logged in
@@ -36,7 +38,7 @@ export type AuthController<UserType extends User = User, ExtraData extends any =
36
38
  /**
37
39
  * Sign out
38
40
  */
39
- signOut: () => void;
41
+ signOut: () => Promise<void>;
40
42
 
41
43
  /**
42
44
  * Error initializing the authentication
@@ -62,4 +64,35 @@ export type AuthController<UserType extends User = User, ExtraData extends any =
62
64
 
63
65
  setExtra: (extra: ExtraData) => void;
64
66
 
67
+ // setUser?: (user: UserType | null) => void;
68
+
69
+ // setRoles?: (roles: Role[]) => void;
65
70
  };
71
+
72
+ /**
73
+ * Implement this function to allow access to specific users.
74
+ * @group Hooks and utilities
75
+ */
76
+ export type Authenticator<UserType extends User = User, Controller extends AuthController<UserType> = AuthController<UserType>> = (props: {
77
+
78
+ /**
79
+ * Logged-in user or null
80
+ */
81
+ user: UserType | null;
82
+
83
+ /**
84
+ * AuthController
85
+ */
86
+ authController: Controller;
87
+
88
+ /**
89
+ * Connector to your database, e.g. your Firestore database
90
+ */
91
+ dataSourceDelegate: DataSourceDelegate;
92
+
93
+ /**
94
+ * Used storage implementation
95
+ */
96
+ storageSource: StorageSource;
97
+
98
+ }) => boolean | Promise<boolean>;
@@ -17,7 +17,7 @@ import { EntityOverrides } from "./entity_overrides";
17
17
  *
18
18
  * @group Models
19
19
  */
20
- export interface EntityCollection<M extends Record<string, any> = any, UserType extends User = User> {
20
+ export interface EntityCollection<M extends Record<string, any> = any, UserType extends User = any> {
21
21
 
22
22
  /**
23
23
  * You can set an alias that will be used internally instead of the `path`.
@@ -82,7 +82,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
82
82
  * as the title in entity related views and references.
83
83
  * If not specified, the first property simple text property will be used.
84
84
  */
85
- titleProperty?: keyof M,
85
+ titleProperty?: keyof M;
86
86
 
87
87
  /**
88
88
  * Can this collection be edited by the end user.
@@ -107,8 +107,12 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
107
107
  * `subcollection:`. e.g. `subcollection:orders`.
108
108
  * - If you are using a collection group, you will also have an
109
109
  * additional `collectionGroupParent` column.
110
+ * You can use this prop to hide some properties from the table view.
111
+ * Note that if you set this prop, other ways to hide fields, like
112
+ * `hidden` in the property definition,will be ignored.
113
+ * `propertiesOrder` has precedence over `hidden`.
110
114
  */
111
- propertiesOrder?: Extract<keyof M, string>[];
115
+ propertiesOrder?: (Extract<keyof M, string> | `subcollection:${string}`)[];
112
116
 
113
117
  /**
114
118
  * If enabled, content is loaded in batches. If `false` all entities in the
@@ -147,7 +151,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
147
151
  * is being created, updated or deleted.
148
152
  * Useful for adding your own logic or blocking the execution of the operation.
149
153
  */
150
- callbacks?: EntityCallbacks<M>;
154
+ callbacks?: EntityCallbacks<M, UserType>;
151
155
 
152
156
  /**
153
157
  * Builder for rendering additional components such as buttons in the
@@ -290,7 +294,16 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
290
294
  * are writing custom code
291
295
  */
292
296
  ownerId?: string;
297
+
298
+ /**
299
+ * Overrides for the entity view, like the data source or the storage source.
300
+ */
293
301
  overrides?: EntityOverrides;
302
+
303
+ /**
304
+ * Width of the side dialog (in pixels) when opening an entity in this collection.
305
+ */
306
+ sideDialogWidth?: number | string;
294
307
  }
295
308
 
296
309
  /**
@@ -349,14 +362,13 @@ export interface CollectionActionsProps<M extends Record<string, any> = any, Use
349
362
  /**
350
363
  * Use this controller to retrieve the selected entities or modify them in
351
364
  * an {@link EntityCollection}
352
- * If you want to pass a `SelectionController` to
353
365
  * @group Models
354
366
  */
355
367
  export type SelectionController<M extends Record<string, any> = any> = {
356
368
  selectedEntities: Entity<M>[];
357
369
  setSelectedEntities: Dispatch<SetStateAction<Entity<M>[]>>;
358
370
  isEntitySelected: (entity: Entity<M>) => boolean;
359
- toggleEntitySelection: (entity: Entity<M>) => void;
371
+ toggleEntitySelection: (entity: Entity<M>, newSelectedState?: boolean) => void;
360
372
  }
361
373
 
362
374
  /**
@@ -451,7 +463,10 @@ export interface AdditionalFieldDelegate<M extends Record<string, any> = any,
451
463
  * view.
452
464
  * @param entity
453
465
  */
454
- value?: (props: { entity: Entity<M>, context: FireCMSContext }) => string | number | Promise<string | number> | undefined;
466
+ value?: (props: {
467
+ entity: Entity<M>,
468
+ context: FireCMSContext<any>
469
+ }) => string | number | Promise<string | number> | undefined;
455
470
  }
456
471
 
457
472
  /**
@@ -461,8 +476,22 @@ export interface AdditionalFieldDelegate<M extends Record<string, any> = any,
461
476
  */
462
477
  export type EntityCustomView<M extends Record<string, any> = any> =
463
478
  {
479
+ /**
480
+ * Key of this custom view.
481
+ */
464
482
  key: string,
483
+ /**
484
+ * Name of this custom view.
485
+ */
465
486
  name: string,
487
+ /**
488
+ * If set to true, the actions of the entity will be included in the
489
+ * bottom of the panel (save buttons, delete buttons, etc.)
490
+ */
491
+ includeActions?: boolean;
492
+ /**
493
+ * Builder for rendering the custom view
494
+ */
466
495
  Builder?: React.ComponentType<EntityCustomViewParams<M>>;
467
496
  }
468
497
 
@@ -523,7 +552,7 @@ export type EntityTableController<M extends Record<string, any> = any> = {
523
552
  filterValues?: FilterValues<Extract<keyof M, string>>;
524
553
  setFilterValues?: (filterValues: FilterValues<Extract<keyof M, string>>) => void;
525
554
  sortBy?: [Extract<keyof M, string>, "asc" | "desc"];
526
- setSortBy?: (sortBy: [Extract<keyof M, string>, "asc" | "desc"]) => void;
555
+ setSortBy?: (sortBy?: [Extract<keyof M, string>, "asc" | "desc"]) => void;
527
556
  searchString?: string;
528
557
  setSearchString?: (searchString?: string) => void;
529
558
  clearFilter?: () => void;