@firecms/core 3.0.0-canary.99 → 3.0.0-rc.2

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 (371) hide show
  1. package/README.md +2 -2
  2. package/dist/app/Drawer.d.ts +0 -1
  3. package/dist/app/Scaffold.d.ts +4 -0
  4. package/dist/components/ArrayContainer.d.ts +31 -12
  5. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  6. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +3 -1
  7. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  8. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +17 -3
  9. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +1 -1
  10. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  11. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +6 -3
  12. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +8 -0
  13. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  14. package/dist/components/EntityJsonPreview.d.ts +3 -0
  15. package/dist/components/EntityPreview.d.ts +8 -6
  16. package/dist/components/HomePage/DefaultHomePage.d.ts +2 -15
  17. package/dist/components/HomePage/HomePageDnD.d.ts +76 -0
  18. package/dist/components/HomePage/NavigationCard.d.ts +3 -1
  19. package/dist/components/HomePage/NavigationCardBinding.d.ts +3 -2
  20. package/dist/components/HomePage/NavigationGroup.d.ts +8 -1
  21. package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
  22. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  23. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  24. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  25. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +1 -1
  26. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  27. package/dist/components/UserDisplay.d.ts +7 -0
  28. package/dist/components/VirtualTable/VirtualTableProps.d.ts +11 -2
  29. package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
  30. package/dist/components/common/default_entity_actions.d.ts +0 -2
  31. package/dist/components/common/index.d.ts +1 -1
  32. package/dist/components/common/useColumnsIds.d.ts +1 -0
  33. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +10 -2
  34. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  35. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  36. package/dist/components/index.d.ts +3 -1
  37. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  38. package/dist/contexts/InternalUserManagementContext.d.ts +3 -0
  39. package/dist/core/DefaultAppBar.d.ts +8 -2
  40. package/dist/core/DrawerNavigationItem.d.ts +2 -1
  41. package/dist/core/EntityEditView.d.ts +40 -22
  42. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  43. package/dist/core/FireCMS.d.ts +2 -3
  44. package/dist/core/FireCMSRouter.d.ts +4 -0
  45. package/dist/core/NavigationRoutes.d.ts +0 -1
  46. package/dist/core/SideDialogs.d.ts +4 -2
  47. package/dist/core/field_configs.d.ts +1 -1
  48. package/dist/core/index.d.ts +2 -1
  49. package/dist/form/EntityForm.d.ts +50 -0
  50. package/dist/form/EntityFormActions.d.ts +21 -0
  51. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  52. package/dist/form/components/FormEntry.d.ts +6 -0
  53. package/dist/form/components/FormLayout.d.ts +5 -0
  54. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  55. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  56. package/dist/form/components/index.d.ts +3 -1
  57. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  58. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  59. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  60. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  61. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  62. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  63. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  64. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  65. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  66. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  67. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  68. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +4 -10
  70. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  71. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +12 -0
  73. package/dist/form/index.d.ts +17 -16
  74. package/dist/form/useClearRestoreValue.d.ts +2 -2
  75. package/dist/hooks/data/delete.d.ts +4 -4
  76. package/dist/hooks/data/save.d.ts +3 -3
  77. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  78. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  79. package/dist/hooks/index.d.ts +2 -0
  80. package/dist/hooks/useAuthController.d.ts +1 -1
  81. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  82. package/dist/hooks/useBuildNavigationController.d.ts +57 -12
  83. package/dist/hooks/useCollapsedGroups.d.ts +9 -0
  84. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  85. package/dist/hooks/useInternalUserManagementController.d.ts +12 -0
  86. package/dist/hooks/useModeController.d.ts +1 -2
  87. package/dist/hooks/useProjectLog.d.ts +7 -1
  88. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  89. package/dist/hooks/useValidateAuthenticator.d.ts +3 -3
  90. package/dist/index.es.js +20480 -14434
  91. package/dist/index.es.js.map +1 -1
  92. package/dist/index.umd.js +20250 -14209
  93. package/dist/index.umd.js.map +1 -1
  94. package/dist/internal/useBuildDataSource.d.ts +3 -2
  95. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  96. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  97. package/dist/preview/PropertyPreviewProps.d.ts +1 -1
  98. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  99. package/dist/preview/components/ReferencePreview.d.ts +2 -2
  100. package/dist/preview/components/UserPreview.d.ts +8 -0
  101. package/dist/preview/index.d.ts +1 -0
  102. package/dist/preview/util.d.ts +3 -3
  103. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  104. package/dist/routes/FireCMSRoute.d.ts +1 -0
  105. package/dist/routes/HomePageRoute.d.ts +3 -0
  106. package/dist/types/analytics.d.ts +1 -1
  107. package/dist/types/auth.d.ts +7 -9
  108. package/dist/types/collections.d.ts +88 -25
  109. package/dist/types/customization_controller.d.ts +8 -0
  110. package/dist/types/datasource.d.ts +19 -17
  111. package/dist/types/dialogs_controller.d.ts +7 -3
  112. package/dist/types/entities.d.ts +7 -2
  113. package/dist/types/entity_actions.d.ts +58 -8
  114. package/dist/types/entity_callbacks.d.ts +16 -16
  115. package/dist/types/entity_overrides.d.ts +2 -2
  116. package/dist/types/export_import.d.ts +4 -4
  117. package/dist/types/fields.d.ts +43 -17
  118. package/dist/types/firecms.d.ts +31 -3
  119. package/dist/types/firecms_context.d.ts +17 -1
  120. package/dist/types/index.d.ts +1 -0
  121. package/dist/types/internal_user_management.d.ts +20 -0
  122. package/dist/types/navigation.d.ts +60 -17
  123. package/dist/types/permissions.d.ts +4 -4
  124. package/dist/types/plugins.d.ts +44 -9
  125. package/dist/types/properties.d.ts +74 -22
  126. package/dist/types/property_config.d.ts +1 -3
  127. package/dist/types/roles.d.ts +3 -0
  128. package/dist/types/side_dialogs_controller.d.ts +10 -0
  129. package/dist/types/side_entity_controller.d.ts +14 -1
  130. package/dist/types/storage.d.ts +75 -0
  131. package/dist/types/user.d.ts +2 -1
  132. package/dist/util/builders.d.ts +3 -3
  133. package/dist/util/callbacks.d.ts +2 -0
  134. package/dist/util/createFormexStub.d.ts +2 -0
  135. package/dist/util/entities.d.ts +2 -2
  136. package/dist/util/entity_actions.d.ts +2 -0
  137. package/dist/util/entity_cache.d.ts +23 -0
  138. package/dist/util/icon_synonyms.d.ts +0 -1
  139. package/dist/util/icons.d.ts +5 -2
  140. package/dist/util/index.d.ts +3 -0
  141. package/dist/util/navigation_from_path.d.ts +10 -1
  142. package/dist/util/navigation_utils.d.ts +13 -1
  143. package/dist/util/objects.d.ts +2 -1
  144. package/dist/util/permissions.d.ts +4 -4
  145. package/dist/util/property_utils.d.ts +4 -4
  146. package/dist/util/references.d.ts +2 -2
  147. package/dist/util/resolutions.d.ts +30 -6
  148. package/dist/util/storage.d.ts +1 -1
  149. package/dist/util/useStorageUploadController.d.ts +2 -2
  150. package/package.json +133 -125
  151. package/src/app/Drawer.tsx +0 -1
  152. package/src/app/Scaffold.tsx +33 -29
  153. package/src/components/ArrayContainer.tsx +447 -229
  154. package/src/components/CircularProgressCenter.tsx +1 -1
  155. package/src/components/ClearFilterSortButton.tsx +1 -1
  156. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
  157. package/src/components/DeleteEntityDialog.tsx +13 -20
  158. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -25
  159. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +23 -17
  160. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +20 -3
  161. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -9
  162. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +21 -16
  163. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +6 -12
  164. package/src/components/EntityCollectionTable/index.tsx +1 -1
  165. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +6 -6
  166. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +35 -26
  167. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  168. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +132 -101
  169. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
  170. package/src/components/EntityCollectionView/EntityCollectionView.tsx +178 -85
  171. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
  172. package/src/components/EntityCollectionView/useSelectionController.tsx +5 -4
  173. package/src/components/EntityCollectionView/utils.ts +19 -0
  174. package/src/components/EntityJsonPreview.tsx +66 -0
  175. package/src/components/EntityPreview.tsx +75 -57
  176. package/src/components/EntityView.tsx +8 -5
  177. package/src/components/ErrorView.tsx +3 -3
  178. package/src/components/FireCMSLogo.tsx +7 -51
  179. package/src/components/HomePage/DefaultHomePage.tsx +506 -161
  180. package/src/components/HomePage/FavouritesView.tsx +9 -14
  181. package/src/components/HomePage/HomePageDnD.tsx +600 -0
  182. package/src/components/HomePage/NavigationCard.tsx +47 -38
  183. package/src/components/HomePage/NavigationCardBinding.tsx +16 -15
  184. package/src/components/HomePage/NavigationGroup.tsx +144 -30
  185. package/src/components/HomePage/RenameGroupDialog.tsx +123 -0
  186. package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
  187. package/src/components/NotFoundPage.tsx +2 -2
  188. package/src/components/PropertyConfigBadge.tsx +10 -4
  189. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  190. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +22 -13
  191. package/src/components/SearchIconsView.tsx +2 -2
  192. package/src/components/SelectableTable/SelectableTable.tsx +154 -142
  193. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +4 -2
  194. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +10 -8
  195. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +60 -11
  196. package/src/components/UnsavedChangesDialog.tsx +46 -0
  197. package/src/components/UserDisplay.tsx +55 -0
  198. package/src/components/VirtualTable/VirtualTable.tsx +65 -44
  199. package/src/components/VirtualTable/VirtualTableCell.tsx +0 -8
  200. package/src/components/VirtualTable/VirtualTableHeader.tsx +8 -8
  201. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +1 -1
  202. package/src/components/VirtualTable/VirtualTableProps.tsx +12 -2
  203. package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
  204. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
  205. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
  206. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  207. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  208. package/src/components/VirtualTable/fields/VirtualTableUserSelect.tsx +99 -0
  209. package/src/components/common/default_entity_actions.tsx +62 -42
  210. package/src/components/common/index.ts +1 -1
  211. package/src/components/common/useColumnsIds.tsx +2 -9
  212. package/src/components/common/useDataSourceTableController.tsx +420 -0
  213. package/src/components/common/useDebouncedCallback.tsx +20 -0
  214. package/src/components/common/useScrollRestoration.tsx +68 -0
  215. package/src/components/common/useTableSearchHelper.ts +1 -0
  216. package/src/components/index.tsx +4 -1
  217. package/src/contexts/BreacrumbsContext.tsx +38 -0
  218. package/src/contexts/DialogsProvider.tsx +3 -2
  219. package/src/contexts/InternalUserManagementContext.tsx +4 -0
  220. package/src/contexts/ModeController.tsx +1 -3
  221. package/src/contexts/SnackbarProvider.tsx +2 -0
  222. package/src/core/DefaultAppBar.tsx +124 -85
  223. package/src/core/DefaultDrawer.tsx +30 -22
  224. package/src/core/DrawerNavigationItem.tsx +32 -28
  225. package/src/core/EntityEditView.tsx +388 -995
  226. package/src/core/EntityEditViewFormActions.tsx +329 -0
  227. package/src/core/EntitySidePanel.tsx +88 -20
  228. package/src/core/FireCMS.tsx +58 -28
  229. package/src/core/FireCMSRouter.tsx +17 -0
  230. package/src/core/NavigationRoutes.tsx +23 -32
  231. package/src/core/SideDialogs.tsx +22 -12
  232. package/src/core/field_configs.tsx +39 -11
  233. package/src/core/index.tsx +4 -2
  234. package/src/form/EntityForm.tsx +814 -0
  235. package/src/form/EntityFormActions.tsx +211 -0
  236. package/src/form/PropertyFieldBinding.tsx +59 -41
  237. package/src/form/components/CustomIdField.tsx +9 -3
  238. package/src/form/components/FieldHelperText.tsx +1 -1
  239. package/src/form/components/FormEntry.tsx +22 -0
  240. package/src/form/components/FormLayout.tsx +16 -0
  241. package/src/form/components/LabelWithIcon.tsx +30 -19
  242. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  243. package/src/form/components/StorageItemPreview.tsx +5 -4
  244. package/src/form/components/StorageUploadProgress.tsx +2 -3
  245. package/src/form/components/index.tsx +3 -1
  246. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +30 -18
  247. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -36
  248. package/src/form/field_bindings/BlockFieldBinding.tsx +55 -33
  249. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  250. package/src/form/field_bindings/KeyValueFieldBinding.tsx +19 -15
  251. package/src/form/field_bindings/MapFieldBinding.tsx +72 -62
  252. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
  253. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
  254. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +10 -8
  255. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  256. package/src/form/field_bindings/ReferenceFieldBinding.tsx +28 -19
  257. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -32
  258. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -13
  259. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +247 -168
  260. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  261. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  262. package/src/form/field_bindings/UserSelectFieldBinding.tsx +94 -0
  263. package/src/form/index.tsx +17 -37
  264. package/src/form/useClearRestoreValue.tsx +2 -2
  265. package/src/form/validation.ts +12 -6
  266. package/src/hooks/data/delete.ts +6 -5
  267. package/src/hooks/data/save.ts +26 -35
  268. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  269. package/src/hooks/data/useDataSource.tsx +10 -2
  270. package/src/hooks/data/useEntityFetch.tsx +10 -6
  271. package/src/hooks/index.tsx +3 -0
  272. package/src/hooks/useAuthController.tsx +1 -1
  273. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  274. package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
  275. package/src/hooks/useBuildModeController.tsx +15 -28
  276. package/src/hooks/useBuildNavigationController.tsx +386 -124
  277. package/src/hooks/useCollapsedGroups.ts +64 -0
  278. package/src/hooks/useFireCMSContext.tsx +9 -35
  279. package/src/hooks/useInternalUserManagementController.tsx +16 -0
  280. package/src/hooks/useLargeLayout.tsx +0 -35
  281. package/src/hooks/useModeController.tsx +1 -2
  282. package/src/hooks/useProjectLog.tsx +16 -5
  283. package/src/hooks/useResolvedNavigationFrom.tsx +9 -11
  284. package/src/hooks/useValidateAuthenticator.tsx +3 -3
  285. package/src/internal/useBuildDataSource.ts +67 -80
  286. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  287. package/src/internal/useBuildSideEntityController.tsx +149 -86
  288. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  289. package/src/preview/PropertyPreview.tsx +36 -12
  290. package/src/preview/PropertyPreviewProps.tsx +1 -1
  291. package/src/preview/components/BooleanPreview.tsx +1 -1
  292. package/src/preview/components/EmptyValue.tsx +1 -1
  293. package/src/preview/components/EnumValuesChip.tsx +1 -1
  294. package/src/preview/components/ImagePreview.tsx +10 -9
  295. package/src/preview/components/ReferencePreview.tsx +10 -18
  296. package/src/preview/components/UrlComponentPreview.tsx +20 -21
  297. package/src/preview/components/UserPreview.tsx +27 -0
  298. package/src/preview/index.ts +1 -0
  299. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -5
  300. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -4
  301. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -3
  302. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -3
  303. package/src/preview/property_previews/ArrayOneOfPreview.tsx +6 -4
  304. package/src/preview/property_previews/ArrayPropertyPreview.tsx +6 -4
  305. package/src/preview/property_previews/MapPropertyPreview.tsx +7 -6
  306. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  307. package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
  308. package/src/preview/util.ts +10 -10
  309. package/src/routes/CustomCMSRoute.tsx +21 -0
  310. package/src/routes/FireCMSRoute.tsx +246 -0
  311. package/src/routes/HomePageRoute.tsx +17 -0
  312. package/src/types/analytics.ts +3 -0
  313. package/src/types/auth.tsx +8 -12
  314. package/src/types/collections.ts +103 -28
  315. package/src/types/customization_controller.tsx +9 -0
  316. package/src/types/datasource.ts +21 -20
  317. package/src/types/dialogs_controller.tsx +7 -3
  318. package/src/types/entities.ts +10 -2
  319. package/src/types/entity_actions.tsx +71 -8
  320. package/src/types/entity_callbacks.ts +18 -18
  321. package/src/types/entity_overrides.tsx +2 -2
  322. package/src/types/export_import.ts +4 -4
  323. package/src/types/fields.tsx +52 -19
  324. package/src/types/firecms.tsx +34 -4
  325. package/src/types/firecms_context.tsx +18 -1
  326. package/src/types/index.ts +1 -0
  327. package/src/types/internal_user_management.ts +24 -0
  328. package/src/types/navigation.ts +76 -22
  329. package/src/types/permissions.ts +5 -5
  330. package/src/types/plugins.tsx +53 -9
  331. package/src/types/properties.ts +84 -22
  332. package/src/types/property_config.tsx +2 -2
  333. package/src/types/roles.ts +3 -0
  334. package/src/types/side_dialogs_controller.tsx +15 -0
  335. package/src/types/side_entity_controller.tsx +16 -1
  336. package/src/types/storage.ts +82 -0
  337. package/src/types/user.ts +3 -1
  338. package/src/util/builders.ts +10 -8
  339. package/src/util/callbacks.ts +119 -0
  340. package/src/util/createFormexStub.tsx +62 -0
  341. package/src/util/entities.ts +6 -4
  342. package/src/util/entity_actions.ts +28 -0
  343. package/src/util/entity_cache.ts +204 -0
  344. package/src/util/icon_list.ts +1 -1
  345. package/src/util/icon_synonyms.ts +0 -1
  346. package/src/util/icons.tsx +36 -11
  347. package/src/util/index.ts +3 -0
  348. package/src/util/join_collections.ts +9 -2
  349. package/src/util/make_properties_editable.ts +13 -5
  350. package/src/util/navigation_from_path.ts +33 -12
  351. package/src/util/navigation_utils.ts +135 -19
  352. package/src/util/objects.ts +74 -14
  353. package/src/util/parent_references_from_path.ts +3 -3
  354. package/src/util/permissions.ts +8 -8
  355. package/src/util/property_utils.tsx +17 -6
  356. package/src/util/references.ts +19 -8
  357. package/src/util/resolutions.ts +93 -24
  358. package/src/util/storage.ts +6 -2
  359. package/src/util/useStorageUploadController.tsx +74 -29
  360. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
  361. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  362. package/dist/form/PropertiesForm.d.ts +0 -8
  363. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  364. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  365. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
  366. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -27
  367. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -236
  368. package/src/form/PropertiesForm.tsx +0 -81
  369. package/src/form/components/FormikArrayContainer.tsx +0 -44
  370. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  371. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -1,4 +1,5 @@
