@firecms/core 3.0.1 → 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 (334) 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/VirtualTableCell.d.ts +6 -0
  32. package/dist/components/VirtualTable/VirtualTableHeader.d.ts +4 -1
  33. package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +1 -1
  34. package/dist/components/VirtualTable/VirtualTableProps.d.ts +17 -1
  35. package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +1 -0
  36. package/dist/components/VirtualTable/types.d.ts +3 -0
  37. package/dist/components/index.d.ts +4 -0
  38. package/dist/contexts/index.d.ts +10 -0
  39. package/dist/core/DrawerNavigationGroup.d.ts +45 -0
  40. package/dist/core/index.d.ts +1 -0
  41. package/dist/editor/components/SlashCommandMenu.d.ts +6 -0
  42. package/dist/editor/components/editor-bubble-item.d.ts +8 -0
  43. package/dist/editor/components/editor-bubble.d.ts +8 -0
  44. package/dist/editor/components/image-bubble.d.ts +5 -0
  45. package/dist/editor/components/index.d.ts +16 -0
  46. package/dist/editor/components/table-bubble.d.ts +5 -0
  47. package/dist/editor/editor.d.ts +30 -0
  48. package/dist/editor/extensions/HighlightDecorationExtension.d.ts +24 -0
  49. package/dist/editor/extensions/Image/index.d.ts +6 -0
  50. package/dist/editor/extensions/Image.d.ts +6 -0
  51. package/dist/editor/extensions/TextLoadingDecorationExtension.d.ts +16 -0
  52. package/dist/editor/extensions/clipboard.d.ts +7 -0
  53. package/dist/editor/extensions/custom-keymap.d.ts +1 -0
  54. package/dist/editor/extensions/drag-and-drop.d.ts +9 -0
  55. package/dist/editor/hooks/useProseMirror.d.ts +13 -0
  56. package/dist/editor/hooks/useProseMirrorContext.d.ts +9 -0
  57. package/dist/editor/index.d.ts +2 -0
  58. package/dist/editor/markdown.d.ts +5 -0
  59. package/dist/editor/nodeViews/ImageComponent.d.ts +3 -0
  60. package/dist/editor/nodeViews/ReactNodeView.d.ts +29 -0
  61. package/dist/editor/nodeViews/TaskItemComponent.d.ts +3 -0
  62. package/dist/editor/nodeViews/index.d.ts +6 -0
  63. package/dist/editor/plugins/index.d.ts +2 -0
  64. package/dist/editor/plugins/inputrules.d.ts +6 -0
  65. package/dist/editor/plugins/placeholderPlugin.d.ts +3 -0
  66. package/dist/editor/plugins/slashCommandPlugin.d.ts +12 -0
  67. package/dist/editor/schema.d.ts +2 -0
  68. package/dist/editor/selectors/ai-selector.d.ts +0 -0
  69. package/dist/editor/selectors/color-selector.d.ts +10 -0
  70. package/dist/editor/selectors/link-selector.d.ts +8 -0
  71. package/dist/editor/selectors/node-selector.d.ts +15 -0
  72. package/dist/editor/selectors/text-buttons.d.ts +1 -0
  73. package/dist/editor/types.d.ts +5 -0
  74. package/dist/editor/useProseMirror.d.ts +16 -0
  75. package/dist/editor/utils/prosemirror-utils.d.ts +6 -0
  76. package/dist/editor/utils/remove_classes.d.ts +1 -0
  77. package/dist/editor/utils/useDebouncedCallback.d.ts +1 -0
  78. package/dist/form/components/ErrorFocus.d.ts +1 -1
  79. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  80. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +1 -1
  81. package/dist/form/validation.d.ts +3 -2
  82. package/dist/hooks/index.d.ts +1 -0
  83. package/dist/hooks/useBreadcrumbsController.d.ts +16 -0
  84. package/dist/hooks/useBuildNavigationController.d.ts +0 -1
  85. package/dist/hooks/useCollapsedGroups.d.ts +6 -3
  86. package/dist/hooks/useTranslation.d.ts +17 -0
  87. package/dist/i18n/FireCMSi18nProvider.d.ts +33 -0
  88. package/dist/index.d.ts +5 -0
  89. package/dist/index.es.js +30146 -15178
  90. package/dist/index.es.js.map +1 -1
  91. package/dist/index.umd.js +30032 -15085
  92. package/dist/index.umd.js.map +1 -1
  93. package/dist/internal/useRestoreScroll.d.ts +1 -1
  94. package/dist/locales/de.d.ts +2 -0
  95. package/dist/locales/en.d.ts +10 -0
  96. package/dist/locales/es.d.ts +10 -0
  97. package/dist/locales/fr.d.ts +2 -0
  98. package/dist/locales/hi.d.ts +2 -0
  99. package/dist/locales/it.d.ts +2 -0
  100. package/dist/locales/pt.d.ts +7 -0
  101. package/dist/preview/PropertyPreviewProps.d.ts +5 -0
  102. package/dist/preview/components/DatePreview.d.ts +13 -3
  103. package/dist/preview/components/ImagePreview.d.ts +5 -1
  104. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  105. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  106. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +1 -1
  107. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +1 -1
  108. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +1 -1
  109. package/dist/types/analytics.d.ts +1 -1
  110. package/dist/types/collections.d.ts +88 -2
  111. package/dist/types/customization_controller.d.ts +2 -1
  112. package/dist/types/datasource.d.ts +0 -1
  113. package/dist/types/firecms.d.ts +2 -1
  114. package/dist/types/index.d.ts +1 -0
  115. package/dist/types/navigation.d.ts +2 -2
  116. package/dist/types/plugins.d.ts +69 -1
  117. package/dist/types/properties.d.ts +268 -12
  118. package/dist/types/storage.d.ts +1 -0
  119. package/dist/types/translations.d.ts +669 -0
  120. package/dist/util/__tests__/conditions.test.d.ts +1 -0
  121. package/dist/util/__tests__/objects.test.d.ts +1 -0
  122. package/dist/util/conditions.d.ts +26 -0
  123. package/dist/util/entities.d.ts +2 -3
  124. package/dist/util/index.d.ts +3 -1
  125. package/dist/util/lazy_eager.d.ts +7 -0
  126. package/dist/util/objects.d.ts +1 -0
  127. package/dist/util/property_utils.d.ts +2 -1
  128. package/dist/util/resolutions.d.ts +3 -3
  129. package/dist/util/useStorageUploadController.d.ts +10 -1
  130. package/package.json +51 -12
  131. package/src/app/Scaffold.tsx +20 -19
  132. package/src/components/AIIcon.tsx +41 -0
  133. package/src/components/ArrayContainer.tsx +7 -8
  134. package/src/components/ClearFilterSortButton.tsx +25 -19
  135. package/src/components/ConfirmationDialog.tsx +4 -4
  136. package/src/components/DeleteEntityDialog.tsx +12 -11
  137. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +82 -43
  138. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +130 -79
  139. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +121 -104
  140. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +132 -103
  141. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +6 -3
  142. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +24 -44
  143. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +90 -49
  144. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +1 -1
  145. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -2
  146. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +11 -11
  147. package/src/components/EntityCollectionView/Board.tsx +324 -0
  148. package/src/components/EntityCollectionView/BoardColumn.tsx +158 -0
  149. package/src/components/EntityCollectionView/BoardColumnTitle.tsx +45 -0
  150. package/src/components/EntityCollectionView/BoardSortableList.tsx +174 -0
  151. package/src/components/EntityCollectionView/CollectionDataErrorBanner.tsx +43 -0
  152. package/src/components/EntityCollectionView/EntityBoardCard.tsx +212 -0
  153. package/src/components/EntityCollectionView/EntityCard.tsx +235 -0
  154. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +706 -0
  155. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +236 -0
  156. package/src/components/EntityCollectionView/EntityCollectionView.tsx +531 -209
  157. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +35 -22
  158. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +86 -15
  159. package/src/components/EntityCollectionView/FiltersDialog.tsx +252 -0
  160. package/src/components/EntityCollectionView/ViewModeToggle.tsx +202 -0
  161. package/src/components/EntityCollectionView/board_types.ts +113 -0
  162. package/src/components/EntityCollectionView/useBoardDataController.tsx +490 -0
  163. package/src/components/EntityJsonPreview.tsx +2 -1
  164. package/src/components/EntityView.tsx +3 -2
  165. package/src/components/ErrorBoundary.tsx +27 -15
  166. package/src/components/ErrorTooltip.tsx +2 -1
  167. package/src/components/HomePage/DefaultHomePage.tsx +65 -22
  168. package/src/components/HomePage/HomePageDnD.tsx +59 -42
  169. package/src/components/HomePage/NavigationCard.tsx +20 -18
  170. package/src/components/HomePage/NavigationGroup.tsx +20 -17
  171. package/src/components/HomePage/RenameGroupDialog.tsx +15 -15
  172. package/src/components/HomePage/SmallNavigationCard.tsx +10 -9
  173. package/src/components/LanguageToggle.tsx +66 -0
  174. package/src/components/NotFoundPage.tsx +5 -3
  175. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +12 -17
  176. package/src/components/ReferenceWidget.tsx +5 -6
  177. package/src/components/SearchIconsView.tsx +3 -1
  178. package/src/components/SelectableTable/SelectableTable.tsx +75 -67
  179. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +7 -6
  180. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +50 -40
  181. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +53 -40
  182. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +60 -58
  183. package/src/components/UnsavedChangesDialog.tsx +6 -6
  184. package/src/components/UserDisplay.tsx +4 -4
  185. package/src/components/VirtualTable/VirtualTable.performance.test.tsx +1 -0
  186. package/src/components/VirtualTable/VirtualTable.tsx +275 -119
  187. package/src/components/VirtualTable/VirtualTableCell.tsx +18 -2
  188. package/src/components/VirtualTable/VirtualTableHeader.tsx +76 -64
  189. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +163 -42
  190. package/src/components/VirtualTable/VirtualTableProps.tsx +21 -2
  191. package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
  192. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +3 -0
  193. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +19 -6
  194. package/src/components/VirtualTable/types.tsx +3 -0
  195. package/src/components/common/default_entity_actions.tsx +4 -0
  196. package/src/components/common/useColumnsIds.tsx +95 -3
  197. package/src/components/common/useDataSourceTableController.tsx +12 -4
  198. package/src/components/index.tsx +5 -0
  199. package/src/contexts/BreacrumbsContext.tsx +15 -8
  200. package/src/contexts/index.ts +10 -0
  201. package/src/core/DefaultAppBar.tsx +49 -32
  202. package/src/core/DefaultDrawer.tsx +49 -57
  203. package/src/core/DrawerNavigationGroup.tsx +120 -0
  204. package/src/core/DrawerNavigationItem.tsx +4 -3
  205. package/src/core/EntityEditView.tsx +94 -50
  206. package/src/core/EntityEditViewFormActions.tsx +24 -17
  207. package/src/core/EntitySidePanel.tsx +34 -30
  208. package/src/core/FireCMS.tsx +33 -6
  209. package/src/core/SideDialogs.tsx +4 -2
  210. package/src/core/field_configs.tsx +18 -11
  211. package/src/core/index.tsx +1 -0
  212. package/src/editor/components/SlashCommandMenu.tsx +516 -0
  213. package/src/editor/components/editor-bubble-item.tsx +32 -0
  214. package/src/editor/components/editor-bubble.tsx +118 -0
  215. package/src/editor/components/image-bubble.tsx +156 -0
  216. package/src/editor/components/index.ts +14 -0
  217. package/src/editor/components/table-bubble.tsx +165 -0
  218. package/src/editor/editor.tsx +455 -0
  219. package/src/editor/extensions/HighlightDecorationExtension.ts +114 -0
  220. package/src/editor/extensions/Image/index.ts +133 -0
  221. package/src/editor/extensions/Image.ts +159 -0
  222. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +107 -0
  223. package/src/editor/extensions/clipboard.ts +72 -0
  224. package/src/editor/extensions/custom-keymap.ts +24 -0
  225. package/src/editor/extensions/drag-and-drop.tsx +480 -0
  226. package/src/editor/hooks/useProseMirror.ts +124 -0
  227. package/src/editor/hooks/useProseMirrorContext.ts +15 -0
  228. package/src/editor/index.ts +2 -0
  229. package/src/editor/markdown.ts +172 -0
  230. package/src/editor/nodeViews/ImageComponent.tsx +20 -0
  231. package/src/editor/nodeViews/ReactNodeView.tsx +89 -0
  232. package/src/editor/nodeViews/TaskItemComponent.tsx +29 -0
  233. package/src/editor/nodeViews/index.ts +35 -0
  234. package/src/editor/plugins/index.ts +58 -0
  235. package/src/editor/plugins/inputrules.ts +82 -0
  236. package/src/editor/plugins/placeholderPlugin.ts +55 -0
  237. package/src/editor/plugins/slashCommandPlugin.ts +61 -0
  238. package/src/editor/schema.ts +240 -0
  239. package/src/editor/selectors/ai-selector.tsx +111 -0
  240. package/src/editor/selectors/color-selector.tsx +200 -0
  241. package/src/editor/selectors/link-selector.tsx +118 -0
  242. package/src/editor/selectors/node-selector.tsx +157 -0
  243. package/src/editor/selectors/text-buttons.tsx +86 -0
  244. package/src/editor/types.ts +6 -0
  245. package/src/editor/useProseMirror.ts +126 -0
  246. package/src/editor/utils/prosemirror-utils.ts +108 -0
  247. package/src/editor/utils/remove_classes.ts +17 -0
  248. package/src/editor/utils/useDebouncedCallback.ts +25 -0
  249. package/src/form/EntityForm.tsx +149 -67
  250. package/src/form/EntityFormActions.tsx +19 -12
  251. package/src/form/PropertyFieldBinding.tsx +68 -51
  252. package/src/form/components/ErrorFocus.tsx +3 -3
  253. package/src/form/components/LocalChangesMenu.tsx +13 -13
  254. package/src/form/components/StorageItemPreview.tsx +5 -3
  255. package/src/form/components/StorageUploadProgress.tsx +18 -3
  256. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +18 -5
  257. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +22 -10
  258. package/src/form/field_bindings/BlockFieldBinding.tsx +26 -9
  259. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -17
  260. package/src/form/field_bindings/KeyValueFieldBinding.tsx +46 -25
  261. package/src/form/field_bindings/MapFieldBinding.tsx +88 -70
  262. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +93 -52
  263. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +15 -1
  264. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +25 -11
  265. package/src/form/field_bindings/ReferenceFieldBinding.tsx +25 -11
  266. package/src/form/field_bindings/RepeatFieldBinding.tsx +21 -6
  267. package/src/form/field_bindings/SelectFieldBinding.tsx +7 -5
  268. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +110 -92
  269. package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -14
  270. package/src/form/field_bindings/TextFieldBinding.tsx +77 -38
  271. package/src/form/field_bindings/UserSelectFieldBinding.tsx +7 -5
  272. package/src/form/validation.ts +245 -160
  273. package/src/hooks/index.tsx +1 -0
  274. package/src/hooks/useBreadcrumbsController.tsx +18 -0
  275. package/src/hooks/useBuildNavigationController.tsx +91 -41
  276. package/src/hooks/useCollapsedGroups.ts +18 -9
  277. package/src/hooks/useTranslation.ts +31 -0
  278. package/src/hooks/useValidateAuthenticator.tsx +1 -1
  279. package/src/i18n/FireCMSi18nProvider.tsx +160 -0
  280. package/src/index.ts +5 -0
  281. package/src/internal/useBuildDataSource.ts +68 -34
  282. package/src/internal/useBuildSideDialogsController.tsx +11 -8
  283. package/src/internal/useBuildSideEntityController.tsx +24 -24
  284. package/src/internal/useRestoreScroll.tsx +26 -14
  285. package/src/locales/de.ts +718 -0
  286. package/src/locales/en.ts +730 -0
  287. package/src/locales/es.ts +730 -0
  288. package/src/locales/fr.ts +718 -0
  289. package/src/locales/hi.ts +718 -0
  290. package/src/locales/it.ts +718 -0
  291. package/src/locales/pt.ts +727 -0
  292. package/src/preview/PropertyPreview.tsx +43 -33
  293. package/src/preview/PropertyPreviewProps.tsx +6 -0
  294. package/src/preview/components/DatePreview.tsx +72 -4
  295. package/src/preview/components/EmptyValue.tsx +1 -1
  296. package/src/preview/components/ImagePreview.tsx +37 -21
  297. package/src/preview/components/ReferencePreview.tsx +2 -1
  298. package/src/preview/components/StorageThumbnail.tsx +16 -12
  299. package/src/preview/components/UrlComponentPreview.tsx +32 -27
  300. package/src/preview/components/UserPreview.tsx +3 -1
  301. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +9 -7
  302. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +11 -9
  303. package/src/preview/property_previews/ArrayPropertyPreview.tsx +26 -24
  304. package/src/preview/property_previews/MapPropertyPreview.tsx +49 -27
  305. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +61 -56
  306. package/src/routes/CustomCMSRoute.tsx +1 -0
  307. package/src/routes/FireCMSRoute.tsx +87 -65
  308. package/src/types/analytics.ts +10 -0
  309. package/src/types/collections.ts +97 -3
  310. package/src/types/customization_controller.tsx +2 -1
  311. package/src/types/datasource.ts +54 -56
  312. package/src/types/firecms.tsx +2 -1
  313. package/src/types/index.ts +1 -0
  314. package/src/types/navigation.ts +2 -2
  315. package/src/types/plugins.tsx +77 -1
  316. package/src/types/properties.ts +359 -37
  317. package/src/types/storage.ts +2 -1
  318. package/src/types/translations.ts +752 -0
  319. package/src/util/__tests__/conditions.test.ts +506 -0
  320. package/src/util/__tests__/objects.test.ts +196 -0
  321. package/src/util/callbacks.ts +6 -3
  322. package/src/util/collections.ts +51 -6
  323. package/src/util/conditions.ts +339 -0
  324. package/src/util/entities.ts +29 -30
  325. package/src/util/entity_cache.ts +2 -1
  326. package/src/util/index.ts +3 -1
  327. package/src/util/join_collections.ts +10 -8
  328. package/src/util/lazy_eager.tsx +33 -0
  329. package/src/util/objects.ts +46 -13
  330. package/src/util/{references.ts → previews.ts} +16 -2
  331. package/src/util/property_utils.tsx +37 -11
  332. package/src/util/resolutions.ts +62 -58
  333. package/src/util/useStorageUploadController.tsx +23 -29
  334. /package/dist/util/{references.d.ts → previews.d.ts} +0 -0
