@firecms/core 3.0.0-canary.2 → 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 (409) hide show
  1. package/README.md +4 -4
  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 +3 -3
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +3 -2
  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 +17 -4
  22. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  23. package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
  24. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  25. package/dist/components/EntityPreview.d.ts +26 -7
  26. package/dist/components/EntityView.d.ts +11 -0
  27. package/dist/components/ErrorView.d.ts +1 -1
  28. package/dist/components/FieldCaption.d.ts +5 -0
  29. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  30. package/dist/components/HomePage/NavigationCard.d.ts +8 -0
  31. package/dist/components/HomePage/{NavigationCollectionCard.d.ts → NavigationCardBinding.d.ts} +3 -3
  32. package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
  33. package/dist/components/HomePage/index.d.ts +3 -1
  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 +6 -4
  37. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  38. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  39. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  40. package/dist/components/VirtualTable/VirtualTableProps.d.ts +29 -13
  41. package/dist/components/VirtualTable/types.d.ts +3 -3
  42. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  43. package/dist/components/common/index.d.ts +2 -1
  44. package/dist/components/common/table_height.d.ts +5 -0
  45. package/dist/components/common/types.d.ts +4 -6
  46. package/dist/components/common/useColumnsIds.d.ts +3 -1
  47. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  48. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  49. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  50. package/dist/components/index.d.ts +8 -5
  51. package/dist/contexts/AuthControllerContext.d.ts +1 -1
  52. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  53. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  54. package/dist/core/DefaultDrawer.d.ts +19 -0
  55. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  56. package/dist/core/EntityEditView.d.ts +44 -0
  57. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  58. package/dist/core/FireCMS.d.ts +2 -2
  59. package/dist/core/FireCMSRouter.d.ts +4 -0
  60. package/dist/core/NavigationRoutes.d.ts +2 -3
  61. package/dist/core/SideDialogs.d.ts +4 -2
  62. package/dist/core/index.d.ts +4 -6
  63. package/dist/form/EntityForm.d.ts +45 -69
  64. package/dist/form/EntityFormActions.d.ts +17 -0
  65. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  66. package/dist/form/components/ErrorFocus.d.ts +1 -1
  67. package/dist/form/components/FieldHelperText.d.ts +3 -3
  68. package/dist/form/components/FormEntry.d.ts +6 -0
  69. package/dist/form/components/FormLayout.d.ts +5 -0
  70. package/dist/{components → form/components}/LabelWithIcon.d.ts +1 -1
  71. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  72. package/dist/form/components/StorageItemPreview.d.ts +4 -3
  73. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  74. package/dist/form/components/index.d.ts +4 -1
  75. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  76. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  77. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  80. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  81. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  82. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  83. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  84. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  85. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  86. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -4
  87. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  88. package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -2
  89. package/dist/form/index.d.ts +17 -18
  90. package/dist/form/useClearRestoreValue.d.ts +2 -2
  91. package/dist/form/validation.d.ts +1 -1
  92. package/dist/hooks/data/delete.d.ts +4 -4
  93. package/dist/hooks/data/save.d.ts +4 -5
  94. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  95. package/dist/hooks/data/useDataSource.d.ts +2 -2
  96. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  97. package/dist/hooks/index.d.ts +4 -1
  98. package/dist/hooks/useAuthController.d.ts +1 -1
  99. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  100. package/dist/{core → hooks}/useBuildModeController.d.ts +1 -1
  101. package/dist/hooks/useBuildNavigationController.d.ts +11 -6
  102. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  103. package/dist/hooks/useModeController.d.ts +1 -2
  104. package/dist/hooks/useProjectLog.d.ts +12 -2
  105. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  106. package/dist/hooks/useStorageSource.d.ts +2 -2
  107. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  108. package/dist/index.d.ts +1 -0
  109. package/dist/index.es.js +22131 -14039
  110. package/dist/index.es.js.map +1 -1
  111. package/dist/index.umd.js +24420 -588
  112. package/dist/index.umd.js.map +1 -1
  113. package/dist/internal/useBuildDataSource.d.ts +1 -12
  114. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  115. package/dist/preview/PropertyPreview.d.ts +1 -1
  116. package/dist/preview/PropertyPreviewProps.d.ts +7 -5
  117. package/dist/preview/components/BooleanPreview.d.ts +5 -1
  118. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  119. package/dist/preview/components/ReferencePreview.d.ts +4 -9
  120. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  121. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  122. package/dist/preview/util.d.ts +3 -3
  123. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  124. package/dist/routes/FireCMSRoute.d.ts +1 -0
  125. package/dist/routes/HomePageRoute.d.ts +3 -0
  126. package/dist/types/analytics.d.ts +1 -1
  127. package/dist/types/auth.d.ts +37 -3
  128. package/dist/types/collections.d.ts +86 -24
  129. package/dist/types/datasource.d.ts +53 -37
  130. package/dist/types/dialogs_controller.d.ts +7 -3
  131. package/dist/types/entities.d.ts +8 -2
  132. package/dist/types/entity_actions.d.ts +28 -4
  133. package/dist/types/entity_callbacks.d.ts +16 -16
  134. package/dist/types/entity_overrides.d.ts +6 -0
  135. package/dist/types/export_import.d.ts +4 -4
  136. package/dist/types/fields.d.ts +71 -42
  137. package/dist/types/firecms.d.ts +6 -2
  138. package/dist/types/firecms_context.d.ts +1 -1
  139. package/dist/types/index.d.ts +2 -1
  140. package/dist/types/navigation.d.ts +45 -26
  141. package/dist/types/permissions.d.ts +8 -4
  142. package/dist/types/plugins.d.ts +40 -31
  143. package/dist/types/properties.d.ts +54 -26
  144. package/dist/types/property_config.d.ts +2 -4
  145. package/dist/types/roles.d.ts +31 -0
  146. package/dist/types/side_dialogs_controller.d.ts +10 -0
  147. package/dist/types/side_entity_controller.d.ts +6 -1
  148. package/dist/types/storage.d.ts +86 -3
  149. package/dist/types/user.d.ts +6 -0
  150. package/dist/util/builders.d.ts +3 -3
  151. package/dist/util/collections.d.ts +9 -1
  152. package/dist/util/entities.d.ts +3 -3
  153. package/dist/util/entity_actions.d.ts +2 -0
  154. package/dist/util/entity_cache.d.ts +23 -0
  155. package/dist/util/icon_list.d.ts +5 -1
  156. package/dist/util/icon_synonyms.d.ts +1 -98
  157. package/dist/util/icons.d.ts +13 -4
  158. package/dist/util/index.d.ts +2 -0
  159. package/dist/util/navigation_from_path.d.ts +6 -1
  160. package/dist/util/navigation_utils.d.ts +14 -3
  161. package/dist/util/objects.d.ts +2 -1
  162. package/dist/util/permissions.d.ts +4 -4
  163. package/dist/util/plurals.d.ts +0 -2
  164. package/dist/util/property_utils.d.ts +3 -3
  165. package/dist/util/references.d.ts +4 -2
  166. package/dist/util/resolutions.d.ts +31 -17
  167. package/dist/util/storage.d.ts +23 -2
  168. package/dist/util/useStorageUploadController.d.ts +3 -3
  169. package/dist/util/useTraceUpdate.d.ts +1 -0
  170. package/package.json +64 -51
  171. package/src/app/AppBar.tsx +18 -0
  172. package/src/app/Drawer.tsx +24 -0
  173. package/src/app/Scaffold.tsx +243 -0
  174. package/src/app/index.ts +4 -0
  175. package/src/app/useApp.tsx +32 -0
  176. package/src/components/ArrayContainer.tsx +126 -40
  177. package/src/components/CircularProgressCenter.tsx +2 -2
  178. package/src/components/ClearFilterSortButton.tsx +41 -0
  179. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  180. package/src/components/DeleteEntityDialog.tsx +14 -23
  181. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +56 -39
  182. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +283 -280
  183. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +29 -8
  184. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +58 -50
  185. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  186. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +40 -33
  187. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +22 -20
  188. package/src/components/EntityCollectionTable/index.tsx +1 -1
  189. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
  190. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  191. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  192. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +81 -80
  193. package/src/components/EntityCollectionView/EntityCollectionView.tsx +228 -155
  194. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +9 -8
  195. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  196. package/src/components/EntityCollectionView/useSelectionController.tsx +43 -0
  197. package/src/components/EntityCollectionView/utils.ts +19 -0
  198. package/src/components/EntityPreview.tsx +218 -71
  199. package/src/components/EntityView.tsx +84 -0
  200. package/src/components/ErrorView.tsx +4 -4
  201. package/src/components/FieldCaption.tsx +14 -0
  202. package/src/components/HomePage/DefaultHomePage.tsx +39 -28
  203. package/src/components/HomePage/FavouritesView.tsx +6 -11
  204. package/src/components/HomePage/NavigationCard.tsx +69 -0
  205. package/src/components/HomePage/NavigationCardBinding.tsx +111 -0
  206. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  207. package/src/components/HomePage/SmallNavigationCard.tsx +44 -0
  208. package/src/components/HomePage/index.tsx +3 -1
  209. package/src/components/NotFoundPage.tsx +2 -2
  210. package/src/components/PropertyConfigBadge.tsx +9 -3
  211. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  212. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +22 -17
  213. package/src/components/ReferenceWidget.tsx +26 -16
  214. package/src/components/SearchIconsView.tsx +10 -7
  215. package/src/components/SelectableTable/SelectableTable.tsx +27 -12
  216. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  217. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  218. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +46 -30
  219. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  220. package/src/components/UnsavedChangesDialog.tsx +42 -0
  221. package/src/components/VirtualTable/VirtualTable.tsx +96 -48
  222. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  223. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  224. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  225. package/src/components/VirtualTable/VirtualTableProps.tsx +34 -15
  226. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  227. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  228. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  229. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  230. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  231. package/src/components/VirtualTable/types.tsx +2 -3
  232. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +40 -43
  233. package/src/components/common/index.ts +2 -1
  234. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  235. package/src/components/common/types.tsx +4 -6
  236. package/src/components/common/useColumnsIds.tsx +24 -3
  237. package/src/components/common/useDataSourceTableController.tsx +420 -0
  238. package/src/components/common/useDebouncedCallback.tsx +20 -0
  239. package/src/components/common/useScrollRestoration.tsx +68 -0
  240. package/src/components/common/useTableSearchHelper.ts +53 -12
  241. package/src/components/index.tsx +8 -5
  242. package/src/contexts/AuthControllerContext.tsx +1 -1
  243. package/src/contexts/BreacrumbsContext.tsx +38 -0
  244. package/src/contexts/DialogsProvider.tsx +5 -4
  245. package/src/contexts/ModeController.tsx +1 -3
  246. package/src/contexts/SnackbarProvider.tsx +2 -0
  247. package/src/core/DefaultAppBar.tsx +207 -0
  248. package/src/core/DefaultDrawer.tsx +185 -0
  249. package/src/core/DrawerNavigationItem.tsx +66 -0
  250. package/src/core/EntityEditView.tsx +455 -0
  251. package/src/core/EntityEditViewFormActions.tsx +199 -0
  252. package/src/core/EntitySidePanel.tsx +87 -18
  253. package/src/core/FireCMS.tsx +67 -44
  254. package/src/core/FireCMSRouter.tsx +17 -0
  255. package/src/core/NavigationRoutes.tsx +36 -38
  256. package/src/core/SideDialogs.tsx +22 -12
  257. package/src/core/field_configs.tsx +11 -12
  258. package/src/core/index.tsx +6 -7
  259. package/src/form/EntityForm.tsx +565 -519
  260. package/src/form/EntityFormActions.tsx +169 -0
  261. package/src/form/PropertyFieldBinding.tsx +85 -44
  262. package/src/form/components/CustomIdField.tsx +6 -2
  263. package/src/form/components/FieldHelperText.tsx +4 -4
  264. package/src/form/components/FormEntry.tsx +22 -0
  265. package/src/form/components/FormLayout.tsx +16 -0
  266. package/src/form/components/LabelWithIcon.tsx +44 -0
  267. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  268. package/src/form/components/StorageItemPreview.tsx +23 -11
  269. package/src/form/components/StorageUploadProgress.tsx +9 -9
  270. package/src/form/components/index.tsx +4 -1
  271. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +32 -21
  272. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +54 -45
  273. package/src/form/field_bindings/BlockFieldBinding.tsx +57 -36
  274. package/src/form/field_bindings/DateTimeFieldBinding.tsx +21 -17
  275. package/src/form/field_bindings/KeyValueFieldBinding.tsx +76 -67
  276. package/src/form/field_bindings/MapFieldBinding.tsx +82 -65
  277. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
  278. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -22
  279. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +12 -17
  280. package/src/form/field_bindings/ReferenceFieldBinding.tsx +47 -34
  281. package/src/form/field_bindings/RepeatFieldBinding.tsx +57 -36
  282. package/src/form/field_bindings/SelectFieldBinding.tsx +24 -17
  283. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +47 -46
  284. package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -27
  285. package/src/form/field_bindings/TextFieldBinding.tsx +35 -30
  286. package/src/form/index.tsx +17 -37
  287. package/src/form/useClearRestoreValue.tsx +2 -2
  288. package/src/form/validation.ts +15 -26
  289. package/src/hooks/data/delete.ts +7 -6
  290. package/src/hooks/data/save.ts +13 -9
  291. package/src/hooks/data/useCollectionFetch.tsx +4 -4
  292. package/src/hooks/data/useDataSource.tsx +15 -2
  293. package/src/hooks/data/useEntityFetch.tsx +11 -7
  294. package/src/hooks/index.tsx +6 -1
  295. package/src/hooks/useAuthController.tsx +1 -1
  296. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  297. package/src/{core → hooks}/useBuildLocalConfigurationPersistence.tsx +8 -10
  298. package/src/{core → hooks}/useBuildModeController.tsx +23 -30
  299. package/src/hooks/useBuildNavigationController.tsx +278 -117
  300. package/src/hooks/useFireCMSContext.tsx +5 -5
  301. package/src/hooks/useLargeLayout.tsx +0 -35
  302. package/src/hooks/useModeController.tsx +1 -2
  303. package/src/hooks/useProjectLog.tsx +41 -9
  304. package/src/hooks/useReferenceDialog.tsx +2 -2
  305. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  306. package/src/hooks/useStorageSource.tsx +7 -2
  307. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  308. package/src/index.ts +1 -0
  309. package/src/internal/useBuildDataSource.ts +72 -77
  310. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  311. package/src/internal/useBuildSideEntityController.tsx +177 -70
  312. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  313. package/src/preview/PropertyPreview.tsx +19 -26
  314. package/src/preview/PropertyPreviewProps.tsx +5 -9
  315. package/src/preview/components/BooleanPreview.tsx +19 -4
  316. package/src/preview/components/EmptyValue.tsx +1 -1
  317. package/src/preview/components/EnumValuesChip.tsx +2 -2
  318. package/src/preview/components/ImagePreview.tsx +25 -36
  319. package/src/preview/components/ReferencePreview.tsx +73 -176
  320. package/src/preview/components/StorageThumbnail.tsx +5 -1
  321. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  322. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  323. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  324. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  325. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  326. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  327. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  328. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  329. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  330. package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
  331. package/src/preview/util.ts +10 -10
  332. package/src/routes/CustomCMSRoute.tsx +21 -0
  333. package/src/routes/FireCMSRoute.tsx +236 -0
  334. package/src/routes/HomePageRoute.tsx +17 -0
  335. package/src/types/analytics.ts +1 -0
  336. package/src/types/auth.tsx +48 -3
  337. package/src/types/collections.ts +102 -27
  338. package/src/types/customization_controller.tsx +0 -1
  339. package/src/types/datasource.ts +62 -44
  340. package/src/types/dialogs_controller.tsx +7 -3
  341. package/src/types/entities.ts +16 -2
  342. package/src/types/entity_actions.tsx +33 -4
  343. package/src/types/entity_callbacks.ts +18 -18
  344. package/src/types/entity_overrides.tsx +7 -0
  345. package/src/types/export_import.ts +4 -4
  346. package/src/types/fields.tsx +81 -46
  347. package/src/types/firecms.tsx +6 -2
  348. package/src/types/firecms_context.tsx +1 -1
  349. package/src/types/index.ts +2 -1
  350. package/src/types/navigation.ts +52 -31
  351. package/src/types/permissions.ts +10 -5
  352. package/src/types/plugins.tsx +47 -39
  353. package/src/types/properties.ts +63 -27
  354. package/src/types/property_config.tsx +2 -4
  355. package/src/types/roles.ts +41 -0
  356. package/src/types/side_dialogs_controller.tsx +15 -0
  357. package/src/types/side_entity_controller.tsx +7 -1
  358. package/src/types/storage.ts +94 -3
  359. package/src/types/user.ts +9 -0
  360. package/src/util/builders.ts +10 -8
  361. package/src/util/collections.ts +22 -0
  362. package/src/util/entities.ts +9 -6
  363. package/src/util/entity_actions.ts +28 -0
  364. package/src/util/entity_cache.ts +204 -0
  365. package/src/util/enums.ts +1 -1
  366. package/src/util/icon_list.ts +16 -10
  367. package/src/util/icon_synonyms.ts +3 -100
  368. package/src/util/icons.tsx +26 -8
  369. package/src/util/index.ts +2 -0
  370. package/src/util/join_collections.ts +3 -0
  371. package/src/util/make_properties_editable.ts +13 -5
  372. package/src/util/navigation_from_path.ts +13 -6
  373. package/src/util/navigation_utils.ts +59 -7
  374. package/src/util/objects.ts +45 -28
  375. package/src/util/parent_references_from_path.ts +3 -3
  376. package/src/util/permissions.ts +20 -16
  377. package/src/util/plurals.ts +0 -2
  378. package/src/util/property_utils.tsx +11 -4
  379. package/src/util/references.ts +45 -5
  380. package/src/util/resolutions.ts +79 -46
  381. package/src/util/storage.ts +79 -21
  382. package/src/util/strings.ts +2 -2
  383. package/src/util/useStorageUploadController.tsx +71 -27
  384. package/src/util/useTraceUpdate.tsx +2 -1
  385. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  386. package/dist/components/VirtualTable/common.d.ts +0 -2
  387. package/dist/core/Drawer.d.ts +0 -23
  388. package/dist/core/Scaffold.d.ts +0 -55
  389. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  390. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  391. package/dist/internal/EntityView.d.ts +0 -22
  392. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  393. package/dist/internal/useLocaleConfig.d.ts +0 -1
  394. package/dist/types/appcheck.d.ts +0 -26
  395. package/src/components/FireCMSAppBar.tsx +0 -157
  396. package/src/components/HomePage/NavigationCollectionCard.tsx +0 -146
  397. package/src/components/LabelWithIcon.tsx +0 -33
  398. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  399. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  400. package/src/core/Drawer.tsx +0 -164
  401. package/src/core/Scaffold.tsx +0 -281
  402. package/src/form/components/FormikArrayContainer.tsx +0 -44
  403. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -696
  404. package/src/internal/EntityView.tsx +0 -578
  405. package/src/internal/useBuildCustomizationController.tsx +0 -5
  406. package/src/internal/useLocaleConfig.tsx +0 -18
  407. package/src/types/appcheck.ts +0 -29
  408. /package/dist/{core → hooks}/useBuildLocalConfigurationPersistence.d.ts +0 -0
  409. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -3,12 +3,12 @@ import { CMSType, Property, ResolvedProperty } from "../types";