1
1
  import { ArrowForwardIcon, Card, cls, Markdown, Typography, } from "@firecms/ui";
2
+ import React from "react"; // Import React
2
3
 
3
4
  export type NavigationCardProps = {
4
5
  name: string,
@@ -6,64 +7,72 @@ export type NavigationCardProps = {
6
7
  actions: React.ReactNode;
7
8
  icon: React.ReactNode;
8
9
  onClick?: () => void,
10
+ shrink?: boolean
9
11
  };
10
12
 
11
- export function NavigationCard({
13
+ // Wrap the component with React.memo
14
+ export const NavigationCard = React.memo(function NavigationCard({
12
15
  name,
13
16
  description,
14
17
  icon,
15
18
  actions,
16
19
  onClick,
20
+ shrink
17
21
  }: NavigationCardProps) {
18
22
 
19
- return (<Card
20
- className={cls("h-full p-4 cursor-pointer min-h-[230px]")}
21
- onClick={() => {
22
- onClick?.();
23
- }}>
23
+ return (
24
+ <Card
25
+ className={cls(
26
+ "h-full p-4 cursor-pointer min-h-[230px] transition-all duration-200 ease-in-out",
27
+ shrink && "w-full max-w-full min-h-0 scale-75"
28
+ )}
29
+ onClick={() => {
30
+ onClick?.();
31
+ }}
32
+ >
33
+
34
+ <div className="flex flex-col items-start h-full">
35
+ <div
36
+ className="flex-grow w-full">
24
37
 
25
- <div className="flex flex-col items-start h-full">
26
- <div
27
- className="flex-grow w-full">
38
+ <div
39
+ className="h-10 flex items-center w-full justify-between text-surface-300 dark:text-surface-600">
28
40
 
29
- <div
30
- className="h-10 flex items-center w-full justify-between text-gray-300 dark:text-gray-600">
41
+ {icon}
31
42
 
32
- {icon}
43
+ <div
44
+ className="flex items-center gap-1"
45
+ onClick={(event: React.MouseEvent) => {
46
+ event.preventDefault();
47
+ event.stopPropagation();
48
+ }}>
33
49
 
34
- <div
35
- className="flex items-center gap-1"
36
- onClick={(event: React.MouseEvent) => {
37
- event.preventDefault();
38
- event.stopPropagation();
39
- }}>
50
+ {actions}
40
51
 
41
- {actions}
52
+ </div>
42
53
 
43
54
  </div>
44
55
 
45
- </div>
46
-
47
- <Typography gutterBottom variant="h5"
48
- component="h2">
49
- {name}
50
- </Typography>
56
+ <Typography gutterBottom variant="h5"
57
+ component="h2">
58
+ {name}
59
+ </Typography>
51
60
 
52
- {description && <Typography variant="body2"
53
- color="secondary"
54
- component="div">
55
- <Markdown source={description} size={"small"}/>
56
- </Typography>}
57
- </div>
61
+ {description && <Typography variant="body2"
62
+ color="secondary"
63
+ component="div">
64
+ <Markdown source={description} size={"small"}/>
65
+ </Typography>}
66
+ </div>
58
67
 
59
- <div style={{ alignSelf: "flex-end" }}>
68
+ <div style={{ alignSelf: "flex-end" }}>
60
69
 
61
- <div className={"p-4"}>
62
- <ArrowForwardIcon className="text-primary"/>
70
+ <div className={"p-4"}>
71
+ <ArrowForwardIcon className="text-primary"/>
72
+ </div>
63
73
  </div>
64
- </div>
65
74
 
66
- </div>
75
+ </div>
67
76
 
68
- </Card>)
69
- }
77
+ </Card>)
78
+ });
@@ -1,12 +1,13 @@
1
1
  import { useNavigate } from "react-router-dom";
2
2
 
3
3
  import { useCustomizationController, useFireCMSContext } from "../../hooks";
4
- import { PluginHomePageActionsProps, TopNavigationEntry } from "../../types";
4
+ import { NavigationEntry, PluginHomePageActionsProps } from "../../types";
5
5
  import { IconForView } from "../../util";
6
6
  import { useUserConfigurationPersistence } from "../../hooks/useUserConfigurationPersistence";
7
- import { IconButton, StarBorderIcon, StarIcon } from "@firecms/ui";
7
+ import { IconButton, StarIcon } from "@firecms/ui";
8
8
  import { NavigationCard } from "./NavigationCard";
9
9
  import { SmallNavigationCard } from "./SmallNavigationCard";
10
+ import React from "react";
10
11
 
11
12
  /**
12
13
  * This is the component used in the home page to render a card for each
@@ -29,9 +30,11 @@ export function NavigationCardBinding({
29
30
  name,
30
31
  description,
31
32
  onClick,
32
- type
33
- }: TopNavigationEntry & {
34
- onClick?: () => void
33
+ type,
34
+ shrink
35
+ }: NavigationEntry & {
36
+ onClick?: () => void,
37
+ shrink?: boolean // <-- add shrink prop type
35
38
  }) {
36
39
 
37
40
  const userConfigurationPersistence = useUserConfigurationPersistence();
@@ -47,6 +50,7 @@ export function NavigationCardBinding({
47
50
  ? [
48
51
  <IconButton
49
52
  key={"favourite"}
53
+ size={"small"}
50
54
  onClick={(e) => {
51
55
  e.preventDefault();
52
56
  e.stopPropagation();
@@ -60,14 +64,9 @@ export function NavigationCardBinding({
60
64
  );
61
65
  }
62
66
  }}>
63
- {
64
- favourite
65
- ? <StarIcon
66
- size={18}
67
- className={"text-secondary"}/>
68
- : <StarBorderIcon
69
- size={18}
70
- className={"text-gray-400 dark:text-gray-500"}/>}
67
+ <StarIcon
68
+ size={"small"}
69
+ className={favourite ? "text-secondary" : "text-surface-400 dark:text-surface-500"}/>
71
70
  </IconButton>
72
71
  ]
73
72
  : [];
@@ -96,7 +95,7 @@ export function NavigationCardBinding({
96
95
  if (type === "admin") {
97
96
  return <SmallNavigationCard icon={collectionIcon}
98
97
  name={name}
99
- url={url}/>
98
+ url={url}/>;
100
99
  }
101
100
 
102
101
  return <NavigationCard
@@ -112,5 +111,7 @@ export function NavigationCardBinding({
112
111
  [path, ...(userConfigurationPersistence.recentlyVisitedPaths ?? []).filter(p => p !== path)]
113
112
  );
114
113
  }
115
- }}/>;
114
+ }}
115
+ shrink={shrink}
116
+ />;
116
117
  }
@@ -1,39 +1,153 @@
1
- import { PropsWithChildren } from "react";
2
- import { useUserConfigurationPersistence } from "../../hooks/useUserConfigurationPersistence";
3
- import { ExpandablePanel, Typography } from "@firecms/ui";
1
+ import React, { PropsWithChildren, useState } from "react";
2
+ import { cls, EditIcon, IconButton, Typography, ExpandablePanel } from "@firecms/ui";
4
3
 
5
4
  export function NavigationGroup({
6
5
  children,
7
- group
6
+ group,
7
+ minimised,
8
+ isPreview,
9
+ isPotentialCardDropTarget,
10
+ onEditGroup,
11
+ dndDisabled,
12
+ collapsed,
13
+ onToggleCollapsed
8
14
  }: PropsWithChildren<{
9
- group: string | undefined
15
+ group: string | undefined,
16
+ minimised?: boolean,
17
+ isPreview?: boolean,
18
+ isPotentialCardDropTarget?: boolean,
19
+ onEditGroup?: (groupName: string) => void;
20
+ dndDisabled?: boolean;
21
+ collapsed?: boolean;
22
+ onToggleCollapsed?: () => void;
10
23
  }>) {
11
- const userConfigurationPersistence = useUserConfigurationPersistence();
24
+
25
+ const [isHovered, setIsHovered] = useState(false);
26
+ const currentGroupName = group ?? "Views";
27
+
28
+ // Show caret only when not in preview and there is a toggle handler
29
+ const showCaret = !isPreview && !!onToggleCollapsed;
30
+
31
+ // Helper for the title content (left side)
32
+ const TitleContent = (
33
+ <div className={cls("flex items-center", isPreview ? "px-1 py-0.5" : "")}
34
+ >
35
+ <Typography
36
+ variant={isPreview ? "body2" : "caption"}
37
+ component={"h2"}
38
+ color="secondary"
39
+ className={cls(
40
+ "p-4 py-2 rounded",
41
+ "font-medium uppercase text-sm text-surface-600 dark:text-surface-400"
42
+ )}
43
+ >
44
+ {currentGroupName}
45
+ </Typography>
46
+ {!isPreview && onEditGroup && !dndDisabled && (
47
+ <IconButton
48
+ size="smallest"
49
+ onClick={(e) => {
50
+ e.stopPropagation(); // Prevent toggle on click
51
+ onEditGroup(currentGroupName);
52
+ }}
53
+ className={cls("ml-2 ", isHovered ? "opacity-100" : "opacity-0", "transition-opacity duration-100")}
54
+ >
55
+ <EditIcon size="smallest"/>
56
+ </IconButton>
57
+ )}
58
+ </div>
59
+ );
60
+
12
61
  return (
13
- <ExpandablePanel
14
- invisible={true}
15
- titleClassName={"font-medium text-sm text-gray-600 dark:text-gray-400"}
16
- className={"py-4"}
17
- initiallyExpanded={!(userConfigurationPersistence?.collapsedGroups ?? []).includes(group ?? "ungrouped")}
18
- onExpandedChange={expanded => {
19
- if (userConfigurationPersistence) {
20
-
21
- if (!expanded) {
22
- const paths = (userConfigurationPersistence.collapsedGroups ?? []).concat(group ?? "ungrouped");
23
- userConfigurationPersistence.setCollapsedGroups(paths);
24
- } else {
25
- userConfigurationPersistence.setCollapsedGroups((userConfigurationPersistence.collapsedGroups ?? []).filter(g => g !== (group ?? "ungrouped")));
62
+ <div className={cls(
63
+ !isPotentialCardDropTarget ? "my-10" : "my-6",
64
+ "transition-all duration-200 ease-in-out"
65
+ )}
66
+ >
67
+ {/* Preview: static header + content (no caret / no collapse) */}
68
+ {isPreview && (
69
+ <>
70
+ <div
71
+ className={cls(
72
+ "flex items-center justify-between w-full",
73
+ "p-4 py-2"
74
+ )}
75
+ onMouseEnter={() => setIsHovered(true)}
76
+ onMouseLeave={() => setIsHovered(false)}
77
+ >
78
+ {TitleContent}
79
+ </div>
80
+ {children}
81
+ </>
82
+ )}
83
+
84
+ {/* Interactive collapsible version when a toggle handler is provided */}
85
+ {!isPreview && showCaret && (
86
+ <ExpandablePanel
87
+ invisible
88
+ expanded={!collapsed}
89
+ onExpandedChange={(open) => {
90
+ if (open !== !collapsed) {
91
+ onToggleCollapsed?.();
92
+ }
93
+ }}
94
+ className={cls("mt-6")}
95
+ titleClassName={cls(
96
+ "min-h-0 p-0 border-none",
97
+ "rounded-t flex items-center justify-between w-full",
98
+ "hover:bg-transparent",
99
+ "cursor-pointer select-none"
100
+ )}
101
+ innerClassName={cls("mt-4", !minimised ? "pt-0" : "")}
102
+ title={
103
+ <div
104
+ onMouseEnter={() => setIsHovered(true)}
105
+ onMouseLeave={() => setIsHovered(false)}
106
+ className="flex items-center"
107
+ >
108
+ {TitleContent}
109
+ </div>
26
110
  }
27
- }
28
- }}
29
- title={<Typography color={"secondary"}
30
- className="font-medium ml-1">
31
- {group?.toUpperCase() ?? "Views".toUpperCase()}
32
- </Typography>}>
33
-
34
- <div className="mb-8">
35
- {children}
36
- </div>
37
- </ExpandablePanel>
111
+ >
112
+ {minimised ? (
113
+ <div className={cls("mt-4 p-8 bg-surface-accent-200 dark:bg-surface-accent-800 rounded-lg")}
114
+ style={{ minHeight: "50px" }}>
115
+ </div>
116
+ ) : (
117
+ <div className={cls("mt-4", !minimised ? "pt-0" : "")}>
118
+ {children}
119
+ </div>
120
+ )}
121
+ </ExpandablePanel>
122
+ )}
123
+
124
+ {/* Non-collapsible (no caret) runtime, keep old behavior */}
125
+ {!isPreview && !showCaret && (
126
+ <>
127
+ <div
128
+ className={cls(
129
+ "flex items-center justify-between w-full",
130
+ "mt-6"
131
+ )}
132
+ onMouseEnter={() => setIsHovered(true)}
133
+ onMouseLeave={() => setIsHovered(false)}
134
+ >
135
+ {TitleContent}
136
+ </div>
137
+
138
+ {!collapsed && (
139
+ minimised ? (
140
+ <div className={cls("mt-4 p-8 bg-surface-accent-200 dark:bg-surface-accent-800 rounded-lg")}
141
+ style={{ minHeight: "50px" }}>
142
+ </div>
143
+ ) : (
144
+ <div className={cls("mt-4", !minimised ? "pt-0" : "")}>
145
+ {children}
146
+ </div>
147
+ )
148
+ )}
149
+ </>
150
+ )}
151
+ </div>
38
152
  );
