@firecms/core 3.0.0-canary.21 → 3.0.0-canary.210

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 (380) 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 +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 +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 +16 -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/EntityPreview.d.ts +5 -4
  25. package/dist/components/ErrorView.d.ts +1 -1
  26. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  27. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  28. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  29. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  30. package/dist/components/ReferenceWidget.d.ts +3 -1
  31. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  32. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  33. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  34. package/dist/components/VirtualTable/VirtualTableProps.d.ts +28 -12
  35. package/dist/components/VirtualTable/types.d.ts +3 -3
  36. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  37. package/dist/components/common/index.d.ts +2 -1
  38. package/dist/components/common/table_height.d.ts +5 -0
  39. package/dist/components/common/types.d.ts +4 -6
  40. package/dist/components/common/useColumnsIds.d.ts +3 -1
  41. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  42. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  43. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  44. package/dist/components/index.d.ts +4 -2
  45. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  46. package/dist/core/DefaultAppBar.d.ts +29 -0
  47. package/dist/core/DefaultDrawer.d.ts +19 -0
  48. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  49. package/dist/core/EntityEditView.d.ts +33 -11
  50. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  51. package/dist/core/FireCMS.d.ts +3 -3
  52. package/dist/core/FireCMSRouter.d.ts +4 -0
  53. package/dist/core/NavigationRoutes.d.ts +2 -3
  54. package/dist/core/SideDialogs.d.ts +4 -2
  55. package/dist/core/index.d.ts +4 -4
  56. package/dist/form/EntityForm.d.ts +37 -69
  57. package/dist/form/EntityFormActions.d.ts +17 -0
  58. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  59. package/dist/form/components/ErrorFocus.d.ts +1 -1
  60. package/dist/form/components/FieldHelperText.d.ts +3 -3
  61. package/dist/form/components/FormEntry.d.ts +6 -0
  62. package/dist/form/components/FormLayout.d.ts +5 -0
  63. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  64. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  65. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  66. package/dist/form/components/index.d.ts +3 -1
  67. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  68. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  70. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  71. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  73. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  74. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  75. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  76. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  77. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  79. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  80. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  81. package/dist/form/index.d.ts +16 -18
  82. package/dist/form/useClearRestoreValue.d.ts +2 -2
  83. package/dist/hooks/data/delete.d.ts +4 -4
  84. package/dist/hooks/data/save.d.ts +4 -5
  85. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  86. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  87. package/dist/hooks/index.d.ts +1 -0
  88. package/dist/hooks/useAuthController.d.ts +1 -1
  89. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  90. package/dist/hooks/useBuildNavigationController.d.ts +7 -5
  91. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  92. package/dist/hooks/useModeController.d.ts +1 -2
  93. package/dist/hooks/useProjectLog.d.ts +8 -2
  94. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  95. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  96. package/dist/index.d.ts +1 -0
  97. package/dist/index.es.js +21823 -14330
  98. package/dist/index.es.js.map +1 -1
  99. package/dist/index.umd.js +24174 -588
  100. package/dist/index.umd.js.map +1 -1
  101. package/dist/internal/useBuildDataSource.d.ts +1 -16
  102. package/dist/internal/useBuildSideEntityController.d.ts +2 -2
  103. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  104. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  105. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  106. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  107. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  108. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  109. package/dist/preview/util.d.ts +3 -3
  110. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  111. package/dist/routes/FireCMSRoute.d.ts +1 -0
  112. package/dist/routes/HomePageRoute.d.ts +3 -0
  113. package/dist/types/auth.d.ts +8 -10
  114. package/dist/types/collections.d.ts +77 -22
  115. package/dist/types/datasource.d.ts +52 -36
  116. package/dist/types/dialogs_controller.d.ts +7 -3
  117. package/dist/types/entities.d.ts +7 -2
  118. package/dist/types/entity_actions.d.ts +28 -4
  119. package/dist/types/entity_callbacks.d.ts +16 -16
  120. package/dist/types/entity_overrides.d.ts +2 -2
  121. package/dist/types/export_import.d.ts +4 -4
  122. package/dist/types/fields.d.ts +71 -42
  123. package/dist/types/firecms.d.ts +6 -2
  124. package/dist/types/firecms_context.d.ts +1 -1
  125. package/dist/types/index.d.ts +0 -1
  126. package/dist/types/navigation.d.ts +32 -14
  127. package/dist/types/permissions.d.ts +4 -4
  128. package/dist/types/plugins.d.ts +23 -12
  129. package/dist/types/properties.d.ts +52 -24
  130. package/dist/types/property_config.d.ts +0 -2
  131. package/dist/types/side_dialogs_controller.d.ts +10 -0
  132. package/dist/types/side_entity_controller.d.ts +6 -1
  133. package/dist/types/storage.d.ts +86 -3
  134. package/dist/types/user.d.ts +1 -0
  135. package/dist/util/builders.d.ts +3 -3
  136. package/dist/util/entities.d.ts +3 -3
  137. package/dist/util/entity_actions.d.ts +2 -0
  138. package/dist/util/entity_cache.d.ts +23 -0
  139. package/dist/util/icon_list.d.ts +5 -1
  140. package/dist/util/icon_synonyms.d.ts +1 -98
  141. package/dist/util/icons.d.ts +6 -3
  142. package/dist/util/index.d.ts +2 -0
  143. package/dist/util/navigation_from_path.d.ts +6 -1
  144. package/dist/util/navigation_utils.d.ts +14 -3
  145. package/dist/util/objects.d.ts +2 -1
  146. package/dist/util/permissions.d.ts +4 -4
  147. package/dist/util/plurals.d.ts +0 -2
  148. package/dist/util/property_utils.d.ts +3 -3
  149. package/dist/util/resolutions.d.ts +36 -17
  150. package/dist/util/storage.d.ts +23 -2
  151. package/dist/util/useStorageUploadController.d.ts +3 -3
  152. package/package.json +61 -48
  153. package/src/app/AppBar.tsx +18 -0
  154. package/src/app/Drawer.tsx +24 -0
  155. package/src/app/Scaffold.tsx +253 -0
  156. package/src/app/index.ts +4 -0
  157. package/src/app/useApp.tsx +32 -0
  158. package/src/components/ArrayContainer.tsx +127 -41
  159. package/src/components/CircularProgressCenter.tsx +2 -2
  160. package/src/components/ClearFilterSortButton.tsx +41 -0
  161. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  162. package/src/components/DeleteEntityDialog.tsx +10 -19
  163. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +54 -37
  164. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  165. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  166. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
  167. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  168. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  169. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  170. package/src/components/EntityCollectionTable/index.tsx +1 -1
  171. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
  172. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  173. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  174. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +81 -80
  175. package/src/components/EntityCollectionView/EntityCollectionView.tsx +207 -113
  176. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  177. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  178. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  179. package/src/components/EntityCollectionView/utils.ts +19 -0
  180. package/src/components/EntityPreview.tsx +62 -52
  181. package/src/components/EntityView.tsx +10 -10
  182. package/src/components/ErrorView.tsx +4 -4
  183. package/src/components/HomePage/DefaultHomePage.tsx +26 -19
  184. package/src/components/HomePage/FavouritesView.tsx +6 -11
  185. package/src/components/HomePage/NavigationCard.tsx +3 -3
  186. package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
  187. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  188. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  189. package/src/components/NotFoundPage.tsx +2 -2
  190. package/src/components/PropertyConfigBadge.tsx +9 -3
  191. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  192. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +19 -13
  193. package/src/components/ReferenceWidget.tsx +21 -11
  194. package/src/components/SearchIconsView.tsx +10 -7
  195. package/src/components/SelectableTable/SelectableTable.tsx +27 -12
  196. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  197. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  198. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  199. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  200. package/src/components/UnsavedChangesDialog.tsx +42 -0
  201. package/src/components/VirtualTable/VirtualTable.tsx +96 -48
  202. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  203. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  204. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  205. package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
  206. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  207. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  208. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  209. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  210. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  211. package/src/components/VirtualTable/types.tsx +2 -3
  212. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +33 -40
  213. package/src/components/common/index.ts +2 -1
  214. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  215. package/src/components/common/types.tsx +4 -6
  216. package/src/components/common/useColumnsIds.tsx +24 -3
  217. package/src/components/common/useDataSourceTableController.tsx +420 -0
  218. package/src/components/common/useDebouncedCallback.tsx +20 -0
  219. package/src/components/common/useScrollRestoration.tsx +68 -0
  220. package/src/components/common/useTableSearchHelper.ts +53 -12
  221. package/src/components/index.tsx +4 -2
  222. package/src/contexts/BreacrumbsContext.tsx +38 -0
  223. package/src/contexts/DialogsProvider.tsx +5 -4
  224. package/src/contexts/ModeController.tsx +1 -3
  225. package/src/contexts/SnackbarProvider.tsx +2 -0
  226. package/src/core/DefaultAppBar.tsx +219 -0
  227. package/src/core/DefaultDrawer.tsx +185 -0
  228. package/src/core/DrawerNavigationItem.tsx +66 -0
  229. package/src/core/EntityEditView.tsx +321 -479
  230. package/src/core/EntityEditViewFormActions.tsx +199 -0
  231. package/src/core/EntitySidePanel.tsx +86 -17
  232. package/src/core/FireCMS.tsx +56 -49
  233. package/src/core/FireCMSRouter.tsx +17 -0
  234. package/src/core/NavigationRoutes.tsx +28 -38
  235. package/src/core/SideDialogs.tsx +22 -12
  236. package/src/core/field_configs.tsx +11 -12
  237. package/src/core/index.tsx +6 -5
  238. package/src/form/EntityForm.tsx +585 -539
  239. package/src/form/EntityFormActions.tsx +169 -0
  240. package/src/form/PropertyFieldBinding.tsx +85 -44
  241. package/src/form/components/CustomIdField.tsx +6 -2
  242. package/src/form/components/FieldHelperText.tsx +4 -4
  243. package/src/form/components/FormEntry.tsx +22 -0
  244. package/src/form/components/FormLayout.tsx +16 -0
  245. package/src/form/components/LabelWithIcon.tsx +30 -19
  246. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  247. package/src/form/components/StorageItemPreview.tsx +22 -12
  248. package/src/form/components/StorageUploadProgress.tsx +4 -5
  249. package/src/form/components/index.tsx +3 -1
  250. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +31 -19
  251. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
  252. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  253. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  254. package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
  255. package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
  256. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
  257. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  258. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  259. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  260. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -35
  261. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
  262. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +42 -50
  263. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  264. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  265. package/src/form/index.tsx +16 -37
  266. package/src/form/useClearRestoreValue.tsx +2 -2
  267. package/src/form/validation.ts +13 -23
  268. package/src/hooks/data/delete.ts +6 -5
  269. package/src/hooks/data/save.ts +13 -9
  270. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  271. package/src/hooks/data/useDataSource.tsx +11 -3
  272. package/src/hooks/data/useEntityFetch.tsx +10 -6
  273. package/src/hooks/index.tsx +1 -0
  274. package/src/hooks/useAuthController.tsx +1 -1
  275. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  276. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  277. package/src/hooks/useBuildModeController.tsx +22 -29
  278. package/src/hooks/useBuildNavigationController.tsx +159 -54
  279. package/src/hooks/useFireCMSContext.tsx +5 -5
  280. package/src/hooks/useLargeLayout.tsx +0 -35
  281. package/src/hooks/useModeController.tsx +1 -2
  282. package/src/hooks/useProjectLog.tsx +32 -10
  283. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  284. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  285. package/src/index.ts +1 -0
  286. package/src/internal/useBuildDataSource.ts +72 -82
  287. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  288. package/src/internal/useBuildSideEntityController.tsx +193 -73
  289. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  290. package/src/preview/PropertyPreview.tsx +17 -24
  291. package/src/preview/PropertyPreviewProps.tsx +7 -1
  292. package/src/preview/components/BooleanPreview.tsx +2 -2
  293. package/src/preview/components/EmptyValue.tsx +1 -1
  294. package/src/preview/components/EnumValuesChip.tsx +2 -2
  295. package/src/preview/components/ImagePreview.tsx +25 -36
  296. package/src/preview/components/ReferencePreview.tsx +22 -33
  297. package/src/preview/components/StorageThumbnail.tsx +5 -1
  298. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  299. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  300. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  301. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  302. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  303. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  304. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  305. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  306. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  307. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  308. package/src/preview/util.ts +10 -10
  309. package/src/routes/CustomCMSRoute.tsx +21 -0
  310. package/src/routes/FireCMSRoute.tsx +235 -0
  311. package/src/routes/HomePageRoute.tsx +17 -0
  312. package/src/types/auth.tsx +9 -13
  313. package/src/types/collections.ts +94 -27
  314. package/src/types/customization_controller.tsx +0 -1
  315. package/src/types/datasource.ts +61 -43
  316. package/src/types/dialogs_controller.tsx +7 -3
  317. package/src/types/entities.ts +12 -2
  318. package/src/types/entity_actions.tsx +32 -7
  319. package/src/types/entity_callbacks.ts +18 -18
  320. package/src/types/entity_overrides.tsx +2 -2
  321. package/src/types/export_import.ts +4 -4
  322. package/src/types/fields.tsx +81 -46
  323. package/src/types/firecms.tsx +7 -2
  324. package/src/types/firecms_context.tsx +1 -1
  325. package/src/types/index.ts +0 -1
  326. package/src/types/navigation.ts +38 -18
  327. package/src/types/permissions.ts +5 -5
  328. package/src/types/plugins.tsx +25 -14
  329. package/src/types/properties.ts +60 -25
  330. package/src/types/property_config.tsx +0 -2
  331. package/src/types/side_dialogs_controller.tsx +15 -0
  332. package/src/types/side_entity_controller.tsx +6 -1
  333. package/src/types/storage.ts +94 -3
  334. package/src/types/user.ts +2 -0
  335. package/src/util/builders.ts +10 -8
  336. package/src/util/entities.ts +9 -6
  337. package/src/util/entity_actions.ts +28 -0
  338. package/src/util/entity_cache.ts +204 -0
  339. package/src/util/enums.ts +1 -1
  340. package/src/util/icon_list.ts +16 -10
  341. package/src/util/icon_synonyms.ts +3 -100
  342. package/src/util/icons.tsx +17 -7
  343. package/src/util/index.ts +2 -0
  344. package/src/util/join_collections.ts +3 -0
  345. package/src/util/make_properties_editable.ts +13 -5
  346. package/src/util/navigation_from_path.ts +13 -6
  347. package/src/util/navigation_utils.ts +59 -7
  348. package/src/util/objects.ts +48 -28
  349. package/src/util/parent_references_from_path.ts +3 -3
  350. package/src/util/permissions.ts +9 -8
  351. package/src/util/plurals.ts +0 -2
  352. package/src/util/property_utils.tsx +11 -4
  353. package/src/util/references.ts +11 -2
  354. package/src/util/resolutions.ts +100 -46
  355. package/src/util/storage.ts +79 -21
  356. package/src/util/strings.ts +2 -2
  357. package/src/util/useStorageUploadController.tsx +71 -27
  358. package/dist/components/FireCMSAppBar.d.ts +0 -26
  359. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  360. package/dist/components/VirtualTable/common.d.ts +0 -2
  361. package/dist/core/Drawer.d.ts +0 -23
  362. package/dist/core/Scaffold.d.ts +0 -55
  363. package/dist/core/SideEntityView.d.ts +0 -7
  364. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  365. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  366. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  367. package/dist/internal/useLocaleConfig.d.ts +0 -1
  368. package/dist/types/appcheck.d.ts +0 -26
  369. package/src/components/FireCMSAppBar.tsx +0 -165
  370. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  371. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  372. package/src/core/Drawer.tsx +0 -191
  373. package/src/core/Scaffold.tsx +0 -281
  374. package/src/core/SideEntityView.tsx +0 -38
  375. package/src/form/components/FormikArrayContainer.tsx +0 -44
  376. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  377. package/src/internal/useBuildCustomizationController.tsx +0 -5
  378. package/src/internal/useLocaleConfig.tsx +0 -18
  379. package/src/types/appcheck.ts +0 -29
  380. /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,18 @@ 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,
