@firecms/core 3.0.0-canary.25 → 3.0.0-canary.250

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 (401) 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 +13 -13
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  15. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  16. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
  17. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  18. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  19. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  20. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
  21. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +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 +8 -5
  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 +76 -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 +7 -1
  32. package/dist/components/HomePage/RenameGroupDialog.d.ts +9 -0
  33. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  34. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  35. package/dist/components/ReferenceWidget.d.ts +3 -1
  36. package/dist/components/SelectableTable/SelectableTable.d.ts +14 -4
  37. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  38. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  39. package/dist/components/VirtualTable/VirtualTableProps.d.ts +24 -12
  40. package/dist/components/VirtualTable/types.d.ts +3 -3
  41. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  42. package/dist/components/common/index.d.ts +2 -1
  43. package/dist/components/common/table_height.d.ts +5 -0
  44. package/dist/components/common/types.d.ts +4 -6
  45. package/dist/components/common/useColumnsIds.d.ts +3 -1
  46. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  47. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  48. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  49. package/dist/components/index.d.ts +5 -2
  50. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  51. package/dist/core/DefaultAppBar.d.ts +29 -0
  52. package/dist/core/DefaultDrawer.d.ts +19 -0
  53. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  54. package/dist/core/EntityEditView.d.ts +40 -11
  55. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  56. package/dist/core/FireCMS.d.ts +3 -3
  57. package/dist/core/FireCMSRouter.d.ts +4 -0
  58. package/dist/core/NavigationRoutes.d.ts +2 -3
  59. package/dist/core/SideDialogs.d.ts +4 -2
  60. package/dist/core/field_configs.d.ts +1 -1
  61. package/dist/core/index.d.ts +4 -4
  62. package/dist/form/EntityForm.d.ts +36 -64
  63. package/dist/form/EntityFormActions.d.ts +17 -0
  64. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  65. package/dist/form/components/ErrorFocus.d.ts +1 -1
  66. package/dist/form/components/FieldHelperText.d.ts +3 -3
  67. package/dist/form/components/FormEntry.d.ts +6 -0
  68. package/dist/form/components/FormLayout.d.ts +5 -0
  69. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  70. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  71. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  72. package/dist/form/components/index.d.ts +3 -1
  73. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  74. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  75. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  76. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  77. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  79. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  80. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  81. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +9 -0
  82. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  83. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  84. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  85. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +5 -13
  86. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  87. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  88. package/dist/form/index.d.ts +17 -18
  89. package/dist/form/useClearRestoreValue.d.ts +2 -2
  90. package/dist/hooks/data/delete.d.ts +4 -4
  91. package/dist/hooks/data/save.d.ts +4 -5
  92. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  93. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  94. package/dist/hooks/index.d.ts +1 -0
  95. package/dist/hooks/useAuthController.d.ts +1 -1
  96. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  97. package/dist/hooks/useBuildNavigationController.d.ts +57 -13
  98. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  99. package/dist/hooks/useModeController.d.ts +1 -2
  100. package/dist/hooks/useProjectLog.d.ts +8 -2
  101. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  102. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  103. package/dist/index.d.ts +1 -0
  104. package/dist/index.es.js +22839 -13875
  105. package/dist/index.es.js.map +1 -1
  106. package/dist/index.umd.js +25639 -588
  107. package/dist/index.umd.js.map +1 -1
  108. package/dist/internal/useBuildDataSource.d.ts +3 -17
  109. package/dist/internal/useBuildSideEntityController.d.ts +3 -3
  110. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  111. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  112. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  113. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  114. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  115. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  116. package/dist/preview/util.d.ts +3 -3
  117. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  118. package/dist/routes/FireCMSRoute.d.ts +1 -0
  119. package/dist/routes/HomePageRoute.d.ts +3 -0
  120. package/dist/types/analytics.d.ts +1 -1
  121. package/dist/types/auth.d.ts +8 -10
  122. package/dist/types/collections.d.ts +106 -24
  123. package/dist/types/datasource.d.ts +52 -36
  124. package/dist/types/dialogs_controller.d.ts +7 -3
  125. package/dist/types/entities.d.ts +7 -2
  126. package/dist/types/entity_actions.d.ts +28 -4
  127. package/dist/types/entity_callbacks.d.ts +16 -16
  128. package/dist/types/entity_overrides.d.ts +2 -2
  129. package/dist/types/export_import.d.ts +4 -4
  130. package/dist/types/fields.d.ts +74 -42
  131. package/dist/types/firecms.d.ts +8 -3
  132. package/dist/types/firecms_context.d.ts +1 -1
  133. package/dist/types/index.d.ts +0 -1
  134. package/dist/types/navigation.d.ts +61 -18
  135. package/dist/types/permissions.d.ts +4 -4
  136. package/dist/types/plugins.d.ts +48 -12
  137. package/dist/types/properties.d.ts +80 -24
  138. package/dist/types/property_config.d.ts +1 -3
  139. package/dist/types/side_dialogs_controller.d.ts +10 -0
  140. package/dist/types/side_entity_controller.d.ts +10 -1
  141. package/dist/types/storage.d.ts +75 -0
  142. package/dist/types/user.d.ts +1 -0
  143. package/dist/util/builders.d.ts +3 -3
  144. package/dist/util/callbacks.d.ts +2 -0
  145. package/dist/util/createFormexStub.d.ts +2 -0
  146. package/dist/util/entities.d.ts +3 -3
  147. package/dist/util/entity_actions.d.ts +2 -0
  148. package/dist/util/entity_cache.d.ts +23 -0
  149. package/dist/util/icon_list.d.ts +5 -1
  150. package/dist/util/icon_synonyms.d.ts +1 -98
  151. package/dist/util/icons.d.ts +6 -3
  152. package/dist/util/index.d.ts +3 -0
  153. package/dist/util/navigation_from_path.d.ts +6 -1
  154. package/dist/util/navigation_utils.d.ts +15 -3
  155. package/dist/util/objects.d.ts +2 -1
  156. package/dist/util/permissions.d.ts +4 -4
  157. package/dist/util/plurals.d.ts +0 -2
  158. package/dist/util/property_utils.d.ts +4 -4
  159. package/dist/util/references.d.ts +2 -2
  160. package/dist/util/resolutions.d.ts +41 -17
  161. package/dist/util/storage.d.ts +23 -2
  162. package/dist/util/useStorageUploadController.d.ts +3 -3
  163. package/package.json +64 -48
  164. package/src/app/AppBar.tsx +18 -0
  165. package/src/app/Drawer.tsx +24 -0
  166. package/src/app/Scaffold.tsx +253 -0
  167. package/src/app/index.ts +4 -0
  168. package/src/app/useApp.tsx +32 -0
  169. package/src/components/ArrayContainer.tsx +447 -229
  170. package/src/components/CircularProgressCenter.tsx +2 -2
  171. package/src/components/ClearFilterSortButton.tsx +41 -0
  172. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +11 -11
  173. package/src/components/DeleteEntityDialog.tsx +13 -20
  174. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +59 -40
  175. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  176. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  177. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +72 -42
  178. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  179. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  180. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  181. package/src/components/EntityCollectionTable/index.tsx +1 -1
  182. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +32 -37
  183. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +49 -36
  184. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  185. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +135 -105
  186. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +9 -9
  187. package/src/components/EntityCollectionView/EntityCollectionView.tsx +231 -117
  188. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  189. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  190. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  191. package/src/components/EntityCollectionView/utils.ts +19 -0
  192. package/src/components/EntityJsonPreview.tsx +66 -0
  193. package/src/components/EntityPreview.tsx +80 -59
  194. package/src/components/EntityView.tsx +13 -10
  195. package/src/components/ErrorView.tsx +4 -4
  196. package/src/components/HomePage/DefaultHomePage.tsx +486 -159
  197. package/src/components/HomePage/FavouritesView.tsx +9 -14
  198. package/src/components/HomePage/HomePageDnD.tsx +613 -0
  199. package/src/components/HomePage/NavigationCard.tsx +48 -39
  200. package/src/components/HomePage/NavigationCardBinding.tsx +17 -16
  201. package/src/components/HomePage/NavigationGroup.tsx +63 -29
  202. package/src/components/HomePage/RenameGroupDialog.tsx +113 -0
  203. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  204. package/src/components/NotFoundPage.tsx +2 -2
  205. package/src/components/PropertyConfigBadge.tsx +9 -3
  206. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  207. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +21 -13
  208. package/src/components/ReferenceWidget.tsx +21 -11
  209. package/src/components/SearchIconsView.tsx +10 -7
  210. package/src/components/SelectableTable/SelectableTable.tsx +157 -145
  211. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  212. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  213. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  214. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  215. package/src/components/UnsavedChangesDialog.tsx +42 -0
  216. package/src/components/VirtualTable/VirtualTable.tsx +105 -51
  217. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  218. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  219. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  220. package/src/components/VirtualTable/VirtualTableProps.tsx +28 -14
  221. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  222. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  223. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -2
  224. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  225. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  226. package/src/components/VirtualTable/types.tsx +2 -3
  227. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +44 -40
  228. package/src/components/common/index.ts +2 -1
  229. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  230. package/src/components/common/types.tsx +4 -6
  231. package/src/components/common/useColumnsIds.tsx +24 -3
  232. package/src/components/common/useDataSourceTableController.tsx +420 -0
  233. package/src/components/common/useDebouncedCallback.tsx +20 -0
  234. package/src/components/common/useScrollRestoration.tsx +68 -0
  235. package/src/components/common/useTableSearchHelper.ts +53 -12
  236. package/src/components/index.tsx +6 -2
  237. package/src/contexts/BreacrumbsContext.tsx +38 -0
  238. package/src/contexts/DialogsProvider.tsx +5 -4
  239. package/src/contexts/ModeController.tsx +1 -3
  240. package/src/contexts/SnackbarProvider.tsx +2 -0
  241. package/src/core/DefaultAppBar.tsx +219 -0
  242. package/src/core/DefaultDrawer.tsx +185 -0
  243. package/src/core/DrawerNavigationItem.tsx +66 -0
  244. package/src/core/EntityEditView.tsx +408 -478
  245. package/src/core/EntityEditViewFormActions.tsx +199 -0
  246. package/src/core/EntitySidePanel.tsx +85 -21
  247. package/src/core/FireCMS.tsx +72 -58
  248. package/src/core/FireCMSRouter.tsx +17 -0
  249. package/src/core/NavigationRoutes.tsx +28 -38
  250. package/src/core/SideDialogs.tsx +22 -12
  251. package/src/core/field_configs.tsx +26 -13
  252. package/src/core/index.tsx +6 -5
  253. package/src/form/EntityForm.tsx +589 -535
  254. package/src/form/EntityFormActions.tsx +169 -0
  255. package/src/form/PropertyFieldBinding.tsx +88 -45
  256. package/src/form/components/CustomIdField.tsx +9 -3
  257. package/src/form/components/FieldHelperText.tsx +4 -4
  258. package/src/form/components/FormEntry.tsx +22 -0
  259. package/src/form/components/FormLayout.tsx +16 -0
  260. package/src/form/components/LabelWithIcon.tsx +30 -19
  261. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  262. package/src/form/components/StorageItemPreview.tsx +22 -12
  263. package/src/form/components/StorageUploadProgress.tsx +4 -5
  264. package/src/form/components/index.tsx +3 -1
  265. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +34 -19
  266. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +50 -36
  267. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  268. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  269. package/src/form/field_bindings/KeyValueFieldBinding.tsx +61 -52
  270. package/src/form/field_bindings/MapFieldBinding.tsx +73 -55
  271. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +157 -0
  272. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -21
  273. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  274. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +135 -0
  275. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  276. package/src/form/field_bindings/RepeatFieldBinding.tsx +62 -35
  277. package/src/form/field_bindings/SelectFieldBinding.tsx +24 -15
  278. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +265 -202
  279. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  280. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  281. package/src/form/index.tsx +17 -37
  282. package/src/form/useClearRestoreValue.tsx +2 -2
  283. package/src/form/validation.ts +13 -23
  284. package/src/hooks/data/delete.ts +6 -5
  285. package/src/hooks/data/save.ts +26 -33
  286. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  287. package/src/hooks/data/useDataSource.tsx +11 -3
  288. package/src/hooks/data/useEntityFetch.tsx +10 -6
  289. package/src/hooks/index.tsx +1 -0
  290. package/src/hooks/useAuthController.tsx +1 -1
  291. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  292. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  293. package/src/hooks/useBuildModeController.tsx +22 -29
  294. package/src/hooks/useBuildNavigationController.tsx +440 -119
  295. package/src/hooks/useFireCMSContext.tsx +3 -33
  296. package/src/hooks/useLargeLayout.tsx +0 -35
  297. package/src/hooks/useModeController.tsx +1 -2
  298. package/src/hooks/useProjectLog.tsx +32 -10
  299. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  300. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  301. package/src/index.ts +1 -0
  302. package/src/internal/useBuildDataSource.ts +79 -85
  303. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  304. package/src/internal/useBuildSideEntityController.tsx +201 -77
  305. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  306. package/src/preview/PropertyPreview.tsx +34 -25
  307. package/src/preview/PropertyPreviewProps.tsx +7 -1
  308. package/src/preview/components/BooleanPreview.tsx +2 -2
  309. package/src/preview/components/EmptyValue.tsx +1 -1
  310. package/src/preview/components/EnumValuesChip.tsx +2 -2
  311. package/src/preview/components/ImagePreview.tsx +26 -37
  312. package/src/preview/components/ReferencePreview.tsx +23 -34
  313. package/src/preview/components/StorageThumbnail.tsx +5 -1
  314. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  315. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +6 -6
  316. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +7 -5
  317. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +5 -4
  318. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +4 -4
  319. package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -6
  320. package/src/preview/property_previews/ArrayPropertyPreview.tsx +7 -6
  321. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  322. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +13 -13
  323. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  324. package/src/preview/util.ts +10 -10
  325. package/src/routes/CustomCMSRoute.tsx +21 -0
  326. package/src/routes/FireCMSRoute.tsx +246 -0
  327. package/src/routes/HomePageRoute.tsx +17 -0
  328. package/src/types/analytics.ts +3 -0
  329. package/src/types/auth.tsx +9 -13
  330. package/src/types/collections.ts +128 -29
  331. package/src/types/customization_controller.tsx +0 -1
  332. package/src/types/datasource.ts +61 -43
  333. package/src/types/dialogs_controller.tsx +7 -3
  334. package/src/types/entities.ts +12 -2
  335. package/src/types/entity_actions.tsx +32 -7
  336. package/src/types/entity_callbacks.ts +18 -18
  337. package/src/types/entity_overrides.tsx +2 -2
  338. package/src/types/export_import.ts +4 -4
  339. package/src/types/fields.tsx +85 -46
  340. package/src/types/firecms.tsx +9 -4
  341. package/src/types/firecms_context.tsx +1 -1
  342. package/src/types/index.ts +0 -1
  343. package/src/types/navigation.ts +76 -23
  344. package/src/types/permissions.ts +5 -5
  345. package/src/types/plugins.tsx +57 -14
  346. package/src/types/properties.ts +95 -26
  347. package/src/types/property_config.tsx +1 -2
  348. package/src/types/side_dialogs_controller.tsx +15 -0
  349. package/src/types/side_entity_controller.tsx +11 -1
  350. package/src/types/storage.ts +83 -1
  351. package/src/types/user.ts +2 -0
  352. package/src/util/builders.ts +10 -8
  353. package/src/util/callbacks.ts +119 -0
  354. package/src/util/createFormexStub.tsx +62 -0
  355. package/src/util/entities.ts +9 -6
  356. package/src/util/entity_actions.ts +28 -0
  357. package/src/util/entity_cache.ts +204 -0
  358. package/src/util/enums.ts +1 -1
  359. package/src/util/icon_list.ts +16 -10
  360. package/src/util/icon_synonyms.ts +3 -100
  361. package/src/util/icons.tsx +21 -7
  362. package/src/util/index.ts +3 -0
  363. package/src/util/join_collections.ts +6 -1
  364. package/src/util/make_properties_editable.ts +13 -5
  365. package/src/util/navigation_from_path.ts +18 -7
  366. package/src/util/navigation_utils.ts +141 -25
  367. package/src/util/objects.ts +90 -33
  368. package/src/util/parent_references_from_path.ts +3 -3
  369. package/src/util/permissions.ts +9 -8
  370. package/src/util/plurals.ts +0 -2
  371. package/src/util/property_utils.tsx +17 -6
  372. package/src/util/references.ts +19 -8
  373. package/src/util/resolutions.ts +110 -48
  374. package/src/util/storage.ts +79 -21
  375. package/src/util/strings.ts +2 -2
  376. package/src/util/useStorageUploadController.tsx +91 -28
  377. package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +0 -5
  378. package/dist/components/FireCMSAppBar.d.ts +0 -26
  379. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  380. package/dist/components/VirtualTable/common.d.ts +0 -2
  381. package/dist/core/Drawer.d.ts +0 -23
  382. package/dist/core/Scaffold.d.ts +0 -55
  383. package/dist/core/SideEntityView.d.ts +0 -7
  384. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  385. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  386. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  387. package/dist/internal/useLocaleConfig.d.ts +0 -1
  388. package/dist/types/appcheck.d.ts +0 -26
  389. package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +0 -59
  390. package/src/components/FireCMSAppBar.tsx +0 -165
  391. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  392. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  393. package/src/core/Drawer.tsx +0 -191
  394. package/src/core/Scaffold.tsx +0 -281
  395. package/src/core/SideEntityView.tsx +0 -38
  396. package/src/form/components/FormikArrayContainer.tsx +0 -44
  397. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  398. package/src/internal/useBuildCustomizationController.tsx +0 -5
  399. package/src/internal/useLocaleConfig.tsx +0 -18
  400. package/src/types/appcheck.ts +0 -29
  401. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -4,7 +4,7 @@ import { Entity, EntityCollection, EntityReference } from "../../../types";
