@firecms/core 3.0.0-canary.18 → 3.0.0-canary.182

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 (366) hide show
  1. package/README.md +3 -3
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +16 -0
  4. package/dist/app/Scaffold.d.ts +30 -0
  5. package/dist/app/index.d.ts +4 -0
  6. package/dist/app/useApp.d.ts +16 -0
  7. package/dist/components/ArrayContainer.d.ts +23 -6
  8. package/dist/components/CircularProgressCenter.d.ts +1 -1
  9. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  10. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +13 -13
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +22 -6
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  15. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  16. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
  17. package/dist/components/EntityCollectionTable/index.d.ts +1 -1
  18. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  19. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  20. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
  21. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +16 -2
  22. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  23. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  24. package/dist/components/EntityPreview.d.ts +5 -4
  25. package/dist/components/ErrorView.d.ts +1 -1
  26. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  27. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  28. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  29. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  30. package/dist/components/ReferenceWidget.d.ts +3 -1
  31. package/dist/components/SelectableTable/SelectableTable.d.ts +13 -3
  32. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  33. package/dist/components/UnsavedChangesDialog.d.ts +8 -0
  34. package/dist/components/VirtualTable/VirtualTableProps.d.ts +28 -12
  35. package/dist/components/VirtualTable/types.d.ts +3 -3
  36. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -3
  37. package/dist/components/common/index.d.ts +2 -1
  38. package/dist/components/common/table_height.d.ts +5 -0
  39. package/dist/components/common/types.d.ts +4 -6
  40. package/dist/components/common/useColumnsIds.d.ts +3 -1
  41. package/dist/components/common/{useDataSourceEntityCollectionTableController.d.ts → useDataSourceTableController.d.ts} +13 -2
  42. package/dist/components/common/useDebouncedCallback.d.ts +1 -0
  43. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  44. package/dist/components/index.d.ts +4 -2
  45. package/dist/contexts/BreacrumbsContext.d.ts +8 -0
  46. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  47. package/dist/core/DefaultDrawer.d.ts +19 -0
  48. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  49. package/dist/core/EntityEditView.d.ts +41 -9
  50. package/dist/core/FireCMS.d.ts +2 -2
  51. package/dist/core/FireCMSRouter.d.ts +4 -0
  52. package/dist/core/NavigationRoutes.d.ts +2 -3
  53. package/dist/core/index.d.ts +4 -4
  54. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  55. package/dist/form/components/ErrorFocus.d.ts +1 -1
  56. package/dist/form/components/FieldHelperText.d.ts +3 -3
  57. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  58. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  59. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  60. package/dist/form/components/index.d.ts +1 -1
  61. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  62. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  63. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  64. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  65. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  66. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  67. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  68. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  70. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  71. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  73. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  74. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  75. package/dist/form/index.d.ts +3 -5
  76. package/dist/form/useClearRestoreValue.d.ts +2 -2
  77. package/dist/hooks/data/delete.d.ts +4 -4
  78. package/dist/hooks/data/save.d.ts +4 -5
  79. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  80. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  81. package/dist/hooks/index.d.ts +1 -0
  82. package/dist/hooks/useAuthController.d.ts +1 -1
  83. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  84. package/dist/hooks/useBuildNavigationController.d.ts +3 -5
  85. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  86. package/dist/hooks/useProjectLog.d.ts +8 -2
  87. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  88. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  89. package/dist/index.d.ts +1 -0
  90. package/dist/index.es.js +21537 -14243
  91. package/dist/index.es.js.map +1 -1
  92. package/dist/index.umd.js +23973 -588
  93. package/dist/index.umd.js.map +1 -1
  94. package/dist/internal/useBuildDataSource.d.ts +1 -16
  95. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  96. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  97. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  98. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  99. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  100. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  101. package/dist/preview/util.d.ts +3 -3
  102. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  103. package/dist/routes/FireCMSRoute.d.ts +1 -0
  104. package/dist/routes/HomePageRoute.d.ts +3 -0
  105. package/dist/types/auth.d.ts +8 -10
  106. package/dist/types/collections.d.ts +71 -22
  107. package/dist/types/datasource.d.ts +52 -36
  108. package/dist/types/dialogs_controller.d.ts +7 -3
  109. package/dist/types/entities.d.ts +7 -2
  110. package/dist/types/entity_actions.d.ts +28 -4
  111. package/dist/types/entity_callbacks.d.ts +16 -16
  112. package/dist/types/entity_overrides.d.ts +2 -2
  113. package/dist/types/export_import.d.ts +4 -4
  114. package/dist/types/fields.d.ts +66 -42
  115. package/dist/types/firecms.d.ts +6 -2
  116. package/dist/types/firecms_context.d.ts +1 -1
  117. package/dist/types/index.d.ts +0 -1
  118. package/dist/types/navigation.d.ts +31 -14
  119. package/dist/types/permissions.d.ts +4 -4
  120. package/dist/types/plugins.d.ts +23 -12
  121. package/dist/types/properties.d.ts +51 -23
  122. package/dist/types/property_config.d.ts +0 -2
  123. package/dist/types/side_dialogs_controller.d.ts +10 -0
  124. package/dist/types/side_entity_controller.d.ts +1 -1
  125. package/dist/types/storage.d.ts +86 -3
  126. package/dist/types/user.d.ts +1 -0
  127. package/dist/util/builders.d.ts +3 -3
  128. package/dist/util/entities.d.ts +3 -3
  129. package/dist/util/entity_actions.d.ts +2 -0
  130. package/dist/util/entity_cache.d.ts +23 -0
  131. package/dist/util/icon_list.d.ts +5 -1
  132. package/dist/util/icon_synonyms.d.ts +1 -98
  133. package/dist/util/icons.d.ts +6 -3
  134. package/dist/util/index.d.ts +2 -0
  135. package/dist/util/navigation_from_path.d.ts +5 -1
  136. package/dist/util/navigation_utils.d.ts +14 -3
  137. package/dist/util/objects.d.ts +2 -1
  138. package/dist/util/permissions.d.ts +4 -4
  139. package/dist/util/plurals.d.ts +0 -2
  140. package/dist/util/property_utils.d.ts +3 -3
  141. package/dist/util/resolutions.d.ts +30 -16
  142. package/dist/util/storage.d.ts +23 -2
  143. package/dist/util/useStorageUploadController.d.ts +3 -3
  144. package/package.json +61 -48
  145. package/src/app/AppBar.tsx +18 -0
  146. package/src/app/Drawer.tsx +24 -0
  147. package/src/app/Scaffold.tsx +243 -0
  148. package/src/app/index.ts +4 -0
  149. package/src/app/useApp.tsx +32 -0
  150. package/src/components/ArrayContainer.tsx +126 -40
  151. package/src/components/CircularProgressCenter.tsx +2 -2
  152. package/src/components/ClearFilterSortButton.tsx +41 -0
  153. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  154. package/src/components/DeleteEntityDialog.tsx +10 -19
  155. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +54 -37
  156. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  157. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  158. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
  159. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  160. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  161. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  162. package/src/components/EntityCollectionTable/index.tsx +1 -1
  163. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
  164. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  165. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  166. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +84 -77
  167. package/src/components/EntityCollectionView/EntityCollectionView.tsx +206 -112
  168. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  169. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  170. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  171. package/src/components/EntityCollectionView/utils.ts +19 -0
  172. package/src/components/EntityPreview.tsx +62 -52
  173. package/src/components/EntityView.tsx +10 -10
  174. package/src/components/ErrorView.tsx +4 -4
  175. package/src/components/HomePage/DefaultHomePage.tsx +26 -19
  176. package/src/components/HomePage/FavouritesView.tsx +6 -11
  177. package/src/components/HomePage/NavigationCard.tsx +3 -3
  178. package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
  179. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  180. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  181. package/src/components/NotFoundPage.tsx +2 -2
  182. package/src/components/PropertyConfigBadge.tsx +9 -3
  183. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  184. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +19 -13
  185. package/src/components/ReferenceWidget.tsx +21 -11
  186. package/src/components/SearchIconsView.tsx +10 -7
  187. package/src/components/SelectableTable/SelectableTable.tsx +27 -12
  188. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  189. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  190. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  191. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  192. package/src/components/UnsavedChangesDialog.tsx +42 -0
  193. package/src/components/VirtualTable/VirtualTable.tsx +96 -48
  194. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  195. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  196. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  197. package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
  198. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  199. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  200. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  201. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  202. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  203. package/src/components/VirtualTable/types.tsx +2 -3
  204. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +33 -40
  205. package/src/components/common/index.ts +2 -1
  206. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  207. package/src/components/common/types.tsx +4 -6
  208. package/src/components/common/useColumnsIds.tsx +24 -3
  209. package/src/components/common/useDataSourceTableController.tsx +420 -0
  210. package/src/components/common/useDebouncedCallback.tsx +20 -0
  211. package/src/components/common/useScrollRestoration.tsx +68 -0
  212. package/src/components/common/useTableSearchHelper.ts +53 -12
  213. package/src/components/index.tsx +4 -2
  214. package/src/contexts/BreacrumbsContext.tsx +38 -0
  215. package/src/contexts/DialogsProvider.tsx +5 -4
  216. package/src/contexts/SnackbarProvider.tsx +2 -0
  217. package/src/core/DefaultAppBar.tsx +201 -0
  218. package/src/core/DefaultDrawer.tsx +185 -0
  219. package/src/core/DrawerNavigationItem.tsx +66 -0
  220. package/src/core/EntityEditView.tsx +1001 -213
  221. package/src/core/EntitySidePanel.tsx +80 -17
  222. package/src/core/FireCMS.tsx +56 -49
  223. package/src/core/FireCMSRouter.tsx +17 -0
  224. package/src/core/NavigationRoutes.tsx +20 -34
  225. package/src/core/SideDialogs.tsx +12 -6
  226. package/src/core/field_configs.tsx +11 -12
  227. package/src/core/index.tsx +6 -5
  228. package/src/form/PropertyFieldBinding.tsx +85 -44
  229. package/src/form/components/CustomIdField.tsx +6 -2
  230. package/src/form/components/FieldHelperText.tsx +4 -4
  231. package/src/form/components/LabelWithIcon.tsx +30 -19
  232. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  233. package/src/form/components/StorageItemPreview.tsx +22 -12
  234. package/src/form/components/StorageUploadProgress.tsx +3 -4
  235. package/src/form/components/index.tsx +1 -1
  236. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +31 -17
  237. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
  238. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  239. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  240. package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
  241. package/src/form/field_bindings/MapFieldBinding.tsx +72 -53
  242. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
  243. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  244. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  245. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  246. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -35
  247. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
  248. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +37 -47
  249. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  250. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  251. package/src/form/index.tsx +4 -9
  252. package/src/form/useClearRestoreValue.tsx +2 -2
  253. package/src/form/validation.ts +1 -17
  254. package/src/hooks/data/delete.ts +6 -5
  255. package/src/hooks/data/save.ts +13 -9
  256. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  257. package/src/hooks/data/useDataSource.tsx +11 -3
  258. package/src/hooks/data/useEntityFetch.tsx +10 -6
  259. package/src/hooks/index.tsx +1 -0
  260. package/src/hooks/useAuthController.tsx +1 -1
  261. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  262. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  263. package/src/hooks/useBuildModeController.tsx +11 -5
  264. package/src/hooks/useBuildNavigationController.tsx +150 -50
  265. package/src/hooks/useFireCMSContext.tsx +5 -5
  266. package/src/hooks/useLargeLayout.tsx +0 -35
  267. package/src/hooks/useProjectLog.tsx +32 -10
  268. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  269. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  270. package/src/index.ts +1 -0
  271. package/src/internal/useBuildDataSource.ts +72 -82
  272. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  273. package/src/internal/useBuildSideEntityController.tsx +230 -70
  274. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  275. package/src/preview/PropertyPreview.tsx +13 -20
  276. package/src/preview/PropertyPreviewProps.tsx +7 -1
  277. package/src/preview/components/BooleanPreview.tsx +2 -2
  278. package/src/preview/components/EmptyValue.tsx +1 -1
  279. package/src/preview/components/EnumValuesChip.tsx +2 -2
  280. package/src/preview/components/ImagePreview.tsx +25 -36
  281. package/src/preview/components/ReferencePreview.tsx +22 -33
  282. package/src/preview/components/StorageThumbnail.tsx +5 -1
  283. package/src/preview/components/UrlComponentPreview.tsx +44 -11
  284. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  285. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  286. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  287. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  288. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  289. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  290. package/src/preview/property_previews/MapPropertyPreview.tsx +9 -9
  291. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  292. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  293. package/src/preview/util.ts +10 -10
  294. package/src/routes/CustomCMSRoute.tsx +21 -0
  295. package/src/routes/FireCMSRoute.tsx +230 -0
  296. package/src/routes/HomePageRoute.tsx +17 -0
  297. package/src/types/auth.tsx +9 -13
  298. package/src/types/collections.ts +87 -27
  299. package/src/types/customization_controller.tsx +0 -1
  300. package/src/types/datasource.ts +61 -43
  301. package/src/types/dialogs_controller.tsx +7 -3
  302. package/src/types/entities.ts +12 -2
  303. package/src/types/entity_actions.tsx +32 -7
  304. package/src/types/entity_callbacks.ts +18 -18
  305. package/src/types/entity_overrides.tsx +2 -2
  306. package/src/types/export_import.ts +4 -4
  307. package/src/types/fields.tsx +72 -46
  308. package/src/types/firecms.tsx +7 -2
  309. package/src/types/firecms_context.tsx +1 -1
  310. package/src/types/index.ts +0 -1
  311. package/src/types/navigation.ts +37 -18
  312. package/src/types/permissions.ts +5 -5
  313. package/src/types/plugins.tsx +25 -14
  314. package/src/types/properties.ts +59 -24
  315. package/src/types/property_config.tsx +0 -2
  316. package/src/types/side_dialogs_controller.tsx +13 -0
  317. package/src/types/side_entity_controller.tsx +1 -1
  318. package/src/types/storage.ts +94 -3
  319. package/src/types/user.ts +2 -0
  320. package/src/util/builders.ts +10 -8
  321. package/src/util/entities.ts +9 -6
  322. package/src/util/entity_actions.ts +28 -0
  323. package/src/util/entity_cache.ts +196 -0
  324. package/src/util/enums.ts +1 -1
  325. package/src/util/icon_list.ts +16 -10
  326. package/src/util/icon_synonyms.ts +3 -100
  327. package/src/util/icons.tsx +17 -7
  328. package/src/util/index.ts +2 -0
  329. package/src/util/join_collections.ts +3 -0
  330. package/src/util/make_properties_editable.ts +13 -5
  331. package/src/util/navigation_from_path.ts +10 -2
  332. package/src/util/navigation_utils.ts +59 -7
  333. package/src/util/objects.ts +45 -28
  334. package/src/util/parent_references_from_path.ts +3 -3
  335. package/src/util/permissions.ts +9 -8
  336. package/src/util/plurals.ts +0 -2
  337. package/src/util/property_utils.tsx +11 -4
  338. package/src/util/references.ts +11 -2
  339. package/src/util/resolutions.ts +79 -46
  340. package/src/util/storage.ts +79 -21
  341. package/src/util/strings.ts +2 -2
  342. package/src/util/useStorageUploadController.tsx +34 -8
  343. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  344. package/dist/components/VirtualTable/common.d.ts +0 -2
  345. package/dist/core/Drawer.d.ts +0 -23
  346. package/dist/core/Scaffold.d.ts +0 -55
  347. package/dist/core/SideEntityView.d.ts +0 -7
  348. package/dist/form/EntityForm.d.ts +0 -77
  349. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  350. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  351. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  352. package/dist/internal/useLocaleConfig.d.ts +0 -1
  353. package/dist/types/appcheck.d.ts +0 -26
  354. package/src/components/FireCMSAppBar.tsx +0 -165
  355. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  356. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  357. package/src/core/Drawer.tsx +0 -191
  358. package/src/core/Scaffold.tsx +0 -281
  359. package/src/core/SideEntityView.tsx +0 -38
  360. package/src/form/EntityForm.tsx +0 -728
  361. package/src/form/components/FormikArrayContainer.tsx +0 -44
  362. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  363. package/src/internal/useBuildCustomizationController.tsx +0 -5
  364. package/src/internal/useLocaleConfig.tsx +0 -18
  365. package/src/types/appcheck.ts +0 -29
  366. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -1,728 +0,0 @@
