@firecms/core 3.0.0-canary.24 → 3.0.0-canary.240

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