3
3
  /**
4
4
  * @group Preview components
5
5
  */
6
- export type PreviewSize = "medium" | "small" | "tiny";
6
+ export type PreviewSize = "small" | "medium" | "large";
7
7
 
8
8
  /**
9
9
  * @group Preview components
10
10
  */
11
- export interface PropertyPreviewProps<T extends CMSType = any, CustomProps = any, M extends Record<string, any> = Record<string, any>> {
11
+ export interface PropertyPreviewProps<T extends CMSType = any, CustomProps = any> {
12
12
  /**
13
13
  * Name of the property
14
14
  */
@@ -24,11 +24,6 @@ export interface PropertyPreviewProps<T extends CMSType = any, CustomProps = any
24
24
  */
25
25
  property: Property<T> | ResolvedProperty<T>;
26
26
 
27
- /**
28
- * Click handler
29
- */
30
- // onClick?: () => void;
31
-
32
27
  /**
33
28
  * Desired size of the preview, depending on the context.
34
29
  */
@@ -52,8 +47,9 @@ export interface PropertyPreviewProps<T extends CMSType = any, CustomProps = any
52
47
  customProps?: CustomProps;
53
48
 
54
49
  /**
55
- * Entity this property refers to
50
+ * If the preview should be interactive or not.
51
+ * This applies only to videos.
56
52
  */
57
- // entity?: Entity<M>;
53
+ interactive?: boolean;
58
54
 
59
55
  }
@@ -1,11 +1,26 @@
1
1
  import React from "react";
2
- import { Checkbox } from "@firecms/ui";
2
+ import { Checkbox, cls } from "@firecms/ui";
3
+ import { PreviewSize } from "../PropertyPreviewProps";
4
+ import { Property } from "../../types";
3
5
 
4
6
  /**
5
7
  * @group Preview components
6
8
  */
7
- export function BooleanPreview({ value }: {
8
- value: boolean
9
+ export function BooleanPreview({
10
+ value,
11
+ size,
12
+ property
13
+ }: {
14
+ value: boolean,
15
+ size: PreviewSize,
16
+ property: Property,
9
17
  }): React.ReactElement {
10
- return <Checkbox checked={value} color={"secondary"}/>;
18
+ return <div className={"flex flex-row gap-2 items-center"}>
19
+ <Checkbox checked={value}
20
+ padding={false}
21
+ size={size}
22
+ color={"secondary"}/>
23
+ {property.name && <span
24
+ className={cls("text-text-secondary dark:text-text-secondary-dark", size === "small" ? "text-sm" : "")}>{property.name}</span>}
25
+ </div>;
11
26
  }
@@ -6,5 +6,5 @@ import React from "react";
6
6
  export function EmptyValue() {
7
7
 
8
8
  return <div
9
- className="rounded-full bg-gray-200 bg-opacity-30 dark:bg-opacity-20 w-5 h-2 inline-block"/>;
9
+ className="rounded-full bg-surface-200 bg-opacity-30 dark:bg-opacity-20 w-5 h-2 inline-block"/>;
10
10
  }
@@ -1,12 +1,12 @@
1
1
  import React from "react";
2
+ import { Chip } from "@firecms/ui";
2
3
  import { EnumValues } from "../../types";
3
4
  import { buildEnumLabel, enumToObjectEntries, getColorScheme, getLabelOrConfigFrom } from "../../util/enums";
4
- import { Chip } from "@firecms/ui";
5
5
 
6
6
  export interface EnumValuesChipProps {
7
7
  enumValues?: EnumValues;
8
8
  enumKey: string | number;
9
- size: "small" | "medium";
9
+ size: "small" | "medium" | "large";
10
10
  className?: string;
11
11
  children?: React.ReactNode;
12
12
  }
@@ -1,4 +1,4 @@
1
- import React, { CSSProperties, useMemo, useState } from "react";
1
+ import React, { CSSProperties, useMemo } from "react";
2
2
 
3
3
  import { getThumbnailMeasure } from "../util";
4
4
  import { PreviewSize } from "../PropertyPreviewProps";
@@ -20,11 +20,9 @@ export function ImagePreview({
20
20
  url
21
21
  }: ImagePreviewProps) {
22
22
 
23
- const [onHover, setOnHover] = useState(false);
24
-
25
23
  const imageSize = useMemo(() => getThumbnailMeasure(size), [size]);
26
24
 
27
- if (size === "tiny") {
25
+ if (size === "small") {
28
26
  return (
29
27
  <img src={url}
30
28
  className={"rounded-md"}
@@ -47,60 +45,51 @@ export function ImagePreview({
47
45
 
48
46
  return (
49
47
  <div
50
- className="relative flex items-center justify-center max-w-full max-h-full"
48
+ className="relative flex items-center justify-center max-w-full max-h-full group"
51
49
  style={{
52
50
  width: imageSize,
53
51
  height: imageSize
54
52
  }}
55
- key={"image_preview_" + url}
56
- onMouseEnter={() => setOnHover(true)}
57
- onMouseMove={() => setOnHover(true)}
58
- onMouseLeave={() => setOnHover(false)}>
53
+ key={"image_preview_" + url}>
59
54
 
60
55
  <img src={url}
61
56
  className={"rounded-md"}
62
57
  style={imageStyle}/>
63
58
 
64
- {onHover && <>
65
-
66
- {navigator && <Tooltip title="Copy url to clipboard">
67
- <div
68
- className="rounded-full absolute bottom-[-4px] right-8">
69
- <IconButton
70
- variant={"filled"}
71
- size={"small"}
72
- onClick={(e) => {
73
- e.stopPropagation();
74
- e.preventDefault();
75
- return navigator.clipboard.writeText(url);
76
- }}>
77
- <ContentCopyIcon className={"text-gray-500"}
78
- size={"small"}/>
79
- </IconButton>
80
- </div>
59
+ <div className={"flex flex-row gap-2 absolute bottom-[-4px] right-[-4px] invisible group-hover:visible"}>
60
+ {navigator && <Tooltip
61
+ asChild={true}
62
+ title="Copy url to clipboard" side={"bottom"}>
63
+ <IconButton
64
+ variant={"filled"}
65
+ size={"small"}
66
+ onClick={(e) => {
67
+ e.stopPropagation();
68
+ e.preventDefault();
69
+ return navigator.clipboard.writeText(url);
70
+ }}>
71
+ <ContentCopyIcon className={"text-surface-700 dark:text-surface-300"}
72
+ size={"smallest"}/>
73
+ </IconButton>
81
74
  </Tooltip>}
82
75
 
83
- <Tooltip title="Open image in new tab">
76
+ <Tooltip title="Open image in new tab" side={"bottom"}>
84
77
  <IconButton
78
+ className="invisible group-hover:visible"
85
79
  variant={"filled"}
86
80
  component={"a" as React.ElementType}
87
- style={{
88
- position: "absolute",
89
- bottom: -4,
90
- right: -4
91
- }}
92
81
  href={url}
93
82
  rel="noopener noreferrer"
94
83
  target="_blank"
95
84
  size={"small"}
96
85
  onClick={(e: any) => e.stopPropagation()}
97
86
  >
98
- <OpenInNewIcon className={"text-gray-500"}
99
- size={"small"}/>
87
+ <OpenInNewIcon className={"text-surface-700 dark:text-surface-300"}
88
+ size={"smallest"}/>
100
89
  </IconButton>
101
90
  </Tooltip>
102
- </>
103
- }
91
+ </div>
92
+
104
93
  </div>
105
94
  );
106
95
  }
@@ -1,21 +1,11 @@
1
1
  import * as React from "react";
2
- import { useMemo } from "react";
3
2
 
4
- import { Entity, EntityCollection, EntityReference, ResolvedProperty } from "../../types";
5
-
6
- import { getReferencePreviewKeys, getValueInPath, resolveCollection } from "../../util";
7
- import {
8
- useCustomizationController,
9
- useEntityFetch,
10
- useNavigationController,
11
- useSideEntityController
12
- } from "../../hooks";
13
- import { PropertyPreview } from "../PropertyPreview";
3
+ import { Entity, EntityCollection, EntityReference } from "../../types";
4
+ import { useCustomizationController, useEntityFetch, useNavigationController } from "../../hooks";
14
5
  import { PreviewSize } from "../PropertyPreviewProps";
15
- import { SkeletonPropertyComponent } from "../property_previews/SkeletonPropertyComponent";
16
- import { cn, IconButton, KeyboardTabIcon, Skeleton, Tooltip, Typography } from "@firecms/ui";
6
+ import { Skeleton } from "@firecms/ui";
17
7
  import { ErrorView } from "../../components";
18
- import { useAnalyticsController } from "../../hooks/useAnalyticsController";
8
+ import { EntityPreview, EntityPreviewContainer } from "../../components/EntityPreview";
19
9
 
20
10
  export type ReferencePreviewProps = {
21
11
  disabled?: boolean;
@@ -23,52 +13,44 @@ export type ReferencePreviewProps = {
23
13
  size: PreviewSize;
24
14
  previewProperties?: string[];
25
15
  onClick?: (e: React.SyntheticEvent) => void;
26
- onHover?: boolean;
27
- allowEntityNavigation?: boolean;
16
+ hover?: boolean;
17
+ includeEntityLink?: boolean;
18
+ includeId?: boolean;
28
19
  };
29
20
 
30
21
  /**
31
22
  * @group Preview components
32
23
  */
33
- export const ReferencePreview = React.memo<ReferencePreviewProps>(function ReferencePreview(props: ReferencePreviewProps) {
24
+ export const ReferencePreview = function ReferencePreview(props: ReferencePreviewProps) {
34
25
  const reference = props.reference;
35
- if (!((reference as unknown) instanceof EntityReference)) {
26
+ if (!(typeof reference === "object" && "isEntityReference" in reference && reference.isEntityReference())) {
36
27
  console.warn("Reference preview received value of type", typeof reference);
37
- return <ReferencePreviewContainer
28
+ return <EntityPreviewContainer
38
29
  onClick={props.onClick}
39
30
  size={props.size}>
40
31
  <ErrorView error={"Unexpected value. Click to edit"}
41
32
  tooltip={JSON.stringify(reference)}/>
42
- </ReferencePreviewContainer>;
33
+ </EntityPreviewContainer>;
43
34
  }
44
35
  return <ReferencePreviewInternal {...props} />;
45
- }, areEqual) as React.FunctionComponent<ReferencePreviewProps>;
46
-
47
- function areEqual(prevProps: ReferencePreviewProps, nextProps: ReferencePreviewProps) {
48
- return prevProps.disabled === nextProps.disabled &&
49
- prevProps.size === nextProps.size &&
50
- prevProps.onHover === nextProps.onHover &&
51
- prevProps.reference?.id === nextProps.reference?.id &&
52
- prevProps.reference?.path === nextProps.reference?.path &&
53
- prevProps.allowEntityNavigation === nextProps.allowEntityNavigation
54
- ;
55
- }
36
+ };
56
37
 
57
- function ReferencePreviewInternal<M extends Record<string, any>>({
58
- disabled,
59
- reference,
60
- previewProperties,
61
- size,
62
- onHover,
63
- onClick,
64
- allowEntityNavigation = true
65
- }: ReferencePreviewProps) {
38
+ function ReferencePreviewInternal({
39
+ disabled,
40
+ reference,
41
+ previewProperties,
42
+ size,
43
+ hover,
44
+ onClick,
45
+ includeEntityLink = true,
46
+ includeId = true
47
+ }: ReferencePreviewProps) {
66
48
 
67
49
  const customizationController = useCustomizationController();
68
50
 
69
51
  const navigationController = useNavigationController();
70
52
 
71
- const collection = navigationController.getCollection<EntityCollection<M>>(reference.path);
53
+ const collection = navigationController.getCollection(reference.path);
72
54
  if (!collection) {
73
55
  if (customizationController.components?.missingReference) {
74
56
  return <customizationController.components.missingReference path={reference.path}/>;
@@ -83,20 +65,26 @@ function ReferencePreviewInternal<M extends Record<string, any>>({
83
65
  previewProperties={previewProperties}
84
66
  size={size}
85
67
  disabled={disabled}
86
- allowEntityNavigation={allowEntityNavigation}
68
+ includeEntityLink={includeEntityLink}
69
+ includeId={includeId}
87
70
  onClick={onClick}
88
- onHover={onHover}/>
71
+ hover={hover}/>
89
72
  }
90
73
 
91
- function ReferencePreviewExisting<M extends Record<string, any> = any>({ reference, collection, previewProperties, size, disabled, allowEntityNavigation, onClick, onHover }: ReferencePreviewProps & {
74
+ function ReferencePreviewExisting<M extends Record<string, any> = any>({
75
+ reference,
76
+ collection,
77
+ previewProperties,
78
+ size,
79
+ disabled,
80
+ includeEntityLink,
81
+ includeId,
82
+ onClick,
83
+ hover
84
+ }: ReferencePreviewProps & {
92
85
  collection: EntityCollection<M>
93
86
  }) {
94
87
 
95
- const customizationController = useCustomizationController();
96
-
97
- const analyticsController = useAnalyticsController();
98
- const sideEntityController = useSideEntityController();
99
-
100
88
  const {
101
89
  entity,
102
90
  dataLoading,
@@ -114,145 +102,54 @@ function ReferencePreviewExisting<M extends Record<string, any> = any>({ referen
114
102
 
115
103
  const usedEntity = entity ?? referencesCache.get(reference.pathWithId);
116
104
 
117
- const resolvedCollection = useMemo(() => resolveCollection({
118
- collection,
119
- path: reference.path,
120
- values: usedEntity?.values,
121
- fields: customizationController.propertyConfigs
122
- }), [collection]);
123
-
124
- const listProperties = useMemo(() => getReferencePreviewKeys(resolvedCollection, customizationController.propertyConfigs, previewProperties, size === "small" || size === "medium" ? 3 : 1),
125
- [previewProperties, resolvedCollection, size]);
126
-
127
105
  let body: React.ReactNode;
128
106
 
129
- if (!resolvedCollection) {
130
- return <ErrorView
131
- error={"Could not find collection with id " + resolvedCollection}/>
132
- }
133
-
134
107
  if (!reference) {
135
108
  body = <ErrorView error={"Reference not set"}/>;
136
109
  } else if (usedEntity && !usedEntity.values) {
137
110
  body = <ErrorView error={"Reference does not exist"}
138
111
  tooltip={reference.path}/>;
139
- } else {
140
- body = (
141
- <>
142
- <div
143
- className="flex flex-col flex-grow w-full max-w-[calc(100%-52px)] m-1">
144
-
145
- {size !== "tiny" && (
146
- reference
147
- ? <div className={`${
148
- size !== "medium"
149
- ? "block whitespace-nowrap overflow-hidden truncate"
150
- : ""
151
- }`}>
152
- <Typography variant={"caption"}
153
- className={"font-mono"}>
154
- {reference.id}
155
- </Typography>
156
- </div>
157
- : <Skeleton/>)}
158
-
159
- {listProperties && listProperties.map((key) => {
160
- const childProperty = resolvedCollection.properties[key as string];
161
- if (!childProperty) return null;
162
-
163
- return (
164
- <div key={"ref_prev_" + (key as string)}
165
- className={listProperties.length > 1 ? "my-0.5" : "my-0"}>
166
- {
167
- usedEntity
168
- ? <PropertyPreview
169
- propertyKey={key as string}
170
- value={getValueInPath(usedEntity.values, key)}
171
- property={childProperty as ResolvedProperty}
172
- // entity={usedEntity}
173
- size={"tiny"}/>
174
- : <SkeletonPropertyComponent
175
- property={childProperty as ResolvedProperty}
176
- size={"tiny"}/>
177
- }
178
- </div>
179
- );
180
- })}
181
-
182
- </div>
183
- <div className={`my-${size === "tiny" ? 2 : 4}`}>
184
- {!disabled && usedEntity && allowEntityNavigation &&
185
- <Tooltip title={`See details for ${usedEntity.id}`}>
186
- <IconButton
187
- color={"inherit"}
188
- size={"small"}
189
- onClick={(e) => {
190
- e.stopPropagation();
191
- analyticsController.onAnalyticsEvent?.("entity_click_from_reference", {
192
- path: usedEntity.path,
193
- entityId: usedEntity.id
194
- });
195
- sideEntityController.open({
196
- entityId: usedEntity.id,
197
- path: usedEntity.path,
198
- collection: resolvedCollection,
199
- updateUrl: true
200
- });
201
- }}>
202
- <KeyboardTabIcon size={"small"}/>
203
- </IconButton>
204
- </Tooltip>}
205
- </div>
206
- </>
112
+ }
113
+ if (body) {
114
+
115
+ return (
116
+ <EntityPreviewContainer onClick={disabled ? undefined : onClick}
117
+ hover={disabled ? undefined : hover}
118
+ size={size}>
119
+ {body}
120
+ </EntityPreviewContainer>
207
121
  );
208
122
  }
209
123
 
210
- return (
211
- <ReferencePreviewContainer onClick={disabled ? undefined : onClick}
212
- onHover={disabled ? undefined : onHover}
213
- size={size}>
214
- {body}
215
- </ReferencePreviewContainer>
216
- );
217
- }
218
-
219
- export function ReferencePreviewContainer({
220
- children,
221
- onHover,
222
- size,
223
- onClick
224
- }: {
225
- children: React.ReactNode;
226
- onHover?: boolean;
227
- size: PreviewSize;
228
- onClick?: (e: React.SyntheticEvent) => void;
229
- }) {
230
- return <Typography variant={"label"}
231
- className={cn("bg-opacity-70 bg-gray-100 dark:bg-gray-800 dark:bg-opacity-60",
232
- "w-full",
233
- "flex",
234
- "rounded-md",
235
- "overflow-hidden",
236
- onHover ? "hover:bg-opacity-90 dark:hover:bg-opacity-90" : "",
237
- size === "medium" ? "p-2" : "p-1",
238
- size === "tiny" ? "items-center" : "",
239
- "transition-colors duration-300 ease-in-out ",
240
- // onHover ? "shadow-outline" : "",
241
- onClick ? "cursor-pointer" : "")}
242
- style={{
243
- // @ts-ignore
244
- tabindex: 0
245
- }}
246
- onClick={(event) => {
247
- if (onClick) {
248
- event.preventDefault();
249
- onClick(event);
250
- }
251
- }}>
124
+ if (dataLoading && !usedEntity) {
125
+ return (
126
+ <EntityPreviewContainer onClick={disabled ? undefined : onClick}
127
+ hover={disabled ? undefined : hover}
128
+ size={size}>
129
+ <Skeleton/>
130
+ </EntityPreviewContainer>
131
+ );
132
+ }
252
133
 
253
- {children}
134
+ if (!usedEntity) {
135
+ return (
136
+ <EntityPreviewContainer onClick={disabled ? undefined : onClick}
137
+ hover={disabled ? undefined : hover}
138
+ size={size}>
139
+ <ErrorView error={"Entity not found"}/>
140
+ </EntityPreviewContainer>
141
+ );
142
+ }
143
+ return <EntityPreview size={size}
144
+ previewProperties={previewProperties}
145
+ disabled={disabled}
146
+ entity={usedEntity}
147
+ collection={collection}
148
+ onClick={onClick}
149
+ includeEntityLink={includeEntityLink}
150
+ includeId={includeId}
151
+ hover={hover}/>;
254
152
 
255
- </Typography>
256
153
  }
257
154
 
258
155
  const referencesCache = new Map<string, Entity<any>>();
@@ -11,6 +11,7 @@ type StorageThumbnailProps = {
11
11
  storagePathOrDownloadUrl: string;
12
12
  storeUrl: boolean;
13
13
  size: PreviewSize;
14
+ interactive?: boolean;
14
15
  };
15
16
 
16
17
  /**
@@ -21,13 +22,15 @@ export const StorageThumbnail = React.memo<StorageThumbnailProps>(StorageThumbna
21
22
  function areEqual(prevProps: StorageThumbnailProps, nextProps: StorageThumbnailProps) {
22
23
  return prevProps.size === nextProps.size &&
23
24
  prevProps.storagePathOrDownloadUrl === nextProps.storagePathOrDownloadUrl &&
24
- prevProps.storeUrl === nextProps.storeUrl;
25
+ prevProps.storeUrl === nextProps.storeUrl&&
26
+ prevProps.interactive === nextProps.interactive;
25
27
  }
26
28
 
27
29
  const URL_CACHE: Record<string, DownloadConfig> = {};
28
30
 
29
31
  export function StorageThumbnailInternal({
30
32
  storeUrl,
33
+ interactive,
31
34
  storagePathOrDownloadUrl,
32
35
  size
33
36
  }: StorageThumbnailProps) {
@@ -68,6 +71,7 @@ export function StorageThumbnailInternal({
68
71
  return downloadConfig?.url
69
72
  ? <UrlComponentPreview previewType={previewType}
70
73
  url={downloadConfig.url}
74
+ interactive={interactive}
71
75
  size={size}
72
76
  hint={storagePathOrDownloadUrl}/>
73
77
  : renderSkeletonImageThumbnail(size);
@@ -1,10 +1,10 @@
1
- import React from "react";
1
+ import React, { useMemo } from "react";
2
2
 
3
3
  import { ImagePreview } from "./ImagePreview";
4
4
  import { getThumbnailMeasure } from "../util";
5
5
  import { PreviewType } from "../../types";
6
6
  import { PreviewSize } from "../PropertyPreviewProps";
7
- import { DescriptionIcon, OpenInNewIcon, Tooltip, Typography } from "@firecms/ui";
7
+ import { cls, DescriptionIcon, OpenInNewIcon, Tooltip, Typography } from "@firecms/ui";
8
8
  import { EmptyValue } from "./EmptyValue";
9
9
 
10
10
  /**
@@ -14,12 +14,15 @@ export function UrlComponentPreview({
14
14
  url,
15
15
  previewType,
16
16
  size,
17
- hint
17
+ hint,
18
+ interactive = true
18
19
  }: {
19
20
  url: string,
20
21
  previewType?: PreviewType,
21
22
  size: PreviewSize,
22
- hint?: string
23
+ hint?: string,
24
+ // for video controls
25
+ interactive?: boolean
23
26
  }): React.ReactElement {
24
27
 
25
28
  if (!previewType) {
@@ -43,37 +46,66 @@ export function UrlComponentPreview({
43
46
  size={size}/>;
44
47
  } else if (previewType === "audio") {
45
48
  return <audio controls
49
+ className={"max-w-100%"}
46
50
  src={url}>
47
51
  Your browser does not support the
48
52
  <code>audio</code> element.
49
53
  </audio>;
50
54
  } else if (previewType === "video") {
51
- return <video
52
- className={`max-w-${size === "small" ? "sm" : "md"}`}
53
- controls
54
- >
55
- <source src={url}/>
56
- </video>;
55
+ return <VideoPreview size={size} src={url} interactive={interactive}/>;
57
56
  } else {
58
57
  return (
59
- <a
60
- href={url}
61
- rel="noopener noreferrer"
62
- target="_blank"
63
- onClick={(e) => e.stopPropagation()}
64
- className="flex flex-col items-center justify-center"
65
- style={{
66
- width: getThumbnailMeasure(size),
67
- height: getThumbnailMeasure(size)
68
- }}>
69
- <DescriptionIcon className="flex-grow"/>
70
- {hint &&
71
- <Tooltip title={hint}>
72
- <Typography
73
- className="max-w-full truncate rtl text-left"
74
- variant={"caption"}>{hint}</Typography>
75
- </Tooltip>}
76
- </a>
58
+ <Tooltip title={hint}>
59
+ <a
60
+ href={url}
61
+ rel="noopener noreferrer"
62
+ target="_blank"
63
+ onClick={(e) => e.stopPropagation()}
64
+ className="flex flex-col items-center justify-center"
65
+ style={{
66
+ width: getThumbnailMeasure(size),
67
+ height: getThumbnailMeasure(size)
68
+ }}>
69
+ <DescriptionIcon className="text-surface-700 dark:text-surface-300"/>
70
+ {hint && <Typography
71
+ className="max-w-full truncate rtl text-left"
72
+ variant={"caption"}>{hint}</Typography>}
73
+ </a>
74
+ </Tooltip>
77
75
  );
78
76
  }
79
77
  }
78
+
79
+ function VideoPreview({
80
+ size,
81
+ src,
82
+ interactive
83
+ }: { size: PreviewSize, src: string, interactive: boolean }) {
84
+
85
+ const imageSize = useMemo(() => {
86
+ if (size === "small")
87
+ return "140px";
88
+ else if (size === "medium")
89
+ return "240px";
90
+ else if (size === "large")
91
+ return "100%";
92
+ else throw new Error("Invalid size");
93
+ }, [size]);
94
+
95
+ const videoProps = {
96
+ controls: interactive
97
+ };
98
+ return <video
99
+ style={{
100
+ position: "relative",
101
+ objectFit: "cover",
102
+ width: imageSize,
103
+ minWidth: "140px",
104
+ // height: imageSize,
105
+ maxHeight: "100%"
106
+ }}
107
+ {...videoProps}
108
+ className={cls("max-w-100% rounded", { "pointer-events-none": !interactive })}>
109
+ <source src={src}/>
110
+ </video>;
111
+ }