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

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 (247) 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/useColumnsIds.d.ts +2 -1
  34. package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +3 -0
  35. package/dist/components/index.d.ts +2 -1
  36. package/dist/contexts/AuthControllerContext.d.ts +1 -1
  37. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  38. package/dist/core/DefaultDrawer.d.ts +19 -0
  39. package/dist/core/DrawerNavigationItem.d.ts +9 -0
  40. package/dist/core/EntityEditView.d.ts +17 -3
  41. package/dist/core/FireCMS.d.ts +1 -1
  42. package/dist/core/NavigationRoutes.d.ts +3 -3
  43. package/dist/core/index.d.ts +3 -4
  44. package/dist/form/PropertiesForm.d.ts +8 -0
  45. package/dist/form/components/ErrorFocus.d.ts +1 -1
  46. package/dist/form/components/FieldHelperText.d.ts +3 -3
  47. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  48. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  49. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +2 -4
  50. package/dist/form/index.d.ts +0 -2
  51. package/dist/hooks/data/delete.d.ts +2 -2
  52. package/dist/hooks/data/save.d.ts +2 -3
  53. package/dist/hooks/data/useDataSource.d.ts +1 -1
  54. package/dist/hooks/data/useEntityFetch.d.ts +3 -3
  55. package/dist/hooks/index.d.ts +2 -0
  56. package/dist/hooks/useBuildNavigationController.d.ts +1 -2
  57. package/dist/hooks/useProjectLog.d.ts +2 -2
  58. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  59. package/dist/index.d.ts +1 -0
  60. package/dist/index.es.js +15825 -12165
  61. package/dist/index.es.js.map +1 -1
  62. package/dist/index.umd.js +19684 -7
  63. package/dist/index.umd.js.map +1 -1
  64. package/dist/internal/useBuildDataSource.d.ts +1 -16
  65. package/dist/internal/useRestoreScroll.d.ts +1 -1
  66. package/dist/preview/PropertyPreviewProps.d.ts +6 -4
  67. package/dist/preview/components/ReferencePreview.d.ts +2 -1
  68. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  69. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  70. package/dist/types/auth.d.ts +26 -2
  71. package/dist/types/collections.d.ts +31 -7
  72. package/dist/types/datasource.d.ts +34 -20
  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/fields.d.ts +31 -30
  77. package/dist/types/index.d.ts +0 -1
  78. package/dist/types/navigation.d.ts +5 -5
  79. package/dist/types/plugins.d.ts +16 -6
  80. package/dist/types/properties.d.ts +17 -4
  81. package/dist/types/storage.d.ts +11 -3
  82. package/dist/util/collections.d.ts +1 -1
  83. package/dist/util/entities.d.ts +1 -1
  84. package/dist/util/icon_synonyms.d.ts +1 -97
  85. package/dist/util/icons.d.ts +2 -2
  86. package/dist/util/navigation_utils.d.ts +2 -2
  87. package/dist/util/objects.d.ts +1 -1
  88. package/dist/util/plurals.d.ts +0 -2
  89. package/dist/util/resolutions.d.ts +13 -13
  90. package/dist/util/storage.d.ts +23 -2
  91. package/dist/util/useStorageUploadController.d.ts +1 -1
  92. package/dist/util/useTraceUpdate.d.ts +1 -0
  93. package/package.json +130 -119
  94. package/src/app/AppBar.tsx +18 -0
  95. package/src/app/Drawer.tsx +25 -0
  96. package/src/app/Scaffold.tsx +249 -0
  97. package/src/app/index.ts +4 -0
  98. package/src/app/useApp.tsx +32 -0
  99. package/src/components/CircularProgressCenter.tsx +1 -1
  100. package/src/components/ClearFilterSortButton.tsx +41 -0
  101. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +9 -18
  102. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +21 -20
  103. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +10 -6
  104. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +38 -34
  105. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  106. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +11 -2
  107. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +14 -6
  108. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +29 -34
  109. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +16 -12
  110. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +4 -5
  111. package/src/components/EntityCollectionView/EntityCollectionView.tsx +69 -45
  112. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  113. package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
  114. package/src/components/EntityPreview.tsx +15 -9
  115. package/src/components/EntityView.tsx +5 -5
  116. package/src/components/ErrorView.tsx +1 -1
  117. package/src/components/HomePage/DefaultHomePage.tsx +3 -3
  118. package/src/components/HomePage/NavigationCard.tsx +3 -3
  119. package/src/components/HomePage/NavigationCardBinding.tsx +1 -1
  120. package/src/components/HomePage/SmallNavigationCard.tsx +5 -5
  121. package/src/components/PropertyIdCopyTooltipContent.tsx +2 -3
  122. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +1 -0
  123. package/src/components/ReferenceWidget.tsx +22 -12
  124. package/src/components/SearchIconsView.tsx +5 -5
  125. package/src/components/SelectableTable/SelectableTable.tsx +7 -7
  126. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  127. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +22 -7
  128. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +28 -6
  129. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +35 -15
  130. package/src/components/VirtualTable/VirtualTable.tsx +70 -37
  131. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -1
  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 +18 -14
  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 +2 -2
  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 +23 -2
  143. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +11 -0
  144. package/src/components/common/useTableSearchHelper.ts +52 -12
  145. package/src/components/index.tsx +2 -1
  146. package/src/contexts/AuthControllerContext.tsx +1 -1
  147. package/src/contexts/DialogsProvider.tsx +2 -2
  148. package/src/{components/FireCMSAppBar.tsx → core/DefaultAppBar.tsx} +52 -37
  149. package/src/core/DefaultDrawer.tsx +177 -0
  150. package/src/core/DrawerNavigationItem.tsx +62 -0
  151. package/src/core/EntityEditView.tsx +711 -139
  152. package/src/core/EntitySidePanel.tsx +1 -2
  153. package/src/core/FireCMS.tsx +39 -44
  154. package/src/core/NavigationRoutes.tsx +7 -8
  155. package/src/core/field_configs.tsx +2 -3
  156. package/src/core/index.tsx +3 -4
  157. package/src/form/PropertiesForm.tsx +81 -0
  158. package/src/form/PropertyFieldBinding.tsx +29 -7
  159. package/src/form/components/FieldHelperText.tsx +3 -3
  160. package/src/form/components/StorageItemPreview.tsx +20 -11
  161. package/src/form/components/StorageUploadProgress.tsx +3 -3
  162. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +8 -5
  163. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +8 -5
  164. package/src/form/field_bindings/BlockFieldBinding.tsx +2 -2
  165. package/src/form/field_bindings/KeyValueFieldBinding.tsx +44 -39
  166. package/src/form/field_bindings/MapFieldBinding.tsx +11 -3
  167. package/src/form/field_bindings/MarkdownFieldBinding.tsx +2 -2
  168. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +2 -9
  169. package/src/form/field_bindings/ReferenceFieldBinding.tsx +15 -13
  170. package/src/form/field_bindings/RepeatFieldBinding.tsx +10 -7
  171. package/src/form/field_bindings/SelectFieldBinding.tsx +3 -3
  172. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +22 -43
  173. package/src/form/field_bindings/SwitchFieldBinding.tsx +1 -1
  174. package/src/form/index.tsx +4 -4
  175. package/src/form/validation.ts +1 -17
  176. package/src/hooks/data/delete.ts +3 -3
  177. package/src/hooks/data/save.ts +4 -2
  178. package/src/hooks/data/useDataSource.tsx +2 -2
  179. package/src/hooks/data/useEntityFetch.tsx +3 -3
  180. package/src/hooks/index.tsx +3 -0
  181. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  182. package/src/hooks/useBuildModeController.tsx +11 -5
  183. package/src/hooks/useBuildNavigationController.tsx +137 -61
  184. package/src/hooks/useProjectLog.tsx +21 -8
  185. package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
  186. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  187. package/src/index.ts +1 -0
  188. package/src/internal/useBuildDataSource.ts +56 -49
  189. package/src/internal/useBuildSideEntityController.tsx +88 -21
  190. package/src/preview/PropertyPreview.tsx +9 -16
  191. package/src/preview/PropertyPreviewProps.tsx +4 -8
  192. package/src/preview/components/BooleanPreview.tsx +4 -2
  193. package/src/preview/components/EnumValuesChip.tsx +1 -1
  194. package/src/preview/components/ImagePreview.tsx +21 -33
  195. package/src/preview/components/ReferencePreview.tsx +23 -23
  196. package/src/preview/components/StorageThumbnail.tsx +5 -1
  197. package/src/preview/components/UrlComponentPreview.tsx +44 -11
  198. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -1
  199. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +2 -1
  200. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -1
  201. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
  202. package/src/preview/property_previews/ArrayOneOfPreview.tsx +2 -3
  203. package/src/preview/property_previews/ArrayPropertyPreview.tsx +2 -3
  204. package/src/preview/property_previews/MapPropertyPreview.tsx +5 -5
  205. package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
  206. package/src/types/auth.tsx +35 -2
  207. package/src/types/collections.ts +37 -8
  208. package/src/types/customization_controller.tsx +0 -1
  209. package/src/types/datasource.ts +41 -24
  210. package/src/types/entities.ts +9 -1
  211. package/src/types/entity_actions.tsx +16 -3
  212. package/src/types/entity_callbacks.ts +2 -2
  213. package/src/types/fields.tsx +33 -33
  214. package/src/types/index.ts +0 -1
  215. package/src/types/navigation.ts +6 -7
  216. package/src/types/plugins.tsx +18 -8
  217. package/src/types/properties.ts +22 -6
  218. package/src/types/storage.ts +12 -3
  219. package/src/util/collections.ts +1 -1
  220. package/src/util/entities.ts +5 -4
  221. package/src/util/enums.ts +1 -1
  222. package/src/util/icon_list.ts +2 -2
  223. package/src/util/icon_synonyms.ts +3 -99
  224. package/src/util/navigation_utils.ts +6 -6
  225. package/src/util/objects.ts +25 -28
  226. package/src/util/permissions.ts +1 -0
  227. package/src/util/plurals.ts +0 -2
  228. package/src/util/resolutions.ts +32 -31
  229. package/src/util/storage.ts +75 -21
  230. package/src/util/strings.ts +2 -2
  231. package/src/util/useStorageUploadController.tsx +21 -3
  232. package/src/util/useTraceUpdate.tsx +2 -1
  233. package/dist/components/VirtualTable/common.d.ts +0 -2
  234. package/dist/core/Drawer.d.ts +0 -23
  235. package/dist/core/Scaffold.d.ts +0 -55
  236. package/dist/core/SideEntityView.d.ts +0 -7
  237. package/dist/form/EntityForm.d.ts +0 -77
  238. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  239. package/dist/internal/useLocaleConfig.d.ts +0 -1
  240. package/dist/types/appcheck.d.ts +0 -26
  241. package/src/core/Drawer.tsx +0 -191
  242. package/src/core/Scaffold.tsx +0 -281
  243. package/src/core/SideEntityView.tsx +0 -38
  244. package/src/form/EntityForm.tsx +0 -728
  245. package/src/internal/useBuildCustomizationController.tsx +0 -5
  246. package/src/internal/useLocaleConfig.tsx +0 -18
  247. package/src/types/appcheck.ts +0 -29
