@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
@@ -10,12 +10,12 @@ import { ErrorBoundary } from "../../components";
10
10
  * @group Preview components
11
11
  */
12
12
  export function ArrayOfStringsPreview({
13
- propertyKey,
14
- value,
15
- property: inputProperty,
16
- // entity,
17
- size
18
- }: PropertyPreviewProps<string[]>) {
13
+ propertyKey,
14
+ value,
15
+ property: inputProperty,
16
+ // entity,
17
+ size
18
+ }: PropertyPreviewProps<string[]>) {
19
19
  const authController = useAuthController();
20
20
  const customizationController = useCustomizationController();
21
21
  const property = resolveArrayProperty({
@@ -25,6 +25,8 @@ export function ArrayOfStringsPreview({
25
25
  authController
26
26
  });
27
27
 
28
+ if (!property) return null;
29
+
28
30
  if (Array.isArray(property.of)) {
29
31
  throw Error("Using array properties instead of single one in `of` in ArrayProperty");
30
32
  }
@@ -43,10 +45,10 @@ export function ArrayOfStringsPreview({
43
45
  <div key={`preview_array_strings_${propertyKey}_${index}`}>
44
46
  <ErrorBoundary>
45
47
  <StringPropertyPreview propertyKey={propertyKey}
46
- property={stringProperty}
47
- value={v}
48
+ property={stringProperty}
49
+ value={v}
48
50
  // entity={entity}
49
- size={size}/>
51
+ size={size} />
50
52
  </ErrorBoundary>
51
53
  </div>
52
54
  )}
@@ -12,12 +12,12 @@ import { ErrorBoundary } from "../../components";
12
12
  * @group Preview components
13
13
  */
14
14
  export function ArrayPropertyPreview({
15
- propertyKey,
16
- value,
17
- property: inputProperty,
18
- // entity,
19
- size
20
- }: PropertyPreviewProps<any[]>) {
15
+ propertyKey,
16
+ value,
17
+ property: inputProperty,
18
+ // entity,
19
+ size
20
+ }: PropertyPreviewProps<any[]>) {
21
21
 
22
22
  const authController = useAuthController();
23
23
  const customizationController = useCustomizationController();
@@ -28,6 +28,8 @@ export function ArrayPropertyPreview({
28
28
  authController
29
29
  });
30
30
 
31
+ if (!property) return null;
32
+
31
33
  if (!property.of) {
32
34
  throw Error(`You need to specify an 'of' prop (or specify a custom field) in your array property ${propertyKey}`);
33
35
  }
@@ -45,24 +47,24 @@ export function ArrayPropertyPreview({
45
47
  <div className="w-full flex flex-col gap-2">
46
48
  {values &&
47
49
  values.map((value, index) => {
48
- const of: ResolvedProperty = property.resolvedProperties[index] ??
49
- (property.resolvedProperties[index] ?? (Array.isArray(property.of) ? property.of[index] : property.of));
50
- return of
51
- ? <React.Fragment
52
- key={"preview_array_" + index}>
53
- <div className={cls(defaultBorderMixin, "m-1 border-b last:border-b-0")}>
54
- <ErrorBoundary>
55
- <PropertyPreview
56
- propertyKey={propertyKey}
57
- // entity={entity}
58
- value={value}
59
- property={of}
60
- size={childSize}/>
61
- </ErrorBoundary>
62
- </div>
63
- </React.Fragment>
64
- : null;
65
- }
50
+ const of: ResolvedProperty = property.resolvedProperties[index] ??
51
+ (property.resolvedProperties[index] ?? (Array.isArray(property.of) ? property.of[index] : property.of));
52
+ return of
53
+ ? <React.Fragment
54
+ key={"preview_array_" + index}>
55
+ <div className={cls(defaultBorderMixin, "m-1 border-b last:border-b-0")}>
56
+ <ErrorBoundary>
57
+ <PropertyPreview
58
+ propertyKey={propertyKey}
59
+ // entity={entity}
60
+ value={value}
61
+ property={of}
62
+ size={childSize} />
63
+ </ErrorBoundary>
64
+ </div>
65
+ </React.Fragment>
66
+ : null;
67
+ }
66
68
  )}
67
69
  </div>
68
70
  );
@@ -6,6 +6,7 @@ import { PropertyPreview } from "../PropertyPreview";
6
6
  import { cls, defaultBorderMixin, Typography } from "@firecms/ui";
7
7
  import { ErrorBoundary } from "../../components";
8
8
  import { EmptyValue } from "../components/EmptyValue";
9
+ import { DatePreview } from "../components/DatePreview";
9
10
 
10
11
  /**
11
12
  * @group Preview components
@@ -111,37 +112,58 @@ export function KeyValuePreview({ value }: { value: any }) {
111
112
  return <div
112
113
  className="flex flex-col gap-1 w-full">
113
114
  {
114
- Object.entries(value).map(([key, childValue]: [string, any]) => (
115
- <div
116
- key={`map_preview_table_${key}}`}
117
- className={cls(defaultBorderMixin, "last:border-b-0 border-b")}>
115
+ Object.entries(value).map(([key, childValue]: [string, any]) => {
116
+ const isTimestampObj = childValue && typeof childValue === "object" && (
117
+ childValue instanceof Date ||
118
+ ("_seconds" in childValue && "_nanoseconds" in childValue && typeof childValue._seconds === "number" && typeof childValue._nanoseconds === "number") ||
119
+ ("seconds" in childValue && "nanoseconds" in childValue && typeof childValue.seconds === "number" && typeof childValue.nanoseconds === "number")
120
+ );
121
+
122
+ const isScalar = childValue && (typeof childValue !== "object" || isTimestampObj);
123
+
124
+ return (
118
125
  <div
119
- className={"flex flex-row pt-0.5 pb-0.5 gap-2"}>
120
- <div
121
- key={`table-cell-title-${key}-${key}`}
122
- className="min-w-[140px] w-[25%] py-1">
123
- <Typography variant={"caption"}
124
- className={"font-semibold break-words"}
125
- color={"secondary"}>
126
- {key}
127
- </Typography>
128
- </div>
126
+ key={`map_preview_table_${key}}`}
127
+ className={cls(defaultBorderMixin, "last:border-b-0 border-b")}>
129
128
  <div
130
- className="flex-grow max-w-[75%]">
131
- {childValue && typeof childValue !== "object" && <Typography>
132
- <ErrorBoundary>
133
- {childValue.toString()}
134
- </ErrorBoundary>
135
- </Typography>}
129
+ className={"flex flex-row pt-0.5 pb-0.5 gap-2"}>
130
+ <div
131
+ key={`table-cell-title-${key}-${key}`}
132
+ className="min-w-[140px] w-[25%] py-1">
133
+ <Typography variant={"caption"}
134
+ className={"font-semibold break-words"}
135
+ color={"secondary"}>
136
+ {key}
137
+ </Typography>
138
+ </div>
139
+ <div
140
+ className="flex-grow max-w-[75%]">
141
+ {isScalar && (isTimestampObj ? (
142
+ <ErrorBoundary>
143
+ <DatePreview date={
144
+ childValue instanceof Date ? childValue :
145
+ typeof childValue.toDate === "function" ? childValue.toDate() :
146
+ "_seconds" in childValue ? new Date(childValue._seconds * 1000 + childValue._nanoseconds / 1000000) :
147
+ new Date(childValue.seconds * 1000 + childValue.nanoseconds / 1000000)
148
+ } />
149
+ </ErrorBoundary>
150
+ ) : (
151
+ <Typography>
152
+ <ErrorBoundary>
153
+ {childValue.toString()}
154
+ </ErrorBoundary>
155
+ </Typography>
156
+ ))}
157
+ </div>
136
158
  </div>
159
+ {typeof childValue === "object" && !isTimestampObj &&
160
+ <div className={cls(defaultBorderMixin, "border-l pl-4")}>
161
+ <KeyValuePreview value={childValue}/>
162
+ </div>
163
+ }
137
164
  </div>
138
- {typeof childValue === "object" &&
139
- <div className={cls(defaultBorderMixin, "border-l pl-4")}>
140
- <KeyValuePreview value={childValue}/>
141
- </div>
142
- }
143
- </div>
144
- ))
165
+ );
166
+ })
145
167
  }
146
168
  </div>;
147
169
  }
@@ -19,9 +19,9 @@ export interface SkeletonPropertyComponentProps {
19
19
  * @group Preview components
20
20
  */
21
21
  export function SkeletonPropertyComponent({
22
- property,
23
- size
24
- }: SkeletonPropertyComponentProps
22
+ property,
23
+ size
24
+ }: SkeletonPropertyComponentProps
25
25
  ) {
26
26
 
27
27
  if (!property) {
@@ -101,7 +101,7 @@ function renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<
101
101
  {property.properties && property.properties[key] &&
102
102
  <SkeletonPropertyComponent
103
103
  property={property.properties[key]}
104
- size={"medium"}/>}
104
+ size={"medium"} />}
105
105
  </div>
106
106
  ))}
