@firecms/core 3.0.0-canary.21 → 3.0.0-canary.211

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 (382) hide show
  1. package/README.md +3 -3
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +16 -0
  4. package/dist/app/Scaffold.d.ts +34 -0
  5. package/dist/app/index.d.ts +4 -0
  6. package/dist/app/useApp.d.ts +16 -0
  7. package/dist/components/ArrayContainer.d.ts +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/EntityJsonPreview.d.ts +3 -0
  25. package/dist/components/EntityPreview.d.ts +5 -4
  26. package/dist/components/ErrorView.d.ts +1 -1
  27. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  28. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  29. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  30. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  31. package/dist/components/ReferenceWidget.d.ts +3 -1
  32. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  33. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  34. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  35. package/dist/components/VirtualTable/VirtualTableProps.d.ts +28 -12
  36. package/dist/components/VirtualTable/types.d.ts +3 -3
  37. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  38. package/dist/components/common/index.d.ts +2 -1
  39. package/dist/components/common/table_height.d.ts +5 -0
  40. package/dist/components/common/types.d.ts +4 -6
  41. package/dist/components/common/useColumnsIds.d.ts +3 -1
  42. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  43. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  44. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  45. package/dist/components/index.d.ts +4 -2
  46. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  47. package/dist/core/DefaultAppBar.d.ts +29 -0
  48. package/dist/core/DefaultDrawer.d.ts +19 -0
  49. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  50. package/dist/core/EntityEditView.d.ts +35 -11
  51. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  52. package/dist/core/FireCMS.d.ts +3 -3
  53. package/dist/core/FireCMSRouter.d.ts +4 -0
  54. package/dist/core/NavigationRoutes.d.ts +2 -3
  55. package/dist/core/SideDialogs.d.ts +4 -2
  56. package/dist/core/index.d.ts +4 -4
  57. package/dist/form/EntityForm.d.ts +37 -69
  58. package/dist/form/EntityFormActions.d.ts +17 -0
  59. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  60. package/dist/form/components/ErrorFocus.d.ts +1 -1
  61. package/dist/form/components/FieldHelperText.d.ts +3 -3
  62. package/dist/form/components/FormEntry.d.ts +6 -0
  63. package/dist/form/components/FormLayout.d.ts +5 -0
  64. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  65. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  66. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  67. package/dist/form/components/index.d.ts +3 -1
  68. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  70. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  71. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  73. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  74. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  75. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  76. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  77. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  80. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  81. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  82. package/dist/form/index.d.ts +16 -18
  83. package/dist/form/useClearRestoreValue.d.ts +2 -2
  84. package/dist/hooks/data/delete.d.ts +4 -4
  85. package/dist/hooks/data/save.d.ts +4 -5
  86. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  87. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  88. package/dist/hooks/index.d.ts +1 -0
  89. package/dist/hooks/useAuthController.d.ts +1 -1
  90. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  91. package/dist/hooks/useBuildNavigationController.d.ts +7 -5
  92. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  93. package/dist/hooks/useModeController.d.ts +1 -2
  94. package/dist/hooks/useProjectLog.d.ts +8 -2
  95. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  96. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  97. package/dist/index.d.ts +1 -0
  98. package/dist/index.es.js +21921 -14330
  99. package/dist/index.es.js.map +1 -1
  100. package/dist/index.umd.js +24271 -588
  101. package/dist/index.umd.js.map +1 -1
  102. package/dist/internal/useBuildDataSource.d.ts +1 -16
  103. package/dist/internal/useBuildSideEntityController.d.ts +2 -2
  104. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  105. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  106. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  107. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  108. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  109. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  110. package/dist/preview/util.d.ts +3 -3
  111. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  112. package/dist/routes/FireCMSRoute.d.ts +1 -0
  113. package/dist/routes/HomePageRoute.d.ts +3 -0
  114. package/dist/types/auth.d.ts +8 -10
  115. package/dist/types/collections.d.ts +77 -22
  116. package/dist/types/datasource.d.ts +52 -36
  117. package/dist/types/dialogs_controller.d.ts +7 -3
  118. package/dist/types/entities.d.ts +7 -2
  119. package/dist/types/entity_actions.d.ts +28 -4
  120. package/dist/types/entity_callbacks.d.ts +16 -16
  121. package/dist/types/entity_overrides.d.ts +2 -2
  122. package/dist/types/export_import.d.ts +4 -4
  123. package/dist/types/fields.d.ts +71 -42
  124. package/dist/types/firecms.d.ts +6 -2
  125. package/dist/types/firecms_context.d.ts +1 -1
  126. package/dist/types/index.d.ts +0 -1
  127. package/dist/types/navigation.d.ts +32 -14
  128. package/dist/types/permissions.d.ts +4 -4
  129. package/dist/types/plugins.d.ts +23 -12
  130. package/dist/types/properties.d.ts +52 -24
  131. package/dist/types/property_config.d.ts +0 -2
  132. package/dist/types/side_dialogs_controller.d.ts +10 -0
  133. package/dist/types/side_entity_controller.d.ts +6 -1
  134. package/dist/types/storage.d.ts +86 -3
  135. package/dist/types/user.d.ts +1 -0
  136. package/dist/util/builders.d.ts +3 -3
  137. package/dist/util/entities.d.ts +3 -3
  138. package/dist/util/entity_actions.d.ts +2 -0
  139. package/dist/util/entity_cache.d.ts +23 -0
  140. package/dist/util/icon_list.d.ts +5 -1
  141. package/dist/util/icon_synonyms.d.ts +1 -98
  142. package/dist/util/icons.d.ts +6 -3
  143. package/dist/util/index.d.ts +2 -0
  144. package/dist/util/navigation_from_path.d.ts +6 -1
  145. package/dist/util/navigation_utils.d.ts +14 -3
  146. package/dist/util/objects.d.ts +2 -1
  147. package/dist/util/permissions.d.ts +4 -4
  148. package/dist/util/plurals.d.ts +0 -2
  149. package/dist/util/property_utils.d.ts +3 -3
  150. package/dist/util/resolutions.d.ts +36 -17
  151. package/dist/util/storage.d.ts +23 -2
  152. package/dist/util/useStorageUploadController.d.ts +3 -3
  153. package/package.json +62 -48
  154. package/src/app/AppBar.tsx +18 -0
  155. package/src/app/Drawer.tsx +24 -0
  156. package/src/app/Scaffold.tsx +253 -0
  157. package/src/app/index.ts +4 -0
  158. package/src/app/useApp.tsx +32 -0
  159. package/src/components/ArrayContainer.tsx +127 -41
  160. package/src/components/CircularProgressCenter.tsx +2 -2
  161. package/src/components/ClearFilterSortButton.tsx +41 -0
  162. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  163. package/src/components/DeleteEntityDialog.tsx +10 -19
  164. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +54 -37
  165. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  166. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  167. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
  168. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  169. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  170. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  171. package/src/components/EntityCollectionTable/index.tsx +1 -1
  172. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
  173. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  174. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  175. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +81 -80
  176. package/src/components/EntityCollectionView/EntityCollectionView.tsx +207 -113
  177. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  178. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  179. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  180. package/src/components/EntityCollectionView/utils.ts +19 -0
  181. package/src/components/EntityJsonPreview.tsx +66 -0
  182. package/src/components/EntityPreview.tsx +62 -52
  183. package/src/components/EntityView.tsx +10 -10
  184. package/src/components/ErrorView.tsx +4 -4
  185. package/src/components/HomePage/DefaultHomePage.tsx +26 -19
  186. package/src/components/HomePage/FavouritesView.tsx +6 -11
  187. package/src/components/HomePage/NavigationCard.tsx +3 -3
  188. package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
  189. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  190. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  191. package/src/components/NotFoundPage.tsx +2 -2
  192. package/src/components/PropertyConfigBadge.tsx +9 -3
  193. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  194. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +19 -13
  195. package/src/components/ReferenceWidget.tsx +21 -11
  196. package/src/components/SearchIconsView.tsx +10 -7
  197. package/src/components/SelectableTable/SelectableTable.tsx +27 -12
  198. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  199. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  200. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  201. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  202. package/src/components/UnsavedChangesDialog.tsx +42 -0
  203. package/src/components/VirtualTable/VirtualTable.tsx +96 -48
  204. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  205. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  206. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  207. package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
  208. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  209. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  210. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  211. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  212. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  213. package/src/components/VirtualTable/types.tsx +2 -3
  214. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +33 -40
  215. package/src/components/common/index.ts +2 -1
  216. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  217. package/src/components/common/types.tsx +4 -6
  218. package/src/components/common/useColumnsIds.tsx +24 -3
  219. package/src/components/common/useDataSourceTableController.tsx +420 -0
  220. package/src/components/common/useDebouncedCallback.tsx +20 -0
  221. package/src/components/common/useScrollRestoration.tsx +68 -0
  222. package/src/components/common/useTableSearchHelper.ts +53 -12
  223. package/src/components/index.tsx +4 -2
  224. package/src/contexts/BreacrumbsContext.tsx +38 -0
  225. package/src/contexts/DialogsProvider.tsx +5 -4
  226. package/src/contexts/ModeController.tsx +1 -3
  227. package/src/contexts/SnackbarProvider.tsx +2 -0
  228. package/src/core/DefaultAppBar.tsx +219 -0
  229. package/src/core/DefaultDrawer.tsx +185 -0
  230. package/src/core/DrawerNavigationItem.tsx +66 -0
  231. package/src/core/EntityEditView.tsx +345 -480
  232. package/src/core/EntityEditViewFormActions.tsx +199 -0
  233. package/src/core/EntitySidePanel.tsx +86 -17
  234. package/src/core/FireCMS.tsx +56 -49
  235. package/src/core/FireCMSRouter.tsx +17 -0
  236. package/src/core/NavigationRoutes.tsx +28 -38
  237. package/src/core/SideDialogs.tsx +22 -12
  238. package/src/core/field_configs.tsx +11 -12
  239. package/src/core/index.tsx +6 -5
  240. package/src/form/EntityForm.tsx +585 -539
  241. package/src/form/EntityFormActions.tsx +169 -0
  242. package/src/form/PropertyFieldBinding.tsx +85 -44
  243. package/src/form/components/CustomIdField.tsx +6 -2
  244. package/src/form/components/FieldHelperText.tsx +4 -4
  245. package/src/form/components/FormEntry.tsx +22 -0
  246. package/src/form/components/FormLayout.tsx +16 -0
  247. package/src/form/components/LabelWithIcon.tsx +30 -19
  248. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  249. package/src/form/components/StorageItemPreview.tsx +22 -12
  250. package/src/form/components/StorageUploadProgress.tsx +4 -5
  251. package/src/form/components/index.tsx +3 -1
  252. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +31 -19
  253. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
  254. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  255. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  256. package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
  257. package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
  258. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
  259. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  260. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  261. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  262. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -35
  263. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
  264. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +42 -50
  265. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  266. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  267. package/src/form/index.tsx +16 -37
  268. package/src/form/useClearRestoreValue.tsx +2 -2
  269. package/src/form/validation.ts +13 -23
  270. package/src/hooks/data/delete.ts +6 -5
  271. package/src/hooks/data/save.ts +13 -9
  272. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  273. package/src/hooks/data/useDataSource.tsx +11 -3
  274. package/src/hooks/data/useEntityFetch.tsx +10 -6
  275. package/src/hooks/index.tsx +1 -0
  276. package/src/hooks/useAuthController.tsx +1 -1
  277. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  278. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  279. package/src/hooks/useBuildModeController.tsx +22 -29
  280. package/src/hooks/useBuildNavigationController.tsx +159 -54
  281. package/src/hooks/useFireCMSContext.tsx +5 -5
  282. package/src/hooks/useLargeLayout.tsx +0 -35
  283. package/src/hooks/useModeController.tsx +1 -2
  284. package/src/hooks/useProjectLog.tsx +32 -10
  285. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  286. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  287. package/src/index.ts +1 -0
  288. package/src/internal/useBuildDataSource.ts +72 -82
  289. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  290. package/src/internal/useBuildSideEntityController.tsx +194 -73
  291. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  292. package/src/preview/PropertyPreview.tsx +17 -24
  293. package/src/preview/PropertyPreviewProps.tsx +7 -1
  294. package/src/preview/components/BooleanPreview.tsx +2 -2
  295. package/src/preview/components/EmptyValue.tsx +1 -1
  296. package/src/preview/components/EnumValuesChip.tsx +2 -2
  297. package/src/preview/components/ImagePreview.tsx +25 -36
  298. package/src/preview/components/ReferencePreview.tsx +22 -33
  299. package/src/preview/components/StorageThumbnail.tsx +5 -1
  300. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  301. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  302. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  303. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  304. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  305. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  306. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  307. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  308. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  309. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  310. package/src/preview/util.ts +10 -10
  311. package/src/routes/CustomCMSRoute.tsx +21 -0
  312. package/src/routes/FireCMSRoute.tsx +235 -0
  313. package/src/routes/HomePageRoute.tsx +17 -0
  314. package/src/types/auth.tsx +9 -13
  315. package/src/types/collections.ts +94 -27
  316. package/src/types/customization_controller.tsx +0 -1
  317. package/src/types/datasource.ts +61 -43
  318. package/src/types/dialogs_controller.tsx +7 -3
  319. package/src/types/entities.ts +12 -2
  320. package/src/types/entity_actions.tsx +32 -7
  321. package/src/types/entity_callbacks.ts +18 -18
  322. package/src/types/entity_overrides.tsx +2 -2
  323. package/src/types/export_import.ts +4 -4
  324. package/src/types/fields.tsx +81 -46
  325. package/src/types/firecms.tsx +7 -2
  326. package/src/types/firecms_context.tsx +1 -1
  327. package/src/types/index.ts +0 -1
  328. package/src/types/navigation.ts +38 -18
  329. package/src/types/permissions.ts +5 -5
  330. package/src/types/plugins.tsx +25 -14
  331. package/src/types/properties.ts +60 -25
  332. package/src/types/property_config.tsx +0 -2
  333. package/src/types/side_dialogs_controller.tsx +15 -0
  334. package/src/types/side_entity_controller.tsx +6 -1
  335. package/src/types/storage.ts +94 -3
  336. package/src/types/user.ts +2 -0
  337. package/src/util/builders.ts +10 -8
  338. package/src/util/entities.ts +9 -6
  339. package/src/util/entity_actions.ts +28 -0
  340. package/src/util/entity_cache.ts +204 -0
  341. package/src/util/enums.ts +1 -1
  342. package/src/util/icon_list.ts +16 -10
  343. package/src/util/icon_synonyms.ts +3 -100
  344. package/src/util/icons.tsx +17 -7
  345. package/src/util/index.ts +2 -0
  346. package/src/util/join_collections.ts +3 -0
  347. package/src/util/make_properties_editable.ts +13 -5
  348. package/src/util/navigation_from_path.ts +13 -6
  349. package/src/util/navigation_utils.ts +59 -7
  350. package/src/util/objects.ts +48 -28
  351. package/src/util/parent_references_from_path.ts +3 -3
  352. package/src/util/permissions.ts +9 -8
  353. package/src/util/plurals.ts +0 -2
  354. package/src/util/property_utils.tsx +11 -4
  355. package/src/util/references.ts +11 -2
  356. package/src/util/resolutions.ts +100 -46
  357. package/src/util/storage.ts +79 -21
  358. package/src/util/strings.ts +2 -2
  359. package/src/util/useStorageUploadController.tsx +71 -27
  360. package/dist/components/FireCMSAppBar.d.ts +0 -26
  361. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  362. package/dist/components/VirtualTable/common.d.ts +0 -2
  363. package/dist/core/Drawer.d.ts +0 -23
  364. package/dist/core/Scaffold.d.ts +0 -55
  365. package/dist/core/SideEntityView.d.ts +0 -7
  366. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  367. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  368. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  369. package/dist/internal/useLocaleConfig.d.ts +0 -1
  370. package/dist/types/appcheck.d.ts +0 -26
  371. package/src/components/FireCMSAppBar.tsx +0 -165
  372. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  373. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  374. package/src/core/Drawer.tsx +0 -191
  375. package/src/core/Scaffold.tsx +0 -281
  376. package/src/core/SideEntityView.tsx +0 -38
  377. package/src/form/components/FormikArrayContainer.tsx +0 -44
  378. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  379. package/src/internal/useBuildCustomizationController.tsx +0 -5
  380. package/src/internal/useLocaleConfig.tsx +0 -18
  381. package/src/types/appcheck.ts +0 -29
  382. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -0,0 +1,169 @@
