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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/README.md +1 -1
  2. package/dist/components/AIIcon.d.ts +16 -0
  3. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +7 -1
  4. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
  5. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +14 -0
  6. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +6 -0
  7. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +5 -4
  8. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +6 -0
  9. package/dist/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +2 -2
  10. package/dist/components/EntityCollectionView/Board.d.ts +2 -0
  11. package/dist/components/EntityCollectionView/BoardColumn.d.ts +42 -0
  12. package/dist/components/EntityCollectionView/BoardColumnTitle.d.ts +9 -0
  13. package/dist/components/EntityCollectionView/BoardSortableList.d.ts +14 -0
  14. package/dist/components/EntityCollectionView/CollectionDataErrorBanner.d.ts +4 -0
  15. package/dist/components/EntityCollectionView/EntityBoardCard.d.ts +26 -0
  16. package/dist/components/EntityCollectionView/EntityCard.d.ts +19 -0
  17. package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +20 -0
  18. package/dist/components/EntityCollectionView/EntityCollectionCardView.d.ts +31 -0
  19. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +2 -2
  20. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +7 -3
  21. package/dist/components/EntityCollectionView/FiltersDialog.d.ts +14 -0
  22. package/dist/components/EntityCollectionView/ViewModeToggle.d.ts +44 -0
  23. package/dist/components/EntityCollectionView/board_types.d.ts +105 -0
  24. package/dist/components/EntityCollectionView/useBoardDataController.d.ts +60 -0
  25. package/dist/components/ErrorBoundary.d.ts +4 -2
  26. package/dist/components/HomePage/DefaultHomePage.d.ts +0 -1
  27. package/dist/components/LanguageToggle.d.ts +1 -0
  28. package/dist/components/SelectableTable/SelectableTable.d.ts +5 -1
  29. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +2 -1
  30. package/dist/components/UnsavedChangesDialog.d.ts +1 -0
  31. package/dist/components/VirtualTable/VirtualTable.performance.test.d.ts +1 -0
  32. package/dist/components/VirtualTable/VirtualTableCell.d.ts +6 -0
  33. package/dist/components/VirtualTable/VirtualTableHeader.d.ts +4 -1
  34. package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +1 -1
  35. package/dist/components/VirtualTable/VirtualTableProps.d.ts +17 -1
  36. package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +1 -0
  37. package/dist/components/VirtualTable/types.d.ts +3 -0
  38. package/dist/components/index.d.ts +4 -0
  39. package/dist/contexts/index.d.ts +10 -0
  40. package/dist/core/DrawerNavigationGroup.d.ts +45 -0
  41. package/dist/core/index.d.ts +1 -0
  42. package/dist/editor/components/SlashCommandMenu.d.ts +6 -0
  43. package/dist/editor/components/editor-bubble-item.d.ts +8 -0
  44. package/dist/editor/components/editor-bubble.d.ts +8 -0
  45. package/dist/editor/components/image-bubble.d.ts +5 -0
  46. package/dist/editor/components/index.d.ts +16 -0
  47. package/dist/editor/components/table-bubble.d.ts +5 -0
  48. package/dist/editor/editor.d.ts +30 -0
  49. package/dist/editor/extensions/HighlightDecorationExtension.d.ts +24 -0
  50. package/dist/editor/extensions/Image/index.d.ts +6 -0
  51. package/dist/editor/extensions/Image.d.ts +6 -0
  52. package/dist/editor/extensions/TextLoadingDecorationExtension.d.ts +16 -0
  53. package/dist/editor/extensions/clipboard.d.ts +7 -0
  54. package/dist/editor/extensions/custom-keymap.d.ts +1 -0
  55. package/dist/editor/extensions/drag-and-drop.d.ts +9 -0
  56. package/dist/editor/hooks/useProseMirror.d.ts +13 -0
  57. package/dist/editor/hooks/useProseMirrorContext.d.ts +9 -0
  58. package/dist/editor/index.d.ts +2 -0
  59. package/dist/editor/markdown.d.ts +5 -0
  60. package/dist/editor/nodeViews/ImageComponent.d.ts +3 -0
  61. package/dist/editor/nodeViews/ReactNodeView.d.ts +29 -0
  62. package/dist/editor/nodeViews/TaskItemComponent.d.ts +3 -0
  63. package/dist/editor/nodeViews/index.d.ts +6 -0
  64. package/dist/editor/plugins/index.d.ts +2 -0
  65. package/dist/editor/plugins/inputrules.d.ts +6 -0
  66. package/dist/editor/plugins/placeholderPlugin.d.ts +3 -0
  67. package/dist/editor/plugins/slashCommandPlugin.d.ts +12 -0
  68. package/dist/editor/schema.d.ts +2 -0
  69. package/dist/editor/selectors/ai-selector.d.ts +0 -0
  70. package/dist/editor/selectors/color-selector.d.ts +10 -0
  71. package/dist/editor/selectors/link-selector.d.ts +8 -0
  72. package/dist/editor/selectors/node-selector.d.ts +15 -0
  73. package/dist/editor/selectors/text-buttons.d.ts +1 -0
  74. package/dist/editor/types.d.ts +5 -0
  75. package/dist/editor/useProseMirror.d.ts +16 -0
  76. package/dist/editor/utils/prosemirror-utils.d.ts +6 -0
  77. package/dist/editor/utils/remove_classes.d.ts +1 -0
  78. package/dist/editor/utils/useDebouncedCallback.d.ts +1 -0
  79. package/dist/form/components/ErrorFocus.d.ts +1 -1
  80. package/dist/form/components/LocalChangesMenu.d.ts +2 -2
  81. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  82. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  83. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +1 -1
  84. package/dist/form/validation.d.ts +3 -2
  85. package/dist/hooks/index.d.ts +1 -0
  86. package/dist/hooks/useBreadcrumbsController.d.ts +16 -0
  87. package/dist/hooks/useBuildNavigationController.d.ts +0 -1
  88. package/dist/hooks/useCollapsedGroups.d.ts +6 -3
  89. package/dist/hooks/useTranslation.d.ts +17 -0
  90. package/dist/i18n/FireCMSi18nProvider.d.ts +33 -0
  91. package/dist/index.d.ts +5 -0
  92. package/dist/index.es.js +31028 -16080
  93. package/dist/index.es.js.map +1 -1
  94. package/dist/index.umd.js +29955 -15028
  95. package/dist/index.umd.js.map +1 -1
  96. package/dist/internal/useRestoreScroll.d.ts +1 -1
  97. package/dist/locales/de.d.ts +2 -0
  98. package/dist/locales/en.d.ts +10 -0
  99. package/dist/locales/es.d.ts +10 -0
  100. package/dist/locales/fr.d.ts +2 -0
  101. package/dist/locales/hi.d.ts +2 -0
  102. package/dist/locales/it.d.ts +2 -0
  103. package/dist/locales/pt.d.ts +7 -0
  104. package/dist/preview/PropertyPreviewProps.d.ts +5 -0
  105. package/dist/preview/components/DatePreview.d.ts +13 -3
  106. package/dist/preview/components/ImagePreview.d.ts +5 -1
  107. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  108. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  109. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +1 -1
  110. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +1 -1
  111. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +1 -1
  112. package/dist/types/analytics.d.ts +1 -1
  113. package/dist/types/collections.d.ts +88 -2
  114. package/dist/types/customization_controller.d.ts +2 -1
  115. package/dist/types/datasource.d.ts +0 -1
  116. package/dist/types/entities.d.ts +1 -0
  117. package/dist/types/firecms.d.ts +2 -1
  118. package/dist/types/index.d.ts +1 -0
  119. package/dist/types/navigation.d.ts +2 -2
  120. package/dist/types/plugins.d.ts +69 -1
  121. package/dist/types/properties.d.ts +277 -12
  122. package/dist/types/storage.d.ts +9 -0
  123. package/dist/types/translations.d.ts +669 -0
  124. package/dist/util/__tests__/conditions.test.d.ts +1 -0
  125. package/dist/util/__tests__/objects.test.d.ts +1 -0
  126. package/dist/util/conditions.d.ts +26 -0
  127. package/dist/util/entities.d.ts +2 -3
  128. package/dist/util/index.d.ts +3 -1
  129. package/dist/util/lazy_eager.d.ts +7 -0
  130. package/dist/util/objects.d.ts +1 -0
  131. package/dist/util/property_utils.d.ts +2 -1
  132. package/dist/util/resolutions.d.ts +3 -3
  133. package/dist/util/useStorageUploadController.d.ts +11 -2
  134. package/package.json +52 -12
  135. package/src/app/Scaffold.tsx +20 -19
  136. package/src/components/AIIcon.tsx +41 -0
  137. package/src/components/ArrayContainer.tsx +7 -8
  138. package/src/components/ClearFilterSortButton.tsx +25 -19
  139. package/src/components/ConfirmationDialog.tsx +4 -4
  140. package/src/components/DeleteEntityDialog.tsx +12 -11
  141. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +82 -43
  142. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +130 -79
  143. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +121 -104
  144. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +132 -103
  145. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +6 -3
  146. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +24 -44
  147. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +90 -49
  148. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +1 -1
  149. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -2
  150. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +11 -11
  151. package/src/components/EntityCollectionView/Board.tsx +324 -0
  152. package/src/components/EntityCollectionView/BoardColumn.tsx +158 -0
  153. package/src/components/EntityCollectionView/BoardColumnTitle.tsx +45 -0
  154. package/src/components/EntityCollectionView/BoardSortableList.tsx +174 -0
  155. package/src/components/EntityCollectionView/CollectionDataErrorBanner.tsx +43 -0
  156. package/src/components/EntityCollectionView/EntityBoardCard.tsx +212 -0
  157. package/src/components/EntityCollectionView/EntityCard.tsx +235 -0
  158. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +706 -0
  159. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +236 -0
  160. package/src/components/EntityCollectionView/EntityCollectionView.tsx +531 -209
  161. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +35 -22
  162. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +86 -15
  163. package/src/components/EntityCollectionView/FiltersDialog.tsx +252 -0
  164. package/src/components/EntityCollectionView/ViewModeToggle.tsx +202 -0
  165. package/src/components/EntityCollectionView/board_types.ts +113 -0
  166. package/src/components/EntityCollectionView/useBoardDataController.tsx +490 -0
  167. package/src/components/EntityJsonPreview.tsx +2 -1
  168. package/src/components/EntityPreview.tsx +1 -1
  169. package/src/components/EntityView.tsx +3 -2
  170. package/src/components/ErrorBoundary.tsx +27 -15
  171. package/src/components/ErrorTooltip.tsx +2 -1
  172. package/src/components/HomePage/DefaultHomePage.tsx +65 -22
  173. package/src/components/HomePage/HomePageDnD.tsx +59 -42
  174. package/src/components/HomePage/NavigationCard.tsx +20 -18
  175. package/src/components/HomePage/NavigationGroup.tsx +20 -17
  176. package/src/components/HomePage/RenameGroupDialog.tsx +15 -15
  177. package/src/components/HomePage/SmallNavigationCard.tsx +10 -9
  178. package/src/components/LanguageToggle.tsx +66 -0
  179. package/src/components/NotFoundPage.tsx +5 -3
  180. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +12 -17
  181. package/src/components/ReferenceWidget.tsx +5 -6
  182. package/src/components/SearchIconsView.tsx +3 -1
  183. package/src/components/SelectableTable/SelectableTable.tsx +75 -67
  184. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +7 -6
  185. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +50 -40
  186. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +53 -40
  187. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +60 -58
  188. package/src/components/UnsavedChangesDialog.tsx +6 -6
  189. package/src/components/UserDisplay.tsx +4 -4
  190. package/src/components/VirtualTable/VirtualTable.performance.test.tsx +387 -0
  191. package/src/components/VirtualTable/VirtualTable.tsx +277 -121
  192. package/src/components/VirtualTable/VirtualTableCell.tsx +18 -2
  193. package/src/components/VirtualTable/VirtualTableHeader.tsx +76 -64
  194. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +163 -42
  195. package/src/components/VirtualTable/VirtualTableProps.tsx +21 -2
  196. package/src/components/VirtualTable/VirtualTableRow.tsx +1 -1
  197. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +3 -0
  198. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +19 -6
  199. package/src/components/VirtualTable/types.tsx +3 -0
  200. package/src/components/common/default_entity_actions.tsx +4 -0
  201. package/src/components/common/useColumnsIds.tsx +95 -3
  202. package/src/components/common/useDataSourceTableController.tsx +12 -4
  203. package/src/components/index.tsx +5 -0
  204. package/src/contexts/BreacrumbsContext.tsx +15 -8
  205. package/src/contexts/index.ts +10 -0
  206. package/src/core/DefaultAppBar.tsx +49 -32
  207. package/src/core/DefaultDrawer.tsx +49 -57
  208. package/src/core/DrawerNavigationGroup.tsx +120 -0
  209. package/src/core/DrawerNavigationItem.tsx +4 -3
  210. package/src/core/EntityEditView.tsx +94 -50
  211. package/src/core/EntityEditViewFormActions.tsx +24 -17
  212. package/src/core/EntitySidePanel.tsx +34 -30
  213. package/src/core/FireCMS.tsx +33 -6
  214. package/src/core/SideDialogs.tsx +4 -2
  215. package/src/core/field_configs.tsx +18 -11
  216. package/src/core/index.tsx +1 -0
  217. package/src/editor/components/SlashCommandMenu.tsx +516 -0
  218. package/src/editor/components/editor-bubble-item.tsx +32 -0
  219. package/src/editor/components/editor-bubble.tsx +118 -0
  220. package/src/editor/components/image-bubble.tsx +156 -0
  221. package/src/editor/components/index.ts +14 -0
  222. package/src/editor/components/table-bubble.tsx +165 -0
  223. package/src/editor/editor.tsx +455 -0
  224. package/src/editor/extensions/HighlightDecorationExtension.ts +114 -0
  225. package/src/editor/extensions/Image/index.ts +133 -0
  226. package/src/editor/extensions/Image.ts +159 -0
  227. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +107 -0
  228. package/src/editor/extensions/clipboard.ts +72 -0
  229. package/src/editor/extensions/custom-keymap.ts +24 -0
  230. package/src/editor/extensions/drag-and-drop.tsx +480 -0
  231. package/src/editor/hooks/useProseMirror.ts +124 -0
  232. package/src/editor/hooks/useProseMirrorContext.ts +15 -0
  233. package/src/editor/index.ts +2 -0
  234. package/src/editor/markdown.ts +172 -0
  235. package/src/editor/nodeViews/ImageComponent.tsx +20 -0
  236. package/src/editor/nodeViews/ReactNodeView.tsx +89 -0
  237. package/src/editor/nodeViews/TaskItemComponent.tsx +29 -0
  238. package/src/editor/nodeViews/index.ts +35 -0
  239. package/src/editor/plugins/index.ts +58 -0
  240. package/src/editor/plugins/inputrules.ts +82 -0
  241. package/src/editor/plugins/placeholderPlugin.ts +55 -0
  242. package/src/editor/plugins/slashCommandPlugin.ts +61 -0
  243. package/src/editor/schema.ts +240 -0
  244. package/src/editor/selectors/ai-selector.tsx +111 -0
  245. package/src/editor/selectors/color-selector.tsx +200 -0
  246. package/src/editor/selectors/link-selector.tsx +118 -0
  247. package/src/editor/selectors/node-selector.tsx +157 -0
  248. package/src/editor/selectors/text-buttons.tsx +86 -0
  249. package/src/editor/types.ts +6 -0
  250. package/src/editor/useProseMirror.ts +126 -0
  251. package/src/editor/utils/prosemirror-utils.ts +108 -0
  252. package/src/editor/utils/remove_classes.ts +17 -0
  253. package/src/editor/utils/useDebouncedCallback.ts +25 -0
  254. package/src/form/EntityForm.tsx +150 -75
  255. package/src/form/EntityFormActions.tsx +19 -12
  256. package/src/form/PropertyFieldBinding.tsx +68 -51
  257. package/src/form/components/ErrorFocus.tsx +3 -3
  258. package/src/form/components/LocalChangesMenu.tsx +19 -19
  259. package/src/form/components/StorageItemPreview.tsx +5 -3
  260. package/src/form/components/StorageUploadProgress.tsx +22 -6
  261. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +18 -5
  262. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +22 -10
  263. package/src/form/field_bindings/BlockFieldBinding.tsx +26 -9
  264. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -17
  265. package/src/form/field_bindings/KeyValueFieldBinding.tsx +46 -25
  266. package/src/form/field_bindings/MapFieldBinding.tsx +88 -70
  267. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +93 -52
  268. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +15 -1
  269. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +25 -11
  270. package/src/form/field_bindings/ReferenceFieldBinding.tsx +25 -11
  271. package/src/form/field_bindings/RepeatFieldBinding.tsx +21 -6
  272. package/src/form/field_bindings/SelectFieldBinding.tsx +7 -5
  273. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +110 -92
  274. package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -14
  275. package/src/form/field_bindings/TextFieldBinding.tsx +77 -38
  276. package/src/form/field_bindings/UserSelectFieldBinding.tsx +7 -5
  277. package/src/form/validation.ts +245 -160
  278. package/src/hooks/index.tsx +1 -0
  279. package/src/hooks/useBreadcrumbsController.tsx +18 -0
  280. package/src/hooks/useBuildNavigationController.tsx +91 -41
  281. package/src/hooks/useCollapsedGroups.ts +18 -9
  282. package/src/hooks/useTranslation.ts +31 -0
  283. package/src/hooks/useValidateAuthenticator.tsx +1 -1
  284. package/src/i18n/FireCMSi18nProvider.tsx +160 -0
  285. package/src/index.ts +5 -0
  286. package/src/internal/useBuildDataSource.ts +68 -34
  287. package/src/internal/useBuildSideDialogsController.tsx +11 -8
  288. package/src/internal/useBuildSideEntityController.tsx +24 -24
  289. package/src/internal/useRestoreScroll.tsx +26 -14
  290. package/src/locales/de.ts +718 -0
  291. package/src/locales/en.ts +730 -0
  292. package/src/locales/es.ts +730 -0
  293. package/src/locales/fr.ts +718 -0
  294. package/src/locales/hi.ts +718 -0
  295. package/src/locales/it.ts +718 -0
  296. package/src/locales/pt.ts +727 -0
  297. package/src/preview/PropertyPreview.tsx +43 -33
  298. package/src/preview/PropertyPreviewProps.tsx +6 -0
  299. package/src/preview/components/DatePreview.tsx +72 -4
  300. package/src/preview/components/EmptyValue.tsx +1 -1
  301. package/src/preview/components/ImagePreview.tsx +37 -21
  302. package/src/preview/components/ReferencePreview.tsx +8 -2
  303. package/src/preview/components/StorageThumbnail.tsx +16 -12
  304. package/src/preview/components/UrlComponentPreview.tsx +32 -27
  305. package/src/preview/components/UserPreview.tsx +3 -1
  306. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +9 -7
  307. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +11 -9
  308. package/src/preview/property_previews/ArrayPropertyPreview.tsx +26 -24
  309. package/src/preview/property_previews/MapPropertyPreview.tsx +49 -27
  310. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +61 -56
  311. package/src/routes/CustomCMSRoute.tsx +1 -0
  312. package/src/routes/FireCMSRoute.tsx +87 -65
  313. package/src/types/analytics.ts +10 -0
  314. package/src/types/collections.ts +97 -3
  315. package/src/types/customization_controller.tsx +2 -1
  316. package/src/types/datasource.ts +54 -56
  317. package/src/types/entities.ts +10 -0
  318. package/src/types/firecms.tsx +2 -1
  319. package/src/types/index.ts +1 -0
  320. package/src/types/navigation.ts +2 -2
  321. package/src/types/plugins.tsx +77 -1
  322. package/src/types/properties.ts +369 -37
  323. package/src/types/storage.ts +11 -1
  324. package/src/types/translations.ts +752 -0
  325. package/src/util/__tests__/conditions.test.ts +506 -0
  326. package/src/util/__tests__/objects.test.ts +196 -0
  327. package/src/util/callbacks.ts +6 -3
  328. package/src/util/collections.ts +51 -6
  329. package/src/util/conditions.ts +339 -0
  330. package/src/util/entities.ts +29 -30
  331. package/src/util/entity_cache.ts +2 -1
  332. package/src/util/index.ts +3 -1
  333. package/src/util/join_collections.ts +10 -8
  334. package/src/util/lazy_eager.tsx +33 -0
  335. package/src/util/objects.ts +46 -13
  336. package/src/util/{references.ts → previews.ts} +16 -2
  337. package/src/util/property_utils.tsx +37 -11
  338. package/src/util/resolutions.ts +62 -58
  339. package/src/util/useStorageUploadController.tsx +34 -30
  340. /package/dist/util/{references.d.ts → previews.d.ts} +0 -0