@@ -11,6 +11,7 @@ import {
11
11
  User
12
12
  } from "../../types";
13
13
  import { OnCellValueChange, OnColumnResizeParams, UniqueFieldValidator } from "../common/types";
14
+ import { VirtualTableColumn } from "../VirtualTable";
14
15
 
15
16
  /**
16
17
  * @group Collection components
@@ -18,142 +19,158 @@ import { OnCellValueChange, OnColumnResizeParams, UniqueFieldValidator } from ".
18
19
  export type EntityCollectionTableProps<M extends Record<string, any>,
19
20
  USER extends User = User> = {
20
21
 
21
- className?: string;
22
-
23
- style?: React.CSSProperties;
24
-
25
- /**
26
- * Display these entities as selected
27
- */
28
- selectionController: SelectionController<M>;
29
-
30
- /**
31
- * List of entities that will be displayed as selected;
32
- */
33
- highlightedEntities?: Entity<M>[];
22
+ className?: string;
23
+
24
+ style?: React.CSSProperties;
25
+
26
+ /**
27
+ * Display these entities as selected
28
+ */
29
+ selectionController: SelectionController<M>;
30
+
31
+ /**
32
+ * List of entities that will be displayed as selected;
33
+ */
34
+ highlightedEntities?: Entity<M>[];
35
+
36
+ /**
37
+ * Override the title in the toolbar
38
+ */
39
+ title?: React.ReactNode;
34
40
 
