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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +3 -3
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +16 -0
  4. package/dist/app/Scaffold.d.ts +34 -0
  5. package/dist/app/index.d.ts +4 -0
  6. package/dist/app/useApp.d.ts +16 -0
  7. package/dist/components/ArrayContainer.d.ts +31 -12
  8. package/dist/components/CircularProgressCenter.d.ts +1 -1
  9. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  10. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +14 -13
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  15. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  16. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
  17. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  18. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  19. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  20. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
  21. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +20 -2
  22. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  23. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  24. package/dist/components/EntityJsonPreview.d.ts +3 -0
  25. package/dist/components/EntityPreview.d.ts +10 -7
  26. package/dist/components/ErrorView.d.ts +1 -1
  27. package/dist/components/HomePage/DefaultHomePage.d.ts +2 -15
  28. package/dist/components/HomePage/HomePageDnD.d.ts +77 -0
  29. package/dist/components/HomePage/NavigationCard.d.ts +3 -1
  30. package/dist/components/HomePage/NavigationCardBinding.d.ts +4 -3
  31. package/dist/components/HomePage/NavigationGroup.d.ts +8 -1
  32. package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
  33. package/dist/components/PropertyCollectionView.d.ts +23 -0
  34. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  35. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  36. package/dist/components/ReferenceWidget.d.ts +3 -1
  37. package/dist/components/SelectableTable/SelectableTable.d.ts +14 -4
  38. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  39. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  40. package/dist/components/UserDisplay.d.ts +7 -0
  41. package/dist/components/VirtualTable/VirtualTableProps.d.ts +24 -12
  42. package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
  43. package/dist/components/VirtualTable/types.d.ts +3 -3
  44. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  45. package/dist/components/common/index.d.ts +2 -1
  46. package/dist/components/common/table_height.d.ts +5 -0
  47. package/dist/components/common/types.d.ts +4 -6
  48. package/dist/components/common/useColumnsIds.d.ts +3 -1
  49. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  50. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  51. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  52. package/dist/components/index.d.ts +5 -2
  53. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  54. package/dist/contexts/InternalUserManagementContext.d.ts +3 -0
  55. package/dist/core/DefaultAppBar.d.ts +29 -0
  56. package/dist/core/DefaultDrawer.d.ts +19 -0
  57. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  58. package/dist/core/EntityEditView.d.ts +49 -11
  59. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  60. package/dist/core/FireCMS.d.ts +2 -3
  61. package/dist/core/FireCMSRouter.d.ts +4 -0
  62. package/dist/core/NavigationRoutes.d.ts +2 -3
  63. package/dist/core/SideDialogs.d.ts +4 -2
  64. package/dist/core/field_configs.d.ts +1 -1
  65. package/dist/core/index.d.ts +4 -4
  66. package/dist/form/EntityForm.d.ts +40 -64
  67. package/dist/form/EntityFormActions.d.ts +21 -0
  68. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  69. package/dist/form/components/ErrorFocus.d.ts +1 -1
  70. package/dist/form/components/FieldHelperText.d.ts +3 -3
  71. package/dist/form/components/FormEntry.d.ts +6 -0
  72. package/dist/form/components/FormLayout.d.ts +5 -0
  73. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  74. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  75. package/dist/form/components/LocalChangesMenu.d.ts +11 -0
  76. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  77. package/dist/form/components/index.d.ts +3 -1
  78. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  80. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  81. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  82. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  83. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  84. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  85. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  86. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  87. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  88. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  89. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  90. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +5 -13
  91. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  92. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  93. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +12 -0
  94. package/dist/form/index.d.ts +18 -18
  95. package/dist/form/useClearRestoreValue.d.ts +2 -2
  96. package/dist/hooks/data/delete.d.ts +4 -4
  97. package/dist/hooks/data/save.d.ts +4 -5
  98. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  99. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  100. package/dist/hooks/index.d.ts +3 -0
  101. package/dist/hooks/useAuthController.d.ts +1 -1
  102. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  103. package/dist/hooks/useBuildNavigationController.d.ts +57 -13
  104. package/dist/hooks/useCollapsedGroups.d.ts +9 -0
  105. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  106. package/dist/hooks/useInternalUserManagementController.d.ts +12 -0
  107. package/dist/hooks/useModeController.d.ts +1 -2
  108. package/dist/hooks/useProjectLog.d.ts +8 -2
  109. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  110. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  111. package/dist/index.d.ts +1 -0
  112. package/dist/index.es.js +24546 -13965
  113. package/dist/index.es.js.map +1 -1
  114. package/dist/index.umd.js +27256 -588
  115. package/dist/index.umd.js.map +1 -1
  116. package/dist/internal/useBuildDataSource.d.ts +3 -17
  117. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  118. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  119. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  120. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  121. package/dist/preview/components/ReferencePreview.d.ts +4 -3
  122. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  123. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  124. package/dist/preview/components/UserPreview.d.ts +8 -0
  125. package/dist/preview/index.d.ts +1 -0
  126. package/dist/preview/util.d.ts +3 -3
  127. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  128. package/dist/routes/FireCMSRoute.d.ts +1 -0
  129. package/dist/routes/HomePageRoute.d.ts +3 -0
  130. package/dist/types/analytics.d.ts +1 -1
  131. package/dist/types/auth.d.ts +8 -10
  132. package/dist/types/collections.d.ts +123 -25
  133. package/dist/types/customization_controller.d.ts +8 -0
  134. package/dist/types/datasource.d.ts +52 -36
  135. package/dist/types/dialogs_controller.d.ts +7 -3
  136. package/dist/types/entities.d.ts +12 -3
  137. package/dist/types/entity_actions.d.ts +72 -8
  138. package/dist/types/entity_callbacks.d.ts +16 -16
  139. package/dist/types/entity_overrides.d.ts +2 -2
  140. package/dist/types/export_import.d.ts +4 -4
  141. package/dist/types/fields.d.ts +79 -39
  142. package/dist/types/firecms.d.ts +31 -3
  143. package/dist/types/firecms_context.d.ts +17 -1
  144. package/dist/types/index.d.ts +1 -1
  145. package/dist/types/internal_user_management.d.ts +20 -0
  146. package/dist/types/navigation.d.ts +62 -19
  147. package/dist/types/permissions.d.ts +4 -4
  148. package/dist/types/plugins.d.ts +58 -13
  149. package/dist/types/properties.d.ts +122 -31
  150. package/dist/types/property_config.d.ts +1 -3
  151. package/dist/types/roles.d.ts +3 -0
  152. package/dist/types/side_dialogs_controller.d.ts +10 -0
  153. package/dist/types/side_entity_controller.d.ts +14 -1
  154. package/dist/types/storage.d.ts +75 -0
  155. package/dist/types/user.d.ts +2 -1
  156. package/dist/util/builders.d.ts +3 -3
  157. package/dist/util/callbacks.d.ts +2 -0
  158. package/dist/util/collections.d.ts +1 -0
  159. package/dist/util/createFormexStub.d.ts +2 -0
  160. package/dist/util/entities.d.ts +3 -3
  161. package/dist/util/entity_actions.d.ts +2 -0
  162. package/dist/util/entity_cache.d.ts +28 -0
  163. package/dist/util/icon_list.d.ts +5 -1
  164. package/dist/util/icon_synonyms.d.ts +1 -98
  165. package/dist/util/icons.d.ts +7 -4
  166. package/dist/util/index.d.ts +3 -0
  167. package/dist/util/make_properties_editable.d.ts +1 -2
  168. package/dist/util/navigation_from_path.d.ts +10 -1
  169. package/dist/util/navigation_utils.d.ts +15 -3
  170. package/dist/util/objects.d.ts +3 -1
  171. package/dist/util/permissions.d.ts +4 -4
  172. package/dist/util/plurals.d.ts +0 -2
  173. package/dist/util/property_utils.d.ts +4 -4
  174. package/dist/util/references.d.ts +2 -2
  175. package/dist/util/resolutions.d.ts +42 -17
  176. package/dist/util/storage.d.ts +23 -2
  177. package/dist/util/useStorageUploadController.d.ts +4 -3
  178. package/package.json +70 -53
  179. package/src/app/AppBar.tsx +18 -0
  180. package/src/app/Drawer.tsx +24 -0
  181. package/src/app/Scaffold.tsx +253 -0
  182. package/src/app/index.ts +4 -0
  183. package/src/app/useApp.tsx +32 -0
  184. package/src/components/ArrayContainer.tsx +447 -229
  185. package/src/components/CircularProgressCenter.tsx +2 -2
  186. package/src/components/ClearFilterSortButton.tsx +41 -0
  187. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
  188. package/src/components/DeleteEntityDialog.tsx +13 -20
  189. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +87 -62
  190. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  191. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  192. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +84 -42
  193. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  194. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  195. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  196. package/src/components/EntityCollectionTable/index.tsx +1 -1
  197. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +34 -39
  198. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +49 -36
  199. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  200. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +135 -105
  201. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
  202. package/src/components/EntityCollectionView/EntityCollectionView.tsx +241 -119
  203. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
  204. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  205. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  206. package/src/components/EntityCollectionView/utils.ts +19 -0
  207. package/src/components/EntityJsonPreview.tsx +66 -0
  208. package/src/components/EntityPreview.tsx +83 -62
  209. package/src/components/EntityView.tsx +34 -42
  210. package/src/components/ErrorView.tsx +4 -4
  211. package/src/components/FireCMSLogo.tsx +7 -51
  212. package/src/components/HomePage/DefaultHomePage.tsx +516 -158
  213. package/src/components/HomePage/FavouritesView.tsx +9 -14
  214. package/src/components/HomePage/HomePageDnD.tsx +702 -0
  215. package/src/components/HomePage/NavigationCard.tsx +48 -39
  216. package/src/components/HomePage/NavigationCardBinding.tsx +17 -16
  217. package/src/components/HomePage/NavigationGroup.tsx +144 -30
  218. package/src/components/HomePage/RenameGroupDialog.tsx +123 -0
  219. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  220. package/src/components/NotFoundPage.tsx +2 -2
  221. package/src/components/PropertyCollectionView.tsx +329 -0
  222. package/src/components/PropertyConfigBadge.tsx +10 -4
  223. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  224. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +23 -13
  225. package/src/components/ReferenceWidget.tsx +21 -11
  226. package/src/components/SearchIconsView.tsx +10 -7
  227. package/src/components/SelectableTable/SelectableTable.tsx +157 -157
  228. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  229. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +27 -9
  230. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  231. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -24
  232. package/src/components/UnsavedChangesDialog.tsx +46 -0
  233. package/src/components/UserDisplay.tsx +55 -0
  234. package/src/components/VirtualTable/VirtualTable.tsx +105 -51
  235. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  236. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  237. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  238. package/src/components/VirtualTable/VirtualTableProps.tsx +28 -14
  239. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  240. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  241. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
  242. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  243. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  244. package/src/components/VirtualTable/fields/VirtualTableUserSelect.tsx +99 -0
  245. package/src/components/VirtualTable/types.tsx +2 -3
  246. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +64 -44
  247. package/src/components/common/index.ts +2 -1
  248. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  249. package/src/components/common/types.tsx +4 -6
  250. package/src/components/common/useColumnsIds.tsx +16 -2
  251. package/src/components/common/useDataSourceTableController.tsx +420 -0
  252. package/src/components/common/useDebouncedCallback.tsx +20 -0
  253. package/src/components/common/useScrollRestoration.tsx +68 -0
  254. package/src/components/common/useTableSearchHelper.ts +53 -12
  255. package/src/components/index.tsx +6 -2
  256. package/src/contexts/BreacrumbsContext.tsx +38 -0
  257. package/src/contexts/DialogsProvider.tsx +5 -4
  258. package/src/contexts/InternalUserManagementContext.tsx +4 -0
  259. package/src/contexts/ModeController.tsx +1 -3
  260. package/src/contexts/SnackbarProvider.tsx +2 -0
  261. package/src/core/DefaultAppBar.tsx +219 -0
  262. package/src/core/DefaultDrawer.tsx +185 -0
  263. package/src/core/DrawerNavigationItem.tsx +66 -0
  264. package/src/core/EntityEditView.tsx +447 -469
  265. package/src/core/EntityEditViewFormActions.tsx +344 -0
  266. package/src/core/EntitySidePanel.tsx +96 -23
  267. package/src/core/FireCMS.tsx +85 -60
  268. package/src/core/FireCMSRouter.tsx +17 -0
  269. package/src/core/NavigationRoutes.tsx +28 -38
  270. package/src/core/SideDialogs.tsx +22 -12
  271. package/src/core/field_configs.tsx +41 -14
  272. package/src/core/index.tsx +6 -5
  273. package/src/form/EntityForm.tsx +740 -523
  274. package/src/form/EntityFormActions.tsx +226 -0
  275. package/src/form/PropertyFieldBinding.tsx +88 -41
  276. package/src/form/components/CustomIdField.tsx +9 -3
  277. package/src/form/components/ErrorFocus.tsx +22 -29
  278. package/src/form/components/FieldHelperText.tsx +4 -4
  279. package/src/form/components/FormEntry.tsx +22 -0
  280. package/src/form/components/FormLayout.tsx +16 -0
  281. package/src/form/components/LabelWithIcon.tsx +30 -19
  282. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  283. package/src/form/components/LocalChangesMenu.tsx +144 -0
  284. package/src/form/components/StorageItemPreview.tsx +23 -13
  285. package/src/form/components/StorageUploadProgress.tsx +5 -6
  286. package/src/form/components/index.tsx +3 -1
  287. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +34 -19
  288. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +50 -36
  289. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -33
  290. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  291. package/src/form/field_bindings/KeyValueFieldBinding.tsx +61 -52
  292. package/src/form/field_bindings/MapFieldBinding.tsx +73 -55
  293. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
  294. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
  295. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  296. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  297. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  298. package/src/form/field_bindings/RepeatFieldBinding.tsx +62 -35
  299. package/src/form/field_bindings/SelectFieldBinding.tsx +24 -15
  300. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +257 -199
  301. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  302. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  303. package/src/form/field_bindings/UserSelectFieldBinding.tsx +94 -0
  304. package/src/form/index.tsx +21 -37
  305. package/src/form/useClearRestoreValue.tsx +2 -2
  306. package/src/form/validation.ts +13 -23
  307. package/src/hooks/data/delete.ts +6 -5
  308. package/src/hooks/data/save.ts +26 -33
  309. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  310. package/src/hooks/data/useDataSource.tsx +11 -3
  311. package/src/hooks/data/useEntityFetch.tsx +10 -6
  312. package/src/hooks/index.tsx +4 -0
  313. package/src/hooks/useAuthController.tsx +1 -1
  314. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  315. package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
  316. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  317. package/src/hooks/useBuildModeController.tsx +22 -29
  318. package/src/hooks/useBuildNavigationController.tsx +515 -121
  319. package/src/hooks/useCollapsedGroups.ts +64 -0
  320. package/src/hooks/useFireCMSContext.tsx +9 -35
  321. package/src/hooks/useInternalUserManagementController.tsx +16 -0
  322. package/src/hooks/useLargeLayout.tsx +0 -35
  323. package/src/hooks/useModeController.tsx +1 -2
  324. package/src/hooks/useProjectLog.tsx +32 -10
  325. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  326. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  327. package/src/index.ts +1 -0
  328. package/src/internal/useBuildDataSource.ts +79 -85
  329. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  330. package/src/internal/useBuildSideEntityController.tsx +204 -77
  331. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  332. package/src/preview/PropertyPreview.tsx +42 -25
  333. package/src/preview/PropertyPreviewProps.tsx +7 -1
  334. package/src/preview/components/BooleanPreview.tsx +2 -2
  335. package/src/preview/components/EmptyValue.tsx +1 -1
  336. package/src/preview/components/EnumValuesChip.tsx +2 -2
  337. package/src/preview/components/ImagePreview.tsx +26 -37
  338. package/src/preview/components/ReferencePreview.tsx +30 -38
  339. package/src/preview/components/StorageThumbnail.tsx +5 -1
  340. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  341. package/src/preview/components/UserPreview.tsx +27 -0
  342. package/src/preview/index.ts +1 -0
  343. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -6
  344. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +7 -5
  345. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -4
  346. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -4
  347. package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -6
  348. package/src/preview/property_previews/ArrayPropertyPreview.tsx +8 -7
  349. package/src/preview/property_previews/MapPropertyPreview.tsx +14 -13
  350. package/src/preview/property_previews/NumberPropertyPreview.tsx +2 -2
  351. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  352. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  353. package/src/preview/util.ts +10 -10
  354. package/src/routes/CustomCMSRoute.tsx +21 -0
  355. package/src/routes/FireCMSRoute.tsx +246 -0
  356. package/src/routes/HomePageRoute.tsx +17 -0
  357. package/src/types/analytics.ts +3 -0
  358. package/src/types/auth.tsx +9 -13
  359. package/src/types/collections.ts +146 -30
  360. package/src/types/customization_controller.tsx +9 -1
  361. package/src/types/datasource.ts +61 -43
  362. package/src/types/dialogs_controller.tsx +7 -3
  363. package/src/types/entities.ts +19 -3
  364. package/src/types/entity_actions.tsx +86 -10
  365. package/src/types/entity_callbacks.ts +18 -18
  366. package/src/types/entity_overrides.tsx +2 -2
  367. package/src/types/export_import.ts +4 -4
  368. package/src/types/fields.tsx +91 -42
  369. package/src/types/firecms.tsx +34 -4
  370. package/src/types/firecms_context.tsx +18 -1
  371. package/src/types/index.ts +1 -1
  372. package/src/types/internal_user_management.ts +24 -0
  373. package/src/types/navigation.ts +77 -24
  374. package/src/types/permissions.ts +5 -5
  375. package/src/types/plugins.tsx +69 -15
  376. package/src/types/properties.ts +141 -33
  377. package/src/types/property_config.tsx +2 -2
  378. package/src/types/roles.ts +3 -0
  379. package/src/types/side_dialogs_controller.tsx +15 -0
  380. package/src/types/side_entity_controller.tsx +16 -1
  381. package/src/types/storage.ts +83 -1
  382. package/src/types/user.ts +3 -1
  383. package/src/util/builders.ts +10 -8
  384. package/src/util/callbacks.ts +119 -0
  385. package/src/util/collections.ts +8 -0
  386. package/src/util/createFormexStub.tsx +66 -0
  387. package/src/util/entities.ts +11 -8
  388. package/src/util/entity_actions.ts +28 -0
  389. package/src/util/entity_cache.ts +223 -0
  390. package/src/util/enums.ts +1 -1
  391. package/src/util/icon_list.ts +16 -10
  392. package/src/util/icon_synonyms.ts +3 -100
  393. package/src/util/icons.tsx +36 -11
  394. package/src/util/index.ts +3 -0
  395. package/src/util/join_collections.ts +11 -4
  396. package/src/util/make_properties_editable.ts +5 -19
  397. package/src/util/navigation_from_path.ts +33 -12
  398. package/src/util/navigation_utils.ts +141 -25
  399. package/src/util/objects.ts +128 -33
  400. package/src/util/parent_references_from_path.ts +3 -3
  401. package/src/util/permissions.ts +9 -8
  402. package/src/util/plurals.ts +0 -2
  403. package/src/util/property_utils.tsx +17 -6
  404. package/src/util/references.ts +19 -8
  405. package/src/util/resolutions.ts +122 -48
  406. package/src/util/storage.ts +79 -21
  407. package/src/util/strings.ts +2 -2
  408. package/src/util/useStorageUploadController.tsx +162 -62
  409. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
  410. package/dist/components/FireCMSAppBar.d.ts +0 -26
  411. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  412. package/dist/components/VirtualTable/common.d.ts +0 -2
  413. package/dist/core/Drawer.d.ts +0 -23
  414. package/dist/core/Scaffold.d.ts +0 -55
  415. package/dist/core/SideEntityView.d.ts +0 -7
  416. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  417. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  418. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  419. package/dist/internal/useLocaleConfig.d.ts +0 -1
  420. package/dist/types/appcheck.d.ts +0 -26
  421. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
  422. package/src/components/FireCMSAppBar.tsx +0 -165
  423. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  424. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  425. package/src/core/Drawer.tsx +0 -191
  426. package/src/core/Scaffold.tsx +0 -281
  427. package/src/core/SideEntityView.tsx +0 -38
  428. package/src/form/components/FormikArrayContainer.tsx +0 -44
  429. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  430. package/src/internal/useBuildCustomizationController.tsx +0 -5
  431. package/src/internal/useLocaleConfig.tsx +0 -18
  432. package/src/types/appcheck.ts +0 -29
  433. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -8,6 +8,8 @@ import {
8
8
  Entity,
9
9
  EntityAction,
10
10
  EntityCollection,
11
+ EntityReference,
12
+ EntityTableController,
11
13
  FilterValues,
12
14
  PartialEntityCollection,
13
15
  PropertyOrBuilder,
@@ -17,7 +19,7 @@ import {
17
19
  import {
18
20
  EntityCollectionRowActions,
19
21
  EntityCollectionTable,
20
- useDataSourceEntityCollectionTableController
22
+ useDataSourceTableController
21
23
  } from "../EntityCollectionTable";
22
24
 
23
25
  import {
@@ -26,7 +28,10 @@ import {
26
28
  canEditEntity,
27
29
  getPropertyInPath,
28
30
  mergeDeep,
31
+ mergeEntityActions,
32
+ navigateToEntity,
29
33
  resolveCollection,
34
+ resolveEntityAction,
30
35
  resolveProperty
31
36
  } from "../../util";
32
37
  import { ReferencePreview } from "../../preview";
@@ -35,6 +40,7 @@ import {
35
40
  useAuthController,
36
41
  useCustomizationController,
37
42
  useDataSource,
43
+ useFireCMSContext,
38
44
  useLargeLayout,
39
45
  useNavigationController,
40
46
  useSideEntityController
@@ -44,7 +50,8 @@ import { EntityCollectionViewActions } from "./EntityCollectionViewActions";
44
50
  import {
45
51
  AddIcon,
46
52
  Button,
47
- cn,
53
+ cls,
54
+ focusedDisabled,
48
55
  IconButton,
49
56
  KeyboardTabIcon,
50
57
  Markdown,
@@ -57,6 +64,10 @@ import {
57
64
  import { setIn } from "@firecms/formex";
58
65
  import { getSubcollectionColumnId } from "../EntityCollectionTable/internal/common";
59
66
  import {
67
+ COLLECTION_GROUP_PARENT_ID,
68
+ copyEntityAction,
69
+ deleteEntityAction,
70
+ editEntityAction,
60
71
  OnCellValueChange,
61
72
  OnColumnResizeParams,
62
73
  UniqueFieldValidator,
@@ -65,25 +76,44 @@ import {
65
76
  } from "../common";
66
77
  import { PopupFormField } from "../EntityCollectionTable/internal/popup_field/PopupFormField";
67
78
  import { GetPropertyForProps } from "../EntityCollectionTable/EntityCollectionTableProps";
68
- import {
69
- copyEntityAction,
70
- deleteEntityAction,
71
- editEntityAction
72
- } from "../EntityCollectionTable/internal/default_entity_actions";
73
79
  import { DeleteEntityDialog } from "../DeleteEntityDialog";
74
80
  import { useAnalyticsController } from "../../hooks/useAnalyticsController";
75
81
  import { useSelectionController } from "./useSelectionController";
82
+ import { EntityCollectionViewStartActions } from "./EntityCollectionViewStartActions";
83
+ import { addRecentId, getRecentIds } from "./utils";
84
+ import { useScrollRestoration } from "../common/useScrollRestoration";
76
85
 
77
- const COLLECTION_GROUP_PARENT_ID = "collectionGroupParent";
86
+ const DEFAULT_ENTITY_OPEN_MODE: "side_panel" | "full_screen" = "side_panel";
78
87
 
79
88
  /**
80
89
  * @group Components
81
90
  */
82
91
  export type EntityCollectionViewProps<M extends Record<string, any>> = {
83
- fullPath: string;
92
+ /**
93
+ * Complete path where this collection is located.
94
+ * It defaults to the collection path if not provided.
95
+ */
96
+ fullPath?: string;
97
+ /**
98
+ * Full path using navigation ids.
99
+ */
100
+ fullIdPath?: string;
101
+ /**
102
+ * If this is a subcollection, specify the parent collection ids.
103
+ */
84
104
  parentCollectionIds?: string[];
105
+ /**
106
+ * Whether this is a subcollection or not.
107
+ */
85
108
  isSubCollection?: boolean;
109
+
86
110
  className?: string;
111
+
112
+ /**
113
+ * If true, this view will store its filter and sorting status in the url params
114
+ */
115
+ updateUrl?: boolean;
116
+
87
117
  } & EntityCollection<M>;
88
118
 
89
119
  /**
@@ -107,42 +137,49 @@ export type EntityCollectionViewProps<M extends Record<string, any>> = {
107
137
  *
108
138
  * @param fullPath
109
139
  * @param collection
110
- * @constructor
140
+
111
141
  * @group Components
112
142
  */
113
143
  export const EntityCollectionView = React.memo(
114
144
  function EntityCollectionView<M extends Record<string, any>>({
115
- fullPath,
145
+ fullPath: fullPathProp,
146
+ fullIdPath,
116
147
  parentCollectionIds,
117
148
  isSubCollection,
118
149
  className,
150
+ updateUrl,
119
151
  ...collectionProp
120
152
  }: EntityCollectionViewProps<M>
121
153
  ) {
122
154
 
123
- const dataSource = useDataSource(collectionProp);
155
+ const context = useFireCMSContext();
124
156
  const navigation = useNavigationController();
157
+ const fullPath = fullPathProp ?? collectionProp.path;
158
+ const dataSource = useDataSource(collectionProp);
125
159
  const sideEntityController = useSideEntityController();
126
160
  const authController = useAuthController();
127
161
  const userConfigPersistence = useUserConfigurationPersistence();
128
162
  const analyticsController = useAnalyticsController();
129
163
  const customizationController = useCustomizationController();
130
164
 
131
-
132
165
  const containerRef = React.useRef<HTMLDivElement>(null);
133
166
 
167
+ const scrollRestoration = useScrollRestoration();
168
+
134
169
  const collection = useMemo(() => {
135
170
  const userOverride = userConfigPersistence?.getCollectionConfig<M>(fullPath);
136
171
  return (userOverride ? mergeDeep(collectionProp, userOverride) : collectionProp) as EntityCollection<M>;
137
172
  }, [collectionProp, fullPath, userConfigPersistence?.getCollectionConfig]);
138
173
 
174
+ const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
175
+
139
176
  const collectionRef = React.useRef(collection);
140
177
  useEffect(() => {
141
178
  collectionRef.current = collection;
142
179
  }, [collection]);
143
180
 
144
181
  const canCreateEntities = canCreateEntity(collection, authController, fullPath, null);
145
- const [selectedNavigationEntity, setSelectedNavigationEntity] = useState<Entity<M> | undefined>(undefined);
182
+ const [highlightedEntity, setHighlightedEntity] = useState<Entity<M> | undefined>(undefined);
146
183
  const [deleteEntityClicked, setDeleteEntityClicked] = React.useState<Entity<M> | Entity<M>[] | undefined>(undefined);
147
184
 
148
185
  const [lastDeleteTimestamp, setLastDeleteTimestamp] = React.useState<number>(0);
@@ -151,12 +188,12 @@ export const EntityCollectionView = React.memo(
151
188
  const [docsCount, setDocsCount] = useState<number>(0);
152
189
 
153
190
  const unselectNavigatedEntity = useCallback(() => {
154
- const currentSelection = selectedNavigationEntity;
191
+ const currentSelection = highlightedEntity;
155
192
  setTimeout(() => {
156
- if (currentSelection === selectedNavigationEntity)
157
- setSelectedNavigationEntity(undefined);
193
+ if (currentSelection === highlightedEntity)
194
+ setHighlightedEntity(undefined);
158
195
  }, 2400);
159
- }, [selectedNavigationEntity]);
196
+ }, [highlightedEntity]);
160
197
 
161
198
  const checkInlineEditing = useCallback((entity?: Entity<any>): boolean => {
162
199
  const collection = collectionRef.current;
@@ -175,20 +212,15 @@ export const EntityCollectionView = React.memo(
175
212
  const usedSelectionController = collection.selectionController ?? selectionController;
176
213
  const {
177
214
  selectedEntities,
178
- toggleEntitySelection,
179
- isEntitySelected,
180
215
  setSelectedEntities
181
216
  } = usedSelectionController;
182
217
 
183
- useEffect(() => {
184
- setDeleteEntityClicked(undefined);
185
- }, [selectedEntities]);
186
-
187
- const tableController = useDataSourceEntityCollectionTableController<M>({
218
+ const tableController = useDataSourceTableController<M>({
188
219
  fullPath,
189
- collection: collectionRef.current,
190
- entitiesDisplayedFirst: [],
191
- lastDeleteTimestamp
220
+ collection,
221
+ lastDeleteTimestamp,
222
+ scrollRestoration,
223
+ updateUrl
192
224
  });
193
225
 
194
226
  const tableKey = React.useRef<string>(Math.random().toString(36));
@@ -199,34 +231,45 @@ export const EntityCollectionView = React.memo(
199
231
  }, [tableController.setPopupCell]);
200
232
 
201
233
  const onEntityClick = useCallback((clickedEntity: Entity<M>) => {
202
- console.log("Entity clicked", clickedEntity)
203
234
  const collection = collectionRef.current;
204
- setSelectedNavigationEntity(clickedEntity);
235
+ setHighlightedEntity(clickedEntity);
205
236
  analyticsController.onAnalyticsEvent?.("edit_entity_clicked", {
206
237
  path: clickedEntity.path,
207
238
  entityId: clickedEntity.id
208
239
  });
209
- return sideEntityController.open({
210
- entityId: clickedEntity.id,
211
- path: clickedEntity.path,
240
+
241
+ if (collection) {
242
+ addRecentId(collection.id, clickedEntity.id);
243
+ }
244
+
245
+ const path = collection?.collectionGroup ? clickedEntity.path : (fullPath ?? clickedEntity.path);
246
+ navigateToEntity({
247
+ navigation,
248
+ path,
249
+ fullIdPath,
250
+ sideEntityController,
251
+ openEntityMode,
212
252
  collection,
213
- updateUrl: true,
214
- onClose: unselectNavigatedEntity,
253
+ entityId: clickedEntity.id
215
254
  });
255
+
216
256
  }, [unselectNavigatedEntity, sideEntityController]);
217
257
 
218
258
  const onNewClick = useCallback(() => {
219
-
220
259
  const collection = collectionRef.current;
221
260
  analyticsController.onAnalyticsEvent?.("new_entity_click", {
222
261
  path: fullPath
223
262
  });
224
- sideEntityController.open({
225
- path: fullPath,
263
+ navigateToEntity({
264
+ openEntityMode,
226
265
  collection,
227
- updateUrl: true,
228
- onClose: unselectNavigatedEntity,
229
- });
266
+ entityId: undefined,
267
+ path: fullPath,
268
+ fullIdPath,
269
+ sideEntityController,
270
+ navigation,
271
+ onClose: unselectNavigatedEntity
272
+ })
230
273
  }, [fullPath, sideEntityController]);
231
274
 
232
275
  const onMultipleDeleteClick = () => {
@@ -257,6 +300,7 @@ export const EntityCollectionView = React.memo(
257
300
  fullPath: string,
258
301
  parentCollectionIds: string[],
259
302
  collection: EntityCollection;
303
+ tableController: EntityTableController;
260
304
  }> | undefined
261
305
 
262
306
  // we are only using the first plugin that implements this
@@ -297,23 +341,21 @@ export const EntityCollectionView = React.memo(
297
341
  value,
298
342
  property,
299
343
  entityId
300
- }) => dataSource.checkUniqueField(fullPath, name, value, entityId),
344
+ }) => dataSource.checkUniqueField(fullPath, name, value, entityId, collection),
301
345
  [fullPath]);
302
346
 
303
347
  const onValueChange: OnCellValueChange<any, any> = ({
304
- fullPath,
305
- context,
306
348
  value,
307
349
  propertyKey,
308
350
  onValueUpdated,
309
351
  setError,
310
- entity,
352
+ data: entity,
311
353
  }) => {
312
354
 
313
355
  const updatedValues = setIn({ ...entity.values }, propertyKey, value);
314
356
 
315
357
  const saveProps: SaveEntityProps = {
316
- path: fullPath,
358
+ path: entity.path ?? fullPath,
317
359
  entityId: entity.id,
318
360
  values: updatedValues,
319
361
  previousValues: entity.values,
@@ -324,29 +366,36 @@ export const EntityCollectionView = React.memo(
324
366
  return saveEntityWithCallbacks({
325
367
  ...saveProps,
326
368
  collection,
327
- callbacks: collection.callbacks,
328
369
  dataSource,
329
370
  context,
330
- onSaveSuccess: () => onValueUpdated(),
371
+ onSaveSuccess: () => {
372
+ setError(undefined);
373
+ onValueUpdated();
374
+ },
331
375
  onSaveFailure: (e: Error) => {
332
376
  console.error("Save failure");
333
377
  console.error(e);
334
378
  setError(e);
379
+ },
380
+ onPreSaveHookError: (e: Error) => {
381
+ console.error("Pre-save hook error");
382
+ console.error(e);
383
+ setError(e);
335
384
  }
336
385
  });
337
386
 
338
387
  };
339
388
 
340
- const resolvedFullPath = navigation.resolveAliasesFrom(fullPath);
389
+ const resolvedFullPath = navigation.resolveIdsFrom(fullPath);
341
390
  const resolvedCollection = useMemo(() => resolveCollection<M>({
342
391
  collection,
343
392
  path: fullPath,
344
- fields: customizationController.propertyConfigs
393
+ propertyConfigs: customizationController.propertyConfigs,
394
+ authController,
345
395
  }), [collection, fullPath]);
346
396
 
347
397
  const getPropertyFor = useCallback(({
348
398
  propertyKey,
349
- propertyValue,
350
399
  entity
351
400
  }: GetPropertyForProps<M>) => {
352
401
  let propertyOrBuilder: PropertyOrBuilder<any, M> | undefined = getPropertyInPath<M>(collection.properties, propertyKey);
@@ -360,13 +409,13 @@ export const EntityCollectionView = React.memo(
360
409
  return resolveProperty({
361
410
  propertyKey,
362
411
  propertyOrBuilder,
363
- path: fullPath,
364
- propertyValue,
412
+ path: entity.path,
365
413
  values: entity.values,
366
414
  entityId: entity.id,
367
- fields: customizationController.propertyConfigs
415
+ propertyConfigs: customizationController.propertyConfigs,
416
+ authController
368
417
  });
369
- }, [collection.properties, customizationController.propertyConfigs, fullPath, resolvedCollection.properties]);
418
+ }, [collection.properties, customizationController.propertyConfigs, resolvedCollection.properties]);
370
419
 
371
420
  const displayedColumnIds = useColumnIds(resolvedCollection, true);
372
421
 
@@ -380,16 +429,20 @@ export const EntityCollectionView = React.memo(
380
429
  Builder: ({ entity }) => (
381
430
  <Button color={"primary"}
382
431
  variant={"outlined"}
432
+ className={"max-w-full truncate justify-start"}
383
433
  startIcon={<KeyboardTabIcon size={"small"}/>}
384
434
  onClick={(event: any) => {
385
435
  event.stopPropagation();
386
- sideEntityController.open({
387
- path: fullPath,
388
- entityId: entity.id,
389
- selectedSubPath: subcollection.id ?? subcollection.path,
436
+ navigateToEntity({
437
+ openEntityMode,
390
438
  collection,
391
- updateUrl: true,
392
- });
439
+ entityId: entity.id,
440
+ selectedTab: subcollection.id ?? subcollection.path,
441
+ path: fullPath,
442
+ fullIdPath,
443
+ navigation,
444
+ sideEntityController
445
+ })
393
446
  }}>
394
447
  {subcollection.name}
395
448
  </Button>
@@ -406,16 +459,16 @@ export const EntityCollectionView = React.memo(
406
459
  Builder: ({ entity }) => {
407
460
  const collectionsWithPath = navigation.getParentReferencesFromPath(entity.path);
408
461
  return (
409
- <>
462
+ <div className={"flex flex-col gap-2 w-full"}>
410
463
  {collectionsWithPath.map((reference) => {
411
464
  return (
412
465
  <ReferencePreview
413
466
  key={reference.path + "/" + reference.id}
414
467
  reference={reference}
415
- size={"tiny"}/>
468
+ size={"small"}/>
416
469
  );
417
470
  })}
418
- </>
471
+ </div>
419
472
  );
420
473
  }
421
474
  }]
@@ -448,7 +501,7 @@ export const EntityCollectionView = React.memo(
448
501
  if (deleteEnabled)
449
502
  actions.push(deleteEntityAction);
450
503
  if (customEntityActions)
451
- actions.push(...customEntityActions);
504
+ return mergeEntityActions(actions, customEntityActions);
452
505
  return actions;
453
506
  };
454
507
 
@@ -460,23 +513,26 @@ export const EntityCollectionView = React.memo(
460
513
  return (largeLayout ? (80 + actionsWidth) : (70 + actionsWidth)) + (collapsedActions.length > 0 ? (largeLayout ? 40 : 30) : 0);
461
514
  };
462
515
 
463
- const tableRowActionsBuilder = ({
464
- entity,
465
- size,
466
- width,
467
- frozen
468
- }: {
516
+ const tableRowActionsBuilder = useCallback(({
517
+ entity,
518
+ size,
519
+ width,
520
+ frozen
521
+ }: {
469
522
  entity: Entity<any>,
470
523
  size: CollectionSize,
471
524
  width: number,
472
525
  frozen?: boolean
473
526
  }) => {
474
527
 
475
- const isSelected = isEntitySelected(entity);
528
+ const isSelected = Boolean(usedSelectionController.selectedEntities.find(e => e.id == entity.id && e.path == entity.path));
529
+ const customEntityActions = (collection.entityActions ?? [])
530
+ .map(action => resolveEntityAction(action, customizationController.entityActions))
531
+ .filter(Boolean) as EntityAction[];
476
532
 
477
533
  const actions = getActionsForEntity({
478
534
  entity,
479
- customEntityActions: collection.entityActions
535
+ customEntityActions
480
536
  });
481
537
 
482
538
  return (
@@ -487,18 +543,20 @@ export const EntityCollectionView = React.memo(
487
543
  isSelected={isSelected}
488
544
  selectionEnabled={selectionEnabled}
489
545
  size={size}
490
- highlightEntity={setSelectedNavigationEntity}
546
+ highlightEntity={setHighlightedEntity}
491
547
  unhighlightEntity={unselectNavigatedEntity}
492
548
  collection={collection}
493
549
  fullPath={fullPath}
550
+ fullIdPath={fullIdPath}
494
551
  actions={actions}
495
552
  hideId={collection?.hideIdFromCollection}
496
553
  onCollectionChange={updateLastDeleteTimestamp}
497
554
  selectionController={usedSelectionController}
555
+ openEntityMode={openEntityMode}
498
556
  />
499
557
  );
500
558
 
501
- };
559
+ }, [updateLastDeleteTimestamp, usedSelectionController]);
502
560
 
503
561
  const title = <Popover
504
562
  open={popOverOpen}
@@ -528,7 +586,7 @@ export const EntityCollectionView = React.memo(
528
586
  </div>}
529
587
  >
530
588
 
531
- {collection.description && <div className="m-4 text-gray-900 dark:text-white">
589
+ {collection.description && <div className="m-4 text-surface-900 dark:text-white">
532
590
  <Markdown source={collection.description}/>
533
591
  </div>}
534
592
 
@@ -557,6 +615,7 @@ export const EntityCollectionView = React.memo(
557
615
  property={property}
558
616
  fullPath={fullPath}
559
617
  collection={collection}
618
+ tableController={tableController}
560
619
  parentCollectionIds={parentCollectionIds ?? []}/>;
561
620
  })}
562
621
  </>;
@@ -567,7 +626,8 @@ export const EntityCollectionView = React.memo(
567
626
  if (typeof AddColumnComponent === "function")
568
627
  return <AddColumnComponent fullPath={fullPath}
569
628
  parentCollectionIds={parentCollectionIds ?? []}
570
- collection={collection}/>;
629
+ collection={collection}
630
+ tableController={tableController}/>;
571
631
  return null;
572
632
  }
573
633
  : undefined;
@@ -584,12 +644,13 @@ export const EntityCollectionView = React.memo(
584
644
  });
585
645
 
586
646
  return (
587
- <div className={cn("overflow-hidden h-full w-full rounded-md", className)}
647
+ <div className={cls("overflow-hidden h-full w-full rounded-md", className)}
588
648
  ref={containerRef}>
589
649
  <EntityCollectionTable
590
650
  key={`collection_table_${fullPath}`}
591
651
  additionalFields={additionalFields}
592
652
  tableController={tableController}
653
+ enablePopupIcon={true}
593
654
  displayedColumnIds={displayedColumnIds}
594
655
  onSizeChanged={onSizeChanged}
595
656
  onEntityClick={onEntityClick}
@@ -599,13 +660,23 @@ export const EntityCollectionView = React.memo(
599
660
  uniqueFieldValidator={uniqueFieldValidator}
600
661
  title={title}
601
662
  selectionController={usedSelectionController}
602
- highlightedEntities={selectedNavigationEntity ? [selectedNavigationEntity] : []}
663
+ highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
603
664
  defaultSize={collection.defaultSize}
604
665
  properties={resolvedCollection.properties}
605
666
  getPropertyFor={getPropertyFor}
606
667
  onTextSearchClick={textSearchInitialised ? undefined : onTextSearchClick}
668
+ onScroll={tableController.onScroll}
669
+ initialScroll={tableController.initialScroll}
607
670
  textSearchLoading={textSearchLoading}
608
671
  textSearchEnabled={textSearchEnabled}
672
+ actionsStart={<EntityCollectionViewStartActions
673
+ parentCollectionIds={parentCollectionIds ?? []}
674
+ collection={collection}
675
+ tableController={tableController}
676
+ path={fullPath}
677
+ relativePath={collection.path}
678
+ selectionController={usedSelectionController}
679
+ collectionEntitiesCount={docsCount}/>}
609
680
  actions={<EntityCollectionViewActions
610
681
  parentCollectionIds={parentCollectionIds ?? []}
611
682
  collection={collection}
@@ -628,7 +699,7 @@ export const EntityCollectionView = React.memo(
628
699
  className="mt-4"
629
700
  >
630
701
  <AddIcon/>
631
- Create your first entity
702
+ Create your first entry
632
703
  </Button>
633
704
  </div>
634
705
  : <Typography variant={"label"}>No results with the applied filter/sort</Typography>
@@ -640,22 +711,24 @@ export const EntityCollectionView = React.memo(
640
711
  getIdColumnWidth={getIdColumnWidth}
641
712
  additionalIDHeaderWidget={<EntityIdHeaderWidget
642
713
  path={fullPath}
714
+ fullIdPath={fullIdPath ?? fullPath}
643
715
  collection={collection}/>}
716
+ openEntityMode={openEntityMode}
644
717
  />
645
718
 
646
- <PopupFormField
647
- key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entity?.id}`}
719
+ {popupCell && <PopupFormField
720
+ key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entityId}`}
648
721
  open={Boolean(popupCell)}
649
722
  onClose={onPopupClose}
650
723
  cellRect={popupCell?.cellRect}
651
724
  propertyKey={popupCell?.propertyKey}
652
725
  collection={collection}
653
- entity={popupCell?.entity}
726
+ entityId={popupCell.entityId}
654
727
  tableKey={tableKey.current}
655
728
  customFieldValidator={uniqueFieldValidator}
656
729
  path={resolvedFullPath}
657
730
  onCellValueChange={onValueChange}
658
- container={containerRef.current}/>
731
+ container={containerRef.current}/>}
659
732
 
660
733
  {deleteEntityClicked &&
661
734
  <DeleteEntityDialog
@@ -671,7 +744,7 @@ export const EntityCollectionView = React.memo(
671
744
  </div>
672
745
  );
673
746
  }, (a, b) => {
674
- return equal(a.fullPath, b.fullPath) &&
747
+ return equal(a.path, b.path) &&
675
748
  equal(a.parentCollectionIds, b.parentCollectionIds) &&
676
749
  equal(a.isSubCollection, b.isSubCollection) &&
677
750
  equal(a.className, b.className) &&
@@ -683,8 +756,15 @@ export const EntityCollectionView = React.memo(
683
756
  equal(a.selectionController, b.selectionController) &&
684
757
  equal(a.Actions, b.Actions) &&
685
758
  equal(a.defaultSize, b.defaultSize) &&
759
+ equal(a.initialFilter, b.initialFilter) &&
760
+ equal(a.initialSort, b.initialSort) &&
761
+ equal(a.includeJsonView, b.includeJsonView) &&
686
762
  equal(a.textSearchEnabled, b.textSearchEnabled) &&
687
763
  equal(a.additionalFields, b.additionalFields) &&
764
+ equal(a.sideDialogWidth, b.sideDialogWidth) &&
765
+ equal(a.openEntityMode, b.openEntityMode) &&
766
+ equal(a.exportable, b.exportable) &&
767
+ equal(a.history, b.history) &&
688
768
  equal(a.forceFilter, b.forceFilter);
689
769
  }) as React.FunctionComponent<EntityCollectionViewProps<any>>
690
770
 
@@ -709,7 +789,7 @@ function EntitiesCount({
709
789
 
710
790
  const sortByProperty = sortBy ? sortBy[0] : undefined;
711
791
  const currentSort = sortBy ? sortBy[1] : undefined;
712
- const resolvedPath = useMemo(() => navigation.resolveAliasesFrom(fullPath), [fullPath, navigation.resolveAliasesFrom]);
792
+ const resolvedPath = useMemo(() => navigation.resolveIdsFrom(fullPath), [fullPath, navigation.resolveIdsFrom]);
713
793
 
714
794
  useEffect(() => {
715
795
  if (dataSource.countEntities)
@@ -724,6 +804,7 @@ function EntitiesCount({
724
804
 
725
805
  useEffect(() => {
726
806
  if (onCountChange) {
807
+ setError(undefined);
727
808
  onCountChange(count ?? 0);
728
809
  }
729
810
  }, [onCountChange, count]);
@@ -750,53 +831,94 @@ function buildPropertyWidthOverwrite(key: string, width: number): PartialEntityC
750
831
 
751
832
  function EntityIdHeaderWidget({
752
833
  collection,
753
- path
834
+ path,
835
+ fullIdPath
754
836
  }: {
755
837
  collection: EntityCollection,
756
- path: string
838
+ path: string,
839
+ fullIdPath: string
757
840
  }) {
841
+
842
+ const navigation = useNavigationController();
758
843
  const [openPopup, setOpenPopup] = React.useState(false);
759
844
  const [searchString, setSearchString] = React.useState("");
845
+ const [recentIds, setRecentIds] = React.useState<string[]>(getRecentIds(collection.id));
760
846
  const sideEntityController = useSideEntityController();
847
+
848
+ const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
849
+
761
850
  return (
762
- <Tooltip title={!openPopup ? "Find by ID" : undefined}>
851
+ <Tooltip title={!openPopup ? "Find by ID" : undefined} asChild={false}>
763
852
  <Popover
764
853
  open={openPopup}
765
854
  onOpenChange={setOpenPopup}
855
+ sideOffset={0}
856
+ align={"start"}
857
+ alignOffset={-117}
766
858
  trigger={
767
859
  <IconButton size={"small"}>
768
860
  <SearchIcon size={"small"}/>
769
861
  </IconButton>
770
- }
771
- >
772
- <form noValidate={true}
773
- onSubmit={(e) => {
774
- e.preventDefault();
775
- if (!searchString) return;
776
- setOpenPopup(false);
777
- return sideEntityController.open({
778
- entityId: searchString,
779
- path,
780
- collection,
781
- updateUrl: true,
782
- });
783
- }}
784
- className={"text-gray-900 dark:text-white w-96 max-w-full"}>
785
-
786
- <div className="flex p-2 w-full gap-4">
787
- <input
788
- autoFocus={openPopup}
789
- placeholder={"Find entity by ID"}
790
- // size={"small"}
791
- onChange={(e) => setSearchString(e.target.value)}
792
- value={searchString}
793
- className={"flex-grow bg-transparent outline-none p-1"}/>
794
- <Button variant={"outlined"}
795
- disabled={!searchString}
796
- type={"submit"}
797
- >Go</Button>
798
- </div>
799
- </form>
862
+ }>
863
+ <div
864
+ className={cls("my-2 rounded-lg bg-surface-50 dark:bg-surface-950 text-surface-900 dark:text-white")}>
865
+ <form noValidate={true}
866
+ onSubmit={(e) => {
867
+ e.preventDefault();
868
+ if (!searchString) return;
869
+ setOpenPopup(false);
870
+ const entityId = searchString.trim();
871
+ setRecentIds(addRecentId(collection.id, entityId));
872
+ navigateToEntity({
873
+ openEntityMode,
874
+ collection,
875
+ entityId,
876
+ path,
877
+ fullIdPath,
878
+ sideEntityController,
879
+ navigation
880
+ })
881
+ }}
882
+ className={"w-96 max-w-full"}>
883
+
884
+ <div className="flex p-2 w-full gap-2">
885
+ <input
886
+ autoFocus={openPopup}
887
+ placeholder={"Find entity by ID"}
888
+ // size={"small"}
889
+ onChange={(e) => {
890
+ setSearchString(e.target.value);
891
+ }}
892
+ value={searchString}
893
+ className={"rounded-lg bg-white dark:bg-surface-800 flex-grow bg-transparent outline-none p-2 " + focusedDisabled}/>
894
+ <Button variant={"text"}
895
+ disabled={!(searchString.trim())}
896
+ type={"submit"}
897
+ ><KeyboardTabIcon/></Button>
898
+ </div>
899
+ </form>
900
+ {recentIds && recentIds.length > 0 && <div className="flex flex-col gap-2 p-2">
901
+ {recentIds.map(id => (
902
+ <ReferencePreview reference={new EntityReference(id, path)}
903
+ key={id}
904
+ hover={true}
905
+ onClick={() => {
906
+ setOpenPopup(false);
907
+ navigateToEntity({
908
+ openEntityMode,
909
+ collection,
910
+ entityId: id,
911
+ path,
912
+ fullIdPath,
913
+ sideEntityController,
914
+ navigation
915
+ })
916
+ }}
917
+ includeEntityLink={false}
918
+ size={"small"}/>
919
+ ))}
920
+ </div>}
921
+ </div>
800
922
  </Popover>
801
923
 
802
924
  </Tooltip>