@@ -1,7 +1,6 @@
1
1
  import { Blocker, useBlocker, useLocation } from "react-router";
2
- import { EntityEditView } from "../core/EntityEditView";
2
+ import React, { useEffect, useRef, useState } from "react";
3
3
  import { useNavigationController } from "../hooks";
4
- import { useEffect, useRef, useState } from "react";
5
4
  import { useNavigate } from "react-router-dom";
6
5
  import {
7
6
  getNavigationEntriesFromPath,
@@ -11,7 +10,11 @@ import {
11
10
  } from "../util/navigation_from_path";
12
11
  import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
13
12
  import { toArray } from "../util/arrays";
14
- import { EntityCollectionView, NotFoundPage } from "../components";
13
+ import { NotFoundPage } from "../components";
14
+ import { lazyEager } from "../util/lazy_eager";
15
+
16
+ const EntityEditView = lazyEager<typeof import("../core/EntityEditView")["EntityEditView"]>(() => import("../core/EntityEditView"), "EntityEditView");
17
+ const EntityCollectionView = lazyEager<typeof import("../components/EntityCollectionView/EntityCollectionView")["EntityCollectionView"]>(() => import("../components/EntityCollectionView/EntityCollectionView"), "EntityCollectionView");
15
18
  import { UnsavedChangesDialog } from "../components/UnsavedChangesDialog";
16
19
  import { EntityCollection } from "../types";
17
20
 
@@ -35,22 +38,34 @@ export function FireCMSRoute() {
35
38
  });
