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

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 (371) 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/UserDisplay.d.ts +7 -0
  28. package/dist/components/VirtualTable/VirtualTableProps.d.ts +11 -2
  29. package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
  30. package/dist/components/common/default_entity_actions.d.ts +0 -2
  31. package/dist/components/common/index.d.ts +1 -1
  32. package/dist/components/common/useColumnsIds.d.ts +1 -0
  33. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +10 -2
  34. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  35. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  36. package/dist/components/index.d.ts +3 -1
  37. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  38. package/dist/contexts/InternalUserManagementContext.d.ts +3 -0
  39. package/dist/core/DefaultAppBar.d.ts +8 -2
  40. package/dist/core/DrawerNavigationItem.d.ts +2 -1
  41. package/dist/core/EntityEditView.d.ts +40 -22
  42. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  43. package/dist/core/FireCMS.d.ts +2 -3
  44. package/dist/core/FireCMSRouter.d.ts +4 -0
  45. package/dist/core/NavigationRoutes.d.ts +0 -1
  46. package/dist/core/SideDialogs.d.ts +4 -2
  47. package/dist/core/field_configs.d.ts +1 -1
  48. package/dist/core/index.d.ts +2 -1
  49. package/dist/form/EntityForm.d.ts +50 -0
  50. package/dist/form/EntityFormActions.d.ts +21 -0
  51. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  52. package/dist/form/components/FormEntry.d.ts +6 -0
  53. package/dist/form/components/FormLayout.d.ts +5 -0
  54. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  55. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  56. package/dist/form/components/index.d.ts +3 -1
  57. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  58. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  59. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  60. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  61. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  62. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  63. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  64. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  65. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  66. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  67. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  68. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +4 -10
  70. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  71. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +12 -0
  73. package/dist/form/index.d.ts +17 -16
  74. package/dist/form/useClearRestoreValue.d.ts +2 -2
  75. package/dist/hooks/data/delete.d.ts +4 -4
  76. package/dist/hooks/data/save.d.ts +3 -3
  77. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  78. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  79. package/dist/hooks/index.d.ts +2 -0
  80. package/dist/hooks/useAuthController.d.ts +1 -1
  81. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  82. package/dist/hooks/useBuildNavigationController.d.ts +57 -12
  83. package/dist/hooks/useCollapsedGroups.d.ts +9 -0
  84. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  85. package/dist/hooks/useInternalUserManagementController.d.ts +12 -0
  86. package/dist/hooks/useModeController.d.ts +1 -2
  87. package/dist/hooks/useProjectLog.d.ts +7 -1
  88. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  89. package/dist/hooks/useValidateAuthenticator.d.ts +3 -3
  90. package/dist/index.es.js +20480 -14434
  91. package/dist/index.es.js.map +1 -1
  92. package/dist/index.umd.js +20250 -14209
  93. package/dist/index.umd.js.map +1 -1
  94. package/dist/internal/useBuildDataSource.d.ts +3 -2
  95. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  96. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  97. package/dist/preview/PropertyPreviewProps.d.ts +1 -1
  98. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  99. package/dist/preview/components/ReferencePreview.d.ts +2 -2
  100. package/dist/preview/components/UserPreview.d.ts +8 -0
  101. package/dist/preview/index.d.ts +1 -0
  102. package/dist/preview/util.d.ts +3 -3
  103. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  104. package/dist/routes/FireCMSRoute.d.ts +1 -0
  105. package/dist/routes/HomePageRoute.d.ts +3 -0
  106. package/dist/types/analytics.d.ts +1 -1
  107. package/dist/types/auth.d.ts +7 -9
  108. package/dist/types/collections.d.ts +88 -25
  109. package/dist/types/customization_controller.d.ts +8 -0
  110. package/dist/types/datasource.d.ts +19 -17
  111. package/dist/types/dialogs_controller.d.ts +7 -3
  112. package/dist/types/entities.d.ts +7 -2
  113. package/dist/types/entity_actions.d.ts +58 -8
  114. package/dist/types/entity_callbacks.d.ts +16 -16
  115. package/dist/types/entity_overrides.d.ts +2 -2
  116. package/dist/types/export_import.d.ts +4 -4
  117. package/dist/types/fields.d.ts +43 -17
  118. package/dist/types/firecms.d.ts +31 -3
  119. package/dist/types/firecms_context.d.ts +17 -1
  120. package/dist/types/index.d.ts +1 -0
  121. package/dist/types/internal_user_management.d.ts +20 -0
  122. package/dist/types/navigation.d.ts +60 -17
  123. package/dist/types/permissions.d.ts +4 -4
  124. package/dist/types/plugins.d.ts +44 -9
  125. package/dist/types/properties.d.ts +74 -22
  126. package/dist/types/property_config.d.ts +1 -3
  127. package/dist/types/roles.d.ts +3 -0
  128. package/dist/types/side_dialogs_controller.d.ts +10 -0
  129. package/dist/types/side_entity_controller.d.ts +14 -1
  130. package/dist/types/storage.d.ts +75 -0
  131. package/dist/types/user.d.ts +2 -1
  132. package/dist/util/builders.d.ts +3 -3
  133. package/dist/util/callbacks.d.ts +2 -0
  134. package/dist/util/createFormexStub.d.ts +2 -0
  135. package/dist/util/entities.d.ts +2 -2
  136. package/dist/util/entity_actions.d.ts +2 -0
  137. package/dist/util/entity_cache.d.ts +23 -0
  138. package/dist/util/icon_synonyms.d.ts +0 -1
  139. package/dist/util/icons.d.ts +5 -2
  140. package/dist/util/index.d.ts +3 -0
  141. package/dist/util/navigation_from_path.d.ts +10 -1
  142. package/dist/util/navigation_utils.d.ts +13 -1
  143. package/dist/util/objects.d.ts +2 -1
  144. package/dist/util/permissions.d.ts +4 -4
  145. package/dist/util/property_utils.d.ts +4 -4
  146. package/dist/util/references.d.ts +2 -2
  147. package/dist/util/resolutions.d.ts +30 -6
  148. package/dist/util/storage.d.ts +1 -1
  149. package/dist/util/useStorageUploadController.d.ts +2 -2
  150. package/package.json +133 -125
  151. package/src/app/Drawer.tsx +0 -1
  152. package/src/app/Scaffold.tsx +33 -29
  153. package/src/components/ArrayContainer.tsx +447 -229
  154. package/src/components/CircularProgressCenter.tsx +1 -1
  155. package/src/components/ClearFilterSortButton.tsx +1 -1
  156. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
  157. package/src/components/DeleteEntityDialog.tsx +13 -20
  158. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -25
  159. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +23 -17
  160. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +20 -3
  161. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -9
  162. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +21 -16
  163. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +6 -12
  164. package/src/components/EntityCollectionTable/index.tsx +1 -1
  165. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +6 -6
  166. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +35 -26
  167. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  168. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +132 -101
  169. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
  170. package/src/components/EntityCollectionView/EntityCollectionView.tsx +178 -85
  171. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
  172. package/src/components/EntityCollectionView/useSelectionController.tsx +5 -4
  173. package/src/components/EntityCollectionView/utils.ts +19 -0
  174. package/src/components/EntityJsonPreview.tsx +66 -0
  175. package/src/components/EntityPreview.tsx +75 -57
  176. package/src/components/EntityView.tsx +8 -5
  177. package/src/components/ErrorView.tsx +3 -3
  178. package/src/components/FireCMSLogo.tsx +7 -51
  179. package/src/components/HomePage/DefaultHomePage.tsx +506 -161
  180. package/src/components/HomePage/FavouritesView.tsx +9 -14
  181. package/src/components/HomePage/HomePageDnD.tsx +600 -0
  182. package/src/components/HomePage/NavigationCard.tsx +47 -38
  183. package/src/components/HomePage/NavigationCardBinding.tsx +16 -15
  184. package/src/components/HomePage/NavigationGroup.tsx +144 -30
  185. package/src/components/HomePage/RenameGroupDialog.tsx +123 -0
  186. package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
  187. package/src/components/NotFoundPage.tsx +2 -2
  188. package/src/components/PropertyConfigBadge.tsx +10 -4
  189. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  190. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +22 -13
  191. package/src/components/SearchIconsView.tsx +2 -2
  192. package/src/components/SelectableTable/SelectableTable.tsx +154 -142
  193. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +4 -2
  194. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +10 -8
  195. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +60 -11
  196. package/src/components/UnsavedChangesDialog.tsx +46 -0
  197. package/src/components/UserDisplay.tsx +55 -0
  198. package/src/components/VirtualTable/VirtualTable.tsx +65 -44
  199. package/src/components/VirtualTable/VirtualTableCell.tsx +0 -8
  200. package/src/components/VirtualTable/VirtualTableHeader.tsx +8 -8
  201. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +1 -1
  202. package/src/components/VirtualTable/VirtualTableProps.tsx +12 -2
  203. package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
  204. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
  205. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
  206. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  207. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  208. package/src/components/VirtualTable/fields/VirtualTableUserSelect.tsx +99 -0
  209. package/src/components/common/default_entity_actions.tsx +62 -42
  210. package/src/components/common/index.ts +1 -1
  211. package/src/components/common/useColumnsIds.tsx +2 -9
  212. package/src/components/common/useDataSourceTableController.tsx +420 -0
  213. package/src/components/common/useDebouncedCallback.tsx +20 -0
  214. package/src/components/common/useScrollRestoration.tsx +68 -0
  215. package/src/components/common/useTableSearchHelper.ts +1 -0
  216. package/src/components/index.tsx +4 -1
  217. package/src/contexts/BreacrumbsContext.tsx +38 -0
  218. package/src/contexts/DialogsProvider.tsx +3 -2
  219. package/src/contexts/InternalUserManagementContext.tsx +4 -0
  220. package/src/contexts/ModeController.tsx +1 -3
  221. package/src/contexts/SnackbarProvider.tsx +2 -0
  222. package/src/core/DefaultAppBar.tsx +124 -85
  223. package/src/core/DefaultDrawer.tsx +30 -22
  224. package/src/core/DrawerNavigationItem.tsx +32 -28
  225. package/src/core/EntityEditView.tsx +388 -995
  226. package/src/core/EntityEditViewFormActions.tsx +329 -0
  227. package/src/core/EntitySidePanel.tsx +88 -20
  228. package/src/core/FireCMS.tsx +58 -28
  229. package/src/core/FireCMSRouter.tsx +17 -0
  230. package/src/core/NavigationRoutes.tsx +23 -32
  231. package/src/core/SideDialogs.tsx +22 -12
  232. package/src/core/field_configs.tsx +39 -11
  233. package/src/core/index.tsx +4 -2
  234. package/src/form/EntityForm.tsx +814 -0
  235. package/src/form/EntityFormActions.tsx +211 -0
  236. package/src/form/PropertyFieldBinding.tsx +59 -41
  237. package/src/form/components/CustomIdField.tsx +9 -3
  238. package/src/form/components/FieldHelperText.tsx +1 -1
  239. package/src/form/components/FormEntry.tsx +22 -0
  240. package/src/form/components/FormLayout.tsx +16 -0
  241. package/src/form/components/LabelWithIcon.tsx +30 -19
  242. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  243. package/src/form/components/StorageItemPreview.tsx +5 -4
  244. package/src/form/components/StorageUploadProgress.tsx +2 -3
  245. package/src/form/components/index.tsx +3 -1
  246. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +30 -18
  247. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -36
  248. package/src/form/field_bindings/BlockFieldBinding.tsx +55 -33
  249. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  250. package/src/form/field_bindings/KeyValueFieldBinding.tsx +19 -15
  251. package/src/form/field_bindings/MapFieldBinding.tsx +72 -62
  252. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
  253. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
  254. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +10 -8
  255. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  256. package/src/form/field_bindings/ReferenceFieldBinding.tsx +28 -19
  257. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -32
  258. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -13
  259. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +247 -168
  260. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  261. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  262. package/src/form/field_bindings/UserSelectFieldBinding.tsx +94 -0
  263. package/src/form/index.tsx +17 -37
  264. package/src/form/useClearRestoreValue.tsx +2 -2
  265. package/src/form/validation.ts +12 -6
  266. package/src/hooks/data/delete.ts +6 -5
  267. package/src/hooks/data/save.ts +26 -35
  268. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  269. package/src/hooks/data/useDataSource.tsx +10 -2
  270. package/src/hooks/data/useEntityFetch.tsx +10 -6
  271. package/src/hooks/index.tsx +3 -0
  272. package/src/hooks/useAuthController.tsx +1 -1
  273. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  274. package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
  275. package/src/hooks/useBuildModeController.tsx +15 -28
  276. package/src/hooks/useBuildNavigationController.tsx +386 -124
  277. package/src/hooks/useCollapsedGroups.ts +64 -0
  278. package/src/hooks/useFireCMSContext.tsx +9 -35
  279. package/src/hooks/useInternalUserManagementController.tsx +16 -0
  280. package/src/hooks/useLargeLayout.tsx +0 -35
  281. package/src/hooks/useModeController.tsx +1 -2
  282. package/src/hooks/useProjectLog.tsx +16 -5
  283. package/src/hooks/useResolvedNavigationFrom.tsx +9 -11
  284. package/src/hooks/useValidateAuthenticator.tsx +3 -3
  285. package/src/internal/useBuildDataSource.ts +67 -80
  286. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  287. package/src/internal/useBuildSideEntityController.tsx +149 -86
  288. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  289. package/src/preview/PropertyPreview.tsx +36 -12
  290. package/src/preview/PropertyPreviewProps.tsx +1 -1
  291. package/src/preview/components/BooleanPreview.tsx +1 -1
  292. package/src/preview/components/EmptyValue.tsx +1 -1
  293. package/src/preview/components/EnumValuesChip.tsx +1 -1
  294. package/src/preview/components/ImagePreview.tsx +10 -9
  295. package/src/preview/components/ReferencePreview.tsx +10 -18
  296. package/src/preview/components/UrlComponentPreview.tsx +20 -21
  297. package/src/preview/components/UserPreview.tsx +27 -0
  298. package/src/preview/index.ts +1 -0
  299. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -5
  300. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -4
  301. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -3
  302. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -3
  303. package/src/preview/property_previews/ArrayOneOfPreview.tsx +6 -4
  304. package/src/preview/property_previews/ArrayPropertyPreview.tsx +6 -4
  305. package/src/preview/property_previews/MapPropertyPreview.tsx +7 -6
  306. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  307. package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
  308. package/src/preview/util.ts +10 -10
  309. package/src/routes/CustomCMSRoute.tsx +21 -0
  310. package/src/routes/FireCMSRoute.tsx +246 -0
  311. package/src/routes/HomePageRoute.tsx +17 -0
  312. package/src/types/analytics.ts +3 -0
  313. package/src/types/auth.tsx +8 -12
  314. package/src/types/collections.ts +103 -28
  315. package/src/types/customization_controller.tsx +9 -0
  316. package/src/types/datasource.ts +21 -20
  317. package/src/types/dialogs_controller.tsx +7 -3
  318. package/src/types/entities.ts +10 -2
  319. package/src/types/entity_actions.tsx +71 -8
  320. package/src/types/entity_callbacks.ts +18 -18
  321. package/src/types/entity_overrides.tsx +2 -2
  322. package/src/types/export_import.ts +4 -4
  323. package/src/types/fields.tsx +52 -19
  324. package/src/types/firecms.tsx +34 -4
  325. package/src/types/firecms_context.tsx +18 -1
  326. package/src/types/index.ts +1 -0
  327. package/src/types/internal_user_management.ts +24 -0
  328. package/src/types/navigation.ts +76 -22
  329. package/src/types/permissions.ts +5 -5
  330. package/src/types/plugins.tsx +53 -9
  331. package/src/types/properties.ts +84 -22
  332. package/src/types/property_config.tsx +2 -2
  333. package/src/types/roles.ts +3 -0
  334. package/src/types/side_dialogs_controller.tsx +15 -0
  335. package/src/types/side_entity_controller.tsx +16 -1
  336. package/src/types/storage.ts +82 -0
  337. package/src/types/user.ts +3 -1
  338. package/src/util/builders.ts +10 -8
  339. package/src/util/callbacks.ts +119 -0
  340. package/src/util/createFormexStub.tsx +62 -0
  341. package/src/util/entities.ts +6 -4
  342. package/src/util/entity_actions.ts +28 -0
  343. package/src/util/entity_cache.ts +204 -0
  344. package/src/util/icon_list.ts +1 -1
  345. package/src/util/icon_synonyms.ts +0 -1
  346. package/src/util/icons.tsx +36 -11
  347. package/src/util/index.ts +3 -0
  348. package/src/util/join_collections.ts +9 -2
  349. package/src/util/make_properties_editable.ts +13 -5
  350. package/src/util/navigation_from_path.ts +33 -12
  351. package/src/util/navigation_utils.ts +135 -19
  352. package/src/util/objects.ts +74 -14
  353. package/src/util/parent_references_from_path.ts +3 -3
  354. package/src/util/permissions.ts +8 -8
  355. package/src/util/property_utils.tsx +17 -6
  356. package/src/util/references.ts +19 -8
  357. package/src/util/resolutions.ts +93 -24
  358. package/src/util/storage.ts +6 -2
  359. package/src/util/useStorageUploadController.tsx +74 -29
  360. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
  361. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  362. package/dist/form/PropertiesForm.d.ts +0 -8
  363. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  364. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  365. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
  366. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -27
  367. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -236
  368. package/src/form/PropertiesForm.tsx +0 -81
  369. package/src/form/components/FormikArrayContainer.tsx +0 -44
  370. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  371. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -0,0 +1,119 @@
