@firecms/core 3.0.0 → 3.1.0-canary.02232f4

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 (340) hide show
  1. package/README.md +1 -1
  2. package/dist/components/AIIcon.d.ts +16 -0
  3. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +7 -1
  4. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
  5. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +14 -0
  6. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +6 -0
  7. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +5 -4
  8. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +6 -0
  9. package/dist/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +2 -2
  10. package/dist/components/EntityCollectionView/Board.d.ts +2 -0
  11. package/dist/components/EntityCollectionView/BoardColumn.d.ts +42 -0
  12. package/dist/components/EntityCollectionView/BoardColumnTitle.d.ts +9 -0
  13. package/dist/components/EntityCollectionView/BoardSortableList.d.ts +14 -0
  14. package/dist/components/EntityCollectionView/CollectionDataErrorBanner.d.ts +4 -0
  15. package/dist/components/EntityCollectionView/EntityBoardCard.d.ts +26 -0
  16. package/dist/components/EntityCollectionView/EntityCard.d.ts +19 -0
  17. package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +20 -0
  18. package/dist/components/EntityCollectionView/EntityCollectionCardView.d.ts +31 -0
  19. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +2 -2
  20. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +7 -3
  21. package/dist/components/EntityCollectionView/FiltersDialog.d.ts +14 -0
  22. package/dist/components/EntityCollectionView/ViewModeToggle.d.ts +44 -0
  23. package/dist/components/EntityCollectionView/board_types.d.ts +105 -0
  24. package/dist/components/EntityCollectionView/useBoardDataController.d.ts +60 -0
  25. package/dist/components/ErrorBoundary.d.ts +4 -2
  26. package/dist/components/HomePage/DefaultHomePage.d.ts +0 -1
  27. package/dist/components/LanguageToggle.d.ts +1 -0
  28. package/dist/components/SelectableTable/SelectableTable.d.ts +5 -1
  29. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +2 -1
  30. package/dist/components/UnsavedChangesDialog.d.ts +1 -0
  31. package/dist/components/VirtualTable/VirtualTable.performance.test.d.ts +1 -0
  32. package/dist/components/VirtualTable/VirtualTableCell.d.ts +6 -0
  33. package/dist/components/VirtualTable/VirtualTableHeader.d.ts +4 -1
  34. package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +1 -1
  35. package/dist/components/VirtualTable/VirtualTableProps.d.ts +17 -1
  36. package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +1 -0
  37. package/dist/components/VirtualTable/types.d.ts +3 -0
  38. package/dist/components/index.d.ts +4 -0
  39. package/dist/contexts/index.d.ts +10 -0
  40. package/dist/core/DrawerNavigationGroup.d.ts +45 -0
  41. package/dist/core/index.d.ts +1 -0
  42. package/dist/editor/components/SlashCommandMenu.d.ts +6 -0
  43. package/dist/editor/components/editor-bubble-item.d.ts +8 -0
  44. package/dist/editor/components/editor-bubble.d.ts +8 -0
  45. package/dist/editor/components/image-bubble.d.ts +5 -0
  46. package/dist/editor/components/index.d.ts +16 -0
  47. package/dist/editor/components/table-bubble.d.ts +5 -0
  48. package/dist/editor/editor.d.ts +30 -0
  49. package/dist/editor/extensions/HighlightDecorationExtension.d.ts +24 -0
  50. package/dist/editor/extensions/Image/index.d.ts +6 -0
  51. package/dist/editor/extensions/Image.d.ts +6 -0
  52. package/dist/editor/extensions/TextLoadingDecorationExtension.d.ts +16 -0
  53. package/dist/editor/extensions/clipboard.d.ts +7 -0
  54. package/dist/editor/extensions/custom-keymap.d.ts +1 -0
  55. package/dist/editor/extensions/drag-and-drop.d.ts +9 -0
  56. package/dist/editor/hooks/useProseMirror.d.ts +13 -0
  57. package/dist/editor/hooks/useProseMirrorContext.d.ts +9 -0
  58. package/dist/editor/index.d.ts +2 -0
  59. package/dist/editor/markdown.d.ts +5 -0
  60. package/dist/editor/nodeViews/ImageComponent.d.ts +3 -0
  61. package/dist/editor/nodeViews/ReactNodeView.d.ts +29 -0
  62. package/dist/editor/nodeViews/TaskItemComponent.d.ts +3 -0
  63. package/dist/editor/nodeViews/index.d.ts +6 -0
  64. package/dist/editor/plugins/index.d.ts +2 -0
  65. package/dist/editor/plugins/inputrules.d.ts +6 -0
  66. package/dist/editor/plugins/placeholderPlugin.d.ts +3 -0
  67. package/dist/editor/plugins/slashCommandPlugin.d.ts +12 -0
  68. package/dist/editor/schema.d.ts +2 -0
  69. package/dist/editor/selectors/ai-selector.d.ts +0 -0
  70. package/dist/editor/selectors/color-selector.d.ts +10 -0
  71. package/dist/editor/selectors/link-selector.d.ts +8 -0
  72. package/dist/editor/selectors/node-selector.d.ts +15 -0
  73. package/dist/editor/selectors/text-buttons.d.ts +1 -0
  74. package/dist/editor/types.d.ts +5 -0
  75. package/dist/editor/useProseMirror.d.ts +16 -0
  76. package/dist/editor/utils/prosemirror-utils.d.ts +6 -0
  77. package/dist/editor/utils/remove_classes.d.ts +1 -0
  78. package/dist/editor/utils/useDebouncedCallback.d.ts +1 -0
  79. package/dist/form/components/ErrorFocus.d.ts +1 -1
  80. package/dist/form/components/LocalChangesMenu.d.ts +2 -2
  81. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  82. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  83. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +1 -1
  84. package/dist/form/validation.d.ts +3 -2
  85. package/dist/hooks/index.d.ts +1 -0
  86. package/dist/hooks/useBreadcrumbsController.d.ts +16 -0
  87. package/dist/hooks/useBuildNavigationController.d.ts +0 -1
  88. package/dist/hooks/useCollapsedGroups.d.ts +6 -3
  89. package/dist/hooks/useTranslation.d.ts +17 -0
  90. package/dist/i18n/FireCMSi18nProvider.d.ts +33 -0
  91. package/dist/index.d.ts +5 -0
  92. package/dist/index.es.js +31028 -16080
  93. package/dist/index.es.js.map +1 -1
  94. package/dist/index.umd.js +29955 -15028
  95. package/dist/index.umd.js.map +1 -1
  96. package/dist/internal/useRestoreScroll.d.ts +1 -1
  97. package/dist/locales/de.d.ts +2 -0
  98. package/dist/locales/en.d.ts +10 -0
  99. package/dist/locales/es.d.ts +10 -0
  100. package/dist/locales/fr.d.ts +2 -0
  101. package/dist/locales/hi.d.ts +2 -0
  102. package/dist/locales/it.d.ts +2 -0
  103. package/dist/locales/pt.d.ts +7 -0
  104. package/dist/preview/PropertyPreviewProps.d.ts +5 -0
  105. package/dist/preview/components/DatePreview.d.ts +13 -3
  106. package/dist/preview/components/ImagePreview.d.ts +5 -1
  107. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  108. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  109. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +1 -1
  110. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +1 -1
  111. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +1 -1
  112. package/dist/types/analytics.d.ts +1 -1
  113. package/dist/types/collections.d.ts +88 -2
  114. package/dist/types/customization_controller.d.ts +2 -1
  115. package/dist/types/datasource.d.ts +0 -1
  116. package/dist/types/entities.d.ts +1 -0
  117. package/dist/types/firecms.d.ts +2 -1
  118. package/dist/types/index.d.ts +1 -0
  119. package/dist/types/navigation.d.ts +2 -2
  120. package/dist/types/plugins.d.ts +69 -1
  121. package/dist/types/properties.d.ts +277 -12
  122. package/dist/types/storage.d.ts +9 -0
  123. package/dist/types/translations.d.ts +669 -0
  124. package/dist/util/__tests__/conditions.test.d.ts +1 -0
  125. package/dist/util/__tests__/objects.test.d.ts +1 -0
  126. package/dist/util/conditions.d.ts +26 -0
  127. package/dist/util/entities.d.ts +2 -3
  128. package/dist/util/index.d.ts +3 -1
  129. package/dist/util/lazy_eager.d.ts +7 -0
  130. package/dist/util/objects.d.ts +1 -0
  131. package/dist/util/property_utils.d.ts +2 -1
  132. package/dist/util/resolutions.d.ts +3 -3
  133. package/dist/util/useStorageUploadController.d.ts +11 -2
  134. package/package.json +52 -12
  135. package/src/app/Scaffold.tsx +20 -19
  136. package/src/components/AIIcon.tsx +41 -0
  137. package/src/components/ArrayContainer.tsx +7 -8
  138. package/src/components/ClearFilterSortButton.tsx +25 -19
  139. package/src/components/ConfirmationDialog.tsx +4 -4
  140. package/src/components/DeleteEntityDialog.tsx +12 -11
  141. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +82 -43
  142. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +130 -79
  143. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +121 -104
  144. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +132 -103
  145. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +6 -3
  146. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +24 -44
  147. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +90 -49
  148. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +1 -1
  149. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -2
  150. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +11 -11
  151. package/src/components/EntityCollectionView/Board.tsx +324 -0
  152. package/src/components/EntityCollectionView/BoardColumn.tsx +158 -0
  153. package/src/components/EntityCollectionView/BoardColumnTitle.tsx +45 -0
  154. package/src/components/EntityCollectionView/BoardSortableList.tsx +174 -0
  155. package/src/components/EntityCollectionView/CollectionDataErrorBanner.tsx +43 -0
  156. package/src/components/EntityCollectionView/EntityBoardCard.tsx +212 -0
  157. package/src/components/EntityCollectionView/EntityCard.tsx +235 -0
  158. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +706 -0
  159. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +236 -0
  160. package/src/components/EntityCollectionView/EntityCollectionView.tsx +531 -209
  161. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +35 -22
  162. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +86 -15
  163. package/src/components/EntityCollectionView/FiltersDialog.tsx +252 -0
  164. package/src/components/EntityCollectionView/ViewModeToggle.tsx +202 -0
  165. package/src/components/EntityCollectionView/board_types.ts +113 -0
  166. package/src/components/EntityCollectionView/useBoardDataController.tsx +490 -0
  167. package/src/components/EntityJsonPreview.tsx +2 -1
  168. package/src/components/EntityPreview.tsx +1 -1
  169. package/src/components/EntityView.tsx +3 -2
  170. package/src/components/ErrorBoundary.tsx +27 -15
  171. package/src/components/ErrorTooltip.tsx +2 -1
  172. package/src/components/HomePage/DefaultHomePage.tsx +65 -22
  173. package/src/components/HomePage/HomePageDnD.tsx +59 -42
  174. package/src/components/HomePage/NavigationCard.tsx +20 -18
  175. package/src/components/HomePage/NavigationGroup.tsx +20 -17
  176. package/src/components/HomePage/RenameGroupDialog.tsx +15 -15
  177. package/src/components/HomePage/SmallNavigationCard.tsx +10 -9
  178. package/src/components/LanguageToggle.tsx +66 -0
  179. package/src/components/NotFoundPage.tsx +5 -3
  180. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +12 -17
  181. package/src/components/ReferenceWidget.tsx +5 -6
  182. package/src/components/SearchIconsView.tsx +3 -1
  183. package/src/components/SelectableTable/SelectableTable.tsx +75 -67
  184. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +7 -6
  185. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +50 -40
  186. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +53 -40
  187. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +60 -58
  188. package/src/components/UnsavedChangesDialog.tsx +6 -6
  189. package/src/components/UserDisplay.tsx +4 -4
  190. package/src/components/VirtualTable/VirtualTable.performance.test.tsx +387 -0
  191. package/src/components/VirtualTable/VirtualTable.tsx +277 -121
  192. package/src/components/VirtualTable/VirtualTableCell.tsx +18 -2
  193. package/src/components/VirtualTable/VirtualTableHeader.tsx +76 -64
  194. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +163 -42
  195. package/src/components/VirtualTable/VirtualTableProps.tsx +21 -2
  196. package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
  197. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +3 -0
  198. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +19 -6
  199. package/src/components/VirtualTable/types.tsx +3 -0
  200. package/src/components/common/default_entity_actions.tsx +4 -0
  201. package/src/components/common/useColumnsIds.tsx +95 -3
  202. package/src/components/common/useDataSourceTableController.tsx +12 -4
  203. package/src/components/index.tsx +5 -0
  204. package/src/contexts/BreacrumbsContext.tsx +15 -8
  205. package/src/contexts/index.ts +10 -0
  206. package/src/core/DefaultAppBar.tsx +49 -32
  207. package/src/core/DefaultDrawer.tsx +49 -57
  208. package/src/core/DrawerNavigationGroup.tsx +120 -0
  209. package/src/core/DrawerNavigationItem.tsx +4 -3
  210. package/src/core/EntityEditView.tsx +94 -50
  211. package/src/core/EntityEditViewFormActions.tsx +24 -17
  212. package/src/core/EntitySidePanel.tsx +34 -30
  213. package/src/core/FireCMS.tsx +33 -6
  214. package/src/core/SideDialogs.tsx +4 -2
  215. package/src/core/field_configs.tsx +18 -11
  216. package/src/core/index.tsx +1 -0
  217. package/src/editor/components/SlashCommandMenu.tsx +516 -0
  218. package/src/editor/components/editor-bubble-item.tsx +32 -0
  219. package/src/editor/components/editor-bubble.tsx +118 -0
  220. package/src/editor/components/image-bubble.tsx +156 -0
  221. package/src/editor/components/index.ts +14 -0
  222. package/src/editor/components/table-bubble.tsx +165 -0
  223. package/src/editor/editor.tsx +455 -0
  224. package/src/editor/extensions/HighlightDecorationExtension.ts +114 -0
  225. package/src/editor/extensions/Image/index.ts +133 -0
  226. package/src/editor/extensions/Image.ts +159 -0
  227. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +107 -0
  228. package/src/editor/extensions/clipboard.ts +72 -0
  229. package/src/editor/extensions/custom-keymap.ts +24 -0
  230. package/src/editor/extensions/drag-and-drop.tsx +480 -0
  231. package/src/editor/hooks/useProseMirror.ts +124 -0
  232. package/src/editor/hooks/useProseMirrorContext.ts +15 -0
  233. package/src/editor/index.ts +2 -0
  234. package/src/editor/markdown.ts +172 -0
  235. package/src/editor/nodeViews/ImageComponent.tsx +20 -0
  236. package/src/editor/nodeViews/ReactNodeView.tsx +89 -0
  237. package/src/editor/nodeViews/TaskItemComponent.tsx +29 -0
  238. package/src/editor/nodeViews/index.ts +35 -0
  239. package/src/editor/plugins/index.ts +58 -0
  240. package/src/editor/plugins/inputrules.ts +82 -0
  241. package/src/editor/plugins/placeholderPlugin.ts +55 -0
  242. package/src/editor/plugins/slashCommandPlugin.ts +61 -0
  243. package/src/editor/schema.ts +240 -0
  244. package/src/editor/selectors/ai-selector.tsx +111 -0
  245. package/src/editor/selectors/color-selector.tsx +200 -0
  246. package/src/editor/selectors/link-selector.tsx +118 -0
  247. package/src/editor/selectors/node-selector.tsx +157 -0
  248. package/src/editor/selectors/text-buttons.tsx +86 -0
  249. package/src/editor/types.ts +6 -0
  250. package/src/editor/useProseMirror.ts +126 -0
  251. package/src/editor/utils/prosemirror-utils.ts +108 -0
  252. package/src/editor/utils/remove_classes.ts +17 -0
  253. package/src/editor/utils/useDebouncedCallback.ts +25 -0
  254. package/src/form/EntityForm.tsx +150 -75
  255. package/src/form/EntityFormActions.tsx +19 -12
  256. package/src/form/PropertyFieldBinding.tsx +68 -51
  257. package/src/form/components/ErrorFocus.tsx +3 -3
  258. package/src/form/components/LocalChangesMenu.tsx +19 -19
  259. package/src/form/components/StorageItemPreview.tsx +5 -3
  260. package/src/form/components/StorageUploadProgress.tsx +22 -6
  261. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +18 -5
  262. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +22 -10
  263. package/src/form/field_bindings/BlockFieldBinding.tsx +26 -9
  264. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -17
  265. package/src/form/field_bindings/KeyValueFieldBinding.tsx +46 -25
  266. package/src/form/field_bindings/MapFieldBinding.tsx +88 -70
  267. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +93 -52
  268. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +15 -1
  269. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +25 -11
  270. package/src/form/field_bindings/ReferenceFieldBinding.tsx +25 -11
  271. package/src/form/field_bindings/RepeatFieldBinding.tsx +21 -6
  272. package/src/form/field_bindings/SelectFieldBinding.tsx +7 -5
  273. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +110 -92
  274. package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -14
  275. package/src/form/field_bindings/TextFieldBinding.tsx +77 -38
  276. package/src/form/field_bindings/UserSelectFieldBinding.tsx +7 -5
  277. package/src/form/validation.ts +245 -160
  278. package/src/hooks/index.tsx +1 -0
  279. package/src/hooks/useBreadcrumbsController.tsx +18 -0
  280. package/src/hooks/useBuildNavigationController.tsx +91 -41
  281. package/src/hooks/useCollapsedGroups.ts +18 -9
  282. package/src/hooks/useTranslation.ts +31 -0
  283. package/src/hooks/useValidateAuthenticator.tsx +1 -1
  284. package/src/i18n/FireCMSi18nProvider.tsx +160 -0
  285. package/src/index.ts +5 -0
  286. package/src/internal/useBuildDataSource.ts +68 -34
  287. package/src/internal/useBuildSideDialogsController.tsx +11 -8
  288. package/src/internal/useBuildSideEntityController.tsx +24 -24
  289. package/src/internal/useRestoreScroll.tsx +26 -14
  290. package/src/locales/de.ts +718 -0
  291. package/src/locales/en.ts +730 -0
  292. package/src/locales/es.ts +730 -0
  293. package/src/locales/fr.ts +718 -0
  294. package/src/locales/hi.ts +718 -0
  295. package/src/locales/it.ts +718 -0
  296. package/src/locales/pt.ts +727 -0
  297. package/src/preview/PropertyPreview.tsx +43 -33
  298. package/src/preview/PropertyPreviewProps.tsx +6 -0
  299. package/src/preview/components/DatePreview.tsx +72 -4
  300. package/src/preview/components/EmptyValue.tsx +1 -1
  301. package/src/preview/components/ImagePreview.tsx +37 -21
  302. package/src/preview/components/ReferencePreview.tsx +8 -2
  303. package/src/preview/components/StorageThumbnail.tsx +16 -12
  304. package/src/preview/components/UrlComponentPreview.tsx +32 -27
  305. package/src/preview/components/UserPreview.tsx +3 -1
  306. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +9 -7
  307. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +11 -9
  308. package/src/preview/property_previews/ArrayPropertyPreview.tsx +26 -24
  309. package/src/preview/property_previews/MapPropertyPreview.tsx +49 -27
  310. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +61 -56
  311. package/src/routes/CustomCMSRoute.tsx +1 -0
  312. package/src/routes/FireCMSRoute.tsx +87 -65
  313. package/src/types/analytics.ts +10 -0
  314. package/src/types/collections.ts +97 -3
  315. package/src/types/customization_controller.tsx +2 -1
  316. package/src/types/datasource.ts +54 -56
  317. package/src/types/entities.ts +10 -0
  318. package/src/types/firecms.tsx +2 -1
  319. package/src/types/index.ts +1 -0
  320. package/src/types/navigation.ts +2 -2
  321. package/src/types/plugins.tsx +77 -1
  322. package/src/types/properties.ts +369 -37
  323. package/src/types/storage.ts +11 -1
  324. package/src/types/translations.ts +752 -0
  325. package/src/util/__tests__/conditions.test.ts +506 -0
  326. package/src/util/__tests__/objects.test.ts +196 -0
  327. package/src/util/callbacks.ts +6 -3
  328. package/src/util/collections.ts +51 -6
  329. package/src/util/conditions.ts +339 -0
  330. package/src/util/entities.ts +29 -30
  331. package/src/util/entity_cache.ts +2 -1
  332. package/src/util/index.ts +3 -1
  333. package/src/util/join_collections.ts +10 -8
  334. package/src/util/lazy_eager.tsx +33 -0
  335. package/src/util/objects.ts +46 -13
  336. package/src/util/{references.ts → previews.ts} +16 -2
  337. package/src/util/property_utils.tsx +37 -11
  338. package/src/util/resolutions.ts +62 -58
  339. package/src/util/useStorageUploadController.tsx +34 -30
  340. /package/dist/util/{references.d.ts → previews.d.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import React, { createContext, forwardRef, RefObject, useCallback, useEffect, useRef, useState } from "react";
1
+ import React, { createContext, forwardRef, RefObject, useCallback, useEffect, useMemo, useRef, useState } from "react";
2
2
 
3
3
  import equal from "react-fast-compare"
4
4
 
@@ -21,6 +21,16 @@ import { VirtualTableRow } from "./VirtualTableRow";
21
21
  import { VirtualTableCell } from "./VirtualTableCell";
22
22
  import { AssignmentIcon, CenteredView, cls, Typography } from "@firecms/ui";
23
23
  import { useDebounceCallback } from "../common/useDebouncedCallback";
24
+ import {
25
+ closestCenter,
26
+ DndContext,
27
+ DragEndEvent,
28
+ DragStartEvent,
29
+ PointerSensor,
30
+ useSensor,
31
+ useSensors
32
+ } from "@dnd-kit/core";
33
+ import { arrayMove, horizontalListSortingStrategy, SortableContext, useSortable } from "@dnd-kit/sortable";
24
34
 
25
35
  const VirtualListContext = createContext<VirtualTableContextProps<any>>({} as any);
26
36
  VirtualListContext.displayName = "VirtualListContext";
@@ -32,52 +42,52 @@ type InnerElementProps = {
32
42
 
33
43
  // eslint-disable-next-line react/display-name
34
44
  const innerElementType = forwardRef<HTMLDivElement, InnerElementProps>(({
35
- children,
36
- ...rest
37
- }: InnerElementProps, ref) => {
38
-
39
- return (
40
- <VirtualListContext.Consumer>
41
- {(virtualTableProps) => {
42
- const customView = virtualTableProps.customView;
43
- return (
44
- <>
45
+ children,
46
+ ...rest
47
+ }: InnerElementProps, ref) => {
48
+
49
+ return (
50
+ <VirtualListContext.Consumer>
51
+ {(virtualTableProps) => {
52
+ const customView = virtualTableProps.customView;
53
+ return (
54
+ <>
55
+ <div
56
+ id={"virtual-table"}
57
+ style={{
58
+ position: "relative",
59
+ height: "100%"
60
+ }}>
45
61
  <div
46
- id={"virtual-table"}
62
+ ref={ref}
63
+ {...rest}
47
64
  style={{
48
- position: "relative",
49
- height: "100%"
65
+ ...rest?.style,
66
+ minHeight: "100%",
67
+ position: "relative"
50
68
  }}>
51
- <div
52
- ref={ref}
53
- {...rest}
54
- style={{
55
- ...rest?.style,
56
- minHeight: "100%",
57
- position: "relative"
58
- }}>
59
- <VirtualTableHeaderRow {...virtualTableProps}/>
60
- {!customView && children}
61
- </div>
62
-
69
+ <VirtualTableHeaderRow {...virtualTableProps} />
70
+ {!customView && children}
63
71
  </div>
64
72
 
65
- {customView && <div style={{
66
- position: "sticky",
67
- top: "48px",
68
- flexGrow: 1,
69
- height: "calc(100% - 48px)",
70
- marginTop: "calc(48px - 100vh)",
71
- left: 0
72
- }}>{customView}</div>}
73
-
74
- </>
75
- );
76
- }}
77
- </VirtualListContext.Consumer>
78
- );
79
- })
80
- ;
73
+ </div>
74
+
75
+ {customView && <div style={{
76
+ position: "sticky",
77
+ top: "48px",
78
+ flexGrow: 1,
79
+ height: "calc(100% - 48px)",
80
+ marginTop: "calc(48px - 100vh)",
81
+ left: 0
82
+ }}>{customView}</div>}
83
+
84
+ </>
85
+ );
86
+ }}
87
+ </VirtualListContext.Consumer>
88
+ );
89
+ })
90
+ ;
81
91
 
