@firecms/core 3.0.0-canary.14 → 3.0.0-canary.140

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 (300) hide show
  1. package/README.md +3 -3
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +16 -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/ArrayContainer.d.ts +5 -4
  8. package/dist/components/CircularProgressCenter.d.ts +1 -1
  9. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  10. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -12
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +5 -3
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  15. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  16. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
  17. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  18. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  19. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +2 -2
  20. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -2
  21. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  22. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  23. package/dist/components/EntityPreview.d.ts +7 -6
  24. package/dist/components/ErrorView.d.ts +1 -1
  25. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  26. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  27. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  28. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  29. package/dist/components/ReferenceWidget.d.ts +3 -1
  30. package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
  31. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  32. package/dist/components/VirtualTable/VirtualTableProps.d.ts +15 -12
  33. package/dist/components/VirtualTable/types.d.ts +3 -3
  34. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
  35. package/dist/components/common/index.d.ts +1 -0
  36. package/dist/components/common/table_height.d.ts +5 -0
  37. package/dist/components/common/types.d.ts +4 -6
  38. package/dist/components/common/useColumnsIds.d.ts +2 -1
  39. package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +3 -0
  40. package/dist/components/index.d.ts +4 -2
  41. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  42. package/dist/core/DefaultDrawer.d.ts +19 -0
  43. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  44. package/dist/core/EntityEditView.d.ts +18 -4
  45. package/dist/core/FireCMS.d.ts +1 -1
  46. package/dist/core/NavigationRoutes.d.ts +3 -3
  47. package/dist/core/index.d.ts +3 -4
  48. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  49. package/dist/form/components/ErrorFocus.d.ts +1 -1
  50. package/dist/form/components/FieldHelperText.d.ts +3 -3
  51. package/dist/form/components/FormikArrayContainer.d.ts +2 -1
  52. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  53. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  54. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  55. package/dist/form/components/index.d.ts +1 -0
  56. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  57. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  58. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  59. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  60. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  61. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  62. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  63. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  64. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  65. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  66. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  67. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  68. package/dist/form/index.d.ts +3 -5
  69. package/dist/form/useClearRestoreValue.d.ts +2 -2
  70. package/dist/hooks/data/save.d.ts +1 -2
  71. package/dist/hooks/index.d.ts +1 -0
  72. package/dist/hooks/useBuildNavigationController.d.ts +1 -2
  73. package/dist/hooks/useProjectLog.d.ts +8 -2
  74. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  75. package/dist/index.d.ts +1 -0
  76. package/dist/index.es.js +15817 -12453
  77. package/dist/index.es.js.map +1 -1
  78. package/dist/index.umd.js +20045 -587
  79. package/dist/index.umd.js.map +1 -1
  80. package/dist/internal/useBuildDataSource.d.ts +1 -16
  81. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  82. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  83. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  84. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  85. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  86. package/dist/types/auth.d.ts +3 -3
  87. package/dist/types/collections.d.ts +39 -5
  88. package/dist/types/datasource.d.ts +55 -35
  89. package/dist/types/entities.d.ts +6 -1
  90. package/dist/types/entity_actions.d.ts +14 -0
  91. package/dist/types/entity_overrides.d.ts +2 -2
  92. package/dist/types/fields.d.ts +47 -41
  93. package/dist/types/firecms.d.ts +4 -0
  94. package/dist/types/index.d.ts +0 -1
  95. package/dist/types/navigation.d.ts +6 -5
  96. package/dist/types/plugins.d.ts +14 -4
  97. package/dist/types/properties.d.ts +34 -21
  98. package/dist/types/property_config.d.ts +0 -2
  99. package/dist/types/side_dialogs_controller.d.ts +10 -0
  100. package/dist/types/storage.d.ts +86 -3
  101. package/dist/util/entities.d.ts +2 -2
  102. package/dist/util/icon_list.d.ts +5 -1
  103. package/dist/util/icon_synonyms.d.ts +1 -97
  104. package/dist/util/icons.d.ts +3 -2
  105. package/dist/util/index.d.ts +1 -0
  106. package/dist/util/navigation_utils.d.ts +2 -2
  107. package/dist/util/objects.d.ts +1 -1
  108. package/dist/util/plurals.d.ts +0 -2
  109. package/dist/util/property_utils.d.ts +1 -1
  110. package/dist/util/resolutions.d.ts +30 -16
  111. package/dist/util/storage.d.ts +23 -2
  112. package/dist/util/useStorageUploadController.d.ts +3 -3
  113. package/package.json +128 -119
  114. package/src/app/AppBar.tsx +18 -0
  115. package/src/app/Drawer.tsx +24 -0
  116. package/src/app/Scaffold.tsx +243 -0
  117. package/src/app/index.ts +4 -0
  118. package/src/app/useApp.tsx +32 -0
  119. package/src/components/ArrayContainer.tsx +19 -15
  120. package/src/components/CircularProgressCenter.tsx +1 -1
  121. package/src/components/ClearFilterSortButton.tsx +41 -0
  122. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +1 -1
  123. package/src/components/DeleteEntityDialog.tsx +1 -1
  124. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +12 -19
  125. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +21 -20
  126. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +10 -6
  127. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +41 -35
  128. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  129. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +31 -16
  130. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +14 -6
  131. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +29 -34
  132. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +32 -30
  133. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +19 -7
  134. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +8 -11
  135. package/src/components/EntityCollectionView/EntityCollectionView.tsx +138 -85
  136. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  137. package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
  138. package/src/components/EntityCollectionView/utils.ts +19 -0
  139. package/src/components/EntityPreview.tsx +43 -39
  140. package/src/components/EntityView.tsx +6 -6
  141. package/src/components/ErrorView.tsx +1 -1
  142. package/src/components/HomePage/DefaultHomePage.tsx +25 -19
  143. package/src/components/HomePage/NavigationCard.tsx +3 -3
  144. package/src/components/HomePage/NavigationCardBinding.tsx +1 -1
  145. package/src/components/HomePage/NavigationGroup.tsx +1 -1
  146. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  147. package/src/components/PropertyConfigBadge.tsx +9 -3
  148. package/src/components/PropertyIdCopyTooltip.tsx +48 -0
  149. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +8 -7
  150. package/src/components/ReferenceWidget.tsx +22 -12
  151. package/src/components/SearchIconsView.tsx +10 -7
  152. package/src/components/SelectableTable/SelectableTable.tsx +7 -7
  153. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  154. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +22 -7
  155. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +28 -6
  156. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +88 -21
  157. package/src/components/VirtualTable/VirtualTable.tsx +77 -46
  158. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  159. package/src/components/VirtualTable/VirtualTableHeader.tsx +4 -4
  160. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  161. package/src/components/VirtualTable/VirtualTableProps.tsx +18 -14
  162. package/src/components/VirtualTable/VirtualTableRow.tsx +4 -5
  163. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
  164. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -1
  165. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  166. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +14 -28
  167. package/src/components/VirtualTable/types.tsx +2 -3
  168. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +8 -4
  169. package/src/components/common/index.ts +1 -0
  170. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  171. package/src/components/common/types.tsx +4 -6
  172. package/src/components/common/useColumnsIds.tsx +23 -2
  173. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +23 -12
  174. package/src/components/common/useTableSearchHelper.ts +53 -12
  175. package/src/components/index.tsx +4 -2
  176. package/src/contexts/DialogsProvider.tsx +2 -2
  177. package/src/core/DefaultAppBar.tsx +176 -0
  178. package/src/core/DefaultDrawer.tsx +183 -0
  179. package/src/core/DrawerNavigationItem.tsx +66 -0
  180. package/src/core/EntityEditView.tsx +716 -153
  181. package/src/core/EntitySidePanel.tsx +1 -2
  182. package/src/core/FireCMS.tsx +53 -52
  183. package/src/core/NavigationRoutes.tsx +7 -8
  184. package/src/core/SideDialogs.tsx +1 -0
  185. package/src/core/field_configs.tsx +7 -8
  186. package/src/core/index.tsx +3 -4
  187. package/src/form/PropertyFieldBinding.tsx +56 -22
  188. package/src/form/components/CustomIdField.tsx +4 -2
  189. package/src/form/components/FieldHelperText.tsx +4 -4
  190. package/src/form/components/FormikArrayContainer.tsx +4 -1
  191. package/src/form/components/LabelWithIcon.tsx +27 -19
  192. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  193. package/src/form/components/StorageItemPreview.tsx +21 -11
  194. package/src/form/components/StorageUploadProgress.tsx +3 -4
  195. package/src/form/components/index.tsx +1 -0
  196. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +29 -17
  197. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +29 -25
  198. package/src/form/field_bindings/BlockFieldBinding.tsx +30 -27
  199. package/src/form/field_bindings/DateTimeFieldBinding.tsx +17 -14
  200. package/src/form/field_bindings/KeyValueFieldBinding.tsx +50 -44
  201. package/src/form/field_bindings/MapFieldBinding.tsx +20 -19
  202. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
  203. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  204. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  205. package/src/form/field_bindings/ReferenceFieldBinding.tsx +41 -30
  206. package/src/form/field_bindings/RepeatFieldBinding.tsx +32 -19
  207. package/src/form/field_bindings/SelectFieldBinding.tsx +20 -13
  208. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +36 -46
  209. package/src/form/field_bindings/SwitchFieldBinding.tsx +9 -5
  210. package/src/form/field_bindings/TextFieldBinding.tsx +26 -23
  211. package/src/form/index.tsx +4 -9
  212. package/src/form/useClearRestoreValue.tsx +2 -2
  213. package/src/form/validation.ts +1 -17
  214. package/src/hooks/data/delete.ts +2 -1
  215. package/src/hooks/data/save.ts +9 -4
  216. package/src/hooks/data/useDataSource.tsx +11 -3
  217. package/src/hooks/index.tsx +1 -0
  218. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  219. package/src/hooks/useBuildModeController.tsx +11 -5
  220. package/src/hooks/useBuildNavigationController.tsx +91 -31
  221. package/src/hooks/useProjectLog.tsx +32 -10
  222. package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
  223. package/src/hooks/useValidateAuthenticator.tsx +21 -41
  224. package/src/index.ts +1 -0
  225. package/src/internal/useBuildDataSource.ts +72 -82
  226. package/src/internal/useBuildSideDialogsController.tsx +1 -0
  227. package/src/internal/useBuildSideEntityController.tsx +102 -22
  228. package/src/internal/useUnsavedChangesDialog.tsx +3 -1
  229. package/src/preview/PropertyPreview.tsx +11 -18
  230. package/src/preview/PropertyPreviewProps.tsx +7 -1
  231. package/src/preview/components/BooleanPreview.tsx +2 -2
  232. package/src/preview/components/EnumValuesChip.tsx +2 -2
  233. package/src/preview/components/ImagePreview.tsx +25 -35
  234. package/src/preview/components/ReferencePreview.tsx +23 -34
  235. package/src/preview/components/StorageThumbnail.tsx +5 -1
  236. package/src/preview/components/UrlComponentPreview.tsx +44 -11
  237. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  238. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  239. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  240. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  241. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  242. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  243. package/src/preview/property_previews/MapPropertyPreview.tsx +6 -6
  244. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +2 -2
  245. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  246. package/src/preview/util.ts +2 -2
  247. package/src/types/auth.tsx +3 -3
  248. package/src/types/collections.ts +48 -7
  249. package/src/types/customization_controller.tsx +0 -1
  250. package/src/types/datasource.ts +65 -43
  251. package/src/types/entities.ts +11 -1
  252. package/src/types/entity_actions.tsx +16 -3
  253. package/src/types/entity_overrides.tsx +2 -2
  254. package/src/types/fields.tsx +51 -45
  255. package/src/types/firecms.tsx +5 -0
  256. package/src/types/index.ts +0 -1
  257. package/src/types/navigation.ts +7 -7
  258. package/src/types/plugins.tsx +16 -6
  259. package/src/types/properties.ts +39 -22
  260. package/src/types/property_config.tsx +0 -2
  261. package/src/types/side_dialogs_controller.tsx +13 -0
  262. package/src/types/storage.ts +94 -3
  263. package/src/util/entities.ts +6 -5
  264. package/src/util/enums.ts +1 -1
  265. package/src/util/icon_list.ts +15 -10
  266. package/src/util/icon_synonyms.ts +3 -99
  267. package/src/util/icons.tsx +8 -2
  268. package/src/util/index.ts +1 -0
  269. package/src/util/make_properties_editable.ts +13 -5
  270. package/src/util/navigation_utils.ts +6 -6
  271. package/src/util/objects.ts +25 -28
  272. package/src/util/permissions.ts +1 -0
  273. package/src/util/plurals.ts +0 -2
  274. package/src/util/property_utils.tsx +2 -2
  275. package/src/util/references.ts +3 -0
  276. package/src/util/resolutions.ts +79 -46
  277. package/src/util/storage.ts +79 -21
  278. package/src/util/strings.ts +2 -2
  279. package/src/util/useStorageUploadController.tsx +33 -7
  280. package/src/util/useTraceUpdate.tsx +1 -0
  281. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  282. package/dist/components/VirtualTable/common.d.ts +0 -2
  283. package/dist/core/Drawer.d.ts +0 -23
  284. package/dist/core/Scaffold.d.ts +0 -55
  285. package/dist/core/SideEntityView.d.ts +0 -7
  286. package/dist/form/EntityForm.d.ts +0 -77
  287. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  288. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  289. package/dist/internal/useLocaleConfig.d.ts +0 -1
  290. package/dist/types/appcheck.d.ts +0 -26
  291. package/src/components/FireCMSAppBar.tsx +0 -165
  292. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  293. package/src/core/Drawer.tsx +0 -191
  294. package/src/core/Scaffold.tsx +0 -281
  295. package/src/core/SideEntityView.tsx +0 -38
  296. package/src/form/EntityForm.tsx +0 -728
  297. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  298. package/src/internal/useBuildCustomizationController.tsx +0 -5
  299. package/src/internal/useLocaleConfig.tsx +0 -18
  300. package/src/types/appcheck.ts +0 -29
