@firecms/core 3.0.0-canary.21 → 3.0.0-canary.211

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 (382) hide show
  1. package/README.md +3 -3
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +16 -0
  4. package/dist/app/Scaffold.d.ts +34 -0
  5. package/dist/app/index.d.ts +4 -0
  6. package/dist/app/useApp.d.ts +16 -0
  7. package/dist/components/ArrayContainer.d.ts +23 -6
  8. package/dist/components/CircularProgressCenter.d.ts +1 -1
  9. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  10. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +13 -13
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  15. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  16. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
  17. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  18. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  19. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  20. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
  21. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +16 -2
  22. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  23. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  24. package/dist/components/EntityJsonPreview.d.ts +3 -0
  25. package/dist/components/EntityPreview.d.ts +5 -4
  26. package/dist/components/ErrorView.d.ts +1 -1
  27. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  28. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  29. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  30. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  31. package/dist/components/ReferenceWidget.d.ts +3 -1
  32. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  33. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  34. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  35. package/dist/components/VirtualTable/VirtualTableProps.d.ts +28 -12
  36. package/dist/components/VirtualTable/types.d.ts +3 -3
  37. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  38. package/dist/components/common/index.d.ts +2 -1
  39. package/dist/components/common/table_height.d.ts +5 -0
  40. package/dist/components/common/types.d.ts +4 -6
  41. package/dist/components/common/useColumnsIds.d.ts +3 -1
  42. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  43. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  44. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  45. package/dist/components/index.d.ts +4 -2
  46. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  47. package/dist/core/DefaultAppBar.d.ts +29 -0
  48. package/dist/core/DefaultDrawer.d.ts +19 -0
  49. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  50. package/dist/core/EntityEditView.d.ts +35 -11
  51. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  52. package/dist/core/FireCMS.d.ts +3 -3
  53. package/dist/core/FireCMSRouter.d.ts +4 -0
  54. package/dist/core/NavigationRoutes.d.ts +2 -3
  55. package/dist/core/SideDialogs.d.ts +4 -2
  56. package/dist/core/index.d.ts +4 -4
  57. package/dist/form/EntityForm.d.ts +37 -69
  58. package/dist/form/EntityFormActions.d.ts +17 -0
  59. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  60. package/dist/form/components/ErrorFocus.d.ts +1 -1
  61. package/dist/form/components/FieldHelperText.d.ts +3 -3
  62. package/dist/form/components/FormEntry.d.ts +6 -0
  63. package/dist/form/components/FormLayout.d.ts +5 -0
  64. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  65. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  66. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  67. package/dist/form/components/index.d.ts +3 -1
  68. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  70. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  71. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  73. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  74. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  75. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  76. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  77. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  80. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  81. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  82. package/dist/form/index.d.ts +16 -18
  83. package/dist/form/useClearRestoreValue.d.ts +2 -2
  84. package/dist/hooks/data/delete.d.ts +4 -4
  85. package/dist/hooks/data/save.d.ts +4 -5
  86. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  87. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  88. package/dist/hooks/index.d.ts +1 -0
  89. package/dist/hooks/useAuthController.d.ts +1 -1
  90. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  91. package/dist/hooks/useBuildNavigationController.d.ts +7 -5
  92. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  93. package/dist/hooks/useModeController.d.ts +1 -2
  94. package/dist/hooks/useProjectLog.d.ts +8 -2
  95. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  96. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  97. package/dist/index.d.ts +1 -0
  98. package/dist/index.es.js +21921 -14330
  99. package/dist/index.es.js.map +1 -1
  100. package/dist/index.umd.js +24271 -588
  101. package/dist/index.umd.js.map +1 -1
  102. package/dist/internal/useBuildDataSource.d.ts +1 -16
  103. package/dist/internal/useBuildSideEntityController.d.ts +2 -2
  104. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  105. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  106. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  107. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  108. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  109. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  110. package/dist/preview/util.d.ts +3 -3
  111. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  112. package/dist/routes/FireCMSRoute.d.ts +1 -0
  113. package/dist/routes/HomePageRoute.d.ts +3 -0
  114. package/dist/types/auth.d.ts +8 -10
  115. package/dist/types/collections.d.ts +77 -22
  116. package/dist/types/datasource.d.ts +52 -36
  117. package/dist/types/dialogs_controller.d.ts +7 -3
  118. package/dist/types/entities.d.ts +7 -2
  119. package/dist/types/entity_actions.d.ts +28 -4
  120. package/dist/types/entity_callbacks.d.ts +16 -16
  121. package/dist/types/entity_overrides.d.ts +2 -2
  122. package/dist/types/export_import.d.ts +4 -4
  123. package/dist/types/fields.d.ts +71 -42
  124. package/dist/types/firecms.d.ts +6 -2
  125. package/dist/types/firecms_context.d.ts +1 -1
  126. package/dist/types/index.d.ts +0 -1
  127. package/dist/types/navigation.d.ts +32 -14
  128. package/dist/types/permissions.d.ts +4 -4
  129. package/dist/types/plugins.d.ts +23 -12
  130. package/dist/types/properties.d.ts +52 -24
  131. package/dist/types/property_config.d.ts +0 -2
  132. package/dist/types/side_dialogs_controller.d.ts +10 -0
  133. package/dist/types/side_entity_controller.d.ts +6 -1
  134. package/dist/types/storage.d.ts +86 -3
  135. package/dist/types/user.d.ts +1 -0
  136. package/dist/util/builders.d.ts +3 -3
  137. package/dist/util/entities.d.ts +3 -3
  138. package/dist/util/entity_actions.d.ts +2 -0
  139. package/dist/util/entity_cache.d.ts +23 -0
  140. package/dist/util/icon_list.d.ts +5 -1
  141. package/dist/util/icon_synonyms.d.ts +1 -98
  142. package/dist/util/icons.d.ts +6 -3
  143. package/dist/util/index.d.ts +2 -0
  144. package/dist/util/navigation_from_path.d.ts +6 -1
  145. package/dist/util/navigation_utils.d.ts +14 -3
  146. package/dist/util/objects.d.ts +2 -1
  147. package/dist/util/permissions.d.ts +4 -4
  148. package/dist/util/plurals.d.ts +0 -2
  149. package/dist/util/property_utils.d.ts +3 -3
  150. package/dist/util/resolutions.d.ts +36 -17
  151. package/dist/util/storage.d.ts +23 -2
  152. package/dist/util/useStorageUploadController.d.ts +3 -3
  153. package/package.json +62 -48
  154. package/src/app/AppBar.tsx +18 -0
  155. package/src/app/Drawer.tsx +24 -0
  156. package/src/app/Scaffold.tsx +253 -0
  157. package/src/app/index.ts +4 -0
  158. package/src/app/useApp.tsx +32 -0
  159. package/src/components/ArrayContainer.tsx +127 -41
  160. package/src/components/CircularProgressCenter.tsx +2 -2
  161. package/src/components/ClearFilterSortButton.tsx +41 -0
  162. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  163. package/src/components/DeleteEntityDialog.tsx +10 -19
  164. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +54 -37
  165. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  166. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  167. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
  168. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  169. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  170. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  171. package/src/components/EntityCollectionTable/index.tsx +1 -1
  172. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
  173. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  174. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  175. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +81 -80
  176. package/src/components/EntityCollectionView/EntityCollectionView.tsx +207 -113
  177. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  178. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  179. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  180. package/src/components/EntityCollectionView/utils.ts +19 -0
  181. package/src/components/EntityJsonPreview.tsx +66 -0
  182. package/src/components/EntityPreview.tsx +62 -52
  183. package/src/components/EntityView.tsx +10 -10
  184. package/src/components/ErrorView.tsx +4 -4
  185. package/src/components/HomePage/DefaultHomePage.tsx +26 -19
  186. package/src/components/HomePage/FavouritesView.tsx +6 -11
  187. package/src/components/HomePage/NavigationCard.tsx +3 -3
  188. package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
  189. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  190. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  191. package/src/components/NotFoundPage.tsx +2 -2
  192. package/src/components/PropertyConfigBadge.tsx +9 -3
  193. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  194. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +19 -13
  195. package/src/components/ReferenceWidget.tsx +21 -11
  196. package/src/components/SearchIconsView.tsx +10 -7
  197. package/src/components/SelectableTable/SelectableTable.tsx +27 -12
  198. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  199. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  200. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  201. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  202. package/src/components/UnsavedChangesDialog.tsx +42 -0
  203. package/src/components/VirtualTable/VirtualTable.tsx +96 -48
  204. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  205. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  206. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  207. package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
  208. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  209. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  210. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  211. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  212. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  213. package/src/components/VirtualTable/types.tsx +2 -3
  214. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +33 -40
  215. package/src/components/common/index.ts +2 -1
  216. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  217. package/src/components/common/types.tsx +4 -6
  218. package/src/components/common/useColumnsIds.tsx +24 -3
  219. package/src/components/common/useDataSourceTableController.tsx +420 -0
  220. package/src/components/common/useDebouncedCallback.tsx +20 -0
  221. package/src/components/common/useScrollRestoration.tsx +68 -0
  222. package/src/components/common/useTableSearchHelper.ts +53 -12
  223. package/src/components/index.tsx +4 -2
  224. package/src/contexts/BreacrumbsContext.tsx +38 -0
  225. package/src/contexts/DialogsProvider.tsx +5 -4
  226. package/src/contexts/ModeController.tsx +1 -3
  227. package/src/contexts/SnackbarProvider.tsx +2 -0
  228. package/src/core/DefaultAppBar.tsx +219 -0
  229. package/src/core/DefaultDrawer.tsx +185 -0
  230. package/src/core/DrawerNavigationItem.tsx +66 -0
  231. package/src/core/EntityEditView.tsx +345 -480
  232. package/src/core/EntityEditViewFormActions.tsx +199 -0
  233. package/src/core/EntitySidePanel.tsx +86 -17
  234. package/src/core/FireCMS.tsx +56 -49
  235. package/src/core/FireCMSRouter.tsx +17 -0
  236. package/src/core/NavigationRoutes.tsx +28 -38
  237. package/src/core/SideDialogs.tsx +22 -12
  238. package/src/core/field_configs.tsx +11 -12
  239. package/src/core/index.tsx +6 -5
  240. package/src/form/EntityForm.tsx +585 -539
  241. package/src/form/EntityFormActions.tsx +169 -0
  242. package/src/form/PropertyFieldBinding.tsx +85 -44
  243. package/src/form/components/CustomIdField.tsx +6 -2
  244. package/src/form/components/FieldHelperText.tsx +4 -4
  245. package/src/form/components/FormEntry.tsx +22 -0
  246. package/src/form/components/FormLayout.tsx +16 -0
  247. package/src/form/components/LabelWithIcon.tsx +30 -19
  248. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  249. package/src/form/components/StorageItemPreview.tsx +22 -12
  250. package/src/form/components/StorageUploadProgress.tsx +4 -5
  251. package/src/form/components/index.tsx +3 -1
  252. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +31 -19
  253. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
  254. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  255. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  256. package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
  257. package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
  258. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
  259. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  260. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  261. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  262. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -35
  263. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
  264. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +42 -50
  265. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  266. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  267. package/src/form/index.tsx +16 -37
  268. package/src/form/useClearRestoreValue.tsx +2 -2
  269. package/src/form/validation.ts +13 -23
  270. package/src/hooks/data/delete.ts +6 -5
  271. package/src/hooks/data/save.ts +13 -9
  272. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  273. package/src/hooks/data/useDataSource.tsx +11 -3
  274. package/src/hooks/data/useEntityFetch.tsx +10 -6
  275. package/src/hooks/index.tsx +1 -0
  276. package/src/hooks/useAuthController.tsx +1 -1
  277. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  278. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  279. package/src/hooks/useBuildModeController.tsx +22 -29
  280. package/src/hooks/useBuildNavigationController.tsx +159 -54
  281. package/src/hooks/useFireCMSContext.tsx +5 -5
  282. package/src/hooks/useLargeLayout.tsx +0 -35
  283. package/src/hooks/useModeController.tsx +1 -2
  284. package/src/hooks/useProjectLog.tsx +32 -10
  285. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  286. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  287. package/src/index.ts +1 -0
  288. package/src/internal/useBuildDataSource.ts +72 -82
  289. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  290. package/src/internal/useBuildSideEntityController.tsx +194 -73
  291. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  292. package/src/preview/PropertyPreview.tsx +17 -24
  293. package/src/preview/PropertyPreviewProps.tsx +7 -1
  294. package/src/preview/components/BooleanPreview.tsx +2 -2
  295. package/src/preview/components/EmptyValue.tsx +1 -1
  296. package/src/preview/components/EnumValuesChip.tsx +2 -2
  297. package/src/preview/components/ImagePreview.tsx +25 -36
  298. package/src/preview/components/ReferencePreview.tsx +22 -33
  299. package/src/preview/components/StorageThumbnail.tsx +5 -1
  300. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  301. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  302. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  303. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  304. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  305. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  306. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  307. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  308. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  309. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  310. package/src/preview/util.ts +10 -10
  311. package/src/routes/CustomCMSRoute.tsx +21 -0
  312. package/src/routes/FireCMSRoute.tsx +235 -0
  313. package/src/routes/HomePageRoute.tsx +17 -0
  314. package/src/types/auth.tsx +9 -13
  315. package/src/types/collections.ts +94 -27
  316. package/src/types/customization_controller.tsx +0 -1
  317. package/src/types/datasource.ts +61 -43
  318. package/src/types/dialogs_controller.tsx +7 -3
  319. package/src/types/entities.ts +12 -2
  320. package/src/types/entity_actions.tsx +32 -7
  321. package/src/types/entity_callbacks.ts +18 -18
  322. package/src/types/entity_overrides.tsx +2 -2
  323. package/src/types/export_import.ts +4 -4
  324. package/src/types/fields.tsx +81 -46
  325. package/src/types/firecms.tsx +7 -2
  326. package/src/types/firecms_context.tsx +1 -1
  327. package/src/types/index.ts +0 -1
  328. package/src/types/navigation.ts +38 -18
  329. package/src/types/permissions.ts +5 -5
  330. package/src/types/plugins.tsx +25 -14
  331. package/src/types/properties.ts +60 -25
  332. package/src/types/property_config.tsx +0 -2
  333. package/src/types/side_dialogs_controller.tsx +15 -0
  334. package/src/types/side_entity_controller.tsx +6 -1
  335. package/src/types/storage.ts +94 -3
  336. package/src/types/user.ts +2 -0
  337. package/src/util/builders.ts +10 -8
  338. package/src/util/entities.ts +9 -6
  339. package/src/util/entity_actions.ts +28 -0
  340. package/src/util/entity_cache.ts +204 -0
  341. package/src/util/enums.ts +1 -1
  342. package/src/util/icon_list.ts +16 -10
  343. package/src/util/icon_synonyms.ts +3 -100
  344. package/src/util/icons.tsx +17 -7
  345. package/src/util/index.ts +2 -0
  346. package/src/util/join_collections.ts +3 -0
  347. package/src/util/make_properties_editable.ts +13 -5
  348. package/src/util/navigation_from_path.ts +13 -6
  349. package/src/util/navigation_utils.ts +59 -7
  350. package/src/util/objects.ts +48 -28
  351. package/src/util/parent_references_from_path.ts +3 -3
  352. package/src/util/permissions.ts +9 -8
  353. package/src/util/plurals.ts +0 -2
  354. package/src/util/property_utils.tsx +11 -4
  355. package/src/util/references.ts +11 -2
  356. package/src/util/resolutions.ts +100 -46
  357. package/src/util/storage.ts +79 -21
  358. package/src/util/strings.ts +2 -2
  359. package/src/util/useStorageUploadController.tsx +71 -27
  360. package/dist/components/FireCMSAppBar.d.ts +0 -26
  361. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  362. package/dist/components/VirtualTable/common.d.ts +0 -2
  363. package/dist/core/Drawer.d.ts +0 -23
  364. package/dist/core/Scaffold.d.ts +0 -55
  365. package/dist/core/SideEntityView.d.ts +0 -7
  366. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  367. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  368. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  369. package/dist/internal/useLocaleConfig.d.ts +0 -1
  370. package/dist/types/appcheck.d.ts +0 -26
  371. package/src/components/FireCMSAppBar.tsx +0 -165
  372. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  373. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  374. package/src/core/Drawer.tsx +0 -191
  375. package/src/core/Scaffold.tsx +0 -281
  376. package/src/core/SideEntityView.tsx +0 -38
  377. package/src/form/components/FormikArrayContainer.tsx +0 -44
  378. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  379. package/src/internal/useBuildCustomizationController.tsx +0 -5
  380. package/src/internal/useLocaleConfig.tsx +0 -18
  381. package/src/types/appcheck.ts +0 -29
  382. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  ArrayProperty,
