@rebasepro/admin 0.0.1-canary.eae7889 → 0.0.1-canary.eb08332

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 (716) hide show
  1. package/LICENSE +21 -6
  2. package/README.md +139 -0
  3. package/dist/CollectionEditorDialog-DKGlYDPc.js +3630 -0
  4. package/dist/CollectionEditorDialog-DKGlYDPc.js.map +1 -0
  5. package/dist/PropertyEditView-h0N-AMCY.js +3808 -0
  6. package/dist/PropertyEditView-h0N-AMCY.js.map +1 -0
  7. package/dist/RouterCollectionsStudioView-DdEStpFk.js +192 -0
  8. package/dist/RouterCollectionsStudioView-DdEStpFk.js.map +1 -0
  9. package/dist/collection_editor/ConfigControllerProvider.d.ts +2 -11
  10. package/dist/collection_editor/_cms_internals.d.ts +4 -4
  11. package/dist/collection_editor/api/generateCollectionApi.d.ts +10 -9
  12. package/dist/collection_editor/extensibility_types.d.ts +135 -0
  13. package/dist/collection_editor/index.d.ts +6 -1
  14. package/dist/collection_editor/pgColumnToProperty.d.ts +3 -3
  15. package/dist/collection_editor/serializable_types.d.ts +370 -0
  16. package/dist/collection_editor/serializable_utils.d.ts +50 -0
  17. package/dist/collection_editor/types/collection_editor_controller.d.ts +11 -10
  18. package/dist/collection_editor/types/collection_inference.d.ts +2 -2
  19. package/dist/collection_editor/types/config_controller.d.ts +21 -14
  20. package/dist/collection_editor/ui/AddKanbanColumnAction.d.ts +7 -5
  21. package/dist/collection_editor/ui/CollectionViewHeaderAction.d.ts +7 -5
  22. package/dist/collection_editor/ui/EditorCollectionAction.d.ts +1 -1
  23. package/dist/collection_editor/ui/EditorCollectionActionStart.d.ts +1 -1
  24. package/dist/collection_editor/ui/EditorEntityAction.d.ts +1 -1
  25. package/dist/collection_editor/ui/HomePageEditorCollectionAction.d.ts +1 -1
  26. package/dist/collection_editor/ui/KanbanSetupAction.d.ts +7 -5
  27. package/dist/collection_editor/ui/MissingReferenceWidget.d.ts +1 -1
  28. package/dist/collection_editor/ui/NewCollectionButton.d.ts +1 -1
  29. package/dist/collection_editor/ui/NewCollectionCard.d.ts +1 -1
  30. package/dist/collection_editor/ui/PropertyAddColumnComponent.d.ts +6 -5
  31. package/dist/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.d.ts +4 -4
  32. package/dist/collection_editor/ui/collection_editor/AIModifiedPathsContext.d.ts +1 -1
  33. package/dist/collection_editor/ui/collection_editor/CollectionDetailsForm.d.ts +7 -7
  34. package/dist/collection_editor/ui/collection_editor/CollectionEditorDialog.d.ts +10 -11
  35. package/dist/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.d.ts +4 -4
  36. package/dist/collection_editor/ui/collection_editor/CollectionJsonImportDialog.d.ts +4 -3
  37. package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +17 -7
  38. package/dist/collection_editor/ui/collection_editor/CollectionRLSTab.d.ts +2 -1
  39. package/dist/collection_editor/ui/collection_editor/CollectionRelationsTab.d.ts +2 -1
  40. package/dist/collection_editor/ui/collection_editor/CollectionStudioView.d.ts +14 -1
  41. package/dist/collection_editor/ui/collection_editor/CollectionYupValidation.d.ts +1 -9
  42. package/dist/collection_editor/ui/collection_editor/CollectionsStudioView.d.ts +25 -2
  43. package/dist/collection_editor/ui/collection_editor/DisplaySettingsForm.d.ts +4 -2
  44. package/dist/collection_editor/ui/collection_editor/EntityActionsEditTab.d.ts +4 -3
  45. package/dist/collection_editor/ui/collection_editor/EntityActionsSelectDialog.d.ts +2 -1
  46. package/dist/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.d.ts +2 -1
  47. package/dist/collection_editor/ui/collection_editor/EnumForm.d.ts +2 -1
  48. package/dist/collection_editor/ui/collection_editor/GeneralSettingsForm.d.ts +8 -4
  49. package/dist/collection_editor/ui/collection_editor/GetCodeDialog.d.ts +4 -3
  50. package/dist/collection_editor/ui/collection_editor/KanbanConfigSection.d.ts +2 -1
  51. package/dist/collection_editor/ui/collection_editor/LayoutModeSwitch.d.ts +3 -3
  52. package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +17 -5
  53. package/dist/collection_editor/ui/collection_editor/PropertyFieldPreview.d.ts +2 -2
  54. package/dist/collection_editor/ui/collection_editor/PropertyTree.d.ts +2 -2
  55. package/dist/collection_editor/ui/collection_editor/RouterCollectionStudioView.d.ts +15 -0
  56. package/dist/collection_editor/ui/collection_editor/RouterCollectionsStudioView.d.ts +14 -0
  57. package/dist/collection_editor/ui/collection_editor/SubcollectionsEditTab.d.ts +8 -6
  58. package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +3 -2
  59. package/dist/collection_editor/ui/collection_editor/ViewModeSwitch.d.ts +1 -1
  60. package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.d.ts +1 -1
  61. package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.d.ts +3 -2
  62. package/dist/collection_editor/ui/collection_editor/properties/BlockPropertyField.d.ts +2 -1
  63. package/dist/collection_editor/ui/collection_editor/properties/BooleanPropertyField.d.ts +2 -1
  64. package/dist/collection_editor/ui/collection_editor/properties/DateTimePropertyField.d.ts +2 -1
  65. package/dist/collection_editor/ui/collection_editor/properties/EnumPropertyField.d.ts +2 -1
  66. package/dist/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.d.ts +2 -1
  67. package/dist/collection_editor/ui/collection_editor/properties/MapPropertyField.d.ts +2 -1
  68. package/dist/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.d.ts +2 -1
  69. package/dist/collection_editor/ui/collection_editor/properties/NumberPropertyField.d.ts +2 -1
  70. package/dist/collection_editor/ui/collection_editor/properties/ReferencePropertyField.d.ts +3 -2
  71. package/dist/collection_editor/ui/collection_editor/properties/RelationPropertyField.d.ts +3 -8
  72. package/dist/collection_editor/ui/collection_editor/properties/RepeatPropertyField.d.ts +2 -1
  73. package/dist/collection_editor/ui/collection_editor/properties/StoragePropertyField.d.ts +2 -1
  74. package/dist/collection_editor/ui/collection_editor/properties/StringPropertyField.d.ts +2 -1
  75. package/dist/collection_editor/ui/collection_editor/properties/UrlPropertyField.d.ts +2 -1
  76. package/dist/collection_editor/ui/collection_editor/properties/VectorPropertyField.d.ts +4 -0
  77. package/dist/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.d.ts +2 -1
  78. package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.d.ts +2 -1
  79. package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.d.ts +1 -1
  80. package/dist/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.d.ts +2 -1
  81. package/dist/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.d.ts +2 -1
  82. package/dist/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.d.ts +2 -1
  83. package/dist/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.d.ts +2 -1
  84. package/dist/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.d.ts +2 -1
  85. package/dist/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.d.ts +1 -1
  86. package/dist/collection_editor/ui/collection_editor/templates/blog_template.d.ts +2 -2
  87. package/dist/collection_editor/ui/collection_editor/templates/pages_template.d.ts +2 -2
  88. package/dist/collection_editor/ui/collection_editor/templates/products_template.d.ts +2 -2
  89. package/dist/collection_editor/ui/collection_editor/templates/users_template.d.ts +2 -2
  90. package/dist/collection_editor/useJsonCollectionsConfigController.d.ts +37 -0
  91. package/dist/collection_editor/useLocalCollectionsConfigController.d.ts +2 -2
  92. package/dist/collection_editor/useSafeSnackbarController.d.ts +2 -0
  93. package/dist/collection_editor/validateCollectionJson.d.ts +2 -2
  94. package/dist/collection_editor_ui.d.ts +4 -0
  95. package/dist/collection_editor_ui.js +33 -11
  96. package/dist/collection_editor_ui.js.map +1 -1
  97. package/dist/components/ArrayContainer.d.ts +5 -5
  98. package/dist/components/ClearFilterSortButton.d.ts +1 -1
  99. package/dist/components/CollectionEditorDialogs.d.ts +2 -1
  100. package/dist/components/CollectionPanel.d.ts +58 -0
  101. package/dist/components/{EntityCollectionTable/EntityCollectionRowActions.d.ts → CollectionTableBinding/CollectionRowActions.d.ts} +5 -5
  102. package/dist/components/CollectionTableBinding/CollectionTableBinding.d.ts +28 -0
  103. package/dist/components/{EntityCollectionTable/EntityCollectionTableProps.d.ts → CollectionTableBinding/CollectionTableBindingProps.d.ts} +4 -4
  104. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.d.ts +2 -2
  105. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.d.ts +6 -6
  106. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.d.ts +6 -6
  107. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.d.ts +6 -6
  108. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.d.ts +3 -2
  109. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.d.ts +4 -4
  110. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.d.ts +1 -1
  111. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.d.ts +1 -1
  112. package/dist/components/CollectionTableBinding/index.d.ts +6 -0
  113. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.d.ts +5 -1
  114. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.d.ts +3 -3
  115. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.d.ts +1 -1
  116. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.d.ts +2 -2
  117. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.d.ts +7 -6
  118. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.d.ts +4 -3
  119. package/dist/components/CollectionViewBinding/BoardCardBinding.d.ts +31 -0
  120. package/dist/components/CollectionViewBinding/CollectionBoardViewBinding.d.ts +22 -0
  121. package/dist/components/{EntityCollectionView/EntityCollectionCardView.d.ts → CollectionViewBinding/CollectionCardViewBinding.d.ts} +5 -5
  122. package/dist/components/CollectionViewBinding/CollectionListViewBinding.d.ts +50 -0
  123. package/dist/components/CollectionViewBinding/CollectionViewActions.d.ts +20 -0
  124. package/dist/components/CollectionViewBinding/CollectionViewBinding.d.ts +41 -0
  125. package/dist/components/CollectionViewBinding/CollectionViewStartActions.d.ts +21 -0
  126. package/dist/components/CollectionViewBinding/EntityCardBinding.d.ts +21 -0
  127. package/dist/components/CollectionViewBinding/FilterPresetsButton.d.ts +22 -0
  128. package/dist/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.d.ts +3 -2
  129. package/dist/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.d.ts +6 -5
  130. package/dist/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.d.ts +2 -1
  131. package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.d.ts +3 -3
  132. package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.d.ts +7 -6
  133. package/dist/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.d.ts +2 -2
  134. package/dist/components/{EntityCollectionView/useEntityPreviewSlots.d.ts → CollectionViewBinding/usePreviewSlots.d.ts} +5 -5
  135. package/dist/components/DefaultAppBar.d.ts +18 -1
  136. package/dist/components/DefaultDrawer.d.ts +53 -5
  137. package/dist/components/DeleteEntityDialog.d.ts +6 -5
  138. package/dist/components/DetailViewBinding.d.ts +28 -0
  139. package/dist/components/DrawerNavigationGroup.d.ts +1 -1
  140. package/dist/components/DrawerNavigationItem.d.ts +1 -1
  141. package/dist/components/EditFormActions.d.ts +3 -0
  142. package/dist/components/EditViewBinding.d.ts +58 -0
  143. package/dist/components/{EntityPreview.d.ts → EntityPreviewBinding.d.ts} +14 -14
  144. package/dist/components/EntityViewBinding.d.ts +13 -0
  145. package/dist/components/FieldCaption.d.ts +1 -1
  146. package/dist/components/HomePage/ContentHomePage.d.ts +1 -1
  147. package/dist/components/HomePage/FavouritesView.d.ts +1 -1
  148. package/dist/components/HomePage/HomePageDnD.d.ts +7 -7
  149. package/dist/components/HomePage/NavigationCard.d.ts +1 -1
  150. package/dist/components/HomePage/NavigationCardBinding.d.ts +2 -1
  151. package/dist/components/HomePage/NavigationGroup.d.ts +2 -2
  152. package/dist/components/HomePage/RenameGroupDialog.d.ts +2 -1
  153. package/dist/components/HomePage/SmallNavigationCard.d.ts +1 -1
  154. package/dist/components/JsonPreviewBinding.d.ts +4 -0
  155. package/dist/components/PropertyCollectionView.d.ts +3 -2
  156. package/dist/components/PropertyIdCopyTooltip.d.ts +3 -3
  157. package/dist/components/{RebaseCMS.d.ts → RebaseAdmin.d.ts} +2 -2
  158. package/dist/components/RebaseAuthGate.d.ts +1 -1
  159. package/dist/components/RebaseLayout.d.ts +6 -5
  160. package/dist/components/RebaseNavigation.d.ts +2 -2
  161. package/dist/components/RebaseRouteDefs.d.ts +2 -2
  162. package/dist/components/RebaseShell.d.ts +2 -1
  163. package/dist/components/ReferenceTable/{EntitySelectionTable.d.ts → SelectionTableBinding.d.ts} +6 -6
  164. package/dist/components/ReferenceWidget.d.ts +3 -2
  165. package/dist/components/RelationSelector.d.ts +1 -1
  166. package/dist/components/SearchIconsView.d.ts +2 -1
  167. package/dist/components/SelectableTable/SelectableTable.d.ts +11 -11
  168. package/dist/components/SelectableTable/SelectableTableContext.d.ts +3 -3
  169. package/dist/components/SelectableTable/SelectionStore.d.ts +16 -22
  170. package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +9 -3
  171. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +10 -3
  172. package/dist/components/SelectableTable/filters/FilterFieldBinding.d.ts +40 -0
  173. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +10 -3
  174. package/dist/components/SelectableTable/filters/RelationFilterField.d.ts +8 -1
  175. package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +10 -3
  176. package/dist/components/SideDialogs.d.ts +2 -2
  177. package/dist/components/SidePanelBinding.d.ts +11 -0
  178. package/dist/components/{SideEntityProvider.d.ts → SidePanelProvider.d.ts} +8 -8
  179. package/dist/components/admin/CreationResultDialog.d.ts +6 -0
  180. package/dist/components/admin/index.d.ts +1 -3
  181. package/dist/components/app/AppBar.d.ts +1 -1
  182. package/dist/components/app/Drawer.d.ts +9 -2
  183. package/dist/components/common/default_entity_actions.d.ts +8 -1
  184. package/dist/components/field_configs.d.ts +1 -1
  185. package/dist/components/history/EntityHistoryEntry.d.ts +3 -3
  186. package/dist/components/history/EntityHistoryView.d.ts +1 -1
  187. package/dist/components/history/LastEditedByFormAction.d.ts +2 -1
  188. package/dist/components/history/LastEditedByIndicator.d.ts +4 -3
  189. package/dist/components/history/UserChip.d.ts +1 -1
  190. package/dist/components/index.d.ts +16 -13
  191. package/dist/contexts/SidePanelControllerContext.d.ts +3 -0
  192. package/dist/data_export/export/BasicExportAction.d.ts +2 -1
  193. package/dist/data_export/export/ExportCollectionAction.d.ts +4 -4
  194. package/dist/data_export/export/export.d.ts +3 -3
  195. package/dist/data_import/components/DataNewPropertiesMapping.d.ts +1 -1
  196. package/dist/data_import/components/ImportFileUpload.d.ts +1 -1
  197. package/dist/data_import/components/ImportNewPropertyFieldPreview.d.ts +2 -1
  198. package/dist/data_import/components/ImportSaveInProgress.d.ts +3 -3
  199. package/dist/data_import/import/ImportCollectionAction.d.ts +4 -3
  200. package/dist/data_import/utils/data.d.ts +1 -1
  201. package/dist/data_import/utils/file_headers.d.ts +6 -1
  202. package/dist/data_import/utils/file_to_json.d.ts +1 -11
  203. package/dist/data_import/utils/transforms.d.ts +11 -0
  204. package/dist/editor/components/SlashCommandMenu.d.ts +2 -1
  205. package/dist/editor/components/editor-bubble.d.ts +5 -1
  206. package/dist/editor/components/image-bubble.d.ts +5 -1
  207. package/dist/editor/components/index.d.ts +3 -3
  208. package/dist/editor/components/table-bubble.d.ts +5 -1
  209. package/dist/editor/editor.d.ts +4 -4
  210. package/dist/editor/nodeViews/ReactNodeView.d.ts +4 -1
  211. package/dist/editor/selectors/color-selector.d.ts +1 -1
  212. package/dist/editor/selectors/link-selector.d.ts +1 -1
  213. package/dist/editor/selectors/node-selector.d.ts +1 -1
  214. package/dist/editor/selectors/text-buttons.d.ts +1 -1
  215. package/dist/editor/useProseMirror.d.ts +2 -2
  216. package/dist/editor/utils/remove_classes.d.ts +1 -1
  217. package/dist/editor.js +2625 -3569
  218. package/dist/editor.js.map +1 -1
  219. package/dist/form/EntityForm.d.ts +11 -9
  220. package/dist/form/EntityFormActions.d.ts +2 -1
  221. package/dist/form/EntityFormBinding.d.ts +27 -0
  222. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  223. package/dist/form/components/FieldHelperText.d.ts +1 -1
  224. package/dist/form/components/FormEntry.d.ts +1 -1
  225. package/dist/form/components/FormLayout.d.ts +1 -1
  226. package/dist/form/components/LabelWithIconAndTooltip.d.ts +1 -1
  227. package/dist/form/components/LocalChangesMenu.d.ts +3 -2
  228. package/dist/form/components/StorageItemPreview.d.ts +2 -1
  229. package/dist/form/components/StorageUploadProgress.d.ts +10 -4
  230. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +2 -1
  231. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +2 -1
  232. package/dist/form/field_bindings/BlockFieldBinding.d.ts +2 -1
  233. package/dist/form/field_bindings/DateTimeFieldBinding.d.ts +2 -1
  234. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +2 -1
  235. package/dist/form/field_bindings/MapFieldBinding.d.ts +2 -1
  236. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +4 -3
  237. package/dist/form/field_bindings/MultiSelectFieldBinding.d.ts +2 -1
  238. package/dist/form/field_bindings/MultipleRelationFieldBinding.d.ts +2 -1
  239. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +2 -1
  240. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -1
  241. package/dist/form/field_bindings/RelationFieldBinding.d.ts +2 -1
  242. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +2 -1
  243. package/dist/form/field_bindings/SelectFieldBinding.d.ts +2 -1
  244. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +5 -4
  245. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +2 -1
  246. package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -1
  247. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +2 -1
  248. package/dist/form/field_bindings/VectorFieldBinding.d.ts +12 -0
  249. package/dist/form/form_utils.d.ts +8 -0
  250. package/dist/form/index.d.ts +6 -2
  251. package/dist/form/validation.d.ts +3 -3
  252. package/dist/history-C0FdqGNz.js +311 -0
  253. package/dist/history-C0FdqGNz.js.map +1 -0
  254. package/dist/hooks/index.d.ts +4 -4
  255. package/dist/hooks/navigation/contexts/CollectionRegistryContext.d.ts +2 -2
  256. package/dist/hooks/navigation/useAsyncResolver.d.ts +26 -0
  257. package/dist/hooks/navigation/useBuildCollectionRegistryController.d.ts +2 -0
  258. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +6 -8
  259. package/dist/hooks/navigation/useNavigationResolution.d.ts +6 -7
  260. package/dist/hooks/navigation/useResolvedCollections.d.ts +11 -7
  261. package/dist/hooks/navigation/useResolvedViews.d.ts +2 -5
  262. package/dist/hooks/navigation/useTopLevelNavigation.d.ts +3 -3
  263. package/dist/hooks/navigation/utils.d.ts +5 -5
  264. package/dist/hooks/useBreadcrumbsController.d.ts +2 -32
  265. package/dist/hooks/useBuildSidePanel.d.ts +6 -0
  266. package/dist/hooks/useCMSContext.d.ts +2 -2
  267. package/dist/hooks/{useEntityHistory.d.ts → useHistory.d.ts} +2 -2
  268. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  269. package/dist/hooks/{useEntitySelectionDialog.d.ts → useSelectionDialog.d.ts} +2 -2
  270. package/dist/hooks/useSideDialogsController.d.ts +1 -1
  271. package/dist/hooks/useSidePanel.d.ts +11 -0
  272. package/dist/index.d.ts +6 -3
  273. package/dist/index.js +2 -799
  274. package/dist/markdown-CklalUUk.js +526 -0
  275. package/dist/markdown-CklalUUk.js.map +1 -0
  276. package/dist/preview/components/ArrayEnumPreview.d.ts +2 -1
  277. package/dist/preview/components/EmptyValue.d.ts +2 -1
  278. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  279. package/dist/preview/components/ImagePreview.d.ts +2 -1
  280. package/dist/preview/components/ReferencePreview.d.ts +2 -1
  281. package/dist/preview/components/RelationPreview.d.ts +2 -1
  282. package/dist/preview/components/StorageThumbnail.d.ts +3 -1
  283. package/dist/preview/components/UrlComponentPreview.d.ts +1 -0
  284. package/dist/preview/components/UserPreview.d.ts +6 -3
  285. package/dist/preview/property_previews/ArrayOfMapsPreview.d.ts +2 -1
  286. package/dist/preview/property_previews/ArrayOfReferencesPreview.d.ts +1 -1
  287. package/dist/preview/property_previews/ArrayOfRelationsPreview.d.ts +1 -1
  288. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +2 -1
  289. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +2 -1
  290. package/dist/preview/property_previews/ArrayOneOfPreview.d.ts +2 -1
  291. package/dist/preview/property_previews/ArrayPropertyEnumPreview.d.ts +1 -1
  292. package/dist/preview/property_previews/ArrayPropertyPreview.d.ts +2 -1
  293. package/dist/preview/property_previews/MapPropertyPreview.d.ts +3 -2
  294. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +5 -4
  295. package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
  296. package/dist/routes/CustomViewRoute.d.ts +2 -1
  297. package/dist/routes/RebaseRoute.d.ts +1 -1
  298. package/dist/src-DLAFyeZI.js +24222 -0
  299. package/dist/src-DLAFyeZI.js.map +1 -0
  300. package/dist/types/components/EntityFormActionsProps.d.ts +4 -4
  301. package/dist/types/components/EntityFormProps.d.ts +65 -5
  302. package/dist/types/components/PropertyPreviewProps.d.ts +6 -1
  303. package/dist/types/components/formex.d.ts +1 -40
  304. package/dist/types/fields.d.ts +23 -12
  305. package/dist/util/dataControllerAdapter.d.ts +27 -0
  306. package/dist/util/navigation_utils.d.ts +16 -6
  307. package/dist/util/previews.d.ts +8 -3
  308. package/dist/util/propertyConfigMapper.d.ts +17 -0
  309. package/dist/util/property_utils.d.ts +3 -3
  310. package/dist/util/resolutions.d.ts +1 -2
  311. package/dist/util/view_constants.d.ts +6 -0
  312. package/package.json +56 -55
  313. package/src/collection_editor/ConfigControllerProvider.tsx +37 -53
  314. package/src/collection_editor/_cms_internals.ts +4 -4
  315. package/src/collection_editor/api/generateCollectionApi.ts +10 -9
  316. package/src/collection_editor/extensibility_types.ts +168 -0
  317. package/src/collection_editor/index.ts +47 -3
  318. package/src/collection_editor/pgColumnToProperty.ts +23 -6
  319. package/src/collection_editor/serializable_types.ts +474 -0
  320. package/src/collection_editor/serializable_utils.ts +576 -0
  321. package/src/collection_editor/types/collection_editor_controller.tsx +8 -11
  322. package/src/collection_editor/types/collection_inference.ts +2 -2
  323. package/src/collection_editor/types/config_controller.tsx +14 -14
  324. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +21 -9
  325. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +8 -8
  326. package/src/collection_editor/ui/EditorCollectionAction.tsx +9 -14
  327. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +13 -18
  328. package/src/collection_editor/ui/EditorEntityAction.tsx +9 -14
  329. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +13 -19
  330. package/src/collection_editor/ui/KanbanSetupAction.tsx +8 -6
  331. package/src/collection_editor/ui/MissingReferenceWidget.tsx +5 -3
  332. package/src/collection_editor/ui/NewCollectionButton.tsx +4 -4
  333. package/src/collection_editor/ui/NewCollectionCard.tsx +8 -13
  334. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +11 -16
  335. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +20 -12
  336. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +29 -59
  337. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +213 -135
  338. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +21 -7
  339. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +29 -23
  340. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +142 -112
  341. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +49 -12
  342. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +29 -10
  343. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +26 -23
  344. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +104 -37
  345. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +26 -14
  346. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +21 -8
  347. package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +1 -1
  348. package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +1 -1
  349. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +20 -5
  350. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +45 -12
  351. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +10 -12
  352. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +5 -6
  353. package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +17 -5
  354. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +190 -27
  355. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +58 -49
  356. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +17 -4
  357. package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +44 -0
  358. package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +41 -0
  359. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +27 -13
  360. package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +1 -1
  361. package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +9 -2
  362. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +4 -4
  363. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +4 -4
  364. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +5 -6
  365. package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +1 -1
  366. package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +5 -5
  367. package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +10 -10
  368. package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +10 -9
  369. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +7 -8
  370. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +17 -10
  371. package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +7 -7
  372. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +19 -53
  373. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +43 -60
  374. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +3 -3
  375. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +56 -13
  376. package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +7 -7
  377. package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +4 -3
  378. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +34 -0
  379. package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +5 -6
  380. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +18 -9
  381. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +1 -2
  382. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +17 -5
  383. package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +1 -1
  384. package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +4 -4
  385. package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +3 -3
  386. package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +6 -9
  387. package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +6 -6
  388. package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +1 -2
  389. package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +3 -3
  390. package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +3 -3
  391. package/src/collection_editor/ui/collection_editor/templates/products_template.ts +4 -4
  392. package/src/collection_editor/ui/collection_editor/templates/users_template.ts +2 -2
  393. package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -1
  394. package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +7 -29
  395. package/src/collection_editor/useJsonCollectionsConfigController.tsx +286 -0
  396. package/src/collection_editor/useLocalCollectionsConfigController.tsx +11 -8
  397. package/src/collection_editor/useSafeSnackbarController.ts +9 -0
  398. package/src/collection_editor/validateCollectionJson.ts +111 -24
  399. package/src/collection_editor_ui.ts +6 -0
  400. package/src/components/AdminModeSyncer.tsx +2 -2
  401. package/src/components/ArrayContainer.tsx +28 -24
  402. package/src/components/ClearFilterSortButton.tsx +2 -3
  403. package/src/components/CollectionEditorDialogs.tsx +1 -1
  404. package/src/components/CollectionPanel.tsx +178 -0
  405. package/src/components/{EntityCollectionTable/EntityCollectionRowActions.tsx → CollectionTableBinding/CollectionRowActions.tsx} +26 -16
  406. package/src/components/{EntityCollectionTable/EntityCollectionTable.tsx → CollectionTableBinding/CollectionTableBinding.tsx} +34 -31
  407. package/src/components/{EntityCollectionTable/EntityCollectionTableProps.tsx → CollectionTableBinding/CollectionTableBindingProps.tsx} +4 -4
  408. package/src/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.tsx +14 -12
  409. package/src/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.tsx +4 -4
  410. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.tsx +13 -13
  411. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.tsx +39 -19
  412. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.tsx +14 -14
  413. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.tsx +3 -3
  414. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.tsx +29 -27
  415. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.tsx +0 -1
  416. package/src/components/CollectionTableBinding/index.tsx +14 -0
  417. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.tsx +22 -28
  418. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.tsx +8 -9
  419. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.tsx +2 -3
  420. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.tsx +7 -7
  421. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.tsx +12 -13
  422. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.tsx +5 -2
  423. package/src/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.tsx +101 -104
  424. package/src/components/{EntityCollectionView/EntityBoardCard.tsx → CollectionViewBinding/BoardCardBinding.tsx} +39 -40
  425. package/src/components/{EntityCollectionView/EntityCollectionBoardView.tsx → CollectionViewBinding/CollectionBoardViewBinding.tsx} +88 -52
  426. package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +157 -0
  427. package/src/components/{EntityCollectionView/EntityCollectionListView.tsx → CollectionViewBinding/CollectionListViewBinding.tsx} +234 -151
  428. package/src/components/{EntityCollectionView/EntityCollectionViewActions.tsx → CollectionViewBinding/CollectionViewActions.tsx} +36 -26
  429. package/src/components/{EntityCollectionView/EntityCollectionView.tsx → CollectionViewBinding/CollectionViewBinding.tsx} +392 -213
  430. package/src/components/{EntityCollectionView/EntityCollectionViewStartActions.tsx → CollectionViewBinding/CollectionViewStartActions.tsx} +42 -23
  431. package/src/components/{EntityCollectionView/EntityCard.tsx → CollectionViewBinding/EntityCardBinding.tsx} +14 -14
  432. package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +294 -0
  433. package/src/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.tsx +37 -79
  434. package/src/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.tsx +97 -30
  435. package/src/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.tsx +20 -8
  436. package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.ts +9 -8
  437. package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.ts +17 -16
  438. package/src/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.tsx +118 -70
  439. package/src/components/{EntityCollectionView/useEntityPreviewSlots.ts → CollectionViewBinding/usePreviewSlots.ts} +136 -48
  440. package/src/components/DefaultAppBar.tsx +73 -41
  441. package/src/components/DefaultDrawer.tsx +317 -85
  442. package/src/components/DeleteEntityDialog.tsx +7 -7
  443. package/src/components/DetailViewBinding.tsx +670 -0
  444. package/src/components/DrawerNavigationGroup.tsx +11 -11
  445. package/src/components/DrawerNavigationItem.tsx +6 -6
  446. package/src/components/{EntityEditViewFormActions.tsx → EditFormActions.tsx} +78 -59
  447. package/src/components/EditViewBinding.tsx +761 -0
  448. package/src/components/{EntityPreview.tsx → EntityPreviewBinding.tsx} +53 -39
  449. package/src/components/{EntityView.tsx → EntityViewBinding.tsx} +8 -9
  450. package/src/components/HomePage/ContentHomePage.tsx +35 -17
  451. package/src/components/HomePage/FavouritesView.tsx +2 -3
  452. package/src/components/HomePage/HomePageDnD.tsx +3 -2
  453. package/src/components/HomePage/NavigationCard.tsx +9 -16
  454. package/src/components/HomePage/NavigationCardBinding.tsx +6 -7
  455. package/src/components/HomePage/NavigationGroup.tsx +4 -5
  456. package/src/components/HomePage/RenameGroupDialog.tsx +1 -1
  457. package/src/components/HomePage/SmallNavigationCard.tsx +0 -5
  458. package/src/components/{EntityJsonPreview.tsx → JsonPreviewBinding.tsx} +2 -2
  459. package/src/components/PropertyCollectionView.tsx +2 -1
  460. package/src/components/PropertyIdCopyTooltip.tsx +2 -3
  461. package/src/components/{RebaseCMS.tsx → RebaseAdmin.tsx} +8 -6
  462. package/src/components/RebaseAuthGate.tsx +5 -3
  463. package/src/components/RebaseLayout.tsx +10 -9
  464. package/src/components/RebaseNavigation.tsx +107 -31
  465. package/src/components/RebaseRouteDefs.tsx +10 -13
  466. package/src/components/RebaseShell.tsx +18 -14
  467. package/src/components/ReferenceTable/{EntitySelectionTable.tsx → SelectionTableBinding.tsx} +40 -33
  468. package/src/components/ReferenceWidget.tsx +7 -7
  469. package/src/components/RelationSelector.tsx +82 -24
  470. package/src/components/SearchIconsView.tsx +13 -12
  471. package/src/components/SelectableTable/SelectableTable.tsx +68 -115
  472. package/src/components/SelectableTable/SelectableTableContext.tsx +4 -3
  473. package/src/components/SelectableTable/SelectionStore.ts +20 -44
  474. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +13 -5
  475. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +37 -16
  476. package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +187 -0
  477. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +27 -13
  478. package/src/components/SelectableTable/filters/RelationFilterField.tsx +17 -3
  479. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +95 -35
  480. package/src/components/SideDialogs.tsx +58 -40
  481. package/src/components/SidePanelBinding.tsx +261 -0
  482. package/src/components/{SideEntityProvider.tsx → SidePanelProvider.tsx} +17 -16
  483. package/src/components/UserSelector.tsx +123 -9
  484. package/src/components/admin/CreationResultDialog.tsx +138 -0
  485. package/src/components/admin/index.ts +1 -3
  486. package/src/components/app/Drawer.tsx +9 -1
  487. package/src/components/app/Scaffold.tsx +16 -9
  488. package/src/components/common/default_entity_actions.tsx +270 -29
  489. package/src/components/field_configs.tsx +68 -46
  490. package/src/components/history/EntityHistoryEntry.tsx +4 -5
  491. package/src/components/history/EntityHistoryView.tsx +18 -8
  492. package/src/components/history/LastEditedByIndicator.tsx +4 -4
  493. package/src/components/index.ts +20 -17
  494. package/src/contexts/BreacrumbsContext.tsx +15 -6
  495. package/src/contexts/SidePanelControllerContext.tsx +5 -0
  496. package/src/data_export/export/BasicExportAction.tsx +42 -43
  497. package/src/data_export/export/ExportCollectionAction.tsx +55 -54
  498. package/src/data_export/export/export.ts +17 -17
  499. package/src/data_import/components/DataNewPropertiesMapping.tsx +17 -4
  500. package/src/data_import/components/ImportFileUpload.tsx +2 -3
  501. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +2 -3
  502. package/src/data_import/components/ImportSaveInProgress.tsx +4 -4
  503. package/src/data_import/import/ImportCollectionAction.tsx +26 -13
  504. package/src/data_import/utils/data.ts +26 -8
  505. package/src/data_import/utils/file_headers.ts +13 -89
  506. package/src/data_import/utils/file_to_json.ts +43 -68
  507. package/src/data_import/utils/get_properties_mapping.ts +1 -1
  508. package/src/data_import/utils/transforms.ts +47 -0
  509. package/src/editor/components/SlashCommandMenu.tsx +17 -2
  510. package/src/editor/components/editor-bubble-item.tsx +1 -1
  511. package/src/editor/components/editor-bubble.tsx +32 -9
  512. package/src/editor/components/image-bubble.tsx +28 -12
  513. package/src/editor/components/index.ts +3 -3
  514. package/src/editor/components/table-bubble.tsx +80 -18
  515. package/src/editor/editor.tsx +34 -15
  516. package/src/editor/extensions/HighlightDecorationExtension.ts +3 -2
  517. package/src/editor/extensions/Image/index.ts +3 -3
  518. package/src/editor/extensions/Image.ts +3 -3
  519. package/src/editor/extensions/clipboard.ts +2 -2
  520. package/src/editor/markdown-it-plugins.d.ts +24 -0
  521. package/src/editor/markdown.ts +2 -3
  522. package/src/editor/nodeViews/ReactNodeView.tsx +1 -1
  523. package/src/editor/nodeViews/TaskItemComponent.tsx +9 -8
  524. package/src/editor/schema.ts +135 -59
  525. package/src/editor/selectors/ai-selector.tsx +0 -1
  526. package/src/editor/selectors/color-selector.tsx +1 -2
  527. package/src/editor/selectors/link-selector.tsx +9 -7
  528. package/src/editor/selectors/node-selector.tsx +17 -3
  529. package/src/editor/selectors/text-buttons.tsx +1 -2
  530. package/src/editor/useProseMirror.ts +2 -2
  531. package/src/editor/utils/prosemirror-utils.ts +1 -1
  532. package/src/editor/utils/remove_classes.ts +6 -5
  533. package/src/form/EntityForm.tsx +222 -442
  534. package/src/form/EntityFormActions.tsx +49 -55
  535. package/src/form/EntityFormBinding.tsx +323 -0
  536. package/src/form/PropertyFieldBinding.tsx +81 -84
  537. package/src/form/components/ErrorFocus.tsx +1 -1
  538. package/src/form/components/FieldHelperText.tsx +6 -7
  539. package/src/form/components/FormLayout.tsx +1 -1
  540. package/src/form/components/LocalChangesMenu.tsx +20 -5
  541. package/src/form/components/StorageItemPreview.tsx +2 -3
  542. package/src/form/components/StorageUploadProgress.tsx +14 -7
  543. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +5 -5
  544. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +12 -13
  545. package/src/form/field_bindings/BlockFieldBinding.tsx +59 -58
  546. package/src/form/field_bindings/DateTimeFieldBinding.tsx +2 -2
  547. package/src/form/field_bindings/KeyValueFieldBinding.tsx +319 -303
  548. package/src/form/field_bindings/MapFieldBinding.tsx +14 -56
  549. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +28 -10
  550. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +3 -4
  551. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +11 -12
  552. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +9 -2
  553. package/src/form/field_bindings/ReferenceFieldBinding.tsx +17 -15
  554. package/src/form/field_bindings/RelationFieldBinding.tsx +157 -156
  555. package/src/form/field_bindings/RepeatFieldBinding.tsx +8 -8
  556. package/src/form/field_bindings/SelectFieldBinding.tsx +3 -4
  557. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +107 -103
  558. package/src/form/field_bindings/SwitchFieldBinding.tsx +17 -17
  559. package/src/form/field_bindings/TextFieldBinding.tsx +90 -78
  560. package/src/form/field_bindings/UserSelectFieldBinding.tsx +18 -18
  561. package/src/form/field_bindings/VectorFieldBinding.tsx +202 -0
  562. package/src/form/form_utils.ts +163 -0
  563. package/src/form/index.tsx +15 -6
  564. package/src/form/useClearRestoreValue.tsx +1 -1
  565. package/src/form/validation.ts +104 -50
  566. package/src/hooks/index.ts +4 -4
  567. package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +5 -4
  568. package/src/hooks/navigation/contexts/NavigationStateContext.tsx +2 -2
  569. package/src/hooks/navigation/contexts/UrlContext.tsx +1 -2
  570. package/src/hooks/navigation/useAsyncResolver.ts +100 -0
  571. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +40 -21
  572. package/src/hooks/navigation/useBuildNavigationStateController.tsx +21 -22
  573. package/src/hooks/navigation/useNavigationResolution.ts +193 -21
  574. package/src/hooks/navigation/useResolvedCollections.ts +45 -77
  575. package/src/hooks/navigation/useResolvedViews.tsx +44 -123
  576. package/src/hooks/navigation/useTopLevelNavigation.ts +22 -18
  577. package/src/hooks/navigation/utils.ts +12 -9
  578. package/src/hooks/useBreadcrumbsController.tsx +2 -34
  579. package/src/hooks/{useBuildSideEntityController.tsx → useBuildSidePanel.tsx} +63 -24
  580. package/src/hooks/useCMSContext.tsx +7 -7
  581. package/src/hooks/{useEntityHistory.ts → useHistory.ts} +9 -4
  582. package/src/hooks/useResolvedNavigationFrom.tsx +8 -5
  583. package/src/hooks/{useEntitySelectionDialog.tsx → useSelectionDialog.tsx} +7 -7
  584. package/src/hooks/useSideDialogsController.tsx +1 -1
  585. package/src/hooks/useSidePanel.tsx +13 -0
  586. package/src/index.ts +34 -20
  587. package/src/preview/PropertyPreview.tsx +34 -41
  588. package/src/preview/components/DatePreview.tsx +1 -1
  589. package/src/preview/components/EnumValuesChip.tsx +1 -1
  590. package/src/preview/components/ImagePreview.tsx +4 -3
  591. package/src/preview/components/ReferencePreview.tsx +69 -18
  592. package/src/preview/components/RelationPreview.tsx +107 -18
  593. package/src/preview/components/StorageThumbnail.tsx +28 -8
  594. package/src/preview/components/UrlComponentPreview.tsx +12 -4
  595. package/src/preview/components/UserPreview.tsx +6 -15
  596. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +5 -5
  597. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -5
  598. package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +4 -4
  599. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +4 -4
  600. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +3 -2
  601. package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -9
  602. package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +1 -1
  603. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -4
  604. package/src/preview/property_previews/MapPropertyPreview.tsx +4 -3
  605. package/src/preview/property_previews/NumberPropertyPreview.tsx +5 -3
  606. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +24 -25
  607. package/src/preview/property_previews/StringPropertyPreview.tsx +13 -11
  608. package/src/routes/CustomViewRoute.tsx +14 -6
  609. package/src/routes/RebaseRoute.tsx +112 -36
  610. package/src/types/components/EntityFormActionsProps.tsx +4 -4
  611. package/src/types/components/EntityFormProps.tsx +75 -5
  612. package/src/types/components/PropertyPreviewProps.tsx +6 -1
  613. package/src/types/components/formex.tsx +1 -45
  614. package/src/types/fields.tsx +26 -15
  615. package/src/util/dataControllerAdapter.ts +87 -0
  616. package/src/util/navigation_utils.ts +43 -13
  617. package/src/util/previews.ts +149 -13
  618. package/src/util/propertyConfigMapper.ts +134 -0
  619. package/src/util/property_utils.tsx +24 -9
  620. package/src/util/resolutions.ts +4 -8
  621. package/src/util/view_constants.ts +6 -0
  622. package/dist/CollectionEditorDialog-B2M9lCyL.js +0 -4720
  623. package/dist/CollectionEditorDialog-B2M9lCyL.js.map +0 -1
  624. package/dist/CollectionsStudioView-WG6soyfs.js +0 -218
  625. package/dist/CollectionsStudioView-WG6soyfs.js.map +0 -1
  626. package/dist/ContentHomePage-CDF_a6Lp.js +0 -1786
  627. package/dist/ContentHomePage-CDF_a6Lp.js.map +0 -1
  628. package/dist/ExportCollectionAction-Dc0VOWMN.js +0 -439
  629. package/dist/ExportCollectionAction-Dc0VOWMN.js.map +0 -1
  630. package/dist/ImportCollectionAction-DpCagAOy.js +0 -686
  631. package/dist/ImportCollectionAction-DpCagAOy.js.map +0 -1
  632. package/dist/PropertyEditView-DS67DxoT.js +0 -8138
  633. package/dist/PropertyEditView-DS67DxoT.js.map +0 -1
  634. package/dist/RoleChip-QtUFXeTp.js +0 -67
  635. package/dist/RoleChip-QtUFXeTp.js.map +0 -1
  636. package/dist/RolesView-CIuYBimF.js +0 -424
  637. package/dist/RolesView-CIuYBimF.js.map +0 -1
  638. package/dist/UsersView-B5zelXnH.js +0 -493
  639. package/dist/UsersView-B5zelXnH.js.map +0 -1
  640. package/dist/collection_editor/types/config_permissions.d.ts +0 -19
  641. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +0 -27
  642. package/dist/components/EntityCollectionTable/fields/VirtualTableDateField.d.ts +0 -12
  643. package/dist/components/EntityCollectionTable/fields/VirtualTableInput.d.ts +0 -9
  644. package/dist/components/EntityCollectionTable/fields/VirtualTableNumberInput.d.ts +0 -8
  645. package/dist/components/EntityCollectionTable/fields/VirtualTableSwitch.d.ts +0 -7
  646. package/dist/components/EntityCollectionTable/index.d.ts +0 -6
  647. package/dist/components/EntityCollectionView/Board.d.ts +0 -2
  648. package/dist/components/EntityCollectionView/BoardColumn.d.ts +0 -42
  649. package/dist/components/EntityCollectionView/BoardColumnTitle.d.ts +0 -9
  650. package/dist/components/EntityCollectionView/BoardSortableList.d.ts +0 -14
  651. package/dist/components/EntityCollectionView/EntityBoardCard.d.ts +0 -31
  652. package/dist/components/EntityCollectionView/EntityCard.d.ts +0 -20
  653. package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +0 -21
  654. package/dist/components/EntityCollectionView/EntityCollectionListView.d.ts +0 -34
  655. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +0 -64
  656. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +0 -18
  657. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +0 -18
  658. package/dist/components/EntityCollectionView/board_types.d.ts +0 -105
  659. package/dist/components/EntityEditView.d.ts +0 -49
  660. package/dist/components/EntityEditViewFormActions.d.ts +0 -2
  661. package/dist/components/EntityJsonPreview.d.ts +0 -3
  662. package/dist/components/EntitySidePanel.d.ts +0 -10
  663. package/dist/components/EntityView.d.ts +0 -12
  664. package/dist/components/admin/RoleChip.d.ts +0 -4
  665. package/dist/components/admin/RolesView.d.ts +0 -4
  666. package/dist/components/admin/UsersView.d.ts +0 -4
  667. package/dist/contexts/SideEntityControllerContext.d.ts +0 -3
  668. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +0 -10
  669. package/dist/hooks/navigation/useNavigationRegistry.d.ts +0 -11
  670. package/dist/hooks/navigation/useNavigationURLs.d.ts +0 -11
  671. package/dist/hooks/useBuildSideEntityController.d.ts +0 -6
  672. package/dist/hooks/useSideEntityController.d.ts +0 -11
  673. package/dist/index-CBhrgpR7.js +0 -12
  674. package/dist/index-CBhrgpR7.js.map +0 -1
  675. package/dist/index-CHxgwt6E.js +0 -456
  676. package/dist/index-CHxgwt6E.js.map +0 -1
  677. package/dist/index-Dey5WJpO.js +0 -8
  678. package/dist/index-Dey5WJpO.js.map +0 -1
  679. package/dist/index.js.map +0 -1
  680. package/dist/markdown-z2Ir7Cgo.js +0 -618
  681. package/dist/markdown-z2Ir7Cgo.js.map +0 -1
  682. package/dist/useEntityHistory-Dcj4zhGj.js +0 -121
  683. package/dist/useEntityHistory-Dcj4zhGj.js.map +0 -1
  684. package/dist/util-BQ82ySL3.js +0 -27720
  685. package/dist/util-BQ82ySL3.js.map +0 -1
  686. package/src/collection_editor/types/config_permissions.ts +0 -20
  687. package/src/components/EntityCollectionTable/fields/VirtualTableDateField.tsx +0 -39
  688. package/src/components/EntityCollectionTable/fields/VirtualTableInput.tsx +0 -90
  689. package/src/components/EntityCollectionTable/fields/VirtualTableNumberInput.tsx +0 -80
  690. package/src/components/EntityCollectionTable/fields/VirtualTableSwitch.tsx +0 -32
  691. package/src/components/EntityCollectionTable/index.tsx +0 -14
  692. package/src/components/EntityCollectionView/Board.tsx +0 -474
  693. package/src/components/EntityCollectionView/BoardColumn.tsx +0 -158
  694. package/src/components/EntityCollectionView/BoardColumnTitle.tsx +0 -45
  695. package/src/components/EntityCollectionView/BoardSortableList.tsx +0 -177
  696. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +0 -267
  697. package/src/components/EntityCollectionView/board_types.ts +0 -113
  698. package/src/components/EntityEditView.tsx +0 -632
  699. package/src/components/EntitySidePanel.tsx +0 -160
  700. package/src/components/admin/RoleChip.tsx +0 -23
  701. package/src/components/admin/RolesView.tsx +0 -419
  702. package/src/components/admin/UsersView.tsx +0 -782
  703. package/src/contexts/SideEntityControllerContext.tsx +0 -5
  704. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +0 -141
  705. package/src/hooks/navigation/useNavigationRegistry.ts +0 -153
  706. package/src/hooks/navigation/useNavigationURLs.ts +0 -56
  707. package/src/hooks/useSideEntityController.tsx +0 -13
  708. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.d.ts +0 -0
  709. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.d.ts +0 -0
  710. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.d.ts +0 -0
  711. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.d.ts +0 -0
  712. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/utils.d.ts +0 -0
  713. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.tsx +0 -0
  714. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.tsx +0 -0
  715. /package/src/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.tsx +0 -0
  716. /package/src/components/{EntityCollectionView → CollectionViewBinding}/utils.ts +0 -0