1
+ import { EntityCallbacks } from "../types";
2
+
3
+ export const mergeCallbacks = (
4
+ baseCallbacks: EntityCallbacks = {},
5
+ pluginCallbacks: EntityCallbacks = {}
6
+ ): EntityCallbacks | undefined => {
7
+
8
+ if (!baseCallbacks && !pluginCallbacks) {
9
+ return undefined;
10
+ }
11
+
12
+ const mergedCallbacks: EntityCallbacks = {};
13
+
14
+ // Handle onFetch - returns Entity<M> or Promise<Entity<M>>
15
+ if (baseCallbacks.onFetch || pluginCallbacks.onFetch) {
16
+ mergedCallbacks.onFetch = async (props) => {
17
+ let entity = props.entity;
18
+ if (baseCallbacks.onFetch) {
19
+ entity = await Promise.resolve(baseCallbacks.onFetch(props));
20
+ }
21
+ if (pluginCallbacks.onFetch) {
22
+ entity = await Promise.resolve(pluginCallbacks.onFetch({
23
+ ...props,
24
+ entity
25
+ }));
26
+ }
27
+ return entity;
28
+ };
29
+ }
30
+
31
+ // Handle onSaveSuccess - returns void or Promise<void>
32
+ if (baseCallbacks.onSaveSuccess || pluginCallbacks.onSaveSuccess) {
33
+ mergedCallbacks.onSaveSuccess = async (props) => {
34
+ if (baseCallbacks.onSaveSuccess) {
35
+ await Promise.resolve(baseCallbacks.onSaveSuccess(props));
36
+ }
37
+ if (pluginCallbacks.onSaveSuccess) {
38
+ await Promise.resolve(pluginCallbacks.onSaveSuccess(props));
39
+ }
40
+ };
41
+ }
42
+
43
+ // Handle onSaveFailure - returns void or Promise<void>
44
+ if (baseCallbacks.onSaveFailure || pluginCallbacks.onSaveFailure) {
45
+ mergedCallbacks.onSaveFailure = async (props) => {
46
+ if (baseCallbacks.onSaveFailure) {
47
+ await Promise.resolve(baseCallbacks.onSaveFailure(props));
48
+ }
49
+ if (pluginCallbacks.onSaveFailure) {
50
+ await Promise.resolve(pluginCallbacks.onSaveFailure(props));
51
+ }
52
+ };
53
+ }
54
+
55
+ // Handle onPreSave - returns Partial<EntityValues<M>> or Promise<Partial<EntityValues<M>>>
56
+ if (baseCallbacks.onPreSave || pluginCallbacks.onPreSave) {
57
+ mergedCallbacks.onPreSave = async (props) => {
58
+ let values = { ...props.values };
59
+ if (baseCallbacks.onPreSave) {
60
+ const baseValues = await Promise.resolve(baseCallbacks.onPreSave(props));
61
+ values = { ...values, ...baseValues };
62
+ }
63
+ if (pluginCallbacks.onPreSave) {
64
+ const pluginValues = await Promise.resolve(pluginCallbacks.onPreSave({
65
+ ...props,
66
+ values
67
+ }));
68
+ values = { ...values, ...pluginValues };
69
+ }
70
+ return values;
71
+ };
72
+ }
73
+
74
+ // Handle onPreDelete - returns void
75
+ if (baseCallbacks.onPreDelete || pluginCallbacks.onPreDelete) {
76
+ mergedCallbacks.onPreDelete = (props) => {
77
+ if (baseCallbacks.onPreDelete) {
78
+ baseCallbacks.onPreDelete(props);
79
+ }
80
+ if (pluginCallbacks.onPreDelete) {
81
+ pluginCallbacks.onPreDelete(props);
82
+ }
83
+ };
84
+ }
85
+
86
+ // Handle onDelete - returns void
87
+ if (baseCallbacks.onDelete || pluginCallbacks.onDelete) {
88
+ mergedCallbacks.onDelete = (props) => {
89
+ if (baseCallbacks.onDelete) {
90
+ baseCallbacks.onDelete(props);
91
+ }
92
+ if (pluginCallbacks.onDelete) {
93
+ pluginCallbacks.onDelete(props);
94
+ }
95
+ };
96
+ }
97
+
98
+ // Handle onIdUpdate - returns string or Promise<string>
99
+ if (baseCallbacks.onIdUpdate || pluginCallbacks.onIdUpdate) {
100
+ mergedCallbacks.onIdUpdate = async (props) => {
101
+ let id = props.entityId || "";
102
+
103
+ if (baseCallbacks.onIdUpdate) {
104
+ id = await Promise.resolve(baseCallbacks.onIdUpdate(props));
105
+ }
106
+
107
+ if (pluginCallbacks.onIdUpdate) {
108
+ id = await Promise.resolve(pluginCallbacks.onIdUpdate({
109
+ ...props,
110
+ entityId: id
111
+ }));
112
+ }
113
+
114
+ return id;
115
+ };
116
+ }
117
+
118
+ return Object.keys(mergedCallbacks).length > 0 ? mergedCallbacks : undefined;
119
+ };
@@ -0,0 +1,62 @@
1
+ import { FormexController } from "@firecms/formex";
2
+
3
+ export function createFormexStub<T extends object>(values: T): FormexController<T> {
4
+ const errorMessage = "You are in a read-only context. You cannot modify the formex controller.";
5
+
6
+ return {
7
+ values,
8
+ initialValues: values,
9
+ touched: {} as Record<string, boolean>,
10
+ dirty: false,
11
+ errors: {} as Record<string, string>,
12
+ submitCount: 0,
13
+ isSubmitting: false,
14
+ isValidating: false,
15
+ version: 0,
16
+ canUndo: false,
17
+ canRedo: false,
18
+
19
+ setValues: () => {
20
+ throw new Error(errorMessage);
21
+ },
22
+ setFieldValue: () => {
23
+ throw new Error(errorMessage);
24
+ },
25
+ setFieldTouched: () => {
26
+ throw new Error(errorMessage);
27
+ },
28
+ setDirty: () => {
29
+ throw new Error(errorMessage);
30
+ },
31
+ setSubmitCount: () => {
32
+ throw new Error(errorMessage);
33
+ },
34
+ setFieldError: () => {
35
+ throw new Error(errorMessage);
36
+ },
37
+ handleChange: () => {
38
+ throw new Error(errorMessage);
39
+ },
40
+ handleBlur: () => {
41
+ throw new Error(errorMessage);
42
+ },
43
+ handleSubmit: () => {
44
+ throw new Error(errorMessage);
45
+ },
46
+ validate: () => {
47
+ throw new Error(errorMessage);
48
+ },
49
+ resetForm: () => {
50
+ throw new Error(errorMessage);
51
+ },
52
+ setSubmitting: () => {
53
+ throw new Error(errorMessage);
54
+ },
55
+ undo: () => {
56
+ throw new Error(errorMessage);
57
+ },
58
+ redo: () => {
59
+ throw new Error(errorMessage);
60
+ }
61
+ };
62
+ }
@@ -15,7 +15,7 @@ import {
15
15
  } from "../types";
