@rebasepro/admin 0.10.0 → 0.10.1-canary.0a881d4

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 (352) hide show
  1. package/dist/{CollectionEditorDialog-BOlKGGg7.js → CollectionEditorDialog-DMztwJ5S.js} +12 -12
  2. package/dist/CollectionEditorDialog-DMztwJ5S.js.map +1 -0
  3. package/dist/{PropertyEditView-i51tFOfM.js → PropertyEditView-CjFCnftn.js} +18 -18
  4. package/dist/PropertyEditView-CjFCnftn.js.map +1 -0
  5. package/dist/{RouterCollectionsStudioView-Dh4W53PU.js → RouterCollectionsStudioView-nDFQdKHA.js} +4 -4
  6. package/dist/RouterCollectionsStudioView-nDFQdKHA.js.map +1 -0
  7. package/dist/collection_editor/api/generateCollectionApi.d.ts +4 -4
  8. package/dist/collection_editor/pgColumnToProperty.d.ts +4 -3
  9. package/dist/collection_editor/serializable_types.d.ts +31 -30
  10. package/dist/collection_editor/serializable_utils.d.ts +6 -5
  11. package/dist/collection_editor/types/collection_editor_controller.d.ts +6 -5
  12. package/dist/collection_editor/types/collection_inference.d.ts +3 -2
  13. package/dist/collection_editor/types/config_controller.d.ts +8 -7
  14. package/dist/collection_editor/ui/AddKanbanColumnAction.d.ts +2 -2
  15. package/dist/collection_editor/ui/CollectionViewHeaderAction.d.ts +3 -2
  16. package/dist/collection_editor/ui/EditorCollectionAction.d.ts +1 -1
  17. package/dist/collection_editor/ui/EditorCollectionActionStart.d.ts +1 -1
  18. package/dist/collection_editor/ui/EditorEntityAction.d.ts +1 -1
  19. package/dist/collection_editor/ui/HomePageEditorCollectionAction.d.ts +1 -1
  20. package/dist/collection_editor/ui/KanbanSetupAction.d.ts +2 -2
  21. package/dist/collection_editor/ui/NewCollectionCard.d.ts +1 -1
  22. package/dist/collection_editor/ui/PropertyAddColumnComponent.d.ts +2 -2
  23. package/dist/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.d.ts +3 -3
  24. package/dist/collection_editor/ui/collection_editor/CollectionDetailsForm.d.ts +2 -2
  25. package/dist/collection_editor/ui/collection_editor/CollectionEditorDialog.d.ts +5 -4
  26. package/dist/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.d.ts +2 -2
  27. package/dist/collection_editor/ui/collection_editor/CollectionJsonImportDialog.d.ts +2 -2
  28. package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +3 -2
  29. package/dist/collection_editor/ui/collection_editor/CollectionStudioView.d.ts +2 -2
  30. package/dist/collection_editor/ui/collection_editor/CollectionsStudioView.d.ts +2 -2
  31. package/dist/collection_editor/ui/collection_editor/EntityActionsEditTab.d.ts +2 -2
  32. package/dist/collection_editor/ui/collection_editor/GeneralSettingsForm.d.ts +2 -2
  33. package/dist/collection_editor/ui/collection_editor/GetCodeDialog.d.ts +2 -2
  34. package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +3 -2
  35. package/dist/collection_editor/ui/collection_editor/PropertyTree.d.ts +2 -1
  36. package/dist/collection_editor/ui/collection_editor/SubcollectionsEditTab.d.ts +4 -3
  37. package/dist/collection_editor/ui/collection_editor/ViewModeSwitch.d.ts +1 -1
  38. package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.d.ts +1 -1
  39. package/dist/collection_editor/ui/collection_editor/properties/BlockPropertyField.d.ts +1 -1
  40. package/dist/collection_editor/ui/collection_editor/properties/MapPropertyField.d.ts +1 -1
  41. package/dist/collection_editor/ui/collection_editor/properties/RepeatPropertyField.d.ts +1 -1
  42. package/dist/collection_editor/ui/collection_editor/templates/blog_template.d.ts +2 -2
  43. package/dist/collection_editor/ui/collection_editor/templates/pages_template.d.ts +2 -2
  44. package/dist/collection_editor/ui/collection_editor/templates/products_template.d.ts +2 -2
  45. package/dist/collection_editor/ui/collection_editor/templates/users_template.d.ts +2 -2
  46. package/dist/collection_editor/ui/collection_editor/utils/supported_fields.d.ts +1 -1
  47. package/dist/collection_editor/ui/collection_editor/utils/update_property_for_widget.d.ts +2 -1
  48. package/dist/collection_editor/useLocalCollectionsConfigController.d.ts +2 -2
  49. package/dist/collection_editor/validateCollectionJson.d.ts +2 -2
  50. package/dist/collection_editor_ui.js +4 -4
  51. package/dist/components/AdminModeSyncer.d.ts +1 -1
  52. package/dist/components/ClearFilterSortButton.d.ts +1 -1
  53. package/dist/components/CollectionPanel.d.ts +2 -2
  54. package/dist/components/CollectionTableBinding/CollectionRowActions.d.ts +4 -4
  55. package/dist/components/CollectionTableBinding/CollectionTableBinding.d.ts +1 -1
  56. package/dist/components/CollectionTableBinding/CollectionTableBindingProps.d.ts +3 -2
  57. package/dist/components/CollectionTableBinding/fields/TableMultipleRelationField.d.ts +3 -3
  58. package/dist/components/CollectionTableBinding/fields/TableReferenceField.d.ts +3 -3
  59. package/dist/components/CollectionTableBinding/fields/TableRelationField.d.ts +3 -3
  60. package/dist/components/CollectionTableBinding/internal/common.d.ts +2 -2
  61. package/dist/components/CollectionTableBinding/internal/popup_field/PopupFormField.d.ts +2 -2
  62. package/dist/components/CollectionViewBinding/BoardCardBinding.d.ts +3 -3
  63. package/dist/components/CollectionViewBinding/CollectionBoardViewBinding.d.ts +3 -3
  64. package/dist/components/CollectionViewBinding/CollectionCardViewBinding.d.ts +3 -3
  65. package/dist/components/CollectionViewBinding/CollectionListViewBinding.d.ts +3 -3
  66. package/dist/components/CollectionViewBinding/CollectionViewActions.d.ts +2 -3
  67. package/dist/components/CollectionViewBinding/CollectionViewBinding.d.ts +2 -2
  68. package/dist/components/CollectionViewBinding/CollectionViewStartActions.d.ts +2 -3
  69. package/dist/components/CollectionViewBinding/EntityCardBinding.d.ts +3 -3
  70. package/dist/components/CollectionViewBinding/FilterPresetsButton.d.ts +2 -1
  71. package/dist/components/CollectionViewBinding/SplitListView.d.ts +3 -3
  72. package/dist/components/CollectionViewBinding/ViewModeToggle.d.ts +1 -1
  73. package/dist/components/CollectionViewBinding/hooks/useCollectionInlineEditor.d.ts +3 -2
  74. package/dist/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.d.ts +3 -2
  75. package/dist/components/CollectionViewBinding/useBoardDataController.d.ts +2 -2
  76. package/dist/components/CollectionViewBinding/usePreviewSlots.d.ts +9 -6
  77. package/dist/components/CollectionViewBinding/useSelectionController.d.ts +2 -1
  78. package/dist/components/DeleteEntityDialog.d.ts +2 -2
  79. package/dist/components/DetailViewBinding.d.ts +3 -3
  80. package/dist/components/DrawerNavigationGroup.d.ts +1 -1
  81. package/dist/components/EditViewBinding.d.ts +3 -3
  82. package/dist/components/EntityPreviewBinding.d.ts +3 -3
  83. package/dist/components/EntityViewBinding.d.ts +2 -2
  84. package/dist/components/HomePage/ContentHomePage.d.ts +1 -1
  85. package/dist/components/HomePage/HomePageDnD.d.ts +1 -1
  86. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  87. package/dist/components/PropertyConfigBadge.d.ts +1 -1
  88. package/dist/components/RebaseAdmin.d.ts +1 -1
  89. package/dist/components/RebaseLayout.d.ts +1 -1
  90. package/dist/components/ReferenceTable/SelectionTableBinding.d.ts +2 -2
  91. package/dist/components/SelectableTable/SelectableTable.d.ts +3 -2
  92. package/dist/components/SelectableTable/SelectionStore.d.ts +1 -1
  93. package/dist/components/SelectableTable/filters/FilterFieldBinding.d.ts +2 -2
  94. package/dist/components/SidePanelBinding.d.ts +1 -1
  95. package/dist/components/admin/CreationResultDialog.d.ts +1 -1
  96. package/dist/components/common/default_entity_actions.d.ts +2 -1
  97. package/dist/components/field_configs.d.ts +3 -2
  98. package/dist/components/history/EntityHistoryEntry.d.ts +2 -2
  99. package/dist/components/history/EntityHistoryView.d.ts +1 -1
  100. package/dist/components/history/LastEditedByFormAction.d.ts +1 -1
  101. package/dist/components/history/LastEditedByIndicator.d.ts +2 -2
  102. package/dist/contexts/BreacrumbsContext.d.ts +1 -1
  103. package/dist/contexts/SideDialogsControllerContext.d.ts +1 -1
  104. package/dist/contexts/SidePanelControllerContext.d.ts +1 -1
  105. package/dist/data_export/export/ExportCollectionAction.d.ts +4 -3
  106. package/dist/data_import/components/ImportSaveInProgress.d.ts +2 -2
  107. package/dist/data_import/import/ImportCollectionAction.d.ts +2 -1
  108. package/dist/data_import/utils/data.d.ts +2 -1
  109. package/dist/{export-BM6HPujv.js → export-CavEbZVF.js} +2 -2
  110. package/dist/export-CavEbZVF.js.map +1 -0
  111. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  112. package/dist/form/form_utils.d.ts +4 -3
  113. package/dist/{history-CtIPJxvQ.js → history-B1lIsrkX.js} +2 -2
  114. package/dist/history-B1lIsrkX.js.map +1 -0
  115. package/dist/hooks/index.d.ts +1 -0
  116. package/dist/hooks/navigation/contexts/CollectionRegistryContext.d.ts +2 -2
  117. package/dist/hooks/navigation/contexts/NavigationStateContext.d.ts +1 -1
  118. package/dist/hooks/navigation/contexts/UrlContext.d.ts +1 -1
  119. package/dist/hooks/navigation/useBuildCollectionRegistryController.d.ts +2 -1
  120. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +7 -5
  121. package/dist/hooks/navigation/useBuildUrlController.d.ts +1 -1
  122. package/dist/hooks/navigation/useNavigationResolution.d.ts +6 -5
  123. package/dist/hooks/navigation/useResolvedCollections.d.ts +8 -7
  124. package/dist/hooks/navigation/useResolvedViews.d.ts +4 -2
  125. package/dist/hooks/navigation/useTopLevelNavigation.d.ts +2 -2
  126. package/dist/hooks/navigation/utils.d.ts +5 -5
  127. package/dist/hooks/useBreadcrumbsController.d.ts +1 -1
  128. package/dist/hooks/useBuildSidePanel.d.ts +4 -4
  129. package/dist/hooks/useCMSContext.d.ts +4 -2
  130. package/dist/hooks/useResolvedNavigationFrom.d.ts +5 -4
  131. package/dist/hooks/useResolvedUsers.d.ts +8 -0
  132. package/dist/hooks/useSideDialogsController.d.ts +1 -1
  133. package/dist/hooks/useSidePanel.d.ts +1 -1
  134. package/dist/{import-DzQnT03v.js → import-36UcGe71.js} +2 -2
  135. package/dist/import-36UcGe71.js.map +1 -0
  136. package/dist/index.d.ts +1 -1
  137. package/dist/index.js +16 -16
  138. package/dist/index.js.map +1 -1
  139. package/dist/preview/components/UrlComponentPreview.d.ts +1 -1
  140. package/dist/preview/components/UserPreview.d.ts +3 -2
  141. package/dist/preview/property_previews/StringPropertyPreview.d.ts +1 -1
  142. package/dist/preview/util.d.ts +1 -1
  143. package/dist/routes/CustomViewRoute.d.ts +1 -1
  144. package/dist/types/components/EntityFormActionsProps.d.ts +2 -2
  145. package/dist/types/components/EntityFormProps.d.ts +3 -3
  146. package/dist/types/fields.d.ts +2 -2
  147. package/dist/util/dataControllerAdapter.d.ts +1 -1
  148. package/dist/util/entity_actions.d.ts +1 -1
  149. package/dist/util/navigation_utils.d.ts +3 -3
  150. package/dist/util/previews.d.ts +22 -4
  151. package/dist/util/property_utils.d.ts +3 -2
  152. package/dist/util/resolutions.d.ts +1 -1
  153. package/dist/util/view_mode.d.ts +3 -3
  154. package/dist/{util-XFwQ9FEc.js → util-CPgUM4M8.js} +353 -221
  155. package/dist/util-CPgUM4M8.js.map +1 -0
  156. package/package.json +11 -9
  157. package/src/collection_editor/ConfigControllerProvider.tsx +11 -12
  158. package/src/collection_editor/api/generateCollectionApi.ts +4 -4
  159. package/src/collection_editor/pgColumnToProperty.ts +4 -3
  160. package/src/collection_editor/serializable_types.ts +36 -34
  161. package/src/collection_editor/serializable_utils.ts +17 -32
  162. package/src/collection_editor/types/collection_editor_controller.tsx +6 -5
  163. package/src/collection_editor/types/collection_inference.ts +3 -2
  164. package/src/collection_editor/types/config_controller.tsx +8 -7
  165. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +3 -2
  166. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +3 -2
  167. package/src/collection_editor/ui/EditorCollectionAction.tsx +3 -2
  168. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +3 -2
  169. package/src/collection_editor/ui/EditorEntityAction.tsx +3 -2
  170. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +1 -1
  171. package/src/collection_editor/ui/KanbanSetupAction.tsx +3 -2
  172. package/src/collection_editor/ui/MissingReferenceWidget.tsx +1 -1
  173. package/src/collection_editor/ui/NewCollectionCard.tsx +1 -1
  174. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +3 -2
  175. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +6 -5
  176. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +5 -7
  177. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +28 -38
  178. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +4 -3
  179. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +3 -2
  180. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +4 -3
  181. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +4 -3
  182. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +3 -2
  183. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +2 -2
  184. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +3 -2
  185. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +4 -3
  186. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +4 -4
  187. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +4 -4
  188. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +5 -4
  189. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +3 -2
  190. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +4 -3
  191. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +2 -1
  192. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +6 -5
  193. package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +1 -1
  194. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +3 -2
  195. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +2 -1
  196. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +3 -2
  197. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +3 -2
  198. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +2 -1
  199. package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +3 -3
  200. package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +3 -3
  201. package/src/collection_editor/ui/collection_editor/templates/products_template.ts +4 -4
  202. package/src/collection_editor/ui/collection_editor/templates/users_template.ts +2 -2
  203. package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +1 -1
  204. package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +10 -8
  205. package/src/collection_editor/useJsonCollectionsConfigController.tsx +10 -9
  206. package/src/collection_editor/useLocalCollectionsConfigController.tsx +5 -5
  207. package/src/collection_editor/validateCollectionJson.ts +4 -5
  208. package/src/components/AdminModeSyncer.tsx +1 -1
  209. package/src/components/ClearFilterSortButton.tsx +1 -1
  210. package/src/components/CollectionPanel.tsx +5 -4
  211. package/src/components/CollectionTableBinding/CollectionRowActions.tsx +6 -6
  212. package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +5 -4
  213. package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +3 -2
  214. package/src/components/CollectionTableBinding/PropertyTableCell.tsx +5 -5
  215. package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +4 -3
  216. package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +5 -4
  217. package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +4 -3
  218. package/src/components/CollectionTableBinding/internal/common.tsx +8 -7
  219. package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +5 -4
  220. package/src/components/CollectionTableBinding/table_bindings.tsx +7 -7
  221. package/src/components/CollectionViewBinding/BoardCardBinding.tsx +6 -5
  222. package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +5 -6
  223. package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +4 -3
  224. package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +10 -13
  225. package/src/components/CollectionViewBinding/CollectionViewActions.tsx +3 -3
  226. package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +17 -16
  227. package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +3 -3
  228. package/src/components/CollectionViewBinding/EntityCardBinding.tsx +6 -5
  229. package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +2 -1
  230. package/src/components/CollectionViewBinding/FiltersDialog.tsx +2 -2
  231. package/src/components/CollectionViewBinding/SplitListView.tsx +6 -5
  232. package/src/components/CollectionViewBinding/ViewModeToggle.tsx +1 -1
  233. package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +3 -2
  234. package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +3 -2
  235. package/src/components/CollectionViewBinding/useBoardDataController.tsx +3 -2
  236. package/src/components/CollectionViewBinding/usePreviewSlots.ts +57 -25
  237. package/src/components/CollectionViewBinding/useSelectionController.tsx +2 -1
  238. package/src/components/DefaultDrawer.tsx +2 -2
  239. package/src/components/DeleteEntityDialog.tsx +3 -2
  240. package/src/components/DetailViewBinding.tsx +23 -18
  241. package/src/components/DrawerNavigationGroup.tsx +1 -1
  242. package/src/components/EditFormActions.tsx +5 -5
  243. package/src/components/EditViewBinding.tsx +11 -15
  244. package/src/components/EntityPreviewBinding.tsx +7 -6
  245. package/src/components/EntityViewBinding.tsx +3 -3
  246. package/src/components/HomePage/ContentHomePage.tsx +2 -2
  247. package/src/components/HomePage/FavouritesView.tsx +1 -1
  248. package/src/components/HomePage/HomePageDnD.tsx +1 -1
  249. package/src/components/HomePage/NavigationCardBinding.tsx +2 -2
  250. package/src/components/PropertyConfigBadge.tsx +2 -1
  251. package/src/components/RebaseAdmin.tsx +1 -1
  252. package/src/components/RebaseAuthGate.tsx +1 -1
  253. package/src/components/RebaseLayout.tsx +1 -1
  254. package/src/components/RebaseNavigation.tsx +4 -3
  255. package/src/components/ReferenceTable/SelectionTableBinding.tsx +6 -5
  256. package/src/components/ReferenceWidget.tsx +3 -2
  257. package/src/components/SelectableTable/SelectableTable.tsx +3 -3
  258. package/src/components/SelectableTable/SelectionStore.ts +1 -1
  259. package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +9 -6
  260. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +3 -2
  261. package/src/components/SideDialogs.tsx +2 -2
  262. package/src/components/SidePanelBinding.tsx +5 -5
  263. package/src/components/SidePanelProvider.tsx +1 -1
  264. package/src/components/admin/CreationResultDialog.tsx +1 -1
  265. package/src/components/common/default_entity_actions.tsx +3 -2
  266. package/src/components/field_configs.tsx +30 -29
  267. package/src/components/history/EntityHistoryEntry.tsx +3 -2
  268. package/src/components/history/EntityHistoryView.tsx +1 -1
  269. package/src/components/history/LastEditedByFormAction.tsx +1 -1
  270. package/src/components/history/LastEditedByIndicator.tsx +3 -2
  271. package/src/contexts/BreacrumbsContext.tsx +1 -1
  272. package/src/contexts/SideDialogsControllerContext.tsx +1 -1
  273. package/src/contexts/SidePanelControllerContext.tsx +1 -1
  274. package/src/data_export/export/ExportCollectionAction.tsx +5 -4
  275. package/src/data_import/components/ImportSaveInProgress.tsx +4 -3
  276. package/src/data_import/import/ImportCollectionAction.tsx +3 -2
  277. package/src/data_import/utils/data.ts +3 -2
  278. package/src/form/EntityForm.tsx +19 -10
  279. package/src/form/EntityFormActions.tsx +3 -3
  280. package/src/form/EntityFormBinding.tsx +6 -4
  281. package/src/form/PropertyFieldBinding.tsx +15 -12
  282. package/src/form/components/FieldHelperText.tsx +1 -1
  283. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +5 -4
  284. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +7 -6
  285. package/src/form/field_bindings/BlockFieldBinding.tsx +4 -4
  286. package/src/form/field_bindings/DateTimeFieldBinding.tsx +1 -1
  287. package/src/form/field_bindings/KeyValueFieldBinding.tsx +1 -1
  288. package/src/form/field_bindings/MapFieldBinding.tsx +7 -7
  289. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +1 -1
  290. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +2 -2
  291. package/src/form/field_bindings/ReferenceFieldBinding.tsx +4 -3
  292. package/src/form/field_bindings/RelationFieldBinding.tsx +2 -2
  293. package/src/form/field_bindings/RepeatFieldBinding.tsx +5 -5
  294. package/src/form/field_bindings/SelectFieldBinding.tsx +1 -1
  295. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +2 -2
  296. package/src/form/field_bindings/SwitchFieldBinding.tsx +1 -1
  297. package/src/form/field_bindings/TextFieldBinding.tsx +8 -8
  298. package/src/form/field_bindings/UserSelectFieldBinding.tsx +1 -1
  299. package/src/form/form_utils.ts +5 -3
  300. package/src/form/useClearRestoreValue.tsx +1 -1
  301. package/src/form/validation.ts +1 -1
  302. package/src/hooks/index.ts +1 -0
  303. package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +3 -2
  304. package/src/hooks/navigation/contexts/NavigationStateContext.tsx +1 -1
  305. package/src/hooks/navigation/contexts/UrlContext.tsx +1 -1
  306. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +19 -15
  307. package/src/hooks/navigation/useBuildNavigationStateController.tsx +8 -6
  308. package/src/hooks/navigation/useBuildUrlController.tsx +2 -2
  309. package/src/hooks/navigation/useNavigationResolution.ts +15 -21
  310. package/src/hooks/navigation/useResolvedCollections.ts +10 -9
  311. package/src/hooks/navigation/useResolvedViews.tsx +4 -2
  312. package/src/hooks/navigation/useTopLevelNavigation.ts +3 -2
  313. package/src/hooks/navigation/utils.ts +6 -5
  314. package/src/hooks/useBreadcrumbsController.tsx +1 -1
  315. package/src/hooks/useBuildSidePanel.tsx +9 -12
  316. package/src/hooks/useCMSContext.tsx +8 -4
  317. package/src/hooks/useResolvedNavigationFrom.tsx +7 -5
  318. package/src/hooks/useResolvedUsers.ts +143 -0
  319. package/src/hooks/useSelectionDialog.tsx +3 -2
  320. package/src/hooks/useSideDialogsController.tsx +1 -1
  321. package/src/hooks/useSidePanel.tsx +1 -1
  322. package/src/index.ts +2 -1
  323. package/src/preview/PropertyPreview.tsx +11 -11
  324. package/src/preview/components/ReferencePreview.tsx +6 -5
  325. package/src/preview/components/RelationPreview.tsx +6 -5
  326. package/src/preview/components/UrlComponentPreview.tsx +1 -1
  327. package/src/preview/components/UserPreview.tsx +13 -4
  328. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +1 -1
  329. package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +1 -1
  330. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +2 -2
  331. package/src/preview/property_previews/StringPropertyPreview.tsx +19 -13
  332. package/src/preview/util.ts +1 -1
  333. package/src/routes/CustomViewRoute.tsx +1 -1
  334. package/src/routes/RebaseRoute.tsx +7 -5
  335. package/src/types/components/EntityFormActionsProps.tsx +3 -2
  336. package/src/types/components/EntityFormProps.tsx +4 -3
  337. package/src/types/fields.tsx +3 -2
  338. package/src/util/dataControllerAdapter.ts +2 -1
  339. package/src/util/entity_actions.ts +1 -1
  340. package/src/util/navigation_utils.ts +4 -13
  341. package/src/util/previews.ts +43 -53
  342. package/src/util/propertyConfigMapper.ts +7 -7
  343. package/src/util/property_utils.tsx +5 -4
  344. package/src/util/resolutions.ts +1 -1
  345. package/src/util/view_mode.ts +4 -3
  346. package/dist/CollectionEditorDialog-BOlKGGg7.js.map +0 -1
  347. package/dist/PropertyEditView-i51tFOfM.js.map +0 -1
  348. package/dist/RouterCollectionsStudioView-Dh4W53PU.js.map +0 -1
  349. package/dist/export-BM6HPujv.js.map +0 -1
  350. package/dist/history-CtIPJxvQ.js.map +0 -1
  351. package/dist/import-DzQnT03v.js.map +0 -1
  352. package/dist/util-XFwQ9FEc.js.map +0 -1
