@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
@@ -0,0 +1,120 @@
1
+ import React from "react";
2
+ import { cls, ExpandMoreIcon, Typography } from "@firecms/ui";
3
+ import { NavigationEntry } from "../types";
4
+ import { IconForView } from "../util";
5
+ import { DrawerNavigationItem } from "./DrawerNavigationItem";
6
+ import { useTranslation } from "../hooks/useTranslation";
7
+
8
+ export interface DrawerNavigationGroupProps {
9
+ /**
10
+ * Group name to display in header. When null, uses the translated default group name.
11
+ */
12
+ group: string | null;
13
+ /**
14
+ * Navigation entries in this group
15
+ */
16
+ entries: NavigationEntry[];
17
+ /**
18
+ * Whether the group is collapsed
19
+ */
20
+ collapsed: boolean;
21
+ /**
22
+ * Callback when collapse state should toggle
23
+ */
24
+ onToggleCollapsed: () => void;
25
+ /**
26
+ * Whether the drawer is in open (expanded) state
27
+ */
28
+ drawerOpen: boolean;
29
+ /**
30
+ * Whether tooltips should be shown (drawer closed + hovered)
31
+ */
32
+ tooltipsOpen: boolean;
33
+ /**
34
+ * Whether admin menu is open (used to control tooltip visibility)
35
+ */
36
+ adminMenuOpen?: boolean;
37
+ /**
38
+ * Optional actions to render in the group header (e.g., "Add collection" button)
39
+ */
40
+ headerActions?: React.ReactNode;
41
+ /**
42
+ * Optional callback when a navigation item is clicked
43
+ */
44
+ onItemClick?: (entry: NavigationEntry) => void;
45
+ }
46
+
47
+ /**
48
+ * Shared drawer navigation group component used by both DefaultDrawer and FireCMSCloudDrawer.
49
+ * Renders a collapsible group with header and navigation items.
50
+ */
51
+ export function DrawerNavigationGroup({
52
+ group,
53
+ entries,
54
+ collapsed,
55
+ onToggleCollapsed,
56
+ drawerOpen,
57
+ tooltipsOpen,
58
+ adminMenuOpen,
59
+ headerActions,
60
+ onItemClick
61
+ }: DrawerNavigationGroupProps) {
62
+ const { t } = useTranslation();
63
+ return (
64
+ <div
65
+ className={"bg-surface-50 dark:bg-surface-800/30 my-4 rounded-lg ml-3 mr-1"}
66
+ key={`drawer_group_${group}`}
67
+ >
68
+ {/* Group Header */}
69
+ {drawerOpen ? (
70
+ <div
71
+ className="pl-4 pr-2 py-2 flex flex-row items-center cursor-pointer hover:bg-surface-100 dark:hover:bg-surface-700/50 rounded-t-lg transition-colors"
72
+ onClick={onToggleCollapsed}
73
+ >
74
+ <ExpandMoreIcon
75
+ size={"smallest"}
76
+ className={cls(
77
+ "text-surface-500 dark:text-surface-400 transition-transform duration-200 mr-1",
78
+ collapsed ? "-rotate-90" : "rotate-0"
79
+ )}
80
+ />
81
+ <Typography
82
+ variant={"caption"}
83
+ color={"secondary"}
84
+ className="font-medium flex-grow line-clamp-1"
85
+ >
86
+ {(group && group !== "__default__" ? group : t("views_group")).toUpperCase()}
87
+ </Typography>
88
+ {headerActions && (
89
+ <div onClick={(e) => e.stopPropagation()}>
90
+ {headerActions}
91
+ </div>
92
+ )}
93
+ </div>
94
+ ) : (
95
+ <div className="w-full" />
96
+ )}
97
+
98
+ {/* Collapsible Content */}
99
+ <div
100
+ className={cls(
101
+ "overflow-hidden transition-all duration-200 ease-in-out",
102
+ collapsed ? "max-h-0 opacity-0" : "max-h-[2000px] opacity-100"
103
+ )}
104
+ >
105
+ {entries.map((entry) => (
106
+ <DrawerNavigationItem
107
+ key={entry.id}
108
+ icon={<IconForView collectionOrView={entry.collection ?? entry.view} size={18} />}
109
+ tooltipsOpen={!collapsed && tooltipsOpen}
110
+ adminMenuOpen={adminMenuOpen}
111
+ drawerOpen={drawerOpen}
112
+ onClick={() => onItemClick?.(entry)}
113
+ url={entry.url}
114
+ name={entry.name}
115
+ />
116
+ ))}
117
+ </div>
118
+ </div>
119
+ );
120
+ }
@@ -34,13 +34,13 @@ export function DrawerNavigationItem({
34
34
  transition: drawerOpen ? "width 150ms ease-in" : undefined
35
35
  }}
