@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
@@ -1,5 +1,4 @@
1
1
  import React, { useCallback, useEffect, useLayoutEffect, useMemo, useState } from "react";
2
- import equal from "react-fast-compare"
3
2
 
4
3
  import * as Portal from "@radix-ui/react-portal";
5
4
 
@@ -18,21 +17,19 @@ import { Formex, useCreateFormex } from "@firecms/formex";
18
17
  import { useDraggable } from "./useDraggable";
19
18
  import { CustomFieldValidator, getYupEntitySchema } from "../../../../form/validation";
20
19
  import { useWindowSize } from "./useWindowSize";
21
- import { ElementResizeListener } from "./ElementResizeListener";
22
- import { ErrorView } from "../../../ErrorView";
23
20
  import { getPropertyInPath, isReadOnly, resolveCollection } from "../../../../util";
24
- import { Button, ClearIcon, DialogActions, IconButton, Typography } from "@firecms/ui";
25
- import { PropertyFieldBinding } from "../../../../form";
26
- import { useCustomizationController, useFireCMSContext } from "../../../../hooks";
21
+ import { Button, CloseIcon, DialogActions, IconButton, Typography } from "@firecms/ui";
22
+ import { PropertyFieldBinding, yupToFormErrors } from "../../../../form";
23
+ import { useAuthController, useCustomizationController, useDataSource, useFireCMSContext } from "../../../../hooks";
27
24
  import { OnCellValueChangeParams } from "../../../common";
28
25
 
29
26
  interface PopupFormFieldProps<M extends Record<string, any>> {
30
- entity?: Entity<M>;
31
27
  customFieldValidator?: CustomFieldValidator;
32
28
  path: string;
29
+ entityId: string;
33
30
  tableKey: string;
34
31
  propertyKey?: Extract<keyof M, string>;
35
- collection?: EntityCollection<M>;
32
+ collection?: EntityCollection<any>;
36
33
  cellRect?: DOMRect;
37
34
  open: boolean;
38
35
  onClose: () => void;
@@ -46,13 +43,54 @@ interface PopupFormFieldProps<M extends Record<string, any>> {
46
43
 
47
44
  export function PopupFormField<M extends Record<string, any>>(props: PopupFormFieldProps<M>) {
48
45
  if (!props.open) return null;
49
- return <PopupFormFieldInternal {...props} />;
46
+ return <PopupFormFieldLoading {...props} />;
50
47
 
51
48
  }
52
49
 
50
+ export function PopupFormFieldLoading<M extends Record<string, any>>({
51
+ tableKey,
52
+ entityId,
53
+ customFieldValidator,
54
+ propertyKey,
55
+ collection: inputCollection,
56
+ path,
57
+ cellRect,
58
+ open,
59
+ onClose,
60
+ onCellValueChange,
61
+ container
62
+ }: PopupFormFieldProps<M>) {
63
+ const dataSource = useDataSource();
64
+ const [entity, setEntity] = useState<Entity<M> | undefined>(undefined);
65
+ useEffect(() => {
66
+ if (entityId && inputCollection) {
67
+ dataSource.fetchEntity({
68
+ path,
69
+ entityId,
70
+ collection: inputCollection
71
+ }).then(setEntity);
72
+ }
73
+ }, [entityId, inputCollection, dataSource, path]);
74
+
75
+ if (!entity) return null;
76
+ return <PopupFormFieldInternal {...{
77
+ tableKey,
78
+ entityId,
79
+ customFieldValidator,
80
+ propertyKey,
81
+ collection: inputCollection,
82
+ path,
83
+ cellRect,
84
+ open,
85
+ onClose,
86
+ onCellValueChange,
87
+ container
88
+ }} entity={entity}/>;
89
+ }
90
+
53
91
  export function PopupFormFieldInternal<M extends Record<string, any>>({
54
92
  tableKey,
55
- entity: entityProp,
93
+ entityId,
56
94
  customFieldValidator,
57
95
  propertyKey,
58
96
  collection: inputCollection,
@@ -61,11 +99,14 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
61
99
  open,
62
100
  onClose,
63
101
  onCellValueChange,
64
- container
65
- }: PopupFormFieldProps<M>) {
102
+ container,
103
+ entity
104
+ }: PopupFormFieldProps<M> & {
105
+ entity?: Entity<M>
106
+ }) {
66
107
 
67
- // const dataSource = useDataSource();
68
108
  const fireCMSContext = useFireCMSContext();
109
+ const authController = useAuthController();
69
110
  const customizationController = useCustomizationController();
70
111
 
71
112
  const [savingError, setSavingError] = React.useState<any>();
@@ -74,34 +115,14 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
74
115
  y: number
75
116
  }>();
76
117
 
77
- const entityId = entityProp?.id;
78
- const [entity, setEntity] = useState<Entity<M> | undefined>(entityProp);
79
- // useEffect(() => {
80
- // if (entityId && inputCollection) {
81
- // return dataSource.listenEntity?.({
82
- // path,
83
- // entityId,
84
- // collection: inputCollection,
85
- // onUpdate: (e) => {
86
- // setEntity(e);
87
- // setInternalValue(e?.values);
88
- // }
89
- // });
90
- // } else {
91
- // return () => {
92
- // };
93
- // }
94
- // }, [dataSource, entityId, inputCollection, path, open]);
95
-
96
- const [internalValue, setInternalValue] = useState<EntityValues<M> | undefined>(entity?.values);
97
-
98
118
  const collection: ResolvedEntityCollection<M> | undefined = inputCollection
99
119
  ? resolveCollection<M>({
100
120
  collection: inputCollection,
101
121
  path,
102
- values: internalValue,
122
+ values: entity?.values,
103
123
  entityId,
104
- fields: customizationController.propertyConfigs
124
+ propertyConfigs: customizationController.propertyConfigs,
125
+ authController
105
126
  })
106
127
  : undefined;
107
128
 
@@ -125,33 +146,35 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
125
146
  };
