@firecms/core 3.0.0-canary.28 → 3.0.0-canary.281

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 (424) 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 +34 -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 +31 -12
  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 +14 -13
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
  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/index.d.ts +1 -1
  18. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  19. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  20. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
  21. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +20 -2
  22. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  23. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  24. package/dist/components/EntityJsonPreview.d.ts +3 -0
  25. package/dist/components/EntityPreview.d.ts +10 -7
  26. package/dist/components/ErrorView.d.ts +1 -1
  27. package/dist/components/HomePage/DefaultHomePage.d.ts +2 -15
  28. package/dist/components/HomePage/HomePageDnD.d.ts +76 -0
  29. package/dist/components/HomePage/NavigationCard.d.ts +3 -1
  30. package/dist/components/HomePage/NavigationCardBinding.d.ts +4 -3
  31. package/dist/components/HomePage/NavigationGroup.d.ts +8 -1
  32. package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
  33. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  34. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  35. package/dist/components/ReferenceWidget.d.ts +3 -1
  36. package/dist/components/SelectableTable/SelectableTable.d.ts +14 -4
  37. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  38. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  39. package/dist/components/UserDisplay.d.ts +7 -0
  40. package/dist/components/VirtualTable/VirtualTableProps.d.ts +24 -12
  41. package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
  42. package/dist/components/VirtualTable/types.d.ts +3 -3
  43. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  44. package/dist/components/common/index.d.ts +2 -1
  45. package/dist/components/common/table_height.d.ts +5 -0
  46. package/dist/components/common/types.d.ts +4 -6
  47. package/dist/components/common/useColumnsIds.d.ts +3 -1
  48. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  49. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  50. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  51. package/dist/components/index.d.ts +5 -2
  52. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  53. package/dist/contexts/InternalUserManagementContext.d.ts +3 -0
  54. package/dist/core/DefaultAppBar.d.ts +29 -0
  55. package/dist/core/DefaultDrawer.d.ts +19 -0
  56. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  57. package/dist/core/EntityEditView.d.ts +43 -11
  58. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  59. package/dist/core/FireCMS.d.ts +2 -3
  60. package/dist/core/FireCMSRouter.d.ts +4 -0
  61. package/dist/core/NavigationRoutes.d.ts +2 -3
  62. package/dist/core/SideDialogs.d.ts +4 -2
  63. package/dist/core/field_configs.d.ts +1 -1
  64. package/dist/core/index.d.ts +4 -4
  65. package/dist/form/EntityForm.d.ts +37 -64
  66. package/dist/form/EntityFormActions.d.ts +21 -0
  67. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  68. package/dist/form/components/ErrorFocus.d.ts +1 -1
  69. package/dist/form/components/FieldHelperText.d.ts +3 -3
  70. package/dist/form/components/FormEntry.d.ts +6 -0
  71. package/dist/form/components/FormLayout.d.ts +5 -0
  72. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  73. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  74. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  75. package/dist/form/components/index.d.ts +3 -1
  76. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  77. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  80. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  81. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  82. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  83. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  84. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  85. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  86. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  87. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  88. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +5 -13
  89. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  90. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  91. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +12 -0
  92. package/dist/form/index.d.ts +17 -18
  93. package/dist/form/useClearRestoreValue.d.ts +2 -2
  94. package/dist/hooks/data/delete.d.ts +4 -4
  95. package/dist/hooks/data/save.d.ts +4 -5
  96. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  97. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  98. package/dist/hooks/index.d.ts +3 -0
  99. package/dist/hooks/useAuthController.d.ts +1 -1
  100. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  101. package/dist/hooks/useBuildNavigationController.d.ts +57 -13
  102. package/dist/hooks/useCollapsedGroups.d.ts +9 -0
  103. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  104. package/dist/hooks/useInternalUserManagementController.d.ts +12 -0
  105. package/dist/hooks/useModeController.d.ts +1 -2
  106. package/dist/hooks/useProjectLog.d.ts +8 -2
  107. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  108. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  109. package/dist/index.d.ts +1 -0
  110. package/dist/index.es.js +23563 -13933
  111. package/dist/index.es.js.map +1 -1
  112. package/dist/index.umd.js +26305 -588
  113. package/dist/index.umd.js.map +1 -1
  114. package/dist/internal/useBuildDataSource.d.ts +3 -17
  115. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  116. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  117. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  118. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  119. package/dist/preview/components/ReferencePreview.d.ts +4 -3
  120. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  121. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  122. package/dist/preview/components/UserPreview.d.ts +8 -0
  123. package/dist/preview/index.d.ts +1 -0
  124. package/dist/preview/util.d.ts +3 -3
  125. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  126. package/dist/routes/FireCMSRoute.d.ts +1 -0
  127. package/dist/routes/HomePageRoute.d.ts +3 -0
  128. package/dist/types/analytics.d.ts +1 -1
  129. package/dist/types/auth.d.ts +8 -10
  130. package/dist/types/collections.d.ts +112 -25
  131. package/dist/types/customization_controller.d.ts +8 -0
  132. package/dist/types/datasource.d.ts +52 -36
  133. package/dist/types/dialogs_controller.d.ts +7 -3
  134. package/dist/types/entities.d.ts +12 -3
  135. package/dist/types/entity_actions.d.ts +72 -8
  136. package/dist/types/entity_callbacks.d.ts +16 -16
  137. package/dist/types/entity_overrides.d.ts +2 -2
  138. package/dist/types/export_import.d.ts +4 -4
  139. package/dist/types/fields.d.ts +74 -42
  140. package/dist/types/firecms.d.ts +31 -3
  141. package/dist/types/firecms_context.d.ts +17 -1
  142. package/dist/types/index.d.ts +1 -1
  143. package/dist/types/internal_user_management.d.ts +20 -0
  144. package/dist/types/navigation.d.ts +62 -19
  145. package/dist/types/permissions.d.ts +4 -4
  146. package/dist/types/plugins.d.ts +58 -13
  147. package/dist/types/properties.d.ts +90 -25
  148. package/dist/types/property_config.d.ts +1 -3
  149. package/dist/types/roles.d.ts +3 -0
  150. package/dist/types/side_dialogs_controller.d.ts +10 -0
  151. package/dist/types/side_entity_controller.d.ts +14 -1
  152. package/dist/types/storage.d.ts +75 -0
  153. package/dist/types/user.d.ts +2 -1
  154. package/dist/util/builders.d.ts +3 -3
  155. package/dist/util/callbacks.d.ts +2 -0
  156. package/dist/util/createFormexStub.d.ts +2 -0
  157. package/dist/util/entities.d.ts +3 -3
  158. package/dist/util/entity_actions.d.ts +2 -0
  159. package/dist/util/entity_cache.d.ts +23 -0
  160. package/dist/util/icon_list.d.ts +5 -1
  161. package/dist/util/icon_synonyms.d.ts +1 -98
  162. package/dist/util/icons.d.ts +7 -4
  163. package/dist/util/index.d.ts +3 -0
  164. package/dist/util/navigation_from_path.d.ts +10 -1
  165. package/dist/util/navigation_utils.d.ts +15 -3
  166. package/dist/util/objects.d.ts +2 -1
  167. package/dist/util/permissions.d.ts +4 -4
  168. package/dist/util/plurals.d.ts +0 -2
  169. package/dist/util/property_utils.d.ts +4 -4
  170. package/dist/util/references.d.ts +2 -2
  171. package/dist/util/resolutions.d.ts +42 -17
  172. package/dist/util/storage.d.ts +23 -2
  173. package/dist/util/useStorageUploadController.d.ts +3 -3
  174. package/package.json +69 -52
  175. package/src/app/AppBar.tsx +18 -0
  176. package/src/app/Drawer.tsx +24 -0
  177. package/src/app/Scaffold.tsx +253 -0
  178. package/src/app/index.ts +4 -0
  179. package/src/app/useApp.tsx +32 -0
  180. package/src/components/ArrayContainer.tsx +447 -229
  181. package/src/components/CircularProgressCenter.tsx +2 -2
  182. package/src/components/ClearFilterSortButton.tsx +41 -0
  183. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
  184. package/src/components/DeleteEntityDialog.tsx +13 -20
  185. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +65 -40
  186. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  187. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  188. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +84 -42
  189. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  190. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  191. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  192. package/src/components/EntityCollectionTable/index.tsx +1 -1
  193. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +34 -39
  194. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +49 -36
  195. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  196. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +135 -105
  197. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
  198. package/src/components/EntityCollectionView/EntityCollectionView.tsx +235 -118
  199. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
  200. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  201. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  202. package/src/components/EntityCollectionView/utils.ts +19 -0
  203. package/src/components/EntityJsonPreview.tsx +66 -0
  204. package/src/components/EntityPreview.tsx +83 -62
  205. package/src/components/EntityView.tsx +13 -10
  206. package/src/components/ErrorView.tsx +4 -4
  207. package/src/components/FireCMSLogo.tsx +7 -51
  208. package/src/components/HomePage/DefaultHomePage.tsx +511 -157
  209. package/src/components/HomePage/FavouritesView.tsx +9 -14
  210. package/src/components/HomePage/HomePageDnD.tsx +600 -0
  211. package/src/components/HomePage/NavigationCard.tsx +48 -39
  212. package/src/components/HomePage/NavigationCardBinding.tsx +17 -16
  213. package/src/components/HomePage/NavigationGroup.tsx +144 -30
  214. package/src/components/HomePage/RenameGroupDialog.tsx +123 -0
  215. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  216. package/src/components/NotFoundPage.tsx +2 -2
  217. package/src/components/PropertyConfigBadge.tsx +9 -3
  218. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  219. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +23 -13
  220. package/src/components/ReferenceWidget.tsx +21 -11
  221. package/src/components/SearchIconsView.tsx +10 -7
  222. package/src/components/SelectableTable/SelectableTable.tsx +157 -145
  223. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  224. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  225. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  226. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +93 -24
  227. package/src/components/UnsavedChangesDialog.tsx +46 -0
  228. package/src/components/UserDisplay.tsx +54 -0
  229. package/src/components/VirtualTable/VirtualTable.tsx +105 -51
  230. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  231. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  232. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  233. package/src/components/VirtualTable/VirtualTableProps.tsx +28 -14
  234. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  235. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  236. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
  237. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  238. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  239. package/src/components/VirtualTable/fields/VirtualTableUserSelect.tsx +99 -0
  240. package/src/components/VirtualTable/types.tsx +2 -3
  241. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +64 -44
  242. package/src/components/common/index.ts +2 -1
  243. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  244. package/src/components/common/types.tsx +4 -6
  245. package/src/components/common/useColumnsIds.tsx +16 -2
  246. package/src/components/common/useDataSourceTableController.tsx +420 -0
  247. package/src/components/common/useDebouncedCallback.tsx +20 -0
  248. package/src/components/common/useScrollRestoration.tsx +68 -0
  249. package/src/components/common/useTableSearchHelper.ts +53 -12
  250. package/src/components/index.tsx +6 -2
  251. package/src/contexts/BreacrumbsContext.tsx +38 -0
  252. package/src/contexts/DialogsProvider.tsx +5 -4
  253. package/src/contexts/InternalUserManagementContext.tsx +4 -0
  254. package/src/contexts/ModeController.tsx +1 -3
  255. package/src/contexts/SnackbarProvider.tsx +2 -0
  256. package/src/core/DefaultAppBar.tsx +219 -0
  257. package/src/core/DefaultDrawer.tsx +185 -0
  258. package/src/core/DrawerNavigationItem.tsx +66 -0
  259. package/src/core/EntityEditView.tsx +435 -470
  260. package/src/core/EntityEditViewFormActions.tsx +329 -0
  261. package/src/core/EntitySidePanel.tsx +88 -21
  262. package/src/core/FireCMS.tsx +85 -60
  263. package/src/core/FireCMSRouter.tsx +17 -0
  264. package/src/core/NavigationRoutes.tsx +28 -38
  265. package/src/core/SideDialogs.tsx +22 -12
  266. package/src/core/field_configs.tsx +41 -14
  267. package/src/core/index.tsx +6 -5
  268. package/src/form/EntityForm.tsx +620 -534
  269. package/src/form/EntityFormActions.tsx +211 -0
  270. package/src/form/PropertyFieldBinding.tsx +88 -45
  271. package/src/form/components/CustomIdField.tsx +9 -3
  272. package/src/form/components/FieldHelperText.tsx +4 -4
  273. package/src/form/components/FormEntry.tsx +22 -0
  274. package/src/form/components/FormLayout.tsx +16 -0
  275. package/src/form/components/LabelWithIcon.tsx +30 -19
  276. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  277. package/src/form/components/StorageItemPreview.tsx +23 -13
  278. package/src/form/components/StorageUploadProgress.tsx +5 -6
  279. package/src/form/components/index.tsx +3 -1
  280. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +34 -19
  281. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +50 -36
  282. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  283. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  284. package/src/form/field_bindings/KeyValueFieldBinding.tsx +61 -52
  285. package/src/form/field_bindings/MapFieldBinding.tsx +73 -55
  286. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
  287. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
  288. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  289. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  290. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  291. package/src/form/field_bindings/RepeatFieldBinding.tsx +62 -35
  292. package/src/form/field_bindings/SelectFieldBinding.tsx +24 -15
  293. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +257 -199
  294. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  295. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  296. package/src/form/field_bindings/UserSelectFieldBinding.tsx +94 -0
  297. package/src/form/index.tsx +17 -37
  298. package/src/form/useClearRestoreValue.tsx +2 -2
  299. package/src/form/validation.ts +13 -23
  300. package/src/hooks/data/delete.ts +6 -5
  301. package/src/hooks/data/save.ts +26 -33
  302. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  303. package/src/hooks/data/useDataSource.tsx +11 -3
  304. package/src/hooks/data/useEntityFetch.tsx +10 -6
  305. package/src/hooks/index.tsx +4 -0
  306. package/src/hooks/useAuthController.tsx +1 -1
  307. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  308. package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
  309. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  310. package/src/hooks/useBuildModeController.tsx +22 -29
  311. package/src/hooks/useBuildNavigationController.tsx +440 -119
  312. package/src/hooks/useCollapsedGroups.ts +64 -0
  313. package/src/hooks/useFireCMSContext.tsx +9 -35
  314. package/src/hooks/useInternalUserManagementController.tsx +16 -0
  315. package/src/hooks/useLargeLayout.tsx +0 -35
  316. package/src/hooks/useModeController.tsx +1 -2
  317. package/src/hooks/useProjectLog.tsx +32 -10
  318. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  319. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  320. package/src/index.ts +1 -0
  321. package/src/internal/useBuildDataSource.ts +79 -85
  322. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  323. package/src/internal/useBuildSideEntityController.tsx +204 -77
  324. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  325. package/src/preview/PropertyPreview.tsx +42 -25
  326. package/src/preview/PropertyPreviewProps.tsx +7 -1
  327. package/src/preview/components/BooleanPreview.tsx +2 -2
  328. package/src/preview/components/EmptyValue.tsx +1 -1
  329. package/src/preview/components/EnumValuesChip.tsx +2 -2
  330. package/src/preview/components/ImagePreview.tsx +26 -37
  331. package/src/preview/components/ReferencePreview.tsx +26 -36
  332. package/src/preview/components/StorageThumbnail.tsx +5 -1
  333. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  334. package/src/preview/components/UserPreview.tsx +22 -0
  335. package/src/preview/index.ts +1 -0
  336. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -6
  337. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +7 -5
  338. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -4
  339. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -4
  340. package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -6
  341. package/src/preview/property_previews/ArrayPropertyPreview.tsx +7 -6
  342. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  343. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  344. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  345. package/src/preview/util.ts +10 -10
  346. package/src/routes/CustomCMSRoute.tsx +21 -0
  347. package/src/routes/FireCMSRoute.tsx +246 -0
  348. package/src/routes/HomePageRoute.tsx +17 -0
  349. package/src/types/analytics.ts +3 -0
  350. package/src/types/auth.tsx +9 -13
  351. package/src/types/collections.ts +134 -30
  352. package/src/types/customization_controller.tsx +9 -1
  353. package/src/types/datasource.ts +61 -43
  354. package/src/types/dialogs_controller.tsx +7 -3
  355. package/src/types/entities.ts +19 -3
  356. package/src/types/entity_actions.tsx +86 -10
  357. package/src/types/entity_callbacks.ts +18 -18
  358. package/src/types/entity_overrides.tsx +2 -2
  359. package/src/types/export_import.ts +4 -4
  360. package/src/types/fields.tsx +85 -46
  361. package/src/types/firecms.tsx +34 -4
  362. package/src/types/firecms_context.tsx +18 -1
  363. package/src/types/index.ts +1 -1
  364. package/src/types/internal_user_management.ts +24 -0
  365. package/src/types/navigation.ts +77 -24
  366. package/src/types/permissions.ts +5 -5
  367. package/src/types/plugins.tsx +69 -15
  368. package/src/types/properties.ts +106 -27
  369. package/src/types/property_config.tsx +2 -2
  370. package/src/types/roles.ts +3 -0
  371. package/src/types/side_dialogs_controller.tsx +15 -0
  372. package/src/types/side_entity_controller.tsx +16 -1
  373. package/src/types/storage.ts +83 -1
  374. package/src/types/user.ts +3 -1
  375. package/src/util/builders.ts +10 -8
  376. package/src/util/callbacks.ts +119 -0
  377. package/src/util/createFormexStub.tsx +62 -0
  378. package/src/util/entities.ts +11 -8
  379. package/src/util/entity_actions.ts +28 -0
  380. package/src/util/entity_cache.ts +204 -0
  381. package/src/util/enums.ts +1 -1
  382. package/src/util/icon_list.ts +16 -10
  383. package/src/util/icon_synonyms.ts +3 -100
  384. package/src/util/icons.tsx +36 -11
  385. package/src/util/index.ts +3 -0
  386. package/src/util/join_collections.ts +9 -2
  387. package/src/util/make_properties_editable.ts +13 -5
  388. package/src/util/navigation_from_path.ts +33 -12
  389. package/src/util/navigation_utils.ts +141 -25
  390. package/src/util/objects.ts +90 -33
  391. package/src/util/parent_references_from_path.ts +3 -3
  392. package/src/util/permissions.ts +9 -8
  393. package/src/util/plurals.ts +0 -2
  394. package/src/util/property_utils.tsx +17 -6
  395. package/src/util/references.ts +19 -8
  396. package/src/util/resolutions.ts +122 -48
  397. package/src/util/storage.ts +79 -21
  398. package/src/util/strings.ts +2 -2
  399. package/src/util/useStorageUploadController.tsx +91 -28
  400. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
  401. package/dist/components/FireCMSAppBar.d.ts +0 -26
  402. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  403. package/dist/components/VirtualTable/common.d.ts +0 -2
  404. package/dist/core/Drawer.d.ts +0 -23
  405. package/dist/core/Scaffold.d.ts +0 -55
  406. package/dist/core/SideEntityView.d.ts +0 -7
  407. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  408. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  409. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  410. package/dist/internal/useLocaleConfig.d.ts +0 -1
  411. package/dist/types/appcheck.d.ts +0 -26
  412. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
  413. package/src/components/FireCMSAppBar.tsx +0 -165
  414. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  415. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  416. package/src/core/Drawer.tsx +0 -191
  417. package/src/core/Scaffold.tsx +0 -281
  418. package/src/core/SideEntityView.tsx +0 -38
  419. package/src/form/components/FormikArrayContainer.tsx +0 -44
  420. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  421. package/src/internal/useBuildCustomizationController.tsx +0 -5
  422. package/src/internal/useLocaleConfig.tsx +0 -18
  423. package/src/types/appcheck.ts +0 -29
  424. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -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 {
@@ -264,7 +270,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
264
270
  placeholder={"value"}
265
271
  value={entryValue}
266
272
  type={dataType === "number" ? "number" : "text"}
267
- size={"small"}
273
+ size={"medium"}
268
274
  disabled={disabled || !fieldKey}
269
275
  onChange={(event) => {
270
276
  if (dataType === "number") {
@@ -294,7 +300,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
294
300
  }}/>;
295
301
  } else if (dataType === "date") {
296
302
  return <DateTimeField value={entryValue}
297
- size={"small"}
303
+ size={"medium"}
298
304
  locale={locale}
299
305
  disabled={disabled || !fieldKey}
300
306
  onChange={(date) => {
@@ -305,7 +311,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
305
311
  }}/>;
306
312
  } else if (dataType === "boolean") {
307
313
  return <BooleanSwitchWithLabel value={entryValue}
308
- size={"small"}
314
+ size={"medium"}
309
315
  position={"start"}
310
316
  disabled={disabled || !fieldKey}
311
317
  onValueChange={(newValue) => {
@@ -316,21 +322,24 @@ 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()}
323
329
  addLabel={fieldKey ? `Add to ${fieldKey}` : "Add"}
324
330
  size={"small"}
325
331
  disabled={disabled || !fieldKey}
326
- includeAddButton={true}
332
+ canAddElements={true}
327
333
  onValueChange={(newValue) => {
328
334
  setValue({
329
335
  ...value,
330
336
  [fieldKey]: newValue
331
337
  });
332
338
  }}
333
- buildEntry={(index, internalId) => {
339
+ buildEntry={({
340
+ index,
341
+ internalId
342
+ }) => {
334
343
  return <ArrayKeyValueRow
335
344
  index={index}
336
345
  id={internalId}
@@ -349,7 +358,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
349
358
  </div>;
350
359
  } else if (dataType === "map") {
351
360
  return <div
352
- className={cn(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
361
+ className={cls(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
353
362
  <MapEditView value={entryValue}
354
363
  fieldName={fieldKey}
355
364
  setValue={(updatedValue) => {
@@ -375,12 +384,12 @@ function MapKeyValueRow<T extends Record<string, any>>({
375
384
  <Typography key={rowId.toString()}
376
385
  component={"div"}
377
386
  className="font-mono flex flex-row gap-1">
378
- <div className="w-[200px] max-w-[25%]">
387
+ <div className="w-[300px] max-w-[30%]">
379
388
  <TextField
380
389
  value={fieldKey}
381
390
  placeholder={"key"}
382
391
  disabled={disabled || (entryValue !== undefined && entryValue !== null && entryValue !== "")}
383
- size={"small"}
392
+ size={"medium"}
384
393
  onChange={(event) => {
385
394
  onFieldKeyChange(event.target.value);
386
395
  }}/>
@@ -389,32 +398,32 @@ function MapKeyValueRow<T extends Record<string, any>>({
389
398
  <div className="flex-grow">
390
399
  {(dataType !== "map" && dataType !== "array") && buildInput(entryValue, fieldKey, dataType)}
391
400
  </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>
401
+ <div className={"flex flex-col"}>
402
+ <Menu
403
+ trigger={<IconButton size={"smallest"}>
404
+ <ArrowDropDownIcon size={"small"}/>
405
+ </IconButton>}
406
+ >
407
+ <MenuItem dense
408
+ onClick={() => doUpdateDataType("string")}>string</MenuItem>
409
+ <MenuItem dense
410
+ onClick={() => doUpdateDataType("number")}>number</MenuItem>
411
+ <MenuItem dense
412
+ onClick={() => doUpdateDataType("boolean")}>boolean</MenuItem>
413
+ <MenuItem dense
414
+ onClick={() => doUpdateDataType("date")}>date</MenuItem>
415
+ <MenuItem dense
416
+ onClick={() => doUpdateDataType("map")}>map</MenuItem>
417
+ <MenuItem dense
418
+ onClick={() => doUpdateDataType("array")}>array</MenuItem>
419
+ </Menu>
420
+
421
+ <IconButton aria-label="delete"
422
+ size={"smallest"}
423
+ onClick={onDeleteClick}>
424
+ <RemoveIcon size={"smallest"}/>
425
+ </IconButton>
426
+ </div>
418
427
  </Typography>
419
428
 
420
429
  {(dataType === "map" || dataType === "array") && buildInput(entryValue, fieldKey, dataType)}
@@ -448,7 +457,7 @@ function ArrayKeyValueRow<T>({
448
457
  if (dataType === "string" || dataType === "number") {
449
458
  return <TextField value={entryValue}
450
459
  type={dataType === "number" ? "number" : "text"}
451
- size={"small"}
460
+ size={"medium"}
452
461
  onChange={(event) => {
453
462
  if (dataType === "number") {
454
463
  const numberValue = event.target.value ? parseFloat(event.target.value) : undefined;
@@ -465,7 +474,7 @@ function ArrayKeyValueRow<T>({
465
474
  }}/>;
466
475
  } else if (dataType === "date") {
467
476
  return <DateTimeField value={entryValue}
468
- size={"small"}
477
+ size={"medium"}
469
478
  locale={locale}
470
479
  onChange={(date) => {
471
480
  setValue(date as T);
@@ -482,7 +491,7 @@ function ArrayKeyValueRow<T>({
482
491
  Arrays of arrays are not supported.
483
492
  </Typography>;
484
493
  } else if (dataType === "map") {
485
- return <div className={cn(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
494
+ return <div className={cls(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
486
495
  <MapEditView value={entryValue}
487
496
  setValue={(updatedValue) => {
488
497
  setValue(updatedValue);
@@ -1,11 +1,11 @@
1
1
  import React from "react";
2
- import { FieldProps, Properties, ResolvedProperties } from "../../types";
2
+ import { FieldProps, MapProperty, Properties, PropertyFieldBindingProps, 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
- import { ExpandablePanel, InputLabel, Select, SelectItem } from "@firecms/ui";
8
+ import { cls, ExpandablePanel, InputLabel, Select, SelectItem } from "@firecms/ui";
9
9
 
10
10
  /**
11
11
  * Field that renders the children property fields
@@ -21,17 +21,17 @@ export function MapFieldBinding({
21
21
  error,
22
22
  disabled,
23
23
  property,
24
- setValue,
25
- partOfBlock,
26
- tableMode,
24
+ partOfArray,
25
+ minimalistView: minimalistViewProp,
27
26
  includeDescription,
28
- underlyingValueHasChanged,
29
27
  autoFocus,
30
- context
28
+ context,
29
+ onPropertyChange
31
30
  }: FieldProps<Record<string, any>>) {
32
31
 
33
32
  const pickOnlySomeKeys = property.pickOnlySomeKeys || false;
34
- const expanded = (property.expanded === undefined ? true : property.expanded) || autoFocus;
33
+ const expanded = property.expanded === undefined ? true : property.expanded;
34
+ const minimalistView = minimalistViewProp || property.minimalistView;
35
35
 
36
36
  if (!property.properties) {
37
37
  throw Error(`You need to specify a 'properties' prop (or specify a custom field) in your map property ${propertyKey}`);
@@ -52,57 +52,73 @@ export function MapFieldBinding({
52
52
  }
53
53
 
54
54
  const mapFormView = <>
55
- <div className="py-1 flex flex-col space-y-2">
56
- {Object.entries(mapProperties)
57
- .filter(([_, property]) => !isHidden(property))
58
- .map(([entryKey, childProperty], index) => {
59
- const fieldProps = {
60
- propertyKey: `${propertyKey}.${entryKey}`,
61
- disabled,
62
- property: childProperty,
63
- includeDescription,
64
- underlyingValueHasChanged,
65
- context,
66
- tableMode: false,
67
- partOfArray: false,
68
- partOfBlock: false,
69
- autoFocus: autoFocus && index === 0
70
- };
71
- return (
72
- <div key={`map-${propertyKey}-${index}`}>
73
- <ErrorBoundary>
74
- <PropertyFieldBinding
75
- {...fieldProps}/>
76
- </ErrorBoundary>
77
- </div>
78
- );
79
- }
80
- )}
81
- </div>
82
-
83
- {/*{pickOnlySomeKeys && buildPickKeysSelect(disabled, property.properties, setValue, value)}*/}
84
-
85
- </>;
86
-
87
- 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"}/>
92
- );
55
+ <div
56
+ className={cls("py-1 flex flex-col space-y-2", minimalistView && property.widthPercentage !== undefined ? "mt-8" : undefined)}>
57
+ {Object.entries(mapProperties)
58
+ .filter(([_, property]) => !isHidden(property))
59
+ .map(([entryKey, childProperty], index) => {
60
+ const thisDisabled = isReadOnly(childProperty) || Boolean(childProperty.disabled);
61
+ const fieldBindingProps: PropertyFieldBindingProps<any> = {
62
+ propertyKey: `${propertyKey}.${entryKey}`,
63
+ disabled: disabled || thisDisabled,
64
+ property: childProperty,
65
+ includeDescription,
66
+ context,
67
+ partOfArray: false,
68
+ minimalistView: false,
69
+ autoFocus: autoFocus && index === 0,
70
+ onPropertyChange: function (updatedProperty) {
71
+ onPropertyChange?.({
72
+ properties: {
73
+ [entryKey]: updatedProperty
74
+ }
75
+ } as Partial<MapProperty>);
76
+ }
77
+ };
78
+
79
+ return (
80
+ <div key={`map-${propertyKey}-${index}`} className={"relative"}>
81
+ <ErrorBoundary>
82
+ <PropertyFieldBinding
83
+ {...fieldBindingProps}/>
84
+ </ErrorBoundary>
85
+ </div>
86
+ ) ;
87
+ }
88
+ )
89
+ }
90
+ </div>
91
+
92
+ {/*{pickOnlySomeKeys && buildPickKeysSelect(disabled, property.properties, setValue, value)}*/}
93
+
94
+ </>
95
+ ;
93
96
 
94
97
  return (
95
98
  <ErrorBoundary>
96
99
 
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>}
100
-
101
- {(tableMode || partOfBlock) && mapFormView}
100
+ {!minimalistView && <ExpandablePanel initiallyExpanded={expanded}
101
+ onExpandedChange={(expanded) => {
102
+ onPropertyChange?.({
103
+ expanded
104
+ });
105
+ }}
106
+ className={property.widthPercentage !== undefined ? "mt-8" : undefined}
107
+ innerClassName={"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2 bg-white dark:bg-surface-900"}
108
+ title={<LabelWithIconAndTooltip
109
+ propertyKey={propertyKey}
110
+ icon={getIconForProperty(property, "small")}
111
+ required={property.validation?.required}
112
+ title={property.name}
113
+ className={"text-text-secondary dark:text-text-secondary-dark"}/>}>
114
+ {mapFormView}
115
+ </ExpandablePanel>}
116
+
117
+ {minimalistView && mapFormView}
102
118
 
103
119
  <FieldHelperText includeDescription={includeDescription}
104
- showError={showError}
105
- error={error ? (typeof error === "string" ? error : "A property of this map has an error") : undefined}
120
+ showError={showError ?? false}
121
+ error={error && !partOfArray ? (typeof error === "string" ? error : "A property of this map has an error") : undefined}
106
122
  disabled={disabled}
107
123
  property={property}/>
108
124
 
@@ -128,6 +144,8 @@ const buildPickKeysSelect = (disabled: boolean, properties: Properties, setValue
128
144
  <InputLabel>Add property</InputLabel>
129
145
  <Select
130
146
  value={""}
147
+ size={"large"}
148
+ fullWidth={true}
131
149
  disabled={disabled}
132
150
  onValueChange={handleAddProperty}
133
151
  renderValue={(key) => (properties as Properties)[key].name || key}>
@@ -0,0 +1,159 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from "react";
2
+ import {
3
+ FieldHelperText,
4
+ FieldProps,
5
+ getIconForProperty,
6
+ LabelWithIconAndTooltip,
7
+ PropertyOrBuilder,
8
+ randomString,
9
+ ResolvedArrayProperty,
10
+ ResolvedStringProperty,
11
+ useAuthController,
12
+ useStorageSource
13
+ } from "../../index";
14
+ import { cls, fieldBackgroundDisabledMixin, fieldBackgroundHoverMixin, fieldBackgroundMixin } from "@firecms/ui";
15
+ import { FireCMSEditor, FireCMSEditorProps } from "@firecms/editor";
16
+ import { resolveProperty, resolveStorageFilenameString, resolveStoragePathString } from "../../util";
17
+
18
+ interface MarkdownEditorFieldProps {
19
+ highlight?: { from: number, to: number };
20
+ editorProps?: Partial<FireCMSEditorProps>
21
+ }
22
+
23
+ export function MarkdownEditorFieldBinding({
24
+ property,
25
+ propertyKey,
26
+ value,
27
+ setValue,
28
+ includeDescription,
29
+ showError,
30
+ error,
31
+ minimalistView,
32
+ disabled: disabledProp,
33
+ isSubmitting,
34
+ context,
35
+ customProps,
36
+ }: FieldProps<string, MarkdownEditorFieldProps>) {
37
+
38
+ const authController = useAuthController();
39
+ const disabled = disabledProp || isSubmitting;
40
+ const highlight = customProps?.highlight;
41
+ const editorProps = customProps?.editorProps;
42
+ const storageSource = useStorageSource();
43
+ const storage = property.storage;
44
+
45
+ const entityValues = context.values;
46
+ const entityId = context.entityId;
47
+ const path = context.path;
48
+
49
+ const [fieldVersion, setFieldVersion] = useState(0);
50
+ const internalValue = useRef<string | null>(value);
51
+
52
+ const onContentChange = useCallback((content: string) => {
53
+ if (content === value || (value === null && content === "")) {
54
+ return;
55
+ }
56
+ internalValue.current = content;
57
+ setValue(content);
58
+ }, [setValue]);
59
+
60
+ useEffect(() => {
61
+ if (internalValue.current !== value) {
62
+ internalValue.current = value;
63
+ setFieldVersion(fieldVersion + 1);
64
+ }
65
+ }, [value]);
66
+
67
+ const resolvedProperty = resolveProperty({
68
+ propertyOrBuilder: property as PropertyOrBuilder,
69
+ values: entityValues,
70
+ authController
71
+ }) as ResolvedStringProperty | ResolvedArrayProperty<string[]>;
72
+
73
+ const fileNameBuilder = useCallback(async (file: File) => {
74
+ if (storage?.fileName) {
75
+ const fileName = await resolveStorageFilenameString({
76
+ input: storage.fileName,
77
+ storage,
78
+ values: entityValues,
79
+ entityId,
80
+ path,
81
+ property: resolvedProperty,
82
+ file,
83
+ propertyKey
84
+ });
85
+ if (!fileName || fileName.length === 0) {
86
+ throw Error("You need to return a valid filename");
87
+ }
88
+ return fileName;
89
+ }
90
+ return randomString() + "_" + file.name;
91
+ }, [entityId, entityValues, path, resolvedProperty, propertyKey, storage]);
92
+
93
+ const storagePathBuilder = useCallback((file: File) => {
94
+ if (!storage) return "/";
95
+ const resolvedProperty = resolveProperty({
96
+ propertyOrBuilder: property,
97
+ values: entityValues,
98
+ authController
99
+ }) as ResolvedStringProperty | ResolvedArrayProperty<string[]>;
100
+ return resolveStoragePathString({
101
+ input: storage.storagePath,
102
+ storage,
103
+ values: entityValues,
104
+ entityId,
105
+ path,
106
+ property: resolvedProperty,
107
+ file,
108
+ propertyKey
109
+ }) ?? "/";
110
+ }, [entityId, entityValues, path, property, propertyKey, storage]);
111
+
112
+ const editor = <FireCMSEditor
113
+ content={value}
114
+ onMarkdownContentChange={onContentChange}
115
+ version={context.formex.version + fieldVersion}
116
+ highlight={highlight}
117
+ disabled={disabled}
118
+ handleImageUpload={async (file: File) => {
119
+ const storagePath = storagePathBuilder(file);
120
+ const fileName = await fileNameBuilder(file);
121
+ const result = await storageSource.uploadFile({
122
+ file,
123
+ fileName,
124
+ path: storagePath,
125
+ });
126
+ const downloadConfig = await storageSource.getDownloadURL(result.path);
127
+ const url = downloadConfig.url;
128
+ if (!url) {
129
+ throw new Error("Error uploading image");
130
+ }
131
+ return url;
132
+ }}
133
+ {...editorProps}
134
+ />;
135
+
136
+ if (minimalistView)
137
+ return editor;
138
+
139
+ return (
140
+ <>
141
+ <LabelWithIconAndTooltip
142
+ propertyKey={propertyKey}
143
+ icon={getIconForProperty(property, "small")}
144
+ required={property.validation?.required}
145
+ title={property.name}
146
+ className={"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5"}/>
147
+ <div
148
+ className={cls("rounded-md", fieldBackgroundMixin, disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin)}>
149
+ {editor}
150
+ </div>
151
+ <FieldHelperText includeDescription={includeDescription}
152
+ showError={showError}
153
+ error={error}
154
+ property={property}/>
155
+ </>
156
+
157
+ );
158
+
159
+ }