118
+ debug
114
119
  }: VirtualTableProps<T>) {
115
120
 
116
121
  const sortByProperty: string | undefined = sortBy ? sortBy[0] : undefined;
@@ -121,6 +126,15 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
121
126
  const tableRef = useRef<HTMLDivElement>(null);
122
127
  const endReachCallbackThreshold = useRef<number>(0);
123
128
 
129
+ const debouncedScroll = useDebounceCallback(onScrollProp, 200);
130
+
131
+ // Set initial scroll position
132
+ useEffect(() => {
133
+ if (tableRef.current && initialScroll) {
134
+ tableRef.current.scrollTo(0, initialScroll);
135
+ }
136
+ }, [tableRef, initialScroll]);
137
+
124
138
  useEffect(() => {
125
139
  setColumns(columnsProp);
126
140
  }, [columnsProp]);
@@ -128,10 +142,14 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
128
142
  const [measureRef, bounds] = useMeasure();
129
143
 
130
144
  const onColumnResizeInternal = useCallback((params: OnVirtualTableColumnResizeParams) => {
145
+ if (debug)
146
+ console.log("onColumnResizeInternal", params);
131
147
  setColumns(columns.map((column) => column.key === params.column.key ? params.column : column));
132
148
  }, [columns]);
133
149
 
134
150
  const onColumnResizeEndInternal = useCallback((params: OnVirtualTableColumnResizeParams) => {
151
+ if (debug)
152
+ console.log("onColumnResizeEndInternal", params);
135
153
  setColumns(columns.map((column) => column.key === params.column.key ? params.column : column));
136
154
  if (onColumnResize) {
137
155
  onColumnResize(params);
@@ -142,19 +160,25 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
142
160
  const filterRef = useRef<VirtualTableFilterValues<any> | undefined>();
143
161
 
144
162
  useEffect(() => {
163
+ if (debug)
164
+ console.log("Filter updated", filterInput);
145
165
  filterRef.current = filterInput;
146
166
  }, [filterInput]);
147
167
 
148
168
  const scrollToTop = useCallback(() => {
169
+ if (debug)
170
+ console.log("scrollToTop");
149
171
  endReachCallbackThreshold.current = 0;
150
172
  if (tableRef.current) {
151
- // scrollRef.current = [scrollRef.current[0], 0];
152
173
  tableRef.current.scrollTo(tableRef.current?.scrollLeft, 0);
153
174
  }
154
175
  }, []);
155
176
 
156
177
  const onColumnSort = useCallback((key: string) => {
157
178
 
179
+ if (debug)
180
+ console.log("onColumnSort", key);
181
+
158
182
  const isDesc = sortByProperty === key && currentSort === "desc";
159
183
  const isAsc = sortByProperty === key && currentSort === "asc";
160
184
  const newSort = isAsc ? "desc" : (isDesc ? undefined : "asc");
@@ -181,21 +205,21 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
181
205
  scrollToTop();
182
206
  }, [checkFilterCombination, currentSort, onFilterUpdate, onResetPagination, onSortByUpdate, scrollToTop, sortByProperty]);
183
207
 
184
- const resetSort = useCallback(() => {
185
- endReachCallbackThreshold.current = 0;
186
- if (onSortByUpdate)
187
- onSortByUpdate(undefined);
188
- }, [onSortByUpdate]);
208
+ const maxScroll = Math.max((data?.length ?? 0) * rowHeight - bounds.height, 0);
209
+ if (debug)
210
+ console.log("maxScroll", maxScroll);
189
211
 
190
- const maxScroll = Math.max((data?.length ?? 0) * getRowHeight(size) - bounds.height, 0);
191
212
  const onEndReachedInternal = useCallback((scrollOffset: number) => {
192
- if (onEndReached && (data?.length ?? 0) > 0 && scrollOffset > endReachCallbackThreshold.current + 600) {
213
+ if (debug)
214
+ console.log("onEndReachedInternal", scrollOffset, endReachCallbackThreshold.current + endOffset);
215
+ if (onEndReached && (data?.length ?? 0) > 0 && scrollOffset > endReachCallbackThreshold.current + endOffset) {
193
216
  endReachCallbackThreshold.current = scrollOffset;
194
217
  onEndReached();
195
218
  }
196
219
  }, [data?.length, onEndReached]);
197
220
 
198
221
  const onScroll = useCallback(({
222
+ scrollDirection,
199
223
  scrollOffset,
200
224
  scrollUpdateWasRequested
201
225
  }: {
@@ -203,11 +227,26 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
203
227
  scrollOffset: number,
204
228
  scrollUpdateWasRequested: boolean;
205
229
  }) => {
206
- if (!scrollUpdateWasRequested && (scrollOffset >= maxScroll - 600))
230
+ if (debug)
231
+ console.log("onScroll", {
232
+ scrollDirection,
233
+ scrollOffset,
234
+ scrollUpdateWasRequested
235
+ });
236
+ if (onScrollProp) {
237
+ debouncedScroll({
238
+ scrollDirection,
239
+ scrollOffset,
240
+ scrollUpdateWasRequested
241
+ })
242
+ }
243
+ if (!scrollUpdateWasRequested && (scrollOffset >= maxScroll - endOffset))
207
244
  onEndReachedInternal(scrollOffset);
208
245
  }, [maxScroll, onEndReachedInternal]);
209
246
 
210
247
  const onFilterUpdateInternal = useCallback((column: VirtualTableColumn, filterForProperty?: [VirtualTableWhereFilterOp, any]) => {
248
+ if (debug)
249
+ console.log("onFilterUpdateInternal", column, filterForProperty);
211
250
 
212
251
  endReachCallbackThreshold.current = 0;
213
252
  const filter = filterRef.current;
@@ -225,41 +264,33 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
225
264
  }
226
265
 
227
266
  if (onFilterUpdate) onFilterUpdate(newFilterValue);
267
+ }, [checkFilterCombination, currentSort, onFilterUpdate, sortByProperty]);
228
268
 
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">
269
+ const empty = !loading && (data?.length ?? 0) === 0;
270
+ const customView = error
271
+ ? <CenteredView maxWidth={"2xl"}
272
+ className="flex flex-col gap-2">
237
273
 
238
274
  <Typography variant={"h6"}>
239
- {"Error fetching data from the data source"}
275
+ {"Error"}
240
276
  </Typography>
241
277
 
242
- {error?.message && <Markdown className={"px-4 break-all"} source={error.message}/>}
243
-
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]);
278
+ {error?.message && <SafeLinkRenderer text={error.message}/>}
256
279
 
257
- const empty = !loading && (data?.length ?? 0) === 0;
258
- const customView = error ? buildErrorView() : (empty ? buildEmptyView() : undefined);
280
+ </CenteredView>
281
+ : (empty
282
+ ? (loading
283
+ ? <CircularProgressCenter/>
284
+ : <div
285
+ className="flex flex-col overflow-auto items-center justify-center p-2 gap-2 h-full">
286
+ <AssignmentIcon/>
287
+ {emptyComponent}
288
+ </div>)
289
+ : undefined);
259
290
 
260
291
  const virtualListController = {
261
292
  data,
262
- size,
293
+ rowHeight: rowHeight,
263
294
  cellRenderer,
264
295
  columns,
265
296
  currentSort,
@@ -278,23 +309,26 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
278
309
  AddColumnComponent
279
310
  };
280
311
 
281
- // useTraceUpdate(virtualListController);
312
+ if (debug)
313
+ console.log("VirtualTable render", virtualListController);
314
+
282
315
  return (
283
316
  <div
284
317
  ref={measureRef}
285
- className={cn("h-full w-full", className)}>
318
+ style={style}
319
+ className={cls("h-full w-full", className)}>
286
320
  <VirtualListContext.Provider
287
321
  value={virtualListController}>
288
322
 
289
323
  <MemoizedList
290
324
  outerRef={tableRef}
291
- key={size}
325
+ key={rowHeight}
292
326
  width={bounds.width}
293
327
  height={bounds.height}
294
328
  itemCount={(data?.length ?? 0) + (endAdornment ? 1 : 0)}
295
329
  onScroll={onScroll}
296
330
  includeAddColumn={Boolean(AddColumnComponent)}
297
- itemSize={getRowHeight(size)}/>
331
+ itemSize={rowHeight}/>
298
332
 
299
333
  </VirtualListContext.Provider>
300
334
  </div>
@@ -334,7 +368,7 @@ function MemoizedList({
334
368
  onRowClick,
335
369
  data,
336
370
  columns,
337
- size = "m",
371
+ rowHeight = 54,
338
372
  cellRenderer,
339
373
  hoverRow,
340
374
  rowClassName,
@@ -367,7 +401,7 @@ function MemoizedList({
367
401
  ...style,
368
402
  top: `calc(${style.top}px + 48px)`
369
403
  }}
370
- size={size}>
404
+ rowHeight={rowHeight}>
371
405
 
372
406
  {columns.map((column: VirtualTableColumn, columnIndex: number) => {
373
407
  const cellData = rowData && rowData[column.key];
@@ -403,3 +437,17 @@ function MemoizedList({
403
437
  {Row}
404
438
  </List>;
405
439
  }
440
+
441
+ const SafeLinkRenderer: React.FC<{
442
+ text: string;
443
+ }> = ({ text }) => {
444
+ const urlRegex = /https?:\/\/[^\s]+/g;
445
+ const htmlContent = text.replace(urlRegex, (url) => {
446
+ // For each URL found, replace it with an HTML <a> tag
447
+ return `<a href="${url}" class="underline" target="_blank">Link</a><br/>`;
448
+ });
449
+
450
+ return (
451
+ <div className={"break-all"} dangerouslySetInnerHTML={{ __html: htmlContent }}/>
452
+ );
453
+ };
@@ -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) &&