@firecms/core 3.0.0-canary.8 → 3.0.0-canary.80

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 (239) 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/ClearFilterSortButton.d.ts +5 -0
  8. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -11
  9. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
  10. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +5 -3
  11. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  12. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  13. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +2 -0
  14. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  15. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  16. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +1 -1
  17. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +11 -1
  18. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  19. package/dist/components/EntityPreview.d.ts +5 -4
  20. package/dist/components/ReferenceWidget.d.ts +3 -1
  21. package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
  22. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  23. package/dist/components/VirtualTable/VirtualTableProps.d.ts +5 -6
  24. package/dist/components/VirtualTable/types.d.ts +3 -3
  25. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
  26. package/dist/components/common/index.d.ts +1 -0
  27. package/dist/components/common/table_height.d.ts +5 -0
  28. package/dist/components/common/types.d.ts +4 -6
  29. package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +3 -0
  30. package/dist/components/index.d.ts +2 -1
  31. package/dist/contexts/AuthControllerContext.d.ts +1 -1
  32. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +5 -8
  33. package/dist/core/DefaultDrawer.d.ts +19 -0
  34. package/dist/core/DrawerNavigationItem.d.ts +9 -0
  35. package/dist/core/EntityEditView.d.ts +17 -3
  36. package/dist/core/NavigationRoutes.d.ts +2 -2
  37. package/dist/core/index.d.ts +3 -4
  38. package/dist/form/PropertiesForm.d.ts +8 -0
  39. package/dist/form/components/ErrorFocus.d.ts +1 -1
  40. package/dist/form/components/FieldHelperText.d.ts +3 -3
  41. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  42. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  43. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +2 -4
  44. package/dist/form/index.d.ts +0 -2
  45. package/dist/hooks/data/delete.d.ts +2 -2
  46. package/dist/hooks/data/save.d.ts +2 -3
  47. package/dist/hooks/data/useDataSource.d.ts +1 -1
  48. package/dist/hooks/data/useEntityFetch.d.ts +3 -3
  49. package/dist/hooks/index.d.ts +2 -0
  50. package/dist/hooks/useBuildNavigationController.d.ts +1 -2
  51. package/dist/hooks/useProjectLog.d.ts +2 -2
  52. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.es.js +9816 -9546
  55. package/dist/index.es.js.map +1 -1
  56. package/dist/index.umd.js +5 -5
  57. package/dist/index.umd.js.map +1 -1
  58. package/dist/internal/useBuildDataSource.d.ts +1 -16
  59. package/dist/internal/useRestoreScroll.d.ts +1 -1
  60. package/dist/preview/PropertyPreviewProps.d.ts +6 -4
  61. package/dist/preview/components/ReferencePreview.d.ts +2 -1
  62. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  63. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  64. package/dist/types/auth.d.ts +31 -2
  65. package/dist/types/collections.d.ts +30 -5
  66. package/dist/types/datasource.d.ts +21 -14
  67. package/dist/types/entities.d.ts +5 -1
  68. package/dist/types/entity_actions.d.ts +14 -0
  69. package/dist/types/entity_callbacks.d.ts +2 -2
  70. package/dist/types/fields.d.ts +31 -30
  71. package/dist/types/index.d.ts +1 -1
  72. package/dist/types/navigation.d.ts +5 -5
  73. package/dist/types/plugins.d.ts +16 -6
  74. package/dist/types/properties.d.ts +17 -4
  75. package/dist/types/roles.d.ts +31 -0
  76. package/dist/types/storage.d.ts +11 -3
  77. package/dist/types/user.d.ts +5 -0
  78. package/dist/util/collections.d.ts +1 -1
  79. package/dist/util/entities.d.ts +1 -1
  80. package/dist/util/icon_synonyms.d.ts +1 -97
  81. package/dist/util/icons.d.ts +2 -2
  82. package/dist/util/navigation_utils.d.ts +2 -2
  83. package/dist/util/objects.d.ts +1 -1
  84. package/dist/util/resolutions.d.ts +13 -13
  85. package/dist/util/storage.d.ts +23 -2
  86. package/dist/util/useStorageUploadController.d.ts +1 -1
  87. package/dist/util/useTraceUpdate.d.ts +1 -0
  88. package/package.json +130 -119
  89. package/src/app/AppBar.tsx +18 -0
  90. package/src/app/Drawer.tsx +25 -0
  91. package/src/app/Scaffold.tsx +249 -0
  92. package/src/app/index.ts +4 -0
  93. package/src/app/useApp.tsx +32 -0
  94. package/src/components/ClearFilterSortButton.tsx +41 -0
  95. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +8 -10
  96. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +19 -18
  97. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +10 -6
  98. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +38 -34
  99. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  100. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +10 -2
  101. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +2 -2
  102. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +29 -34
  103. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +16 -12
  104. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +4 -5
  105. package/src/components/EntityCollectionView/EntityCollectionView.tsx +54 -29
  106. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  107. package/src/components/EntityPreview.tsx +14 -9
  108. package/src/components/EntityView.tsx +5 -5
  109. package/src/components/HomePage/DefaultHomePage.tsx +2 -2
  110. package/src/components/HomePage/NavigationCard.tsx +3 -3
  111. package/src/components/HomePage/SmallNavigationCard.tsx +5 -5
  112. package/src/components/PropertyIdCopyTooltipContent.tsx +2 -3
  113. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +1 -0
  114. package/src/components/ReferenceWidget.tsx +22 -12
  115. package/src/components/SearchIconsView.tsx +5 -5
  116. package/src/components/SelectableTable/SelectableTable.tsx +5 -3
  117. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  118. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +23 -8
  119. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +28 -6
  120. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +35 -15
  121. package/src/components/VirtualTable/VirtualTable.tsx +38 -29
  122. package/src/components/VirtualTable/VirtualTableHeader.tsx +4 -4
  123. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  124. package/src/components/VirtualTable/VirtualTableProps.tsx +6 -6
  125. package/src/components/VirtualTable/VirtualTableRow.tsx +4 -5
  126. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +1 -1
  127. package/src/components/VirtualTable/types.tsx +2 -3
  128. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +2 -2
  129. package/src/components/common/index.ts +1 -0
  130. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  131. package/src/components/common/types.tsx +4 -6
  132. package/src/components/common/useColumnsIds.tsx +10 -2
  133. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +11 -0
  134. package/src/components/common/useTableSearchHelper.ts +52 -12
  135. package/src/components/index.tsx +2 -1
  136. package/src/contexts/AuthControllerContext.tsx +1 -1
  137. package/src/contexts/DialogsProvider.tsx +2 -2
  138. package/src/{components/FireCMSAppBar.tsx → core/DefaultAppBar.tsx} +51 -36
  139. package/src/core/DefaultDrawer.tsx +177 -0
  140. package/src/core/DrawerNavigationItem.tsx +62 -0
  141. package/src/core/EntityEditView.tsx +673 -134
  142. package/src/core/EntitySidePanel.tsx +1 -2
  143. package/src/core/FireCMS.tsx +38 -43
  144. package/src/core/NavigationRoutes.tsx +6 -7
  145. package/src/core/field_configs.tsx +2 -3
  146. package/src/core/index.tsx +3 -4
  147. package/src/form/PropertiesForm.tsx +81 -0
  148. package/src/form/PropertyFieldBinding.tsx +29 -7
  149. package/src/form/components/FieldHelperText.tsx +3 -3
  150. package/src/form/components/StorageItemPreview.tsx +20 -11
  151. package/src/form/components/StorageUploadProgress.tsx +3 -3
  152. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +8 -5
  153. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +8 -5
  154. package/src/form/field_bindings/BlockFieldBinding.tsx +2 -2
  155. package/src/form/field_bindings/DateTimeFieldBinding.tsx +1 -1
  156. package/src/form/field_bindings/KeyValueFieldBinding.tsx +44 -39
  157. package/src/form/field_bindings/MapFieldBinding.tsx +11 -3
  158. package/src/form/field_bindings/MarkdownFieldBinding.tsx +2 -2
  159. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +2 -9
  160. package/src/form/field_bindings/ReferenceFieldBinding.tsx +15 -13
  161. package/src/form/field_bindings/RepeatFieldBinding.tsx +10 -7
  162. package/src/form/field_bindings/SelectFieldBinding.tsx +3 -3
  163. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +10 -39
  164. package/src/form/field_bindings/SwitchFieldBinding.tsx +1 -1
  165. package/src/form/index.tsx +4 -4
  166. package/src/form/validation.ts +1 -17
  167. package/src/hooks/data/delete.ts +3 -3
  168. package/src/hooks/data/save.ts +4 -2
  169. package/src/hooks/data/useDataSource.tsx +1 -1
  170. package/src/hooks/data/useEntityFetch.tsx +3 -3
  171. package/src/hooks/index.tsx +3 -0
  172. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  173. package/src/hooks/useBuildModeController.tsx +11 -5
  174. package/src/hooks/useBuildNavigationController.tsx +137 -61
  175. package/src/hooks/useProjectLog.tsx +8 -6
  176. package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
  177. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  178. package/src/index.ts +1 -0
  179. package/src/internal/useBuildDataSource.ts +54 -47
  180. package/src/internal/useBuildSideEntityController.tsx +88 -21
  181. package/src/preview/PropertyPreview.tsx +9 -16
  182. package/src/preview/PropertyPreviewProps.tsx +4 -8
  183. package/src/preview/components/BooleanPreview.tsx +4 -2
  184. package/src/preview/components/EnumValuesChip.tsx +1 -1
  185. package/src/preview/components/ImagePreview.tsx +21 -33
  186. package/src/preview/components/ReferencePreview.tsx +23 -23
  187. package/src/preview/components/StorageThumbnail.tsx +5 -1
  188. package/src/preview/components/UrlComponentPreview.tsx +44 -11
  189. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -1
  190. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +2 -1
  191. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -1
  192. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
  193. package/src/preview/property_previews/ArrayOneOfPreview.tsx +2 -3
  194. package/src/preview/property_previews/ArrayPropertyPreview.tsx +2 -3
  195. package/src/preview/property_previews/MapPropertyPreview.tsx +5 -5
  196. package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
  197. package/src/types/auth.tsx +41 -2
  198. package/src/types/collections.ts +35 -5
  199. package/src/types/customization_controller.tsx +0 -1
  200. package/src/types/datasource.ts +24 -17
  201. package/src/types/entities.ts +9 -1
  202. package/src/types/entity_actions.tsx +16 -3
  203. package/src/types/entity_callbacks.ts +2 -2
  204. package/src/types/fields.tsx +33 -33
  205. package/src/types/index.ts +1 -1
  206. package/src/types/navigation.ts +6 -7
  207. package/src/types/plugins.tsx +18 -8
  208. package/src/types/properties.ts +22 -6
  209. package/src/types/roles.ts +41 -0
  210. package/src/types/storage.ts +12 -3
  211. package/src/types/user.ts +7 -0
  212. package/src/util/collections.ts +1 -1
  213. package/src/util/entities.ts +5 -4
  214. package/src/util/enums.ts +1 -1
  215. package/src/util/icon_list.ts +2 -2
  216. package/src/util/icon_synonyms.ts +3 -99
  217. package/src/util/navigation_utils.ts +6 -6
  218. package/src/util/objects.ts +25 -28
  219. package/src/util/permissions.ts +1 -0
  220. package/src/util/resolutions.ts +32 -31
  221. package/src/util/storage.ts +75 -21
  222. package/src/util/strings.ts +2 -2
  223. package/src/util/useStorageUploadController.tsx +21 -3
  224. package/src/util/useTraceUpdate.tsx +2 -1
  225. package/dist/components/VirtualTable/common.d.ts +0 -2
  226. package/dist/core/Drawer.d.ts +0 -23
  227. package/dist/core/Scaffold.d.ts +0 -55
  228. package/dist/core/SideEntityView.d.ts +0 -7
  229. package/dist/form/EntityForm.d.ts +0 -77
  230. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  231. package/dist/internal/useLocaleConfig.d.ts +0 -1
  232. package/dist/types/appcheck.d.ts +0 -26
  233. package/src/core/Drawer.tsx +0 -191
  234. package/src/core/Scaffold.tsx +0 -281
  235. package/src/core/SideEntityView.tsx +0 -38
  236. package/src/form/EntityForm.tsx +0 -728
  237. package/src/internal/useBuildCustomizationController.tsx +0 -5
  238. package/src/internal/useLocaleConfig.tsx +0 -18
  239. 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,
