@firecms/core 3.0.0-canary.2 → 3.0.0-canary.200

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 (409) hide show
  1. package/README.md +4 -4
  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 +30 -0
  5. package/dist/app/index.d.ts +4 -0
  6. package/dist/app/useApp.d.ts +16 -0
  7. package/dist/components/ArrayContainer.d.ts +23 -6
  8. package/dist/components/CircularProgressCenter.d.ts +1 -1
  9. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  10. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +13 -13
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +3 -3
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +3 -2
  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 +17 -4
  22. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  23. package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
  24. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  25. package/dist/components/EntityPreview.d.ts +26 -7
  26. package/dist/components/EntityView.d.ts +11 -0
  27. package/dist/components/ErrorView.d.ts +1 -1
  28. package/dist/components/FieldCaption.d.ts +5 -0
  29. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  30. package/dist/components/HomePage/NavigationCard.d.ts +8 -0
  31. package/dist/components/HomePage/{NavigationCollectionCard.d.ts → NavigationCardBinding.d.ts} +3 -3
  32. package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
  33. package/dist/components/HomePage/index.d.ts +3 -1
  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 +6 -4
  37. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  38. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  39. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  40. package/dist/components/VirtualTable/VirtualTableProps.d.ts +29 -13
  41. package/dist/components/VirtualTable/types.d.ts +3 -3
  42. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  43. package/dist/components/common/index.d.ts +2 -1
  44. package/dist/components/common/table_height.d.ts +5 -0
  45. package/dist/components/common/types.d.ts +4 -6
  46. package/dist/components/common/useColumnsIds.d.ts +3 -1
  47. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  48. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  49. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  50. package/dist/components/index.d.ts +8 -5
  51. package/dist/contexts/AuthControllerContext.d.ts +1 -1
  52. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  53. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  54. package/dist/core/DefaultDrawer.d.ts +19 -0
  55. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  56. package/dist/core/EntityEditView.d.ts +44 -0
  57. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  58. package/dist/core/FireCMS.d.ts +2 -2
  59. package/dist/core/FireCMSRouter.d.ts +4 -0
  60. package/dist/core/NavigationRoutes.d.ts +2 -3
  61. package/dist/core/SideDialogs.d.ts +4 -2
  62. package/dist/core/index.d.ts +4 -6
  63. package/dist/form/EntityForm.d.ts +45 -69
  64. package/dist/form/EntityFormActions.d.ts +17 -0
  65. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  66. package/dist/form/components/ErrorFocus.d.ts +1 -1
  67. package/dist/form/components/FieldHelperText.d.ts +3 -3
  68. package/dist/form/components/FormEntry.d.ts +6 -0
  69. package/dist/form/components/FormLayout.d.ts +5 -0
  70. package/dist/{components → form/components}/LabelWithIcon.d.ts +1 -1
  71. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  72. package/dist/form/components/StorageItemPreview.d.ts +4 -3
  73. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  74. package/dist/form/components/index.d.ts +4 -1
  75. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  76. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  77. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  80. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  81. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  82. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  83. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  84. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  85. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  86. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -4
  87. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  88. package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -2
  89. package/dist/form/index.d.ts +17 -18
  90. package/dist/form/useClearRestoreValue.d.ts +2 -2
  91. package/dist/form/validation.d.ts +1 -1
  92. package/dist/hooks/data/delete.d.ts +4 -4
  93. package/dist/hooks/data/save.d.ts +4 -5
  94. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  95. package/dist/hooks/data/useDataSource.d.ts +2 -2
  96. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  97. package/dist/hooks/index.d.ts +4 -1
  98. package/dist/hooks/useAuthController.d.ts +1 -1
  99. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  100. package/dist/{core → hooks}/useBuildModeController.d.ts +1 -1
  101. package/dist/hooks/useBuildNavigationController.d.ts +11 -6
  102. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  103. package/dist/hooks/useModeController.d.ts +1 -2
  104. package/dist/hooks/useProjectLog.d.ts +12 -2
  105. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  106. package/dist/hooks/useStorageSource.d.ts +2 -2
  107. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  108. package/dist/index.d.ts +1 -0
  109. package/dist/index.es.js +22131 -14039
  110. package/dist/index.es.js.map +1 -1
  111. package/dist/index.umd.js +24420 -588
  112. package/dist/index.umd.js.map +1 -1
  113. package/dist/internal/useBuildDataSource.d.ts +1 -12
  114. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  115. package/dist/preview/PropertyPreview.d.ts +1 -1
  116. package/dist/preview/PropertyPreviewProps.d.ts +7 -5
  117. package/dist/preview/components/BooleanPreview.d.ts +5 -1
  118. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  119. package/dist/preview/components/ReferencePreview.d.ts +4 -9
  120. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  121. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  122. package/dist/preview/util.d.ts +3 -3
  123. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  124. package/dist/routes/FireCMSRoute.d.ts +1 -0
  125. package/dist/routes/HomePageRoute.d.ts +3 -0
  126. package/dist/types/analytics.d.ts +1 -1
  127. package/dist/types/auth.d.ts +37 -3
  128. package/dist/types/collections.d.ts +86 -24
  129. package/dist/types/datasource.d.ts +53 -37
  130. package/dist/types/dialogs_controller.d.ts +7 -3
  131. package/dist/types/entities.d.ts +8 -2
  132. package/dist/types/entity_actions.d.ts +28 -4
  133. package/dist/types/entity_callbacks.d.ts +16 -16
  134. package/dist/types/entity_overrides.d.ts +6 -0
  135. package/dist/types/export_import.d.ts +4 -4
  136. package/dist/types/fields.d.ts +71 -42
  137. package/dist/types/firecms.d.ts +6 -2
  138. package/dist/types/firecms_context.d.ts +1 -1
  139. package/dist/types/index.d.ts +2 -1
  140. package/dist/types/navigation.d.ts +45 -26
  141. package/dist/types/permissions.d.ts +8 -4
  142. package/dist/types/plugins.d.ts +40 -31
  143. package/dist/types/properties.d.ts +54 -26
  144. package/dist/types/property_config.d.ts +2 -4
  145. package/dist/types/roles.d.ts +31 -0
  146. package/dist/types/side_dialogs_controller.d.ts +10 -0
  147. package/dist/types/side_entity_controller.d.ts +6 -1
  148. package/dist/types/storage.d.ts +86 -3
  149. package/dist/types/user.d.ts +6 -0
  150. package/dist/util/builders.d.ts +3 -3
  151. package/dist/util/collections.d.ts +9 -1
  152. package/dist/util/entities.d.ts +3 -3
  153. package/dist/util/entity_actions.d.ts +2 -0
  154. package/dist/util/entity_cache.d.ts +23 -0
  155. package/dist/util/icon_list.d.ts +5 -1
  156. package/dist/util/icon_synonyms.d.ts +1 -98
  157. package/dist/util/icons.d.ts +13 -4
  158. package/dist/util/index.d.ts +2 -0
  159. package/dist/util/navigation_from_path.d.ts +6 -1
  160. package/dist/util/navigation_utils.d.ts +14 -3
  161. package/dist/util/objects.d.ts +2 -1
  162. package/dist/util/permissions.d.ts +4 -4
  163. package/dist/util/plurals.d.ts +0 -2
  164. package/dist/util/property_utils.d.ts +3 -3
  165. package/dist/util/references.d.ts +4 -2
  166. package/dist/util/resolutions.d.ts +31 -17
  167. package/dist/util/storage.d.ts +23 -2
  168. package/dist/util/useStorageUploadController.d.ts +3 -3
  169. package/dist/util/useTraceUpdate.d.ts +1 -0
  170. package/package.json +64 -51
  171. package/src/app/AppBar.tsx +18 -0
  172. package/src/app/Drawer.tsx +24 -0
  173. package/src/app/Scaffold.tsx +243 -0
  174. package/src/app/index.ts +4 -0
  175. package/src/app/useApp.tsx +32 -0
  176. package/src/components/ArrayContainer.tsx +126 -40
  177. package/src/components/CircularProgressCenter.tsx +2 -2
  178. package/src/components/ClearFilterSortButton.tsx +41 -0
  179. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  180. package/src/components/DeleteEntityDialog.tsx +14 -23
  181. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +56 -39
  182. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +283 -280
  183. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +29 -8
  184. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +58 -50
  185. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  186. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +40 -33
  187. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +22 -20
  188. package/src/components/EntityCollectionTable/index.tsx +1 -1
  189. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
  190. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  191. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  192. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +81 -80
  193. package/src/components/EntityCollectionView/EntityCollectionView.tsx +228 -155
  194. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +9 -8
  195. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  196. package/src/components/EntityCollectionView/useSelectionController.tsx +43 -0
  197. package/src/components/EntityCollectionView/utils.ts +19 -0
  198. package/src/components/EntityPreview.tsx +218 -71
  199. package/src/components/EntityView.tsx +84 -0
  200. package/src/components/ErrorView.tsx +4 -4
  201. package/src/components/FieldCaption.tsx +14 -0
  202. package/src/components/HomePage/DefaultHomePage.tsx +39 -28
  203. package/src/components/HomePage/FavouritesView.tsx +6 -11
  204. package/src/components/HomePage/NavigationCard.tsx +69 -0
  205. package/src/components/HomePage/NavigationCardBinding.tsx +111 -0
  206. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  207. package/src/components/HomePage/SmallNavigationCard.tsx +44 -0
  208. package/src/components/HomePage/index.tsx +3 -1
  209. package/src/components/NotFoundPage.tsx +2 -2
  210. package/src/components/PropertyConfigBadge.tsx +9 -3
  211. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  212. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +22 -17
  213. package/src/components/ReferenceWidget.tsx +26 -16
  214. package/src/components/SearchIconsView.tsx +10 -7
  215. package/src/components/SelectableTable/SelectableTable.tsx +27 -12
  216. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  217. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  218. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +46 -30
  219. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  220. package/src/components/UnsavedChangesDialog.tsx +42 -0
  221. package/src/components/VirtualTable/VirtualTable.tsx +96 -48
  222. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  223. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  224. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  225. package/src/components/VirtualTable/VirtualTableProps.tsx +34 -15
  226. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  227. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  228. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  229. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  230. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  231. package/src/components/VirtualTable/types.tsx +2 -3
  232. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +40 -43
  233. package/src/components/common/index.ts +2 -1
  234. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  235. package/src/components/common/types.tsx +4 -6
  236. package/src/components/common/useColumnsIds.tsx +24 -3
  237. package/src/components/common/useDataSourceTableController.tsx +420 -0
  238. package/src/components/common/useDebouncedCallback.tsx +20 -0
  239. package/src/components/common/useScrollRestoration.tsx +68 -0
  240. package/src/components/common/useTableSearchHelper.ts +53 -12
  241. package/src/components/index.tsx +8 -5
  242. package/src/contexts/AuthControllerContext.tsx +1 -1
  243. package/src/contexts/BreacrumbsContext.tsx +38 -0
  244. package/src/contexts/DialogsProvider.tsx +5 -4
  245. package/src/contexts/ModeController.tsx +1 -3
  246. package/src/contexts/SnackbarProvider.tsx +2 -0
  247. package/src/core/DefaultAppBar.tsx +207 -0
  248. package/src/core/DefaultDrawer.tsx +185 -0
  249. package/src/core/DrawerNavigationItem.tsx +66 -0
  250. package/src/core/EntityEditView.tsx +455 -0
  251. package/src/core/EntityEditViewFormActions.tsx +199 -0
  252. package/src/core/EntitySidePanel.tsx +87 -18
  253. package/src/core/FireCMS.tsx +67 -44
  254. package/src/core/FireCMSRouter.tsx +17 -0
  255. package/src/core/NavigationRoutes.tsx +36 -38
  256. package/src/core/SideDialogs.tsx +22 -12
  257. package/src/core/field_configs.tsx +11 -12
  258. package/src/core/index.tsx +6 -7
  259. package/src/form/EntityForm.tsx +565 -519
  260. package/src/form/EntityFormActions.tsx +169 -0
  261. package/src/form/PropertyFieldBinding.tsx +85 -44
  262. package/src/form/components/CustomIdField.tsx +6 -2
  263. package/src/form/components/FieldHelperText.tsx +4 -4
  264. package/src/form/components/FormEntry.tsx +22 -0
  265. package/src/form/components/FormLayout.tsx +16 -0
  266. package/src/form/components/LabelWithIcon.tsx +44 -0
  267. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  268. package/src/form/components/StorageItemPreview.tsx +23 -11
  269. package/src/form/components/StorageUploadProgress.tsx +9 -9
  270. package/src/form/components/index.tsx +4 -1
  271. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +32 -21
  272. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +54 -45
  273. package/src/form/field_bindings/BlockFieldBinding.tsx +57 -36
  274. package/src/form/field_bindings/DateTimeFieldBinding.tsx +21 -17
  275. package/src/form/field_bindings/KeyValueFieldBinding.tsx +76 -67
  276. package/src/form/field_bindings/MapFieldBinding.tsx +82 -65
  277. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
  278. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -22
  279. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +12 -17
  280. package/src/form/field_bindings/ReferenceFieldBinding.tsx +47 -34
  281. package/src/form/field_bindings/RepeatFieldBinding.tsx +57 -36
  282. package/src/form/field_bindings/SelectFieldBinding.tsx +24 -17
  283. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +47 -46
  284. package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -27
  285. package/src/form/field_bindings/TextFieldBinding.tsx +35 -30
  286. package/src/form/index.tsx +17 -37
  287. package/src/form/useClearRestoreValue.tsx +2 -2
  288. package/src/form/validation.ts +15 -26
  289. package/src/hooks/data/delete.ts +7 -6
  290. package/src/hooks/data/save.ts +13 -9
  291. package/src/hooks/data/useCollectionFetch.tsx +4 -4
  292. package/src/hooks/data/useDataSource.tsx +15 -2
  293. package/src/hooks/data/useEntityFetch.tsx +11 -7
  294. package/src/hooks/index.tsx +6 -1
  295. package/src/hooks/useAuthController.tsx +1 -1
  296. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  297. package/src/{core → hooks}/useBuildLocalConfigurationPersistence.tsx +8 -10
  298. package/src/{core → hooks}/useBuildModeController.tsx +23 -30
  299. package/src/hooks/useBuildNavigationController.tsx +278 -117
  300. package/src/hooks/useFireCMSContext.tsx +5 -5
  301. package/src/hooks/useLargeLayout.tsx +0 -35
  302. package/src/hooks/useModeController.tsx +1 -2
  303. package/src/hooks/useProjectLog.tsx +41 -9
  304. package/src/hooks/useReferenceDialog.tsx +2 -2
  305. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  306. package/src/hooks/useStorageSource.tsx +7 -2
  307. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  308. package/src/index.ts +1 -0
  309. package/src/internal/useBuildDataSource.ts +72 -77
  310. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  311. package/src/internal/useBuildSideEntityController.tsx +177 -70
  312. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  313. package/src/preview/PropertyPreview.tsx +19 -26
  314. package/src/preview/PropertyPreviewProps.tsx +5 -9
  315. package/src/preview/components/BooleanPreview.tsx +19 -4
  316. package/src/preview/components/EmptyValue.tsx +1 -1
  317. package/src/preview/components/EnumValuesChip.tsx +2 -2
  318. package/src/preview/components/ImagePreview.tsx +25 -36
  319. package/src/preview/components/ReferencePreview.tsx +73 -176
  320. package/src/preview/components/StorageThumbnail.tsx +5 -1
  321. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  322. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  323. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  324. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  325. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  326. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  327. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  328. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  329. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  330. package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
  331. package/src/preview/util.ts +10 -10
  332. package/src/routes/CustomCMSRoute.tsx +21 -0
  333. package/src/routes/FireCMSRoute.tsx +236 -0
  334. package/src/routes/HomePageRoute.tsx +17 -0
  335. package/src/types/analytics.ts +1 -0
  336. package/src/types/auth.tsx +48 -3
  337. package/src/types/collections.ts +102 -27
  338. package/src/types/customization_controller.tsx +0 -1
  339. package/src/types/datasource.ts +62 -44
  340. package/src/types/dialogs_controller.tsx +7 -3
  341. package/src/types/entities.ts +16 -2
  342. package/src/types/entity_actions.tsx +33 -4
  343. package/src/types/entity_callbacks.ts +18 -18
  344. package/src/types/entity_overrides.tsx +7 -0
  345. package/src/types/export_import.ts +4 -4
  346. package/src/types/fields.tsx +81 -46
  347. package/src/types/firecms.tsx +6 -2
  348. package/src/types/firecms_context.tsx +1 -1
  349. package/src/types/index.ts +2 -1
  350. package/src/types/navigation.ts +52 -31
  351. package/src/types/permissions.ts +10 -5
  352. package/src/types/plugins.tsx +47 -39
  353. package/src/types/properties.ts +63 -27
  354. package/src/types/property_config.tsx +2 -4
  355. package/src/types/roles.ts +41 -0
  356. package/src/types/side_dialogs_controller.tsx +15 -0
  357. package/src/types/side_entity_controller.tsx +7 -1
  358. package/src/types/storage.ts +94 -3
  359. package/src/types/user.ts +9 -0
  360. package/src/util/builders.ts +10 -8
  361. package/src/util/collections.ts +22 -0
  362. package/src/util/entities.ts +9 -6
  363. package/src/util/entity_actions.ts +28 -0
  364. package/src/util/entity_cache.ts +204 -0
  365. package/src/util/enums.ts +1 -1
  366. package/src/util/icon_list.ts +16 -10
  367. package/src/util/icon_synonyms.ts +3 -100
  368. package/src/util/icons.tsx +26 -8
  369. package/src/util/index.ts +2 -0
  370. package/src/util/join_collections.ts +3 -0
  371. package/src/util/make_properties_editable.ts +13 -5
  372. package/src/util/navigation_from_path.ts +13 -6
  373. package/src/util/navigation_utils.ts +59 -7
  374. package/src/util/objects.ts +45 -28
  375. package/src/util/parent_references_from_path.ts +3 -3
  376. package/src/util/permissions.ts +20 -16
  377. package/src/util/plurals.ts +0 -2
  378. package/src/util/property_utils.tsx +11 -4
  379. package/src/util/references.ts +45 -5
  380. package/src/util/resolutions.ts +79 -46
  381. package/src/util/storage.ts +79 -21
  382. package/src/util/strings.ts +2 -2
  383. package/src/util/useStorageUploadController.tsx +71 -27
  384. package/src/util/useTraceUpdate.tsx +2 -1
  385. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  386. package/dist/components/VirtualTable/common.d.ts +0 -2
  387. package/dist/core/Drawer.d.ts +0 -23
  388. package/dist/core/Scaffold.d.ts +0 -55
  389. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  390. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  391. package/dist/internal/EntityView.d.ts +0 -22
  392. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  393. package/dist/internal/useLocaleConfig.d.ts +0 -1
  394. package/dist/types/appcheck.d.ts +0 -26
  395. package/src/components/FireCMSAppBar.tsx +0 -157
  396. package/src/components/HomePage/NavigationCollectionCard.tsx +0 -146
  397. package/src/components/LabelWithIcon.tsx +0 -33
  398. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  399. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  400. package/src/core/Drawer.tsx +0 -164
  401. package/src/core/Scaffold.tsx +0 -281
  402. package/src/form/components/FormikArrayContainer.tsx +0 -44
  403. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -696
  404. package/src/internal/EntityView.tsx +0 -578
  405. package/src/internal/useBuildCustomizationController.tsx +0 -5
  406. package/src/internal/useLocaleConfig.tsx +0 -18
  407. package/src/types/appcheck.ts +0 -29
  408. /package/dist/{core → hooks}/useBuildLocalConfigurationPersistence.d.ts +0 -0
  409. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -0,0 +1,243 @@