3
3
  CMSType,
4
+ CustomizationController,
4
5
  EntityCollection,
5
6
  EntityCustomView,
6
7
  EntityValues,
@@ -26,7 +27,7 @@ import { getDefaultValuesFor, isPropertyBuilder } from "./entities";
26
27
  import { DEFAULT_ONE_OF_TYPE } from "./common";
27
28
  import { getIn } from "@firecms/formex";
28
29
  import { enumToObjectEntries } from "./enums";
29
- import { isDefaultFieldConfigId } from "../core";
30
+ import { isDefaultFieldConfigId } from "../core/field_configs";
30
31
 
31
32
  // import util from "util";
32
33
 
@@ -38,7 +39,8 @@ export const resolveCollection = <M extends Record<string, any>, >
38
39
  values,
39
40
  previousValues,
40
41
  userConfigPersistence,
41
- fields
42
+ propertyConfigs,
43
+ ignoreMissingFields = false
42
44
  }: {
43
45
  collection: EntityCollection<M> | ResolvedEntityCollection<M>;
44
46
  path: string,
@@ -46,7 +48,8 @@ export const resolveCollection = <M extends Record<string, any>, >
46
48
  values?: Partial<EntityValues<M>>,
47
49
  previousValues?: Partial<EntityValues<M>>,
48
50
  userConfigPersistence?: UserConfigurationPersistence;
49
- fields?: Record<string, PropertyConfig>;
51
+ propertyConfigs?: Record<string, PropertyConfig>;
52
+ ignoreMissingFields?: boolean;
50
53
  }): ResolvedEntityCollection<M> => {
51
54
 
52
55
  const collectionOverride = userConfigPersistence?.getCollectionConfig<M>(path);
@@ -58,16 +61,15 @@ export const resolveCollection = <M extends Record<string, any>, >
58
61
 
59
62
  const resolvedProperties = Object.entries(collection.properties)
60
63
  .map(([key, propertyOrBuilder]) => {
61
- const propertyValue = usedValues ? getIn(usedValues, key) : undefined;
62
64
  const childResolvedProperty = resolveProperty({
63
65
  propertyKey: key,
64
66
  propertyOrBuilder: propertyOrBuilder as PropertyOrBuilder | ResolvedProperty,
65
67
  values: usedValues,
66
68
  previousValues: usedPreviousValues,
67
69
  path,
68
- propertyValue,
69
70
  entityId,
70
- fields
71
+ propertyConfigs: propertyConfigs,
72
+ ignoreMissingFields
71
73
  });
72
74
  if (!childResolvedProperty) return {};
73
75
  return ({
@@ -95,24 +97,23 @@ export const resolveCollection = <M extends Record<string, any>, >
95
97
  * Resolve property builders, enums and arrays.
96
98
  * @param propertyOrBuilder
97
99
  * @param propertyValue
98
- * @param values
99
100
  */
100
101
  export function resolveProperty<T extends CMSType = CMSType, M extends Record<string, any> = any>({
101
102
  propertyOrBuilder,
102
- propertyValue,
103
103
  fromBuilder = false,
104
+ ignoreMissingFields = false,
104
105
  ...props
105
106
  }: {
106
107
  propertyKey?: string,
107
108
  propertyOrBuilder: PropertyOrBuilder<T, M> | ResolvedProperty<T>,
108
- propertyValue?: unknown,
109
109
  values?: Partial<M>,
110
110
  previousValues?: Partial<M>,
111
111
  path?: string,
112
112
  entityId?: string,
113
113
  index?: number,
114
114
  fromBuilder?: boolean;
115
- fields?: Record<string, PropertyConfig<any>>;
115
+ propertyConfigs?: Record<string, PropertyConfig<any>>;
116
+ ignoreMissingFields?: boolean;
116
117
  }): ResolvedProperty<T> | null {
117
118
 
118
119
  if (typeof propertyOrBuilder === "object" && "resolved" in propertyOrBuilder) {
@@ -128,10 +129,11 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
128
129
  if (!path)
129
130
  throw Error("Trying to resolve a property builder without specifying the entity path");
130
131
 
132
+ const usedPropertyValue = props.propertyKey ? getIn(props.values, props.propertyKey) : undefined;
131
133
  const result: Property<T> | null = propertyOrBuilder({
132
134
  ...props,
133
135
  path,
134
- propertyValue,
136
+ propertyValue: usedPropertyValue,
135
137
  values: props.values ?? {},
136
138
  previousValues: props.previousValues ?? props.values ?? {}
137
139
  });
@@ -142,17 +144,17 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
142
144
 
143
145
  resolvedProperty = resolveProperty({
144
146
  ...props,
145
- propertyValue,
146
147
  propertyOrBuilder: result,
147
- fromBuilder: true
148
+ fromBuilder: true,
149
+ ignoreMissingFields
148
150
  });
149
151
  } else {
150
152
  const property = propertyOrBuilder as Property<T>;
151
153
  if (property.dataType === "map" && property.properties) {
152
154
  const properties = resolveProperties({
155
+ ignoreMissingFields,
153
156
  ...props,
154
157
  properties: property.properties,
155
- propertyValue
156
158
  });
157
159
  resolvedProperty = {
158
160
  ...property,
@@ -163,8 +165,8 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
163
165
  } else if (property.dataType === "array") {
164
166
  resolvedProperty = resolveArrayProperty({
165
167
  property,
166
- propertyValue,
167
168
  fromBuilder,
169
+ ignoreMissingFields,
168
170
  ...props
169
171
  }) as ResolvedProperty<any>;
170
172
  } else if ((property.dataType === "string" || property.dataType === "number") && property.enumValues) {
@@ -181,13 +183,13 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
181
183
  }
182
184
 
183
185
  if (resolvedProperty.propertyConfig && !isDefaultFieldConfigId(resolvedProperty.propertyConfig)) {
184
- const cmsFields = props.fields;
185
- if (!cmsFields) {
186
- 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`);
186
+ const cmsFields = props.propertyConfigs;
187
+ if (!cmsFields && !ignoreMissingFields) {
188
+ 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`);
187
189
  }
188
- const customField: PropertyConfig<any> = cmsFields[resolvedProperty.propertyConfig];
190
+ const customField: PropertyConfig | undefined = cmsFields?.[resolvedProperty.propertyConfig];
189
191
  if (!customField) {
190
- console.warn(`Trying to resolve a property with key ${resolvedProperty.propertyConfig} that inherits from a custom property config but no custom property config with that key was found. Check the \`propertyConfigs\` in your app config`)
192
+ console.warn(`Trying to resolve a property with key '${resolvedProperty.propertyConfig}' that inherits from a custom property config but no custom property config with that key was found. Check the 'propertyConfigs' in your app config`)
191
193
  console.warn("Available property configs", cmsFields);
192
194
  return null;
193
195
  }
@@ -198,7 +200,7 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
198
200
  }
199
201
  const customFieldProperty = resolveProperty<any>({
200
202
  propertyOrBuilder: configPropertyOrBuilder,
201
- propertyValue,
203
+ ignoreMissingFields,
202
204
  ...props
203
205
  });
204
206
  if (customFieldProperty) {
@@ -216,23 +218,56 @@ export function resolveProperty<T extends CMSType = CMSType, M extends Record<st
216
218
  : null;
217
219
  }
218
220
 
221
+ export function getArrayResolvedProperties<M>({
222
+ propertyKey,
223
+ propertyValue,
224
+ property,
225
+ ...props
226
+ }: {
227
+ propertyValue: any,
228
+ propertyKey?: string,
229
+ property: ArrayProperty<any> | ResolvedArrayProperty<any>,
230
+ ignoreMissingFields: boolean,
231
+ values?: Partial<M>;
232
+ previousValues?: Partial<M>;
233
+ path?: string;
234
+ entityId?: string;
235
+ index?: number;
236
+ fromBuilder?: boolean;
237
+ propertyConfigs?: Record<string, PropertyConfig>
238
+ }) {
239
+
240
+ const of = property.of;
241
+ return Array.isArray(propertyValue)
242
+ ? propertyValue.map((v: any, index: number) => {
243
+ return resolveProperty({
244
+ propertyKey: `${propertyKey}.${index}`,
245
+ propertyOrBuilder: of,
246
+ ...props,
247
+ index
248
+ });
249
+ }).filter(e => Boolean(e)) as ResolvedProperty[]
250
+ : [];
251
+ }
252
+
219
253
  export function resolveArrayProperty<T extends any[], M>({
220
254
  propertyKey,
221
255
  property,
222
- propertyValue,
256
+ ignoreMissingFields = false,
223
257
  ...props
224
258
  }: {
225
259
  propertyKey?: string,
226
260
  property: ArrayProperty<T> | ResolvedArrayProperty<T>,
227
- propertyValue: any,
228
261
  values?: Partial<M>,
229
262
  previousValues?: Partial<M>,
230
263
  path?: string,
231
264
  entityId?: string,
232
265
  index?: number,
233
266
  fromBuilder?: boolean;
234
- fields?: Record<string, PropertyConfig>;
267
+ propertyConfigs?: Record<string, PropertyConfig>;
268
+ ignoreMissingFields?: boolean;
235
269
  }): ResolvedArrayProperty {
270
+ const propertyValue = propertyKey ? getIn(props.values, propertyKey) : undefined;
236
271
 
237
272
  if (property.of) {
238
273
  if (Array.isArray(property.of)) {
@@ -244,7 +279,7 @@ export function resolveArrayProperty<T extends any[], M>({
244
279
  return resolveProperty({
245
280
  propertyKey: `${propertyKey}.${index}`,
246
281
  propertyOrBuilder: p as Property<any>,
247
- propertyValue: Array.isArray(propertyValue) ? propertyValue[index] : undefined,
282
+ ignoreMissingFields,
248
283
  ...props,
249
284
  index
250
285
  });
@@ -252,22 +287,19 @@ export function resolveArrayProperty<T extends any[], M>({
252
287
  } as ResolvedArrayProperty;
253
288
  } else {
254
289
  const of = property.of;
255
- const resolvedProperties: ResolvedProperty[] = Array.isArray(propertyValue)
256
- ? propertyValue.map((v: any, index: number) => resolveProperty({
257
- propertyKey: `${propertyKey}.${index}`,
258
- propertyOrBuilder: of,
259
- propertyValue: v,
260
- ...props,
261
- index
262
- })).filter(e => Boolean(e)) as ResolvedProperty[]
263
- : [];
290
+ const resolvedProperties = getArrayResolvedProperties({
291
+ propertyValue,
292
+ propertyKey,
293
+ property,
294
+ ignoreMissingFields,
295
+ ...props
296
+ });
264
297
  const ofProperty = resolveProperty({
265
- propertyKey: `${propertyKey}`,
266
298
  propertyOrBuilder: of,
267
- propertyValue: undefined,
299
+ ignoreMissingFields,
268
300
  ...props
269
301
  });
270
- if (!ofProperty)
302
+ if (!ofProperty && !ignoreMissingFields)
271
303
  throw Error("When using a property builder as the 'of' prop of an ArrayProperty, you must return a valid child property")
272
304
  return {
273
305
  ...property,
@@ -287,14 +319,15 @@ export function resolveArrayProperty<T extends any[], M>({
287
319
  return resolveProperty({
288
320
  propertyKey: `${propertyKey}.${index}`,
289
321
  propertyOrBuilder: childProperty,
290
- propertyValue,
322
+ ignoreMissingFields,
291
323
  ...props
292
324
  });
293
325
  }).filter(e => Boolean(e)) as ResolvedProperty[]
294
326
  : [];
295
327
  const properties = resolveProperties<any>({
328
+ propertyKey,
296
329
  properties: property.oneOf.properties,
297
- propertyValue: undefined,
330
+ ignoreMissingFields,
298
331
  ...props
299
332
  });
300
333
  return {
@@ -325,27 +358,28 @@ export function resolveArrayProperty<T extends any[], M>({
325
358
  * @param value
326
359
  */
327
360
  export function resolveProperties<M extends Record<string, any>>({
361
+ propertyKey,
328
362
  properties,
329
- propertyValue,
363
+ ignoreMissingFields,
330
364
  ...props
331
365
  }: {
366
+ propertyKey?: string,
332
367
  properties: PropertiesOrBuilders<M>,
333
- propertyValue: unknown,
334
368
  values?: Partial<M>,
335
369
  previousValues?: Partial<M>,
336
370
  path?: string,
337
371
  entityId?: string,
338
372
  index?: number,
339
373
  fromBuilder?: boolean;
340
- fields?: Record<string, PropertyConfig>;
374
+ propertyConfigs?: Record<string, PropertyConfig>;
375
+ ignoreMissingFields?: boolean;
341
376
  }): ResolvedProperties<M> {
342
377
  return Object.entries<PropertyOrBuilder>(properties as Record<string, PropertyOrBuilder>)
343
378
  .map(([key, property]) => {
344
- const thisPropertyValue = propertyValue && typeof propertyValue === "object" ? getValueInPath(propertyValue, key) : undefined;
345
379
  const childResolvedProperty = resolveProperty({
346
- propertyKey: key,
380
+ propertyKey: propertyKey ? `${propertyKey}.${key}` : undefined,
347
381
  propertyOrBuilder: property,
348
- propertyValue: thisPropertyValue,
382
+ ignoreMissingFields,
349
383
  ...props
350
384
  });
351
385
  if (!childResolvedProperty) return {};
@@ -367,7 +401,7 @@ export function resolvePropertyEnum(property: StringProperty | NumberProperty, f
367
401
  return {
368
402
  ...property,
369
403
  resolved: true,
370
- enumValues: enumToObjectEntries(property.enumValues)?.filter((value) => value && value.id && value.label) ?? [],
404
+ enumValues: enumToObjectEntries(property.enumValues)?.filter((value) => value && (value.id || value.id === 0) && value.label) ?? [],
371
405
  fromBuilder: fromBuilder ?? false
372
406
  }
373
407
  }
@@ -397,3 +431,23 @@ export function resolveEntityView(entityView: string | EntityCustomView<any>, co
397
431
  return entityView;
398
432
  }
399
433
  }
434
+
435
+ export function resolvedSelectedEntityView<M extends Record<string, any>>(
436
+ customViews: (string | EntityCustomView<M>)[] | undefined,
437
+ customizationController: CustomizationController,
438
+ selectedTab?: string
439
+ ) {
440
+ const resolvedEntityViews = customViews ? customViews
441
+ .map(e => resolveEntityView(e, customizationController.entityViews))
442
+ .filter(Boolean) as EntityCustomView[]
443
+ : [];
444
+
445
+ const selectedEntityView = resolvedEntityViews.find(e => e.key === selectedTab);
446
+ const selectedSecondaryForm = customViews
447
+ && resolvedEntityViews.filter(e => e.includeActions).find(e => e.key === selectedTab);
448
+ return {
449
+ resolvedEntityViews,
450
+ selectedEntityView,
451
+ selectedSecondaryForm
452
+ };
453
+ }
@@ -1,22 +1,39 @@
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";
9
12
 
10
- export async function resolveFilenameString<M extends object>(
11
- input: string | ((context: UploadedFileContext) => Promise<string> | string),
12
- storage: StorageConfig,
13
- values: EntityValues<M>,
14
- entityId: string,
15
- path: string,
13
+ interface ResolveFilenameStringParams<M extends object> {
14
+ input: string | ((context: UploadedFileContext) => (Promise<string> | string));
15
+ storage: StorageConfig;
16
+ values: EntityValues<M>;
17
+ entityId: string;
18
+ path?: string;
16
19
  property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,
17
- file: File,
18
- propertyKey: string): Promise<string> {
20
+ file: File;
21
+ propertyKey: string;
22
+ }
23
+
24
+ export async function resolveStorageFilenameString<M extends object>(
25
+ {
26
+ input,
27
+ storage,
28
+ values,
29
+ entityId,
30
+ path,
31
+ property,
32
+ file,
33
+ propertyKey
34
+ }: ResolveFilenameStringParams<M>): Promise<string> {
19
35
  let result;
36
+
20
37
  if (typeof input === "function") {
21
38
  result = await input({
22
39
  path,
@@ -30,7 +47,13 @@ export async function resolveFilenameString<M extends object>(
30
47
  if (!result)
31
48
  console.warn("Storage callback returned empty result. Using default name value")
32
49
  } else {
33
- result = replacePlaceholders(file, input, entityId, propertyKey, path);
50
+ result = replacePlaceholders({
51
+ file,
52
+ input,
53
+ entityId,
54
+ propertyKey,
55
+ path
56
+ });
34
57
  }
35
58
 
36
59
  if (!result)
@@ -39,15 +62,28 @@ export async function resolveFilenameString<M extends object>(
39
62
  return result;
40
63
  }
41
64
 
65
+ interface ResolveStoragePathStringParams<M extends object> {
66
+ input: string | ((context: UploadedFileContext) => string);
67
+ storage: StorageConfig;
68
+ values: EntityValues<M>;
69
+ entityId: string;
70
+ path?: string;
71
+ property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
72
+ file: File;
73
+ propertyKey: string;
74
+ }
75
+
42
76
  export function resolveStoragePathString<M extends object>(
43
- input: string | ((context: UploadedFileContext) => string),
44
- storage: StorageConfig,
45
- values: EntityValues<M>,
46
- entityId: string,
47
- path: string,
48
- property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,
49
- file: File,
50
- propertyKey: string): string {
77
+ {
78
+ input,
79
+ storage,
80
+ values,
81
+ entityId,
82
+ path,
83
+ property,
84
+ file,
85
+ propertyKey
86
+ }: ResolveStoragePathStringParams<M>): string {
51
87
  let result;
52
88
  if (typeof input === "function") {
53
89
  result = input({
@@ -62,7 +98,13 @@ export function resolveStoragePathString<M extends object>(
62
98
  if (!result)
63
99
  console.warn("Storage callback returned empty result. Using default name value")
64
100
  } else {
65
- result = replacePlaceholders(file, input, entityId, propertyKey, path);
101
+ result = replacePlaceholders({
102
+ file,
103
+ input,
104
+ entityId,
105
+ propertyKey,
106
+ path
107
+ });
66
108
  }
67
109
 
68
110
  if (!result)
@@ -71,14 +113,30 @@ export function resolveStoragePathString<M extends object>(
71
113
  return result;
72
114
  }
73
115
 
74
- function replacePlaceholders(file: File, input: string, entityId: string, propertyKey: string, path: string) {
116
+ interface Placeholders {
117
+ file: File;
118
+ input: string;
119
+ entityId: string;
120
+ propertyKey: string;
121
+ path?: string;
122
+ }
123
+
124
+ function replacePlaceholders({
125
+ file,
126
+ input,
127
+ entityId,
128
+ propertyKey,
129
+ path
130
+ }: Placeholders) {
75
131
  const ext = file.name.split(".").pop();
76
132
  let result = input.replace("{entityId}", entityId)
77
133
  .replace("{propertyKey}", propertyKey)
78
134
  .replace("{rand}", randomString())
79
135
  .replace("{file}", file.name)
80
- .replace("{file.type}", file.type)
81
- .replace("{path}", path);
136
+ .replace("{file.type}", file.type);
137
+ if (path) {
138
+ result = result.replace("{path}", path);
139
+ }
82
140
  if (ext) {
83
141
  result = result.replace("{file.ext}", ext);
84
142
  const name = file.name.replace(`.${ext}`, "");
@@ -56,8 +56,8 @@ export function unslugify(slug?: string): string {
56
56
  const result = slug.replace(/[-_]/g, " ");
57
57
  return result.replace(/\w\S*/g, function (txt) {
58
58
  return txt.charAt(0).toUpperCase() + txt.substr(1);
59
- });
59
+ }).trim();
60
60
  } else {
61
- return slug;
61
+ return slug.trim();
62
62
  }
63
63
  }
@@ -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,8 @@ 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";
18
21
 
19
22
  /**
20
23
  * Internal representation of an item in the storage
@@ -31,6 +34,7 @@ export interface StorageFieldItem {
31
34
  size: PreviewSize
32
35
  }
33
36
 
37
+
34
38
  export function useStorageUploadController<M extends object>({
35
39
  entityId,
36
40
  entityValues,
@@ -42,17 +46,17 @@ 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
- }) {
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
+ }) {
56
60
 
57
61
  const storage: StorageConfig | undefined = property.dataType === "string"
58
62
  ? property.storage
@@ -67,21 +71,12 @@ export function useStorageUploadController<M extends object>({
67
71
  throw Error("Storage meta must be specified");
68
72
 
69
73
  const metadata: Record<string, any> | undefined = storage?.metadata;
70
- const size = multipleFilesSupported ? "small" : "medium";
74
+ const size = multipleFilesSupported ? "medium" : "large";
71
75
 
72
76
  const compression: ImageCompression | undefined = storage?.imageCompression;
73
77
 
74
78
  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
- ));
79
+ getInternalInitialValue(multipleFilesSupported, value, metadata, size);
85
80
 
86
81
  const [initialValue, setInitialValue] = useState<string | string[] | null>(value);
87
82
  const [internalValue, setInternalValue] = useState<StorageFieldItem[]>(internalInitialValue);
@@ -93,20 +88,43 @@ export function useStorageUploadController<M extends object>({
93
88
  }
94
89
  }, [internalInitialValue, value, initialValue]);
95
90
 
91
+ const resolvedProperty = resolveProperty({
92
+ propertyOrBuilder: property as PropertyOrBuilder,
93
+ values: entityValues
94
+ }) as ResolvedStringProperty | ResolvedArrayProperty<string[]>;
95
+
96
96
  const fileNameBuilder = useCallback(async (file: File) => {
97
97
  if (storage.fileName) {
98
- const fileName = await resolveFilenameString(storage.fileName, storage, entityValues, entityId, path, property, file, propertyKey);
98
+ const fileName = await resolveStorageFilenameString({
99
+ input: storage.fileName,
100
+ storage,
101
+ values: entityValues,
102
+ entityId,
103
+ path,
104
+ property: resolvedProperty,
105
+ file,
106
+ propertyKey
107
+ });
99
108
  if (!fileName || fileName.length === 0) {
100
109
  throw Error("You need to return a valid filename");
101
110
  }
102
111
  return fileName;
103
112
  }
104
113
  return randomString() + "_" + file.name;
105
- }, [entityId, entityValues, path, property, propertyKey, storage]);
114
+ }, [entityId, entityValues, path, resolvedProperty, propertyKey, storage]);
106
115
 
107
116
  const storagePathBuilder = useCallback((file: File) => {
108
- return resolveStoragePathString(storage.storagePath, storage, entityValues, entityId, path, property, file, propertyKey) ?? "/";
109
- }, [entityId, entityValues, path, property, propertyKey, storage]);
117
+ return resolveStoragePathString({
118
+ input: storage.storagePath,
119
+ storage,
120
+ values: entityValues,
121
+ entityId,
122
+ path,
123
+ property: resolvedProperty,
124
+ file,
125
+ propertyKey
126
+ }) ?? "/";
127
+ }, [entityId, entityValues, path, resolvedProperty, propertyKey, storage]);
110
128
 
111
129
  const onFileUploadComplete = useCallback(async (uploadedPath: string,
112
130
  entry: StorageFieldItem,
@@ -200,6 +218,32 @@ export function useStorageUploadController<M extends object>({
200
218
  }
201
219
  }
202
220
 
221
+ function getInternalInitialValue(multipleFilesSupported: boolean,
222
+ value: string | string[] | null,
223
+ metadata: Record<string, any> | undefined,
224
+ size: PreviewSize): StorageFieldItem[] {
225
+ let strings: string[] = [];
226
+ if (multipleFilesSupported) {
227
+ if (Array.isArray(value) && value.every((v) => typeof v === "string")) {
228
+ strings = (value ?? []) as string[];
229
+ }
230
+ } else {
231
+ if (typeof value === "string") {
232
+ strings = value ? [value as string] : [];
233
+ }
234
+ }
235
+
236
+ return strings
237
+ .map(entry => (
238
+ {
239
+ id: getRandomId(),
240
+ storagePathOrDownloadUrl: entry,
241
+ metadata,
242
+ size
243
+ }
244
+ ));
245
+ }
246
+
203
247
  function removeDuplicates(items: StorageFieldItem[]) {
204
248
  return items.filter(
205
249
  (item, i) => {