@@ -203,7 +183,7 @@ function FileDropComponent({
203
183
  return (
204
184
  <div
205
185
  {...getRootProps()}
206
- className={cn(
186
+ className={cls(
207
187
  fieldBackgroundMixin,
208
188
  disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,
209
189
  dropZoneClasses,
@@ -220,7 +200,7 @@ function FileDropComponent({
220
200
  <div
221
201
  {...droppableProvided.droppableProps}
222
202
  ref={droppableProvided.innerRef}
223
- className={cn("flex items-center p-1 no-scrollbar",
203
+ className={cls("flex items-center p-1 no-scrollbar",
224
204
  multipleFilesSupported && internalValue.length ? "overflow-auto" : "",
225
205
  multipleFilesSupported && internalValue.length ? "min-h-[180px]" : "min-h-[250px]"
226
206
  )}
@@ -235,11 +215,9 @@ function FileDropComponent({
235
215
  if (entry.storagePathOrDownloadUrl) {
236
216
  child = (
237
217
  <StorageItemPreview
238
- collection={collection}
239
218
  name={`storage_preview_${entry.storagePathOrDownloadUrl}`}
240
219
  property={property}
241
220
  disabled={disabled}
242
- entity={entity}
243
221
  value={entry.storagePathOrDownloadUrl}
244
222
  onRemove={onClear}
245
223
  size={entry.size}/>
@@ -268,7 +246,7 @@ function FileDropComponent({
268
246
  ref={provided.innerRef}
269
247
  {...provided.draggableProps}
270
248
  {...provided.dragHandleProps}
271
- className={cn(focusedMixin, "rounded-md")}
249
+ className={cls(focusedMixin, "rounded-md")}
272
250
  style={{
273
251
  ...provided.draggableProps.style
274
252
  }}
@@ -299,7 +277,6 @@ function FileDropComponent({
299
277
 
300
278
  export interface StorageUploadProps {
301
279
  value: StorageFieldItem[];
302
- collection: EntityCollection;
303
280
  setInternalValue: (v: StorageFieldItem[]) => void;
304
281
  name: string;
305
282
  property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
@@ -307,7 +284,6 @@ export interface StorageUploadProps {
307
284
  multipleFilesSupported: boolean;
308
285
  autoFocus: boolean;
309
286
  disabled: boolean;
310
- entity: Entity<any>;
311
287
  storage: StorageConfig;
312
288
  onFilesAdded: (acceptedFiles: File[]) => void;
313
289
  storagePathBuilder: (file: File) => string;
@@ -315,7 +291,6 @@ export interface StorageUploadProps {
315
291
  }
316
292
 
317
293
  export function StorageUpload({
318
- collection,
319
294
  property,
320
295
  name,
321
296
  value,
@@ -327,7 +302,6 @@ export function StorageUpload({
327
302
  onFilesAdded,
328
303
  autoFocus,
329
304
  storage,
330
- entity,
331
305
  storagePathBuilder,
332
306
  }: StorageUploadProps) {
333
307
 
@@ -408,11 +382,10 @@ export function StorageUpload({
408
382
  className="rounded"
409
383
  >
410
384
  <StorageItemPreview
411
- collection={collection}
412
385
  name={`storage_preview_${entry.storagePathOrDownloadUrl}`}
386
+ placeholder={true}
413
387
  property={renderProperty}
414
388
  disabled={true}
415
- entity={entity}
416
389
  value={entry.storagePathOrDownloadUrl as string}
417
390
  onRemove={onClear}
418
391
  size={entry.size}/>
@@ -422,7 +395,6 @@ export function StorageUpload({
422
395
  >
423
396
  {(provided, snapshot) => {
424
397
  return <FileDropComponent storage={storage}
425
- collection={collection}
426
398
  disabled={disabled}
427
399
  isDraggingOver={snapshot.isDraggingOver}
428
400
  droppableProvided={provided}
@@ -431,7 +403,6 @@ export function StorageUpload({
431
403
  autoFocus={autoFocus}
432
404
  internalValue={value}
433
405
  property={renderProperty}
434
- entity={entity}
435
406
  onClear={onClear}
436
407
  metadata={metadata}
437
408
  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";
@@ -112,23 +112,7 @@ export function getYupMapObjectSchema({
112
112
  if (validation?.required) {
113
113
  return shape.required(validation?.requiredMessage ? validation.requiredMessage : "Required").nullable(true);
114
114
  }
115
- return shape.nullable(true);
116
- // const object: ObjectSchema<any> = yup.object().shape(objectSchema);
117
- // return validation?.required
118
- // ? object.required(validation?.requiredMessage ? validation.requiredMessage : "Required").nullable(true)
119
- // : yup.object().optional().default(undefined).notRequired().nullable(true).test(
120
- // "empty-check",
121
- // "Optional map can be empty",
122
- // (o: any, testContext: any) => {
123
- // try {
124
- // if (!o || Object.keys(o).length === 0) return true;
125
- // return object.validateSync(o);
126
- // } catch (e) {
127
- // testContext.createError(e);
128
- // console.error(e);
129
- // return false;
130
- // }
131
- // });
115
+ return yup.object().shape(shape.fields).default(undefined).notRequired().nullable(true);
132
116
  }
133
117
 
134
118
  function getYupStringSchema({