@@ -1,18 +1,20 @@
1
-
2
- import type { AdditionalFieldDelegate, EntityCollection } from "@rebasepro/types";
3
- import type { EntityAction, Property } from "@rebasepro/types";
1
+ import type { AdditionalFieldDelegate, EntityAction, CollectionConfig, Property } from "@rebasepro/types";
2
+ import {
3
+ CollectionSize,
4
+ Entity,
5
+ EntityReference,
6
+ EntityTableController,
7
+ FilterValues,
8
+ getCollectionDataPath,
9
+ PartialCollectionConfig,
10
+ ViewMode
11
+ } from "@rebasepro/types";
4
12
  import React, { useCallback, useEffect, useMemo, useState } from "react";
13
+ import { useSearchParams } from "react-router-dom";
5
14
 
6
15
  import { deepEqual as equal } from "fast-equals"
7
-
8
- const EMPTY_ARRAY: any[] = [];
9
-
10
- import { CollectionSize, Entity, EntityReference, EntityTableController, FilterValues, PartialEntityCollection, SaveEntityProps, ViewMode } from "@rebasepro/types";
11
- import {
12
- EntityCollectionRowActions,
13
- EntityCollectionTable
14
- } from "../EntityCollectionTable";
15
- import { CollectionTableToolbar } from "../EntityCollectionTable/internal/CollectionTableToolbar";
16
+ import { CollectionRowActions, CollectionTableBinding } from "../CollectionTableBinding";
17
+ import { CollectionTableToolbar } from "../CollectionTableBinding/internal/CollectionTableToolbar";
16
18
  import { getSubcollections } from "@rebasepro/common";
