@firecms/core 3.0.0-canary.98 → 3.0.0-rc.1

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 (349) 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/VirtualTable/VirtualTableProps.d.ts +11 -2
  28. package/dist/components/common/default_entity_actions.d.ts +0 -2
  29. package/dist/components/common/index.d.ts +1 -1
  30. package/dist/components/common/useColumnsIds.d.ts +1 -0
  31. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +10 -2
  32. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  33. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  34. package/dist/components/index.d.ts +3 -1
  35. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  36. package/dist/core/DefaultAppBar.d.ts +8 -2
  37. package/dist/core/DrawerNavigationItem.d.ts +2 -1
  38. package/dist/core/EntityEditView.d.ts +40 -22
  39. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  40. package/dist/core/FireCMS.d.ts +2 -2
  41. package/dist/core/FireCMSRouter.d.ts +4 -0
  42. package/dist/core/NavigationRoutes.d.ts +0 -1
  43. package/dist/core/SideDialogs.d.ts +4 -2
  44. package/dist/core/field_configs.d.ts +1 -1
  45. package/dist/core/index.d.ts +2 -1
  46. package/dist/form/EntityForm.d.ts +50 -0
  47. package/dist/form/EntityFormActions.d.ts +21 -0
  48. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  49. package/dist/form/components/FormEntry.d.ts +6 -0
  50. package/dist/form/components/FormLayout.d.ts +5 -0
  51. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  52. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  53. package/dist/form/components/index.d.ts +3 -1
  54. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  55. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  56. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  57. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  58. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  59. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  60. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  61. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  62. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  63. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  64. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  65. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  66. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +4 -10
  67. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  68. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  69. package/dist/form/index.d.ts +17 -16
  70. package/dist/form/useClearRestoreValue.d.ts +2 -2
  71. package/dist/hooks/data/delete.d.ts +4 -4
  72. package/dist/hooks/data/save.d.ts +3 -3
  73. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  74. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  75. package/dist/hooks/useAuthController.d.ts +1 -1
  76. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  77. package/dist/hooks/useBuildNavigationController.d.ts +57 -12
  78. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  79. package/dist/hooks/useModeController.d.ts +1 -2
  80. package/dist/hooks/useProjectLog.d.ts +7 -1
  81. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  82. package/dist/hooks/useValidateAuthenticator.d.ts +3 -3
  83. package/dist/index.es.js +20108 -14471
  84. package/dist/index.es.js.map +1 -1
  85. package/dist/index.umd.js +20039 -14407
  86. package/dist/index.umd.js.map +1 -1
  87. package/dist/internal/useBuildDataSource.d.ts +3 -2
  88. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  89. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  90. package/dist/preview/PropertyPreviewProps.d.ts +1 -1
  91. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  92. package/dist/preview/components/ReferencePreview.d.ts +2 -2
  93. package/dist/preview/util.d.ts +3 -3
  94. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  95. package/dist/routes/FireCMSRoute.d.ts +1 -0
  96. package/dist/routes/HomePageRoute.d.ts +3 -0
  97. package/dist/types/analytics.d.ts +1 -1
  98. package/dist/types/auth.d.ts +7 -9
  99. package/dist/types/collections.d.ts +86 -25
  100. package/dist/types/customization_controller.d.ts +8 -0
  101. package/dist/types/datasource.d.ts +19 -17
  102. package/dist/types/dialogs_controller.d.ts +7 -3
  103. package/dist/types/entities.d.ts +2 -1
  104. package/dist/types/entity_actions.d.ts +58 -8
  105. package/dist/types/entity_callbacks.d.ts +16 -16
  106. package/dist/types/entity_overrides.d.ts +2 -2
  107. package/dist/types/export_import.d.ts +4 -4
  108. package/dist/types/fields.d.ts +43 -17
  109. package/dist/types/firecms.d.ts +16 -3
  110. package/dist/types/firecms_context.d.ts +1 -1
  111. package/dist/types/navigation.d.ts +60 -17
  112. package/dist/types/permissions.d.ts +4 -4
  113. package/dist/types/plugins.d.ts +42 -9
  114. package/dist/types/properties.d.ts +65 -22
  115. package/dist/types/property_config.d.ts +1 -3
  116. package/dist/types/roles.d.ts +3 -0
  117. package/dist/types/side_dialogs_controller.d.ts +10 -0
  118. package/dist/types/side_entity_controller.d.ts +14 -1
  119. package/dist/types/storage.d.ts +75 -0
  120. package/dist/types/user.d.ts +1 -0
  121. package/dist/util/builders.d.ts +3 -3
  122. package/dist/util/callbacks.d.ts +2 -0
  123. package/dist/util/createFormexStub.d.ts +2 -0
  124. package/dist/util/entities.d.ts +2 -2
  125. package/dist/util/entity_actions.d.ts +2 -0
  126. package/dist/util/entity_cache.d.ts +23 -0
  127. package/dist/util/icon_synonyms.d.ts +0 -1
  128. package/dist/util/icons.d.ts +5 -2
  129. package/dist/util/index.d.ts +3 -0
  130. package/dist/util/navigation_from_path.d.ts +10 -1
  131. package/dist/util/navigation_utils.d.ts +13 -1
  132. package/dist/util/objects.d.ts +2 -1
  133. package/dist/util/permissions.d.ts +4 -4
  134. package/dist/util/property_utils.d.ts +4 -4
  135. package/dist/util/references.d.ts +2 -2
  136. package/dist/util/resolutions.d.ts +30 -6
  137. package/dist/util/storage.d.ts +1 -1
  138. package/dist/util/useStorageUploadController.d.ts +2 -2
  139. package/package.json +133 -125
  140. package/src/app/Drawer.tsx +0 -1
  141. package/src/app/Scaffold.tsx +33 -29
  142. package/src/components/ArrayContainer.tsx +447 -229
  143. package/src/components/CircularProgressCenter.tsx +1 -1
  144. package/src/components/ClearFilterSortButton.tsx +1 -1
  145. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
  146. package/src/components/DeleteEntityDialog.tsx +13 -20
  147. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -25
  148. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +23 -17
  149. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +20 -3
  150. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +35 -9
  151. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +21 -16
  152. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +6 -12
  153. package/src/components/EntityCollectionTable/index.tsx +1 -1
  154. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +6 -6
  155. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +35 -26
  156. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  157. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +132 -101
  158. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
  159. package/src/components/EntityCollectionView/EntityCollectionView.tsx +178 -85
  160. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
  161. package/src/components/EntityCollectionView/useSelectionController.tsx +5 -4
  162. package/src/components/EntityCollectionView/utils.ts +19 -0
  163. package/src/components/EntityJsonPreview.tsx +66 -0
  164. package/src/components/EntityPreview.tsx +75 -57
  165. package/src/components/EntityView.tsx +8 -5
  166. package/src/components/ErrorView.tsx +3 -3
  167. package/src/components/FireCMSLogo.tsx +7 -51
  168. package/src/components/HomePage/DefaultHomePage.tsx +522 -160
  169. package/src/components/HomePage/FavouritesView.tsx +9 -14
  170. package/src/components/HomePage/HomePageDnD.tsx +642 -0
  171. package/src/components/HomePage/NavigationCard.tsx +47 -38
  172. package/src/components/HomePage/NavigationCardBinding.tsx +16 -15
  173. package/src/components/HomePage/NavigationGroup.tsx +144 -30
  174. package/src/components/HomePage/RenameGroupDialog.tsx +117 -0
  175. package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
  176. package/src/components/NotFoundPage.tsx +2 -2
  177. package/src/components/PropertyConfigBadge.tsx +9 -3
  178. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  179. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +22 -13
  180. package/src/components/SearchIconsView.tsx +2 -2
  181. package/src/components/SelectableTable/SelectableTable.tsx +154 -142
  182. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +4 -2
  183. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +10 -8
  184. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +59 -10
  185. package/src/components/UnsavedChangesDialog.tsx +46 -0
  186. package/src/components/VirtualTable/VirtualTable.tsx +65 -44
  187. package/src/components/VirtualTable/VirtualTableCell.tsx +0 -8
  188. package/src/components/VirtualTable/VirtualTableHeader.tsx +8 -8
  189. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +1 -1
  190. package/src/components/VirtualTable/VirtualTableProps.tsx +12 -2
  191. package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
  192. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
  193. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
  194. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  195. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  196. package/src/components/common/default_entity_actions.tsx +62 -42
  197. package/src/components/common/index.ts +1 -1
  198. package/src/components/common/useColumnsIds.tsx +1 -1
  199. package/src/components/common/useDataSourceTableController.tsx +420 -0
  200. package/src/components/common/useDebouncedCallback.tsx +20 -0
  201. package/src/components/common/useScrollRestoration.tsx +68 -0
  202. package/src/components/common/useTableSearchHelper.ts +1 -0
  203. package/src/components/index.tsx +4 -1
  204. package/src/contexts/BreacrumbsContext.tsx +38 -0
  205. package/src/contexts/DialogsProvider.tsx +3 -2
  206. package/src/contexts/ModeController.tsx +1 -3
  207. package/src/contexts/SnackbarProvider.tsx +2 -0
  208. package/src/core/DefaultAppBar.tsx +124 -85
  209. package/src/core/DefaultDrawer.tsx +30 -22
  210. package/src/core/DrawerNavigationItem.tsx +32 -28
  211. package/src/core/EntityEditView.tsx +388 -995
  212. package/src/core/EntityEditViewFormActions.tsx +329 -0
  213. package/src/core/EntitySidePanel.tsx +88 -20
  214. package/src/core/FireCMS.tsx +46 -25
  215. package/src/core/FireCMSRouter.tsx +17 -0
  216. package/src/core/NavigationRoutes.tsx +23 -32
  217. package/src/core/SideDialogs.tsx +22 -12
  218. package/src/core/field_configs.tsx +24 -10
  219. package/src/core/index.tsx +4 -2
  220. package/src/form/EntityForm.tsx +814 -0
  221. package/src/form/EntityFormActions.tsx +211 -0
  222. package/src/form/PropertyFieldBinding.tsx +55 -41
  223. package/src/form/components/CustomIdField.tsx +9 -3
  224. package/src/form/components/FieldHelperText.tsx +1 -1
  225. package/src/form/components/FormEntry.tsx +22 -0
  226. package/src/form/components/FormLayout.tsx +16 -0
  227. package/src/form/components/LabelWithIcon.tsx +30 -19
  228. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  229. package/src/form/components/StorageItemPreview.tsx +5 -4
  230. package/src/form/components/StorageUploadProgress.tsx +2 -3
  231. package/src/form/components/index.tsx +3 -1
  232. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +30 -18
  233. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -36
  234. package/src/form/field_bindings/BlockFieldBinding.tsx +55 -33
  235. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  236. package/src/form/field_bindings/KeyValueFieldBinding.tsx +19 -15
  237. package/src/form/field_bindings/MapFieldBinding.tsx +72 -62
  238. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
  239. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
  240. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +10 -8
  241. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  242. package/src/form/field_bindings/ReferenceFieldBinding.tsx +28 -19
  243. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -32
  244. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -13
  245. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +247 -168
  246. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  247. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  248. package/src/form/index.tsx +17 -37
  249. package/src/form/useClearRestoreValue.tsx +2 -2
  250. package/src/form/validation.ts +12 -6
  251. package/src/hooks/data/delete.ts +6 -5
  252. package/src/hooks/data/save.ts +26 -35
  253. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  254. package/src/hooks/data/useDataSource.tsx +10 -2
  255. package/src/hooks/data/useEntityFetch.tsx +10 -6
  256. package/src/hooks/useAuthController.tsx +1 -1
  257. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  258. package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
  259. package/src/hooks/useBuildModeController.tsx +15 -28
  260. package/src/hooks/useBuildNavigationController.tsx +386 -124
  261. package/src/hooks/useFireCMSContext.tsx +3 -33
  262. package/src/hooks/useLargeLayout.tsx +0 -35
  263. package/src/hooks/useModeController.tsx +1 -2
  264. package/src/hooks/useProjectLog.tsx +16 -5
  265. package/src/hooks/useResolvedNavigationFrom.tsx +9 -11
  266. package/src/hooks/useValidateAuthenticator.tsx +3 -3
  267. package/src/internal/useBuildDataSource.ts +67 -80
  268. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  269. package/src/internal/useBuildSideEntityController.tsx +149 -86
  270. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  271. package/src/preview/PropertyPreview.tsx +28 -12
  272. package/src/preview/PropertyPreviewProps.tsx +1 -1
  273. package/src/preview/components/BooleanPreview.tsx +1 -1
  274. package/src/preview/components/EmptyValue.tsx +1 -1
  275. package/src/preview/components/EnumValuesChip.tsx +1 -1
  276. package/src/preview/components/ImagePreview.tsx +10 -9
  277. package/src/preview/components/ReferencePreview.tsx +6 -16
  278. package/src/preview/components/UrlComponentPreview.tsx +20 -21
  279. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -5
  280. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -4
  281. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -3
  282. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -3
  283. package/src/preview/property_previews/ArrayOneOfPreview.tsx +6 -4
  284. package/src/preview/property_previews/ArrayPropertyPreview.tsx +5 -3
  285. package/src/preview/property_previews/MapPropertyPreview.tsx +7 -6
  286. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  287. package/src/preview/property_previews/StringPropertyPreview.tsx +2 -2
  288. package/src/preview/util.ts +10 -10
  289. package/src/routes/CustomCMSRoute.tsx +21 -0
  290. package/src/routes/FireCMSRoute.tsx +246 -0
  291. package/src/routes/HomePageRoute.tsx +17 -0
  292. package/src/types/analytics.ts +3 -0
  293. package/src/types/auth.tsx +8 -12
  294. package/src/types/collections.ts +101 -28
  295. package/src/types/customization_controller.tsx +9 -0
  296. package/src/types/datasource.ts +21 -20
  297. package/src/types/dialogs_controller.tsx +7 -3
  298. package/src/types/entities.ts +3 -1
  299. package/src/types/entity_actions.tsx +71 -8
  300. package/src/types/entity_callbacks.ts +18 -18
  301. package/src/types/entity_overrides.tsx +2 -2
  302. package/src/types/export_import.ts +4 -4
  303. package/src/types/fields.tsx +52 -19
  304. package/src/types/firecms.tsx +18 -4
  305. package/src/types/firecms_context.tsx +1 -1
  306. package/src/types/navigation.ts +76 -22
  307. package/src/types/permissions.ts +5 -5
  308. package/src/types/plugins.tsx +50 -9
  309. package/src/types/properties.ts +74 -22
  310. package/src/types/property_config.tsx +1 -2
  311. package/src/types/roles.ts +3 -0
  312. package/src/types/side_dialogs_controller.tsx +15 -0
  313. package/src/types/side_entity_controller.tsx +16 -1
  314. package/src/types/storage.ts +82 -0
  315. package/src/types/user.ts +2 -0
  316. package/src/util/builders.ts +10 -8
  317. package/src/util/callbacks.ts +119 -0
  318. package/src/util/createFormexStub.tsx +62 -0
  319. package/src/util/entities.ts +5 -3
  320. package/src/util/entity_actions.ts +28 -0
  321. package/src/util/entity_cache.ts +204 -0
  322. package/src/util/icon_list.ts +1 -1
  323. package/src/util/icon_synonyms.ts +0 -1
  324. package/src/util/icons.tsx +36 -11
  325. package/src/util/index.ts +3 -0
  326. package/src/util/join_collections.ts +9 -2
  327. package/src/util/make_properties_editable.ts +13 -5
  328. package/src/util/navigation_from_path.ts +33 -12
  329. package/src/util/navigation_utils.ts +135 -19
  330. package/src/util/objects.ts +74 -14
  331. package/src/util/parent_references_from_path.ts +3 -3
  332. package/src/util/permissions.ts +8 -8
  333. package/src/util/property_utils.tsx +17 -6
  334. package/src/util/references.ts +19 -8
  335. package/src/util/resolutions.ts +93 -24
  336. package/src/util/storage.ts +6 -2
  337. package/src/util/useStorageUploadController.tsx +74 -29
  338. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
  339. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  340. package/dist/form/PropertiesForm.d.ts +0 -8
  341. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  342. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  343. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
  344. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -27
  345. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -236
  346. package/src/form/PropertiesForm.tsx +0 -81
  347. package/src/form/components/FormikArrayContainer.tsx +0 -44
  348. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  349. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -1,13 +1,35 @@
