@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
@@ -1,6 +1,9 @@
1
1
  import {
2
2
  ArrayProperty,
3
+ AuthController,
3
4
  CMSType,
5
+ CustomizationController,
6
+ EntityAction,
4
7
  EntityCollection,
5
8
  EntityCustomView,
6
9
  EntityValues,
@@ -26,9 +29,7 @@ import { getDefaultValuesFor, isPropertyBuilder } from "./entities";
26
29
  import { DEFAULT_ONE_OF_TYPE } from "./common";
27
30
  import { getIn } from "@firecms/formex";
28
31
  import { enumToObjectEntries } from "./enums";
29
- import { isDefaultFieldConfigId } from "../core/field_configs";
30
-
31
- // import util from "util";
32
+ import { isDefaultFieldConfigId } from "../core";
32
33
 
33
34
  export const resolveCollection = <M extends Record<string, any>, >
34
35
  ({
@@ -38,8 +39,9 @@ export const resolveCollection = <M extends Record<string, any>, >
38
39
  values,
39
40
  previousValues,
40
41
  userConfigPersistence,
41
- fields,
42
- ignoreMissingFields = false
42
+ propertyConfigs,
43
+ ignoreMissingFields = false,
44
+ authController
43
45
  }: {
44
46
  collection: EntityCollection<M> | ResolvedEntityCollection<M>;
45
47
  path: string,
@@ -47,8 +49,9 @@ export const resolveCollection = <M extends Record<string, any>, >
47
49
  values?: Partial<EntityValues<M>>,
48
50
  previousValues?: Partial<EntityValues<M>>,
49
51
  userConfigPersistence?: UserConfigurationPersistence;
50
- fields?: Record<string, PropertyConfig>;
52
+ propertyConfigs?: Record<string, PropertyConfig>;
51
53
  ignoreMissingFields?: boolean;
54
+ authController: AuthController;
52
55
  }): ResolvedEntityCollection<M> => {
53
56
 
54
57
  const collectionOverride = userConfigPersistence?.getCollectionConfig<M>(path);
@@ -67,8 +70,9 @@ export const resolveCollection = <M extends Record<string, any>, >
67
70
  previousValues: usedPreviousValues,
68
71
  path,
69
72
  entityId,
70
- fields,
71
- ignoreMissingFields
73
+ propertyConfigs: propertyConfigs,
74
+ ignoreMissingFields,
75
+ authController
72
76
  });
73
77
  if (!childResolvedProperty) return {};