1
+ import React from "react";
2
+ import { Entity, EntityAction, FireCMSContext, ResolvedEntityCollection, SideEntityController } from "../types";
3
+ import { Button, cls, defaultBorderMixin, DialogActions, IconButton, LoadingButton, Typography } from "@firecms/ui";
4
+ import { FormexController } from "@firecms/formex";
5
+ import { useFireCMSContext, useSideEntityController } from "../hooks";
6
+
7
+ export interface EntityFormActionsProps {
8
+ collection: ResolvedEntityCollection;
9
+ path: string;
10
+ entity?: Entity;
11
+ layout: "bottom" | "side";
12
+ savingError?: Error;
13
+ formex: FormexController<any>;
14
+ disabled: boolean;
15
+ status: "new" | "existing" | "copy";
16
+ pluginActions: React.ReactNode[];
17
+ openEntityMode: "side_panel" | "full_screen";
18
+ showDefaultActions?: boolean;
19
+ }
20
+
21
+ export function EntityFormActions({
22
+ collection,
23
+ entity,
24
+ layout,
25
+ savingError,
26
+ formex,
27
+ disabled,
28
+ status,
29
+ pluginActions,
30
+ openEntityMode
31
+ }: EntityFormActionsProps) {
32
+
33
+ const context = useFireCMSContext();
34
+ const sideEntityController = useSideEntityController();
35
+
36
+ return layout === "bottom"
37
+ ? buildBottomActions({
38
+ savingError,
39
+ entity,
40
+ collection,
41
+ context,
42
+ sideEntityController,
43
+ isSubmitting: formex.isSubmitting,
44
+ disabled,
45
+ status,
46
+ pluginActions,
47
+ openEntityMode
48
+ })
49
+ : buildSideActions({
50
+ savingError,
51
+ entity,
52
+ collection,
53
+ context,
54
+ sideEntityController,
55
+ isSubmitting: formex.isSubmitting,
56
+ disabled,
57
+ status,
58
+ pluginActions,
59
+ openEntityMode
60
+ });
61
+ }
62
+
63
+ type ActionsViewProps<M extends object> = {
64
+ savingError: Error | undefined,
65
+ entity: Entity<M> | undefined,
66
+ formActions?: EntityAction[],
67
+ collection: ResolvedEntityCollection,
68
+ context: FireCMSContext,
69
+ sideEntityController: SideEntityController,
70
+ isSubmitting: boolean,
71
+ disabled: boolean,
72
+ status: "new" | "existing" | "copy",
73
+ pluginActions?: React.ReactNode[],
74
+ openEntityMode: "side_panel" | "full_screen";
75
+ };
76
+
77
+ function buildBottomActions<M extends object>({
78
+ savingError,
79
+ entity,
80
+ formActions,
81
+ collection,
82
+ context,
83
+ sideEntityController,
84
+ isSubmitting,
85
+ disabled,
86
+ status,
87
+ pluginActions,
88
+ openEntityMode
89
+ }: ActionsViewProps<M>) {
90
+
91
+ return <DialogActions position={"absolute"}>
92
+ {savingError &&
93
+ <div className="text-right">
94
+ <Typography color={"error"}>{savingError.message}</Typography>
95
+ </div>
96
+ }
97
+ {entity && (formActions ?? []).length > 0 && <div className="flex-grow flex overflow-auto no-scrollbar">
98
+ {(formActions ?? []).map(action => (
99
+ <IconButton
100
+ key={action.name}
101
+ color="primary"
102
+ onClick={(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
103
+ event.stopPropagation();
104
+ if (entity)
105
+ action.onClick({
106
+ entity,
107
+ fullPath: collection.path,
108
+ collection: collection,
109
+ context,
110
+ sideEntityController,
111
+ openEntityMode: openEntityMode
112
+ });
113
+ }}>
114
+ {action.icon}
115
+ </IconButton>
116
+ ))}
117
+ </div>}
118
+ {pluginActions}
119
+ <Button variant="text" disabled={disabled || isSubmitting} type="reset">
120
+ {status === "existing" ? "Discard" : "Clear"}
121
+ </Button>
122
+ <Button variant={"filled"} color="primary" type="submit"
123
+ disabled={disabled || isSubmitting}>
124
+ {status === "existing" && "Save"}
125
+ {status === "copy" && "Create copy"}
126
+ {status === "new" && "Create"}
127
+ </Button>
128
+
129
+ </DialogActions>;
130
+ }
131
+
132
+ function buildSideActions<M extends object>({
133
+ savingError,
134
+ entity,
135
+ formActions,
136
+ collection,
137
+ context,
138
+ sideEntityController,
139
+ isSubmitting,
140
+ disabled,
141
+ status,
142
+ pluginActions
143
+ }: ActionsViewProps<M>) {
144
+
145
+ return <div
146
+ className={cls("overflow-auto h-full flex flex-col gap-2 w-80 2xl:w-96 px-4 py-16 sticky top-0 border-l", defaultBorderMixin)}>
147
+ <LoadingButton fullWidth={true}
148
+ variant="filled"
149
+ color="primary"
150
+ type="submit"
151
+ size={"large"}
152
+ disabled={disabled || isSubmitting}>
153
+ {status === "existing" && "Save"}
154
+ {status === "copy" && "Create copy"}
155
+ {status === "new" && "Create"}
156
+ </LoadingButton>
157
+ <Button fullWidth={true} variant="text" disabled={disabled || isSubmitting} type="reset">
158
+ {status === "existing" ? "Discard" : "Clear"}
159
+ </Button>
160
+
161
+ {pluginActions}
162
+
163
+ {savingError &&
164
+ <div className="text-right">
165
+ <Typography color={"error"}>{savingError.message}</Typography>
166
+ </div>
167
+ }
168
+ </div>;
169
+ }
@@ -5,13 +5,13 @@ import { Field, FieldProps as FormexFieldProps, getIn } from "@firecms/formex";
5
5
 