@@ -1,14 +1,17 @@
1
- import type { AdditionalFieldDelegate, EntityAction, CollectionConfig, Property } from "@rebasepro/types";
1
+ import type { Property } from "@rebasepro/types";
2
+ import type { AdditionalFieldDelegate, EntityAction, AdminCollection } from "@rebasepro/admin-types";
2
3
  import {
3
- CollectionSize,
4
4
  Entity,
5
5
  EntityReference,
6
- EntityTableController,
7
6
  FilterValues,
8
- getCollectionDataPath,
7
+ getCollectionDataPath
8
+ } from "@rebasepro/types";
9
+ import {
10
+ CollectionSize,
11
+ EntityTableController,
9
12
  PartialCollectionConfig,
10
13
  ViewMode
11
- } from "@rebasepro/types";
14
+ } from "@rebasepro/admin-types";
12
15
  import React, { useCallback, useEffect, useMemo, useState } from "react";
13
16
  import { useSearchParams } from "react-router-dom";
14
17
 
@@ -120,10 +123,10 @@ export type CollectionViewBindingProps<M extends Record<string, unknown>> = {
120
123
  */
121
124
  selectedTab?: string;
122
125
 
123
- } & CollectionConfig<M>;
126
+ } & AdminCollection<M>;
124
127
 
