@firecms/core 3.0.0-canary.21 → 3.0.0-canary.210

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