39
153
  }
@@ -0,0 +1,123 @@
1
+ import React, { useEffect, useRef, useState } from "react";
2
+ import { Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField } from "@firecms/ui";
3
+
4
+ interface RenameGroupDialogProps {
5
+ open: boolean;
6
+ initialName: string;
7
+ existingGroupNames: string[]; // Names of other existing groups to check for duplicates
8
+ onClose: () => void;
9
+ onRename: (newName: string) => void;
10
+ }
11
+
12
+ export function RenameGroupDialog({
13
+ open,
14
+ initialName,
15
+ existingGroupNames,
16
+ onClose,
17
+ onRename
18
+ }: RenameGroupDialogProps) {
19
+ const [name, setName] = useState(initialName);
20
+ const [error, setError] = useState<string | null>(null);
21
+ const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement | null>(null); // Create a ref for the input
22
+
23
+ useEffect(() => {
24
+ if (open) {
25
+ setName(initialName);
26
+ setError(null);
27
+ // Focus and select text when dialog opens
28
+ setTimeout(() => { // setTimeout to ensure the input is rendered and focusable
29
+ if (inputRef.current) {
30
+ inputRef.current.focus();
31
+ inputRef.current.select();
32
+ }
33
+ }, 100);
34
+ }
35
+ }, [initialName, open]);
36
+
37
+ const handleNameChange = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
38
+ const newName = event.target.value;
39
+ setName(newName);
40
+ if (!newName.trim()) {
41
+ setError("Group name cannot be empty.");
42
+ } else if (existingGroupNames.includes(newName.trim())) {
43
+ setError("This group name already exists.");
44
+ } else {
45
+ setError(null);
46
+ }
47
+ };
48
+
49
+ const handleSave = () => {
50
+ const trimmedName = name.trim();
51
+ if (!trimmedName) {
52
+ setError("Group name cannot be empty.");
53
+ return;
54
+ }
55
+ if (existingGroupNames.includes(trimmedName)) {
56
+ setError("This group name already exists.");
57
+ return;
58
+ }
59
+ if (!error) {
60
+ onRename(trimmedName);
61
+ onClose();
62
+ }
63
+ };
64
+
65
+ const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {
66
+ if (event.key === "Enter") {
67
+ event.preventDefault(); // Prevent default form submission behavior
68
+ const trimmedName = name.trim();
69
+ // We need to check the error state directly as well,
70
+ // because the error state might not have updated if the user types and immediately hits enter.
71
+ let currentError = null;
72
+ if (!trimmedName) {
73
+ currentError = "Group name cannot be empty.";
74
+ } else if (existingGroupNames.includes(trimmedName)) {
75
+ currentError = "This group name already exists.";
76
+ }
77
+
78
+ if (!currentError && trimmedName) {
79
+ handleSave();
80
+ } else if (currentError) {
81
+ setError(currentError); // Ensure error is displayed if trying to submit with Enter
82
+ }
83
+ }
84
+ };
85
+
86
+ const handleClose = () => {
87
+ setName(initialName);
88
+ setError(null);
89
+ onClose();
90
+ };
91
+
92
+ if (!open) return null;
93
+
94
+ return (
95
+ <Dialog open={open}>
96
+ <DialogTitle>Rename Group</DialogTitle>
97
+ <DialogContent>
98
+ <TextField
99
+ inputRef={inputRef} // Pass the ref to the TextField
100
+ label="Group Name"
101
+ value={name}
102
+ onChange={handleNameChange}
103
+ onKeyDown={handleKeyDown} // Added onKeyDown handler
104
+ error={!!error}
105
+ aria-describedby={error ? "group-name-error" : undefined}
106
+ />
107
+ {error && <p id="group-name-error" style={{ display: "none" }}>{error}</p>}
108
+ </DialogContent>
109
+ <DialogActions>
110
+ <Button onClick={onClose}
111
+ color={"primary"}
112
+ variant="text">
113
+ Cancel
114
+ </Button>
115
+ <Button onClick={handleSave}
116
+ color={"primary"}
117
+ disabled={!!error || !name.trim()}>
118
+ Save
119
+ </Button>
120
+ </DialogActions>
121
+ </Dialog>
122
+ );
123
+ }
@@ -1,4 +1,4 @@
1
- import { ArrowForwardIcon, cardClickableMixin, cardMixin, cls, focusedMixin, Typography, } from "@firecms/ui";
1
+ import { ArrowForwardIcon, cardClickableMixin, cardMixin, cls, Typography, } from "@firecms/ui";
2
2
 
