@firecms/core 3.0.0-canary.6 → 3.0.0-canary.60

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 (242) 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/EntityCollectionTableProps.d.ts +5 -3
  6. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +3 -2
  7. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  8. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +2 -0
  9. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  10. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  11. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +1 -1
  12. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -3
  13. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  14. package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
  15. package/dist/components/EntityPreview.d.ts +26 -7
  16. package/dist/components/EntityView.d.ts +11 -0
  17. package/dist/components/FieldCaption.d.ts +5 -0
  18. package/dist/components/FireCMSAppBar.d.ts +4 -2
  19. package/dist/components/HomePage/NavigationCard.d.ts +8 -0
  20. package/dist/components/HomePage/{NavigationCollectionCard.d.ts → NavigationCardBinding.d.ts} +2 -2
  21. package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
  22. package/dist/components/HomePage/index.d.ts +3 -1
  23. package/dist/components/ReferenceWidget.d.ts +3 -1
  24. package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
  25. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  26. package/dist/components/VirtualTable/VirtualTableProps.d.ts +6 -7
  27. package/dist/components/VirtualTable/types.d.ts +3 -3
  28. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
  29. package/dist/components/common/index.d.ts +1 -0
  30. package/dist/components/common/table_height.d.ts +5 -0
  31. package/dist/components/common/types.d.ts +4 -6
  32. package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +3 -0
  33. package/dist/components/index.d.ts +5 -2
  34. package/dist/contexts/AuthControllerContext.d.ts +1 -1
  35. package/dist/core/Drawer.d.ts +5 -12
  36. package/dist/core/DrawerNavigationItem.d.ts +9 -0
  37. package/dist/core/{EntityView.d.ts → EntityEditView.d.ts} +2 -2
  38. package/dist/core/NavigationRoutes.d.ts +1 -1
  39. package/dist/core/Scaffold.d.ts +8 -12
  40. package/dist/core/index.d.ts +3 -4
  41. package/dist/form/EntityForm.d.ts +1 -1
  42. package/dist/form/components/ErrorFocus.d.ts +1 -1
  43. package/dist/form/components/StorageItemPreview.d.ts +3 -2
  44. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  45. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  46. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  47. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +4 -3
  48. package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -2
  49. package/dist/form/validation.d.ts +1 -1
  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 +2 -2
  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 +6 -4
  56. package/dist/hooks/useProjectLog.d.ts +6 -2
  57. package/dist/hooks/useStorageSource.d.ts +2 -2
  58. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  59. package/dist/index.es.js +10496 -9945
  60. package/dist/index.es.js.map +1 -1
  61. package/dist/index.umd.js +5 -5
  62. package/dist/index.umd.js.map +1 -1
  63. package/dist/internal/useBuildDataSource.d.ts +1 -16
  64. package/dist/preview/PropertyPreview.d.ts +1 -1
  65. package/dist/preview/PropertyPreviewProps.d.ts +1 -4
  66. package/dist/preview/components/BooleanPreview.d.ts +5 -1
  67. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  68. package/dist/preview/components/ReferencePreview.d.ts +3 -8
  69. package/dist/types/analytics.d.ts +1 -1
  70. package/dist/types/auth.d.ts +37 -1
  71. package/dist/types/collections.d.ts +30 -6
  72. package/dist/types/datasource.d.ts +21 -14
  73. package/dist/types/entities.d.ts +5 -1
  74. package/dist/types/entity_actions.d.ts +14 -0
  75. package/dist/types/entity_callbacks.d.ts +2 -2
  76. package/dist/types/entity_overrides.d.ts +6 -0
  77. package/dist/types/index.d.ts +2 -1
  78. package/dist/types/navigation.d.ts +15 -14
  79. package/dist/types/permissions.d.ts +5 -1
  80. package/dist/types/plugins.d.ts +20 -20
  81. package/dist/types/properties.d.ts +12 -4
  82. package/dist/types/property_config.d.ts +2 -2
  83. package/dist/types/roles.d.ts +31 -0
  84. package/dist/types/storage.d.ts +11 -3
  85. package/dist/types/user.d.ts +5 -0
  86. package/dist/util/collections.d.ts +9 -1
  87. package/dist/util/entities.d.ts +1 -1
  88. package/dist/util/icon_synonyms.d.ts +1 -97
  89. package/dist/util/icons.d.ts +8 -2
  90. package/dist/util/navigation_utils.d.ts +2 -2
  91. package/dist/util/objects.d.ts +1 -1
  92. package/dist/util/permissions.d.ts +4 -4
  93. package/dist/util/references.d.ts +4 -2
  94. package/dist/util/resolutions.d.ts +14 -14
  95. package/dist/util/useTraceUpdate.d.ts +1 -0
  96. package/package.json +139 -119
  97. package/src/components/ClearFilterSortButton.tsx +41 -0
  98. package/src/components/DeleteEntityDialog.tsx +4 -4
  99. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +4 -4
  100. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +276 -279
  101. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +9 -5
  102. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +48 -45
  103. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  104. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +18 -17
  105. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +5 -5
  106. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +29 -34
  107. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +16 -12
  108. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +2 -4
  109. package/src/components/EntityCollectionView/EntityCollectionView.tsx +73 -72
  110. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +5 -6
  111. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  112. package/src/components/EntityCollectionView/useSelectionController.tsx +30 -0
  113. package/src/components/EntityPreview.tsx +209 -70
  114. package/src/components/EntityView.tsx +84 -0
  115. package/src/components/FieldCaption.tsx +14 -0
  116. package/src/components/FireCMSAppBar.tsx +40 -15
  117. package/src/components/HomePage/DefaultHomePage.tsx +15 -11
  118. package/src/components/HomePage/NavigationCard.tsx +69 -0
  119. package/src/components/HomePage/NavigationCardBinding.tsx +116 -0
  120. package/src/components/HomePage/SmallNavigationCard.tsx +45 -0
  121. package/src/components/HomePage/index.tsx +3 -1
  122. package/src/components/PropertyIdCopyTooltipContent.tsx +2 -3
  123. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +4 -4
  124. package/src/components/ReferenceWidget.tsx +22 -12
  125. package/src/components/SearchIconsView.tsx +5 -5
  126. package/src/components/SelectableTable/SelectableTable.tsx +5 -3
  127. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  128. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +23 -8
  129. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +38 -24
  130. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +35 -15
  131. package/src/components/VirtualTable/VirtualTable.tsx +38 -29
  132. package/src/components/VirtualTable/VirtualTableHeader.tsx +4 -4
  133. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  134. package/src/components/VirtualTable/VirtualTableProps.tsx +7 -7
  135. package/src/components/VirtualTable/VirtualTableRow.tsx +4 -5
  136. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +1 -1
  137. package/src/components/VirtualTable/types.tsx +2 -3
  138. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +11 -7
  139. package/src/components/common/index.ts +1 -0
  140. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  141. package/src/components/common/types.tsx +4 -6
  142. package/src/components/common/useColumnsIds.tsx +10 -2
  143. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +12 -1
  144. package/src/components/common/useTableSearchHelper.ts +39 -9
  145. package/src/components/index.tsx +5 -2
  146. package/src/contexts/AuthControllerContext.tsx +1 -1
  147. package/src/core/Drawer.tsx +78 -103
  148. package/src/core/DrawerNavigationItem.tsx +62 -0
  149. package/src/core/{EntityView.tsx → EntityEditView.tsx} +27 -45
  150. package/src/core/EntitySidePanel.tsx +3 -3
  151. package/src/core/FireCMS.tsx +54 -43
  152. package/src/core/NavigationRoutes.tsx +11 -4
  153. package/src/core/Scaffold.tsx +80 -66
  154. package/src/core/field_configs.tsx +2 -3
  155. package/src/core/index.tsx +3 -4
  156. package/src/form/EntityForm.tsx +49 -33
  157. package/src/form/PropertyFieldBinding.tsx +0 -2
  158. package/src/form/components/StorageItemPreview.tsx +7 -5
  159. package/src/form/components/StorageUploadProgress.tsx +9 -8
  160. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +10 -12
  161. package/src/form/field_bindings/BlockFieldBinding.tsx +2 -2
  162. package/src/form/field_bindings/DateTimeFieldBinding.tsx +1 -1
  163. package/src/form/field_bindings/KeyValueFieldBinding.tsx +19 -19
  164. package/src/form/field_bindings/MapFieldBinding.tsx +15 -15
  165. package/src/form/field_bindings/MarkdownFieldBinding.tsx +2 -2
  166. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +3 -3
  167. package/src/form/field_bindings/ReferenceFieldBinding.tsx +16 -13
  168. package/src/form/field_bindings/SelectFieldBinding.tsx +3 -3
  169. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +18 -9
  170. package/src/form/field_bindings/TextFieldBinding.tsx +7 -5
  171. package/src/form/validation.ts +3 -4
  172. package/src/hooks/data/delete.ts +3 -3
  173. package/src/hooks/data/save.ts +4 -2
  174. package/src/hooks/data/useCollectionFetch.tsx +1 -1
  175. package/src/hooks/data/useDataSource.tsx +8 -3
  176. package/src/hooks/data/useEntityFetch.tsx +4 -4
  177. package/src/hooks/index.tsx +3 -0
  178. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  179. package/src/hooks/useBuildModeController.tsx +11 -5
  180. package/src/hooks/useBuildNavigationController.tsx +200 -83
  181. package/src/hooks/useProjectLog.tsx +17 -7
  182. package/src/hooks/useReferenceDialog.tsx +2 -2
  183. package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
  184. package/src/hooks/useStorageSource.tsx +7 -2
  185. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  186. package/src/internal/useBuildDataSource.ts +54 -47
  187. package/src/internal/useBuildSideEntityController.tsx +88 -21
  188. package/src/preview/PropertyPreview.tsx +5 -15
  189. package/src/preview/PropertyPreviewProps.tsx +1 -11
  190. package/src/preview/components/BooleanPreview.tsx +19 -4
  191. package/src/preview/components/EnumValuesChip.tsx +2 -2
  192. package/src/preview/components/ReferencePreview.tsx +72 -165
  193. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -1
  194. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +2 -1
  195. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -1
  196. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
  197. package/src/preview/property_previews/ArrayOneOfPreview.tsx +2 -3
  198. package/src/preview/property_previews/ArrayPropertyPreview.tsx +2 -3
  199. package/src/preview/property_previews/MapPropertyPreview.tsx +5 -5
  200. package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
  201. package/src/types/analytics.ts +1 -0
  202. package/src/types/auth.tsx +50 -1
  203. package/src/types/collections.ts +37 -6
  204. package/src/types/datasource.ts +24 -17
  205. package/src/types/entities.ts +9 -1
  206. package/src/types/entity_actions.tsx +17 -0
  207. package/src/types/entity_callbacks.ts +2 -2
  208. package/src/types/entity_overrides.tsx +7 -0
  209. package/src/types/firecms.tsx +0 -1
  210. package/src/types/index.ts +2 -1
  211. package/src/types/navigation.ts +17 -17
  212. package/src/types/permissions.ts +6 -1
  213. package/src/types/plugins.tsx +26 -28
  214. package/src/types/properties.ts +18 -6
  215. package/src/types/property_config.tsx +2 -2
  216. package/src/types/roles.ts +41 -0
  217. package/src/types/side_entity_controller.tsx +1 -0
  218. package/src/types/storage.ts +12 -3
  219. package/src/types/user.ts +7 -0
  220. package/src/util/collections.ts +22 -0
  221. package/src/util/entities.ts +1 -1
  222. package/src/util/enums.ts +1 -1
  223. package/src/util/icon_list.ts +2 -2
  224. package/src/util/icon_synonyms.ts +3 -99
  225. package/src/util/icons.tsx +11 -3
  226. package/src/util/navigation_utils.ts +6 -6
  227. package/src/util/objects.ts +8 -21
  228. package/src/util/permissions.ts +11 -8
  229. package/src/util/references.ts +36 -5
  230. package/src/util/resolutions.ts +32 -31
  231. package/src/util/strings.ts +2 -2
  232. package/src/util/useTraceUpdate.tsx +2 -1
  233. package/dist/components/VirtualTable/common.d.ts +0 -2
  234. package/dist/core/SideEntityView.d.ts +0 -7
  235. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  236. package/dist/internal/useLocaleConfig.d.ts +0 -1
  237. package/dist/types/appcheck.d.ts +0 -26
  238. package/src/components/HomePage/NavigationCollectionCard.tsx +0 -146
  239. package/src/core/SideEntityView.tsx +0 -38
  240. package/src/internal/useBuildCustomizationController.tsx +0 -5
  241. package/src/internal/useLocaleConfig.tsx +0 -18
  242. package/src/types/appcheck.ts +0 -29