4
4
  import { ReferencePreview } from "../../../preview";
5
5
  import { getReferenceFrom } from "../../../util";
6
6
  import { useNavigationController, useReferenceDialog } from "../../../hooks";
7
- import { Button, Select, SelectItem } from "@firecms/ui";
7
+ import { Button, Checkbox, Label, Select, SelectItem } from "@firecms/ui";
8
8
 
9
9
  interface ReferenceFilterFieldProps {
10
10
  name: string,
@@ -13,6 +13,7 @@ interface ReferenceFilterFieldProps {
13
13
  isArray?: boolean;
14
14
  path?: string;
15
15
  title?: string;
16
+ includeId?: boolean;
16
17
  previewProperties?: string[];
17
18
  hidden: boolean;
18
19
  setHidden: (hidden: boolean) => void;
@@ -34,12 +35,11 @@ const operationLabels = {
34
35
  const multipleSelectOperations = ["array-contains-any", "in", "not-in"];
35
36
 
36
37
  export function ReferenceFilterField({
37
- name,
38
38
  value,
39
39
  setValue,
40
40
  isArray,
41
41
  path,
42
- title,
42
+ includeId = true,
43
43
  previewProperties,
44
44
  setHidden
45
45
  }: ReferenceFilterFieldProps) {
@@ -48,13 +48,15 @@ export function ReferenceFilterField({
48
48
  ? ["array-contains"]
49
49
  : ["==", "!=", ">", "<", ">=", "<="];
50
50
 
51
- isArray
52
- ? possibleOperations.push("array-contains-any")
53
- : possibleOperations.push("in", "not-in");
51
+ if (isArray) {
52
+ possibleOperations.push("array-contains-any");
53
+ } else {
54
+ possibleOperations.push("in", "not-in");
55
+ }
54
56
 
55
57
  const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
56
58
  const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
57
- const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined>(fieldValue);
59
+ const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined | null>(fieldValue);
58
60
 
59
61
  const selectedEntityIds = internalValue
60
62
  ? (Array.isArray(internalValue) ? internalValue.map((ref) => {
@@ -65,7 +67,7 @@ export function ReferenceFilterField({
65
67
  }).filter(Boolean) as string[] : [internalValue.id])
66
68
  : [];
67
69
 
68
- function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityReference | EntityReference[]) {
70
+ function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityReference | EntityReference[] | null) {
69
71
 
70
72
  const prevOpIsArray = multipleSelectOperations.includes(operation);
71
73
  const newOpIsArray = multipleSelectOperations.includes(op);
@@ -134,16 +136,19 @@ export function ReferenceFilterField({
134
136
  onClick={doOpenDialog}
135
137
  reference={reference}
136
138
  hover={true}
137
- allowEntityNavigation={false}
139
+ includeId={includeId}
140
+ includeEntityLink={false}
138
141
  />
139
142
  );
140
143
  };
141
144
 
142
145
  return (
143
146
 
144
- <div className="flex w-[440px] flex-row">
145
- <div className="w-[120px]">
147
+ <div className="flex w-[480px] flex-row">
148
+ <div className="w-[140px]">
146
149
  <Select value={operation}
150
+ size={"large"}
151
+ fullWidth={true}
147
152
  onValueChange={(value) => {
148
153
  updateFilter(value as VirtualTableWhereFilterOp, internalValue);
149
154
  }}
@@ -156,21 +161,40 @@ export function ReferenceFilterField({
156
161
  </Select>
157
162
  </div>
158
163
 
159
- <div className="flex-grow ml-2 h-full">
164
+ <div className="flex-grow ml-2 h-full gap-2 flex flex-col w-[340px]">
160
165
 
161
166
  {internalValue && Array.isArray(internalValue) && <div>
162
167
  {internalValue.map((ref, index) => buildEntry(ref))}
163
168
  </div>}
169
+
164
170
  {internalValue && !Array.isArray(internalValue) && <div>
165
171
  {buildEntry(internalValue)}
166
172
  </div>}
173
+
167
174
  {(!internalValue || (Array.isArray(internalValue) && internalValue.length === 0)) &&
168
175
  <Button onClick={doOpenDialog}
169
176
  variant={"outlined"}
177
+ size={"large"}
170
178
  className="h-full w-full">
171
179
  {multiple ? "Select references" : "Select reference"}
172
180
  </Button>
173
181
  }
182
+
183
+ {!isArray && <Label
184
+ className="border cursor-pointer rounded-md p-2 flex items-center gap-2 [&:has(:checked)]:bg-surface-100 dark:[&:has(:checked)]:bg-surface-800"
185
+ htmlFor="null-filter"
186
+ >
187
+ <Checkbox id="null-filter"
188
+ checked={internalValue === null}
189
+ size={"small"}
190
+ onCheckedChange={(checked) => {
191
+ if (internalValue !== null)
192
+ updateFilter(operation, null);
193
+ else updateFilter(operation, undefined);
194
+ }}/>
195
+ Filter for null values
196
+ </Label>}
197
+
174
198
  </div>
175
199
 
176
200
  </div>
@@ -1,7 +1,17 @@
1
1
  import React, { useState } from "react";
2
2
  import { EnumValuesChip } from "../../../preview";
3
3
  import { VirtualTableWhereFilterOp } from "../../VirtualTable";
4
- import { ClearIcon, IconButton, Select, SelectItem, TextField } from "@firecms/ui";
4
+ import {
5
+ Checkbox,
6
+ CloseIcon,
7
+ IconButton,
8
+ Label,
9
+ MultiSelect,
10
+ MultiSelectItem,
11
+ Select,
12
+ SelectItem,
13
+ TextField
14
+ } from "@firecms/ui";
5
15
  import { EnumValueConfig } from "../../../types";
6
16
 
7
17
  interface StringNumberFilterFieldProps {
@@ -50,15 +60,15 @@ export function StringNumberFilterField({
50
60
 
51
61
  const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
52
62
  const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
53
- const [internalValue, setInternalValue] = useState<string | number | string[] | number[] | undefined>(fieldValue);
63
+ const [internalValue, setInternalValue] = useState<string | number | string[] | number[] | null | undefined>(fieldValue);
54
64
 
55
- function updateFilter(op: VirtualTableWhereFilterOp, val: string | number | string[] | number[] | undefined) {
65
+ function updateFilter(op: VirtualTableWhereFilterOp, val: string | number | string[] | number[] | null | undefined) {
56
66
  let newValue = val;
57
67
  const prevOpIsArray = multipleSelectOperations.includes(operation);
58
68
  const newOpIsArray = multipleSelectOperations.includes(op);
59
69
  if (prevOpIsArray !== newOpIsArray) {
60
70
  // @ts-ignore
61
- newValue = newOpIsArray ? (typeof val === "string" || typeof val === "number" ? [val] : []) : "";
71
+ newValue = newOpIsArray ? (typeof val === "string" || typeof val === "number" ? [val] : []) : undefined;
62
72
  }
63
73
 
64
74
  if (typeof newValue === "number" && isNaN(newValue))
@@ -82,11 +92,13 @@ export function StringNumberFilterField({
82
92
  }
83
93
 
84
94
  const multiple = multipleSelectOperations.includes(operation);
95
+
85
96
  return (
86
97
 
87
- <div className="flex w-[440px] items-center">
98
+ <div className="flex w-[440px]">
88
99
  <div className={"w-[80px]"}>
89
100
  <Select value={operation}
101
+ fullWidth={true}
90
102
  position={"item-aligned"}
91
103
  onValueChange={(value) => {
92
104
  updateFilter(value as VirtualTableWhereFilterOp, internalValue);
@@ -100,11 +112,11 @@ export function StringNumberFilterField({
100
112
  </Select>
101
113
  </div>
102
114
 
103
- <div className="flex-grow ml-2">
115
+ <div className="flex-grow ml-2 flex flex-col gap-2">
104
116
 
105
117
  {!enumValues && <TextField
106
118
  type={dataType === "number" ? "number" : undefined}
107
- value={internalValue !== undefined ? String(internalValue) : ""}
119
+ value={internalValue !== undefined && internalValue != null ? String(internalValue) : ""}
108
120
  onChange={(evt) => {
109
121
  const val = dataType === "number"
110
122
  ? parseFloat(evt.target.value)
@@ -113,33 +125,38 @@ export function StringNumberFilterField({
113
125
  }}
114
126
  endAdornment={internalValue && <IconButton
115
127
  onClick={(e) => updateFilter(operation, undefined)}>
116
- <ClearIcon/>
128
+ <CloseIcon/>
117
129
  </IconButton>}
118
130
  />}
119
131
 
120
- {enumValues &&
121
-
132
+ {enumValues && !multiple &&
122
133
  <Select
123
134
  position={"item-aligned"}
124
- value={internalValue !== undefined
125
- ? (Array.isArray(internalValue) ? internalValue.map(e => String(e)) : String(internalValue))
126
- : isArray ? [] : ""}
135
+ fullWidth={true}
136
+ value={typeof internalValue === "string" ? internalValue : ""}
127
137
  onValueChange={(value) => {
128
- updateFilter(operation, dataType === "number" ? parseInt(value as string) : value as string)
138
+ if (value !== "")
139
+ updateFilter(operation, dataType === "number" ? parseInt(value as string) : value as string)
129
140
  }}
130
- multiple={multiple}
131
141
  endAdornment={internalValue && <IconButton
132
- className="absolute right-3 top-2"
142
+ className="absolute right-2 top-3"
133
143
  onClick={(e) => updateFilter(operation, undefined)}>
134
- <ClearIcon/>
144
+ <CloseIcon/>
135
145
  </IconButton>}
136
- renderValue={(enumKey) => <EnumValuesChip
137
- key={`select_value_${name}_${enumKey}`}
138
- enumKey={enumKey}
139
- enumValues={enumValues}
140
- size={"small"}/>}>
146
+ renderValue={(enumKey) => {
147
+ if (enumKey === null)
148
+ return "Filter for null values";
149
+ if (enumKey === undefined)
150
+ return null;
151
+
152
+ return <EnumValuesChip
153
+ key={`select_value_${name}_${enumKey}`}
154
+ enumKey={enumKey}
155
+ enumValues={enumValues}
156
+ size={"small"}/>;
157
+ }}>
141
158
  {enumValues.map((enumConfig) => (
142
- <SelectItem key={`select_value_${name}_${enumConfig.id}`}
159
+ <SelectItem key={`select_item_${name}_${enumConfig.id}`}
143
160
  value={String(enumConfig.id)}>
144
161
  <EnumValuesChip
145
162
  enumKey={String(enumConfig.id)}
@@ -150,6 +167,58 @@ export function StringNumberFilterField({
150
167
  </Select>
151
168
  }
152
169
 
170
+ {enumValues && multiple &&
171
+ <MultiSelect
172
+ position={"item-aligned"}
173
+ value={Array.isArray(internalValue) ? internalValue.map(e => String(e)) : []}
174
+ onValueChange={(value) => {
175
+ updateFilter(operation, dataType === "number" ? value.map(v => parseInt(v)) : value)
176
+ }}
177
+ multiple={multiple}
178
+ endAdornment={internalValue && <IconButton
179
+ className="absolute right-2 top-3"
180
+ onClick={(e) => updateFilter(operation, undefined)}>
181
+ <CloseIcon/>
182
+ </IconButton>}
183
+ // renderValues={(enumKeys) => {
184
+ // console.log("renderValues", enumKeys);
185
+ // if (enumKeys === null)
186
+ // return "Filter for null values";
187
+ //
188
+ // return enumKeys.map(key => <EnumValuesChip
189
+ // key={`select_value_${name}_${enumKeys}`}
190
+ // enumKey={key}
191
+ // enumValues={enumValues}
192
+ // size={"small"}/>);
193
+ // }}
194
+ >
195
+ {enumValues.map((enumConfig) => (
196
+ <MultiSelectItem key={`select_value_${name}_${enumConfig.id}`}
197
+ value={String(enumConfig.id)}>
198
+ <EnumValuesChip
199
+ enumKey={String(enumConfig.id)}
200
+ enumValues={enumValues}
201
+ size={"small"}/>
202
+ </MultiSelectItem>
203
+ ))}
204
+ </MultiSelect>
205
+ }
206
+
207
+ {!isArray && <Label
208
+ className="border cursor-pointer rounded-md p-2 flex items-center gap-2 [&:has(:checked)]:bg-surface-100 dark:[&:has(:checked)]:bg-surface-800"
209
+ htmlFor="null-filter"
210
+ >
211
+ <Checkbox id="null-filter"
212
+ checked={internalValue === null}
213
+ size={"small"}
214
+ onCheckedChange={(checked) => {
215
+ if (internalValue !== null)
216
+ updateFilter(operation, null);
217
+ else updateFilter(operation, undefined);
218
+ }}/>
219
+ Filter for null values
220
+ </Label>}
221
+
153
222
  </div>
154
223
 
155
224
  </div>
@@ -0,0 +1,42 @@
1
+ import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography } from "@firecms/ui";
2
+
3
+ export interface UnsavedChangesDialogProps {
4
+ open: boolean;
5
+ body?: React.ReactNode;
6
+ title?: string;
7
+ handleOk: () => void;
8
+ handleCancel: () => void;
9
+ }
10
+
11
+ export function UnsavedChangesDialog({
12
+ open,
13
+ handleOk,
14
+ handleCancel,
15
+ body,
16
+ title
17
+ }: UnsavedChangesDialogProps) {
18
+
19
+ return (
20
+ <Dialog
21
+ onEscapeKeyDown={() => {
22
+ handleCancel();
23
+ }}
24
+ open={open}
25
+ >
26
+ <DialogTitle variant={"h6"}>{title}</DialogTitle>
27
+ <DialogContent>
28
+
29
+ {body}
30
+
31
+ <Typography>
32
+ Are you sure you want to leave this page?
33
+ </Typography>
34
+
35
+ </DialogContent>
36
+ <DialogActions>
37
+ <Button variant="text" onClick={handleCancel} autoFocus> Cancel </Button>
38
+ <Button onClick={handleOk}> Ok </Button>
39
+ </DialogActions>
40
+ </Dialog>
41
+ );
42
+ }
@@ -15,12 +15,12 @@ import {
15
15
  VirtualTableWhereFilterOp
16
16
  } from "./VirtualTableProps";
17
17
 
18
- import { getRowHeight } from "./common";
19
18
  import { VirtualTableContextProps } from "./types";
20
19
  import { VirtualTableHeaderRow } from "./VirtualTableHeaderRow";
21
20
  import { VirtualTableRow } from "./VirtualTableRow";
22
21
  import { VirtualTableCell } from "./VirtualTableCell";
23
- import { AssignmentIcon, cn, Markdown, Typography } from "@firecms/ui";
22
+ import { AssignmentIcon, CenteredView, cls, Typography } from "@firecms/ui";
23
+ import { useDebounceCallback } from "../common/useDebouncedCallback";
24
24
 
25
25
  const VirtualListContext = createContext<VirtualTableContextProps<any>>({} as any);
26
26
  VirtualListContext.displayName = "VirtualListContext";
@@ -64,10 +64,10 @@ const innerElementType = forwardRef<HTMLDivElement, InnerElementProps>(({
64
64
 
65
65
  {customView && <div style={{
66
66
  position: "sticky",
67
- top: "56px",
67
+ top: "48px",
68
68
  flexGrow: 1,
69
- height: "calc(100% - 56px)",
70
- marginTop: "calc(56px - 100vh)",
69
+ height: "calc(100% - 48px)",
70
+ marginTop: "calc(48px - 100vh)",
71
71
  left: 0
72
72
  }}>{customView}</div>}
73
73
 
@@ -92,7 +92,8 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
92
92
  data,
93
93
  onResetPagination,
94
94
  onEndReached,
95
- size = "m",
95
+ endOffset = 600,
96
+ rowHeight = 54,
96
97
  columns: columnsProp,
97
98
  onRowClick,
98
99
  onColumnResize,
@@ -103,14 +104,17 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
103
104
  error,
104
105
  emptyComponent,
105
106
  onSortByUpdate,
107
+ onScroll: onScrollProp,
106
108
  loading,
107
109
  cellRenderer,
108
110
  hoverRow,
109
111
  createFilterField,
110
112
  rowClassName,
113
+ style,
111
114
  className,
112
115
  endAdornment,
113
- AddColumnComponent
116
+ AddColumnComponent,
117
+ initialScroll = 0,
114
118
  }: VirtualTableProps<T>) {
115
119
 
116
120
  const sortByProperty: string | undefined = sortBy ? sortBy[0] : undefined;
@@ -121,15 +125,57 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
121
125
  const tableRef = useRef<HTMLDivElement>(null);
122
126
  const endReachCallbackThreshold = useRef<number>(0);
123
127
 
128
+ const debouncedScroll = useDebounceCallback(onScrollProp, 200);
129
+
130
+ // Set initial scroll position
131
+ useEffect(() => {
132
+ if (tableRef.current && initialScroll) {
133
+ const { scrollLeft } = tableRef.current;
134
+ tableRef.current.scrollTo(scrollLeft, initialScroll);
135
+ }
136
+ }, [tableRef, initialScroll]);
137
+
124
138
  useEffect(() => {
125
139
  setColumns(columnsProp);
126
140
  }, [columnsProp]);
127
141
 
128
- const [measureRef, bounds] = useMeasure();
142
+ const [_, setForceUpdate] = useState(false);
143
+ useEffect(() => {
144
+ // Create a ResizeObserver to detect size changes more aggressively
145
+ if (tableRef.current) {
146
+ const resizeObserver = new ResizeObserver(() => {
147
+ // Force a re-render when size changes
148
+ setForceUpdate(prev => !prev);
149
+ });
150
+
151
+ resizeObserver.observe(tableRef.current);
152
+
153
+ return () => {
154
+ if (tableRef.current) {
155
+ resizeObserver.unobserve(tableRef.current);
156
+ }
157
+ resizeObserver.disconnect();
158
+ };
159
+ }
160
+ return () => {
161
+ }
162
+ }, [tableRef]);
163
+
164
+ const [measureRef, bounds] = useMeasure({
165
+ debounce: 50,
166
+ polyfill: ResizeObserver,
167
+ scroll: true,
168
+ // This is important for handling zooming in react-flow
169
+ offsetSize: true
170
+ });
129
171
 
130
172
  const onColumnResizeInternal = useCallback((params: OnVirtualTableColumnResizeParams) => {
131
- setColumns(columns.map((column) => column.key === params.column.key ? params.column : column));
132
- }, [columns]);
173
+ setColumns(prevColumns =>
174
+ prevColumns.map((column) =>
175
+ column.key === params.column.key ? params.column : column
176
+ )
177
+ );
178
+ }, []);
133
179
 
134
180
  const onColumnResizeEndInternal = useCallback((params: OnVirtualTableColumnResizeParams) => {
135
181
  setColumns(columns.map((column) => column.key === params.column.key ? params.column : column));
@@ -148,7 +194,6 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
148
194
  const scrollToTop = useCallback(() => {
149
195
  endReachCallbackThreshold.current = 0;
150
196
  if (tableRef.current) {
151
- // scrollRef.current = [scrollRef.current[0], 0];
152
197
  tableRef.current.scrollTo(tableRef.current?.scrollLeft, 0);
153
198
  }
154
199
  }, []);
@@ -181,21 +226,17 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
181
226
  scrollToTop();
182
227
  }, [checkFilterCombination, currentSort, onFilterUpdate, onResetPagination, onSortByUpdate, scrollToTop, sortByProperty]);
183
228
 
184
- const resetSort = useCallback(() => {
185
- endReachCallbackThreshold.current = 0;
186
- if (onSortByUpdate)
187
- onSortByUpdate(undefined);
188
- }, [onSortByUpdate]);
229
+ const maxScroll = Math.max((data?.length ?? 0) * rowHeight - bounds.height, 0);
189
230
 
190
- const maxScroll = Math.max((data?.length ?? 0) * getRowHeight(size) - bounds.height, 0);
191
231
  const onEndReachedInternal = useCallback((scrollOffset: number) => {
192
- if (onEndReached && (data?.length ?? 0) > 0 && scrollOffset > endReachCallbackThreshold.current + 600) {
232
+ if (onEndReached && (data?.length ?? 0) > 0 && scrollOffset > endReachCallbackThreshold.current + endOffset) {
193
233
  endReachCallbackThreshold.current = scrollOffset;
194
234
  onEndReached();
195
235
  }
196
236
  }, [data?.length, onEndReached]);
197
237
 
198
238
  const onScroll = useCallback(({
239
+ scrollDirection,
199
240
  scrollOffset,
200
241
  scrollUpdateWasRequested
201
242
  }: {
@@ -203,7 +244,14 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
203
244
  scrollOffset: number,
204
245
  scrollUpdateWasRequested: boolean;
205
246
  }) => {
206
- if (!scrollUpdateWasRequested && (scrollOffset >= maxScroll - 600))
247
+ if (onScrollProp) {
248
+ debouncedScroll({
249
+ scrollDirection,
250
+ scrollOffset,
251
+ scrollUpdateWasRequested
252
+ })
253
+ }
254
+ if (!scrollUpdateWasRequested && (scrollOffset >= maxScroll - endOffset))
207
255
  onEndReachedInternal(scrollOffset);
208
256
  }, [maxScroll, onEndReachedInternal]);
209
257
 
@@ -225,41 +273,33 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
225
273
  }
226
274
 
227
275
  if (onFilterUpdate) onFilterUpdate(newFilterValue);
276
+ }, [checkFilterCombination, currentSort, onFilterUpdate, sortByProperty]);
228
277
 
229
- if (column.key !== sortByProperty) {
230
- resetSort();
231
- }
232
- }, [checkFilterCombination, currentSort, onFilterUpdate, resetSort, sortByProperty]);
233
-
234
- const buildErrorView = useCallback(() => (
235
- <div
236
- className="h-full flex flex-col items-center justify-center sticky left-0">
278
+ const empty = !loading && (data?.length ?? 0) === 0;
279
+ const customView = error
280
+ ? <CenteredView maxWidth={"2xl"}
281
+ className="flex flex-col gap-2">
237
282
 
238
283
  <Typography variant={"h6"}>
239
- {"Error fetching data from the data source"}
284
+ {"Error"}
240
285
  </Typography>
241
286
 
242
- {error?.message && <Markdown className={"px-4 break-all"} source={error.message}/>}
287
+ {error?.message && <SafeLinkRenderer text={error.message}/>}
243
288
 
244
- </div>
245
- ), [error?.message]);
246
-
247
- const buildEmptyView = useCallback(() => {
248
- if (loading)
249
- return <CircularProgressCenter/>;
250
- return <div
251
- className="flex flex-col overflow-auto items-center justify-center p-2 gap-2 h-full">
252
- <AssignmentIcon/>
253
- {emptyComponent}
254
- </div>;
255
- }, [emptyComponent, loading]);
256
-
257
- const empty = !loading && (data?.length ?? 0) === 0;
258
- const customView = error ? buildErrorView() : (empty ? buildEmptyView() : undefined);
289
+ </CenteredView>
290
+ : (empty
291
+ ? (loading
292
+ ? <CircularProgressCenter/>
293
+ : <div
294
+ className="flex flex-col overflow-auto items-center justify-center p-2 gap-2 h-full">
295
+ <AssignmentIcon/>
296
+ {emptyComponent}
297
+ </div>)
298
+ : undefined);
259
299
 
260
300
  const virtualListController = {
261
301
  data,
262
- size,
302
+ rowHeight: rowHeight,
263
303
  cellRenderer,
264
304
  columns,
265
305
  currentSort,
@@ -278,23 +318,23 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
278
318
  AddColumnComponent
279
319
  };
280
320
 
281
- // useTraceUpdate(virtualListController);
282
321
  return (
283
322
  <div
284
323
  ref={measureRef}
285
- className={cn("h-full w-full", className)}>
324
+ style={style}
325
+ className={cls("h-full w-full", className)}>
286
326
  <VirtualListContext.Provider
287
327
  value={virtualListController}>
288
328
 
289
329
  <MemoizedList
290
330
  outerRef={tableRef}
291
- key={size}
331
+ key={rowHeight}
292
332
  width={bounds.width}
293
333
  height={bounds.height}
294
334
  itemCount={(data?.length ?? 0) + (endAdornment ? 1 : 0)}
295
335
  onScroll={onScroll}
296
336
  includeAddColumn={Boolean(AddColumnComponent)}
297
- itemSize={getRowHeight(size)}/>
337
+ itemSize={rowHeight}/>
298
338
 
299
339
  </VirtualListContext.Provider>
300
340
  </div>
@@ -334,7 +374,7 @@ function MemoizedList({
334
374
  onRowClick,
335
375
  data,
336
376
  columns,
337
- size = "m",
377
+ rowHeight = 54,
338
378
  cellRenderer,
339
379
  hoverRow,
340
380
  rowClassName,
@@ -367,7 +407,7 @@ function MemoizedList({
367
407
  ...style,
368
408
  top: `calc(${style.top}px + 48px)`
369
409
  }}
370
- size={size}>
410
+ rowHeight={rowHeight}>
371
411
 
372
412
  {columns.map((column: VirtualTableColumn, columnIndex: number) => {
373
413
  const cellData = rowData && rowData[column.key];
@@ -403,3 +443,17 @@ function MemoizedList({
403
443
  {Row}
404
444
  </List>;
405
445
  }
446
+
447
+ const SafeLinkRenderer: React.FC<{
448
+ text: string;
449
+ }> = ({ text }) => {
450
+ const urlRegex = /https?:\/\/[^\s]+/g;
451
+ const htmlContent = text.replace(urlRegex, (url) => {
452
+ // For each URL found, replace it with an HTML <a> tag
453
+ return `<a href="${url}" class="underline" target="_blank">Link</a><br/>`;
454
+ });
455
+
456
+ return (
457
+ <div className={"break-all"} dangerouslySetInnerHTML={{ __html: htmlContent }}/>
458
+ );
459
+ };
@@ -16,7 +16,7 @@ type VirtualTableCellProps<T extends any> = {
16
16
  };
17
17
 
18
18
  export const VirtualTableCell = React.memo<VirtualTableCellProps<any>>(
19
- function VirtualTableCell<T extends any>(props: VirtualTableCellProps<T>) {
19
+ function VirtualTableCell<T>(props: VirtualTableCellProps<T>) {
20
20
  // @ts-ignore
21
21
  return props.rowData && props.cellRenderer(
22
22
  {
@@ -30,14 +30,6 @@ export const VirtualTableCell = React.memo<VirtualTableCellProps<any>>(
30
30
  width: props.column.width
31
31
  } as CellRendererParams<T>
32
32
  );
33
- // return props.rowData && <props.cellRenderer
34
- // rowData={props.rowData}
35
- // rowIndex={props.rowIndex}
36
- // isScrolling={false}
37
- // column={props.column}
38
- // columns={props.columns}
39
- // columnIndex={props.columnIndex}
40
- // width={props.column.width}/>
41
33
  },
42
34
  (a, b) => {
43
35
  return equal(a.rowData, b.rowData) &&