107
107
  </div>
@@ -110,29 +110,29 @@ function renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<
110
110
  return (
111
111
  <table className="table-auto">
112
112
  <tbody>
113
- {mapPropertyKeys &&
114
- mapPropertyKeys.map((key, index) => {
115
- return (
116
- <tr
117
- key={`map_preview_table__${index}`}
118
- className="border-b last:border-b-0">
119
- <th key={`table-cell-title--${key}`}
120
- className="align-top"
121
- style={{ width: "30%" }}>
122
- <p className="text-xs text-secondary">
123
- {property.properties![key].name}
124
- </p>
125
- </th>
126
- <th key={`table-cell-${key}`}
127
- style={{ width: "70%" }}>
128
- {property.properties && property.properties[key] &&
129
- <SkeletonPropertyComponent
130
- property={property.properties[key]}
131
- size={"medium"}/>}
132
- </th>
133
- </tr>
134
- );
135
- })}
113
+ {mapPropertyKeys &&
114
+ mapPropertyKeys.map((key, index) => {
115
+ return (
116
+ <tr
117
+ key={`map_preview_table__${index}`}
118
+ className="border-b last:border-b-0">
119
+ <th key={`table-cell-title--${key}`}
120
+ className="align-top"
121
+ style={{ width: "30%" }}>
122
+ <p className="text-xs text-secondary">
123
+ {property.properties![key].name}
124
+ </p>
125
+ </th>
126
+ <th key={`table-cell-${key}`}
127
+ style={{ width: "70%" }}>
128
+ {property.properties && property.properties[key] &&
129
+ <SkeletonPropertyComponent
130
+ property={property.properties[key]}
131
+ size={"medium"} />}
132
+ </th>
133
+ </tr>
134
+ );
135
+ })}
136
136
  </tbody>
137
137
  </table>
138
138
  );
