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

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 (370) 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 +3 -4
  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 +7 -13
  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 +3 -3
  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 +4 -1
  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 +1 -1
  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/form/components/FormikArrayContainer.d.ts +2 -1
  64. package/dist/{components → form/components}/LabelWithIcon.d.ts +1 -1
  65. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  66. package/dist/form/components/StorageItemPreview.d.ts +4 -3
  67. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  68. package/dist/form/components/index.d.ts +2 -1
  69. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  70. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  71. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  72. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  73. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  74. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  75. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  76. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  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/TextFieldBinding.d.ts +2 -2
  81. package/dist/form/index.d.ts +4 -5
  82. package/dist/form/useClearRestoreValue.d.ts +2 -2
  83. package/dist/form/validation.d.ts +1 -1
  84. package/dist/hooks/data/delete.d.ts +2 -2
  85. package/dist/hooks/data/save.d.ts +2 -3
  86. package/dist/hooks/data/useDataSource.d.ts +2 -2
  87. package/dist/hooks/data/useEntityFetch.d.ts +3 -3
  88. package/dist/hooks/index.d.ts +5 -1
  89. package/dist/{core → hooks}/useBuildModeController.d.ts +1 -1
  90. package/dist/hooks/useBuildNavigationController.d.ts +23 -0
  91. package/dist/hooks/useProjectLog.d.ts +14 -0
  92. package/dist/hooks/useSnackbarController.d.ts +1 -0
  93. package/dist/hooks/useStorageSource.d.ts +2 -2
  94. package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
  95. package/dist/index.d.ts +1 -0
  96. package/dist/index.es.js +16297 -12643
  97. package/dist/index.es.js.map +1 -1
  98. package/dist/index.umd.js +20043 -587
  99. package/dist/index.umd.js.map +1 -1
  100. package/dist/internal/useBuildDataSource.d.ts +1 -12
  101. package/dist/preview/PropertyPreview.d.ts +1 -1
  102. package/dist/preview/PropertyPreviewProps.d.ts +7 -5
  103. package/dist/preview/components/BooleanPreview.d.ts +5 -1
  104. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  105. package/dist/preview/components/ReferencePreview.d.ts +4 -9
  106. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  107. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  108. package/dist/types/analytics.d.ts +1 -1
  109. package/dist/types/auth.d.ts +38 -2
  110. package/dist/types/collections.d.ts +56 -9
  111. package/dist/types/datasource.d.ts +59 -39
  112. package/dist/types/entities.d.ts +7 -1
  113. package/dist/types/entity_actions.d.ts +14 -0
  114. package/dist/types/entity_callbacks.d.ts +3 -3
  115. package/dist/types/entity_overrides.d.ts +6 -0
  116. package/dist/types/fields.d.ts +47 -42
  117. package/dist/types/firecms.d.ts +8 -23
  118. package/dist/types/index.d.ts +2 -1
  119. package/dist/types/navigation.d.ts +18 -16
  120. package/dist/types/permissions.d.ts +5 -1
  121. package/dist/types/plugins.d.ts +31 -31
  122. package/dist/types/properties.d.ts +36 -23
  123. package/dist/types/property_config.d.ts +2 -2
  124. package/dist/types/roles.d.ts +31 -0
  125. package/dist/types/side_dialogs_controller.d.ts +10 -0
  126. package/dist/types/storage.d.ts +86 -3
  127. package/dist/types/user.d.ts +5 -0
  128. package/dist/util/collections.d.ts +9 -1
  129. package/dist/util/entities.d.ts +2 -2
  130. package/dist/util/icon_list.d.ts +5 -1
  131. package/dist/util/icon_synonyms.d.ts +1 -97
  132. package/dist/util/icons.d.ts +10 -3
  133. package/dist/util/index.d.ts +3 -1
  134. package/dist/util/navigation_utils.d.ts +2 -2
  135. package/dist/util/objects.d.ts +1 -1
  136. package/dist/util/permissions.d.ts +4 -4
  137. package/dist/util/plurals.d.ts +0 -2
  138. package/dist/util/property_utils.d.ts +1 -1
  139. package/dist/util/references.d.ts +4 -2
  140. package/dist/util/resolutions.d.ts +28 -14
  141. package/dist/util/storage.d.ts +23 -2
  142. package/dist/util/strings.d.ts +1 -1
  143. package/dist/util/useDebouncedCallback.d.ts +1 -0
  144. package/dist/util/useStorageUploadController.d.ts +3 -3
  145. package/dist/util/useTraceUpdate.d.ts +1 -0
  146. package/package.json +129 -112
  147. package/src/app/AppBar.tsx +18 -0
  148. package/src/app/Drawer.tsx +24 -0
  149. package/src/app/Scaffold.tsx +243 -0
  150. package/src/app/index.ts +4 -0
  151. package/src/app/useApp.tsx +32 -0
  152. package/src/components/ArrayContainer.tsx +45 -75
  153. package/src/components/CircularProgressCenter.tsx +1 -1
  154. package/src/components/ClearFilterSortButton.tsx +41 -0
  155. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +1 -1
  156. package/src/components/DeleteEntityDialog.tsx +4 -4
  157. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +47 -58
  158. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +253 -448
  159. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +11 -12
  160. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +54 -48
  161. package/src/components/EntityCollectionTable/column_utils.tsx +4 -4
  162. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +40 -32
  163. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +17 -9
  164. package/src/components/EntityCollectionTable/index.tsx +1 -9
  165. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +44 -46
  166. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +32 -30
  167. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +19 -7
  168. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +145 -142
  169. package/src/components/EntityCollectionView/EntityCollectionView.tsx +184 -171
  170. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +5 -6
  171. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  172. package/src/components/EntityCollectionView/useSelectionController.tsx +42 -0
  173. package/src/components/EntityCollectionView/utils.ts +19 -0
  174. package/src/components/EntityPreview.tsx +208 -71
  175. package/src/components/EntityView.tsx +84 -0
  176. package/src/components/ErrorView.tsx +1 -1
  177. package/src/components/FieldCaption.tsx +14 -0
  178. package/src/components/HomePage/DefaultHomePage.tsx +38 -28
  179. package/src/components/HomePage/NavigationCard.tsx +69 -0
  180. package/src/components/HomePage/NavigationCardBinding.tsx +116 -0
  181. package/src/components/HomePage/NavigationGroup.tsx +1 -1
  182. package/src/components/HomePage/SmallNavigationCard.tsx +44 -0
  183. package/src/components/HomePage/index.tsx +3 -1
  184. package/src/components/PropertyConfigBadge.tsx +23 -0
  185. package/src/components/PropertyIdCopyTooltip.tsx +48 -0
  186. package/src/components/{ReferenceSelectionInner.tsx → ReferenceTable/ReferenceSelectionTable.tsx} +37 -23
  187. package/src/components/ReferenceWidget.tsx +26 -16
  188. package/src/components/SearchIconsView.tsx +10 -7
  189. package/src/components/{EntityCollectionTable/SimpleEntityCollectionTable.tsx → SelectableTable/SelectableTable.tsx} +46 -84
  190. package/src/components/SelectableTable/SelectableTableContext.tsx +6 -0
  191. package/src/components/{EntityCollectionTable → SelectableTable}/filters/BooleanFilterField.tsx +2 -3
  192. package/src/components/{EntityCollectionTable → SelectableTable}/filters/DateTimeFilterField.tsx +22 -7
  193. package/src/components/{EntityCollectionTable → SelectableTable}/filters/ReferenceFilterField.tsx +38 -24
  194. package/src/components/{EntityCollectionTable → SelectableTable}/filters/StringNumberFilterField.tsx +88 -22
  195. package/src/components/VirtualTable/VirtualTable.tsx +77 -46
  196. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  197. package/src/components/VirtualTable/VirtualTableHeader.tsx +14 -8
  198. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  199. package/src/components/VirtualTable/VirtualTableProps.tsx +19 -15
  200. package/src/components/VirtualTable/VirtualTableRow.tsx +4 -5
  201. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
  202. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +4 -3
  203. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +4 -3
  204. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +14 -28
  205. package/src/components/VirtualTable/types.tsx +2 -3
  206. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +17 -9
  207. package/src/components/common/index.ts +6 -0
  208. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  209. package/src/components/{EntityCollectionTable → common}/types.tsx +9 -6
  210. package/src/components/{EntityCollectionView → common}/useColumnsIds.tsx +23 -2
  211. package/src/components/{EntityCollectionTable → common}/useDataSourceEntityCollectionTableController.tsx +25 -14
  212. package/src/components/common/useTableSearchHelper.ts +88 -0
  213. package/src/components/index.tsx +15 -8
  214. package/src/contexts/AuthControllerContext.tsx +1 -1
  215. package/src/contexts/DialogsProvider.tsx +2 -2
  216. package/src/core/DefaultAppBar.tsx +176 -0
  217. package/src/core/DefaultDrawer.tsx +183 -0
  218. package/src/core/DrawerNavigationItem.tsx +66 -0
  219. package/src/core/EntityEditView.tsx +1127 -0
  220. package/src/core/EntitySidePanel.tsx +9 -8
  221. package/src/core/FireCMS.tsx +67 -59
  222. package/src/core/NavigationRoutes.tsx +25 -17
  223. package/src/core/SideDialogs.tsx +1 -0
  224. package/src/core/field_configs.tsx +18 -19
  225. package/src/core/index.tsx +3 -6
  226. package/src/form/PropertyFieldBinding.tsx +60 -33
  227. package/src/form/components/CustomIdField.tsx +51 -36
  228. package/src/form/components/ErrorFocus.tsx +3 -3
  229. package/src/form/components/FieldHelperText.tsx +4 -4
  230. package/src/form/components/FormikArrayContainer.tsx +4 -1
  231. package/src/form/components/LabelWithIcon.tsx +41 -0
  232. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  233. package/src/form/components/StorageItemPreview.tsx +22 -10
  234. package/src/form/components/StorageUploadProgress.tsx +8 -8
  235. package/src/form/components/index.tsx +2 -1
  236. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +28 -18
  237. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +37 -37
  238. package/src/form/field_bindings/BlockFieldBinding.tsx +29 -27
  239. package/src/form/field_bindings/DateTimeFieldBinding.tsx +20 -17
  240. package/src/form/field_bindings/KeyValueFieldBinding.tsx +66 -60
  241. package/src/form/field_bindings/MapFieldBinding.tsx +35 -33
  242. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
  243. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +26 -22
  244. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +12 -18
  245. package/src/form/field_bindings/ReferenceFieldBinding.tsx +45 -33
  246. package/src/form/field_bindings/RepeatFieldBinding.tsx +36 -21
  247. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -16
  248. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +41 -42
  249. package/src/form/field_bindings/SwitchFieldBinding.tsx +11 -8
  250. package/src/form/field_bindings/TextFieldBinding.tsx +34 -30
  251. package/src/form/index.tsx +5 -9
  252. package/src/form/useClearRestoreValue.tsx +2 -2
  253. package/src/form/validation.ts +4 -21
  254. package/src/hooks/data/delete.ts +5 -4
  255. package/src/hooks/data/save.ts +7 -2
  256. package/src/hooks/data/useCollectionFetch.tsx +1 -1
  257. package/src/hooks/data/useDataSource.tsx +15 -2
  258. package/src/hooks/data/useEntityFetch.tsx +4 -4
  259. package/src/hooks/index.tsx +7 -1
  260. package/src/{core → hooks}/useBuildLocalConfigurationPersistence.tsx +8 -10
  261. package/src/{core → hooks}/useBuildModeController.tsx +12 -6
  262. package/src/{internal → hooks}/useBuildNavigationController.tsx +244 -99
  263. package/src/hooks/useFireCMSContext.tsx +51 -3
  264. package/src/hooks/useLargeLayout.tsx +10 -7
  265. package/src/hooks/useProjectLog.tsx +63 -0
  266. package/src/hooks/useReferenceDialog.tsx +3 -3
  267. package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
  268. package/src/hooks/useSnackbarController.tsx +1 -2
  269. package/src/hooks/useStorageSource.tsx +7 -2
  270. package/src/hooks/useValidateAuthenticator.tsx +115 -0
  271. package/src/index.ts +1 -0
  272. package/src/internal/useBuildDataSource.ts +79 -84
  273. package/src/internal/useBuildSideDialogsController.tsx +1 -0
  274. package/src/internal/useBuildSideEntityController.tsx +103 -23
  275. package/src/internal/useUnsavedChangesDialog.tsx +3 -1
  276. package/src/preview/PropertyPreview.tsx +12 -19
  277. package/src/preview/PropertyPreviewProps.tsx +6 -10
  278. package/src/preview/components/BooleanPreview.tsx +19 -4
  279. package/src/preview/components/EnumValuesChip.tsx +2 -2
  280. package/src/preview/components/ImagePreview.tsx +24 -34
  281. package/src/preview/components/ReferencePreview.tsx +73 -176
  282. package/src/preview/components/StorageThumbnail.tsx +5 -1
  283. package/src/preview/components/UrlComponentPreview.tsx +44 -11
  284. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +1 -2
  285. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +3 -2
  286. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -2
  287. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
  288. package/src/preview/property_previews/ArrayOneOfPreview.tsx +3 -4
  289. package/src/preview/property_previews/ArrayPropertyPreview.tsx +3 -4
  290. package/src/preview/property_previews/MapPropertyPreview.tsx +6 -6
  291. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +2 -2
  292. package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
  293. package/src/preview/util.ts +2 -2
  294. package/src/types/analytics.ts +1 -0
  295. package/src/types/auth.tsx +51 -2
  296. package/src/types/collections.ts +65 -9
  297. package/src/types/customization_controller.tsx +0 -1
  298. package/src/types/datasource.ts +69 -47
  299. package/src/types/entities.ts +15 -1
  300. package/src/types/entity_actions.tsx +17 -0
  301. package/src/types/entity_callbacks.ts +4 -3
  302. package/src/types/entity_overrides.tsx +7 -0
  303. package/src/types/fields.tsx +51 -45
  304. package/src/types/firecms.tsx +9 -26
  305. package/src/types/index.ts +2 -1
  306. package/src/types/navigation.ts +20 -19
  307. package/src/types/permissions.ts +6 -1
  308. package/src/types/plugins.tsx +38 -40
  309. package/src/types/properties.ts +42 -24
  310. package/src/types/property_config.tsx +2 -2
  311. package/src/types/roles.ts +41 -0
  312. package/src/types/side_dialogs_controller.tsx +13 -0
  313. package/src/types/side_entity_controller.tsx +1 -0
  314. package/src/types/storage.ts +94 -3
  315. package/src/types/user.ts +7 -0
  316. package/src/util/collections.ts +22 -0
  317. package/src/util/entities.ts +6 -5
  318. package/src/util/enums.ts +1 -1
  319. package/src/util/icon_list.ts +15 -10
  320. package/src/util/icon_synonyms.ts +3 -99
  321. package/src/util/icons.tsx +18 -4
  322. package/src/util/index.ts +3 -1
  323. package/src/util/make_properties_editable.ts +13 -5
  324. package/src/util/navigation_utils.ts +6 -6
  325. package/src/util/objects.ts +25 -28
  326. package/src/util/permissions.ts +12 -8
  327. package/src/util/plurals.ts +0 -2
  328. package/src/util/property_utils.tsx +1 -1
  329. package/src/util/references.ts +39 -5
  330. package/src/util/resolutions.ts +75 -42
  331. package/src/util/storage.ts +79 -21
  332. package/src/util/strings.ts +4 -3
  333. package/src/util/{useDebounce.ts → useDebouncedCallback.ts} +1 -1
  334. package/src/util/useStorageUploadController.tsx +33 -7
  335. package/src/util/useTraceUpdate.tsx +2 -1
  336. package/dist/components/VirtualTable/common.d.ts +0 -2
  337. package/dist/core/Drawer.d.ts +0 -23
  338. package/dist/core/Scaffold.d.ts +0 -52
  339. package/dist/form/EntityForm.d.ts +0 -75
  340. package/dist/form/components/SubmitListener.d.ts +0 -1
  341. package/dist/form/components/SwitchControl.d.ts +0 -8
  342. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  343. package/dist/hooks/useVerifyLicense.d.ts +0 -0
  344. package/dist/internal/EntityView.d.ts +0 -22
  345. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  346. package/dist/internal/useBuildNavigationController.d.ts +0 -14
  347. package/dist/internal/useLocaleConfig.d.ts +0 -1
  348. package/dist/types/appcheck.d.ts +0 -26
  349. package/dist/util/useDebounce.d.ts +0 -1
  350. package/src/components/FieldConfigBadge.tsx +0 -17
  351. package/src/components/FireCMSAppBar.tsx +0 -157
  352. package/src/components/HomePage/NavigationCollectionCard.tsx +0 -146
  353. package/src/components/LabelWithIcon.tsx +0 -33
  354. package/src/core/Drawer.tsx +0 -162
  355. package/src/core/Scaffold.tsx +0 -278
  356. package/src/form/EntityForm.tsx +0 -657
  357. package/src/form/components/SubmitListener.tsx +0 -32
  358. package/src/form/components/SwitchControl.tsx +0 -39
  359. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -696
  360. package/src/hooks/useVerifyLicense.tsx +0 -1
  361. package/src/internal/EntityView.tsx +0 -578
  362. package/src/internal/useBuildCustomizationController.tsx +0 -5
  363. package/src/internal/useLocaleConfig.tsx +0 -18
  364. package/src/types/appcheck.ts +0 -29
  365. /package/dist/components/{EntityCollectionTable → SelectableTable}/filters/BooleanFilterField.d.ts +0 -0
  366. /package/dist/components/{EntityCollectionTable → SelectableTable}/filters/DateTimeFilterField.d.ts +0 -0
  367. /package/dist/components/{EntityCollectionTable → SelectableTable}/filters/StringNumberFilterField.d.ts +0 -0
  368. /package/dist/components/{EntityCollectionTable → common}/useDebouncedData.d.ts +0 -0
  369. /package/dist/{core → hooks}/useBuildLocalConfigurationPersistence.d.ts +0 -0
  370. /package/src/components/{EntityCollectionTable → common}/useDebouncedData.ts +0 -0