35
- /**
36
- * Override the title in the toolbar
37
- */
38
- title?: React.ReactNode;
39
-
40
- /**
41
- * Additional component that renders actions such as buttons in the
42
- * collection toolbar, displayed on the left side
43
- */
44
- actionsStart?: React.ReactNode;
41
+ /**
42
+ * Additional component that renders actions such as buttons in the
43
+ * collection toolbar, displayed on the left side
44
+ */
45
+ actionsStart?: React.ReactNode;
45
46
 
46
- /**
47
- * Callback when a cell value changes.
48
- */
49
- onValueChange?: OnCellValueChange<any, M>;
47
+ /**
48
+ * Callback when a cell value changes.
49
+ */
50
+ onValueChange?: OnCellValueChange<any, M>;
50
51
 
51
- uniqueFieldValidator?: UniqueFieldValidator;
52
+ uniqueFieldValidator?: UniqueFieldValidator;
52
53
 
53
- /**
54
- * Builder for creating the buttons in each row
55
- * @param entity
56
- * @param size
57
- */
58
- tableRowActionsBuilder?: (params: {
59
- entity: Entity<M>,
60
- size: CollectionSize,
61
- width: number,
62
- frozen?: boolean
63
- }) => React.ReactNode;
54
+ /**
55
+ * Builder for creating the buttons in each row
56
+ * @param entity
57
+ * @param size
58
+ */
59
+ tableRowActionsBuilder?: (params: {
60
+ entity: Entity<M>,
61
+ size: CollectionSize,
62
+ width: number,
63
+ frozen?: boolean
64
+ }) => React.ReactNode;
64
65
 
