@firecms/core 3.0.0-canary.29 → 3.0.0-canary.290

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 (433) 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 +77 -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/PropertyCollectionView.d.ts +23 -0
  34. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  35. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  36. package/dist/components/ReferenceWidget.d.ts +3 -1
  37. package/dist/components/SelectableTable/SelectableTable.d.ts +14 -4
  38. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  39. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  40. package/dist/components/UserDisplay.d.ts +7 -0
  41. package/dist/components/VirtualTable/VirtualTableProps.d.ts +24 -12
  42. package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
  43. package/dist/components/VirtualTable/types.d.ts +3 -3
  44. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  45. package/dist/components/common/index.d.ts +2 -1
  46. package/dist/components/common/table_height.d.ts +5 -0
  47. package/dist/components/common/types.d.ts +4 -6
  48. package/dist/components/common/useColumnsIds.d.ts +3 -1
  49. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  50. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  51. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  52. package/dist/components/index.d.ts +5 -2
  53. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  54. package/dist/contexts/InternalUserManagementContext.d.ts +3 -0
  55. package/dist/core/DefaultAppBar.d.ts +29 -0
  56. package/dist/core/DefaultDrawer.d.ts +19 -0
  57. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  58. package/dist/core/EntityEditView.d.ts +49 -11
  59. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  60. package/dist/core/FireCMS.d.ts +2 -3
  61. package/dist/core/FireCMSRouter.d.ts +4 -0
  62. package/dist/core/NavigationRoutes.d.ts +2 -3
  63. package/dist/core/SideDialogs.d.ts +4 -2
  64. package/dist/core/field_configs.d.ts +1 -1
  65. package/dist/core/index.d.ts +4 -4
  66. package/dist/form/EntityForm.d.ts +40 -64
  67. package/dist/form/EntityFormActions.d.ts +21 -0
  68. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  69. package/dist/form/components/ErrorFocus.d.ts +1 -1
  70. package/dist/form/components/FieldHelperText.d.ts +3 -3
  71. package/dist/form/components/FormEntry.d.ts +6 -0
  72. package/dist/form/components/FormLayout.d.ts +5 -0
  73. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  74. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  75. package/dist/form/components/LocalChangesMenu.d.ts +11 -0
  76. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  77. package/dist/form/components/index.d.ts +3 -1
  78. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  80. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  81. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  82. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  83. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  84. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  85. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  86. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  87. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  88. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  89. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  90. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +5 -13
  91. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  92. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  93. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +12 -0
  94. package/dist/form/index.d.ts +18 -18
  95. package/dist/form/useClearRestoreValue.d.ts +2 -2
  96. package/dist/hooks/data/delete.d.ts +4 -4
  97. package/dist/hooks/data/save.d.ts +4 -5
  98. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  99. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  100. package/dist/hooks/index.d.ts +3 -0
  101. package/dist/hooks/useAuthController.d.ts +1 -1
  102. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  103. package/dist/hooks/useBuildNavigationController.d.ts +57 -13
  104. package/dist/hooks/useCollapsedGroups.d.ts +9 -0
  105. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  106. package/dist/hooks/useInternalUserManagementController.d.ts +12 -0
  107. package/dist/hooks/useModeController.d.ts +1 -2
  108. package/dist/hooks/useProjectLog.d.ts +8 -2
  109. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  110. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  111. package/dist/index.d.ts +1 -0
  112. package/dist/index.es.js +24546 -13965
  113. package/dist/index.es.js.map +1 -1
  114. package/dist/index.umd.js +27256 -588
  115. package/dist/index.umd.js.map +1 -1
  116. package/dist/internal/useBuildDataSource.d.ts +3 -17
  117. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  118. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  119. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  120. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  121. package/dist/preview/components/ReferencePreview.d.ts +4 -3
  122. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  123. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  124. package/dist/preview/components/UserPreview.d.ts +8 -0
  125. package/dist/preview/index.d.ts +1 -0
  126. package/dist/preview/util.d.ts +3 -3
  127. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  128. package/dist/routes/FireCMSRoute.d.ts +1 -0
  129. package/dist/routes/HomePageRoute.d.ts +3 -0
  130. package/dist/types/analytics.d.ts +1 -1
  131. package/dist/types/auth.d.ts +8 -10
  132. package/dist/types/collections.d.ts +123 -25
  133. package/dist/types/customization_controller.d.ts +8 -0
  134. package/dist/types/datasource.d.ts +52 -36
  135. package/dist/types/dialogs_controller.d.ts +7 -3
  136. package/dist/types/entities.d.ts +12 -3
  137. package/dist/types/entity_actions.d.ts +72 -8
  138. package/dist/types/entity_callbacks.d.ts +16 -16
  139. package/dist/types/entity_overrides.d.ts +2 -2
  140. package/dist/types/export_import.d.ts +4 -4
  141. package/dist/types/fields.d.ts +79 -39
  142. package/dist/types/firecms.d.ts +31 -3
  143. package/dist/types/firecms_context.d.ts +17 -1
  144. package/dist/types/index.d.ts +1 -1
  145. package/dist/types/internal_user_management.d.ts +20 -0
  146. package/dist/types/navigation.d.ts +62 -19
  147. package/dist/types/permissions.d.ts +4 -4
  148. package/dist/types/plugins.d.ts +58 -13
  149. package/dist/types/properties.d.ts +122 -31
  150. package/dist/types/property_config.d.ts +1 -3
  151. package/dist/types/roles.d.ts +3 -0
  152. package/dist/types/side_dialogs_controller.d.ts +10 -0
  153. package/dist/types/side_entity_controller.d.ts +14 -1
  154. package/dist/types/storage.d.ts +75 -0
  155. package/dist/types/user.d.ts +2 -1
  156. package/dist/util/builders.d.ts +3 -3
  157. package/dist/util/callbacks.d.ts +2 -0
  158. package/dist/util/collections.d.ts +1 -0
  159. package/dist/util/createFormexStub.d.ts +2 -0
  160. package/dist/util/entities.d.ts +3 -3
  161. package/dist/util/entity_actions.d.ts +2 -0
  162. package/dist/util/entity_cache.d.ts +28 -0
  163. package/dist/util/icon_list.d.ts +5 -1
  164. package/dist/util/icon_synonyms.d.ts +1 -98
  165. package/dist/util/icons.d.ts +7 -4
  166. package/dist/util/index.d.ts +3 -0
  167. package/dist/util/make_properties_editable.d.ts +1 -2
  168. package/dist/util/navigation_from_path.d.ts +10 -1
  169. package/dist/util/navigation_utils.d.ts +15 -3
  170. package/dist/util/objects.d.ts +3 -1
  171. package/dist/util/permissions.d.ts +4 -4
  172. package/dist/util/plurals.d.ts +0 -2
  173. package/dist/util/property_utils.d.ts +4 -4
  174. package/dist/util/references.d.ts +2 -2
  175. package/dist/util/resolutions.d.ts +42 -17
  176. package/dist/util/storage.d.ts +23 -2
  177. package/dist/util/useStorageUploadController.d.ts +4 -3
  178. package/package.json +70 -53
  179. package/src/app/AppBar.tsx +18 -0
  180. package/src/app/Drawer.tsx +24 -0
  181. package/src/app/Scaffold.tsx +253 -0
  182. package/src/app/index.ts +4 -0
  183. package/src/app/useApp.tsx +32 -0
  184. package/src/components/ArrayContainer.tsx +447 -229
  185. package/src/components/CircularProgressCenter.tsx +2 -2
  186. package/src/components/ClearFilterSortButton.tsx +41 -0
  187. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
  188. package/src/components/DeleteEntityDialog.tsx +13 -20
  189. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +87 -62
  190. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  191. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  192. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +84 -42
  193. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  194. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  195. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  196. package/src/components/EntityCollectionTable/index.tsx +1 -1
  197. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +34 -39
  198. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +49 -36
  199. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  200. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +135 -105
  201. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
  202. package/src/components/EntityCollectionView/EntityCollectionView.tsx +241 -119
  203. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
  204. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  205. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  206. package/src/components/EntityCollectionView/utils.ts +19 -0
  207. package/src/components/EntityJsonPreview.tsx +66 -0
  208. package/src/components/EntityPreview.tsx +83 -62
  209. package/src/components/EntityView.tsx +34 -42
  210. package/src/components/ErrorView.tsx +4 -4
  211. package/src/components/FireCMSLogo.tsx +7 -51
  212. package/src/components/HomePage/DefaultHomePage.tsx +516 -158
  213. package/src/components/HomePage/FavouritesView.tsx +9 -14
  214. package/src/components/HomePage/HomePageDnD.tsx +702 -0
  215. package/src/components/HomePage/NavigationCard.tsx +48 -39
  216. package/src/components/HomePage/NavigationCardBinding.tsx +17 -16
  217. package/src/components/HomePage/NavigationGroup.tsx +144 -30
  218. package/src/components/HomePage/RenameGroupDialog.tsx +123 -0
  219. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  220. package/src/components/NotFoundPage.tsx +2 -2
  221. package/src/components/PropertyCollectionView.tsx +329 -0
  222. package/src/components/PropertyConfigBadge.tsx +10 -4
  223. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  224. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +23 -13
  225. package/src/components/ReferenceWidget.tsx +21 -11
  226. package/src/components/SearchIconsView.tsx +10 -7
  227. package/src/components/SelectableTable/SelectableTable.tsx +157 -157
  228. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  229. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +27 -9
  230. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  231. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -24
  232. package/src/components/UnsavedChangesDialog.tsx +46 -0
  233. package/src/components/UserDisplay.tsx +55 -0
  234. package/src/components/VirtualTable/VirtualTable.tsx +105 -51
  235. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  236. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  237. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  238. package/src/components/VirtualTable/VirtualTableProps.tsx +28 -14
  239. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  240. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  241. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
  242. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  243. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  244. package/src/components/VirtualTable/fields/VirtualTableUserSelect.tsx +99 -0
  245. package/src/components/VirtualTable/types.tsx +2 -3
  246. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +64 -44
  247. package/src/components/common/index.ts +2 -1
  248. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  249. package/src/components/common/types.tsx +4 -6
  250. package/src/components/common/useColumnsIds.tsx +16 -2
  251. package/src/components/common/useDataSourceTableController.tsx +420 -0
  252. package/src/components/common/useDebouncedCallback.tsx +20 -0
  253. package/src/components/common/useScrollRestoration.tsx +68 -0
  254. package/src/components/common/useTableSearchHelper.ts +53 -12
  255. package/src/components/index.tsx +6 -2
  256. package/src/contexts/BreacrumbsContext.tsx +38 -0
  257. package/src/contexts/DialogsProvider.tsx +5 -4
  258. package/src/contexts/InternalUserManagementContext.tsx +4 -0
  259. package/src/contexts/ModeController.tsx +1 -3
  260. package/src/contexts/SnackbarProvider.tsx +2 -0
  261. package/src/core/DefaultAppBar.tsx +219 -0
  262. package/src/core/DefaultDrawer.tsx +185 -0
  263. package/src/core/DrawerNavigationItem.tsx +66 -0
  264. package/src/core/EntityEditView.tsx +447 -469
  265. package/src/core/EntityEditViewFormActions.tsx +344 -0
  266. package/src/core/EntitySidePanel.tsx +96 -23
  267. package/src/core/FireCMS.tsx +85 -60
  268. package/src/core/FireCMSRouter.tsx +17 -0
  269. package/src/core/NavigationRoutes.tsx +28 -38
  270. package/src/core/SideDialogs.tsx +22 -12
  271. package/src/core/field_configs.tsx +41 -14
  272. package/src/core/index.tsx +6 -5
  273. package/src/form/EntityForm.tsx +740 -523
  274. package/src/form/EntityFormActions.tsx +226 -0
  275. package/src/form/PropertyFieldBinding.tsx +88 -41
  276. package/src/form/components/CustomIdField.tsx +9 -3
  277. package/src/form/components/ErrorFocus.tsx +22 -29
  278. package/src/form/components/FieldHelperText.tsx +4 -4
  279. package/src/form/components/FormEntry.tsx +22 -0
  280. package/src/form/components/FormLayout.tsx +16 -0
  281. package/src/form/components/LabelWithIcon.tsx +30 -19
  282. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  283. package/src/form/components/LocalChangesMenu.tsx +144 -0
  284. package/src/form/components/StorageItemPreview.tsx +23 -13
  285. package/src/form/components/StorageUploadProgress.tsx +5 -6
  286. package/src/form/components/index.tsx +3 -1
  287. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +34 -19
  288. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +50 -36
  289. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -33
  290. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  291. package/src/form/field_bindings/KeyValueFieldBinding.tsx +61 -52
  292. package/src/form/field_bindings/MapFieldBinding.tsx +73 -55
  293. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
  294. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
  295. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  296. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  297. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  298. package/src/form/field_bindings/RepeatFieldBinding.tsx +62 -35
  299. package/src/form/field_bindings/SelectFieldBinding.tsx +24 -15
  300. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +257 -199
  301. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  302. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  303. package/src/form/field_bindings/UserSelectFieldBinding.tsx +94 -0
  304. package/src/form/index.tsx +21 -37
  305. package/src/form/useClearRestoreValue.tsx +2 -2
  306. package/src/form/validation.ts +13 -23
  307. package/src/hooks/data/delete.ts +6 -5
  308. package/src/hooks/data/save.ts +26 -33
  309. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  310. package/src/hooks/data/useDataSource.tsx +11 -3
  311. package/src/hooks/data/useEntityFetch.tsx +10 -6
  312. package/src/hooks/index.tsx +4 -0
  313. package/src/hooks/useAuthController.tsx +1 -1
  314. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  315. package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
  316. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  317. package/src/hooks/useBuildModeController.tsx +22 -29
  318. package/src/hooks/useBuildNavigationController.tsx +515 -121
  319. package/src/hooks/useCollapsedGroups.ts +64 -0
  320. package/src/hooks/useFireCMSContext.tsx +9 -35
  321. package/src/hooks/useInternalUserManagementController.tsx +16 -0
  322. package/src/hooks/useLargeLayout.tsx +0 -35
  323. package/src/hooks/useModeController.tsx +1 -2
  324. package/src/hooks/useProjectLog.tsx +32 -10
  325. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  326. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  327. package/src/index.ts +1 -0
  328. package/src/internal/useBuildDataSource.ts +79 -85
  329. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  330. package/src/internal/useBuildSideEntityController.tsx +204 -77
  331. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  332. package/src/preview/PropertyPreview.tsx +42 -25
  333. package/src/preview/PropertyPreviewProps.tsx +7 -1
  334. package/src/preview/components/BooleanPreview.tsx +2 -2
  335. package/src/preview/components/EmptyValue.tsx +1 -1
  336. package/src/preview/components/EnumValuesChip.tsx +2 -2
  337. package/src/preview/components/ImagePreview.tsx +26 -37
  338. package/src/preview/components/ReferencePreview.tsx +30 -38
  339. package/src/preview/components/StorageThumbnail.tsx +5 -1
  340. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  341. package/src/preview/components/UserPreview.tsx +27 -0
  342. package/src/preview/index.ts +1 -0
  343. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -6
  344. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +7 -5
  345. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -4
  346. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -4
  347. package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -6
  348. package/src/preview/property_previews/ArrayPropertyPreview.tsx +8 -7
  349. package/src/preview/property_previews/MapPropertyPreview.tsx +14 -13
  350. package/src/preview/property_previews/NumberPropertyPreview.tsx +2 -2
  351. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  352. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  353. package/src/preview/util.ts +10 -10
  354. package/src/routes/CustomCMSRoute.tsx +21 -0
  355. package/src/routes/FireCMSRoute.tsx +246 -0
  356. package/src/routes/HomePageRoute.tsx +17 -0
  357. package/src/types/analytics.ts +3 -0
  358. package/src/types/auth.tsx +9 -13
  359. package/src/types/collections.ts +146 -30
  360. package/src/types/customization_controller.tsx +9 -1
  361. package/src/types/datasource.ts +61 -43
  362. package/src/types/dialogs_controller.tsx +7 -3
  363. package/src/types/entities.ts +19 -3
  364. package/src/types/entity_actions.tsx +86 -10
  365. package/src/types/entity_callbacks.ts +18 -18
  366. package/src/types/entity_overrides.tsx +2 -2
  367. package/src/types/export_import.ts +4 -4
  368. package/src/types/fields.tsx +91 -42
  369. package/src/types/firecms.tsx +34 -4
  370. package/src/types/firecms_context.tsx +18 -1
  371. package/src/types/index.ts +1 -1
  372. package/src/types/internal_user_management.ts +24 -0
  373. package/src/types/navigation.ts +77 -24
  374. package/src/types/permissions.ts +5 -5
  375. package/src/types/plugins.tsx +69 -15
  376. package/src/types/properties.ts +141 -33
  377. package/src/types/property_config.tsx +2 -2
  378. package/src/types/roles.ts +3 -0
  379. package/src/types/side_dialogs_controller.tsx +15 -0
  380. package/src/types/side_entity_controller.tsx +16 -1
  381. package/src/types/storage.ts +83 -1
  382. package/src/types/user.ts +3 -1
  383. package/src/util/builders.ts +10 -8
  384. package/src/util/callbacks.ts +119 -0
  385. package/src/util/collections.ts +8 -0
  386. package/src/util/createFormexStub.tsx +66 -0
  387. package/src/util/entities.ts +11 -8
  388. package/src/util/entity_actions.ts +28 -0
  389. package/src/util/entity_cache.ts +223 -0
  390. package/src/util/enums.ts +1 -1
  391. package/src/util/icon_list.ts +16 -10
  392. package/src/util/icon_synonyms.ts +3 -100
  393. package/src/util/icons.tsx +36 -11
  394. package/src/util/index.ts +3 -0
  395. package/src/util/join_collections.ts +11 -4
  396. package/src/util/make_properties_editable.ts +5 -19
  397. package/src/util/navigation_from_path.ts +33 -12
  398. package/src/util/navigation_utils.ts +141 -25
  399. package/src/util/objects.ts +128 -33
  400. package/src/util/parent_references_from_path.ts +3 -3
  401. package/src/util/permissions.ts +9 -8
  402. package/src/util/plurals.ts +0 -2
  403. package/src/util/property_utils.tsx +17 -6
  404. package/src/util/references.ts +19 -8
  405. package/src/util/resolutions.ts +122 -48
  406. package/src/util/storage.ts +79 -21
  407. package/src/util/strings.ts +2 -2
  408. package/src/util/useStorageUploadController.tsx +162 -62
  409. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
  410. package/dist/components/FireCMSAppBar.d.ts +0 -26
  411. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  412. package/dist/components/VirtualTable/common.d.ts +0 -2
  413. package/dist/core/Drawer.d.ts +0 -23
  414. package/dist/core/Scaffold.d.ts +0 -55
  415. package/dist/core/SideEntityView.d.ts +0 -7
  416. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  417. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  418. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  419. package/dist/internal/useLocaleConfig.d.ts +0 -1
  420. package/dist/types/appcheck.d.ts +0 -26
  421. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
  422. package/src/components/FireCMSAppBar.tsx +0 -165
  423. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  424. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  425. package/src/core/Drawer.tsx +0 -191
  426. package/src/core/Scaffold.tsx +0 -281
  427. package/src/core/SideEntityView.tsx +0 -38
  428. package/src/form/components/FormikArrayContainer.tsx +0 -44
  429. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  430. package/src/internal/useBuildCustomizationController.tsx +0 -5
  431. package/src/internal/useLocaleConfig.tsx +0 -18
  432. package/src/types/appcheck.ts +0 -29
  433. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -0,0 +1,226 @@