@@ -27,19 +27,19 @@ export function ReferenceFieldBinding<M extends Record<string, any>>(props: Fiel
27
27
 
28
28
  }
29
29
 
30
- function ReferenceFieldBindingInternal<M extends Record<string, any>>({
31
- value,
32
- setValue,
33
- error,
34
- showError,
35
- isSubmitting,
36
- disabled,
37
- touched,
38
- autoFocus,
39
- property,
40
- includeDescription,
41
- context
42
- }: FieldProps<EntityReference>) {
30
+ function ReferenceFieldBindingInternal({
31
+ value,
32
+ setValue,
33
+ error,
34
+ showError,
35
+ isSubmitting,
36
+ disabled,
37
+ touched,
38
+ autoFocus,
39
+ property,
40
+ includeDescription,
41
+ context
42
+ }: FieldProps<EntityReference>) {
43
43
  if (!property.path) {
44
44
  throw new Error("Property path is required for ReferenceFieldBinding");
45
45
  }
@@ -95,9 +95,12 @@ function ReferenceFieldBindingInternal<M extends Record<string, any>>({
95
95
  {value && <ReferencePreview
96
96
  disabled={!property.path}
97
97
  previewProperties={property.previewProperties}
98
+ hover={!disabled}
98
99
  size={"medium"}
99
100
  onClick={disabled || isSubmitting ? undefined : onEntryClick}
100
101
  reference={value}
102
+ includeEntityLink={property.includeEntityLink}
103
+ includeId={property.includeId}
101
104
  />}
102
105
 
103
106
  {!value && <div className="justify-center text-left">
@@ -4,7 +4,7 @@ import { EnumType, FieldProps } from "../../types";
4
4
  import { FieldHelperText, LabelWithIcon } from "../components";
5
5
  import { EnumValuesChip } from "../../preview";
6
6
  import { getIconForProperty } from "../../util";
7
- import { ClearIcon, cn, IconButton, Select, SelectItem } from "@firecms/ui";
7
+ import { ClearIcon, cls, IconButton, Select, SelectItem } from "@firecms/ui";
8
8
  import { useClearRestoreValue } from "../useClearRestoreValue";
9
9
 
10
10
  type SelectProps<T extends EnumType> = FieldProps<T>;
@@ -48,10 +48,10 @@ export function SelectFieldBinding<T extends EnumType>({
48
48
  <>
49
49
 
50
50
  <Select
51
- value={value ? value.toString() : ""}
51
+ value={value !== undefined && value != null ? value.toString() : ""}
52
52
  disabled={disabled}
53
53
  position="item-aligned"
54
- inputClassName={cn("w-full")}
54
+ inputClassName={cls("w-full")}
55
55
  label={<LabelWithIcon icon={getIconForProperty(property, "small")}
56
56
  required={property.validation?.required}
57
57
  title={property.name}
@@ -3,6 +3,7 @@ import React, { useCallback } from "react";
3
3
  import {
4
4
  ArrayProperty,
5
5
  Entity,
6
+ EntityCollection,
6
7
  FieldProps,
7
8
  ResolvedArrayProperty,
8
9
  ResolvedStringProperty,
@@ -10,16 +11,16 @@ import {
10
11
  } from "../../types";
11
12
  import { useDropzone } from "react-dropzone";
12
13
  import { PreviewSize } from "../../preview";
13
- import { FieldHelperText,LabelWithIcon } from "../components";
14
+ import { FieldHelperText, LabelWithIcon } from "../components";
14
15
 
15
16
  import { getIconForProperty, isReadOnly } from "../../util";
16
- import { useSnackbarController, useStorageSource } from "../../hooks";
17
+ import { useSnackbarController, useStorageSource } from "../../hooks";
17
18
  import { DragDropContext, Draggable, Droppable } from "@hello-pangea/dnd";
18
19
  import { StorageFieldItem, useStorageUploadController } from "../../util/useStorageUploadController";
19
20
  import { StorageUploadProgress } from "../components/StorageUploadProgress";
20
21
  import { StorageItemPreview } from "../components/StorageItemPreview";
21
22
  import {
22
- cn,
23
+ cls,
23
24
  fieldBackgroundDisabledMixin,
24
25
  fieldBackgroundHoverMixin,
25
26
  fieldBackgroundMixin,
@@ -55,13 +56,13 @@ export function StorageUploadFieldBinding({
55
56
  property,
56
57
  includeDescription,
57
58
  context,
58
- isSubmitting
59
+ isSubmitting,
59
60
  }: StorageUploadFieldProps) {
60
61
 
61
62
  if (!context.entityId)
62
63
  throw new Error("StorageUploadFieldBinding: Entity id is null");
63
64
 
64
- const storageSource = useStorageSource();
65
+ const storageSource = useStorageSource(context.collection);
65
66
  const disabled = isReadOnly(property) || !!property.disabled || isSubmitting;
66
67
 
67
68
  const {
@@ -108,6 +109,7 @@ export function StorageUploadFieldBinding({
108
109
 
109
110
  <StorageUpload
110
111
  value={internalValue}
112
+ collection={context.collection}
111
113
  name={propertyKey}
112
114
  disabled={disabled}
113
115
  autoFocus={autoFocus}
@@ -133,6 +135,7 @@ export function StorageUploadFieldBinding({
133
135
 
134
136
  function FileDropComponent({
135
137
  storage,
138
+ collection,
136
139
  disabled,
137
140
  isDraggingOver,
138
141
  onFilesAdded,
@@ -151,6 +154,7 @@ function FileDropComponent({
151
154
  helpText
152
155
  }: {
153
156
  storage: StorageConfig,
157
+ collection: EntityCollection,
154
158
  disabled: boolean,
155
159
  isDraggingOver: boolean,
156
160
  droppableProvided: any,
@@ -199,7 +203,7 @@ function FileDropComponent({
199
203
  return (
200
204
  <div
201
205
  {...getRootProps()}
202
- className={cn(
206
+ className={cls(
203
207
  fieldBackgroundMixin,
204
208
  disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,
205
209
  dropZoneClasses,
@@ -216,7 +220,7 @@ function FileDropComponent({
216
220
  <div
217
221
  {...droppableProvided.droppableProps}
218
222
  ref={droppableProvided.innerRef}
219
- className={cn("flex items-center p-1 no-scrollbar",
223
+ className={cls("flex items-center p-1 no-scrollbar",
220
224
  multipleFilesSupported && internalValue.length ? "overflow-auto" : "",
221
225
  multipleFilesSupported && internalValue.length ? "min-h-[180px]" : "min-h-[250px]"
222
226
  )}
@@ -231,6 +235,7 @@ function FileDropComponent({
231
235
  if (entry.storagePathOrDownloadUrl) {
232
236
  child = (
233
237
  <StorageItemPreview
238
+ collection={collection}
234
239
  name={`storage_preview_${entry.storagePathOrDownloadUrl}`}
235
240
  property={property}
236
241
  disabled={disabled}
@@ -263,7 +268,7 @@ function FileDropComponent({
263
268
  ref={provided.innerRef}
264
269
  {...provided.draggableProps}
265
270
  {...provided.dragHandleProps}
266
- className={cn(focusedMixin, "rounded-md")}
271
+ className={cls(focusedMixin, "rounded-md")}
267
272
  style={{
268
273
  ...provided.draggableProps.style
269
274
  }}
@@ -294,6 +299,7 @@ function FileDropComponent({
294
299
 
295
300
  export interface StorageUploadProps {
296
301
  value: StorageFieldItem[];
302
+ collection: EntityCollection;
297
303
  setInternalValue: (v: StorageFieldItem[]) => void;
298
304
  name: string;
299
305
  property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
@@ -309,6 +315,7 @@ export interface StorageUploadProps {
309
315
  }
310
316
 
311
317
  export function StorageUpload({
318
+ collection,
312
319
  property,
313
320
  name,
314
321
  value,
@@ -321,7 +328,7 @@ export function StorageUpload({
321
328
  autoFocus,
322
329
  storage,
323
330
  entity,
324
- storagePathBuilder
331
+ storagePathBuilder,
325
332
  }: StorageUploadProps) {
326
333
 
327
334
  if (multipleFilesSupported) {
@@ -401,6 +408,7 @@ export function StorageUpload({
401
408
  className="rounded"
402
409
  >
403
410
  <StorageItemPreview
411
+ collection={collection}
404
412
  name={`storage_preview_${entry.storagePathOrDownloadUrl}`}
405
413
  property={renderProperty}
406
414
  disabled={true}
@@ -414,6 +422,7 @@ export function StorageUpload({
414
422
  >
415
423
  {(provided, snapshot) => {
416
424
  return <FileDropComponent storage={storage}
425
+ collection={collection}
417
426
  disabled={disabled}
418
427
  isDraggingOver={snapshot.isDraggingOver}
419
428
  droppableProvided={provided}
@@ -7,7 +7,7 @@ import { getIconForProperty } from "../../util";
7
7
  import { PropertyPreview } from "../../preview";
8
8
  import { useClearRestoreValue } from "../useClearRestoreValue";
9
9
 
10
- interface TextFieldProps<T extends string | number> extends FieldProps<T> {
10
+ interface TextFieldBindingProps<T extends string | number> extends FieldProps<T> {
11
11
  allowInfinity?: boolean
12
12
  }
13
13
 
@@ -18,6 +18,7 @@ interface TextFieldProps<T extends string | number> extends FieldProps<T> {
18
18
  * @group Form fields
19
19
  */
20
20
  export function TextFieldBinding<T extends string | number>({
21
+ context,
21
22
  propertyKey,
22
23
  value,
23
24
  setValue,
@@ -27,7 +28,7 @@ export function TextFieldBinding<T extends string | number>({
27
28
  autoFocus,
28
29
  property,
29
30
  includeDescription,
30
- }: TextFieldProps<T>) {
31
+ }: TextFieldBindingProps<T>) {
31
32
 
32
33
  let multiline: boolean | undefined;
33
34
  let url: boolean | PreviewType | undefined;
@@ -96,9 +97,10 @@ export function TextFieldBinding<T extends string | number>({
96
97
  {url && <Collapse
97
98
  className="mt-1 ml-1"
98
99
  in={Boolean(value)}>
99
- <PropertyPreview value={value}
100
- property={property}
101
- size={"medium"}/>
100
+ <PropertyPreview
101
+ value={value}
102
+ property={property}
103
+ size={"medium"}/>
102
104
  </Collapse>}
103
105
 
104
106
  </>
@@ -9,8 +9,7 @@ import {
9
9
  } from "../types";
10
10
  import * as yup from "yup";
11
11
  import { AnySchema, ArraySchema, BooleanSchema, DateSchema, NumberSchema, ObjectSchema, StringSchema } from "yup";
12
- import { enumToObjectEntries } from "../util/enums";
13
- import { getValueInPath, hydrateRegExp, isPropertyBuilder } from "../util";
12
+ import { enumToObjectEntries, getValueInPath, hydrateRegExp, isPropertyBuilder } from "../util";
14
13
 
15
14
  // Add custom unique function for array values
16
15
  declare module "yup" {
@@ -90,12 +89,12 @@ export function mapPropertyToYup<T extends CMSType>(propertyContext: PropertyCon
90
89
  throw Error("Unsupported data type in yup mapping");
91
90
  }
92
91
 
93
- export function getYupMapObjectSchema<M extends Record<string, any>>({
92
+ export function getYupMapObjectSchema({
94
93
  property,
95
94
  entityId,
96
95
  customFieldValidator,
97
96
  name
98
- }: PropertyContext<M>): ObjectSchema<any> {
97
+ }: PropertyContext<Record<string, any>>): ObjectSchema<any> {
99
98
  const objectSchema: any = {};
100
99
  const validation = property.validation;
101
100
  if (property.properties)
@@ -12,10 +12,10 @@ import {
12
12
  /**
13
13
  * @group Hooks and utilities
14
14
  */
15
- export type DeleteEntityWithCallbacksProps<M extends Record<string, any>> =
15
+ export type DeleteEntityWithCallbacksProps<M extends Record<string, any>, UserType extends User = User> =
16
16
  DeleteEntityProps<M>
17
17
  & {
18
- callbacks?: EntityCallbacks<M>;
18
+ callbacks?: EntityCallbacks<M, UserType>;
19
19
  onDeleteSuccess?: (entity: Entity<M>) => void;
20
20
  onDeleteFailure?: (entity: Entity<M>, e: Error) => void;
21
21
  onPreDeleteHookError?: (entity: Entity<M>, e: Error) => void;
@@ -62,7 +62,7 @@ export async function deleteEntityWithCallbacks<M extends Record<string, any>, U
62
62
 
63
63
  console.debug("Deleting entity", entity.path, entity.id);
64
64
 
65
- const entityDeleteProps: EntityOnDeleteProps<M, UserType> = {
65
+ const entityDeleteProps: EntityOnDeleteProps<M, any> = {
66
66
  entity,
67
67
  collection,
68
68
  entityId: entity.id,
@@ -17,7 +17,6 @@ import { resolveCollection } from "../../util";
17
17
  export type SaveEntityWithCallbacksProps<M extends Record<string, any>> =
18
18
  SaveEntityProps<M> &
19
19
  {
20
- callbacks?: EntityCallbacks<M>;
21
20
  onSaveSuccess?: (updatedEntity: Entity<M>) => void,
22
21
  onSaveFailure?: (e: Error) => void,
23
22
  onPreSaveHookError?: (e: Error) => void,
@@ -64,7 +63,7 @@ export async function saveEntityWithCallbacks<M extends Record<string, any>, Use
64
63
  onPreSaveHookError,
65
64
  onSaveSuccessHookError
66
65
  }: SaveEntityWithCallbacksProps<M> & {
67
- collection: EntityCollection<M>,
66
+ collection: EntityCollection<M, UserType>,
68
67
  dataSource: DataSource,
69
68
  context: FireCMSContext<UserType>,
70
69
  }
@@ -109,6 +108,7 @@ export async function saveEntityWithCallbacks<M extends Record<string, any>, Use
109
108
  updatedValues = values;
110
109
  }
111
110
 
111
+ console.log("Saving entity", entityId, updatedValues);
112
112
  return dataSource.saveEntity({
113
113
  collection,
114
114
  path: resolvedPath,
@@ -117,6 +117,7 @@ export async function saveEntityWithCallbacks<M extends Record<string, any>, Use
117
117
  previousValues,
118
118
  status
119
119
  }).then((entity) => {
120
+ console.log("Entity saved");
120
121
  try {
121
122
  if (callbacks?.onSaveSuccess) {
122
123
  const resolvedCollection = resolveCollection<M>({
@@ -145,6 +146,7 @@ export async function saveEntityWithCallbacks<M extends Record<string, any>, Use
145
146
  onSaveSuccess(entity);
146
147
  })
147
148
  .catch((e) => {
149
+ console.error("!!!", e);
148
150
  if (callbacks?.onSaveFailure) {
149
151
 
150
152
  const resolvedCollection = resolveCollection<M>({
@@ -70,7 +70,7 @@ export function useCollectionFetch<M extends Record<string, any>, UserType exten
70
70
  searchString
71
71
  }: CollectionFetchProps<M>): CollectionFetchResult<M> {
72
72
 
73
- const dataSource = useDataSource();
73
+ const dataSource = useDataSource(collection);
74
74
  const navigationController = useNavigationController();
75
75
 
76
76
  const path = navigationController.resolveAliasesFrom(inputPath);
@@ -1,9 +1,14 @@
1
- import { useContext } from "react";
2
- import { DataSource } from "../../types";
1
+ import { useContext, useMemo } from "react";
2
+ import { DataSource, EntityCollection } from "../../types";
3
3
  import { DataSourceContext } from "../../contexts/DataSourceContext";
4
4
 
5
5
  /**
6
6
  * Use this hook to get the datasource being used
7
7
  * @group Hooks and utilities
8
8
  */
9
- export const useDataSource = (): DataSource => useContext(DataSourceContext);
9
+ export const useDataSource = (collection?: EntityCollection<any, any>): DataSource => {
10
+ const defaultDataSource = useContext(DataSourceContext);
11
+ if (collection?.overrides?.dataSource)
12
+ return collection?.overrides.dataSource;
13
+ return defaultDataSource;
14
+ };
@@ -7,10 +7,10 @@ import { useFireCMSContext } from "../useFireCMSContext";
7
7
  /**
8
8
  * @group Hooks and utilities
9
9
  */
10
- export interface EntityFetchProps<M extends Record<string, any>> {
10
+ export interface EntityFetchProps<M extends Record<string, any>, UserType extends User = User> {
11
11
  path: string;
12
12
  entityId?: string;
13
- collection: EntityCollection<M>;
13
+ collection: EntityCollection<M, UserType>;
14
14
  useCache?: boolean;
15
15
  }
16
16
 
@@ -41,9 +41,9 @@ export function useEntityFetch<M extends Record<string, any>, UserType extends U
41
41
  entityId,
42
42
  collection,
43
43
  useCache = false
44
- }: EntityFetchProps<M>): EntityFetchResult<M> {
44
+ }: EntityFetchProps<M, UserType>): EntityFetchResult<M> {
45
45
 
46
- const dataSource = useDataSource();
46
+ const dataSource = useDataSource(collection);
47
47
  const navigationController = useNavigationController();
48
48
 
49
49
  const path = navigationController.resolveAliasesFrom(inputPath);
@@ -10,6 +10,7 @@ export * from "./useResolvedNavigationFrom";
10
10
 
11
11
  export * from "./useStorageSource";
12
12
  export * from "./useAuthController";
13
+ export * from "./useDialogsController";
13
14
  export * from "./useSideDialogsController";
14
15
  export * from "./useSideEntityController";
15
16
  export * from "./useFireCMSContext";
@@ -25,3 +26,5 @@ export * from "./useBuildNavigationController";
25
26
 
26
27
  export * from "./useBuildLocalConfigurationPersistence";
27
28
  export * from "./useBuildModeController";
29
+
30
+ export * from "./useValidateAuthenticator";
@@ -1,10 +1,10 @@
1
- import { useCallback, useEffect, useState } from "react";
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
2
  import { PartialEntityCollection, UserConfigurationPersistence } from "../types";
3
3
  import { mergeDeep, stripCollectionPath } from "../util";
4
4
 
5
5
  export function useBuildLocalConfigurationPersistence(): UserConfigurationPersistence {
6
6
 
7
- const [configCache, setConfigCache] = useState<Record<string, PartialEntityCollection>>({});
7
+ const configCache = useRef<Record<string, PartialEntityCollection>>({});
8
8
 
9
9
  const getCollectionFromStorage = useCallback((storageKey: string) => {
10
10
  const item = localStorage.getItem(storageKey);
@@ -13,20 +13,18 @@ export function useBuildLocalConfigurationPersistence(): UserConfigurationPersis
13
13
 
14
14
  const getCollectionConfig = useCallback(<M extends Record<string, any>>(path: string): PartialEntityCollection<M> => {
15
15
  const storageKey = `collection_config::${stripCollectionPath(path)}`;
16
- if (configCache[storageKey]) {
17
- return configCache[storageKey] as PartialEntityCollection<M>;
16
+ if (configCache.current[storageKey]) {
17
+ return configCache.current[storageKey] as PartialEntityCollection<M>;
18
18
  }
19
19
  return getCollectionFromStorage(storageKey);
20
- }, [configCache, getCollectionFromStorage]);
20
+ }, [getCollectionFromStorage]);
21
21
 
22
22
  const onCollectionModified = useCallback(<M extends Record<string, any>>(path: string, data: PartialEntityCollection<M>) => {
23
23
  const storageKey = `collection_config::${stripCollectionPath(path)}`;
24
24
  localStorage.setItem(storageKey, JSON.stringify(data));
25
- setConfigCache((currentCache) => {
26
- const cachedConfig = currentCache[storageKey];
27
- const newConfig = mergeDeep(cachedConfig ?? getCollectionFromStorage(path), data);
28
- return (mergeDeep(currentCache, newConfig));
29
- });
25
+ const cachedConfig = configCache.current[storageKey];
26
+ const newConfig = mergeDeep(cachedConfig ?? getCollectionFromStorage(path), data);
27
+ configCache.current[storageKey] = mergeDeep(configCache.current[storageKey], newConfig);
30
28
  }, [getCollectionFromStorage]);
31
29
 
32
30
  const [recentlyVisitedPaths, _setRecentlyVisitedPaths] = useState<string[]>([]);
@@ -8,8 +8,13 @@ import { ModeController } from "./index";
8
8
  */
9
9
  export function useBuildModeController(): ModeController {
10
10
 
11
- const prefersDarkModeQuery = typeof window !== "undefined" &&
12
- window.matchMedia("(prefers-color-scheme: dark)");
11
+ const prefersDarkModeQuery = useCallback((): boolean => {
12
+ if (typeof window === "undefined")
13
+ return false;
14
+ const mediaQueryList = window.matchMedia("(prefers-color-scheme: dark)");
15
+ return mediaQueryList.matches;
16
+ }, []);
17
+
13
18
  const prefersDarkModeStorage: boolean | null = localStorage.getItem("prefers-dark-mode") != null ? localStorage.getItem("prefers-dark-mode") === "true" : null;
14
19
  const prefersDarkMode = prefersDarkModeStorage ?? prefersDarkModeQuery;
15
20
  const [mode, setMode] = useState<"light" | "dark">(prefersDarkMode ? "dark" : "light");
@@ -23,7 +28,7 @@ export function useBuildModeController(): ModeController {
23
28
  const setDarkMode = useCallback(() => {
24
29
  setMode("dark");
25
30
  setDocumentMode("dark");
26
- }, [prefersDarkModeQuery]);
31
+ }, []);
27
32
 
28
33
  const setLightMode = useCallback(() => {
29
34
  setMode("light");
@@ -37,14 +42,15 @@ export function useBuildModeController(): ModeController {
37
42
 
38
43
  const toggleMode = useCallback(() => {
39
44
 
45
+ const prefersDarkModeQueryResult = prefersDarkModeQuery();
40
46
  if (mode === "light") {
41
- if (!prefersDarkModeQuery)
47
+ if (!prefersDarkModeQueryResult)
42
48
  localStorage.setItem("prefers-dark-mode", "true");
43
49
  else
44
50
  localStorage.removeItem("prefers-dark-mode");
45
51
  setDarkMode();
46
52
  } else {
47
- if (prefersDarkModeQuery)
53
+ if (prefersDarkModeQueryResult)
48
54
  localStorage.setItem("prefers-dark-mode", "false");
49
55
  else
50
56
  localStorage.removeItem("prefers-dark-mode");