65
- /**
66
- * Callback when anywhere on the table is clicked
67
- */
68
- onEntityClick?(entity: Entity<M>): void;
66
+ /**
67
+ * Callback when anywhere on the table is clicked
68
+ */
69
+ onEntityClick?(entity: Entity<M>): void;
69
70
 
70
- /**
71
- * Callback when a column is resized
72
- */
73
- onColumnResize?(params: OnColumnResizeParams): void;
71
+ /**
72
+ * Callback when a column is resized
73
+ */
74
+ onColumnResize?(params: OnColumnResizeParams): void;
74
75
 
75
- /**
76
- * Initial scroll position
77
- */
78
- initialScroll?: number;
76
+ /**
77
+ * Initial scroll position
78
+ */
79
+ initialScroll?: number;
79
80
 
80
- /**
81
- * Callback when the table is scrolled
82
- * @param props
83
- */
84
- onScroll?: (props: {
85
- scrollDirection: "forward" | "backward",
86
- scrollOffset: number,
87
- scrollUpdateWasRequested: boolean
88
- }) => void;
81
+ /**
82
+ * Callback when the table is scrolled
83
+ * @param props
84
+ */
85
+ onScroll?: (props: {
86
+ scrollDirection: "forward" | "backward",
87
+ scrollOffset: number,
88
+ scrollUpdateWasRequested: boolean
89
+ }) => void;
89
90
 
