@firecms/core 3.0.0-canary.99 → 3.0.0-rc.1

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 (349) hide show
  1. package/README.md +2 -2
  2. package/dist/app/Drawer.d.ts +0 -1
  3. package/dist/app/Scaffold.d.ts +4 -0
  4. package/dist/components/ArrayContainer.d.ts +31 -12
  5. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  6. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +3 -1
  7. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  8. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +17 -3
  9. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +1 -1
  10. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  11. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +6 -3
  12. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +8 -0
  13. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  14. package/dist/components/EntityJsonPreview.d.ts +3 -0
  15. package/dist/components/EntityPreview.d.ts +8 -6
  16. package/dist/components/HomePage/DefaultHomePage.d.ts +2 -15
  17. package/dist/components/HomePage/HomePageDnD.d.ts +76 -0
  18. package/dist/components/HomePage/NavigationCard.d.ts +3 -1
  19. package/dist/components/HomePage/NavigationCardBinding.d.ts +3 -2
  20. package/dist/components/HomePage/NavigationGroup.d.ts +8 -1
  21. package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
  22. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  23. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  24. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  25. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +1 -1
  26. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  27. package/dist/components/VirtualTable/VirtualTableProps.d.ts +11 -2
  28. package/dist/components/common/default_entity_actions.d.ts +0 -2
  29. package/dist/components/common/index.d.ts +1 -1
  30. package/dist/components/common/useColumnsIds.d.ts +1 -0
  31. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +10 -2
  32. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  33. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  34. package/dist/components/index.d.ts +3 -1
  35. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  36. package/dist/core/DefaultAppBar.d.ts +8 -2
  37. package/dist/core/DrawerNavigationItem.d.ts +2 -1
  38. package/dist/core/EntityEditView.d.ts +40 -22
  39. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  40. package/dist/core/FireCMS.d.ts +2 -2
  41. package/dist/core/FireCMSRouter.d.ts +4 -0
  42. package/dist/core/NavigationRoutes.d.ts +0 -1
  43. package/dist/core/SideDialogs.d.ts +4 -2
  44. package/dist/core/field_configs.d.ts +1 -1
  45. package/dist/core/index.d.ts +2 -1
  46. package/dist/form/EntityForm.d.ts +50 -0
  47. package/dist/form/EntityFormActions.d.ts +21 -0
  48. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  49. package/dist/form/components/FormEntry.d.ts +6 -0
  50. package/dist/form/components/FormLayout.d.ts +5 -0
  51. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  52. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  53. package/dist/form/components/index.d.ts +3 -1
  54. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  55. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  56. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  57. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  58. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  59. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  60. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  61. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  62. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  63. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  64. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  65. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  66. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +4 -10
  67. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  68. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  69. package/dist/form/index.d.ts +17 -16
  70. package/dist/form/useClearRestoreValue.d.ts +2 -2
  71. package/dist/hooks/data/delete.d.ts +4 -4
  72. package/dist/hooks/data/save.d.ts +3 -3
  73. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  74. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  75. package/dist/hooks/useAuthController.d.ts +1 -1
  76. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  77. package/dist/hooks/useBuildNavigationController.d.ts +57 -12
  78. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  79. package/dist/hooks/useModeController.d.ts +1 -2
  80. package/dist/hooks/useProjectLog.d.ts +7 -1
  81. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  82. package/dist/hooks/useValidateAuthenticator.d.ts +3 -3
  83. package/dist/index.es.js +20108 -14471
  84. package/dist/index.es.js.map +1 -1
  85. package/dist/index.umd.js +20039 -14407
  86. package/dist/index.umd.js.map +1 -1
  87. package/dist/internal/useBuildDataSource.d.ts +3 -2
  88. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  89. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  90. package/dist/preview/PropertyPreviewProps.d.ts +1 -1
  91. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  92. package/dist/preview/components/ReferencePreview.d.ts +2 -2
  93. package/dist/preview/util.d.ts +3 -3
  94. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  95. package/dist/routes/FireCMSRoute.d.ts +1 -0
  96. package/dist/routes/HomePageRoute.d.ts +3 -0
  97. package/dist/types/analytics.d.ts +1 -1
  98. package/dist/types/auth.d.ts +7 -9
  99. package/dist/types/collections.d.ts +86 -25
  100. package/dist/types/customization_controller.d.ts +8 -0
  101. package/dist/types/datasource.d.ts +19 -17
  102. package/dist/types/dialogs_controller.d.ts +7 -3
  103. package/dist/types/entities.d.ts +2 -1
  104. package/dist/types/entity_actions.d.ts +58 -8
  105. package/dist/types/entity_callbacks.d.ts +16 -16
  106. package/dist/types/entity_overrides.d.ts +2 -2
  107. package/dist/types/export_import.d.ts +4 -4
  108. package/dist/types/fields.d.ts +43 -17
  109. package/dist/types/firecms.d.ts +16 -3
  110. package/dist/types/firecms_context.d.ts +1 -1
  111. package/dist/types/navigation.d.ts +60 -17
  112. package/dist/types/permissions.d.ts +4 -4
  113. package/dist/types/plugins.d.ts +42 -9
  114. package/dist/types/properties.d.ts +65 -22
  115. package/dist/types/property_config.d.ts +1 -3
  116. package/dist/types/roles.d.ts +3 -0
  117. package/dist/types/side_dialogs_controller.d.ts +10 -0
  118. package/dist/types/side_entity_controller.d.ts +14 -1
  119. package/dist/types/storage.d.ts +75 -0
  120. package/dist/types/user.d.ts +1 -0
  121. package/dist/util/builders.d.ts +3 -3
  122. package/dist/util/callbacks.d.ts +2 -0
  123. package/dist/util/createFormexStub.d.ts +2 -0
  124. package/dist/util/entities.d.ts +2 -2
  125. package/dist/util/entity_actions.d.ts +2 -0
  126. package/dist/util/entity_cache.d.ts +23 -0
  127. package/dist/util/icon_synonyms.d.ts +0 -1
  128. package/dist/util/icons.d.ts +5 -2
  129. package/dist/util/index.d.ts +3 -0
  130. package/dist/util/navigation_from_path.d.ts +10 -1
  131. package/dist/util/navigation_utils.d.ts +13 -1
  132. package/dist/util/objects.d.ts +2 -1
  133. package/dist/util/permissions.d.ts +4 -4
  134. package/dist/util/property_utils.d.ts +4 -4
  135. package/dist/util/references.d.ts +2 -2
  136. package/dist/util/resolutions.d.ts +30 -6
  137. package/dist/util/storage.d.ts +1 -1
  138. package/dist/util/useStorageUploadController.d.ts +2 -2
  139. package/package.json +133 -125
  140. package/src/app/Drawer.tsx +0 -1
  141. package/src/app/Scaffold.tsx +33 -29
  142. package/src/components/ArrayContainer.tsx +447 -229
  143. package/src/components/CircularProgressCenter.tsx +1 -1
  144. package/src/components/ClearFilterSortButton.tsx +1 -1
  145. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
  146. package/src/components/DeleteEntityDialog.tsx +13 -20
  147. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -25
  148. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +23 -17
  149. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +20 -3
  150. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +35 -9
  151. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +21 -16
  152. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +6 -12
  153. package/src/components/EntityCollectionTable/index.tsx +1 -1
  154. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +6 -6
  155. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +35 -26
  156. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  157. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +132 -101
  158. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
  159. package/src/components/EntityCollectionView/EntityCollectionView.tsx +178 -85
  160. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
  161. package/src/components/EntityCollectionView/useSelectionController.tsx +5 -4
  162. package/src/components/EntityCollectionView/utils.ts +19 -0
  163. package/src/components/EntityJsonPreview.tsx +66 -0
  164. package/src/components/EntityPreview.tsx +75 -57
  165. package/src/components/EntityView.tsx +8 -5
  166. package/src/components/ErrorView.tsx +3 -3
  167. package/src/components/FireCMSLogo.tsx +7 -51
  168. package/src/components/HomePage/DefaultHomePage.tsx +522 -160
  169. package/src/components/HomePage/FavouritesView.tsx +9 -14
  170. package/src/components/HomePage/HomePageDnD.tsx +642 -0
  171. package/src/components/HomePage/NavigationCard.tsx +47 -38
  172. package/src/components/HomePage/NavigationCardBinding.tsx +16 -15
  173. package/src/components/HomePage/NavigationGroup.tsx +144 -30
  174. package/src/components/HomePage/RenameGroupDialog.tsx +117 -0
  175. package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
  176. package/src/components/NotFoundPage.tsx +2 -2
  177. package/src/components/PropertyConfigBadge.tsx +9 -3
  178. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  179. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +22 -13
  180. package/src/components/SearchIconsView.tsx +2 -2
  181. package/src/components/SelectableTable/SelectableTable.tsx +154 -142
  182. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +4 -2
  183. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +10 -8
  184. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +59 -10
  185. package/src/components/UnsavedChangesDialog.tsx +46 -0
  186. package/src/components/VirtualTable/VirtualTable.tsx +65 -44
  187. package/src/components/VirtualTable/VirtualTableCell.tsx +0 -8
  188. package/src/components/VirtualTable/VirtualTableHeader.tsx +8 -8
  189. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +1 -1
  190. package/src/components/VirtualTable/VirtualTableProps.tsx +12 -2
  191. package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
  192. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
  193. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
  194. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  195. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  196. package/src/components/common/default_entity_actions.tsx +62 -42
  197. package/src/components/common/index.ts +1 -1
  198. package/src/components/common/useColumnsIds.tsx +1 -1
  199. package/src/components/common/useDataSourceTableController.tsx +420 -0
  200. package/src/components/common/useDebouncedCallback.tsx +20 -0
  201. package/src/components/common/useScrollRestoration.tsx +68 -0
  202. package/src/components/common/useTableSearchHelper.ts +1 -0
  203. package/src/components/index.tsx +4 -1
  204. package/src/contexts/BreacrumbsContext.tsx +38 -0
  205. package/src/contexts/DialogsProvider.tsx +3 -2
  206. package/src/contexts/ModeController.tsx +1 -3
  207. package/src/contexts/SnackbarProvider.tsx +2 -0
  208. package/src/core/DefaultAppBar.tsx +124 -85
  209. package/src/core/DefaultDrawer.tsx +30 -22
  210. package/src/core/DrawerNavigationItem.tsx +32 -28
  211. package/src/core/EntityEditView.tsx +388 -995
  212. package/src/core/EntityEditViewFormActions.tsx +329 -0
  213. package/src/core/EntitySidePanel.tsx +88 -20
  214. package/src/core/FireCMS.tsx +46 -25
  215. package/src/core/FireCMSRouter.tsx +17 -0
  216. package/src/core/NavigationRoutes.tsx +23 -32
  217. package/src/core/SideDialogs.tsx +22 -12
  218. package/src/core/field_configs.tsx +24 -10
  219. package/src/core/index.tsx +4 -2
  220. package/src/form/EntityForm.tsx +814 -0
  221. package/src/form/EntityFormActions.tsx +211 -0
  222. package/src/form/PropertyFieldBinding.tsx +55 -41
  223. package/src/form/components/CustomIdField.tsx +9 -3
  224. package/src/form/components/FieldHelperText.tsx +1 -1
  225. package/src/form/components/FormEntry.tsx +22 -0
  226. package/src/form/components/FormLayout.tsx +16 -0
  227. package/src/form/components/LabelWithIcon.tsx +30 -19
  228. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  229. package/src/form/components/StorageItemPreview.tsx +5 -4
  230. package/src/form/components/StorageUploadProgress.tsx +2 -3
  231. package/src/form/components/index.tsx +3 -1
  232. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +30 -18
  233. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -36
  234. package/src/form/field_bindings/BlockFieldBinding.tsx +55 -33
  235. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  236. package/src/form/field_bindings/KeyValueFieldBinding.tsx +19 -15
  237. package/src/form/field_bindings/MapFieldBinding.tsx +72 -62
  238. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
  239. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
  240. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +10 -8
  241. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  242. package/src/form/field_bindings/ReferenceFieldBinding.tsx +28 -19
  243. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -32
  244. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -13
  245. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +247 -168
  246. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  247. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  248. package/src/form/index.tsx +17 -37
  249. package/src/form/useClearRestoreValue.tsx +2 -2
  250. package/src/form/validation.ts +12 -6
  251. package/src/hooks/data/delete.ts +6 -5
  252. package/src/hooks/data/save.ts +26 -35
  253. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  254. package/src/hooks/data/useDataSource.tsx +10 -2
  255. package/src/hooks/data/useEntityFetch.tsx +10 -6
  256. package/src/hooks/useAuthController.tsx +1 -1
  257. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  258. package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
  259. package/src/hooks/useBuildModeController.tsx +15 -28
  260. package/src/hooks/useBuildNavigationController.tsx +386 -124
  261. package/src/hooks/useFireCMSContext.tsx +3 -33
  262. package/src/hooks/useLargeLayout.tsx +0 -35
  263. package/src/hooks/useModeController.tsx +1 -2
  264. package/src/hooks/useProjectLog.tsx +16 -5
  265. package/src/hooks/useResolvedNavigationFrom.tsx +9 -11
  266. package/src/hooks/useValidateAuthenticator.tsx +3 -3
  267. package/src/internal/useBuildDataSource.ts +67 -80
  268. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  269. package/src/internal/useBuildSideEntityController.tsx +149 -86
  270. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  271. package/src/preview/PropertyPreview.tsx +28 -12
  272. package/src/preview/PropertyPreviewProps.tsx +1 -1
  273. package/src/preview/components/BooleanPreview.tsx +1 -1
  274. package/src/preview/components/EmptyValue.tsx +1 -1
  275. package/src/preview/components/EnumValuesChip.tsx +1 -1
  276. package/src/preview/components/ImagePreview.tsx +10 -9
  277. package/src/preview/components/ReferencePreview.tsx +6 -16
  278. package/src/preview/components/UrlComponentPreview.tsx +20 -21
  279. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -5
  280. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -4
  281. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -3
  282. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -3
  283. package/src/preview/property_previews/ArrayOneOfPreview.tsx +6 -4
  284. package/src/preview/property_previews/ArrayPropertyPreview.tsx +5 -3
  285. package/src/preview/property_previews/MapPropertyPreview.tsx +7 -6
  286. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  287. package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
  288. package/src/preview/util.ts +10 -10
  289. package/src/routes/CustomCMSRoute.tsx +21 -0
  290. package/src/routes/FireCMSRoute.tsx +246 -0
  291. package/src/routes/HomePageRoute.tsx +17 -0
  292. package/src/types/analytics.ts +3 -0
  293. package/src/types/auth.tsx +8 -12
  294. package/src/types/collections.ts +101 -28
  295. package/src/types/customization_controller.tsx +9 -0
  296. package/src/types/datasource.ts +21 -20
  297. package/src/types/dialogs_controller.tsx +7 -3
  298. package/src/types/entities.ts +3 -1
  299. package/src/types/entity_actions.tsx +71 -8
  300. package/src/types/entity_callbacks.ts +18 -18
  301. package/src/types/entity_overrides.tsx +2 -2
  302. package/src/types/export_import.ts +4 -4
  303. package/src/types/fields.tsx +52 -19
  304. package/src/types/firecms.tsx +18 -4
  305. package/src/types/firecms_context.tsx +1 -1
  306. package/src/types/navigation.ts +76 -22
  307. package/src/types/permissions.ts +5 -5
  308. package/src/types/plugins.tsx +50 -9
  309. package/src/types/properties.ts +74 -22
  310. package/src/types/property_config.tsx +1 -2
  311. package/src/types/roles.ts +3 -0
  312. package/src/types/side_dialogs_controller.tsx +15 -0
  313. package/src/types/side_entity_controller.tsx +16 -1
  314. package/src/types/storage.ts +82 -0
  315. package/src/types/user.ts +2 -0
  316. package/src/util/builders.ts +10 -8
  317. package/src/util/callbacks.ts +119 -0
  318. package/src/util/createFormexStub.tsx +62 -0
  319. package/src/util/entities.ts +5 -3
  320. package/src/util/entity_actions.ts +28 -0
  321. package/src/util/entity_cache.ts +204 -0
  322. package/src/util/icon_list.ts +1 -1
  323. package/src/util/icon_synonyms.ts +0 -1
  324. package/src/util/icons.tsx +36 -11
  325. package/src/util/index.ts +3 -0
  326. package/src/util/join_collections.ts +9 -2
  327. package/src/util/make_properties_editable.ts +13 -5
  328. package/src/util/navigation_from_path.ts +33 -12
  329. package/src/util/navigation_utils.ts +135 -19
  330. package/src/util/objects.ts +74 -14
  331. package/src/util/parent_references_from_path.ts +3 -3
  332. package/src/util/permissions.ts +8 -8
  333. package/src/util/property_utils.tsx +17 -6
  334. package/src/util/references.ts +19 -8
  335. package/src/util/resolutions.ts +93 -24
  336. package/src/util/storage.ts +6 -2
  337. package/src/util/useStorageUploadController.tsx +74 -29
  338. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
  339. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  340. package/dist/form/PropertiesForm.d.ts +0 -8
  341. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  342. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  343. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
  344. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -27
  345. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -236
  346. package/src/form/PropertiesForm.tsx +0 -81
  347. package/src/form/components/FormikArrayContainer.tsx +0 -44
  348. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  349. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -7,7 +7,9 @@ import {
7
7
  CollectionSize,
8
8
  Entity,
9
9
  EntityAction,
10
- EntityCollection, EntityTableController,
10
+ EntityCollection,
11
+ EntityReference,
12
+ EntityTableController,
11
13
  FilterValues,
12
14
  PartialEntityCollection,
13
15
  PropertyOrBuilder,
@@ -17,7 +19,7 @@ import {
17
19
  import {
18
20
  EntityCollectionRowActions,
19
21
  EntityCollectionTable,
20
- useDataSourceEntityCollectionTableController
22
+ useDataSourceTableController
21
23
  } from "../EntityCollectionTable";
22
24
 
23
25
  import {
@@ -26,7 +28,10 @@ import {
26
28
  canEditEntity,
27
29
  getPropertyInPath,
28
30
  mergeDeep,
31
+ mergeEntityActions,
32
+ navigateToEntity,
29
33
  resolveCollection,
34
+ resolveEntityAction,
30
35
  resolveProperty
31
36
  } from "../../util";
32
37
  import { ReferencePreview } from "../../preview";
@@ -46,6 +51,7 @@ import {
46
51
  AddIcon,
47
52
  Button,
48
53
  cls,
54
+ focusedDisabled,
49
55
  IconButton,
50
56
  KeyboardTabIcon,
51
57
  Markdown,
@@ -58,6 +64,10 @@ import {
58
64
  import { setIn } from "@firecms/formex";
59
65
  import { getSubcollectionColumnId } from "../EntityCollectionTable/internal/common";
60
66
  import {
67
+ COLLECTION_GROUP_PARENT_ID,
68
+ copyEntityAction,
69
+ deleteEntityAction,
70
+ editEntityAction,
61
71
  OnCellValueChange,
62
72
  OnColumnResizeParams,
63
73
  UniqueFieldValidator,
@@ -66,13 +76,14 @@ import {
66
76
  } from "../common";
67
77
  import { PopupFormField } from "../EntityCollectionTable/internal/popup_field/PopupFormField";
68
78
  import { GetPropertyForProps } from "../EntityCollectionTable/EntityCollectionTableProps";
69
- import { copyEntityAction, deleteEntityAction, editEntityAction } from "../common/default_entity_actions";
70
79
  import { DeleteEntityDialog } from "../DeleteEntityDialog";
71
80
  import { useAnalyticsController } from "../../hooks/useAnalyticsController";
72
81
  import { useSelectionController } from "./useSelectionController";
73
82
  import { EntityCollectionViewStartActions } from "./EntityCollectionViewStartActions";
83
+ import { addRecentId, getRecentIds } from "./utils";
84
+ import { useScrollRestoration } from "../common/useScrollRestoration";
74
85
 
75
- const COLLECTION_GROUP_PARENT_ID = "collectionGroupParent";
86
+ const DEFAULT_ENTITY_OPEN_MODE: "side_panel" | "full_screen" = "side_panel";
76
87
 
77
88
  /**
78
89
  * @group Components
@@ -83,6 +94,10 @@ export type EntityCollectionViewProps<M extends Record<string, any>> = {
83
94
  * It defaults to the collection path if not provided.
84
95
  */
85
96
  fullPath?: string;
97
+ /**
98
+ * Full path using navigation ids.
99
+ */
100
+ fullIdPath?: string;
86
101
  /**
87
102
  * If this is a subcollection, specify the parent collection ids.
88
103
  */
@@ -94,6 +109,11 @@ export type EntityCollectionViewProps<M extends Record<string, any>> = {
94
109
 
95
110
  className?: string;
96
111
 
112
+ /**
113
+ * If true, this view will store its filter and sorting status in the url params
114
+ */
115
+ updateUrl?: boolean;
116
+
97
117
  } & EntityCollection<M>;
98
118
 
99
119
  /**
@@ -123,17 +143,19 @@ export type EntityCollectionViewProps<M extends Record<string, any>> = {
123
143
  export const EntityCollectionView = React.memo(
124
144
  function EntityCollectionView<M extends Record<string, any>>({
125
145
  fullPath: fullPathProp,
146
+ fullIdPath,
126
147
  parentCollectionIds,
127
148
  isSubCollection,
128
149
  className,
150
+ updateUrl,
129
151
  ...collectionProp
130
152
  }: EntityCollectionViewProps<M>
131
153
  ) {
132
154
 
133
155
  const context = useFireCMSContext();
156
+ const navigation = useNavigationController();
134
157
  const fullPath = fullPathProp ?? collectionProp.path;
135
158
  const dataSource = useDataSource(collectionProp);
136
- const navigation = useNavigationController();
137
159
  const sideEntityController = useSideEntityController();
138
160
  const authController = useAuthController();
139
161
  const userConfigPersistence = useUserConfigurationPersistence();
@@ -142,11 +164,15 @@ export const EntityCollectionView = React.memo(
142
164
 
143
165
  const containerRef = React.useRef<HTMLDivElement>(null);
144
166
 
167
+ const scrollRestoration = useScrollRestoration();
168
+
145
169
  const collection = useMemo(() => {
146
170
  const userOverride = userConfigPersistence?.getCollectionConfig<M>(fullPath);
147
171
  return (userOverride ? mergeDeep(collectionProp, userOverride) : collectionProp) as EntityCollection<M>;
148
172
  }, [collectionProp, fullPath, userConfigPersistence?.getCollectionConfig]);
149
173
 
174
+ const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
175
+
150
176
  const collectionRef = React.useRef(collection);
151
177
  useEffect(() => {
152
178
  collectionRef.current = collection;
@@ -189,14 +215,12 @@ export const EntityCollectionView = React.memo(
189
215
  setSelectedEntities
190
216
  } = usedSelectionController;
191
217
 
192
- // useEffect(() => {
193
- // setDeleteEntityClicked(undefined);
194
- // }, [selectedEntities]);
195
-
196
- const tableController = useDataSourceEntityCollectionTableController<M>({
218
+ const tableController = useDataSourceTableController<M>({
197
219
  fullPath,
198
220
  collection,
199
- lastDeleteTimestamp
221
+ lastDeleteTimestamp,
222
+ scrollRestoration,
223
+ updateUrl
200
224
  });
201
225
 
202
226
  const tableKey = React.useRef<string>(Math.random().toString(36));
@@ -207,34 +231,45 @@ export const EntityCollectionView = React.memo(
207
231
  }, [tableController.setPopupCell]);
208
232
 
209
233
  const onEntityClick = useCallback((clickedEntity: Entity<M>) => {
210
- console.log("Entity clicked", clickedEntity)
211
234
  const collection = collectionRef.current;
212
235
  setHighlightedEntity(clickedEntity);
213
236
  analyticsController.onAnalyticsEvent?.("edit_entity_clicked", {
214
237
  path: clickedEntity.path,
215
238
  entityId: clickedEntity.id
216
239
  });
217
- return sideEntityController.open({
218
- entityId: clickedEntity.id,
219
- 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,
220
252
  collection,
221
- updateUrl: true,
222
- onClose: unselectNavigatedEntity,
253
+ entityId: clickedEntity.id
223
254
  });
255
+
224
256
  }, [unselectNavigatedEntity, sideEntityController]);
225
257
 
226
258
  const onNewClick = useCallback(() => {
227
-
228
259
  const collection = collectionRef.current;
229
260
  analyticsController.onAnalyticsEvent?.("new_entity_click", {
230
261
  path: fullPath
231
262
  });
232
- sideEntityController.open({
233
- path: fullPath,
263
+ navigateToEntity({
264
+ openEntityMode,
234
265
  collection,
235
- updateUrl: true,
236
- onClose: unselectNavigatedEntity,
237
- });
266
+ entityId: undefined,
267
+ path: fullPath,
268
+ fullIdPath,
269
+ sideEntityController,
270
+ navigation,
271
+ onClose: unselectNavigatedEntity
272
+ })
238
273
  }, [fullPath, sideEntityController]);
239
274
 
240
275
  const onMultipleDeleteClick = () => {
@@ -306,7 +341,7 @@ export const EntityCollectionView = React.memo(
306
341
  value,
307
342
  property,
308
343
  entityId
309
- }) => dataSource.checkUniqueField(fullPath, name, value, entityId),
344
+ }) => dataSource.checkUniqueField(fullPath, name, value, entityId, collection),
310
345
  [fullPath]);
311
346
 
312
347
  const onValueChange: OnCellValueChange<any, any> = ({
@@ -320,7 +355,7 @@ export const EntityCollectionView = React.memo(
320
355
  const updatedValues = setIn({ ...entity.values }, propertyKey, value);
321
356
 
322
357
  const saveProps: SaveEntityProps = {
323
- path: fullPath,
358
+ path: entity.path ?? fullPath,
324
359
  entityId: entity.id,
325
360
  values: updatedValues,
326
361
  previousValues: entity.values,
@@ -346,11 +381,12 @@ export const EntityCollectionView = React.memo(
346
381
 
347
382
  };
348
383
 
349
- const resolvedFullPath = navigation.resolveAliasesFrom(fullPath);
384
+ const resolvedFullPath = navigation.resolveIdsFrom(fullPath);
350
385
  const resolvedCollection = useMemo(() => resolveCollection<M>({
351
386
  collection,
352
387
  path: fullPath,
353
- fields: customizationController.propertyConfigs
388
+ propertyConfigs: customizationController.propertyConfigs,
389
+ authController,
354
390
  }), [collection, fullPath]);
355
391
 
356
392
  const getPropertyFor = useCallback(({
@@ -371,7 +407,8 @@ export const EntityCollectionView = React.memo(
371
407
  path: entity.path,
372
408
  values: entity.values,
373
409
  entityId: entity.id,
374
- fields: customizationController.propertyConfigs
410
+ propertyConfigs: customizationController.propertyConfigs,
411
+ authController
375
412
  });
376
413
  }, [collection.properties, customizationController.propertyConfigs, resolvedCollection.properties]);
377
414
 
@@ -387,16 +424,20 @@ export const EntityCollectionView = React.memo(
387
424
  Builder: ({ entity }) => (
388
425
  <Button color={"primary"}
389
426
  variant={"outlined"}
427
+ className={"max-w-full truncate justify-start"}
390
428
  startIcon={<KeyboardTabIcon size={"small"}/>}
391
429
  onClick={(event: any) => {
392
430
  event.stopPropagation();
393
- sideEntityController.open({
394
- path: fullPath,
395
- entityId: entity.id,
396
- selectedSubPath: subcollection.id ?? subcollection.path,
431
+ navigateToEntity({
432
+ openEntityMode,
397
433
  collection,
398
- updateUrl: true,
399
- });
434
+ entityId: entity.id,
435
+ selectedTab: subcollection.id ?? subcollection.path,
436
+ path: fullPath,
437
+ fullIdPath,
438
+ navigation,
439
+ sideEntityController
440
+ })
400
441
  }}>
401
442
  {subcollection.name}
402
443
  </Button>
@@ -419,7 +460,7 @@ export const EntityCollectionView = React.memo(
419
460
  <ReferencePreview
420
461
  key={reference.path + "/" + reference.id}
421
462
  reference={reference}
422
- size={"tiny"}/>
463
+ size={"small"}/>
423
464
  );
424
465
  })}
425
466
  </div>
@@ -455,7 +496,7 @@ export const EntityCollectionView = React.memo(
455
496
  if (deleteEnabled)
456
497
  actions.push(deleteEntityAction);
457
498
  if (customEntityActions)
458
- actions.push(...customEntityActions);
499
+ return mergeEntityActions(actions, customEntityActions);
459
500
  return actions;
460
501
  };
461
502
 
@@ -468,22 +509,25 @@ export const EntityCollectionView = React.memo(
468
509
  };
469
510
 
470
511
  const tableRowActionsBuilder = useCallback(({
471
- entity,
472
- size,
473
- width,
474
- frozen
475
- }: {
512
+ entity,
513
+ size,
514
+ width,
515
+ frozen
516
+ }: {
476
517
  entity: Entity<any>,
477
518
  size: CollectionSize,
478
519
  width: number,
479
520
  frozen?: boolean
480
521
  }) => {
481
522
 
482
- const isSelected = usedSelectionController.selectedEntities.map(e => e.id).includes(entity.id);
523
+ const isSelected = Boolean(usedSelectionController.selectedEntities.find(e => e.id == entity.id && e.path == entity.path));
524
+ const customEntityActions = (collection.entityActions ?? [])
525
+ .map(action => resolveEntityAction(action, customizationController.entityActions))
526
+ .filter(Boolean) as EntityAction[];
483
527
 
484
528
  const actions = getActionsForEntity({
485
529
  entity,
486
- customEntityActions: collection.entityActions
530
+ customEntityActions
487
531
  });
488
532
 
489
533
  return (
@@ -498,10 +542,12 @@ export const EntityCollectionView = React.memo(
498
542
  unhighlightEntity={unselectNavigatedEntity}
499
543
  collection={collection}
500
544
  fullPath={fullPath}
545
+ fullIdPath={fullIdPath}
501
546
  actions={actions}
502
547
  hideId={collection?.hideIdFromCollection}
503
548
  onCollectionChange={updateLastDeleteTimestamp}
504
549
  selectionController={usedSelectionController}
550
+ openEntityMode={openEntityMode}
505
551
  />
506
552
  );
507
553
 
@@ -535,7 +581,7 @@ export const EntityCollectionView = React.memo(
535
581
  </div>}
536
582
  >
537
583
 
538
- {collection.description && <div className="m-4 text-gray-900 dark:text-white">
584
+ {collection.description && <div className="m-4 text-surface-900 dark:text-white">
539
585
  <Markdown source={collection.description}/>
540
586
  </div>}
541
587
 
@@ -614,6 +660,8 @@ export const EntityCollectionView = React.memo(
614
660
  properties={resolvedCollection.properties}
615
661
  getPropertyFor={getPropertyFor}
616
662
  onTextSearchClick={textSearchInitialised ? undefined : onTextSearchClick}
663
+ onScroll={tableController.onScroll}
664
+ initialScroll={tableController.initialScroll}
617
665
  textSearchLoading={textSearchLoading}
618
666
  textSearchEnabled={textSearchEnabled}
619
667
  actionsStart={<EntityCollectionViewStartActions
@@ -658,22 +706,24 @@ export const EntityCollectionView = React.memo(
658
706
  getIdColumnWidth={getIdColumnWidth}
659
707
  additionalIDHeaderWidget={<EntityIdHeaderWidget
660
708
  path={fullPath}
709
+ fullIdPath={fullIdPath ?? fullPath}
661
710
  collection={collection}/>}
711
+ openEntityMode={openEntityMode}
662
712
  />
663
713
 
664
- <PopupFormField
665
- key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entity?.id}`}
714
+ {popupCell && <PopupFormField
715
+ key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entityId}`}
666
716
  open={Boolean(popupCell)}
667
717
  onClose={onPopupClose}
668
718
  cellRect={popupCell?.cellRect}
669
719
  propertyKey={popupCell?.propertyKey}
670
720
  collection={collection}
671
- entity={popupCell?.entity}
721
+ entityId={popupCell.entityId}
672
722
  tableKey={tableKey.current}
673
723
  customFieldValidator={uniqueFieldValidator}
674
724
  path={resolvedFullPath}
675
725
  onCellValueChange={onValueChange}
676
- container={containerRef.current}/>
726
+ container={containerRef.current}/>}
677
727
 
678
728
  {deleteEntityClicked &&
679
729
  <DeleteEntityDialog
@@ -689,7 +739,7 @@ export const EntityCollectionView = React.memo(
689
739
  </div>
690
740
  );
691
741
  }, (a, b) => {
692
- return equal(a.fullPath, b.fullPath) &&
742
+ return equal(a.path, b.path) &&
693
743
  equal(a.parentCollectionIds, b.parentCollectionIds) &&
694
744
  equal(a.isSubCollection, b.isSubCollection) &&
695
745
  equal(a.className, b.className) &&
@@ -703,9 +753,13 @@ export const EntityCollectionView = React.memo(
703
753
  equal(a.defaultSize, b.defaultSize) &&
704
754
  equal(a.initialFilter, b.initialFilter) &&
705
755
  equal(a.initialSort, b.initialSort) &&
756
+ equal(a.includeJsonView, b.includeJsonView) &&
706
757
  equal(a.textSearchEnabled, b.textSearchEnabled) &&
707
758
  equal(a.additionalFields, b.additionalFields) &&
708
759
  equal(a.sideDialogWidth, b.sideDialogWidth) &&
760
+ equal(a.openEntityMode, b.openEntityMode) &&
761
+ equal(a.exportable, b.exportable) &&
762
+ equal(a.history, b.history) &&
709
763
  equal(a.forceFilter, b.forceFilter);
710
764
  }) as React.FunctionComponent<EntityCollectionViewProps<any>>
711
765
 
@@ -730,7 +784,7 @@ function EntitiesCount({
730
784
 
731
785
  const sortByProperty = sortBy ? sortBy[0] : undefined;
732
786
  const currentSort = sortBy ? sortBy[1] : undefined;
733
- const resolvedPath = useMemo(() => navigation.resolveAliasesFrom(fullPath), [fullPath, navigation.resolveAliasesFrom]);
787
+ const resolvedPath = useMemo(() => navigation.resolveIdsFrom(fullPath), [fullPath, navigation.resolveIdsFrom]);
734
788
 
735
789
  useEffect(() => {
736
790
  if (dataSource.countEntities)
@@ -772,55 +826,94 @@ function buildPropertyWidthOverwrite(key: string, width: number): PartialEntityC
772
826
 
773
827
  function EntityIdHeaderWidget({
774
828
  collection,
775
- path
829
+ path,
830
+ fullIdPath
776
831
  }: {
777
832
  collection: EntityCollection,
778
- path: string
833
+ path: string,
834
+ fullIdPath: string
779
835
  }) {
836
+
837
+ const navigation = useNavigationController();
780
838
  const [openPopup, setOpenPopup] = React.useState(false);
781
839
  const [searchString, setSearchString] = React.useState("");
840
+ const [recentIds, setRecentIds] = React.useState<string[]>(getRecentIds(collection.id));
782
841
  const sideEntityController = useSideEntityController();
842
+
843
+ const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
844
+
783
845
  return (
784
- <Tooltip title={!openPopup ? "Find by ID" : undefined}>
846
+ <Tooltip title={!openPopup ? "Find by ID" : undefined} asChild={false}>
785
847
  <Popover
786
848
  open={openPopup}
787
849
  onOpenChange={setOpenPopup}
850
+ sideOffset={0}
851
+ align={"start"}
852
+ alignOffset={-117}
788
853
  trigger={
789
854
  <IconButton size={"small"}>
790
855
  <SearchIcon size={"small"}/>
791
856
  </IconButton>
792
- }
793
- >
794
- <form noValidate={true}
795
- onSubmit={(e) => {
796
- e.preventDefault();
797
- if (!searchString) return;
798
- setOpenPopup(false);
799
- return sideEntityController.open({
800
- entityId: searchString.trim(),
801
- path,
802
- collection,
803
- updateUrl: true,
804
- });
805
- }}
806
- className={"text-gray-900 dark:text-white w-96 max-w-full"}>
807
-
808
- <div className="flex p-2 w-full gap-4">
809
- <input
810
- autoFocus={openPopup}
811
- placeholder={"Find entity by ID"}
812
- // size={"small"}
813
- onChange={(e) => {
814
- setSearchString(e.target.value);
815
- }}
816
- value={searchString}
817
- className={"flex-grow bg-transparent outline-none p-1"}/>
818
- <Button variant={"outlined"}
819
- disabled={!(searchString.trim())}
820
- type={"submit"}
821
- >Go</Button>
822
- </div>
823
- </form>
857
+ }>
858
+ <div
859
+ className={cls("my-2 rounded-lg bg-surface-50 dark:bg-surface-950 text-surface-900 dark:text-white")}>
860
+ <form noValidate={true}
861
+ onSubmit={(e) => {
862
+ e.preventDefault();
863
+ if (!searchString) return;
864
+ setOpenPopup(false);
865
+ const entityId = searchString.trim();
866
+ setRecentIds(addRecentId(collection.id, entityId));
867
+ navigateToEntity({
868
+ openEntityMode,
869
+ collection,
870
+ entityId,
871
+ path,
872
+ fullIdPath,
873
+ sideEntityController,
874
+ navigation
875
+ })
876
+ }}
877
+ className={"w-96 max-w-full"}>
878
+
879
+ <div className="flex p-2 w-full gap-2">
880
+ <input
881
+ autoFocus={openPopup}
882
+ placeholder={"Find entity by ID"}
883
+ // size={"small"}
884
+ onChange={(e) => {
885
+ setSearchString(e.target.value);
886
+ }}
887
+ value={searchString}
888
+ className={"rounded-lg bg-white dark:bg-surface-800 flex-grow bg-transparent outline-none p-2 " + focusedDisabled}/>
889
+ <Button variant={"text"}
890
+ disabled={!(searchString.trim())}
891
+ type={"submit"}
892
+ ><KeyboardTabIcon/></Button>
893
+ </div>
894
+ </form>
895
+ {recentIds && recentIds.length > 0 && <div className="flex flex-col gap-2 p-2">
896
+ {recentIds.map(id => (
897
+ <ReferencePreview reference={new EntityReference(id, path)}
898
+ key={id}
899
+ hover={true}
900
+ onClick={() => {
901
+ setOpenPopup(false);
902
+ navigateToEntity({
903
+ openEntityMode,
904
+ collection,
905
+ entityId: id,
906
+ path,
907
+ fullIdPath,
908
+ sideEntityController,
909
+ navigation
910
+ })
911
+ }}
912
+ includeEntityLink={false}
913
+ size={"small"}/>
914
+ ))}
915
+ </div>}
916
+ </div>
824
917
  </Popover>
825
918
 
826
919
  </Tooltip>
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
 
3
- import { canCreateEntity, canDeleteEntity, fullPathToCollectionSegments } from "../../util";
3
+ import { canCreateEntity, canDeleteEntity } from "../../util";
4
4
  import { useAuthController, useCustomizationController, useFireCMSContext, useLargeLayout } from "../../hooks";
5
5
  import { CollectionActionsProps, EntityCollection, EntityTableController, SelectionController } from "../../types";
6
6
  import { AddIcon, Button, DeleteIcon, IconButton, Tooltip } from "@firecms/ui";
@@ -71,7 +71,7 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
71
71
  ? <Button
72
72
  variant={"text"}
73
73
  disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}
74
- startIcon={<DeleteIcon/>}
74
+ startIcon={<DeleteIcon size={"small"}/>}
75
75
  onClick={onMultipleDeleteClick}
76
76
  color={"primary"}
77
77
  className="lg:w-20"
@@ -79,10 +79,11 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
79
79
  ({selectedEntities?.length})
80
80
  </Button>
81
81
  : <IconButton
82
+ size={"small"}
82
83
  color={"primary"}
83
84
  disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}
84
85
  onClick={onMultipleDeleteClick}>
85
- <DeleteIcon/>
86
+ <DeleteIcon size={"small"}/>
86
87
  </IconButton>;
87
88
  multipleDeleteButton =
88
89
  <Tooltip
@@ -124,7 +125,9 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
124
125
 
125
126
  return (
126
127
  <>
127
- {actions}
128
+ <ErrorBoundary>
129
+ {actions}
130
+ </ErrorBoundary>
128
131
  {multipleDeleteButton}
129
132
  {addButton}
130
133
  </>
@@ -10,9 +10,10 @@ export function useSelectionController<M extends Record<string, any> = any>(
10
10
  const toggleEntitySelection = useCallback((entity: Entity<M>, newSelectedState?: boolean) => {
11
11
  let newValue;
12
12
  if (newSelectedState === undefined) {
13
- if (selectedEntities.map(e => e.id).includes(entity.id)) {
13
+ const isSelected = Boolean(selectedEntities.find(e => e.id === entity.id && e.path === entity.path));
14
+ if (isSelected) {
14
15
  onSelectionChange?.(entity, false);
15
- newValue = selectedEntities.filter((item: Entity<M>) => item.id !== entity.id);
16
+ newValue = selectedEntities.filter((item: Entity<M>) => !(item.id === entity.id && item.path === entity.path));
16
17
  } else {
17
18
  onSelectionChange?.(entity, true);
18
19
  newValue = [...selectedEntities, entity];
@@ -23,14 +24,14 @@ export function useSelectionController<M extends Record<string, any> = any>(
23
24
  newValue = [...selectedEntities, entity];
24
25
  } else {
25
26
  onSelectionChange?.(entity, false);
26
- newValue = selectedEntities.filter((item: Entity<M>) => item.id !== entity.id);
27
+ newValue = selectedEntities.filter((item: Entity<M>) => !(item.id === entity.id && item.path === entity.path));
27
28
  }
28
29
  }
29
30
  setSelectedEntities(newValue);
30
31
  }, [selectedEntities]);
31
32
 
32
33
  const isEntitySelected = useCallback((entity: Entity<M>) => {
33
- return selectedEntities.map(e => e.id).includes(entity.id);
34
+ return Boolean(selectedEntities.find(e => e.id === entity.id && e.path === entity.path));
34
35
  }, [selectedEntities]);
35
36
 
36
37
  return {
@@ -0,0 +1,19 @@
1
+ export function addRecentId(collectionId: string, id: string) {
2
+ const recentIds = getRecentIds(collectionId);
3
+ const newRecentIds = [id, ...recentIds.filter(i => i !== id)];
4
+ if (newRecentIds.length > 5) {
5
+ newRecentIds.pop();
6
+ }
7
+ saveSearchedIdsLocally(collectionId, newRecentIds);
8
+ return newRecentIds;
9
+ }
10
+
11
+ export function saveSearchedIdsLocally(collectionId: string, ids: string[]) {
12
+ localStorage.setItem("recent_id_searches::" + collectionId, JSON.stringify(ids));
13
+ }
14
+
15
+ export function getRecentIds(collectionId: string): string[] {
16
+ const stored = localStorage.getItem("recent_id_searches::" + collectionId);
17
+ if (!stored) return [];
18
+ return JSON.parse(stored);
19
+ }