36
36
  className={({ isActive }: any) => cls("rounded-lg truncate",
37
- "hover:bg-surface-accent-300 hover:bg-opacity-75 dark:hover:bg-surface-accent-800 dark:hover:bg-opacity-75 text-text-primary dark:text-surface-200 hover:text-surface-900 hover:dark:text-white",
37
+ "hover:bg-surface-accent-300 hover:bg-opacity-75 hover:bg-surface-accent-300/75 dark:hover:bg-surface-accent-800 dark:hover:bg-opacity-75 dark:hover:bg-surface-accent-800/75 text-text-primary dark:text-surface-200 hover:text-surface-900 hover:dark:text-white hover:bg-surface-accent-300/75 dark:hover:bg-surface-accent-800/75",
38
38
  "flex flex-row items-center mr-8",
39
39
  // "transition-all ease-in-out delay-100 duration-300",
40
40
  // drawerOpen ? "w-full" : "w-18",
41
41
  drawerOpen ? "pl-4 h-10" : "pl-4 h-9",
42
42
  "font-semibold text-xs",
43
- isActive ? "bg-surface-accent-200 bg-opacity-60 dark:bg-surface-800 dark:bg-opacity-50" : ""
43
+ isActive ? "bg-surface-accent-200 bg-opacity-60 dark:bg-surface-800 dark:bg-opacity-50 bg-surface-accent-200/60 dark:bg-surface-800/50" : ""
44
44
  )}
45
45
  to={url}
46
46
  >
