@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,14 +1,27 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from "react";
2
-
3
- import { DragDropContext, Draggable, DraggableProvided, Droppable } from "@hello-pangea/dnd";
4
-
2
+ import {
3
+ closestCenter,
4
+ DndContext,
5
+ DragEndEvent,
6
+ KeyboardSensor,
7
+ PointerSensor,
8
+ useSensor,
9
+ useSensors
10
+ } from "@dnd-kit/core";
11
+ import { restrictToVerticalAxis } from "@dnd-kit/modifiers";
12
+
13
+ import { SortableContext, useSortable, verticalListSortingStrategy } from "@dnd-kit/sortable";
14
+ import { CSS } from "@dnd-kit/utilities";
5
15
  import { getHashValue } from "../util";
6
16
  import {
7
17
  AddIcon,
8
18
  Button,
19
+ cls,
9
20
  ContentCopyIcon,
10
- fieldBackgroundHoverMixin, HandleIcon,
21
+ HandleIcon,
11
22
  IconButton,
23
+ KeyboardArrowDownIcon,
24
+ KeyboardArrowUpIcon,
12
25
  Menu,
13
26
  MenuItem,
14
27
  RemoveIcon,
@@ -16,32 +29,315 @@ import {
16
29
  useOutsideAlerter
17
30
  } from "@firecms/ui";
18
31
 
19
- interface ArrayContainerProps<T> {
32
+ export type ArrayEntryParams = {
33
+ index: number;
34
+ internalId: number;
35
+ isDragging: boolean;
36
+ storedProps?: object;
37
+ storeProps: (props: object) => void;
38
+ };
39
+
40
+ export type ArrayEntryBuilder = (params: ArrayEntryParams) => React.ReactNode;
41
+
42
+ export interface ArrayContainerProps<T> {
20
43
  droppableId: string;
21
44
  value: T[];
22
45
  addLabel: string;
23
- buildEntry: (index: number, internalId: number) => React.ReactNode;
46
+ buildEntry: ArrayEntryBuilder;
24
47
  disabled?: boolean;
25
48
  size?: "small" | "medium";
26
49
  onInternalIdAdded?: (id: number) => void;
27
50
  includeAddButton?: boolean;
51
+ canAddElements?: boolean;
52
+ sortable?: boolean;
28
53
  newDefaultEntry: T;
29
- onValueChange: (value: T[]) => void
54
+ onValueChange: (value: T[]) => void;
55
+ className?: string;
56
+ min?: number;
57
+ max?: number;
30
58
  }
31
59
 
32
60
  const buildIdsMap = (value: any[]) =>
33
61
  value && Array.isArray(value) && value.length > 0
34
- ? value.map((v, index) => {
35
- if (!v) return {};
36
- return ({
37
- [getHashValue(v) + index]: getRandomId()
38
- });
39
- }).reduce((a, b) => ({ ...a, ...b }), {})
40
- : {}
62
+ ? value
63
+ .map((v, index) => {
64
+ if (!v) return {};
65
+ return {
66
+ [getHashValue(v) + index]: getRandomId()
67
+ };
68
+ })
69
+ .reduce((a, b) => ({ ...a, ...b }), {})
70
+ : {};
71
+
72
+ type SortableItemProps = {
73
+ id: number;
74
+ index: number;
75
+ size?: "small" | "medium";
76
+ disabled: boolean;
77
+ buildEntry: ArrayEntryBuilder;
78
+ remove: (index: number) => void;
79
+ copy: (index: number) => void;
80
+ addInIndex?: (index: number) => void;
81
+ canAddElements?: boolean;
82
+ sortable: boolean;
83
+ storedProps?: object;
84
+ updateItemCustomProps: (internalId: number, props: object) => void;
85
+ };
86
+
87
+ function SortableItem({
88
+ id,
89
+ index,
90
+ size,
91
+ disabled,
92
+ buildEntry,
93
+ remove,
94
+ copy,
95
+ addInIndex,
96
+ canAddElements,
97
+ sortable,
98
+ storedProps,
99
+ updateItemCustomProps
100
+ }: SortableItemProps) {
101
+ const {
102
+ attributes,
103
+ listeners,
104
+ setNodeRef,
105
+ transform,
106
+ transition,
107
+ isDragging
108
+ } = sortable
109
+ ? useSortable({ id })
110
+ : {
111
+ attributes: {},
112
+ listeners: {},
113
+ setNodeRef: (node: HTMLElement | null) => {
114
+ },
115
+ transform: null,
116
+ transition: undefined,
117
+ isDragging: false
118
+ };
119
+
120
+ const style = transform ? {
121
+ transform: CSS.Transform.toString(transform),
122
+ transition
123
+ } : {};
124
+ const dragHandleProps = sortable ? { ...listeners, ...attributes } : {};
125
+
126
+ return (
127
+ <ArrayContainerItem
128
+ nodeRef={setNodeRef}
129
+ style={style}
130
+ dragHandleProps={dragHandleProps}
131
+ internalId={id}
132
+ index={index}
133
+ size={size}
134
+ disabled={disabled}
135
+ buildEntry={buildEntry}
136
+ remove={remove}
137
+ copy={copy}
138
+ addInIndex={addInIndex}
139
+ canAddElements={canAddElements}
140
+ sortable={sortable}
141
+ isDragging={isDragging}
142
+ storedProps={storedProps}
143
+ updateItemCustomProps={updateItemCustomProps}
144
+ />
145
+ );
146
+ }
147
+
148
+ type ArrayContainerItemProps = {
149
+ nodeRef: (node: HTMLElement | null) => void;
150
+ style: React.CSSProperties;
151
+ dragHandleProps: any;
152
+ index: number;
153
+ internalId: number;
154
+ size?: "small" | "medium";
155
+ disabled: boolean;
156
+ buildEntry: ArrayEntryBuilder;
157
+ remove: (index: number) => void;
158
+ copy: (index: number) => void;
159
+ addInIndex?: (index: number) => void;
160
+ canAddElements?: boolean;
161
+ sortable: boolean;
162
+ isDragging: boolean;
163
+ storedProps?: object;
164
+ updateItemCustomProps: (internalId: number, props: object) => void;
165
+ };
166
+
167
+ export function ArrayContainerItem({
168
+ nodeRef,
169
+ style,
170
+ dragHandleProps,
171
+ index,
172
+ internalId,
173
+ size,
174
+ disabled,
175
+ buildEntry,
176
+ remove,
177
+ copy,
178
+ addInIndex,
179
+ canAddElements,
180
+ sortable,
181
+ isDragging,
182
+ storedProps,
183
+ updateItemCustomProps
184
+ }: ArrayContainerItemProps) {
185
+ return (
186
+ <div
187
+ ref={nodeRef}
188
+ style={style}
189
+ className={`relative ${!isDragging ? "hover\\:bg-surface-accent-50 dark\\:hover\\:bg-surface-800 dark\\:hover\\:bg-opacity-20" : ""} rounded-md opacity-100`}
190
+ >
191
+ <div className="flex items-start">
192
+ <div className="flex-grow w-[calc(100%-48px)] text-text-primary dark:text-text-primary-dark">
193
+ {buildEntry({
194
+ index,
195
+ internalId,
196
+ isDragging,
197
+ storedProps,
198
+ storeProps: (props: object) => updateItemCustomProps(internalId, props)
199
+ })}
200
+ </div>
201
+ <ArrayItemOptions
202
+ dragHandleProps={dragHandleProps}
203
+ direction={size === "small" ? "row" : "column"}
204
+ disabled={disabled}
205
+ remove={remove}
206
+ index={index}
207
+ copy={copy}
208
+ canAddElements={canAddElements}
209
+ sortable={sortable}
210
+ addInIndex={addInIndex}
211
+ />
212
+ </div>
213
+ </div>
214
+ );
215
+ }
216
+
217
+ export function ArrayItemOptions({
218
+ dragHandleProps,
219
+ direction,
220
+ disabled,
221
+ remove,
222
+ index,
223
+ copy,
224
+ canAddElements,
225
+ sortable,
226
+ addInIndex,
227
+ }: {
228
+ dragHandleProps: any;
229
+ direction?: "row" | "column";
230
+ disabled: boolean;
231
+ remove: (index: number) => void;
232
+ index: number;
233
+ copy: (index: number) => void;
234
+ sortable: boolean;
235
+ canAddElements?: boolean;
236
+ addInIndex?: (index: number) => void;
237
+ }) {
238
+ const [menuOpen, setMenuOpen] = useState(false);
239
+ const iconRef = useRef<HTMLDivElement>(null);
240
+ useOutsideAlerter(iconRef, () => {
241
+ if (menuOpen) setMenuOpen(false);
242
+ });
243
+
244
+ const showMenu = canAddElements ?? false;
245
+
246
+ const handleIconButtonClick = (e: React.MouseEvent) => {
247
+ if (showMenu) {
248
+ e.stopPropagation();
249
+ e.preventDefault();
250
+ setMenuOpen(o => !o);
251
+ } else if (sortable) {
252
+ // Allow drag to propagate if menu is not shown
253
+ } else {
254
+ e.stopPropagation();
255
+ e.preventDefault();
256
+ }
257
+ };
258
+
259
+ const title = !disabled && sortable && showMenu ? "Drag to move. Click for options" :
260
+ !disabled && showMenu ? "Click for options" :
261
+ !disabled && sortable ? "Drag to move" : undefined;
262
+
263
+ return (
264
+ <div ref={iconRef}
265
+ className={`pl-2 pt-1 pb-1 flex ${direction === "row" ? "flex-row-reverse" : "flex-col"} items-center`}>
266
+ <Tooltip
267
+ delayDuration={400}
268
+ open={menuOpen ? false : undefined}
269
+ side={direction === "column" ? "left" : undefined}
270
+ title={title}
271
+ >
272
+ <IconButton
273
+ size="small"
274
+ disabled={disabled || (!showMenu && !sortable)}
275
+ {...(sortable ? dragHandleProps : {})}
276
+ onClick={handleIconButtonClick}
277
+ onFocus={() => {
278
+ if (sortable && menuOpen) setMenuOpen(false);
279
+ }}
280
+ className={cls(
281
+ (disabled || (!sortable && !showMenu)) ? "cursor-inherit" : "",
282
+ sortable && !disabled ? "cursor-grab" : "",
283
+ !sortable && showMenu && !disabled ? "cursor-pointer" : ""
284
+ )}
285
+ >
286
+ <HandleIcon/>
287
+ </IconButton>
288
+ </Tooltip>
289
+ {showMenu && (
290
+ <Menu portalContainer={iconRef.current} open={menuOpen} trigger={<div tabIndex={-1}/>}>
291
+ <MenuItem
292
+ dense
293
+ onClick={(e: React.MouseEvent) => {
294
+ setMenuOpen(false);
295
+ remove(index);
296
+ }}
297
+ >
298
+ <RemoveIcon size={"small"}/>
299
+ Remove
300
+ </MenuItem>
301
+ <MenuItem
302
+ dense
303
+ onClick={() => {
304
+ setMenuOpen(false);
305
+ copy(index);
306
+ }}
307
+ >
308
+ <ContentCopyIcon size={"small"}/>
309
+ Copy
310
+ </MenuItem>
311
+ {addInIndex && (
312
+ <MenuItem
313
+ dense
314
+ onClick={() => {
315
+ setMenuOpen(false);
316
+ addInIndex(index);
317
+ }}
318
+ >
319
+ <KeyboardArrowUpIcon size={"small"}/>
320
+ Add on top
321
+ </MenuItem>
322
+ )}
323
+ {addInIndex && (
324
+ <MenuItem
325
+ dense
326
+ onClick={() => {
327
+ setMenuOpen(false);
328
+ addInIndex(index + 1);
329
+ }}
330
+ >
331
+ <KeyboardArrowDownIcon size={"small"}/>
332
+ Add below
333
+ </MenuItem>
334
+ )}
335
+ </Menu>
336
+ )}
337
+ </div>
338
+ );
339
+ }
41
340
 
42
- /**
43
- * @group Form custom fields
44
- */
45
341
  export function ArrayContainer<T>({
46
342
  droppableId,
47
343
  addLabel,
@@ -50,20 +346,37 @@ export function ArrayContainer<T>({
50
346
  buildEntry,
51
347
  size = "medium",
52
348
  onInternalIdAdded,
53
- includeAddButton,
349
+ includeAddButton: deprecatedIncludeAddButton,
350
+ canAddElements: canAddElementsProp = true,
351
+ sortable = true,
54
352
  newDefaultEntry,
55
- onValueChange
353
+ onValueChange,
354
+ className,
355
+ min = 0,
356
+ max = Infinity
56
357
  }: ArrayContainerProps<T>) {
358
+ const canAddElements =
359
+ (canAddElementsProp === undefined ? true : canAddElementsProp) && // Default canAddElementsProp to true if undefined
360
+ (deprecatedIncludeAddButton === undefined || deprecatedIncludeAddButton);
57
361
 
58
362
  const hasValue = value && Array.isArray(value) && value.length > 0;
59
-
60
- // Used to track the ids that have displayed the initial show animation
61
363
  const internalIdsRef = useRef<Record<string, number>>(buildIdsMap(value));
62
-
63
364
  const [internalIds, setInternalIds] = useState<number[]>(
64
- hasValue
65
- ? Object.values(internalIdsRef.current)
66
- : []);
365
+ hasValue ? Object.values(internalIdsRef.current) : []
366
+ );
367
+ const itemCustomPropsRef = useRef<Record<number, object>>({});
368
+
369
+ const updateItemCustomProps = useCallback((internalId: number, customProps: object) => {
370
+ itemCustomPropsRef.current[internalId] = customProps;
371
+ }, []);
372
+
373
+ const pointerSensor = useSensor(PointerSensor, {
374
+ activationConstraint: {
375
+ distance: 5,
376
+ },
377
+ });
378
+ const keyboardSensor = useSensor(KeyboardSensor, {});
379
+ const sensors = useSensors(pointerSensor, keyboardSensor);
67
380
 
68
381
  useEffect(() => {
69
382
  if (hasValue && value && value.length !== internalIds.length) {
@@ -83,16 +396,16 @@ export function ArrayContainer<T>({
83
396
 
84
397
  const insertInEnd = (e: React.SyntheticEvent) => {
85
398
  e.preventDefault();
86
- if (disabled) return;
399
+ if (disabled || (value ?? []).length >= max) return;
87
400
  const id = getRandomId();
88
401
  const newIds: number[] = [...internalIds, id];
89
- if (onInternalIdAdded)
90
- onInternalIdAdded(id);
402
+ if (onInternalIdAdded) onInternalIdAdded(id);
91
403
  setInternalIds(newIds);
92
404
  onValueChange([...(value ?? []), newDefaultEntry]);
93
405
  };
94
406
 
95
407
  const remove = (index: number) => {
408
+ if ((value ?? []).length <= min) return;
96
409
  const newIds = [...internalIds];
97
410
  newIds.splice(index, 1);
98
411
  setInternalIds(newIds);
@@ -100,229 +413,134 @@ export function ArrayContainer<T>({
100
413
  };
101
414
 
102
415
  const copy = (index: number) => {
416
+ if ((value ?? []).length >= max) return;
103
417
  const id = getRandomId();
104
418
  const copyingItem = value[index];
105
419
  const newIds: number[] = [
106
- ...internalIds.splice(0, index + 1),
420
+ ...internalIds.slice(0, index + 1),
107
421
  id,
108
- ...internalIds.splice(index + 1, internalIds.length - index - 1)];
109
- if (onInternalIdAdded)
110
- onInternalIdAdded(id);
422
+ ...internalIds.slice(index + 1)
423
+ ];
424
+ if (onInternalIdAdded) onInternalIdAdded(id);
111
425
  setInternalIds(newIds);
112
- // insert value in index + 1
113
426
  onValueChange([...value.slice(0, index + 1), copyingItem, ...value.slice(index + 1)]);
114
427
  };
115
428
 
116
- const onDragEnd = (result: any) => {
117
- // dropped outside the list
118
- if (!result.destination) {
119
- return;
120
- }
121
- const sourceIndex = result.source.index;
122
- const destinationIndex = result.destination.index;
123
-
124
- const newIds = [...internalIds];
125
- const temp = newIds[sourceIndex];
126
- newIds[sourceIndex] = newIds[destinationIndex];
127
- newIds[destinationIndex] = temp;
429
+ const addInIndex = (index: number) => {
430
+ if ((value ?? []).length >= max) return;
431
+ const id = getRandomId();
432
+ const newIds: number[] = [
433
+ ...internalIds.slice(0, index),
434
+ id,
435
+ ...internalIds.slice(index)
436
+ ];
437
+ if (onInternalIdAdded) onInternalIdAdded(id);
128
438
  setInternalIds(newIds);
129
-
130
- onValueChange(arrayMove(value, sourceIndex, destinationIndex));
439
+ onValueChange([...value.slice(0, index), newDefaultEntry, ...value.slice(index)]);
131
440
  };
132
441
 
133
- return (
134
- <DragDropContext onDragEnd={onDragEnd}>
135
- <Droppable droppableId={droppableId}
136
- renderClone={(provided, snapshot, rubric) => {
137
- const index = rubric.source.index;
138
- const internalId = internalIds[index];
139
- return (
140
- <ArrayContainerItem
141
- provided={provided}
142
- internalId={internalId}
143
- index={index}
144
- size={size}
145
- disabled={disabled}
146
- buildEntry={buildEntry}
147
- remove={remove}
148
- copy={copy}
149
- isDragging={snapshot.isDragging}
150
- />
151
- );
152
- }}
153
- >
154
- {(droppableProvided, droppableSnapshot) => (
155
- <div
156
- {...droppableProvided.droppableProps}
157
- ref={droppableProvided.innerRef}>
158
- {hasValue && internalIds.map((internalId: number, index: number) => {
159
- return (
160
- <Draggable
161
- key={`array_field_${internalId}`}
162
- draggableId={`array_field_${internalId}`}
163
- isDragDisabled={disabled}
164
- index={index}>
165
- {(provided, snapshot) => (
166
- <ArrayContainerItem
167
- provided={provided}
168
- internalId={internalId}
169
- index={index}
170
- size={size}
171
- disabled={disabled}
172
- buildEntry={buildEntry}
173
- remove={remove}
174
- copy={copy}
175
- isDragging={snapshot.isDragging}
176
- />
177
- )}
178
- </Draggable>
179
- );
180
- })}
181
-
182
- {droppableProvided.placeholder}
442
+ const onDragEnd = (event: DragEndEvent) => {
443
+ const {
444
+ active,
445
+ over
446
+ } = event;
447
+ if (!over || active.id === over.id) return;
448
+
449
+ const oldIndex = internalIds.indexOf(active.id as number);
450
+ const newIndex = internalIds.indexOf(over.id as number);
451
+ if (oldIndex === -1 || newIndex === -1) return;
452
+ const newIds = arrayMove(internalIds, oldIndex, newIndex);
453
+ setInternalIds(newIds);
454
+ onValueChange(arrayMove(value, oldIndex, newIndex));
455
+ };
183
456
 
184
- {includeAddButton && <div className="py-4 justify-center text-left">
457
+ return sortable ? (
458
+ <DndContext sensors={sensors}
459
+ modifiers={[restrictToVerticalAxis]}
460
+ collisionDetection={closestCenter}
461
+ onDragEnd={onDragEnd}>
462
+ <SortableContext items={internalIds} strategy={verticalListSortingStrategy}>
463
+ <div className={cls("space-y-1", className)} id={droppableId}>
464
+ {hasValue &&
465
+ internalIds.map((internalId: number, index: number) => (
466
+ <SortableItem
467
+ key={`array_field_${internalId}`}
468
+ id={internalId}
469
+ index={index}
470
+ size={size}
471
+ disabled={disabled}
472
+ buildEntry={buildEntry}
473
+ remove={remove}
474
+ copy={copy}
475
+ addInIndex={addInIndex}
476
+ canAddElements={canAddElements}
477
+ sortable={sortable}
478
+ storedProps={itemCustomPropsRef.current[internalId]}
479
+ updateItemCustomProps={updateItemCustomProps}
480
+ />
481
+ ))}
482
+ {canAddElements && (
483
+ <div className="my-4 justify-center text-left">
185
484
  <Button
186
485
  variant={"text"}
187
486
  size={size === "small" ? "small" : "medium"}
188
487
  color="primary"
189
- disabled={disabled}
488
+ disabled={disabled || (value?.length ?? 0) >= max}
190
489
  startIcon={<AddIcon/>}
191
- onClick={insertInEnd}>
490
+ onClick={insertInEnd}
491
+ className={"ml-3.5"}
492
+ >
192
493
  {addLabel ?? "Add"}
193
494
  </Button>
194
- </div>}
195
- </div>
196
- )}
197
- </Droppable>
198
- </DragDropContext>
199
- );
200
- }
201
-
202
- type ArrayContainerItemProps = {
203
- provided: DraggableProvided,
204
- index: number,
205
- internalId: number,
206
- size?: "small" | "medium",
207
- disabled: boolean,
208
- buildEntry: (index: number, internalId: number) => React.ReactNode,
209
- remove: (index: number) => void,
210
- copy: (index: number) => void,
211
- isDragging: boolean,
212
- };
213
-
214
- export function ArrayContainerItem({
215
- provided,
216
- index,
217
- internalId,
218
- size,
219
- disabled,
220
- buildEntry,
221
- remove,
222
- copy,
223
- isDragging
224
- }: ArrayContainerItemProps) {
225
-
226
- const [onHover, setOnHover] = React.useState(false);
227
- const setOnHoverTrue = useCallback(() => setOnHover(true), []);
228
- const setOnHoverFalse = useCallback(() => setOnHover(false), []);
229
-
230
- return <div
231
- onMouseEnter={setOnHoverTrue}
232
- onMouseMove={setOnHoverTrue}
233
- onMouseLeave={setOnHoverFalse}
234
- ref={provided.innerRef}
235
- {...provided.draggableProps}
236
- style={provided.draggableProps.style}
237
- className={`${
238
- (isDragging || onHover) ? fieldBackgroundHoverMixin : ""
239
- } mb-1 rounded-md opacity-100`}
240
- >
241
- <div
242
- className="flex items-start">
243
- <div className="flex-grow w-[calc(100%-48px)] text-text-primary dark:text-text-primary-dark">
244
- {buildEntry(index, internalId)}
245
- </div>
246
- <ArrayItemOptions direction={size === "small" ? "row" : "column"}
247
- disabled={disabled}
248
- remove={remove}
249
- index={index}
250
- provided={provided}
251
- copy={copy}/>
495
+ </div>
496
+ )}
497
+ </div>
498
+ </SortableContext>
499
+ </DndContext>
500
+ ) : (
501
+ <div className={cls("space-y-1", className)} id={droppableId}>
502
+ {hasValue &&
503
+ internalIds.map((internalId: number, index: number) => (
504
+ <ArrayContainerItem
505
+ key={`array_field_${internalId}`}
506
+ nodeRef={(node: HTMLElement | null) => {
507
+ }}
508
+ style={{}}
509
+ dragHandleProps={{}}
510
+ internalId={internalId}
511
+ index={index}
512
+ size={size}
513
+ disabled={disabled}
514
+ buildEntry={buildEntry}
515
+ remove={remove}
516
+ copy={copy}
517
+ addInIndex={addInIndex}
518
+ canAddElements={canAddElements}
519
+ sortable={false}
520
+ isDragging={false}
521
+ storedProps={itemCustomPropsRef.current[internalId]}
522
+ updateItemCustomProps={updateItemCustomProps}
523
+ />
524
+ ))}
525
+ {canAddElements && (
526
+ <div className="my-4 justify-center text-left">
527
+ <Button
528
+ variant={"text"}
529
+ size={size === "small" ? "small" : "medium"}
530
+ color="primary"
531
+ disabled={disabled || (value?.length ?? 0) >= max}
532
+ startIcon={<AddIcon/>}
533
+ onClick={insertInEnd}
534
+ >
535
+ {addLabel ?? "Add"}
536
+ </Button>
537
+ </div>
538
+ )}
252
539
  </div>
253
- </div>;
254
- }
255
-
256
-
257
- export function ArrayItemOptions({
258
- direction,
259
- disabled,
260
- remove,
261
- index,
262
- provided,
263
- copy,
264
- }: {
265
- direction?: "row" | "column",
266
- disabled: boolean,
267
- remove: (index: number) => void,
268
- index: number,
269
- provided: any,
270
- copy: (index: number) => void
271
- }) {
272
-
273
- const [menuOpen, setMenuOpen] = useState(false);
274
-
275
- const iconRef = React.useRef<HTMLDivElement>(null);
276
- useOutsideAlerter(iconRef, () => setMenuOpen(false));
277
-
278
- return <div className={`pl-2 pt-1 pb-4 flex ${direction === "row" ? "flex-row-reverse" : "flex-col"} items-center`}
279
- ref={iconRef}
280
- {...provided.dragHandleProps}>
281
- <Tooltip
282
- delayDuration={400}
283
- open={menuOpen ? false : undefined}
284
- side={direction === "column" ? "left" : undefined}
285
- title="Drag to move. Click for more options">
286
-
287
- <IconButton
288
- size="small"
289
- disabled={disabled}
290
- onClick={() => setMenuOpen(true)}
291
- onDragStart={(e: any) => {
292
- setMenuOpen(false);
293
- }}
294
- className={`cursor-${disabled ? "inherit" : "grab"}`}>
295
- <HandleIcon/>
296
- </IconButton>
297
-
298
- <Menu
299
- portalContainer={iconRef.current}
300
- open={menuOpen}
301
- trigger={<div/>}>
302
-
303
- <MenuItem dense onClick={(e) => {
304
- setMenuOpen(false);
305
- remove(index);
306
- }}>
307
- <RemoveIcon size={"small"}/>
308
- Remove
309
- </MenuItem>
310
- <MenuItem dense onClick={() => {
311
- setMenuOpen(false);
312
- copy(index);
313
- }}>
314
- <ContentCopyIcon size={"small"}/>
315
- Copy
316
- </MenuItem>
317
-
318
- </Menu>
319
-
320
- </Tooltip>
321
-
322
- </div>;
540
+ );
323
541
  }
324
542
 
325
- function arrayMove(value: any[], sourceIndex: number, destinationIndex: number) {
543
+ function arrayMove<T>(value: T[], sourceIndex: number, destinationIndex: number): T[] {
326
544
  const result = Array.from(value);
327
545
  const [removed] = result.splice(sourceIndex, 1);
328
546
  result.splice(destinationIndex, 0, removed);