@firecms/core 3.0.0-canary.29 → 3.0.0-canary.290

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 (433) 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 +31 -12
  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 +14 -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 +20 -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 +10 -7
  26. package/dist/components/ErrorView.d.ts +1 -1
  27. package/dist/components/HomePage/DefaultHomePage.d.ts +2 -15
  28. package/dist/components/HomePage/HomePageDnD.d.ts +77 -0
  29. package/dist/components/HomePage/NavigationCard.d.ts +3 -1
  30. package/dist/components/HomePage/NavigationCardBinding.d.ts +4 -3
  31. package/dist/components/HomePage/NavigationGroup.d.ts +8 -1
  32. package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
  33. package/dist/components/PropertyCollectionView.d.ts +23 -0
  34. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  35. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  36. package/dist/components/ReferenceWidget.d.ts +3 -1
  37. package/dist/components/SelectableTable/SelectableTable.d.ts +14 -4
  38. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  39. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  40. package/dist/components/UserDisplay.d.ts +7 -0
  41. package/dist/components/VirtualTable/VirtualTableProps.d.ts +24 -12
  42. package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
  43. package/dist/components/VirtualTable/types.d.ts +3 -3
  44. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  45. package/dist/components/common/index.d.ts +2 -1
  46. package/dist/components/common/table_height.d.ts +5 -0
  47. package/dist/components/common/types.d.ts +4 -6
  48. package/dist/components/common/useColumnsIds.d.ts +3 -1
  49. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  50. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  51. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  52. package/dist/components/index.d.ts +5 -2
  53. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  54. package/dist/contexts/InternalUserManagementContext.d.ts +3 -0
  55. package/dist/core/DefaultAppBar.d.ts +29 -0
  56. package/dist/core/DefaultDrawer.d.ts +19 -0
  57. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  58. package/dist/core/EntityEditView.d.ts +49 -11
  59. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  60. package/dist/core/FireCMS.d.ts +2 -3
  61. package/dist/core/FireCMSRouter.d.ts +4 -0
  62. package/dist/core/NavigationRoutes.d.ts +2 -3
  63. package/dist/core/SideDialogs.d.ts +4 -2
  64. package/dist/core/field_configs.d.ts +1 -1
  65. package/dist/core/index.d.ts +4 -4
  66. package/dist/form/EntityForm.d.ts +40 -64
  67. package/dist/form/EntityFormActions.d.ts +21 -0
  68. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  69. package/dist/form/components/ErrorFocus.d.ts +1 -1
  70. package/dist/form/components/FieldHelperText.d.ts +3 -3
  71. package/dist/form/components/FormEntry.d.ts +6 -0
  72. package/dist/form/components/FormLayout.d.ts +5 -0
  73. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  74. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  75. package/dist/form/components/LocalChangesMenu.d.ts +11 -0
  76. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  77. package/dist/form/components/index.d.ts +3 -1
  78. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  80. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  81. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  82. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  83. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  84. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  85. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  86. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  87. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  88. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  89. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  90. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +5 -13
  91. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  92. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  93. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +12 -0
  94. package/dist/form/index.d.ts +18 -18
  95. package/dist/form/useClearRestoreValue.d.ts +2 -2
  96. package/dist/hooks/data/delete.d.ts +4 -4
  97. package/dist/hooks/data/save.d.ts +4 -5
  98. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  99. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  100. package/dist/hooks/index.d.ts +3 -0
  101. package/dist/hooks/useAuthController.d.ts +1 -1
  102. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  103. package/dist/hooks/useBuildNavigationController.d.ts +57 -13
  104. package/dist/hooks/useCollapsedGroups.d.ts +9 -0
  105. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  106. package/dist/hooks/useInternalUserManagementController.d.ts +12 -0
  107. package/dist/hooks/useModeController.d.ts +1 -2
  108. package/dist/hooks/useProjectLog.d.ts +8 -2
  109. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  110. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  111. package/dist/index.d.ts +1 -0
  112. package/dist/index.es.js +24546 -13965
  113. package/dist/index.es.js.map +1 -1
  114. package/dist/index.umd.js +27256 -588
  115. package/dist/index.umd.js.map +1 -1
  116. package/dist/internal/useBuildDataSource.d.ts +3 -17
  117. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  118. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  119. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  120. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  121. package/dist/preview/components/ReferencePreview.d.ts +4 -3
  122. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  123. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  124. package/dist/preview/components/UserPreview.d.ts +8 -0
  125. package/dist/preview/index.d.ts +1 -0
  126. package/dist/preview/util.d.ts +3 -3
  127. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  128. package/dist/routes/FireCMSRoute.d.ts +1 -0
  129. package/dist/routes/HomePageRoute.d.ts +3 -0
  130. package/dist/types/analytics.d.ts +1 -1
  131. package/dist/types/auth.d.ts +8 -10
  132. package/dist/types/collections.d.ts +123 -25
  133. package/dist/types/customization_controller.d.ts +8 -0
  134. package/dist/types/datasource.d.ts +52 -36
  135. package/dist/types/dialogs_controller.d.ts +7 -3
  136. package/dist/types/entities.d.ts +12 -3
  137. package/dist/types/entity_actions.d.ts +72 -8
  138. package/dist/types/entity_callbacks.d.ts +16 -16
  139. package/dist/types/entity_overrides.d.ts +2 -2
  140. package/dist/types/export_import.d.ts +4 -4
  141. package/dist/types/fields.d.ts +79 -39
  142. package/dist/types/firecms.d.ts +31 -3
  143. package/dist/types/firecms_context.d.ts +17 -1
  144. package/dist/types/index.d.ts +1 -1
  145. package/dist/types/internal_user_management.d.ts +20 -0
  146. package/dist/types/navigation.d.ts +62 -19
  147. package/dist/types/permissions.d.ts +4 -4
  148. package/dist/types/plugins.d.ts +58 -13
  149. package/dist/types/properties.d.ts +122 -31
  150. package/dist/types/property_config.d.ts +1 -3
  151. package/dist/types/roles.d.ts +3 -0
  152. package/dist/types/side_dialogs_controller.d.ts +10 -0
  153. package/dist/types/side_entity_controller.d.ts +14 -1
  154. package/dist/types/storage.d.ts +75 -0
  155. package/dist/types/user.d.ts +2 -1
  156. package/dist/util/builders.d.ts +3 -3
  157. package/dist/util/callbacks.d.ts +2 -0
  158. package/dist/util/collections.d.ts +1 -0
  159. package/dist/util/createFormexStub.d.ts +2 -0
  160. package/dist/util/entities.d.ts +3 -3
  161. package/dist/util/entity_actions.d.ts +2 -0
  162. package/dist/util/entity_cache.d.ts +28 -0
  163. package/dist/util/icon_list.d.ts +5 -1
  164. package/dist/util/icon_synonyms.d.ts +1 -98
  165. package/dist/util/icons.d.ts +7 -4
  166. package/dist/util/index.d.ts +3 -0
  167. package/dist/util/make_properties_editable.d.ts +1 -2
  168. package/dist/util/navigation_from_path.d.ts +10 -1
  169. package/dist/util/navigation_utils.d.ts +15 -3
  170. package/dist/util/objects.d.ts +3 -1
  171. package/dist/util/permissions.d.ts +4 -4
  172. package/dist/util/plurals.d.ts +0 -2
  173. package/dist/util/property_utils.d.ts +4 -4
  174. package/dist/util/references.d.ts +2 -2
  175. package/dist/util/resolutions.d.ts +42 -17
  176. package/dist/util/storage.d.ts +23 -2
  177. package/dist/util/useStorageUploadController.d.ts +4 -3
  178. package/package.json +70 -53
  179. package/src/app/AppBar.tsx +18 -0
  180. package/src/app/Drawer.tsx +24 -0
  181. package/src/app/Scaffold.tsx +253 -0
  182. package/src/app/index.ts +4 -0
  183. package/src/app/useApp.tsx +32 -0
  184. package/src/components/ArrayContainer.tsx +447 -229
  185. package/src/components/CircularProgressCenter.tsx +2 -2
  186. package/src/components/ClearFilterSortButton.tsx +41 -0
  187. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +12 -11
  188. package/src/components/DeleteEntityDialog.tsx +13 -20
  189. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +87 -62
  190. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  191. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  192. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +84 -42
  193. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  194. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  195. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  196. package/src/components/EntityCollectionTable/index.tsx +1 -1
  197. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +34 -39
  198. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +49 -36
  199. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  200. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +135 -105
  201. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
  202. package/src/components/EntityCollectionView/EntityCollectionView.tsx +241 -119
  203. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +7 -4
  204. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  205. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  206. package/src/components/EntityCollectionView/utils.ts +19 -0
  207. package/src/components/EntityJsonPreview.tsx +66 -0
  208. package/src/components/EntityPreview.tsx +83 -62
  209. package/src/components/EntityView.tsx +34 -42
  210. package/src/components/ErrorView.tsx +4 -4
  211. package/src/components/FireCMSLogo.tsx +7 -51
  212. package/src/components/HomePage/DefaultHomePage.tsx +516 -158
  213. package/src/components/HomePage/FavouritesView.tsx +9 -14
  214. package/src/components/HomePage/HomePageDnD.tsx +702 -0
  215. package/src/components/HomePage/NavigationCard.tsx +48 -39
  216. package/src/components/HomePage/NavigationCardBinding.tsx +17 -16
  217. package/src/components/HomePage/NavigationGroup.tsx +144 -30
  218. package/src/components/HomePage/RenameGroupDialog.tsx +123 -0
  219. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  220. package/src/components/NotFoundPage.tsx +2 -2
  221. package/src/components/PropertyCollectionView.tsx +329 -0
  222. package/src/components/PropertyConfigBadge.tsx +10 -4
  223. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  224. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +23 -13
  225. package/src/components/ReferenceWidget.tsx +21 -11
  226. package/src/components/SearchIconsView.tsx +10 -7
  227. package/src/components/SelectableTable/SelectableTable.tsx +157 -157
  228. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  229. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +27 -9
  230. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  231. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -24
  232. package/src/components/UnsavedChangesDialog.tsx +46 -0
  233. package/src/components/UserDisplay.tsx +55 -0
  234. package/src/components/VirtualTable/VirtualTable.tsx +105 -51
  235. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  236. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  237. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  238. package/src/components/VirtualTable/VirtualTableProps.tsx +28 -14
  239. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  240. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  241. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
  242. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  243. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  244. package/src/components/VirtualTable/fields/VirtualTableUserSelect.tsx +99 -0
  245. package/src/components/VirtualTable/types.tsx +2 -3
  246. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +64 -44
  247. package/src/components/common/index.ts +2 -1
  248. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  249. package/src/components/common/types.tsx +4 -6
  250. package/src/components/common/useColumnsIds.tsx +16 -2
  251. package/src/components/common/useDataSourceTableController.tsx +420 -0
  252. package/src/components/common/useDebouncedCallback.tsx +20 -0
  253. package/src/components/common/useScrollRestoration.tsx +68 -0
  254. package/src/components/common/useTableSearchHelper.ts +53 -12
  255. package/src/components/index.tsx +6 -2
  256. package/src/contexts/BreacrumbsContext.tsx +38 -0
  257. package/src/contexts/DialogsProvider.tsx +5 -4
  258. package/src/contexts/InternalUserManagementContext.tsx +4 -0
  259. package/src/contexts/ModeController.tsx +1 -3
  260. package/src/contexts/SnackbarProvider.tsx +2 -0
  261. package/src/core/DefaultAppBar.tsx +219 -0
  262. package/src/core/DefaultDrawer.tsx +185 -0
  263. package/src/core/DrawerNavigationItem.tsx +66 -0
  264. package/src/core/EntityEditView.tsx +447 -469
  265. package/src/core/EntityEditViewFormActions.tsx +344 -0
  266. package/src/core/EntitySidePanel.tsx +96 -23
  267. package/src/core/FireCMS.tsx +85 -60
  268. package/src/core/FireCMSRouter.tsx +17 -0
  269. package/src/core/NavigationRoutes.tsx +28 -38
  270. package/src/core/SideDialogs.tsx +22 -12
  271. package/src/core/field_configs.tsx +41 -14
  272. package/src/core/index.tsx +6 -5
  273. package/src/form/EntityForm.tsx +740 -523
  274. package/src/form/EntityFormActions.tsx +226 -0
  275. package/src/form/PropertyFieldBinding.tsx +88 -41
  276. package/src/form/components/CustomIdField.tsx +9 -3
  277. package/src/form/components/ErrorFocus.tsx +22 -29
  278. package/src/form/components/FieldHelperText.tsx +4 -4
  279. package/src/form/components/FormEntry.tsx +22 -0
  280. package/src/form/components/FormLayout.tsx +16 -0
  281. package/src/form/components/LabelWithIcon.tsx +30 -19
  282. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  283. package/src/form/components/LocalChangesMenu.tsx +144 -0
  284. package/src/form/components/StorageItemPreview.tsx +23 -13
  285. package/src/form/components/StorageUploadProgress.tsx +5 -6
  286. package/src/form/components/index.tsx +3 -1
  287. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +34 -19
  288. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +50 -36
  289. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -33
  290. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  291. package/src/form/field_bindings/KeyValueFieldBinding.tsx +61 -52
  292. package/src/form/field_bindings/MapFieldBinding.tsx +73 -55
  293. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +159 -0
  294. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
  295. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  296. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  297. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  298. package/src/form/field_bindings/RepeatFieldBinding.tsx +62 -35
  299. package/src/form/field_bindings/SelectFieldBinding.tsx +24 -15
  300. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +257 -199
  301. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  302. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  303. package/src/form/field_bindings/UserSelectFieldBinding.tsx +94 -0
  304. package/src/form/index.tsx +21 -37
  305. package/src/form/useClearRestoreValue.tsx +2 -2
  306. package/src/form/validation.ts +13 -23
  307. package/src/hooks/data/delete.ts +6 -5
  308. package/src/hooks/data/save.ts +26 -33
  309. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  310. package/src/hooks/data/useDataSource.tsx +11 -3
  311. package/src/hooks/data/useEntityFetch.tsx +10 -6
  312. package/src/hooks/index.tsx +4 -0
  313. package/src/hooks/useAuthController.tsx +1 -1
  314. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  315. package/src/hooks/useBrowserTitleAndIcon.tsx +1 -1
  316. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  317. package/src/hooks/useBuildModeController.tsx +22 -29
  318. package/src/hooks/useBuildNavigationController.tsx +515 -121
  319. package/src/hooks/useCollapsedGroups.ts +64 -0
  320. package/src/hooks/useFireCMSContext.tsx +9 -35
  321. package/src/hooks/useInternalUserManagementController.tsx +16 -0
  322. package/src/hooks/useLargeLayout.tsx +0 -35
  323. package/src/hooks/useModeController.tsx +1 -2
  324. package/src/hooks/useProjectLog.tsx +32 -10
  325. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  326. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  327. package/src/index.ts +1 -0
  328. package/src/internal/useBuildDataSource.ts +79 -85
  329. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  330. package/src/internal/useBuildSideEntityController.tsx +204 -77
  331. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  332. package/src/preview/PropertyPreview.tsx +42 -25
  333. package/src/preview/PropertyPreviewProps.tsx +7 -1
  334. package/src/preview/components/BooleanPreview.tsx +2 -2
  335. package/src/preview/components/EmptyValue.tsx +1 -1
  336. package/src/preview/components/EnumValuesChip.tsx +2 -2
  337. package/src/preview/components/ImagePreview.tsx +26 -37
  338. package/src/preview/components/ReferencePreview.tsx +30 -38
  339. package/src/preview/components/StorageThumbnail.tsx +5 -1
  340. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  341. package/src/preview/components/UserPreview.tsx +27 -0
  342. package/src/preview/index.ts +1 -0
  343. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -6
  344. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +7 -5
  345. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -4
  346. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -4
  347. package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -6
  348. package/src/preview/property_previews/ArrayPropertyPreview.tsx +8 -7
  349. package/src/preview/property_previews/MapPropertyPreview.tsx +14 -13
  350. package/src/preview/property_previews/NumberPropertyPreview.tsx +2 -2
  351. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  352. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  353. package/src/preview/util.ts +10 -10
  354. package/src/routes/CustomCMSRoute.tsx +21 -0
  355. package/src/routes/FireCMSRoute.tsx +246 -0
  356. package/src/routes/HomePageRoute.tsx +17 -0
  357. package/src/types/analytics.ts +3 -0
  358. package/src/types/auth.tsx +9 -13
  359. package/src/types/collections.ts +146 -30
  360. package/src/types/customization_controller.tsx +9 -1
  361. package/src/types/datasource.ts +61 -43
  362. package/src/types/dialogs_controller.tsx +7 -3
  363. package/src/types/entities.ts +19 -3
  364. package/src/types/entity_actions.tsx +86 -10
  365. package/src/types/entity_callbacks.ts +18 -18
  366. package/src/types/entity_overrides.tsx +2 -2
  367. package/src/types/export_import.ts +4 -4
  368. package/src/types/fields.tsx +91 -42
  369. package/src/types/firecms.tsx +34 -4
  370. package/src/types/firecms_context.tsx +18 -1
  371. package/src/types/index.ts +1 -1
  372. package/src/types/internal_user_management.ts +24 -0
  373. package/src/types/navigation.ts +77 -24
  374. package/src/types/permissions.ts +5 -5
  375. package/src/types/plugins.tsx +69 -15
  376. package/src/types/properties.ts +141 -33
  377. package/src/types/property_config.tsx +2 -2
  378. package/src/types/roles.ts +3 -0
  379. package/src/types/side_dialogs_controller.tsx +15 -0
  380. package/src/types/side_entity_controller.tsx +16 -1
  381. package/src/types/storage.ts +83 -1
  382. package/src/types/user.ts +3 -1
  383. package/src/util/builders.ts +10 -8
  384. package/src/util/callbacks.ts +119 -0
  385. package/src/util/collections.ts +8 -0
  386. package/src/util/createFormexStub.tsx +66 -0
  387. package/src/util/entities.ts +11 -8
  388. package/src/util/entity_actions.ts +28 -0
  389. package/src/util/entity_cache.ts +223 -0
  390. package/src/util/enums.ts +1 -1
  391. package/src/util/icon_list.ts +16 -10
  392. package/src/util/icon_synonyms.ts +3 -100
  393. package/src/util/icons.tsx +36 -11
  394. package/src/util/index.ts +3 -0
  395. package/src/util/join_collections.ts +11 -4
  396. package/src/util/make_properties_editable.ts +5 -19
  397. package/src/util/navigation_from_path.ts +33 -12
  398. package/src/util/navigation_utils.ts +141 -25
  399. package/src/util/objects.ts +128 -33
  400. package/src/util/parent_references_from_path.ts +3 -3
  401. package/src/util/permissions.ts +9 -8
  402. package/src/util/plurals.ts +0 -2
  403. package/src/util/property_utils.tsx +17 -6
  404. package/src/util/references.ts +19 -8
  405. package/src/util/resolutions.ts +122 -48
  406. package/src/util/storage.ts +79 -21
  407. package/src/util/strings.ts +2 -2
  408. package/src/util/useStorageUploadController.tsx +162 -62
  409. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
  410. package/dist/components/FireCMSAppBar.d.ts +0 -26
  411. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  412. package/dist/components/VirtualTable/common.d.ts +0 -2
  413. package/dist/core/Drawer.d.ts +0 -23
  414. package/dist/core/Scaffold.d.ts +0 -55
  415. package/dist/core/SideEntityView.d.ts +0 -7
  416. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  417. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  418. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  419. package/dist/internal/useLocaleConfig.d.ts +0 -1
  420. package/dist/types/appcheck.d.ts +0 -26
  421. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
  422. package/src/components/FireCMSAppBar.tsx +0 -165
  423. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  424. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  425. package/src/core/Drawer.tsx +0 -191
  426. package/src/core/Scaffold.tsx +0 -281
  427. package/src/core/SideEntityView.tsx +0 -38
  428. package/src/form/components/FormikArrayContainer.tsx +0 -44
  429. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  430. package/src/internal/useBuildCustomizationController.tsx +0 -5
  431. package/src/internal/useLocaleConfig.tsx +0 -18
  432. package/src/types/appcheck.ts +0 -29
  433. /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);