17
19
  import { useCollectionInlineEditor } from "./hooks/useCollectionInlineEditor";
18
20
  import { navigateToEntity } from "../../util/navigation_utils";
@@ -21,62 +23,79 @@ import { resolveEntityAction } from "../../util/resolutions";
21
23
  import { getPropertyInPath } from "../../util/property_utils";
22
24
  import { ReferencePreview } from "../../preview";
23
25
  import {
24
- saveEntityWithCallbacks,
26
+ CollectionScopeProvider,
27
+ OnColumnResizeParams,
28
+ useAnalyticsController,
25
29
  useAuthController,
30
+ useColumnIds,
31
+ useComponentOverride,
26
32
  useCustomizationController,
27
33
  useData,
28
34
  useDataTableController,
29
35
  useLargeLayout,
30
36
  usePermissions,
37
+ useScrollRestoration,
38
+ useSlot,
31
39
  useTranslation,
32
- useSlot
33
- } from "@rebasepro/core";
34
- import { useUserConfigurationPersistence } from "@rebasepro/core";
35
- import { EntityCollectionViewActions } from "./EntityCollectionViewActions";
36
- import { EntityCollectionCardView } from "./EntityCollectionCardView";
37
- import { EntityCollectionListView } from "./EntityCollectionListView";
40
+ useUserConfigurationPersistence
41
+ } from "@rebasepro/app";
42
+ import { CollectionViewActions } from "./CollectionViewActions";
43
+ import { CollectionCardViewBinding } from "./CollectionCardViewBinding";
44
+ import { CollectionListViewBinding } from "./CollectionListViewBinding";
38
45
  import { SplitListView } from "./SplitListView";