@@ -49,8 +49,9 @@ export function DrawerNavigationItem({
49
49
 
50
50
  <div
51
51
  className={cls(
52
+ "text-text-primary dark:text-surface-200",
52
53
  drawerOpen ? "opacity-100" : "opacity-0 hidden",
53
- "ml-4 font-inherit text-inherit"
54
+ "ml-4 font-inherit"
54
55
  )}>
55
56
  {name.toUpperCase()}
56
57
  </div>
@@ -26,12 +26,13 @@ import {
26
26
  useFireCMSContext,
27
27
  useLargeLayout
28
28
  } from "../hooks";
29
- import { CircularProgress, cls, CodeIcon, defaultBorderMixin, Tab, Tabs, Typography } from "@firecms/ui";
29
+ import { CircularProgress, cls, CodeIcon, defaultBorderMixin, Tab, Tabs, Typography, Menu, MenuItem, ExpandMoreIcon } from "@firecms/ui";
30
30
  import { getEntityFromMemoryCache } from "../util/entity_cache";
31
31
  import { EntityForm, EntityFormProps } from "../form";
32
32
  import { EntityEditViewFormActions } from "./EntityEditViewFormActions";
33
33
  import { EntityJsonPreview } from "../components/EntityJsonPreview";
34
34
  import { createFormexStub } from "../util/createFormexStub";
35
+ import { useTranslation } from "../hooks/useTranslation";
35
36
 
36
37
  export const MAIN_TAB_VALUE = "__main_##Q$SC^#S6";
37
38
  export const JSON_TAB_VALUE = "__json";
@@ -75,7 +76,7 @@ export interface EntityEditViewProps<M extends Record<string, any>> {
75
76
  copy?: boolean;
76
77
  selectedTab?: string;
77
78
  parentCollectionIds: string[];
78
- onValuesModified?: (modified: boolean, values:M) => void;
79
+ onValuesModified?: (modified: boolean, values: M) => void;
79
80
  onSaved?: (params: OnUpdateParams) => void;
80
81
  onTabChange?: (props: OnTabChangeParams<M>) => void;
81
82
  layout?: "side_panel" | "full_screen";
@@ -88,9 +89,9 @@ export interface EntityEditViewProps<M extends Record<string, any>> {
88
89
  * an entity is opened.
89
90
  */
90
91
  export function EntityEditView<M extends Record<string, any>, USER extends User>({
91
- entityId,
92
- ...props
93
- }: EntityEditViewProps<M>) {
92
+ entityId,
93
+ ...props
94
+ }: EntityEditViewProps<M>) {
94
95
 
95
96
  const {
96
97
  entity,
@@ -123,7 +124,7 @@ export function EntityEditView<M extends Record<string, any>, USER extends User>
123
124
  }, [authController, entity, status]);
124
125
 
125
126
  if ((dataLoading && !initialDirtyValues) || (!entity || canEdit === undefined) && (status === "existing" || status === "copy")) {
126
- return <CircularProgressCenter/>;
127
+ return <CircularProgressCenter />;
127
128
  }
128
129
 
129
130
  if (entityId && !entity && !initialDirtyValues) {
@@ -131,36 +132,36 @@ export function EntityEditView<M extends Record<string, any>, USER extends User>
131
132
  }
132
133
 
133
134
  return <EntityEditViewInner<M> {...props}
134
- entityId={entityId}
135
- entity={entity}
136
- initialDirtyValues={initialDirtyValues as Partial<M>}
137
- dataLoading={dataLoading}
138
- status={status}
139
- setStatus={setStatus}
140
- canEdit={canEdit}
135
+ entityId={entityId}
136
+ entity={entity}
137
+ initialDirtyValues={initialDirtyValues as Partial<M>}
138
+ dataLoading={dataLoading}
139
+ status={status}
140
+ setStatus={setStatus}
141
+ canEdit={canEdit}
141
142
  />;
142
143
  }
143
144
 
144
145
  export function EntityEditViewInner<M extends Record<string, any>>({
145
- path,
146
- fullIdPath,
147
- entityId,
148
- selectedTab: selectedTabProp,
149
- collection,
150
- parentCollectionIds,
151
- onValuesModified,
152
- onSaved,
153
- onTabChange,
154
- entity,
155
- initialDirtyValues,
156
- dataLoading,
157
- layout = "side_panel",
158
- barActions,
159
- status,
160
- setStatus,
161
- formProps,
162
- canEdit
163
- }: EntityEditViewProps<M> & {
146
+ path,
147
+ fullIdPath,
148
+ entityId,
149
+ selectedTab: selectedTabProp,
150
+ collection,
151
+ parentCollectionIds,
152
+ onValuesModified,
153
+ onSaved,
154
+ onTabChange,
155
+ entity,
156
+ initialDirtyValues,
157
+ dataLoading,
158
+ layout = "side_panel",
159
+ barActions,
160
+ status,
161
+ setStatus,
162
+ formProps,
163
+ canEdit
164
+ }: EntityEditViewProps<M> & {
164
165
  entity?: Entity<M>,
165
166
  initialDirtyValues?: Partial<M>, // dirty cached entity in memory
166
167
  dataLoading: boolean,
@@ -170,6 +171,7 @@ export function EntityEditViewInner<M extends Record<string, any>>({
170
171
  }) {
171
172
 
172
173
  const context = useFireCMSContext();
174
+ const { t } = useTranslation();
173
175
 
174
176
  const [usedEntity, setUsedEntity] = useState<Entity<M> | undefined>(entity);
175
177
 
@@ -228,6 +230,10 @@ export function EntityEditViewInner<M extends Record<string, any>>({
228
230
  const includeJsonView = collection.includeJsonView === undefined ? true : collection.includeJsonView;
229
231
  const hasAdditionalViews = customViewsCount > 0 || subcollectionsCount > 0 || includeJsonView;
230
232
 
233
+ const groupedViews = useMemo(() => {
234
+ return (collection.viewGroups ?? []).flatMap(g => g.views);
235
+ }, [collection.viewGroups]);
236
+
231
237
  const {
232
238
  resolvedEntityViews,
233
239
  selectedEntityView,
@@ -312,7 +318,7 @@ export function EntityEditViewInner<M extends Record<string, any>>({
312
318
  role="tabpanel">
313
319
  <ErrorBoundary>
314
320
  <EntityJsonPreview
315
- values={formContext?.values ?? entity?.values ?? {}}/>
321
+ values={formContext?.values ?? entity?.values ?? {}} />
316
322
  </ErrorBoundary>
317
323
  </div>;
318
324
 
@@ -328,7 +334,7 @@ export function EntityEditViewInner<M extends Record<string, any>>({
328
334
  key={`subcol_${subcollectionId}`}
329
335
  role="tabpanel">
330
336
 
331
- {globalLoading && <CircularProgressCenter/>}
337
+ {globalLoading && <CircularProgressCenter />}
332
338
 
333
339
  {!globalLoading &&
334
340
  (usedEntity && newFullPath
@@ -339,11 +345,10 @@ export function EntityEditViewInner<M extends Record<string, any>>({
339
345
  isSubCollection={true}
340
346
  updateUrl={false}
341
347
  {...subcollection}
342
- openEntityMode={layout}/>
348
+ openEntityMode={layout} />
343
349
  : <div className="flex items-center justify-center w-full h-full p-3">
344
350
  <Typography variant={"label"}>
345
- You need to save your entity before
346
- adding additional collections
351
+ {t("youd_need_to_save_before_additional_collections")}
347
352
  </Typography>
348
353
  </div>)
349
354
  }
@@ -375,8 +380,8 @@ export function EntityEditViewInner<M extends Record<string, any>>({
375
380
  className={"px-8 h-full overflow-auto"}
376
381
  entity={entity}
377
382
  path={path}
378
- collection={collection}/>
379
- <div className="h-16"/>
383
+ collection={collection} />
384
+ <div className="h-16" />
380
385
  </div>
381
386
  </div> : null;
382
387
 
@@ -396,7 +401,6 @@ export function EntityEditViewInner<M extends Record<string, any>>({
396
401
  disabled={!canEdit}
397
402
  {...formProps}
398
403
  onEntityChange={(entity) => {
399
- console.log("333 EntityEditView onEntityChange:", entity);
400
404
  setUsedEntity(entity);
401
405
  formProps?.onEntityChange?.(entity);
402
406
  }}
@@ -419,16 +423,18 @@ export function EntityEditViewInner<M extends Record<string, any>>({
419
423
  Builder={selectedSecondaryForm?.Builder}
420
424
  />;
421
425
 
422
- const subcollectionTabs = subcollections && subcollections.map((subcollection) =>
426
+ const subcollectionTabs = subcollections && subcollections
427
+ .filter(sub => !groupedViews.includes(sub.id ?? sub.path))
428
+ .map((subcollection) =>
423
429
  <Tab
424
430
  className="text-sm min-w-[120px]"
425
- value={subcollection.id}
431
+ value={subcollection.id ?? subcollection.path}
426
432
  key={`entity_detail_collection_tab_${subcollection.name}`}>
427
433
  {subcollection.name}
428
434
  </Tab>
429
435
  );
430
436
 
431
- const customViewTabsStart = resolvedEntityViews.filter(view => view.position === "start")
437
+ const customViewTabsStart = resolvedEntityViews.filter(view => view.position === "start" && !groupedViews.includes(view.key))
432
438
  .map((view) =>
433
439
  <Tab
434
440
  className={!view.tabComponent ? "text-sm min-w-[120px]" : undefined}
@@ -437,7 +443,7 @@ export function EntityEditViewInner<M extends Record<string, any>>({
437
443
  {view.tabComponent ?? view.name}
438
444
  </Tab>
439
445
  );
440
- const customViewTabsEnd = resolvedEntityViews.filter(view => !view.position || view.position === "end")
446
+ const customViewTabsEnd = resolvedEntityViews.filter(view => (!view.position || view.position === "end") && !groupedViews.includes(view.key))
441
447
  .map((view) =>
442
448
  <Tab
443
449
  className={!view.tabComponent ? "text-sm min-w-[120px]" : undefined}
@@ -447,12 +453,49 @@ export function EntityEditViewInner<M extends Record<string, any>>({
447
453
  </Tab>
448
454
  );
449
455
 
456
+ const viewGroupMenus = collection.viewGroups?.map(group => {
457
+ const isActive = group.views.includes(selectedTab);
458
+ return (
459
+ <Menu
460
+ key={`view_group_${group.name}`}
461
+ trigger={
462
+ <button
463
+ type="button"
464
+ className={cls(
465
+ "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-white transition-all",
466
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-surface-400 focus-visible:ring-offset-2",
467
+ "disabled:pointer-events-none disabled:opacity-50",
468
+ isActive ? "bg-white text-surface-900 dark:bg-surface-950 dark:text-surface-50" : "text-surface-600 dark:text-surface-400 hover:bg-surface-200 dark:hover:bg-surface-800"
469
+ )}
470
+ >
471
+ {group.name}
472
+ <ExpandMoreIcon className="ml-1 -mr-1" size="small" />
473
+ </button>
474
+ }>
475
+ {group.views.map(viewId => {
476
+ const subcollection = subcollections.find(s => (s.id ?? s.path) === viewId);
477
+ const customView = resolvedEntityViews.find(v => v.key === viewId);
478
+ const name = subcollection?.name ?? customView?.name ?? viewId;
479
+ return (
480
+ <MenuItem
481
+ key={`view_group_${group.name}_${viewId}`}
482
+ onClick={() => onSideTabClick(viewId)}
483
+ className={selectedTab === viewId ? "bg-surface-accent-100 dark:bg-surface-accent-900" : ""}
484
+ >
485
+ {name}
486
+ </MenuItem>
487
+ );
488
+ })}
489
+ </Menu>
490
+ );
491
+ });
492
+
450
493
  const shouldShowTopBar = Boolean(barActions) || hasAdditionalViews;
451
494
 
452
495
  let result = <div className="relative flex flex-col h-full w-full bg-white dark:bg-surface-900">
453
496
 
454
497
  {shouldShowTopBar && <div
455
- className={cls("h-14 items-center flex overflow-visible overflow-x-scroll w-full no-scrollbar h-14 border-b pl-2 pr-2 pt-1 flex bg-surface-50 dark:bg-surface-900", defaultBorderMixin)}>
498
+ className={cls("h-14 items-center overflow-hidden w-full border-b pl-2 pr-2 flex gap-2 bg-surface-50 dark:bg-surface-900", defaultBorderMixin)}>
456
499
 
457
500
  {barActions?.({
458
501
  path: fullIdPath ?? path,
@@ -461,16 +504,15 @@ export function EntityEditViewInner<M extends Record<string, any>>({
461
504
  status
462
505
  })}
463
506
 
464
- <div className={"flex-grow"}/>
507
+ <div className={"flex-grow"} />
465
508
 
466
509
  {pluginActionsTop}
467
510
 
468
511
  {globalLoading && <div className="self-center">
469
- <CircularProgress size={"small"}/>
512
+ <CircularProgress size={"small"} />
470
513
  </div>}
471
514
 
472
515
  {hasAdditionalViews && <Tabs
473
- className={"self-end"}
474
516
  value={selectedTab}
475
517
  onValueChange={(value) => {
476
518
  onSideTabClick(value);
@@ -480,7 +522,7 @@ export function EntityEditViewInner<M extends Record<string, any>>({
480
522
  disabled={!hasAdditionalViews}
481
523
  value={JSON_TAB_VALUE}
482
524
  className={"text-sm"}>
483
- <CodeIcon size={"small"}/>
525
+ <CodeIcon size={"small"} />
484
526
  </Tab>}
485
527
 
486
528
  {customViewTabsStart}
@@ -495,13 +537,15 @@ export function EntityEditViewInner<M extends Record<string, any>>({
495
537
 
496
538
  {customViewTabsEnd}
497
539
 
540
+ {viewGroupMenus}
541
+
498
542
  {subcollectionTabs}
499
543
  </Tabs>}
500
544
  </div>}
501
545
 
502
546
  {globalLoading
503
547
  ? <div className="w-full pt-12 pb-16 px-4 sm:px-8 md:px-10">
504
- <CircularProgressCenter/>
548
+ <CircularProgressCenter />
505
549
  </div>
506
550
  : <>
507
551
  {entityReadOnlyView}
@@ -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}