@firecms/core 3.0.0-canary.25 → 3.0.0-canary.250

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