39
- import { EntityCollectionBoardView } from "./EntityCollectionBoardView";
40
- import { ViewModeToggle, KanbanPropertyOption } from "./ViewModeToggle";
41
- import { Button, cls, focusedDisabled, IconButton, Markdown, Popover, Skeleton, Tooltip, Typography, VirtualTableColumn , iconSize } from "@rebasepro/ui";
42
- import { PlusIcon, ArrowRightToLineIcon, SearchIcon } from "lucide-react";
43
- import { setIn } from "@rebasepro/formex";
44
- import { getSubcollectionColumnId } from "../EntityCollectionTable/internal/common";
46
+ import { CollectionBoardViewBinding } from "./CollectionBoardViewBinding";
47
+ import { KanbanPropertyOption, ViewModeToggle } from "./ViewModeToggle";
45
48
  import {
46
- copyEntityAction,
47
- deleteEntityAction,
48
- editEntityAction
49
- } from "../common/default_entity_actions";
50
- import { OnCellValueChange, OnColumnResizeParams, UniqueFieldValidator } from "@rebasepro/core";
51
- import { useColumnIds } from "@rebasepro/core";
52
- import { PopupFormField } from "../EntityCollectionTable/internal/popup_field/PopupFormField";
53
- import { GetPropertyForProps } from "../EntityCollectionTable/EntityCollectionTableProps";
49
+ ArrowRightToLineIcon,
50
+ Button,
51
+ cls,
52
+ ErrorBoundary,
53
+ focusedDisabled,
54
+ IconButton,
55
+ iconSize,
56
+ PlusIcon,
57
+ Popover,
58
+ SearchIcon,
59
+ TextField,
60
+ Tooltip,
61
+ Typography,
62
+ VirtualTableColumn
63
+ } from "@rebasepro/ui";
64
+ import { getSubcollectionColumnId } from "../CollectionTableBinding/internal/common";
65
+ import { copyEntityAction, deleteEntityAction, editEntityAction } from "../common/default_entity_actions";
66
+ import { PopupFormField } from "../CollectionTableBinding/internal/popup_field/PopupFormField";
67
+ import { GetPropertyForProps } from "../CollectionTableBinding/CollectionTableBindingProps";
54
68
  import { DeleteEntityDialog } from "../DeleteEntityDialog";
