@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
@@ -1,45 +1,41 @@
1
- import React, { useCallback, useEffect, useRef, useState } from "react";
2
-
1
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import Fuse from "fuse.js";
3
+ import { Container, SearchBar } from "@firecms/ui";
3
4
  import { useCustomizationController, useFireCMSContext, useNavigationController } from "../../hooks";
4
5
  import {
5
6
  CMSAnalyticsEvent,
7
+ NavigationEntry,
8
+ NavigationGroupMapping,
6
9
  PluginGenericProps,
7
- PluginHomePageAdditionalCardsProps,
8
- TopNavigationEntry
10
+ PluginHomePageAdditionalCardsProps
9
11
  } from "../../types";
10
-
11
12
  import { toArray } from "../../util/arrays";
12
- import { NavigationGroup } from "./NavigationGroup";
13
- import { NavigationCardBinding } from "./NavigationCardBinding";
14
-
15
- import Fuse from "fuse.js"
16
-
17
- import { Container, SearchBar } from "@firecms/ui";
18
13
  import { FavouritesView } from "./FavouritesView";
19
14
  import { useRestoreScroll } from "../../internal/useRestoreScroll";
15
+ import { NavigationGroup } from "./NavigationGroup";
16
+ import {
17
+ NavigationGroupDroppable,
18
+ NewGroupDropZone,
19
+ SortableNavigationCard,
20
+ SortableNavigationGroup,
21
+ useHomePageDnd
22
+ } from "./HomePageDnD";
23
+ import { DndContext, DragOverlay, MeasuringStrategy } from "@dnd-kit/core";
24
+ import { NavigationCardBinding } from "./NavigationCardBinding";
25
+ import { SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable";
26
+ import { restrictToVerticalAxis, restrictToWindowEdges } from "@dnd-kit/modifiers";
27
+ import { RenameGroupDialog } from "./RenameGroupDialog";
20
28
 
21
- /**
22
- * Default entry view for the CMS. This component renders navigation cards
23
- * for each collection defined in the navigation.
29
+ export const DEFAULT_GROUP_NAME = "Views";
30
+ export const ADMIN_GROUP_NAME = "Admin";
24
31
 
25
- * @group Components
26
- */
27
32
  export function DefaultHomePage({
28
33
  additionalActions,
29
34
  additionalChildrenStart,
30
35
  additionalChildrenEnd
31
36
  }: {
32
- /**
33
- * Additional actions to be rendered in the home page, close to the search bar.
34
- */
35
37
  additionalActions?: React.ReactNode;
36
- /**
37
- * Additional children to be rendered in the beginning of the home page.
38
- */
39
38
  additionalChildrenStart?: React.ReactNode;
40
- /**
41
- * Additional children to be rendered at the end of the home page.
42
- */
43
39
  additionalChildrenEnd?: React.ReactNode;
44
40
  }) {
45
41
 
@@ -47,177 +43,543 @@ export function DefaultHomePage({
47
43
  const customizationController = useCustomizationController();
48
44
  const navigationController = useNavigationController();
49
45
 
50
- const fuse = useRef<Fuse<TopNavigationEntry> | null>(null);
51
-
52
46
  if (!navigationController.topLevelNavigation)
53
- throw Error("Navigation not ready in FireCMSHomePage");
47
+ throw Error("Navigation not ready");
54
48
 
55
49
  const {
56
- containerRef,
57
- scroll,
58
- direction
59
- } = useRestoreScroll();
60
-
61
- const {
62
- navigationEntries,
63
- groups
50
+ allowDragAndDrop,
51
+ navigationEntries: rawNavigationEntries,
52
+ groups: groupOrderFromNavController,
53
+ onNavigationEntriesUpdate
64
54
  } = navigationController.topLevelNavigation;
65
55
 
56
+ const fuse = useRef<Fuse<NavigationEntry> | null>(null);
66
57
  const [filteredUrls, setFilteredUrls] = useState<string[] | null>(null);
58
+ const performingSearch = Boolean(filteredUrls);
67
59
 
68
- const filteredNavigationEntries = filteredUrls
69
- ? navigationEntries.filter((entry) => filteredUrls.includes(entry.url))
70
- : navigationEntries;
60
+ // Memoize filtered navigation entries to prevent unnecessary recalculations
61
+ const filteredNavigationEntries = useMemo(() => {
62
+ return filteredUrls
63
+ ? rawNavigationEntries.filter((e) => filteredUrls.includes(e.url))
64
+ : rawNavigationEntries;
65
+ }, [filteredUrls, rawNavigationEntries]);
71
66
 
72
67
  useEffect(() => {
73
- fuse.current = new Fuse(navigationEntries, {
74
- keys: ["name",
75
- "description",
76
- "group",
77
- "path"
78
- ]
68
+ fuse.current = new Fuse(rawNavigationEntries, {
69
+ keys: ["name", "description", "group", "path"]
79
70
  });
80
- }, [navigationEntries]);
81
-
82
- const updateSearchResults = useCallback(
83
- (value?: string) => {
84
- if (!value || value === "") {
85
- setFilteredUrls(null);
86
- } else {
87
- const searchResult = fuse.current?.search(value);
88
- console.log("Search result", searchResult);
89
- if (searchResult) {
90
- setFilteredUrls(searchResult.map((e) => e.item.url));
71
+ }, [rawNavigationEntries]);
72
+
73
+ const updateSearch = useCallback((v?: string) => {
74
+ if (!v?.trim()) {
75
+ setFilteredUrls(null);
76
+ return;
77
+ }
78
+ const results = fuse.current?.search(v.trim());
79
+ setFilteredUrls(results ? results.map((x) => x.item.url) : []);
80
+ }, []);
81
+
82
+ /* ───────────────────────────────────────────────────────────────
83
+ Build groups (all items) + isolate Admin
84
+ ─────────────────────────────────────────────────────────────── */
85
+ const [items, setItems] = useState<
86
+ { name: string; entries: NavigationEntry[] }[]
87
+ >([]);
88
+ const [adminGroupData, setAdminGroupData] = useState<{
89
+ name: string;
90
+ entries: NavigationEntry[];
91
+ } | null>(null);
92
+
93
+ // Memoize the processed groups to avoid unnecessary recalculations
94
+ const processedGroups = useMemo(() => {
95
+ const src = filteredNavigationEntries;
96
+ const entriesByGroup: Record<string, NavigationEntry[]> = {};
97
+
98
+ src.forEach((e) => {
99
+ const g =
100
+ e.type === "admin"
101
+ ? ADMIN_GROUP_NAME
102
+ : e.group ?? DEFAULT_GROUP_NAME;
103
+ (entriesByGroup[g] ??= []).push(e);
104
+ });
105
+
106
+ // Check if there are custom actions from plugins that should show in the default group
107
+ const hasPluginAdditionalCards = customizationController.plugins?.some(p => p.homePage?.AdditionalCards);
108
+
109
+ let allProcessed: { name: string; entries: NavigationEntry[] }[];
110
+
111
+ if (performingSearch) {
112
+ const ordered = [
113
+ ...new Set(src.map((e) => e.group ?? DEFAULT_GROUP_NAME))
114
+ ];
115
+ allProcessed = ordered
116
+ .map((name) => ({
117
+ name,
118
+ entries: entriesByGroup[name] || []
119
+ }))
120
+ .filter((g) => g.entries.length);
121
+ } else {
122
+ allProcessed = groupOrderFromNavController.map((g) => ({
123
+ name: g,
124
+ entries: entriesByGroup[g] || []
125
+ }));
126
+ Object.keys(entriesByGroup).forEach((g) => {
127
+ if (!groupOrderFromNavController.includes(g))
128
+ allProcessed.push({
129
+ name: g,
130
+ entries: entriesByGroup[g]
131
+ });
132
+ });
133
+
134
+ // Ensure default group exists if there are plugin additional cards but no collections
135
+ if (hasPluginAdditionalCards && !allProcessed.some(g => g.name === DEFAULT_GROUP_NAME)) {
136
+ allProcessed.push({
137
+ name: DEFAULT_GROUP_NAME,
138
+ entries: []
139
+ });
140
+ }
141
+
142
+ allProcessed = allProcessed.filter(
143
+ (g) =>
144
+ g.entries.length ||
145
+ groupOrderFromNavController.includes(g.name) ||
146
+ (g.name === DEFAULT_GROUP_NAME && hasPluginAdditionalCards)
147
+ );
148
+ }
149
+
150
+ const admin = allProcessed.find((g) => g.name === ADMIN_GROUP_NAME);
151
+ return {
152
+ adminGroupData: admin || null,
153
+ items: allProcessed.filter((g) => g.name !== ADMIN_GROUP_NAME)
154
+ };
155
+ }, [filteredNavigationEntries, performingSearch, groupOrderFromNavController, customizationController.plugins]);
156
+
157
+ // Update state only when processedGroups actually changes
158
+ useEffect(() => {
159
+ setAdminGroupData(processedGroups.adminGroupData);
160
+ setItems(processedGroups.items);
161
+ }, [processedGroups]);
162
+
163
+ /* ───────────────────────────────────────────────────────────────
164
+ Local update vs. persistence helpers
165
+ ─────────────────────────────────────────────────────────────── */
166
+ const updateItems = (
167
+ updater:
168
+ | { name: string; entries: NavigationEntry[] }[]
169
+ | ((
170
+ prev: { name: string; entries: NavigationEntry[] }[]
171
+ ) => { name: string; entries: NavigationEntry[] }[])
172
+ ) => {
173
+ setItems(updater); // local only
174
+ };
175
+
176
+ const persistNavigationGroups = (
177
+ latest: { name: string; entries: NavigationEntry[] }[]
178
+ ) => {
179
+ const draggable: NavigationGroupMapping[] = latest.map((g) => ({
180
+ name: g.name,
181
+ entries: g.entries.map((e) => e.path)
182
+ }));
183
+
184
+ const all: NavigationGroupMapping[] = adminGroupData
185
+ ? [
186
+ ...draggable,
187
+ {
188
+ name: adminGroupData.name,
189
+ entries: adminGroupData.entries.map((e) => e.path)
91
190
  }
191
+ ]
192
+ : draggable;
193
+
194
+ onNavigationEntriesUpdate(all);
195
+ };
196
+
197
+ const [collapsedGroups, setCollapsedGroups] = useState<Record<string, boolean>>({});
198
+ const isGroupCollapsed = useCallback((name: string) => {
199
+ return !!collapsedGroups[name];
200
+ }, [collapsedGroups]);
201
+
202
+ const toggleGroupCollapsed = useCallback((name: string) => {
203
+ setCollapsedGroups(prev => ({ ...prev, [name]: !prev[name] }));
204
+ }, []);
205
+
206
+
207
+ const {
208
+ sensors,
209
+ collisionDetection,
210
+ onDragStart,
211
+ onDragOver,
212
+ onDragEnd,
213
+ dropAnimation,
214
+ activeItemForOverlay,
215
+ activeGroupData,
216
+ draggingGroupId,
217
+ containers,
218
+ dndKitActiveNode,
219
+ onDragCancel,
220
+ isDraggingCardOnly,
221
+ dialogOpenForGroup,
222
+ setDialogOpenForGroup,
223
+ handleRenameGroup,
224
+ isHoveringNewGroupDropZone,
225
+ setIsHoveringNewGroupDropZone
226
+ } = useHomePageDnd({
227
+ items,
228
+ setItems: updateItems,
229
+ disabled: !allowDragAndDrop || performingSearch,
230
+ onPersist: persistNavigationGroups, // ——► persistence here
231
+ onGroupMoved: (g) =>
232
+ context.analyticsController?.onAnalyticsEvent?.("home_move_group", {
233
+ name: g
234
+ }),
235
+ onCardMovedBetweenGroups: (card) => {
236
+ // Find which group the card was moved to and expand it if collapsed
237
+ // Check both regular groups and admin group
238
+ let targetGroup = items.find(group =>
239
+ group.entries.some(entry => entry.url === card.url)
240
+ );
241
+
242
+ // Also check admin group if not found in regular groups
243
+ if (!targetGroup && adminGroupData?.entries.some(entry => entry.url === card.url)) {
244
+ targetGroup = adminGroupData;
92
245
  }
93
- }, []);
94
246
 
95
- const allGroups: Array<string | undefined> = [...groups];
96
- if (filteredNavigationEntries.filter(e => !e.group).length > 0 || filteredNavigationEntries.length === 0) {
97
- allGroups.push(undefined);
98
- }
247
+ if (targetGroup && isGroupCollapsed(targetGroup.name)) {
248
+ toggleGroupCollapsed(targetGroup.name);
249
+ }
99
250
 
251
+ context.analyticsController?.onAnalyticsEvent?.("home_move_card", {
252
+ id: card.id
253
+ });
254
+ },
255
+ onNewGroupDrop: () =>
256
+ context.analyticsController?.onAnalyticsEvent?.(
257
+ "home_drop_new_group"
258
+ )
259
+ });
260
+
261
+ const {
262
+ containerRef,
263
+ direction
264
+ } = useRestoreScroll();
265
+
266
+ const dndDisabled = !allowDragAndDrop || performingSearch;
267
+
268
+ const dndModifiers = dndKitActiveNode?.data.current?.type === "group"
269
+ ? [restrictToVerticalAxis, restrictToWindowEdges]
270
+ : [restrictToWindowEdges];
271
+
272
+ /* ───────────────────────────────────────────────────────────────
273
+ Plugin extras
274
+ ─────────────────────────────────────────────────────────────── */
100
275
  let additionalPluginChildrenStart: React.ReactNode | undefined;
101
276
  let additionalPluginChildrenEnd: React.ReactNode | undefined;
102
277
  let additionalPluginSections: React.ReactNode | undefined;
278
+
103
279
  if (customizationController.plugins) {
104
- const sectionProps: PluginGenericProps = {
105
- context
106
- };
107
- additionalPluginSections = <>
108
- {customizationController.plugins.filter(plugin => plugin.homePage?.includeSection)
109
- .map((plugin, i) => {
110
- const section = plugin.homePage!.includeSection!(sectionProps)
111
- return (
112
- <NavigationGroup
113
- group={section.title}
114
- key={`plugin_section_${plugin.key}`}>
115
- {section.children}
116
- </NavigationGroup>
117
- );
118
- })}
119
- </>;
120
- additionalPluginChildrenStart = <div className={"flex flex-col gap-2"}>
121
- {customizationController.plugins.filter(plugin => plugin.homePage?.additionalChildrenStart)
122
- .map((plugin, i) => {
123
- return <div key={`plugin_children_start_${i}`}>{plugin.homePage!.additionalChildrenStart}</div>;
124
- })}
125
- </div>;
126
-
127
- additionalPluginChildrenEnd = <div className={"flex flex-col gap-2"}>
128
- {customizationController.plugins.filter(plugin => plugin.homePage?.additionalChildrenEnd)
129
- .map((plugin, i) => {
130
- return <div key={`plugin_children_start_${i}`}>{plugin.homePage!.additionalChildrenEnd}</div>;
131
- })}
132
- </div>;
280
+ const sectionProps: PluginGenericProps = { context };
281
+
282
+ additionalPluginSections = (
283
+ <>
284
+ {customizationController.plugins
285
+ .filter((p) => p.homePage?.includeSection)
286
+ .map((plugin) => {
287
+ const section = plugin.homePage!.includeSection!(
288
+ sectionProps
289
+ );
290
+ return (
291
+ <NavigationGroup
292
+ group={section.title}
293
+ key={`plugin_section_${plugin.key}`}
294
+ >
295
+ {section.children}
296
+ </NavigationGroup>
297
+ );
298
+ })}
299
+ </>
300
+ );
301
+
302
+ additionalPluginChildrenStart = (
303
+ <div className="flex flex-col gap-2">
304
+ {customizationController.plugins
305
+ .filter((p) => p.homePage?.additionalChildrenStart)
306
+ .map((plugin, i) => (
307
+ <div key={`plugin_children_start_${i}`}>
308
+ {plugin.homePage!.additionalChildrenStart}
309
+ </div>
310
+ ))}
311
+ </div>
312
+ );
313
+
314
+ additionalPluginChildrenEnd = (
315
+ <div className="flex flex-col gap-2">
316
+ {customizationController.plugins
317
+ .filter((p) => p.homePage?.additionalChildrenEnd)
318
+ .map((plugin, i) => (
319
+ <div key={`plugin_children_end_${i}`}>
320
+ {plugin.homePage!.additionalChildrenEnd}
321
+ </div>
322
+ ))}
323
+ </div>
324
+ );
133
325
  }
134
326
 
327
+ /* ───────────────────────────────────────────────────────────────
328
+ Render
329
+ ─────────────────────────────────────────────────────────────── */
135
330
  return (
136
- <div id="home_page"
137
- ref={containerRef}
138
- className="py-2 overflow-auto h-full w-full">
139
- <Container maxWidth={"6xl"}>
331
+ <div ref={containerRef} className="py-2 overflow-auto h-full w-full">
332
+ <Container maxWidth="6xl">
333
+ {/* search & actions */}
140
334
  <div
141
335
  className="w-full sticky py-4 transition-all duration-400 ease-in-out top-0 z-10 flex flex-row gap-4"
142
- style={{ top: direction === "down" ? -84 : 0 }}>
143
- <SearchBar onTextSearch={updateSearchResults}
144
- placeholder={"Search collections"}
145
- large={false}
146
- innerClassName={"w-full"}
147
- className={"w-full flex-grow"}/>
336
+ style={{ top: direction === "down" ? -84 : 0 }}
337
+ >
338
+ <SearchBar
339
+ onTextSearch={updateSearch}
340
+ placeholder="Search collections"
341
+ autoFocus
342
+ innerClassName="w-full"
343
+ className="w-full flex-grow"
344
+ />
148
345
  {additionalActions}
149
346
  </div>
150
347
 
151
- <FavouritesView hidden={Boolean(filteredUrls)}/>
348
+ <FavouritesView hidden={performingSearch}/>
152
349
 
153
350
  {additionalChildrenStart}
154
-
155
351
  {additionalPluginChildrenStart}
156
352
 
157
- {allGroups.map((group, index) => {
158
-
159
- const AdditionalCards: React.ComponentType<PluginHomePageAdditionalCardsProps>[] = [];
160
- const actionProps: PluginHomePageAdditionalCardsProps = {
161
- group,
162
- context
163
- };
164
-
165
- if (customizationController.plugins) {
166
- customizationController.plugins.forEach(plugin => {
167
- if (plugin.homePage?.AdditionalCards) {
168
- AdditionalCards.push(...toArray(plugin.homePage?.AdditionalCards));
169
- }
170
- });
171
- }
172
-
173
- const thisGroupCollections = filteredNavigationEntries
174
- .filter((entry) => entry.group === group || (!entry.group && group === undefined));
175
- if (thisGroupCollections.length === 0 && AdditionalCards.length === 0)
176
- return null;
177
- return (
178
- <NavigationGroup
179
- group={group}
180
- key={`plugin_section_${group}`}>
181
-
182
- <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
183
- {thisGroupCollections.map((entry) => (
184
- <div key={`nav_${entry.group}_${entry.name}`} className="col-span-1">
185
- <NavigationCardBinding
186
- {...entry}
187
- onClick={() => {
188
- let event: CMSAnalyticsEvent;
189
- if (entry.type === "collection") {
190
- event = "home_navigate_to_collection";
191
- } else if (entry.type === "view") {
192
- event = "home_navigate_to_view";
193
- } else if (entry.type === "admin") {
194
- event = "home_navigate_to_admin_view";
195
- } else {
196
- event = "unmapped_event";
197
- }
198
- context.analyticsController?.onAnalyticsEvent?.(event, { path: entry.path });
199
- }}
200
- />
201
- </div>
202
- ))}
203
- {group?.toLowerCase() !== "admin" && AdditionalCards &&
204
- AdditionalCards.map((AdditionalCard, i) => (
205
- <div key={`nav_${group}_add_${i}`}>
206
- <AdditionalCard {...actionProps} />
207
- </div>
208
- ))}
353
+ {/* ─────── DND context ─────── */}
354
+ <DndContext
355
+ sensors={sensors}
356
+ collisionDetection={collisionDetection}
357
+ measuring={{
358
+ droppable: {
359
+ strategy: MeasuringStrategy.Always,
360
+ frequency: 500
361
+ }
362
+ }}
363
+ onDragStart={onDragStart}
364
+ onDragOver={onDragOver}
365
+ onDragEnd={onDragEnd}
366
+ onDragCancel={onDragCancel}
367
+ modifiers={dndModifiers}
368
+ >
369
+ <SortableContext
370
+ key={JSON.stringify(containers)}
371
+ items={containers}
372
+ strategy={verticalListSortingStrategy}
373
+ >
374
+ {items.map((groupData) => {
375
+ const groupKey = groupData.name;
376
+ const entriesInGroup = groupData.entries;
377
+
378
+ const AdditionalCards: React.ComponentType<PluginHomePageAdditionalCardsProps>[] =
379
+ [];
380
+ customizationController.plugins?.forEach((p) => {
381
+ if (p.homePage?.AdditionalCards)
382
+ AdditionalCards.push(
383
+ ...toArray(p.homePage.AdditionalCards)
384
+ );
385
+ });
386
+
387
+ const actionProps: PluginHomePageAdditionalCardsProps = {
388
+ group:
389
+ groupKey === DEFAULT_GROUP_NAME
390
+ ? undefined
391
+ : groupKey,
392
+ context
393
+ };
394
+
395
+ if (
396
+ entriesInGroup.length === 0 &&
397
+ (AdditionalCards.length === 0 || performingSearch) &&
398
+ !groupOrderFromNavController.includes(groupKey)
399
+ )
400
+ return null;
401
+
402
+ return (
403
+ <SortableNavigationGroup
404
+ key={groupKey}
405
+ groupName={groupKey}
406
+ disabled={dndDisabled}
407
+ >
408
+ <NavigationGroup
409
+ group={
410
+ groupKey === DEFAULT_GROUP_NAME
411
+ ? undefined
412
+ : groupKey
413
+ }
414
+ minimised={
415
+ draggingGroupId === groupKey &&
416
+ !isDraggingCardOnly
417
+ }
418
+ isPotentialCardDropTarget={
419
+ isDraggingCardOnly
420
+ }
421
+ dndDisabled={dndDisabled}
422
+ onEditGroup={() => {
423
+ if (dndDisabled) return;
424
+ setDialogOpenForGroup(groupKey);
425
+ }}
426
+ collapsed={isGroupCollapsed(groupKey)}
427
+ onToggleCollapsed={() => toggleGroupCollapsed(groupKey)}
428
+ >
429
+ <NavigationGroupDroppable
430
+ id={groupKey}
431
+ itemIds={entriesInGroup.map(
432
+ (e) => e.url
433
+ )}
434
+ isPotentialCardDropTarget={
435
+ isDraggingCardOnly
436
+ }
437
+ >
438
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 ">
439
+ {entriesInGroup.map(
440
+ (entry) => (
441
+ <SortableNavigationCard
442
+ key={entry.url}
443
+ entry={entry}
444
+ onClick={() => {
445
+ let event: CMSAnalyticsEvent =
446
+ "unmapped_event";
447
+ if (
448
+ entry.type ===
449
+ "collection"
450
+ )
451
+ event =
452
+ "home_navigate_to_collection";
453
+ else if (
454
+ entry.type ===
455
+ "view"
456
+ )
457
+ event =
458
+ "home_navigate_to_view";
459
+ else if (
460
+ entry.type ===
461
+ "admin"
462
+ )
463
+ event =
464
+ "home_navigate_to_admin_view";
465
+
466
+ context.analyticsController?.onAnalyticsEvent?.(
467
+ event,
468
+ {
469
+ path: entry.path
470
+ }
471
+ );
472
+ }}
473
+ />
474
+ )
475
+ )}
476
+ {!performingSearch &&
477
+ groupKey.toLowerCase() !==
478
+ ADMIN_GROUP_NAME.toLowerCase() &&
479
+ AdditionalCards.map(
480
+ (C, i) => (
481
+ <C
482
+ key={`extra_${groupKey}_${i}`}
483
+ {...actionProps}
484
+ />
485
+ )
486
+ )}
487
+ </div>
488
+ </NavigationGroupDroppable>
489
+ </NavigationGroup>
490
+ </SortableNavigationGroup>
491
+ );
492
+ })}
493
+ </SortableContext>
494
+
495
+ <NewGroupDropZone
496
+ disabled={dndDisabled}
497
+ setIsHovering={setIsHoveringNewGroupDropZone}
498
+ />
499
+
500
+ <DragOverlay adjustScale={false} dropAnimation={dropAnimation}>
501
+ {activeGroupData &&
502
+ draggingGroupId === activeGroupData.name ? (
503
+ <div
504
+ className="rounded-lg bg-transparent"
505
+ style={{
506
+ padding: 0,
507
+ margin: 0
508
+ }}
509
+ >
510
+ <NavigationGroup
511
+ group={
512
+ activeGroupData.name ===
513
+ DEFAULT_GROUP_NAME
514
+ ? undefined
515
+ : activeGroupData.name
516
+ }
517
+ isPreview={false}
518
+ minimised
519
+ />
209
520
  </div>
210
- </NavigationGroup>
211
- );
212
- })}
521
+ ) : activeItemForOverlay ? (
522
+ <NavigationCardBinding
523
+ {...activeItemForOverlay}
524
+ shrink={isHoveringNewGroupDropZone}
525
+ />
526
+ ) : null}
527
+ </DragOverlay>
528
+ </DndContext>
213
529
 
214
- {additionalPluginSections}
530
+ {!performingSearch && adminGroupData && (
531
+ <NavigationGroup
532
+ group={adminGroupData.name}
533
+ collapsed={isGroupCollapsed(adminGroupData.name)}
534
+ onToggleCollapsed={() => toggleGroupCollapsed(adminGroupData.name)}
535
+ >
536
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 ">
537
+ {adminGroupData.entries.map((entry) => (
538
+ <NavigationCardBinding
539
+ key={entry.url}
540
+ {...entry}
541
+ onClick={() => {
542
+ let event: CMSAnalyticsEvent =
543
+ "unmapped_event";
544
+ if (entry.type === "collection")
545
+ event =
546
+ "home_navigate_to_collection";
547
+ else if (entry.type === "view")
548
+ event = "home_navigate_to_view";
549
+ else if (entry.type === "admin")
550
+ event =
551
+ "home_navigate_to_admin_view";
215
552
 
216
- {additionalPluginChildrenEnd}
553
+ context.analyticsController?.onAnalyticsEvent?.(
554
+ event,
555
+ { path: entry.path }
556
+ );
557
+ }}
558
+ />
559
+ ))}
560
+ </div>
561
+ </NavigationGroup>
562
+ )}
217
563
 
564
+ {additionalPluginSections}
565
+ {additionalPluginChildrenEnd}
218
566
  {additionalChildrenEnd}
219
-
220
567
  </Container>
568
+
569
+ {dialogOpenForGroup && (
570
+ <RenameGroupDialog
571
+ open
572
+ initialName={dialogOpenForGroup}
573
+ existingGroupNames={items
574
+ .map((g) => g.name)
575
+ .filter((n) => n !== dialogOpenForGroup)}
576
+ onClose={() => setDialogOpenForGroup(null)}
577
+ onRename={(newName) => {
578
+ handleRenameGroup(dialogOpenForGroup, newName);
579
+ setDialogOpenForGroup(null);
580
+ }}
581
+ />
582
+ )}
221
583
  </div>
222
584
  );
223
585
  }