3
3
  import { Link } from "react-router-dom";
4
4
 
@@ -21,7 +21,6 @@ export function SmallNavigationCard({
21
21
  tabIndex={0}
22
22
  className={cls(cardMixin,
23
23
  cardClickableMixin,
24
- focusedMixin,
25
24
  "cursor-pointer flex flex-row items-center px-4 py-2 text-inherit dark:text-inherit visited:text-inherit visited:dark:text-inherit hover:text-inherit hover:dark:text-inherit ")}
26
25
  to={url}
27
26
  >
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { Link as ReactLink } from "react-router-dom";
2
+ import { Link } from "react-router-dom";
3
3
  import { Button, Typography } from "@firecms/ui";
4
4
 
5
5
  export function NotFoundPage() {
@@ -17,7 +17,7 @@ export function NotFoundPage() {
17
17
  </Typography>
18
18
  <Button
19
19
  variant={"text"}
20
- component={ReactLink}
20
+ component={Link}
21
21
  to={"/"}>Back to home</Button>
22
22
  </div>
23
23
  </div>
@@ -2,16 +2,22 @@ import { getIconForWidget } from "../util";
2
2
  import { PropertyConfig } from "../types";
3
3
  import { getDefaultFieldConfig } from "../core";
4
4
 
5
- export function PropertyConfigBadge({ propertyConfig }: { propertyConfig: PropertyConfig | undefined }): React.ReactNode {
6
- const classes = "h-8 w-8 p-1 rounded-full shadow text-white";
5
+ export function PropertyConfigBadge({
6
+ propertyConfig,
7
+ disabled
8
+ }: {
9
+ propertyConfig: PropertyConfig | undefined,
10
+ disabled?: boolean
11
+ }): React.ReactNode {
12
+ const classes = "h-8 w-8 flex items-center justify-center rounded-full shadow text-white " + (disabled ? "bg-surface-400 dark:bg-surface-600" : "");
7
13
 
8
14
  const defaultPropertyConfig = typeof propertyConfig?.property === "object" ? getDefaultFieldConfig(propertyConfig.property) : undefined;
9
15
 
10
16
  return <div
11
17
  className={classes}
12
18
  style={{
13
- background: propertyConfig?.color ?? defaultPropertyConfig?.color ?? "#888"
19
+ background: !disabled ? (propertyConfig?.color ?? defaultPropertyConfig?.color ?? "#888") : undefined
14
20
  }}>
15
- {propertyConfig?.Icon ? getIconForWidget(propertyConfig, "medium") : getIconForWidget(defaultPropertyConfig, "medium")}
21
+ {propertyConfig?.Icon ? getIconForWidget(propertyConfig, "small") : getIconForWidget(defaultPropertyConfig, "small")}
16
22
  </div>
17
23
  }
@@ -0,0 +1,47 @@
1
+ import { ContentCopyIcon, IconButton, Tooltip, Typography } from "@firecms/ui";
2
+ import { useCallback, useState } from "react";
3
+
4
+ export function PropertyIdCopyTooltip({
5
+ propertyKey,
6
+ className,
7
+ children,
8
+ }: {
9
+ propertyKey: string,
10
+ className?: string,
11
+ children: React.ReactNode
12
+ }) {
13
+ return <Tooltip title={<PropertyIdCopyTooltipContent propertyKey={propertyKey}/>}
14
+ delayDuration={800}
15
+ side={"top"}
16
+ align={"start"}
17
+ sideOffset={8}
18
+ className={className}>
19
+ {children}
20
+ </Tooltip>
21
+
22
+ }
23
+
24
+ export function PropertyIdCopyTooltipContent({ propertyKey }: { propertyKey: string }) {
25
+
26
+ const [copied, setCopied] = useState(false);
27
+
28
+ return (
29
+ <div className={"flex flex-row gap-2 items-center justify-center text-white"}>
30
+ <div>
31
+ <Typography variant={"caption"} className={"min-w-20 text-surface-accent-400"}
32
+ color={"disabled"}>{copied ? "Copied" : "Property ID"}</Typography>
33
+ <Typography variant={"caption"} className={"text-white"}><code>{propertyKey}</code></Typography>
34
+ </div>
35
+ <IconButton size={"small"}>
36
+ <ContentCopyIcon size={"smallest"}
37
+ className={"text-white"}
38
+ onClick={useCallback(() => {
39
+ navigator.clipboard.writeText(propertyKey);
40
+ setCopied(true);
41
+ setTimeout(() => setCopied(false), 2000);
42
+ }, [propertyKey])}
43
+ />
44
+ </IconButton>
45
+ </div>
46
+ );
47
+ }