74
78
  return ({
@@ -111,8 +115,9 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
111
115
  entityId?: string,
112
116
  index?: number,
113
117
  fromBuilder?: boolean;
114
- fields?: Record<string, PropertyConfig<any>>;
118
+ propertyConfigs?: Record<string, PropertyConfig<any>>;
115
119
  ignoreMissingFields?: boolean;
120
+ authController: AuthController;
116
121
  }): ResolvedProperty<T> | null {
117
122
 
118
123
  if (typeof propertyOrBuilder === "object" && "resolved" in propertyOrBuilder) {
@@ -182,7 +187,7 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
182
187
  }
183
188
 
184
189
  if (resolvedProperty.propertyConfig && !isDefaultFieldConfigId(resolvedProperty.propertyConfig)) {
185
- const cmsFields = props.fields;
190
+ const cmsFields = props.propertyConfigs;
186
191
  if (!cmsFields && !ignoreMissingFields) {
187
192
  throw Error(`Trying to resolve a property with key '${resolvedProperty.propertyConfig}' that inherits from a custom property config but no custom property configs were provided. Use the property 'propertyConfigs' in your app config to provide them`);
188
193
  }
@@ -217,6 +222,39 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
217
222
  : null;
218
223
  }
219
224
 
225
+ export function getArrayResolvedProperties<M>({
226
+ propertyKey,
227
+ propertyValue,
228
+ property,
229
+ ...props
230
+ }: {
231
+ propertyValue: any,
232
+ propertyKey?: string,
233
+ property: ArrayProperty<any> | ResolvedArrayProperty<any>,
234
+ ignoreMissingFields: boolean,
235
+ values?: Partial<M>;
236
+ previousValues?: Partial<M>;
237
+ path?: string;
238
+ entityId?: string;
239
+ index?: number;
240
+ fromBuilder?: boolean;
241
+ propertyConfigs?: Record<string, PropertyConfig>;
242
+ authController: AuthController;
243
+ }) {
244
+
245
+ const of = property.of;
246
+ return Array.isArray(propertyValue)
247
+ ? propertyValue.map((v: any, index: number) => {
248
+ return resolveProperty({
249
+ propertyKey: `${propertyKey}.${index}`,
250
+ propertyOrBuilder: of,
251
+ ...props,
252
+ index
253
+ });
254
+ }).filter(e => Boolean(e)) as ResolvedProperty[]
255
+ : [];
256
+ }
257
+
220
258
  export function resolveArrayProperty<T extends any[], M>({
221
259
  propertyKey,
222
260
  property,
@@ -231,8 +269,9 @@ export function resolveArrayProperty<T extends any[], M>({
231
269
  entityId?: string,
232
270
  index?: number,
233
271
  fromBuilder?: boolean;
234
- fields?: Record<string, PropertyConfig>;
272
+ propertyConfigs?: Record<string, PropertyConfig>;
235
273
  ignoreMissingFields?: boolean;
274
+ authController: AuthController;
236
275
  }): ResolvedArrayProperty {
237
276
  const propertyValue = propertyKey ? getIn(props.values, propertyKey) : undefined;
238
277
 
@@ -248,23 +287,19 @@ export function resolveArrayProperty<T extends any[], M>({
248
287
  propertyOrBuilder: p as Property<any>,
249
288
  ignoreMissingFields,
250
289
  ...props,
251
- index
290
+ index,
252
291
  });
253
292
  })
254
293
  } as ResolvedArrayProperty;
255
294
  } else {
256
295
  const of = property.of;
257
- const resolvedProperties: ResolvedProperty[] = Array.isArray(propertyValue)
258
- ? propertyValue.map((v: any, index: number) => {
259
- return resolveProperty({
260
- propertyKey: `${propertyKey}.${index}`,
261
- propertyOrBuilder: of,
262
- ignoreMissingFields,
263
- ...props,
264
- index
265
- });
266
- }).filter(e => Boolean(e)) as ResolvedProperty[]
267
- : [];
296
+ const resolvedProperties = getArrayResolvedProperties({
297
+ propertyValue,
298
+ propertyKey,
299
+ property,
300
+ ignoreMissingFields,
301
+ ...props
302
+ });
268
303
  const ofProperty = resolveProperty({
269
304
  propertyOrBuilder: of,
270
305
  ignoreMissingFields,
@@ -342,8 +377,9 @@ export function resolveProperties<M extends Record<string, any>>({
342
377
  entityId?: string,
343
378
  index?: number,
344
379
  fromBuilder?: boolean;
345
- fields?: Record<string, PropertyConfig>;
380
+ propertyConfigs?: Record<string, PropertyConfig>;
346
381
  ignoreMissingFields?: boolean;
382
+ authController: AuthController;
347
383
  }): ResolvedProperties<M> {
348
384
  return Object.entries<PropertyOrBuilder>(properties as Record<string, PropertyOrBuilder>)
349
385
  .map(([key, property]) => {
@@ -402,3 +438,36 @@ export function resolveEntityView(entityView: string | EntityCustomView<any>, co
402
438
  return entityView;
403
439
  }
404
440
  }
441
+
442
+ export function resolveEntityAction<M extends Record<string, any>>(
443
+ entityAction: string | EntityAction<M>,
444
+ contextEntityActions?: EntityAction<M>[]
445
+ ): EntityAction<M> | undefined {
446
+ if (typeof entityAction === "string") {
447
+ return contextEntityActions?.find((entry) => entry.key === entityAction);
448
+ } else {
449
+ return entityAction;
450
+ }
451
+ }
452
+
453
+ export function resolvedSelectedEntityView<M extends Record<string, any>>(
454
+ customViews: (string | EntityCustomView<M>)[] | undefined,
455
+ customizationController: CustomizationController,
456
+ selectedTab?: string,
457
+ canEdit?: boolean,
458
+ ) {
459
+ const resolvedEntityViews = customViews ? customViews
460
+ .map(e => resolveEntityView(e, customizationController.entityViews))
461
+ .filter((e): e is EntityCustomView<M> => Boolean(e))
462
+ // .filter((e) => canEdit || !e.includeActions)
463
+ : [];
464
+
465
+ const selectedEntityView = resolvedEntityViews.find(e => e.key === selectedTab);
466
+ const selectedSecondaryForm = customViews
467
+ && resolvedEntityViews.filter(e => e.includeActions).find(e => e.key === selectedTab);
468
+ return {
469
+ resolvedEntityViews,
470
+ selectedEntityView,
471
+ selectedSecondaryForm
472
+ };
473
+ }
@@ -1,8 +1,11 @@
1
1
  import {
2
+ ArrayProperty,
2
3
  EntityValues,
4
+ PropertyOrBuilder,
3
5
  ResolvedArrayProperty,
4
6
  ResolvedStringProperty,
5
7
  StorageConfig,
8
+ StringProperty,
6
9
  UploadedFileContext
7
10
  } from "../types";
8
11
  import { randomString } from "./strings";
@@ -13,12 +16,12 @@ interface ResolveFilenameStringParams<M extends object> {
13
16
  values: EntityValues<M>;
14
17
  entityId: string;
15
18
  path?: string;
16
- property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
19
+ property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,
17
20
  file: File;
18
21
  propertyKey: string;
19
22
  }
20
23
 
21
- export async function resolveFilenameString<M extends object>(
24
+ export async function resolveStorageFilenameString<M extends object>(
22
25
  {
23
26
  input,
24
27
  storage,
@@ -30,6 +33,7 @@ export async function resolveFilenameString<M extends object>(
30
33
  propertyKey
31
34
  }: ResolveFilenameStringParams<M>): Promise<string> {
32
35
  let result;
36
+
33
37
  if (typeof input === "function") {
34
38
  result = await input({
35
39
  path,
@@ -2,9 +2,11 @@ import Resizer from "react-image-file-resizer";
2
2
  import equal from "react-fast-compare";
3
3
 
4
4
  import {
5
+ ArrayProperty,
5
6
  EntityValues,
6
7
  ImageCompression,
7
8
  Property,
9
+ PropertyOrBuilder,
8
10
  ResolvedArrayProperty,
9
11
  ResolvedStringProperty,
10
12
  StorageConfig,
@@ -14,7 +16,9 @@ import {
14
16
  import { useCallback, useEffect, useState } from "react";
15
17
  import { PreviewSize } from "../preview";
16
18
  import { randomString } from "./strings";
17
- import { resolveFilenameString, resolveStoragePathString } from "./storage";
19
+ import { resolveStorageFilenameString, resolveStoragePathString } from "./storage";
20
+ import { resolveProperty } from "./resolutions";
21
+ import { useAuthController } from "../hooks";
18
22
 
19
23
  /**
20
24
  * Internal representation of an item in the storage
@@ -42,18 +46,19 @@ export function useStorageUploadController<M extends object>({
42
46
  disabled,
43
47
  onChange
44
48
  }:
45
- {
46
- entityId: string,
47
- entityValues: EntityValues<M>,
48
- value: string | string[] | null;
49
- path?: string,
50
- propertyKey: string,
51
- property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,
52
- storageSource: StorageSource,
53
- disabled: boolean,
54
- onChange: (value: string | string[] | null) => void
55
- }) {
56
-
49
+ {
50
+ entityId: string,
51
+ entityValues: EntityValues<M>,
52
+ value: string | string[] | null;
53
+ path?: string,
54
+ propertyKey: string,
55
+ property: StringProperty | ArrayProperty<string[]> | ResolvedStringProperty | ResolvedArrayProperty<string[]>,
56
+ storageSource: StorageSource,
57
+ disabled: boolean,
58
+ onChange: (value: string | string[] | null) => void
59
+ }) {
60
+
61
+ const authController = useAuthController();
57
62
  const storage: StorageConfig | undefined = property.dataType === "string"
58
63
  ? property.storage
59
64
  : property.dataType === "array" &&
@@ -66,22 +71,15 @@ export function useStorageUploadController<M extends object>({
66
71
  if (!storage)
67
72
  throw Error("Storage meta must be specified");
68
73
 
74
+ const processFile = storage?.processFile;
75
+
69
76
  const metadata: Record<string, any> | undefined = storage?.metadata;
70
- const size = multipleFilesSupported ? "small" : "medium";
77
+ const size = multipleFilesSupported ? "medium" : "large";
71
78
 
72
79
  const compression: ImageCompression | undefined = storage?.imageCompression;
73
80
 
74
81
  const internalInitialValue: StorageFieldItem[] =
75
- (multipleFilesSupported
76
- ? (value ?? []) as string[]
77
- : value ? [value as string] : []).map(entry => (
78
- {
79
- id: getRandomId(),
80
- storagePathOrDownloadUrl: entry,
81
- metadata,
82
- size
83
- }
84
- ));
82
+ getInternalInitialValue(multipleFilesSupported, value, metadata, size);
85
83
 
86
84
  const [initialValue, setInitialValue] = useState<string | string[] | null>(value);
87
85
  const [internalValue, setInternalValue] = useState<StorageFieldItem[]>(internalInitialValue);
@@ -93,15 +91,21 @@ export function useStorageUploadController<M extends object>({
93
91
  }
94
92
  }, [internalInitialValue, value, initialValue]);
95
93
 
94
+ const resolvedProperty = resolveProperty({
95
+ propertyOrBuilder: property as PropertyOrBuilder,
96
+ values: entityValues,
97
+ authController
98
+ }) as ResolvedStringProperty | ResolvedArrayProperty<string[]>;
99
+
96
100
  const fileNameBuilder = useCallback(async (file: File) => {
97
101
  if (storage.fileName) {
98
- const fileName = await resolveFilenameString({
102
+ const fileName = await resolveStorageFilenameString({
99
103
  input: storage.fileName,
100
104
  storage,
101
105
  values: entityValues,
102
106
  entityId,
103
107
  path,
104
- property,
108
+ property: resolvedProperty,
105
109
  file,
106
110
  propertyKey
107
111
  });
@@ -111,7 +115,7 @@ export function useStorageUploadController<M extends object>({
111
115
  return fileName;
112
116
  }
113
117
  return randomString() + "_" + file.name;
114
- }, [entityId, entityValues, path, property, propertyKey, storage]);
118
+ }, [entityId, entityValues, path, resolvedProperty, propertyKey, storage]);
115
119
 
116
120
  const storagePathBuilder = useCallback((file: File) => {
117
121
  return resolveStoragePathString({
@@ -120,11 +124,11 @@ export function useStorageUploadController<M extends object>({
120
124
  values: entityValues,
121
125
  entityId,
122
126
  path,
123
- property,
127
+ property: resolvedProperty,
124
128
  file,
125
129
  propertyKey
126
130
  }) ?? "/";
127
- }, [entityId, entityValues, path, property, propertyKey, storage]);
131
+ }, [entityId, entityValues, path, resolvedProperty, propertyKey, storage]);
128
132
 
129
133
  const onFileUploadComplete = useCallback(async (uploadedPath: string,
130
134
  entry: StorageFieldItem,
@@ -170,7 +174,22 @@ export function useStorageUploadController<M extends object>({
170
174
  if (!acceptedFiles.length || disabled)
171
175
  return;
172
176
 
177
+ if (processFile) {
178
+ try {
179
+ acceptedFiles = await Promise.all(acceptedFiles.map(async file => {
180
+ const processedFile = await processFile(file);
181
+ if (!processedFile) {
182
+ return file;
183
+ }
184
+ return processedFile;
185
+ }));
186
+ } catch (e) {
187
+ console.error("Error processing file with custom code. Attempting to continue uploading.", e);
188
+ }
189
+ }
190
+
173
191
  let newInternalValue: StorageFieldItem[];
192
+
174
193
  if (multipleFilesSupported) {
175
194
  newInternalValue = [...internalValue,
176
195
  ...(await Promise.all(acceptedFiles.map(async file => {
@@ -218,6 +237,32 @@ export function useStorageUploadController<M extends object>({
218
237
  }
219
238
  }
220
239
 
240
+ function getInternalInitialValue(multipleFilesSupported: boolean,
241
+ value: string | string[] | null,
242
+ metadata: Record<string, any> | undefined,
243
+ size: PreviewSize): StorageFieldItem[] {
244
+ let strings: string[] = [];
245
+ if (multipleFilesSupported) {
246
+ if (Array.isArray(value) && value.every((v) => typeof v === "string")) {
247
+ strings = (value ?? []) as string[];
248
+ }
249
+ } else {
250
+ if (typeof value === "string") {
251
+ strings = value ? [value as string] : [];
252
+ }
253
+ }
254
+
255
+ return strings
256
+ .map(entry => (
257
+ {
258
+ id: getRandomId(),
259
+ storagePathOrDownloadUrl: entry,
260
+ metadata,
261
+ size
262
+ }
263
+ ));
264
+ }
265
+
221
266
  function removeDuplicates(items: StorageFieldItem[]) {
222
267
  return items.filter(
223
268
  (item, i) => {
@@ -1,5 +0,0 @@
1
- interface Props {
2
- onResize: (event: Event) => void;
3
- }
4
- export declare const ElementResizeListener: React.FC<Props>;
5
- export {};
@@ -1,3 +0,0 @@
1
- export declare function PropertyIdCopyTooltipContent({ propertyId }: {
2
- propertyId: string;
3
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,8 +0,0 @@
1
- import { PropertiesOrBuilders } from "../types";
2
- import { FormexController } from "@firecms/formex";
3
- export type PropertiesFormProps<M extends Record<string, any> = Record<string, any>> = {
4
- properties: PropertiesOrBuilders<M>;
5
- propertiesOrder?: string[];
6
- formex: FormexController<M>;
7
- };
8
- export declare function PropertiesForm<M extends Record<string, any> = Record<string, any>>({ properties, propertiesOrder, formex }: PropertiesFormProps<M>): import("react/jsx-runtime").JSX.Element;
@@ -1,18 +0,0 @@
1
- import React from "react";
2
- interface ArrayContainerProps<T> {
3
- value: T[];
4
- name: string;
5
- addLabel: string;
6
- buildEntry: (index: number, internalId: number) => React.ReactNode;
7
- disabled?: boolean;
8
- small?: boolean;
9
- onInternalIdAdded?: (id: number) => void;
10
- includeAddButton?: boolean;
11
- newDefaultEntry?: T | null;
12
- setFieldValue: (field: string, value: any, shouldValidate?: boolean | undefined) => void;
13
- }
14
- /**
15
- * @group Form custom fields
16
- */
17
- export declare function FormikArrayContainer<T>({ name, addLabel, value, disabled, buildEntry, small, onInternalIdAdded, includeAddButton, newDefaultEntry, setFieldValue }: ArrayContainerProps<T>): import("react/jsx-runtime").JSX.Element;
18
- export {};
@@ -1,9 +0,0 @@
1
- import { FieldProps } from "../../types";
2
- /**
3
- * Render a markdown field that allows edition and seeing the preview.
4
- *
5
- * This is one of the internal components that get mapped natively inside forms
6
- * and tables to the specified properties.
7
- * @group Form fields
8
- */
9
- export declare function MarkdownFieldBinding({ propertyKey, value, setValue, error, showError, disabled, autoFocus, touched, property, tableMode, includeDescription, context }: FieldProps<string>): import("react/jsx-runtime").JSX.Element;
@@ -1,59 +0,0 @@
1
- import { RefObject, useCallback, useEffect, useRef } from "react";
2
-
3
- interface Props {
4
- onResize: (event: Event) => void;
5
- }
6
-
7
- export const ElementResizeListener: React.FC<Props> = ({ onResize }) => {
8
- const rafRef = useRef(0);
9
- const objectRef: RefObject<HTMLObjectElement> = useRef(null);
10
- const onResizeRef = useRef(onResize);
11
-
12
- onResizeRef.current = onResize;
13
-
14
- const _onResize = useCallback((e: Event) => {
15
- if (rafRef.current) {
16
- cancelAnimationFrame(rafRef.current);
17
- }
18
- rafRef.current = requestAnimationFrame(() => {
19
- onResizeRef.current(e);
20
- });
21
- }, []);
22
-
23
- const onLoad = useCallback(() => {
24
- const obj = objectRef.current;
25
- if (obj && obj.contentDocument && obj.contentDocument.defaultView) {
26
- obj.contentDocument.defaultView.addEventListener("resize", _onResize);
27
- }
28
- }, [_onResize]);
29
-
30
- useEffect(() => {
31
- const obj = objectRef.current;
32
- return () => {
33
- if (obj && obj.contentDocument && obj.contentDocument.defaultView) {
34
- obj.contentDocument.defaultView.removeEventListener("resize", _onResize);
35
- }
36
- };
37
- }, [_onResize]);
38
-
39
- return (
40
- <object
41
- onLoad={onLoad}
42
- ref={objectRef}
43
- tabIndex={-1}
44
- type={"text/html"}
45
- data={"about:blank"}
46
- title={""}
47
- style={{
48
- position: "absolute",
49
- top: 0,
50
- left: 0,
51
- height: "100%",
52
- width: "100%",
53
- pointerEvents: "none",
54
- zIndex: -1,
55
- opacity: 0
56
- }}
57
- />
58
- );
59
- };
@@ -1,27 +0,0 @@
1
- import { ContentCopyIcon, IconButton, Typography } from "@firecms/ui";
2
- import { useCallback, useState } from "react";
3
-
4
- export function PropertyIdCopyTooltipContent({ propertyId }: { propertyId: string }) {
5
-
6
- const [copied, setCopied] = useState(false);
7
-
8
- return (
9
- <div className={"flex flex-row gap-2 items-center justify-center text-white"}>
10
- <div>
11
- <Typography variant={"caption"} className={"min-w-20 text-slate-400"}
12
- color={"disabled"}>{copied ? "Copied" : "Property ID"}</Typography>
13
- <Typography variant={"caption"} className={"text-white"}><code>{propertyId}</code></Typography>
14
- </div>
15
- <IconButton size={"small"}>
16
- <ContentCopyIcon size={"smallest"}
17
- className={"text-white"}
18
- onClick={useCallback(() => {
19
- navigator.clipboard.writeText(propertyId);
20
- setCopied(true);
21
- setTimeout(() => setCopied(false), 2000);
22
- }, [propertyId])}
23
- />
24
- </IconButton>
25
- </div>
26
- );
27
- }