125
128
  /**
126
- * This component is in charge of binding a driver path with an {@link CollectionConfig}
129
+ * This component is in charge of binding a driver path with an {@link AdminCollection}
127
130
  * where it's configuration is defined. It includes an infinite scrolling table
128
131
  * and a 'Add' new entities button,
129
132
  *
@@ -181,7 +184,7 @@ const CollectionViewBindingInner = React.memo(
181
184
  const collection = useMemo(() => {
182
185
  const registryCollection = collectionRegistry.getCollection(path) || collectionProp;
183
186
  const userOverride = userConfigPersistence?.getCollectionConfig<M>(path);
184
- return (userOverride ? mergeDeep(registryCollection, userOverride) : registryCollection) as CollectionConfig<M>;
187
+ return (userOverride ? mergeDeep(registryCollection, userOverride) : registryCollection) as AdminCollection<M>;
185
188
  }, [collectionProp, path, userConfigPersistence, collectionRegistry]);
186
189
 
187
190
  const collectionRef = React.useRef(collection);
@@ -601,7 +604,6 @@ parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
601
604
  property = getPropertyInPath(resolvedCollection.properties, propertyKey);
602
605
  }
603
606
 
604
-
605
607
  // In v4, properties are already resolved, so we return them directly
606
608
  return property ?? null;
607
609
  }, [collection.properties, resolvedCollection.properties]);
@@ -622,7 +624,7 @@ parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
622
624
  const additionalFields = useMemo(() => {
623
625
  // v4: use getSubcollections helper to access subcollections
624
626
  const subcollectionsList = getSubcollections(collection);
625
- const subcollectionColumns: AdditionalFieldDelegate<M, any>[] = subcollectionsList.map((subcollection: CollectionConfig) => {
627
+ const subcollectionColumns: AdditionalFieldDelegate<M, any>[] = subcollectionsList.map((subcollection: AdminCollection) => {
626
628
  return {
627
629
  key: getSubcollectionColumnId(subcollection),
628
630
  name: subcollection.name,
@@ -778,7 +780,7 @@ parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
778
780
  propertyKey,
779
781
  onHover,
780
782
  path,
781
- collection: collection as CollectionConfig,
783
+ collection: collection as AdminCollection,
782
784
  tableController: tableController as EntityTableController,
783
785
  parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
784
786
  parentEntityIds: parentEntityIds ?? EMPTY_ARRAY
@@ -1062,7 +1064,6 @@ parentEntityIds,
1062
1064
  </div>
1063
1065
  )}
1064
1066
 
1065
-
1066
1067
  {/* When isSplitLayout, SplitListView is ALWAYS mounted — regardless
1067
1068
  of viewMode. The toolbar + current view live in the left panel;
1068
1069
  the right panel (entity detail) shows/hides based on selection.
@@ -1168,7 +1169,7 @@ export const CollectionViewBinding = React.memo(
1168
1169
 
1169
1170
  if (collection) {
1170
1171
  return (
1171
- <CollectionScopeProvider collection={collection as CollectionConfig}>
1172
+ <CollectionScopeProvider collection={collection as AdminCollection}>
1172
1173
  {content}
1173
1174
  </CollectionScopeProvider>
1174
1175
  );
@@ -1233,7 +1234,7 @@ function EntitiesCount({
1233
1234
  onCountChange
1234
1235
  }: {
1235
1236
  path: string,
1236
- collection: CollectionConfig,
1237
+ collection: AdminCollection,
1237
1238
  filter?: FilterValues<any>,
1238
1239
  sortBy?: [string, "asc" | "desc"],
1239
1240
  onCountChange?: (count: number | null | undefined) => void,
@@ -1298,7 +1299,7 @@ function buildPropertyWidthOverwrite(key: string, width: number): PartialCollect
1298
1299
  const [parentKey, ...childKey] = key.split(".");
1299
1300
  return { properties: { [parentKey]: buildPropertyWidthOverwrite(childKey.join("."), width) } } as PartialCollectionConfig;
1300
1301
  }
1301
- return { properties: { [key]: { ui: { columnWidth: width } } } } as PartialCollectionConfig;
1302
+ return { properties: { [key]: { admin: { columnWidth: width } } } } as PartialCollectionConfig;
1302
1303
  }
1303
1304
 
1304
1305
  function EntityIdHeaderWidget({
@@ -1307,7 +1308,7 @@ function EntityIdHeaderWidget({
1307
1308
  idPath,
1308
1309
  openEntityMode
1309
1310
  }: {
1310
- collection: CollectionConfig,
1311
+ collection: AdminCollection,
1311
1312
  path: string,
1312
1313
  idPath: string,
1313
1314
  /**
@@ -1,8 +1,8 @@
1
1
  import type { Properties } from "@rebasepro/types";
2
- import type { CollectionConfig } from "@rebasepro/types";
2
+
3
3
  import React, { useState, useCallback } from "react";
4
4
  import { useAuthController, useLargeLayout, useTranslation, useSlot } from "@rebasepro/app";
5
- import { CollectionActionsProps, EntityTableController, SelectionController } from "@rebasepro/types";
5
+ import { CollectionActionsProps, EntityTableController, SelectionController, AdminCollection } from "@rebasepro/admin-types";
6
6
  import { ErrorBoundary, iconSize } from "@rebasepro/ui";
7
7
  import { ArrowLeftIcon, Badge, Button, cls, FilterIcon, IconButton, Tooltip } from "@rebasepro/ui";
8
8
  import { ClearFilterSortButton } from "../ClearFilterSortButton";
@@ -15,7 +15,7 @@ import { useCMSContext } from "../../hooks/useCMSContext";
15
15
  import { withViewMode } from "../../util/view_mode";
16
16
 
17
17
  export type CollectionViewStartActionsProps<M extends Record<string, unknown>> = {
18
- collection: CollectionConfig<M>;
18
+ collection: AdminCollection<M>;
19
19
  path: string;
20
20
  relativePath: string;
21
21
  parentCollectionSlugs: string[], parentEntityIds: string[];
@@ -1,6 +1,7 @@
1
- import type { CollectionConfig } from "@rebasepro/types";
1
+
2
2
  import React, { useMemo } from "react";
3
- import { CollectionSize, Entity } from "@rebasepro/types";
3
+ import { Entity } from "@rebasepro/types";
4
+ import { CollectionSize, AdminCollection } from "@rebasepro/admin-types";
4
5
  import {
5
6
  Card,
6
7
  Checkbox,
@@ -19,7 +20,7 @@ import { useCollectionSlotKeys, resolveEntitySlots } from "./usePreviewSlots";
19
20
 
20
21
  export type EntityCardBindingProps<M extends Record<string, unknown> = Record<string, unknown>> = {
21
22
  entity: Entity<M>;
22
- collection: CollectionConfig<M>;
23
+ collection: AdminCollection<M>;
23
24
  onClick?: (entity: Entity<M>) => void;
24
25
  selected?: boolean;
25
26
  highlighted?: boolean;
@@ -50,7 +51,7 @@ export function EntityCardBinding<M extends Record<string, unknown> = Record<str
50
51
  const customizationController = useCustomizationController();
51
52
 
52
53
  const slotKeys = useCollectionSlotKeys(
53
- collection as CollectionConfig<Record<string, unknown>>,
54
+ collection as AdminCollection<Record<string, unknown>>,
54
55
  authController,
55
56
  customizationController.propertyConfigs
56
57
  );
@@ -58,7 +59,7 @@ export function EntityCardBinding<M extends Record<string, unknown> = Record<str
58
59
  const slots = useMemo(
59
60
  () => resolveEntitySlots(
60
61
  entity as Entity<Record<string, unknown>>,
61
- collection as CollectionConfig<Record<string, unknown>>,
62
+ collection as AdminCollection<Record<string, unknown>>,
62
63
  slotKeys
63
64
  ),
64
65
  [entity, collection, slotKeys]
@@ -1,6 +1,7 @@
1
1
  import React, { useCallback, useMemo } from "react";
2
2
  import { CheckIcon, ChevronsUpDownIcon, cls, FilterChip, Menu, MenuItem, Tooltip } from "@rebasepro/ui";
3
- import type { EntityTableController, FilterValues, FilterPreset } from "@rebasepro/types";
3
+ import type { FilterValues, FilterPreset } from "@rebasepro/types";
4
+ import type { EntityTableController } from "@rebasepro/admin-types";
4
5
 
5
6
  export interface FilterPresetsButtonProps<M extends Record<string, unknown>> {
6
7
  filterPresets: FilterPreset<Extract<keyof M, string> | (string & {})>[];
@@ -4,7 +4,7 @@ import React, { useCallback, useMemo, useState } from "react";
4
4
  import { FilterValues, WhereFilterOp } from "@rebasepro/types";
5
5
  import { Button, cls, defaultBorderMixin, Dialog, DialogActions, DialogContent, DialogTitle, Typography } from "@rebasepro/ui";
6
6
  import { FilterIcon, VirtualTableWhereFilterOp } from "@rebasepro/ui";
7
- import { resolveFilterOperators } from "@rebasepro/common";
7
+ import { resolveFilterOperators } from "@rebasepro/app";
8
8
  import { useCollectionScope, useTranslation } from "@rebasepro/app";
9
9
  import { FilterFieldBinding } from "../SelectableTable/filters/FilterFieldBinding";
10
10
 
@@ -77,7 +77,7 @@ export function FiltersDialog({
77
77
  // A property is filterable when it has a custom filter field, or
78
78
  // when at least one operator survives the engine ∩ type ∩
79
79
  // property-narrowing resolution.
80
- if (baseProperty.ui?.Filter) return true;
80
+ if (baseProperty.admin?.Filter) return true;
81
81
  return resolveFilterOperators({ property: baseProperty, isArray, engine }).length > 0;
82
82
  });
83
83
  }, [properties, fixedFilter, engine]);
@@ -1,6 +1,7 @@
1
- import type { CollectionConfig } from "@rebasepro/types";
1
+
2
2
  import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
- import { CollectionSize, Entity, EntityTableController, SelectionController } from "@rebasepro/types";
3
+ import { Entity } from "@rebasepro/types";
4
+ import { CollectionSize, EntityTableController, SelectionController, AdminCollection } from "@rebasepro/admin-types";
4
5
  import { EditViewBinding } from "../EditViewBinding";
5
6
  import { DetailViewBinding } from "../DetailViewBinding";
6
7
  import {
@@ -16,7 +17,7 @@ import { ErrorBoundary } from "@rebasepro/ui";
16
17
  import { withViewMode } from "../../util/view_mode";
17
18
 
18
19
  export type SplitListViewProps<M extends Record<string, unknown> = Record<string, unknown>> = {
19
- collection: CollectionConfig<M>;
20
+ collection: AdminCollection<M>;
20
21
  tableController: EntityTableController<M>;
21
22
  onEntityClick?: (entity: Entity<M>) => void;
22
23
  onNewClick?: () => void;
@@ -358,7 +359,7 @@ export function SplitListView<M extends Record<string, unknown> = Record<string,
358
359
  ? <DetailViewBinding
359
360
  key={String(renderedEntityId)}
360
361
  path={path}
361
- collection={collection as CollectionConfig<Record<string, unknown>>}
362
+ collection={collection as AdminCollection<Record<string, unknown>>}
362
363
  entityId={renderedEntityId}
363
364
  parentCollectionSlugs={usedParentCollectionIds}
364
365
  parentEntityIds={usedParentEntityIds}
@@ -379,7 +380,7 @@ export function SplitListView<M extends Record<string, unknown> = Record<string,
379
380
  : <EditViewBinding
380
381
  key={String(renderedEntityId)}
381
382
  path={path}
382
- collection={collection as CollectionConfig<Record<string, unknown>>}
383
+ collection={collection as AdminCollection<Record<string, unknown>>}
383
384
  entityId={renderedEntityId}
384
385
  parentCollectionSlugs={usedParentCollectionIds}
385
386
  parentEntityIds={usedParentEntityIds}
@@ -1,6 +1,6 @@
1
1
 
2
2
  import React, { useMemo } from "react";
3
- import { CollectionSize, ViewMode } from "@rebasepro/types";
3
+ import { CollectionSize, ViewMode } from "@rebasepro/admin-types";
4
4
  import {
5
5
  Button,
6
6
  ColumnsIcon,
@@ -1,11 +1,12 @@
1
1
  import { useCallback, useMemo } from "react";
2
2
  import { setIn } from "@rebasepro/forms";
3
- import { CollectionConfig, RebaseData, RebaseContext } from "@rebasepro/types";
3
+ import { RebaseData } from "@rebasepro/types";
4
+ import { RebaseContext, AdminCollection } from "@rebasepro/admin-types";
4
5
  import { OnCellValueChange, saveEntityWithCallbacks, SaveEntityWithCallbacksProps, UniqueFieldValidator } from "@rebasepro/app";
5
6
 
6
7
  export interface UseCollectionInlineEditorParams<M extends Record<string, unknown>> {
7
8
  path: string;
8
- collection: CollectionConfig<M>;
9
+ collection: AdminCollection<M>;
9
10
  dataClient: RebaseData;
10
11
  context: RebaseContext;
11
12
  }
@@ -1,13 +1,14 @@
1
1
  import { useCallback, useMemo } from "react";
2
2
  import { setIn } from "@rebasepro/forms";
3
- import { CollectionConfig, RebaseData, RebaseContext, AnalyticsController, Entity } from "@rebasepro/types";
3
+ import { RebaseData, Entity } from "@rebasepro/types";
4
+ import { RebaseContext, AnalyticsController, AdminCollection } from "@rebasepro/admin-types";
4
5
  import { saveEntityWithCallbacks, SaveEntityWithCallbacksProps } from "@rebasepro/app";
5
6
  import { BoardItem } from "@rebasepro/ui";
6
7
  import { BoardDataController } from "../useBoardDataController";
7
8
  import { generateKeyBetween } from "fractional-indexing";
8
9
 
9
10
  export interface UseKanbanDragAndDropParams<M extends Record<string, unknown>> {
10
- collection: CollectionConfig<M>;
11
+ collection: AdminCollection<M>;
11
12
  fullPath: string;
12
13
  columnProperty: string;
13
14
  orderProperty?: string;
@@ -1,7 +1,8 @@
1
- import type { CollectionConfig } from "@rebasepro/types";
1
+
2
2
  import { Entity, FilterValues } from "@rebasepro/types";
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import { getRelationIncludeParams, useData, useRebaseContext } from "@rebasepro/app";
5
+ import type { AdminCollection } from "@rebasepro/admin-types";
5
6
 
6
7
  const DEFAULT_PAGE_SIZE = 20;
7
8
 
@@ -67,7 +68,7 @@ export interface UseBoardDataControllerProps<M extends Record<string, unknown> =
67
68
  /** Full path to the collection */
