@firecms/core 3.0.0-canary.23 → 3.0.0-canary.232

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