126
147
  }, [cellRect, windowSize.height, windowSize.width]);
127
148
 
128
- const normalizePosition = useCallback(({
129
- x,
130
- y
131
- }: { x: number, y: number }) => {
132
-
133
- const draggableBoundingRect = draggableRef.current?.getBoundingClientRect();
134
- if (!draggableBoundingRect)
135
- throw Error("normalizePosition called before draggableBoundingRect is set");
136
-
149
+ const normalizePosition = useCallback((
150
+ pos: { x: number, y: number },
151
+ draggableBoundingRect: DOMRect,
152
+ currentWindowSize: { width: number, height: number }
153
+ ) => {
154
+ if (!draggableBoundingRect || draggableBoundingRect.width === 0 || draggableBoundingRect.height === 0) {
155
+ return pos;
156
+ }
137
157
  return {
138
- x: Math.max(0, Math.min(x, windowSize.width - draggableBoundingRect.width)),
139
- y: Math.max(0, Math.min(y, windowSize.height - draggableBoundingRect.height))
158
+ x: Math.max(0, Math.min(pos.x, currentWindowSize.width - draggableBoundingRect.width)),
159
+ y: Math.max(0, Math.min(pos.y, currentWindowSize.height - draggableBoundingRect.height))
140
160
  };
141
- }, [windowSize]);
161
+ }, []);
142
162
 
