@firecms/core 3.0.0-canary.98 → 3.0.0-rc.1

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 (349) hide show
  1. package/README.md +2 -2
  2. package/dist/app/Drawer.d.ts +0 -1
  3. package/dist/app/Scaffold.d.ts +4 -0
  4. package/dist/components/ArrayContainer.d.ts +31 -12
  5. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  6. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +3 -1
  7. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  8. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +17 -3
  9. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +1 -1
  10. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  11. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +6 -3
  12. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +8 -0
  13. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  14. package/dist/components/EntityJsonPreview.d.ts +3 -0
  15. package/dist/components/EntityPreview.d.ts +8 -6
  16. package/dist/components/HomePage/DefaultHomePage.d.ts +2 -15
  17. package/dist/components/HomePage/HomePageDnD.d.ts +76 -0
  18. package/dist/components/HomePage/NavigationCard.d.ts +3 -1
  19. package/dist/components/HomePage/NavigationCardBinding.d.ts +3 -2
  20. package/dist/components/HomePage/NavigationGroup.d.ts +8 -1
  21. package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
  22. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  23. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  24. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  25. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +1 -1
  26. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  27. package/dist/components/VirtualTable/VirtualTableProps.d.ts +11 -2
  28. package/dist/components/common/default_entity_actions.d.ts +0 -2
  29. package/dist/components/common/index.d.ts +1 -1
  30. package/dist/components/common/useColumnsIds.d.ts +1 -0
  31. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +10 -2
  32. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  33. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  34. package/dist/components/index.d.ts +3 -1
  35. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  36. package/dist/core/DefaultAppBar.d.ts +8 -2
  37. package/dist/core/DrawerNavigationItem.d.ts +2 -1
  38. package/dist/core/EntityEditView.d.ts +40 -22
  39. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  40. package/dist/core/FireCMS.d.ts +2 -2
  41. package/dist/core/FireCMSRouter.d.ts +4 -0
  42. package/dist/core/NavigationRoutes.d.ts +0 -1
  43. package/dist/core/SideDialogs.d.ts +4 -2
  44. package/dist/core/field_configs.d.ts +1 -1
  45. package/dist/core/index.d.ts +2 -1
  46. package/dist/form/EntityForm.d.ts +50 -0
  47. package/dist/form/EntityFormActions.d.ts +21 -0
  48. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  49. package/dist/form/components/FormEntry.d.ts +6 -0
  50. package/dist/form/components/FormLayout.d.ts +5 -0
  51. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  52. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  53. package/dist/form/components/index.d.ts +3 -1
  54. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  55. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  56. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  57. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  58. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  59. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  60. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  61. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  62. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  63. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  64. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  65. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  66. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +4 -10
  67. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  68. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  69. package/dist/form/index.d.ts +17 -16
  70. package/dist/form/useClearRestoreValue.d.ts +2 -2
  71. package/dist/hooks/data/delete.d.ts +4 -4
  72. package/dist/hooks/data/save.d.ts +3 -3
  73. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  74. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  75. package/dist/hooks/useAuthController.d.ts +1 -1
  76. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  77. package/dist/hooks/useBuildNavigationController.d.ts +57 -12
  78. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  79. package/dist/hooks/useModeController.d.ts +1 -2
  80. package/dist/hooks/useProjectLog.d.ts +7 -1
  81. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  82. package/dist/hooks/useValidateAuthenticator.d.ts +3 -3
  83. package/dist/index.es.js +20108 -14471
  84. package/dist/index.es.js.map +1 -1
  85. package/dist/index.umd.js +20039 -14407
  86. package/dist/index.umd.js.map +1 -1
  87. package/dist/internal/useBuildDataSource.d.ts +3 -2
  88. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  89. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  90. package/dist/preview/PropertyPreviewProps.d.ts +1 -1
  91. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  92. package/dist/preview/components/ReferencePreview.d.ts +2 -2
  93. package/dist/preview/util.d.ts +3 -3
  94. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  95. package/dist/routes/FireCMSRoute.d.ts +1 -0
  96. package/dist/routes/HomePageRoute.d.ts +3 -0
  97. package/dist/types/analytics.d.ts +1 -1
  98. package/dist/types/auth.d.ts +7 -9
  99. package/dist/types/collections.d.ts +86 -25
  100. package/dist/types/customization_controller.d.ts +8 -0
  101. package/dist/types/datasource.d.ts +19 -17
  102. package/dist/types/dialogs_controller.d.ts +7 -3
  103. package/dist/types/entities.d.ts +2 -1
  104. package/dist/types/entity_actions.d.ts +58 -8
  105. package/dist/types/entity_callbacks.d.ts +16 -16
  106. package/dist/types/entity_overrides.d.ts +2 -2
  107. package/dist/types/export_import.d.ts +4 -4
  108. package/dist/types/fields.d.ts +43 -17
  109. package/dist/types/firecms.d.ts +16 -3
  110. package/dist/types/firecms_context.d.ts +1 -1
  111. package/dist/types/navigation.d.ts +60 -17
  112. package/dist/types/permissions.d.ts +4 -4
  113. package/dist/types/plugins.d.ts +42 -9
  114. package/dist/types/properties.d.ts +65 -22
  115. package/dist/types/property_config.d.ts +1 -3
  116. package/dist/types/roles.d.ts +3 -0
  117. package/dist/types/side_dialogs_controller.d.ts +10 -0
  118. package/dist/types/side_entity_controller.d.ts +14 -1
  119. package/dist/types/storage.d.ts +75 -0
  120. package/dist/types/user.d.ts +1 -0
  121. package/dist/util/builders.d.ts +3 -3
  122. package/dist/util/callbacks.d.ts +2 -0
  123. package/dist/util/createFormexStub.d.ts +2 -0
  124. package/dist/util/entities.d.ts +2 -2
  125. package/dist/util/entity_actions.d.ts +2 -0
  126. package/dist/util/entity_cache.d.ts +23 -0
  127. package/dist/util/icon_synonyms.d.ts +0 -1
  128. package/dist/util/icons.d.ts +5 -2
  129. package/dist/util/index.d.ts +3 -0
  130. package/dist/util/navigation_from_path.d.ts +10 -1
  131. package/dist/util/navigation_utils.d.ts +13 -1
  132. package/dist/util/objects.d.ts +2 -1
  133. package/dist/util/permissions.d.ts +4 -4
  134. package/dist/util/property_utils.d.ts +4 -4
  135. package/dist/util/references.d.ts +2 -2
  136. package/dist/util/resolutions.d.ts +30 -6
  137. package/dist/util/storage.d.ts +1 -1
  138. package/dist/util/useStorageUploadController.d.ts +2 -2
  139. package/package.json +133 -125
  140. package/src/app/Drawer.tsx +0 -1
  141. package/src/app/Scaffold.tsx +33 -29
  142. package/src/components/ArrayContainer.tsx +447 -229
  143. package/src/components/CircularProgressCenter.tsx +1 -1
  144. package/src/components/ClearFilterSortButton.tsx +1 -1
  145. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
  146. package/src/components/DeleteEntityDialog.tsx +13 -20
  147. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -25
  148. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +23 -17
  149. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +20 -3
  150. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +35 -9
  151. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +21 -16
  152. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +6 -12
  153. package/src/components/EntityCollectionTable/index.tsx +1 -1
  154. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +6 -6
  155. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +35 -26
  156. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  157. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +132 -101
  158. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
  159. package/src/components/EntityCollectionView/EntityCollectionView.tsx +178 -85
  160. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
  161. package/src/components/EntityCollectionView/useSelectionController.tsx +5 -4
  162. package/src/components/EntityCollectionView/utils.ts +19 -0
  163. package/src/components/EntityJsonPreview.tsx +66 -0
  164. package/src/components/EntityPreview.tsx +75 -57
  165. package/src/components/EntityView.tsx +8 -5
  166. package/src/components/ErrorView.tsx +3 -3
  167. package/src/components/FireCMSLogo.tsx +7 -51
  168. package/src/components/HomePage/DefaultHomePage.tsx +522 -160
  169. package/src/components/HomePage/FavouritesView.tsx +9 -14
  170. package/src/components/HomePage/HomePageDnD.tsx +642 -0
  171. package/src/components/HomePage/NavigationCard.tsx +47 -38
  172. package/src/components/HomePage/NavigationCardBinding.tsx +16 -15
  173. package/src/components/HomePage/NavigationGroup.tsx +144 -30
  174. package/src/components/HomePage/RenameGroupDialog.tsx +117 -0
  175. package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
  176. package/src/components/NotFoundPage.tsx +2 -2
  177. package/src/components/PropertyConfigBadge.tsx +9 -3
  178. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  179. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +22 -13
  180. package/src/components/SearchIconsView.tsx +2 -2
  181. package/src/components/SelectableTable/SelectableTable.tsx +154 -142
  182. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +4 -2
  183. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +10 -8
  184. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +59 -10
  185. package/src/components/UnsavedChangesDialog.tsx +46 -0
  186. package/src/components/VirtualTable/VirtualTable.tsx +65 -44
  187. package/src/components/VirtualTable/VirtualTableCell.tsx +0 -8
  188. package/src/components/VirtualTable/VirtualTableHeader.tsx +8 -8
  189. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +1 -1
  190. package/src/components/VirtualTable/VirtualTableProps.tsx +12 -2
  191. package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
  192. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
  193. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
  194. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  195. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  196. package/src/components/common/default_entity_actions.tsx +62 -42
  197. package/src/components/common/index.ts +1 -1
  198. package/src/components/common/useColumnsIds.tsx +1 -1
  199. package/src/components/common/useDataSourceTableController.tsx +420 -0
  200. package/src/components/common/useDebouncedCallback.tsx +20 -0
  201. package/src/components/common/useScrollRestoration.tsx +68 -0
  202. package/src/components/common/useTableSearchHelper.ts +1 -0
  203. package/src/components/index.tsx +4 -1
  204. package/src/contexts/BreacrumbsContext.tsx +38 -0
  205. package/src/contexts/DialogsProvider.tsx +3 -2
  206. package/src/contexts/ModeController.tsx +1 -3
  207. package/src/contexts/SnackbarProvider.tsx +2 -0
  208. package/src/core/DefaultAppBar.tsx +124 -85
  209. package/src/core/DefaultDrawer.tsx +30 -22
  210. package/src/core/DrawerNavigationItem.tsx +32 -28
  211. package/src/core/EntityEditView.tsx +388 -995
  212. package/src/core/EntityEditViewFormActions.tsx +329 -0
  213. package/src/core/EntitySidePanel.tsx +88 -20
  214. package/src/core/FireCMS.tsx +46 -25
  215. package/src/core/FireCMSRouter.tsx +17 -0
  216. package/src/core/NavigationRoutes.tsx +23 -32
  217. package/src/core/SideDialogs.tsx +22 -12
  218. package/src/core/field_configs.tsx +24 -10
  219. package/src/core/index.tsx +4 -2
  220. package/src/form/EntityForm.tsx +814 -0
  221. package/src/form/EntityFormActions.tsx +211 -0
  222. package/src/form/PropertyFieldBinding.tsx +55 -41
  223. package/src/form/components/CustomIdField.tsx +9 -3
  224. package/src/form/components/FieldHelperText.tsx +1 -1
  225. package/src/form/components/FormEntry.tsx +22 -0
  226. package/src/form/components/FormLayout.tsx +16 -0
  227. package/src/form/components/LabelWithIcon.tsx +30 -19
  228. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  229. package/src/form/components/StorageItemPreview.tsx +5 -4
  230. package/src/form/components/StorageUploadProgress.tsx +2 -3
  231. package/src/form/components/index.tsx +3 -1
  232. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +30 -18
  233. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -36
  234. package/src/form/field_bindings/BlockFieldBinding.tsx +55 -33
  235. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  236. package/src/form/field_bindings/KeyValueFieldBinding.tsx +19 -15
  237. package/src/form/field_bindings/MapFieldBinding.tsx +72 -62
  238. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
  239. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
  240. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +10 -8
  241. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  242. package/src/form/field_bindings/ReferenceFieldBinding.tsx +28 -19
  243. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -32
  244. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -13
  245. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +247 -168
  246. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  247. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  248. package/src/form/index.tsx +17 -37
  249. package/src/form/useClearRestoreValue.tsx +2 -2
  250. package/src/form/validation.ts +12 -6
  251. package/src/hooks/data/delete.ts +6 -5
  252. package/src/hooks/data/save.ts +26 -35
  253. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  254. package/src/hooks/data/useDataSource.tsx +10 -2
  255. package/src/hooks/data/useEntityFetch.tsx +10 -6
  256. package/src/hooks/useAuthController.tsx +1 -1
  257. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  258. package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
  259. package/src/hooks/useBuildModeController.tsx +15 -28
  260. package/src/hooks/useBuildNavigationController.tsx +386 -124
  261. package/src/hooks/useFireCMSContext.tsx +3 -33
  262. package/src/hooks/useLargeLayout.tsx +0 -35
  263. package/src/hooks/useModeController.tsx +1 -2
  264. package/src/hooks/useProjectLog.tsx +16 -5
  265. package/src/hooks/useResolvedNavigationFrom.tsx +9 -11
  266. package/src/hooks/useValidateAuthenticator.tsx +3 -3
  267. package/src/internal/useBuildDataSource.ts +67 -80
  268. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  269. package/src/internal/useBuildSideEntityController.tsx +149 -86
  270. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  271. package/src/preview/PropertyPreview.tsx +28 -12
  272. package/src/preview/PropertyPreviewProps.tsx +1 -1
  273. package/src/preview/components/BooleanPreview.tsx +1 -1
  274. package/src/preview/components/EmptyValue.tsx +1 -1
  275. package/src/preview/components/EnumValuesChip.tsx +1 -1
  276. package/src/preview/components/ImagePreview.tsx +10 -9
  277. package/src/preview/components/ReferencePreview.tsx +6 -16
  278. package/src/preview/components/UrlComponentPreview.tsx +20 -21
  279. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -5
  280. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -4
  281. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -3
  282. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -3
  283. package/src/preview/property_previews/ArrayOneOfPreview.tsx +6 -4
  284. package/src/preview/property_previews/ArrayPropertyPreview.tsx +5 -3
  285. package/src/preview/property_previews/MapPropertyPreview.tsx +7 -6
  286. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  287. package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
  288. package/src/preview/util.ts +10 -10
  289. package/src/routes/CustomCMSRoute.tsx +21 -0
  290. package/src/routes/FireCMSRoute.tsx +246 -0
  291. package/src/routes/HomePageRoute.tsx +17 -0
  292. package/src/types/analytics.ts +3 -0
  293. package/src/types/auth.tsx +8 -12
  294. package/src/types/collections.ts +101 -28
  295. package/src/types/customization_controller.tsx +9 -0
  296. package/src/types/datasource.ts +21 -20
  297. package/src/types/dialogs_controller.tsx +7 -3
  298. package/src/types/entities.ts +3 -1
  299. package/src/types/entity_actions.tsx +71 -8
  300. package/src/types/entity_callbacks.ts +18 -18
  301. package/src/types/entity_overrides.tsx +2 -2
  302. package/src/types/export_import.ts +4 -4
  303. package/src/types/fields.tsx +52 -19
  304. package/src/types/firecms.tsx +18 -4
  305. package/src/types/firecms_context.tsx +1 -1
  306. package/src/types/navigation.ts +76 -22
  307. package/src/types/permissions.ts +5 -5
  308. package/src/types/plugins.tsx +50 -9
  309. package/src/types/properties.ts +74 -22
  310. package/src/types/property_config.tsx +1 -2
  311. package/src/types/roles.ts +3 -0
  312. package/src/types/side_dialogs_controller.tsx +15 -0
  313. package/src/types/side_entity_controller.tsx +16 -1
  314. package/src/types/storage.ts +82 -0
  315. package/src/types/user.ts +2 -0
  316. package/src/util/builders.ts +10 -8
  317. package/src/util/callbacks.ts +119 -0
  318. package/src/util/createFormexStub.tsx +62 -0
  319. package/src/util/entities.ts +5 -3
  320. package/src/util/entity_actions.ts +28 -0
  321. package/src/util/entity_cache.ts +204 -0
  322. package/src/util/icon_list.ts +1 -1
  323. package/src/util/icon_synonyms.ts +0 -1
  324. package/src/util/icons.tsx +36 -11
  325. package/src/util/index.ts +3 -0
  326. package/src/util/join_collections.ts +9 -2
  327. package/src/util/make_properties_editable.ts +13 -5
  328. package/src/util/navigation_from_path.ts +33 -12
  329. package/src/util/navigation_utils.ts +135 -19
  330. package/src/util/objects.ts +74 -14
  331. package/src/util/parent_references_from_path.ts +3 -3
  332. package/src/util/permissions.ts +8 -8
  333. package/src/util/property_utils.tsx +17 -6
  334. package/src/util/references.ts +19 -8
  335. package/src/util/resolutions.ts +93 -24
  336. package/src/util/storage.ts +6 -2
  337. package/src/util/useStorageUploadController.tsx +74 -29
  338. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
  339. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  340. package/dist/form/PropertiesForm.d.ts +0 -8
  341. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  342. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  343. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
  344. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -27
  345. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -236
  346. package/src/form/PropertiesForm.tsx +0 -81
  347. package/src/form/components/FormikArrayContainer.tsx +0 -44
  348. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  349. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -0,0 +1,329 @@