1
- import React, { useCallback } from "react";
1
+ import React, { useCallback, useState } from "react";
2
2
 
3
- import { ArrayProperty, FieldProps, ResolvedArrayProperty, ResolvedStringProperty, StorageConfig } from "../../types";
3
+ import {
4
+ FieldProps,
5
+ PropertyOrBuilder,
6
+ ResolvedArrayProperty,
7
+ ResolvedStringProperty,
8
+ StorageConfig
9
+ } from "../../types";
4
10
  import { useDropzone } from "react-dropzone";
5
11
  import { PreviewSize } from "../../preview";
6
- import { FieldHelperText, LabelWithIcon } from "../components";
12
+ import { FieldHelperText, LabelWithIconAndTooltip } from "../components";
7
13
 
8
- import { getIconForProperty, isReadOnly } from "../../util";
9
- import { useSnackbarController, useStorageSource } from "../../hooks";
10
- import { DragDropContext, Draggable, Droppable } from "@hello-pangea/dnd";
14
+ import { getIconForProperty, isReadOnly, resolveProperty } from "../../util";
15
+ import { useAuthController, useSnackbarController, useStorageSource } from "../../hooks";
16
+ import {
17
+ closestCenter,
18
+ DndContext,
19
+ DragEndEvent,
20
+ DragStartEvent,
21
+ KeyboardSensor,
22
+ PointerSensor,
23
+ useSensor,
24
+ useSensors
25
+ } from "@dnd-kit/core";
26
+ import {
27
+ horizontalListSortingStrategy,
28
+ SortableContext,
29
+ sortableKeyboardCoordinates,
30
+ useSortable
31
+ } from "@dnd-kit/sortable";
32
+ import { CSS } from "@dnd-kit/utilities";
11
33
  import { StorageFieldItem, useStorageUploadController } from "../../util/useStorageUploadController";
