@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
@@ -2,9 +2,9 @@ import React, { useEffect, useRef } from "react";
2
2
  import { useFormex } from "@firecms/formex";
3
3
 
4
4
  export const ErrorFocus = ({ containerRef }:
5
- {
6
- containerRef?: React.RefObject<HTMLDivElement>
7
- }) => {
5
+ {
6
+ containerRef?: React.RefObject<HTMLDivElement | null>
7
+ }) => {
8
8
  const {
9
9
  isValidating,
10
10
  errors,
@@ -16,7 +16,7 @@ import {
16
16
  WarningIcon
17
17
  } from "@firecms/ui";
18
18
  import { FormexController } from "@firecms/formex";
19
- import { useSnackbarController } from "../../hooks";
19
+ import { useSnackbarController, useTranslation } from "../../hooks";
20
20
  import { mergeDeep } from "../../util";
21
21
  import { flattenKeys, removeEntityFromCache } from "../../util/entity_cache";
22
22
  import { ResolvedProperties } from "../../types";
@@ -39,6 +39,7 @@ export function LocalChangesMenu<M extends object>({
39
39
  }: LocalChangesMenuProps<M>) {
40
40
 
41
41
  const snackbarController = useSnackbarController();
42
+ const { t } = useTranslation();
42
43
  const [previewDialogOpen, setPreviewDialogOpen] = useState(false);
43
44
  const [open, setOpen] = useState(false);
44
45
 
@@ -62,7 +63,7 @@ export function LocalChangesMenu<M extends object>({
62
63
  formex.setValues(mergedValues);
63
64
  snackbarController.open({
64
65
  type: "info",
65
- message: "Local changes applied to the form"
66
+ message: t("local_changes_applied")
66
67
  });
67
68
  handleCloseMenu();
68
69
  onClearLocalChanges?.();
@@ -72,7 +73,7 @@ export function LocalChangesMenu<M extends object>({
72
73
  removeEntityFromCache(cacheKey);
73
74
  snackbarController.open({
74
75
  type: "info",
75
- message: "Local changes discarded"
76
+ message: t("local_changes_discarded")
76
77
  });
77
78
  handleCloseMenu();
78
79
  onClearLocalChanges?.();
@@ -90,7 +91,7 @@ export function LocalChangesMenu<M extends object>({
90
91
  onClick={handleOpenMenu}
91
92
  >
92
93
  <WarningIcon size={"smallest"} className={"mr-1 text-yellow-600 dark:text-yellow-400"}/>
93
- Unsaved Local changes
94
+ {t("unsaved_local_changes")}
94
95
  <KeyboardArrowDownIcon size={"smallest"}/>
95
96
  </Button>
96
97
  }
@@ -98,12 +99,11 @@ export function LocalChangesMenu<M extends object>({
98
99
  onOpenChange={setOpen}
99
100
  >
100
101
  <div className={"max-w-xs px-4 py-4 text-sm text-gray-700 dark:text-gray-300"}>
101
- This document was edited locally and has unsaved changes. These local changes will be lost if you
102
- don't apply them.
102
+ {t("unsaved_local_changes_description")}
103
103
  </div>
104
- <MenuItem dense onClick={handlePreview}><VisibilityIcon size={"small"}/>Preview Changes</MenuItem>
105
- <MenuItem dense onClick={handleApply}><CheckIcon size={"small"}/>Apply Changes</MenuItem>
106
- <MenuItem dense onClick={handleDiscard}><CancelIcon size={"small"}/>Discard Local Changes</MenuItem>
104
+ <MenuItem dense onClick={handlePreview}><VisibilityIcon size={"small"}/>{t("preview_changes")}</MenuItem>
105
+ <MenuItem dense onClick={handleApply}><CheckIcon size={"small"}/>{t("apply_changes")}</MenuItem>
106
+ <MenuItem dense onClick={handleDiscard}><CancelIcon size={"small"}/>{t("discard_local_changes")}</MenuItem>
107
107
  </Menu>
108
108
 
109
109
  <Dialog
@@ -111,10 +111,10 @@ export function LocalChangesMenu<M extends object>({
111
111
  onOpenChange={setPreviewDialogOpen}
112
112
  maxWidth={"4xl"}
113
113
  >
114
- <DialogTitle variant={"h6"}>Preview Local Changes</DialogTitle>
114
+ <DialogTitle variant={"h6"}>{t("preview_local_changes")}</DialogTitle>
115
115
  <DialogContent className={"my-4"}>
116
116
  <Typography variant={"body2"} className={"mb-4"}>
117
- These are the local changes that will be applied to the form.
117
+ {t("preview_local_changes_description")}
118
118
  </Typography>
119
119
  <div className={`border rounded-lg ${defaultBorderMixin}`} style={{
120
120
  maxHeight: 520,
@@ -127,7 +127,7 @@ export function LocalChangesMenu<M extends object>({
127
127
  </div>
128
128
  </DialogContent>
129
129
  <DialogActions>
130
- <Button onClick={() => setPreviewDialogOpen(false)}>Close</Button>
130
+ <Button onClick={() => setPreviewDialogOpen(false)}>{t("close")}</Button>
131
131
  <Button
132
132
  variant={"filled"}
133
133
  onClick={() => {
@@ -135,7 +135,7 @@ export function LocalChangesMenu<M extends object>({
135
135
  setPreviewDialogOpen(false);
136
136
  }}
137
137
  >
138
- Apply changes
138
+ {t("apply_changes")}
139
139
  </Button>
140
140
  </DialogActions>
141
141
  </Dialog>
@@ -5,6 +5,7 @@ import { PreviewSize, PropertyPreview } from "../../preview";
5
5
 
6
6
  import { cls, DescriptionIcon, IconButton, paperMixin, RemoveIcon, Tooltip } from "@firecms/ui";
7
7
  import { ErrorBoundary } from "../../components";
8
+ import { useTranslation } from "../../hooks/useTranslation";
8
9
 
9
10
  interface StorageItemPreviewProps {
10
11
  name: string;
@@ -27,11 +28,12 @@ export function StorageItemPreview({
27
28
  placeholder,
28
29
  className
29
30
  }: StorageItemPreviewProps) {
30
-
31
+ const { t } = useTranslation();
31
32
  return (
32
- <div className={cls(paperMixin,
33
+ <div className={cls(
33
34
  "relative border-box flex items-center justify-center",
34
35
  size === "large" ? "min-w-[220px] min-h-[220px] max-w-[220px]" : "min-w-[118px] min-h-[118px] max-w-[118px]",
36
+ paperMixin,
35
37
  className)}>
36
38
 
37
39
  {!placeholder && !disabled &&
@@ -40,7 +42,7 @@ export function StorageItemPreview({
40
42
 
41
43
  <Tooltip
42
44
  asChild={true}
43
- title="Remove">
45
+ title={t("remove")}>
44
46
  <IconButton
45
47
  size={"small"}
46
48
  onClick={(event) => {
@@ -32,6 +32,7 @@ export function StorageUploadProgress({
32
32
 
33
33
  const [error, setError] = React.useState<Error | undefined>();
34
34
  const [loading, setLoading] = React.useState<boolean>(false);
35
+ const [progress, setProgress] = React.useState<number>(0);
35
36
  const mounted = React.useRef(false);
36
37
  const uploading = React.useRef(false);
37
38
 
@@ -46,7 +47,10 @@ export function StorageUploadProgress({
46
47
  file,
47
48
  fileName,
48
49
  path: storagePath,
49
- metadata
50
+ metadata,
51
+ onProgress: (p) => {
52
+ if (mounted.current) setProgress(p);
53
+ }
50
54
  })
51
55
  .then(async ({ path, storageUrl }) => {
52
56
  console.debug("Upload successful", path);
@@ -79,22 +83,33 @@ export function StorageUploadProgress({
79
83
  };
80
84
  }, [entry.file, entry.fileName, upload]);
81
85
 
86
+ const isLargeFile = entry.file && entry.file.size > 500 * 1024;
87
+ const renderProgressBar = loading && isLargeFile && progress > 0;
88
+ const progressBar = renderProgressBar && (
89
+ <div className="absolute bottom-0 left-0 h-1 bg-primary w-full origin-left transition-transform duration-200"
90
+ style={{ transform: `scaleX(${progress / 100})` }} />
91
+ );
92
+
82
93
  if (simple) {
83
- return <div className={`w-${imageSize} h-${imageSize}`}>
94
+ return <div className={`relative overflow-hidden w-${imageSize} h-${imageSize}`}>
84
95
 
85
96
  {loading && <Skeleton className={`w-${imageSize} h-${imageSize}`}/>}
86
97
 
98
+ {progressBar}
99
+
87
100
  </div>
88
101
  }
89
102
  return (
90
103
 
91
104
  <div className={cls(paperMixin,
92
- "p-4 relative border-box flex items-center justify-center",
105
+ "p-4 relative overflow-hidden border-box flex items-center justify-center",
93
106
  `min-w-[${imageSize}px] min-h-[${imageSize}px]`)}>
94
107
 
95
108
  {loading &&
96
109
  <Skeleton className="w-full h-full"/>}
97
110
 
111
+ {progressBar}
112
+
98
113
  {error && <ErrorView title={"Error uploading file"}
99
114
  error={error}/>}
100
115
 
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import { FieldProps } from "../../types";
3
3
  import { FieldHelperText, LabelWithIconAndTooltip } from "../components";
4
4
  import { PropertyFieldBinding } from "../PropertyFieldBinding";
5
- import { ExpandablePanel, Typography } from "@firecms/ui";
5
+ import { ExpandablePanel, IconButton, CloseIcon } from "@firecms/ui";
6
6
  import { getArrayResolvedProperties, getIconForProperty, isReadOnly } from "../../util";
7
7
  import { useClearRestoreValue } from "../useClearRestoreValue";
8
8
  import { useAuthController } from "../../hooks";
@@ -50,15 +50,28 @@ export function ArrayCustomShapedFieldBinding<T extends Array<any>>({
50
50
  setValue
51
51
  });
52
52
 
53
- const title = (<>
53
+ const title = (<div className="flex items-center w-full">
54
54
  <LabelWithIconAndTooltip
55
55
  propertyKey={propertyKey}
56
56
  icon={getIconForProperty(property, "small")}
57
57
  required={property.validation?.required}
58
58
  title={property.name}
59
- className={"h-8 flex-grow text-text-secondary dark:text-text-secondary-dark"}/>
60
- {Array.isArray(value) && <Typography variant={"caption"} className={"px-4"}>({value.length})</Typography>}
61
- </>);
59
+ className={"text-text-secondary dark:text-text-secondary-dark"}/>
60
+ {Array.isArray(value) && <span className={"text-sm text-text-secondary dark:text-text-secondary-dark ml-1"}>({value.length})</span>}
61
+ <div className="flex-grow"/>
62
+ {(property.nullable || property.clearable) && !disabled && (
63
+ <IconButton
64
+ size="small"
65
+ onClick={(e) => {
66
+ e.stopPropagation();
67
+ e.preventDefault();
68
+ setValue(null);
69
+ }}
70
+ >
71
+ <CloseIcon size={"small"}/>
72
+ </IconButton>
73
+ )}
74
+ </div>);
62
75
 
63
76
  const body = resolvedProperties.map((childProperty, index) => {
64
77
  const thisDisabled = isReadOnly(childProperty) || Boolean(childProperty.disabled);
@@ -4,9 +4,8 @@ import { ReferencePreview } from "../../preview";
4
4
  import { FieldHelperText, LabelWithIconAndTooltip } from "../components";
5
5
  import { ArrayContainer, ArrayEntryParams, ErrorView } from "../../components";
6
6
  import { getIconForProperty, getReferenceFrom } from "../../util";
7
-
8
- import { useNavigationController, useReferenceDialog } from "../../hooks";
9
- import { Button, cls, EditIcon, ExpandablePanel, fieldBackgroundMixin, Typography } from "@firecms/ui";
7
+ import { useNavigationController, useReferenceDialog, useTranslation } from "../../hooks";
8
+ import { Button, cls, EditIcon, ExpandablePanel, fieldBackgroundMixin, Typography, IconButton, CloseIcon } from "@firecms/ui";
10
9
  import { useClearRestoreValue } from "../useClearRestoreValue";
11
10
 
12
11
  type ArrayOfReferencesFieldProps = FieldProps<EntityReference[]>;
@@ -48,6 +47,7 @@ export function ArrayOfReferencesFieldBinding({
48
47
  setValue
49
48
  });
50
49
 
50
+ const { t } = useTranslation();
51
51
  const navigationController = useNavigationController();
52
52
  const collection: EntityCollection | undefined = useMemo(() => {
53
53
  return ofProperty.path ? navigationController.getCollection(ofProperty.path) : undefined;
@@ -84,7 +84,7 @@ export function ArrayOfReferencesFieldBinding({
84
84
  }: ArrayEntryParams) => {
85
85
  const entryValue = value && value.length > index ? value[index] : undefined;
86
86
  if (!entryValue)
87
- return <div>Internal ERROR</div>;
87
+ return <div>{t("internal_error")}</div>;
88
88
  return (
89
89
  <ReferencePreview
90
90
  key={internalId}
@@ -100,15 +100,28 @@ export function ArrayOfReferencesFieldBinding({
100
100
  );
101
101
  }, [ofProperty.path, ofProperty.previewProperties, value]);
102
102
 
103
- const title = (<>
103
+ const title = (<div className="flex items-center w-full">
104
104
  <LabelWithIconAndTooltip
105
105
  propertyKey={propertyKey}
106
106
  icon={getIconForProperty(property, "small")}
107
107
  required={property.validation?.required}
108
108
  title={property.name}
109
- className={"h-8 flex flex-grow text-text-secondary dark:text-text-secondary-dark"}/>
110
- {Array.isArray(value) && <Typography variant={"caption"} className={"px-4"}>({value.length})</Typography>}
111
- </>);
109
+ className={"text-text-secondary dark:text-text-secondary-dark"}/>
110
+ {Array.isArray(value) && <span className={"text-sm text-text-secondary dark:text-text-secondary-dark ml-1"}>({value.length})</span>}
111
+ <div className="flex-grow"/>
112
+ {(property.nullable || property.clearable) && !disabled && (
113
+ <IconButton
114
+ size="small"
115
+ onClick={(e) => {
116
+ e.stopPropagation();
117
+ e.preventDefault();
118
+ setValue(null);
119
+ }}
120
+ >
121
+ <CloseIcon size={"small"}/>
122
+ </IconButton>
123
+ )}
124
+ </div>);
112
125
 
113
126
  const body = <>
114
127
  {!collection && <ErrorView
@@ -129,11 +142,10 @@ export function ArrayOfReferencesFieldBinding({
129
142
  <Button
130
143
  className="ml-3.5 my-4 justify-center text-left"
131
144
  variant="text"
132
- color="primary"
133
145
  disabled={isSubmitting}
134
146
  onClick={onEntryClick}>
135
147
  <EditIcon size={"small"}/>
136
- Edit {property.name}
148
+ {t("edit_name", { name: property.name ?? "" })}
137
149
  </Button>
138
150
  </div>}
139
151
  </>;
@@ -8,9 +8,10 @@ import { EnumValuesChip } from "../../preview";
8
8
  import { FieldProps, FormContext, PropertyFieldBindingProps, PropertyOrBuilder } from "../../types";
9
9
  import { getDefaultValueFor, getIconForProperty, mergeDeep, } from "../../util";
10
10
  import { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from "../../util/common";
11
- import { cls, ExpandablePanel, paperMixin, Select, SelectItem, Typography } from "@firecms/ui";
11
+ import { cls, ExpandablePanel, paperMixin, Select, SelectItem, Typography, IconButton, CloseIcon } from "@firecms/ui";
12
12
  import { useClearRestoreValue } from "../useClearRestoreValue";
13
13
  import { ArrayContainer, ArrayEntryParams } from "../../components";
14
+ import { useTranslation } from "../../hooks/useTranslation";
14
15
 
15
16
  /**
16
17
  * If the `oneOf` property is specified, this fields render each array entry as
@@ -37,6 +38,7 @@ export function BlockFieldBinding<T extends Array<any>>({
37
38
  }: FieldProps<T>) {
38
39
 
39
40
  const minimalistView = minimalistViewProp || property.minimalistView;
41
+ const { t } = useTranslation();
40
42
 
41
43
  if (!property.oneOf)
42
44
  throw Error("ArrayOneOfField misconfiguration. Property `oneOf` not set");
@@ -72,19 +74,33 @@ export function BlockFieldBinding<T extends Array<any>>({
72
74
  };
73
75
 
74
76
  const title = (
75
- <LabelWithIconAndTooltip
76
- propertyKey={propertyKey}
77
- icon={getIconForProperty(property, "small")}
78
- required={property.validation?.required}
79
- title={property.name}
80
- className={"text-text-secondary dark:text-text-secondary-dark"}/>
77
+ <div className="flex items-center w-full">
78
+ <LabelWithIconAndTooltip
79
+ propertyKey={propertyKey}
80
+ icon={getIconForProperty(property, "small")}
81
+ required={property.validation?.required}
82
+ title={property.name}
83
+ className={"text-text-secondary dark:text-text-secondary-dark flex-grow"}/>
84
+ {(property.nullable || property.clearable) && !disabled && (
85
+ <IconButton
86
+ size="small"
87
+ onClick={(e) => {
88
+ e.stopPropagation();
89
+ e.preventDefault();
90
+ setValue(null);
91
+ }}
92
+ >
93
+ <CloseIcon size={"small"}/>
94
+ </IconButton>
95
+ )}
96
+ </div>
81
97
  );
82
98
 
83
99
  const firstOneOfKey = Object.keys(property.oneOf.properties)[0];
84
100
  const body = <ArrayContainer value={value}
85
101
  className={"flex flex-col gap-3"}
86
102
  droppableId={propertyKey}
87
- addLabel={property.name ? "Add entry to " + property.name : "Add entry"}
103
+ addLabel={property.name ? t("add_to_field", { fieldName: property.name }) : t("add_entry")}
88
104
  buildEntry={buildEntry}
89
105
  onInternalIdAdded={setLastAddedId}
90
106
  disabled={isSubmitting || Boolean(property.disabled)}
@@ -167,6 +183,7 @@ function BlockEntry({
167
183
  const [typeInternal, setTypeInternal] = useState<string | undefined>(type ?? undefined);
168
184
 
169
185
  const formex = useFormex();
186
+ const { t } = useTranslation();
170
187
 
171
188
  useEffect(() => {
172
189
  if (!type) {
@@ -227,7 +244,7 @@ function BlockEntry({
227
244
  <Select
228
245
  className="mb-2"
229
246
  placeholder={<Typography variant={"caption"}
230
- className={"px-4 py-2 font-medium"}>Type</Typography>}
247
+ className={"px-4 py-2 font-medium"}>{t("type")}</Typography>}
231
248
  size={"medium"}
232
249
  fullWidth={true}
233
250
  position={"item-aligned"}
@@ -19,17 +19,17 @@ type DateTimeFieldProps = FieldProps<Date>;
19
19
  * @group Form fields
20
20
  */
21
21
  export function DateTimeFieldBinding({
22
- propertyKey,
23
- value,
24
- setValue,
25
- autoFocus,
26
- error,
27
- showError,
28
- disabled,
29
- touched,
30
- property,
31
- includeDescription
32
- }: DateTimeFieldProps) {
22
+ propertyKey,
23
+ value,
24
+ setValue,
25
+ autoFocus,
26
+ error,
27
+ showError,
28
+ disabled,
29
+ touched,
30
+ property,
31
+ includeDescription
32
+ }: DateTimeFieldProps) {
33
33
 
34
34
  const { locale } = useCustomizationController();
35
35
  const internalValue = value || null;
@@ -48,23 +48,24 @@ export function DateTimeFieldBinding({
48
48
  onChange={(dateValue) => setValue(dateValue)}
49
49
  size={"large"}
50
50
  mode={property.mode}
51
- clearable={property.clearable}
51
+ clearable={property.nullable || property.clearable}
52
52
  locale={locale}
53
+ timezone={property.timezone}
53
54
  error={showError}
54
55
  disabled={disabled}
55
56
  label={<LabelWithIcon
56
57
  icon={getIconForProperty(property, "small")}
57
58
  required={property.validation?.required}
58
59
  className={showError ? "text-red-500 dark:text-red-500" : "text-text-secondary dark:text-text-secondary-dark"}
59
- title={property.name}/>}
60
+ title={property.name} />}
60
61
  />
61
62
  </PropertyIdCopyTooltip>
62
63
 
63
64
  <FieldHelperText includeDescription={includeDescription}
64
- showError={showError}
65
- error={error}
66
- disabled={disabled}
67
- property={property}/>
65
+ showError={showError}
66
+ error={error}
67
+ disabled={disabled}
68
+ property={property} />
68
69
 
69
70
  </>
70
71
  );
@@ -13,6 +13,7 @@ import {
13
13
  defaultBorderMixin,
14
14
  ExpandablePanel,
15
15
  IconButton,
16
+ CloseIcon,
16
17
  Menu,
17
18
  MenuItem,
18
19
  RemoveIcon,
@@ -22,6 +23,7 @@ import {
22
23
  import { getDefaultValueForDataType, getIconForProperty } from "../../util";
23
24
  import { useCustomizationController } from "../../hooks";
24
25
  import { getIn } from "@firecms/formex";
26
+ import { useTranslation } from "../../hooks/useTranslation";
25
27
 
26
28
  type MapEditViewRowState = [number, {
27
29
  key: string,
@@ -54,6 +56,7 @@ export function KeyValueFieldBinding({
54
56
  throw Error(`Your property ${propertyKey} needs to have the 'keyValue' prop in order to use this field binding`);
55
57
  }
56
58
 
59
+ const { t } = useTranslation();
57
60
  const initialValues = getIn(context.formex.initialValues, propertyKey);
58
61
 
59
62
  const mapFormView = <MapEditView value={value}
@@ -62,12 +65,28 @@ export function KeyValueFieldBinding({
62
65
  initialValue={initialValues}
63
66
  fieldName={property.name ?? propertyKey}/>;
64
67
 
65
- const title = <LabelWithIconAndTooltip
66
- propertyKey={propertyKey}
67
- icon={getIconForProperty(property, "small")}
68
- required={property.validation?.required}
69
- title={property.name}
70
- className={"text-text-secondary dark:text-text-secondary-dark"}/>;
68
+ const title = (
69
+ <div className="flex items-center w-full">
70
+ <LabelWithIconAndTooltip
71
+ propertyKey={propertyKey}
72
+ icon={getIconForProperty(property, "small")}
73
+ required={property.validation?.required}
74
+ title={property.name}
75
+ className={"text-text-secondary dark:text-text-secondary-dark flex-grow"}/>
76
+ {(property.nullable || property.clearable) && !disabled && (
77
+ <IconButton
78
+ size="small"
79
+ onClick={(e) => {
80
+ e.stopPropagation();
81
+ e.preventDefault();
82
+ setValue(null);
83
+ }}
84
+ >
85
+ <CloseIcon size={"small"}/>
86
+ </IconButton>
87
+ )}
88
+ </div>
89
+ );
71
90
 
72
91
  return (
73
92
  <>
@@ -103,6 +122,7 @@ function MapEditView<T extends Record<string, any>>({
103
122
  fieldName,
104
123
  disabled
105
124
  }: MapEditViewParams<T>) {
125
+ const { t } = useTranslation();
106
126
  const [internalState, setInternalState] = React.useState<MapEditViewRowState[]>(
107
127
  Object.keys(initialValue ?? {}).map((key) => [getRandomId(), {
108
128
  key,
@@ -215,7 +235,6 @@ function MapEditView<T extends Record<string, any>>({
215
235
 
216
236
  <Button variant={"text"}
217
237
  size={"small"}
218
- color="primary"
219
238
  className="w-full"
220
239
  disabled={disabled}
221
240
  startIcon={<AddIcon/>}
@@ -231,7 +250,7 @@ function MapEditView<T extends Record<string, any>>({
231
250
  }]]);
232
251
  }
233
252
  }>
234
- {fieldName ? `Add to ${fieldName}` : "Add"}
253
+ {fieldName ? t("add_to_field", { fieldName }) : t("add_entry")}
235
254
  </Button>
236
255
 
237
256
  </div>;
@@ -262,12 +281,13 @@ function MapKeyValueRow<T extends Record<string, any>>({
262
281
  }) {
263
282
 
264
283
  const { locale } = useCustomizationController();
284
+ const { t } = useTranslation();
265
285
 
266
286
  function buildInput(entryValue: any, fieldKey: string, dataType: DataType) {
267
287
  if (dataType === "string" || dataType === "number") {
268
288
  return <TextField
269
289
  key={dataType}
270
- placeholder={"value"}
290
+ placeholder={t("value")}
271
291
  value={entryValue}
272
292
  type={dataType === "number" ? "number" : "text"}
273
293
  size={"medium"}
@@ -326,7 +346,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
326
346
  <ArrayContainer value={entryValue}
327
347
  newDefaultEntry={""}
328
348
  droppableId={rowId.toString()}
329
- addLabel={fieldKey ? `Add to ${fieldKey}` : "Add"}
349
+ addLabel={fieldKey ? t("add_to_field", { fieldName: fieldKey }) : t("add_entry")}
330
350
  size={"small"}
331
351
  disabled={disabled || !fieldKey}
332
352
  canAddElements={true}
@@ -371,7 +391,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
371
391
  } else {
372
392
  return <Typography
373
393
  variant={"caption"}>
374
- {`Data type ${dataType} not supported yet`}
394
+ {t("data_type_not_supported", { dataType })}
375
395
  </Typography>;
376
396
  }
377
397
  }
@@ -387,7 +407,7 @@ function MapKeyValueRow<T extends Record<string, any>>({
387
407
  <div className="w-[300px] max-w-[30%]">
388
408
  <TextField
389
409
  value={fieldKey}
390
- placeholder={"key"}
410
+ placeholder={t("key")}
391
411
  disabled={disabled || (entryValue !== undefined && entryValue !== null && entryValue !== "")}
392
412
  size={"medium"}
393
413
  onChange={(event) => {
@@ -405,17 +425,17 @@ function MapKeyValueRow<T extends Record<string, any>>({
405
425
  </IconButton>}
406
426
  >
407
427
  <MenuItem dense
408
- onClick={() => doUpdateDataType("string")}>string</MenuItem>
428
+ onClick={() => doUpdateDataType("string")}>{t("string")}</MenuItem>
409
429
  <MenuItem dense
410
- onClick={() => doUpdateDataType("number")}>number</MenuItem>
430
+ onClick={() => doUpdateDataType("number")}>{t("number")}</MenuItem>
411
431
  <MenuItem dense
412
- onClick={() => doUpdateDataType("boolean")}>boolean</MenuItem>
432
+ onClick={() => doUpdateDataType("boolean")}>{t("boolean")}</MenuItem>
413
433
  <MenuItem dense
414
- onClick={() => doUpdateDataType("date")}>date</MenuItem>
434
+ onClick={() => doUpdateDataType("date")}>{t("date")}</MenuItem>
415
435
  <MenuItem dense
416
- onClick={() => doUpdateDataType("map")}>map</MenuItem>
436
+ onClick={() => doUpdateDataType("map")}>{t("map")}</MenuItem>
417
437
  <MenuItem dense
418
- onClick={() => doUpdateDataType("array")}>array</MenuItem>
438
+ onClick={() => doUpdateDataType("array")}>{t("array")}</MenuItem>
419
439
  </Menu>
420
440
 
421
441
  <IconButton aria-label="delete"
@@ -447,6 +467,7 @@ function ArrayKeyValueRow<T>({
447
467
  }) {
448
468
 
449
469
  const { locale } = useCustomizationController();
470
+ const { t } = useTranslation();
450
471
  const [selectedDataType, setSelectedDataType] = useState<DataType>(getDataType(value) ?? "string");
451
472
 
452
473
  function doUpdateDataType(dataType: DataType) {
@@ -488,7 +509,7 @@ function ArrayKeyValueRow<T>({
488
509
  }}/>;
489
510
  } else if (dataType === "array") {
490
511
  return <Typography variant={"caption"}>
491
- Arrays of arrays are not supported.
512
+ {t("arrays_of_arrays_not_supported")}
492
513
  </Typography>;
493
514
  } else if (dataType === "map") {
494
515
  return <div className={cls(defaultBorderMixin, "ml-2 pl-2 border-l border-solid")}>
@@ -500,7 +521,7 @@ function ArrayKeyValueRow<T>({
500
521
  } else {
501
522
  return <Typography
502
523
  variant={"caption"}>
503
- {`Data type ${dataType} not supported yet`}
524
+ {t("data_type_not_supported", { dataType })}
504
525
  </Typography>;
505
526
  }
506
527
  }
@@ -520,15 +541,15 @@ function ArrayKeyValueRow<T>({
520
541
  <ArrowDropDownIcon/>
521
542
  </IconButton>}>
522
543
  <MenuItem dense
523
- onClick={() => doUpdateDataType("string")}>string</MenuItem>
544
+ onClick={() => doUpdateDataType("string")}>{t("string")}</MenuItem>
524
545
  <MenuItem dense
525
- onClick={() => doUpdateDataType("number")}>number</MenuItem>
546
+ onClick={() => doUpdateDataType("number")}>{t("number")}</MenuItem>
526
547
  <MenuItem dense
527
- onClick={() => doUpdateDataType("boolean")}>boolean</MenuItem>
548
+ onClick={() => doUpdateDataType("boolean")}>{t("boolean")}</MenuItem>
528
549
  <MenuItem dense
529
- onClick={() => doUpdateDataType("map")}>map</MenuItem>
550
+ onClick={() => doUpdateDataType("map")}>{t("map")}</MenuItem>
530
551
  <MenuItem dense
531
- onClick={() => doUpdateDataType("date")}>date</MenuItem>
552
+ onClick={() => doUpdateDataType("date")}>{t("date")}</MenuItem>
532
553
  </Menu>
533
554
 
534
555
  </Typography>