1
+ import React, { useMemo } from "react";
2
+ import {
3
+ Entity,
4
+ EntityAction,
5
+ EntityActionClickProps,
6
+ FireCMSContext,
7
+ FormContext,
8
+ ResolvedEntityCollection,
9
+ SideEntityController
10
+ } from "../types";
11
+
12
+ import { copyEntityAction, deleteEntityAction } from "../components";
13
+ import { canCreateEntity, canDeleteEntity, mergeEntityActions, resolveEntityAction } from "../util";
14
+ import {
15
+ Button,
16
+ CircularProgress,
17
+ cls,
18
+ defaultBorderMixin,
19
+ DialogActions,
20
+ IconButton,
21
+ LoadingButton,
22
+ Tooltip,
23
+ Typography
24
+ } from "@firecms/ui";
25
+ import {
26
+ useAuthController,
27
+ useCustomizationController,
28
+ useFireCMSContext,
29
+ useSideEntityController,
30
+ useSnackbarController
31
+ } from "../hooks";
32
+ import { EntityFormActionsProps } from "../form/EntityFormActions";
33
+ import { SideDialogController, useSideDialogContext } from "./SideDialogs";
34
+
35
+ export function EntityEditViewFormActions({
36
+ collection,
37
+ path,
38
+ entity,
39
+ layout,
40
+ savingError,
41
+ formex,
42
+ disabled,
43
+ status,
44
+ pluginActions,
45
+ openEntityMode,
46
+ showDefaultActions = true,
47
+ navigateBack,
48
+ formContext
49
+ }: EntityFormActionsProps) {
50
+
51
+ const authController = useAuthController();
52
+ const context = useFireCMSContext();
53
+ const sideEntityController = useSideEntityController();
54
+ const sideDialogContext = useSideDialogContext();
55
+ const customizationController = useCustomizationController();
56
+
57
+ const entityActions = useMemo((): EntityAction[] => {
58
+ const customEntityActions = (collection.entityActions ?? [])
59
+ .map(action => resolveEntityAction(action, customizationController.entityActions))
60
+ .filter(Boolean) as EntityAction[];
61
+ const createEnabled = canCreateEntity(collection, authController, path, null);
62
+ const deleteEnabled = entity ? canDeleteEntity(collection, authController, path, entity) : false;
63
+ const actions: EntityAction[] = [];
64
+ if (createEnabled)
65
+ actions.push(copyEntityAction);
66
+ if (deleteEnabled)
67
+ actions.push(deleteEntityAction);
68
+ if (customEntityActions)
69
+ return mergeEntityActions(actions, customEntityActions);
70
+ return actions;
71
+ }, [authController, collection, path, customizationController.entityActions?.length]);
72
+
73
+ const formActions = showDefaultActions ? entityActions.filter(a => a.includeInForm === undefined || a.includeInForm) : [];
74
+
75
+ return layout === "bottom"
76
+ ? buildBottomActions({
77
+ savingError,
78
+ entity,
79
+ formActions,
80
+ collection,
81
+ context,
82
+ sideEntityController,
83
+ isSubmitting: formex.isSubmitting,
84
+ disabled,
85
+ status,
86
+ sideDialogContext,
87
+ pluginActions,
88
+ openEntityMode,
89
+ navigateBack,
90
+ formContext
91
+ })
92
+ : buildSideActions({
93
+ savingError,
94
+ entity,
95
+ formActions,
96
+ collection,
97
+ context,
98
+ sideEntityController,
99
+ isSubmitting: formex.isSubmitting,
100
+ sideDialogContext,
101
+ disabled,
102
+ status,
103
+ pluginActions,
104
+ openEntityMode,
105
+ navigateBack,
106
+ formContext
107
+ });
108
+ }
109
+
110
+ type ActionsViewProps<M extends object> = {
111
+ savingError: Error | undefined,
112
+ entity: Entity<M> | undefined,
113
+ formActions: EntityAction[],
114
+ collection: ResolvedEntityCollection,
115
+ context: FireCMSContext,
116
+ sideEntityController: SideEntityController,
117
+ isSubmitting: boolean,
118
+ disabled: boolean,
119
+ status: "new" | "existing" | "copy",
120
+ sideDialogContext: SideDialogController,
121
+ pluginActions?: React.ReactNode[],
122
+ openEntityMode: "side_panel" | "full_screen";
123
+ navigateBack: () => void;
124
+ formContext: FormContext
125
+ };
126
+
127
+ function buildBottomActions<M extends object>({
128
+ savingError,
129
+ entity,
130
+ formActions,
131
+ collection,
132
+ context,
133
+ sideEntityController,
134
+ isSubmitting,
135
+ disabled,
136
+ status,
137
+ sideDialogContext,
138
+ pluginActions,
139
+ openEntityMode,
140
+ navigateBack,
141
+ formContext
142
+ }: ActionsViewProps<M>) {
143
+
144
+ const canClose = openEntityMode === "side_panel";
145
+ return <DialogActions
146
+ position={"absolute"}>
147
+ {savingError &&
148
+ <div className="text-right">
149
+ <Typography color={"error"}>{savingError.message}</Typography>
150
+ </div>
151
+ }
152
+
153
+ {formActions.length > 0 && <div className="flex-grow flex overflow-auto no-scrollbar">
154
+ {formActions.map(action => {
155
+
156
+ const props = {
157
+ view: "form",
158
+ entity,
159
+ fullPath: collection.path,
160
+ collection: collection,
161
+ context,
162
+ sideEntityController,
163
+ openEntityMode,
164
+ navigateBack,
165
+ formContext
166
+ } satisfies EntityActionClickProps<any>;
167
+
168
+ const isEnabled = !action.isEnabled || action.isEnabled(props);
169
+ return (
170
+ <EntityActionButton
171
+ key={action.key}
172
+ action={action}
173
+ enabled={isEnabled}
174
+ props={props}
175
+ />
176
+ );
177
+ })}
178
+ </div>}
179
+
180
+ {pluginActions}
181
+
182
+ <Button variant="text"
183
+ color="primary"
184
+ disabled={disabled || isSubmitting}
185
+ type="reset">
186
+ {status === "existing" ? "Discard" : "Clear"}
187
+ </Button>
188
+ <Button variant={canClose ? "text" : "filled"}
189
+ color="primary"
190
+ type="submit"
191
+ disabled={disabled || isSubmitting}
192
+ onClick={() => {
193
+ sideDialogContext.setPendingClose(false);
194
+ }}>
195
+ {status === "existing" && "Save"}
196
+ {status === "copy" && "Create copy"}
197
+ {status === "new" && "Create"}
198
+ </Button>
199
+ {canClose && <LoadingButton variant="filled"
200
+ color="primary"
201
+ type="submit"
202
+ loading={isSubmitting}
203
+ disabled={disabled}
204
+ onClick={() => {
205
+ sideDialogContext.setPendingClose?.(true);
206
+ }}>
207
+ {status === "existing" && "Save and close"}
208
+ {status === "copy" && "Create copy and close"}
209
+ {status === "new" && "Create and close"}
210
+ </LoadingButton>}
211
+ </DialogActions>;
212
+ }
213
+
214
+ function buildSideActions<M extends object>({
215
+ savingError,
216
+ entity,
217
+ formActions,
218
+ collection,
219
+ context,
220
+ sideEntityController,
221
+ isSubmitting,
222
+ disabled,
223
+ status,
224
+ sideDialogContext,
225
+ pluginActions,
226
+ openEntityMode,
227
+ navigateBack,
228
+ formContext
229
+ }: ActionsViewProps<M>) {
230
+
231
+ return <div
232
+ 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)}>
233
+ <LoadingButton fullWidth={true} variant="filled" color="primary" type="submit" size={"large"}
234
+ disabled={disabled || isSubmitting} onClick={() => {
235
+ sideDialogContext.setPendingClose?.(false);
236
+ }}>
237
+ {status === "existing" && "Save"}
238
+ {status === "copy" && "Create copy"}
239
+ {status === "new" && "Create"}
240
+ </LoadingButton>
241
+
242
+ <Button fullWidth={true} variant="text" disabled={disabled || isSubmitting} type="reset">
243
+ {status === "existing" ? "Discard" : "Clear"}
244
+ </Button>
245
+
246
+ {pluginActions}
247
+
248
+ {formActions.length > 0 && <div className="flex flex-row flex-wrap mt-2">
249
+ {formActions.map(action => {
250
+ const props = {
251
+ view: "form",
252
+ entity,
253
+ fullPath: collection.path,
254
+ collection: collection,
255
+ context,
256
+ sideEntityController,
257
+ openEntityMode,
258
+ navigateBack,
259
+ formContext
260
+ } satisfies EntityActionClickProps<any>;
261
+ const isEnabled = !action.isEnabled || action.isEnabled(props);
262
+ return (
263
+ <EntityActionButton key={action.key} action={action} enabled={isEnabled} props={props}/>
264
+ );
265
+ })}
266
+ </div>}
267
+
268
+ {savingError &&
269
+ <div className="text-right">
270
+ <Typography color={"error"}>{savingError.message}</Typography>
271
+ </div>
272
+ }
273
+ </div>;
274
+ }
275
+
276
+ function EntityActionButton({
277
+ action,
278
+ enabled,
279
+ props
280
+ }: {
281
+ action: EntityAction,
282
+ enabled: boolean,
283
+ props: EntityActionClickProps<any, any>
284
+ }) {
285
+ const snackbarController = useSnackbarController();
286
+ const [loading, setLoading] = React.useState(false);
287
+ return <Tooltip
288
+ title={action.name}>
289
+ <IconButton
290
+ color="primary"
291
+ disabled={!enabled}
292
+ onClick={(event) => {
293
+ console.debug("Executing action", action.key, props);
294
+ try {
295
+ event.stopPropagation();
296
+ if (props.entity) {
297
+ const onClick = action.onClick(props);
298
+ // If the action returns a promise, we can handle it
299
+ if (onClick instanceof Promise) {
300
+ setLoading(true);
301
+ onClick
302
+ .catch((error) => {
303
+ console.error("Error executing action", action.key, error);
304
+ snackbarController.open({
305
+ message: `Error executing action: ${error.message}`,
306
+ type: "error"
307
+ })
308
+ })
309
+ .finally(() => setLoading(false));
310
+ } else {
311
+ snackbarController.open({
312
+ message: `Action ${action.name} executed successfully`,
313
+ type: "success"
314
+ });
315
+ }
316
+
317
+ }
318
+ } catch (e: any) {
319
+ console.error("Error executing action", action.key, e);
320
+ snackbarController.open({
321
+ message: `Error executing action: ${e.message}`,
322
+ type: "error"
323
+ });
324
+ }
325
+ }}>
326
+ {loading ? <CircularProgress size={"smallest"}/> : action.icon}
327
+ </IconButton>
328
+ </Tooltip>;
329
+ }
@@ -1,11 +1,13 @@
1
1
  import React, { useCallback, useEffect, useMemo } from "react";
