@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
@@ -5,6 +5,7 @@ import { Badge, Checkbox, cls, IconButton, Menu, MenuItem, MoreVertIcon, Skeleto
5
5
  import { useFireCMSContext, useLargeLayout } from "../../hooks";
6
6
  import { getEntityFromCache } from "../../util/entity_cache";
7
7
  import { getLocalChangesBackup } from "../../util";
8
+ import { getChanges } from "../../form/EntityForm";
8
9
 
9
10
  /**
10
11
  *
@@ -20,41 +21,52 @@ import { getLocalChangesBackup } from "../../util";
20
21
  * @group Collection components
21
22
  */
22
23
  export const EntityCollectionRowActions = function EntityCollectionRowActions({
23
- entity,
24
- collection,
25
- fullPath,
26
- fullIdPath,
27
- width,
28
- frozen,
29
- isSelected,
30
- selectionEnabled,
31
- size,
32
- highlightEntity,
33
- onCollectionChange,
34
- unhighlightEntity,
35
- actions = [],
36
- hideId,
37
- selectionController,
38
- openEntityMode
39
- }:
40
- {
41
- entity: Entity<any>,
42
- collection?: EntityCollection<any>,
43
- fullPath?: string,
44
- fullIdPath?: string,
45
- width: number,
46
- frozen?: boolean,
47
- size: CollectionSize,
48
- isSelected?: boolean,
49
- selectionEnabled?: boolean,
50
- actions?: EntityAction[],
51
- hideId?: boolean,
52
- onCollectionChange?: () => void,
53
- selectionController?: SelectionController;
54
- highlightEntity?: (entity: Entity<any>) => void;
55
- unhighlightEntity?: (entity: Entity<any>) => void;
56
- openEntityMode: "side_panel" | "full_screen";
57
- }) {
24
+ entity,
25
+ collection,
26
+ fullPath,
27
+ fullIdPath,
28
+ width,
29
+ frozen,
30
+ isSelected,
31
+ selectionEnabled,
32
+ size,
33
+ highlightEntity,
34
+ onCollectionChange,
35
+ unhighlightEntity,
36
+ actions = [],
37
+ hideId,
38
+ selectionController,
39
+ openEntityMode,
40
+ sortableNodeRef,
41
+ sortableStyle,
42
+ sortableAttributes,
43
+ isDragging,
44
+ isDraggable
45
+ }:
46
+ {
47
+ entity: Entity<any>,
48
+ collection?: EntityCollection<any>,
49
+ fullPath?: string,
50
+ fullIdPath?: string,
51
+ width: number,
52
+ frozen?: boolean,
53
+ size: CollectionSize,
54
+ isSelected?: boolean,
55
+ selectionEnabled?: boolean,
56
+ actions?: EntityAction[],
57
+ hideId?: boolean,
58
+ onCollectionChange?: () => void,
59
+ selectionController?: SelectionController;
60
+ highlightEntity?: (entity: Entity<any>) => void;
61
+ unhighlightEntity?: (entity: Entity<any>) => void;
62
+ openEntityMode: "side_panel" | "full_screen";
63
+ // Sortable props for dnd-kit integration
64
+ sortableNodeRef?: (node: HTMLElement | null) => void;
65
+ sortableStyle?: React.CSSProperties;
66
+ sortableAttributes?: Record<string, any>;
67
+ isDragging?: boolean;
68
+ isDraggable?: boolean;
69
+ }) {
58
70
 
59
71
  const largeLayout = useLargeLayout();
60
72
 
@@ -70,12 +82,18 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
70
82
  const collapsedActions = actions.filter(a => a.collapsed || a.collapsed === undefined);
71
83
  const uncollapsedActions = actions.filter(a => a.collapsed === false);
72
84
  const enableLocalChangesBackup = collection ? getLocalChangesBackup(collection) : false;
73
- const hasDraft = enableLocalChangesBackup ? getEntityFromCache(fullPath + "/" + entity.id) : false;
85
+ const cachedData = enableLocalChangesBackup ? getEntityFromCache(fullPath + "/" + entity.id) : undefined;
86
+ const hasDraft = (() => {
87
+ if (!cachedData || typeof cachedData !== "object" || Object.keys(cachedData).length === 0) return false;
88
+ const realChanges = getChanges(cachedData as any, (entity?.values ?? {}) as any);
89
+ return Object.keys(realChanges).length > 0;
90
+ })();
74
91
  const iconSize = largeLayout && (size === "m" || size === "l" || size == "xl") ? "medium" : "small";
75
- return (
92
+
93
+ const content = (
76
94
  <div
77
95
  className={cls(
78
- "h-full flex items-center justify-center flex-col bg-surface-50 dark:bg-surface-900 bg-opacity-90 dark:bg-opacity-90 z-10",
96
+ "h-full flex items-center justify-center flex-col bg-surface-50 dark:bg-surface-900 bg-opacity-90 bg-surface-50/90 dark:bg-opacity-90 dark:bg-surface-900/90 z-10 shrink-0",
79
97
  frozen ? "sticky left-0" : ""
80
98
  )}
81
99
  onClick={useCallback((event: any) => {
@@ -89,7 +107,7 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
89
107
  }}>
90
108
 
91
109
  {(hasActions || selectionEnabled) &&
92
- <div className="w-34 flex justify-center">
110
+ <div className="w-full flex justify-center">
93
111
 
94
112
  {uncollapsedActions.map((action, index) => {
95
113
  const isEditAction = action.key === "edit";
@@ -124,8 +142,8 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
124
142
  }
125
143
  return (
126
144
  <Tooltip key={index}
127
- title={tooltip}
128
- asChild={true}>
145
+ title={tooltip}
146
+ asChild={true}>
129
147
  {iconButton}
130
148
  </Tooltip>
131
149
  );
@@ -135,7 +153,7 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
135
153
  <Menu
136
154
  trigger={<IconButton
137
155
  size={iconSize}>
138
- <MoreVertIcon/>
156
+ <MoreVertIcon />
139
157
  </IconButton>}>
140
158
  {collapsedActions.map((action, index) => (
141
159
  <MenuItem
@@ -183,7 +201,7 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
183
201
  <span className="min-w-0 truncate text-center">
184
202
  {entity
185
203
  ? entity.id
186
- : <Skeleton/>
204
+ : <Skeleton />
187
205
  }
188
206
  </span>
189
207
  </div>
@@ -192,4 +210,25 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
192
210
  </div>
193
211
  );
194
212
 
213
+ // Wrap with sortable outer div when sortable props are provided
214
+ // Remove tabIndex from attributes to avoid capturing focus before cell content
215
+ if (sortableNodeRef) {
216
+ const { tabIndex: _tabIndex, ...sortableAttrsWithoutTabIndex } = sortableAttributes ?? {};
217
+ return (
218
+ <div
219
+ ref={sortableNodeRef}
220
+ style={sortableStyle}
221
+ className={cls(
222
+ "flex-shrink-0",
223
+ frozen && "sticky left-0 z-10 bg-white dark:bg-surface-950"
224
+ )}
225
+ {...sortableAttrsWithoutTabIndex}
226
+ >
227
+ {content}
228
+ </div>
229
+ );
230
+ }
231
+
232
+ return content;
233
+
195
234
  };
@@ -42,45 +42,48 @@ import { getRowHeight } from "../common/table_height";
42
42
  * @group Components
43
43
  */
44
44
  export const EntityCollectionTable = function EntityCollectionTable<M extends Record<string, any> = any, USER extends User = any>
45
- ({
46
- className,
47
- style,
48
- forceFilter,
49
- actionsStart,
50
- actions,
51
- title,
52
- tableRowActionsBuilder,
53
- uniqueFieldValidator,
54
- getPropertyFor,
55
- onValueChange,
56
- selectionController,
57
- highlightedEntities,
58
- onEntityClick,
59
- onColumnResize,
60
- initialScroll,
61
- onScroll,
62
- onSizeChanged,
63
- textSearchEnabled = false,
64
- hoverRow = true,
65
- inlineEditing = false,
66
- additionalFields,
67
- displayedColumnIds,
68
- defaultSize,
69
- properties,
70
- tableController,
71
- filterable = true,
72
- sortable = true,
73
- endAdornment,
74
- AddColumnComponent,
75
- AdditionalHeaderWidget,
76
- additionalIDHeaderWidget,
77
- emptyComponent,
78
- getIdColumnWidth,
79
- onTextSearchClick,
80
- textSearchLoading,
81
- enablePopupIcon,
82
- openEntityMode = "side_panel"
83
- }: EntityCollectionTableProps<M>) {
45
+ ({
46
+ className,
47
+ style,
48
+ forceFilter,
49
+ actionsStart,
50
+ actions,
51
+ viewModeToggle,
52
+ title,
53
+ tableRowActionsBuilder,
54
+ uniqueFieldValidator,
55
+ getPropertyFor,
56
+ onValueChange,
57
+ selectionController,
58
+ highlightedEntities,
59
+ onEntityClick,
60
+ onColumnResize,
61
+ initialScroll,
62
+ onScroll,
63
+ onSizeChanged,
64
+ textSearchEnabled = false,
65
+ hoverRow = true,
66
+ inlineEditing = false,
67
+ additionalFields,
68
+ displayedColumnIds,
69
+ defaultSize,
70
+ properties,
71
+ tableController,
72
+ filterable = true,
73
+ sortable = true,
74
+ endAdornment,
75
+ AddColumnComponent,
76
+ AdditionalHeaderWidget,
77
+ additionalIDHeaderWidget,
78
+ emptyComponent,
79
+ getIdColumnWidth,
80
+ onTextSearchClick,
81
+ textSearchLoading,
82
+ enablePopupIcon,
83
+ openEntityMode = "side_panel",
84
+ onColumnsOrderChange,
85
+ hideToolbar = false
86
+ }: EntityCollectionTableProps<M>) {
84
87
 
85
88
  const ref = useRef<HTMLDivElement>(null);
86
89
 
@@ -91,6 +94,13 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
91
94
 
92
95
  const [size, setSize] = React.useState<CollectionSize>(defaultSize ?? "m");
93
96
 
97
+ // Sync internal size with defaultSize prop when it changes
98
+ React.useEffect(() => {
99
+ if (defaultSize) {
100
+ setSize(defaultSize);
101
+ }
102
+ }, [defaultSize]);
103
+
94
104
  const updateSize = useCallback((size: CollectionSize) => {
95
105
  if (onSizeChanged)
96
106
  onSizeChanged(size);
@@ -110,11 +120,17 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
110
120
  const customFieldValidator: CustomFieldValidator | undefined = uniqueFieldValidator;
111
121
 
112
122
  const propertyCellRenderer = ({
113
- column,
114
- columnIndex,
115
- rowData,
116
- rowIndex
117
- }: CellRendererParams<any>) => {
123
+ column,
124
+ columnIndex,
125
+ rowData,
126
+ rowIndex,
127
+ sortableNodeRef,
128
+ sortableStyle,
129
+ sortableAttributes,
130
+ isDragging,
131
+ isDraggable,
132
+ frozen
133
+ }: CellRendererParams<any>) => {
118
134
 
119
135
  const entity: Entity<M> = rowData;
120
136
 
@@ -150,7 +166,13 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
150
166
  entity={entity}
151
167
  disabled={disabled}
152
168
  enablePopupIcon={enablePopupIcon}
153
- path={entity.path}/>
169
+ path={entity.path}
170
+ sortableNodeRef={sortableNodeRef}
171
+ sortableStyle={sortableStyle}
172
+ sortableAttributes={sortableAttributes}
173
+ isDragging={isDragging}
174
+ isDraggable={isDraggable}
175
+ frozen={frozen} />
154
176
  : renderSkeletonText()
155
177
  }
156
178
  </ErrorBoundary>);
@@ -158,10 +180,16 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
158
180
  };
159
181
 
160
182
  const additionalCellRenderer = useCallback(({
161
- column,
162
- rowData,
163
- width
164
- }: CellRendererParams<any>) => {
183
+ column,
184
+ rowData,
185
+ width,
186
+ sortableNodeRef,
187
+ sortableStyle,
188
+ sortableAttributes,
189
+ isDragging,
190
+ isDraggable,
191
+ frozen
192
+ }: CellRendererParams<any>) => {
165
193
 
166
194
  const entity: Entity<M> = rowData;
167
195
 
@@ -178,7 +206,7 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
178
206
  }
179
207
 
180
208
  const child: React.ReactNode = Builder
181
- ? <Builder entity={entity} context={context}/>
209
+ ? <Builder entity={entity} context={context} />
182
210
  : <>
183
211
  {additionalField.value?.({
184
212
  entity,
@@ -198,6 +226,12 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
198
226
  allowScroll={false}
199
227
  showExpandIcon={false}
200
228
  disabledTooltip={"This column can't be edited directly"}
229
+ sortableNodeRef={sortableNodeRef}
230
+ sortableStyle={sortableStyle}
231
+ sortableAttributes={sortableAttributes}
232
+ isDragging={isDragging}
233
+ isDraggable={isDraggable}
234
+ frozen={frozen}
201
235
  >
202
236
  <ErrorBoundary>
203
237
  {child}
@@ -215,8 +249,14 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
215
249
  AdditionalHeaderWidget
216
250
  });
217
251
 
252
+ // Get keys from property columns to filter out duplicate additional fields
253
+ const propertyColumnKeys = new Set(columnsResult.map(col => col.key));
254
+
218
255
  const additionalTableColumns: VirtualTableColumn[] = additionalFields
219
- ? additionalFields.map((additionalField) =>
256
+ // Filter out additional fields whose key already exists in property columns
257
+ ? additionalFields
258
+ .filter((additionalField) => !propertyColumnKeys.has(additionalField.key))
259
+ .map((additionalField) =>
220
260
  ({
221
261
  key: additionalField.key,
222
262
  align: "left",
@@ -265,11 +305,16 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
265
305
  });
266
306
  else
267
307
  return <EntityCollectionRowActions entity={props.rowData}
268
- width={column.width}
269
- frozen={column.frozen}
270
- isSelected={false}
271
- size={size}
272
- openEntityMode={openEntityMode}/>;
308
+ width={column.width}
309
+ frozen={column.frozen}
310
+ isSelected={false}
311
+ size={size}
312
+ openEntityMode={openEntityMode}
313
+ sortableNodeRef={props.sortableNodeRef}
314
+ sortableStyle={props.sortableStyle}
315
+ sortableAttributes={props.sortableAttributes}
316
+ isDragging={props.isDragging}
317
+ isDraggable={props.isDraggable} />;
273
318
  } else if (additionalFieldsMap[columnKey]) {
274
319
  return additionalCellRenderer(props);
275
320
  } else if (props.columnIndex < columns.length + 1) {
@@ -286,8 +331,14 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
286
331
  value={null}
287
332
  align={"left"}
288
333
  fullHeight={false}
289
- disabled={true}>
290
- <ErrorView error={e}/>
334
+ disabled={true}
335
+ sortableNodeRef={props.sortableNodeRef}
336
+ sortableStyle={props.sortableStyle}
337
+ sortableAttributes={props.sortableAttributes}
338
+ isDragging={props.isDragging}
339
+ isDraggable={props.isDraggable}
340
+ frozen={props.frozen}>
341
+ <ErrorView error={e} />
291
342
  </EntityTableCell>;
292
343
  }
293
344
  }, [tableRowActionsBuilder, additionalCellRenderer, propertyCellRenderer, size]);
@@ -295,36 +346,36 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
295
346
  return (
296
347
 
297
348
  <div ref={ref}
298
- style={style}
299
- className={cls("h-full w-full flex flex-col bg-white dark:bg-surface-950", className)}>
349
+ style={style}
350
+ className={cls("h-full w-full flex flex-col bg-white dark:bg-surface-950", className)}>
300
351
 
301
- <CollectionTableToolbar
352
+ {!hideToolbar && <CollectionTableToolbar
302
353
  onTextSearch={textSearchEnabled ? onTextSearch : undefined}
303
354
  textSearchLoading={textSearchLoading}
304
355
  onTextSearchClick={textSearchEnabled ? onTextSearchClick : undefined}
305
- size={size}
306
- onSizeChanged={updateSize}
307
356
  title={title}
308
357
  actionsStart={actionsStart}
309
358
  actions={actions}
310
- loading={tableController.dataLoading}/>
359
+ viewModeToggle={viewModeToggle}
360
+ loading={tableController.dataLoading} />}
311
361
 
312
362
  <SelectableTable columns={columns}
313
- size={size}
314
- inlineEditing={inlineEditing}
315
- cellRenderer={cellRenderer}
316
- onEntityClick={onEntityClick}
317
- highlightedRow={(entity: Entity<M>) => Boolean(selectedEntities?.find(e => e.id === entity.id && e.path === entity.path))}
318
- tableController={tableController}
319
- onValueChange={onValueChange}
320
- initialScroll={initialScroll}
321
- onScroll={onScroll}
322
- onColumnResize={onColumnResize}
323
- hoverRow={hoverRow}
324
- filterable={filterable}
325
- emptyComponent={emptyComponent}
326
- endAdornment={endAdornment}
327
- AddColumnComponent={AddColumnComponent}/>
363
+ size={size}
364
+ inlineEditing={inlineEditing}
365
+ cellRenderer={cellRenderer}
366
+ onEntityClick={onEntityClick}
367
+ highlightedRow={(entity: Entity<M>) => Boolean(selectedEntities?.find(e => e.id === entity.id && e.path === entity.path))}
368
+ tableController={tableController}
369
+ onValueChange={onValueChange}
370
+ initialScroll={initialScroll}
371
+ onScroll={onScroll}
372
+ onColumnResize={onColumnResize}
373
+ hoverRow={hoverRow}
374
+ filterable={filterable}
375
+ emptyComponent={emptyComponent}
376
+ endAdornment={endAdornment}
377
+ AddColumnComponent={AddColumnComponent}
378
+ onColumnsOrderChange={onColumnsOrderChange} />
328
379
 
329
380
  </div>
330
381
  );