@@ -8,27 +8,24 @@ import {
8
8
  Entity,
9
9
  EntityAction,
10
10
  EntityCollection,
11
+ EntityReference,
12
+ EntityTableController,
11
13
  FilterValues,
12
14
  PartialEntityCollection,
13
15
  PropertyOrBuilder,
14
16
  ResolvedProperty,
15
- SaveEntityProps,
16
- SelectionController
17
+ SaveEntityProps
17
18
  } from "../../types";
18
19
  import {
20
+ EntityCollectionRowActions,
19
21
  EntityCollectionTable,
20
- OnCellValueChange,
21
- OnColumnResizeParams,
22
- UniqueFieldValidator
22
+ useDataSourceEntityCollectionTableController
23
23
  } from "../EntityCollectionTable";
24
24
 
25
- import { EntityCollectionRowActions } from "../EntityCollectionTable/EntityCollectionRowActions";
26
-
27
25
  import {
28
26
  canCreateEntity,
29
27
  canDeleteEntity,
30
28
  canEditEntity,
31
- fullPathToCollectionSegments,
32
29
  getPropertyInPath,
33
30
  mergeDeep,
34
31
  resolveCollection,
@@ -47,35 +44,37 @@ import {
47
44
  } from "../../hooks";
48
45
  import { useUserConfigurationPersistence } from "../../hooks/useUserConfigurationPersistence";
49
46
  import { EntityCollectionViewActions } from "./EntityCollectionViewActions";
50
- import {
51
- useDataSourceEntityCollectionTableController
52
- } from "../EntityCollectionTable/useDataSourceEntityCollectionTableController";
53
47
  import {
54
48
  AddIcon,
55
49
  Button,
56
- cn,
50
+ cls,
51
+ focusedDisabled,
57
52
  IconButton,
58
53
  KeyboardTabIcon,
59
54
  Markdown,
60
55
  Popover,
61
56
  SearchIcon,
62
57
  Skeleton,
63
- TextField,
64
58
  Tooltip,
65
59
  Typography
66
60
  } from "@firecms/ui";
67
- import { setIn } from "formik";
61
+ import { setIn } from "@firecms/formex";
68
62
  import { getSubcollectionColumnId } from "../EntityCollectionTable/internal/common";
69
- import { useColumnIds } from "./useColumnsIds";
63
+ import {
64
+ OnCellValueChange,
65
+ OnColumnResizeParams,
66
+ UniqueFieldValidator,
67
+ useColumnIds,
68
+ useTableSearchHelper
69
+ } from "../common";
70
70
  import { PopupFormField } from "../EntityCollectionTable/internal/popup_field/PopupFormField";
71
71
  import { GetPropertyForProps } from "../EntityCollectionTable/EntityCollectionTableProps";
72
- import {
73
- copyEntityAction,
74
- deleteEntityAction,
75
- editEntityAction
76
- } from "../EntityCollectionTable/internal/default_entity_actions";
72
+ import { copyEntityAction, deleteEntityAction, editEntityAction } from "../common/default_entity_actions";
77
73
  import { DeleteEntityDialog } from "../DeleteEntityDialog";
78
74
  import { useAnalyticsController } from "../../hooks/useAnalyticsController";
75
+ import { useSelectionController } from "./useSelectionController";
76
+ import { EntityCollectionViewStartActions } from "./EntityCollectionViewStartActions";
77
+ import { addRecentId, getRecentIds } from "./utils";
79
78
 
80
79
  const COLLECTION_GROUP_PARENT_ID = "collectionGroupParent";
81
80
 
@@ -83,10 +82,22 @@ const COLLECTION_GROUP_PARENT_ID = "collectionGroupParent";
83
82
  * @group Components
84
83
  */
85
84
  export type EntityCollectionViewProps<M extends Record<string, any>> = {
86
- fullPath: string;
85
+ /**
86
+ * Complete path where this collection is located.
87
+ * It defaults to the collection path if not provided.
88
+ */
89
+ fullPath?: string;
90
+ /**
91
+ * If this is a subcollection, specify the parent collection ids.
92
+ */
87
93
  parentCollectionIds?: string[];
94
+ /**
95
+ * Whether this is a subcollection or not.
96
+ */
88
97
  isSubCollection?: boolean;
98
+
89
99
  className?: string;
100
+
90
101
  } & EntityCollection<M>;
91
102
 
92
103
  /**
@@ -110,12 +121,12 @@ export type EntityCollectionViewProps<M extends Record<string, any>> = {
110
121
  *
111
122
  * @param fullPath
112
123
  * @param collection
113
- * @constructor
124
+
114
125
  * @group Components
115
126
  */
116
127
  export const EntityCollectionView = React.memo(
117
128
  function EntityCollectionView<M extends Record<string, any>>({
118
- fullPath,
129
+ fullPath: fullPathProp,
119
130
  parentCollectionIds,
120
131
  isSubCollection,
121
132
  className,
@@ -123,14 +134,15 @@ export const EntityCollectionView = React.memo(
123
134
  }: EntityCollectionViewProps<M>
124
135
  ) {
125
136
 
126
- const dataSource = useDataSource();
137
+ const context = useFireCMSContext();
138
+ const fullPath = fullPathProp ?? collectionProp.path;
139
+ const dataSource = useDataSource(collectionProp);
127
140
  const navigation = useNavigationController();
128
141
  const sideEntityController = useSideEntityController();
129
142
  const authController = useAuthController();
130
143
  const userConfigPersistence = useUserConfigurationPersistence();
131
144
  const analyticsController = useAnalyticsController();
132
145
  const customizationController = useCustomizationController();
133
- const context = useFireCMSContext();
134
146
 
135
147
  const containerRef = React.useRef<HTMLDivElement>(null);
136
148
 
@@ -144,27 +156,26 @@ export const EntityCollectionView = React.memo(
144
156
  collectionRef.current = collection;
145
157
  }, [collection]);
146
158
 
147
- const canCreateEntities = canCreateEntity(collection, authController, fullPathToCollectionSegments(fullPath), null);
148
- const [selectedNavigationEntity, setSelectedNavigationEntity] = useState<Entity<M> | undefined>(undefined);
159
+ const canCreateEntities = canCreateEntity(collection, authController, fullPath, null);
160
+ const [highlightedEntity, setHighlightedEntity] = useState<Entity<M> | undefined>(undefined);
149
161
  const [deleteEntityClicked, setDeleteEntityClicked] = React.useState<Entity<M> | Entity<M>[] | undefined>(undefined);
150
162
 
151
- const [textSearchLoading, setTextSearchLoading] = useState<boolean>(false);
152
163
  const [lastDeleteTimestamp, setLastDeleteTimestamp] = React.useState<number>(0);
153
164
 
154
165
  // number of entities in the collection
155
166
  const [docsCount, setDocsCount] = useState<number>(0);
156
167
 
157
168
  const unselectNavigatedEntity = useCallback(() => {
158
- const currentSelection = selectedNavigationEntity;
169
+ const currentSelection = highlightedEntity;
159
170
  setTimeout(() => {
160
- if (currentSelection === selectedNavigationEntity)
161
- setSelectedNavigationEntity(undefined);
171
+ if (currentSelection === highlightedEntity)
172
+ setHighlightedEntity(undefined);
162
173
  }, 2400);
163
- }, [selectedNavigationEntity]);
174
+ }, [highlightedEntity]);
164
175
 
165
176
  const checkInlineEditing = useCallback((entity?: Entity<any>): boolean => {
166
177
  const collection = collectionRef.current;
167
- if (!canEditEntity(collection, authController, fullPathToCollectionSegments(fullPath), entity ?? null)) {
178
+ if (!canEditEntity(collection, authController, fullPath, entity ?? null)) {
168
179
  return false;
169
180
  }
170
181
  return collection.inlineEditing === undefined || collection.inlineEditing;
@@ -179,19 +190,16 @@ export const EntityCollectionView = React.memo(
179
190
  const usedSelectionController = collection.selectionController ?? selectionController;
180
191
  const {
181
192
  selectedEntities,
182
- toggleEntitySelection,
183
- isEntitySelected,
184
193
  setSelectedEntities
185
194
  } = usedSelectionController;
186
195
 
187
- useEffect(() => {
188
- setDeleteEntityClicked(undefined);
189
- }, [selectedEntities]);
196
+ // useEffect(() => {
197
+ // setDeleteEntityClicked(undefined);
198
+ // }, [selectedEntities]);
190
199
 
191
200
  const tableController = useDataSourceEntityCollectionTableController<M>({
192
201
  fullPath,
193
- collection: collectionRef.current,
194
- entitiesDisplayedFirst: [],
202
+ collection,
195
203
  lastDeleteTimestamp
196
204
  });
197
205
 
@@ -204,7 +212,7 @@ export const EntityCollectionView = React.memo(
204
212
 
205
213
  const onEntityClick = useCallback((clickedEntity: Entity<M>) => {
206
214
  const collection = collectionRef.current;
207
- setSelectedNavigationEntity(clickedEntity);
215
+ setHighlightedEntity(clickedEntity);
208
216
  analyticsController.onAnalyticsEvent?.("edit_entity_clicked", {
209
217
  path: clickedEntity.path,
210
218
  entityId: clickedEntity.id
@@ -214,9 +222,9 @@ export const EntityCollectionView = React.memo(
214
222
  path: clickedEntity.path,
215
223
  collection,
216
224
  updateUrl: true,
217
- onClose: unselectNavigatedEntity
225
+ onClose: unselectNavigatedEntity,
218
226
  });
219
- }, [unselectNavigatedEntity]);
227
+ }, [unselectNavigatedEntity, sideEntityController]);
220
228
 
221
229
  const onNewClick = useCallback(() => {
222
230
 
@@ -228,9 +236,9 @@ export const EntityCollectionView = React.memo(
228
236
  path: fullPath,
229
237
  collection,
230
238
  updateUrl: true,
231
- onClose: unselectNavigatedEntity
239
+ onClose: unselectNavigatedEntity,
232
240
  });
233
- }, [fullPath]);
241
+ }, [fullPath, sideEntityController]);
234
242
 
235
243
  const onMultipleDeleteClick = () => {
236
244
  analyticsController.onAnalyticsEvent?.("multiple_delete_dialog_open", {
@@ -260,6 +268,7 @@ export const EntityCollectionView = React.memo(
260
268
  fullPath: string,
261
269
  parentCollectionIds: string[],
262
270
  collection: EntityCollection;
271
+ tableController: EntityTableController;
263
272
  }> | undefined
264
273
 
265
274
  // we are only using the first plugin that implements this
@@ -292,7 +301,7 @@ export const EntityCollectionView = React.memo(
292
301
  onCollectionModifiedForUser(fullPath, { defaultSize: size })
293
302
  }, [onCollectionModifiedForUser, fullPath, userConfigPersistence]);
294
303
 
295
- const createEnabled = canCreateEntity(collection, authController, fullPathToCollectionSegments(fullPath), null);
304
+ const createEnabled = canCreateEntity(collection, authController, fullPath, null);
296
305
 
297
306
  const uniqueFieldValidator: UniqueFieldValidator = useCallback(
298
307
  ({
@@ -300,17 +309,15 @@ export const EntityCollectionView = React.memo(
300
309
  value,
301
310
  property,
302
311
  entityId
303
- }) => dataSource.checkUniqueField(fullPath, name, value, entityId),
312
+ }) => dataSource.checkUniqueField(fullPath, name, value, entityId, collection),
304
313
  [fullPath]);
305
314
 
306
315
  const onValueChange: OnCellValueChange<any, any> = ({
307
- fullPath,
308
- context,
309
316
  value,
310
317
  propertyKey,
311
318
  onValueUpdated,
312
319
  setError,
313
- entity,
320
+ data: entity,
314
321
  }) => {
315
322
 
316
323
  const updatedValues = setIn({ ...entity.values }, propertyKey, value);
@@ -327,10 +334,12 @@ export const EntityCollectionView = React.memo(
327
334
  return saveEntityWithCallbacks({
328
335
  ...saveProps,
329
336
  collection,
330
- callbacks: collection.callbacks,
331
337
  dataSource,
332
338
  context,
333
- onSaveSuccess: () => onValueUpdated(),
339
+ onSaveSuccess: () => {
340
+ setError(undefined);
341
+ onValueUpdated();
342
+ },
334
343
  onSaveFailure: (e: Error) => {
335
344
  console.error("Save failure");
336
345
  console.error(e);
@@ -349,7 +358,6 @@ export const EntityCollectionView = React.memo(
349
358
 
350
359
  const getPropertyFor = useCallback(({
351
360
  propertyKey,
352
- propertyValue,
353
361
  entity
354
362
  }: GetPropertyForProps<M>) => {
355
363
  let propertyOrBuilder: PropertyOrBuilder<any, M> | undefined = getPropertyInPath<M>(collection.properties, propertyKey);
@@ -363,13 +371,12 @@ export const EntityCollectionView = React.memo(
363
371
  return resolveProperty({
364
372
  propertyKey,
365
373
  propertyOrBuilder,
366
- path: fullPath,
367
- propertyValue,
374
+ path: entity.path,
368
375
  values: entity.values,
369
376
  entityId: entity.id,
370
377
  fields: customizationController.propertyConfigs
371
378
  });
372
- }, [collection.properties, customizationController.propertyConfigs, fullPath, resolvedCollection.properties]);
379
+ }, [collection.properties, customizationController.propertyConfigs, resolvedCollection.properties]);
373
380
 
374
381
  const displayedColumnIds = useColumnIds(resolvedCollection, true);
375
382
 
@@ -391,7 +398,7 @@ export const EntityCollectionView = React.memo(
391
398
  entityId: entity.id,
392
399
  selectedSubPath: subcollection.id ?? subcollection.path,
393
400
  collection,
394
- updateUrl: true
401
+ updateUrl: true,
395
402
  });
396
403
  }}>
397
404
  {subcollection.name}
@@ -409,16 +416,16 @@ export const EntityCollectionView = React.memo(
409
416
  Builder: ({ entity }) => {
410
417
  const collectionsWithPath = navigation.getParentReferencesFromPath(entity.path);
411
418
  return (
412
- <>
419
+ <div className={"flex flex-col gap-2 w-full"}>
413
420
  {collectionsWithPath.map((reference) => {
414
421
  return (
415
422
  <ReferencePreview
416
423
  key={reference.path + "/" + reference.id}
417
424
  reference={reference}
418
- size={"tiny"}/>
425
+ size={"smallest"}/>
419
426
  );
420
427
  })}
421
- </>
428
+ </div>
422
429
  );
423
430
  }
424
431
  }]
@@ -429,7 +436,7 @@ export const EntityCollectionView = React.memo(
429
436
  ...subcollectionColumns,
430
437
  ...collectionGroupParentCollections
431
438
  ];
432
- }, [collection, fullPath]);
439
+ }, [collection, fullPath, sideEntityController]);
433
440
 
