@firecms/core 3.0.0-canary.22 → 3.0.0-canary.221

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