1
- import React, { MutableRefObject, useCallback, useEffect, useMemo, useRef, useState } from "react";
2
-
3
- import {
4
- CMSAnalyticsEvent,
5
- Entity,
6
- EntityAction,
7
- EntityCollection,
8
- EntityStatus,
9
- EntityValues,
10
- FormContext,
11
- PluginFormActionProps,
12
- PropertyFieldBindingProps,
13
- ResolvedEntityCollection
14
- } from "../types";
15
- import { Formex, FormexController, getIn, setIn, useCreateFormex } from "@firecms/formex";
16
- import { PropertyFieldBinding } from "./PropertyFieldBinding";
17
- import { CustomFieldValidator, getYupEntitySchema } from "./validation";
18
- import equal from "react-fast-compare"
19
- import {
20
- canCreateEntity,
21
- canDeleteEntity,
22
- getDefaultValuesFor,
23
- getEntityTitlePropertyKey,
24
- getValueInPath,
25
- isHidden,
26
- isReadOnly,
27
- resolveCollection
28
- } from "../util";
29
- import {
30
- useAuthController,
31
- useCustomizationController,
32
- useDataSource,
33
- useFireCMSContext,
34
- useSideEntityController
35
- } from "../hooks";
36
- import { ErrorFocus } from "./components/ErrorFocus";
37
- import { CustomIdField } from "./components/CustomIdField";
38
- import { Alert, Button, cn, DialogActions, IconButton, Tooltip, Typography } from "@firecms/ui";
39
- import { ErrorBoundary } from "../components";
40
- import {
41
- copyEntityAction,
42
- deleteEntityAction
43
- } from "../components/EntityCollectionTable/internal/default_entity_actions";
44
- import { useAnalyticsController } from "../hooks/useAnalyticsController";
45
- import { ValidationError } from "yup";
46
- import { PropertyIdCopyTooltipContent } from "../components/PropertyIdCopyTooltipContent";
47
-
48
- /**
49
- * @group Components
50
- */
51
- export interface EntityFormProps<M extends Record<string, any>> {
52
-
53
- /**
54
- * New or existing status
55
- */
56
- status: EntityStatus;
57
-
58
- /**
59
- * Path of the collection this entity is located
60
- */
61
- path: string;
62
-
63
- /**
64
- * The collection is used to build the fields of the form
65
- */
66
- collection: EntityCollection<M>
67
-
68
- /**
69
- * The updated entity is passed from the parent component when the underlying data
70
- * has changed in the datasource
71
- */
72
- entity?: Entity<M>;
73
-
74
- /**
75
- * The callback function called when Save is clicked and validation is correct
76
- */
77
- onEntitySaveRequested: (
78
- props: EntityFormSaveParams<M>
79
- ) => Promise<void>;
80
-
81
- /**
82
- * The callback function called when discard is clicked
83
- */
84
- onDiscard?: () => void;
85
-
86
- /**
87
- * The callback function when the form is dirty, so the values are different
88
- * from the original ones
89
- */
90
- onModified?: (dirty: boolean) => void;
91
-
92
- /**
93
- * The callback function when the form original values have been modified
94
- */
95
- onValuesChanged?: (values?: EntityValues<M>) => void;
96
-
97
- /**
98
- *
99
- * @param id
100
- */
101
- onIdChange?: (id: string) => void;
102
-
103
- currentEntityId?: string;
104
-
105
- onFormContextChange?: (formContext: FormContext<M>) => void;
106
-
107
- hideId?: boolean;
108
-
109
- autoSave?: boolean;
110
-
111
- onIdUpdateError?: (error: any) => void;
112
-
113
- }
114
-
115
- export type EntityFormSaveParams<M extends Record<string, any>> = {
116
- collection: ResolvedEntityCollection<M>,
117
- path: string,
118
- entityId: string | undefined,
119
- values: EntityValues<M>,
120
- previousValues?: EntityValues<M>,
121
- closeAfterSave: boolean,
122
- autoSave: boolean
123
- };
124
-
125
- /**
126
- * This is the form used internally by the CMS
127
- * @param status
128
- * @param path
129
- * @param collection
130
- * @param entity
131
- * @param onEntitySave
132
- * @param onDiscard
133
- * @param onModified
134
- * @param onValuesChanged
135
- * @constructor
136
- * @group Components
137
- */
138
- export const EntityForm = React.memo<EntityFormProps<any>>(EntityFormInternal,
139
- (a: EntityFormProps<any>, b: EntityFormProps<any>) => {
140
- return a.status === b.status &&
141
- a.path === b.path &&
142
- equal(a.entity?.values, b.entity?.values);
143
- }) as typeof EntityFormInternal;
144
-
145
- function getDataSourceEntityValues<M extends object>(initialResolvedCollection: ResolvedEntityCollection,
146
- status: "new" | "existing" | "copy",
147
- entity: Entity<M> | undefined): Partial<EntityValues<M>> {
148
- const properties = initialResolvedCollection.properties;
149
- if ((status === "existing" || status === "copy") && entity) {
150
- return entity.values ?? getDefaultValuesFor(properties);
151
- } else if (status === "new") {
152
- return getDefaultValuesFor(properties);
153
- } else {
154
- console.error({
155
- status,
156
- entity
157
- });
158
- throw new Error("Form has not been initialised with the correct parameters");
159
- }
160
- }
161
-
162
- function EntityFormInternal<M extends Record<string, any>>({
163
- status,
164
- path,
165
- collection: inputCollection,
166
- entity,
167
- onEntitySaveRequested,
168
- onDiscard,
169
- onModified,
170
- onValuesChanged,
171
- onIdChange,
172
- onFormContextChange,
173
- hideId,
174
- autoSave,
175
- onIdUpdateError,
176
- }: EntityFormProps<M>) {
177
-
178
- const analyticsController = useAnalyticsController();
179
-
180
- const customizationController = useCustomizationController();
181
-
182
- const context = useFireCMSContext();
183
- const dataSource = useDataSource(inputCollection);
184
- const plugins = customizationController.plugins;
185
-
186
- const initialResolvedCollection = useMemo(() => resolveCollection({
187
- collection: inputCollection,
188
- path,
189
- values: entity?.values,
190
- fields: customizationController.propertyConfigs
191
- }), [entity?.values, path]);
192
-
193
- const mustSetCustomId: boolean = (status === "new" || status === "copy") &&
194
- (Boolean(initialResolvedCollection.customId) && initialResolvedCollection.customId !== "optional");
195
-
196
- const initialEntityId = useMemo(() => {
197
- if (status === "new" || status === "copy") {
198
- if (mustSetCustomId) {
199
- return undefined;
200
- } else {
201
- return dataSource.generateEntityId(path);
202
- }
203
- } else {
204
- return entity?.id;
205
- }
206
- }, []);
207
-
208
- const closeAfterSaveRef = useRef(false);
209
-
210
- const baseDataSourceValuesRef = useRef<Partial<EntityValues<M>>>(getDataSourceEntityValues(initialResolvedCollection, status, entity));
211
-
212
- const [entityId, setEntityId] = React.useState<string | undefined>(initialEntityId);
213
- const [entityIdError, setEntityIdError] = React.useState<boolean>(false);
214
- const [savingError, setSavingError] = React.useState<Error | undefined>();
215
-
216
- const [customIdLoading, setCustomIdLoading] = React.useState<boolean>(false);
217
-
218
- // const initialValuesRef = useRef<EntityValues<M>>(entity?.values ?? baseDataSourceValues as EntityValues<M>);
219
- const [internalValues, setInternalValues] = useState<EntityValues<M> | undefined>(entity?.values ?? baseDataSourceValuesRef.current as EntityValues<M>);
220
-
221
- const save = (values: EntityValues<M>): Promise<void> => {
222
- return onEntitySaveRequested({
223
- collection: resolvedCollection,
224
- path,
225
- entityId,
226
- values,
227
- previousValues: entity?.values,
228
- closeAfterSave: closeAfterSaveRef.current,
229
- autoSave: autoSave ?? false
230
- }).then(_ => {
231
- const eventName: CMSAnalyticsEvent = status === "new"
232
- ? "new_entity_saved"
233
- : (status === "copy" ? "entity_copied" : (status === "existing" ? "entity_edited" : "unmapped_event"));
234
- analyticsController.onAnalyticsEvent?.(eventName, { path });
235
- }).catch(e => {
236
- console.error(e);
237
- setSavingError(e);
238
- }).finally(() => {
239
- closeAfterSaveRef.current = false;
240
- });
241
- };
242
-
243
- const onSubmit = (values: EntityValues<M>, formexController: FormexController<EntityValues<M>>) => {
244
-
245
- if (mustSetCustomId && !entityId) {
246
- console.error("Missing custom Id");
247
- setEntityIdError(true);
248
- formexController.setSubmitting(false);
249
- return;
250
- }
251
-
252
- setSavingError(undefined);
253
- setEntityIdError(false);
254
-
255
- if (status === "existing") {
256
- if (!entity?.id) throw Error("Form misconfiguration when saving, no id for existing entity");
257
- } else if (status === "new" || status === "copy") {
258
- if (inputCollection.customId) {
259
- if (inputCollection.customId !== "optional" && !entityId) {
260
- throw Error("Form misconfiguration when saving, entityId should be set");
261
- }
262
- }
263
- } else {
264
- throw Error("New FormType added, check EntityForm");
265
- }
266
-
267
- return save(values)
268
- ?.then(_ => {
269
- formexController.resetForm({
270
- values,
271
- submitCount: 0,
272
- touched: {}
273
- });
274
- })
275
- .finally(() => {
276
- formexController.setSubmitting(false);
277
- });
278
-
279
- };
280
-
281
- const formex: FormexController<M> = useCreateFormex<M>({
282
- initialValues: baseDataSourceValuesRef.current as M,
283
- onSubmit,
284
- validation: (values) => {
285
- return validationSchema?.validate(values, { abortEarly: false })
286
- .then(() => {
287
- return {};
288
- })
289
- .catch((e) => {
290
-
291
- const errors: Record<string, string> = {};
292
- e.inner.forEach((error: any) => {
293
- errors[error.path] = error.message;
294
- });
295
- return yupToFormErrors(e);
296
- });
297
- }
298
- });
299
-
300
- useEffect(() => {
301
- baseDataSourceValuesRef.current = getDataSourceEntityValues(initialResolvedCollection, status, entity);
302
- const initialValues = formex.initialValues;
303
- if (!formex.isSubmitting && initialValues && status === "existing") {
304
- setUnderlyingChanges(
305
- Object.entries(resolvedCollection.properties)
306
- .map(([key, property]) => {
307
- if (isHidden(property)) {
308
- return {};
309
- }
310
- const initialValue = initialValues[key];
311
- const latestValue = baseDataSourceValuesRef.current[key];
312
- if (!equal(initialValue, latestValue)) {
313
- return { [key]: latestValue };
314
- }
315
- return {};
316
- })
317
- .reduce((a, b) => ({ ...a, ...b }), {}) as Partial<EntityValues<M>>
318
- );
319
- } else {
320
- setUnderlyingChanges({});
321
- }
322
- }, [entity, initialResolvedCollection, status]);
323
-
324
- const doOnValuesChanges = (values?: EntityValues<M>) => {
325
- const initialValues = formex.initialValues;
326
- setInternalValues(values);
327
- if (onValuesChanged)
328
- onValuesChanged(values);
329
- if (autoSave && values && !equal(values, initialValues)) {
330
- save(values);
331
- }
332
- };
333
-
334
- useEffect(() => {
335
- if (entityId && onIdChange)
336
- onIdChange(entityId);
337
- }, [entityId, onIdChange]);
338
-
339
- const resolvedCollection = resolveCollection<M>({
340
- collection: inputCollection,
341
- path,
342
- entityId,
343
- values: internalValues,
344
- previousValues: formex.initialValues,
345
- fields: customizationController.propertyConfigs
346
- });
347
-
348
- const titlePropertyKey = getEntityTitlePropertyKey(resolvedCollection, customizationController.propertyConfigs);
349
- const title = internalValues && titlePropertyKey ? getValueInPath(internalValues, titlePropertyKey) : undefined;
350
-
351
- const onIdUpdate = inputCollection.callbacks?.onIdUpdate;
352
-
353
- const doOnIdUpdate = useCallback(async () => {
354
- if (onIdUpdate && internalValues && (status === "new" || status === "copy")) {
355
- setCustomIdLoading(true);
356
- try {
357
- const updatedId = await onIdUpdate({
358
- collection: resolvedCollection,
359
- path,
360
- entityId,
361
- values: internalValues,
362
- context
363
- });
364
- setEntityId(updatedId);
365
- } catch (e) {
366
- onIdUpdateError && onIdUpdateError(e);
367
- console.error(e);
368
- }
369
- setCustomIdLoading(false);
370
- }
371
- }, [entityId, internalValues, status]);
372
-
373
- useEffect(() => {
374
- doOnIdUpdate();
375
- }, [doOnIdUpdate]);
376
-
377
- const [underlyingChanges, setUnderlyingChanges] = useState<Partial<EntityValues<M>>>({});
378
-
379
- const uniqueFieldValidator: CustomFieldValidator = useCallback(({
380
- name,
381
- value,
382
- property
383
- }) => dataSource.checkUniqueField(path, name, value, entityId),
384
- [dataSource, path, entityId]);
385
-
386
- const validationSchema = useMemo(() => entityId
387
- ? getYupEntitySchema(
388
- entityId,
389
- resolvedCollection.properties,
390
- uniqueFieldValidator)
391
- : undefined,
392
- [entityId, resolvedCollection.properties, uniqueFieldValidator]);
393
-
394
- const authController = useAuthController();
395
-
396
- const getActionsForEntity = useCallback(({
397
- entity,
398
- customEntityActions
399
- }: {
400
- entity?: Entity<M>,
401
- customEntityActions?: EntityAction[]
402
- }): EntityAction[] => {
403
- const createEnabled = canCreateEntity(inputCollection, authController, path, null);
404
- const deleteEnabled = entity ? canDeleteEntity(inputCollection, authController, path, entity) : true;
405
- const actions: EntityAction[] = [];
406
- if (createEnabled)
407
- actions.push(copyEntityAction);
408
- if (deleteEnabled)
409
- actions.push(deleteEntityAction);
410
- if (customEntityActions)
411
- actions.push(...customEntityActions);
412
- return actions;
413
- }, [authController, inputCollection, path]);
414
-
415
- const pluginActions: React.ReactNode[] = [];
416
-
417
- const formContext: FormContext<M> = {
418
- setFieldValue: formex.setFieldValue,
419
- values: formex.values,
420
- collection: resolvedCollection,
421
- entityId,
422
- path,
423
- save
424
- };
425
-
426
- // eslint-disable-next-line react-hooks/rules-of-hooks
427
- useEffect(() => {
428
- if (onFormContextChange) {
429
- onFormContextChange(formContext);
430
- }
431
- }, [onFormContextChange, formContext]);
432
-
433
- if (plugins && inputCollection) {
434
- const actionProps: PluginFormActionProps = {
435
- entityId,
436
- path,
437
- status,
438
- collection: inputCollection,
439
- context,
440
- currentEntityId: entityId,
441
- formContext
442
- };
443
- pluginActions.push(...plugins.map((plugin, i) => (
444
- plugin.form?.Actions
445
- ? <plugin.form.Actions
446
- key={`actions_${plugin.key}`} {...actionProps}/>
447
- : null
448
- )).filter(Boolean));
449
- }
450
-
451
- return <Formex value={formex}>
452
- <div className="h-full overflow-auto">
453
-
454
- {pluginActions.length > 0 && <div
455
- className={cn("w-full flex justify-end items-center sticky top-0 right-0 left-0 z-10 bg-opacity-60 bg-slate-200 dark:bg-opacity-60 dark:bg-slate-800 backdrop-blur-md")}>
456
- {pluginActions}
457
- </div>}
458
-
459
- <div className="pt-12 pb-16 pl-8 pr-8 md:pl-10 md:pr-10">
460
- <div
461
- className={`w-full py-2 flex flex-col items-start mt-${4 + (pluginActions ? 8 : 0)} lg:mt-${8 + (pluginActions ? 8 : 0)} mb-8`}>
462
-
463
- <Typography
464
- className={"mt-4 flex-grow line-clamp-1 " + inputCollection.hideIdFromForm ? "mb-2" : "mb-0"}
465
- variant={"h4"}>{title ?? inputCollection.singularName ?? inputCollection.name}
466
- </Typography>
467
- <Alert color={"base"} className={"w-full"} size={"small"}>
468
- <code className={"text-xs select-all"}>{path}/{entityId}</code>
469
- </Alert>
470
- </div>
471
-
472
- {!hideId &&
473
- <CustomIdField customId={inputCollection.customId}
474
- entityId={entityId}
475
- status={status}
476
- onChange={setEntityId}
477
- error={entityIdError}
478
- loading={customIdLoading}
479
- entity={entity}/>}
480
-
481
- {entityId && <InnerForm
482
- {...formex}
483
- initialValues={formex.initialValues}
484
- onModified={onModified}
485
- onDiscard={onDiscard}
486
- onValuesChanged={doOnValuesChanges}
487
- underlyingChanges={underlyingChanges}
488
- entity={entity}
489
- resolvedCollection={resolvedCollection}
490
- formContext={formContext}
491
- status={status}
492
- savingError={savingError}
493
- closeAfterSaveRef={closeAfterSaveRef}
494
- autoSave={autoSave}
495
- entityActions={getActionsForEntity({
496
- entity,
497
- customEntityActions: inputCollection.entityActions
498
- })}/>}
499
-
500
- </div>
501
- </div>
502
- </Formex>
503
- }
504
-
505
- function InnerForm<M extends Record<string, any>>(props: FormexController<M> & {
506
- initialValues: EntityValues<M>,
507
- onModified: ((modified: boolean) => void) | undefined,
508
- onValuesChanged?: (changedValues?: EntityValues<M>) => void,
509
- underlyingChanges: Partial<M>,
510
- entity: Entity<M> | undefined,
511
- resolvedCollection: ResolvedEntityCollection<M>,
512
- formContext: FormContext<M>,
513
- onDiscard?: () => void,
514
- status: "new" | "existing" | "copy",
515
- savingError?: Error,
516
- closeAfterSaveRef: MutableRefObject<boolean>,
517
- autoSave?: boolean,
518
- entityActions: EntityAction[],
519
- }) {
520
-
521
- const {
522
- values,
523
- onDiscard,
524
- onModified,
525
- onValuesChanged,
526
- underlyingChanges,
527
- formContext,
528
- entity,
529
- touched,
530
- setFieldValue,
531
- resolvedCollection,
532
- isSubmitting,
533
- status,
534
- handleSubmit,
535
- resetForm,
536
- savingError,
537
- dirty,
538
- closeAfterSaveRef,
539
- autoSave,
540
- entityActions,
541
- } = props;
542
-
543
- const context = useFireCMSContext();
544
- const formActions = entityActions.filter(a => a.includeInForm === undefined || a.includeInForm);
545
- const sideEntityController = useSideEntityController();
546
-
547
- const modified = dirty;
548
- useEffect(() => {
549
- if (onModified)
550
- onModified(modified);
551
- if (onValuesChanged)
552
- onValuesChanged(values);
553
- }, [modified, values]);
554
-
555
- useEffect(() => {
556
- if (!autoSave && !isSubmitting && underlyingChanges && entity) {
557
- // we update the form fields from the Firestore data
558
- // if they were not touched
559
- Object.entries(underlyingChanges).forEach(([key, value]) => {
560
- const formValue = values[key];
561
- if (!equal(value, formValue) && !touched[key]) {
562
- console.debug("Updated value from the datasource:", key, value);
563
- setFieldValue(key, value !== undefined ? value : null);
564
- }
565
- });
566
- }
567
- }, [isSubmitting, autoSave, underlyingChanges, entity, values, touched, setFieldValue]);
568
-
569
- const formFields = (
570
- <div className={"flex flex-col gap-8"}>
571
- {(resolvedCollection.propertiesOrder ?? Object.keys(resolvedCollection.properties))
572
- .map((key) => {
573
-
574
- const property = resolvedCollection.properties[key];
575
- if (!property) {
576
- console.warn(`Property ${key} not found in collection ${resolvedCollection.name}`);
577
- return null;
578
- }
579
-
580
- const underlyingValueHasChanged: boolean =
581
- !!underlyingChanges &&
582
- Object.keys(underlyingChanges).includes(key) &&
583
- !!touched[key];
584
-
585
- const disabled = (!autoSave && isSubmitting) || isReadOnly(property) || Boolean(property.disabled);
586
- const hidden = isHidden(property);
587
- if (hidden) return null;
588
- const cmsFormFieldProps: PropertyFieldBindingProps<any, M> = {
589
- propertyKey: key,
590
- disabled,
591
- property,
592
- includeDescription: property.description || property.longDescription,
593
- underlyingValueHasChanged: underlyingValueHasChanged && !autoSave,
594
- context: formContext,
595
- tableMode: false,
596
- partOfArray: false,
597
- partOfBlock: false,
598
- autoFocus: false
599
- };
600
-
601
- return (
602
- <div id={`form_field_${key}`}
603
- key={`field_${resolvedCollection.name}_${key}`}>
604
- <ErrorBoundary>
605
- <Tooltip title={<PropertyIdCopyTooltipContent propertyId={key}/>}
606
- delayDuration={800}
607
- side={"left"}
608
- align={"start"}
609
- sideOffset={16}>
610
- <PropertyFieldBinding {...cmsFormFieldProps}/>
611
- </Tooltip>
612
- </ErrorBoundary>
613
- </div>
614
- );
615
- })
616
- .filter(Boolean)}
617
-
618
- </div>
619
- );
620
-
621
- const disabled = isSubmitting || (!modified && status === "existing");
622
- const formRef = React.useRef<HTMLDivElement>(null);
623
-
624
- return (
625
-
626
- <form onSubmit={handleSubmit}
627
- onReset={() => {
628
- console.debug("Resetting form")
629
- resetForm();
630
- return onDiscard && onDiscard();
631
- }}
632
- noValidate>
633
- <div className="mt-12"
634
- ref={formRef}>
635
-
636
- {formFields}
637
-
638
- <ErrorFocus containerRef={formRef}/>
639
-
640
- </div>
641
-
642
- <div className="h-14"/>
643
-
644
- {!autoSave && <DialogActions position={"absolute"}>
645
-
646
- {savingError &&
647
- <div className="text-right">
648
- <Typography color={"error"}>
649
- {savingError.message}
650
- </Typography>
651
- </div>}
652
-
653
- {entity && formActions.length > 0 && <div className="flex-grow flex overflow-auto no-scrollbar">
654
- {formActions.map(action => (
655
- <IconButton
656
- key={action.name}
657
- color="primary"
658
- onClick={(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
659
- event.stopPropagation();
660
- if (entity)
661
- action.onClick({
662
- entity,
663
- fullPath: resolvedCollection.path,
664
- collection: resolvedCollection,
665
- context,
666
- sideEntityController,
667
- });
668
- }}>
669
- {action.icon}
670
- </IconButton>
671
- ))}
672
- </div>}
673
-
674
- <Button
675
- variant="text"
676
- disabled={disabled}
677
- type="reset"
678
- >
679
- {status === "existing" ? "Discard" : "Clear"}
680
- </Button>
681
-
682
- <Button
683
- variant="text"
684
- color="primary"
685
- type="submit"
686
- disabled={disabled}
687
- onClick={() => {
688
- closeAfterSaveRef.current = false;
689
- }}
690
- >
691
- {status === "existing" && "Save"}
692
- {status === "copy" && "Create copy"}
693
- {status === "new" && "Create"}
694
- </Button>
695
-
696
- <Button
697
- variant="filled"
698
- color="primary"
699
- type="submit"
700
- disabled={disabled}
701
- onClick={() => {
702
- closeAfterSaveRef.current = true;
703
- }}
704
- >
705
- {status === "existing" && "Save and close"}
706
- {status === "copy" && "Create copy and close"}
707
- {status === "new" && "Create and close"}
708
- </Button>
709
-
710
- </DialogActions>}
711
- </form>
712
- );
713
- }
714
-
715
- export function yupToFormErrors(yupError: ValidationError): Record<string, any> {
716
- let errors: Record<string, any> = {};
717
- if (yupError.inner) {
718
- if (yupError.inner.length === 0) {
719
- return setIn(errors, yupError.path!, yupError.message);
720
- }
721
- for (const err of yupError.inner) {
722
- if (!getIn(errors, err.path!)) {
723
- errors = setIn(errors, err.path!, err.message);
724
- }
725
- }
726
- }
727
- return errors;
728
- }