@firecms/core 3.1.0-canary.1df3b2c → 3.1.0-canary.501d471

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 (246) hide show
  1. package/dist/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +2 -2
  2. package/dist/components/EntityCollectionView/CollectionDataErrorBanner.d.ts +4 -0
  3. package/dist/components/EntityCollectionView/ViewModeToggle.d.ts +5 -10
  4. package/dist/components/ErrorBoundary.d.ts +4 -2
  5. package/dist/components/HomePage/DefaultHomePage.d.ts +0 -1
  6. package/dist/components/LanguageToggle.d.ts +1 -0
  7. package/dist/components/UnsavedChangesDialog.d.ts +1 -0
  8. package/dist/components/VirtualTable/VirtualTableHeader.d.ts +2 -1
  9. package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +1 -1
  10. package/dist/components/VirtualTable/VirtualTableProps.d.ts +6 -1
  11. package/dist/components/VirtualTable/types.d.ts +1 -0
  12. package/dist/components/index.d.ts +1 -0
  13. package/dist/core/DrawerNavigationGroup.d.ts +2 -2
  14. package/dist/editor/components/SlashCommandMenu.d.ts +6 -0
  15. package/dist/editor/components/editor-bubble-item.d.ts +8 -0
  16. package/dist/editor/components/editor-bubble.d.ts +8 -0
  17. package/dist/editor/components/image-bubble.d.ts +5 -0
  18. package/dist/editor/components/index.d.ts +16 -0
  19. package/dist/editor/components/table-bubble.d.ts +5 -0
  20. package/dist/editor/editor.d.ts +30 -0
  21. package/dist/editor/extensions/HighlightDecorationExtension.d.ts +24 -0
  22. package/dist/editor/extensions/Image/index.d.ts +6 -0
  23. package/dist/editor/extensions/Image.d.ts +6 -0
  24. package/dist/editor/extensions/TextLoadingDecorationExtension.d.ts +16 -0
  25. package/dist/editor/extensions/clipboard.d.ts +7 -0
  26. package/dist/editor/extensions/custom-keymap.d.ts +1 -0
  27. package/dist/editor/extensions/drag-and-drop.d.ts +9 -0
  28. package/dist/editor/hooks/useProseMirror.d.ts +13 -0
  29. package/dist/editor/hooks/useProseMirrorContext.d.ts +9 -0
  30. package/dist/editor/index.d.ts +2 -0
  31. package/dist/editor/markdown.d.ts +5 -0
  32. package/dist/editor/nodeViews/ImageComponent.d.ts +3 -0
  33. package/dist/editor/nodeViews/ReactNodeView.d.ts +29 -0
  34. package/dist/editor/nodeViews/TaskItemComponent.d.ts +3 -0
  35. package/dist/editor/nodeViews/index.d.ts +6 -0
  36. package/dist/editor/plugins/index.d.ts +2 -0
  37. package/dist/editor/plugins/inputrules.d.ts +6 -0
  38. package/dist/editor/plugins/placeholderPlugin.d.ts +3 -0
  39. package/dist/editor/plugins/slashCommandPlugin.d.ts +12 -0
  40. package/dist/editor/schema.d.ts +2 -0
  41. package/dist/editor/selectors/ai-selector.d.ts +0 -0
  42. package/dist/editor/selectors/color-selector.d.ts +10 -0
  43. package/dist/editor/selectors/link-selector.d.ts +8 -0
  44. package/dist/editor/selectors/node-selector.d.ts +15 -0
  45. package/dist/editor/selectors/text-buttons.d.ts +1 -0
  46. package/dist/editor/types.d.ts +5 -0
  47. package/dist/editor/useProseMirror.d.ts +16 -0
  48. package/dist/editor/utils/prosemirror-utils.d.ts +6 -0
  49. package/dist/editor/utils/remove_classes.d.ts +1 -0
  50. package/dist/editor/utils/useDebouncedCallback.d.ts +1 -0
  51. package/dist/form/components/ErrorFocus.d.ts +1 -1
  52. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  53. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +1 -1
  54. package/dist/hooks/index.d.ts +1 -0
  55. package/dist/hooks/useBuildNavigationController.d.ts +0 -1
  56. package/dist/hooks/useCollapsedGroups.d.ts +3 -3
  57. package/dist/hooks/useTranslation.d.ts +17 -0
  58. package/dist/i18n/FireCMSi18nProvider.d.ts +33 -0
  59. package/dist/index.d.ts +5 -0
  60. package/dist/index.es.js +29682 -18363
  61. package/dist/index.es.js.map +1 -1
  62. package/dist/index.umd.js +29681 -18382
  63. package/dist/index.umd.js.map +1 -1
  64. package/dist/internal/useRestoreScroll.d.ts +1 -1
  65. package/dist/locales/de.d.ts +2 -0
  66. package/dist/locales/en.d.ts +10 -0
  67. package/dist/locales/es.d.ts +10 -0
  68. package/dist/locales/fr.d.ts +2 -0
  69. package/dist/locales/hi.d.ts +2 -0
  70. package/dist/locales/it.d.ts +2 -0
  71. package/dist/locales/pt.d.ts +7 -0
  72. package/dist/types/analytics.d.ts +1 -1
  73. package/dist/types/collections.d.ts +46 -0
  74. package/dist/types/customization_controller.d.ts +2 -1
  75. package/dist/types/firecms.d.ts +2 -1
  76. package/dist/types/index.d.ts +1 -0
  77. package/dist/types/navigation.d.ts +2 -2
  78. package/dist/types/plugins.d.ts +23 -0
  79. package/dist/types/properties.d.ts +9 -8
  80. package/dist/types/storage.d.ts +1 -0
  81. package/dist/types/translations.d.ts +669 -0
  82. package/dist/util/entities.d.ts +1 -1
  83. package/dist/util/index.d.ts +1 -0
  84. package/dist/util/lazy_eager.d.ts +7 -0
  85. package/dist/util/objects.d.ts +1 -0
  86. package/dist/util/resolutions.d.ts +2 -2
  87. package/dist/util/useStorageUploadController.d.ts +10 -1
  88. package/package.json +49 -13
  89. package/src/app/Scaffold.tsx +7 -5
  90. package/src/components/AIIcon.tsx +3 -1
  91. package/src/components/ArrayContainer.tsx +6 -4
  92. package/src/components/ClearFilterSortButton.tsx +6 -3
  93. package/src/components/ConfirmationDialog.tsx +4 -2
  94. package/src/components/DeleteEntityDialog.tsx +10 -7
  95. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +9 -3
  96. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +6 -3
  97. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +3 -1
  98. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +1 -1
  99. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -2
  100. package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +11 -11
  101. package/src/components/EntityCollectionView/BoardSortableList.tsx +3 -1
  102. package/src/components/EntityCollectionView/CollectionDataErrorBanner.tsx +43 -0
  103. package/src/components/EntityCollectionView/EntityBoardCard.tsx +1 -1
  104. package/src/components/EntityCollectionView/EntityCard.tsx +4 -0
  105. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +39 -46
  106. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +17 -25
  107. package/src/components/EntityCollectionView/EntityCollectionView.tsx +71 -31
  108. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -3
  109. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +4 -2
  110. package/src/components/EntityCollectionView/FiltersDialog.tsx +8 -5
  111. package/src/components/EntityCollectionView/ViewModeToggle.tsx +37 -37
  112. package/src/components/EntityJsonPreview.tsx +2 -1
  113. package/src/components/EntityView.tsx +3 -2
  114. package/src/components/ErrorBoundary.tsx +27 -15
  115. package/src/components/HomePage/DefaultHomePage.tsx +19 -13
  116. package/src/components/HomePage/HomePageDnD.tsx +3 -1
  117. package/src/components/HomePage/NavigationGroup.tsx +3 -1
  118. package/src/components/HomePage/RenameGroupDialog.tsx +15 -13
  119. package/src/components/LanguageToggle.tsx +66 -0
  120. package/src/components/NotFoundPage.tsx +5 -3
  121. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +9 -7
  122. package/src/components/ReferenceWidget.tsx +3 -2
  123. package/src/components/SearchIconsView.tsx +3 -1
  124. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +11 -0
  125. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +15 -2
  126. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +11 -0
  127. package/src/components/UnsavedChangesDialog.tsx +6 -4
  128. package/src/components/VirtualTable/VirtualTable.performance.test.tsx +1 -0
  129. package/src/components/VirtualTable/VirtualTable.tsx +121 -116
  130. package/src/components/VirtualTable/VirtualTableHeader.tsx +59 -56
  131. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +9 -4
  132. package/src/components/VirtualTable/VirtualTableProps.tsx +7 -1
  133. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +3 -3
  134. package/src/components/VirtualTable/types.tsx +1 -0
  135. package/src/components/common/default_entity_actions.tsx +4 -0
  136. package/src/components/common/useDataSourceTableController.tsx +12 -4
  137. package/src/components/index.tsx +1 -0
  138. package/src/core/DefaultAppBar.tsx +15 -11
  139. package/src/core/DefaultDrawer.tsx +8 -2
  140. package/src/core/DrawerNavigationGroup.tsx +5 -3
  141. package/src/core/EntityEditView.tsx +54 -8
  142. package/src/core/EntityEditViewFormActions.tsx +24 -17
  143. package/src/core/EntitySidePanel.tsx +34 -30
  144. package/src/core/FireCMS.tsx +33 -6
  145. package/src/core/field_configs.tsx +18 -11
  146. package/src/editor/components/SlashCommandMenu.tsx +516 -0
  147. package/src/editor/components/editor-bubble-item.tsx +32 -0
  148. package/src/editor/components/editor-bubble.tsx +118 -0
  149. package/src/editor/components/image-bubble.tsx +156 -0
  150. package/src/editor/components/index.ts +14 -0
  151. package/src/editor/components/table-bubble.tsx +165 -0
  152. package/src/editor/editor.tsx +455 -0
  153. package/src/editor/extensions/HighlightDecorationExtension.ts +114 -0
  154. package/src/editor/extensions/Image/index.ts +133 -0
  155. package/src/editor/extensions/Image.ts +159 -0
  156. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +107 -0
  157. package/src/editor/extensions/clipboard.ts +72 -0
  158. package/src/editor/extensions/custom-keymap.ts +24 -0
  159. package/src/editor/extensions/drag-and-drop.tsx +480 -0
  160. package/src/editor/hooks/useProseMirror.ts +124 -0
  161. package/src/editor/hooks/useProseMirrorContext.ts +15 -0
  162. package/src/editor/index.ts +2 -0
  163. package/src/editor/markdown.ts +172 -0
  164. package/src/editor/nodeViews/ImageComponent.tsx +20 -0
  165. package/src/editor/nodeViews/ReactNodeView.tsx +89 -0
  166. package/src/editor/nodeViews/TaskItemComponent.tsx +29 -0
  167. package/src/editor/nodeViews/index.ts +35 -0
  168. package/src/editor/plugins/index.ts +58 -0
  169. package/src/editor/plugins/inputrules.ts +82 -0
  170. package/src/editor/plugins/placeholderPlugin.ts +55 -0
  171. package/src/editor/plugins/slashCommandPlugin.ts +61 -0
  172. package/src/editor/schema.ts +240 -0
  173. package/src/editor/selectors/ai-selector.tsx +111 -0
  174. package/src/editor/selectors/color-selector.tsx +200 -0
  175. package/src/editor/selectors/link-selector.tsx +118 -0
  176. package/src/editor/selectors/node-selector.tsx +157 -0
  177. package/src/editor/selectors/text-buttons.tsx +86 -0
  178. package/src/editor/types.ts +6 -0
  179. package/src/editor/useProseMirror.ts +126 -0
  180. package/src/editor/utils/prosemirror-utils.ts +108 -0
  181. package/src/editor/utils/remove_classes.ts +17 -0
  182. package/src/editor/utils/useDebouncedCallback.ts +25 -0
  183. package/src/form/EntityForm.tsx +149 -67
  184. package/src/form/EntityFormActions.tsx +19 -12
  185. package/src/form/PropertyFieldBinding.tsx +10 -8
  186. package/src/form/components/ErrorFocus.tsx +3 -3
  187. package/src/form/components/LocalChangesMenu.tsx +13 -13
  188. package/src/form/components/StorageItemPreview.tsx +3 -2
  189. package/src/form/components/StorageUploadProgress.tsx +18 -3
  190. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +18 -5
  191. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +22 -9
  192. package/src/form/field_bindings/BlockFieldBinding.tsx +26 -9
  193. package/src/form/field_bindings/DateTimeFieldBinding.tsx +1 -1
  194. package/src/form/field_bindings/KeyValueFieldBinding.tsx +46 -24
  195. package/src/form/field_bindings/MapFieldBinding.tsx +27 -11
  196. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +74 -37
  197. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +15 -1
  198. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +25 -11
  199. package/src/form/field_bindings/ReferenceFieldBinding.tsx +25 -11
  200. package/src/form/field_bindings/RepeatFieldBinding.tsx +21 -6
  201. package/src/form/field_bindings/SelectFieldBinding.tsx +7 -5
  202. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +110 -92
  203. package/src/form/field_bindings/SwitchFieldBinding.tsx +31 -14
  204. package/src/form/field_bindings/TextFieldBinding.tsx +10 -7
  205. package/src/form/field_bindings/UserSelectFieldBinding.tsx +7 -5
  206. package/src/hooks/index.tsx +1 -0
  207. package/src/hooks/useBuildNavigationController.tsx +49 -22
  208. package/src/hooks/useCollapsedGroups.ts +7 -6
  209. package/src/hooks/useTranslation.ts +31 -0
  210. package/src/hooks/useValidateAuthenticator.tsx +1 -1
  211. package/src/i18n/FireCMSi18nProvider.tsx +160 -0
  212. package/src/index.ts +5 -0
  213. package/src/internal/useBuildDataSource.ts +1 -2
  214. package/src/internal/useBuildSideEntityController.tsx +22 -20
  215. package/src/locales/de.ts +718 -0
  216. package/src/locales/en.ts +730 -0
  217. package/src/locales/es.ts +730 -0
  218. package/src/locales/fr.ts +718 -0
  219. package/src/locales/hi.ts +718 -0
  220. package/src/locales/it.ts +718 -0
  221. package/src/locales/pt.ts +727 -0
  222. package/src/preview/PropertyPreview.tsx +4 -2
  223. package/src/preview/components/ReferencePreview.tsx +2 -1
  224. package/src/preview/components/UrlComponentPreview.tsx +4 -2
  225. package/src/preview/components/UserPreview.tsx +3 -1
  226. package/src/preview/property_previews/MapPropertyPreview.tsx +49 -27
  227. package/src/routes/FireCMSRoute.tsx +63 -54
  228. package/src/types/analytics.ts +10 -0
  229. package/src/types/collections.ts +49 -0
  230. package/src/types/customization_controller.tsx +2 -1
  231. package/src/types/firecms.tsx +2 -1
  232. package/src/types/index.ts +1 -0
  233. package/src/types/navigation.ts +2 -2
  234. package/src/types/plugins.tsx +26 -0
  235. package/src/types/properties.ts +12 -10
  236. package/src/types/storage.ts +2 -1
  237. package/src/types/translations.ts +752 -0
  238. package/src/util/entities.ts +1 -1
  239. package/src/util/index.ts +1 -0
  240. package/src/util/join_collections.ts +10 -8
  241. package/src/util/lazy_eager.tsx +33 -0
  242. package/src/util/objects.ts +15 -0
  243. package/src/util/previews.ts +2 -2
  244. package/src/util/property_utils.tsx +1 -1
  245. package/src/util/resolutions.ts +5 -3
  246. package/src/util/useStorageUploadController.tsx +23 -29