1
+ import React, { PropsWithChildren, useCallback } from "react";
2
+ import { ChevronLeftIcon, cls, defaultBorderMixin, IconButton, MenuIcon, Sheet, Tooltip } from "@firecms/ui";
3
+ import equal from "react-fast-compare"
4
+ import { useLargeLayout } from "../hooks";
5
+ import { ErrorBoundary } from "../components";
6
+ import { AppContext } from "./useApp";
7
+
8
+ export const DRAWER_WIDTH = 280;
9
+
10
+ /**
11
+ * @group Core
12
+ */
13
+ export interface ScaffoldProps {
14
+
15
+ /**
16
+ * Open the drawer on hover
17
+ */
18
+ autoOpenDrawer?: boolean;
19
+
20
+ /**
21
+ * Logo to be displayed in the top bar and drawer.
22
+ * Note that this has no effect if you are using a custom AppBar or Drawer.
23
+ */
24
+ logo?: string;
25
+
26
+ className?: string;
27
+
28
+ style?: React.CSSProperties;
29
+ }
30
+
31
+ /**
32
+ * This view acts as a scaffold for FireCMS.
33
+ *
34
+ * It is in charge of displaying the navigation drawer, top bar and main
35
+ * collection views.
36
+ * This component needs a parent {@link FireCMS}
37
+ *
38
+ * @param props
39
+
40
+ * @group Core
41
+ */
42
+ export const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(
43
+ function Scaffold(props: PropsWithChildren<ScaffoldProps>) {
44
+
45
+ const {
46
+ children,
47
+ autoOpenDrawer,
48
+ logo,
49
+ className,
50
+ style
51
+ } = props;
52
+
53
+ const drawerChildren = React.Children.toArray(children).filter((child: any) => child.type.componentType === "Drawer");
54
+ if (drawerChildren.length > 1) {
55
+ throw Error("Only one Drawer component is allowed in Scaffold");
56
+ }
57
+ const appBarChildren = React.Children.toArray(children).filter((child: any) => child.type.componentType === "AppBar");
58
+ if (appBarChildren.length > 1) {
59
+ throw Error("Only one AppBar component is allowed in Scaffold");
60
+ }
61
+ const otherChildren = React.Children.toArray(children)
62
+ .filter((child: any) => child.type.componentType !== "Drawer" && child.type.componentType !== "AppBar");
63
+ const includeDrawer = drawerChildren.length > 0;
64
+ const largeLayout = useLargeLayout();
65
+
66
+ const [drawerOpen, setDrawerOpen] = React.useState(false);
67
+ const [onHover, setOnHover] = React.useState(false);
68
+
69
+ const setOnHoverTrue = useCallback(() => setOnHover(true), []);
70
+ const setOnHoverFalse = useCallback(() => setOnHover(false), []);
71
+
72
+ const handleDrawerOpen = useCallback(() => {
73
+ setDrawerOpen(true);
74
+ }, []);
75
+
76
+ const handleDrawerClose = useCallback(() => {
77
+ setDrawerOpen(false);
78
+ }, []);
79
+
80
+ const computedDrawerOpen: boolean = drawerOpen || Boolean(largeLayout && autoOpenDrawer && onHover);
81
+
82
+ const hasAppBar = Boolean(appBarChildren.length > 0);
83
+ return (
84
+ <AppContext.Provider value={{
85
+ logo,
86
+ hasDrawer: includeDrawer,
87
+ drawerHovered: onHover,
88
+ drawerOpen: computedDrawerOpen,
89
+ closeDrawer: handleDrawerClose,
90
+ openDrawer: handleDrawerOpen,
91
+ autoOpenDrawer
92
+ }}>
93
+ <div
94
+ className={cls("flex h-screen w-screen bg-surface-50 dark:bg-surface-900 text-surface-900 dark:text-white overflow-hidden", className)}
95
+ style={{
96
+ paddingTop: "env(safe-area-inset-top)",
97
+ paddingLeft: "env(safe-area-inset-left)",
98
+ paddingRight: "env(safe-area-inset-right)",
99
+ paddingBottom: "env(safe-area-inset-bottom)",
100
+ height: "100dvh",
101
+ ...style
102
+ }}>
103
+
104
+ {appBarChildren}
105
+
106
+ <DrawerWrapper
107
+ displayed={includeDrawer}
108
+ onMouseEnter={setOnHoverTrue}
109
+ onMouseMove={setOnHoverTrue}
110
+ onMouseLeave={setOnHoverFalse}
111
+ open={computedDrawerOpen}
112
+ hovered={onHover}
113
+ setDrawerOpen={setDrawerOpen}>
114
+ {includeDrawer && drawerChildren}
115
+ </DrawerWrapper>
116
+
117
+ <main
118
+ className="flex flex-col flex-grow overflow-auto">
119
+ {hasAppBar && <DrawerHeader/>}
120
+ <div
121
+ className={cls(defaultBorderMixin, "flex-grow overflow-auto lg:m-0 lg:mx-4 lg:mb-4 lg:rounded-lg lg:border lg:border-solid m-0 mt-1", {
122
+ "lg:mt-4": !hasAppBar
123
+ })}>
124
+
125
+ <ErrorBoundary>
126
+ {otherChildren}
127
+ </ErrorBoundary>
128
+
129
+ </div>
130
+ </main>
131
+ </div>
132
+ </AppContext.Provider>
133
+ );
134
+ },
135
+ equal
136
+ )
137
+
138
+ const DrawerHeader = () => {
139
+ return (
140
+ <div className="flex flex-col min-h-16"></div>
141
+ );
142
+ };
143
+
144
+ function DrawerWrapper(props: {
145
+ children: React.ReactNode,
146
+ displayed: boolean,
147
+ open: boolean,
148
+ logo?: string,
149
+ hovered: boolean,
150
+ setDrawerOpen: (open: boolean) => void,
151
+ onMouseEnter: () => void,
152
+ onMouseMove: () => void,
153
+ onMouseLeave: () => void
154
+ }) {
155
+
156
+ const width = !props.displayed ? 0 : (props.open ? DRAWER_WIDTH : 72);
157
+ const innerDrawer = <div
158
+ className={"relative h-full no-scrollbar overflow-y-auto overflow-x-hidden"}
159
+ style={{
160
+ width,
161
+ transition: "left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms"
162
+ }}
163
+ >
164
+
165
+ {!props.open && props.displayed && (
166
+ <Tooltip title="Open menu"
167
+ side="right"
168
+ sideOffset={12}
169
+ asChild={true}>
170
+ <div
171
+ className="ml-2 fixed top-1 left-2 sm:top-2 sm:left-2 !bg-surface-50 dark:!bg-surface-900 rounded-full w-fit z-20">
172
+ <IconButton
173
+ color="inherit"
174
+ aria-label="Open menu"
175
+ onClick={() => props.setDrawerOpen(true)}
176
+ size="large"
177
+ >
178
+ <MenuIcon/>
179
+ </IconButton>
180
+ </div>
181
+ </Tooltip>
182
+ )}
183
+
184
+ <div
185
+ className={`z-20 absolute right-0 top-4 ${
186
+ props.open ? "opacity-100" : "opacity-0 invisible"
187
+ } transition-opacity duration-200 ease-in-out`}>
188
+ <IconButton
189
+ aria-label="Close drawer"
190
+ onClick={() => props.setDrawerOpen(false)}
191
+ >
192
+ <ChevronLeftIcon/>
193
+ </IconButton>
194
+ </div>
195
+
196
+ <div className={"flex flex-col h-full"}>
197
+ {props.children}
198
+ </div>
199
+
200
+ </div>;
201
+
202
+ const largeLayout = useLargeLayout();
203
+ if (!largeLayout) {
204
+ if (!props.displayed)
205
+ return null;
206
+ return <>
207
+ <IconButton
208
+ color="inherit"
209
+ aria-label="Open drawer"
210
+ onClick={() => props.setDrawerOpen(true)}
211
+ size="large"
212
+ className="absolute sm:top-2 sm:left-4 top-1 left-2"
213
+ >
214
+ <MenuIcon/>
215
+ </IconButton>
216
+ <Sheet side={"left"}
217
+ transparent={true}
218
+ open={props.open}
219
+ onOpenChange={props.setDrawerOpen}
220
+ title={"Navigation drawer"}
221
+ overlayClassName={"bg-white bg-opacity-80"}
222
+ >
223
+ {innerDrawer}
224
+ </Sheet>
225
+ </>;
226
+ }
227
+
228
+ return (
229
+ <div
230
+ className="z-20 relative"
231
+ onMouseEnter={props.onMouseEnter}
232
+ onMouseMove={props.onMouseMove}
233
+ onMouseLeave={props.onMouseLeave}
234
+ style={{
235
+ width,
236
+ transition: "left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms"
237
+ }}>
238
+
239
+ {innerDrawer}
240
+
241
+ </div>
242
+ );
243
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./Drawer";
2
+ export * from "./AppBar";
3
+ export * from "./Scaffold";
4
+ export * from "./useApp";
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+
3
+ /**
4
+ * This context represents the state of the app in terms of layout.
5
+ * @group Core
6
+ */
7
+ export type AppState = {
8
+ hasDrawer: boolean,
9
+ drawerHovered: boolean,
10
+ drawerOpen: boolean,
11
+ openDrawer: () => void,
12
+ closeDrawer: () => void,
13
+ autoOpenDrawer?: boolean,
14
+ logo?: string
15
+ }
16
+
17
+ export const AppContext = React.createContext<AppState>({
18
+ hasDrawer: false,
19
+ drawerHovered: false,
20
+ drawerOpen: false,
21
+ openDrawer: () => {
22
+ throw new Error("openDrawer not implemented");
23
+ },
24
+ closeDrawer: () => {
25
+ throw new Error("closeDrawer not implemented");
26
+ },
27
+ autoOpenDrawer: false
28
+ });
29
+
30
+ export function useApp() {
31
+ return React.useContext(AppContext);
32
+ }
@@ -6,9 +6,12 @@ import { getHashValue } from "../util";
6
6
  import {
7
7
  AddIcon,
8
8
  Button,
9
+ cls,
9
10
  ContentCopyIcon,
10
- fieldBackgroundHoverMixin, HandleIcon,
11
+ HandleIcon,
11
12
  IconButton,
13
+ KeyboardArrowDownIcon,
14
+ KeyboardArrowUpIcon,
12
15
  Menu,
13
16
  MenuItem,
14
17
  RemoveIcon,
@@ -16,17 +19,30 @@ import {
16
19
  useOutsideAlerter
17
20
  } from "@firecms/ui";
18
21
 
19
- interface ArrayContainerProps<T> {
22
+ export type ArrayEntryParams = {
23
+ index: number,
24
+ internalId: number,
25
+ isDragging: boolean,
26
+ storedProps?: object,
27
+ storeProps: (props: object) => void
28
+ };
29
+
30
+ export type ArrayEntryBuilder = (params: ArrayEntryParams) => React.ReactNode;
31
+
32
+ export interface ArrayContainerProps<T> {
20
33
  droppableId: string;
21
34
  value: T[];
22
35
  addLabel: string;
23
- buildEntry: (index: number, internalId: number) => React.ReactNode;
36
+ buildEntry: ArrayEntryBuilder;
24
37
  disabled?: boolean;
25
38
  size?: "small" | "medium";
26
39
  onInternalIdAdded?: (id: number) => void;
27
40
  includeAddButton?: boolean;
28
41
  newDefaultEntry: T;
29
- onValueChange: (value: T[]) => void
42
+ onValueChange: (value: T[]) => void,
43
+ className?: string;
44
+ min?: number;
45
+ max?: number;
30
46
  }
31
47
 
32
48
  const buildIdsMap = (value: any[]) =>
@@ -52,7 +68,10 @@ export function ArrayContainer<T>({
52
68
  onInternalIdAdded,
53
69
  includeAddButton,
54
70
  newDefaultEntry,
55
- onValueChange
71
+ onValueChange,
72
+ className,
73
+ min = 0,
74
+ max = Infinity
56
75
  }: ArrayContainerProps<T>) {
57
76
 
58
77
  const hasValue = value && Array.isArray(value) && value.length > 0;
@@ -63,7 +82,14 @@ export function ArrayContainer<T>({
63
82
  const [internalIds, setInternalIds] = useState<number[]>(
64
83
  hasValue
65
84
  ? Object.values(internalIdsRef.current)
66
- : []);
85
+ : []
86
+ );
87
+
88
+ const itemCustomPropsRef = useRef<Record<number, object>>({});
89
+
90
+ const updateItemCustomProps = useCallback((internalId: number, customProps: object) => {
91
+ itemCustomPropsRef.current[internalId] = customProps;
92
+ }, []);
67
93
 
68
94
  useEffect(() => {
69
95
  if (hasValue && value && value.length !== internalIds.length) {
@@ -83,7 +109,7 @@ export function ArrayContainer<T>({
83
109
 
84
110
  const insertInEnd = (e: React.SyntheticEvent) => {
85
111
  e.preventDefault();
86
- if (disabled) return;
112
+ if (disabled || (value ?? []).length >= max) return;
87
113
  const id = getRandomId();
88
114
  const newIds: number[] = [...internalIds, id];
89
115
  if (onInternalIdAdded)
@@ -93,6 +119,7 @@ export function ArrayContainer<T>({
93
119
  };
94
120
 
95
121
  const remove = (index: number) => {
122
+ if ((value ?? []).length <= min) return;
96
123
  const newIds = [...internalIds];
97
124
  newIds.splice(index, 1);
98
125
  setInternalIds(newIds);
@@ -100,12 +127,14 @@ export function ArrayContainer<T>({
100
127
  };
101
128
 
102
129
  const copy = (index: number) => {
130
+ if ((value ?? []).length >= max) return;
103
131
  const id = getRandomId();
104
132
  const copyingItem = value[index];
105
133
  const newIds: number[] = [
106
- ...internalIds.splice(0, index + 1),
134
+ ...internalIds.slice(0, index + 1),
107
135
  id,
108
- ...internalIds.splice(index + 1, internalIds.length - index - 1)];
136
+ ...internalIds.slice(index + 1)
137
+ ];
109
138
  if (onInternalIdAdded)
110
139
  onInternalIdAdded(id);
111
140
  setInternalIds(newIds);
@@ -113,6 +142,20 @@ export function ArrayContainer<T>({
113
142
  onValueChange([...value.slice(0, index + 1), copyingItem, ...value.slice(index + 1)]);
114
143
  };
115
144
 
145
+ const addInIndex = (index: number) => {
146
+ if ((value ?? []).length >= max) return;
147
+ const id = getRandomId();
148
+ const newIds: number[] = [
149
+ ...internalIds.slice(0, index),
150
+ id,
151
+ ...internalIds.slice(index)
152
+ ];
153
+ if (onInternalIdAdded)
154
+ onInternalIdAdded(id);
155
+ setInternalIds(newIds);
156
+ onValueChange([...value.slice(0, index), newDefaultEntry, ...value.slice(index)]);
157
+ }
158
+
116
159
  const onDragEnd = (result: any) => {
117
160
  // dropped outside the list
118
161
  if (!result.destination) {
@@ -147,12 +190,17 @@ export function ArrayContainer<T>({
147
190
  remove={remove}
148
191
  copy={copy}
149
192
  isDragging={snapshot.isDragging}
193
+ storedProps={itemCustomPropsRef.current[internalId]}
194
+ updateItemCustomProps={updateItemCustomProps}
195
+ addInIndex={addInIndex}
196
+ includeAddButton={includeAddButton}
150
197
  />
151
198
  );
152
199
  }}
153
200
  >
154
201
  {(droppableProvided, droppableSnapshot) => (
155
202
  <div
203
+ className={cls("space-y-1", className)}
156
204
  {...droppableProvided.droppableProps}
157
205
  ref={droppableProvided.innerRef}>
158
206
  {hasValue && internalIds.map((internalId: number, index: number) => {
@@ -173,6 +221,10 @@ export function ArrayContainer<T>({
173
221
  remove={remove}
174
222
  copy={copy}
175
223
  isDragging={snapshot.isDragging}
224
+ storedProps={itemCustomPropsRef.current[internalId]}
225
+ updateItemCustomProps={updateItemCustomProps}
226
+ addInIndex={addInIndex}
227
+ includeAddButton={includeAddButton}
176
228
  />
177
229
  )}
178
230
  </Draggable>
@@ -181,17 +233,19 @@ export function ArrayContainer<T>({
181
233
 
182
234
  {droppableProvided.placeholder}
183
235
 
184
- {includeAddButton && <div className="py-4 justify-center text-left">
185
- <Button
186
- variant={"text"}
187
- size={size === "small" ? "small" : "medium"}
188
- color="primary"
189
- disabled={disabled}
190
- startIcon={<AddIcon/>}
191
- onClick={insertInEnd}>
192
- {addLabel ?? "Add"}
193
- </Button>
194
- </div>}
236
+ {includeAddButton && (
237
+ <div className="my-4 justify-center text-left">
238
+ <Button
239
+ variant={"text"}
240
+ size={size === "small" ? "small" : "medium"}
241
+ color="primary"
242
+ disabled={disabled || value?.length >= max}
243
+ startIcon={<AddIcon/>}
244
+ onClick={insertInEnd}>
245
+ {addLabel ?? "Add"}
246
+ </Button>
247
+ </div>
248
+ )}
195
249
  </div>
196
250
  )}
197
251
  </Droppable>
@@ -205,10 +259,14 @@ type ArrayContainerItemProps = {
205
259
  internalId: number,
206
260
  size?: "small" | "medium",
207
261
  disabled: boolean,
208
- buildEntry: (index: number, internalId: number) => React.ReactNode,
262
+ buildEntry: ArrayEntryBuilder,
209
263
  remove: (index: number) => void,
210
264
  copy: (index: number) => void,
265
+ addInIndex?: (index: number) => void,
266
+ includeAddButton?: boolean,
211
267
  isDragging: boolean,
268
+ storedProps?: object,
269
+ updateItemCustomProps: (internalId: number, props: object) => void
212
270
  };
213
271
 
214
272
  export function ArrayContainerItem({
@@ -219,41 +277,46 @@ export function ArrayContainerItem({
219
277
  disabled,
220
278
  buildEntry,
221
279
  remove,
280
+ addInIndex,
281
+ includeAddButton,
222
282
  copy,
223
- isDragging
283
+ isDragging,
284
+ storedProps,
285
+ updateItemCustomProps
224
286
  }: ArrayContainerItemProps) {
225
287
 
226
- const [onHover, setOnHover] = React.useState(false);
227
- const setOnHoverTrue = useCallback(() => setOnHover(true), []);
228
- const setOnHoverFalse = useCallback(() => setOnHover(false), []);
229
-
230
288
  return <div
231
- onMouseEnter={setOnHoverTrue}
232
- onMouseMove={setOnHoverTrue}
233
- onMouseLeave={setOnHoverFalse}
234
289
  ref={provided.innerRef}
235
290
  {...provided.draggableProps}
236
291
  style={provided.draggableProps.style}
237
292
  className={`${
238
- (isDragging || onHover) ? fieldBackgroundHoverMixin : ""
239
- } mb-1 rounded-md opacity-100`}
293
+ !isDragging ? "hover:bg-surface-accent-50 dark:hover:bg-surface-800 dark:hover:bg-opacity-20" : ""
294
+ } rounded-md opacity-100`}
240
295
  >
241
296
  <div
242
297
  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)}
298
+ <div
299
+ className="flex-grow w-[calc(100%-48px)] text-text-primary dark:text-text-primary-dark">
300
+ {buildEntry({
301
+ index,
302
+ internalId,
303
+ isDragging,
304
+ storedProps,
305
+ storeProps: (props: object) => updateItemCustomProps(internalId, props)
306
+ })}
245
307
  </div>
246
308
  <ArrayItemOptions direction={size === "small" ? "row" : "column"}
247
309
  disabled={disabled}
248
310
  remove={remove}
249
311
  index={index}
250
312
  provided={provided}
313
+ addInIndex={addInIndex}
314
+ includeAddButton={includeAddButton}
251
315
  copy={copy}/>
252
316
  </div>
253
317
  </div>;
254
318
  }
255
319
 
256
-
257
320
  export function ArrayItemOptions({
258
321
  direction,
259
322
  disabled,
@@ -261,13 +324,17 @@ export function ArrayItemOptions({
261
324
  index,
262
325
  provided,
263
326
  copy,
327
+ includeAddButton,
328
+ addInIndex
264
329
  }: {
265
330
  direction?: "row" | "column",
266
331
  disabled: boolean,
267
332
  remove: (index: number) => void,
268
333
  index: number,
269
334
  provided: any,
270
- copy: (index: number) => void
335
+ copy: (index: number) => void,
336
+ includeAddButton?: boolean,
337
+ addInIndex?: (index: number) => void
271
338
  }) {
272
339
 
273
340
  const [menuOpen, setMenuOpen] = useState(false);
@@ -275,7 +342,7 @@ export function ArrayItemOptions({
275
342
  const iconRef = React.useRef<HTMLDivElement>(null);
276
343
  useOutsideAlerter(iconRef, () => setMenuOpen(false));
277
344
 
278
- return <div className={`pl-2 pt-1 pb-4 flex ${direction === "row" ? "flex-row-reverse" : "flex-col"} items-center`}
345
+ return <div className={`pl-2 pt-1 pb-1 flex ${direction === "row" ? "flex-row-reverse" : "flex-col"} items-center`}
279
346
  ref={iconRef}
280
347
  {...provided.dragHandleProps}>
281
348
  <Tooltip
@@ -283,11 +350,13 @@ export function ArrayItemOptions({
283
350
  open={menuOpen ? false : undefined}
284
351
  side={direction === "column" ? "left" : undefined}
285
352
  title="Drag to move. Click for more options">
286
-
287
353
  <IconButton
288
354
  size="small"
289
355
  disabled={disabled}
290
- onClick={() => setMenuOpen(true)}
356
+ onClick={(e) => {
357
+ e.preventDefault();
358
+ setMenuOpen(true);
359
+ }}
291
360
  onDragStart={(e: any) => {
292
361
  setMenuOpen(false);
293
362
  }}
@@ -298,7 +367,7 @@ export function ArrayItemOptions({
298
367
  <Menu
299
368
  portalContainer={iconRef.current}
300
369
  open={menuOpen}
301
- trigger={<div/>}>
370
+ trigger={<div tabIndex={-1}/>}>
302
371
 
303
372
  <MenuItem dense onClick={(e) => {
304
373
  setMenuOpen(false);
@@ -315,8 +384,25 @@ export function ArrayItemOptions({
315
384
  Copy
316
385
  </MenuItem>
317
386
 
318
- </Menu>
387
+ {includeAddButton && addInIndex && <MenuItem dense
388
+ onClick={() => {
389
+ setMenuOpen(false);
390
+ addInIndex(index);
391
+ }}>
392
+ <KeyboardArrowUpIcon size={"small"}/>
393
+ Add on top
394
+ </MenuItem>}
395
+
396
+ {includeAddButton && addInIndex && <MenuItem dense
397
+ onClick={() => {
398
+ setMenuOpen(false);
399
+ addInIndex(index + 1);
400
+ }}>
401
+ <KeyboardArrowDownIcon size={"small"}/>
402
+ Add below
403
+ </MenuItem>}
319
404
 
405
+ </Menu>
320
406
  </Tooltip>
321
407
 
322
408
  </div>;
@@ -5,7 +5,7 @@ import { CircularProgress, CircularProgressProps, Typography } from "@firecms/ui
5
5
  *
6
6
  * @param text
7
7
  * @param props
8
- * @constructor
8
+
9
9
  * @ignore
10
10
  */
11
11
  export function CircularProgressCenter({ text, ...props }: CircularProgressProps & {
@@ -13,7 +13,7 @@ export function CircularProgressCenter({ text, ...props }: CircularProgressProps
13
13
  }) {
14
14
  return (
15
15
  <div
16
- className="flex w-full h-screen max-h-full max-w-full bg-gray-50 dark:bg-gray-900 gap-4">
16
+ className="flex w-full h-screen max-h-full max-w-full gap-4">
17
17
  <div className="m-auto flex flex-col gap-2 items-center">
18
18
  <CircularProgress {...props}/>
19
19
  {text && <Typography
@@ -0,0 +1,41 @@
1
+ import { Button, FilterListOffIcon } from "@firecms/ui";
2
+ import { EntityTableController } from "../types";
3
+
4
+ export function ClearFilterSortButton({
5
+ tableController,
6
+ enabled
7
+ }: {
8
+ enabled: boolean;
9
+ tableController: EntityTableController
10
+ }) {
11
+ if (!enabled) {
12
+ return null;
13
+ }
14
+
15
+ const filterIsSet = !!tableController.filterValues && Object.keys(tableController.filterValues).length > 0;
16
+ const sortIsSet = !!tableController.sortBy && tableController.sortBy.length > 0;
17
+
18
+ if ((filterIsSet || sortIsSet) && (tableController.clearFilter || tableController.setSortBy)) {
19
+ let label;
20
+ if (filterIsSet && sortIsSet) {
21
+ label = "Clear filter and sort";
22
+ } else if (filterIsSet) {
23
+ label = "Clear filter";
24
+ } else {
25
+ label = "Clear sort";
26
+ }
27
+ return <Button
28
+ variant={"outlined"}
29
+ className="h-fit-content"
30
+ aria-label="filter clear"
31
+ onClick={() => {
32
+ tableController.clearFilter?.();
33
+ tableController.setSortBy?.(undefined);
34
+ }}
35
+ size={"small"}>
36
+ <FilterListOffIcon/>
37
+ {label}
38
+ </Button>
39
+ }
40
+ return null;
41
+ }