12
34
  import { StorageUploadProgress } from "../components/StorageUploadProgress";
13
35
  import { StorageItemPreview } from "../components/StorageItemPreview";
@@ -16,13 +38,12 @@ import {
16
38
  fieldBackgroundDisabledMixin,
17
39
  fieldBackgroundHoverMixin,
18
40
  fieldBackgroundMixin,
19
- focusedMixin,
20
41
  Typography
21
42
  } from "@firecms/ui";
22
43
  import { useClearRestoreValue } from "../useClearRestoreValue";
23
44
 
24
45
  const dropZoneClasses = "box-border relative pt-[2px] items-center border border-transparent min-h-[254px] outline-none rounded-md duration-200 ease-[cubic-bezier(0.4,0,0.2,1)] focus:border-primary-solid";
25
- const disabledClasses = "border-dotted-gray"
46
+ const disabledClasses = fieldBackgroundDisabledMixin;
26
47
  const nonActiveDropClasses = fieldBackgroundHoverMixin
27
48
  const activeDropClasses = "pt-0 border-2 border-solid"
28
49
  const acceptDropClasses = "transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-green-500"
@@ -30,13 +51,6 @@ const rejectDropClasses = "transition-colors duration-200 ease-[cubic-bezier(0,0
30
51
 
31
52
  type StorageUploadFieldProps = FieldProps<string | string[]>;