@@ -28,7 +28,8 @@ import {
28
28
  useCustomizationController,
29
29
  useFireCMSContext,
30
30
  useSideEntityController,
31
- useSnackbarController
31
+ useSnackbarController,
32
+ useTranslation
32
33
  } from "../hooks";
33
34
  import { EntityFormActionsProps } from "../form/EntityFormActions";
34
35
  import { SideDialogController, useSideDialogContext } from "./SideDialogs";
@@ -56,6 +57,7 @@ export function EntityEditViewFormActions({
56
57
  const sideEntityController = useSideEntityController();
57
58
  const sideDialogContext = useSideDialogContext();
58
59
  const customizationController = useCustomizationController();
60
+ const { t } = useTranslation();
59
61
 
60
62
  const entityActions = useMemo((): EntityAction[] => {
61
63
  const customEntityActions = (collection.entityActions ?? [])
@@ -90,7 +92,8 @@ export function EntityEditViewFormActions({
90
92
  openEntityMode,
91
93
  navigateBack,
92
94
  formContext,
93
- formex
95
+ formex,
96
+ t
94
97
  })
95
98
  : buildSideActions({
96
99
  savingError,
@@ -106,7 +109,8 @@ export function EntityEditViewFormActions({
106
109
  openEntityMode,
107
110
  navigateBack,
108
111
  formContext,
109
- formex
112
+ formex,
113
+ t
110
114
  });
111
115
  }
112
116
 
@@ -123,8 +127,9 @@ type ActionsViewProps<M extends object> = {
123
127
  pluginActions?: React.ReactNode[],
124
128
  openEntityMode: "side_panel" | "full_screen";
125
129
  navigateBack: () => void;
126
- formContext: FormContext,
130
+ formContext: FormContext;
127
131
  formex: FormexController<any>;
132
+ t: any;
128
133
  };
129
134
 
130
135
  function buildBottomActions<M extends object>({
@@ -141,7 +146,8 @@ function buildBottomActions<M extends object>({
141
146
  openEntityMode,
142
147
  navigateBack,
143
148
  formContext,
144
- formex
149
+ formex,
150
+ t
145
151
  }: ActionsViewProps<M>) {
146
152
 
147
153
  const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;
@@ -191,7 +197,7 @@ function buildBottomActions<M extends object>({
191
197
  color="primary"
192
198
  disabled={disabled || formex.isSubmitting}
193
199
  type="reset">
194
- {status === "existing" ? "Discard" : "Clear"}
200
+ {status === "existing" ? t("discard") : t("clear")}
195
201
  </Button>
196
202
  <Button variant={canClose ? "text" : "filled"}
197
203
  color="primary"
@@ -200,9 +206,9 @@ function buildBottomActions<M extends object>({
200
206
  onClick={() => {
201
207
  sideDialogContext.setPendingClose(false);
202
208
  }}>
203
- {status === "existing" && "Save"}
204
- {status === "copy" && "Create copy"}
205
- {status === "new" && "Create"}
209
+ {status === "existing" && t("save")}
210
+ {status === "copy" && t("create_copy")}
211
+ {status === "new" && t("create")}
206
212
  </Button>
207
213
  {canClose && <LoadingButton variant="filled"
208
214
  color="primary"
@@ -212,9 +218,9 @@ function buildBottomActions<M extends object>({
212
218
  onClick={() => {
213
219
  sideDialogContext.setPendingClose?.(true);
214
220
  }}>
215
- {status === "existing" && "Save and close"}
216
- {status === "copy" && "Create copy and close"}
217
- {status === "new" && "Create and close"}
221
+ {status === "existing" && t("save_and_close")}
222
+ {status === "copy" && t("create_copy_and_close")}
223
+ {status === "new" && t("create_and_close")}
218
224
  </LoadingButton>}
219
225
  </DialogActions>;
220
226
  }
@@ -233,7 +239,8 @@ function buildSideActions<M extends object>({
233
239
  openEntityMode,
234
240
  navigateBack,
235
241
  formContext,
236
- formex
242
+ formex,
243
+ t
237
244
  }: ActionsViewProps<M>) {
238
245
 
239
246
  const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;
@@ -249,13 +256,13 @@ function buildSideActions<M extends object>({
249
256
  onClick={() => {
250
257
  sideDialogContext.setPendingClose?.(false);
251
258
  }}>
252
- {status === "existing" && "Save"}
253
- {status === "copy" && "Create copy"}
254
- {status === "new" && "Create"}
259
+ {status === "existing" && t("save")}
260
+ {status === "copy" && t("create_copy")}
261
+ {status === "new" && t("create")}
255
262
  </LoadingButton>
256
263
 
257
264
  <Button fullWidth={true} variant="text" disabled={disabled || formex.isSubmitting} type="reset">
258
- {status === "existing" ? "Discard" : "Clear"}
265
+ {status === "existing" ? t("discard") : t("clear")}
259
266
  </Button>
260
267
 
261
268
  {pluginActions}
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback, useEffect, useMemo } from "react";
2
2
 
3
3
  import { EntityCollection, EntitySidePanelProps } from "../types";
4
- import { useNavigationController, useSideEntityController } from "../hooks";
4
+ import { useNavigationController, useSideEntityController, useTranslation } from "../hooks";
5
5
 
6
6
  import { ErrorBoundary } from "../components";
7
7
  import { EntityEditView, OnUpdateParams } from "./EntityEditView";
@@ -41,6 +41,7 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
41
41
  const sideEntityController = useSideEntityController();
42
42
  const navigationController = useNavigationController();
43
43
  const sideDialogsController = useSideDialogContext();
44
+ const { t } = useTranslation();
44
45
 
45
46
  const onClose = () => {
46
47
  if (props.onClose) {
@@ -77,7 +78,7 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
77
78
  return navigationController.getParentCollectionIds(path);
78
79
  }, [navigationController, path]);
79
80
 
80
- const collection = navigationController.getCollection(fullIdPath ?? path) ?? props.collection;
81
+ const collection = props.collection ?? navigationController.getCollection(fullIdPath ?? path);
81
82
 
82
83
  useEffect(() => {
83
84
  function beforeunload(e: any) {
@@ -99,18 +100,19 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
99
100
 
100
101
  const onValuesModified = useCallback((modified: boolean) => {
101
102
  setBlockedNavigationMessage(modified
102
- ? <> You have unsaved changes in this <b>{collection?.singularName ?? collection?.name}</b>.</>
103
+ ? t("unsaved_changes", { collectionName: collection?.singularName ?? collection?.name ?? "" })
103
104
  : undefined)
104
105
  setBlocked(modified);
105
- }, [collection?.name, setBlocked, setBlockedNavigationMessage]);
106
+ }, [collection?.name, setBlocked, setBlockedNavigationMessage, t]);
106
107
 
107
108
  if (!props || !collection) {
108
- return <div className={"w-full"}/>;
109
+ return <div className={"w-full"} />;
109
110
  }
110
111
 
111
112
  return (
112
113
  <>
113
114
  <ErrorBoundary>
115
+
114
116
  <EntityEditView
115
117
  {...props}
116
118
  fullIdPath={fullIdPath}
@@ -120,32 +122,34 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
120
122
  onValuesModified={onValuesModified}
121
123
  onSaved={onUpdate}
122
124
  barActions={({
123
- status,
124
- values
125
- }) => <>
126
- <IconButton
127
- className="self-center"
128
- onClick={onClose}>
129
- <CloseIcon size={"small"}/>
130
- </IconButton>
131
- {allowFullScreen && <IconButton
132
- className="self-center"
133
- onClick={() => {
134
- const key = (status === "new" || status === "copy") ? path + "#new" : path + "/" + entityId;
135
- saveEntityToMemoryCache(key, values);
136
- if (entityId)
137
- navigate(location.pathname);
138
- else
139
- navigate(location.pathname + "#new");
140
- }}>
141
- <OpenInFullIcon size={"small"}/>
142
- </IconButton>}
143
- </>}
125
+ status,
126
+ values
127
+ }) => <>
128
+ <IconButton
129
+ className="self-center"
130
+ size={"smallest"}
131
+ onClick={onClose}>
132
+ <CloseIcon size={"smallest"} />
133
+ </IconButton>
134
+ {allowFullScreen && <IconButton
135
+ className="self-center"
136
+ size={"smallest"}
137
+ onClick={() => {
138
+ const key = (status === "new" || status === "copy") ? path + "#new" : path + "/" + entityId;
139
+ saveEntityToMemoryCache(key, values);
140
+ if (entityId)
141
+ navigate(location.pathname + location.search);
142
+ else
143
+ navigate(location.pathname + location.search + "#new");
144
+ }}>
145
+ <OpenInFullIcon size={"smallest"} />
146
+ </IconButton>}
147
+ </>}
144
148
  onTabChange={({
145
- entityId,
146
- selectedTab,
147
- collection,
148
- }) => {
149
+ entityId,
150
+ selectedTab,
151
+ collection,
152
+ }) => {
149
153
  sideEntityController.replace({
150
154
  path,
151
155
  entityId,
@@ -1,11 +1,13 @@
1
1
  "use client";
2
2
 
3
- import React, { useMemo } from "react";
3
+ import React, { useEffect, useMemo } from "react";
4
4
  import { CenteredView, Typography } from "@firecms/ui";
5
+ import { AuthController } from "../types";
5
6
  import { CustomizationController, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from "../types";
6
- import { AuthControllerContext } from "../contexts";
7
+ import { AuthControllerContext, ModeControllerProvider } from "../contexts";
7
8
  import { useBuildSideEntityController } from "../internal/useBuildSideEntityController";
8
- import { useCustomizationController, useFireCMSContext } from "../hooks";
9
+ import { useCustomizationController, useFireCMSContext, useTranslation, ModeController } from "../hooks";
10
+ import { useBuildModeController } from "../hooks/useBuildModeController";
9
11
  import { useBuildSideDialogsController } from "../internal/useBuildSideDialogsController";
10
12
  import { ErrorView } from "../components";
11
13
  import { StorageSourceContext } from "../contexts/StorageSourceContext";
@@ -59,6 +61,10 @@ export function FireCMS<USER extends User>(props: FireCMSProps<USER>) {
59
61
  console.warn("The `plugins` prop is deprecated in the FireCMS component. You should pass your plugins to `useBuildNavigationController` instead.");
60
62
  }
61
63
 
64
+ const { t, i18n } = useTranslation();
65
+
66
+ const modeController = useBuildModeController();
67
+
62
68
  const plugins = navigationController.plugins ?? _pluginsProp;
63
69
  const userManagement = plugins?.find(p => p.userManagement)?.userManagement
64
70
  ?? _userManagement
@@ -106,6 +112,24 @@ export function FireCMS<USER extends User>(props: FireCMSProps<USER>) {
106
112
  authController
107
113
  });
108
114
 
115
+ // Inject plugin translations into the existing i18next instance
116
+ useEffect(() => {
117
+ if (!i18n) return;
118
+ plugins?.forEach(plugin => {
119
+ if (plugin.i18n) {
120
+ Object.keys(plugin.i18n).forEach(locale => {
121
+ i18n.addResourceBundle(
122
+ locale,
123
+ "firecms_core",
124
+ plugin.i18n![locale],
125
+ true, // deep merge
126
+ true // overwrite
127
+ );
128
+ });
129
+ }
130
+ });
131
+ }, [i18n, plugins]);
132
+
109
133
  if (accessResponse?.message) {
110
134
  console.warn(accessResponse.message);
111
135
  }
@@ -133,12 +157,15 @@ export function FireCMS<USER extends User>(props: FireCMSProps<USER>) {
133
157
  if (accessResponse?.blocked) {
134
158
  return (
135
159
  <CenteredView maxWidth={"md"} fullScreen={true} className={"flex flex-col gap-2"}>
160
+ {/* eslint-disable-next-line i18next/no-literal-string */}
136
161
  <Typography variant={"h4"} gutterBottom>
137
- License needed
162
+ {t("license_needed")}
138
163
  </Typography>
139
164
  <Typography>
140
- You need a valid license to use FireCMS PRO. Please reach out at <a
141
- href={"mailto:hello@firecms.co"}>hello@firecms.co</a> for more information.
165
+ {(() => {
166
+ const parts = t("license_description", { email: "%%EMAIL%%" }).split("%%EMAIL%%");
167
+ return <>{parts[0]}<a href={"mailto:hello@firecms.co"}>hello@firecms.co</a>{parts[1]}</>;
168
+ })()}
142
169
  </Typography>
143
170
  {accessResponse?.message &&
144
171
  <Typography>{accessResponse?.message}</Typography>}
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
 
3
- import { ArrayProperty, FieldProps, Property, PropertyConfig, ResolvedProperty } from "../types";
3
+ import { ArrayProperty, FieldProps, NumberProperty, Property, PropertyConfig, ResolvedProperty, StringProperty } from "../types";
4
4
  import {
5
5
  ArrayCustomShapedFieldBinding,
6
6
  ArrayOfReferencesFieldBinding,
@@ -8,16 +8,18 @@ import {
8
8
  DateTimeFieldBinding,
9
9
  KeyValueFieldBinding,
10
10
  MapFieldBinding,
11
- MarkdownEditorFieldBinding,
12
11
  MultiSelectFieldBinding,
13
12
  ReferenceAsStringFieldBinding,
14
13
  ReferenceFieldBinding,
15
14
  RepeatFieldBinding,
16
15
  SelectFieldBinding,
17
- StorageUploadFieldBinding,
18
16
  SwitchFieldBinding,
19
17
  TextFieldBinding
20
18
  } from "../form";
19
+ import { lazyEager } from "../util/lazy_eager";
20
+
21
+ const MarkdownEditorFieldBinding = lazyEager<typeof import("../form/field_bindings/MarkdownEditorFieldBinding")["MarkdownEditorFieldBinding"]>(() => import("../form/field_bindings/MarkdownEditorFieldBinding"), "MarkdownEditorFieldBinding");
22
+ const StorageUploadFieldBinding = lazyEager<typeof import("../form/field_bindings/StorageUploadFieldBinding")["StorageUploadFieldBinding"]>(() => import("../form/field_bindings/StorageUploadFieldBinding"), "StorageUploadFieldBinding");
21
23
  import { isPropertyBuilder, mergeDeep } from "../util";
22
24
 
23
25
  import {
@@ -397,14 +399,19 @@ export function getDefaultFieldId(property: Property | ResolvedProperty) {
397
399
  return "custom_array";
398
400
  } else if (isPropertyBuilder(of)) {
399
401
  return "repeat";
400
- } else if (of?.dataType === "string" && of.enumValues) {
401
- return "multi_select";
402
- } else if (of?.dataType === "number" && of.enumValues) {
403
- return "multi_number_select";
404
- } else if (of?.dataType === "string" && of.storage) {
405
- return "multi_file_upload";
406
- } else if (of?.dataType === "reference") {
407
- return "multi_references";
402
+ } else if (of) {
403
+ const ofProperty = of as Property;
404
+ if (ofProperty.dataType === "string" && (ofProperty as StringProperty).enumValues) {
405
+ return "multi_select";
406
+ } else if (ofProperty.dataType === "number" && (ofProperty as NumberProperty).enumValues) {
407
+ return "multi_number_select";
408
+ } else if (ofProperty.dataType === "string" && (ofProperty as StringProperty).storage) {
409
+ return "multi_file_upload";
410
+ } else if (ofProperty.dataType === "reference") {
411
+ return "multi_references";
412
+ } else {
413
+ return "repeat";
414
+ }
408
415
  } else {
409
416
  return "repeat";
410
417
  }