@firecms/core 3.0.0-canary.20 → 3.0.0-canary.200

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