2
2
 
3
3
  import { EntitySidePanelProps } from "../types";
4
- import { useNavigationController } from "../hooks";
4
+ import { useNavigationController, useSideEntityController } from "../hooks";
5
5
 
6
6
  import { ErrorBoundary } from "../components";
7
- import { EntityEditView } from "./EntityEditView";
7
+ import { EntityEditView, OnUpdateParams } from "./EntityEditView";
8
8
  import { useSideDialogContext } from "./SideDialogs";
9
+ import { CloseIcon, IconButton, OpenInFullIcon } from "@firecms/ui";
10
+ import { useLocation, useNavigate } from "react-router-dom";
9
11
 
10
12
  /**
11
13
  * This is the component in charge of rendering the side dialog used
@@ -17,33 +19,64 @@ import { useSideDialogContext } from "./SideDialogs";
17
19
  */
18
20
  export function EntitySidePanel(props: EntitySidePanelProps) {
19
21
 
22
+ const {
23
+ allowFullScreen = true,
24
+ path,
25
+ entityId,
26
+ fullIdPath,
27
+ formProps,
28
+ } = props;
29
+
20
30
  const {
21
31
  blocked,
22
32
  setBlocked,
23
- setBlockedNavigationMessage
33
+ setBlockedNavigationMessage,
34
+ close,
24
35
  } = useSideDialogContext();
25
36
 
37
+ const navigate = useNavigate();
38
+ const location = useLocation();
39
+
40
+ const sideEntityController = useSideEntityController();
26
41
  const navigationController = useNavigationController();
42
+ const sideDialogsController = useSideDialogContext();
27
43
 
28
- const parentCollectionIds = useMemo(() => {
29
- return navigationController.getParentCollectionIds(props.path);
30
- }, [navigationController, props.path]);
44
+ const onClose = () => {
45
+ if (props.onClose) {
46
+ props.onClose();
47
+ }
31
48
 
32
- const collection = useMemo(() => {
33
- if (!props) return undefined;
34
- let usedCollection = props.collection;
49
+ setBlocked(false);
50
+ close(true);
51
+ }
35
52
 
36
- const registryCollection = navigationController.getCollection(props.path);
37
- if (registryCollection) {
38
- usedCollection = registryCollection;
53
+ const onUpdate = (params: OnUpdateParams) => {
54
+ if (props.onUpdate) {
55
+ props.onUpdate(params);
56
+ }
57
+ if (params.status !== "existing") {
58
+ sideEntityController.replace({
59
+ path: params.path,
60
+ entityId: params.entityId,
61
+ fullIdPath: props.fullIdPath,
62
+ selectedTab: params.selectedTab,
63
+ updateUrl: true,
64
+ collection: params.collection,
65
+ });
39
66
  }
40
- if (!usedCollection) {
41
- console.error("ERROR: No collection found in path `", props.path, "`. Entity id: ", props.entityId);
42
- throw Error("ERROR: No collection found in path `" + props.path + "`. Make sure you have defined a collection for this path in the root navigation.");
67
+
68
+ if (sideDialogsController.pendingClose) {
69
+ sideDialogsController.setPendingClose(false);
70
+ onClose();
43
71
  }
44
72
 
45
- return usedCollection;
46
- }, [navigationController, props]);
73
+ }
74
+
75
+ const parentCollectionIds = useMemo(() => {
76
+ return navigationController.getParentCollectionIds(path);
77
+ }, [navigationController, path]);
78
+
79
+ const collection = navigationController.getCollection(fullIdPath ?? path) ?? props.collection;
47
80
 
48
81
  useEffect(() => {
49
82
  function beforeunload(e: any) {
@@ -63,11 +96,11 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
63
96
 
64
97
  }, [blocked, collection]);
65
98
 
66
- const onValuesAreModified = useCallback((modified: boolean) => {
67
- setBlocked(modified);
99
+ const onValuesModified = useCallback((modified: boolean) => {
68
100
  setBlockedNavigationMessage(modified
69
101
  ? <> You have unsaved changes in this <b>{collection?.singularName ?? collection?.name}</b>.</>
70
102
  : undefined)
103
+ setBlocked(modified);
71
104
  }, [collection?.name, setBlocked, setBlockedNavigationMessage]);
72
105
 
73
106
  if (!props || !collection) {
@@ -79,9 +112,44 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
79
112
  <ErrorBoundary>
80
113
  <EntityEditView
81
114
  {...props}
115
+ fullIdPath={fullIdPath}
116
+ layout={"side_panel"}
82
117
  collection={collection}
83
118
  parentCollectionIds={parentCollectionIds}
84
- onValuesAreModified={onValuesAreModified}
119
+ onValuesModified={onValuesModified}
120
+ onSaved={onUpdate}
121
+ barActions={<>
122
+ <IconButton
123
+ className="self-center"
124
+ onClick={onClose}>
125
+ <CloseIcon size={"small"}/>
126
+ </IconButton>
127
+ {allowFullScreen && <IconButton
128
+ className="self-center"
129
+ onClick={() => {
130
+ if (entityId)
131
+ navigate(location.pathname);
132
+ else
133
+ navigate(location.pathname + "#new");
134
+ }}>
135
+ <OpenInFullIcon size={"small"}/>
136
+ </IconButton>}
137
+ </>}
138
+ onTabChange={({
139
+ entityId,
140
+ selectedTab,
141
+ collection,
142
+ }) => {
143
+ sideEntityController.replace({
144
+ path,
145
+ entityId,
146
+ fullIdPath: props.fullIdPath,
147
+ selectedTab,
148
+ updateUrl: true,
149
+ collection,
150
+ });
151
+ }}
152
+ formProps={formProps}
85
153
  />
86
154
  </ErrorBoundary>
87
155
 
@@ -1,6 +1,8 @@
1
- import React, { useMemo } from "react";
1
+ "use client";
2
2
 
3
- import { CustomizationController, EntityCollection, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from "../types";
3
+ import React, { useMemo } from "react";
4
+ import { CenteredView, Typography } from "@firecms/ui";
5
+ import { CustomizationController, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from "../types";
4
6
  import { AuthControllerContext } from "../contexts";
5
7
  import { useBuildSideEntityController } from "../internal/useBuildSideEntityController";
6
8
  import { useCustomizationController, useFireCMSContext } from "../hooks";
@@ -12,12 +14,12 @@ import { DataSourceContext } from "../contexts/DataSourceContext";
12
14
  import { SideEntityControllerContext } from "../contexts/SideEntityControllerContext";
13
15
  import { NavigationContext } from "../contexts/NavigationContext";
14
16
  import { SideDialogsControllerContext } from "../contexts/SideDialogsControllerContext";
15
- import { CenteredView, Typography, useLocaleConfig } from "@firecms/ui";
16
17
  import { DialogsProvider } from "../contexts/DialogsProvider";
17
18
  import { useBuildDataSource } from "../internal/useBuildDataSource";
18
19
  import { CustomizationControllerContext } from "../contexts/CustomizationControllerContext";
19
20
  import { AnalyticsContext } from "../contexts/AnalyticsContext";
20
21
  import { useProjectLog } from "../hooks/useProjectLog";
22
+ import { BreadcrumbsProvider } from "../contexts/BreacrumbsContext";
21
23
 
22
24
  /**
23
25
  * If you are using independent components of the CMS
@@ -31,7 +33,7 @@ import { useProjectLog } from "../hooks/useProjectLog";
31
33
 
32
34
  * @group Core
33
35
  */
34
- export function FireCMS<UserType extends User, EC extends EntityCollection>(props: FireCMSProps<UserType, EC>) {
36
+ export function FireCMS<USER extends User>(props: FireCMSProps<USER>) {
35
37
 
36
38
  const {
37
39
  children,
@@ -42,27 +44,24 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
42
44
  authController,
43
45
  storageSource,
44
46
  dataSourceDelegate,
45
- plugins,
47
+ plugins: pluginsProp,
46
48
  onAnalyticsEvent,
47
49
  propertyConfigs,
48
50
  entityViews,
51
+ entityActions,
49
52
  components,
50
53
  navigationController,
54
+ apiKey
51
55
  } = props;
52
56
 
53
- useLocaleConfig(locale);
57
+ if (pluginsProp) {
58
+ console.warn("The `plugins` prop is deprecated in the FireCMS component. You should pass your plugins to `useBuildNavigationController` instead.");
59
+ }
54
60
 
55
- /**
56
- * Controller in charge of fetching and persisting data
57
- */
58
- const dataSource = useBuildDataSource({
59
- delegate: dataSourceDelegate,
60
- propertyConfigs,
61
- navigationController
62
- });
61
+ const plugins = navigationController.plugins ?? pluginsProp;
63
62
 
64
63
  const sideDialogsController = useBuildSideDialogsController();
65
- const sideEntityController = useBuildSideEntityController(navigationController, sideDialogsController);
64
+ const sideEntityController = useBuildSideEntityController(navigationController, sideDialogsController, authController);
66
65
 
67
66
  const pluginsLoading = plugins?.some(p => p.loading) ?? false;
68
67
 
@@ -74,6 +73,7 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
74
73
  entityLinkBuilder,
75
74
  plugins,
76
75
  entityViews: entityViews ?? [],
76
+ entityActions: entityActions ?? [],
77
77
  propertyConfigs: propertyConfigs ?? {},
78
78
  components
79
79
  };
@@ -82,7 +82,26 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
82
82
  onAnalyticsEvent
83
83
  }), []);
84
84
 
85
- const accessResponse = useProjectLog(authController, dataSourceDelegate, plugins);
85
+ const accessResponse = useProjectLog({
86
+ apiKey,
87
+ authController,
88
+ dataSourceDelegate,
89
+ plugins
90
+ });
91
+
92
+ /**
93
+ * Controller in charge of fetching and persisting data
94
+ */
95
+ const dataSource = useBuildDataSource({
96
+ delegate: dataSourceDelegate,
97
+ propertyConfigs,
98
+ navigationController,
99
+ authController
100
+ });
101
+
102
+ if (accessResponse?.message) {
103
+ console.warn(accessResponse.message);
104
+ }
86
105
 
87
106
  if (navigationController.navigationLoadingError) {
88
107
  return (
@@ -106,16 +125,16 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
106
125
 
107
126
  if (accessResponse?.blocked) {
108
127
  return (
109
- <CenteredView maxWidth={"md"} fullScreen={true}>
110
- <Typography variant={"h4"}>
111
- Access blocked
128
+ <CenteredView maxWidth={"md"} fullScreen={true} className={"flex flex-col gap-2"}>
129
+ <Typography variant={"h4"} gutterBottom>
130
+ License needed
112
131
  </Typography>
113
132
  <Typography>
114
- This app has been blocked. Please reach out at <a
133
+ You need a valid license to use FireCMS PRO. Please reach out at <a
115
134
  href={"mailto:hello@firecms.co"}>hello@firecms.co</a> for more information.
116
135
  </Typography>
117
136
  {accessResponse?.message &&
118
- <Typography>Response from the server: {accessResponse?.message}</Typography>}
137
+ <Typography>{accessResponse?.message}</Typography>}
119
138
  </CenteredView>
120
139
  );
121
140
  }
@@ -138,10 +157,12 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
138
157
  <NavigationContext.Provider
139
158
  value={navigationController}>
140
159
  <DialogsProvider>
141
- <FireCMSInternal
142
- loading={loading}>
143
- {children}
144
- </FireCMSInternal>
160
+ <BreadcrumbsProvider>
161
+ <FireCMSInternal
162
+ loading={loading}>
163
+ {children}
164
+ </FireCMSInternal>
165
+ </BreadcrumbsProvider>
145
166
  </DialogsProvider>
146
167
  </NavigationContext.Provider>
147
168
  </SideEntityControllerContext.Provider>
@@ -0,0 +1,17 @@
1
+ import { createBrowserRouter, RouterProvider } from "react-router-dom"
2
+ import { removeInitialAndTrailingSlashes } from "../util";
3
+
4
+ export function FireCMSRouter({
5
+ children,
6
+ basePath
7
+ }: {
8
+ children: React.ReactNode,
9
+ basePath?: string;
10
+ }) {
11
+ return <RouterProvider router={createBrowserRouter([
12
+ {
13
+ path: basePath ? `${removeInitialAndTrailingSlashes(basePath)}/*` : "/*",
14
+ element: children
15
+ }
16
+ ])}/>;
17
+ }