@@ -2,13 +2,13 @@ import React, { useEffect, useState } from "react";
2
2
  import { DataType, FieldProps, GeoPoint } from "../../types";
3
3
 
4
4
  import { ArrayContainer } from "../../components";
5
- import { FieldHelperText, LabelWithIcon } from "../components";
5
+ import { FieldHelperText, LabelWithIconAndTooltip } from "../components";
6
6
  import {
7
7
  AddIcon,
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,
@@ -40,7 +41,7 @@ export function KeyValueFieldBinding({
40
41
  disabled,
41
42
  property,
42
43
  setValue,
43
- tableMode,
44
+ minimalistView,
44
45
  includeDescription,
45
46
  underlyingValueHasChanged,
46
47
  autoFocus,
@@ -52,12 +53,17 @@ 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
- const title = <LabelWithIcon
65
+ const title = <LabelWithIconAndTooltip
66
+ propertyKey={propertyKey}
61
67
  icon={getIconForProperty(property, "small")}
62
68
  required={property.validation?.required}
63
69
  title={property.name}
@@ -66,11 +72,11 @@ export function KeyValueFieldBinding({
66
72
  return (
67
73
  <>
68
74
 
69
- {!tableMode && <ExpandablePanel initiallyExpanded={expanded}
70
- title={title}
71
- className={"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2"}>{mapFormView}</ExpandablePanel>}
75
+ {!minimalistView && <ExpandablePanel initiallyExpanded={expanded}
76
+ title={title}
77
+ innerClassName={"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2"}>{mapFormView}</ExpandablePanel>}
72
78
 
73
- {tableMode && mapFormView}
79
+ {minimalistView && mapFormView}
74
80
 
75
81
  <FieldHelperText includeDescription={includeDescription}
76
82
  showError={showError}
@@ -84,6 +90,7 @@ export function KeyValueFieldBinding({
84
90
 
85
91
  interface MapEditViewParams<T extends Record<string, any>> {
86
92
  value?: T;
93
+ initialValue?: T;
87
94
  setValue: (value: (T | null)) => void;
88
95
  fieldName?: string,
89
96
  disabled?: boolean
@@ -91,14 +98,15 @@ interface MapEditViewParams<T extends Record<string, any>> {
91
98
 
92
99
  function MapEditView<T extends Record<string, any>>({
93
100
  value,
101
+ initialValue,
94
102
  setValue,
95
103
  fieldName,
96
104
  disabled
97
105
  }: MapEditViewParams<T>) {
98
106
  const [internalState, setInternalState] = React.useState<MapEditViewRowState[]>(
99
- Object.keys(value ?? {}).map((key) => [getRandomId(), {
107
+ Object.keys(initialValue ?? {}).map((key) => [getRandomId(), {
100
108
  key,
101
- dataType: getDataType(value?.[key]) ?? "string"
109
+ dataType: getDataType(initialValue?.[key]) ?? "string"
102
110
  }])
103
111
  );
104
112
 
@@ -121,8 +129,6 @@ function MapEditView<T extends Record<string, any>>({
121
129
  setInternalState(newRowIds);
122
130
  }, [value]);
123
131
 
124
- const originalValue = React.useRef<T>(value ?? {} as T);
125
-
126
132
  const updateDataType = (rowId: number, dataType: DataType) => {
127
133
  if (!rowId) {
128
134
  console.warn("No key selected for data type update");
@@ -168,7 +174,7 @@ function MapEditView<T extends Record<string, any>>({
168
174
  }
169
175
 
170
176
  const newValue = { ...(value ?? {}) } as T;
171
- if (typeof originalValue.current === "object" && fieldKey in originalValue.current) {
177
+ if (typeof initialValue === "object" && fieldKey in initialValue) {
172
178
  // @ts-ignore
173
179
  newValue[fieldKey] = undefined; // set to undefined to remove from the object, the datasource will remove it from the backend
174
180
  } else {
@@ -186,7 +192,7 @@ function MapEditView<T extends Record<string, any>>({
186
192
  value={value ?? {} as T}
187
193
  onDeleteClick={() => {
188
194
  const newValue = { ...(value ?? {}) as T };
189
- if (originalValue.current && fieldKey in originalValue.current) {
195
+ if (initialValue && fieldKey in initialValue) {
190
196
  // @ts-ignore
191
197
  newValue[fieldKey] = undefined;
192
198
  } else {
@@ -316,7 +322,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
316
322
  }}/>;
317
323
  } else if (dataType === "array") {
318
324
  return <div
319
- className={cn(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
325
+ className={cls(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
320
326
  <ArrayContainer value={entryValue}
321
327
  newDefaultEntry={""}
322
328
  droppableId={rowId.toString()}
@@ -349,7 +355,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
349
355
  </div>;
350
356
  } else if (dataType === "map") {
351
357
  return <div
352
- className={cn(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
358
+ className={cls(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
353
359
  <MapEditView value={entryValue}
354
360
  fieldName={fieldKey}
355
361
  setValue={(updatedValue) => {
@@ -375,7 +381,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
375
381
  <Typography key={rowId.toString()}
376
382
  component={"div"}
377
383
  className="font-mono flex flex-row gap-1">
378
- <div className="w-[200px] max-w-[25%]">
384
+ <div className="w-[300px] max-w-[30%]">
379
385
  <TextField
380
386
  value={fieldKey}
381
387
  placeholder={"key"}
@@ -389,32 +395,32 @@ function MapKeyValueRow<T extends Record<string, any>>({
389
395
  <div className="flex-grow">
390
396
  {(dataType !== "map" && dataType !== "array") && buildInput(entryValue, fieldKey, dataType)}
391
397
  </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>
398
+ <div className={"flex flex-col"}>
399
+ <Menu
400
+ trigger={<IconButton size={"smallest"}>
401
+ <ArrowDropDownIcon size={"small"}/>
402
+ </IconButton>}
403
+ >
404
+ <MenuItem dense
405
+ onClick={() => doUpdateDataType("string")}>string</MenuItem>
406
+ <MenuItem dense
407
+ onClick={() => doUpdateDataType("number")}>number</MenuItem>
408
+ <MenuItem dense
409
+ onClick={() => doUpdateDataType("boolean")}>boolean</MenuItem>
410
+ <MenuItem dense
411
+ onClick={() => doUpdateDataType("date")}>date</MenuItem>
412
+ <MenuItem dense
413
+ onClick={() => doUpdateDataType("map")}>map</MenuItem>
414
+ <MenuItem dense
415
+ onClick={() => doUpdateDataType("array")}>array</MenuItem>
416
+ </Menu>
417
+
418
+ <IconButton aria-label="delete"
419
+ size={"smallest"}
420
+ onClick={onDeleteClick}>
421
+ <RemoveIcon size={"smallest"}/>
422
+ </IconButton>
423
+ </div>
418
424
  </Typography>
419
425
 
420
426
  {(dataType === "map" || dataType === "array") && buildInput(entryValue, fieldKey, dataType)}
@@ -482,7 +488,7 @@ function ArrayKeyValueRow<T>({
482
488
  Arrays of arrays are not supported.
483
489
  </Typography>;
484
490
  } else if (dataType === "map") {
485
- return <div className={cn(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
491
+ return <div className={cls(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
486
492
  <MapEditView value={entryValue}
487
493
  setValue={(updatedValue) => {
488
494
  setValue(updatedValue);
@@ -2,8 +2,8 @@ import React from "react";
2
2
  import { FieldProps, Properties, ResolvedProperties } from "../../types";
3
3
 
4
4
  import { ErrorBoundary } from "../../components";
5
- import { getIconForProperty, isHidden, pick } from "../../util";
6
- import { FieldHelperText, LabelWithIcon } from "../components";
5
+ import { getIconForProperty, isHidden, isReadOnly, pick } from "../../util";
6
+ import { FieldHelperText, LabelWithIconAndTooltip } from "../components";
7
7
  import { PropertyFieldBinding } from "../PropertyFieldBinding";
8
8
  import { ExpandablePanel, InputLabel, Select, SelectItem } from "@firecms/ui";
9
9
 
@@ -21,9 +21,7 @@ export function MapFieldBinding({
21
21
  error,
22
22
  disabled,
23
23
  property,
24
- setValue,
25
- partOfBlock,
26
- tableMode,
24
+ minimalistView,
27
25
  includeDescription,
28
26
  underlyingValueHasChanged,
29
27
  autoFocus,
@@ -56,23 +54,24 @@ export function MapFieldBinding({
56
54
  {Object.entries(mapProperties)
57
55
  .filter(([_, property]) => !isHidden(property))
58
56
  .map(([entryKey, childProperty], index) => {
59
- const fieldProps = {
57
+ const thisDisabled = isReadOnly(childProperty) || Boolean(childProperty.disabled);
58
+ const fieldBindingProps = {
60
59
  propertyKey: `${propertyKey}.${entryKey}`,
61
- disabled,
60
+ disabled: disabled || thisDisabled,
62
61
  property: childProperty,
63
62
  includeDescription,
64
63
  underlyingValueHasChanged,
65
64
  context,
66
- tableMode: false,
67
65
  partOfArray: false,
68
- partOfBlock: false,
66
+ minimalistView: false,
69
67
  autoFocus: autoFocus && index === 0
70
68
  };
69
+
71
70
  return (
72
71
  <div key={`map-${propertyKey}-${index}`}>
73
72
  <ErrorBoundary>
74
73
  <PropertyFieldBinding
75
- {...fieldProps}/>
74
+ {...fieldBindingProps}/>
76
75
  </ErrorBoundary>
77
76
  </div>
78
77
  );
@@ -85,23 +84,25 @@ export function MapFieldBinding({
85
84
  </>;
86
85
 
87
86
  const title = (
88
- <LabelWithIcon icon={getIconForProperty(property, "small")}
89
- required={property.validation?.required}
90
- title={property.name}
91
- className={"text-text-secondary dark:text-text-secondary-dark"}/>
87
+ <LabelWithIconAndTooltip
88
+ propertyKey={propertyKey}
89
+ icon={getIconForProperty(property, "small")}
90
+ required={property.validation?.required}
91
+ title={property.name}
92
+ className={"text-text-secondary dark:text-text-secondary-dark"}/>
92
93
  );
93
94
 
94
95
  return (
95
96
  <ErrorBoundary>
96
97
 
97
- {!tableMode && !partOfBlock && <ExpandablePanel initiallyExpanded={expanded}
98
- className={"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2 bg-slate-50 bg-opacity-50 dark:bg-gray-900"}
99
- title={title}>{mapFormView}</ExpandablePanel>}
98
+ {!minimalistView && !minimalistView && <ExpandablePanel initiallyExpanded={expanded}
99
+ innerClassName={"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2 bg-white dark:bg-gray-900"}
100
+ title={title}>{mapFormView}</ExpandablePanel>}
100
101
 
101
- {(tableMode || partOfBlock) && mapFormView}
102
+ {(minimalistView || minimalistView) && mapFormView}
102
103
 
103
104
  <FieldHelperText includeDescription={includeDescription}
104
- showError={showError}
105
+ showError={showError ?? false}
105
106
  error={error ? (typeof error === "string" ? error : "A property of this map has an error") : undefined}
106
107
  disabled={disabled}
107
108
  property={property}/>
@@ -0,0 +1,150 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from "react";
2
+ import {
3
+ FieldHelperText,
4
+ FieldProps,
5
+ getIconForProperty,
6
+ LabelWithIconAndTooltip, PropertyOrBuilder,
7
+ randomString,
8
+ ResolvedArrayProperty,
9
+ ResolvedStringProperty,
10
+ useStorageSource
11
+ } from "../../index";
12
+ import { cls, fieldBackgroundHoverMixin, fieldBackgroundMixin } from "@firecms/ui";
13
+ import { FireCMSEditor, FireCMSEditorProps } from "@firecms/editor";
14
+ import { resolveProperty, resolveStorageFilenameString, resolveStoragePathString } from "../../util";
15
+
16
+ interface MarkdownEditorFieldProps {
17
+ highlight?: { from: number, to: number };
18
+ editorProps?: Partial<FireCMSEditorProps>
19
+ }
20
+
21
+ export function MarkdownEditorFieldBinding({
22
+ property,
23
+ propertyKey,
24
+ value,
25
+ setValue,
26
+ includeDescription,
27
+ showError,
28
+ error,
29
+ minimalistView,
30
+ isSubmitting,
31
+ context,
32
+ customProps,
33
+ }: FieldProps<string, MarkdownEditorFieldProps>) {
34
+
35
+ const highlight = customProps?.highlight;
36
+ const editorProps = customProps?.editorProps;
37
+ const storageSource = useStorageSource();
38
+ const storage = property.storage;
39
+
40
+ const entityValues = context.values;
41
+ const entityId = context.entityId;
42
+ const path = context.path;
43
+
44
+ // const fieldVersion = useRef(0);
45
+ const [fieldVersion, setFieldVersion] = useState(0);
46
+ const internalValue = useRef(value);
47
+
48
+ const onContentChange = useCallback((content: string) => {
49
+ internalValue.current = content;
50
+ setValue(content);
51
+ }, [setValue]);
52
+
53
+ useEffect(() => {
54
+ if (internalValue.current !== value) {
55
+ internalValue.current = value;
56
+ setFieldVersion(fieldVersion + 1);
57
+ // fieldVersion.current = fieldVersion.current + 1;
58
+ }
59
+ }, [value]);
60
+
61
+
62
+ const resolvedProperty = resolveProperty({
63
+ propertyOrBuilder: property as PropertyOrBuilder,
64
+ values: entityValues
65
+ }) as ResolvedStringProperty | ResolvedArrayProperty<string[]>;
66
+
67
+ const fileNameBuilder = useCallback(async (file: File) => {
68
+ if (storage?.fileName) {
69
+ const fileName = await resolveStorageFilenameString({
70
+ input: storage.fileName,
71
+ storage,
72
+ values: entityValues,
73
+ entityId,
74
+ path,
75
+ property: resolvedProperty,
76
+ file,
77
+ propertyKey
78
+ });
79
+ if (!fileName || fileName.length === 0) {
80
+ throw Error("You need to return a valid filename");
81
+ }
82
+ return fileName;
83
+ }
84
+ return randomString() + "_" + file.name;
85
+ }, [entityId, entityValues, path, resolvedProperty, propertyKey, storage]);
86
+
87
+ const storagePathBuilder = useCallback((file: File) => {
88
+ if (!storage) return "/";
89
+ const resolvedProperty = resolveProperty({
90
+ propertyOrBuilder: property,
91
+ values: entityValues
92
+ }) as ResolvedStringProperty | ResolvedArrayProperty<string[]>;
93
+ return resolveStoragePathString({
94
+ input: storage.storagePath,
95
+ storage,
96
+ values: entityValues,
97
+ entityId,
98
+ path,
99
+ property: resolvedProperty,
100
+ file,
101
+ propertyKey
102
+ }) ?? "/";
103
+ }, [entityId, entityValues, path, property, propertyKey, storage]);
104
+
105
+ const editor = <FireCMSEditor
106
+ content={value}
107
+ onMarkdownContentChange={onContentChange}
108
+ version={context.formex.version + fieldVersion}
109
+ highlight={highlight}
110
+ handleImageUpload={async (file: File) => {
111
+ const storagePath = storagePathBuilder(file);
112
+ const fileName = await fileNameBuilder(file);
113
+ const result = await storageSource.uploadFile({
114
+ file,
115
+ fileName,
116
+ path: storagePath,
117
+ });
118
+ const downloadConfig = await storageSource.getDownloadURL(result.path);
119
+ const url = downloadConfig.url;
120
+ if (!url) {
121
+ throw new Error("Error uploading image");
122
+ }
123
+ return url;
124
+ }}
125
+ {...editorProps}
126
+ />;
127
+
128
+ if (minimalistView)
129
+ return editor;
130
+
131
+ return (
132
+ <>
133
+ <LabelWithIconAndTooltip
134
+ propertyKey={propertyKey}
135
+ icon={getIconForProperty(property, "small")}
136
+ required={property.validation?.required}
137
+ title={property.name}
138
+ className={"text-text-secondary dark:text-text-secondary-dark ml-3.5"}/>
139
+ <div className={cls("rounded-md", fieldBackgroundMixin, fieldBackgroundHoverMixin)}>
140
+ {editor}
141
+ </div>
142
+ <FieldHelperText includeDescription={includeDescription}
143
+ showError={showError}
144
+ error={error}
145
+ property={property}/>
146
+ </>
147
+
148
+ );
149
+
150
+ }
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback } from "react";
2
2
 
3
3
  import { EnumType, FieldProps, ResolvedProperty } from "../../types";
4
- import { FieldHelperText, LabelWithIcon } from "../components";
4
+ import { FieldHelperText, LabelWithIconAndTooltip } from "../components";
5
5
  import { EnumValuesChip } from "../../preview";
6
6
  import { enumToObjectEntries, getIconForProperty, getLabelOrConfigFrom } from "../../util";
7
7
  import { CloseIcon, MultiSelect, MultiSelectItem } from "@firecms/ui";
@@ -14,17 +14,18 @@ import { useClearRestoreValue } from "../useClearRestoreValue";
14
14
  * and tables to the specified properties.
15
15
  * @group Form fields
16
16
  */
17
- export function MultiSelectBinding({
18
- propertyKey,
19
- value,
20
- setValue,
21
- error,
22
- showError,
23
- disabled,
24
- property,
25
- includeDescription,
26
- autoFocus
27
- }: FieldProps<EnumType[], any, any>) {
17
+ export function MultiSelectFieldBinding({
18
+ propertyKey,
19
+ value,
20
+ setValue,
21
+ error,
22
+ showError,
23
+ disabled,
24
+ property,
25
+ includeDescription,
26
+ size = "medium",
27
+ autoFocus
28
+ }: FieldProps<EnumType[], any, any>) {
28
29
 
29
30
  const of: ResolvedProperty<any> | ResolvedProperty<any>[] = property.of;
30
31
  if (!of) {
@@ -79,16 +80,20 @@ export function MultiSelectBinding({
79
80
  }, [enumValues, setValue, value]);
80
81
 
81
82
  return (
82
- <div className="mt-0.5 ml-0.5 mt-2">
83
+ <>
83
84
  <MultiSelect
85
+ className={"w-full mt-2"}
86
+ size={size === "medium" ? "medium" : "small"}
84
87
  value={validValue ? value.map((v) => v.toString()) : []}
85
88
  disabled={disabled}
86
- label={<LabelWithIcon icon={getIconForProperty(property, "small")}
87
- required={property.validation?.required}
88
- title={property.name}
89
- className={"text-text-secondary dark:text-text-secondary-dark ml-3.5"}/>}
90
- renderValue={useCallback((v: string) => renderValue(v, false), [renderValue])}
91
- onMultiValueChange={(updatedValue: string[]) => {
89
+ modalPopover={true}
90
+ label={<LabelWithIconAndTooltip
91
+ propertyKey={propertyKey}
92
+ icon={getIconForProperty(property, "small")}
93
+ required={property.validation?.required}
94
+ title={property.name}
95
+ className={"text-text-secondary dark:text-text-secondary-dark ml-3.5"}/>}
96
+ onValueChange={(updatedValue: string[]) => {
92
97
  let newValue: EnumType[] | null;
93
98
  if (of && (of as ResolvedProperty)?.dataType === "number") {
94
99
  newValue = updatedValue ? (updatedValue as string[]).map((e) => parseFloat(e)) : [];
@@ -109,6 +114,6 @@ export function MultiSelectBinding({
109
114
  disabled={disabled}
110
115
  property={property}/>
111
116
 
112
- </div>
117
+ </>
113
118
  );
114
119
  }
@@ -1,12 +1,12 @@
1
1
  import React from "react";
2
2
 
3
- import { Entity, FieldProps } from "../../types";
3
+ import { FieldProps } from "../../types";
4
4
 
5
5
  import { PropertyPreview } from "../../preview";
6
- import { FieldHelperText, LabelWithIcon } from "../components";
6
+ import { FieldHelperText, LabelWithIconAndTooltip } 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
  *
@@ -21,7 +21,7 @@ export function ReadOnlyFieldBinding({
21
21
  value,
22
22
  error,
23
23
  showError,
24
- tableMode,
24
+ minimalistView,
25
25
  property,
26
26
  includeDescription,
27
27
  context
@@ -30,30 +30,25 @@ 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
  <>
42
36
 
43
- {!tableMode && <LabelWithIcon icon={getIconForProperty(property, "small")}
44
- required={property.validation?.required}
45
- title={property.name}
46
- className={"text-text-secondary dark:text-text-secondary-dark ml-3.5"}/>
37
+ {!minimalistView && <LabelWithIconAndTooltip
38
+ propertyKey={propertyKey}
39
+ icon={getIconForProperty(property, "small")}
40
+ required={property.validation?.required}
41
+ title={property.name}
42
+ className={"text-text-secondary dark:text-text-secondary-dark ml-3.5"}/>
47
43
  }
48
44
 
49
45
  <div
50
- className={cn(paperMixin, "min-h-14 p-4 md:p-6 overflow-x-scroll no-scrollbar")}>
46
+ className={cls(paperMixin, "min-h-14 p-4 md:p-6 overflow-x-scroll no-scrollbar")}>
51
47
 
52
48
  <ErrorBoundary>
53
49
  <PropertyPreview propertyKey={propertyKey}
54
50
  value={value}
55
51
  property={property}
56
- // entity={entity}
57
52
  size={"medium"}/>
58
53
  </ErrorBoundary>
59
54