434
441
  const updateLastDeleteTimestamp = useCallback(() => {
435
442
  setLastDeleteTimestamp(Date.now());
@@ -437,11 +444,14 @@ export const EntityCollectionView = React.memo(
437
444
 
438
445
  const largeLayout = useLargeLayout();
439
446
 
440
- const getActionsForEntity = useCallback(({ entity, customEntityActions }: {
447
+ const getActionsForEntity = ({
448
+ entity,
449
+ customEntityActions
450
+ }: {
441
451
  entity?: Entity<M>,
442
452
  customEntityActions?: EntityAction[]
443
453
  }): EntityAction[] => {
444
- const deleteEnabled = entity ? canDeleteEntity(collection, authController, fullPathToCollectionSegments(fullPath), entity) : true;
454
+ const deleteEnabled = entity ? canDeleteEntity(collection, authController, fullPath, entity) : true;
445
455
  const actions: EntityAction[] = [editEntityAction];
446
456
  if (createEnabled)
447
457
  actions.push(copyEntityAction);
@@ -450,15 +460,15 @@ export const EntityCollectionView = React.memo(
450
460
  if (customEntityActions)
451
461
  actions.push(...customEntityActions);
452
462
  return actions;
453
- }, [authController, collection, createEnabled, fullPath]);
463
+ };
454
464
 
455
- const getIdColumnWidth = useCallback(() => {
465
+ const getIdColumnWidth = () => {
456
466
  const entityActions = getActionsForEntity({});
457
467
  const collapsedActions = entityActions.filter(a => a.collapsed !== false);
458
468
  const uncollapsedActions = entityActions.filter(a => a.collapsed === false);
459
469
  const actionsWidth = uncollapsedActions.length * (largeLayout ? 40 : 30);
460
470
  return (largeLayout ? (80 + actionsWidth) : (70 + actionsWidth)) + (collapsedActions.length > 0 ? (largeLayout ? 40 : 30) : 0);
461
- }, [largeLayout]);
471
+ };
462
472
 
463
473
  const tableRowActionsBuilder = useCallback(({
464
474
  entity,
@@ -472,9 +482,12 @@ export const EntityCollectionView = React.memo(
472
482
  frozen?: boolean
473
483
  }) => {
474
484
 
475
- const isSelected = isEntitySelected(entity);
485
+ const isSelected = usedSelectionController.selectedEntities.map(e => e.id).includes(entity.id);
476
486
 
477
- const actions = getActionsForEntity({ entity, customEntityActions: collection.entityActions });
487
+ const actions = getActionsForEntity({
488
+ entity,
489
+ customEntityActions: collection.entityActions
490
+ });
478
491
 
479
492
  return (
480
493
  <EntityCollectionRowActions
@@ -484,7 +497,7 @@ export const EntityCollectionView = React.memo(
484
497
  isSelected={isSelected}
485
498
  selectionEnabled={selectionEnabled}
486
499
  size={size}
487
- highlightEntity={setSelectedNavigationEntity}
500
+ highlightEntity={setHighlightedEntity}
488
501
  unhighlightEntity={unselectNavigatedEntity}
489
502
  collection={collection}
490
503
  fullPath={fullPath}
@@ -495,7 +508,7 @@ export const EntityCollectionView = React.memo(
495
508
  />
496
509
  );
497
510
 
498
- }, [isEntitySelected, collection, authController, fullPath, selectionEnabled, toggleEntitySelection, createEnabled]);
511
+ }, [updateLastDeleteTimestamp, usedSelectionController]);
499
512
 
500
513
  const title = <Popover
501
514
  open={popOverOpen}
@@ -554,6 +567,7 @@ export const EntityCollectionView = React.memo(
554
567
  property={property}
555
568
  fullPath={fullPath}
556
569
  collection={collection}
570
+ tableController={tableController}
557
571
  parentCollectionIds={parentCollectionIds ?? []}/>;
558
572
  })}
559
573
  </>;
@@ -564,47 +578,31 @@ export const EntityCollectionView = React.memo(
564
578
  if (typeof AddColumnComponent === "function")
565
579
  return <AddColumnComponent fullPath={fullPath}
566
580
  parentCollectionIds={parentCollectionIds ?? []}
567
- collection={collection}/>;
581
+ collection={collection}
582
+ tableController={tableController}/>;
568
583
  return null;
569
584
  }
570
585
  : undefined;
571
586
 
572
- const [textSearchInitialised, setTextSearchInitialised] = useState<boolean>(false);
573
- let onTextSearchClick: (() => void) | undefined;
574
- let textSearchEnabled = Boolean(collection.textSearchEnabled);
575
- if (customizationController?.plugins) {
576
- const addTextSearchClickListener = customizationController.plugins?.find(p => Boolean(p.collectionView?.onTextSearchClick));
577
-
578
- onTextSearchClick = addTextSearchClickListener
579
- ? () => {
580
- setTextSearchLoading(true);
581
- Promise.all(customizationController.plugins?.map(p => {
582
- if (p.collectionView?.onTextSearchClick)
583
- return p.collectionView.onTextSearchClick({ context, path: resolvedFullPath, collection, parentCollectionIds });
584
- return Promise.resolve(true);
585
- }) as Promise<boolean>[])
586
- .then((res) => {
587
- if (res.every(Boolean)) setTextSearchInitialised(true);
588
- })
589
- .finally(() => setTextSearchLoading(false));
590
- }
591
- : undefined;
592
-
593
- customizationController.plugins?.forEach(p => {
594
- if (!textSearchEnabled)
595
- if (p.collectionView?.showTextSearchBar) {
596
- textSearchEnabled = p.collectionView.showTextSearchBar({ context, path: resolvedFullPath, collection, parentCollectionIds });
597
- }
598
- })
599
- }
587
+ const {
588
+ textSearchLoading,
589
+ textSearchInitialised,
590
+ onTextSearchClick,
591
+ textSearchEnabled
592
+ } = useTableSearchHelper({
593
+ collection,
594
+ fullPath: resolvedFullPath,
595
+ parentCollectionIds
596
+ });
600
597
 
601
598
  return (
602
- <div className={cn("overflow-hidden h-full w-full", className)}
599
+ <div className={cls("overflow-hidden h-full w-full rounded-md", className)}
603
600
  ref={containerRef}>
604
601
  <EntityCollectionTable
605
602
  key={`collection_table_${fullPath}`}
606
603
  additionalFields={additionalFields}
607
604
  tableController={tableController}
605
+ enablePopupIcon={true}
608
606
  displayedColumnIds={displayedColumnIds}
609
607
  onSizeChanged={onSizeChanged}
610
608
  onEntityClick={onEntityClick}
@@ -614,13 +612,21 @@ export const EntityCollectionView = React.memo(
614
612
  uniqueFieldValidator={uniqueFieldValidator}
615
613
  title={title}
616
614
  selectionController={usedSelectionController}
617
- highlightedEntities={selectedNavigationEntity ? [selectedNavigationEntity] : []}
615
+ highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
618
616
  defaultSize={collection.defaultSize}
619
617
  properties={resolvedCollection.properties}
620
618
  getPropertyFor={getPropertyFor}
621
619
  onTextSearchClick={textSearchInitialised ? undefined : onTextSearchClick}
622
620
  textSearchLoading={textSearchLoading}
623
621
  textSearchEnabled={textSearchEnabled}
622
+ actionsStart={<EntityCollectionViewStartActions
623
+ parentCollectionIds={parentCollectionIds ?? []}
624
+ collection={collection}
625
+ tableController={tableController}
626
+ path={fullPath}
627
+ relativePath={collection.path}
628
+ selectionController={usedSelectionController}
629
+ collectionEntitiesCount={docsCount}/>}
624
630
  actions={<EntityCollectionViewActions
625
631
  parentCollectionIds={parentCollectionIds ?? []}
626
632
  collection={collection}
@@ -658,19 +664,19 @@ export const EntityCollectionView = React.memo(
658
664
  collection={collection}/>}
659
665
  />
660
666
 
661
- <PopupFormField
667
+ {popupCell && <PopupFormField
662
668
  key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entity?.id}`}
663
669
  open={Boolean(popupCell)}
664
670
  onClose={onPopupClose}
665
671
  cellRect={popupCell?.cellRect}
666
672
  propertyKey={popupCell?.propertyKey}
667
673
  collection={collection}
668
- entity={popupCell?.entity}
674
+ entity={popupCell.entity}
669
675
  tableKey={tableKey.current}
670
676
  customFieldValidator={uniqueFieldValidator}
671
677
  path={resolvedFullPath}
672
678
  onCellValueChange={onValueChange}
673
- container={containerRef.current}/>
679
+ container={containerRef.current}/>}
674
680
 
675
681
  {deleteEntityClicked &&
676
682
  <DeleteEntityDialog
@@ -691,45 +697,21 @@ export const EntityCollectionView = React.memo(
691
697
  equal(a.isSubCollection, b.isSubCollection) &&
692
698
  equal(a.className, b.className) &&
693
699
  equal(a.properties, b.properties) &&
700
+ equal(a.propertiesOrder, b.propertiesOrder) &&
694
701
  equal(a.hideIdFromCollection, b.hideIdFromCollection) &&
695
702
  equal(a.inlineEditing, b.inlineEditing) &&
696
703
  equal(a.selectionEnabled, b.selectionEnabled) &&
697
704
  equal(a.selectionController, b.selectionController) &&
698
705
  equal(a.Actions, b.Actions) &&
699
706
  equal(a.defaultSize, b.defaultSize) &&
707
+ equal(a.initialFilter, b.initialFilter) &&
708
+ equal(a.initialSort, b.initialSort) &&
700
709
  equal(a.textSearchEnabled, b.textSearchEnabled) &&
701
710
  equal(a.additionalFields, b.additionalFields) &&
711
+ equal(a.sideDialogWidth, b.sideDialogWidth) &&
702
712
  equal(a.forceFilter, b.forceFilter);
703
713
  }) as React.FunctionComponent<EntityCollectionViewProps<any>>
704
714
 
705
- export function useSelectionController<M extends Record<string, any> = any>(
706
- onSelectionChange?: (entity: Entity<M>, selected: boolean) => void
707
- ): SelectionController<M> {
708
-
709
- const [selectedEntities, setSelectedEntities] = useState<Entity<M>[]>([]);
710
-
711
- const toggleEntitySelection = useCallback((entity: Entity<M>) => {
712
- let newValue;
713
- if (selectedEntities.map(e => e.id).includes(entity.id)) {
714
- onSelectionChange?.(entity, false);
715
- newValue = selectedEntities.filter((item: Entity<M>) => item.id !== entity.id);
716
- } else {
717
- onSelectionChange?.(entity, true);
718
- newValue = [...selectedEntities, entity];
719
- }
720
- setSelectedEntities(newValue);
721
- }, [selectedEntities]);
722
-
723
- const isEntitySelected = useCallback((entity: Entity<M>) => selectedEntities.map(e => e.id).includes(entity.id), [selectedEntities]);
724
-
725
- return {
726
- selectedEntities,
727
- setSelectedEntities,
728
- isEntitySelected,
729
- toggleEntitySelection
730
- };
731
- }
732
-
733
715
  function EntitiesCount({
734
716
  fullPath,
735
717
  collection,
@@ -744,7 +726,7 @@ function EntitiesCount({
744
726
  onCountChange?: (count: number) => void,
745
727
  }) {
746
728
 
747
- const dataSource = useDataSource();
729
+ const dataSource = useDataSource(collection);
748
730
  const navigation = useNavigationController();
749
731
  const [count, setCount] = useState<number | undefined>(undefined);
750
732
  const [error, setError] = useState<Error | undefined>(undefined);
@@ -754,17 +736,19 @@ function EntitiesCount({
754
736
  const resolvedPath = useMemo(() => navigation.resolveAliasesFrom(fullPath), [fullPath, navigation.resolveAliasesFrom]);
755
737
 
756
738
  useEffect(() => {
757
- dataSource.countEntities({
758
- path: resolvedPath,
759
- collection,
760
- filter,
761
- orderBy: sortByProperty,
762
- order: currentSort
763
- }).then(setCount).catch(setError);
764
- }, [fullPath, dataSource, resolvedPath, collection, filter, sortByProperty, currentSort]);
739
+ if (dataSource.countEntities)
740
+ dataSource.countEntities({
741
+ path: resolvedPath,
742
+ collection,
743
+ filter,
744
+ orderBy: sortByProperty,
745
+ order: currentSort
746
+ }).then(setCount).catch(setError);
747
+ }, [fullPath, dataSource.countEntities, resolvedPath, collection, filter, sortByProperty, currentSort]);
765
748
 
766
749
  useEffect(() => {
767
750
  if (onCountChange) {
751
+ setError(undefined);
768
752
  onCountChange(count ?? 0);
769
753
  }
770
754
  }, [onCountChange, count]);
@@ -798,45 +782,74 @@ function EntityIdHeaderWidget({
798
782
  }) {
799
783
  const [openPopup, setOpenPopup] = React.useState(false);
800
784
  const [searchString, setSearchString] = React.useState("");
785
+ const [recentIds, setRecentIds] = React.useState<string[]>(getRecentIds(collection.id));
801
786
  const sideEntityController = useSideEntityController();
787
+
788
+
802
789
  return (
803
- <Tooltip title={!openPopup ? "Find by ID" : undefined}>
790
+ <Tooltip title={!openPopup ? "Find by ID" : undefined} asChild={false}>
804
791
  <Popover
805
792
  open={openPopup}
806
793
  onOpenChange={setOpenPopup}
794
+ sideOffset={0}
795
+ align={"start"}
796
+ alignOffset={-117}
807
797
  trigger={
808
798
  <IconButton size={"small"}>
809
799
  <SearchIcon size={"small"}/>
810
800
  </IconButton>
811
- }
812
- >
813
- <form noValidate={true}
814
- onSubmit={(e) => {
815
- e.preventDefault();
816
- if (!searchString) return;
817
- setOpenPopup(false);
818
- return sideEntityController.open({
819
- entityId: searchString,
820
- path,
821
- collection,
822
- updateUrl: true
823
- });
824
- }}
825
- className={"text-gray-900 dark:text-white w-96 max-w-full"}>
826
-
827
- <div className="flex p-4 w-full gap-4">
828
- <TextField
829
- placeholder={"Find entity by ID"}
830
- size={"small"}
831
- onChange={(e) => setSearchString(e.target.value)}
832
- value={searchString}
833
- className={"flex-grow"}/>
834
- <Button variant={"outlined"}
835
- disabled={!searchString}
836
- type={"submit"}
837
- >Go</Button>
838
- </div>
839
- </form>
801
+ }>
802
+ <div className={cls("my-2 rounded-lg bg-gray-50 dark:bg-gray-950 text-gray-900 dark:text-white")}>
803
+ <form noValidate={true}
804
+ onSubmit={(e) => {
805
+ e.preventDefault();
806
+ if (!searchString) return;
807
+ setOpenPopup(false);
808
+ setRecentIds(addRecentId(collection.id, searchString.trim()));
809
+ return sideEntityController.open({
810
+ entityId: searchString.trim(),
811
+ path,
812
+ collection,
813
+ updateUrl: true
814
+ });
815
+ }}
816
+ className={"w-96 max-w-full"}>
817
+
818
+ <div className="flex p-2 w-full gap-2">
819
+ <input
820
+ autoFocus={openPopup}
821
+ placeholder={"Find entity by ID"}
822
+ // size={"small"}
823
+ onChange={(e) => {
824
+ setSearchString(e.target.value);
825
+ }}
826
+ value={searchString}
827
+ className={"rounded-lg bg-white dark:bg-gray-800 flex-grow bg-transparent outline-none p-2 " + focusedDisabled}/>
828
+ <Button variant={"text"}
829
+ disabled={!(searchString.trim())}
830
+ type={"submit"}
831
+ ><KeyboardTabIcon/></Button>
832
+ </div>
833
+ </form>
834
+ {recentIds && recentIds.length > 0 && <div className="flex flex-col gap-2 p-2">
835
+ {recentIds.map(id => (
836
+ <ReferencePreview reference={new EntityReference(id, path)}
837
+ key={id}
838
+ hover={true}
839
+ onClick={() => {
840
+ setOpenPopup(false);
841
+ sideEntityController.open({
842
+ entityId: id,
843
+ path,
844
+ collection,
845
+ updateUrl: true
846
+ });
847
+ }}
848
+ includeEntityLink={false}
849
+ size={"small"}/>
850
+ ))}
851
+ </div>}
852
+ </div>
840
853
  </Popover>
841
854
 
842
855
  </Tooltip>