@firecms/core 3.0.0-canary.19 → 3.0.0-canary.190

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 (375) hide show
  1. package/README.md +3 -3
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +16 -0
  4. package/dist/app/Scaffold.d.ts +30 -0
  5. package/dist/app/index.d.ts +4 -0
  6. package/dist/app/useApp.d.ts +16 -0
  7. package/dist/components/ArrayContainer.d.ts +23 -6
  8. package/dist/components/CircularProgressCenter.d.ts +1 -1
  9. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  10. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +13 -13
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  15. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  16. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
  17. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  18. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  19. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  20. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
  21. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +16 -2
  22. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  23. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  24. package/dist/components/EntityPreview.d.ts +5 -4
  25. package/dist/components/ErrorView.d.ts +1 -1
  26. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  27. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  28. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  29. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  30. package/dist/components/ReferenceWidget.d.ts +3 -1
  31. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  32. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  33. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  34. package/dist/components/VirtualTable/VirtualTableProps.d.ts +28 -12
  35. package/dist/components/VirtualTable/types.d.ts +3 -3
  36. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  37. package/dist/components/common/index.d.ts +2 -1
  38. package/dist/components/common/table_height.d.ts +5 -0
  39. package/dist/components/common/types.d.ts +4 -6
  40. package/dist/components/common/useColumnsIds.d.ts +3 -1
  41. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  42. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  43. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  44. package/dist/components/index.d.ts +4 -2
  45. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  46. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  47. package/dist/core/DefaultDrawer.d.ts +19 -0
  48. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  49. package/dist/core/EntityEditView.d.ts +31 -10
  50. package/dist/core/EntityForm.d.ts +43 -0
  51. package/dist/core/FireCMS.d.ts +2 -2
  52. package/dist/core/FireCMSRouter.d.ts +4 -0
  53. package/dist/core/NavigationRoutes.d.ts +2 -3
  54. package/dist/core/index.d.ts +4 -4
  55. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  56. package/dist/form/components/ErrorFocus.d.ts +1 -1
  57. package/dist/form/components/FieldHelperText.d.ts +3 -3
  58. package/dist/form/components/FormEntry.d.ts +6 -0
  59. package/dist/form/components/FormLayout.d.ts +5 -0
  60. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  61. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  62. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  63. package/dist/form/components/index.d.ts +3 -1
  64. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  65. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  66. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  67. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  68. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  70. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  71. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  73. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  74. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  75. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  76. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  77. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  78. package/dist/form/index.d.ts +3 -5
  79. package/dist/form/useClearRestoreValue.d.ts +2 -2
  80. package/dist/hooks/data/delete.d.ts +4 -4
  81. package/dist/hooks/data/save.d.ts +4 -5
  82. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  83. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  84. package/dist/hooks/index.d.ts +1 -0
  85. package/dist/hooks/useAuthController.d.ts +1 -1
  86. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  87. package/dist/hooks/useBuildNavigationController.d.ts +7 -5
  88. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  89. package/dist/hooks/useModeController.d.ts +1 -2
  90. package/dist/hooks/useProjectLog.d.ts +8 -2
  91. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  92. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  93. package/dist/index.d.ts +1 -0
  94. package/dist/index.es.js +21912 -14304
  95. package/dist/index.es.js.map +1 -1
  96. package/dist/index.umd.js +24287 -588
  97. package/dist/index.umd.js.map +1 -1
  98. package/dist/internal/useBuildDataSource.d.ts +1 -16
  99. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  100. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  101. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  102. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  103. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  104. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  105. package/dist/preview/util.d.ts +3 -3
  106. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  107. package/dist/routes/FireCMSRoute.d.ts +1 -0
  108. package/dist/routes/HomePageRoute.d.ts +3 -0
  109. package/dist/types/auth.d.ts +8 -10
  110. package/dist/types/collections.d.ts +71 -22
  111. package/dist/types/datasource.d.ts +52 -36
  112. package/dist/types/dialogs_controller.d.ts +7 -3
  113. package/dist/types/entities.d.ts +7 -2
  114. package/dist/types/entity_actions.d.ts +28 -4
  115. package/dist/types/entity_callbacks.d.ts +16 -16
  116. package/dist/types/entity_overrides.d.ts +2 -2
  117. package/dist/types/export_import.d.ts +4 -4
  118. package/dist/types/fields.d.ts +75 -40
  119. package/dist/types/firecms.d.ts +6 -2
  120. package/dist/types/firecms_context.d.ts +1 -1
  121. package/dist/types/index.d.ts +0 -1
  122. package/dist/types/navigation.d.ts +32 -14
  123. package/dist/types/permissions.d.ts +4 -4
  124. package/dist/types/plugins.d.ts +23 -12
  125. package/dist/types/properties.d.ts +52 -24
  126. package/dist/types/property_config.d.ts +0 -2
  127. package/dist/types/side_dialogs_controller.d.ts +10 -0
  128. package/dist/types/side_entity_controller.d.ts +1 -1
  129. package/dist/types/storage.d.ts +86 -3
  130. package/dist/types/user.d.ts +1 -0
  131. package/dist/util/builders.d.ts +3 -3
  132. package/dist/util/entities.d.ts +3 -3
  133. package/dist/util/entity_actions.d.ts +2 -0
  134. package/dist/util/entity_cache.d.ts +23 -0
  135. package/dist/util/icon_list.d.ts +5 -1
  136. package/dist/util/icon_synonyms.d.ts +1 -98
  137. package/dist/util/icons.d.ts +6 -3
  138. package/dist/util/index.d.ts +2 -0
  139. package/dist/util/navigation_from_path.d.ts +5 -1
  140. package/dist/util/navigation_utils.d.ts +14 -3
  141. package/dist/util/objects.d.ts +2 -1
  142. package/dist/util/permissions.d.ts +4 -4
  143. package/dist/util/plurals.d.ts +0 -2
  144. package/dist/util/property_utils.d.ts +3 -3
  145. package/dist/util/resolutions.d.ts +30 -16
  146. package/dist/util/storage.d.ts +23 -2
  147. package/dist/util/useStorageUploadController.d.ts +3 -3
  148. package/package.json +61 -48
  149. package/src/app/AppBar.tsx +18 -0
  150. package/src/app/Drawer.tsx +24 -0
  151. package/src/app/Scaffold.tsx +243 -0
  152. package/src/app/index.ts +4 -0
  153. package/src/app/useApp.tsx +32 -0
  154. package/src/components/ArrayContainer.tsx +126 -40
  155. package/src/components/CircularProgressCenter.tsx +2 -2
  156. package/src/components/ClearFilterSortButton.tsx +41 -0
  157. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  158. package/src/components/DeleteEntityDialog.tsx +10 -19
  159. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +54 -37
  160. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  161. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  162. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
  163. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  164. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  165. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  166. package/src/components/EntityCollectionTable/index.tsx +1 -1
  167. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
  168. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  169. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  170. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +86 -77
  171. package/src/components/EntityCollectionView/EntityCollectionView.tsx +206 -112
  172. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  173. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  174. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  175. package/src/components/EntityCollectionView/utils.ts +19 -0
  176. package/src/components/EntityPreview.tsx +62 -52
  177. package/src/components/EntityView.tsx +10 -10
  178. package/src/components/ErrorView.tsx +4 -4
  179. package/src/components/HomePage/DefaultHomePage.tsx +26 -19
  180. package/src/components/HomePage/FavouritesView.tsx +6 -11
  181. package/src/components/HomePage/NavigationCard.tsx +3 -3
  182. package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
  183. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  184. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  185. package/src/components/NotFoundPage.tsx +2 -2
  186. package/src/components/PropertyConfigBadge.tsx +9 -3
  187. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  188. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +19 -13
  189. package/src/components/ReferenceWidget.tsx +21 -11
  190. package/src/components/SearchIconsView.tsx +10 -7
  191. package/src/components/SelectableTable/SelectableTable.tsx +27 -12
  192. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  193. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  194. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  195. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  196. package/src/components/UnsavedChangesDialog.tsx +42 -0
  197. package/src/components/VirtualTable/VirtualTable.tsx +96 -48
  198. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  199. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  200. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  201. package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
  202. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  203. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  204. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  205. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  206. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  207. package/src/components/VirtualTable/types.tsx +2 -3
  208. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +33 -40
  209. package/src/components/common/index.ts +2 -1
  210. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  211. package/src/components/common/types.tsx +4 -6
  212. package/src/components/common/useColumnsIds.tsx +24 -3
  213. package/src/components/common/useDataSourceTableController.tsx +420 -0
  214. package/src/components/common/useDebouncedCallback.tsx +20 -0
  215. package/src/components/common/useScrollRestoration.tsx +68 -0
  216. package/src/components/common/useTableSearchHelper.ts +53 -12
  217. package/src/components/index.tsx +4 -2
  218. package/src/contexts/BreacrumbsContext.tsx +38 -0
  219. package/src/contexts/DialogsProvider.tsx +5 -4
  220. package/src/contexts/ModeController.tsx +1 -3
  221. package/src/contexts/SnackbarProvider.tsx +2 -0
  222. package/src/core/DefaultAppBar.tsx +207 -0
  223. package/src/core/DefaultDrawer.tsx +185 -0
  224. package/src/core/DrawerNavigationItem.tsx +66 -0
  225. package/src/core/EntityEditView.tsx +407 -458
  226. package/src/core/EntityForm.tsx +956 -0
  227. package/src/core/EntitySidePanel.tsx +80 -17
  228. package/src/core/FireCMS.tsx +56 -49
  229. package/src/core/FireCMSRouter.tsx +17 -0
  230. package/src/core/NavigationRoutes.tsx +28 -38
  231. package/src/core/SideDialogs.tsx +12 -6
  232. package/src/core/field_configs.tsx +11 -12
  233. package/src/core/index.tsx +6 -5
  234. package/src/form/PropertyFieldBinding.tsx +85 -44
  235. package/src/form/components/CustomIdField.tsx +6 -2
  236. package/src/form/components/FieldHelperText.tsx +4 -4
  237. package/src/form/components/FormEntry.tsx +22 -0
  238. package/src/form/components/FormLayout.tsx +16 -0
  239. package/src/form/components/LabelWithIcon.tsx +30 -19
  240. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  241. package/src/form/components/StorageItemPreview.tsx +22 -12
  242. package/src/form/components/StorageUploadProgress.tsx +4 -5
  243. package/src/form/components/index.tsx +3 -1
  244. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +31 -19
  245. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
  246. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  247. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  248. package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
  249. package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
  250. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
  251. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  252. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  253. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  254. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -35
  255. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
  256. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +42 -50
  257. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  258. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  259. package/src/form/index.tsx +4 -9
  260. package/src/form/useClearRestoreValue.tsx +2 -2
  261. package/src/form/validation.ts +13 -23
  262. package/src/hooks/data/delete.ts +6 -5
  263. package/src/hooks/data/save.ts +13 -9
  264. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  265. package/src/hooks/data/useDataSource.tsx +11 -3
  266. package/src/hooks/data/useEntityFetch.tsx +10 -6
  267. package/src/hooks/index.tsx +1 -0
  268. package/src/hooks/useAuthController.tsx +1 -1
  269. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  270. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  271. package/src/hooks/useBuildModeController.tsx +22 -29
  272. package/src/hooks/useBuildNavigationController.tsx +159 -52
  273. package/src/hooks/useFireCMSContext.tsx +5 -5
  274. package/src/hooks/useLargeLayout.tsx +0 -35
  275. package/src/hooks/useModeController.tsx +1 -2
  276. package/src/hooks/useProjectLog.tsx +32 -10
  277. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  278. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  279. package/src/index.ts +1 -0
  280. package/src/internal/useBuildDataSource.ts +72 -82
  281. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  282. package/src/internal/useBuildSideEntityController.tsx +230 -70
  283. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  284. package/src/preview/PropertyPreview.tsx +17 -24
  285. package/src/preview/PropertyPreviewProps.tsx +7 -1
  286. package/src/preview/components/BooleanPreview.tsx +2 -2
  287. package/src/preview/components/EmptyValue.tsx +1 -1
  288. package/src/preview/components/EnumValuesChip.tsx +2 -2
  289. package/src/preview/components/ImagePreview.tsx +25 -36
  290. package/src/preview/components/ReferencePreview.tsx +22 -33
  291. package/src/preview/components/StorageThumbnail.tsx +5 -1
  292. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  293. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  294. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  295. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  296. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  297. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  298. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  299. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  300. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  301. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  302. package/src/preview/util.ts +10 -10
  303. package/src/routes/CustomCMSRoute.tsx +21 -0
  304. package/src/routes/FireCMSRoute.tsx +223 -0
  305. package/src/routes/HomePageRoute.tsx +17 -0
  306. package/src/types/auth.tsx +9 -13
  307. package/src/types/collections.ts +87 -27
  308. package/src/types/customization_controller.tsx +0 -1
  309. package/src/types/datasource.ts +61 -43
  310. package/src/types/dialogs_controller.tsx +7 -3
  311. package/src/types/entities.ts +12 -2
  312. package/src/types/entity_actions.tsx +32 -7
  313. package/src/types/entity_callbacks.ts +18 -18
  314. package/src/types/entity_overrides.tsx +2 -2
  315. package/src/types/export_import.ts +4 -4
  316. package/src/types/fields.tsx +86 -44
  317. package/src/types/firecms.tsx +7 -2
  318. package/src/types/firecms_context.tsx +1 -1
  319. package/src/types/index.ts +0 -1
  320. package/src/types/navigation.ts +38 -18
  321. package/src/types/permissions.ts +5 -5
  322. package/src/types/plugins.tsx +25 -14
  323. package/src/types/properties.ts +60 -25
  324. package/src/types/property_config.tsx +0 -2
  325. package/src/types/side_dialogs_controller.tsx +13 -0
  326. package/src/types/side_entity_controller.tsx +1 -1
  327. package/src/types/storage.ts +94 -3
  328. package/src/types/user.ts +2 -0
  329. package/src/util/builders.ts +10 -8
  330. package/src/util/entities.ts +9 -6
  331. package/src/util/entity_actions.ts +28 -0
  332. package/src/util/entity_cache.ts +204 -0
  333. package/src/util/enums.ts +1 -1
  334. package/src/util/icon_list.ts +16 -10
  335. package/src/util/icon_synonyms.ts +3 -100
  336. package/src/util/icons.tsx +17 -7
  337. package/src/util/index.ts +2 -0
  338. package/src/util/join_collections.ts +3 -0
  339. package/src/util/make_properties_editable.ts +13 -5
  340. package/src/util/navigation_from_path.ts +10 -2
  341. package/src/util/navigation_utils.ts +59 -7
  342. package/src/util/objects.ts +45 -28
  343. package/src/util/parent_references_from_path.ts +3 -3
  344. package/src/util/permissions.ts +9 -8
  345. package/src/util/plurals.ts +0 -2
  346. package/src/util/property_utils.tsx +11 -4
  347. package/src/util/references.ts +11 -2
  348. package/src/util/resolutions.ts +79 -46
  349. package/src/util/storage.ts +79 -21
  350. package/src/util/strings.ts +2 -2
  351. package/src/util/useStorageUploadController.tsx +71 -27
  352. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  353. package/dist/components/VirtualTable/common.d.ts +0 -2
  354. package/dist/core/Drawer.d.ts +0 -23
  355. package/dist/core/Scaffold.d.ts +0 -55
  356. package/dist/core/SideEntityView.d.ts +0 -7
  357. package/dist/form/EntityForm.d.ts +0 -77
  358. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  359. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  360. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  361. package/dist/internal/useLocaleConfig.d.ts +0 -1
  362. package/dist/types/appcheck.d.ts +0 -26
  363. package/src/components/FireCMSAppBar.tsx +0 -165
  364. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  365. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  366. package/src/core/Drawer.tsx +0 -191
  367. package/src/core/Scaffold.tsx +0 -281
  368. package/src/core/SideEntityView.tsx +0 -38
  369. package/src/form/EntityForm.tsx +0 -728
  370. package/src/form/components/FormikArrayContainer.tsx +0 -44
  371. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  372. package/src/internal/useBuildCustomizationController.tsx +0 -5
  373. package/src/internal/useLocaleConfig.tsx +0 -18
  374. package/src/types/appcheck.ts +0 -29
  375. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -8,7 +8,7 @@ export const DialogsProvider: React.FC<PropsWithChildren<{}>> = ({ children }) =
