@firecms/core 3.0.0-canary.21 → 3.0.0-canary.210

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 (380) 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 +34 -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/core/DefaultAppBar.d.ts +29 -0
  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 +33 -11
  50. package/dist/core/EntityEditViewFormActions.d.ts +2 -0
  51. package/dist/core/FireCMS.d.ts +3 -3
  52. package/dist/core/FireCMSRouter.d.ts +4 -0
  53. package/dist/core/NavigationRoutes.d.ts +2 -3
  54. package/dist/core/SideDialogs.d.ts +4 -2
  55. package/dist/core/index.d.ts +4 -4
  56. package/dist/form/EntityForm.d.ts +37 -69
  57. package/dist/form/EntityFormActions.d.ts +17 -0
  58. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  59. package/dist/form/components/ErrorFocus.d.ts +1 -1
  60. package/dist/form/components/FieldHelperText.d.ts +3 -3
  61. package/dist/form/components/FormEntry.d.ts +6 -0
  62. package/dist/form/components/FormLayout.d.ts +5 -0
  63. package/dist/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 -4
  66. package/dist/form/components/index.d.ts +3 -1
  67. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  68. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  69. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  70. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  71. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  73. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  74. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  75. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  76. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  77. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  78. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  79. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  80. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  81. package/dist/form/index.d.ts +16 -18
  82. package/dist/form/useClearRestoreValue.d.ts +2 -2
  83. package/dist/hooks/data/delete.d.ts +4 -4
  84. package/dist/hooks/data/save.d.ts +4 -5
  85. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  86. package/dist/hooks/data/useEntityFetch.d.ts +4 -3
  87. package/dist/hooks/index.d.ts +1 -0
  88. package/dist/hooks/useAuthController.d.ts +1 -1
  89. package/dist/hooks/useBreadcrumbsController.d.ts +26 -0
  90. package/dist/hooks/useBuildNavigationController.d.ts +7 -5
  91. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  92. package/dist/hooks/useModeController.d.ts +1 -2
  93. package/dist/hooks/useProjectLog.d.ts +8 -2
  94. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  95. package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
  96. package/dist/index.d.ts +1 -0
  97. package/dist/index.es.js +21823 -14330
  98. package/dist/index.es.js.map +1 -1
  99. package/dist/index.umd.js +24174 -588
  100. package/dist/index.umd.js.map +1 -1
  101. package/dist/internal/useBuildDataSource.d.ts +1 -16
  102. package/dist/internal/useBuildSideEntityController.d.ts +2 -2
  103. package/dist/internal/useUnsavedChangesDialog.d.ts +7 -9
  104. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  105. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  106. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  107. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  108. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  109. package/dist/preview/util.d.ts +3 -3
  110. package/dist/routes/CustomCMSRoute.d.ts +4 -0
  111. package/dist/routes/FireCMSRoute.d.ts +1 -0
  112. package/dist/routes/HomePageRoute.d.ts +3 -0
  113. package/dist/types/auth.d.ts +8 -10
  114. package/dist/types/collections.d.ts +77 -22
  115. package/dist/types/datasource.d.ts +52 -36
  116. package/dist/types/dialogs_controller.d.ts +7 -3
  117. package/dist/types/entities.d.ts +7 -2
  118. package/dist/types/entity_actions.d.ts +28 -4
  119. package/dist/types/entity_callbacks.d.ts +16 -16
  120. package/dist/types/entity_overrides.d.ts +2 -2
  121. package/dist/types/export_import.d.ts +4 -4
  122. package/dist/types/fields.d.ts +71 -42
  123. package/dist/types/firecms.d.ts +6 -2
  124. package/dist/types/firecms_context.d.ts +1 -1
  125. package/dist/types/index.d.ts +0 -1
  126. package/dist/types/navigation.d.ts +32 -14
  127. package/dist/types/permissions.d.ts +4 -4
  128. package/dist/types/plugins.d.ts +23 -12
  129. package/dist/types/properties.d.ts +52 -24
  130. package/dist/types/property_config.d.ts +0 -2
  131. package/dist/types/side_dialogs_controller.d.ts +10 -0
  132. package/dist/types/side_entity_controller.d.ts +6 -1
  133. package/dist/types/storage.d.ts +86 -3
  134. package/dist/types/user.d.ts +1 -0
  135. package/dist/util/builders.d.ts +3 -3
  136. package/dist/util/entities.d.ts +3 -3
  137. package/dist/util/entity_actions.d.ts +2 -0
  138. package/dist/util/entity_cache.d.ts +23 -0
  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 +6 -3
  142. package/dist/util/index.d.ts +2 -0
  143. package/dist/util/navigation_from_path.d.ts +6 -1
  144. package/dist/util/navigation_utils.d.ts +14 -3
  145. package/dist/util/objects.d.ts +2 -1
  146. package/dist/util/permissions.d.ts +4 -4
  147. package/dist/util/plurals.d.ts +0 -2
  148. package/dist/util/property_utils.d.ts +3 -3
  149. package/dist/util/resolutions.d.ts +36 -17
  150. package/dist/util/storage.d.ts +23 -2
  151. package/dist/util/useStorageUploadController.d.ts +3 -3
  152. package/package.json +61 -48
  153. package/src/app/AppBar.tsx +18 -0
  154. package/src/app/Drawer.tsx +24 -0
  155. package/src/app/Scaffold.tsx +253 -0
  156. package/src/app/index.ts +4 -0
  157. package/src/app/useApp.tsx +32 -0
  158. package/src/components/ArrayContainer.tsx +127 -41
  159. package/src/components/CircularProgressCenter.tsx +2 -2
  160. package/src/components/ClearFilterSortButton.tsx +41 -0
  161. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  162. package/src/components/DeleteEntityDialog.tsx +10 -19
  163. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +54 -37
  164. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +38 -31
  165. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +30 -9
  166. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
  167. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  168. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -16
  169. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  170. package/src/components/EntityCollectionTable/index.tsx +1 -1
  171. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +31 -36
  172. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  173. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  174. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +81 -80
  175. package/src/components/EntityCollectionView/EntityCollectionView.tsx +207 -113
  176. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -2
  177. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  178. package/src/components/EntityCollectionView/useSelectionController.tsx +20 -7
  179. package/src/components/EntityCollectionView/utils.ts +19 -0
  180. package/src/components/EntityPreview.tsx +62 -52
  181. package/src/components/EntityView.tsx +10 -10
  182. package/src/components/ErrorView.tsx +4 -4
  183. package/src/components/HomePage/DefaultHomePage.tsx +26 -19
  184. package/src/components/HomePage/FavouritesView.tsx +6 -11
  185. package/src/components/HomePage/NavigationCard.tsx +3 -3
  186. package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
  187. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  188. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  189. package/src/components/NotFoundPage.tsx +2 -2
  190. package/src/components/PropertyConfigBadge.tsx +9 -3
  191. package/src/components/PropertyIdCopyTooltip.tsx +47 -0
  192. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +19 -13
  193. package/src/components/ReferenceWidget.tsx +21 -11
  194. package/src/components/SearchIconsView.tsx +10 -7
  195. package/src/components/SelectableTable/SelectableTable.tsx +27 -12
  196. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  197. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  198. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +36 -12
  199. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  200. package/src/components/UnsavedChangesDialog.tsx +42 -0
  201. package/src/components/VirtualTable/VirtualTable.tsx +96 -48
  202. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  203. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  204. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  205. package/src/components/VirtualTable/VirtualTableProps.tsx +33 -14
  206. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  207. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  208. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +3 -2
  209. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  210. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  211. package/src/components/VirtualTable/types.tsx +2 -3
  212. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +33 -40
  213. package/src/components/common/index.ts +2 -1
  214. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  215. package/src/components/common/types.tsx +4 -6
  216. package/src/components/common/useColumnsIds.tsx +24 -3
  217. package/src/components/common/useDataSourceTableController.tsx +420 -0
  218. package/src/components/common/useDebouncedCallback.tsx +20 -0
  219. package/src/components/common/useScrollRestoration.tsx +68 -0
  220. package/src/components/common/useTableSearchHelper.ts +53 -12
  221. package/src/components/index.tsx +4 -2
  222. package/src/contexts/BreacrumbsContext.tsx +38 -0
  223. package/src/contexts/DialogsProvider.tsx +5 -4
  224. package/src/contexts/ModeController.tsx +1 -3
  225. package/src/contexts/SnackbarProvider.tsx +2 -0
  226. package/src/core/DefaultAppBar.tsx +219 -0
  227. package/src/core/DefaultDrawer.tsx +185 -0
  228. package/src/core/DrawerNavigationItem.tsx +66 -0
  229. package/src/core/EntityEditView.tsx +321 -479
  230. package/src/core/EntityEditViewFormActions.tsx +199 -0
  231. package/src/core/EntitySidePanel.tsx +86 -17
  232. package/src/core/FireCMS.tsx +56 -49
  233. package/src/core/FireCMSRouter.tsx +17 -0
  234. package/src/core/NavigationRoutes.tsx +28 -38
  235. package/src/core/SideDialogs.tsx +22 -12
  236. package/src/core/field_configs.tsx +11 -12
  237. package/src/core/index.tsx +6 -5
  238. package/src/form/EntityForm.tsx +585 -539
  239. package/src/form/EntityFormActions.tsx +169 -0
  240. package/src/form/PropertyFieldBinding.tsx +85 -44
  241. package/src/form/components/CustomIdField.tsx +6 -2
  242. package/src/form/components/FieldHelperText.tsx +4 -4
  243. package/src/form/components/FormEntry.tsx +22 -0
  244. package/src/form/components/FormLayout.tsx +16 -0
  245. package/src/form/components/LabelWithIcon.tsx +30 -19
  246. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  247. package/src/form/components/StorageItemPreview.tsx +22 -12
  248. package/src/form/components/StorageUploadProgress.tsx +4 -5
  249. package/src/form/components/index.tsx +3 -1
  250. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +31 -19
  251. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +47 -35
  252. package/src/form/field_bindings/BlockFieldBinding.tsx +56 -34
  253. package/src/form/field_bindings/DateTimeFieldBinding.tsx +18 -14
  254. package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
  255. package/src/form/field_bindings/MapFieldBinding.tsx +71 -54
  256. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +153 -0
  257. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  258. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  259. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  260. package/src/form/field_bindings/RepeatFieldBinding.tsx +56 -35
  261. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
  262. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +42 -50
  263. package/src/form/field_bindings/SwitchFieldBinding.tsx +29 -24
  264. package/src/form/field_bindings/TextFieldBinding.tsx +28 -24
  265. package/src/form/index.tsx +16 -37
  266. package/src/form/useClearRestoreValue.tsx +2 -2
  267. package/src/form/validation.ts +13 -23
  268. package/src/hooks/data/delete.ts +6 -5
  269. package/src/hooks/data/save.ts +13 -9
  270. package/src/hooks/data/useCollectionFetch.tsx +3 -3
  271. package/src/hooks/data/useDataSource.tsx +11 -3
  272. package/src/hooks/data/useEntityFetch.tsx +10 -6
  273. package/src/hooks/index.tsx +1 -0
  274. package/src/hooks/useAuthController.tsx +1 -1
  275. package/src/hooks/useBreadcrumbsController.tsx +31 -0
  276. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  277. package/src/hooks/useBuildModeController.tsx +22 -29
  278. package/src/hooks/useBuildNavigationController.tsx +159 -54
  279. package/src/hooks/useFireCMSContext.tsx +5 -5
  280. package/src/hooks/useLargeLayout.tsx +0 -35
  281. package/src/hooks/useModeController.tsx +1 -2
  282. package/src/hooks/useProjectLog.tsx +32 -10
  283. package/src/hooks/useResolvedNavigationFrom.tsx +10 -12
  284. package/src/hooks/useValidateAuthenticator.tsx +17 -37
  285. package/src/index.ts +1 -0
  286. package/src/internal/useBuildDataSource.ts +72 -82
  287. package/src/internal/useBuildSideDialogsController.tsx +4 -2
  288. package/src/internal/useBuildSideEntityController.tsx +193 -73
  289. package/src/internal/useUnsavedChangesDialog.tsx +127 -91
  290. package/src/preview/PropertyPreview.tsx +17 -24
  291. package/src/preview/PropertyPreviewProps.tsx +7 -1
  292. package/src/preview/components/BooleanPreview.tsx +2 -2
  293. package/src/preview/components/EmptyValue.tsx +1 -1
  294. package/src/preview/components/EnumValuesChip.tsx +2 -2
  295. package/src/preview/components/ImagePreview.tsx +25 -36
  296. package/src/preview/components/ReferencePreview.tsx +22 -33
  297. package/src/preview/components/StorageThumbnail.tsx +5 -1
  298. package/src/preview/components/UrlComponentPreview.tsx +60 -28
  299. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  300. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  301. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  302. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  303. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  304. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  305. package/src/preview/property_previews/MapPropertyPreview.tsx +12 -11
  306. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  307. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  308. package/src/preview/util.ts +10 -10
  309. package/src/routes/CustomCMSRoute.tsx +21 -0
  310. package/src/routes/FireCMSRoute.tsx +235 -0
  311. package/src/routes/HomePageRoute.tsx +17 -0
  312. package/src/types/auth.tsx +9 -13
  313. package/src/types/collections.ts +94 -27
  314. package/src/types/customization_controller.tsx +0 -1
  315. package/src/types/datasource.ts +61 -43
  316. package/src/types/dialogs_controller.tsx +7 -3
  317. package/src/types/entities.ts +12 -2
  318. package/src/types/entity_actions.tsx +32 -7
  319. package/src/types/entity_callbacks.ts +18 -18
  320. package/src/types/entity_overrides.tsx +2 -2
  321. package/src/types/export_import.ts +4 -4
  322. package/src/types/fields.tsx +81 -46
  323. package/src/types/firecms.tsx +7 -2
  324. package/src/types/firecms_context.tsx +1 -1
  325. package/src/types/index.ts +0 -1
  326. package/src/types/navigation.ts +38 -18
  327. package/src/types/permissions.ts +5 -5
  328. package/src/types/plugins.tsx +25 -14
  329. package/src/types/properties.ts +60 -25
  330. package/src/types/property_config.tsx +0 -2
  331. package/src/types/side_dialogs_controller.tsx +15 -0
  332. package/src/types/side_entity_controller.tsx +6 -1
  333. package/src/types/storage.ts +94 -3
  334. package/src/types/user.ts +2 -0
  335. package/src/util/builders.ts +10 -8
  336. package/src/util/entities.ts +9 -6
  337. package/src/util/entity_actions.ts +28 -0
  338. package/src/util/entity_cache.ts +204 -0
  339. package/src/util/enums.ts +1 -1
  340. package/src/util/icon_list.ts +16 -10
  341. package/src/util/icon_synonyms.ts +3 -100
  342. package/src/util/icons.tsx +17 -7
  343. package/src/util/index.ts +2 -0
  344. package/src/util/join_collections.ts +3 -0
  345. package/src/util/make_properties_editable.ts +13 -5
  346. package/src/util/navigation_from_path.ts +13 -6
  347. package/src/util/navigation_utils.ts +59 -7
  348. package/src/util/objects.ts +48 -28
  349. package/src/util/parent_references_from_path.ts +3 -3
  350. package/src/util/permissions.ts +9 -8
  351. package/src/util/plurals.ts +0 -2
  352. package/src/util/property_utils.tsx +11 -4
  353. package/src/util/references.ts +11 -2
  354. package/src/util/resolutions.ts +100 -46
  355. package/src/util/storage.ts +79 -21
  356. package/src/util/strings.ts +2 -2
  357. package/src/util/useStorageUploadController.tsx +71 -27
  358. package/dist/components/FireCMSAppBar.d.ts +0 -26
  359. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  360. package/dist/components/VirtualTable/common.d.ts +0 -2
  361. package/dist/core/Drawer.d.ts +0 -23
  362. package/dist/core/Scaffold.d.ts +0 -55
  363. package/dist/core/SideEntityView.d.ts +0 -7
  364. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  365. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  366. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  367. package/dist/internal/useLocaleConfig.d.ts +0 -1
  368. package/dist/types/appcheck.d.ts +0 -26
  369. package/src/components/FireCMSAppBar.tsx +0 -165
  370. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  371. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +0 -225
  372. package/src/core/Drawer.tsx +0 -191
  373. package/src/core/Scaffold.tsx +0 -281
  374. package/src/core/SideEntityView.tsx +0 -38
  375. package/src/form/components/FormikArrayContainer.tsx +0 -44
  376. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  377. package/src/internal/useBuildCustomizationController.tsx +0 -5
  378. package/src/internal/useLocaleConfig.tsx +0 -18
  379. package/src/types/appcheck.ts +0 -29
  380. /package/src/util/{common.tsx → common.ts} +0 -0
