@firecms/core 3.0.0-canary.29 → 3.0.0-canary.292

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