@@ -149,24 +149,24 @@ function renderArrayOfMaps<M extends Record<string, any>>(properties: ResolvedPr
149
149
  return (
150
150
  <table className="table-auto">
151
151
  <tbody>
152
- {
153
- [0, 1, 2].map((value, index) => {
154
- return (
155
- <tr key={`table_${value}_${index}`}>
156
- {tableProperties && tableProperties.map(
157
- (key) => (
158
- <th
159
- key={`table-cell-${key}`}
160
- >
161
- <SkeletonPropertyComponent
162
- property={(properties)[key]}
163
- size={"medium"}/>
164
- </th>
165
- )
166
- )}
167
- </tr>
168
- );
169
- })}
152
+ {
153
+ [0, 1, 2].map((value, index) => {
154
+ return (
155
+ <tr key={`table_${value}_${index}`}>
156
+ {tableProperties && tableProperties.map(
157
+ (key) => (
158
+ <th
159
+ key={`table-cell-${key}`}
160
+ >
161
+ <SkeletonPropertyComponent
162
+ property={(properties)[key]}
163
+ size={"medium"} />
164
+ </th>
165
+ )
166
+ )}
167
+ </tr>
168
+ );
169
+ })}
170
170
  </tbody>
171
171
  </table>
172
172
  );
@@ -203,14 +203,14 @@ function renderGenericArrayCell(
203
203
  return (
204
204
 
205
205
  <div key={"array_index_" + index}
206
- className={"flex flex-col gap-2"}>
206
+ className={"flex flex-col gap-2"}>
207
207
 
208
208
  {
209
209
  [0, 1].map((value, index) =>
210
210
  <>
211
211
  <SkeletonPropertyComponent key={`i_${index}`}
212
- property={property}
213
- size={"medium"}/>
212
+ property={property}
213
+ size={"medium"} />
214
214
  </>
215
215
  )}
216
216
  </div>
@@ -220,16 +220,21 @@ function renderGenericArrayCell(
220
220
  function renderUrlAudioComponent() {
221
221
  return (
222
222
  <Skeleton width={300}
223
- height={100}/>
223
+ height={100} />
224
224
  );
225
225
  }
226
226
 
227
- export function renderSkeletonImageThumbnail(size: PreviewSize) {
227
+ export function renderSkeletonImageThumbnail(size: PreviewSize, fill?: boolean) {
228
+ if (fill) {
229
+ return (
230
+ <Skeleton className="w-full h-full" />
231
+ );
232
+ }
228
233
  // eslint-disable-next-line react-hooks/rules-of-hooks
229
234
  const imageSize = size === "small" ? 40 : size === "medium" ? 100 : 200;
230
235
  return (
231
236
  <Skeleton width={imageSize}
232
- height={imageSize}/>
237
+ height={imageSize} />
233
238
  );
234
239
  }
235
240
 
@@ -237,12 +242,12 @@ function renderUrlVideo(size: PreviewSize) {
237
242
 
238
243
  return (
239
244
  <Skeleton width={size !== "large" ? 300 : 500}
240
- height={size !== "large" ? 200 : 250}/>
245
+ height={size !== "large" ? 200 : 250} />
241
246
  );
242
247
  }
243
248
 
244
249
  function renderReference() {
245
- return <Skeleton width={200} height={100}/>;
250
+ return <Skeleton width={200} height={100} />;
246
251
  }
247
252
 
248
253
  function renderUrlComponent(property: ResolvedStringProperty, size: PreviewSize = "large") {
@@ -270,14 +275,14 @@ function renderUrlFile(size: PreviewSize) {
270
275
  }
271
276
 
272
277
  export function renderSkeletonText(index?: number, width = 120) {
273
- return <Skeleton width={width} key={`skeleton_${index}`}/>;
278
+ return <Skeleton width={width} key={`skeleton_${index}`} />;
274
279
  }
275
280
 
276
281
  export function renderSkeletonCaptionText(index?: number) {
277
282
  return <Skeleton
278
- height={20}/>;
283
+ height={20} />;
279
284
  }
280
285
 
281
286
  export function renderSkeletonIcon() {
282
- return <Skeleton width={24} height={24}/>;
287
+ return <Skeleton width={24} height={24} />;
283
288
  }
@@ -13,6 +13,7 @@ export function CustomCMSRoute({ cmsView }: {
13
13
  breadcrumbs: [{
14
14
  title: cmsView.name,
15
15
  url: cmsView.path
16
+ // count: undefined (not applicable for custom views)
16
17
  }]
17
18
  });
18
19
  }, [cmsView.path]);
@@ -1,7 +1,6 @@
1
1
  import { Blocker, useBlocker, useLocation } from "react-router";
2
- import { EntityEditView } from "../core/EntityEditView";
2
+ import React, { useEffect, useRef, useState } from "react";
3
3
  import { useNavigationController } from "../hooks";
4
- import { useEffect, useRef, useState } from "react";
5
4
  import { useNavigate } from "react-router-dom";
6
5
  import {
7
6
  getNavigationEntriesFromPath,
@@ -11,7 +10,11 @@ import {
11
10
  } from "../util/navigation_from_path";
12
11
  import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
13
12
  import { toArray } from "../util/arrays";
14
- import { EntityCollectionView, NotFoundPage } from "../components";
13
+ import { NotFoundPage } from "../components";
14
+ import { lazyEager } from "../util/lazy_eager";
15
+
16
+ const EntityEditView = lazyEager<typeof import("../core/EntityEditView")["EntityEditView"]>(() => import("../core/EntityEditView"), "EntityEditView");
17
+ const EntityCollectionView = lazyEager<typeof import("../components/EntityCollectionView/EntityCollectionView")["EntityCollectionView"]>(() => import("../components/EntityCollectionView/EntityCollectionView"), "EntityCollectionView");
15
18
  import { UnsavedChangesDialog } from "../components/UnsavedChangesDialog";
16
19
  import { EntityCollection } from "../types";
17
20
 
@@ -35,22 +38,34 @@ export function FireCMSRoute() {
35
38
  });
36
39
 
37
40
  useEffect(() => {
41
+ const lastEntry = navigationEntries[navigationEntries.length - 1];
42
+ const isViewingCollection = lastEntry?.type === "collection";
43
+
38
44
  breadcrumbs.set({
39
- breadcrumbs: navigationEntries.map(entry => {
45
+ breadcrumbs: navigationEntries.map((entry, index) => {
46
+ const isLastEntry = index === navigationEntries.length - 1;
47
+
40
48
  if (entry.type === "entity") {
41
49
  return ({
42
50
  title: entry.entityId,
43
51
  url: navigation.buildUrlCollectionPath(entry.fullPath)
52
+ // count: undefined (not applicable for entities)
44
53
  });
45
54
  } else if (entry.type === "custom_view") {
46
55
  return ({
47
56
  title: entry.view.name,
48
57
  url: navigation.buildUrlCollectionPath(entry.fullPath)
58
+ // count: undefined (not applicable for custom views)
49
59
  });
50
60
  } else if (entry.type === "collection") {
61
+ // Only show count badge (loading state) when viewing this collection directly
62
+ // Don't show count for parent collections when viewing an entity
63
+ const showCount = isLastEntry && isViewingCollection;
51
64
  return ({
52
65
  title: entry.collection.name,
53
- url: navigation.buildUrlCollectionPath(entry.fullPath)
66
+ url: navigation.buildUrlCollectionPath(entry.fullPath),
67
+ id: entry.fullPath,
68
+ ...(showCount ? { count: null } : {}) // null = loading, undefined = no badge
54
69
  });
55
70
  } else {
56
71
  throw new Error("Unexpected navigation entry type");
@@ -59,6 +74,7 @@ export function FireCMSRoute() {
59
74
  });
60
75
  }, [navigationEntries.map(entry => entry.path).join(",")]);
61
76
 
77
+
62
78
  if (isNew) {
63
79
  return <EntityFullScreenRoute
64
80
  pathname={pathname}
@@ -75,15 +91,17 @@ export function FireCMSRoute() {
75
91
  collection = navigation.getCollection(navigationEntries[0].path);
76
92
  if (!collection)
77
93
  return null;
78
- return <EntityCollectionView
79
- key={`collection_view_${collection.id ?? collection.path}`}
80
- isSubCollection={false}
81
- parentCollectionIds={[]}
82
- fullPath={collection.path}
83
- fullIdPath={collection.id}
84
- updateUrl={true}
85
- {...collection}
86
- Actions={toArray(collection.Actions)}/>
94
+ return <React.Suspense fallback={null}>
95
+ <EntityCollectionView
96
+ key={`collection_view_${collection.id ?? collection.path}`}
97
+ isSubCollection={false}
98
+ parentCollectionIds={[]}
99
+ fullPath={collection.path}
100
+ fullIdPath={collection.id}
101
+ updateUrl={true}
102
+ {...collection}
103
+ Actions={toArray(collection.Actions)} />
104
+ </React.Suspense>;
87
105
  }
88
106
 
89
107
  if (isSidePanel) {
@@ -96,15 +114,17 @@ export function FireCMSRoute() {
96
114
  collection = navigation.getCollection(firstEntry.path);
97
115
  if (!collection)
98
116
  return null;
99
- return <EntityCollectionView
100
- key={`collection_view_${collection.id ?? collection.path}`}
101
- fullIdPath={collection.id}
102
- isSubCollection={false}
103
- parentCollectionIds={[]}
104
- fullPath={collection.path}
105
- updateUrl={true}
106
- {...collection}
107
- Actions={toArray(collection.Actions)}/>;
117
+ return <React.Suspense fallback={null}>
118
+ <EntityCollectionView
119
+ key={`collection_view_${collection.id ?? collection.path}`}
120
+ fullIdPath={collection.id}
121
+ isSubCollection={false}
122
+ parentCollectionIds={[]}
123
+ fullPath={collection.path}
124
+ updateUrl={true}
125
+ {...collection}
126
+ Actions={toArray(collection.Actions)} />
127
+ </React.Suspense>;
108
128
  }
109
129
  }
110
130
 
@@ -131,11 +151,11 @@ function getSelectedTabFromUrl(isNew: boolean, lastCustomView: NavigationViewCol
131
151
  }
132
152
 
133
153
  function EntityFullScreenRoute({
134
- pathname,
135
- navigationEntries,
136
- isNew,
137
- isCopy
138
- }: {
154
+ pathname,
155
+ navigationEntries,
156
+ isNew,
157
+ isCopy
158
+ }: {
139
159
  pathname: string;
140
160
  navigationEntries: NavigationViewInternal[],
141
161
  isNew: boolean,
@@ -178,8 +198,8 @@ function EntityFullScreenRoute({
178
198
  let blocker: Blocker | undefined = undefined;
179
199
  try {
180
200
  blocker = useBlocker(({
181
- nextLocation
182
- }) => {
201
+ nextLocation
202
+ }) => {
183
203
  if (nextLocation.pathname.startsWith(entityPath))
184
204
  return false;
185
205
  return blocked.current;
@@ -195,52 +215,54 @@ function EntityFullScreenRoute({
195
215
  }
196
216
 
197
217
  if (!isNew && !lastEntityEntry) {
198
- return <NotFoundPage/>;
218
+ return <NotFoundPage />;
199
219
  }
200
220
 
201
221
  const collection = isNew ? lastCollectionEntry!.collection : lastEntityEntry!.parentCollection;
202
222
  const fullIdPath = isNew ? lastCollectionEntry!.path : lastEntityEntry!.path;
203
223
  const collectionPath = navigation.resolveIdsFrom(fullIdPath);
204
224
  return <>
205
- <EntityEditView
206
- key={collection.id + "_" + (isNew ? "new" : (isCopy ? entityId + "_copy" : entityId))}
207
- entityId={isNew ? undefined : entityId}
208
- fullIdPath={fullIdPath}
209
- collection={collection}
210
- layout={"full_screen"}
211
- path={collectionPath}
212
- copy={isCopy}
213
- selectedTab={selectedTab ?? undefined}
214
- onValuesModified={(modified) => blocked.current = modified}
215
- onSaved={(params) => {
216
- const newSelectedTab = params.selectedTab;
217
- const newEntityId = params.entityId;
218
- if (newSelectedTab) {
219
- navigate(`${basePath}/${newEntityId}/${newSelectedTab}`, { replace: true });
220
- } else {
221
- navigate(`${basePath}/${newEntityId}`, { replace: true });
222
- }
223
- }}
224
- onTabChange={(params) => {
225
- setSelectedTab(params.selectedTab);
226
- if (isNew) {
227
- return;
228
- }
229
- const newSelectedTab = params.selectedTab;
230
- if (newSelectedTab) {
231
- navigate(`${basePath}/${entityId}/${newSelectedTab}`, { replace: true });
232
- } else {
233
- navigate(`${basePath}/${entityId}`, { replace: true });
234
- }
235
- }}
236
- parentCollectionIds={parentCollectionIds}
237
- />
225
+ <React.Suspense fallback={null}>
226
+ <EntityEditView
227
+ key={collection.id + "_" + (isNew ? "new" : (isCopy ? entityId + "_copy" : entityId))}
228
+ entityId={isNew ? undefined : entityId}
229
+ fullIdPath={fullIdPath}
230
+ collection={collection}
231
+ layout={"full_screen"}
232
+ path={collectionPath}
233
+ copy={isCopy}
234
+ selectedTab={selectedTab ?? undefined}
235
+ onValuesModified={(modified) => blocked.current = modified}
236
+ onSaved={(params) => {
237
+ const newSelectedTab = params.selectedTab;
238
+ const newEntityId = params.entityId;
239
+ if (newSelectedTab) {
240
+ navigate(`${basePath}/${newEntityId}/${newSelectedTab}`, { replace: true });
241
+ } else {
242
+ navigate(`${basePath}/${newEntityId}`, { replace: true });
243
+ }
244
+ }}
245
+ onTabChange={(params) => {
246
+ setSelectedTab(params.selectedTab);
247
+ if (isNew) {
248
+ return;
249
+ }
250
+ const newSelectedTab = params.selectedTab;
251
+ if (newSelectedTab) {
252
+ navigate(`${basePath}/${entityId}/${newSelectedTab}`, { replace: true });
253
+ } else {
254
+ navigate(`${basePath}/${entityId}`, { replace: true });
255
+ }
256
+ }}
257
+ parentCollectionIds={parentCollectionIds}
258
+ />
259
+ </React.Suspense>
238
260
 
239
261
  <UnsavedChangesDialog
240
262
  open={blocker?.state === "blocked"}
241
263
  handleOk={() => blocker?.proceed?.()}
242
264
  handleCancel={() => blocker?.reset?.()}
243
- body={"You have unsaved changes in this entity."}/>
265
+ body={"You have unsaved changes in this entity."} />
244
266
 
245
267
  </>;
246
268
  }