1
+ import React from "react";
2
+ import {
3
+ Entity,
4
+ EntityAction,
5
+ FireCMSContext,
6
+ FormContext,
7
+ ResolvedEntityCollection,
8
+ SideEntityController
9
+ } from "../types";
10
+ import {
11
+ Button,
12
+ cls,
13
+ defaultBorderMixin,
14
+ DialogActions,
15
+ ErrorIcon,
16
+ IconButton,
17
+ LoadingButton,
18
+ Typography
19
+ } from "@firecms/ui";
20
+ import { FormexController } from "@firecms/formex";
21
+ import { useFireCMSContext, useSideEntityController } from "../hooks";
22
+
23
+ export interface EntityFormActionsProps {
24
+ fullPath: string;
25
+ fullIdPath?: string;
26
+ collection: ResolvedEntityCollection;
27
+ path: string;
28
+ entity?: Entity;
29
+ layout: "bottom" | "side";
30
+ savingError?: Error;
31
+ formex: FormexController<any>;
32
+ disabled: boolean;
33
+ status: "new" | "existing" | "copy";
34
+ pluginActions: React.ReactNode[];
35
+ openEntityMode: "side_panel" | "full_screen";
36
+ showDefaultActions?: boolean;
37
+ navigateBack: () => void;
38
+ formContext: FormContext
39
+ }
40
+
41
+ export function EntityFormActions({
42
+ fullPath,
43
+ fullIdPath,
44
+ collection,
45
+ entity,
46
+ layout,
47
+ savingError,
48
+ formex,
49
+ disabled,
50
+ status,
51
+ pluginActions,
52
+ openEntityMode,
53
+ navigateBack,
54
+ formContext
55
+ }: EntityFormActionsProps) {
56
+
57
+ const context = useFireCMSContext();
58
+ const sideEntityController = useSideEntityController();
59
+
60
+ return layout === "bottom"
61
+ ? buildBottomActions({
62
+ fullPath,
63
+ fullIdPath,
64
+ savingError,
65
+ entity,
66
+ collection,
67
+ context,
68
+ sideEntityController,
69
+ disabled,
70
+ status,
71
+ pluginActions,
72
+ openEntityMode,
73
+ navigateBack,
74
+ formContext,
75
+ formex
76
+ })
77
+ : buildSideActions({
78
+ fullPath,
79
+ fullIdPath,
80
+ savingError,
81
+ entity,
82
+ collection,
83
+ context,
84
+ sideEntityController,
85
+ disabled,
86
+ status,
87
+ pluginActions,
88
+ openEntityMode,
89
+ navigateBack,
90
+ formContext,
91
+ formex
92
+ });
93
+ }
94
+
95
+ type ActionsViewProps<M extends object> = {
96
+ fullPath: string,
97
+ fullIdPath?: string,
98
+ savingError: Error | undefined,
99
+ entity: Entity<M> | undefined,
100
+ formActions?: EntityAction[],
101
+ collection: ResolvedEntityCollection,
102
+ context: FireCMSContext,
103
+ sideEntityController: SideEntityController,
104
+ disabled: boolean,
105
+ status: "new" | "existing" | "copy",
106
+ pluginActions?: React.ReactNode[],
107
+ openEntityMode: "side_panel" | "full_screen";
108
+ navigateBack: () => void;
109
+ formContext: FormContext,
110
+ formex: FormexController<any>;
111
+ };
112
+
113
+ function buildBottomActions<M extends object>({
114
+ savingError,
115
+ entity,
116
+ fullPath,
117
+ fullIdPath,
118
+ formActions,
119
+ collection,
120
+ context,
121
+ sideEntityController,
122
+ disabled,
123
+ status,
124
+ pluginActions,
125
+ openEntityMode,
126
+ navigateBack,
127
+ formContext,
128
+ formex
129
+ }: ActionsViewProps<M>) {
130
+
131
+ const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;
132
+
133
+ return <DialogActions position={"absolute"}>
134
+ {savingError &&
135
+ <div className="text-right">
136
+ <Typography color={"error"}>{savingError.message}</Typography>
137
+ </div>
138
+ }
139
+ {entity && (formActions ?? []).length > 0 && <div className="flex-grow flex overflow-auto no-scrollbar">
140
+ {(formActions ?? []).map(action => (
141
+ <IconButton
142
+ key={action.name}
143
+ color="primary"
144
+ onClick={(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
145
+ event.stopPropagation();
146
+ if (entity)
147
+ action.onClick({
148
+ view: "form",
149
+ entity,
150
+ fullPath: fullPath ?? collection.path,
151
+ fullIdPath: fullIdPath ?? collection.id,
152
+ collection: collection,
153
+ context,
154
+ sideEntityController,
155
+ openEntityMode: openEntityMode,
156
+ navigateBack,
157
+ formContext
158
+ });
159
+ }}>
160
+ {action.icon}
161
+ </IconButton>
162
+ ))}
163
+ </div>}
164
+ {pluginActions}
165
+ <Button variant="text" disabled={disabled || formex.isSubmitting}
166
+ color={"primary"}
167
+ type="reset">
168
+ {status === "existing" ? "Discard" : "Clear"}
169
+ </Button>
170
+ <Button variant={"filled"}
171
+ color="primary"
172
+ type="submit"
173
+ disabled={disabled || formex.isSubmitting}
174
+ startIcon={hasErrors ? <ErrorIcon/> : undefined}>
175
+ {status === "existing" && "Save"}
176
+ {status === "copy" && "Create copy"}
177
+ {status === "new" && "Create"}
178
+ </Button>
179
+
180
+ </DialogActions>;
181
+ }
182
+
183
+ function buildSideActions<M extends object>({
184
+ savingError,
185
+ entity,
186
+ formActions,
187
+ fullPath,
188
+ fullIdPath,
189
+ openEntityMode,
190
+ collection,
191
+ context,
192
+ sideEntityController,
193
+ disabled,
194
+ status,
195
+ pluginActions,
196
+ formex
197
+ }: ActionsViewProps<M>) {
198
+
199
+ const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;
200
+
201
+ return <div
202
+ className={cls("overflow-auto h-full flex flex-col gap-2 w-80 2xl:w-96 px-4 py-16 sticky top-0 border-l", defaultBorderMixin)}>
203
+ <LoadingButton fullWidth={true}
204
+ variant="filled"
205
+ color="primary"
206
+ type="submit"
207
+ size={"large"}
208
+ startIcon={hasErrors ? <ErrorIcon/> : undefined}
209
+ disabled={disabled || formex.isSubmitting}>
210
+ {status === "existing" && "Save"}
211
+ {status === "copy" && "Create copy"}
212
+ {status === "new" && "Create"}
213
+ </LoadingButton>
214
+ <Button fullWidth={true} variant="text" disabled={disabled || formex.isSubmitting} type="reset">
215
+ {status === "existing" ? "Discard" : "Clear"}
216
+ </Button>
217
+
218
+ {pluginActions}
219
+
220
+ {savingError &&
221
+ <div className="text-right">
222
+ <Typography color={"error"}>{savingError.message}</Typography>
223
+ </div>
224
+ }
225
+ </div>;
226
+ }
@@ -5,19 +5,19 @@ import { Field, FieldProps as FormexFieldProps, getIn } from "@firecms/formex";
5
5
 