55
- import { useAnalyticsController } from "@rebasepro/core";
56
69
  import { useSelectionController } from "./useSelectionController";
57
- import { EntityCollectionViewStartActions } from "./EntityCollectionViewStartActions";
70
+ import { CollectionViewStartActions } from "./CollectionViewStartActions";
58
71
  import { addRecentId, getRecentIds } from "./utils";
59
- import { useScrollRestoration } from "@rebasepro/core";
60
- import { ErrorBoundary } from "@rebasepro/ui";
61
72
  import { mergeDeep } from "@rebasepro/utils";
62
- import { useCollectionRegistryController, useUrlController, useSideEntityController, useCMSContext } from "../../index";
63
- import { useBreadcrumbsController } from "../../index";
73
+ import {
74
+ useBreadcrumbsController,
75
+ useCMSContext,
76
+ useCollectionRegistryController,
77
+ useSidePanel,
78
+ useUrlController
79
+ } from "../../index";
64
80
 
65
- const DEFAULT_ENTITY_OPEN_MODE: "side_panel" | "full_screen" | "split" = "split";
81
+ const EMPTY_ARRAY: never[] = [];
82
+ const DEFAULT_ENTITY_OPEN_MODE = "split";
66
83
 
67
84
  function getOpenEntityMode(
68
85
  viewMode: ViewMode,
69
- configuredMode?: "side_panel" | "full_screen" | "split"
70
- ): "side_panel" | "full_screen" | "split" {
86
+ configuredMode?: "side_panel" | "full_screen" | "split" | "dialog"
87
+ ): "side_panel" | "full_screen" | "split" | "dialog" {
71
88
  if (configuredMode) return configuredMode;
72
89
  if (viewMode === "kanban") return "side_panel";
73
- return DEFAULT_ENTITY_OPEN_MODE;
90
+ if (viewMode === "table" || viewMode === "cards") return "full_screen";
91
+ // "list" view defaults to split
92
+ return "split";
74
93
  }
75
94
 
76
95
  /**
77
96
  * @group Components
78
97
  */
