@firecms/core 3.0.0-canary.99 → 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,246 @@
1
+ import { Blocker, useBlocker, useLocation } from "react-router";
2
+ import { EntityEditView } from "../core/EntityEditView";
3
+ import { useNavigationController } from "../hooks";
4
+ import { useEffect, useRef, useState } from "react";
5
+ import { useNavigate } from "react-router-dom";
6
+ import {
7
+ getNavigationEntriesFromPath,
8
+ NavigationViewCollectionInternal,
9
+ NavigationViewEntityCustomInternal,
10
+ NavigationViewInternal
11
+ } from "../util/navigation_from_path";
12
+ import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
13
+ import { toArray } from "../util/arrays";
14
+ import { EntityCollectionView, NotFoundPage } from "../components";
15
+ import { UnsavedChangesDialog } from "../components/UnsavedChangesDialog";
16
+ import { EntityCollection } from "../types";
17
+
18
+ export function FireCMSRoute() {
19
+
20
+ const location = useLocation();
21
+ const navigation = useNavigationController();
22
+ const breadcrumbs = useBreadcrumbsController();
23
+
24
+ const hash = location.hash;
25
+ const isSidePanel = hash.includes("#side");
26
+ const isNew = hash.includes("#new") || hash.includes("#new_side");
27
+ const isCopy = hash.includes("#copy");
28
+
29
+ const pathname = location.pathname;
30
+ const navigationPath = navigation.urlPathToDataPath(pathname);
31
+
32
+ const navigationEntries = getNavigationEntriesFromPath({
33
+ path: navigationPath,
34
+ collections: navigation.collections ?? []
35
+ });
36
+
37
+ useEffect(() => {
38
+ breadcrumbs.set({
39
+ breadcrumbs: navigationEntries.map(entry => {
40
+ if (entry.type === "entity") {
41
+ return ({
42
+ title: entry.entityId,
43
+ url: navigation.buildUrlCollectionPath(entry.fullPath)
44
+ });
45
+ } else if (entry.type === "custom_view") {
46
+ return ({
47
+ title: entry.view.name,
48
+ url: navigation.buildUrlCollectionPath(entry.fullPath)
49
+ });
50
+ } else if (entry.type === "collection") {
51
+ return ({
52
+ title: entry.collection.name,
53
+ url: navigation.buildUrlCollectionPath(entry.fullPath)
54
+ });
55
+ } else {
56
+ throw new Error("Unexpected navigation entry type");
57
+ }
58
+ })
59
+ });
60
+ }, [navigationEntries.map(entry => entry.path).join(",")]);
61
+
62
+ if (isNew) {
63
+ return <EntityFullScreenRoute
64
+ pathname={pathname}
65
+ navigationEntries={navigationEntries}
66
+ isNew={true}
67
+ isCopy={false}
68
+ />;
69
+ }
70
+
71
+ if (navigationEntries.length === 1 && navigationEntries[0].type === "collection") {
72
+ let collection: EntityCollection<any> | undefined;
73
+ collection = navigation.getCollectionById(navigationEntries[0].id);
74
+ if (!collection)
75
+ collection = navigation.getCollection(navigationEntries[0].path);
76
+ if (!collection)
77
+ return null;
78
+ return <EntityCollectionView
79
+ key={`collection_view_${collection.id ?? collection.path}`}
80
+ isSubCollection={false}
81
+ parentCollectionIds={[]}
82
+ fullPath={collection.path}
83
+ fullIdPath={collection.id}
84
+ updateUrl={true}
85
+ {...collection}
86
+ Actions={toArray(collection.Actions)}/>
87
+ }
88
+
89
+ if (isSidePanel) {
90
+ const lastCollectionEntry = navigationEntries.findLast((entry) => entry.type === "collection");
91
+ if (lastCollectionEntry) {
92
+ let collection: EntityCollection<any> | undefined;
93
+ const firstEntry = navigationEntries[0] as NavigationViewCollectionInternal<any>;
94
+ collection = navigation.getCollectionById(firstEntry.id);
95
+ if (!collection)
96
+ collection = navigation.getCollection(firstEntry.path);
97
+ if (!collection)
98
+ return null;
99
+ return <EntityCollectionView
100
+ key={`collection_view_${collection.id ?? collection.path}`}
101
+ fullIdPath={collection.id}
102
+ isSubCollection={false}
103
+ parentCollectionIds={[]}
104
+ fullPath={collection.path}
105
+ updateUrl={true}
106
+ {...collection}
107
+ Actions={toArray(collection.Actions)}/>;
108
+ }
109
+ }
110
+
111
+ return <EntityFullScreenRoute
112
+ pathname={pathname}
113
+ navigationEntries={navigationEntries}
114
+ isNew={isNew}
115
+ isCopy={isCopy}
116
+ />;
117
+
118
+ }
119
+
120
+ function getSelectedTabFromUrl(isNew: boolean, lastCustomView: NavigationViewCollectionInternal<any> | NavigationViewEntityCustomInternal<any> | undefined) {
121
+ if (isNew) {
122
+ return undefined;
123
+ } else if (lastCustomView) {
124
+ if (lastCustomView.type === "custom_view") {
125
+ return lastCustomView.view.key;
126
+ } else if (lastCustomView.type === "collection") {
127
+ return lastCustomView.id ?? lastCustomView.path;
128
+ }
129
+ }
130
+ return undefined;
131
+ }
132
+
133
+ function EntityFullScreenRoute({
134
+ pathname,
135
+ navigationEntries,
136
+ isNew,
137
+ isCopy
138
+ }: {
139
+ pathname: string;
140
+ navigationEntries: NavigationViewInternal[],
141
+ isNew: boolean,
142
+ isCopy: boolean
143
+ }) {
144
+
145
+ const navigation = useNavigationController();
146
+ const navigate = useNavigate();
147
+
148
+ const navigationPath = navigation.urlPathToDataPath(pathname);
149
+
150
+ // is navigating away blocked
151
+ const blocked = useRef(false);
152
+
153
+ const lastEntityEntry = navigationEntries.findLast((entry) => entry.type === "entity");
154
+ const navigationEntriesAfterEntity = lastEntityEntry ? navigationEntries.slice(navigationEntries.indexOf(lastEntityEntry) + 1) : [];
155
+
156
+ const lastCustomView = navigationEntriesAfterEntity.findLast(
157
+ (entry) => entry.type === "custom_view" || entry.type === "collection"
158
+ ) as NavigationViewCollectionInternal<any> | NavigationViewEntityCustomInternal<any> | undefined;
159
+
160
+ const entityId = lastEntityEntry?.entityId;
161
+
162
+ const urlTab = getSelectedTabFromUrl(isNew, lastCustomView);
163
+ const [selectedTab, setSelectedTab] = useState<string | undefined>(urlTab);
164
+
165
+ const parentCollectionIds = navigation.getParentCollectionIds(navigationPath);
166
+ useEffect(() => {
167
+ if (urlTab !== selectedTab) {
168
+ setSelectedTab(urlTab);
169
+ }
170
+ }, [urlTab]);
171
+
172
+ const basePath = !entityId || isNew
173
+ ? pathname
174
+ : pathname.substring(0, pathname.lastIndexOf(`/${entityId}`));
175
+
176
+ const entityPath = basePath + `/${entityId}`;
177
+
178
+ let blocker: Blocker | undefined = undefined;
179
+ try {
180
+ blocker = useBlocker(({
181
+ nextLocation
182
+ }) => {
183
+ if (nextLocation.pathname.startsWith(entityPath))
184
+ return false;
185
+ return blocked.current;
186
+ });
187
+ } catch (e) {
188
+ // console.warn("Blocker not available, navigation will not be blocked");
189
+ }
190
+
191
+ const lastCollectionEntry = navigationEntries.findLast((entry) => entry.type === "collection");
192
+
193
+ if (isNew && !lastCollectionEntry) {
194
+ throw new Error("INTERNAL: No collection found in the navigation");
195
+ }
196
+
197
+ if (!isNew && !lastEntityEntry) {
198
+ return <NotFoundPage/>;
199
+ }
200
+
201
+ const collection = isNew ? lastCollectionEntry!.collection : lastEntityEntry!.parentCollection;
202
+ const fullIdPath = isNew ? lastCollectionEntry!.path : lastEntityEntry!.path;
203
+ const collectionPath = navigation.resolveIdsFrom(fullIdPath);
204
+ return <>
205
+ <EntityEditView
206
+ key={collection.id + "_" + (isNew ? "new" : (isCopy ? entityId + "_copy" : entityId))}
207
+ entityId={isNew ? undefined : entityId}
208
+ fullIdPath={fullIdPath}
209
+ collection={collection}
210
+ layout={"full_screen"}
211
+ path={collectionPath}
212
+ copy={isCopy}
213
+ selectedTab={selectedTab ?? undefined}
214
+ onValuesModified={(modified) => blocked.current = modified}
215
+ onSaved={(params) => {
216
+ const newSelectedTab = params.selectedTab;
217
+ const newEntityId = params.entityId;
218
+ if (newSelectedTab) {
219
+ navigate(`${basePath}/${newEntityId}/${newSelectedTab}`, { replace: true });
220
+ } else {
221
+ navigate(`${basePath}/${newEntityId}`, { replace: true });
222
+ }
223
+ }}
224
+ onTabChange={(params) => {
225
+ setSelectedTab(params.selectedTab);
226
+ if (isNew) {
227
+ return;
228
+ }
229
+ const newSelectedTab = params.selectedTab;
230
+ if (newSelectedTab) {
231
+ navigate(`${basePath}/${entityId}/${newSelectedTab}`, { replace: true });
232
+ } else {
233
+ navigate(`${basePath}/${entityId}`, { replace: true });
234
+ }
235
+ }}
236
+ parentCollectionIds={parentCollectionIds}
237
+ />
238
+
239
+ <UnsavedChangesDialog
240
+ open={blocker?.state === "blocked"}
241
+ handleOk={() => blocker?.proceed?.()}
242
+ handleCancel={() => blocker?.reset?.()}
243
+ body={"You have unsaved changes in this entity."}/>
244
+
245
+ </>;
246
+ }
@@ -0,0 +1,17 @@
1
+ import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
2
+ import { useEffect } from "react";
3
+
4
+ export function HomePageRoute({ children }: {
5
+ children: React.ReactNode;
6
+ }) {
7
+
8
+ const breadcrumbs = useBreadcrumbsController();
9
+
10
+ useEffect(() => {
11
+ breadcrumbs.set({
12
+ breadcrumbs: []
13
+ });
14
+ }, []);
15
+
16
+ return children;
17
+ }
@@ -28,6 +28,9 @@ export type CMSAnalyticsEvent =
28
28
  | "home_navigate_to_view"
