@firecms/core 3.0.0-beta.1 → 3.0.0-beta.11

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 (387) hide show
  1. package/README.md +6 -7
  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 +19 -8
  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 -18
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -5
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +9 -15
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +3 -2
  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 +2 -4
  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 +8 -5
  21. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +13 -4
  22. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  23. package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
  24. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  25. package/dist/components/EntityPreview.d.ts +26 -7
  26. package/dist/components/EntityView.d.ts +11 -0
  27. package/dist/components/ErrorView.d.ts +1 -1
  28. package/dist/components/FieldCaption.d.ts +5 -0
  29. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  30. package/dist/components/HomePage/NavigationCard.d.ts +8 -0
  31. package/dist/components/HomePage/{NavigationCollectionCard.d.ts → NavigationCardBinding.d.ts} +3 -3
  32. package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
  33. package/dist/components/HomePage/index.d.ts +3 -1
  34. package/dist/components/{FieldConfigBadge.d.ts → PropertyConfigBadge.d.ts} +2 -1
  35. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  36. package/dist/components/{ReferenceSelectionInner.d.ts → ReferenceTable/ReferenceSelectionTable.d.ts} +2 -2
  37. package/dist/components/ReferenceWidget.d.ts +6 -4
  38. package/dist/components/{EntityCollectionTable/SimpleEntityCollectionTable.d.ts → SelectableTable/SelectableTable.d.ts} +8 -28
  39. package/dist/components/SelectableTable/SelectableTableContext.d.ts +4 -0
  40. package/dist/components/{EntityCollectionTable → SelectableTable}/filters/ReferenceFilterField.d.ts +2 -1
  41. package/dist/components/VirtualTable/VirtualTableProps.d.ts +16 -13
  42. package/dist/components/VirtualTable/types.d.ts +3 -3
  43. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
  44. package/dist/components/common/index.d.ts +6 -0
  45. package/dist/components/common/table_height.d.ts +5 -0
  46. package/dist/components/{EntityCollectionTable → common}/types.d.ts +11 -6
  47. package/dist/components/{EntityCollectionView → common}/useColumnsIds.d.ts +2 -1
  48. package/dist/components/{EntityCollectionTable → common}/useDataSourceEntityCollectionTableController.d.ts +5 -2
  49. package/dist/components/common/useTableSearchHelper.d.ts +12 -0
  50. package/dist/components/index.d.ts +14 -8
  51. package/dist/contexts/AuthControllerContext.d.ts +1 -1
  52. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  53. package/dist/core/DefaultDrawer.d.ts +19 -0
  54. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  55. package/dist/core/EntityEditView.d.ts +36 -0
  56. package/dist/core/FireCMS.d.ts +2 -2
  57. package/dist/core/NavigationRoutes.d.ts +3 -3
  58. package/dist/core/index.d.ts +3 -6
  59. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  60. package/dist/form/components/CustomIdField.d.ts +2 -1
  61. package/dist/form/components/ErrorFocus.d.ts +1 -1
  62. package/dist/form/components/FieldHelperText.d.ts +3 -3
  63. package/dist/{components → form/components}/LabelWithIcon.d.ts +1 -1
  64. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  65. package/dist/form/components/StorageItemPreview.d.ts +4 -3
  66. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  67. package/dist/form/components/index.d.ts +2 -2
  68. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  70. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  71. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  73. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  74. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  75. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  76. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  77. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  79. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -4
  80. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  81. package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -2
  82. package/dist/form/index.d.ts +4 -5
  83. package/dist/form/useClearRestoreValue.d.ts +2 -2
  84. package/dist/form/validation.d.ts +1 -1
  85. package/dist/hooks/data/delete.d.ts +4 -4
  86. package/dist/hooks/data/save.d.ts +4 -5
  87. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  88. package/dist/hooks/data/useDataSource.d.ts +2 -2
  89. package/dist/hooks/data/useEntityFetch.d.ts +3 -3
  90. package/dist/hooks/index.d.ts +5 -1
  91. package/dist/hooks/useAuthController.d.ts +1 -1
  92. package/dist/{core → hooks}/useBuildModeController.d.ts +1 -1
  93. package/dist/hooks/useBuildNavigationController.d.ts +23 -0
  94. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  95. package/dist/hooks/useProjectLog.d.ts +14 -0
  96. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  97. package/dist/hooks/useSnackbarController.d.ts +1 -0
  98. package/dist/hooks/useStorageSource.d.ts +2 -2
  99. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  100. package/dist/index.d.ts +1 -0
  101. package/dist/index.es.js +20246 -13863
  102. package/dist/index.es.js.map +1 -1
  103. package/dist/index.umd.js +22772 -588
  104. package/dist/index.umd.js.map +1 -1
  105. package/dist/internal/useBuildDataSource.d.ts +1 -12
  106. package/dist/preview/PropertyPreview.d.ts +1 -1
  107. package/dist/preview/PropertyPreviewProps.d.ts +7 -5
  108. package/dist/preview/components/BooleanPreview.d.ts +5 -1
  109. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  110. package/dist/preview/components/ReferencePreview.d.ts +4 -9
  111. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  112. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  113. package/dist/preview/util.d.ts +3 -3
  114. package/dist/types/analytics.d.ts +1 -1
  115. package/dist/types/auth.d.ts +37 -3
  116. package/dist/types/collections.d.ts +68 -20
  117. package/dist/types/datasource.d.ts +55 -39
  118. package/dist/types/entities.d.ts +7 -1
  119. package/dist/types/entity_actions.d.ts +18 -4
  120. package/dist/types/entity_callbacks.d.ts +17 -17
  121. package/dist/types/entity_overrides.d.ts +6 -0
  122. package/dist/types/export_import.d.ts +4 -4
  123. package/dist/types/fields.d.ts +63 -42
  124. package/dist/types/firecms.d.ts +10 -25
  125. package/dist/types/firecms_context.d.ts +1 -1
  126. package/dist/types/index.d.ts +2 -1
  127. package/dist/types/navigation.d.ts +18 -16
  128. package/dist/types/permissions.d.ts +8 -4
  129. package/dist/types/plugins.d.ts +39 -39
  130. package/dist/types/properties.d.ts +36 -23
  131. package/dist/types/property_config.d.ts +2 -4
  132. package/dist/types/roles.d.ts +31 -0
  133. package/dist/types/side_dialogs_controller.d.ts +10 -0
  134. package/dist/types/storage.d.ts +86 -3
  135. package/dist/types/user.d.ts +6 -0
  136. package/dist/util/builders.d.ts +2 -2
  137. package/dist/util/collections.d.ts +9 -1
  138. package/dist/util/entities.d.ts +3 -3
  139. package/dist/util/icon_list.d.ts +5 -1
  140. package/dist/util/icon_synonyms.d.ts +1 -98
  141. package/dist/util/icons.d.ts +13 -4
  142. package/dist/util/index.d.ts +3 -1
  143. package/dist/util/navigation_utils.d.ts +2 -2
  144. package/dist/util/objects.d.ts +2 -1
  145. package/dist/util/permissions.d.ts +4 -4
  146. package/dist/util/plurals.d.ts +0 -2
  147. package/dist/util/property_utils.d.ts +3 -3
  148. package/dist/util/references.d.ts +4 -2
  149. package/dist/util/resolutions.d.ts +31 -17
  150. package/dist/util/storage.d.ts +23 -2
  151. package/dist/util/strings.d.ts +1 -1
  152. package/dist/util/useDebouncedCallback.d.ts +1 -0
  153. package/dist/util/useStorageUploadController.d.ts +3 -3
  154. package/dist/util/useTraceUpdate.d.ts +1 -0
  155. package/package.json +70 -47
  156. package/src/app/AppBar.tsx +18 -0
  157. package/src/app/Drawer.tsx +24 -0
  158. package/src/app/Scaffold.tsx +243 -0
  159. package/src/app/index.ts +4 -0
  160. package/src/app/useApp.tsx +32 -0
  161. package/src/components/ArrayContainer.tsx +122 -90
  162. package/src/components/CircularProgressCenter.tsx +2 -2
  163. package/src/components/ClearFilterSortButton.tsx +41 -0
  164. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  165. package/src/components/DeleteEntityDialog.tsx +13 -22
  166. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +51 -59
  167. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +258 -453
  168. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +13 -14
  169. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +60 -52
  170. package/src/components/EntityCollectionTable/column_utils.tsx +4 -4
  171. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +40 -33
  172. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +22 -20
  173. package/src/components/EntityCollectionTable/index.tsx +1 -9
  174. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +44 -46
  175. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  176. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  177. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +191 -178
  178. package/src/components/EntityCollectionView/EntityCollectionView.tsx +187 -175
  179. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +5 -6
  180. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  181. package/src/components/EntityCollectionView/useSelectionController.tsx +43 -0
  182. package/src/components/EntityCollectionView/utils.ts +19 -0
  183. package/src/components/EntityPreview.tsx +218 -72
  184. package/src/components/EntityView.tsx +84 -0
  185. package/src/components/ErrorView.tsx +4 -4
  186. package/src/components/FieldCaption.tsx +14 -0
  187. package/src/components/HomePage/DefaultHomePage.tsx +39 -28
  188. package/src/components/HomePage/FavouritesView.tsx +6 -11
  189. package/src/components/HomePage/NavigationCard.tsx +69 -0
  190. package/src/components/HomePage/NavigationCardBinding.tsx +111 -0
  191. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  192. package/src/components/HomePage/SmallNavigationCard.tsx +44 -0
  193. package/src/components/HomePage/index.tsx +3 -1
  194. package/src/components/PropertyConfigBadge.tsx +23 -0
  195. package/src/components/PropertyIdCopyTooltip.tsx +48 -0
  196. package/src/components/{ReferenceSelectionInner.tsx → ReferenceTable/ReferenceSelectionTable.tsx} +38 -24
  197. package/src/components/ReferenceWidget.tsx +26 -16
  198. package/src/components/SearchIconsView.tsx +10 -7
  199. package/src/components/{EntityCollectionTable/SimpleEntityCollectionTable.tsx → SelectableTable/SelectableTable.tsx} +46 -84
  200. package/src/components/SelectableTable/SelectableTableContext.tsx +6 -0
  201. package/src/components/{EntityCollectionTable → SelectableTable}/filters/BooleanFilterField.tsx +2 -3
  202. package/src/components/{EntityCollectionTable → SelectableTable}/filters/DateTimeFilterField.tsx +25 -8
  203. package/src/components/{EntityCollectionTable → SelectableTable}/filters/ReferenceFilterField.tsx +40 -24
  204. package/src/components/{EntityCollectionTable → SelectableTable}/filters/StringNumberFilterField.tsx +92 -24
  205. package/src/components/VirtualTable/VirtualTable.tsx +77 -46
  206. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  207. package/src/components/VirtualTable/VirtualTableHeader.tsx +19 -13
  208. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  209. package/src/components/VirtualTable/VirtualTableProps.tsx +19 -15
  210. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  211. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  212. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +4 -3
  213. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +4 -3
  214. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  215. package/src/components/VirtualTable/types.tsx +2 -3
  216. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +17 -9
  217. package/src/components/common/index.ts +6 -0
  218. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  219. package/src/components/{EntityCollectionTable → common}/types.tsx +9 -6
  220. package/src/components/{EntityCollectionView → common}/useColumnsIds.tsx +23 -2
  221. package/src/components/{EntityCollectionTable → common}/useDataSourceEntityCollectionTableController.tsx +27 -16
  222. package/src/components/common/useTableSearchHelper.ts +88 -0
  223. package/src/components/index.tsx +15 -8
  224. package/src/contexts/AuthControllerContext.tsx +1 -1
  225. package/src/contexts/DialogsProvider.tsx +2 -2
  226. package/src/contexts/SnackbarProvider.tsx +2 -0
  227. package/src/core/DefaultAppBar.tsx +177 -0
  228. package/src/core/DefaultDrawer.tsx +185 -0
  229. package/src/core/DrawerNavigationItem.tsx +66 -0
  230. package/src/core/EntityEditView.tsx +1125 -0
  231. package/src/core/EntitySidePanel.tsx +9 -8
  232. package/src/core/FireCMS.tsx +71 -63
  233. package/src/core/NavigationRoutes.tsx +25 -17
  234. package/src/core/SideDialogs.tsx +2 -1
  235. package/src/core/field_configs.tsx +22 -23
  236. package/src/core/index.tsx +3 -6
  237. package/src/form/PropertyFieldBinding.tsx +79 -45
  238. package/src/form/components/CustomIdField.tsx +53 -36
  239. package/src/form/components/ErrorFocus.tsx +3 -3
  240. package/src/form/components/FieldHelperText.tsx +4 -4
  241. package/src/form/components/LabelWithIcon.tsx +41 -0
  242. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  243. package/src/form/components/StorageItemPreview.tsx +23 -11
  244. package/src/form/components/StorageUploadProgress.tsx +8 -8
  245. package/src/form/components/index.tsx +2 -2
  246. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +30 -19
  247. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +52 -46
  248. package/src/form/field_bindings/BlockFieldBinding.tsx +67 -47
  249. package/src/form/field_bindings/DateTimeFieldBinding.tsx +20 -17
  250. package/src/form/field_bindings/KeyValueFieldBinding.tsx +76 -67
  251. package/src/form/field_bindings/MapFieldBinding.tsx +81 -60
  252. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
  253. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -22
  254. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +12 -18
  255. package/src/form/field_bindings/ReferenceFieldBinding.tsx +46 -34
  256. package/src/form/field_bindings/RepeatFieldBinding.tsx +55 -35
  257. package/src/form/field_bindings/SelectFieldBinding.tsx +24 -17
  258. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +42 -43
  259. package/src/form/field_bindings/SwitchFieldBinding.tsx +30 -27
  260. package/src/form/field_bindings/TextFieldBinding.tsx +34 -30
  261. package/src/form/index.tsx +5 -9
  262. package/src/form/useClearRestoreValue.tsx +2 -2
  263. package/src/form/validation.ts +4 -21
  264. package/src/hooks/data/delete.ts +7 -6
  265. package/src/hooks/data/save.ts +12 -8
  266. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  267. package/src/hooks/data/useDataSource.tsx +15 -2
  268. package/src/hooks/data/useEntityFetch.tsx +6 -6
  269. package/src/hooks/index.tsx +7 -1
  270. package/src/hooks/useAuthController.tsx +1 -1
  271. package/src/{core → hooks}/useBuildLocalConfigurationPersistence.tsx +8 -10
  272. package/src/{core → hooks}/useBuildModeController.tsx +12 -6
  273. package/src/{internal → hooks}/useBuildNavigationController.tsx +245 -101
  274. package/src/hooks/useFireCMSContext.tsx +53 -5
  275. package/src/hooks/useLargeLayout.tsx +10 -7
  276. package/src/hooks/useProjectLog.tsx +63 -0
  277. package/src/hooks/useReferenceDialog.tsx +3 -3
  278. package/src/hooks/useResolvedNavigationFrom.tsx +6 -6
  279. package/src/hooks/useSnackbarController.tsx +1 -2
  280. package/src/hooks/useStorageSource.tsx +7 -2
  281. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  282. package/src/index.ts +1 -0
  283. package/src/internal/useBuildDataSource.ts +80 -85
  284. package/src/internal/useBuildSideDialogsController.tsx +1 -0
  285. package/src/internal/useBuildSideEntityController.tsx +103 -23
  286. package/src/internal/useUnsavedChangesDialog.tsx +5 -3
  287. package/src/preview/PropertyPreview.tsx +15 -22
  288. package/src/preview/PropertyPreviewProps.tsx +6 -10
  289. package/src/preview/components/BooleanPreview.tsx +19 -4
  290. package/src/preview/components/EmptyValue.tsx +1 -1
  291. package/src/preview/components/EnumValuesChip.tsx +2 -2
  292. package/src/preview/components/ImagePreview.tsx +25 -36
  293. package/src/preview/components/ReferencePreview.tsx +73 -176
  294. package/src/preview/components/StorageThumbnail.tsx +5 -1
  295. package/src/preview/components/UrlComponentPreview.tsx +44 -11
  296. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  297. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  298. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  299. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  300. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  301. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  302. package/src/preview/property_previews/MapPropertyPreview.tsx +9 -9
  303. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  304. package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
  305. package/src/preview/util.ts +10 -10
  306. package/src/types/analytics.ts +1 -0
  307. package/src/types/auth.tsx +48 -3
  308. package/src/types/collections.ts +77 -20
  309. package/src/types/customization_controller.tsx +0 -1
  310. package/src/types/datasource.ts +64 -47
  311. package/src/types/entities.ts +15 -1
  312. package/src/types/entity_actions.tsx +21 -4
  313. package/src/types/entity_callbacks.ts +20 -19
  314. package/src/types/entity_overrides.tsx +7 -0
  315. package/src/types/export_import.ts +4 -4
  316. package/src/types/fields.tsx +69 -45
  317. package/src/types/firecms.tsx +11 -28
  318. package/src/types/firecms_context.tsx +1 -1
  319. package/src/types/index.ts +2 -1
  320. package/src/types/navigation.ts +20 -19
  321. package/src/types/permissions.ts +10 -5
  322. package/src/types/plugins.tsx +46 -48
  323. package/src/types/properties.ts +42 -24
  324. package/src/types/property_config.tsx +2 -4
  325. package/src/types/roles.ts +41 -0
  326. package/src/types/side_dialogs_controller.tsx +13 -0
  327. package/src/types/side_entity_controller.tsx +1 -0
  328. package/src/types/storage.ts +94 -3
  329. package/src/types/user.ts +9 -0
  330. package/src/util/builders.ts +6 -6
  331. package/src/util/collections.ts +22 -0
  332. package/src/util/entities.ts +9 -6
  333. package/src/util/enums.ts +1 -1
  334. package/src/util/icon_list.ts +16 -10
  335. package/src/util/icon_synonyms.ts +3 -100
  336. package/src/util/icons.tsx +26 -8
  337. package/src/util/index.ts +3 -1
  338. package/src/util/make_properties_editable.ts +13 -5
  339. package/src/util/navigation_utils.ts +6 -6
  340. package/src/util/objects.ts +45 -28
  341. package/src/util/permissions.ts +20 -16
  342. package/src/util/plurals.ts +0 -2
  343. package/src/util/property_utils.tsx +11 -4
  344. package/src/util/references.ts +45 -5
  345. package/src/util/resolutions.ts +80 -47
  346. package/src/util/storage.ts +79 -21
  347. package/src/util/strings.ts +4 -3
  348. package/src/util/{useDebounce.ts → useDebouncedCallback.ts} +1 -1
  349. package/src/util/useStorageUploadController.tsx +34 -8
  350. package/src/util/useTraceUpdate.tsx +2 -1
  351. package/dist/components/VirtualTable/common.d.ts +0 -2
  352. package/dist/core/Drawer.d.ts +0 -23
  353. package/dist/core/Scaffold.d.ts +0 -52
  354. package/dist/form/EntityForm.d.ts +0 -75
  355. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  356. package/dist/form/components/SubmitListener.d.ts +0 -1
  357. package/dist/form/components/SwitchControl.d.ts +0 -8
  358. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  359. package/dist/hooks/useVerifyLicense.d.ts +0 -0
  360. package/dist/internal/EntityView.d.ts +0 -22
  361. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  362. package/dist/internal/useBuildNavigationController.d.ts +0 -14
  363. package/dist/internal/useLocaleConfig.d.ts +0 -1
  364. package/dist/types/appcheck.d.ts +0 -26
  365. package/dist/util/useDebounce.d.ts +0 -1
  366. package/src/components/FieldConfigBadge.tsx +0 -17
  367. package/src/components/FireCMSAppBar.tsx +0 -157
  368. package/src/components/HomePage/NavigationCollectionCard.tsx +0 -146
  369. package/src/components/LabelWithIcon.tsx +0 -33
  370. package/src/core/Drawer.tsx +0 -162
  371. package/src/core/Scaffold.tsx +0 -278
  372. package/src/form/EntityForm.tsx +0 -657
  373. package/src/form/components/FormikArrayContainer.tsx +0 -44
  374. package/src/form/components/SubmitListener.tsx +0 -32
  375. package/src/form/components/SwitchControl.tsx +0 -39
  376. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -696
  377. package/src/hooks/useVerifyLicense.tsx +0 -1
  378. package/src/internal/EntityView.tsx +0 -578
  379. package/src/internal/useBuildCustomizationController.tsx +0 -5
  380. package/src/internal/useLocaleConfig.tsx +0 -18
  381. package/src/types/appcheck.ts +0 -29
  382. /package/dist/components/{EntityCollectionTable → SelectableTable}/filters/BooleanFilterField.d.ts +0 -0
  383. /package/dist/components/{EntityCollectionTable → SelectableTable}/filters/DateTimeFilterField.d.ts +0 -0
  384. /package/dist/components/{EntityCollectionTable → SelectableTable}/filters/StringNumberFilterField.d.ts +0 -0
  385. /package/dist/components/{EntityCollectionTable → common}/useDebouncedData.d.ts +0 -0
  386. /package/dist/{core → hooks}/useBuildLocalConfigurationPersistence.d.ts +0 -0
  387. /package/src/components/{EntityCollectionTable → common}/useDebouncedData.ts +0 -0
