@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
package/src/util/index.ts CHANGED
@@ -7,6 +7,7 @@ export * from "./objects";
7
7
  export * from "./paths";
8
8
  export * from "./regexp";
9
9
  export * from "./navigation_utils";
10
+ export * from "./entity_actions";
10
11
  export * from "./useDebouncedCallback";
11
12
  export * from "./property_utils";
12
13
  export * from "./resolutions";
@@ -21,3 +22,5 @@ export * from "./make_properties_editable";
21
22
  export * from "./join_collections";
22
23
  export * from "./builders";
23
24
  export * from "./useTraceUpdate";
25
+ export * from "./storage";
26
+ export * from "./callbacks";
@@ -78,6 +78,7 @@ export function mergeCollection(target: EntityCollection,
78
78
  modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void
79
79
  ): EntityCollection {
80
80
 
81
+
81
82
  const subcollectionsMerged = joinCollectionLists(
82
83
  target?.subcollections ?? [],
83
84
  source?.subcollections ?? [],
@@ -94,18 +95,20 @@ export function mergeCollection(target: EntityCollection,
94
95
  propertiesMerged[key] = source.properties[key] as PropertyOrBuilder;
95
96
  });
96
97
 
97
- const mergedCollection = mergeDeep(target, source);
98
+ const mergedCollection = mergeDeep(target, source, true);
98
99
  const targetPropertiesOrder = getCollectionKeys(target);
99
100
  const sourcePropertiesOrder = getCollectionKeys(source);
100
101
  const mergedPropertiesOrder = [...new Set([...sourcePropertiesOrder, ...targetPropertiesOrder])];
101
102
  const mergedEntityViews = [...new Set([...(target.entityViews ?? []), ...(source.entityViews ?? [])])];
103
+ const mergedEntityActions = [...new Set([...(target.entityActions ?? []), ...(source.entityActions ?? [])])];
102
104
 
103
105
  let resultCollection: EntityCollection = {
104
106
  ...mergedCollection,
105
107
  subcollections: subcollectionsMerged,
106
108
  properties: sortProperties(propertiesMerged, mergedPropertiesOrder),
107
109
  propertiesOrder: mergedPropertiesOrder,
108
- entityViews: mergedEntityViews
110
+ entityViews: mergedEntityViews,
111
+ entityActions: mergedEntityActions,
109
112
  };
110
113
  if (modifyCollection) {
111
114
  const modifiedCollection = modifyCollection({
@@ -115,6 +118,10 @@ export function mergeCollection(target: EntityCollection,
115
118
  if (modifiedCollection)
116
119
  resultCollection = modifiedCollection;
117
120
  }
121
+
122
+ // @ts-ignore
123
+ resultCollection["merged"] = true;
124
+
118
125
  return resultCollection
119
126
  }
120
127
 
@@ -4,9 +4,11 @@ import { isPropertyBuilder } from "./entities";
4
4
  export function makePropertiesEditable(properties: Properties) {
5
5
  Object.keys(properties).forEach((key) => {
6
6
  const property = properties[key];
7
- property.editable = true;
8
- if (property.dataType === "map" && property.properties) {
9
- makePropertiesEditable(property.properties as Properties);
7
+ if (property) {
8
+ property.editable = true;
9
+ if (property.dataType === "map" && property.properties) {
10
+ makePropertiesEditable(property.properties as Properties);
11
+ }
10
12
  }
11
13
  });
12
14
  return properties;
@@ -15,13 +17,19 @@ export function makePropertiesEditable(properties: Properties) {
15
17
  export function makePropertiesNonEditable(properties: PropertiesOrBuilders): PropertiesOrBuilders {
16
18
  return Object.entries(properties).reduce((acc, [key, property]) => {
17
19
  if (!isPropertyBuilder(property) && property.dataType === "map" && property.properties) {
18
- const updated = { ...property, properties: makePropertiesNonEditable(property.properties as PropertiesOrBuilders) };
20
+ const updated = {
21
+ ...property,
22
+ properties: makePropertiesNonEditable(property.properties as PropertiesOrBuilders)
23
+ };
19
24
  acc[key] = updated;
20
25
  }
21
26
  if (isPropertyBuilder(property)) {
22
27
  acc[key] = property;
23
28
  } else {
24
- acc[key] = { ...property, editable: false };
29
+ acc[key] = {
30
+ ...property,
31
+ editable: false
32
+ };
25
33
  }
26
34
  return acc;
27
35
  }, {} as PropertiesOrBuilders);
@@ -11,32 +11,42 @@ export interface NavigationViewEntityInternal<M extends Record<string, any>> {
11
11
  type: "entity";
12
12
  entityId: string;
13
13
  path: string;
14
+ fullIdPath: string;
15
+ fullPath: string;
14
16
  parentCollection: EntityCollection<M>;
15
17
  }
16
18
 
17
19
  export interface NavigationViewCollectionInternal<M extends Record<string, any>> {
18
20
  type: "collection";
21
+ id: string;
19
22
  path: string;
23
+ fullIdPath: string;
24
+ fullPath: string;
20
25
  collection: EntityCollection<M>;
21
26
  }
22
27
 
23
28
  export interface NavigationViewEntityCustomInternal<M extends Record<string, any>> {
24
29
  type: "custom_view";
25
30
  path: string;
31
+ fullIdPath: string;
32
+ fullPath: string;
33
+ entityId: string;
26
34
  view: EntityCustomView<M>;
27
35
  }
28
36
 
29
- export function getNavigationEntriesFromPathInternal(props: {
37
+ export function getNavigationEntriesFromPath(props: {
30
38
  path: string,
31
39
  collections: EntityCollection[] | undefined,
32
40
  currentFullPath?: string,
41
+ currentFullIdPath?: string,
33
42
  contextEntityViews?: EntityCustomView<any>[]
34
43
  }): NavigationViewInternal [] {
35
44
 
36
45
  const {
37
46
  path,
38
47
  collections = [],
39
- currentFullPath
48
+ currentFullPath,
49
+ currentFullIdPath
40
50
  } = props;
41
51
 
42
52
  const subpaths = removeInitialAndTrailingSlashes(path).split("/");
@@ -46,17 +56,25 @@ export function getNavigationEntriesFromPathInternal(props: {
46
56
  for (let i = 0; i < subpathCombinations.length; i++) {
47
57
  const subpathCombination = subpathCombinations[i];
48
58
 
49
- const collection: EntityCollection<any> | undefined = collections && collections.find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);
59
+ let collection: EntityCollection<any> | undefined;
60
+ collection = collections && collections.find((entry) => entry.id === subpathCombination);
61
+ if (!collection) {
62
+ collection = collections && collections.find((entry) => entry.path === subpathCombination);
63
+ }
50
64
 
51
65
  if (collection) {
52
- const pathOrAlias = collection.id ?? collection.path;
53
66
  const collectionPath = currentFullPath && currentFullPath.length > 0
54
- ? (currentFullPath + "/" + pathOrAlias)
55
- : pathOrAlias;
56
-
67
+ ? (currentFullPath + "/" + collection.path)
68
+ : collection.path;
69
+ const fullIdPath = currentFullIdPath && currentFullIdPath.length > 0
70
+ ? (currentFullIdPath + "/" + collection.id)
71
+ : collection.id;
57
72
  result.push({
58
73
  type: "collection",
74
+ id: collection.id,
59
75
  path: collectionPath,
76
+ fullPath: collectionPath,
77
+ fullIdPath,
60
78
  collection
61
79
  });
62
80
  const restOfThePath = removeInitialAndTrailingSlashes(removeInitialAndTrailingSlashes(path).replace(subpathCombination, ""));
@@ -68,6 +86,8 @@ export function getNavigationEntriesFromPathInternal(props: {
68
86
  type: "entity",
69
87
  entityId,
70
88
  path: collectionPath,
89
+ fullIdPath,
90
+ fullPath: fullPath,
71
91
  parentCollection: collection
72
92
  });
73
93
  if (nextSegments.length > 1) {
@@ -81,19 +101,20 @@ export function getNavigationEntriesFromPathInternal(props: {
81
101
  .filter(Boolean)
82
102
  .find((entry) => entry!.key === newPath);
83
103
  if (customView) {
84
- const path = currentFullPath && currentFullPath.length > 0
85
- ? (currentFullPath + "/" + customView.key)
86
- : customView.key;
87
104
  result.push({
88
105
  type: "custom_view",
89
- path,
106
+ path: collectionPath,
107
+ entityId: entityId,
108
+ fullIdPath,
109
+ fullPath: fullPath + "/" + customView.key,
90
110
  view: customView
91
111
  });
92
112
  } else if (collection.subcollections) {
93
- result.push(...getNavigationEntriesFromPathInternal({
113
+ result.push(...getNavigationEntriesFromPath({
94
114
  path: newPath,
95
115
  collections: collection.subcollections,
96
116
  currentFullPath: fullPath,
117
+ currentFullIdPath: fullIdPath,
97
118
  contextEntityViews: props.contextEntityViews
98
119
  }));
99
120
  }
@@ -1,4 +1,4 @@
1
- import { EntityCollection } from "../types";
1
+ import { EntityCollection, NavigationController, SideEntityController } from "../types";
2
2
 
3
3
  export function removeInitialAndTrailingSlashes(s: string): string {
4
4
  return removeInitialSlash(removeTrailingSlash(s));
@@ -32,29 +32,90 @@ export function getLastSegment(path: string) {
32
32
  }
33
33
 
34
34
  export function resolveCollectionPathIds(path: string, allCollections: EntityCollection[]): string {
35
-
36
- const cleanPath = removeInitialAndTrailingSlashes(path);
37
- const subpaths = cleanPath.split("/");
38
- if (subpaths.length % 2 === 0) {
39
- throw Error(`resolveCollectionPathAliases: Collection paths must have an odd number of segments: ${path}`);
35
+ let remainingPath = removeInitialAndTrailingSlashes(path);
36
+ if (!remainingPath) {
37
+ return "";
40
38
  }
41
39
 
42
- const aliasedCollection = allCollections.find((col) => col.id === subpaths[0]);
43
- let resolvedAliased;
44
- if (aliasedCollection) {
45
- resolvedAliased = aliasedCollection.path;
46
- }
40
+ let currentCollections: EntityCollection[] | undefined = allCollections;
41
+ const resolvedPathParts: string[] = [];
47
42
 
48
- if (subpaths.length > 1) {
49
- const segmentCollection = getCollectionByPathOrId(resolvedAliased ?? subpaths[0], allCollections);
50
- if (!segmentCollection?.subcollections) {
51
- return cleanPath;
43
+ while (remainingPath.length > 0) {
44
+ if (!currentCollections || currentCollections.length === 0) {
45
+ // We have remaining path segments but no more collections to match against
46
+ console.warn(`resolveCollectionPathIds: Path structure implies subcollections, but none found before segment starting with "${remainingPath}" in original path "${path}". Appending remaining original path.`);
47
+ resolvedPathParts.push(remainingPath);
48
+ remainingPath = ""; // Stop processing
49
+ break;
50
+ }
51
+
52
+ let foundMatch = false;
53
+ // Sort potential matches by length descending to prioritize longer matches (e.g., "a/b" over "a")
54
+ const potentialMatches: { col: EntityCollection; match: string; }[] = currentCollections
55
+ .flatMap(col => [{
56
+ col,
57
+ match: col.path
58
+ }, {
59
+ col,
60
+ match: col.id
61
+ }])
62
+ .filter(p => p.match && remainingPath.startsWith(p.match))
63
+ .sort((a, b) => b.match.length - a.match.length);
64
+
65
+ if (potentialMatches.length > 0) {
66
+ const {
67
+ col: foundCollection,
68
+ match: matchString
69
+ } = potentialMatches[0];
70
+
71
+ resolvedPathParts.push(foundCollection.path); // Use the defined path
72
+ remainingPath = removeInitialSlash(remainingPath.substring(matchString.length));
73
+
74
+ // Check if we are at the end of the path
75
+ if (remainingPath.length === 0) {
76
+ foundMatch = true;
77
+ break; // Path ends with a collection segment
78
+ }
79
+
80
+ // The next segment must be an entity ID
81
+ const idSeparatorIndex = remainingPath.indexOf("/");
82
+ let entityId: string;
83
+ if (idSeparatorIndex > -1) {
84
+ entityId = remainingPath.substring(0, idSeparatorIndex);
85
+ remainingPath = remainingPath.substring(idSeparatorIndex + 1);
86
+ } else {
87
+ // This should not happen if the original path is valid (odd segments)
88
+ // but handle it defensively: assume the rest is the ID
89
+ entityId = remainingPath;
90
+ remainingPath = "";
91
+ console.warn(`resolveCollectionPathIds: Path seems to end with an entity ID "${entityId}" instead of a collection segment in original path "${path}". This might indicate an invalid input path.`);
92
+ // Even if it ends here, we still need to push the ID
93
+ }
94
+
95
+ resolvedPathParts.push(entityId); // Append entity ID
96
+ currentCollections = foundCollection.subcollections; // Move to subcollections
97
+ foundMatch = true;
98
+
99
+ if (!currentCollections && remainingPath.length > 0) {
100
+ // Warn if the path continues but no subcollections were defined
101
+ console.warn(`resolveCollectionPathIds: Path continues after entity ID "${entityId}", but no subcollections are defined for the preceding collection "${foundCollection.path}" in path "${path}". Appending remaining original path.`);
102
+ resolvedPathParts.push(remainingPath); // Append the rest
103
+ remainingPath = ""; // Stop processing
104
+ break;
105
+ }
106
+
107
+ }
108
+
109
+ if (!foundMatch) {
110
+ // Collection definition not found for the start of the remaining path
111
+ console.warn(`resolveCollectionPathIds: Collection definition not found for segment starting with "${remainingPath}" in original path "${path}". Appending remaining original path.`);
112
+ resolvedPathParts.push(remainingPath); // Append the rest
113
+ remainingPath = ""; // Stop processing
114
+ break;
52
115
  }
53
- const restOfThePath = cleanPath.split("/").slice(2).join("/");
54
- return (resolvedAliased ?? subpaths[0]) + "/" + subpaths[1] + "/" + resolveCollectionPathIds(restOfThePath, segmentCollection.subcollections);
55
- } else {
56
- return resolvedAliased ?? cleanPath;
57
116
  }
117
+
118
+ return resolvedPathParts.join("/");
58
119
  }
59
120
 
60
121
  /**
@@ -109,3 +170,58 @@ export function getCollectionPathsCombinations(subpaths: string[]): string[] {
109
170
  return result;
110
171
 
111
172
  }
173
+
174
+ export function navigateToEntity({
175
+ openEntityMode,
176
+ collection,
177
+ entityId,
178
+ copy,
179
+ path,
180
+ fullIdPath,
181
+ selectedTab,
182
+ sideEntityController,
183
+ onClose,
184
+ navigation
185
+ }:
186
+
187
+ {
188
+ openEntityMode: "side_panel" | "full_screen";
189
+ collection?: EntityCollection;
190
+ entityId?: string;
191
+ selectedTab?: string;
192
+ copy?: boolean;
193
+ path: string;
194
+ fullIdPath?: string;
195
+ sideEntityController: SideEntityController;
196
+ onClose?: () => void;
197
+ navigation: NavigationController
198
+ }) {
199
+
200
+ if (openEntityMode === "side_panel") {
201
+
202
+ sideEntityController.open({
203
+ entityId,
204
+ path,
205
+ fullIdPath,
206
+ copy,
207
+ selectedTab,
208
+ collection,
209
+ updateUrl: true,
210
+ onClose
211
+ });
212
+
213
+ } else {
214
+ let to = navigation.buildUrlCollectionPath(entityId ? `${fullIdPath ?? path}/${entityId}` : fullIdPath ?? path);
215
+ if (entityId && selectedTab) {
216
+ to += `/${selectedTab}`;
217
+ }
218
+ if (!entityId) {
219
+ to += "#new";
220
+ }
221
+ if (copy) {
222
+ to += "#copy";
223
+ }
224
+ navigation.navigate(to);
225
+ }
226
+
227
+ }
@@ -12,25 +12,65 @@ export function isObject(item: any) {
12
12
  return item && typeof item === "object" && !Array.isArray(item);
13
13
  }
14
14
 
15
- export function mergeDeep<T extends Record<any, any>, U extends Record<any, any>>(target: T, source: U): T & U {
16
- const targetIsObject = isObject(target);
17
- const output = targetIsObject ? { ...target } : target;
18
- if (targetIsObject && isObject(source)) {
19
- Object.keys(source).forEach(key => {
20
- const sourceElement = source[key];
21
- if (isObject(sourceElement)) {
22
- if (!(key in target))
23
- Object.assign(output, { [key]: sourceElement });
24
- else
25
- (output as any)[key] = mergeDeep((target as any)[key], sourceElement);
15
+ export function mergeDeep<T extends Record<any, any>, U extends Record<any, any>>(
16
+ target: T,
17
+ source: U,
18
+ ignoreUndefined: boolean = false
19
+ ): T & U {
20
+ // If target is not a true object (e.g., null, array, primitive), return target itself.
21
+ if (!isObject(target)) {
22
+ return target as T & U;
23
+ }
24
+
25
+ // Create a shallow copy of the target to avoid modifying the original object.
26
+ const output = { ...target };
27
+
28
+ // If source is not a true object, there's nothing to merge from it.
29
+ // Return the shallow copy of target.
30
+ if (!isObject(source)) {
31
+ return output as T & U;
32
+ }
33
+
34
+ // Iterate over keys in the source object.
35
+ for (const key in source) {
36
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
37
+ const sourceValue = source[key];
38
+ const outputValue = (output as any)[key]; // Current value in our merged object (originating from target)
39
+
40
+ // Skip if source value is undefined and ignoreUndefined is true.
41
+ // This handles both not adding new undefined properties and not overwriting existing properties with undefined.
42
+ if (ignoreUndefined && sourceValue === undefined) {
43
+ continue;
44
+ }
45
+
46
+ if ((sourceValue as any) instanceof Date) {
47
+ // If source value is a Date, create a new Date instance.
48
+ (output as any)[key] = new Date(sourceValue.getTime());
49
+ } else if (Array.isArray(sourceValue)) {
50
+ // If source value is an array, create a shallow copy of the array.
51
+ (output as any)[key] = [...sourceValue];
52
+ } else if (isObject(sourceValue)) {
53
+ // If source value is an object:
54
+ if (isObject(outputValue)) {
55
+ // If the corresponding value in output (from target) is also an object, recurse.
56
+ // Ensure the ignoreUndefined flag is passed down.
57
+ (output as any)[key] = mergeDeep(outputValue, sourceValue, ignoreUndefined);
58
+ } else {
59
+ // If output's value (from target) is not an object (e.g., null, primitive, or key didn't exist in original target),
60
+ // overwrite with the source object.
61
+ (output as any)[key] = sourceValue;
62
+ }
26
63
  } else {
27
- Object.assign(output, { [key]: sourceElement });
64
+ // If source value is a primitive, null, or undefined (and not ignored).
65
+ (output as any)[key] = sourceValue;
28
66
  }
29
- });
67
+ }
30
68
  }
31
- return output as T;
69
+
70
+ return output as T & U;
32
71
  }
33
72
 
73
+
34
74
  export function getValueInPath(o: object | undefined, path: string): any {
35
75
  if (!o) return undefined;
36
76
  if (typeof o === "object") {
@@ -125,6 +165,26 @@ export function removeUndefined(value: any, removeEmptyStrings?: boolean): any {
125
165
  return value;
126
166
  }
127
167
 
168
+ export function removeNulls(value: any): any {
169
+ if (typeof value === "function") {
170
+ return value;
171
+ }
172
+ if (Array.isArray(value)) {
173
+ return value.map((v: any) => removeNulls(v));
174
+ }
175
+ if (typeof value === "object") {
176
+ const res: object = {};
177
+ if (value === null)
178
+ return value;
179
+ Object.keys(value).forEach((key) => {
180
+ if (value[key] !== null)
181
+ (res as any)[key] = removeNulls(value[key]);
182
+ });
183
+ return res;
184
+ }
185
+ return value;
186
+ }
187
+
128
188
  export function isEmptyObject(obj: object) {
129
189
  return obj &&
130
190
  Object.getPrototypeOf(obj) === Object.prototype &&
@@ -22,11 +22,11 @@ export function getParentReferencesFromPath(props: {
22
22
 
23
23
  const collection: EntityCollection<any> | undefined = collections && collections.find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);
24
24
 
25
+ // If we find a collection, we add the reference and continue
25
26
  if (collection) {
26
- const pathOrAlias = collection.id ?? collection.path;
27
27
  const collectionPath = currentFullPath && currentFullPath.length > 0
28
- ? (currentFullPath + "/" + pathOrAlias)
29
- : pathOrAlias;
28
+ ? (currentFullPath + "/" + collection.path)
29
+ : collection.path;
30
30
 
31
31
  const restOfThePath = removeInitialAndTrailingSlashes(removeInitialAndTrailingSlashes(path).replace(subpathCombination, ""));
32
32
  const nextSegments = restOfThePath.length > 0 ? restOfThePath.split("/") : [];
@@ -8,9 +8,9 @@ const DEFAULT_PERMISSIONS = {
8
8
  delete: true
9
9
  };
10
10
 
11
- export function resolvePermissions<M extends Record<string, any>, UserType extends User>
11
+ export function resolvePermissions<M extends Record<string, any>, USER extends User>
12
12
  (collection: EntityCollection<M>,
13
- authController: AuthController<UserType>,
13
+ authController: AuthController<USER>,
14
14
  path: string,
15
15
  entity: Entity<M> | null): Permissions | undefined {
16
16
 
@@ -34,29 +34,29 @@ export function resolvePermissions<M extends Record<string, any>, UserType exten
34
34
  throw Error("New type of permission added and not mapped");
35
35
  }
36
36
 
37
- export function canEditEntity<M extends Record<string, any>, UserType extends User>
37
+ export function canEditEntity<M extends Record<string, any>, USER extends User>
38
38
  (
39
39
  collection: EntityCollection<M>,
40
- authController: AuthController<UserType>,
40
+ authController: AuthController<USER>,
41
41
  path: string,
42
42
  entity: Entity<M> | null): boolean {
43
43
  return resolvePermissions(collection, authController, path, entity)?.edit ?? DEFAULT_PERMISSIONS.edit;
44
44
  }
45
45
 
46
- export function canCreateEntity<M extends Record<string, any>, UserType extends User>
46
+ export function canCreateEntity<M extends Record<string, any>, USER extends User>
47
47
  (
48
48
  collection: EntityCollection<M>,
49
- authController: AuthController<UserType>,
49
+ authController: AuthController<USER>,
50
50
  path: string,
51
51
  entity: Entity<M> | null): boolean {
52
52
  if (collection.collectionGroup) return false;
53
53
  return resolvePermissions(collection, authController, path, entity)?.create ?? DEFAULT_PERMISSIONS.create;
54
54
  }
55
55
 
56
- export function canDeleteEntity<M extends Record<string, any>, UserType extends User>
56
+ export function canDeleteEntity<M extends Record<string, any>, USER extends User>
57
57
  (
58
58
  collection: EntityCollection<M>,
59
- authController: AuthController<UserType>,
59
+ authController: AuthController<USER>,
60
60
  path: string,
61
61
  entity: Entity<M> | null): boolean {
62
62
  return resolvePermissions(collection, authController, path, entity)?.delete ?? DEFAULT_PERMISSIONS.delete;
@@ -1,17 +1,28 @@
1
1
  import React from "react";
2
2
 
3
- import { EntityCollection, PropertiesOrBuilders, PropertyConfig, PropertyOrBuilder, ResolvedProperty } from "../types";
3
+ import {
4
+ AuthController,
5
+ EntityCollection,
6
+ PropertiesOrBuilders,
7
+ PropertyConfig,
8
+ PropertyOrBuilder,
9
+ ResolvedProperties,
10
+ ResolvedProperty
11
+ } from "../types";
4
12
  import { isPropertyBuilder } from "./entities";
5
13
  import { resolveProperty } from "./resolutions";
6
14
  import { CircleIcon, FunctionsIcon } from "@firecms/ui";
7
15
  import { getFieldConfig } from "../core";
8
16
 
9
- export function isReferenceProperty(propertyOrBuilder: PropertyOrBuilder,
10
- fields: Record<string, PropertyConfig>) {
17
+ export function isReferenceProperty(
18
+ authController: AuthController,
19
+ propertyOrBuilder: PropertyOrBuilder,
20
+ fields: Record<string, PropertyConfig>) {
11
21
  const resolvedProperty = resolveProperty({
12
22
  propertyKey: "ignore", // TODO
13
23
  propertyOrBuilder,
14
- fields
24
+ propertyConfigs: fields,
25
+ authController
15
26
  });
16
27
  if (!resolvedProperty) return null;
17
28
  if (resolvedProperty.dataType === "reference") {
@@ -35,7 +46,7 @@ export function getIconForWidget(widget: PropertyConfig | undefined,
35
46
  }
36
47
 
37
48
  export function getIconForProperty(
38
- property: PropertyOrBuilder | ResolvedProperty,
49
+ property: PropertyOrBuilder<any> | ResolvedProperty<any>,
39
50
  size: "small" | "medium" | "large" = "small",
40
51
  fields: Record<string, PropertyConfig> = {}
41
52
  ): React.ReactNode {
@@ -63,7 +74,7 @@ export function getColorForProperty(property: PropertyOrBuilder, fields: Record<
63
74
  * @param properties
64
75
  * @param path
65
76
  */
66
- export function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M>, path: string): PropertyOrBuilder<any, M> | undefined {
77
+ export function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M> | ResolvedProperties, path: string): PropertyOrBuilder<any, M> | undefined {
67
78
  if (typeof properties === "object") {
68
79
  if (path in properties) {
69
80
  return properties[path];
@@ -1,21 +1,26 @@
1
- import { EntityCollection, PropertyConfig, ResolvedEntityCollection } from "../types";
1
+ import { AuthController, EntityCollection, PropertyConfig, ResolvedEntityCollection } from "../types";
2
2
  import { isReferenceProperty } from "./property_utils";
3
3
  import { isPropertyBuilder } from "./entities";
4
4
  import { getFieldConfig } from "../core";
5
5
 
6
- export function getEntityPreviewKeys(targetCollection: EntityCollection<any>,
7
- fields: Record<string, PropertyConfig>,
8
- previewProperties?: string[],
9
- limit = 3) {
6
+ export function getEntityPreviewKeys(
7
+ authController: AuthController,
8
+ targetCollection: EntityCollection<any>,
9
+ fields: Record<string, PropertyConfig>,
10
+ previewProperties?: string[],
11
+ limit = 3) {
10
12
  const allProperties = Object.keys(targetCollection.properties);
11
13
  let listProperties = previewProperties?.filter(p => allProperties.includes(p as string));
14
+ if (!listProperties && targetCollection.previewProperties) {
15
+ listProperties = targetCollection.previewProperties?.filter(p => allProperties.includes(p as string));
16
+ }
12
17
  if (listProperties && listProperties.length > 0) {
13
18
  return listProperties;
14
19
  } else {
15
20
  listProperties = allProperties;
16
21
  return listProperties.filter(key => {
17
22
  const propertyOrBuilder = targetCollection.properties[key];
18
- return propertyOrBuilder && !isPropertyBuilder(propertyOrBuilder) && !isReferenceProperty(propertyOrBuilder, fields);
23
+ return propertyOrBuilder && !isPropertyBuilder(propertyOrBuilder) && !isReferenceProperty(authController, propertyOrBuilder, fields);
19
24
  }).slice(0, limit);
20
25
  }
21
26
  }
@@ -39,13 +44,19 @@ export function getEntityTitlePropertyKey<M extends Record<string, any>>(collect
39
44
 
40
45
  export function getEntityImagePreviewPropertyKey<M extends object>(collection: ResolvedEntityCollection<M>): string | undefined {
41
46
 
42
- // find first text field property
47
+ // find first storage property of type image
43
48
  for (const key in collection.properties) {
44
49
  const property = collection.properties[key];
45
50
  if (property.dataType === "string" && property.storage?.acceptedFiles?.includes("image/*")) {
46
51
  return key;
47
52
  }
48
-
53
+ }
54
+ // alternatively, look for the first array of images
55
+ for (const key in collection.properties) {
56
+ const property = collection.properties[key];
57
+ if (property.dataType === "array" && property.of?.dataType === "string" && property.of.storage?.acceptedFiles?.includes("image/*")) {
58
+ return key;
59
+ }
49
60
  }
50
61
  return undefined;
51
62
  }