8
8
  const [dialogEntries, setDialogEntries] = useState<DialogControllerEntryProps[]>([]);
9
9
  const dialogEntriesRef = useRef<DialogControllerEntryProps[]>(dialogEntries);
10
10
 
11
- const updateDialogEntries = (newPanels: DialogControllerEntryProps[]) => {
11
+ const updateDialogEntries = (newPanels: DialogControllerEntryProps<any>[]) => {
12
12
  dialogEntriesRef.current = newPanels;
13
13
  setDialogEntries(newPanels);
14
14
  };
@@ -18,14 +18,14 @@ export const DialogsProvider: React.FC<PropsWithChildren<{}>> = ({ children }) =
18
18
  if (dialogEntries.length === 0)
19
19
  return;
20
20
 
21
- const updatedPanels = [...dialogEntries.slice(0, -1)];
21
+ const updatedPanels = [...dialogEntriesRef.current.slice(0, -1)];
22
22
  updateDialogEntries(updatedPanels);
23
23
 
24
24
  }, [dialogEntries]);
25
25
 
26
- const open = useCallback((dialogEntry: DialogControllerEntryProps) => {
26
+ const open = useCallback(<T extends object = object>(dialogEntry: DialogControllerEntryProps<T>) => {
27
27
 
28
- const updatedPanels = [...dialogEntries, dialogEntry];
28
+ const updatedPanels = [...dialogEntriesRef.current, dialogEntry];
29
29
  updateDialogEntries(updatedPanels);
30
30
 
31
31
  return {
@@ -46,6 +46,7 @@ export const DialogsProvider: React.FC<PropsWithChildren<{}>> = ({ children }) =
46
46
  key={`dialog_${i}`}
47
47
  open={true}
48
48
  closeDialog={close}
49
+ {...entry.props}
49
50
  />)}
50
51
  </DialogsControllerContext.Provider>
51
52
  );
@@ -3,10 +3,8 @@ import { ModeController } from "../hooks";
3
3
 
4
4
  const DEFAULT_MODE_STATE: ModeController = {
5
5
  mode: "light",
6
- setMode: (mode: "light" | "dark") => {
6
+ setMode: (mode: "light" | "dark" | "system") => {
7
7
  },
8
- toggleMode: () => {
9
- }
10
8
  };
11
9
  export const ModeControllerContext = React.createContext<ModeController>(DEFAULT_MODE_STATE);
12
10
 
@@ -1,3 +1,5 @@
1
+ "use client";
2
+
1
3
  import React, { PropsWithChildren } from "react";
2
4
  import { SnackbarProvider as NotistackSnackbarProvider } from "notistack";
3
5
 
@@ -0,0 +1,207 @@
1
+ import React from "react";
2
+
3
+ import { Link, useNavigate } from "react-router-dom";
4
+ import { ErrorBoundary, FireCMSLogo } from "../components";
5
+ import {
6
+ Avatar,
7
+ BrightnessMediumIcon,
8
+ cls,
9
+ DarkModeIcon,
10
+ IconButton,
11
+ LightModeIcon,
12
+ LogoutIcon,
13
+ Menu,
14
+ MenuItem,
15
+ Skeleton,
16
+ Typography
17
+ } from "@firecms/ui";
18
+ import { useAuthController, useLargeLayout, useModeController, useNavigationController } from "../hooks";
19
+ import { User } from "../types";
20
+ import { useApp } from "../app/useApp";
21
+ import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
22
+
23
+ export type DefaultAppBarProps<ADDITIONAL_PROPS = object> = {
24
+
25
+ title?: React.ReactNode;
26
+ /**
27
+ * A component that gets rendered on the upper side of the main toolbar
28
+ */
29
+ endAdornment?: React.ReactNode;
30
+
31
+ startAdornment?: React.ReactNode;
32
+
33
+ dropDownActions?: React.ReactNode;
34
+
35
+ includeModeToggle?: boolean;
36
+
37
+ className?: string;
38
+
39
+ style?: React.CSSProperties;
40
+
41
+ logo?: string;
42
+
43
+ user?: User;
44
+ } & ADDITIONAL_PROPS;
45
+
46
+ /**
47
+ * This component renders the main app bar of FireCMS.
48
+ * You will likely not need to use this component directly.
49
+ *
50
+
51
+ */
52
+ export const DefaultAppBar = function DefaultAppBar({
53
+ title,
54
+ endAdornment,
55
+ startAdornment,
56
+ dropDownActions,
57
+ includeModeToggle = true,
58
+ className,
59
+ style,
60
+ user: userProp
61
+ }: DefaultAppBarProps) {
62
+
63
+ const {
64
+ hasDrawer,
65
+ drawerOpen,
66
+ logo
67
+ } = useApp();
68
+ const navigation = useNavigationController();
69
+
70
+ const breadcrumbs = useBreadcrumbsController();
71
+
72
+ const authController = useAuthController();
73
+ const {
74
+ mode,
75
+ setMode
76
+ } = useModeController();
77
+
78
+ const navigate = useNavigate();
79
+
80
+ const largeLayout = useLargeLayout();
81
+
82
+ const user = userProp ?? authController.user;
83
+
84
+ let avatarComponent: JSX.Element | null;
85
+
86
+ if (user) {
87
+ const initial = user?.displayName
88
+ ? user.displayName[0].toUpperCase()
89
+ : (user?.email ? user.email[0].toUpperCase() : "A");
90
+ avatarComponent = <Avatar src={user.photoURL ?? undefined}>
91
+ {initial}
92
+ </Avatar>;
93
+ } else if (user === undefined || authController.initialLoading) {
94
+ avatarComponent = <div className={"p-1 flex justify-center"}>
95
+ <Skeleton className={"w-10 h-10 rounded-full"}/>
96
+ </div>;
97
+ } else {
98
+ avatarComponent = null;
99
+ }
100
+
101
+ return (
102
+ <div
103
+ style={style}
104
+ className={cls("w-full h-16 transition-all ease-in duration-75 absolute top-0 max-w-full overflow-x-auto no-scrollbar",
105
+ "flex flex-row gap-2 px-4 items-center",
106
+ {
107
+ "pl-[19rem]": drawerOpen && largeLayout,
108
+ "pl-24": hasDrawer && !(drawerOpen && largeLayout),
109
+ "z-10": largeLayout,
110
+ "duration-100": drawerOpen && largeLayout,
111
+ },
112
+ className)}>
113
+
114
+
115
+ {navigation && <div className="mr-2 hidden lg:block">
116
+ <Link
117
+ className="visited:text-inherit visited:dark:text-inherit block"
118
+ to={navigation?.basePath ?? "/"}
119
+ >
120
+ <div className={"flex flex-row gap-4"}>
121
+ {!hasDrawer && (logo
122
+ ? <img src={logo}
123
+ alt="Logo"
124
+ className={cls("w-[32px] h-[32px] object-contain")}/>
125
+ : <FireCMSLogo width={"32px"} height={"32px"}/>)}
126
+
127
+ {typeof title === "string"
128
+ ? <Typography variant="subtitle1"
129
+ noWrap>
130
+ {title}
131
+ </Typography>
132
+ : title}
133
+ </div>
134
+ </Link>
135
+ </div>}
136
+
137
+ {breadcrumbs.breadcrumbs && <div className="mr-8 hidden lg:block">
138
+ <div className={"flex flex-row gap-2"}>
139
+ {breadcrumbs.breadcrumbs.map((breadcrumb, index) => {
140
+ return <React.Fragment key={breadcrumb.url + "_" + index}>
141
+ <Typography variant={"caption"} color={"secondary"}>
142
+ /
143
+ </Typography>
144
+ <Link
145
+ key={index}
146
+ className="visited:text-inherit visited:dark:text-inherit block"
147
+ to={breadcrumb.url}
148
+ >
149
+ <Typography variant={"caption"} color={"secondary"}>
150
+ {breadcrumb.title}
151
+ </Typography>
152
+ </Link>
153
+ </React.Fragment>;
154
+ })}
155
+ </div>
156
+ </div>}
157
+
158
+ {startAdornment}
159
+
160
+ <div className={"flex-grow"}/>
161
+
162
+ {endAdornment &&
163
+ <ErrorBoundary>
164
+ {endAdornment}
165
+ </ErrorBoundary>}
166
+
167
+ {includeModeToggle &&
168
+ <Menu
169
+ trigger={<IconButton
170
+ color="inherit"
171
+ aria-label="Open drawer"
172
+ size="large">
173
+ {mode === "dark"
174
+ ? <DarkModeIcon/>
175
+ : <LightModeIcon/>}
176
+ </IconButton>}>
177
+ <MenuItem onClick={() => setMode("dark")}><DarkModeIcon size={"smallest"}/> Dark</MenuItem>
178
+ <MenuItem onClick={() => setMode("light")}><LightModeIcon size={"smallest"}/> Light </MenuItem>
179
+ <MenuItem onClick={() => setMode("system")}> <BrightnessMediumIcon size={"smallest"}/>System</MenuItem>
180
+ </Menu>}
181
+
182
+ <Menu trigger={avatarComponent}>
183
+ {user && <div className={"px-4 py-2 mb-2"}>
184
+ {user.displayName && <Typography variant={"body1"} color={"secondary"}>
185
+ {user.displayName}
186
+ </Typography>}
187
+ {user.email && <Typography variant={"body2"} color={"secondary"}>
188
+ {user.email}
189
+ </Typography>}
190
+ </div>}
191
+
192
+ {dropDownActions}
193
+
194
+ {!dropDownActions && <MenuItem onClick={async () => {
195
+ await authController.signOut();
196
+ // replace current route with home
197
+ navigate("/");
198
+ }}>
199
+ <LogoutIcon/>
200
+ Log Out
201
+ </MenuItem>}
202
+
203
+ </Menu>
204
+
205
+ </div>
206
+ );
207
+ }
@@ -0,0 +1,185 @@
1
+ import React, { useCallback } from "react";
2
+
3
+ import { useLargeLayout, useNavigationController } from "../hooks";
4
+
5
+ import { Link, useNavigate } from "react-router-dom";
6
+ import { CMSAnalyticsEvent, TopNavigationEntry, TopNavigationResult } from "../types";
7
+ import { IconForView } from "../util";
8
+ import { cls, IconButton, Menu, MenuItem, MoreVertIcon, Tooltip, Typography } from "@firecms/ui";
9
+ import { useAnalyticsController } from "../hooks/useAnalyticsController";
10
+ import { DrawerNavigationItem } from "./DrawerNavigationItem";
11
+ import { FireCMSLogo } from "../components";
12
+ import { useApp } from "../app/useApp";
13
+
14
+ /**
15
+ * Default drawer used in the CMS
16
+ * @group Core
17
+ */
18
+ export function DefaultDrawer({
19
+ className,
20
+ style,
21
+ }: {
22
+ className?: string
23
+ style?: React.CSSProperties,
24
+ }) {
25
+
26
+ const {
27
+ drawerHovered,
28
+ drawerOpen,
29
+ closeDrawer,
30
+ logo
31
+ } = useApp();
32
+
33
+ const [adminMenuOpen, setAdminMenuOpen] = React.useState(false);
34
+
35
+ const analyticsController = useAnalyticsController();
36
+ const navigation = useNavigationController();
37
+
38
+ const tooltipsOpen = drawerHovered && !drawerOpen && !adminMenuOpen;
39
+ const largeLayout = useLargeLayout();
40
+ const navigate = useNavigate();
41
+
42
+ if (!navigation.topLevelNavigation)
43
+ throw Error("Navigation not ready in Drawer");
44
+
45
+ const {
46
+ navigationEntries,
47
+ groups
48
+ }: TopNavigationResult = navigation.topLevelNavigation;
49
+
50
+ const adminViews = navigationEntries.filter(e => e.type === "admin") ?? [];
51
+ const groupsWithoutAdmin = groups.filter(g => g !== "Admin");
52
+
53
+ const buildGroupHeader = useCallback((group?: string) => {
54
+ if (!drawerOpen) return <div className="w-full"/>;
55
+ return <div
56
+ className="pl-6 pr-8 py-4 flex flex-row items-center">
57
+ <Typography variant={"caption"}
58
+ color={"secondary"}
59
+ className="font-medium flex-grow line-clamp-1">
60
+ {group ? group.toUpperCase() : "Views".toUpperCase()}
61
+ </Typography>
62
+
63
+ </div>;
64
+ }, [drawerOpen]);
65
+
66
+ const onClick = (view: TopNavigationEntry) => {
67
+ const eventName: CMSAnalyticsEvent = view.type === "collection"
68
+ ? "drawer_navigate_to_collection"
69
+ : (view.type === "view" ? "drawer_navigate_to_view" : "unmapped_event");
70
+ analyticsController.onAnalyticsEvent?.(eventName, { url: view.url });
71
+ if (!largeLayout)
72
+ closeDrawer();
73
+ };
74
+
75
+ return (
76
+ <>
77
+ <div className={cls("flex flex-col h-full relative flex-grow w-full", className)} style={style}>
78
+
79
+ <DrawerLogo logo={logo}/>
80
+
81
+ <div className={"mt-4 flex-grow overflow-scroll no-scrollbar"}
82
+ style={{
83
+ maskImage: "linear-gradient(to bottom, transparent 0, black 20px, black calc(100% - 20px), transparent 100%)",
84
+ }}>
85
+
86
+ {groupsWithoutAdmin.map((group) => (
87
+ <div
88
+ className={"bg-surface-50 dark:bg-surface-800 dark:bg-opacity-30 my-4 rounded-lg ml-3 mr-1"}
89
+ key={`drawer_group_${group}`}>
90
+ {buildGroupHeader(group)}
91
+ {Object.values(navigationEntries)
92
+ .filter(e => e.group === group)
93
+ .map((view, index) =>
94
+ <DrawerNavigationItem
95
+ key={`navigation_${index}`}
96
+ icon={<IconForView collectionOrView={view.collection ?? view.view}
97
+ size={"small"}/>}
98
+ tooltipsOpen={tooltipsOpen}
99
+ adminMenuOpen={adminMenuOpen}
100
+ drawerOpen={drawerOpen}
101
+ onClick={() => onClick(view)}
102
+ url={view.url}
103
+ name={view.name}/>)}
104
+ </div>
105
+ ))}
106
+
107
+ </div>
108
+
109
+ {adminViews.length > 0 && <Menu
110
+ side={"right"}
111
+ open={adminMenuOpen}
112
+ onOpenChange={setAdminMenuOpen}
113
+ trigger={
114
+ <IconButton
115
+ shape={"square"}
116
+ className={"m-4 text-surface-900 dark:text-white w-fit"}>
117
+ <Tooltip title={"Admin"}
118
+ open={tooltipsOpen}
119
+ side={"right"} sideOffset={28}>
120
+ <MoreVertIcon/>
121
+ </Tooltip>
122
+ {drawerOpen && <div
123
+ className={cls(
124
+ drawerOpen ? "opacity-100" : "opacity-0 hidden",
125
+ "mx-4 font-inherit text-inherit"
126
+ )}>
127
+ ADMIN
128
+ </div>}
129
+ </IconButton>}
130
+ >
131
+ {adminViews.map((entry, index) =>
132
+ <MenuItem
133
+ onClick={(event) => {
134
+ event.preventDefault();
135
+ navigate(entry.path);
136
+ }}
137
+ key={`navigation_${index}`}>
138
+ {<IconForView collectionOrView={entry.view}/>}
139
+ {entry.name}
140
+ </MenuItem>)}
141
+
142
+ </Menu>}
143
+ </div>
144
+
145
+ </>
146
+ );
147
+ }
148
+
149
+ /**
150
+ * This is the logo displayed in the drawer
151
+ * It expands when the drawer is open.
152
+ *
153
+ * @param logo
154
+
155
+ */
156
+ export function DrawerLogo({ logo }: {
157
+ logo?: string;
158
+ }) {
159
+
160
+ const navigation = useNavigationController();
161
+ const { drawerOpen } = useApp();
162
+ return <div
163
+ style={{
164
+ transition: "padding 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms",
165
+ padding: drawerOpen ? "32px 144px 0px 24px" : "72px 12px 0px 12px"
166
+ }}
167
+ className={cls("cursor-pointer rounded ml-3 mr-1")}>
168
+
169
+ <Tooltip title={"Home"}
170
+ sideOffset={20}
171
+ side="right">
172
+ <Link
173
+ className={"block"}
174
+ to={navigation.basePath}>
175
+ {logo
176
+ ? <img src={logo}
177
+ alt="Logo"
178
+ className={cls("max-w-full max-h-full transition-all object-contain",
179
+ drawerOpen ? "w-[96px] h-[96px]" : "w-[32px] h-[32px]")}/>
180
+ : <FireCMSLogo/>}
181
+
182
+ </Link>
183
+ </Tooltip>
184
+ </div>;
185
+ }
@@ -0,0 +1,66 @@
1
+ import React from "react";
2
+
3
+ import { NavLink } from "react-router-dom";
4
+ import { cls, Tooltip } from "@firecms/ui";
5
+
6
+ export function DrawerNavigationItem({
7
+ name,
8
+ icon,
9
+ drawerOpen,
10
+ adminMenuOpen,
11
+ tooltipsOpen,
12
+ url,
13
+ onClick
14
+ }: {
15
+ icon: React.ReactElement,
16
+ name: string,
17
+ tooltipsOpen: boolean,
18
+ drawerOpen: boolean,
19
+ adminMenuOpen?: boolean,
20
+ url: string,
21
+ onClick?: () => void,
22
+ }) {
23
+
24
+ const iconWrap = <div
25
+ className={"text-text-secondary dark:text-text-secondary-dark"}>
26
+ {icon}
27
+ </div>;
28
+
29
+ const listItem = <div>
30
+ <NavLink
31
+ onClick={onClick}
32
+ style={{
33
+ width: "100%",
34
+ transition: drawerOpen ? "width 150ms ease-in" : undefined
35
+ }}
36
+ className={({ isActive }: any) => cls("rounded-lg truncate",
37
+ "hover:bg-surface-accent-300 hover:bg-opacity-75 dark:hover:bg-surface-accent-800 dark:hover:bg-opacity-75 text-text-primary dark:text-surface-200 hover:text-surface-900 hover:dark:text-white",
38
+ "flex flex-row items-center mr-8",
39
+ // "transition-all ease-in-out delay-100 duration-300",
40
+ // drawerOpen ? "w-full" : "w-18",
41
+ drawerOpen ? "pl-4 h-12" : "pl-4 h-11",
42
+ "font-semibold text-xs",
43
+ isActive ? "bg-surface-accent-200 bg-opacity-60 dark:bg-surface-800 dark:bg-opacity-50" : ""
44
+ )}
45
+ to={url}
46
+ >
47
+
48
+ {iconWrap}
49
+
50
+ <div
51
+ className={cls(
52
+ drawerOpen ? "opacity-100" : "opacity-0 hidden",
53
+ "ml-4 font-inherit text-inherit"
54
+ )}>
55
+ {name.toUpperCase()}
56
+ </div>
57
+ </NavLink>
58
+ </div>;
59
+
60
+ return <Tooltip
61
+ open={drawerOpen || adminMenuOpen ? false : tooltipsOpen}
62
+ side="right"
63
+ title={name}>
64
+ {listItem}
65
+ </Tooltip>;
66
+ }