90
- /**
91
- * Callback when the selected size of the table is changed
92
- */
93
- onSizeChanged?(size: CollectionSize): void;
91
+ /**
92
+ * Callback when the selected size of the table is changed
93
+ */
94
+ onSizeChanged?(size: CollectionSize): void;
94
95
 
95
- /**
96
- * Should apply a different style to a row when hovering
97
- */
98
- hoverRow?: boolean;
96
+ /**
97
+ * Should apply a different style to a row when hovering
98
+ */
99
+ hoverRow?: boolean;
99
100
 
100
- /**
101
- * Additional component that renders actions such as buttons in the
102
- * collection toolbar, displayed on the right side
103
- */
104
- actions?: React.ReactNode;
101
+ /**
102
+ * Additional component that renders actions such as buttons in the
103
+ * collection toolbar, displayed on the right side
104
+ */
105
+ actions?: React.ReactNode;
105
106
 
106
- /**
107
- * Controller holding the logic for the table
108
- * {@link useDataSourceTableController}
109
- * {@link EntityTableController}
110
- */
111
- tableController: EntityTableController<M>;
107
+ /**
108
+ * View mode toggle button, positioned left of the search bar.
109
+ */
110
+ viewModeToggle?: React.ReactNode;
112
111
 
113
- displayedColumnIds?: PropertyColumnConfig[];
112
+ /**
113
+ * Controller holding the logic for the table
114
+ * {@link useDataSourceTableController}
115
+ * {@link EntityTableController}
116
+ */
117
+ tableController: EntityTableController<M>;
114
118
 
115
- forceFilter?: FilterValues<Extract<keyof M, string>>;
119
+ displayedColumnIds?: PropertyColumnConfig[];
116
120
 
117
- textSearchEnabled?: boolean;
121
+ forceFilter?: FilterValues<Extract<keyof M, string>>;
118
122
 
119
- inlineEditing?: boolean;
123
+ textSearchEnabled?: boolean;
120
124
 
121
- additionalFields?: AdditionalFieldDelegate<M, USER>[];
125
+ inlineEditing?: boolean;
122
126
 
123
- defaultSize?: CollectionSize;
127
+ additionalFields?: AdditionalFieldDelegate<M, USER>[];
124
128
 
125
- properties: ResolvedProperties<M>;
129
+ defaultSize?: CollectionSize;
126
130
 
127
- getPropertyFor?: (props: GetPropertyForProps<M>) => ResolvedProperties<M>[string];
131
+ properties: ResolvedProperties<M>;
128
132
 
129
- filterable?: boolean;
133
+ getPropertyFor?: (props: GetPropertyForProps<M>) => ResolvedProperties<M>[string];
130
134
 
131
- sortable?: boolean;
135
+ filterable?: boolean;
132
136
 
133
- endAdornment?: React.ReactNode;
137
+ sortable?: boolean;
134
138
 
135
- AdditionalHeaderWidget?: React.ComponentType<{
136
- property: ResolvedProperty,
137
- propertyKey: string,
138
- onHover: boolean,
139
- }>;
139
+ endAdornment?: React.ReactNode;
140
140
 
141
- AddColumnComponent?: React.ComponentType;
141
+ AdditionalHeaderWidget?: React.ComponentType<{
142
+ property: ResolvedProperty,
143
+ propertyKey: string,
144
+ onHover: boolean,
145
+ }>;
142
146
 
143
- additionalIDHeaderWidget?: React.ReactNode;
147
+ AddColumnComponent?: React.ComponentType;
144
148
 
145
- emptyComponent?: React.ReactNode;
149
+ additionalIDHeaderWidget?: React.ReactNode;
146
150
 
147
- getIdColumnWidth?: () => number;
151
+ emptyComponent?: React.ReactNode;
148
152
 
149
- onTextSearchClick?: () => void;
153
+ getIdColumnWidth?: () => number;
150
154
 
151
- textSearchLoading?: boolean;
155
+ onTextSearchClick?: () => void;
152
156
 
153
- enablePopupIcon: boolean;
157
+ textSearchLoading?: boolean;
154
158
 
155
- openEntityMode?: "side_panel" | "full_screen";
156
- };
159
+ enablePopupIcon: boolean;
160
+
161
+ openEntityMode?: "side_panel" | "full_screen";
162
+
163
+ /**
164
+ * Callback when columns are reordered via drag-and-drop
165
+ */
166
+ onColumnsOrderChange?: (columns: VirtualTableColumn[]) => void;
167
+
168
+ /**
169
+ * If true, the internal toolbar will not be rendered.
170
+ * Used when the parent component renders its own toolbar.
171
+ */
172
+ hideToolbar?: boolean;
173
+ };
157
174
 
