@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
@@ -0,0 +1,202 @@
1
+ import React, { useMemo } from "react";
2
+ import { CollectionSize, ViewMode } from "../../types";
3
+ import {
4
+ AppsIcon,
5
+ Button,
6
+ ListIcon,
7
+ Popover,
8
+ Select,
9
+ SelectItem,
10
+ ToggleButtonGroup,
11
+ ToggleButtonOption,
12
+ ViewColumnIcon,
13
+ ViewKanbanIcon
14
+ } from "@firecms/ui";
15
+ import { useTranslation } from "../../hooks/useTranslation";
16
+
17
+ export type KanbanPropertyOption = {
18
+ key: string;
19
+ label: string;
20
+ };
21
+
22
+ export type ViewModeToggleProps = {
23
+ viewMode?: ViewMode;
24
+ onViewModeChange?: (mode: ViewMode) => void;
25
+ /**
26
+ * Which view modes are enabled for this collection.
27
+ * Only these modes will appear in the toggle.
28
+ * Defaults to all three: ["table", "cards", "kanban"].
29
+ */
30
+ enabledViews?: ViewMode[];
31
+ /**
32
+ * Current size for card/table views
33
+ */
34
+ size?: CollectionSize;
35
+ /**
36
+ * Callback when size changes
37
+ */
38
+ onSizeChanged?: (size: CollectionSize) => void;
39
+ /**
40
+ * Controlled open state for the popover
41
+ */
42
+ open?: boolean;
43
+ /**
44
+ * Callback when popover open state changes
45
+ */
46
+ onOpenChange?: (open: boolean) => void;
47
+ /**
48
+ * Available properties that can be used for kanban columns (enum properties)
49
+ */
50
+ kanbanPropertyOptions?: KanbanPropertyOption[];
51
+ /**
52
+ * Currently selected property for kanban columns
53
+ */
54
+ selectedKanbanProperty?: string;
55
+ /**
56
+ * Callback when the kanban column property changes
57
+ */
58
+ onKanbanPropertyChange?: (property: string) => void;
59
+ }
60
+
61
+ const ALL_VIEW_MODES: ViewMode[] = ["table", "cards", "kanban"];
62
+
63
+ export function ViewModeToggle({
64
+ viewMode = "table",
65
+ onViewModeChange,
66
+ enabledViews = ALL_VIEW_MODES,
67
+ size,
68
+ onSizeChanged,
69
+ open,
70
+ onOpenChange,
71
+ kanbanPropertyOptions,
72
+ selectedKanbanProperty,
73
+ onKanbanPropertyChange
74
+ }: ViewModeToggleProps) {
75
+
76
+ const { t } = useTranslation();
77
+
78
+ if (!onViewModeChange) {
79
+ return null;
80
+ }
81
+
82
+ // Get icon for current view mode
83
+ const getViewModeIcon = () => {
84
+ if (viewMode === "kanban") return <ViewKanbanIcon size="small" />;
85
+ if (viewMode === "cards") return <AppsIcon size="small" />;
86
+ return <ListIcon size="small" />;
87
+ };
88
+
89
+ const getViewModeName = () => {
90
+ if (viewMode === "kanban") return t("board");
91
+ if (viewMode === "cards") return t("cards");
92
+ return t("list");
93
+ };
94
+
95
+ const showSizeSelector = size && onSizeChanged && (viewMode === "table" || viewMode === "cards");
96
+ const showKanbanPropertySelector = viewMode === "kanban" &&
97
+ kanbanPropertyOptions &&
98
+ kanbanPropertyOptions.length > 0 &&
99
+ onKanbanPropertyChange;
100
+
101
+ // Build toggle options based on enabledViews
102
+ const viewModeOptions: ToggleButtonOption<ViewMode>[] = useMemo(() => {
103
+ const allOptions: ToggleButtonOption<ViewMode>[] = [
104
+ {
105
+ value: "table",
106
+ label: t("list"),
107
+ icon: <ListIcon size="small" />
108
+ },
109
+ {
110
+ value: "cards",
111
+ label: t("cards"),
112
+ icon: <AppsIcon size="small" />
113
+ },
114
+ {
115
+ value: "kanban",
116
+ label: t("board"),
117
+ icon: <ViewKanbanIcon size="small" />
118
+ }
119
+ ];
120
+
121
+ return allOptions.filter(option => enabledViews.includes(option.value));
122
+ }, [enabledViews]);
123
+
124
+ // Don't render if only one view is enabled
125
+ if (viewModeOptions.length <= 1 && !showSizeSelector) {
126
+ return null;
127
+ }
128
+
129
+ return (
130
+ <Popover
131
+ open={open}
132
+ onOpenChange={onOpenChange}
133
+ modal={true}
134
+ trigger={
135
+ <Button size="small">
136
+ {getViewModeIcon()}
137
+ <span className="ml-1 text-sm">{getViewModeName()}</span>
138
+ </Button>
139
+ }
140
+ >
141
+ <div className="p-3 flex flex-col gap-3 min-w-[240px]">
142
+ {/* View mode toggle using ToggleButtonGroup */}
143
+ {viewModeOptions.length > 1 && (
144
+ <ToggleButtonGroup
145
+ value={viewMode}
146
+ onValueChange={onViewModeChange}
147
+ options={viewModeOptions}
148
+ />
149
+ )}
150
+
151
+ {/* Size selector */}
152
+ {showSizeSelector && (
153
+ <div className="flex flex-row items-center justify-between gap-2">
154
+ <div className="flex items-center gap-2 text-sm text-surface-600 dark:text-surface-300">
155
+ <ViewColumnIcon size="small" />
156
+ <span>{t("size_label")}</span>
157
+ </div>
158
+ <Select
159
+ value={size}
160
+ size="small"
161
+ className="w-20"
162
+ onValueChange={(v) => onSizeChanged?.(v as CollectionSize)}
163
+ renderValue={(v) => <span className="font-medium">{v.toUpperCase()}</span>}
164
+ >
165
+ {["xs", "s", "m", "l", "xl"].map((s) => (
166
+ <SelectItem key={s} value={s} className="font-medium text-center">
167
+ {s.toUpperCase()}
168
+ </SelectItem>
169
+ ))}
170
+ </Select>
171
+ </div>
172
+ )}
173
+
174
+ {/* Kanban column property selector */}
175
+ {showKanbanPropertySelector && (
176
+ <div className="flex flex-row items-center justify-between gap-2">
177
+ <div className="flex items-center gap-2 text-sm text-surface-600 dark:text-surface-300">
178
+ <ViewKanbanIcon size="small" />
179
+ <span>{t("group_by")}</span>
180
+ </div>
181
+ <Select
182
+ value={selectedKanbanProperty}
183
+ size="small"
184
+ className="w-32"
185
+ onValueChange={(v) => onKanbanPropertyChange?.(v)}
186
+ renderValue={(v) => {
187
+ const option = kanbanPropertyOptions?.find(o => o.key === v);
188
+ return <span className="font-medium truncate">{option?.label ?? v}</span>;
189
+ }}
190
+ >
191
+ {kanbanPropertyOptions?.map((option) => (
192
+ <SelectItem key={option.key} value={option.key}>
193
+ {option.label}
194
+ </SelectItem>
195
+ ))}
196
+ </Select>
197
+ </div>
198
+ )}
199
+ </div>
200
+ </Popover>
201
+ );
202
+ }
@@ -0,0 +1,113 @@
1
+ import { CSSProperties } from "react";
2
+ import { ChipColorKey, ChipColorScheme } from "@firecms/ui";
3
+ import { Entity } from "../../types";
4
+
5
+ /**
6
+ * Item wrapper for entities in the Board component
7
+ */
8
+ export interface BoardItem<M extends Record<string, any> = any> {
9
+ id: string;
10
+ entity: Entity<M>;
11
+ }
12
+
13
+ /**
14
+ * Map of column keys to arrays of board items
15
+ */
16
+ export interface BoardItemMap<M extends Record<string, any> = any> {
17
+ [columnKey: string]: BoardItem<M>[];
18
+ }
19
+
20
+ /**
21
+ * Props passed to custom item render components
22
+ */
23
+ export interface BoardItemViewProps<M extends Record<string, any> = any> {
24
+ item: BoardItem<M>;
25
+ isDragging: boolean;
26
+ isClone?: boolean;
27
+ isGroupedOver?: boolean;
28
+ style?: CSSProperties;
29
+ index?: number;
30
+ }
31
+
32
+ /**
33
+ * Per-column loading state
34
+ */
35
+ export interface ColumnLoadingState {
36
+ [columnKey: string]: {
37
+ loading: boolean;
38
+ hasMore: boolean;
39
+ itemCount: number;
40
+ /** Total count of entities in column (may differ from itemCount if some lack orderProperty) */
41
+ totalCount?: number;
42
+ };
43
+ }
44
+
45
+ /**
46
+ * Props for the Board component
47
+ */
48
+ export interface BoardProps<M extends Record<string, any>, COLUMN extends string> {
49
+ /**
50
+ * Array of board items (entities wrapped with id)
51
+ */
52
+ data: BoardItem<M>[];
53
+ /**
54
+ * Array of column keys/identifiers
55
+ */
56
+ columns: COLUMN[];
57
+ /**
58
+ * Labels for each column (optional, uses column key if not provided)
59
+ */
60
+ columnLabels?: Record<COLUMN, string>;
61
+ /**
62
+ * Colors for each column from enum values (optional)
63
+ */
64
+ columnColors?: Record<COLUMN, ChipColorKey | ChipColorScheme | undefined>;
65
+ /**
66
+ * CSS class name for the board container
67
+ */
68
+ className?: string;
69
+ /**
70
+ * Function to determine which column an item belongs to
71
+ */
72
+ assignColumn: (item: BoardItem<M>) => COLUMN;
73
+ /**
74
+ * Whether column reordering is allowed.
75
+ * Set to true only when a plugin provides persistence for column order.
76
+ */
77
+ allowColumnReorder?: boolean;
78
+ /**
79
+ * Callback when columns are reordered
80
+ */
81
+ onColumnReorder?: (columns: COLUMN[]) => void;
82
+ /**
83
+ * Callback when items are reordered or moved between columns
84
+ */
85
+ onItemsReorder?: (
86
+ items: BoardItem<M>[],
87
+ moveInfo?: {
88
+ itemId: string;
89
+ sourceColumn: COLUMN;
90
+ targetColumn: COLUMN;
91
+ }
92
+ ) => void;
93
+ /**
94
+ * Component to render individual items
95
+ */
96
+ ItemComponent: React.ComponentType<BoardItemViewProps<M>>;
97
+ /**
98
+ * Per-column loading state for pagination
99
+ */
100
+ columnLoadingState?: ColumnLoadingState;
101
+ /**
102
+ * Callback to load more items for a column
103
+ */
104
+ onLoadMoreColumn?: (column: COLUMN) => void;
105
+ /**
106
+ * Callback to add a new item to a specific column
107
+ */
108
+ onAddItemToColumn?: (column: COLUMN) => void;
109
+ /**
110
+ * Optional component to render at the end of the board for adding new columns
111
+ */
112
+ AddColumnComponent?: React.ReactNode;
113
+ }