29
29
  | "home_navigate_to_admin_view"
30
30
  | "home_favorite_navigate_to_view"
31
+ | "home_move_card"
32
+ | "home_move_group"
33
+ | "home_drop_new_group"
31
34
 
32
35
  | "collection_inline_editing"
33
36
 
@@ -9,18 +9,13 @@ import { StorageSource } from "./storage";
9
9
  * to do it as the result of a hook.
10
10
  * @group Hooks and utilities
11
11
  */
12
- export type AuthController<UserType extends User = any, ExtraData = any> = {
12
+ export type AuthController<USER extends User = any, ExtraData = any> = {
13
13
 
14
14
  /**
15
15
  * The user currently logged in
16
16
  * The values can be: the user object, null if they skipped login
17
17
  */
18
- user: UserType | null;
19
-
20
- /**
21
- * Roles related to the logged user
22
- */
23
- roles?: Role[];
18
+ user: USER | null;
24
19
 
25
20
  /**
26
21
  * Initial loading flag. It is used not to display the login screen
@@ -64,26 +59,27 @@ export type AuthController<UserType extends User = any, ExtraData = any> = {
64
59
 
65
60
  setExtra: (extra: ExtraData) => void;
66
61
 
67
- // setUser?: (user: UserType | null) => void;
62
+ setUser?: (user: USER | null) => void;
63
+
64
+ setUserRoles?: (roles: Role[]) => void;
68
65
 
69
- // setRoles?: (roles: Role[]) => void;
70
66
  };
71
67
 
72
68
  /**
73
69
  * Implement this function to allow access to specific users.
74
70
  * @group Hooks and utilities
75
71
  */
76
- export type Authenticator<UserType extends User = User, Controller extends AuthController<UserType> = AuthController<UserType>> = (props: {
72
+ export type Authenticator<USER extends User = User> = (props: {
77
73
 
78
74
  /**
79
75
  * Logged-in user or null
80
76
  */
81
- user: UserType | null;
77
+ user: USER | null;
82
78
 
83
79
  /**
84
80
  * AuthController
85
81
  */
86
- authController: Controller;
82
+ authController: AuthController<USER>;
87
83
 
88
84
  /**
89
85
  * Connector to your database, e.g. your Firestore database
@@ -17,7 +17,7 @@ import { EntityOverrides } from "./entity_overrides";
17
17
  *
18
18
  * @group Models
19
19
  */
20
- export interface EntityCollection<M extends Record<string, any> = any, UserType extends User = any> {
20
+ export interface EntityCollection<M extends Record<string, any> = any, USER extends User = any> {
21
21
 
22
22
  /**
23
23
  * You can set an alias that will be used internally instead of the `path`.
@@ -51,6 +51,12 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
51
51
  */
52
52
  path: string;
53
53
 
54
+ /**
55
+ * Optional database id of this collection. If not specified, the default
56
+ * database id will be used.
57
+ */
58
+ databaseId?: string;
59
+
54
60
  /**
55
61
  * If this collection is a top level navigation entry, you can set this
56
62
  * property to `true` to indicate that this collection is a collection group.
@@ -61,14 +67,18 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
61
67
  * Icon key to use in this collection.
62
68
  * You can use any of the icons in the Material specs:
63
69
  * https://fonts.google.com/icons
64
- * e.g. 'account_tree' or 'person'
70
+ * e.g. 'account_tree' or 'person'.
71
+ * Find all the icons in https://firecms.co/docs/icons
65
72
  */
66
- icon?: string;
73
+ icon?: string | React.ReactNode;
67
74
 
68
75
  /**
69
76
  * Optional field used to group top level navigation entries under a~
70
77
  * navigation view. If you set this value in a subcollection it has no
71
78
  * effect.
79
+ * @deprecated This prop is deprecated and will be removed in the future.
80
+ * You can apply grouping by using the `navigationGroupMappings` prop in the
81
+ * {@link useBuildNavigationController} hook instead.
72
82
  */
73
83
  group?: string;
74
84
 
@@ -77,6 +87,11 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
77
87
  */
78
88
  properties: PropertiesOrBuilders<M>;
79
89
 
90
+ /**
91
+ * Default preview properties displayed when this collection is referenced to.
92
+ */
93
+ previewProperties?: string[];
94
+
80
95
  /**
81
96
  * Title property of the entity. This is the property that will be used
82
97
  * as the title in entity related views and references.
@@ -85,11 +100,10 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
85
100
  titleProperty?: keyof M;
86
101
 
87
102
  /**
88
- * Can this collection be edited by the end user.
89
- * Defaults to `true`.
90
- * Keep in mind that you can also set this prop to individual properties.
103
+ * When editing an entity, you can choose to open the entity in a side dialog
104
+ * or in a full screen dialog. Defaults to `full_screen`.
91
105
  */
92
- editable?: boolean;
106
+ openEntityMode?: "side_panel" | "full_screen";
93
107
 
94
108
  /**
95
109
  * Order in which the properties are displayed.
@@ -101,7 +115,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
101
115
  * `hidden` in the property definition, will be ignored.
102
116
  * `propertiesOrder` has precedence over `hidden`.
103
117
  * - For properties use the property key.
104
- * - For additional columns use the column id.
118
+ * - For additional fields use the field key.
105
119
  * - If you have subcollections, you get a column for each subcollection,
106
120
  * with the path (or alias) as the subcollection, prefixed with
107
121
  * `subcollection:`. e.g. `subcollection:orders`.
@@ -112,11 +126,12 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
112
126
  * `hidden` in the property definition,will be ignored.
113
127
  * `propertiesOrder` has precedence over `hidden`.
114
128
  */
115
- propertiesOrder?: (Extract<keyof M, string> | `subcollection:${string}`)[];
129
+ propertiesOrder?: (Extract<keyof M, string> | string | `subcollection:${string}` | "collectionGroupParent")[];
116
130
 
117
131
  /**
118
132
  * If enabled, content is loaded in batches. If `false` all entities in the
119
- * collection are loaded.
133
+ * collection are loaded. This means that when reaching the end of the
134
+ * collection, the CMS will load more entities.
120
135
  * You can specify a number to specify the pagination size (50 by default)
121
136
  * Defaults to `true`
122
137
  */
@@ -132,7 +147,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
132
147
  * Permissions the logged-in user can perform on this collection.
133
148
  * If not specified everything defaults to `true`.
134
149
  */
135
- permissions?: Permissions | PermissionsBuilder<EntityCollection, UserType, M>;
150
+ permissions?: Permissions | PermissionsBuilder<EntityCollection, USER, M>;
136
151
 
137
152
  /**
138
153
  * Are the entities in this collection selectable. Defaults to `true`
@@ -151,7 +166,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
151
166
  * is being created, updated or deleted.
152
167
  * Useful for adding your own logic or blocking the execution of the operation.
153
168
  */
154
- callbacks?: EntityCallbacks<M, UserType>;
169
+ callbacks?: EntityCallbacks<M, USER>;
155
170
 
156
171
  /**
157
172
  * Builder for rendering additional components such as buttons in the
@@ -181,8 +196,11 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
181
196
  * }
182
197
  * }
183
198
  * ```
199
+ *
200
+ * You can also pass the action as a string that represents the `key`, in which case it will
201
+ * use the action defined in the main configuration under `entityActions`.
184
202
  */
185
- entityActions?: EntityAction<M, UserType>[];
203
+ entityActions?: (EntityAction<M, USER> | string)[];
186
204
 
187
205
  /**
188
206
  * Pass your own selection controller if you want to control selected
@@ -204,6 +222,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
204
222
  * Force a filter in this view. If applied, the rest of the filters will
205
223
  * be disabled. Filters applied with this prop cannot be changed.
206
224
  * e.g. `forceFilter: { age: [">=", 18] }`
225
+ * e.g. `forceFilter: { related_user: ["==", new EntityReference("sdc43dsw2", "users")] }`
207
226
  */
208
227
  forceFilter?: FilterValues<Extract<keyof M, string>>;
209
228
 
@@ -211,6 +230,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
211
230
  * Initial filters applied to the collection this collection is related to.
212
231
  * Defaults to none. Filters applied with this prop can be changed.
213
232
  * e.g. `initialFilter: { age: [">=", 18] }`
233
+ * e.g. `initialFilter: { related_user: ["==", new EntityReference("sdc43dsw2", "users")] }`
214
234
  */
215
235
  initialFilter?: FilterValues<Extract<keyof M, string>>; // setting FilterValues<M> can break defining collections by code
216
236
 
@@ -234,7 +254,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
234
254
  * You can add additional fields to the collection view by implementing
235
255
  * an additional field delegate.
236
256
  */
237
- additionalFields?: AdditionalFieldDelegate<M, UserType>[];
257
+ additionalFields?: AdditionalFieldDelegate<M, USER>[];
238
258
 
239
259
  /**
240
260
  * Default size of the rendered collection
@@ -287,7 +307,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
287
307
  /**
288
308
  *
289
309
  */
290
- exportable?: boolean | ExportConfig<UserType>;
310
+ exportable?: boolean | ExportConfig<USER>;
291
311
 
292
312
  /**
293
313
  * User id of the owner of this collection. This is used only by plugins, or if you
@@ -304,6 +324,32 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
304
324
  * Width of the side dialog (in pixels) when opening an entity in this collection.
305
325
  */
306
326
  sideDialogWidth?: number | string;
327
+
328
+ /**
329
+ * Can this collection configuration be edited by the end user.
330
+ * Defaults to `true`.
331
+ * Keep in mind that you can also set this prop to individual properties.
332
+ * This prop has only effect if you are using the collection editor.
333
+ */
334
+ editable?: boolean;
335
+
336
+ /**
337
+ * If set to true, the default values of the properties will be applied
338
+ * to the entity every time the entity is updated (not only when created).
339
+ * Defaults to false.
340
+ */
341
+ alwaysApplyDefaultValues?: boolean;
342
+
343
+ /**
344
+ * If set to true, a tab including the JSON representation of the entity will be included.
345
+ */
346
+ includeJsonView?: boolean;
347
+
348
+ /**
349
+ * If set to true, changes to the entity will be saved in a subcollection.
350
+ * This prop has no effect if the history plugin is not enabled
351
+ */
352
+ history?: boolean;
307
353
  }
308
354
 
309
355
  /**
@@ -313,7 +359,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
313
359
  *
314
360
  * @group Models
315
361
  */
316
- export interface CollectionActionsProps<M extends Record<string, any> = any, UserType extends User = User, EC extends EntityCollection<M> = EntityCollection<M>> {
362
+ export interface CollectionActionsProps<M extends Record<string, any> = any, USER extends User = User, EC extends EntityCollection<M> = EntityCollection<M>> {
317
363
  /**
318
364
  * Full collection path of this entity. This is the full path, like
319
365
  * `users/1234/addresses`
@@ -350,7 +396,7 @@ export interface CollectionActionsProps<M extends Record<string, any> = any, Use
350
396
  /**
351
397
  * Context of the app status
352
398
  */
353
- context: FireCMSContext<UserType>;
399
+ context: FireCMSContext<USER>;
354
400
 
355
401
  /**
356
402
  * Count of the entities in this collection
@@ -412,9 +458,9 @@ export type FilterCombination<Key extends string> = Partial<Record<Key, "asc" |
412
458
  */
413
459
  export type CollectionSize = "xs" | "s" | "m" | "l" | "xl";
414
460
 
415
- export type AdditionalFieldDelegateProps<M extends Record<string, any> = any, UserType extends User = User> = {
461
+ export type AdditionalFieldDelegateProps<M extends Record<string, any> = any, USER extends User = User> = {
416
462
  entity: Entity<M>,
417
- context: FireCMSContext<UserType>
463
+ context: FireCMSContext<USER>
418
464
  };
419
465
 
420
466
  /**
@@ -423,7 +469,7 @@ export type AdditionalFieldDelegateProps<M extends Record<string, any> = any, Us
423
469
  * @group Models
424
470
  */
425
471
  export interface AdditionalFieldDelegate<M extends Record<string, any> = any,
426
- UserType extends User = User> {
472
+ USER extends User = User> {
427
473
 
428
474
  /**
429
475
  * ID of this column. You can use this id in the `properties` field of the
@@ -444,7 +490,7 @@ export interface AdditionalFieldDelegate<M extends Record<string, any> = any,
444
490
  /**
445
491
  * Builder for the content of the cell for this column
446
492
  */
447
- Builder?: React.ComponentType<AdditionalFieldDelegateProps<M, UserType>>;
493
+ Builder?: React.ComponentType<AdditionalFieldDelegateProps<M, USER>>;
448
494
 
449
495
  /**
450
496
  * If this column needs to update dynamically based on other properties,
@@ -479,21 +525,36 @@ export type EntityCustomView<M extends Record<string, any> = any> =
479
525
  /**
480
526
  * Key of this custom view.
481
527
  */
482
- key: string,
528
+ key: string;
529
+
483
530
  /**
484
531
  * Name of this custom view.
485
532
  */
486
- name: string,
533
+ name: string;
534
+
487
535
  /**
488
- * If set to true, the actions of the entity will be included in the
489
- * bottom of the panel (save buttons, delete buttons, etc.)
536
+ * Render this custom view in the tab of the entity view, instead of the name
490
537
  */
491
- includeActions?: boolean;
538
+ tabComponent?: React.ReactNode;
539
+
540
+ /**
541
+ * If set to true, the actions of the entity (save, discard,delete) will be
542
+ * included in the view. By default the actions are located in the right or bottom,
543
+ * based on the screen size. You can force the actions to be located at the bottom
544
+ * by setting this prop to "bottom".
545
+ */
546
+ includeActions?: boolean | "bottom";
547
+
492
548
  /**
493
549
  * Builder for rendering the custom view
494
550
  */
495
551
  Builder?: React.ComponentType<EntityCustomViewParams<M>>;
496
- }
552
+
553
+ /**
554
+ * Position of this tab in the entity view. Defaults to `end`.
555
+ */
556
+ position?: "start" | "end";
557
+ };
497
558
 
498
559
  /**
499
560
  * Parameters passed to the builder in charge of rendering a custom panel for
@@ -523,6 +584,11 @@ export interface EntityCustomViewParams<M extends Record<string, any> = any> {
523
584
  * Use the form context to access the form state and methods
524
585
  */
525
586
  formContext: FormContext;
587
+
588
+ /**
589
+ * If this is a subcollection, this is the path of the parent collections
590
+ */
591
+ parentCollectionIds?: string[];
526
592
  }
527
593
 
528
594
  export type InferCollectionType<S extends EntityCollection> = S extends EntityCollection<infer M> ? M : never;
@@ -558,6 +624,12 @@ export type EntityTableController<M extends Record<string, any> = any> = {
558
624
  clearFilter?: () => void;
559
625
  itemCount?: number;
560
626
  setItemCount?: (itemCount: number) => void;
627
+ initialScroll?: number;
628
+ onScroll?: (props: {
629
+ scrollDirection: "forward" | "backward",
630
+ scrollOffset: number,
631
+ scrollUpdateWasRequested: boolean
632
+ }) => void;
561
633
  paginationEnabled?: boolean;
562
634
  pageSize?: number;
563
635
  checkFilterCombination?: (filterValues: FilterValues<any>,
@@ -573,5 +645,6 @@ export type SelectedCellProps<M extends Record<string, any>> = {
573
645
  cellRect: DOMRect;
574
646
  width: number;
575
647
  height: number;
576
- entity: Entity<M>;
648
+ entityPath: string;
649
+ entityId: string;
577
650
  };
@@ -4,6 +4,7 @@ import { FireCMSPlugin } from "./plugins";
4
4
  import { EntityCustomView } from "./collections";
5
5
  import { Locale } from "./locales";
6
6
  import { PropertyConfig } from "./property_config";
7
+ import { EntityAction } from "./entity_actions";
7
8
 
8
9
  export type CustomizationController = {
9
10
 
@@ -26,6 +27,14 @@ export type CustomizationController = {
26
27
  */
27
28
  entityViews?: EntityCustomView[];
28
29
 
30
+ /**
31
+ * List of actions that can be performed on entities.
32
+ * These actions are displayed in the entity view and in the collection view.
33
+ * You can later reuse these actions in the `entityActions` prop of a collection,
34
+ * by specifying the `key` of the action.
35
+ */
36
+ entityActions?: EntityAction<any, any>[];
37
+
29
38
  /**
30
39
  * Format of the dates in the CMS.
31
40
  * Defaults to 'MMMM dd, yyyy, HH:mm:ss'