143
- const updatePopupLocation = useCallback((position?: {
163
+ const updatePopupLocation = useCallback((newPositionCandidate?: {
144
164
  x: number,
145
165
  y: number
146
166
  }) => {
147
-
148
167
  const draggableBoundingRect = draggableRef.current?.getBoundingClientRect();
149
- if (!cellRect || !draggableBoundingRect) return;
150
- // const newPosition = normalizePosition(position ?? getInitialLocation());
151
- const newPosition = position ?? normalizePosition(getInitialLocation());
152
- if (!popupLocation || newPosition.x !== popupLocation.x || newPosition.y !== popupLocation.y)
153
- setPopupLocation(newPosition);
154
- }, [cellRect, getInitialLocation, normalizePosition, popupLocation]);
168
+ if (!cellRect || !draggableBoundingRect || draggableBoundingRect.width === 0 || draggableBoundingRect.height === 0) {
169
+ return;
170
+ }
171
+ const basePosition = newPositionCandidate ?? getInitialLocation();
172
+ const newNormalizedPosition = normalizePosition(basePosition, draggableBoundingRect, windowSize);
173
+
174
+ if (!popupLocation || newNormalizedPosition.x !== popupLocation.x || newNormalizedPosition.y !== popupLocation.y) {
175
+ setPopupLocation(newNormalizedPosition);
176
+ }
177
+ }, [cellRect, getInitialLocation, normalizePosition, popupLocation, windowSize]);
155
178
 
156
179
  useDraggable({
157
180
  containerRef: draggableRef,
@@ -170,19 +193,25 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
170
193
 
171
194
  useLayoutEffect(
172
195
  () => {
196
+ if (!cellRect || initialPositionSet.current) return;
197
+ // Ensure draggableRef is available and has dimensions before initial positioning
173
198
  const draggableBoundingRect = draggableRef.current?.getBoundingClientRect();
174
- if (!cellRect || !draggableBoundingRect || initialPositionSet.current) return;
199
+ if (!draggableBoundingRect || draggableBoundingRect.width === 0 || draggableBoundingRect.height === 0) {
200
+ // If not ready, perhaps wait or log. For now, just return.
201
+ // This might need a retry mechanism or ensure content is rendered first.
202
+ return;
203
+ }
175
204
  updatePopupLocation();
176
205
  initialPositionSet.current = true;
177
206
  },
178
- [cellRect, updatePopupLocation, initialPositionSet.current]
207
+ [cellRect, updatePopupLocation] // Removed initialPositionSet.current from deps as it's a ref
179
208
  );
180
209
 
181
210
  useLayoutEffect(
182
211
  () => {
183
212
  updatePopupLocation(popupLocation);
184
213
  },
185
- [windowSize, cellRect]
214
+ [windowSize, cellRect, updatePopupLocation, popupLocation]
186
215
  );
187
216
 
188
217
  const validationSchema = useMemo(() => {
@@ -196,9 +225,28 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
196
225
  }, [collection, entityId, propertyKey, customFieldValidator]);
197
226
 
198
227
  const adaptResize = useCallback(() => {
228
+ // When the popup resizes, we want to re-evaluate its position
229
+ // based on its current location and new dimensions.
199
230
  return updatePopupLocation(popupLocation);
200
231
  }, [popupLocation, updatePopupLocation]);
201
232
 
233
+ // Setup ResizeObserver
234
+ useEffect(() => {
235
+ const element = draggableRef.current;
236
+ if (!element) return;
237
+
238
+ const observer = new ResizeObserver(() => {
239
+ adaptResize();
240
+ });
241
+
242
+ observer.observe(element);
243
+
244
+ return () => {
245
+ observer.unobserve(element);
246
+ observer.disconnect();
247
+ };
248
+ }, [adaptResize, draggableRef]);
249
+
202
250
  const saveValue = async (values: M) => {
203
251
  setSavingError(null);
204
252
  if (inputCollection && entity && onCellValueChange && propertyKey) {
@@ -214,47 +262,32 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
214
262
  return Promise.resolve();
215
263
  };
216
264
 
217
- if (!entity)
218
- return <></>;
219
-
220
- // enableReinitialize={true}
221
- // eslint-disable-next-line react-hooks/rules-of-hooks
222
265
  const formex = useCreateFormex<M>({
223
266
  initialValues: (entity?.values ?? {}) as EntityValues<M>,
224
267
  validation: (values) => {
225
268
  return validationSchema?.validate(values, { abortEarly: false })
226
269
  .then(() => ({}))
227
- .catch((e) => {
228
- const errors: Record<string, string> = {};
229
- e.inner.forEach((error: any) => {
230
- errors[error.path] = error.message;
231
- });
232
- return errors;
233
- });
270
+ .catch(yupToFormErrors);
234
271
  },
235
272
  validateOnInitialRender: true,
236
273
  onSubmit: (values, actions) => {
237
274
  saveValue(values)
238
- .then(() => onClose())
275
+ .then(() => {
276
+ formex.resetForm({
277
+ values: values
278
+ })
279
+ onClose();
280
+ })
239
281
  .finally(() => actions.setSubmitting(false));
240
282
  }
241
283
  });
242
284
 
243
- const { values, isSubmitting, setFieldValue, handleSubmit } = formex;
244
-
245
- // eslint-disable-next-line react-hooks/rules-of-hooks
246
- useEffect(() => {
247
- if (!equal(values, internalValue)) {
248
- setInternalValue(values);
249
- }
250
- }, [values]);
251
-
252
- if (!entity)
253
- return <ErrorView
254
- error={"PopupFormField misconfiguration"}/>;
255
-
256
- if (!collection)
257
- return <></>;
285
+ const {
286
+ values,
287
+ isSubmitting,
288
+ setFieldValue,
289
+ handleSubmit
290
+ } = formex;
258
291
 
259
292
  const disabled = isSubmitting;
260
293
 
@@ -265,10 +298,13 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
265
298
  path,
266
299
  setFieldValue,
267
300
  save: saveValue,
268
- formex
301
+ formex,
302
+ status: "existing",
303
+ openEntityMode: "side_panel",
304
+ disabled: false,
269
305
  };
270
306
 
271
- const property: ResolvedProperty<any> | undefined = propertyKey && getPropertyInPath(collection.properties, propertyKey as string);
307
+ const property: ResolvedProperty<any> | undefined = propertyKey && getPropertyInPath(collection?.properties ?? {} as ResolvedProperties, propertyKey as string);
272
308
  const fieldProps: PropertyFieldBindingProps<any, M> | undefined = propertyKey && property
273
309
  ? {
274
310
  propertyKey: propertyKey as string,
@@ -277,9 +313,8 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
277
313
  includeDescription: false,
278
314
  underlyingValueHasChanged: false,
279
315
  context: formContext,
280
- tableMode: true,
281
316
  partOfArray: false,
282
- partOfBlock: false,
317
+ minimalistView: true,
283
318
  autoFocus: open
284
319
  }
285
320
  : undefined;
@@ -287,7 +322,7 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
287
322
  let internalForm = <>
288
323
  <div
289
324
  key={`popup_form_${tableKey}_${entityId}_${propertyKey}`}
290
- className="w-[560px] max-w-full max-h-[85vh]">
325
+ className="w-[700px] max-w-full max-h-[85vh]">
291
326
  <form
292
327
  onSubmit={handleSubmit}
293
328
  noValidate>
@@ -322,10 +357,6 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
322
357
 
323
358
  const plugins = customizationController.plugins;
324
359
  if (plugins) {
325
- // const formController: FormContext<M> = {
326
- // values,
327
- // setFieldValue
328
- // }
329
360
  plugins.forEach((plugin: FireCMSPlugin) => {
330
361
  if (plugin.form?.provider) {
331
362
  internalForm = (
@@ -345,7 +376,7 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
345
376
  });
346
377
  }
347
378
  const form = <div
348
- className={`text-gray-900 dark:text-white overflow-auto rounded rounded-md bg-white dark:bg-gray-950 ${!open ? "hidden" : ""} cursor-grab max-w-[100vw]`}>
379
+ className={`text-surface-900 dark:text-white overflow-auto rounded rounded-md bg-white dark:bg-surface-950 ${!open ? "hidden" : ""} cursor-grab max-w-[100vw]`}>
349
380
 
350
381
  {internalForm}
351
382
 
@@ -362,12 +393,12 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
362
393
  style={{
363
394
  boxShadow: "0 0 0 2px rgba(128,128,128,0.2)",
364
395
  }}
365
- className={`inline-block fixed z-20 shadow-outline rounded-md bg-white dark:bg-gray-950 ${
396
+ className={`inline-block fixed z-20 shadow-outline rounded-md bg-white dark:bg-surface-950 ${
366
397
  !open ? "invisible" : "visible"
367
398
  } cursor-grab overflow-visible`}
368
399
  ref={draggableRef}>
369
400
 
370
- <ElementResizeListener onResize={adaptResize}/>
401
+ {/* ElementResizeListener removed from here */}
371
402
 
372
403
  <div
373
404
  className="overflow-hidden">
@@ -375,7 +406,7 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
375
406
  {form}
376
407
 
377
408
  <div
378
- className="absolute -top-3.5 -right-3.5 bg-gray-500 rounded-full"
409
+ className="absolute -top-3.5 -right-3.5 bg-surface-500 rounded-full"
379
410
  style={{
380
411
  width: "32px",
381
412
  height: "32px"
@@ -386,7 +417,7 @@ export function PopupFormFieldInternal<M extends Record<string, any>>({
386
417
  event.stopPropagation();
387
418
  onClose();
388
419
  }}>
389
- <ClearIcon className="text-white"
420
+ <CloseIcon className="text-white"
390
421
  size={"small"}/>
391
422
  </IconButton>
392
423
  </div>
@@ -1,9 +1,8 @@
1
- import React, { useEffect } from "react";
1
+ import React, { useCallback, useEffect } from "react";
2
2
 
3
3
  interface DraggableProps {
4
4
  containerRef: React.RefObject<HTMLDivElement>,
5
5
  innerRef: React.RefObject<HTMLDivElement>,
6
- // ref: React.RefObject<HTMLDivElement>,
7
6
  x?: number;
8
7
  y?: number;
9
8
  onMove: (params: { x: number, y: number }) => void,
@@ -22,7 +21,7 @@ export function useDraggable({
22
21
 
23
22
  const listeningRef = React.useRef(false);
24
23
 
25
- const onMouseDown = (event: any) => {
24
+ const onMouseDown = useCallback((event: any) => {
26
25
  if (event.button !== 0 || !containerRef.current || event.defaultPrevented || event.innerClicked) {
27
26
  return;
28
27
  }
@@ -39,16 +38,17 @@ export function useDraggable({
39
38
  document.addEventListener("selectstart", onSelect);
40
39
  listeningRef.current = true;
41
40
  // event.stopPropagation();
42
- };
43
- const onMouseDownInner = (event: any) => {
41
+ }, [containerRef, onMove]);
42
+
43
+ const onMouseDownInner = useCallback((event: any) => {
44
44
  // @ts-ignore
45
45
  event.innerClicked = true;
46
- };
46
+ }, [])
47
47
 
48
- const onSelect = (event: any) => {
48
+ const onSelect = useCallback((event: any) => {
49
49
  event.preventDefault()
50
50
  event.stopPropagation();
51
- };
51
+ }, [])
52
52
 
53
53
  const onMouseUp = (event: any) => {
54
54
  document.removeEventListener("mousemove", onMouseMove);
@@ -92,6 +92,6 @@ export function useDraggable({
92
92
  if (innerCurrent)
93
93
  innerCurrent.removeEventListener("mousedown", onMouseDownInner);
94
94
  };
95
- });
95
+ }, [containerRef, innerRef, onMouseDownInner, onMouseDown]);
96
96
 
97
97
  }