@@ -8,7 +8,7 @@ import {
8
8
  ArrowDropDownIcon,
9
9
  BooleanSwitchWithLabel,
10
10
  Button,
11
- cn,
11
+ cls,
12
12
  DateTimeField,
13
13
  defaultBorderMixin,
14
14
  ExpandablePanel,
@@ -21,6 +21,7 @@ import {
21
21
  } from "@firecms/ui";
22
22
  import { getDefaultValueForDataType, getIconForProperty } from "../../util";
23
23
  import { useCustomizationController } from "../../hooks";
24
+ import { getIn } from "@firecms/formex";
24
25
 
25
26
  type MapEditViewRowState = [number, {
26
27
  key: string,
@@ -52,9 +53,13 @@ export function KeyValueFieldBinding({
52
53
  if (!property.keyValue) {
53
54
  throw Error(`Your property ${propertyKey} needs to have the 'keyValue' prop in order to use this field binding`);
54
55
  }
56
+
57
+ const initialValues = getIn(context.formex.initialValues, propertyKey);
58
+
55
59
  const mapFormView = <MapEditView value={value}
56
60
  setValue={setValue}
57
61
  disabled={disabled}
62
+ initialValue={initialValues}
58
63
  fieldName={property.name ?? propertyKey}/>;
59
64
 
60
65
  const title = <LabelWithIcon
@@ -84,6 +89,7 @@ export function KeyValueFieldBinding({
84
89
 
85
90
  interface MapEditViewParams<T extends Record<string, any>> {
86
91
  value?: T;
92
+ initialValue?: T;
87
93
  setValue: (value: (T | null)) => void;
88
94
  fieldName?: string,
89
95
  disabled?: boolean
@@ -91,14 +97,15 @@ interface MapEditViewParams<T extends Record<string, any>> {
91
97
 
92
98
  function MapEditView<T extends Record<string, any>>({
93
99
  value,
100
+ initialValue,
94
101
  setValue,
95
102
  fieldName,
96
103
  disabled
97
104
  }: MapEditViewParams<T>) {
98
105
  const [internalState, setInternalState] = React.useState<MapEditViewRowState[]>(
99
- Object.keys(value ?? {}).map((key) => [getRandomId(), {
106
+ Object.keys(initialValue ?? {}).map((key) => [getRandomId(), {
100
107
  key,
101
- dataType: getDataType(value?.[key]) ?? "string"
108
+ dataType: getDataType(initialValue?.[key]) ?? "string"
102
109
  }])
103
110
  );
104
111
 
@@ -121,8 +128,6 @@ function MapEditView<T extends Record<string, any>>({
121
128
  setInternalState(newRowIds);
122
129
  }, [value]);
123
130
 
124
- const originalValue = React.useRef<T>(value ?? {} as T);
125
-
126
131
  const updateDataType = (rowId: number, dataType: DataType) => {
127
132
  if (!rowId) {
128
133
  console.warn("No key selected for data type update");
@@ -168,7 +173,7 @@ function MapEditView<T extends Record<string, any>>({
168
173
  }
169
174
 
170
175
  const newValue = { ...(value ?? {}) } as T;
171
- if (typeof originalValue.current === "object" && fieldKey in originalValue.current) {
176
+ if (typeof initialValue === "object" && fieldKey in initialValue) {
172
177
  // @ts-ignore
173
178
  newValue[fieldKey] = undefined; // set to undefined to remove from the object, the datasource will remove it from the backend
174
179
  } else {
@@ -186,7 +191,7 @@ function MapEditView<T extends Record<string, any>>({
186
191
  value={value ?? {} as T}
187
192
  onDeleteClick={() => {
188
193
  const newValue = { ...(value ?? {}) as T };
189
- if (originalValue.current && fieldKey in originalValue.current) {
194
+ if (initialValue && fieldKey in initialValue) {
190
195
  // @ts-ignore
191
196
  newValue[fieldKey] = undefined;
192
197
  } else {
@@ -305,7 +310,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
305
310
  }}/>;
306
311
  } else if (dataType === "boolean") {
307
312
  return <BooleanSwitchWithLabel value={entryValue}
308
- size={"small"}
313
+ size={"medium"}
309
314
  position={"start"}
310
315
  disabled={disabled || !fieldKey}
311
316
  onValueChange={(newValue) => {
@@ -316,7 +321,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
316
321
  }}/>;
317
322
  } else if (dataType === "array") {
318
323
  return <div
319
- className={cn(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
324
+ className={cls(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
320
325
  <ArrayContainer value={entryValue}
321
326
  newDefaultEntry={""}
322
327
  droppableId={rowId.toString()}
@@ -349,7 +354,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
349
354
  </div>;
350
355
  } else if (dataType === "map") {
351
356
  return <div
352
- className={cn(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
357
+ className={cls(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
353
358
  <MapEditView value={entryValue}
354
359
  fieldName={fieldKey}
355
360
  setValue={(updatedValue) => {
@@ -375,7 +380,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
375
380
  <Typography key={rowId.toString()}
376
381
  component={"div"}
377
382
  className="font-mono flex flex-row gap-1">
378
- <div className="w-[200px] max-w-[25%]">
383
+ <div className="w-[300px] max-w-[30%]">
379
384
  <TextField
380
385
  value={fieldKey}
381
386
  placeholder={"key"}
@@ -389,32 +394,32 @@ function MapKeyValueRow<T extends Record<string, any>>({
389
394
  <div className="flex-grow">
390
395
  {(dataType !== "map" && dataType !== "array") && buildInput(entryValue, fieldKey, dataType)}
391
396
  </div>
392
- <Menu
393
- trigger={<IconButton size={"small"}
394
- className="h-7 w-7">
395
- <ArrowDropDownIcon/>
396
- </IconButton>}
397
- >
398
- <MenuItem dense
399
- onClick={() => doUpdateDataType("string")}>string</MenuItem>
400
- <MenuItem dense
401
- onClick={() => doUpdateDataType("number")}>number</MenuItem>
402
- <MenuItem dense
403
- onClick={() => doUpdateDataType("boolean")}>boolean</MenuItem>
404
- <MenuItem dense
405
- onClick={() => doUpdateDataType("date")}>date</MenuItem>
406
- <MenuItem dense
407
- onClick={() => doUpdateDataType("map")}>map</MenuItem>
408
- <MenuItem dense
409
- onClick={() => doUpdateDataType("array")}>array</MenuItem>
410
- </Menu>
411
-
412
- <IconButton aria-label="delete"
413
- size={"small"}
414
- onClick={onDeleteClick}
415
- className="h-7 w-7">
416
- <RemoveIcon size={"small"}/>
417
- </IconButton>
397
+ <div className={"flex flex-col"}>
398
+ <Menu
399
+ trigger={<IconButton size={"smallest"}>
400
+ <ArrowDropDownIcon size={"small"}/>
401
+ </IconButton>}
402
+ >
403
+ <MenuItem dense
404
+ onClick={() => doUpdateDataType("string")}>string</MenuItem>
405
+ <MenuItem dense
406
+ onClick={() => doUpdateDataType("number")}>number</MenuItem>
407
+ <MenuItem dense
408
+ onClick={() => doUpdateDataType("boolean")}>boolean</MenuItem>
409
+ <MenuItem dense
410
+ onClick={() => doUpdateDataType("date")}>date</MenuItem>
411
+ <MenuItem dense
412
+ onClick={() => doUpdateDataType("map")}>map</MenuItem>
413
+ <MenuItem dense
414
+ onClick={() => doUpdateDataType("array")}>array</MenuItem>
415
+ </Menu>
416
+
417
+ <IconButton aria-label="delete"
418
+ size={"smallest"}
419
+ onClick={onDeleteClick}>
420
+ <RemoveIcon size={"smallest"}/>
421
+ </IconButton>
422
+ </div>
418
423
  </Typography>
419
424
 
420
425
  {(dataType === "map" || dataType === "array") && buildInput(entryValue, fieldKey, dataType)}
@@ -472,7 +477,7 @@ function ArrayKeyValueRow<T>({
472
477
  }}/>;
473
478
  } else if (dataType === "boolean") {
474
479
  return <BooleanSwitchWithLabel value={entryValue}
475
- size={"small"}
480
+ size={"medium"}
476
481
  position={"start"}
477
482
  onValueChange={(v) => {
478
483
  setValue(v as T);
@@ -482,7 +487,7 @@ function ArrayKeyValueRow<T>({
482
487
  Arrays of arrays are not supported.
483
488
  </Typography>;
484
489
  } else if (dataType === "map") {
485
- return <div className={cn(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
490
+ return <div className={cls(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
486
491
  <MapEditView value={entryValue}
487
492
  setValue={(updatedValue) => {
488
493
  setValue(updatedValue);
@@ -1,5 +1,13 @@
1
1
  import React from "react";
2
- import { FieldProps, Properties, ResolvedProperties } from "../../types";
2
+ import {
3
+ CMSType,
4
+ FieldProps,
5
+ FormContext,
6
+ MapProperty,
7
+ Properties,
8
+ ResolvedProperties,
9
+ ResolvedProperty
10
+ } from "../../types";
3
11
 
4
12
  import { ErrorBoundary } from "../../components";
5
13
  import { getIconForProperty, isHidden, pick } from "../../util";
@@ -21,7 +29,6 @@ export function MapFieldBinding({
21
29
  error,
22
30
  disabled,
23
31
  property,
24
- setValue,
25
32
  partOfBlock,
26
33
  tableMode,
27
34
  includeDescription,
@@ -68,6 +75,7 @@ export function MapFieldBinding({
68
75
  partOfBlock: false,
69
76
  autoFocus: autoFocus && index === 0
70
77
  };
78
+
71
79
  return (
72
80
  <div key={`map-${propertyKey}-${index}`}>
73
81
  <ErrorBoundary>
@@ -101,7 +109,7 @@ export function MapFieldBinding({
101
109
  {(tableMode || partOfBlock) && mapFormView}
102
110
 
103
111
  <FieldHelperText includeDescription={includeDescription}
104
- showError={showError}
112
+ showError={showError ?? false}
105
113
  error={error ? (typeof error === "string" ? error : "A property of this map has an error") : undefined}
106
114
  disabled={disabled}
107
115
  property={property}/>
@@ -8,7 +8,7 @@ import { FieldHelperText, LabelWithIcon } from "../components";
8
8
  import { FieldProps } from "../../types";
9
9
  import { getIconForProperty } from "../../util";
10
10
  import {
11
- cn,
11
+ cls,
12
12
  fieldBackgroundDisabledMixin,
13
13
  fieldBackgroundHoverMixin,
14
14
  fieldBackgroundMixin,
@@ -81,7 +81,7 @@ export function MarkdownFieldBinding({
81
81
  </Typography>}
82
82
 
83
83
  <MdEditor value={internalValue ?? ""}
84
- className={cn(fieldBackgroundMixin,
84
+ className={cls(fieldBackgroundMixin,
85
85
  disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,
86
86
  "text-base")}
87
87
  readOnly={disabled}
@@ -6,7 +6,7 @@ import { PropertyPreview } from "../../preview";
6
6
  import { FieldHelperText, LabelWithIcon } from "../components";
7
7
  import { ErrorBoundary } from "../../components";
8
8
  import { getIconForProperty } from "../../util";
9
- import { cn, paperMixin } from "@firecms/ui";
9
+ import { cls, paperMixin } from "@firecms/ui";
10
10
 
11
11
  /**
12
12
  *
@@ -30,12 +30,6 @@ export function ReadOnlyFieldBinding({
30
30
  if (!context.entityId)
31
31
  throw new Error("ReadOnlyFieldBinding: Entity id is null");
32
32
 
33
- const entity: Entity<any> = {
34
- id: context.entityId!,
35
- values: context.values,
36
- path: context.path
37
- };
38
-
39
33
  return (
40
34
 
41
35
  <>
@@ -47,13 +41,12 @@ export function ReadOnlyFieldBinding({
47
41
  }
48
42
 
49
43
  <div
50
- className={cn(paperMixin, "min-h-14 p-4 md:p-6 overflow-x-scroll no-scrollbar")}>
44
+ className={cls(paperMixin, "min-h-14 p-4 md:p-6 overflow-x-scroll no-scrollbar")}>
51
45
 
52
46
  <ErrorBoundary>
53
47
  <PropertyPreview propertyKey={propertyKey}
54
48
  value={value}
55
49
  property={property}
56
- // entity={entity}
57
50
  size={"medium"}/>
58
51
  </ErrorBoundary>
59
52
 
@@ -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
  }
@@ -99,6 +99,8 @@ function ReferenceFieldBindingInternal<M extends Record<string, any>>({
99
99
  size={"medium"}
100
100
  onClick={disabled || isSubmitting ? undefined : onEntryClick}
101
101
  reference={value}
102
+ includeEntityLink={property.includeEntityLink}
103
+ includeId={property.includeId}
102
104
  />}
103
105
 
104
106
  {!value && <div className="justify-center text-left">
@@ -2,9 +2,9 @@ import React, { useState } from "react";
2
2
  import { CMSType, FieldProps, ResolvedProperty } from "../../types";
3
3
  import { FieldHelperText, FormikArrayContainer, LabelWithIcon } from "../components";
4
4
  import { ErrorBoundary } from "../../components";
5
- import { getIconForProperty } from "../../util";
5
+ import { getDefaultValueFor, getIconForProperty } from "../../util";
6
6
  import { PropertyFieldBinding } from "../PropertyFieldBinding";
7
- import { ExpandablePanel } from "@firecms/ui";
7
+ import { ExpandablePanel, Typography } from "@firecms/ui";
8
8
  import { useClearRestoreValue } from "../useClearRestoreValue";
9
9
 
10
10
  /**
@@ -75,12 +75,15 @@ export function RepeatFieldBinding<T extends Array<any>>({
75
75
  onInternalIdAdded={setLastAddedId}
76
76
  disabled={isSubmitting || Boolean(property.disabled)}
77
77
  includeAddButton={!property.disabled}
78
- newDefaultEntry={property.of.defaultValue}/>;
78
+ newDefaultEntry={getDefaultValueFor(property.of)}/>;
79
79
 
80
- const title = (<LabelWithIcon icon={getIconForProperty(property, "small")}
81
- required={property.validation?.required}
82
- title={property.name}
83
- className={"text-text-secondary dark:text-text-secondary-dark"}/>);
80
+ const title = (<>
81
+ <LabelWithIcon icon={getIconForProperty(property, "small")}
82
+ required={property.validation?.required}
83
+ title={property.name}
84
+ className={"flex-grow text-text-secondary dark:text-text-secondary-dark"}/>
85
+ {Array.isArray(value) && <Typography variant={"caption"} className={"px-4"}>({value.length})</Typography>}
86
+ </>);
84
87
 
85
88
  return (
86
89
 
@@ -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}
@@ -1,14 +1,6 @@
1
1
  import React, { useCallback } from "react";
2
2
 
3
- import {
4
- ArrayProperty,
5
- Entity,
6
- EntityCollection,
7
- FieldProps,
8
- ResolvedArrayProperty,
9
- ResolvedStringProperty,
10
- StorageConfig
11
- } from "../../types";
3
+ import { ArrayProperty, FieldProps, ResolvedArrayProperty, ResolvedStringProperty, StorageConfig } from "../../types";
12
4
  import { useDropzone } from "react-dropzone";
13
5
  import { PreviewSize } from "../../preview";
14
6
  import { FieldHelperText, LabelWithIcon } from "../components";
@@ -20,7 +12,7 @@ import { StorageFieldItem, useStorageUploadController } from "../../util/useStor
20
12
  import { StorageUploadProgress } from "../components/StorageUploadProgress";
21
13
  import { StorageItemPreview } from "../components/StorageItemPreview";
22
14
  import {
23
- cn,
15
+ cls,
24
16
  fieldBackgroundDisabledMixin,
25
17
  fieldBackgroundHoverMixin,
26
18
  fieldBackgroundMixin,
@@ -31,7 +23,7 @@ import { useClearRestoreValue } from "../useClearRestoreValue";
31
23
 
32
24
  const dropZoneClasses = "box-border relative pt-[2px] items-center border border-transparent min-h-[254px] outline-none rounded-md duration-200 ease-[cubic-bezier(0.4,0,0.2,1)] focus:border-primary-solid";
33
25
  const disabledClasses = "border-dotted-gray"
34
- const nonActiveDropClasses = "hover:bg-field-hover dark:hover:bg-field-hover-dark"
26
+ const nonActiveDropClasses = fieldBackgroundHoverMixin
35
27
  const activeDropClasses = "pt-0 border-2 border-solid"
36
28
  const acceptDropClasses = "transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-green-500"
37
29
  const rejectDropClasses = "transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-red-500"
@@ -81,7 +73,7 @@ export function StorageUploadFieldBinding({
81
73
  propertyKey,
82
74
  value,
83
75
  storageSource,
84
- disabled,
76
+ disabled: disabled ?? false,
85
77
  onChange: setValue
86
78
  });
87
79
 
@@ -91,12 +83,6 @@ export function StorageUploadFieldBinding({
91
83
  setValue
92
84
  });
93
85
 
94
- const entity: Entity<any> = {
95
- id: context.entityId,
96
- values: context.values,
97
- path: context.path
98
- };
99
-
100
86
  return (
101
87
 
102
88
  <>
@@ -109,15 +95,13 @@ export function StorageUploadFieldBinding({
109
95
 
110
96
  <StorageUpload
111
97
  value={internalValue}
112
- collection={context.collection}
113
98
  name={propertyKey}
114
- disabled={disabled}
115
- autoFocus={autoFocus}
99
+ disabled={disabled ?? false}
100
+ autoFocus={autoFocus ?? false}
116
101
  property={property}
117
102
  onChange={setValue}
118
103
  setInternalValue={setInternalValue}
119
104
  onFilesAdded={onFilesAdded}
120
- entity={entity}
121
105
  onFileUploadComplete={onFileUploadComplete}
122
106
  storagePathBuilder={storagePathBuilder}
123
107
  storage={storage}
@@ -135,7 +119,6 @@ export function StorageUploadFieldBinding({
135
119
 
136
120
  function FileDropComponent({
137
121
  storage,
138
- collection,
139
122
  disabled,
140
123
  isDraggingOver,
141
124
  onFilesAdded,
@@ -144,7 +127,6 @@ function FileDropComponent({
144
127
  autoFocus,
145
128
  internalValue,
146
129
  property,
147
- entity,
148
130
  onClear,
149
131
  metadata,
150
132
  storagePathBuilder,
@@ -154,7 +136,6 @@ function FileDropComponent({
154
136
  helpText
155
137
  }: {
156
138
  storage: StorageConfig,
157
- collection: EntityCollection,
158
139
  disabled: boolean,
159
140
  isDraggingOver: boolean,
160
141
  droppableProvided: any,
@@ -165,7 +146,6 @@ function FileDropComponent({
165
146
  property: ResolvedStringProperty,
166
147
  onClear: (clearedStoragePathOrDownloadUrl: string) => void,
167
148
  metadata: any,
168
- entity: Entity<any>;
169
149
  storagePathBuilder: (file: File) => string,
170
150
  onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: any) => Promise<void>,
171
151
  size: PreviewSize,
@@ -190,10 +170,18 @@ function FileDropComponent({
190
170
  onDropRejected: (fileRejections, event) => {
191
171
  for (const fileRejection of fileRejections) {
192
172
  for (const error of fileRejection.errors) {
193
- snackbarContext.open({
194
- type: "error",
195
- message: `Error uploading file: File is larger than ${storage.maxSize} bytes`
196
- });
173
+ console.log("Error uploading file: ", error);
174
+ if (error.code === "file-too-large") {
175
+ snackbarContext.open({
176
+ type: "error",
177
+ message: `Error uploading file: File is larger than ${storage.maxSize} bytes`
178
+ });
179
+ } else if (error.code === "file-invalid-type") {
180
+ snackbarContext.open({
181
+ type: "error",
182
+ message: "Error uploading file: File type is not supported"
183
+ });
184
+ }
197
185
  }
198
186
  }
199
187
  }
@@ -203,7 +191,7 @@ function FileDropComponent({
203
191
  return (
204
192
  <div
205
193
  {...getRootProps()}
206
- className={cn(
194
+ className={cls(
207
195
  fieldBackgroundMixin,
208
196
  disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,
209
197
  dropZoneClasses,
@@ -220,7 +208,7 @@ function FileDropComponent({
220
208
  <div
221
209
  {...droppableProvided.droppableProps}
222
210
  ref={droppableProvided.innerRef}
223
- className={cn("flex items-center p-1 no-scrollbar",
211
+ className={cls("flex items-center p-1 no-scrollbar",
224
212
  multipleFilesSupported && internalValue.length ? "overflow-auto" : "",
225
213
  multipleFilesSupported && internalValue.length ? "min-h-[180px]" : "min-h-[250px]"
226
214
  )}
@@ -235,11 +223,9 @@ function FileDropComponent({
235
223
  if (entry.storagePathOrDownloadUrl) {
236
224
  child = (
237
225
  <StorageItemPreview
238
- collection={collection}
239
226
  name={`storage_preview_${entry.storagePathOrDownloadUrl}`}
240
227
  property={property}
241
228
  disabled={disabled}
242
- entity={entity}
243
229
  value={entry.storagePathOrDownloadUrl}
244
230
  onRemove={onClear}
245
231
  size={entry.size}/>
@@ -268,7 +254,7 @@ function FileDropComponent({
268
254
  ref={provided.innerRef}
269
255
  {...provided.draggableProps}
270
256
  {...provided.dragHandleProps}
271
- className={cn(focusedMixin, "rounded-md")}
257
+ className={cls(focusedMixin, "rounded-md")}
272
258
  style={{
273
259
  ...provided.draggableProps.style
274
260
  }}
@@ -299,7 +285,6 @@ function FileDropComponent({
299
285
 
300
286
  export interface StorageUploadProps {
301
287
  value: StorageFieldItem[];
302
- collection: EntityCollection;
303
288
  setInternalValue: (v: StorageFieldItem[]) => void;
304
289
  name: string;
305
290
  property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
@@ -307,7 +292,6 @@ export interface StorageUploadProps {
307
292
  multipleFilesSupported: boolean;
308
293
  autoFocus: boolean;
309
294
  disabled: boolean;
310
- entity: Entity<any>;
311
295
  storage: StorageConfig;
312
296
  onFilesAdded: (acceptedFiles: File[]) => void;
313
297
  storagePathBuilder: (file: File) => string;
@@ -315,7 +299,6 @@ export interface StorageUploadProps {
315
299
  }
316
300
 
317
301
  export function StorageUpload({
318
- collection,
319
302
  property,
320
303
  name,
321
304
  value,
@@ -327,7 +310,6 @@ export function StorageUpload({
327
310
  onFilesAdded,
328
311
  autoFocus,
329
312
  storage,
330
- entity,
331
313
  storagePathBuilder,
332
314
  }: StorageUploadProps) {
333
315
 
@@ -408,11 +390,10 @@ export function StorageUpload({
408
390
  className="rounded"
409
391
  >
410
392
  <StorageItemPreview
411
- collection={collection}
412
393
  name={`storage_preview_${entry.storagePathOrDownloadUrl}`}
394
+ placeholder={true}
413
395
  property={renderProperty}
414
396
  disabled={true}
415
- entity={entity}
416
397
  value={entry.storagePathOrDownloadUrl as string}
417
398
  onRemove={onClear}
418
399
  size={entry.size}/>
@@ -422,7 +403,6 @@ export function StorageUpload({
422
403
  >
423
404
  {(provided, snapshot) => {
424
405
  return <FileDropComponent storage={storage}
425
- collection={collection}
426
406
  disabled={disabled}
427
407
  isDraggingOver={snapshot.isDraggingOver}
428
408
  droppableProvided={provided}
@@ -431,7 +411,6 @@ export function StorageUpload({
431
411
  autoFocus={autoFocus}
432
412
  internalValue={value}
433
413
  property={renderProperty}
434
- entity={entity}
435
414
  onClear={onClear}
436
415
  metadata={metadata}
437
416
  storagePathBuilder={storagePathBuilder}
@@ -46,7 +46,7 @@ export const SwitchFieldBinding = React.forwardRef(function SwitchFieldBinding({
46
46
  title={property.name}/>}
47
47
  disabled={disabled}
48
48
  autoFocus={autoFocus}
49
- size={"medium"}
49
+ size={"large"}
50
50
  />
51
51
 
52
52
  <FieldHelperText includeDescription={includeDescription}
@@ -34,10 +34,10 @@ export {
34
34
 
35
35
  export * from "./components";
36
36
 
37
- export type { EntityFormProps } from "./EntityForm";
38
- export {
39
- EntityForm
40
- } from "./EntityForm";
37
+ // export type { EntityFormProps } from "./EntityForm";
38
+ // export {
39
+ // EntityForm
40
+ // } from "./EntityForm";
41
41
 
42
42
  export { PropertyFieldBinding } from "./PropertyFieldBinding";
43
43
  export * from "./useClearRestoreValue";