6
6
  import {
7
7
  CMSType,
8
- EntityCollection,
9
8
  FieldProps,
10
9
  FireCMSPlugin,
11
10
  PluginFieldBuilderParams,
12
11
  Property,
13
12
  PropertyFieldBindingProps,
14
13
  PropertyOrBuilder,
14
+ ResolvedEntityCollection,
15
15
  ResolvedProperty
16
16
  } from "../types";
17
17
  import { ReadOnlyFieldBinding } from "./field_bindings/ReadOnlyFieldBinding";
18
18
 
19
19
  import { isHidden, isPropertyBuilder, isReadOnly, resolveProperty } from "../util";
20
- import { useCustomizationController } from "../hooks";
20
+ import { useAuthController, useCustomizationController } from "../hooks";
21
21
  import { Typography } from "@firecms/ui";
22
22
  import { getFieldConfig, getFieldId } from "../core";
23
23
  import { ErrorBoundary } from "../components";
@@ -51,6 +51,13 @@ export const PropertyFieldBinding = React.memo(PropertyFieldBindingInternal, (a:
51
51
  if (a.propertyKey !== b.propertyKey) {
52
52
  return false;
53
53
  }
54
+ if (a.index !== b.index) {
55
+ return false;
56
+ }
57
+
58
+ if (a.size !== b.size) {
59
+ return false;
60
+ }
54
61
  const aIsBuilder = isPropertyBuilder(a.property) || a.property.fromBuilder;
55
62
  const bIsBuilder = isPropertyBuilder(b.property) || b.property.fromBuilder;
56
63
 
@@ -67,24 +74,29 @@ export const PropertyFieldBinding = React.memo(PropertyFieldBindingInternal, (a:
67
74
  return false;
68
75
  }) as typeof PropertyFieldBindingInternal;
69
76
 
70
- function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Record<string, any> = Record<string, any>>
77
+ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Record<string, any> = any>
71
78
  ({
72
79
  propertyKey,
73
80
  property,
74
81
  context,
75
82
  includeDescription,
76
83
  underlyingValueHasChanged,
77
- disabled,
78
- tableMode,
84
+ disabled: disabledProp,
79
85
  partOfArray,
80
86
  partOfBlock,
87
+ minimalistView,
81
88
  autoFocus,
89
+ index,
90
+ size,
91
+ onPropertyChange,
82
92
  }: PropertyFieldBindingProps<T, M>): ReactElement<PropertyFieldBindingProps<T, M>> {
83
93
 
94
+ const authController = useAuthController();
84
95
  const customizationController = useCustomizationController();
85
96
 
86
97
  return (
87
98
  <Field
99
+ key={propertyKey}
88
100
  name={propertyKey}
89
101
  >
90
102
  {(fieldProps) => {
@@ -92,14 +104,17 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
92
104
  let Component: ComponentType<FieldProps<T>> | undefined;
93
105
  const resolvedProperty: ResolvedProperty<T> | null = resolveProperty({
94
106
  propertyKey,
95
- propertyValue: fieldProps.field.value,
96
107
  propertyOrBuilder: property,
97
108
  values: fieldProps.form.values,
98
109
  path: context.path,
99
110
  entityId: context.entityId,
100
- fields: customizationController.propertyConfigs
111
+ propertyConfigs: customizationController.propertyConfigs,
112
+ index,
113
+ authController
101
114
  });
102
115
 
116
+ const disabled = disabledProp || isReadOnly(resolvedProperty) || Boolean(resolvedProperty?.disabled) || context.disabled;
117
+
103
118
  if (resolvedProperty === null || isHidden(resolvedProperty)) {
104
119
  return <></>;
105
120
  } else if (isReadOnly(resolvedProperty)) {
@@ -111,16 +126,24 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
111
126
  } else {
112
127
  const propertyConfig = getFieldConfig(resolvedProperty, customizationController.propertyConfigs);
113
128
  if (!propertyConfig) {
114
- console.log("INTERNAL: Could not find field config for property", { propertyKey, resolvedProperty, fields: customizationController.propertyConfigs, propertyConfig });
129
+ console.log("INTERNAL: Could not find field config for property", {
130
+ propertyKey,
131
+ property,
132
+ resolvedProperty,
133
+ fields: customizationController.propertyConfigs,
134
+ propertyConfig
135
+ });
115
136
  throw new Error(`INTERNAL: Could not find field config for property ${propertyKey}`);
116
137
  }
117
138
  const configProperty = resolveProperty({
139
+ propertyKey,
118
140
  propertyOrBuilder: propertyConfig.property,
119
- propertyValue: fieldProps.field.value,
120
141
  values: fieldProps.form.values,
121
142
  path: context.path,
122
143
  entityId: context.entityId,
123
- fields: customizationController.propertyConfigs
144
+ propertyConfigs: customizationController.propertyConfigs,
145
+ index,
146
+ authController
124
147
  });
125
148
  Component = configProperty.Field as ComponentType<FieldProps<T>>;
126
149
  }
@@ -128,7 +151,9 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
128
151
  console.warn(`No field component found for property ${propertyKey}`);
129
152
  console.warn("Property:", property);
130
153
  return (
131
- <div>{`Currently the field ${resolvedProperty.dataType} is not supported`}</div>
154
+ <div className={"w-full"}>
155
+ {`Currently the field ${resolvedProperty.dataType} is not supported`}
156
+ </div>
132
157
  );
133
158
  }
134
159
 
@@ -139,23 +164,25 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
139
164
  underlyingValueHasChanged,
140
165
  context,
141
166
  disabled,
142
- tableMode,
143
167
  partOfArray,
144
168
  partOfBlock,
145
- autoFocus
169
+ minimalistView,
170
+ autoFocus,
171
+ size,
172
+ onPropertyChange
146
173
  };
147
174
 
148
175
  return <FieldInternal
149
176
  Component={Component as ComponentType<FieldProps>}
150
177
  componentProps={componentProps}
151
- fieldProps={fieldProps}/>;
178
+ formexFieldProps={fieldProps}/>;
152
179
  }}
153
180
  </Field>
154
181
  );
155
182
 
156
183
  }