6
6
  import {
7
7
  CMSType,
8
- EntityCollection,
9
8
  FieldProps,
10
9
  FireCMSPlugin,
11
10
  PluginFieldBuilderParams,
12
11
  Property,
13
12
  PropertyFieldBindingProps,
14
13
  PropertyOrBuilder,
14
+ ResolvedEntityCollection,
15
15
  ResolvedProperty
16
16
  } from "../types";
17
17
  import { ReadOnlyFieldBinding } from "./field_bindings/ReadOnlyFieldBinding";
@@ -51,6 +51,13 @@ export const PropertyFieldBinding = React.memo(PropertyFieldBindingInternal, (a:
51
51
  if (a.propertyKey !== b.propertyKey) {
52
52
  return false;
53
53
  }
54
+ if (a.index !== b.index) {
55
+ return false;
56
+ }
57
+
58
+ if (a.size !== b.size) {
59
+ return false;
60
+ }
54
61
  const aIsBuilder = isPropertyBuilder(a.property) || a.property.fromBuilder;
55
62
  const bIsBuilder = isPropertyBuilder(b.property) || b.property.fromBuilder;
56
63
 
@@ -67,24 +74,27 @@ export const PropertyFieldBinding = React.memo(PropertyFieldBindingInternal, (a:
67
74
  return false;
68
75
  }) as typeof PropertyFieldBindingInternal;
69
76
 
70
- function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Record<string, any> = Record<string, any>>
77
+ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Record<string, any> = any>
71
78
  ({
72
79
  propertyKey,
73
80
  property,
74
81
  context,
75
82
  includeDescription,
76
83
  underlyingValueHasChanged,
77
- disabled,
78
- tableMode,
84
+ disabled: disabledProp,
79
85
  partOfArray,
80
- partOfBlock,
86
+ minimalistView,
81
87
  autoFocus,
88
+ index,
89
+ size,
90
+ onPropertyChange
82
91
  }: PropertyFieldBindingProps<T, M>): ReactElement<PropertyFieldBindingProps<T, M>> {
83
92
 
84
93
  const customizationController = useCustomizationController();
85
94
 
86
95
  return (
87
96
  <Field
97
+ key={propertyKey}
88
98
  name={propertyKey}
89
99
  >
90
100
  {(fieldProps) => {
@@ -92,14 +102,16 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
92
102
  let Component: ComponentType<FieldProps<T>> | undefined;
93
103
  const resolvedProperty: ResolvedProperty<T> | null = resolveProperty({
94
104
  propertyKey,
95
- propertyValue: fieldProps.field.value,
96
105
  propertyOrBuilder: property,
97
106
  values: fieldProps.form.values,
98
107
  path: context.path,
99
108
  entityId: context.entityId,
100
- fields: customizationController.propertyConfigs
109
+ propertyConfigs: customizationController.propertyConfigs,
110
+ index
101
111
  });
102
112
 
113
+ const disabled = disabledProp || isReadOnly(resolvedProperty) || Boolean(resolvedProperty?.disabled);
114
+
103
115
  if (resolvedProperty === null || isHidden(resolvedProperty)) {
104
116
  return <></>;
105
117
  } else if (isReadOnly(resolvedProperty)) {
@@ -111,16 +123,23 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
111
123
  } else {
112
124
  const propertyConfig = getFieldConfig(resolvedProperty, customizationController.propertyConfigs);
113
125
  if (!propertyConfig) {
114
- console.log("INTERNAL: Could not find field config for property", { propertyKey, resolvedProperty, fields: customizationController.propertyConfigs, propertyConfig });
126
+ console.log("INTERNAL: Could not find field config for property", {
127
+ propertyKey,
128
+ property,
129
+ resolvedProperty,
130
+ fields: customizationController.propertyConfigs,
131
+ propertyConfig
132
+ });
115
133
  throw new Error(`INTERNAL: Could not find field config for property ${propertyKey}`);
116
134
  }
117
135
  const configProperty = resolveProperty({
136
+ propertyKey,
118
137
  propertyOrBuilder: propertyConfig.property,
119
- propertyValue: fieldProps.field.value,
120
138
  values: fieldProps.form.values,
121
139
  path: context.path,
122
140
  entityId: context.entityId,
123
- fields: customizationController.propertyConfigs
141
+ propertyConfigs: customizationController.propertyConfigs,
142
+ index
124
143
  });
125
144
  Component = configProperty.Field as ComponentType<FieldProps<T>>;
126
145
  }
@@ -128,7 +147,9 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
128
147
  console.warn(`No field component found for property ${propertyKey}`);
129
148
  console.warn("Property:", property);
130
149
  return (
131
- <div>{`Currently the field ${resolvedProperty.dataType} is not supported`}</div>
150
+ <div className={"w-full"}>
151
+ {`Currently the field ${resolvedProperty.dataType} is not supported`}
152
+ </div>
132
153
  );
133
154
  }
134
155
 
@@ -139,23 +160,24 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
139
160
  underlyingValueHasChanged,
140
161
  context,
141
162
  disabled,
142
- tableMode,
143
163
  partOfArray,
144
- partOfBlock,
145
- autoFocus
164
+ minimalistView,
165
+ autoFocus,
166
+ size,
167
+ onPropertyChange
146
168
  };
147
169
 
148
170
  return <FieldInternal
149
171
  Component={Component as ComponentType<FieldProps>}
150
172
  componentProps={componentProps}
151
- fieldProps={fieldProps}/>;
173
+ formexFieldProps={fieldProps}/>;
152
174
  }}
153
175
  </Field>
154
176
  );
155
177
 
156
178
  }