158
175
  export type GetPropertyForProps<M extends Record<string, any>> = {
159
176
  propertyKey: string,
@@ -49,6 +49,13 @@ export interface PropertyTableCellProps<T extends CMSType> {
49
49
  path: string;
50
50
  disabled: boolean;
51
51
  enablePopupIcon?: boolean;
52
+ // Sortable props for dnd-kit integration
53
+ sortableNodeRef?: (node: HTMLElement | null) => void;
54
+ sortableStyle?: React.CSSProperties;
55
+ sortableAttributes?: Record<string, any>;
56
+ isDragging?: boolean;
57
+ isDraggable?: boolean;
58
+ frozen?: boolean;
52
59
  }
53
60
 
54
61
  function isStorageProperty(property: ResolvedProperty) {
@@ -69,19 +76,25 @@ function isStorageProperty(property: ResolvedProperty) {
69
76
 
70
77
  export const PropertyTableCell = React.memo<PropertyTableCellProps<any>>(
71
78
  function PropertyTableCell<T extends CMSType, M extends Record<string, any>>({
72
- propertyKey,
73
- customFieldValidator,
74
- value,
75
- property,
76
- align,
77
- width,
78
- height,
79
- path,
80
- entity,
81
- readonly,
82
- disabled: disabledProp,
83
- enablePopupIcon = true
84
- }: PropertyTableCellProps<T>) {
79
+ propertyKey,
80
+ customFieldValidator,
81
+ value,
82
+ property,
83
+ align,
84
+ width,
85
+ height,
86
+ path,
87
+ entity,
88
+ readonly,
89
+ disabled: disabledProp,
90
+ enablePopupIcon = true,
91
+ sortableNodeRef,
92
+ sortableStyle,
93
+ sortableAttributes,
94
+ isDragging,
95
+ isDraggable,
96
+ frozen
97
+ }: PropertyTableCellProps<T>) {
85
98
 
86
99
  const {
87
100
  onValueChange,
@@ -240,7 +253,13 @@ export const PropertyTableCell = React.memo<PropertyTableCellProps<any>>(
240
253
  align={align ?? "left"}
241
254
  fullHeight={false}
242
255
  disabledTooltip={disabledTooltip ?? (readOnlyProperty ? "Read only" : undefined)}
243
- disabled={true}>
256
+ disabled={true}
257
+ sortableNodeRef={sortableNodeRef}
258
+ sortableStyle={sortableStyle}
259
+ sortableAttributes={sortableAttributes}
260
+ isDragging={isDragging}
261
+ isDraggable={isDraggable}
262
+ frozen={frozen}>
244
263
  <PropertyPreview
245
264
  width={width}
246
265
  height={getRowHeight(size)}
@@ -261,32 +280,32 @@ export const PropertyTableCell = React.memo<PropertyTableCellProps<any>>(
261
280
  const referenceValue = internalValue ? new EntityReference(internalValue, path) : undefined;
262
281
  innerComponent =
263
282
  <TableReferenceField name={propertyKey as string}
264
- internalValue={referenceValue}
265
- updateValue={(v) => updateValue(v ? (v as EntityReference).id : null)}
266
- disabled={disabled}
267
- size={size}
268
- path={path}
269
- multiselect={false}
270
- previewProperties={referenceProperty.previewProperties}
271
- includeId={referenceProperty.includeId}
272
- includeEntityLink={referenceProperty.includeEntityLink}
273
- title={stringProperty.name}
274
- forceFilter={referenceProperty.forceFilter}
283
+ internalValue={referenceValue}
284
+ updateValue={(v) => updateValue(v ? (v as EntityReference).id : null)}
285
+ disabled={disabled}
286
+ size={size}
287
+ path={path}
288
+ multiselect={false}
289
+ previewProperties={referenceProperty.previewProperties}
290
+ includeId={referenceProperty.includeId}
291
+ includeEntityLink={referenceProperty.includeEntityLink}
292
+ title={stringProperty.name}
293
+ forceFilter={referenceProperty.forceFilter}
275
294
  />;
276
295
  allowScroll = false;
277
296
  } else if (isAStorageProperty) {
278
297
  innerComponent = <TableStorageUpload error={validationError ?? error}
279
- disabled={disabled}
280
- focused={selected}
281
- selected={selected}
282
- openPopup={setPopupCell ? openPopup : undefined}
283
- property={property as ResolvedStringProperty | ResolvedArrayProperty<string[]>}
284
- entity={entity}
285
- path={path}
286
- value={internalValue}
287
- previewSize={getPreviewSizeFrom(size)}
288
- updateValue={updateValue}
289
- propertyKey={propertyKey as string}
298
+ disabled={disabled}
299
+ focused={selected}
300
+ selected={selected}
301
+ openPopup={setPopupCell ? openPopup : undefined}
302
+ property={property as ResolvedStringProperty | ResolvedArrayProperty<string[]>}
303
+ entity={entity}
304
+ path={path}
305
+ value={internalValue}
306
+ previewSize={getPreviewSizeFrom(size)}
307
+ updateValue={updateValue}
308
+ propertyKey={propertyKey as string}
290
309
  />;
291
310
  includeActions = false;
292
311
  showExpandIcon = true;
@@ -296,15 +315,15 @@ export const PropertyTableCell = React.memo<PropertyTableCellProps<any>>(
296
315
  const numberProperty = property as ResolvedNumberProperty;
297
316
  if (numberProperty.enumValues) {
298
317
  innerComponent = <VirtualTableSelect name={propertyKey as string}
299
- multiple={false}
300
- disabled={disabled}
301
- focused={selected}
302
- valueType={"number"}
303
- small={getPreviewSizeFrom(size) !== "medium"}
304
- enumValues={numberProperty.enumValues}
305
- error={validationError ?? error}
306
- internalValue={internalValue as string | number}
307
- updateValue={updateValue}
318
+ multiple={false}
319
+ disabled={disabled}
320
+ focused={selected}
321
+ valueType={"number"}
322
+ small={getPreviewSizeFrom(size) !== "medium"}
323
+ enumValues={numberProperty.enumValues}
324
+ error={validationError ?? error}
325
+ internalValue={internalValue as string | number}
326
+ updateValue={updateValue}
308
327
  />;
309
328
  fullHeight = true;
310
329
  } else {
@@ -322,54 +341,55 @@ export const PropertyTableCell = React.memo<PropertyTableCellProps<any>>(
322
341
  const stringProperty = property as ResolvedStringProperty;
323
342
  if (stringProperty.enumValues) {
324
343
  innerComponent = <VirtualTableSelect name={propertyKey as string}
325
- multiple={false}
326
- focused={selected}
327
- disabled={disabled}
328
- valueType={"string"}
329
- small={getPreviewSizeFrom(size) !== "medium"}
330
- enumValues={stringProperty.enumValues}
331
- error={validationError ?? error}
332
- internalValue={internalValue as string | number}
333
- updateValue={updateValue}
344
+ multiple={false}
345
+ focused={selected}
346
+ disabled={disabled}
347
+ valueType={"string"}
348
+ small={getPreviewSizeFrom(size) !== "medium"}
349
+ enumValues={stringProperty.enumValues}
350
+ error={validationError ?? error}
351
+ internalValue={internalValue as string | number}
352
+ updateValue={updateValue}
334
353
  />;
335
354
  fullHeight = true;
336
355
  } else if (stringProperty.userSelect) {
337
356
  innerComponent = <VirtualTableUserSelect name={propertyKey as string}
338
- multiple={false}
339
- focused={selected}
340
- disabled={disabled}
341
- small={getPreviewSizeFrom(size) !== "medium"}
342
- error={validationError ?? error}
343
- internalValue={internalValue as string}
344
- updateValue={updateValue}
357
+ multiple={false}
358
+ focused={selected}
359
+ disabled={disabled}
360
+ small={getPreviewSizeFrom(size) !== "medium"}
361
+ error={validationError ?? error}
362
+ internalValue={internalValue as string}
363
+ updateValue={updateValue}
345
364
  />;
346
365
  fullHeight = true;
347
366
  } else if (stringProperty.markdown || !stringProperty.storage || !stringProperty.reference) {
348
367
  const multiline = Boolean(stringProperty.multiline) || Boolean(stringProperty.markdown);
349
368
  innerComponent = <VirtualTableInput error={validationError ?? error}
350
- disabled={disabled}
351
- multiline={multiline}
352
- focused={selected}
353
- value={internalValue as string}
354
- updateValue={updateValue}
369
+ disabled={disabled}
370
+ multiline={multiline}
371
+ focused={selected}
372
+ value={internalValue as string}
373
+ updateValue={updateValue}
355
374
  />;
356
375
  allowScroll = true;
357
376
  }
358
377
  } else if (property.dataType === "boolean") {
359
378
  innerComponent = <VirtualTableSwitch error={validationError ?? error}
360
- disabled={disabled}
361
- focused={selected}
362
- internalValue={internalValue as boolean}
363
- updateValue={updateValue}
379
+ disabled={disabled}
380
+ focused={selected}
381
+ internalValue={internalValue as boolean}
382
+ updateValue={updateValue}
364
383
  />;
365
384
  } else if (property.dataType === "date") {
366
385
  innerComponent = <VirtualTableDateField name={propertyKey as string}
367
- error={validationError ?? error}
368
- disabled={disabled}
369
- mode={property.mode}
370
- focused={selected}
371
- internalValue={internalValue as Date}
372
- updateValue={updateValue}
386
+ error={validationError ?? error}
387
+ disabled={disabled}
388
+ mode={property.mode}
389
+ timezone={property.timezone}
390
+ focused={selected}
391
+ internalValue={internalValue as Date}
392
+ updateValue={updateValue}
373
393
  />;
374
394
  fullHeight = true;
375
395
  hideOverflow = false;
@@ -378,17 +398,17 @@ export const PropertyTableCell = React.memo<PropertyTableCellProps<any>>(
378
398
  if (typeof property.path === "string") {
379
399
  innerComponent =
380
400
  <TableReferenceField name={propertyKey as string}
381
- internalValue={internalValue as EntityReference}
382
- updateValue={updateValue}
383
- disabled={disabled}
384
- size={size}
385
- path={property.path}
386
- multiselect={false}
387
- previewProperties={property.previewProperties}
388
- includeId={property.includeId}
389
- includeEntityLink={property.includeEntityLink}
390
- title={property.name}
391
- forceFilter={property.forceFilter}
401
+ internalValue={internalValue as EntityReference}
402
+ updateValue={updateValue}
403
+ disabled={disabled}
404
+ size={size}
405
+ path={property.path}
406
+ multiselect={false}
407
+ previewProperties={property.previewProperties}
408
+ includeId={property.includeId}
409
+ includeEntityLink={property.includeEntityLink}
410
+ title={property.name}
411
+ forceFilter={property.forceFilter}
392
412
  />;
393
413
  }
394
414
  allowScroll = false;
@@ -403,15 +423,15 @@ export const PropertyTableCell = React.memo<PropertyTableCellProps<any>>(
403
423
  if (selected && arrayProperty.of.enumValues) {
404
424
  innerComponent =
405
425
  <VirtualTableSelect name={propertyKey as string}
406
- multiple={true}
407
- disabled={disabled}
408
- focused={selected}
409
- small={getPreviewSizeFrom(size) !== "medium"}
410
- valueType={arrayProperty.of.dataType}
411
- enumValues={arrayProperty.of.enumValues}
412
- error={validationError ?? error}
413
- internalValue={internalValue as string | number}
414
- updateValue={updateValue}
426
+ multiple={true}
427
+ disabled={disabled}
428
+ focused={selected}
429
+ small={getPreviewSizeFrom(size) !== "medium"}
430
+ valueType={arrayProperty.of.dataType}
431
+ enumValues={arrayProperty.of.enumValues}
432
+ error={validationError ?? error}
433
+ internalValue={internalValue as string | number}
434
+ updateValue={updateValue}
415
435
  />;
416
436
  allowScroll = true;
417
437
  fullHeight = true;
@@ -447,11 +467,11 @@ export const PropertyTableCell = React.memo<PropertyTableCellProps<any>>(
447
467
  showExpandIcon = enablePopupIcon && selected && !innerComponent && !disabled && !readOnlyProperty;
448
468
  innerComponent = (
449
469
  <PropertyPreview width={width}
450
- height={height}
451
- propertyKey={propertyKey as string}
452
- value={internalValue}
453
- property={property}
454
- size={getPreviewSizeFrom(size)}
470
+ height={height}
471
+ propertyKey={propertyKey as string}
472
+ value={internalValue}
473
+ property={property}
474
+ size={getPreviewSizeFrom(size)}
455
475
  />
456
476
  );
457
477
  }
@@ -474,12 +494,18 @@ export const PropertyTableCell = React.memo<PropertyTableCellProps<any>>(
474
494
  showExpandIcon={showExpandIcon}
475
495
  value={internalValue}
476
496
  hideOverflow={hideOverflow}
497
+ sortableNodeRef={sortableNodeRef}
498
+ sortableStyle={sortableStyle}
499
+ sortableAttributes={sortableAttributes}
500
+ isDragging={isDragging}
501
+ isDraggable={isDraggable}
502
+ frozen={frozen}
477
503
  actions={includeActions && <EntityTableCellActions
478
504
  showError={showError}
479
505
  disabled={disabled}
480
506
  showExpandIcon={showExpandIcon}
481
507
  selected={selected}
482
- openPopup={!disabled ? openPopup : undefined}/>}
508
+ openPopup={!disabled ? openPopup : undefined} />}
483
509
  >
484
510
 
485
511
  {innerComponent}
@@ -498,6 +524,9 @@ function areEqual(prevProps: PropertyTableCellProps<any>, nextProps: PropertyTab
498
524
  equal(prevProps.property, nextProps.property) &&
499
525
  equal(prevProps.value, nextProps.value) &&
500
526
  equal(prevProps.entity.id, nextProps.entity.id) &&
501
- equal(prevProps.entity.values, nextProps.entity.values)
527
+ equal(prevProps.entity.values, nextProps.entity.values) &&
528
+ prevProps.isDragging === nextProps.isDragging &&
529
+ prevProps.isDraggable === nextProps.isDraggable &&
530
+ prevProps.frozen === nextProps.frozen
502
531
  ;
503
532
  }
@@ -10,6 +10,7 @@ import { useCustomizationController, useNavigationController, useReferenceDialog
10
10
  import { ErrorView } from "../../ErrorView";
11
11
  import { cls, EditIcon } from "@firecms/ui";
12
12
  import { EntityPreviewContainer } from "../../EntityPreview";
13
+ import { useTranslation } from "../../../hooks";
13
14
 
14
15
  type TableReferenceFieldProps = {
15
16
  name: string;
@@ -62,6 +63,8 @@ export const TableReferenceFieldInternal = React.memo(
62
63
  includeEntityLink
63
64
  } = props;
64
65
 
66
+ const { t } = useTranslation();
67
+
65
68
  const onSingleEntitySelected = useCallback((entity: Entity<any>) => {
66
69
  updateValue(entity ? getReferenceFrom(entity) : null);
67
70
  }, [updateValue]);
@@ -111,7 +114,7 @@ export const TableReferenceFieldInternal = React.memo(
111
114
  return <EntityPreviewContainer
112
115
  onClick={disabled ? undefined : handleOpen}
113
116
  size={getPreviewSizeFrom(size)}>
114
- <ErrorView title="Value is not a reference." error={"Click to edit"}/>
117
+ <ErrorView title={t("value_is_not_reference")} error={t("click_to_edit")}/>
115
118
  </EntityPreviewContainer>;
116
119
  };
117
120
 
@@ -136,11 +139,11 @@ export const TableReferenceFieldInternal = React.memo(
136
139
  }
137
140
  </>;
138
141
  else
139
- return <ErrorView error={"Data is not an array of references"}/>;
142
+ return <ErrorView error={t("data_is_not_array_of_references")}/>;
140
143
  };
141
144
 
142
145
  if (!collection)
143
- return <ErrorView error={"The specified collection does not exist"}/>;
146
+ return <ErrorView error={t("collection_does_not_exist")}/>;
144
147
 
145
148
  return (
146
149
  <div className="w-full group">