82
92
  /**
83
93
  * This is a Table component that allows displaying arbitrary data, not
@@ -89,33 +99,35 @@ const innerElementType = forwardRef<HTMLDivElement, InnerElementProps>(({
89
99
  */
90
100
  export const VirtualTable = React.memo<VirtualTableProps<any>>(
91
101
  function VirtualTable<T extends Record<string, any>>({
92
- data,
93
- onResetPagination,
94
- onEndReached,
95
- endOffset = 600,
96
- rowHeight = 54,
97
- columns: columnsProp,
98
- onRowClick,
99
- onColumnResize,
100
- filter: filterInput,
101
- checkFilterCombination,
102
- onFilterUpdate,
103
- sortBy,
104
- error,
105
- emptyComponent,
106
- onSortByUpdate,
107
- onScroll: onScrollProp,
108
- loading,
109
- cellRenderer,
110
- hoverRow,
111
- createFilterField,
112
- rowClassName,
113
- style,
114
- className,
115
- endAdornment,
116
- AddColumnComponent,
117
- initialScroll = 0,
118
- }: VirtualTableProps<T>) {
102
+ data,
103
+ onResetPagination,
104
+ onEndReached,
105
+ endOffset = 600,
106
+ rowHeight = 54,
107
+ columns: columnsProp,
108
+ onRowClick,
109
+ onColumnResize,
110
+ filter: filterInput,
111
+ checkFilterCombination,
112
+ onFilterUpdate,
113
+ sortBy,
114
+ error,
115
+ emptyComponent,
116
+ onSortByUpdate,
117
+ onScroll: onScrollProp,
118
+ loading,
119
+ cellRenderer,
120
+ hoverRow,
121
+ createFilterField,
122
+ rowClassName,
123
+ style,
124
+ className,
125
+ endAdornment,
126
+ AddColumnComponent,
127
+ initialScroll = 0,
128
+ onColumnsOrderChange,
129
+ headerIconSize,
130
+ }: VirtualTableProps<T>) {
119
131
 
120
132
  const sortByProperty: string | undefined = sortBy ? sortBy[0] : undefined;
121
133
  const currentSort: "asc" | "desc" | undefined = sortBy ? sortBy[1] : undefined;
@@ -127,6 +139,44 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
127
139
 
128
140
  const debouncedScroll = useDebounceCallback(onScrollProp, 200);
129
141
 
142
+ // Drag and drop state
143
+ const [draggingColumnId, setDraggingColumnId] = useState<string | null>(null);
144
+
145
+ const sensors = useSensors(
146
+ useSensor(PointerSensor, {
147
+ activationConstraint: {
148
+ distance: 5,
149
+ },
150
+ })
151
+ );
152
+
153
+ const handleDragStart = useCallback((event: DragStartEvent) => {
154
+ setDraggingColumnId(event.active.id as string);
155
+ }, []);
156
+
157
+ const handleDragEnd = useCallback((event: DragEndEvent) => {
158
+ const {
159
+ active,
160
+ over
161
+ } = event;
162
+ setDraggingColumnId(null);
163
+
164
+ if (over && active.id !== over.id && onColumnsOrderChange) {
165
+ const oldIndex = columns.findIndex((col) => col.key === active.id);
166
+ const newIndex = columns.findIndex((col) => col.key === over.id);
167
+
168
+ if (oldIndex !== -1 && newIndex !== -1) {
169
+ const newColumns = arrayMove(columns, oldIndex, newIndex);
170
+ setColumns(newColumns);
171
+ onColumnsOrderChange(newColumns);
172
+ }
173
+ }
174
+ }, [columns, onColumnsOrderChange]);
175
+
176
+ const handleDragCancel = useCallback(() => {
177
+ setDraggingColumnId(null);
178
+ }, []);
179
+
130
180
  // Set initial scroll position
131
181
  useEffect(() => {
132
182
  if (tableRef.current && initialScroll) {
@@ -162,7 +212,7 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
162
212
  }, [tableRef]);
163
213
 
164
214
  const [measureRef, bounds] = useMeasure({
165
- debounce: 50,
215
+ debounce: 0,
166
216
  polyfill: ResizeObserver,
167
217
  scroll: true,
168
218
  // This is important for handling zooming in react-flow
@@ -185,7 +235,7 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
185
235
  }, [columns, onColumnResize]);
186
236
 
187
237
  // saving the current filter as a ref as a workaround for header closure
188
- const filterRef = useRef<VirtualTableFilterValues<any> | undefined>();
238
+ const filterRef = useRef<VirtualTableFilterValues<any> | undefined>(undefined);
189
239
 
190
240
  useEffect(() => {
191
241
  filterRef.current = filterInput;
@@ -236,10 +286,10 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
236
286
  }, [data?.length, onEndReached]);
237
287
 
238
288
  const onScroll = useCallback(({
239
- scrollDirection,
240
- scrollOffset,
241
- scrollUpdateWasRequested
242
- }: {
289
+ scrollDirection,
290
+ scrollOffset,
291
+ scrollUpdateWasRequested
292
+ }: {
243
293
  scrollDirection: "forward" | "backward",
244
294
  scrollOffset: number,
245
295
  scrollUpdateWasRequested: boolean;
@@ -278,26 +328,26 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
278
328
  const empty = !loading && (data?.length ?? 0) === 0;
279
329
  const customView = error
280
330
  ? <CenteredView maxWidth={"2xl"}
281
- className="flex flex-col gap-2">
331
+ className="flex flex-col gap-2">
282
332
 
283
333
  <Typography variant={"h6"}>
284
334
  {"Error"}
285
335
  </Typography>
286
336
 
287
- {error?.message && <SafeLinkRenderer text={error.message}/>}
337
+ {error?.message && <SafeLinkRenderer text={error.message} />}
288
338
 
289
339
  </CenteredView>
290
340
  : (empty
291
341
  ? (loading
292
- ? <CircularProgressCenter/>
342
+ ? <CircularProgressCenter />
293
343
  : <div
294
344
  className="flex flex-col overflow-auto items-center justify-center p-2 gap-2 h-full">
295
- <AssignmentIcon/>
345
+ <AssignmentIcon />
296
346
  {emptyComponent}
297
347
  </div>)
298
348
  : undefined);
299
349
 
300
- const virtualListController = {
350
+ const virtualListController = useMemo(() => ({
301
351
  data,
302
352
  rowHeight: rowHeight,
303
353
  cellRenderer,
@@ -315,14 +365,29 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
315
365
  createFilterField,
316
366
  rowClassName,
317
367
  endAdornment,
318
- AddColumnComponent
319
- };
320
-
321
- return (
368
+ AddColumnComponent,
369
+ onColumnsOrderChange: onColumnsOrderChange ? (newColumns: VirtualTableColumn[]) => {
370
+ setColumns(newColumns);
371
+ onColumnsOrderChange(newColumns);
372
+ } : undefined,
373
+ draggingColumnId,
374
+ headerIconSize,
375
+ }), [data, rowHeight, cellRenderer, columns, currentSort, onRowClick, customView, onColumnResizeInternal, onColumnResizeEndInternal, filterInput, onColumnSort, onFilterUpdateInternal, sortByProperty, hoverRow, createFilterField, rowClassName, endAdornment, AddColumnComponent, onColumnsOrderChange, draggingColumnId, headerIconSize]);
376
+
377
+ // Get sortable column keys (excluding frozen columns)
378
+ const sortableColumnKeys = columns
379
+ .filter(col => !col.frozen)
380
+ .map(col => col.key);
381
+
382
+ const tableContent = (
322
383
  <div
323
384
  ref={measureRef}
324
385
  style={style}
325
- className={cls("h-full w-full", className)}>
386
+ className={cls(
387
+ "h-full w-full",
388
+ className,
389
+ draggingColumnId && "overflow-hidden"
390
+ )}>
326
391
  <VirtualListContext.Provider
327
392
  value={virtualListController}>
328
393
 
@@ -332,31 +397,107 @@ export const VirtualTable = React.memo<VirtualTableProps<any>>(
332
397
  width={bounds.width}
333
398
  height={bounds.height}
334
399
  itemCount={(data?.length ?? 0) + (endAdornment ? 1 : 0)}
335
- onScroll={onScroll}
400
+ onScroll={draggingColumnId ? undefined : onScroll}
336
401
  includeAddColumn={Boolean(AddColumnComponent)}
337
- itemSize={rowHeight}/>
402
+ itemSize={rowHeight} />
338
403
 
339
404
  </VirtualListContext.Provider>
340
405
  </div>
341
406
  );
407
+
408
+ // Wrap with DndContext if column reorder is enabled
409
+ if (onColumnsOrderChange) {
410
+ return (
411
+ <DndContext
412
+ sensors={sensors}
413
+ collisionDetection={closestCenter}
414
+ onDragStart={handleDragStart}
415
+ onDragEnd={handleDragEnd}
416
+ onDragCancel={handleDragCancel}
417
+ >
418
+ <SortableContext
419
+ items={sortableColumnKeys}
420
+ strategy={horizontalListSortingStrategy}
421
+ >
422
+ {tableContent}
423
+ </SortableContext>
424
+ </DndContext>
425
+ );
426
+ }
427
+
428
+ return tableContent;
342
429
  },
343
430
  equal
344
431
  );
432
+ // Wrapper that applies sortable transforms to cells
433
+ const SortableCellWrapper = ({
434
+ columnKey,
435
+ width,
436
+ isDragging,
437
+ isDraggable,
438
+ frozen,
439
+ children
440
+ }: {
441
+ columnKey: string;
442
+ width: number;
443
+ isDragging: boolean;
444
+ isDraggable: boolean;
445
+ frozen?: boolean;
446
+ children: React.ReactNode;
447
+ }) => {
448
+ const {
449
+ attributes,
450
+ listeners,
451
+ setNodeRef,
452
+ transform,
453
+ transition,
454
+ } = useSortable({
455
+ id: columnKey,
456
+ disabled: !isDraggable || frozen
457
+ });
458
+
459
+ // Remove tabIndex from attributes to avoid capturing focus before cell content
460
+ const { tabIndex: _tabIndex, ...attrsWithoutTabIndex } = attributes;
461
+
462
+ const style = {
463
+ // Only use translate, ignore any scale transforms
464
+ transform: transform ? `translateX(${transform.x}px)` : undefined,
465
+ // Don't transition the dragged item - only other items should animate
466
+ transition: isDragging ? undefined : transition,
467
+ minWidth: width,
468
+ maxWidth: width,
469
+ width: width,
470
+ };
471
+
472
+ return (
473
+ <div
474
+ ref={setNodeRef}
475
+ style={style}
476
+ className={cls(
477
+ "flex-shrink-0",
478
+ frozen && "sticky left-0 z-10 bg-white dark:bg-surface-950"
479
+ )}
480
+ {...attrsWithoutTabIndex}
481
+ >
482
+ {children}
483
+ </div>
484
+ );
485
+ };
345
486
 
346
487
  function MemoizedList({
347
- outerRef,
348
- width,
349
- height,
350
- itemCount,
351
- onScroll,
352
- itemSize,
353
- includeAddColumn
354
- }: {
355
- outerRef: RefObject<HTMLDivElement>;
488
+ outerRef,
489
+ width,
490
+ height,
491
+ itemCount,
492
+ onScroll,
493
+ itemSize,
494
+ includeAddColumn
495
+ }: {
496
+ outerRef: RefObject<HTMLDivElement | null>;
356
497
  width: number;
357
498
  height: number;
358
499
  itemCount: number;
359
- onScroll: (params: {
500
+ onScroll?: (params: {
360
501
  scrollDirection: "forward" | "backward",
361
502
  scrollOffset: number,
362
503
  scrollUpdateWasRequested: boolean;
@@ -366,20 +507,22 @@ function MemoizedList({
366
507
  }) {
367
508
 
368
509
  const Row = useCallback(({
369
- index,
370
- style
371
- }: any) => {
510
+ index,
511
+ style
512
+ }: any) => {
372
513
  return <VirtualListContext.Consumer>
373
514
  {({
374
- onRowClick,
375
- data,
376
- columns,
377
- rowHeight = 54,
378
- cellRenderer,
379
- hoverRow,
380
- rowClassName,
381
- endAdornment
382
- }) => {
515
+ onRowClick,
516
+ data,
517
+ columns,
518
+ rowHeight = 54,
519
+ cellRenderer,
520
+ hoverRow,
521
+ rowClassName,
522
+ endAdornment,
523
+ draggingColumnId,
524
+ onColumnsOrderChange
525
+ }) => {
383
526
 
384
527
  if (endAdornment && index === (data ?? []).length) {
385
528
  return <div style={{
@@ -411,19 +554,32 @@ function MemoizedList({
411
554
 
412
555
  {columns.map((column: VirtualTableColumn, columnIndex: number) => {
413
556
  const cellData = rowData && rowData[column.key];
414
- return <VirtualTableCell
415
- key={`cell_${column.key}`}
416
- dataKey={column.key}
417
- cellRenderer={cellRenderer}
418
- column={column}
419
- columns={columns}
420
- rowData={rowData}
421
- cellData={cellData}
422
- rowIndex={index}
423
- columnIndex={columnIndex}/>;
557
+ const isDragging = draggingColumnId === column.key;
558
+ const isDraggable = !column.frozen && !!onColumnsOrderChange;
559
+
560
+ return (
561
+ <SortableCellWrapper
562
+ key={`cell_wrapper_${column.key}`}
563
+ columnKey={column.key}
564
+ width={column.width}
565
+ isDragging={isDragging}
566
+ isDraggable={isDraggable}
567
+ frozen={column.frozen}
568
+ >
569
+ <VirtualTableCell
570
+ dataKey={column.key}
571
+ cellRenderer={cellRenderer}
572
+ column={column}
573
+ columns={columns}
574
+ rowData={rowData}
575
+ cellData={cellData}
576
+ rowIndex={index}
577
+ columnIndex={columnIndex} />
578
+ </SortableCellWrapper>
579
+ );
424
580
  })}
425
581
 
426
- {includeAddColumn && <div className={"w-20"}/>}
582
+ {includeAddColumn && <div className={"w-20"} />}
427
583
 
428
584
  </VirtualTableRow>
429
585
  );
@@ -454,6 +610,6 @@ const SafeLinkRenderer: React.FC<{
454
610
  });
455
611
 
456
612
  return (
457
- <div className={"break-all"} dangerouslySetInnerHTML={{ __html: htmlContent }}/>
613
+ <div className={"break-all"} dangerouslySetInnerHTML={{ __html: htmlContent }} />
458
614
  );
459
615
  };
@@ -13,6 +13,13 @@ type VirtualTableCellProps<T extends any> = {
13
13
  rowIndex: any;
14
14
  columnIndex: number;
15
15
  cellRenderer: React.ComponentType<CellRendererParams<T>>;
16
+ // Sortable props
17
+ sortableNodeRef?: (node: HTMLElement | null) => void;
18
+ sortableStyle?: React.CSSProperties;
19
+ sortableAttributes?: Record<string, any>;
20
+ isDragging?: boolean;
21
+ isDraggable?: boolean;
22
+ frozen?: boolean;
16
23
  };
17
24
 
18
25
  export const VirtualTableCell = React.memo<VirtualTableCellProps<any>>(
@@ -27,7 +34,13 @@ export const VirtualTableCell = React.memo<VirtualTableCellProps<any>>(
27
34
  column: props.column,
28
35
  columns: props.columns,
29
36
  columnIndex: props.columnIndex,
30
- width: props.column.width
37
+ width: props.column.width,
38
+ sortableNodeRef: props.sortableNodeRef,
39
+ sortableStyle: props.sortableStyle,
40
+ sortableAttributes: props.sortableAttributes,
41
+ isDragging: props.isDragging,
42
+ isDraggable: props.isDraggable,
43
+ frozen: props.frozen
31
44
  } as CellRendererParams<T>
32
45
  );
33
46
  },
@@ -37,6 +50,9 @@ export const VirtualTableCell = React.memo<VirtualTableCellProps<any>>(
37
50
  equal(a.cellData, b.cellData) &&
38
51
  equal(a.rowIndex, b.rowIndex) &&
39
52
  equal(a.cellRenderer, b.cellRenderer) &&
40
- equal(a.columnIndex, b.columnIndex)
53
+ equal(a.columnIndex, b.columnIndex) &&
54
+ a.isDragging === b.isDragging &&
55
+ a.isDraggable === b.isDraggable &&
56
+ a.frozen === b.frozen
41
57
  }
42
58
  );