16
16
  import { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from "./common";
17
17
 
18
- export function isReadOnly(property: Property | ResolvedProperty): boolean {
18
+ export function isReadOnly(property: Property<any> | ResolvedProperty<any>): boolean {
19
19
  if (property.readOnly)
20
20
  return true;
21
21
  if (property.dataType === "date") {
@@ -23,7 +23,7 @@ export function isReadOnly(property: Property | ResolvedProperty): boolean {
23
23
  return true;
24
24
  }
25
25
  if (property.dataType === "reference") {
26
- return !property.path;
26
+ return !property.path && !property.Field;
27
27
  }
28
28
  return false;
29
29
  }
@@ -40,13 +40,15 @@ export function getDefaultValuesFor<M extends Record<string, any>>(properties: P
40
40
  if (!properties) return {};
41
41
  return Object.entries(properties)
42
42
  .map(([key, property]) => {
43
+ if (!property) return {};
43
44
  const value = getDefaultValueFor(property as PropertyOrBuilder);
44
45
  return value === undefined ? {} : { [key]: value };
45
46
  })
46
47
  .reduce((a, b) => ({ ...a, ...b }), {}) as EntityValues<M>;
47
48
  }
48
49
 
49
- export function getDefaultValueFor(property: PropertyOrBuilder) {
50
+ export function getDefaultValueFor(property?: PropertyOrBuilder) {
51
+ if (!property) return undefined;
50
52
  if (isPropertyBuilder(property)) return undefined;
51
53
  if (property.defaultValue || property.defaultValue === null) {
52
54
  return property.defaultValue;
@@ -140,7 +142,7 @@ export function sanitizeData<M extends Record<string, any>>
140
142
  }
141
143
 
142
144
  export function getReferenceFrom<M extends Record<string, any>>(entity: Entity<M>): EntityReference {
143
- return new EntityReference(entity.id, entity.path);
145
+ return new EntityReference(entity.id, entity.path, entity.databaseId);
144
146
  }
145
147
 
146
148
  export function traverseValuesProperties<M extends Record<string, any>>(
@@ -0,0 +1,28 @@
1
+ import { EntityAction } from "../types";
2
+
3
+ const reservedKeys = ["edit", "copy", "delete"];
4
+
5
+ export function mergeEntityActions(currentActions: EntityAction[], newActions: EntityAction[]): EntityAction[] {
6
+ // given the current actions, replace the ones with the same key
7
+ // and append the new ones
8
+ const updatedActions: EntityAction[] = [];
9
+ currentActions.forEach(action => {
10
+ const newAction = newActions.find(a => a.key === action.key);
11
+ if (newAction) {
12
+ const mergedAction = {
13
+ ...action,
14
+ ...newAction
15
+ }
16
+ updatedActions.push(mergedAction);
17
+ } else {
18
+ updatedActions.push(action);
19
+ }
20
+ });
21
+ newActions.forEach(action => {
22
+ if (!currentActions.find(a => a.key === action.key) && (!action.key || !reservedKeys.includes(action.key))) {
23
+ updatedActions.push(action);
24
+ }
25
+ });
26
+ return updatedActions;
27
+
28
+ }
@@ -0,0 +1,204 @@
1
+ import { EntityReference, GeoPoint, Vector } from "../types";
2
+
3
+ // Define a unique prefix for entity keys in localStorage to avoid key collisions
4
+ const LOCAL_STORAGE_PREFIX = "entity_cache::";
5
+
6
+ // In-memory cache to store entities for quick access
7
+ const entityCache: Map<string, object> = new Map();
8
+
9
+ // Check `localStorage` availability once during initialization
10
+ const isLocalStorageAvailable = typeof localStorage !== "undefined";
11
+
12
+ // Define custom replacer for JSON.stringify
13
+ function customReplacer(key: string): any {
14
+
15
+ // @ts-ignore
16
+ const value = this[key];
17
+
18
+ // Handle Date objects
19
+ // @ts-ignore
20
+ if (value instanceof Date) {
21
+ return { __type: "Date", value: value.toISOString() };
22
+ }
23
+
24
+ // Handle EntityReference
25
+ // @ts-ignore
26
+ if (value instanceof EntityReference) {
27
+ return { __type: "EntityReference", id: value.id, path: value.path, databaseId: value.databaseId };
28
+ }
29
+
30
+ // Handle GeoPoint
31
+ // @ts-ignore
32
+ if (value instanceof GeoPoint) {
33
+ return { __type: "GeoPoint", latitude: value.latitude, longitude: value.longitude };
34
+ }
35
+
36
+ // Handle Vector
37
+ // @ts-ignore
38
+ if (value instanceof Vector) {
39
+ return { __type: "Vector", value: value.value };
40
+ }
41
+
42
+ return value;
43
+ }
44
+
45
+ // Define custom reviver for JSON.parse
46
+ function customReviver(key: string, value: any): any {
47
+ if (value && typeof value === "object" && "__type" in value) {
48
+ switch (value.__type) {
49
+ case "Date":
50
+ return new Date(value.value);
51
+ case "EntityReference":
52
+ return new EntityReference(value.id, value.path, value.databaseId);
53
+ case "GeoPoint":
54
+ return new GeoPoint(value.latitude, value.longitude);
55
+ case "Vector":
56
+ return new Vector(value.value);
57
+ default:
58
+ return value;
59
+ }
60
+ }
61
+ return value;
62
+ }
63
+
64
+ // Initialize the in-memory cache by loading entities from `localStorage`
65
+ if (isLocalStorageAvailable) {
66
+ try {
67
+ // Iterate over all keys in localStorage to find those with the specified prefix
68
+ for (let i = 0; i < localStorage.length; i++) {
69
+ const fullKey = localStorage.key(i);
70
+ if (fullKey && fullKey.startsWith(LOCAL_STORAGE_PREFIX)) {
71
+ const path = fullKey.substring(LOCAL_STORAGE_PREFIX.length);
72
+ const entityString = localStorage.getItem(fullKey);
73
+ if (entityString) {
74
+ try {
75
+ const entity: object = JSON.parse(entityString, customReviver);
76
+ entityCache.set(path, entity);
77
+ } catch (parseError) {
78
+ console.error(
79
+ `Failed to parse entity for path "${path}" from localStorage:`,
80
+ parseError
81
+ );
82
+ }
83
+ }
84
+ }
85
+ }
86
+ } catch (error) {
87
+ console.error("Error accessing localStorage during initialization:", error);
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Saves data to the in-memory cache and persists it individually in `localStorage`.
93
+ * @param path - The unique path/key for the data.
94
+ * @param data - The data to cache and persist.
95
+ */
96
+ export function saveEntityToCache(path: string, data: object): void {
97
+ // Update the in-memory cache
98
+ entityCache.set(path, data);
99
+
100
+ // Persist the data individually in localStorage
101
+ if (isLocalStorageAvailable) {
102
+ try {
103
+ const key = LOCAL_STORAGE_PREFIX + path;
104
+ const entityString = JSON.stringify(data, customReplacer);
105
+ localStorage.setItem(key, entityString);
106
+ } catch (error) {
107
+ console.error(
108
+ `Failed to save entity for path "${path}" to localStorage:`,
109
+ error
110
+ );
111
+ }
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Retrieves an entity from the in-memory cache or `localStorage`.
117
+ * If the entity is not in the cache but exists in `localStorage`, it loads it into the cache.
118
+ * @param path - The unique path/key for the entity.
119
+ * @returns The cached entity or `undefined` if not found.
120
+ */
121
+ export function getEntityFromCache(path: string): object | undefined {
122
+
123
+ // Attempt to retrieve the entity from the in-memory cache
124
+ if (entityCache.has(path)) {
125
+ return entityCache.get(path);
126
+ }
127
+
128
+ // If not in the cache, attempt to load it from localStorage
129
+ if (isLocalStorageAvailable) {
130
+ try {
131
+ const key = LOCAL_STORAGE_PREFIX + path;
132
+ const entityString = localStorage.getItem(key);
133
+ if (entityString) {
134
+ const entity: object = JSON.parse(entityString, customReviver);
135
+ entityCache.set(path, entity); // Update the cache
136
+ return entity;
137
+ }
138
+ } catch (error) {
139
+ console.error(
140
+ `Failed to load entity for path "${path}" from localStorage:`,
141
+ error
142
+ );
143
+ }
144
+ }
145
+
146
+ // Entity not found
147
+ return undefined;
148
+ }
149
+
150
+ export function hasEntityInCache(path: string): boolean {
151
+ return entityCache.has(path);
152
+ }
153
+
154
+ /**
155
+ * Removes an entity from both the in-memory cache and `localStorage`.
156
+ * @param path - The unique path/key for the entity to remove.
157
+ */
158
+ export function removeEntityFromCache(path: string): void {
159
+
160
+
161
+ console.debug("Removing entity from cache", path);
162
+
163
+ // Remove from the in-memory cache
164
+ entityCache.delete(path);
165
+
166
+ // Remove from localStorage
167
+ if (isLocalStorageAvailable) {
168
+ try {
169
+ const key = LOCAL_STORAGE_PREFIX + path;
170
+ localStorage.removeItem(key);
171
+ } catch (error) {
172
+ console.error(
173
+ `Failed to remove entity for path "${path}" from localStorage:`,
174
+ error
175
+ );
176
+ }
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Clears the entire in-memory cache and removes all related entities from `localStorage`.
182
+ */
183
+ export function clearEntityCache(): void {
184
+ // Clear the in-memory cache
185
+ entityCache.clear();
186
+
187
+ // Remove all entities with the specified prefix from localStorage
188
+ if (isLocalStorageAvailable) {
189
+ try {
190
+ const keysToRemove: string[] = [];
191
+ for (let i = 0; i < localStorage.length; i++) {
192
+ const fullKey = localStorage.key(i);
193
+ if (fullKey && fullKey.startsWith(LOCAL_STORAGE_PREFIX)) {
194
+ keysToRemove.push(fullKey);
195
+ }
196
+ }
197
+
198
+ // Remove the keys after collecting them to avoid issues while iterating
199
+ keysToRemove.forEach((key) => localStorage.removeItem(key));
200
+ } catch (error) {
201
+ console.error("Failed to clear entity cache from localStorage:", error);
202
+ }
203
+ }
204
+ }
@@ -3,7 +3,6 @@ import { iconKeys } from "@firecms/ui";
3
3
  import Fuse from "fuse.js";
4
4
 
5
5
 
6
- console.log("iconKeys", iconKeys);
7
6
  const map = iconKeys
8
7
  .map((importName) => {
9
8
  // @ts-ignore
@@ -16,6 +15,7 @@ const map = iconKeys
16
15
  export const iconsSearch = new Fuse(map, {
17
16
  isCaseSensitive: false,
18
17
  shouldSort: true,
18
+ ignoreLocation: true,
19
19
  distance: 0,
20
20
  keys: ["key", "synonyms"]
21
21
  })
@@ -1222,7 +1222,6 @@ export const iconSynonyms = {
1222
1222
  picture_in_picture_alt: "cropped overlap photo position shape",
1223
1223
  pie_chart: "analytics bars data diagram infographic measure metrics statistics tracking",
1224
1224
  pie_chart_outline: "analytics bars data diagram infographic measure metrics statistics tracking",
1225
- pie_chart_outlined: "graph",
1226
1225
  pin: "1 2 3 digit key login logout number password pattern security star symbol unlock",
1227
1226
  pinch: "arrows compress direction finger grasp hand navigation nip squeeze tweak",
1228
1227
  pin_drop: "destination direction gps location maps navigation place stop",
@@ -1,16 +1,31 @@
1
1
  import React from "react";
2
2
  import { hashString } from "./hash";
3
- import { coolIconKeys, Icon, iconKeys } from "@firecms/ui";
3
+ import { coolIconKeys, Icon, IconColor, iconKeys } from "@firecms/ui";
4
4
  import { slugify } from "./strings";
5
5
  import equal from "react-fast-compare"
6
6
 
7
- export function getIcon(iconKey?: string, className?: string): React.ReactElement | undefined {
7
+ export function getIcon(iconKey?: string | React.ReactNode,
8
+ className?: string,
9
+ color?: IconColor,
10
+ size?: "smallest" | "small" | "medium" | "large" | number,): React.ReactElement | undefined {
11
+
12
+ if (React.isValidElement(iconKey)) {
13
+ return iconKey;
14
+ }
15
+
8
16
  if (!iconKey) return undefined;
9
- iconKey = slugify(iconKey);
10
- if (!(iconKey in iconKeysMap)) {
11
- return undefined;
17
+ if (typeof iconKey === "string") {
18
+
19
+ const usedIconKey = slugify(iconKey);
20
+ if (!(usedIconKey in iconKeysMap)) {
21
+ return undefined;
22
+ }
23
+ return usedIconKey in iconKeysMap ?
24
+ <Icon iconKey={usedIconKey} size={size} className={className} color={color}/> : undefined;
12
25
  }
13
- return iconKey in iconKeysMap ? <Icon iconKey={iconKey} size={"medium"} className={className}/> : undefined;
26
+
27
+ console.warn("Invalid icon key provided:", iconKey);
28
+ return undefined;
14
29
  }
15
30
 
16
31
  export type IconViewProps = {
@@ -18,13 +33,23 @@ export type IconViewProps = {
18
33
  name: string;
19
34
  singularName?: string;
20
35
  group?: string;
21
- icon?: string;
36
+ icon?: string | React.ReactNode;
22
37
  }
23
38
 
24
39
  export const IconForView = React.memo(
25
- function IconForView({ collectionOrView, className }: { collectionOrView?: IconViewProps, className?: string }): React.ReactElement {
40
+ function IconForView({
41
+ collectionOrView,
42
+ className,
43
+ color,
44
+ size = "medium",
45
+ }: {
46
+ collectionOrView?: IconViewProps,
47
+ color?: IconColor,
48
+ className?: string,
49
+ size?: "smallest" | "small" | "medium" | "large" | number,
50
+ }): React.ReactElement {
26
51
  if (!collectionOrView) return <></>;
27
- const icon = getIcon(collectionOrView.icon, className);
52
+ const icon = getIcon(collectionOrView.icon, className, color, size);
28
53
  if (collectionOrView?.icon && icon)
29
54
  return icon;
30
55
 
@@ -45,9 +70,9 @@ export const IconForView = React.memo(
45
70
  if (!key)
46
71
  key = coolIconKeys[hashString(collectionOrView.path) % iconsCount];
47
72
 
48
- return <Icon iconKey={key} size={"medium"} className={className}/>;
73
+ return <Icon iconKey={key} size={size} className={className} color={color}/>;
49
74
  }, (prevProps, nextProps) => {
50
- return equal(prevProps.collectionOrView?.icon, nextProps.collectionOrView?.icon);
75
+ return equal(prevProps.collectionOrView?.icon, nextProps.collectionOrView?.icon) && equal(prevProps.color, nextProps.color);
51
76
  });
52
77
 
53
78
  const iconKeysMap: Record<string, string> = iconKeys.reduce((acc: Record<string, string>, key) => {
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);