79
- export type EntityCollectionViewProps<M extends Record<string, unknown>> = {
98
+ export type CollectionViewBindingProps<M extends Record<string, unknown>> = {
80
99
  /**
81
100
  * Complete path where this collection is located.
82
101
  * It defaults to the collection path if not provided.
@@ -89,7 +108,7 @@ export type EntityCollectionViewProps<M extends Record<string, unknown>> = {
89
108
  /**
90
109
  * If this is a subcollection, specify the parent collection ids.
91
110
  */
92
- parentCollectionIds?: string[];
111
+ parentCollectionSlugs?: string[], parentEntityIds?: string[];
93
112
  /**
94
113
  * Whether this is a subcollection or not.
95
114
  */
@@ -114,23 +133,23 @@ export type EntityCollectionViewProps<M extends Record<string, unknown>> = {
114
133
  */
115
134
  selectedTab?: string;
116
135
 
117
- } & EntityCollection<M>;
136
+ } & CollectionConfig<M>;
118
137
 
119
138
  /**
120
- * This component is in charge of binding a driver path with an {@link EntityCollection}
139
+ * This component is in charge of binding a driver path with an {@link CollectionConfig}
121
140
  * where it's configuration is defined. It includes an infinite scrolling table
122
141
  * and a 'Add' new entities button,
123
142
  *
124
143
  * This component is the default one used for displaying entity collections
125
144
  * and is in charge of generating all the specific actions and customization
126
- * of the lower level {@link EntityCollectionTable}
145
+ * of the lower level {@link CollectionTableBinding}
127
146
  *
128
147
  * Please **note** that you only need to use this component if you are building
129
148
  * a custom view. If you just need to create a default view you can do it
130
149
  * exclusively with config options.
131
150
  *
132
151
  * If you need a lower level implementation with more granular options, you
133
- * can use {@link EntityCollectionTable}.
152
+ * can use {@link CollectionTableBinding}.
134
153
  *
135
154
  * If you need a generic table that is not bound to the driver or entities and
136
155
  * properties at all, you can check {@link VirtualTable}
@@ -140,18 +159,18 @@ export type EntityCollectionViewProps<M extends Record<string, unknown>> = {
140
159
 
141
160
  * @group Components
142
161
  */
143
- export const EntityCollectionView = React.memo(
144
- function EntityCollectionView<M extends Record<string, unknown>>({
162
+ const CollectionViewBindingInner = React.memo(
163
+ function CollectionViewBindingInner<M extends Record<string, unknown>>({
145
164
  path: pathProp,
146
165
 
147
- parentCollectionIds,
166
+ parentCollectionSlugs, parentEntityIds,
148
167
  isSubCollection,
149
168
  className,
150
169
  updateUrl,
151
170
  selectedEntityId: selectedEntityIdProp,
152
171
  selectedTab: selectedTabProp,
153
172
  ...collectionProp
154
- }: EntityCollectionViewProps<M>
173
+ }: CollectionViewBindingProps<M>
155
174
  ) {
156
175
 
157
176
  const { t } = useTranslation();
@@ -159,9 +178,9 @@ export const EntityCollectionView = React.memo(
159
178
  const collectionRegistry = useCollectionRegistryController();
160
179
  const urlController = useUrlController();
161
180
  const breadcrumbs = useBreadcrumbsController();
162
- const path = pathProp ?? collectionProp.slug;
181
+ const path = pathProp ?? getCollectionDataPath(collectionProp);
163
182
  const dataClient = useData();
164
- const sideEntityController = useSideEntityController();
183
+ const sidePanelController = useSidePanel();
165
184
  const authController = useAuthController();
166
185
  const userConfigPersistence = useUserConfigurationPersistence();
167
186
  const analyticsController = useAnalyticsController();
@@ -173,9 +192,10 @@ export const EntityCollectionView = React.memo(
173
192
  const scrollRestoration = useScrollRestoration();
174
193
 
175
194
  const collection = useMemo(() => {
195
+ const registryCollection = collectionRegistry.getCollection(path) || collectionProp;
176
196
  const userOverride = userConfigPersistence?.getCollectionConfig<M>(path);
177
- return (userOverride ? mergeDeep(collectionProp, userOverride) : collectionProp) as EntityCollection<M>;
178
- }, [collectionProp, path, userConfigPersistence?.getCollectionConfig]);
197
+ return (userOverride ? mergeDeep(registryCollection, userOverride) : registryCollection) as CollectionConfig<M>;
198
+ }, [collectionProp, path, userConfigPersistence, collectionRegistry]);
179
199
 
180
200
  const collectionRef = React.useRef(collection);
181
201
  useEffect(() => {
@@ -210,7 +230,7 @@ export const EntityCollectionView = React.memo(
210
230
  }, 2400);
211
231
  }, [highlightedEntity]);
212
232
 
213
- const checkInlineEditing = useCallback((entity?: Entity<any>): boolean => {
233
+ const checkInlineEditing = useCallback((entity?: Entity<M>): boolean => {
214
234
  const collection = collectionRef.current;
215
235
  if (!canEdit(collection, path, entity ?? null)) {
216
236
  return false;
@@ -225,16 +245,16 @@ export const EntityCollectionView = React.memo(
225
245
 
226
246
  // View mode priority: URL > saved user config > collection.defaultViewMode
227
247
  const defaultViewMode = collection.defaultViewMode ?? "list";
248
+ const [searchParams, setSearchParams] = useSearchParams();
228
249
 
229
- // Parse view from URL
230
- const getViewFromUrl = useCallback((): ViewMode | null => {
231
- const params = new URLSearchParams(window.location.search);
232
- const urlView = params.get("__view");
233
- if (urlView && ["list", "table", "kanban", "cards"].includes(urlView)) {
234
- return urlView as ViewMode;
250
+ // Read view from React Router's searchParams (reactive on back/forward)
251
+ const urlView = useMemo((): ViewMode | null => {
252
+ const v = searchParams.get("__view");
253
+ if (v && ["list", "table", "kanban", "cards"].includes(v)) {
254
+ return v as ViewMode;
235
255
  }
236
256
  return null;
237
- }, []);
257
+ }, [searchParams]);
238
258
 
239
259
  // Get saved view from local persistence
240
260
  const getSavedView = useCallback((): ViewMode | null => {
@@ -244,7 +264,6 @@ export const EntityCollectionView = React.memo(
244
264
 
245
265
  const [viewMode, setViewModeState] = useState<ViewMode>(() => {
246
266
  // Priority: URL > saved config > collection default
247
- const urlView = getViewFromUrl();
248
267
  if (urlView) return urlView;
249
268
  const savedView = getSavedView();
250
269
  if (savedView) return savedView;
@@ -255,12 +274,13 @@ export const EntityCollectionView = React.memo(
255
274
 
256
275
  // Sync URL with current view on init (if view came from saved config)
257
276
  useEffect(() => {
258
- const urlView = getViewFromUrl();
259
277
  if (!urlView && viewMode !== defaultViewMode) {
260
278
  // View came from saved config but URL doesn't have it - update URL without push
261
- const url = new URL(window.location.href);
262
- url.searchParams.set("__view", viewMode);
263
- window.history.replaceState({}, "", url.toString());
279
+ setSearchParams((prev) => {
280
+ const next = new URLSearchParams(prev);
281
+ next.set("__view", viewMode);
282
+ return next;
283
+ }, { replace: true });
264
284
  }
265
285
  }, []); // Only on mount
266
286
 
@@ -268,33 +288,27 @@ export const EntityCollectionView = React.memo(
268
288
  const setViewMode = useCallback((newMode: ViewMode) => {
269
289
  setViewModeState(newMode);
270
290
 
271
- // Update URL with __view param
272
- const url = new URL(window.location.href);
273
- if (newMode === defaultViewMode) {
274
- url.searchParams.delete("__view");
275
- } else {
276
- url.searchParams.set("__view", newMode);
277
- }
278
- window.history.pushState({}, "", url.toString());
279
- }, [defaultViewMode]);
280
-
281
- // Listen for browser back/forward
282
- useEffect(() => {
283
- const handlePopState = () => {
284
- const urlView = getViewFromUrl();
285
- if (urlView) {
286
- // URL has explicit view - use it
287
- setViewModeState(urlView);
291
+ // Update URL with __view param via React Router
292
+ setSearchParams((prev) => {
293
+ const next = new URLSearchParams(prev);
294
+ if (newMode === defaultViewMode) {
295
+ next.delete("__view");
288
296
  } else {
289
- // No URL param - fallback to saved config or collection default
290
- const savedView = getSavedView();
291
- setViewModeState(savedView ?? defaultViewMode);
297
+ next.set("__view", newMode);
292
298
  }
293
- };
299
+ return next;
300
+ });
301
+ }, [defaultViewMode, setSearchParams]);
294
302
 
295
- window.addEventListener("popstate", handlePopState);
296
- return () => window.removeEventListener("popstate", handlePopState);
297
- }, [getViewFromUrl, getSavedView, defaultViewMode]);
303
+ // Sync viewMode state when URL changes via back/forward navigation
304
+ useEffect(() => {
305
+ if (urlView) {
306
+ setViewModeState(urlView);
307
+ } else {
308
+ const savedView = getSavedView();
309
+ setViewModeState(savedView ?? defaultViewMode);
310
+ }
311
+ }, [urlView, getSavedView, defaultViewMode]);
298
312
 
299
313
  // List view size state - controls row height and info density
300
314
  const [listSize, setListSize] = useState<CollectionSize>(collection.defaultSize ?? "m");
@@ -347,13 +361,14 @@ export const EntityCollectionView = React.memo(
347
361
  navigateToEntity({
348
362
  navigation: urlController,
349
363
  path: entityPath,
350
- sideEntityController,
364
+ sidePanelController,
351
365
  openEntityMode,
352
366
  collection,
353
- entityId: clickedEntity.id
367
+ entityId: clickedEntity.id,
368
+ replace: openEntityMode === "split" && selectedEntityIdProp !== undefined
354
369
  });
355
370
 
356
- }, [unselectNavigatedEntity, sideEntityController]);
371
+ }, [sidePanelController, openEntityMode, selectedEntityIdProp, path, urlController, analyticsController]);
357
372
 
358
373
  const onNewClick = useCallback(() => {
359
374
  const collection = collectionRef.current;
@@ -365,11 +380,28 @@ export const EntityCollectionView = React.memo(
365
380
  collection,
366
381
  entityId: undefined,
367
382
  path: path,
368
- sideEntityController,
383
+ sidePanelController,
369
384
  navigation: urlController,
370
385
  onClose: unselectNavigatedEntity
371
386
  })
372
- }, [path, sideEntityController]);
387
+ }, [path, sidePanelController]);
388
+
389
+ const openNewDocument = useCallback((defaultValues?: Record<string, unknown>) => {
390
+ const collection = collectionRef.current;
391
+ analyticsController.onAnalyticsEvent?.("new_entity_click", {
392
+ path: path
393
+ });
394
+ navigateToEntity({
395
+ openEntityMode,
396
+ collection,
397
+ entityId: undefined,
398
+ defaultValues,
399
+ path: path,
400
+ sidePanelController,
401
+ navigation: urlController,
402
+ onClose: unselectNavigatedEntity
403
+ });
404
+ }, [path, sidePanelController, openEntityMode, urlController, unselectNavigatedEntity]);
373
405
 
374
406
  const onMultipleDeleteClick = () => {
375
407
  analyticsController.onAnalyticsEvent?.("multiple_delete_dialog_open", {
@@ -399,14 +431,16 @@ export const EntityCollectionView = React.memo(
399
431
 
400
432
  const pluginAddColumnComponents = useSlot("collection.add-column", {
401
433
  path,
402
- parentCollectionIds: parentCollectionIds ?? EMPTY_ARRAY,
434
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
435
+ parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
403
436
  collection,
404
437
  tableController
405
438
  });
406
439
 
407
440
  const pluginToolbarWidgets = useSlot("collection.toolbar", {
408
441
  path,
409
- parentCollectionIds: parentCollectionIds ?? EMPTY_ARRAY,
442
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
443
+ parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
410
444
  collection: collection,
411
445
  tableController: tableController,
412
446
  selectionController: usedSelectionController
@@ -414,7 +448,8 @@ export const EntityCollectionView = React.memo(
414
448
 
415
449
  const pluginEmptyStates = useSlot("collection.empty-state", {
416
450
  path,
417
- parentCollectionIds: parentCollectionIds ?? EMPTY_ARRAY,
451
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
452
+ parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
418
453
  collection,
419
454
  canCreate: canCreateEntities,
420
455
  onNewClick
@@ -422,11 +457,12 @@ export const EntityCollectionView = React.memo(
422
457
 
423
458
  const pluginInsights = useSlot("collection.insights", {
424
459
  path,
425
- parentCollectionIds: parentCollectionIds ?? EMPTY_ARRAY,
460
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
461
+ parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
426
462
  collection
427
463
  });
428
464
 
429
- const onCollectionModifiedForUser = useCallback((path: string, partialCollection: PartialEntityCollection<M>) => {
465
+ const onCollectionModifiedForUser = useCallback((path: string, partialCollection: PartialCollectionConfig<M>) => {
430
466
  if (userConfigPersistence) {
431
467
  const currentStoredConfig = userConfigPersistence.getCollectionConfig(path);
432
468
  const updatedConfig = mergeDeep(currentStoredConfig, partialCollection);
@@ -442,7 +478,7 @@ export const EntityCollectionView = React.memo(
442
478
  const collection = collectionRef.current;
443
479
  // Only for property columns
444
480
  if (!getPropertyInPath(collection.properties, key)) return;
445
- const localCollection = buildPropertyWidthOverwrite(key, width) as PartialEntityCollection<M>;
481
+ const localCollection = buildPropertyWidthOverwrite(key, width) as PartialCollectionConfig<M>;
446
482
  onCollectionModifiedForUser(path, localCollection);
447
483
  }, [onCollectionModifiedForUser, path]);
448
484
 
@@ -468,7 +504,7 @@ export const EntityCollectionView = React.memo(
468
504
  setViewMode(mode);
469
505
  // Save to local persistence for next visit
470
506
  if (userConfigPersistence) {
471
- onCollectionModifiedForUser(path, { defaultViewMode: mode } as PartialEntityCollection<M>);
507
+ onCollectionModifiedForUser(path, { defaultViewMode: mode } as PartialCollectionConfig<M>);
472
508
  }
473
509
  }, [setViewMode, userConfigPersistence, onCollectionModifiedForUser, path, analyticsController, viewMode]);
474
510
 
@@ -562,7 +598,7 @@ export const EntityCollectionView = React.memo(
562
598
  setSelectedKanbanProperty(property);
563
599
  // Save to local persistence
564
600
  if (userConfigPersistence) {
565
- onCollectionModifiedForUser(path, { kanbanColumnProperty: property } as PartialEntityCollection<M>);
601
+ onCollectionModifiedForUser(path, { kanbanColumnProperty: property } as PartialCollectionConfig<M>);
566
602
  }
567
603
  }, [userConfigPersistence, onCollectionModifiedForUser, path, analyticsController]);
568
604
 
@@ -599,7 +635,7 @@ export const EntityCollectionView = React.memo(
599
635
  const additionalFields = useMemo(() => {
600
636
  // v4: use getSubcollections helper to access subcollections
601
637
  const subcollectionsList = getSubcollections(collection);
602
- const subcollectionColumns: AdditionalFieldDelegate<M, any>[] = subcollectionsList.map((subcollection: EntityCollection) => {
638
+ const subcollectionColumns: AdditionalFieldDelegate<M, any>[] = subcollectionsList.map((subcollection: CollectionConfig) => {
603
639
  return {
604
640
  key: getSubcollectionColumnId(subcollection),
605
641
  name: subcollection.name,
@@ -618,7 +654,7 @@ export const EntityCollectionView = React.memo(
618
654
  selectedTab: subcollection.slug,
619
655
  path: path,
620
656
  navigation: urlController,
621
- sideEntityController
657
+ sidePanelController
622
658
  })
623
659
  }}>
624
660
  {subcollection.name}
@@ -631,7 +667,7 @@ export const EntityCollectionView = React.memo(
631
667
  ...(collection.additionalFields ?? EMPTY_ARRAY),
632
668
  ...subcollectionColumns
633
669
  ];
634
- }, [collection, path, sideEntityController]);
670
+ }, [collection, path, sidePanelController]);
635
671
 
636
672
  const updateLastDeleteTimestamp = useCallback(() => {
637
673
  setLastDeleteTimestamp(Date.now());
@@ -651,10 +687,14 @@ export const EntityCollectionView = React.memo(
651
687
  customEntityActions?: EntityAction[]
652
688
  }): EntityAction[] => {
653
689
  const deleteEnabled = entity ? canDelete(collection, path, entity) : true;
654
- const actions: EntityAction[] = [editEntityAction];
655
- if (createEnabled)
690
+ const disableActions = collection.disableDefaultActions ?? [];
691
+ const actions: EntityAction[] = [];
692
+ if (!disableActions.includes("edit")) {
693
+ actions.push(editEntityAction);
694
+ }
695
+ if (createEnabled && !disableActions.includes("copy"))
656
696
  actions.push(copyEntityAction);
657
- if (deleteEnabled)
697
+ if (deleteEnabled && !disableActions.includes("delete"))
658
698
  actions.push(deleteEntityAction);
659
699
  if (customEntityActions)
660
700
  return mergeEntityActions(actions, customEntityActions);
@@ -692,7 +732,7 @@ export const EntityCollectionView = React.memo(
692
732
  });
693
733
 
694
734
  return (
695
- <EntityCollectionRowActions
735
+ <CollectionRowActions
696
736
  entity={entity}
697
737
  width={width}
698
738
  frozen={frozen}
@@ -714,9 +754,11 @@ export const EntityCollectionView = React.memo(
714
754
  }, [updateLastDeleteTimestamp, usedSelectionController]);
715
755
 
716
756
  // Update breadcrumb count when count changes
757
+ const updateCountRef = React.useRef(breadcrumbs.updateCount);
758
+ updateCountRef.current = breadcrumbs.updateCount;
717
759
  useEffect(() => {
718
- breadcrumbs.updateCount(path, docsCount);
719
- }, [docsCount, path, breadcrumbs.updateCount]);
760
+ updateCountRef.current(path, docsCount);
761
+ }, [docsCount, path]);
720
762
 
721
763
  // EntitiesCount fetches count and updates breadcrumb - no visual rendering needed here
722
764
  const countFetcher = <EntitiesCount
@@ -749,16 +791,17 @@ export const EntityCollectionView = React.memo(
749
791
  propertyKey,
750
792
  onHover,
751
793
  path,
752
- collection: collection as unknown as EntityCollection,
753
- tableController: tableController as unknown as EntityTableController,
754
- parentCollectionIds: parentCollectionIds ?? EMPTY_ARRAY
794
+ collection: collection as CollectionConfig,
795
+ tableController: tableController as EntityTableController,
796
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
797
+ parentEntityIds: parentEntityIds ?? EMPTY_ARRAY
755
798
  };
756
799
  return <>{headerActionContributions.map((s, i) => (
757
800
  <ErrorBoundary key={`header_action_${propertyKey}_${i}`}>
758
801
  <s.Component {...headerSlotProps} {...(s.props ?? {})}/>
759
802
  </ErrorBoundary>
760
803
  ))}</>;
761
- }, [headerActionContributions, path, parentCollectionIds]);
804
+ }, [headerActionContributions, path, parentCollectionSlugs]);
762
805
 
763
806
  const addColumnComponentInternal = pluginAddColumnComponents.length > 0
764
807
  ? function () {
@@ -794,13 +837,19 @@ export const EntityCollectionView = React.memo(
794
837
  .forEach(plugin => {
795
838
  plugin.hooks!.onColumnsReorder!({
796
839
  fullPath: path,
797
- parentCollectionIds: parentCollectionIds ?? EMPTY_ARRAY,
840
+ parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
841
+ parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
798
842
  collection,
799
843
  newPropertiesOrder
800
844
  });
801
845
  });
802
846
  }
803
- }, [collection, setLocalPropertiesOrder, customizationController, path, parentCollectionIds]);
847
+
848
+ // Save to user configuration persistence (local storage)
849
+ if (userConfigPersistence) {
850
+ onCollectionModifiedForUser(path, { propertiesOrder: newPropertiesOrder } as PartialCollectionConfig<M>);
851
+ }
852
+ }, [collection, setLocalPropertiesOrder, customizationController, path, parentCollectionSlugs, parentEntityIds, userConfigPersistence, onCollectionModifiedForUser]);
804
853
 
805
854
  // Popover open state managed at parent level to prevent closing when view changes
806
855
  const [viewModePopoverOpen, setViewModePopoverOpen] = useState(false);
@@ -825,71 +874,73 @@ export const EntityCollectionView = React.memo(
825
874
  const pluginErrorViews = useSlot("collection.error", {
826
875
  path,
827
876
  collection,
828
- parentCollectionIds,
877
+ parentCollectionSlugs,
878
+ parentEntityIds,
829
879
  error: tableController.dataLoadingError as Error
830
880
  });
831
881
  const pluginErrorView = tableController.dataLoadingError && pluginErrorViews.length > 0
832
882
  ? pluginErrorViews[0]
833
883
  : null;
834
884
 
835
- // Shared empty state — plugin slot takes priority, then default
836
- const isFilteredOrSorted = tableController.filterValues !== undefined || tableController.sortBy !== undefined;
885
+ // Shared empty state — plugin slot takes priority, then override, then default
886
+ const isSearching = !!tableController.searchString;
887
+ const isFilteredOrSorted = tableController.filterValues !== undefined || tableController.sortBy !== undefined || isSearching;
888
+ const ResolvedEmptyState = useComponentOverride("Collection.EmptyState", DefaultCollectionEmptyState);
889
+ const ResolvedCollectionActions = useComponentOverride("Collection.Actions", CollectionViewActions);
890
+ const ResolvedCollectionTable = useComponentOverride("Collection.Table", CollectionTableBinding) as typeof CollectionTableBinding;
837
891
  const emptyComponent = pluginEmptyStates.length > 0
838
892
  ? <>{pluginEmptyStates}</>
839
- : canCreateEntities && !isFilteredOrSorted
840
- ? <div className="flex flex-col items-center justify-center">
841
- <Typography variant={"subtitle2"}>{t("so_empty")}</Typography>
842
- <Button
843
- onClick={onNewClick}
844
- className="mt-4"
845
- >
846
- <PlusIcon/>
847
- {t("create_your_first_entry")}
848
- </Button>
849
- </div>
850
- : <Typography variant={"label"}>{t("no_results_filter_sort")}</Typography>;
893
+ : <ResolvedEmptyState
894
+ canCreate={canCreateEntities && !isFilteredOrSorted}
895
+ onNewClick={onNewClick}
896
+ isSearching={isSearching}
897
+ searchString={tableController.searchString ?? ""}
898
+ />;
851
899
 
852
900
  const toolbarNode = (
853
901
  <CollectionTableToolbar
854
902
  compact={isCompact}
855
903
  loading={tableController.dataLoading}
856
904
  onTextSearch={tableController.setSearchString}
905
+ initialSearchText={tableController.searchString}
857
906
  viewModeToggle={viewModeToggleElement}
858
- actionsStart={<EntityCollectionViewStartActions
859
- parentCollectionIds={parentCollectionIds ?? EMPTY_ARRAY}
907
+ actionsStart={<CollectionViewStartActions
908
+ parentCollectionSlugs={parentCollectionSlugs ?? EMPTY_ARRAY} parentEntityIds={parentEntityIds ?? EMPTY_ARRAY}
860
909
  collection={collection}
861
910
  tableController={tableController}
862
911
  path={path}
863
- relativePath={collection.slug}
912
+ relativePath={getCollectionDataPath(collection)}
864
913
  selectionController={usedSelectionController}
865
914
  collectionEntitiesCount={docsCount ?? undefined}
866
915
  resolvedProperties={resolvedCollection.properties}
916
+ openNewDocument={openNewDocument}
867
917
  compact={isCompact}/>}
868
918
  actions={
869
- <EntityCollectionViewActions
870
- parentCollectionIds={parentCollectionIds ?? EMPTY_ARRAY}
919
+ <ResolvedCollectionActions
920
+ parentCollectionSlugs={parentCollectionSlugs ?? EMPTY_ARRAY} parentEntityIds={parentEntityIds ?? EMPTY_ARRAY}
871
921
  collection={collection}
872
922
  tableController={tableController}
873
923
  onMultipleDeleteClick={onMultipleDeleteClick}
874
924
  onNewClick={onNewClick}
925
+ openNewDocument={openNewDocument}
875
926
  path={path}
876
- relativePath={collection.slug}
927
+ relativePath={getCollectionDataPath(collection)}
877
928
  selectionController={usedSelectionController}
878
929
  selectionEnabled={activeSelectionEnabled}
879
930
  collectionEntitiesCount={docsCount ?? undefined}
880
931
  compact={isCompact}
881
932
  >
882
933
  {pluginToolbarWidgets}
883
- </EntityCollectionViewActions>
934
+ </ResolvedCollectionActions>
884
935
  }
885
936
  />
886
937
  ); const innerView = viewMode === "kanban" ? (
887
- <EntityCollectionBoardView
938
+ <CollectionBoardViewBinding
888
939
  key={`kanban-view-${path}-${selectedKanbanProperty}`}
889
940
  collection={collection}
890
941
  tableController={tableController}
891
942
  fullPath={path}
892
- parentCollectionIds={parentCollectionIds}
943
+ parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}
893
944
  columnProperty={selectedKanbanProperty}
894
945
  onEntityClick={onEntityClick}
895
946
  selectionController={usedSelectionController}
@@ -899,7 +950,7 @@ export const EntityCollectionView = React.memo(
899
950
  emptyComponent={emptyComponent}
900
951
  />
901
952
  ) : viewMode === "cards" ? (
902
- <EntityCollectionCardView
953
+ <CollectionCardViewBinding
903
954
  key={`cards-view-${path}`}
904
955
  collection={collection}
905
956
  tableController={tableController}
@@ -913,7 +964,7 @@ export const EntityCollectionView = React.memo(
913
964
  emptyComponent={emptyComponent}
914
965
  />
915
966
  ) : viewMode === "list" ? (
916
- <EntityCollectionListView
967
+ <CollectionListViewBinding
917
968
  key={`list-view-${path}`}
918
969
  collection={collection}
919
970
  tableController={tableController}
@@ -923,9 +974,12 @@ export const EntityCollectionView = React.memo(
923
974
  highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
924
975
  size={listSize}
925
976
  emptyComponent={emptyComponent}
977
+ getActionsForEntity={getActionsForEntity}
978
+ path={path}
979
+ openEntityMode={openEntityMode}
926
980
  />
927
981
  ) : (
928
- <EntityCollectionTable
982
+ <ResolvedCollectionTable
929
983
  key={`collection_table_${path}`}
930
984
  hideToolbar={true}
931
985
  additionalFields={additionalFields}
@@ -960,12 +1014,20 @@ export const EntityCollectionView = React.memo(
960
1014
  />
961
1015
  );
962
1016
 
963
- return (
1017
+ const mainContent = (
964
1018
  <div className={cls("overflow-hidden h-full w-full rounded-md flex flex-col dark:bg-surface-800", className)}
965
1019
  ref={containerRef}>
966
1020
 
967
1021
  {countFetcher}
968
1022
 
1023
+ {tableController.dataLoadingError && tableController.data.length > 0 && (
1024
+ <div className="flex items-center gap-4 px-4 py-2 bg-red-50 dark:bg-red-900/20 border-b border-red-200 dark:border-red-800 flex-shrink-0">
1025
+ <Typography variant="body2" className="text-red-700 dark:text-red-300 flex-1">
1026
+ <strong>Warning:</strong> {tableController.dataLoadingError.message || "Failed to update data."}
1027
+ </Typography>
1028
+ </div>
1029
+ )}
1030
+
969
1031
 
970
1032
  {/* When isSplitLayout, SplitListView is ALWAYS mounted — regardless
971
1033
  of viewMode. The toolbar + current view live in the left panel;
@@ -987,7 +1049,7 @@ export const EntityCollectionView = React.memo(
987
1049
  size={listSize}
988
1050
  emptyComponent={emptyComponent}
989
1051
  path={path}
990
- parentCollectionIds={parentCollectionIds}
1052
+ parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}
991
1053
  selectedEntityId={selectedEntityIdProp}
992
1054
  selectedTab={selectedTabProp}
993
1055
  toolbar={toolbarNode}
@@ -1000,7 +1062,7 @@ export const EntityCollectionView = React.memo(
1000
1062
  className={cls(
1001
1063
  "flex flex-col w-full",
1002
1064
  selectedEntityIdProp === undefined
1003
- ? "max-w-6xl mx-auto px-3 md:px-4 lg-px-6 py-4"
1065
+ ? "max-w-6xl mx-auto px-3 md:px-4 lg:px-6 py-4"
1004
1066
  : ""
1005
1067
  )}
1006
1068
  >
@@ -1020,11 +1082,20 @@ export const EntityCollectionView = React.memo(
1020
1082
  </div>
1021
1083
  </div>
1022
1084
  {pluginInsights.length > 0 && (
1023
- <div className="flex-shrink-0">
1024
- {pluginInsights}
1085
+ <div
1086
+ className={cls(
1087
+ "grid transition-[grid-template-rows] duration-150 ease-out",
1088
+ selectedEntityIdProp === undefined
1089
+ ? "grid-rows-[1fr]"
1090
+ : "grid-rows-[0fr]"
1091
+ )}
1092
+ >
1093
+ <div className="overflow-hidden flex-shrink-0">
1094
+ {pluginInsights}
1095
+ </div>
1025
1096
  </div>
1026
1097
  )}
1027
- <EntityCollectionListView
1098
+ <CollectionListViewBinding
1028
1099
  key={`list-view-${path}`}
1029
1100
  collection={collection}
1030
1101
  tableController={tableController}
@@ -1035,6 +1106,9 @@ export const EntityCollectionView = React.memo(
1035
1106
  size={listSize}
1036
1107
  emptyComponent={emptyComponent}
1037
1108
  selectedEntityId={selectedEntityIdProp}
1109
+ getActionsForEntity={getActionsForEntity}
1110
+ path={path}
1111
+ openEntityMode={openEntityMode}
1038
1112
  />
1039
1113
  </div>
1040
1114
  ) : (
@@ -1042,15 +1116,47 @@ export const EntityCollectionView = React.memo(
1042
1116
  )}
1043
1117
  </SplitListView>
1044
1118
  ) : (
1045
- <>
1119
+ <div className="flex flex-col w-full h-full">
1046
1120
  {toolbarNode}
1047
- {pluginInsights.length > 0 && (viewMode === "list" || viewMode === "table") && (
1048
- <div className="px-3 md:px-4 lg:px-6 max-w-6xl mx-auto w-full flex-shrink-0">
1049
- {pluginInsights}
1050
- </div>
1051
- )}
1052
- {innerView}
1053
- </>
1121
+ <div className={cls(
1122
+ "flex-1 flex flex-col",
1123
+ (viewMode === "list" || viewMode === "cards") && "overflow-y-auto"
1124
+ )}>
1125
+ {viewMode === "list" ? (
1126
+ <div
1127
+ className={cls(
1128
+ "flex flex-col w-full",
1129
+ selectedEntityIdProp === undefined
1130
+ ? "max-w-6xl mx-auto px-3 md:px-4 lg:px-6 py-4"
1131
+ : ""
1132
+ )}
1133
+ >
1134
+ <div
1135
+ className={cls(
1136
+ "grid transition-[grid-template-rows,transform,margin] duration-150 ease-out",
1137
+ selectedEntityIdProp === undefined
1138
+ ? "grid-rows-[1fr] translate-y-0 mt-12 mb-6"
1139
+ : "grid-rows-[0fr] -translate-y-2 mt-0 mb-0"
1140
+ )}
1141
+ >
1142
+ <div className="overflow-hidden flex items-center gap-4">
1143
+ <Typography gutterBottom variant="h4" className="grow mb-0" component="h4">
1144
+ {collection.name}
1145
+ </Typography>
1146
+ </div>
1147
+ </div>
1148
+ {pluginInsights.length > 0 && (
1149
+ <div className="flex-shrink-0">
1150
+ {pluginInsights}
1151
+ </div>
1152
+ )}
1153
+ {innerView}
1154
+ </div>
1155
+ ) : (
1156
+ innerView
1157
+ )}
1158
+ </div>
1159
+ </div>
1054
1160
  )}
1055
1161
 
1056
1162
  {popupCell && <PopupFormField
@@ -1080,9 +1186,11 @@ export const EntityCollectionView = React.memo(
1080
1186
 
1081
1187
  </div>
1082
1188
  );
1189
+
1190
+ return mainContent;
1083
1191
  }, (a, b) => {
1084
1192
  return equal(a.path, b.path) &&
1085
- equal(a.parentCollectionIds, b.parentCollectionIds) &&
1193
+ equal(a.parentCollectionSlugs, b.parentCollectionSlugs) && equal(a.parentEntityIds, b.parentEntityIds) &&
1086
1194
  equal(a.isSubCollection, b.isSubCollection) &&
1087
1195
  equal(a.className, b.className) &&
1088
1196
  equal(a.properties, b.properties) &&
@@ -1099,10 +1207,77 @@ export const EntityCollectionView = React.memo(
1099
1207
  equal(a.openEntityMode, b.openEntityMode) &&
1100
1208
  equal(a.exportable, b.exportable) &&
1101
1209
  equal(a.history, b.history) &&
1102
- equal(a.forceFilter, b.forceFilter) &&
1210
+ equal(a.fixedFilter, b.fixedFilter) &&
1103
1211
  equal(a.selectedEntityId, b.selectedEntityId) &&
1104
1212
  equal(a.selectedTab, b.selectedTab);
1105
- }) as React.FunctionComponent<EntityCollectionViewProps<any>>
1213
+ }) as React.FunctionComponent<CollectionViewBindingProps<any>>;
1214
+
1215
+ export const CollectionViewBinding = React.memo(
1216
+ function CollectionViewBinding<M extends Record<string, unknown>>(props: CollectionViewBindingProps<M>) {
1217
+ const collectionRegistry = useCollectionRegistryController();
1218
+ const path = props.path ?? props.slug;
1219
+ const collection = collectionRegistry.getCollection(path) ?? props;
1220
+
1221
+ const content = <CollectionViewBindingInner {...props} />;
1222
+
1223
+ if (collection) {
1224
+ return (
1225
+ <CollectionScopeProvider collection={collection as CollectionConfig}>
1226
+ {content}
1227
+ </CollectionScopeProvider>
1228
+ );
1229
+ }
1230
+ return content;
1231
+ }
1232
+ ) as React.FunctionComponent<CollectionViewBindingProps<any>>;
1233
+
1234
+ /**
1235
+ * Default empty state shown when a collection has no entities.
1236
+ * Used as the fallback for the `"Collection.EmptyState"` component override.
1237
+ *
1238
+ * @internal
1239
+ */
1240
+ function DefaultCollectionEmptyState({
1241
+ canCreate,
1242
+ onNewClick,
1243
+ isSearching,
1244
+ searchString
1245
+ }: {
1246
+ canCreate: boolean;
1247
+ onNewClick: () => void;
1248
+ isSearching: boolean;
1249
+ searchString: string;
1250
+ }) {
1251
+ const { t } = useTranslation();
1252
+ if (canCreate) {
1253
+ return (
1254
+ <div className="flex flex-col items-center justify-center">
1255
+ <Typography variant={"subtitle2"}>{t("so_empty")}</Typography>
1256
+ <Button
1257
+ onClick={onNewClick}
1258
+ className="mt-4"
1259
+ >
1260
+ <PlusIcon/>
1261
+ {t("create_your_first_entry")}
1262
+ </Button>
1263
+ </div>
1264
+ );
1265
+ }
1266
+ return (
1267
+ <Typography variant={"label"}>
1268
+ {isSearching
1269
+ ? t("no_results_search", { search: searchString })
1270
+ : t("no_results_filter_sort")}
1271
+ </Typography>
1272
+ );
1273
+ }
1274
+
1275
+ /**
1276
+ * Inflight count request deduplication map.
1277
+ * Keyed by `path|filterKey|sortByProperty|sortDir` so that concurrent
1278
+ * callers (e.g. React StrictMode double-mount) share the same promise.
1279
+ */
1280
+ const inflightCountRequests = new Map<string, Promise<number>>();
1106
1281
 
1107
1282
  function EntitiesCount({
1108
1283
  path,
@@ -1112,70 +1287,72 @@ function EntitiesCount({
1112
1287
  onCountChange
1113
1288
  }: {
1114
1289
  path: string,
1115
- collection: EntityCollection,
1290
+ collection: CollectionConfig,
1116
1291
  filter?: FilterValues<any>,
1117
1292
  sortBy?: [string, "asc" | "desc"],
1118
1293
  onCountChange?: (count: number | null | undefined) => void,
1119
1294
  }) {
1120
1295
 
1121
1296
  const dataClient = useData();
1122
- const navigation = useCollectionRegistryController();
1123
1297
 
1124
1298
  const sortByProperty = sortBy ? sortBy[0] : undefined;
1125
1299
  const currentSort = sortBy ? sortBy[1] : undefined;
1126
- // v4: use path directly instead of resolveIdsFrom
1127
- const resolvedPath = path;
1300
+
1301
+ // Use refs for values that should NOT trigger re-fetches
1302
+ const dataClientRef = React.useRef(dataClient);
1303
+ dataClientRef.current = dataClient;
1304
+ const onCountChangeRef = React.useRef(onCountChange);
1305
+ onCountChangeRef.current = onCountChange;
1306
+
1307
+ // Serialize filter to a stable string to avoid re-fetches on object identity changes
1308
+ const filterKey = React.useMemo(() => filter ? JSON.stringify(filter) : "", [filter]);
1128
1309
 
1129
1310
  useEffect(() => {
1130
- const accessor = dataClient.collection(resolvedPath);
1131
- if (accessor.count) {
1132
- if (onCountChange) onCountChange(null);
1133
-
1134
- // Convert filterValues to PostgREST where clause
1135
- const whereMap: Record<string, string> = {};
1136
- if (filter) {
1137
- Object.entries(filter).forEach(([key, value]) => {
1138
- if (value && Array.isArray(value)) {
1139
- const [op, val] = value;
1140
- const postgrestOp = op === "==" ? "eq" : op === "!=" ? "neq" : op === ">" ? "gt" : op === ">=" ? "gte" : op === "<" ? "lt" : op === "<=" ? "lte" : op === "in" ? "in" : op === "not-in" ? "nin" : op === "array-contains" ? "cs" : op === "array-contains-any" ? "csa" : "eq";
1141
-
1142
- let stringVal: string;
1143
- if (Array.isArray(val)) {
1144
- stringVal = `(${val.join(",")})`;
1145
- } else {
1146
- stringVal = String(val);
1147
- }
1148
- whereMap[key] = `${postgrestOp}.${stringVal}`;
1149
- }
1150
- });
1151
- }
1152
- const whereParams = Object.keys(whereMap).length > 0 ? whereMap : undefined;
1153
- const orderByParams = sortByProperty ? `${String(sortByProperty)}:${currentSort}` : undefined;
1311
+ const accessor = dataClientRef.current.collection(path);
1312
+ if (!accessor.count) {
1313
+ onCountChangeRef.current?.(undefined);
1314
+ return;
1315
+ }
1154
1316
 
1155
- accessor.count({
1317
+ let cancelled = false;
1318
+
1319
+ // filterValues is already FilterValues — pass directly
1320
+ const whereParams = filter && Object.keys(filter).length > 0 ? filter : undefined;
1321
+ const orderByParams: [string, "asc" | "desc"] | undefined = sortByProperty && currentSort ? [String(sortByProperty), currentSort] : undefined;
1322
+
1323
+ // Deduplicate inflight count requests (e.g. React StrictMode double-mount)
1324
+ const cacheKey = `${path}|${filterKey}|${sortByProperty ?? ""}|${currentSort ?? ""}`;
1325
+ let countPromise = inflightCountRequests.get(cacheKey);
1326
+ if (!countPromise) {
1327
+ countPromise = accessor.count({
1156
1328
  where: whereParams,
1157
1329
  orderBy: orderByParams
1158
- }).then((c) => {
1159
- if (onCountChange) onCountChange(c);
1160
- }).catch((e) => {
1161
- console.warn("Error fetching count", e);
1162
- if (onCountChange) onCountChange(undefined);
1163
1330
  });
1164
- } else {
1165
- if (onCountChange) onCountChange(undefined);
1331
+ inflightCountRequests.set(cacheKey, countPromise);
1332
+ // Clean up the inflight entry once resolved/rejected
1333
+ countPromise.finally(() => inflightCountRequests.delete(cacheKey));
1166
1334
  }
1167
- }, [path, resolvedPath, collection, filter, sortByProperty, currentSort, dataClient]);
1335
+
1336
+ countPromise.then((c) => {
1337
+ if (!cancelled) onCountChangeRef.current?.(c);
1338
+ }).catch((e) => {
1339
+ console.warn("Error fetching count", e);
1340
+ if (!cancelled) onCountChangeRef.current?.(undefined);
1341
+ });
1342
+
1343
+ return () => { cancelled = true; };
1344
+ }, [path, filterKey, sortByProperty, currentSort]);
1168
1345
 
1169
1346
  // Count is now displayed in the breadcrumb bar, this component only fetches and reports
1170
1347
  return null;
1171
1348
  }
1172
1349
 
1173
- function buildPropertyWidthOverwrite(key: string, width: number): PartialEntityCollection {
1350
+ function buildPropertyWidthOverwrite(key: string, width: number): PartialCollectionConfig {
1174
1351
  if (key.includes(".")) {
1175
1352
  const [parentKey, ...childKey] = key.split(".");
1176
- return { properties: { [parentKey]: buildPropertyWidthOverwrite(childKey.join("."), width) } } as PartialEntityCollection;
1353
+ return { properties: { [parentKey]: buildPropertyWidthOverwrite(childKey.join("."), width) } } as PartialCollectionConfig;
1177
1354
  }
1178
- return { properties: { [key]: { columnWidth: width } } } as PartialEntityCollection;
1355
+ return { properties: { [key]: { ui: { columnWidth: width } } } } as PartialCollectionConfig;
1179
1356
  }
1180
1357
 
1181
1358
  function EntityIdHeaderWidget({
@@ -1183,7 +1360,7 @@ function EntityIdHeaderWidget({
1183
1360
  path,
1184
1361
  idPath
1185
1362
  }: {
1186
- collection: EntityCollection,
1363
+ collection: CollectionConfig,
1187
1364
  path: string,
1188
1365
  idPath: string
1189
1366
  }) {
@@ -1193,7 +1370,7 @@ function EntityIdHeaderWidget({
1193
1370
  const [openPopup, setOpenPopup] = React.useState(false);
1194
1371
  const [searchString, setSearchString] = React.useState("");
1195
1372
  const [recentIds, setRecentIds] = React.useState<string[]>(getRecentIds(collection.slug).map(String));
1196
- const sideEntityController = useSideEntityController();
1373
+ const sidePanelController = useSidePanel();
1197
1374
 
1198
1375
  const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
1199
1376
 
@@ -1225,22 +1402,24 @@ function EntityIdHeaderWidget({
1225
1402
  entityId,
1226
1403
  path,
1227
1404
 
1228
- sideEntityController,
1405
+ sidePanelController,
1229
1406
  navigation: urlController
1230
1407
  })
1231
1408
  }}
1232
1409
  className={"w-96 max-w-full"}>
1233
1410
 
1234
1411
  <div className="flex p-2 w-full gap-2">
1235
- <input
1412
+ <TextField
1236
1413
  autoFocus={openPopup}
1237
1414
  placeholder={t("find_entity_by_id")}
1238
- // size={"small"}
1415
+ size="small"
1239
1416
  onChange={(e) => {
1240
1417
  setSearchString(e.target.value);
1241
1418
  }}
1242
1419
  value={searchString}
1243
- className={"rounded-lg bg-white dark:bg-surface-900 flex-grow outline-none p-2 " + focusedDisabled}/>
1420
+ className="flex-grow"
1421
+ inputClassName={cls("rounded-lg bg-white dark:bg-surface-900", focusedDisabled)}
1422
+ />
1244
1423
  <Button variant={"text"}
1245
1424
  disabled={!(searchString.trim())}
1246
1425
  type={"submit"}
@@ -1261,7 +1440,7 @@ path })}
1261
1440
  entityId: id,
1262
1441
  path,
1263
1442
 
1264
- sideEntityController,
1443
+ sidePanelController,
1265
1444
  navigation: urlController
1266
1445
  })
1267
1446
  }}