68
69
  fullPath: string;
69
70
  /** The entity collection configuration */
70
- collection: CollectionConfig<M>;
71
+ collection: AdminCollection<M>;
71
72
  /** Property key used for column assignment */
72
73
  columnProperty: string;
73
74
  /** Array of column values (enum values from columnProperty) */
@@ -1,14 +1,15 @@
1
1
  import { useMemo } from "react";
2
- import type { CollectionConfig, Property, RelationProperty } from "@rebasepro/types";
3
- import type { Entity, PropertyConfig, EntityRelation } from "@rebasepro/types";
4
- import { getEntityImagePreviewPropertyKey } from "@rebasepro/common";
2
+ import type { Property, RelationProperty } from "@rebasepro/types";
3
+ import type { Entity, EntityRelation } from "@rebasepro/types";
4
+ import type { PropertyConfig, AdminCollection } from "@rebasepro/admin-types";
5
+ import { getEntityImagePreviewPropertyKey } from "@rebasepro/app";
6
+ import { getTitlePropertyCandidates, looksLikeIdentifierValue } from "@rebasepro/app";
5
7
  import { getEntityFromCache } from "@rebasepro/app";
6
- import { getEntityTitlePropertyKey, getEntityPreviewKeys } from "../../util/previews";
8
+ import { getEntityPreviewKeys } from "../../util/previews";
7
9
  import { getValueInPath } from "@rebasepro/utils";