36
39
 
37
40
  useEffect(() => {
41
+ const lastEntry = navigationEntries[navigationEntries.length - 1];
42
+ const isViewingCollection = lastEntry?.type === "collection";
43
+
38
44
  breadcrumbs.set({
39
- breadcrumbs: navigationEntries.map(entry => {
45
+ breadcrumbs: navigationEntries.map((entry, index) => {
46
+ const isLastEntry = index === navigationEntries.length - 1;
47
+
40
48
  if (entry.type === "entity") {
41
49
  return ({
42
50
  title: entry.entityId,
43
51
  url: navigation.buildUrlCollectionPath(entry.fullPath)
52
+ // count: undefined (not applicable for entities)
44
53
  });
45
54
  } else if (entry.type === "custom_view") {
46
55
  return ({
47
56
  title: entry.view.name,
48
57
  url: navigation.buildUrlCollectionPath(entry.fullPath)
58
+ // count: undefined (not applicable for custom views)
49
59
  });
50
60
  } else if (entry.type === "collection") {
61
+ // Only show count badge (loading state) when viewing this collection directly
62
+ // Don't show count for parent collections when viewing an entity
63
+ const showCount = isLastEntry && isViewingCollection;
51
64
  return ({
52
65
  title: entry.collection.name,
53
- url: navigation.buildUrlCollectionPath(entry.fullPath)
66
+ url: navigation.buildUrlCollectionPath(entry.fullPath),
67
+ id: entry.fullPath,
68
+ ...(showCount ? { count: null } : {}) // null = loading, undefined = no badge
54
69
  });
55
70
  } else {
56
71
  throw new Error("Unexpected navigation entry type");
@@ -59,6 +74,7 @@ export function FireCMSRoute() {
59
74
  });
60
75
  }, [navigationEntries.map(entry => entry.path).join(",")]);
61
76
 
77
+
62
78
  if (isNew) {
63
79
  return <EntityFullScreenRoute
64
80
  pathname={pathname}
@@ -75,15 +91,17 @@ export function FireCMSRoute() {
75
91
  collection = navigation.getCollection(navigationEntries[0].path);
76
92
  if (!collection)
77
93
  return null;
78
- return <EntityCollectionView
79
- key={`collection_view_${collection.id ?? collection.path}`}
80
- isSubCollection={false}
81
- parentCollectionIds={[]}
82
- fullPath={collection.path}
83
- fullIdPath={collection.id}
84
- updateUrl={true}
85
- {...collection}
86
- Actions={toArray(collection.Actions)}/>
94
+ return <React.Suspense fallback={null}>
95
+ <EntityCollectionView
96
+ key={`collection_view_${collection.id ?? collection.path}`}
97
+ isSubCollection={false}
98
+ parentCollectionIds={[]}
99
+ fullPath={collection.path}
100
+ fullIdPath={collection.id}
101
+ updateUrl={true}
102
+ {...collection}
103
+ Actions={toArray(collection.Actions)} />
104
+ </React.Suspense>;
87
105
  }
88
106
 
89
107
  if (isSidePanel) {
@@ -96,15 +114,17 @@ export function FireCMSRoute() {
96
114
  collection = navigation.getCollection(firstEntry.path);
97
115
  if (!collection)
98
116
  return null;
99
- return <EntityCollectionView
100
- key={`collection_view_${collection.id ?? collection.path}`}
101
- fullIdPath={collection.id}
102
- isSubCollection={false}
103
- parentCollectionIds={[]}
104
- fullPath={collection.path}
105
- updateUrl={true}
106
- {...collection}
107
- Actions={toArray(collection.Actions)}/>;
117
+ return <React.Suspense fallback={null}>
118
+ <EntityCollectionView
119
+ key={`collection_view_${collection.id ?? collection.path}`}
120
+ fullIdPath={collection.id}
121
+ isSubCollection={false}
122
+ parentCollectionIds={[]}
123
+ fullPath={collection.path}
124
+ updateUrl={true}
125
+ {...collection}
126
+ Actions={toArray(collection.Actions)} />
127
+ </React.Suspense>;
108
128
  }
109
129
  }
110
130
 
@@ -131,11 +151,11 @@ function getSelectedTabFromUrl(isNew: boolean, lastCustomView: NavigationViewCol
131
151
  }
132
152
 
133
153
  function EntityFullScreenRoute({
134
- pathname,
135
- navigationEntries,
136
- isNew,
137
- isCopy
138
- }: {
154
+ pathname,
155
+ navigationEntries,
156
+ isNew,
157
+ isCopy
158
+ }: {
139
159
  pathname: string;
140
160
  navigationEntries: NavigationViewInternal[],
141
161
  isNew: boolean,
@@ -178,8 +198,8 @@ function EntityFullScreenRoute({
178
198
  let blocker: Blocker | undefined = undefined;
179
199
  try {
180
200
  blocker = useBlocker(({
181
- nextLocation
182
- }) => {
201
+ nextLocation
202
+ }) => {
183
203
  if (nextLocation.pathname.startsWith(entityPath))
184
204
  return false;
185
205
  return blocked.current;
@@ -195,52 +215,54 @@ function EntityFullScreenRoute({
195
215
  }
196
216
 
197
217
  if (!isNew && !lastEntityEntry) {
198
- return <NotFoundPage/>;
218
+ return <NotFoundPage />;
199
219
  }
200
220
 
201
221
  const collection = isNew ? lastCollectionEntry!.collection : lastEntityEntry!.parentCollection;
202
222
  const fullIdPath = isNew ? lastCollectionEntry!.path : lastEntityEntry!.path;
203
223
  const collectionPath = navigation.resolveIdsFrom(fullIdPath);
204
224
  return <>
205
- <EntityEditView
206
- key={collection.id + "_" + (isNew ? "new" : (isCopy ? entityId + "_copy" : entityId))}
207
- entityId={isNew ? undefined : entityId}
208
- fullIdPath={fullIdPath}
209
- collection={collection}
210
- layout={"full_screen"}
211
- path={collectionPath}
212
- copy={isCopy}
213
- selectedTab={selectedTab ?? undefined}
214
- onValuesModified={(modified) => blocked.current = modified}
215
- onSaved={(params) => {
216
- const newSelectedTab = params.selectedTab;
217
- const newEntityId = params.entityId;
218
- if (newSelectedTab) {
219
- navigate(`${basePath}/${newEntityId}/${newSelectedTab}`, { replace: true });
220
- } else {
221
- navigate(`${basePath}/${newEntityId}`, { replace: true });
222
- }
223
- }}
224
- onTabChange={(params) => {
225
- setSelectedTab(params.selectedTab);
226
- if (isNew) {
227
- return;
228
- }
229
- const newSelectedTab = params.selectedTab;
230
- if (newSelectedTab) {
231
- navigate(`${basePath}/${entityId}/${newSelectedTab}`, { replace: true });
232
- } else {
233
- navigate(`${basePath}/${entityId}`, { replace: true });
234
- }
235
- }}
236
- parentCollectionIds={parentCollectionIds}
237
- />
225
+ <React.Suspense fallback={null}>
226
+ <EntityEditView
227
+ key={collection.id + "_" + (isNew ? "new" : (isCopy ? entityId + "_copy" : entityId))}
228
+ entityId={isNew ? undefined : entityId}
229
+ fullIdPath={fullIdPath}
230
+ collection={collection}
231
+ layout={"full_screen"}
232
+ path={collectionPath}
233
+ copy={isCopy}
234
+ selectedTab={selectedTab ?? undefined}
235
+ onValuesModified={(modified) => blocked.current = modified}
236
+ onSaved={(params) => {
237
+ const newSelectedTab = params.selectedTab;
238
+ const newEntityId = params.entityId;
239
+ if (newSelectedTab) {
240
+ navigate(`${basePath}/${newEntityId}/${newSelectedTab}`, { replace: true });
241
+ } else {
242
+ navigate(`${basePath}/${newEntityId}`, { replace: true });
243
+ }
244
+ }}
245
+ onTabChange={(params) => {
246
+ setSelectedTab(params.selectedTab);
247
+ if (isNew) {
248
+ return;
249
+ }
250
+ const newSelectedTab = params.selectedTab;
251
+ if (newSelectedTab) {
252
+ navigate(`${basePath}/${entityId}/${newSelectedTab}`, { replace: true });
253
+ } else {
254
+ navigate(`${basePath}/${entityId}`, { replace: true });
255
+ }
256
+ }}
257
+ parentCollectionIds={parentCollectionIds}
258
+ />
259
+ </React.Suspense>
238
260
 
239
261
  <UnsavedChangesDialog
240
262
  open={blocker?.state === "blocked"}
241
263
  handleOk={() => blocker?.proceed?.()}
242
264
  handleCancel={() => blocker?.reset?.()}
243
- body={"You have unsaved changes in this entity."}/>
265
+ body={"You have unsaved changes in this entity."} />
244
266
 
245
267
  </>;
246
268
  }
@@ -34,5 +34,15 @@ export type CMSAnalyticsEvent =
34
34
 
35
35
  | "collection_inline_editing"
36
36
 
37
+ | "view_mode_changed"
38
+
39
+ | "kanban_card_moved"
40
+ | "kanban_column_reorder"
41
+ | "kanban_property_changed"
42
+ | "kanban_new_entity_in_column"
43
+ | "kanban_backfill_order"
44
+
45
+ | "card_view_entity_click"
46
+
37
47
  | "unmapped_event"
38
48
  ;
@@ -163,6 +163,31 @@ export interface EntityCollection<M extends Record<string, any> = any, USER exte
163
163
  */
164
164
  subcollections?: EntityCollection<any, any>[];
165
165
 
166
+ /**
167
+ * You can group subcollections and custom views into dropdown menus
168
+ * in the entity view tabs. Views listed in a group will be removed
169
+ * from the top-level tabs and shown under a single dropdown instead.
170
+ *
171
+ * @example
172
+ * ```tsx
173
+ * const productsCollection = buildCollection({
174
+ * id: "products",
175
+ * path: "products",
176
+ * name: "Products",
177
+ * properties: { ... },
178
+ * subcollections: [localesCollection, reviewsCollection],
179
+ * entityViews: [sampleView],
180
+ * viewGroups: [
181
+ * {
182
+ * name: "Related data",
183
+ * views: ["locales", "reviews", "sample_view"]
184
+ * }
185
+ * ]
186
+ * });
187
+ * ```
188
+ */
189
+ viewGroups?: ViewGroup[];
190
+
166
191
  /**
167
192
  * This interface defines all the callbacks that can be used when an entity
168
193
  * is being created, updated or deleted.
@@ -364,8 +389,76 @@ export interface EntityCollection<M extends Record<string, any> = any, USER exte
364
389
  * Defaults to `manual_apply`.
365
390
  */
366
391
  localChangesBackup?: "manual_apply" | "auto_apply" | false;
392
+
393
+ /**
394
+ * Default view mode for displaying this collection.
395
+ * - "table": Display entities in a spreadsheet-like table (default)
396
+ * - "cards": Display entities as a grid of cards with thumbnails
397
+ * - "kanban": Display entities in a Kanban board grouped by a property
398
+ * Defaults to "table".
399
+ */
400
+ defaultViewMode?: ViewMode;
401
+
402
+ /**
403
+ * Which view modes are available for this collection.
404
+ * Possible values: "table", "cards", "kanban".
405
+ * Defaults to all three: ["table", "cards", "kanban"].
406
+ * Note: "kanban" will only be available if the collection has at least
407
+ * one string property with enumValues defined, regardless of this setting.
408
+ */
409
+ enabledViews?: ViewMode[];
410
+
411
+ /**
412
+ * Configuration for Kanban board view mode.
413
+ * When set, the Kanban view mode becomes available.
414
+ */
415
+ kanban?: KanbanConfig<M>;
416
+
417
+ /**
418
+ * Property key to use for ordering items.
419
+ * Must reference a number property. When items are reordered,
420
+ * this property will be updated to reflect the new order using
421
+ * fractional indexing. Used by Kanban view for ordering within columns
422
+ * and can be used for general ordering purposes.
423
+ */
424
+ orderProperty?: Extract<keyof M, string>;
367
425
  }
368
426
 
427
+ /**
428
+ * Configuration for Kanban board view mode.
429
+ * @group Collections
430
+ */
431
+ export interface KanbanConfig<M extends Record<string, any> = any> {
432
+ /**
433
+ * Property key to use for Kanban board columns.
434
+ * Must reference a string property with enumValues defined.
435
+ * Entities will be grouped into columns based on this property's value.
436
+ * The column order is determined by the order of enumValues in the property.
437
+ */
438
+ columnProperty: Extract<keyof M, string>;
439
+ }
440
+
441
+ /**
442
+ * You can group subcollections and custom views into dropdown menus in the entity view tabs.
443
+ * @group Collections
444
+ */
445
+ export interface ViewGroup {
446
+ /**
447
+ * Name of the group
448
+ */
449
+ name: string;
450
+ /**
451
+ * Array of subcollection paths/ids or custom view keys
452
+ */
453
+ views: string[];
454
+ }
455
+
456
+ /**
457
+ * View mode for displaying a collection.
458
+ * @group Collections
459
+ */
460
+ export type ViewMode = "table" | "cards" | "kanban";
461
+
369
462
  /**
370
463
  * Parameter passed to the `Actions` prop in the collection configuration.
371
464
  * The component will receive this prop when it is rendered in the collection
@@ -413,9 +506,10 @@ export interface CollectionActionsProps<M extends Record<string, any> = any, USE
413
506
  context: FireCMSContext<USER>;
414
507
 
415
508
  /**
416
- * Count of the entities in this collection
509
+ * Count of the entities in this collection.
510
+ * undefined means the count is still loading.
417
511
  */
418
- collectionEntitiesCount: number;
512
+ collectionEntitiesCount?: number;
419
513
 
420
514
  }
421
515
 
@@ -647,7 +741,7 @@ export type EntityTableController<M extends Record<string, any> = any> = {
647
741
  paginationEnabled?: boolean;
648
742
  pageSize?: number;
649
743
  checkFilterCombination?: (filterValues: FilterValues<any>,
650
- sortBy?: [string, "asc" | "desc"]) => boolean;
744
+ sortBy?: [string, "asc" | "desc"]) => boolean;
651
745
  popupCell?: SelectedCellProps<M>;
652
746
  setPopupCell?: (popupCell?: SelectedCellProps<M>) => void;
653
747
 
@@ -42,7 +42,8 @@ export type CustomizationController = {
42
42
  dateTimeFormat?: string;
43
43
 
44
44
  /**
45
- * Locale of the CMS, currently only affecting dates
45
+ * Locale of the CMS.
46
+ * Affects date formatting.
46
47
  */
47
48
  locale?: Locale;
48
49
 
@@ -19,9 +19,9 @@ export interface FetchEntityProps<M extends Record<string, any> = any> {
19
19
  export type ListenEntityProps<M extends Record<string, any> = any> =
20
20
  FetchEntityProps<M>
21
21
  & {
22
- onUpdate: (entity: Entity<M>) => void,
23
- onError?: (error: Error) => void,
24
- }
22
+ onUpdate: (entity: Entity<M>) => void,
23
+ onError?: (error: Error) => void,
24
+ }
25
25
 
26
26
  /**
27
27
  * @group Datasource
@@ -88,15 +88,15 @@ export interface DataSource {
88
88
  * @see useCollectionFetch if you need this functionality implemented as a hook
89
89
  */
90
90
  fetchCollection<M extends Record<string, any> = any>({
91
- path,
92
- collection,
93
- filter,
94
- limit,
95
- startAfter,
96
- orderBy,
97
- order,
98
- searchString
99
- }: FetchCollectionProps<M>
91
+ path,
92
+ collection,
93
+ filter,
94
+ limit,
95
+ startAfter,
96
+ orderBy,
97
+ order,
98
+ searchString
99
+ }: FetchCollectionProps<M>
100
100
  ): Promise<Entity<M>[]>;
101
101
 
102
102
  /**
@@ -137,11 +137,11 @@ export interface DataSource {
137
137
  * @param collection
138
138
  */
139
139
  fetchEntity<M extends Record<string, any> = any>({
140
- path,
141
- entityId,
142
- databaseId,
143
- collection
144
- }: FetchEntityProps<M>
140
+ path,
141
+ entityId,
142
+ databaseId,
143
+ collection
144
+ }: FetchEntityProps<M>
145
145
  ): Promise<Entity<M> | undefined>;
146
146
 
147
147
  /**
@@ -154,12 +154,12 @@ export interface DataSource {
154
154
  * @return Function to cancel subscription
155
155
  */
156
156
  listenEntity?<M extends Record<string, any> = any>({
157
- path,
158
- entityId,
159
- collection,
160
- onUpdate,
161
- onError
162
- }: ListenEntityProps<M>): () => void;
157
+ path,
158
+ entityId,
159
+ collection,
160
+ onUpdate,
161
+ onError
162
+ }: ListenEntityProps<M>): () => void;
163
163
 
164
164
  /**
165
165
  * Save entity to the specified path
@@ -274,14 +274,14 @@ export interface DataSourceDelegate {
274
274
  * @see useCollectionFetch if you need this functionality implemented as a hook
275
275
  */
276
276
  fetchCollection<M extends Record<string, any> = any>({
277
- path,
278
- filter,
279
- limit,
280
- startAfter,
281
- orderBy,
282
- order,
283
- searchString
284
- }: FetchCollectionDelegateProps<M>): Promise<Entity<M>[]>;
277
+ path,
278
+ filter,
279
+ limit,
280
+ startAfter,
281
+ orderBy,
282
+ order,
283
+ searchString
284
+ }: FetchCollectionDelegateProps<M>): Promise<Entity<M>[]>;
285
285
 
286
286
  /**
287
287
  * Listen to a collection in a given path. If you don't implement this method
@@ -299,16 +299,16 @@ export interface DataSourceDelegate {
299
299
  * @see useCollectionFetch if you need this functionality implemented as a hook
300
300
  */
301
301
  listenCollection?<M extends Record<string, any> = any>({
302
- path,
303
- filter,
304
- limit,
305
- startAfter,
306
- searchString,
307
- orderBy,
308
- order,
309
- onUpdate,
310
- onError
311
- }: ListenCollectionDelegateProps<M>): () => void;
302
+ path,
303
+ filter,
304
+ limit,
305
+ startAfter,
306
+ searchString,
307
+ orderBy,
308
+ order,
309
+ onUpdate,
310
+ onError
311
+ }: ListenCollectionDelegateProps<M>): () => void;
312
312
 
313
313
  /**
314
314
  * Retrieve an entity given a path and a collection
@@ -316,9 +316,9 @@ export interface DataSourceDelegate {
316
316
  * @param entityId
317
317
  */
318
318
  fetchEntity<M extends Record<string, any> = any>({
319
- path,
320
- entityId,
321
- }: FetchEntityProps<M>): Promise<Entity<M> | undefined>;
319
+ path,
320
+ entityId,
321
+ }: FetchEntityProps<M>): Promise<Entity<M> | undefined>;
322
322
 
323
323
  /**
324
324
  * Get realtime updates on one entity.
@@ -330,11 +330,11 @@ export interface DataSourceDelegate {
330
330
  * @return Function to cancel subscription
331
331
  */
332
332
  listenEntity?<M extends Record<string, any> = any>({
333
- path,
334
- entityId,
335
- onUpdate,
336
- onError
337
- }: ListenEntityProps<M>): () => void;
333
+ path,
334
+ entityId,
335
+ onUpdate,
336
+ onError
337
+ }: ListenEntityProps<M>): () => void;
338
338
 
