@firecms/core 3.0.0-canary.26 → 3.0.0-canary.261

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