@@ -44,7 +44,7 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
44
44
 
45
45
  const selectedEntities = selectionController.selectedEntities;
46
46
 
47
- const addButton = canCreateEntity(collection, authController, fullPathToCollectionSegments(path), null) &&
47
+ const addButton = canCreateEntity(collection, authController, path, null) &&
48
48
  onNewClick && (largeLayout
49
49
  ? <Button
50
50
  id={`add_entity_${path}`}
@@ -57,14 +57,13 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
57
57
  : <Button
58
58
  id={`add_entity_${path}`}
59
59
  onClick={onNewClick}
60
- size="medium"
61
60
  variant="filled"
62
61
  color="primary"
63
62
  >
64
63
  <AddIcon/>
65
64
  </Button>);
66
65
 
67
- const multipleDeleteEnabled = canDeleteEntity(collection, authController, fullPathToCollectionSegments(path), null);
66
+ const multipleDeleteEnabled = canDeleteEntity(collection, authController, path, null);
68
67
 
69
68
  let multipleDeleteButton: React.ReactNode | undefined;
70
69
  if (selectionEnabled) {
@@ -112,11 +111,11 @@ export function EntityCollectionViewActions<M extends Record<string, any>>({
112
111
 
113
112
  if (plugins) {
114
113
  plugins.forEach((plugin, i) => {
115
- if (plugin.collections?.CollectionActions) {
116
- actions.push(...toArray(plugin.collections?.CollectionActions)
114
+ if (plugin.collectionView?.CollectionActions) {
115
+ actions.push(...toArray(plugin.collectionView?.CollectionActions)
117
116
  .map((Action, j) => (
118
117
  <ErrorBoundary key={`plugin_actions_${i}_${j}`}>
119
- <Action {...actionProps} {...plugin.collections?.collectionActionsProps}/>
118
+ <Action {...actionProps} {...plugin.collectionView?.collectionActionsProps}/>
120
119
  </ErrorBoundary>
121
120
  )));
122
121
  }
@@ -0,0 +1,68 @@
1
+ import React from "react";
2
+ import { useCustomizationController, useFireCMSContext } from "../../hooks";
3
+ import { CollectionActionsProps, EntityCollection, EntityTableController, SelectionController } from "../../types";
4
+ import { toArray } from "../../util/arrays";
5
+ import { ErrorBoundary } from "../ErrorBoundary";
6
+ import { ClearFilterSortButton } from "../ClearFilterSortButton";
7
+
8
+ export type EntityCollectionViewStartActionsProps<M extends Record<string, any>> = {
9
+ collection: EntityCollection<M>;
10
+ path: string;
11
+ relativePath: string;
12
+ parentCollectionIds: string[];
13
+ selectionController: SelectionController<M>;
14
+ tableController: EntityTableController<M>;
15
+ collectionEntitiesCount: number;
16
+ }
17
+
18
+ export function EntityCollectionViewStartActions<M extends Record<string, any>>({
19
+ collection,
20
+ relativePath,
21
+ parentCollectionIds,
22
+ path,
23
+ selectionController,
24
+ tableController,
25
+ collectionEntitiesCount
26
+ }: EntityCollectionViewStartActionsProps<M>) {
27
+
28
+ const context = useFireCMSContext();
29
+
30
+ const customizationController = useCustomizationController();
31
+ const plugins = customizationController.plugins ?? [];
32
+
33
+ const actionProps: CollectionActionsProps = {
34
+ path,
35
+ relativePath,
36
+ parentCollectionIds,
37
+ collection,
38
+ selectionController,
39
+ context,
40
+ tableController,
41
+ collectionEntitiesCount
42
+ };
43
+ const actions: React.ReactNode[] = [
44
+ <ClearFilterSortButton
45
+ key={"clear_filter"}
46
+ tableController={tableController}
47
+ enabled={!collection.forceFilter}/>
48
+ ];
49
+
50
+ if (plugins) {
51
+ plugins.forEach((plugin, i) => {
52
+ if (plugin.collectionView?.CollectionActionsStart) {
53
+ actions.push(...toArray(plugin.collectionView?.CollectionActionsStart)
54
+ .map((Action, j) => (
55
+ <ErrorBoundary key={`plugin_actions_${i}_${j}`}>
56
+ <Action {...actionProps} {...plugin.collectionView?.collectionActionsStartProps}/>
57
+ </ErrorBoundary>
58
+ )));
59
+ }
60
+ });
61
+ }
62
+
63
+ return (
64
+ <>
65
+ {actions}
66
+ </>
67
+ );
68
+ }
@@ -0,0 +1,43 @@
1
+ import { useCallback, useState } from "react";
2
+ import { Entity, SelectionController } from "../../types";
3
+
4
+ export function useSelectionController<M extends Record<string, any> = any>(
5
+ onSelectionChange?: (entity: Entity<M>, selected: boolean) => void
6
+ ): SelectionController<M> {
7
+
8
+ const [selectedEntities, setSelectedEntities] = useState<Entity<M>[]>([]);
9
+
10
+ const toggleEntitySelection = useCallback((entity: Entity<M>, newSelectedState?: boolean) => {
11
+ let newValue;
12
+ if (newSelectedState === undefined) {
13
+ const isSelected = Boolean(selectedEntities.find(e => e.id === entity.id && e.path === entity.path));
14
+ if (isSelected) {
15
+ onSelectionChange?.(entity, false);
16
+ newValue = selectedEntities.filter((item: Entity<M>) => !(item.id === entity.id && item.path === entity.path));
17
+ } else {
18
+ onSelectionChange?.(entity, true);
19
+ newValue = [...selectedEntities, entity];
20
+ }
21
+ } else {
22
+ if (newSelectedState) {
23
+ onSelectionChange?.(entity, true);
24
+ newValue = [...selectedEntities, entity];
25
+ } else {
26
+ onSelectionChange?.(entity, false);
27
+ newValue = selectedEntities.filter((item: Entity<M>) => !(item.id === entity.id && item.path === entity.path));
28
+ }
29
+ }
30
+ setSelectedEntities(newValue);
31
+ }, [selectedEntities]);
32
+
33
+ const isEntitySelected = useCallback((entity: Entity<M>) => {
34
+ return Boolean(selectedEntities.find(e => e.id === entity.id && e.path === entity.path));
35
+ }, [selectedEntities]);
36
+
37
+ return {
38
+ selectedEntities,
39
+ setSelectedEntities,
40
+ isEntitySelected,
41
+ toggleEntitySelection
42
+ };
43
+ }
@@ -0,0 +1,19 @@
1
+ export function addRecentId(collectionId: string, id: string) {
2
+ const recentIds = getRecentIds(collectionId);
3
+ const newRecentIds = [id, ...recentIds.filter(i => i !== id)];
4
+ if (newRecentIds.length > 5) {
5
+ newRecentIds.pop();
6
+ }
7
+ saveSearchedIdsLocally(collectionId, newRecentIds);
8
+ return newRecentIds;
9
+ }
10
+
11
+ export function saveSearchedIdsLocally(collectionId: string, ids: string[]) {
12
+ localStorage.setItem("recent_id_searches::" + collectionId, JSON.stringify(ids));
13
+ }
14
+
15
+ export function getRecentIds(collectionId: string): string[] {
16
+ const stored = localStorage.getItem("recent_id_searches::" + collectionId);
17
+ if (!stored) return [];
18
+ return JSON.parse(stored);
19
+ }
@@ -1,85 +1,231 @@
1
- import React, { useMemo } from "react";
2
- import { PropertyPreview } from "../preview";
3
- import { Entity, EntityCollection, ResolvedEntityCollection, ResolvedProperties } from "../types";
4
- import { resolveCollection } from "../util";
5
- import { useFireCMSContext } from "../hooks";
6
- import { cn, defaultBorderMixin, IconButton, OpenInNewIcon } from "@firecms/ui";
7
- import { CustomizationController } from "../types/customization_controller";
8
- import { useCustomizationController } from "../hooks/useCustomizationController";
1
+ import * as React from "react";
2
+ import { useMemo } from "react";
3
+
4
+ import { Entity, EntityCollection, ResolvedProperty } from "../types";
5
+
6
+ import {
7
+ getEntityImagePreviewPropertyKey,
8
+ getEntityPreviewKeys,
9
+ getEntityTitlePropertyKey,
10
+ getValueInPath,
11
+ IconForView,
12
+ resolveCollection
13
+ } from "../util";
14
+ import { cls, defaultBorderMixin, IconButton, KeyboardTabIcon, Skeleton, Tooltip, Typography } from "@firecms/ui";
15
+ import { PreviewSize, PropertyPreview, SkeletonPropertyComponent } from "../preview";
16
+ import { useCustomizationController, useNavigationController, useSideEntityController } from "../hooks";
17
+ import { useAnalyticsController } from "../hooks/useAnalyticsController";
18
+
19
+ export type EntityPreviewProps = {
20
+ size: PreviewSize,
21
+ actions?: React.ReactNode,
22
+ collection?: EntityCollection,
23
+ hover?: boolean;
24
+ previewProperties?: string[],
25
+ disabled?: boolean,
26
+ entity: Entity<any>,
27
+ includeId?: boolean,
28
+ includeEntityLink?: boolean,
29
+ onClick?: (e: React.SyntheticEvent) => void;
30
+ };
9
31
 
10
32
  /**
11
- * @group Components
33
+ * This view is used to display a preview of an entity.
34
+ * It is used by default in reference fields and whenever a reference is displayed.
12
35
  */
13
- export interface EntityPreviewProps<M extends Record<string, any>> {
14
- entity: Entity<M>;
15
- collection: EntityCollection<M>;
16
- path: string;
17
- className?: string;
18
- }
36
+ export function EntityPreview({
37
+ actions,
38
+ disabled,
39
+ hover,
40
+ collection: collectionProp,
41
+ previewProperties,
42
+ onClick,
43
+ size,
44
+ includeId = true,
45
+ includeEntityLink = true,
46
+ entity
47
+ }: EntityPreviewProps) {
19
48
 
20
- export function EntityPreview<M extends Record<string, any>>(
21
- {
22
- entity,
23
- collection,
24
- path,
25
- className
26
- }: EntityPreviewProps<M>) {
49
+ const analyticsController = useAnalyticsController();
50
+ const sideEntityController = useSideEntityController();
51
+ const customizationController = useCustomizationController();
52
+
53
+ const navigationController = useNavigationController();
27
54
 
28
- const customizationController: CustomizationController = useCustomizationController();
29
- const resolvedCollection: ResolvedEntityCollection<M> = useMemo(() => resolveCollection<M>({
55
+ const collection = collectionProp ?? navigationController.getCollection(entity.path);
56
+
57
+ if (!collection) {
58
+ throw Error(`Couldn't find the corresponding collection view for the path: ${entity.path}`);
59
+ }
60
+
61
+ const resolvedCollection = React.useMemo(() => resolveCollection({
30
62
  collection,
31
- path,
32
- entityId: entity.id,
63
+ path: entity.path,
33
64
  values: entity.values,
34
- fields: customizationController.propertyConfigs
35
- }), [collection, path, entity]);
65
+ propertyConfigs: customizationController.propertyConfigs
66
+ }), [collection]);
36
67
 
37
- const properties: ResolvedProperties = resolvedCollection.properties;
68
+ const listProperties = useMemo(() => getEntityPreviewKeys(resolvedCollection, customizationController.propertyConfigs, previewProperties, size === "medium" || size === "large" ? 3 : 1),
69
+ [previewProperties, resolvedCollection, size]);
38
70
 
39
- return (
40
- <div className={"w-full " + className}>
41
- <div className={"w-full mb-4"}>
42
- <div className={cn(defaultBorderMixin, "flex justify-between py-2 border-b last:border-b-0")}>
43
- <div className="flex items-center w-1/4">
44
- <span className="pl-2 text-sm text-gray-600">Id</span>
45
- </div>
46
- <div
47
- className="flex-grow p-2 ml-2 w-3/4 text-gray-900 dark:text-white min-h-[56px] flex items-center">
48
- <span className="flex-grow mr-2">{entity.id}</span>
49
- {customizationController?.entityLinkBuilder &&
50
- <a href={customizationController.entityLinkBuilder({ entity })}
51
- rel="noopener noreferrer"
52
- target="_blank">
53
- <IconButton>
54
- <OpenInNewIcon
55
- size={"small"}/>
56
- </IconButton>
57
- </a>}
71
+ const titleProperty = getEntityTitlePropertyKey(resolvedCollection, customizationController.propertyConfigs);
72
+ const imagePropertyKey = getEntityImagePreviewPropertyKey(resolvedCollection);
73
+ const imageProperty = imagePropertyKey ? resolvedCollection.properties[imagePropertyKey] : undefined;
74
+ const usedImageProperty = imageProperty && "of" in imageProperty ? imageProperty.of : imageProperty;
75
+ const restProperties = listProperties.filter(p => p !== titleProperty && p !== imagePropertyKey);
76
+
77
+ const imageValue = imagePropertyKey ? getValueInPath(entity.values, imagePropertyKey) : undefined;
78
+ const usedImageValue = imageProperty !== undefined ? ("of" in imageProperty
79
+ ? ((imageValue ?? []).length > 0
80
+ ? imageValue[0] : undefined)
81
+ : imageValue)
82
+ : undefined;
83
+
84
+ return <EntityPreviewContainer onClick={disabled ? undefined : onClick}
85
+ hover={disabled ? undefined : hover}
86
+ size={size}>
87
+ <div className={cls("flex w-10 h-10 ml-1 mr-2 shrink-0", size === "small" ? "my-0.5" : "m-2 self-start")}>
88
+ {usedImageProperty && usedImageValue && <PropertyPreview property={usedImageProperty}
89
+ propertyKey={imagePropertyKey as string}
90
+ size={"small"}
91
+ value={usedImageValue}/>}
92
+ {(!usedImageProperty || !usedImageValue) && <IconForView collectionOrView={collection}
93
+ color={"primary"}
94
+ size={size}
95
+ className={"m-auto p-1"}/>}
96
+ </div>
97
+
98
+
99
+ <div className={"flex flex-col grow-1 w-full m-1 shrink-1"} style={{
100
+ "maxWidth": "calc(100% - 96px)"
101
+ }}>
102
+
103
+ {size !== "small" && includeId && (
104
+ entity
105
+ ? <div className={"block whitespace-nowrap overflow-hidden truncate"}>
106
+ <Typography variant={"caption"}
107
+ color={"disabled"}
108
+ className={"font-mono"}>
109
+ {entity.id}
110
+ </Typography>
58
111
  </div>
112
+ : <Skeleton/>)}
113
+
114
+ {titleProperty && (
115
+ <div className={"truncate my-0.5 text-sm font-medium"}>
116
+ {
117
+ entity
118
+ ? <PropertyPreview
119
+ propertyKey={titleProperty as string}
120
+ value={getValueInPath(entity.values, titleProperty)}
121
+ property={resolvedCollection.properties[titleProperty as string] as ResolvedProperty}
122
+ size={"large"}/>
123
+ : <SkeletonPropertyComponent
124
+ property={resolvedCollection.properties[titleProperty as string] as ResolvedProperty}
125
+ size={"large"}/>
126
+ }
59
127
  </div>
60
- {Object.entries(properties)
61
- .map(([key, property]) => {
62
- const value = (entity.values)[key];
63
- return (
64
- <div
65
- key={`reference_previews_${key}`}
66
- className={cn(defaultBorderMixin, "flex justify-between py-2 border-b last:border-b-0")}>
67
- <div className="flex items-center w-1/4">
68
- <span className="pl-2 text-sm text-gray-600">{property.name}</span>
69
- </div>
70
- <div
71
- className="flex-grow p-2 ml-2 w-3/4 text-gray-900 dark:text-white min-h-[56px] flex items-center">
72
- <PropertyPreview
73
- propertyKey={key}
74
- value={value}
75
- // entity={entity}
76
- property={property}
77
- size={"medium"}/>
78
- </div>
79
- </div>
80
- )
81
- })}
82
- </div>
128
+ )}
129
+
130
+ {restProperties && restProperties.map((key) => {
131
+ const childProperty = resolvedCollection.properties[key as string];
132
+ if (!childProperty) return null;
133
+
134
+ return (
135
+ <div key={"ref_prev_" + key}
136
+ className={cls("truncate", restProperties.length > 1 ? "my-0.5" : "my-0")}>
137
+ {
138
+ entity
139
+ ? <PropertyPreview
140
+ propertyKey={key as string}
141
+ value={getValueInPath(entity.values, key)}
142
+ property={childProperty as ResolvedProperty}
143
+ size={"small"}/>
144
+ : <SkeletonPropertyComponent
145
+ property={childProperty as ResolvedProperty}
146
+ size={"small"}/>
147
+ }
148
+ </div>
149
+ );
150
+ })}
151
+
83
152
  </div>
84
- );
153
+
154
+ {entity && includeEntityLink &&
155
+ <Tooltip title={`See details for ${entity.id}`} className={"shrink-0"}>
156
+ <IconButton
157
+ color={"inherit"}
158
+ size={"medium"}
159
+ className={size !== "small" ? "self-start" : ""}
160
+ onClick={(e) => {
161
+ e.stopPropagation();
162
+ analyticsController.onAnalyticsEvent?.("entity_click_from_reference", {
163
+ path: entity.path,
164
+ entityId: entity.id
165
+ });
166
+ sideEntityController.open({
167
+ entityId: entity.id,
168
+ path: entity.path,
169
+ collection,
170
+ updateUrl: true
171
+ });
172
+ }}>
173
+ <KeyboardTabIcon size={"medium"}/>
174
+ </IconButton>
175
+ </Tooltip>}
176
+
177
+ {actions}
178
+
179
+ </EntityPreviewContainer>;
85
180
  }
181
+
182
+ export type EntityPreviewContainerProps = {
183
+ children: React.ReactNode;
184
+ hover?: boolean;
185
+ fullwidth?: boolean;
186
+ size: PreviewSize;
187
+ className?: string;
188
+ style?: React.CSSProperties;
189
+ onClick?: (e: React.SyntheticEvent) => void;
190
+ };
191
+
192
+ export const EntityPreviewContainer = React.forwardRef<HTMLDivElement, EntityPreviewContainerProps>(({
193
+ children,
194
+ hover,
195
+ onClick,
196
+ size,
197
+ style,
198
+ className,
199
+ fullwidth = true,
200
+ ...props
201
+ }, ref) => {
202
+ return <div
203
+ ref={ref}
204
+ style={{
205
+ ...style,
206
+ // @ts-ignore
207
+ tabindex: 0
208
+ }}
209
+ className={cls(
210
+ "bg-white dark:bg-surface-900",
211
+ "min-h-[42px]",
212
+ fullwidth ? "w-full" : "",
213
+ "items-center",
214
+ hover ? "hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800" : "",
215
+ size === "small" ? "p-1" : "px-2 py-1",
216
+ "flex border rounded-lg",
217
+ onClick ? "cursor-pointer" : "",
218
+ defaultBorderMixin,
219
+ className)}
220
+ onClick={(event) => {
221
+ if (onClick) {
222
+ event.preventDefault();
223
+ onClick(event);
224
+ }
225
+ }}
226
+ {...props}>
227
+ {children}
228
+ </div>;
229
+ });
230
+
231
+ EntityPreviewContainer.displayName = "EntityPreviewContainer";
@@ -0,0 +1,84 @@
1
+ import React, { useMemo } from "react";
2
+ import { PropertyPreview } from "../preview";
3
+ import { Entity, EntityCollection, ResolvedEntityCollection, ResolvedProperties } from "../types";
4
+ import { resolveCollection } from "../util";
5
+ import { cls, defaultBorderMixin, IconButton, OpenInNewIcon } from "@firecms/ui";
6
+ import { CustomizationController } from "../types/customization_controller";
7
+ import { useCustomizationController } from "../hooks/useCustomizationController";
8
+
9
+ /**
10
+ * @group Components
11
+ */
12
+ export interface EntityViewProps<M extends Record<string, any>> {
13
+ entity: Entity<M>;
14
+ collection: EntityCollection<M>;
15
+ path: string;
16
+ className?: string;
17
+ }
18
+
19
+ export function EntityView<M extends Record<string, any>>(
20
+ {
21
+ entity,
22
+ collection,
23
+ path,
24
+ className
25
+ }: EntityViewProps<M>) {
26
+
27
+ const customizationController: CustomizationController = useCustomizationController();
28
+ const resolvedCollection: ResolvedEntityCollection<M> = useMemo(() => resolveCollection<M>({
29
+ collection,
30
+ path,
31
+ entityId: entity.id,
32
+ values: entity.values,
33
+ propertyConfigs: customizationController.propertyConfigs
34
+ }), [collection, path, entity, customizationController.propertyConfigs]);
35
+
36
+ const properties: ResolvedProperties = resolvedCollection.properties;
37
+
38
+ return (
39
+ <div className={"w-full " + className}>
40
+ <div className={"w-full mb-4"}>
41
+ <div className={cls(defaultBorderMixin, "flex justify-between py-2 border-b last:border-b-0")}>
42
+ <div className="flex items-center w-1/4">
43
+ <span className="pl-2 text-sm text-surface-600">Id</span>
44
+ </div>
45
+ <div
46
+ className="flex-grow p-2 ml-2 w-3/4 text-surface-900 dark:text-white min-h-[56px] flex items-center">
47
+ <span className="flex-grow mr-2">{entity.id}</span>
48
+ {customizationController?.entityLinkBuilder &&
49
+ <a href={customizationController.entityLinkBuilder({ entity })}
50
+ rel="noopener noreferrer"
51
+ target="_blank">
52
+ <IconButton>
53
+ <OpenInNewIcon
54
+ size={"small"}/>
55
+ </IconButton>
56
+ </a>}
57
+ </div>
58
+ </div>
59
+ {Object.entries(properties)
60
+ .map(([key, property]) => {
61
+ const value = entity.values?.[key];
62
+ return (
63
+ <div
64
+ key={`reference_previews_${key}`}
65
+ className={cls(defaultBorderMixin, "flex justify-between py-2 border-b last:border-b-0")}>
66
+ <div className="flex items-center w-1/4">
67
+ <span className="pl-2 text-sm text-surface-600">{property.name}</span>
68
+ </div>
69
+ <div
70
+ className="flex-grow p-2 ml-2 w-3/4 text-surface-900 dark:text-white min-h-[56px] flex items-center">
71
+ <PropertyPreview
72
+ propertyKey={key}
73
+ value={value}
74
+ // entity={entity}
75
+ property={property}
76
+ size={"medium"}/>
77
+ </div>
78
+ </div>
79
+ )
80
+ })}
81
+ </div>
82
+ </div>
83
+ );
84
+ }
@@ -17,7 +17,7 @@ export interface ErrorViewProps {
17
17
  * @param title
18
18
  * @param error
19
19
  * @param tooltip
20
- * @constructor
20
+
21
21
  * @group Components
22
22
  */
23
23
  export function ErrorView({
@@ -26,13 +26,13 @@ export function ErrorView({
26
26
  tooltip
27
27
  }: ErrorViewProps): React.ReactElement {
28
28
  const component = error instanceof Error ? error.message : error;
29
- console.error("ErrorView", error)
29
+ console.warn("ErrorView", error)
30
30
 
31
31
  const body = (
32
32
  <div
33
33
  className="flex items-center m-2">
34
- <ErrorIcon size={"small"} color={"error"}/>
35
- <div className="pl-2">
34
+ <ErrorIcon className={"mx-2"} size={"small"} color={"error"}/>
35
+ <div className="pl-4">
36
36
  {title && <Typography
37
37
  variant={"body2"}
38
38
  className="font-medium">{title}</Typography>}
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import { Typography } from "@firecms/ui";
3
+
4
+ export function FieldCaption({
5
+ error,
6
+ children
7
+ }: { error?: boolean, children?: React.ReactNode }) {
8
+ if (!children) return null;
9
+ return (
10
+ <Typography variant={"caption"} color={error ? "error" : "secondary"} className={"ml-3.5 mt-0.5"}>
11
+ {children}
12
+ </Typography>
13
+ );
14
+ }