@@ -6,9 +6,12 @@ import { getHashValue } from "../util";
6
6
  import {
7
7
  AddIcon,
8
8
  Button,
9
+ cls,
9
10
  ContentCopyIcon,
10
- fieldBackgroundHoverMixin, HandleIcon,
11
+ HandleIcon,
11
12
  IconButton,
13
+ KeyboardArrowDownIcon,
14
+ KeyboardArrowUpIcon,
12
15
  Menu,
13
16
  MenuItem,
14
17
  RemoveIcon,
@@ -16,17 +19,30 @@ import {
16
19
  useOutsideAlerter
17
20
  } from "@firecms/ui";
18
21
 
19
- interface ArrayContainerProps<T> {
22
+ export type ArrayEntryParams = {
23
+ index: number,
24
+ internalId: number,
25
+ isDragging: boolean,
26
+ storedProps?: object,
27
+ storeProps: (props: object) => void
28
+ };
29
+
30
+ export type ArrayEntryBuilder = (params: ArrayEntryParams) => React.ReactNode;
31
+
32
+ export interface ArrayContainerProps<T> {
20
33
  droppableId: string;
21
34
  value: T[];
22
35
  addLabel: string;
23
- buildEntry: (index: number, internalId: number) => React.ReactNode;
36
+ buildEntry: ArrayEntryBuilder;
24
37
  disabled?: boolean;
25
38
  size?: "small" | "medium";
26
39
  onInternalIdAdded?: (id: number) => void;
27
40
  includeAddButton?: boolean;
28
41
  newDefaultEntry: T;
29
- onValueChange: (value: T[]) => void
42
+ onValueChange: (value: T[]) => void,
43
+ className?: string;
44
+ min?: number;
45
+ max?: number;
30
46
  }
31
47
 
32
48
  const buildIdsMap = (value: any[]) =>
@@ -52,7 +68,10 @@ export function ArrayContainer<T>({
52
68
  onInternalIdAdded,
53
69
  includeAddButton,
54
70
  newDefaultEntry,
55
- onValueChange
71
+ onValueChange,
72
+ className,
73
+ min = 0,
74
+ max = Infinity
56
75
  }: ArrayContainerProps<T>) {
57
76
 
58
77
  const hasValue = value && Array.isArray(value) && value.length > 0;
@@ -63,7 +82,14 @@ export function ArrayContainer<T>({
63
82
  const [internalIds, setInternalIds] = useState<number[]>(
64
83
  hasValue
65
84
  ? Object.values(internalIdsRef.current)
66
- : []);
85
+ : []
86
+ );
87
+
88
+ const itemCustomPropsRef = useRef<Record<number, object>>({});
89
+
90
+ const updateItemCustomProps = useCallback((internalId: number, customProps: object) => {
91
+ itemCustomPropsRef.current[internalId] = customProps;
92
+ }, []);
67
93
 
68
94
  useEffect(() => {
69
95
  if (hasValue && value && value.length !== internalIds.length) {
@@ -83,7 +109,7 @@ export function ArrayContainer<T>({
83
109
 
84
110
  const insertInEnd = (e: React.SyntheticEvent) => {
85
111
  e.preventDefault();
86
- if (disabled) return;
112
+ if (disabled || (value ?? []).length >= max) return;
87
113
  const id = getRandomId();
88
114
  const newIds: number[] = [...internalIds, id];
89
115
  if (onInternalIdAdded)
@@ -93,6 +119,7 @@ export function ArrayContainer<T>({
93
119
  };
94
120
 
95
121
  const remove = (index: number) => {
122
+ if ((value ?? []).length <= min) return;
96
123
  const newIds = [...internalIds];
97
124
  newIds.splice(index, 1);
98
125
  setInternalIds(newIds);
@@ -100,12 +127,14 @@ export function ArrayContainer<T>({
100
127
  };
101
128
 
102
129
  const copy = (index: number) => {
130
+ if ((value ?? []).length >= max) return;
103
131
  const id = getRandomId();
104
132
  const copyingItem = value[index];
105
133
  const newIds: number[] = [
106
- ...internalIds.splice(0, index + 1),
134
+ ...internalIds.slice(0, index + 1),
107
135
  id,
108
- ...internalIds.splice(index + 1, internalIds.length - index - 1)];
136
+ ...internalIds.slice(index + 1)
137
+ ];
109
138
  if (onInternalIdAdded)
110
139
  onInternalIdAdded(id);
111
140
  setInternalIds(newIds);
@@ -113,6 +142,20 @@ export function ArrayContainer<T>({
113
142
  onValueChange([...value.slice(0, index + 1), copyingItem, ...value.slice(index + 1)]);
114
143
  };
115
144
 
145
+ const addInIndex = (index: number) => {
146
+ if ((value ?? []).length >= max) return;
147
+ const id = getRandomId();
148
+ const newIds: number[] = [
149
+ ...internalIds.slice(0, index),
150
+ id,
151
+ ...internalIds.slice(index)
152
+ ];
153
+ if (onInternalIdAdded)
154
+ onInternalIdAdded(id);
155
+ setInternalIds(newIds);
156
+ onValueChange([...value.slice(0, index), newDefaultEntry, ...value.slice(index)]);
157
+ }
158
+
116
159
  const onDragEnd = (result: any) => {
117
160
  // dropped outside the list
118
161
  if (!result.destination) {
@@ -147,12 +190,17 @@ export function ArrayContainer<T>({
147
190
  remove={remove}
148
191
  copy={copy}
149
192
  isDragging={snapshot.isDragging}
193
+ storedProps={itemCustomPropsRef.current[internalId]}
194
+ updateItemCustomProps={updateItemCustomProps}
195
+ addInIndex={addInIndex}
196
+ includeAddButton={includeAddButton}
150
197
  />
151
198
  );
152
199
  }}
153
200
  >
154
201
  {(droppableProvided, droppableSnapshot) => (
155
202
  <div
203
+ className={cls("space-y-1", className)}
156
204
  {...droppableProvided.droppableProps}
157
205
  ref={droppableProvided.innerRef}>
158
206
  {hasValue && internalIds.map((internalId: number, index: number) => {
@@ -173,6 +221,10 @@ export function ArrayContainer<T>({
173
221
  remove={remove}
174
222
  copy={copy}
175
223
  isDragging={snapshot.isDragging}
224
+ storedProps={itemCustomPropsRef.current[internalId]}
225
+ updateItemCustomProps={updateItemCustomProps}
226
+ addInIndex={addInIndex}
227
+ includeAddButton={includeAddButton}
176
228
  />
177
229
  )}
178
230
  </Draggable>
@@ -181,17 +233,19 @@ export function ArrayContainer<T>({
181
233
 
182
234
  {droppableProvided.placeholder}
183
235
 
184
- {includeAddButton && <div className="py-4 justify-center text-left">
185
- <Button
186
- variant={"text"}
187
- size={size === "small" ? "small" : "medium"}
188
- color="primary"
189
- disabled={disabled}
190
- startIcon={<AddIcon/>}
191
- onClick={insertInEnd}>
192
- {addLabel ?? "Add"}
193
- </Button>
194
- </div>}
236
+ {includeAddButton && (
237
+ <div className="my-4 justify-center text-left">
238
+ <Button
239
+ variant={"text"}
240
+ size={size === "small" ? "small" : "medium"}
241
+ color="primary"
242
+ disabled={disabled || value?.length >= max}
243
+ startIcon={<AddIcon/>}
244
+ onClick={insertInEnd}>
245
+ {addLabel ?? "Add"}
246
+ </Button>
247
+ </div>
248
+ )}
195
249
  </div>
196
250
  )}
197
251
  </Droppable>
@@ -205,10 +259,14 @@ type ArrayContainerItemProps = {
205
259
  internalId: number,
206
260
  size?: "small" | "medium",
207
261
  disabled: boolean,
208
- buildEntry: (index: number, internalId: number) => React.ReactNode,
262
+ buildEntry: ArrayEntryBuilder,
209
263
  remove: (index: number) => void,
210
264
  copy: (index: number) => void,
265
+ addInIndex?: (index: number) => void,
266
+ includeAddButton?: boolean,
211
267
  isDragging: boolean,
268
+ storedProps?: object,
269
+ updateItemCustomProps: (internalId: number, props: object) => void
212
270
  };
213
271
 
214
272
  export function ArrayContainerItem({
@@ -219,41 +277,46 @@ export function ArrayContainerItem({
219
277
  disabled,
220
278
  buildEntry,
221
279
  remove,
280
+ addInIndex,
281
+ includeAddButton,
222
282
  copy,
223
- isDragging
283
+ isDragging,
284
+ storedProps,
285
+ updateItemCustomProps
224
286
  }: ArrayContainerItemProps) {
225
287
 
226
- const [onHover, setOnHover] = React.useState(false);
227
- const setOnHoverTrue = useCallback(() => setOnHover(true), []);
228
- const setOnHoverFalse = useCallback(() => setOnHover(false), []);
229
-
230
288
  return <div
231
- onMouseEnter={setOnHoverTrue}
232
- onMouseMove={setOnHoverTrue}
233
- onMouseLeave={setOnHoverFalse}
234
289
  ref={provided.innerRef}
235
290
  {...provided.draggableProps}
236
291
  style={provided.draggableProps.style}
237
- className={`${
238
- (isDragging || onHover) ? fieldBackgroundHoverMixin : ""
239
- } mb-1 rounded-md opacity-100`}
292
+ className={`relative ${
293
+ !isDragging ? "hover:bg-surface-accent-50 dark:hover:bg-surface-800 dark:hover:bg-opacity-20" : ""
294
+ } rounded-md opacity-100`}
240
295
  >
241
296
  <div
242
297
  className="flex items-start">
243
- <div className="flex-grow w-[calc(100%-48px)] text-text-primary dark:text-text-primary-dark">
244
- {buildEntry(index, internalId)}
298
+ <div
299
+ className="flex-grow w-[calc(100%-48px)] text-text-primary dark:text-text-primary-dark">
300
+ {buildEntry({
301
+ index,
302
+ internalId,
303
+ isDragging,
304
+ storedProps,
305
+ storeProps: (props: object) => updateItemCustomProps(internalId, props)
306
+ })}
245
307
  </div>
246
308
  <ArrayItemOptions direction={size === "small" ? "row" : "column"}
247
309
  disabled={disabled}
248
310
  remove={remove}
249
311
  index={index}
250
312
  provided={provided}
313
+ addInIndex={addInIndex}
314
+ includeAddButton={includeAddButton}
251
315
  copy={copy}/>
252
316
  </div>
253
317
  </div>;
254
318
  }
255
319
 
256
-
257
320
  export function ArrayItemOptions({
258
321
  direction,
259
322
  disabled,
@@ -261,13 +324,17 @@ export function ArrayItemOptions({
261
324
  index,
262
325
  provided,
263
326
  copy,
327
+ includeAddButton,
328
+ addInIndex
264
329
  }: {
265
330
  direction?: "row" | "column",
266
331
  disabled: boolean,
267
332
  remove: (index: number) => void,
268
333
  index: number,
269
334
  provided: any,
270
- copy: (index: number) => void
335
+ copy: (index: number) => void,
336
+ includeAddButton?: boolean,
337
+ addInIndex?: (index: number) => void
271
338
  }) {
272
339
 
273
340
  const [menuOpen, setMenuOpen] = useState(false);
@@ -275,7 +342,7 @@ export function ArrayItemOptions({
275
342
  const iconRef = React.useRef<HTMLDivElement>(null);
276
343
  useOutsideAlerter(iconRef, () => setMenuOpen(false));
277
344
 
278
- return <div className={`pl-2 pt-1 pb-4 flex ${direction === "row" ? "flex-row-reverse" : "flex-col"} items-center`}
345
+ return <div className={`pl-2 pt-1 pb-1 flex ${direction === "row" ? "flex-row-reverse" : "flex-col"} items-center`}
279
346
  ref={iconRef}
280
347
  {...provided.dragHandleProps}>
281
348
  <Tooltip
@@ -283,11 +350,13 @@ export function ArrayItemOptions({
283
350
  open={menuOpen ? false : undefined}
284
351
  side={direction === "column" ? "left" : undefined}
285
352
  title="Drag to move. Click for more options">
286
-
287
353
  <IconButton
288
354
  size="small"
289
355
  disabled={disabled}
290
- onClick={() => setMenuOpen(true)}
356
+ onClick={(e) => {
357
+ e.preventDefault();
358
+ setMenuOpen(true);
359
+ }}
291
360
  onDragStart={(e: any) => {
292
361
  setMenuOpen(false);
293
362
  }}
@@ -298,7 +367,7 @@ export function ArrayItemOptions({
298
367
  <Menu
299
368
  portalContainer={iconRef.current}
300
369
  open={menuOpen}
301
- trigger={<div/>}>
370
+ trigger={<div tabIndex={-1}/>}>
302
371
 
303
372
  <MenuItem dense onClick={(e) => {
304
373
  setMenuOpen(false);
@@ -315,8 +384,25 @@ export function ArrayItemOptions({
315
384
  Copy
316
385
  </MenuItem>
317
386
 
318
- </Menu>
387
+ {includeAddButton && addInIndex && <MenuItem dense
388
+ onClick={() => {
389
+ setMenuOpen(false);
390
+ addInIndex(index);
391
+ }}>
392
+ <KeyboardArrowUpIcon size={"small"}/>
393
+ Add on top
394
+ </MenuItem>}
395
+
396
+ {includeAddButton && addInIndex && <MenuItem dense
397
+ onClick={() => {
398
+ setMenuOpen(false);
399
+ addInIndex(index + 1);
400
+ }}>
401
+ <KeyboardArrowDownIcon size={"small"}/>
402
+ Add below
403
+ </MenuItem>}
319
404
 
405
+ </Menu>
320
406
  </Tooltip>
321
407
 
322
408
  </div>;
@@ -5,7 +5,7 @@ import { CircularProgress, CircularProgressProps, Typography } from "@firecms/ui
5
5
  *
6
6
  * @param text
7
7
  * @param props
8
- * @constructor
8
+
9
9
  * @ignore
10
10
  */
11
11
  export function CircularProgressCenter({ text, ...props }: CircularProgressProps & {
@@ -13,7 +13,7 @@ export function CircularProgressCenter({ text, ...props }: CircularProgressProps
13
13
  }) {
14
14
  return (
15
15
  <div
16
- className="flex w-full h-screen max-h-full max-w-full bg-gray-50 dark:bg-gray-900 gap-4">
16
+ className="flex w-full h-screen max-h-full max-w-full gap-4">
17
17
  <div className="m-auto flex flex-col gap-2 items-center">
18
18
  <CircularProgress {...props}/>
19
19
  {text && <Typography
@@ -0,0 +1,41 @@
1
+ import { Button, FilterListOffIcon } from "@firecms/ui";
2
+ import { EntityTableController } from "../types";
3
+
4
+ export function ClearFilterSortButton({
5
+ tableController,
6
+ enabled
7
+ }: {
8
+ enabled: boolean;
9
+ tableController: EntityTableController
10
+ }) {
11
+ if (!enabled) {
12
+ return null;
13
+ }
14
+
15
+ const filterIsSet = !!tableController.filterValues && Object.keys(tableController.filterValues).length > 0;
16
+ const sortIsSet = !!tableController.sortBy && tableController.sortBy.length > 0;
17
+
18
+ if ((filterIsSet || sortIsSet) && (tableController.clearFilter || tableController.setSortBy)) {
19
+ let label;
20
+ if (filterIsSet && sortIsSet) {
21
+ label = "Clear filter and sort";
22
+ } else if (filterIsSet) {
23
+ label = "Clear filter";
24
+ } else {
25
+ label = "Clear sort";
26
+ }
27
+ return <Button
28
+ variant={"outlined"}
29
+ className="h-fit-content"
30
+ aria-label="filter clear"
31
+ onClick={() => {
32
+ tableController.clearFilter?.();
33
+ tableController.setSortBy?.(undefined);
34
+ }}
35
+ size={"small"}>
36
+ <FilterListOffIcon/>
37
+ {label}
38
+ </Button>
39
+ }
40
+ return null;
41
+ }
@@ -1,8 +1,8 @@
1
1
  import React from "react";
2
2
 
3
- import { Button, Dialog, DialogActions, DialogContent, LoadingButton, Typography } from "@firecms/ui";
3
+ import { Button, Dialog, DialogActions, DialogContent, DialogTitle, LoadingButton, Typography } from "@firecms/ui";
4
4
 
5
- export function DeleteConfirmationDialog({
5
+ export function ConfirmationDialog({
6
6
  open,
7
7
  onAccept,
8
8
  onCancel,
@@ -22,8 +22,8 @@ export function DeleteConfirmationDialog({
22
22
  open={open}
23
23
  onOpenChange={(open) => !open ? onCancel() : undefined}
24
24
  >
25
+ <DialogTitle variant={"h6"} className={"mb-2"}>{title}</DialogTitle>
25
26
  <DialogContent>
26
- <Typography variant={"h6"} className={"mb-2"}>{title}</Typography>
27
27
  {body}
28
28
  </DialogContent>
29
29
 
@@ -1,6 +1,6 @@
1
1
  import { Entity, EntityCallbacks, EntityCollection } from "../types";
2
2
  import React, { useCallback, useMemo, useState } from "react";
3
- import { Button, CircularProgress, Dialog, DialogActions, DialogContent, Typography } from "@firecms/ui";
3
+ import { Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle } from "@firecms/ui";
4
4
  import {
5
5
  deleteEntityWithCallbacks,
6
6
  useCustomizationController,
@@ -40,25 +40,17 @@ export function DeleteEntityDialog<M extends Record<string, any>>({
40
40
  const snackbarController = useSnackbarController();
41
41
  const [loading, setLoading] = useState(false);
42
42
 
43
- const [entityOrEntities, setUsedEntityOrEntities] = React.useState<Entity<M> | Entity<M>[]>();
44
-
45
- const [multipleEntities, setMultipleEntities] = React.useState<boolean>();
46
43
  const context = useFireCMSContext();
44
+ const entityOrEntities = Array.isArray(entityOrEntitiesToDelete) && entityOrEntitiesToDelete.length === 1
45
+ ? entityOrEntitiesToDelete[0]
46
+ : entityOrEntitiesToDelete;
47
47
 
48
- React.useEffect(() => {
49
- if (entityOrEntitiesToDelete) {
50
- const revisedEntityOrEntities = Array.isArray(entityOrEntitiesToDelete) && entityOrEntitiesToDelete.length === 1
51
- ? entityOrEntitiesToDelete[0]
52
- : entityOrEntitiesToDelete;
53
- setUsedEntityOrEntities(revisedEntityOrEntities);
54
- setMultipleEntities(Array.isArray(revisedEntityOrEntities));
55
- }
56
- }, [entityOrEntitiesToDelete]);
48
+ const multipleEntities = Array.isArray(entityOrEntities);
57
49
 
58
50
  const resolvedCollection = useMemo(() => resolveCollection<M>({
59
51
  collection,
60
52
  path,
61
- fields: customizationController.propertyConfigs
53
+ propertyConfigs: customizationController.propertyConfigs
62
54
  }), [collection, path]);
63
55
 
64
56
  const handleCancel = useCallback(() => {
@@ -181,16 +173,15 @@ export function DeleteEntityDialog<M extends Record<string, any>>({
181
173
  open={open}
182
174
  onOpenChange={(open) => !open ? onClose() : undefined}
183
175
  >
176
+ <DialogTitle id="delete-dialog-title">
177
+ {dialogTitle}
178
+ </DialogTitle>
184
179
  <DialogContent fullHeight={true}>
185
- <Typography variant={"subtitle2"} className={"p-4"}>
186
- {dialogTitle}
187
- </Typography>
188
-
189
180
  {!multipleEntities && <div className={"p-4"}>{content}</div>}
190
181
  </DialogContent>
191
182
  <DialogActions>
192
183
 
193
- {loading && <CircularProgress size={"small"}/>}
184
+ {loading && <CircularProgress size={"smallest"}/>}
194
185
 
195
186
  <Button onClick={handleCancel}
196
187
  disabled={loading}
@@ -1,8 +1,20 @@
1
1
  import React, { MouseEvent, useCallback } from "react";
2
2
 
3
3
  import { CollectionSize, Entity, EntityAction, EntityCollection, SelectionController } from "../../types";
4
- import { Checkbox, cn, IconButton, Menu, MenuItem, MoreVertIcon, Skeleton, Tooltip, Typography } from "@firecms/ui";
4
+ import {
5
+ Checkbox,
6
+ Chip,
7
+ cls,
8
+ EditIcon,
9
+ IconButton,
10
+ Menu,
11
+ MenuItem,
12
+ MoreVertIcon,
13
+ Skeleton,
14
+ Tooltip
15
+ } from "@firecms/ui";
5
16
  import { useFireCMSContext, useLargeLayout } from "../../hooks";
17
+ import { hasEntityInCache } from "../../util/entity_cache";
6
18
 
7
19
  /**
8
20
  *
@@ -14,7 +26,6 @@ import { useFireCMSContext, useLargeLayout } from "../../hooks";
14
26
  * @param size
15
27
  * @param toggleEntitySelection
16
28
  * @param hideId
17
- * @constructor
18
29
  *
19
30
  * @group Collection components
20
31
  */
@@ -33,35 +44,32 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
33
44
  actions = [],
34
45
  hideId,
35
46
  selectionController,
47
+ openEntityMode
36
48
  }:
37
- {
38
- entity: Entity<any>,
39
- collection?: EntityCollection<any>,
40
- fullPath?: string,
41
- width: number,
42
- frozen?: boolean,
43
- size: CollectionSize,
44
- isSelected?: boolean,
45
- selectionEnabled?: boolean,
46
- actions?: EntityAction[],
47
- hideId?: boolean,
48
- onCollectionChange?: () => void,
49
- selectionController?: SelectionController;
50
- highlightEntity?: (entity: Entity<any>) => void;
51
- unhighlightEntity?: (entity: Entity<any>) => void;
52
- }) {
49
+ {
50
+ entity: Entity<any>,
51
+ collection?: EntityCollection<any>,
52
+ fullPath?: string,
53
+ width: number,
54
+ frozen?: boolean,
55
+ size: CollectionSize,
56
+ isSelected?: boolean,
57
+ selectionEnabled?: boolean,
58
+ actions?: EntityAction[],
59
+ hideId?: boolean,
60
+ onCollectionChange?: () => void,
61
+ selectionController?: SelectionController;
62
+ highlightEntity?: (entity: Entity<any>) => void;
63
+ unhighlightEntity?: (entity: Entity<any>) => void;
64
+ openEntityMode: "side_panel" | "full_screen";
65
+ }) {
53
66
 
54
67
  const largeLayout = useLargeLayout();
55
68
 
56
69
  const context = useFireCMSContext();
57
70
 
58
71
  const onCheckedChange = useCallback((checked: boolean) => {
59
- selectionController?.toggleEntitySelection(entity);
60
- }, [entity, selectionController?.toggleEntitySelection]);
61
-
62
- const onClick = useCallback((event: MouseEvent) => {
63
- event.stopPropagation();
64
- selectionController?.toggleEntitySelection(entity);
72
+ selectionController?.toggleEntitySelection(entity, checked);
65
73
  }, [entity, selectionController?.toggleEntitySelection]);
66
74
 
67
75
  const hasActions = actions.length > 0;
@@ -69,13 +77,16 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
69
77
 
70
78
  const collapsedActions = actions.filter(a => a.collapsed || a.collapsed === undefined);
71
79
  const uncollapsedActions = actions.filter(a => a.collapsed === false);
80
+ const hasDraft = hasEntityInCache(fullPath + "/" + entity.id);
72
81
  return (
73
82
  <div
74
- onClick={onClick}
75
- className={cn(
76
- "h-full flex items-center justify-center flex-col bg-gray-50 dark:bg-gray-900 bg-opacity-90 dark:bg-opacity-90 z-10",
83
+ className={cls(
84
+ "h-full flex items-center justify-center flex-col bg-surface-50 dark:bg-surface-900 bg-opacity-90 dark:bg-opacity-90 z-10",
77
85
  frozen ? "sticky left-0" : ""
78
86
  )}
87
+ onClick={useCallback((event: any) => {
88
+ event.stopPropagation();
89
+ }, [])}
79
90
  style={{
80
91
  width,
81
92
  position: frozen ? "sticky" : "initial",
@@ -87,7 +98,9 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
87
98
  <div className="w-34 flex justify-center">
88
99
 
89
100
  {uncollapsedActions.map((action, index) => (
90
- <Tooltip key={index} title={action.name}>
101
+ <Tooltip key={index}
102
+ title={action.name}
103
+ asChild={true}>
91
104
  <IconButton
92
105
  onClick={(event: MouseEvent) => {
93
106
  event.stopPropagation();
@@ -100,6 +113,7 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
100
113
  highlightEntity,
101
114
  unhighlightEntity,
102
115
  onCollectionChange,
116
+ openEntityMode: openEntityMode ?? collection?.openEntityMode
103
117
  });
104
118
  }}
105
119
  size={largeLayout ? "medium" : "small"}>
@@ -128,6 +142,7 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
128
142
  highlightEntity,
129
143
  unhighlightEntity,
130
144
  onCollectionChange,
145
+ openEntityMode: openEntityMode ?? collection?.openEntityMode
131
146
  });
132
147
  }}>
133
148
  {action.icon}
@@ -149,16 +164,18 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
149
164
  </div>}
150
165
 
151
166
  {!hideId && size !== "xs" && (
152
- <div className="w-[138px] text-center overflow-hidden truncate">
153
-
167
+ <div
168
+ className="w-[138px] overflow-hidden truncate font-mono text-xs text-text-secondary dark:text-text-secondary-dark max-w-full text-ellipsis px-2 align-center flex items-center justify-center gap-1"
169
+ onClick={(event) => {
170
+ event.stopPropagation();
171
+ }}>
172
+ {hasDraft && <Tooltip title={"Unsaved changes"} className={"inline"}>
173
+ <Chip colorScheme={"orangeDarker"} className={"p-0.5"}>
174
+ <EditIcon size={12}/>
175
+ </Chip>
176
+ </Tooltip>}
154
177
  {entity
155
- ? <Typography
156
- onClick={(event) => {
157
- event.stopPropagation();
158
- }}
159
- className={"font-mono select-all"}
160
- variant={"caption"}
161
- color={"secondary"}> {entity.id} </Typography>
178
+ ? entity.id
162
179
  : <Skeleton/>
163
180
  }
164
181
  </div>