@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
@@ -2,6 +2,7 @@ import React, { RefObject, useCallback, useEffect, useState } from "react";
2
2
  import equal from "react-fast-compare";
3
3
 
4
4
  import { VirtualTableColumn, VirtualTableSort, VirtualTableWhereFilterOp } from "./VirtualTableProps";
5
+ import { useTranslation } from "../../hooks";
5
6
  import { ErrorBoundary } from "../ErrorBoundary";
6
7
  import {
7
8
  ArrowUpwardIcon,
@@ -34,7 +35,7 @@ export type FilterFormFieldProps<CustomProps> = {
34
35
  };
35
36
 
36
37
  type VirtualTableHeaderProps<M extends Record<string, any>> = {
37
- resizeHandleRef: RefObject<HTMLDivElement>;
38
+ resizeHandleRef: RefObject<HTMLDivElement | null>;
38
39
  columnIndex: number;
39
40
  isResizingIndex: number;
40
41
  column: VirtualTableColumn<any>;
@@ -45,22 +46,28 @@ type VirtualTableHeaderProps<M extends Record<string, any>> = {
45
46
  onClickResizeColumn?: (columnIndex: number, column: VirtualTableColumn) => void;
46
47
  createFilterField?: (props: FilterFormFieldProps<any>) => React.ReactNode;
47
48
  AdditionalHeaderWidget?: (props: { onHover: boolean }) => React.ReactNode;
49
+ isDragging?: boolean;
50
+ isDraggable?: boolean;
51
+ headerIconSize?: "small" | "smallest";
48
52
  };
49
53
 
50
54
  export const VirtualTableHeader = React.memo<VirtualTableHeaderProps<any>>(
51
55
  function VirtualTableHeader<M extends Record<string, any>>({
52
- resizeHandleRef,
53
- columnIndex,
54
- isResizingIndex,
55
- sort,
56
- onColumnSort,
57
- onFilterUpdate,
58
- filter,
59
- column,
60
- onClickResizeColumn,
61
- createFilterField,
62
- AdditionalHeaderWidget
63
- }: VirtualTableHeaderProps<M>) {
56
+ resizeHandleRef,
57
+ columnIndex,
58
+ isResizingIndex,
59
+ sort,
60
+ onColumnSort,
61
+ onFilterUpdate,
62
+ filter,
63
+ column,
64
+ onClickResizeColumn,
65
+ createFilterField,
66
+ AdditionalHeaderWidget,
67
+ isDragging,
68
+ isDraggable,
69
+ headerIconSize = "small",
70
+ }: VirtualTableHeaderProps<M>) {
64
71
 
65
72
  const [onHover, setOnHover] = useState(false);
66
73
 
@@ -85,14 +92,16 @@ export const VirtualTableHeader = React.memo<VirtualTableHeaderProps<any>>(
85
92
  return (
86
93
  <ErrorBoundary>
87
94
  <div
88
- className={cls("flex py-0 px-3 h-full text-xs uppercase font-semibold relative select-none items-center bg-surface-50 dark:bg-surface-900",
95
+ className={cls("flex py-0 px-3 h-full text-xs uppercase font-semibold relative select-none items-center",
96
+ isDragging
97
+ ? "bg-primary-bg dark:bg-primary-bg-dark"
98
+ : "bg-surface-50 dark:bg-surface-900",
89
99
  "text-text-secondary hover:text-text-primary dark:text-text-secondary-dark dark:hover:text-text-primary-dark",
90
- "hover:bg-surface-100 dark:hover:bg-surface-800 hover:bg-opacity-50 dark:hover:bg-opacity-50",
91
- column.frozen ? "sticky left-0 z-10" : "relative z-0"
100
+ !isDragging && "hover:bg-surface-100 dark:hover:bg-surface-800 hover:bg-opacity-50 hover:bg-surface-100/50 dark:hover:bg-opacity-50 dark:hover:bg-surface-800/50",
101
+ column.frozen ? "sticky left-0 z-10" : "relative z-0",
102
+ isDraggable && "cursor-grab"
92
103
  )}
93
104
  style={{
94
- // transition: "color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms",
95
- // fontSize: "0.750rem",
96
105
  left: column.frozen ? 0 : undefined,
97
106
  minWidth: column.width,
98
107
  maxWidth: column.width
@@ -123,24 +132,23 @@ export const VirtualTableHeader = React.memo<VirtualTableHeaderProps<any>>(
123
132
  <>
124
133
 
125
134
  {AdditionalHeaderWidget &&
126
- <AdditionalHeaderWidget onHover={onHover || openFilter}/>}
135
+ <AdditionalHeaderWidget onHover={onHover || openFilter} />}
127
136
 
128
137
  {column.sortable && (sort || hovered || openFilter) &&
129
138
  <Badge color="secondary"
130
- invisible={!sort}>
139
+ invisible={!sort}>
131
140
  <IconButton
132
- size={"small"}
141
+ size={headerIconSize}
133
142
  className={onHover || openFilter ? "bg-white dark:bg-surface-950" : undefined}
134
143
  onClick={() => {
135
144
  onColumnSort(column.key as Extract<keyof M, string>);
136
145
  }}
137
146
  >
138
- {!sort &&
139
- <ArrowUpwardIcon/>}
140
- {sort === "asc" &&
141
- <ArrowUpwardIcon/>}
142
- {sort === "desc" &&
143
- <ArrowUpwardIcon className={"rotate-180"}/>}
147
+ <ArrowUpwardIcon size={headerIconSize}
148
+ className={cls(
149
+ "transition-transform duration-200",
150
+ sort === "desc" ? "rotate-180" : "rotate-0"
151
+ )} />
144
152
  </IconButton>
145
153
  </Badge>
146
154
  }
@@ -148,7 +156,7 @@ export const VirtualTableHeader = React.memo<VirtualTableHeaderProps<any>>(
148
156
 
149
157
  {column.filter && createFilterField && <div>
150
158
  <Badge color="secondary"
151
- invisible={!filter}>
159
+ invisible={!filter}>
152
160
 
153
161
  <Popover
154
162
  open={openFilter}
@@ -160,16 +168,16 @@ export const VirtualTableHeader = React.memo<VirtualTableHeaderProps<any>>(
160
168
  className={onHover || openFilter ? "bg-white dark:bg-surface-950" : undefined}
161
169
  size={"small"}
162
170
  onClick={handleSettingsClick}>
163
- <FilterListIcon size={"small"}/>
171
+ <FilterListIcon size={"small"} />
164
172
  </IconButton>}
165
173
  >
166
174
  <FilterForm column={column}
167
- filter={filter}
168
- onHover={onHover}
169
- onFilterUpdate={update}
170
- createFilterField={createFilterField}
171
- hidden={hidden}
172
- setHidden={setHidden}/>
175
+ filter={filter}
176
+ onHover={onHover}
177
+ onFilterUpdate={update}
178
+ createFilterField={createFilterField}
179
+ hidden={hidden}
180
+ setHidden={setHidden} />
173
181
 
174
182
  </Popover>
175
183
 
@@ -179,11 +187,17 @@ export const VirtualTableHeader = React.memo<VirtualTableHeaderProps<any>>(
179
187
 
180
188
  {column.resizable && <div
181
189
  ref={resizeHandleRef}
190
+ data-no-dnd="true"
182
191
  className={cls(
183
192
  "absolute h-full w-[6px] top-0 right-0 cursor-col-resize",
184
193
  hovered && "bg-surface-300 dark:bg-surface-700"
185
194
  )}
186
- onMouseDown={onClickResizeColumn ? () => onClickResizeColumn(columnIndex, column) : undefined}
195
+ onPointerDown={(e) => {
196
+ e.stopPropagation();
197
+ if (onClickResizeColumn) {
198
+ onClickResizeColumn(columnIndex, column);
199
+ }
200
+ }}
187
201
  />}
188
202
  </div>
189
203
 
@@ -192,14 +206,16 @@ export const VirtualTableHeader = React.memo<VirtualTableHeaderProps<any>>(
192
206
  }, equal) as React.FunctionComponent<VirtualTableHeaderProps<any>>;
193
207
 
194
208
  function FilterForm<M>({
195
- column,
196
- onFilterUpdate,
197
- filter,
198
- onHover,
199
- createFilterField,
200
- hidden,
201
- setHidden
202
- }: FilterFormProps<M>) {
209
+ column,
210
+ onFilterUpdate,
211
+ filter,
212
+ onHover,
213
+ createFilterField,
214
+ hidden,
215
+ setHidden
216
+ }: FilterFormProps<M>) {
217
+
218
+ const { t } = useTranslation();
203
219
 
204
220
  const id = column.key;
205
221
 
@@ -233,32 +249,28 @@ function FilterForm<M>({
233
249
  if (!filterField) return null;
234
250
  return (
235
251
  <form noValidate={true}
236
- onSubmit={(e) => {
237
- e.stopPropagation();
238
- e.preventDefault();
239
- submit();
240
- }}
241
- className={"text-surface-900 dark:text-white"}>
252
+ onSubmit={(e) => {
253
+ e.stopPropagation();
254
+ e.preventDefault();
255
+ submit();
256
+ }}
257
+ className={"text-surface-900 dark:text-white"}>
242
258
  <div
243
259
  className={cls(defaultBorderMixin, "py-4 px-6 typography-label border-b")}>
244
260
  {column.title ?? id}
245
261
  </div>
246
- {filterField && <div className="m-4">
262
+ {filterField && <div className="m-4 w-[400px]">
247
263
  {filterField}
248
264
  </div>}
249
- <div className="flex justify-end m-4">
250
- <Button
251
- className="mr-4"
252
- disabled={!filterIsSet}
253
- variant={"text"}
254
- color="primary"
255
- type="reset"
256
- aria-label="filter clear"
257
- onClick={reset}>Clear</Button>
258
- <Button
259
- variant="outlined"
260
- color="primary"
261
- type="submit">Filter</Button>
265
+ <div className="flex justify-end p-4 pt-0 gap-2">
266
+ <Button variant={"text"}
267
+ size={"small"}
268
+ aria-label="filter clear"
269
+ onClick={reset}>{t("clear")}</Button>
270
+
271
+ <Button variant={"outlined"}
272
+ size={"small"}
273
+ type="submit">{t("filter")}</Button>
262
274
  </div>
263
275
  </form>
264
276
  );
@@ -1,25 +1,136 @@
1
- import React, { createRef, useCallback, useEffect, useState } from "react";
1
+ import React, { createRef, useCallback, useEffect, useMemo, useState } from "react";
2
2
 
3
3
  import { VirtualTableColumn, VirtualTableWhereFilterOp } from "./VirtualTableProps";
4
4
  import { ErrorBoundary } from "../ErrorBoundary";
5
5
  import { VirtualTableHeader } from "./VirtualTableHeader";
6
6
  import { VirtualTableContextProps } from "./types";
7
7
  import { cls, defaultBorderMixin } from "@firecms/ui";
8
+ import { useSortable } from "@dnd-kit/sortable";
9
+ import { CSS } from "@dnd-kit/utilities";
10
+
11
+ // Sortable column header wrapper
12
+ const SortableColumnHeader = ({
13
+ column,
14
+ columnIndex,
15
+ columnRefs,
16
+ isResizing,
17
+ onFilterUpdate,
18
+ filter,
19
+ sortByProperty,
20
+ currentSort,
21
+ onColumnSort,
22
+ onClickResizeColumn,
23
+ createFilterField,
24
+ isDragging,
25
+ isDraggable,
26
+ headerIconSize
27
+ }: {
28
+ column: VirtualTableColumn;
29
+ columnIndex: number;
30
+ columnRefs: React.RefObject<HTMLDivElement | null>[];
31
+ isResizing: number;
32
+ onFilterUpdate: any;
33
+ filter: [VirtualTableWhereFilterOp, any] | undefined;
34
+ sortByProperty: string | undefined;
35
+ currentSort: "asc" | "desc" | undefined;
36
+ onColumnSort: any;
37
+ onClickResizeColumn: (index: number) => void;
38
+ createFilterField: any;
39
+ isDragging: boolean;
40
+ isDraggable: boolean;
41
+ headerIconSize?: "small" | "smallest";
42
+ }) => {
43
+ const [isPressing, setIsPressing] = useState(false);
44
+
45
+ const {
46
+ attributes,
47
+ listeners,
48
+ setNodeRef,
49
+ transform,
50
+ transition,
51
+ } = useSortable({
52
+ id: column.key,
53
+ disabled: !isDraggable || column.frozen
54
+ });
55
+
56
+ const style = {
57
+ // Only use translate, ignore any scale transforms
58
+ transform: transform ? `translateX(${transform.x}px)` : undefined,
59
+ // Don't transition the dragged item - only other items should animate
60
+ transition: isDragging ? undefined : transition,
61
+ minWidth: column.width,
62
+ maxWidth: column.width,
63
+ width: column.width,
64
+ };
65
+
66
+ // Combine our press handlers with dnd-kit listeners
67
+ const combinedListeners = isDraggable ? {
68
+ ...listeners,
69
+ onPointerDown: (e: React.PointerEvent) => {
70
+ setIsPressing(true);
71
+ listeners?.onPointerDown?.(e);
72
+ },
73
+ onPointerUp: () => setIsPressing(false),
74
+ onPointerCancel: () => setIsPressing(false),
75
+ } : {};
76
+
77
+ // Reset pressing state when drag ends
78
+ React.useEffect(() => {
79
+ if (!isDragging) {
80
+ setIsPressing(false);
81
+ }
82
+ }, [isDragging]);
83
+
84
+ return (
85
+ <div
86
+ ref={setNodeRef}
87
+ style={style}
88
+ className={cls(
89
+ "flex-shrink-0 h-full",
90
+ column.frozen && "sticky left-0 z-10"
91
+ )}
92
+ {...attributes}
93
+ {...combinedListeners}
94
+ >
95
+ <VirtualTableHeader
96
+ resizeHandleRef={columnRefs[columnIndex]}
97
+ columnIndex={columnIndex}
98
+ isResizingIndex={isResizing}
99
+ onFilterUpdate={onFilterUpdate}
100
+ filter={filter}
101
+ sort={sortByProperty === column.key ? currentSort : undefined}
102
+ onColumnSort={onColumnSort}
103
+ onClickResizeColumn={onClickResizeColumn}
104
+ column={column}
105
+ createFilterField={createFilterField}
106
+ AdditionalHeaderWidget={column.AdditionalHeaderWidget}
107
+ isDragging={isDragging || isPressing}
108
+ isDraggable={isDraggable}
109
+ headerIconSize={headerIconSize} />
110
+ </div>
111
+ );
112
+ };
8
113
 
9
114
  export const VirtualTableHeaderRow = ({
10
- columns,
11
- currentSort,
12
- onColumnSort,
13
- onFilterUpdate,
14
- sortByProperty,
15
- filter,
16
- onColumnResize,
17
- onColumnResizeEnd,
18
- createFilterField,
19
- AddColumnComponent
20
- }: VirtualTableContextProps<any>) => {
21
-
22
- const columnRefs = columns.map(() => createRef<HTMLDivElement>());
115
+ columns,
116
+ currentSort,
117
+ onColumnSort,
118
+ onFilterUpdate,
119
+ sortByProperty,
120
+ filter,
121
+ onColumnResize,
122
+ onColumnResizeEnd,
123
+ createFilterField,
124
+ AddColumnComponent,
125
+ onColumnsOrderChange,
126
+ data,
127
+ cellRenderer: CellRenderer,
128
+ rowHeight = 54,
129
+ draggingColumnId,
130
+ headerIconSize,
131
+ }: VirtualTableContextProps<any>) => {
132
+
133
+ const columnRefs = useMemo(() => columns.map(() => createRef<HTMLDivElement>()), [columns.length]);
23
134
  const [isResizing, setIsResizing] = useState(-1);
24
135
 
25
136
  const adjustWidthColumn = useCallback((index: number, width: number, end: boolean) => {
@@ -99,33 +210,43 @@ export const VirtualTableHeaderRow = ({
99
210
  }, [setCursorDocument]);
100
211
 
101
212
  return (
102
- <div
103
- className={cls(defaultBorderMixin, "z-20 sticky min-w-full flex w-fit flex-row top-0 left-0 h-12 border-b bg-surface-50 dark:bg-surface-900")}>
104
- {columns.map((c, columnIndex) => {
105
- const column = columns[columnIndex];
106
-
107
- const filterForThisProperty: [VirtualTableWhereFilterOp, any] | undefined =
108
- column && filter && filter[column.key]
109
- ? filter[column.key]
110
- : undefined;
111
- return <ErrorBoundary key={"header_" + column.key}>
112
- <VirtualTableHeader
113
- resizeHandleRef={columnRefs[columnIndex]}
114
- columnIndex={columnIndex}
115
- isResizingIndex={isResizing}
116
- onFilterUpdate={onFilterUpdate}
117
- filter={filterForThisProperty}
118
- sort={sortByProperty === column.key ? currentSort : undefined}
119
- onColumnSort={onColumnSort}
120
- onClickResizeColumn={onClickResizeColumn}
121
- column={column}
122
- createFilterField={createFilterField}
123
- AdditionalHeaderWidget={column.AdditionalHeaderWidget}/>
124
- </ErrorBoundary>;
125
- })}
126
-
127
- {AddColumnComponent && <AddColumnComponent/>}
128
-
129
- </div>
213
+ <>
214
+ <div
215
+ className={cls(defaultBorderMixin, "z-20 sticky min-w-full flex w-fit flex-row top-0 left-0 h-12 border-b bg-surface-50 dark:bg-surface-900")}>
216
+ {columns.map((column, columnIndex) => {
217
+ const filterForThisProperty: [VirtualTableWhereFilterOp, any] | undefined =
218
+ column && filter && filter[column.key]
219
+ ? filter[column.key]
220
+ : undefined;
221
+
222
+ const isDraggable = !column.frozen && !!onColumnsOrderChange;
223
+ const isDragging = draggingColumnId === column.key;
224
+
225
+ return (
226
+ <ErrorBoundary key={"header_" + column.key}>
227
+ <SortableColumnHeader
228
+ column={column}
229
+ columnIndex={columnIndex}
230
+ columnRefs={columnRefs}
231
+ isResizing={isResizing}
232
+ onFilterUpdate={onFilterUpdate}
233
+ filter={filterForThisProperty}
234
+ sortByProperty={sortByProperty}
235
+ currentSort={currentSort}
236
+ onColumnSort={onColumnSort}
237
+ onClickResizeColumn={onClickResizeColumn}
238
+ createFilterField={createFilterField}
239
+ isDragging={isDragging}
240
+ isDraggable={isDraggable}
241
+ headerIconSize={headerIconSize}
242
+ />
243
+ </ErrorBoundary>
244
+ );
245
+ })}
246
+
247
+ {AddColumnComponent && <AddColumnComponent />}
248
+
249
+ </div>
250
+ </>
130
251
  );
131
252
  };
@@ -38,7 +38,7 @@ export interface VirtualTableProps<T extends Record<string, any>> {
38
38
  * @param sortBy
39
39
  */
40
40
  checkFilterCombination?: (filterValues: VirtualTableFilterValues<Extract<keyof T, string>>,
41
- sortBy?: [string, "asc" | "desc"]) => boolean;
41
+ sortBy?: [string, "asc" | "desc"]) => boolean;
42
42
 
43
43
  /**
44
44
  * A callback function when scrolling the table to near the end
@@ -162,6 +162,18 @@ export interface VirtualTableProps<T extends Record<string, any>> {
162
162
  */
163
163
  initialScroll?: number;
164
164
 
165
+ /**
166
+ * Callback when columns are reordered via drag-and-drop.
167
+ * @param columns The new column order
168
+ */
169
+ onColumnsOrderChange?: (columns: VirtualTableColumn[]) => void;
170
+
171
+ /**
172
+ * Size of icons in column headers (sort, filter).
173
+ * @default "small"
174
+ */
175
+ headerIconSize?: "small" | "smallest";
176
+
165
177
  }
166
178
 
167
179
  export type CellRendererParams<T = any> = {
@@ -172,6 +184,13 @@ export type CellRendererParams<T = any> = {
172
184
  rowIndex: number;
173
185
  width: number;
174
186
  isScrolling?: boolean;
187
+ // Sortable props for dnd-kit integration
188
+ sortableNodeRef?: (node: HTMLElement | null) => void;
189
+ sortableStyle?: React.CSSProperties;
190
+ sortableAttributes?: Record<string, any>;
191
+ isDragging?: boolean;
192
+ isDraggable?: boolean;
193
+ frozen?: boolean;
175
194
  };
176
195
 
177
196
  /**
@@ -193,7 +212,7 @@ export interface VirtualTableColumn<CustomProps = any> {
193
212
  /**
194
213
  * Label displayed in the header
195
214
  */
196
- title?: string;
215
+ title?: React.ReactNode;
197
216
 
198
217
  /**
199
218
  * This column is frozen to the left
@@ -29,7 +29,7 @@ export const VirtualTableRow = React.memo<VirtualTableRowProps<any>>(
29
29
  return (
30
30
  <div
31
31
  className={cls(
32
- "flex min-w-full text-sm border-b border-surface-200 dark:border-surface-800 border-opacity-40 dark:border-opacity-40",
32
+ "flex min-w-full text-sm border-b border-surface-200 dark:border-surface-800 border-opacity-40 border-surface-200/40 dark:border-opacity-40 dark:border-surface-800/40",
33
33
  rowClassName ? rowClassName(rowData) : "",
34
34
  {
35
35
  "hover:bg-opacity-95": hoverRow,
@@ -6,6 +6,7 @@ export function VirtualTableDateField(props: {
6
6
  name: string;
7
7
  error: Error | undefined;
8
8
  mode?: "date" | "date_time";
9
+ timezone?: string;
9
10
  internalValue: Date | undefined | null;
10
11
  updateValue: (newValue: (Date | null)) => void;
11
12
  focused: boolean;
@@ -18,6 +19,7 @@ export function VirtualTableDateField(props: {
18
19
  disabled,
19
20
  error,
20
21
  mode,
22
+ timezone,
21
23
  internalValue,
22
24
  updateValue
23
25
  } = props;
@@ -31,6 +33,7 @@ export function VirtualTableDateField(props: {
31
33
  inputClassName={cls("w-full h-full", focusedDisabled)}
32
34
  className={cls("w-full h-full", focusedDisabled)}
33
35
  mode={mode}
36
+ timezone={timezone}
34
37
  locale={locale}
35
38
  />
36
39
  );
@@ -62,14 +62,24 @@ export function VirtualTableSelect(props: {
62
62
  key={`${enumKey}`}
63
63
  enumKey={String(enumKey)}
64
64
  enumValues={enumValues}
65
- size={small ? "small" : "medium"}/>;
65
+ size={small ? "small" : "medium"} />;
66
66
  };
67
67
 
68
+ // When the dropdown closes (including on escape), restore focus to the trigger
69
+ const handleOpenChange = useCallback((open: boolean) => {
70
+ if (!open && ref.current) {
71
+ // Use setTimeout to ensure focus is restored after Radix finishes its cleanup
72
+ setTimeout(() => {
73
+ ref.current?.focus({ preventScroll: true });
74
+ }, 0);
75
+ }
76
+ }, []);
77
+
68
78
  return (
69
79
  multiple
70
80
  ? <MultiSelect
71
81
  inputRef={ref}
72
- className="w-full h-full p-0 bg-transparent"
82
+ className="w-full h-full p-0 bg-transparent outline-none"
73
83
  position={"item-aligned"}
74
84
  disabled={disabled}
75
85
  includeClear={false}
@@ -77,7 +87,8 @@ export function VirtualTableSelect(props: {
77
87
  value={validValue
78
88
  ? ((internalValue as any[]).map(v => v.toString()))
79
89
  : ([])}
80
- onValueChange={onChange}>
90
+ onValueChange={onChange}
91
+ onOpenChange={handleOpenChange}>
81
92
  {enumValues?.map((enumConfig) => (
82
93
  <MultiSelectItem
83
94
  key={enumConfig.id}
@@ -85,7 +96,7 @@ export function VirtualTableSelect(props: {
85
96
  <EnumValuesChip
86
97
  enumKey={enumConfig.id}
87
98
  enumValues={enumValues}
88
- size={small ? "small" : "medium"}/>
99
+ size={small ? "small" : "medium"} />
89
100
  </MultiSelectItem>
90
101
  ))}
91
102
  </MultiSelect>
@@ -93,7 +104,8 @@ export function VirtualTableSelect(props: {
93
104
  inputRef={ref}
94
105
  size={"large"}
95
106
  fullWidth={true}
96
- className="w-full h-full p-0 bg-transparent"
107
+ className="w-full h-full p-0 bg-transparent outline-none [&_button]:ring-0 [&_button]:ring-offset-0"
108
+ inputClassName="ring-0 ring-offset-0 focus:ring-0 focus-visible:ring-0 outline-none focus:outline-none focus-visible:outline-none focus-visible:ring-offset-0"
97
109
  position={"item-aligned"}
98
110
  disabled={disabled}
99
111
  padding={false}
@@ -101,6 +113,7 @@ export function VirtualTableSelect(props: {
101
113
  ? internalValue?.toString()
102
114
  : ""}
103
115
  onValueChange={onChange}
116
+ onOpenChange={handleOpenChange}
104
117
  renderValue={renderValue}>
105
118
  {enumValues?.map((enumConfig) => (
106
119
  <SelectItem
@@ -109,7 +122,7 @@ export function VirtualTableSelect(props: {
109
122
  <EnumValuesChip
110
123
  enumKey={enumConfig.id}
111
124
  enumValues={enumValues}
112
- size={small ? "small" : "medium"}/>
125
+ size={small ? "small" : "medium"} />
113
126
  </SelectItem>
114
127
  ))}
115
128
  </Select>
@@ -40,4 +40,7 @@ export type VirtualTableContextProps<T extends any> = {
40
40
  rowClassName?: (rowData: T) => string | undefined;
41
41
  endAdornment?: React.ReactNode;
42
42
  AddColumnComponent?: React.ComponentType;
43
+ onColumnsOrderChange?: (columns: VirtualTableColumn[]) => void;
44
+ draggingColumnId?: string | null;
45
+ headerIconSize?: "small" | "smallest";
43
46
  };
@@ -1,3 +1,7 @@
1
+ // Note: entity action 'name' fields (Edit, Copy, Delete) are plain strings defined
2
+ // at module level. They cannot use hooks. Consumers who need to translate these
3
+ // should override the action name by creating their own EntityAction objects or
4
+ // by using the entityActions prop with custom names for their locale.
1
5
  import { DeleteIcon, EditIcon, FileCopyIcon } from "@firecms/ui";
2
6
  import { EntityAction } from "../../types";
3
7
  import { DeleteEntityDialog } from "../DeleteEntityDialog";