157
184
 
158
- type ResolvedPropertyFieldBindingProps<T extends CMSType = CMSType, M extends Record<string, any> = Record<string, any>> =
185
+ type ResolvedPropertyFieldBindingProps<T extends CMSType = CMSType, M extends Record<string, any> = any> =
159
186
  Omit<PropertyFieldBindingProps<T, M>, "property">
160
187
  & {
161
188
  property: ResolvedProperty<T>
@@ -169,52 +196,59 @@ function FieldInternal<T extends CMSType, CustomProps, M extends Record<string,
169
196
  property,
170
197
  includeDescription,
171
198
  underlyingValueHasChanged,
172
- tableMode,
173
199
  partOfArray,
174
200
  partOfBlock,
201
+ minimalistView,
175
202
  autoFocus,
176
203
  context,
177
- disabled
204
+ disabled,
205
+ size,
206
+ onPropertyChange
178
207
  },
179
- fieldProps
208
+ formexFieldProps
180
209
  }:
181
- {
182
- Component: ComponentType<FieldProps<T, any, M>>,
183
- componentProps: ResolvedPropertyFieldBindingProps<T, M>,
184
- fieldProps: FormexFieldProps<T, any>
185
- }) {
210
+ {
211
+ Component: ComponentType<FieldProps<T, any, M>>,
212
+ componentProps: ResolvedPropertyFieldBindingProps<T, M>,
213
+ formexFieldProps: FormexFieldProps<T, any>
214
+ }) {
186
215
 
187
216
  const { plugins } = useCustomizationController();
188
217
 
189
218
  const customFieldProps: any = property.customProps;
190
- const value = fieldProps.field.value;
191
- // const initialValue = fieldProps.meta.initialValue;
192
- const error = getIn(fieldProps.form.errors, propertyKey);
193
- const touched = getIn(fieldProps.form.touched, propertyKey);
219
+ const value = formexFieldProps.field.value;
220
+ const error = getIn(formexFieldProps.form.errors, propertyKey);
221
+ const touched = getIn(formexFieldProps.form.touched, propertyKey);
194
222
 
195
223
  const showError: boolean = error &&
196
- (fieldProps.form.submitCount > 0 || property.validation?.unique) &&
224
+ (formexFieldProps.form.submitCount > 0 || property.validation?.unique) &&
197
225
  (!Array.isArray(error) || !!error.filter((e: any) => !!e).length);
198
226
 
199
- const WrappedComponent: ComponentType<FieldProps<T, any, M>> | null = useWrappedComponent(context.path, context.collection, propertyKey, property, Component, plugins);
227
+ const WrappedComponent: ComponentType<FieldProps<T, any, M>> | null = useWrappedComponent({
228
+ path: context.path,
229
+ collection: context.collection,
230
+ propertyKey: propertyKey,
231
+ property: property,
232
+ Component: Component,
233
+ plugins: plugins
234
+ });
200
235
  const UsedComponent: ComponentType<FieldProps<T>> = WrappedComponent ?? Component;
201
236
 
202
- const isSubmitting = fieldProps.form.isSubmitting;
237
+ const isSubmitting = formexFieldProps.form.isSubmitting;
203
238
 
204
239
  const setValue = useCallback((value: T | null, shouldValidate?: boolean) => {
205
- fieldProps.form.setFieldTouched(propertyKey, true, false);
206
- fieldProps.form.setFieldValue(propertyKey, value, shouldValidate);
240
+ formexFieldProps.form.setFieldTouched(propertyKey, true, false);
241
+ formexFieldProps.form.setFieldValue(propertyKey, value, shouldValidate);
207
242
  }, []);
208
243
 
209
244
  const setFieldValue = useCallback((otherPropertyKey: string, value: CMSType | null, shouldValidate?: boolean) => {
210
- fieldProps.form.setFieldTouched(propertyKey, true, false);
211
- fieldProps.form.setFieldValue(otherPropertyKey, value, shouldValidate);
245
+ formexFieldProps.form.setFieldTouched(propertyKey, true, false);
246
+ formexFieldProps.form.setFieldValue(otherPropertyKey, value, shouldValidate);
212
247
  }, []);
213
248
 
214
249
  const cmsFieldProps: FieldProps<T, CustomProps, M> = {
215
250
  propertyKey,
216
251
  value: value as T,
217
- // initialValue,
218
252
  setValue,
219
253
  setFieldValue,
220
254
  error,
@@ -225,12 +259,14 @@ function FieldInternal<T extends CMSType, CustomProps, M extends Record<string,
225
259
  property: property as ResolvedProperty<T>,
226
260
  disabled: disabled ?? false,
227
261
  underlyingValueHasChanged: underlyingValueHasChanged ?? false,
228
- tableMode: tableMode ?? false,
229
262
  partOfArray: partOfArray ?? false,
230
263
  partOfBlock: partOfBlock ?? false,
264
+ minimalistView: minimalistView ?? false,
231
265
  autoFocus: autoFocus ?? false,
232
266
  customProps: customFieldProps,
233
- context
267
+ context,
268
+ size,
269
+ onPropertyChange
234
270
  };
235
271
 
236
272
  return (
@@ -266,13 +302,24 @@ const shouldPropertyReRender = (property: PropertyOrBuilder | ResolvedProperty,
266
302
  }
267
303
  }
268
304
 
269
- function useWrappedComponent<T extends CMSType = CMSType, M extends Record<string, any> = any>(
270
- path: string,
271
- collection: EntityCollection<M>,
305
+ interface UseWrappedComponentParams<T extends CMSType = CMSType, M extends Record<string, any> = any> {
306
+ path?: string,
307
+ collection?: ResolvedEntityCollection<M>,
272
308
  propertyKey: string,
273
309
  property: ResolvedProperty<T>,
274
310
  Component: ComponentType<FieldProps<T, any, M>>,
275
311
  plugins?: FireCMSPlugin[]
312
+ }
313
+
314
+ function useWrappedComponent<T extends CMSType = CMSType, M extends Record<string, any> = any>(
315
+ {
316
+ path,
317
+ collection,
318
+ propertyKey,
319
+ property,
320
+ Component,
321
+ plugins
322
+ }: UseWrappedComponentParams<T, M>
276
323
  ): ComponentType<FieldProps<T, any, M>> | null {
277
324
 
278
325
  const wrapperRef = useRef<ComponentType<FieldProps<T, any, M>> | null>((() => {
@@ -288,7 +335,7 @@ function useWrappedComponent<T extends CMSType = CMSType, M extends Record<strin
288
335
  Field: Component,
289
336
  plugin,
290
337
  path,
291
- collection
338
+ collection,
292
339
  };
293
340
  const enabled = plugin.form?.fieldBuilderEnabled?.(params);
294
341
  if (enabled === undefined || enabled)
@@ -68,7 +68,8 @@ export function CustomIdField<M extends Record<string, any>>({
68
68
  ? (
69
69
  <>
70
70
 
71
- <Tooltip title={"Copy"}>
71
+ <Tooltip title={"Copy"}
72
+ asChild={true}>
72
73
  <IconButton onClick={(e) => copy(entity.id)}
73
74
  aria-label="copy-id">
74
75
  <ContentCopyIcon size={"small"}/>
@@ -76,7 +77,8 @@ export function CustomIdField<M extends Record<string, any>>({
76
77
  </Tooltip>
77
78
 
78
79
  {customizationController?.entityLinkBuilder &&
79
- <Tooltip title={"Open in the console"}>
80
+ <Tooltip title={"Open in the console"}
81
+ asChild={true}>
80
82
  <IconButton component={"a"}
81
83
  href={customizationController.entityLinkBuilder({ entity })}
82
84
  rel="noopener noreferrer"
@@ -98,8 +100,12 @@ export function CustomIdField<M extends Record<string, any>>({
98
100
 
99
101
  {enumValues &&
100
102
  <Select
103
+ size={"large"}
101
104
  error={error}
102
- onValueChange={(v) => onChange(v as string)}
105
+ fullWidth={true}
106
+ onValueChange={(v) => {
107
+ onChange(v as string);
108
+ }}
103
109
  {...fieldProps}
104
110
  renderValue={(option) => {
105
111
  const enumConfig = enumValues.find(e => e.id === option);
@@ -1,51 +1,44 @@
1
- import React, { useEffect } from "react";
1
+ import React, { useEffect, useRef } from "react";
2
2
  import { useFormex } from "@firecms/formex";
3
3
 
4
4
  export const ErrorFocus = ({ containerRef }:
5
5
  {
6
6
  containerRef?: React.RefObject<HTMLDivElement>
7
7
  }) => {
8
- const { isSubmitting, isValidating, errors } = useFormex();
8
+ const {
9
+ isValidating,
10
+ errors,
11
+ version
12
+ } = useFormex();
13
+
14
+ const prevVersion = useRef(version);
9
15
 
10
16
  useEffect(() => {
17
+
18
+ if (version === prevVersion.current) {
19
+ return;
20
+ }
21
+
11
22
  const keys = Object.keys(errors);
12
23
 
13
- // Whenever there are errors and the form is submitting but finished validating.
14
- if (keys.length > 0 && isSubmitting && !isValidating) {
24
+ // Whenever there are errors and the form has been submitted and is not validating
25
+ if (!isValidating && keys.length > 0) {
15
26
  const errorElement = containerRef?.current?.querySelector<HTMLDivElement>(
16
27
  `#form_field_${keys[0]}`
17
28
  );
18
29
 
19
- if (errorElement && containerRef?.current) {
20
- const scrollableParent = getScrollableParent(containerRef.current);
21
- if (scrollableParent) {
22
- const top = errorElement.getBoundingClientRect().top;
23
- scrollableParent.scrollTo({
24
- top: scrollableParent.scrollTop + top - 196,
25
- behavior: "smooth"
26
- });
27
- }
30
+ if (errorElement) {
31
+ errorElement.scrollIntoView({
32
+ behavior: "smooth",
33
+ block: "center"
34
+ });
28
35
  const input = errorElement.querySelector("input");
29
36
  if (input) input.focus();
30
37
  }
38
+ prevVersion.current = version;
31
39
  }
32
- }, [isSubmitting, isValidating, errors, containerRef]);
40
+ }, [isValidating, errors, containerRef, version]);
33
41
 
34
42
  // This component does not render anything by itself.
35
43
  return null;
36
44
  };
37
-
38
- const isScrollable = (ele: HTMLElement | null) => {
39
- const hasScrollableContent = ele && ele.scrollHeight > ele.clientHeight;
40
-
41
- const overflowYStyle = ele ? window.getComputedStyle(ele).overflowY : null;
42
- const isOverflowHidden = overflowYStyle && overflowYStyle.indexOf("hidden") !== -1;
43
-
44
- return hasScrollableContent && !isOverflowHidden;
45
- };
46
-
47
- const getScrollableParent = (ele: HTMLElement | null): HTMLElement | null => {
48
- return (!ele || ele === document.body)
49
- ? document.body
50
- : (isScrollable(ele) ? ele : getScrollableParent(ele.parentNode as HTMLElement));
51
- };
@@ -1,4 +1,4 @@
1
- import { ResolvedProperty } from "../../types";
1
+ import { Property, ResolvedProperty } from "../../types";
2
2
  import { IconButton, InfoIcon, Tooltip, Typography } from "@firecms/ui";
3
3
 
4
4
  /**
@@ -13,8 +13,8 @@ export function FieldHelperText({
13
13
  disabled
14
14
  }: {
15
15
  error?: string,
16
- showError: boolean,
17
- property: ResolvedProperty,
16
+ showError?: boolean,
17
+ property: ResolvedProperty | Property,
18
18
  includeDescription?: boolean,
19
19
  disabled?: boolean,
20
20
  }
@@ -44,7 +44,7 @@ export function FieldHelperText({
44
44
  {property.longDescription &&
45
45
  <Tooltip title={property.longDescription}
46
46
  side="bottom"
47
- >
47
+ asChild={true}>
48
48
  <IconButton
49
49
  size={"small"}
50
50
  className="self-start">
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ import { ErrorBoundary } from "../../components";
3
+
4
+ export function FormEntry({
5
+ propertyKey,
6
+ widthPercentage = 100,
7
+ children
8
+ }: {
9
+ propertyKey: string;
10
+ widthPercentage?: number;
11
+ children: React.ReactNode;
12
+ }) {
13
+ return (
14
+ <div id={`form_field_${propertyKey}`}
15
+ className={"relative"}
16
+ style={{ width: widthPercentage === 100 ? "100%" : `calc(${widthPercentage}% - 8px)` }}>
17
+ <ErrorBoundary>
18
+ {children}
19
+ </ErrorBoundary>
20
+ </div>
21
+ );
22
+ }