157
179
 
158
- type ResolvedPropertyFieldBindingProps<T extends CMSType = CMSType, M extends Record<string, any> = Record<string, any>> =
180
+ type ResolvedPropertyFieldBindingProps<T extends CMSType = CMSType, M extends Record<string, any> = any> =
159
181
  Omit<PropertyFieldBindingProps<T, M>, "property">
160
182
  & {
161
183
  property: ResolvedProperty<T>
@@ -169,52 +191,59 @@ function FieldInternal<T extends CMSType, CustomProps, M extends Record<string,
169
191
  property,
170
192
  includeDescription,
171
193
  underlyingValueHasChanged,
172
- tableMode,
173
194
  partOfArray,
174
- partOfBlock,
195
+ minimalistView,
175
196
  autoFocus,
176
197
  context,
177
- disabled
198
+ disabled,
199
+ size,
200
+ onPropertyChange
178
201
  },
179
- fieldProps
202
+ formexFieldProps
180
203
  }:
181
- {
182
- Component: ComponentType<FieldProps<T, any, M>>,
183
- componentProps: ResolvedPropertyFieldBindingProps<T, M>,
184
- fieldProps: FormexFieldProps<T, any>
185
- }) {
204
+ {
205
+ Component: ComponentType<FieldProps<T, any, M>>,
206
+ componentProps: ResolvedPropertyFieldBindingProps<T, M>,
207
+ formexFieldProps: FormexFieldProps<T, any>
208
+ }) {
186
209
 
187
210
  const { plugins } = useCustomizationController();
188
211
 
189
212
  const customFieldProps: any = property.customProps;
190
- const value = fieldProps.field.value;
191
- // const initialValue = fieldProps.meta.initialValue;
192
- const error = getIn(fieldProps.form.errors, propertyKey);
193
- const touched = getIn(fieldProps.form.touched, propertyKey);
213
+ const value = formexFieldProps.field.value;
214
+ // const initialValue = formexFieldProps.meta.initialValue;
215
+ const error = getIn(formexFieldProps.form.errors, propertyKey);
216
+ const touched = getIn(formexFieldProps.form.touched, propertyKey);
194
217
 
195
218
  const showError: boolean = error &&
196
- (fieldProps.form.submitCount > 0 || property.validation?.unique) &&
219
+ (formexFieldProps.form.submitCount > 0 || property.validation?.unique) &&
197
220
  (!Array.isArray(error) || !!error.filter((e: any) => !!e).length);
198
221
 
199
- const WrappedComponent: ComponentType<FieldProps<T, any, M>> | null = useWrappedComponent(context.path, context.collection, propertyKey, property, Component, plugins);
222
+ const WrappedComponent: ComponentType<FieldProps<T, any, M>> | null = useWrappedComponent({
223
+ path: context.path,
224
+ collection: context.collection,
225
+ propertyKey: propertyKey,
226
+ property: property,
227
+ Component: Component,
228
+ plugins: plugins
229
+ });
200
230
  const UsedComponent: ComponentType<FieldProps<T>> = WrappedComponent ?? Component;
201
231
 
202
- const isSubmitting = fieldProps.form.isSubmitting;
232
+ const isSubmitting = formexFieldProps.form.isSubmitting;
203
233
 
204
234
  const setValue = useCallback((value: T | null, shouldValidate?: boolean) => {
205
- fieldProps.form.setFieldTouched(propertyKey, true, false);
206
- fieldProps.form.setFieldValue(propertyKey, value, shouldValidate);
235
+ formexFieldProps.form.setFieldTouched(propertyKey, true, false);
236
+ formexFieldProps.form.setFieldValue(propertyKey, value, shouldValidate);
207
237
  }, []);
208
238
 
209
239
  const setFieldValue = useCallback((otherPropertyKey: string, value: CMSType | null, shouldValidate?: boolean) => {
210
- fieldProps.form.setFieldTouched(propertyKey, true, false);
211
- fieldProps.form.setFieldValue(otherPropertyKey, value, shouldValidate);
240
+ formexFieldProps.form.setFieldTouched(propertyKey, true, false);
241
+ formexFieldProps.form.setFieldValue(otherPropertyKey, value, shouldValidate);
212
242
  }, []);
213
243
 
214
244
  const cmsFieldProps: FieldProps<T, CustomProps, M> = {
215
245
  propertyKey,
216
246
  value: value as T,
217
- // initialValue,
218
247
  setValue,
219
248
  setFieldValue,
220
249
  error,
@@ -225,12 +254,13 @@ function FieldInternal<T extends CMSType, CustomProps, M extends Record<string,
225
254
  property: property as ResolvedProperty<T>,
226
255
  disabled: disabled ?? false,
227
256
  underlyingValueHasChanged: underlyingValueHasChanged ?? false,
228
- tableMode: tableMode ?? false,
229
257
  partOfArray: partOfArray ?? false,
230
- partOfBlock: partOfBlock ?? false,
258
+ minimalistView: minimalistView ?? false,
231
259
  autoFocus: autoFocus ?? false,
232
260
  customProps: customFieldProps,
233
- context
261
+ context,
262
+ size,
263
+ onPropertyChange
234
264
  };
235
265
 
236
266
  return (
@@ -266,13 +296,24 @@ const shouldPropertyReRender = (property: PropertyOrBuilder | ResolvedProperty,
266
296
  }
267
297
  }
268
298
 
269
- function useWrappedComponent<T extends CMSType = CMSType, M extends Record<string, any> = any>(
270
- path: string,
271
- collection: EntityCollection<M>,
299
+ interface UseWrappedComponentParams<T extends CMSType = CMSType, M extends Record<string, any> = any> {
300
+ path?: string,
301
+ collection?: ResolvedEntityCollection<M>,
272
302
  propertyKey: string,
273
303
  property: ResolvedProperty<T>,
274
304
  Component: ComponentType<FieldProps<T, any, M>>,
275
305
  plugins?: FireCMSPlugin[]
306
+ }
307
+
308
+ function useWrappedComponent<T extends CMSType = CMSType, M extends Record<string, any> = any>(
309
+ {
310
+ path,
311
+ collection,
312
+ propertyKey,
313
+ property,
314
+ Component,
315
+ plugins
316
+ }: UseWrappedComponentParams<T, M>
276
317
  ): ComponentType<FieldProps<T, any, M>> | null {
277
318
 
278
319
  const wrapperRef = useRef<ComponentType<FieldProps<T, any, M>> | null>((() => {
@@ -288,7 +329,7 @@ function useWrappedComponent<T extends CMSType = CMSType, M extends Record<strin
288
329
  Field: Component,
289
330
  plugin,
290
331
  path,
291
- collection
332
+ collection,
292
333
  };
293
334
  const enabled = plugin.form?.fieldBuilderEnabled?.(params);
294
335
  if (enabled === undefined || enabled)
@@ -68,7 +68,8 @@ export function CustomIdField<M extends Record<string, any>>({
68
68
  ? (
69
69
  <>
70
70
 
71
- <Tooltip title={"Copy"}>
71
+ <Tooltip title={"Copy"}
72
+ asChild={true}>
72
73
  <IconButton onClick={(e) => copy(entity.id)}
73
74
  aria-label="copy-id">
74
75
  <ContentCopyIcon size={"small"}/>
@@ -76,7 +77,8 @@ export function CustomIdField<M extends Record<string, any>>({
76
77
  </Tooltip>
77
78
 
78
79
  {customizationController?.entityLinkBuilder &&
79
- <Tooltip title={"Open in the console"}>
80
+ <Tooltip title={"Open in the console"}
81
+ asChild={true}>
80
82
  <IconButton component={"a"}
81
83
  href={customizationController.entityLinkBuilder({ entity })}
82
84
  rel="noopener noreferrer"
@@ -98,7 +100,9 @@ export function CustomIdField<M extends Record<string, any>>({
98
100
 
99
101
  {enumValues &&
100
102
  <Select
103
+ size={"large"}
101
104
  error={error}
105
+ fullWidth={true}
102
106
  onValueChange={(v) => onChange(v as string)}
103
107
  {...fieldProps}
104
108
  renderValue={(option) => {
@@ -1,4 +1,4 @@
1
- import { ResolvedProperty } from "../../types";
1
+ import { Property, ResolvedProperty } from "../../types";
2
2
  import { IconButton, InfoIcon, Tooltip, Typography } from "@firecms/ui";
3
3
 
4
4
  /**
@@ -13,8 +13,8 @@ export function FieldHelperText({
13
13
  disabled
14
14
  }: {
15
15
  error?: string,
16
- showError: boolean,
17
- property: ResolvedProperty,
16
+ showError?: boolean,
17
+ property: ResolvedProperty | Property,
18
18
  includeDescription?: boolean,
19
19
  disabled?: boolean,
20
20
  }
@@ -44,7 +44,7 @@ export function FieldHelperText({
44
44
  {property.longDescription &&
45
45
  <Tooltip title={property.longDescription}
46
46
  side="bottom"
47
- >
47
+ asChild={true}>
48
48
  <IconButton
49
49
  size={"small"}
50
50
  className="self-start">
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ import { ErrorBoundary } from "../../components";
3
+
4
+ export function FormEntry({
5
+ propertyKey,
6
+ widthPercentage = 100,
7
+ children
8
+ }: {
9
+ propertyKey: string;
10
+ widthPercentage?: number;
11
+ children: React.ReactNode;
12
+ }) {
13
+ return (
14
+ <div id={`form_field_${propertyKey}`}
15
+ className={"relative"}
16
+ style={{ width: widthPercentage === 100 ? "100%" : `calc(${widthPercentage}% - 8px)` }}>
17
+ <ErrorBoundary>
18
+ {children}
19
+ </ErrorBoundary>
20
+ </div>
21
+ );
22
+ }
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+ import { cls } from "@firecms/ui";
3
+
4
+ export function FormLayout({
5
+ children,
6
+ className
7
+ }: {
8
+ children: React.ReactNode;
9
+ className?: string;
10
+ }) {
11
+ return (
12
+ <div className={cls("flex flex-wrap gap-x-4 w-full space-y-8", className)}>
13
+ {children}
14
+ </div>
15
+ );
16
+ }
@@ -1,4 +1,5 @@
1
- import React from "react";
1
+ import React, { forwardRef } from "react";
2
+ import { cls } from "@firecms/ui";
2
3
 
3
4
  interface LabelWithIconProps {
4
5
  icon: React.ReactNode;
@@ -12,22 +13,32 @@ interface LabelWithIconProps {
12
13
  * Render the label of with an icon and the title of a property
13
14
  * @group Form custom fields
14
15
  */
15
- export function LabelWithIcon({
16
- icon,
17
- title,
18
- small,
19
- className,
20
- required
21
- }: LabelWithIconProps) {
22
- return (
23
- <span
24
- className={`inline-flex items-center my-0.5 ${small ? "gap-1" : "gap-2"} ${className ?? ""}`}>
25
-
26
- {icon}
27
-
28
- <span
29
- className={`text-start font-medium text-${small ? "base" : "sm"} origin-top-left transform ${small ? "translate-x-2 scale-75" : ""}`}>{(title ?? "") + (required ? " *" : "")}</span>
30
-
16
+ export const LabelWithIcon = forwardRef<HTMLDivElement, LabelWithIconProps>(
17
+ ({
18
+ icon,
19
+ title,
20
+ small,
21
+ className,
22
+ required
23
+ }, ref) => {
24
+ return (
25
+ <div
26
+ ref={ref}
27
+ className={cls("inline-flex items-center my-0.5",
28
+ small ? "gap-1" : "gap-2",
29
+ className)}
30
+ >
31
+ {icon}
32
+ <span
33
+ className={`text-start font-medium text-${small ? "base" : "sm"} origin-top-left transform ${
34
+ small ? "translate-x-2 scale-75" : ""
35
+ }`}
36
+ >
37
+ {(title ?? "") + (required ? " *" : "")}
31
38
  </span>
32
- );
33
- }
39
+ </div>
40
+ );
41
+ }
42
+ );
43
+
44
+ LabelWithIcon.displayName = "LabelWithIcon";
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+ import { LabelWithIcon } from "./LabelWithIcon";
3
+ import { PropertyIdCopyTooltip } from "../../components/PropertyIdCopyTooltip";
4
+
5
+ interface LabelWithIconAndTooltip {
6
+ icon: React.ReactNode;
7
+ title?: string;
8
+ small?: boolean;
9
+ className?: string;
10
+ required?: boolean;
11
+ propertyKey: string
12
+ }
13
+
14
+ /**
15
+ * Render the label of with an icon and the title of a property
16
+ * @group Form custom fields
17
+ */
18
+ export function LabelWithIconAndTooltip({
19
+ propertyKey,
20
+ className,
21
+ ...props
22
+ }: LabelWithIconAndTooltip) {
23
+ return (
24
+ <PropertyIdCopyTooltip propertyKey={propertyKey} className={className}>
25
+ <LabelWithIcon {...props}/>
26
+ </PropertyIdCopyTooltip>
27
+ );
28
+ }