339
339
  /**
340
340
  * Save entity to the specified path
@@ -344,11 +344,11 @@ export interface DataSourceDelegate {
344
344
  * @param status
345
345
  */
346
346
  saveEntity<M extends Record<string, any> = any>({
347
- path,
348
- entityId,
349
- values,
350
- status
351
- }: SaveEntityDelegateProps<M>): Promise<Entity<M>>;
347
+ path,
348
+ entityId,
349
+ values,
350
+ status
351
+ }: SaveEntityDelegateProps<M>): Promise<Entity<M>>;
352
352
 
353
353
  /**
354
354
  * Delete an entity
@@ -395,8 +395,6 @@ export interface DataSourceDelegate {
395
395
 
396
396
  cmsToDelegateModel: (data: any) => any;
397
397
 
398
- setDateToMidnight: (input?: any) => any;
399
-
400
398
  initTextSearch?: (props: {
401
399
  context: FireCMSContext,
402
400
  path: string,
@@ -65,6 +65,16 @@ export class EntityReference {
65
65
  return `${this.path}/${this.id}`;
66
66
  }
67
67
 
68
+ get pathWithIdAndDatabase() {
69
+ if (this.databaseId) {
70
+ if (this.databaseId === "(default)") {
71
+ return this.pathWithId;
72
+ }
73
+ return `${this.databaseId}:::${this.path}/${this.id}`;
74
+ }
75
+ return this.pathWithId;
76
+ }
77
+
68
78
  isEntityReference() {
69
79
  return true;
70
80
  }
@@ -111,7 +111,8 @@ export type FireCMSProps<USER extends User> = {
111
111
  dateTimeFormat?: string;
112
112
 
113
113
  /**
114
- * Locale of the CMS, currently only affecting dates
114
+ * Locale of the CMS.
115
+ * Affects date formatting.
115
116
  */
116
117
  locale?: Locale;
117
118
 
@@ -28,3 +28,4 @@ export * from "./export_import";
28
28
  export * from "./modify_collections";
29
29
  export * from "./analytics_controller";
30
30
  export * from "./customization_controller";
31
+ export * from "./translations";
@@ -252,7 +252,7 @@ export interface NavigationEntry {
252
252
  collection?: EntityCollection;
253
253
  view?: CMSView;
254
254
  description?: string;
255
- group: string;
255
+ group: string | null;
256
256
  }
257
257
 
258
258
  export type NavigationResult = {
@@ -261,7 +261,7 @@ export type NavigationResult = {
261
261
 
262
262
  navigationEntries: NavigationEntry[],
263
263
 
264
- groups: string[],
264
+ groups: (string | null)[],
265
265
 
266
266
  onNavigationEntriesUpdate: (entries: NavigationGroupMapping[]) => void;
267
267
  };