32
53
 
33
- /**
34
- * Field that allows to upload files to Google Cloud Storage.
35
- *
36
- * This is one of the internal components that get mapped natively inside forms
37
- * and tables to the specified properties.
38
- * @group Form fields
39
- */
40
54
  export function StorageUploadFieldBinding({
41
55
  propertyKey,
42
56
  value,
@@ -44,18 +58,20 @@ export function StorageUploadFieldBinding({
44
58
  error,
45
59
  showError,
46
60
  autoFocus,
47
- tableMode,
61
+ minimalistView,
48
62
  property,
49
63
  includeDescription,
50
64
  context,
51
65
  isSubmitting,
52
66
  }: StorageUploadFieldProps) {
53
67
 
68
+ const authController = useAuthController();
69
+
54
70
  if (!context.entityId)
55
71
  throw new Error("StorageUploadFieldBinding: Entity id is null");
56
72
 
57
73
  const storageSource = useStorageSource(context.collection);
58
- const disabled = isReadOnly(property) || !!property.disabled || isSubmitting;
74
+ const disabled = isReadOnly(property) || !!property.disabled || isSubmitting || context.disabled;
59
75
 
60
76
  const {
61
77
  internalValue,
@@ -83,22 +99,29 @@ export function StorageUploadFieldBinding({
83
99
  setValue
84
100
  });
85
101
 
102
+ const resolvedProperty = resolveProperty({
103
+ propertyOrBuilder: property as PropertyOrBuilder,
104
+ authController
105
+ }) as ResolvedStringProperty | ResolvedArrayProperty<string[]>;
106
+
86
107
  return (
87
108
 
88
109
  <>
89
110
 
90
- {!tableMode &&
91
- <LabelWithIcon icon={getIconForProperty(property, "small")}
92
- required={property.validation?.required}
93
- title={property.name}
94
- className={"text-text-secondary dark:text-text-secondary-dark ml-3.5"}/>}
111
+ {!minimalistView &&
112
+ <LabelWithIconAndTooltip
113
+ propertyKey={propertyKey}
114
+ icon={getIconForProperty(property, "small")}
115
+ required={property.validation?.required}
116
+ title={property.name}
117
+ className={"h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5"}/>}
95
118
 
96
119
  <StorageUpload
97
120
  value={internalValue}
98
121
  name={propertyKey}
99
122
  disabled={disabled ?? false}
100
123
  autoFocus={autoFocus ?? false}
101
- property={property}
124
+ property={resolvedProperty}
102
125
  onChange={setValue}
103
126
  setInternalValue={setInternalValue}
104
127
  onFilesAdded={onFilesAdded}
@@ -117,13 +140,101 @@ export function StorageUploadFieldBinding({
117
140
  );
118
141
  }
119
142
 
143
+ interface SortableStorageItemProps {
144
+ id: number;
145
+ entry: StorageFieldItem;
146
+ property: ResolvedStringProperty;
147
+ name: string;
148
+ metadata?: Record<string, unknown>;
149
+ storagePathBuilder: (file: File) => string;
150
+ onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: any) => Promise<void>;
151
+ onClear: (clearedStoragePathOrDownloadUrl: string) => void;
152
+ disabled: boolean;
153
+ isSortable: boolean; // Kept for consistency, though dnd-kit handles sortability via context
154
+ }
155
+
156
+ function SortableStorageItem({
157
+ id,
158
+ entry,
159
+ property,
160
+ metadata,
161
+ storagePathBuilder,
162
+ onFileUploadComplete,
163
+ onClear,
164
+ disabled,
165
+ }: SortableStorageItemProps) {
166
+
167
+ const {
168
+ attributes,
169
+ listeners,
170
+ setNodeRef,
171
+ transform,
172
+ transition,
173
+ isDragging
174
+ } = useSortable({ id });
175
+
176
+ const style: React.CSSProperties = {
177
+ transform: CSS.Transform.toString(transform),
178
+ transition,
179
+ zIndex: isDragging ? 100 : undefined
180
+ };
181
+
182
+ const getImageSizeNumber = (previewSize: PreviewSize): number => {
183
+ switch (previewSize) {
184
+ case "small":
185
+ return 40;
186
+ case "medium":
187
+ return 118;
188
+ case "large":
189
+ return 220;
190
+ default:
191
+ return 118;
192
+ }
193
+ };
194
+
195
+ let child: React.ReactNode;
196
+ if (entry.storagePathOrDownloadUrl) {
197
+ child = (
198
+ <StorageItemPreview
199
+ name={`storage_preview_${entry.storagePathOrDownloadUrl}`}
200
+ property={property}
201
+ disabled={disabled}
202
+ value={entry.storagePathOrDownloadUrl}
203
+ onRemove={() => onClear(entry.storagePathOrDownloadUrl!)}
204
+ size={entry.size}/>
205
+ );
206
+ } else if (entry.file) {
207
+ child = (
208
+ <StorageUploadProgress
209
+ entry={entry}
210
+ metadata={metadata}
211
+ storagePath={storagePathBuilder(entry.file)}
212
+ onFileUploadComplete={onFileUploadComplete}
213
+ imageSize={getImageSizeNumber(entry.size)}
214
+ simple={false}
215
+ />
216
+ );
217
+ }
218
+
219
+ return (
220
+ <div
221
+ ref={setNodeRef}
222
+ style={style}
223
+ {...attributes}
224
+ {...listeners}
225
+ className={cls("rounded-md m-1")}
226
+ tabIndex={-1}
227
+ >
228
+ {child}
229
+ </div>
230
+ );
231
+ }
232
+
120
233
  function FileDropComponent({
121
234
  storage,
122
235
  disabled,
123
- isDraggingOver,
124
236
  onFilesAdded,
125
237
  multipleFilesSupported,
126
- droppableProvided,
127
238
  autoFocus,
128
239
  internalValue,
129
240
  property,
@@ -131,26 +242,24 @@ function FileDropComponent({
131
242
  metadata,
132
243
  storagePathBuilder,
133
244
  onFileUploadComplete,
134
- size,
135
245
  name,
136
- helpText
246
+ helpText,
247
+ isDndItemDragging
137
248
  }: {
138
249
  storage: StorageConfig,
139
250
  disabled: boolean,
140
- isDraggingOver: boolean,
141
- droppableProvided: any,
142
- onFilesAdded: (acceptedFiles: File[]) => void,
251
+ onFilesAdded: (acceptedFiles: File[]) => Promise<void>,
143
252
  multipleFilesSupported: boolean,
144
253
  autoFocus: boolean,
145
254
  internalValue: StorageFieldItem[],
146
255
  property: ResolvedStringProperty,
147
256
  onClear: (clearedStoragePathOrDownloadUrl: string) => void,
148
- metadata: any,
257
+ metadata?: any,
149
258
  storagePathBuilder: (file: File) => string,
150
259
  onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: any) => Promise<void>,
151
- size: PreviewSize,
152
260
  name: string,
153
- helpText: string
261
+ helpText: string,
262
+ isDndItemDragging?: boolean
154
263
  }) {
155
264
 
156
265
  const snackbarContext = useSnackbarController();
@@ -158,19 +267,22 @@ function FileDropComponent({
158
267
  const {
159
268
  getRootProps,
160
269
  getInputProps,
161
- isDragActive,
270
+ isDragActive, // This is for files dragged from OS
162
271
  isDragAccept,
163
272
  isDragReject
164
273
  } = useDropzone({
165
- accept: storage.acceptedFiles ? storage.acceptedFiles.map(e => ({ [e]: [] })).reduce((a, b) => ({ ...a, ...b }), {}) : undefined,
166
- disabled: disabled || isDraggingOver,
274
+ accept: storage.acceptedFiles ? storage.acceptedFiles.reduce((acc, ext) => ({
275
+ ...acc,
276
+ [ext]: []
277
+ }), {}) : undefined,
278
+ disabled: disabled || isDndItemDragging,
167
279
  noDragEventsBubbling: true,
168
280
  maxSize: storage.maxSize,
169
281
  onDrop: onFilesAdded,
170
- onDropRejected: (fileRejections, event) => {
282
+ onDropRejected: (fileRejections) => {
171
283
  for (const fileRejection of fileRejections) {
172
284
  for (const error of fileRejection.errors) {
173
- console.log("Error uploading file: ", error);
285
+ console.error("Error uploading file: ", error);
174
286
  if (error.code === "file-too-large") {
175
287
  snackbarContext.open({
176
288
  type: "error",
@@ -194,91 +306,54 @@ function FileDropComponent({
194
306
  className={cls(
195
307
  fieldBackgroundMixin,
196
308
  disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,
309
+ disabled ? "text-surface-accent-600 dark:text-surface-accent-500" : "",
197
310
  dropZoneClasses,
198
311
  multipleFilesSupported && internalValue.length ? "" : "flex",
199
- focusedMixin,
200
312
  {
201
313
  [nonActiveDropClasses]: !isDragActive,
202
- [activeDropClasses]: isDragActive,
203
- [rejectDropClasses]: isDragReject,
204
- [acceptDropClasses]: isDragAccept,
205
- [disabledClasses]: disabled
314
+ [activeDropClasses]: isDragActive, // OS file drag active
315
+ [rejectDropClasses]: isDragReject, // OS file drag reject
316
+ [acceptDropClasses]: isDragAccept, // OS file drag accept
317
+ [disabledClasses]: disabled || isDndItemDragging // Visually disable if internal drag
206
318
  })}
207
319
  >
208
320
  <div
209
- {...droppableProvided.droppableProps}
210
- ref={droppableProvided.innerRef}
211
- className={cls("flex items-center p-1 no-scrollbar",
321
+ className={cls("flex items-center p-1 px-4 no-scrollbar",
212
322
  multipleFilesSupported && internalValue.length ? "overflow-auto" : "",
213
323
  multipleFilesSupported && internalValue.length ? "min-h-[180px]" : "min-h-[250px]"
214
324
  )}
215
325
  >
216
-
217
326
  <input
218
327
  autoFocus={autoFocus}
219
328
  {...getInputProps()} />
220
329
 
221
- {internalValue.map((entry, index) => {
222
- let child: any;
223
- if (entry.storagePathOrDownloadUrl) {
224
- child = (
225
- <StorageItemPreview
226
- name={`storage_preview_${entry.storagePathOrDownloadUrl}`}
227
- property={property}
228
- disabled={disabled}
229
- value={entry.storagePathOrDownloadUrl}
230
- onRemove={onClear}
231
- size={entry.size}/>
232
- );
233
- } else if (entry.file) {
234
- child = (
235
- <StorageUploadProgress
236
- entry={entry}
237
- metadata={metadata}
238
- storagePath={storagePathBuilder(entry.file)}
239
- onFileUploadComplete={onFileUploadComplete}
240
- imageSize={size === "medium" ? 220 : 118}
241
- simple={false}
242
- />
243
- );
244
- }
245
-
246
- return (
247
- <Draggable
248
- key={`array_field_${name}_${entry.id}`}
249
- draggableId={`array_field_${name}_${entry.id}`}
250
- index={index}>
251
- {(provided, snapshot) => (
252
- <div
253
- tabIndex={-1}
254
- ref={provided.innerRef}
255
- {...provided.draggableProps}
256
- {...provided.dragHandleProps}
257
- className={cls(focusedMixin, "rounded-md")}
258
- style={{
259
- ...provided.draggableProps.style
260
- }}
261
- >
262
- {child}
263
- </div>
264
- )}
265
- </Draggable>
266
- );
267
- })
268
- }
269
-
270
- {droppableProvided.placeholder}
271
-
330
+ {internalValue.map((entry) => (
331
+ <SortableStorageItem
332
+ key={entry.id}
333
+ id={entry.id}
334
+ entry={entry}
335
+ property={property}
336
+ name={name}
337
+ metadata={metadata}
338
+ storagePathBuilder={storagePathBuilder}
339
+ onFileUploadComplete={onFileUploadComplete}
340
+ onClear={onClear}
341
+ disabled={disabled}
342
+ isSortable={multipleFilesSupported}
343
+ />
344
+ ))}
345
+
346
+ {/* Placeholder for empty dropzone text is handled by the outer Typography */}
272
347
  </div>
273
348
 
274
349
  <div
275
350
  className="flex-grow min-h-[38px] box-border m-2 text-center">
276
351
  <Typography align={"center"}
277
- variant={"label"}>
352
+ variant={"label"}
353
+ className={disabled ? "text-surface-accent-600 dark:text-surface-accent-500" : ""}>
278
354
  {helpText}
279
355
  </Typography>
280
356
  </div>
281
-
282
357
  </div>
283
358
  );
284
359
  }
@@ -293,7 +368,7 @@ export interface StorageUploadProps {
293
368
  autoFocus: boolean;
294
369
  disabled: boolean;
295
370
  storage: StorageConfig;
296
- onFilesAdded: (acceptedFiles: File[]) => void;
371
+ onFilesAdded: (acceptedFiles: File[]) => Promise<void>; // Updated from useStorageUploadController
297
372
  storagePathBuilder: (file: File) => string;
298
373
  onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: any) => Promise<void>;
299
374
  }
@@ -301,7 +376,7 @@ export interface StorageUploadProps {
301
376
  export function StorageUpload({
302
377
  property,
303
378
  name,
304
- value,
379
+ value, // This is internalValue from useStorageUploadController
305
380
  setInternalValue,
306
381
  onChange,
307
382
  multipleFilesSupported,
@@ -328,10 +403,10 @@ export function StorageUpload({
328
403
  }
329
404
 
330
405
  const metadata: Record<string, unknown> | undefined = storage?.metadata;
331
- const size = multipleFilesSupported ? "small" : "medium";
406
+ const [isDndItemDragging, setIsDndItemDragging] = useState(false);
332
407
 
333
408
  const moveItem = useCallback((fromIndex: number, toIndex: number) => {
334
- if (!multipleFilesSupported) return;
409
+ if (!multipleFilesSupported || fromIndex === toIndex) return;
335
410
  const newValue = [...value];
336
411
  const item = newValue[fromIndex];
337
412
  newValue.splice(fromIndex, 1);
@@ -343,84 +418,88 @@ export function StorageUpload({
343
418
  onChange(fieldValue);
344
419
  }, [multipleFilesSupported, onChange, setInternalValue, value]);
345
420
 
346
- const onDragEnd = useCallback((result: any) => {
347
- // dropped outside the list
348
- if (!result.destination) {
349
- return;
350
- }
351
-
352
- moveItem(result.source.index, result.destination.index);
421
+ const sensors = useSensors(
422
+ useSensor(PointerSensor, {
423
+ activationConstraint: {
424
+ distance: 5, // Start dragging after 5px movement
425
+ },
426
+ }),
427
+ useSensor(KeyboardSensor, {
428
+ coordinateGetter: sortableKeyboardCoordinates,
429
+ })
430
+ );
353
431
 
354
- }, [moveItem])
432
+ const handleDragStart = useCallback((event: DragStartEvent) => {
433
+ setIsDndItemDragging(true);
434
+ }, []);
435
+
436
+ const handleDragEnd = useCallback((event: DragEndEvent) => {
437
+ setIsDndItemDragging(false);
438
+ const {
439
+ active,
440
+ over
441
+ } = event;
442
+ if (over && active.id !== over.id) {
443
+ const oldIndex = value.findIndex(item => item.id === active.id);
444
+ const newIndex = value.findIndex(item => item.id === over.id);
445
+ if (oldIndex !== -1 && newIndex !== -1) {
446
+ moveItem(oldIndex, newIndex);
447
+ }
448
+ }
449
+ }, [value, moveItem]);
355
450
 
356
451
  const onClear = useCallback((clearedStoragePathOrDownloadUrl: string) => {
452
+ let newValue: StorageFieldItem[];
357
453
  if (multipleFilesSupported) {
358
- const newValue: StorageFieldItem[] = value.filter(v => v.storagePathOrDownloadUrl !== clearedStoragePathOrDownloadUrl);
454
+ newValue = value.filter(v => v.storagePathOrDownloadUrl !== clearedStoragePathOrDownloadUrl);
359
455
  onChange(newValue.filter(v => !!v.storagePathOrDownloadUrl).map(v => v.storagePathOrDownloadUrl as string));
360
- setInternalValue(newValue);
361
456
  } else {
457
+ newValue = [];
362
458
  onChange(null);
363
- setInternalValue([]);
364
459
  }
365
- }, [value, multipleFilesSupported, onChange]);
460
+ setInternalValue(newValue);
461
+ }, [value, multipleFilesSupported, onChange, setInternalValue]);
366
462
 
367
463
  const helpText = multipleFilesSupported
368
- ? "Drag 'n' drop some files here, or click to select files"
464
+ ? "Drag 'n' drop some files here, or click to select files. Drag to reorder."
369
465
  : "Drag 'n' drop a file here, or click to select one";
370
466
 
371
467
  const renderProperty: ResolvedStringProperty = multipleFilesSupported
372
- ? (property as ArrayProperty<string[]>).of as ResolvedStringProperty
468
+ ? (property as ResolvedArrayProperty<string[]>).of as ResolvedStringProperty
373
469
  : property as ResolvedStringProperty;
374
470
 
375
- return (
376
- <DragDropContext onDragEnd={onDragEnd}>
377
- <Droppable
378
- droppableId={`droppable_${name}`}
379
- direction="horizontal"
380
- renderClone={(provided, snapshot, rubric) => {
381
- const entry = value[rubric.source.index];
382
- return (
383
- <div
384
- ref={provided.innerRef}
385
- {...provided.draggableProps}
386
- {...provided.dragHandleProps}
387
- style={
388
- provided.draggableProps.style
389
- }
390
- className="rounded"
391
- >
392
- <StorageItemPreview
393
- name={`storage_preview_${entry.storagePathOrDownloadUrl}`}
394
- placeholder={true}
395
- property={renderProperty}
396
- disabled={true}
397
- value={entry.storagePathOrDownloadUrl as string}
398
- onRemove={onClear}
399
- size={entry.size}/>
400
- </div>
401
- );
402
- }}
403
- >
404
- {(provided, snapshot) => {
405
- return <FileDropComponent storage={storage}
406
- disabled={disabled}
407
- isDraggingOver={snapshot.isDraggingOver}
408
- droppableProvided={provided}
409
- onFilesAdded={onFilesAdded}
410
- multipleFilesSupported={multipleFilesSupported}
411
- autoFocus={autoFocus}
412
- internalValue={value}
413
- property={renderProperty}
414
- onClear={onClear}
415
- metadata={metadata}
416
- storagePathBuilder={storagePathBuilder}
417
- onFileUploadComplete={onFileUploadComplete}
418
- size={size}
419
- name={name}
420
- helpText={helpText}/>
421
- }}
422
- </Droppable>
423
- </DragDropContext>
424
- );
471
+ const fileDropProps = {
472
+ storage,
473
+ disabled,
474
+ onFilesAdded,
475
+ multipleFilesSupported,
476
+ autoFocus,
477
+ internalValue: value, // Pass current internalValue
478
+ property: renderProperty,
479
+ onClear,
480
+ metadata,
481
+ storagePathBuilder,
482
+ onFileUploadComplete,
483
+ name,
484
+ helpText,
485
+ isDndItemDragging // Pass this down
486
+ };
425
487
 
488
+ if (multipleFilesSupported) {
489
+ return (
490
+ <DndContext
491
+ sensors={sensors}
492
+ collisionDetection={closestCenter}
493
+ onDragStart={handleDragStart}
494
+ onDragEnd={handleDragEnd}
495
+ >
496
+ <SortableContext items={value.map(v => v.id)} strategy={horizontalListSortingStrategy}>
497
+ <FileDropComponent {...fileDropProps} />
498
+ </SortableContext>
499
+ </DndContext>
500
+ );
501
+ } else {
502
+ // For single file, no D&D context is needed
503
+ return <FileDropComponent {...fileDropProps} isDndItemDragging={false}/>;
504
+ }
426
505
  }
@@ -5,6 +5,7 @@ import { getIconForProperty } from "../../util";
5
5
  import { FieldHelperText, LabelWithIcon } from "../components";
6
6
  import { BooleanSwitchWithLabel } from "@firecms/ui";
7
7
  import { useClearRestoreValue } from "../useClearRestoreValue";
8
+ import { PropertyIdCopyTooltip } from "../../components";
8
9
 
9
10
  type SwitchFieldProps = FieldProps<boolean>;
10
11
 
@@ -15,18 +16,18 @@ type SwitchFieldProps = FieldProps<boolean>;
15
16
  * and tables to the specified properties.
16
17
  * @group Form fields
17
18
  */
18
- export const SwitchFieldBinding = React.forwardRef(function SwitchFieldBinding({
19
- propertyKey,
20
- value,
21
- setValue,
22
- error,
23
- showError,
24
- autoFocus,
25
- disabled,
26
- touched,
27
- property,
28
- includeDescription
29
- }: SwitchFieldProps, ref) {
19
+ export const SwitchFieldBinding = function SwitchFieldBinding({
20
+ propertyKey,
21
+ value,
22
+ setValue,
23
+ error,
24
+ showError,
25
+ autoFocus,
26
+ disabled,
27
+ size = "large",
28
+ property,
29
+ includeDescription
30
+ }: SwitchFieldProps) {
30
31
 
31
32
  useClearRestoreValue({
32
33
  property,
@@ -37,17 +38,21 @@ export const SwitchFieldBinding = React.forwardRef(function SwitchFieldBinding({
37
38
  return (
38
39
  <>
39
40
 
40
- <BooleanSwitchWithLabel
41
- value={value}
42
- onValueChange={(v) => setValue(v)}
43
- error={showError}
44
- label={<LabelWithIcon icon={getIconForProperty(property, "small")}
45
- required={property.validation?.required}
46
- title={property.name}/>}
47
- disabled={disabled}
48
- autoFocus={autoFocus}
49
- size={"large"}
50
- />
41
+ <PropertyIdCopyTooltip propertyKey={propertyKey}>
42
+ <BooleanSwitchWithLabel
43
+ value={value}
44
+ onValueChange={(v) => setValue(v)}
45
+ error={showError}
46
+ className={property.widthPercentage !== undefined ? "mt-8" : undefined}
47
+ label={<LabelWithIcon
48
+ icon={getIconForProperty(property, "small")}
49
+ required={property.validation?.required}
50
+ title={property.name}/>}
51
+ disabled={disabled}
52
+ autoFocus={autoFocus}
53
+ size={size}
54
+ />
55
+ </PropertyIdCopyTooltip>
51
56
 
52
57
  <FieldHelperText includeDescription={includeDescription}
53
58
  showError={showError}
@@ -57,4 +62,4 @@ export const SwitchFieldBinding = React.forwardRef(function SwitchFieldBinding({
57
62
  </>
58
63
 
59
64
  );
60
- });
65
+ };