@firecms/core 3.0.0-canary.24 → 3.0.0-canary.241

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