8
- import type { AuthController } from "@rebasepro/types";
10
+ import type { AuthController } from "@rebasepro/admin-types";
9
11
  import { ChipColorScheme, CHIP_COLORS } from "@rebasepro/ui";
10
12
 
11
-
12
13
  // ── Slot types ────────────────────────────────────────────────────────
13
14
 
14
15
  /**
@@ -90,6 +91,8 @@ export interface EntityPreviewSlots {
90
91
  */
91
92
  export interface CollectionSlotKeys {
92
93
  titleKey: string | undefined;
94
+ /** Every property that could act as the title, best first (see `getTitlePropertyCandidates`) */
95
+ titleKeyCandidates: string[];
93
96
  imageKey: string | undefined;
94
97
  subtitleKey: string | undefined;
95
98
  relationKeys: string[];
@@ -102,11 +105,12 @@ export interface CollectionSlotKeys {
102
105
  * Pure function — call inside `useMemo`.
103
106
  */
104
107
  export function resolveCollectionSlotKeys(
105
- collection: CollectionConfig<Record<string, unknown>>,
108
+ collection: AdminCollection<Record<string, unknown>>,
106
109
  authController: AuthController,
107
110
  propertyConfigs: Record<string, PropertyConfig>
108
111
  ): CollectionSlotKeys {
109
- const titleKey = getEntityTitlePropertyKey(collection, propertyConfigs);
112
+ const titleKeyCandidates = getTitlePropertyCandidates(collection);
113
+ const titleKey = titleKeyCandidates[0];
110
114
  const imageKey = getEntityImagePreviewPropertyKey(collection);
111
115
 
112
116
  // Status: first string-enum that isn't the title
@@ -194,13 +198,14 @@ export function resolveCollectionSlotKeys(
194
198
  : [...previewKeys].sort((a, b) => {
195
199
  const propA = collection.properties[a] as Property | undefined;
196
200
  const propB = collection.properties[b] as Property | undefined;
197
- const scoreA = propA?.type === "string" ? (propA.ui?.multiline ? 2 : 1) : 0;
198
- const scoreB = propB?.type === "string" ? (propB.ui?.multiline ? 2 : 1) : 0;
201
+ const scoreA = propA?.type === "string" ? (propA.admin?.multiline ? 2 : 1) : 0;
202
+ const scoreB = propB?.type === "string" ? (propB.admin?.multiline ? 2 : 1) : 0;
199
203
  return scoreB - scoreA;
200
204
  });
201
205
  const subtitleKey = sortedPreviewKeys.length > 0 ? sortedPreviewKeys[0] : undefined;
202
206
 
203
207
  return { titleKey,
208
+ titleKeyCandidates,
204
209
  imageKey,
205
210
  subtitleKey,
206
211
  relationKeys,
@@ -216,7 +221,7 @@ dateKey };
216
221
  * and value is the first element (for arrays) or the raw value.
217
222
  */
218
223
  function resolveImageSlot(
219
- collection: CollectionConfig<Record<string, unknown>>,
224
+ collection: AdminCollection<Record<string, unknown>>,
220
225
  imageKey: string,
221
226
  entity: Entity<Record<string, unknown>>
222
227
  ): PreviewSlot | undefined {
@@ -242,6 +247,30 @@ function resolveImageSlot(
242
247
  };
243
248
  }
244
249
 
250
+ // ── Title resolution (entity-level) ───────────────────────────────────
251
+
252
+ /**
253
+ * Walk the collection's ranked title candidates and return the first one that
254
+ * holds something a person can read for this entity. Candidates are already
255
+ * ordered and free of identifier properties; this only rejects values —
256
+ * empties, and strings that turn out to be an id at runtime.
257
+ */
258
+ function resolveEntityTitleKey(
259
+ entity: Entity<Record<string, unknown>>,
260
+ candidates: string[]
261
+ ): string | undefined {
262
+ for (const key of candidates) {
263
+ const value = getValueInPath(entity.values, key);
264
+ if (value === undefined || value === null || value === "") continue;
265
+ if (typeof value === "string") {
266
+ if (looksLikeIdentifierValue(value)) continue;
267
+ if (value === String(entity.id)) continue;
268
+ }
269
+ return key;
270
+ }
271
+ return candidates[0];
272
+ }
273
+
245
274
  // ── Date formatting ───────────────────────────────────────────────────
246
275
 
247
276
  function formatDateValue(value: unknown): string {
@@ -277,7 +306,7 @@ function formatDateValue(value: unknown): string {
277
306
  * `resolveEntitySlots` for each entity row.
278
307
  */
279
308
  export function useCollectionSlotKeys(
280
- collection: CollectionConfig<Record<string, unknown>>,
309
+ collection: AdminCollection<Record<string, unknown>>,
281
310
  authController: AuthController,
282
311
  propertyConfigs: Record<string, PropertyConfig>
283
312
  ): CollectionSlotKeys {
@@ -296,27 +325,30 @@ export function useCollectionSlotKeys(
296
325
  */
297
326
  export function resolveEntitySlots(
298
327
  entity: Entity<Record<string, unknown>>,
299
- collection: CollectionConfig<Record<string, unknown>>,
328
+ collection: AdminCollection<Record<string, unknown>>,
300
329
  slotKeys: CollectionSlotKeys
301
330
  ): EntityPreviewSlots {
302
- const { titleKey, imageKey, subtitleKey, relationKeys, statusKey, dateKey } = slotKeys;
331
+ const { titleKey, titleKeyCandidates, imageKey, subtitleKey, relationKeys, statusKey, dateKey } = slotKeys;
303
332
 
304
333
  // Image
305
334
  const image = imageKey ? resolveImageSlot(collection, imageKey, entity) : undefined;
306
335
 
307
- // Title
336
+ // Title — the best-ranked candidate that carries a readable value for THIS
337
+ // entity, so a row whose name is empty (or whose column happens to hold a
338
+ // UUID) falls through to the next candidate instead of showing an id.
339
+ const resolvedTitleKey = resolveEntityTitleKey(entity, titleKeyCandidates ?? (titleKey ? [titleKey] : []));
308
340
  let title: PreviewSlot | undefined;
309
- if (titleKey) {
310
- const prop = collection.properties[titleKey] as Property | undefined;
311
- const val = getValueInPath(entity.values, titleKey);
341
+ if (resolvedTitleKey) {
342
+ const prop = collection.properties[resolvedTitleKey] as Property | undefined;
343
+ const val = getValueInPath(entity.values, resolvedTitleKey);
312
344
  if (prop) title = { property: prop,
313
- propertyKey: titleKey,
345
+ propertyKey: resolvedTitleKey,
314
346
  value: val };
315
347
  }
316
348
 
317
349
  // Subtitle
318
350
  let subtitle: PreviewSlot | undefined;
319
- if (subtitleKey) {
351
+ if (subtitleKey && subtitleKey !== resolvedTitleKey) {
320
352
  const prop = collection.properties[subtitleKey] as Property | undefined;
321
353
  const val = getValueInPath(entity.values, subtitleKey);
322
354
  if (prop && val !== undefined && val !== null && val !== "") {
@@ -441,11 +473,11 @@ function resolveRelationDisplayName(
441
473
  const data = "data" in relation ? (relation as EntityRelation).data : undefined;
442
474
 
443
475
  // Resolve target collection from either `prop.relation.target()` or `prop.target()` (inline API)
444
- let targetCollection: CollectionConfig | undefined;
476
+ let targetCollection: AdminCollection | undefined;
445
477
  try {
446
478
  const resolved = prop.relation?.target?.() ?? (typeof prop.target === "function" ? prop.target() : undefined);
447
479
  if (resolved && typeof resolved === "object") {
448
- targetCollection = resolved as CollectionConfig;
480
+ targetCollection = resolved as AdminCollection;
449
481
  }
450
482
  } catch {
451
483
  // Target collection may not be resolvable
@@ -461,14 +493,14 @@ function resolveRelationDisplayName(
461
493
 
462
494
  // Helper to check if a property is hidden/internal
463
495
  const isHiddenProp = (p: Property): boolean => {
464
- if (p.ui?.hideFromCollection) return true;
465
- if (typeof p.ui?.disabled === "object" && p.ui.disabled.hidden) return true;
496
+ if (p.admin?.hideFromCollection) return true;
497
+ if (typeof p.admin?.disabled === "object" && p.admin.disabled.hidden) return true;
466
498
  return false;
467
499
  };
468
500
 
469
501
  // Helper to check if a property is a visible, non-id string
470
502
  const isDisplayCandidate = (p: Property): boolean => {
471
- return p.type === "string" && !p.ui?.multiline && !p.ui?.markdown && !p.storage
503
+ return p.type === "string" && !p.admin?.multiline && !p.admin?.markdown && !p.storage
472
504
  && !("isId" in p && p.isId) && !isHiddenProp(p);
473
505
  };
474
506
 
@@ -1,5 +1,6 @@
1
1
  import { useCallback, useMemo, useRef, useState } from "react";
2
- import { Entity, SelectionController } from "@rebasepro/types";
2
+ import { Entity } from "@rebasepro/types";
3
+ import { SelectionController } from "@rebasepro/admin-types";
3
4
 
4
5
  export function useSelectionController<M extends Record<string, unknown> = Record<string, unknown>>(
5
6
  onSelectionChange?: (entity: Entity<M>, selected: boolean) => void
@@ -1,4 +1,4 @@
1
- import type { NavigationEntry, NavigationResult } from "@rebasepro/types";
1
+ import type { NavigationEntry, NavigationResult } from "@rebasepro/admin-types";
2
2
  import React, { useMemo } from "react";
3
3
 
4
4
  import { useCollapsedGroups, buildCollapsedDefaults, useLargeLayout, useAdminModeController, useAuthController, useModeController, useTranslation, useSlot, useRebaseContext, useAnalyticsController, useRebaseRegistry, useComponentOverride } from "@rebasepro/app";
@@ -7,7 +7,7 @@ import { useNavigationStateController } from "../hooks/navigation/contexts/Navig
7
7
 
8
8
 
9
9
  import { Link, useNavigate } from "react-router-dom";
10
- import { AnalyticsEvent } from "@rebasepro/types";
10
+ import { AnalyticsEvent } from "@rebasepro/admin-types";
11
11
  import {
12
12
  Avatar,
13
13
  ChevronsLeftIcon,
@@ -1,4 +1,4 @@
1
- import type { CollectionConfig } from "@rebasepro/types";
1
+
2
2
  import { Entity, CollectionCallbacks } from "@rebasepro/types";
3
3
  import React, { useCallback, useMemo, useState } from "react";
4
4
  import { Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle } from "@rebasepro/ui";
@@ -12,11 +12,12 @@ import {
12
12
  } from "@rebasepro/app";
13
13
  import { useCMSContext } from "../hooks";
14
14
  import { EntityViewBinding } from "./EntityViewBinding";
15
+ import type { AdminCollection } from "@rebasepro/admin-types";
15
16
 
16
17
  export interface DeleteEntityDialogProps<M extends Record<string, unknown>> {
17
18
  entityOrEntitiesToDelete?: Entity<M> | Entity<M>[],
18
19
  path: string,
19
- collection: CollectionConfig<M>
20
+ collection: AdminCollection<M>
20
21
  open: boolean;
21
22
  onClose: () => void;
22
23
  callbacks?: CollectionCallbacks<M>,
@@ -1,9 +1,10 @@
1
- import type { ComponentRef, CollectionConfig, EntityCustomViewParams, FormViewConfig } from "@rebasepro/types";
1
+ import type { ComponentRef } from "@rebasepro/types";
2
+ import type { EntityCustomViewParams, FormViewConfig, AdminCollection } from "@rebasepro/admin-types";
2
3
  import type { FormContext } from "../types/fields";
3
- import type { PluginFormActionProps } from "@rebasepro/types";
4
+ import type { PluginFormActionProps } from "@rebasepro/admin-types";
4
5
  import React, { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from "react";
5
6
  import { Entity, EntityStatus, getCollectionDataPath, Property } from "@rebasepro/types";
6
- import { PluginProviderStack, resolveComponentRef, useComponentOverride, CollectionScopeProvider } from "@rebasepro/app";
7
+ import { PluginProviderStack, resolveComponentRef, useComponentOverride, CollectionScopeProvider, getAdminSubcollections } from "@rebasepro/app";
7
8
 
8
9
  import { CollectionViewBinding } from "./CollectionViewBinding/CollectionViewBinding";
9
10
  import { EntityViewBinding } from "./EntityViewBinding";
@@ -27,11 +28,8 @@ import {
27
28
  } from "@rebasepro/ui";
28
29
  import { ErrorBoundary } from "@rebasepro/ui";
29
30
  import { ErrorView, createFormexStub, usePermissions, useTranslation, getIcon } from "@rebasepro/app";
30
- import {
31
- getSubcollections,
32
- removeInitialAndTrailingSlashes,
33
- resolveDefaultSelectedView
34
- } from "@rebasepro/common";
31
+
32
+ import { removeInitialAndTrailingSlashes, resolveDefaultSelectedView } from "@rebasepro/app";
35
33
  import { resolvedSelectedEntityView } from "../util/resolutions";
36
34
  import {
37
35
  useCustomizationController,
@@ -44,7 +42,8 @@ import { useUrlController } from "../hooks/navigation/contexts/UrlContext";
44
42
  import { useCollectionRegistryController } from "../hooks/navigation/contexts/CollectionRegistryContext";
45
43
  import { useNavigate } from "react-router-dom";
46
44
  import { getValueInPath } from "@rebasepro/utils";
47
- import { getEntityTitlePropertyKey, resolveTitleToString } from "../util/previews";
45
+ import { getEntityTitlePropertyKeyForEntity, isUserSelectProperty, resolveTitleToString } from "../util/previews";
46
+ import { getUserLabel, useResolvedUser } from "../hooks/useResolvedUsers";
48
47
  import { JsonPreviewBinding } from "../components/JsonPreviewBinding";
49
48
 
50
49
  const EntityHistoryView = lazy(() => import("../components/history").then(m => ({ default: m.EntityHistoryView })));
@@ -62,12 +61,12 @@ export type OnTabChangeParams<M extends Record<string, unknown>> = {
62
61
  path: string;
63
62
  entityId?: string | number;
64
63
  selectedTab?: string;
65
- collection: CollectionConfig<M>;
64
+ collection: AdminCollection<M>;
66
65
  };
67
66
 
68
67
  export interface DetailViewBindingProps<M extends Record<string, unknown> = Record<string, unknown>> {
69
68
  path: string;
70
- collection: CollectionConfig<M>;
69
+ collection: AdminCollection<M>;
71
70
  entityId: string | number;
72
71
  selectedTab?: string;
73
72
  parentCollectionSlugs: string[];
@@ -182,7 +181,7 @@ entityId }
182
181
  }
183
182
  }, [selectedTabProp, defaultSelectedView]);
184
183
 
185
- const subcollections = getSubcollections(collection).filter(c => !c.hideFromNavigation);
184
+ const subcollections = getAdminSubcollections(collection).filter(c => !c.hideFromNavigation);
186
185
  const subcollectionsCount = subcollections?.length ?? 0;
187
186
  const customViews = collection.entityViews ?? [];
188
187
  const customViewsCount = customViews?.length ?? 0;
@@ -263,15 +262,21 @@ entityId }
263
262
  const pluginActionsTop = useSlot("form.actions.top", formActionTopProps);
264
263
 
265
264
  // Resolve formView.Builder if provided
266
- const formViewConfig = (collection as CollectionConfig<M> & { formView?: FormViewConfig<M> }).formView;
265
+ const formViewConfig = (collection as AdminCollection<M> & { formView?: FormViewConfig<M> }).formView;
267
266
  const FormViewBuilder = formViewConfig?.Builder ? resolveComponentRef<EntityCustomViewParams>(formViewConfig.Builder as ComponentRef<EntityCustomViewParams>) : null;
268
267
 
269
268
  // Title resolution
270
- const titlePropertyKey = getEntityTitlePropertyKey(collection, customizationController.propertyConfigs);
269
+ const titlePropertyKey = getEntityTitlePropertyKeyForEntity(collection, usedEntity?.values, usedEntity?.id);
271
270
  const rawTitle = usedEntity?.values && titlePropertyKey ? getValueInPath(usedEntity.values, titlePropertyKey) : undefined;
272
- const title = rawTitle !== undefined && rawTitle !== null
273
- ? resolveTitleToString(rawTitle)
274
- : (collection.singularName ?? collection.name);
271
+ // A user picker stores an id: resolve it to the person, like a relation.
272
+ const titleUser = useResolvedUser(isUserSelectProperty(collection, titlePropertyKey) && typeof rawTitle === "string"
273
+ ? rawTitle
274
+ : undefined);
275
+ const title = titleUser
276
+ ? getUserLabel(titleUser)
277
+ : (rawTitle !== undefined && rawTitle !== null
278
+ ? resolveTitleToString(rawTitle)
279
+ : (collection.singularName ?? collection.name));
275
280
 
276
281
  // Non-action custom views
277
282
  const nonActionCustomViews = useMemo(() =>
@@ -638,7 +643,7 @@ entityId }
638
643
  return result;
639
644
  }
640
645
 
641
- function DetailViewSkeleton({ collection }: { collection: CollectionConfig<Record<string, unknown>> }) {
646
+ function DetailViewSkeleton({ collection }: { collection: AdminCollection<Record<string, unknown>> }) {
642
647
  return (
643
648
  <div className="flex-1 flex flex-row w-full overflow-y-auto justify-center">
644
649
  <div className="relative flex flex-row max-w-4xl lg:max-w-3xl xl:max-w-4xl 2xl:max-w-6xl w-full h-fit">
@@ -1,4 +1,4 @@
1
- import type { NavigationEntry } from "@rebasepro/types";
1
+ import type { NavigationEntry } from "@rebasepro/admin-types";
2
2
  import React from "react";
3
3
  import { ChevronDownIcon, cls, iconSize, Typography } from "@rebasepro/ui";
4
4