@rebasepro/admin 0.5.0 → 0.6.0

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 (337) hide show
  1. package/dist/CollectionEditorDialog-jA-PLh6N.js +3549 -0
  2. package/dist/CollectionEditorDialog-jA-PLh6N.js.map +1 -0
  3. package/dist/CollectionsStudioView-UKouBPOm.js +170 -0
  4. package/dist/CollectionsStudioView-UKouBPOm.js.map +1 -0
  5. package/dist/PropertyEditView-DEUddmg_.js +3660 -0
  6. package/dist/PropertyEditView-DEUddmg_.js.map +1 -0
  7. package/dist/collection_editor/ConfigControllerProvider.d.ts +2 -2
  8. package/dist/collection_editor/ui/AddKanbanColumnAction.d.ts +2 -1
  9. package/dist/collection_editor/ui/CollectionViewHeaderAction.d.ts +2 -1
  10. package/dist/collection_editor/ui/EditorCollectionAction.d.ts +1 -1
  11. package/dist/collection_editor/ui/EditorCollectionActionStart.d.ts +1 -1
  12. package/dist/collection_editor/ui/EditorEntityAction.d.ts +1 -1
  13. package/dist/collection_editor/ui/HomePageEditorCollectionAction.d.ts +1 -1
  14. package/dist/collection_editor/ui/KanbanSetupAction.d.ts +2 -1
  15. package/dist/collection_editor/ui/MissingReferenceWidget.d.ts +1 -1
  16. package/dist/collection_editor/ui/NewCollectionButton.d.ts +1 -1
  17. package/dist/collection_editor/ui/NewCollectionCard.d.ts +1 -1
  18. package/dist/collection_editor/ui/PropertyAddColumnComponent.d.ts +1 -1
  19. package/dist/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.d.ts +1 -1
  20. package/dist/collection_editor/ui/collection_editor/AIModifiedPathsContext.d.ts +1 -1
  21. package/dist/collection_editor/ui/collection_editor/CollectionDetailsForm.d.ts +2 -1
  22. package/dist/collection_editor/ui/collection_editor/CollectionEditorDialog.d.ts +2 -2
  23. package/dist/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.d.ts +2 -2
  24. package/dist/collection_editor/ui/collection_editor/CollectionJsonImportDialog.d.ts +2 -1
  25. package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +1 -1
  26. package/dist/collection_editor/ui/collection_editor/CollectionRLSTab.d.ts +2 -1
  27. package/dist/collection_editor/ui/collection_editor/CollectionRelationsTab.d.ts +2 -1
  28. package/dist/collection_editor/ui/collection_editor/CollectionStudioView.d.ts +2 -1
  29. package/dist/collection_editor/ui/collection_editor/CollectionYupValidation.d.ts +1 -9
  30. package/dist/collection_editor/ui/collection_editor/CollectionsStudioView.d.ts +2 -1
  31. package/dist/collection_editor/ui/collection_editor/DisplaySettingsForm.d.ts +2 -1
  32. package/dist/collection_editor/ui/collection_editor/EntityActionsEditTab.d.ts +2 -1
  33. package/dist/collection_editor/ui/collection_editor/EntityActionsSelectDialog.d.ts +2 -1
  34. package/dist/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.d.ts +2 -1
  35. package/dist/collection_editor/ui/collection_editor/EnumForm.d.ts +2 -1
  36. package/dist/collection_editor/ui/collection_editor/GeneralSettingsForm.d.ts +2 -1
  37. package/dist/collection_editor/ui/collection_editor/GetCodeDialog.d.ts +2 -1
  38. package/dist/collection_editor/ui/collection_editor/KanbanConfigSection.d.ts +2 -1
  39. package/dist/collection_editor/ui/collection_editor/LayoutModeSwitch.d.ts +1 -1
  40. package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +4 -4
  41. package/dist/collection_editor/ui/collection_editor/PropertyFieldPreview.d.ts +2 -2
  42. package/dist/collection_editor/ui/collection_editor/PropertyTree.d.ts +2 -2
  43. package/dist/collection_editor/ui/collection_editor/SubcollectionsEditTab.d.ts +2 -1
  44. package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +2 -1
  45. package/dist/collection_editor/ui/collection_editor/ViewModeSwitch.d.ts +1 -1
  46. package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.d.ts +1 -1
  47. package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.d.ts +3 -2
  48. package/dist/collection_editor/ui/collection_editor/properties/BlockPropertyField.d.ts +2 -1
  49. package/dist/collection_editor/ui/collection_editor/properties/BooleanPropertyField.d.ts +2 -1
  50. package/dist/collection_editor/ui/collection_editor/properties/DateTimePropertyField.d.ts +2 -1
  51. package/dist/collection_editor/ui/collection_editor/properties/EnumPropertyField.d.ts +2 -1
  52. package/dist/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.d.ts +2 -1
  53. package/dist/collection_editor/ui/collection_editor/properties/MapPropertyField.d.ts +2 -1
  54. package/dist/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.d.ts +2 -1
  55. package/dist/collection_editor/ui/collection_editor/properties/NumberPropertyField.d.ts +2 -1
  56. package/dist/collection_editor/ui/collection_editor/properties/ReferencePropertyField.d.ts +3 -2
  57. package/dist/collection_editor/ui/collection_editor/properties/RelationPropertyField.d.ts +2 -1
  58. package/dist/collection_editor/ui/collection_editor/properties/RepeatPropertyField.d.ts +2 -1
  59. package/dist/collection_editor/ui/collection_editor/properties/StoragePropertyField.d.ts +2 -1
  60. package/dist/collection_editor/ui/collection_editor/properties/StringPropertyField.d.ts +2 -1
  61. package/dist/collection_editor/ui/collection_editor/properties/UrlPropertyField.d.ts +2 -1
  62. package/dist/collection_editor/ui/collection_editor/properties/VectorPropertyField.d.ts +2 -1
  63. package/dist/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.d.ts +2 -1
  64. package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.d.ts +2 -1
  65. package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.d.ts +1 -1
  66. package/dist/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.d.ts +2 -1
  67. package/dist/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.d.ts +2 -1
  68. package/dist/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.d.ts +2 -1
  69. package/dist/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.d.ts +2 -1
  70. package/dist/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.d.ts +2 -1
  71. package/dist/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.d.ts +1 -1
  72. package/dist/collection_editor_ui.js +4 -11
  73. package/dist/components/ArrayContainer.d.ts +3 -3
  74. package/dist/components/ClearFilterSortButton.d.ts +1 -1
  75. package/dist/components/CollectionEditorDialogs.d.ts +2 -1
  76. package/dist/components/CollectionPanel.d.ts +2 -27
  77. package/dist/components/DefaultAppBar.d.ts +1 -1
  78. package/dist/components/DefaultDrawer.d.ts +4 -4
  79. package/dist/components/DeleteEntityDialog.d.ts +2 -1
  80. package/dist/components/DrawerNavigationGroup.d.ts +1 -1
  81. package/dist/components/DrawerNavigationItem.d.ts +1 -1
  82. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +1 -1
  83. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -1
  84. package/dist/components/EntityCollectionTable/fields/TableMultipleRelationField.d.ts +3 -3
  85. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -3
  86. package/dist/components/EntityCollectionTable/fields/TableRelationField.d.ts +3 -3
  87. package/dist/components/EntityCollectionTable/fields/TableRelationSelectorField.d.ts +2 -1
  88. package/dist/components/EntityCollectionTable/fields/TableStorageUpload.d.ts +2 -2
  89. package/dist/components/EntityCollectionTable/fields/VirtualTableDateField.d.ts +1 -1
  90. package/dist/components/EntityCollectionTable/fields/VirtualTableInput.d.ts +2 -1
  91. package/dist/components/EntityCollectionTable/fields/VirtualTableNumberInput.d.ts +2 -1
  92. package/dist/components/EntityCollectionTable/fields/VirtualTableSelect.d.ts +1 -1
  93. package/dist/components/EntityCollectionTable/fields/VirtualTableSwitch.d.ts +2 -1
  94. package/dist/components/EntityCollectionTable/fields/VirtualTableUserSelect.d.ts +1 -1
  95. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -1
  96. package/dist/components/EntityCollectionTable/internal/EntityTableCellActions.d.ts +1 -1
  97. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +4 -3
  98. package/dist/components/EntityCollectionView/Board.d.ts +2 -1
  99. package/dist/components/EntityCollectionView/BoardColumnTitle.d.ts +1 -1
  100. package/dist/components/EntityCollectionView/BoardSortableList.d.ts +1 -1
  101. package/dist/components/EntityCollectionView/EntityBoardCard.d.ts +1 -1
  102. package/dist/components/EntityCollectionView/EntityCard.d.ts +2 -1
  103. package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +1 -1
  104. package/dist/components/EntityCollectionView/EntityCollectionCardView.d.ts +1 -1
  105. package/dist/components/EntityCollectionView/EntityCollectionListView.d.ts +1 -1
  106. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +0 -24
  107. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +1 -1
  108. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +2 -1
  109. package/dist/components/EntityCollectionView/FilterPresetsButton.d.ts +2 -1
  110. package/dist/components/EntityCollectionView/FiltersDialog.d.ts +2 -1
  111. package/dist/components/EntityCollectionView/SplitListView.d.ts +1 -1
  112. package/dist/components/EntityCollectionView/ViewModeToggle.d.ts +2 -1
  113. package/dist/components/EntityDetailView.d.ts +1 -1
  114. package/dist/components/EntityEditView.d.ts +2 -2
  115. package/dist/components/EntityEditViewFormActions.d.ts +2 -1
  116. package/dist/components/EntityJsonPreview.d.ts +2 -1
  117. package/dist/components/EntityPreview.d.ts +3 -3
  118. package/dist/components/EntitySidePanel.d.ts +2 -1
  119. package/dist/components/EntityView.d.ts +2 -1
  120. package/dist/components/FieldCaption.d.ts +1 -1
  121. package/dist/components/HomePage/ContentHomePage.d.ts +1 -1
  122. package/dist/components/HomePage/FavouritesView.d.ts +1 -1
  123. package/dist/components/HomePage/HomePageDnD.d.ts +4 -4
  124. package/dist/components/HomePage/NavigationCard.d.ts +1 -1
  125. package/dist/components/HomePage/NavigationCardBinding.d.ts +2 -1
  126. package/dist/components/HomePage/NavigationGroup.d.ts +2 -2
  127. package/dist/components/HomePage/RenameGroupDialog.d.ts +2 -1
  128. package/dist/components/HomePage/SmallNavigationCard.d.ts +1 -1
  129. package/dist/components/PropertyCollectionView.d.ts +2 -1
  130. package/dist/components/PropertyIdCopyTooltip.d.ts +2 -2
  131. package/dist/components/RebaseAuthGate.d.ts +1 -1
  132. package/dist/components/RebaseLayout.d.ts +1 -1
  133. package/dist/components/RebaseNavigation.d.ts +1 -1
  134. package/dist/components/RebaseRouteDefs.d.ts +1 -1
  135. package/dist/components/RebaseShell.d.ts +1 -1
  136. package/dist/components/ReferenceTable/EntitySelectionTable.d.ts +1 -1
  137. package/dist/components/ReferenceWidget.d.ts +2 -1
  138. package/dist/components/SearchIconsView.d.ts +2 -1
  139. package/dist/components/SelectableTable/SelectableTable.d.ts +2 -2
  140. package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +2 -1
  141. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +2 -1
  142. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  143. package/dist/components/SelectableTable/filters/RelationFilterField.d.ts +2 -1
  144. package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +2 -1
  145. package/dist/components/SideDialogs.d.ts +1 -1
  146. package/dist/components/SideEntityProvider.d.ts +1 -1
  147. package/dist/components/admin/CreationResultDialog.d.ts +2 -1
  148. package/dist/components/app/AppBar.d.ts +1 -1
  149. package/dist/components/app/Drawer.d.ts +1 -1
  150. package/dist/components/common/default_entity_actions.d.ts +2 -1
  151. package/dist/components/history/EntityHistoryEntry.d.ts +1 -1
  152. package/dist/components/history/EntityHistoryView.d.ts +1 -1
  153. package/dist/components/history/LastEditedByFormAction.d.ts +2 -1
  154. package/dist/components/history/LastEditedByIndicator.d.ts +2 -1
  155. package/dist/components/history/UserChip.d.ts +1 -1
  156. package/dist/data_export/export/BasicExportAction.d.ts +2 -1
  157. package/dist/data_export/export/ExportCollectionAction.d.ts +1 -1
  158. package/dist/data_import/components/DataNewPropertiesMapping.d.ts +1 -1
  159. package/dist/data_import/components/ImportFileUpload.d.ts +1 -1
  160. package/dist/data_import/components/ImportNewPropertyFieldPreview.d.ts +2 -1
  161. package/dist/data_import/components/ImportSaveInProgress.d.ts +1 -1
  162. package/dist/data_import/import/ImportCollectionAction.d.ts +4 -3
  163. package/dist/editor/components/SlashCommandMenu.d.ts +2 -1
  164. package/dist/editor/editor.d.ts +1 -1
  165. package/dist/editor/selectors/color-selector.d.ts +1 -1
  166. package/dist/editor/selectors/link-selector.d.ts +1 -1
  167. package/dist/editor/selectors/node-selector.d.ts +1 -1
  168. package/dist/editor/selectors/text-buttons.d.ts +1 -1
  169. package/dist/editor.js +2621 -3574
  170. package/dist/editor.js.map +1 -1
  171. package/dist/form/EntityForm.d.ts +2 -1
  172. package/dist/form/EntityFormActions.d.ts +2 -1
  173. package/dist/form/components/FieldHelperText.d.ts +1 -1
  174. package/dist/form/components/FormEntry.d.ts +1 -1
  175. package/dist/form/components/FormLayout.d.ts +1 -1
  176. package/dist/form/components/LabelWithIconAndTooltip.d.ts +1 -1
  177. package/dist/form/components/LocalChangesMenu.d.ts +2 -1
  178. package/dist/form/components/StorageItemPreview.d.ts +2 -1
  179. package/dist/form/components/StorageUploadProgress.d.ts +2 -1
  180. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +2 -1
  181. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +2 -1
  182. package/dist/form/field_bindings/BlockFieldBinding.d.ts +2 -1
  183. package/dist/form/field_bindings/DateTimeFieldBinding.d.ts +2 -1
  184. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +2 -1
  185. package/dist/form/field_bindings/MapFieldBinding.d.ts +2 -1
  186. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +2 -1
  187. package/dist/form/field_bindings/MultiSelectFieldBinding.d.ts +2 -1
  188. package/dist/form/field_bindings/MultipleRelationFieldBinding.d.ts +2 -1
  189. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +2 -1
  190. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +2 -1
  191. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -1
  192. package/dist/form/field_bindings/RelationFieldBinding.d.ts +2 -1
  193. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +2 -1
  194. package/dist/form/field_bindings/SelectFieldBinding.d.ts +2 -1
  195. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -2
  196. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +2 -1
  197. package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -1
  198. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +2 -1
  199. package/dist/form/field_bindings/VectorFieldBinding.d.ts +2 -1
  200. package/dist/history-BL49TIDb.js +311 -0
  201. package/dist/history-BL49TIDb.js.map +1 -0
  202. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +0 -2
  203. package/dist/hooks/navigation/useNavigationResolution.d.ts +5 -6
  204. package/dist/hooks/navigation/useResolvedCollections.d.ts +0 -2
  205. package/dist/hooks/useBreadcrumbsController.d.ts +2 -32
  206. package/dist/index.js +2 -3393
  207. package/dist/markdown-CklalUUk.js +526 -0
  208. package/dist/markdown-CklalUUk.js.map +1 -0
  209. package/dist/preview/components/ArrayEnumPreview.d.ts +2 -1
  210. package/dist/preview/components/EmptyValue.d.ts +2 -1
  211. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  212. package/dist/preview/components/ImagePreview.d.ts +2 -1
  213. package/dist/preview/components/ReferencePreview.d.ts +2 -1
  214. package/dist/preview/components/RelationPreview.d.ts +2 -1
  215. package/dist/preview/components/StorageThumbnail.d.ts +1 -1
  216. package/dist/preview/components/UserPreview.d.ts +6 -3
  217. package/dist/preview/property_previews/ArrayOfMapsPreview.d.ts +2 -1
  218. package/dist/preview/property_previews/ArrayOfReferencesPreview.d.ts +1 -1
  219. package/dist/preview/property_previews/ArrayOfRelationsPreview.d.ts +1 -1
  220. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +2 -1
  221. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +2 -1
  222. package/dist/preview/property_previews/ArrayOneOfPreview.d.ts +2 -1
  223. package/dist/preview/property_previews/ArrayPropertyEnumPreview.d.ts +1 -1
  224. package/dist/preview/property_previews/ArrayPropertyPreview.d.ts +2 -1
  225. package/dist/preview/property_previews/MapPropertyPreview.d.ts +3 -2
  226. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +5 -4
  227. package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
  228. package/dist/routes/RebaseRoute.d.ts +1 -1
  229. package/dist/src-BJ8fkM8y.js +24010 -0
  230. package/dist/src-BJ8fkM8y.js.map +1 -0
  231. package/dist/types/components/PropertyPreviewProps.d.ts +4 -0
  232. package/dist/types/components/formex.d.ts +1 -40
  233. package/dist/types/fields.d.ts +9 -1
  234. package/dist/util/navigation_utils.d.ts +2 -1
  235. package/dist/util/previews.d.ts +5 -0
  236. package/dist/util/property_utils.d.ts +1 -1
  237. package/package.json +29 -26
  238. package/src/collection_editor/ConfigControllerProvider.tsx +10 -7
  239. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +2 -1
  240. package/src/collection_editor/ui/EditorCollectionAction.tsx +2 -1
  241. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +2 -1
  242. package/src/collection_editor/ui/EditorEntityAction.tsx +2 -1
  243. package/src/collection_editor/ui/KanbanSetupAction.tsx +2 -1
  244. package/src/collection_editor/ui/MissingReferenceWidget.tsx +2 -1
  245. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +2 -1
  246. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +2 -3
  247. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +0 -1
  248. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +8 -4
  249. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +2 -1
  250. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +1 -1
  251. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +5 -2
  252. package/src/collection_editor/useLocalCollectionsConfigController.tsx +7 -2
  253. package/src/collection_editor/validateCollectionJson.ts +2 -2
  254. package/src/components/CollectionPanel.tsx +51 -25
  255. package/src/components/DefaultAppBar.tsx +1 -2
  256. package/src/components/DefaultDrawer.tsx +3 -2
  257. package/src/components/DrawerNavigationGroup.tsx +3 -2
  258. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +30 -9
  259. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +1 -1
  260. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +1 -0
  261. package/src/components/EntityCollectionView/Board.tsx +10 -8
  262. package/src/components/EntityCollectionView/BoardSortableList.tsx +2 -2
  263. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +4 -2
  264. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +14 -4
  265. package/src/components/EntityCollectionView/EntityCollectionListView.tsx +48 -26
  266. package/src/components/EntityCollectionView/EntityCollectionView.tsx +146 -73
  267. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +2 -1
  268. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +3 -2
  269. package/src/components/EntityCollectionView/FilterPresetsButton.tsx +4 -2
  270. package/src/components/EntityCollectionView/ViewModeToggle.tsx +0 -1
  271. package/src/components/EntityCollectionView/useBoardDataController.tsx +17 -15
  272. package/src/components/EntityCollectionView/useEntityPreviewSlots.ts +29 -19
  273. package/src/components/EntityDetailView.tsx +66 -30
  274. package/src/components/EntityEditView.tsx +70 -32
  275. package/src/components/EntitySidePanel.tsx +6 -3
  276. package/src/components/HomePage/ContentHomePage.tsx +3 -3
  277. package/src/components/HomePage/NavigationCard.tsx +5 -5
  278. package/src/components/HomePage/NavigationCardBinding.tsx +1 -1
  279. package/src/components/RebaseLayout.tsx +5 -2
  280. package/src/components/RebaseNavigation.tsx +1 -4
  281. package/src/components/RebaseRouteDefs.tsx +5 -3
  282. package/src/components/SearchIconsView.tsx +1 -1
  283. package/src/components/SelectableTable/SelectableTable.tsx +2 -3
  284. package/src/components/SelectableTable/SelectionStore.ts +9 -3
  285. package/src/components/UserSelector.tsx +92 -2
  286. package/src/components/common/default_entity_actions.tsx +23 -6
  287. package/src/components/field_configs.tsx +6 -3
  288. package/src/editor/editor.tsx +1 -1
  289. package/src/editor/extensions/Image/index.ts +2 -2
  290. package/src/editor/extensions/Image.ts +2 -2
  291. package/src/editor/extensions/clipboard.ts +2 -2
  292. package/src/editor/markdown-it-plugins.d.ts +24 -0
  293. package/src/editor/markdown.ts +2 -3
  294. package/src/form/EntityForm.tsx +21 -15
  295. package/src/form/field_bindings/MapFieldBinding.tsx +3 -3
  296. package/src/form/field_bindings/VectorFieldBinding.tsx +3 -3
  297. package/src/form/validation.ts +17 -15
  298. package/src/hooks/navigation/useBuildNavigationStateController.tsx +3 -6
  299. package/src/hooks/navigation/useNavigationResolution.ts +143 -19
  300. package/src/hooks/navigation/useResolvedCollections.ts +4 -6
  301. package/src/hooks/useBreadcrumbsController.tsx +2 -34
  302. package/src/hooks/useBuildSideEntityController.tsx +25 -3
  303. package/src/preview/PropertyPreview.tsx +6 -2
  304. package/src/preview/components/ReferencePreview.tsx +64 -13
  305. package/src/preview/components/RelationPreview.tsx +101 -13
  306. package/src/preview/components/UserPreview.tsx +5 -14
  307. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +1 -1
  308. package/src/routes/RebaseRoute.tsx +5 -4
  309. package/src/types/components/PropertyPreviewProps.tsx +5 -0
  310. package/src/types/components/formex.tsx +1 -45
  311. package/src/types/fields.tsx +10 -1
  312. package/src/util/navigation_utils.ts +14 -4
  313. package/src/util/previews.ts +101 -4
  314. package/dist/CollectionEditorDialog-C8E440oK.js +0 -4574
  315. package/dist/CollectionEditorDialog-C8E440oK.js.map +0 -1
  316. package/dist/CollectionsStudioView-Brr_b06v.js +0 -217
  317. package/dist/CollectionsStudioView-Brr_b06v.js.map +0 -1
  318. package/dist/ExportCollectionAction-D3TTYXrq.js +0 -446
  319. package/dist/ExportCollectionAction-D3TTYXrq.js.map +0 -1
  320. package/dist/ImportCollectionAction-Dn7lya6E.js +0 -685
  321. package/dist/ImportCollectionAction-Dn7lya6E.js.map +0 -1
  322. package/dist/PropertyEditView-ChBleIbN.js +0 -8197
  323. package/dist/PropertyEditView-ChBleIbN.js.map +0 -1
  324. package/dist/collection_editor_ui.js.map +0 -1
  325. package/dist/index-D3S9x_RP.js +0 -462
  326. package/dist/index-D3S9x_RP.js.map +0 -1
  327. package/dist/index-D9RNzm01.js +0 -12
  328. package/dist/index-D9RNzm01.js.map +0 -1
  329. package/dist/index-DrrT332R.js +0 -8
  330. package/dist/index-DrrT332R.js.map +0 -1
  331. package/dist/index.js.map +0 -1
  332. package/dist/markdown-DD2JDU1X.js +0 -618
  333. package/dist/markdown-DD2JDU1X.js.map +0 -1
  334. package/dist/useEntityHistory-UVsSclfZ.js +0 -123
  335. package/dist/useEntityHistory-UVsSclfZ.js.map +0 -1
  336. package/dist/util-COYYD8zr.js +0 -30474
  337. package/dist/util-COYYD8zr.js.map +0 -1
@@ -3,10 +3,12 @@ import * as React from "react";
3
3
 
4
4
  import { Entity, EntityRelation } from "@rebasepro/types";
5
5
  import type { PreviewSize } from "../../types/components/PropertyPreviewProps";
6
- import { useCustomizationController, useEntityFetch, ErrorView } from "@rebasepro/core";
6
+ import { useCustomizationController, useEntityFetch, ErrorView, useComponentOverride, CollectionComponentOverrideProvider } from "@rebasepro/core";
7
7
  import { Skeleton } from "@rebasepro/ui";
8
8
  import { EntityPreview, EntityPreviewContainer } from "../../components";
9
9
  import { useCollectionRegistryController } from "../../index";
10
+ import { getEntityTitlePropertyKey } from "../../util/previews";
11
+ import { getValueInPath } from "@rebasepro/utils";
10
12
 
11
13
  export type RelationPreviewProps = {
12
14
  disabled?: boolean;
@@ -17,8 +19,45 @@ export type RelationPreviewProps = {
17
19
  hover?: boolean;
18
20
  includeEntityLink?: boolean;
19
21
  includeId?: boolean;
22
+ textOnly?: boolean;
20
23
  };
21
24
 
25
+ /**
26
+ * Extract a display name from a plain relation-shaped object that isn't
27
+ * a proper EntityRelation instance. Tries common name fields in the
28
+ * entity's values, then falls back to the id.
29
+ */
30
+ function extractDisplayFromPlainObject(obj: unknown): string {
31
+ if (!obj || typeof obj !== "object") return "—";
32
+ const record = obj as Record<string, unknown>;
33
+
34
+ // Try data.values.{name,title,...} (EntityRelation.data is an Entity with .values)
35
+ const data = record.data;
36
+ if (data && typeof data === "object") {
37
+ const dataRecord = data as Record<string, unknown>;
38
+ const values = (dataRecord.values && typeof dataRecord.values === "object")
39
+ ? dataRecord.values as Record<string, unknown>
40
+ : dataRecord;
41
+ const nameFields = ["name", "title", "label", "display_name", "displayName", "email", "username"];
42
+ for (const field of nameFields) {
43
+ const v = values[field];
44
+ if (v && typeof v === "string") return v;
45
+ }
46
+ }
47
+
48
+ // Try direct fields on the object itself (some serialization paths flatten the data)
49
+ const directFields = ["name", "title", "label", "display_name", "displayName", "email"];
50
+ for (const field of directFields) {
51
+ const v = record[field];
52
+ if (v && typeof v === "string") return v;
53
+ }
54
+
55
+ // Last resort: show the id
56
+ if ("id" in record && record.id != null) return String(record.id);
57
+
58
+ return "—";
59
+ }
60
+
22
61
  /**
23
62
  * @group Preview components
24
63
  */
@@ -26,6 +65,10 @@ export const RelationPreview = function RelationPreview(props: RelationPreviewPr
26
65
  const relation = props.relation;
27
66
  if (!(typeof relation === "object" && "isEntityRelation" in relation && relation.isEntityRelation())) {
28
67
  console.warn("Relation preview received value of type", typeof relation);
68
+ if (props.textOnly) {
69
+ const display = extractDisplayFromPlainObject(relation);
70
+ return <span className="truncate">{display}</span>;
71
+ }
29
72
  return <EntityPreviewContainer
30
73
  onClick={props.onClick}
31
74
  size={props.size}>
@@ -36,7 +79,9 @@ export const RelationPreview = function RelationPreview(props: RelationPreviewPr
36
79
  return <RelationPreviewInternal {...props}/>;
37
80
  };
38
81
 
39
- function RelationPreviewInternal({
82
+ const DefaultMissingReference: React.FC<{ path: string }> = () => null;
83
+
84
+ function RelationPreviewInternalInner({
40
85
  disabled,
41
86
  relation,
42
87
  previewProperties,
@@ -44,18 +89,19 @@ function RelationPreviewInternal({
44
89
  hover,
45
90
  onClick,
46
91
  includeEntityLink = true,
47
- includeId = true
48
- }: RelationPreviewProps) {
49
-
50
- const customizationController = useCustomizationController();
51
-
52
- const collectionRegistryController = useCollectionRegistryController();
92
+ includeId = true,
93
+ textOnly,
94
+ collection
95
+ }: RelationPreviewProps & { collection?: EntityCollection }) {
96
+ const ResolvedMissingReference = useComponentOverride("Entity.MissingReference", DefaultMissingReference);
53
97
 
54
- const collection = collectionRegistryController.getCollection(relation.path);
55
98
  if (!collection) {
56
- if (customizationController.components?.missingReference) {
57
- return <customizationController.components.missingReference path={relation.path}/>;
99
+ if (ResolvedMissingReference !== DefaultMissingReference) {
100
+ return <ResolvedMissingReference path={relation.path}/>;
58
101
  } else {
102
+ if (textOnly) {
103
+ return <span>{relation.path}</span>;
104
+ }
59
105
  return <EntityPreviewContainer size={size}>
60
106
  <ErrorView error={`Collection not found: ${relation.path}`}/>
61
107
  </EntityPreviewContainer>;
@@ -71,9 +117,31 @@ function RelationPreviewInternal({
71
117
  includeEntityLink={includeEntityLink}
72
118
  includeId={includeId}
73
119
  onClick={onClick}
120
+ textOnly={textOnly}
74
121
  hover={hover}/>
75
122
  }
76
123
 
124
+ function RelationPreviewInternal(props: RelationPreviewProps) {
125
+ const collectionRegistryController = useCollectionRegistryController();
126
+ const collection = collectionRegistryController.getCollection(props.relation.path);
127
+
128
+ const content = (
129
+ <RelationPreviewInternalInner
130
+ {...props}
131
+ collection={collection}
132
+ />
133
+ );
134
+
135
+ if (collection?.components) {
136
+ return (
137
+ <CollectionComponentOverrideProvider overrides={collection.components}>
138
+ {content}
139
+ </CollectionComponentOverrideProvider>
140
+ );
141
+ }
142
+ return content;
143
+ }
144
+
77
145
  function RelationPreviewExisting<M extends Record<string, unknown> = Record<string, unknown>>({
78
146
  relation,
79
147
  collection,
@@ -83,12 +151,15 @@ function RelationPreviewExisting<M extends Record<string, unknown> = Record<stri
83
151
  includeEntityLink,
84
152
  includeId,
85
153
  onClick,
86
- hover
154
+ hover,
155
+ textOnly
87
156
  }: RelationPreviewProps & {
88
157
  collection: EntityCollection<M>
89
158
  }) {
90
159
 
91
160
  const passedEntity = relation.data;
161
+ const ResolvedEntityPreview = useComponentOverride("Entity.Preview", EntityPreview);
162
+ const customizationController = useCustomizationController();
92
163
 
93
164
  const {
94
165
  entity,
@@ -117,6 +188,9 @@ function RelationPreviewExisting<M extends Record<string, unknown> = Record<stri
117
188
  }
118
189
 
119
190
  if (body) {
191
+ if (textOnly) {
192
+ return <span>{relation.id}</span>;
193
+ }
120
194
  return (
121
195
  <EntityPreviewContainer onClick={disabled ? undefined : onClick}
122
196
  hover={disabled ? undefined : hover}
@@ -127,6 +201,9 @@ function RelationPreviewExisting<M extends Record<string, unknown> = Record<stri
127
201
  }
128
202
 
129
203
  if (dataLoading && !usedEntity) {
204
+ if (textOnly) {
205
+ return <Skeleton className="inline-block w-20 h-4" />;
206
+ }
130
207
  return (
131
208
  <EntityPreviewContainer onClick={disabled ? undefined : onClick}
132
209
  hover={disabled ? undefined : hover}
@@ -137,6 +214,9 @@ function RelationPreviewExisting<M extends Record<string, unknown> = Record<stri
137
214
  }
138
215
 
139
216
  if (!usedEntity) {
217
+ if (textOnly) {
218
+ return <span>{relation.id}</span>;
219
+ }
140
220
  return (
141
221
  <EntityPreviewContainer onClick={disabled ? undefined : onClick}
142
222
  hover={disabled ? undefined : hover}
@@ -145,7 +225,15 @@ function RelationPreviewExisting<M extends Record<string, unknown> = Record<stri
145
225
  </EntityPreviewContainer>
146
226
  );
147
227
  }
148
- return <EntityPreview size={size}
228
+
229
+ if (textOnly) {
230
+ const titleProperty = getEntityTitlePropertyKey(collection, customizationController.propertyConfigs);
231
+ const titleValue = titleProperty ? getValueInPath(usedEntity.values, titleProperty) : undefined;
232
+ const displayValue = titleValue !== undefined && titleValue !== null ? String(titleValue) : String(relation.id);
233
+ return <span className="truncate">{displayValue}</span>;
234
+ }
235
+
236
+ return <ResolvedEntityPreview size={size}
149
237
  previewKeys={previewProperties}
150
238
  disabled={disabled}
151
239
  entity={usedEntity}
@@ -1,30 +1,21 @@
1
-
2
1
  import type { PropertyPreviewProps } from "../../types/components/PropertyPreviewProps";
3
2
  import type { StringProperty } from "@rebasepro/types";
4
3
  import React from "react";
5
- import { useInternalUserManagementController } from "@rebasepro/core";
6
- import { UserDisplay } from "@rebasepro/core";
7
4
  import { EmptyValue } from "./EmptyValue";
8
5
  import { Typography } from "@rebasepro/ui";
9
- import { User } from "@rebasepro/types";
10
6
 
11
7
  /**
12
- * Preview component for displaying user information.
13
- * This is a simple wrapper around UserDisplay.
8
+ * Preview component for displaying a user reference value.
9
+ *
10
+ * Shows the raw user ID. Collection-based user management means
11
+ * user records are fetched through the standard data layer.
14
12
  *
15
13
  * @group Preview components
16
14
  */
17
15
  export function UserPreview({ value }: PropertyPreviewProps<StringProperty>) {
18
- const getUser = useInternalUserManagementController<User>()?.getUser;
19
-
20
16
  if (typeof value !== "string" || !value) {
21
17
  return <EmptyValue/>;
22
18
  }
23
19
 
24
- const user = getUser?.(value);
25
- if (!user) {
26
- return <Typography variant={"caption"} color={"secondary"}>User not found: {value}</Typography>;
27
- }
28
-
29
- return <UserDisplay user={user}/>;
20
+ return <Typography variant={"caption"} color={"secondary"}>{value}</Typography>;
30
21
  }
@@ -25,7 +25,7 @@ export function ArrayOfMapsPreview({
25
25
  const mapProperty = property.of;
26
26
  const properties = mapProperty.properties;
27
27
  if (!properties) {
28
- throw Error(`You need to specify a 'properties' prop (or specify a custom field) in your map property ${propertyKey}`);
28
+ throw Error(`You need to specify a 'properties' prop (or specify a custom field) in your map property '${propertyKey}'${mapProperty.name ? ` ("${mapProperty.name}")` : ""}`);
29
29
  }
30
30
  const values = value as Record<string, unknown>[];
31
31
  const previewProperties: string[] | undefined = (mapProperty as MapProperty).previewProperties;
@@ -5,7 +5,7 @@ import { EntityDetailView } from "../components/EntityDetailView";
5
5
  import { useEffect, useRef, useState } from "react";
6
6
  import { useNavigate } from "react-router-dom";
7
7
  import { EntityCollectionView } from "../components";
8
- import { NotFoundPage, useUserConfigurationPersistence } from "@rebasepro/core";
8
+ import { NotFoundPage, useUserConfigurationPersistence, useComponentOverride } from "@rebasepro/core";
9
9
  import { UnsavedChangesDialog } from "@rebasepro/core";
10
10
  import { CircularProgressCenter } from "@rebasepro/ui";
11
11
  import { getNavigationEntriesFromPath, NavigationViewCollectionInternal, NavigationViewEntityCustomInternal, NavigationViewInternal } from "@rebasepro/common";
@@ -20,6 +20,7 @@ export function RebaseRoute() {
20
20
  const urlController = useUrlController();
21
21
  const breadcrumbs = useBreadcrumbsController();
22
22
  const userConfigPersistence = useUserConfigurationPersistence();
23
+ const ResolvedCollectionView = useComponentOverride("Collection.View", EntityCollectionView);
23
24
 
24
25
  const hash = location.hash;
25
26
  const isSidePanel = hash.includes("#side");
@@ -91,7 +92,7 @@ export function RebaseRoute() {
91
92
  }
92
93
  return null;
93
94
  }
94
- return <EntityCollectionView
95
+ return <ResolvedCollectionView
95
96
  key={`collection_view_${collection.slug}`}
96
97
  {...collection}
97
98
  parentCollectionSlugs={[]} parentEntityIds={[]}
@@ -114,7 +115,7 @@ export function RebaseRoute() {
114
115
  }
115
116
  return null;
116
117
  }
117
- return <EntityCollectionView
118
+ return <ResolvedCollectionView
118
119
  key={`collection_view_${collection.slug}`}
119
120
  {...collection}
120
121
  parentCollectionSlugs={[]} parentEntityIds={[]}
@@ -185,7 +186,7 @@ export function RebaseRoute() {
185
186
  }
186
187
  }
187
188
  }
188
- return <EntityCollectionView
189
+ return <ResolvedCollectionView
189
190
  key={`collection_view_${collection.slug}`}
190
191
  {...collection}
191
192
  parentCollectionSlugs={[]} parentEntityIds={[]}
@@ -56,4 +56,9 @@ export interface PropertyPreviewProps<P extends Property | Property, CustomProps
56
56
  */
57
57
  fill?: boolean;
58
58
 
59
+ /**
60
+ * If true, relations/references will render as plain text strings rather than full cards.
61
+ */
62
+ textOnly?: boolean;
63
+
59
64
  }
@@ -1,46 +1,2 @@
1
- import React, { FormEvent } from "react";
1
+ export type { FormexController, FormexResetProps } from "@rebasepro/formex";
2
2
 
3
- // this is duplicated from the formex package
4
- export type FormexController<T extends object> = {
5
- values: T;
6
- initialValues: T;
7
- setValues: (values: T) => void;
8
- setFieldValue: (key: string, value: unknown, shouldValidate?: boolean) => void;
9
- touched: Record<string, boolean>;
10
- setFieldTouched: (key: string, touched: boolean, shouldValidate?: boolean) => void;
11
- setTouched: (touched: Record<string, boolean>) => void;
12
- dirty: boolean;
13
- setDirty: (dirty: boolean) => void;
14
- setSubmitCount: (submitCount: number) => void;
15
- errors: Record<string, string>;
16
- setFieldError: (key: string, error?: string) => void;
17
- handleChange: (event: React.SyntheticEvent) => void,
18
- handleBlur: (event: React.FocusEvent) => void,
19
- handleSubmit: (event?: FormEvent<HTMLFormElement>) => void;
20
- validate: () => void;
21
- resetForm: (props?: FormexResetProps<T>) => void;
22
- submitCount: number;
23
- isSubmitting: boolean;
24
- setSubmitting: (isSubmitting: boolean) => void;
25
- isValidating: boolean;
26
- /**
27
- * The version of the form. This is incremented every time the form is reset
28
- * or the form is submitted.
29
- */
30
- version: number;
31
-
32
- debugId?: string;
33
-
34
- undo: () => void;
35
- redo: () => void;
36
-
37
- canUndo: boolean;
38
- canRedo: boolean;
39
- }
40
-
41
- export type FormexResetProps<T extends object> = {
42
- values?: T;
43
- submitCount?: number;
44
- errors?: Record<string, string>;
45
- touched?: Record<string, boolean>;
46
- };
@@ -179,10 +179,19 @@ export interface FormContext<M extends Record<string, unknown> = Record<string,
179
179
  setFieldValue: (key: string, value: unknown, shouldValidate?: boolean) => void;
180
180
 
181
181
  /**
182
- * Save the entity.
182
+ * Quietly persist the entity to the database without any UI feedback
183
+ * (no validation, no snackbar, no form reset).
184
+ * Use this for programmatic/background saves from custom views.
183
185
  */
184
186
  save: (values: M) => void;
185
187
 
188
+ /**
189
+ * Submit the form — validates, saves, resets the form, and shows
190
+ * a success snackbar. This is what the Save button calls.
191
+ * Use this from custom views when you want the full "user saved" experience.
192
+ */
193
+ submit: () => void;
194
+
186
195
  /**
187
196
  * Collection of the entity being modified
188
197
  */
@@ -1,4 +1,4 @@
1
- import type { EntityCollection, UrlController, SideEntityController } from "@rebasepro/types";
1
+ import type { EntityCollection, UrlController, SideEntityController, NavigateOptions } from "@rebasepro/types";
2
2
 
3
3
  // Canonical path utilities — single source of truth in @rebasepro/common
4
4
  export {
@@ -26,7 +26,8 @@ export function navigateToEntity({
26
26
  defaultValues,
27
27
  sideEntityController,
28
28
  onClose,
29
- navigation
29
+ navigation,
30
+ replace
30
31
  }:
31
32
 
32
33
  {
@@ -47,7 +48,8 @@ export function navigateToEntity({
47
48
  path: string;
48
49
  sideEntityController: SideEntityController;
49
50
  onClose?: () => void;
50
- navigation: UrlController
51
+ navigation: UrlController;
52
+ replace?: boolean;
51
53
  }) {
52
54
 
53
55
  if (openEntityMode === "side_panel" || openEntityMode === "dialog") {
@@ -83,7 +85,15 @@ export function navigateToEntity({
83
85
  // Use React Router location.state to carry defaultValues — the correct SPA
84
86
  // approach. No URL size limits, no encoding, nothing in the address bar.
85
87
  // EntityFullScreenRoute reads location.state.defaultValues on mount.
86
- navigation.navigate(to, defaultValues ? { state: { defaultValues } } : undefined);
88
+ const navigateOptions: NavigateOptions = {};
89
+ if (replace !== undefined) {
90
+ navigateOptions.replace = replace;
91
+ }
92
+ if (defaultValues) {
93
+ navigateOptions.state = { defaultValues };
94
+ }
95
+ const hasOptions = Object.keys(navigateOptions).length > 0;
96
+ navigation.navigate(to, hasOptions ? navigateOptions : undefined);
87
97
  }
88
98
 
89
99
  }
@@ -22,16 +22,18 @@ export function getEntityPreviewKeys(
22
22
  if (listProperties && listProperties.length > 0) {
23
23
  return listProperties;
24
24
  } else {
25
- listProperties = allProperties;
25
+ const hasExplicitOrder = !!(targetCollection.propertiesOrder as string[] | undefined);
26
+ listProperties = (targetCollection.propertiesOrder as string[]) || allProperties;
26
27
  return listProperties
27
28
  .filter(key => {
28
29
  const prop = targetCollection.properties[key];
29
30
  const isIdProp = prop && typeof prop === "object" && "isId" in prop && Boolean((prop as { isId?: boolean }).isId);
30
- return !isIdProp;
31
+ return !isIdProp && key !== "id";
31
32
  })
32
33
  .filter(key => {
33
34
  const property = targetCollection.properties[key];
34
- return property && !isPropertyBuilder(property) && !isReferenceProperty(property) && !isRelationProperty(property) && !isHiddenProperty(property);
35
+ return property && !isPropertyBuilder(property) && !isReferenceProperty(property) && !isHiddenProperty(property)
36
+ && (hasExplicitOrder || !isRelationProperty(property));
35
37
  }).slice(0, limit);
36
38
  }
37
39
  }
@@ -40,8 +42,27 @@ export function getEntityTitlePropertyKey<M extends Record<string, unknown>>(col
40
42
  if (collection.titleProperty) {
41
43
  return collection.titleProperty as string;
42
44
  }
43
-
45
+
46
+ const hasExplicitOrder = !!(collection.propertiesOrder as string[] | undefined);
44
47
  const orderToSearch = (collection.propertiesOrder as string[]) || Object.keys(collection.properties);
48
+
49
+ // If explicit propertiesOrder is set, allow the first non-ID relation or string to be the titleKey
50
+ if (hasExplicitOrder) {
51
+ for (const key of orderToSearch) {
52
+ const property = collection.properties[key];
53
+ if (property && !isPropertyBuilder(property)) {
54
+ const prop = property as Property;
55
+ const isIdProp = prop && typeof prop === "object" && "isId" in prop && Boolean((prop as { isId?: boolean }).isId);
56
+ if (isIdProp || key === "id" || isHiddenProperty(prop)) {
57
+ continue;
58
+ }
59
+ if (prop.type === "relation" || prop.type === "string") {
60
+ return key;
61
+ }
62
+ }
63
+ }
64
+ }
65
+
45
66
  let firstStringCandidate: string | undefined;
46
67
 
47
68
  for (const key of orderToSearch) {
@@ -65,3 +86,79 @@ export function getEntityTitlePropertyKey<M extends Record<string, unknown>>(col
65
86
  return firstStringCandidate;
66
87
  }
67
88
 
89
+ /**
90
+ * Attempt to turn a title value (which might be a relation, reference, date, array, or other complex object)
91
+ * into a renderable, human-readable string.
92
+ */
93
+ export function resolveTitleToString(title: any): string {
94
+ if (title === null || title === undefined) {
95
+ return "";
96
+ }
97
+
98
+ if (typeof title !== "object") {
99
+ return String(title);
100
+ }
101
+
102
+ // Check if it's a relation shape: { __type: "relation", id, path, data }
103
+ if ("__type" in title && title.__type === "relation") {
104
+ if (title.data && title.data.values) {
105
+ const values = title.data.values;
106
+ // Prioritize common title fields in eagerly loaded relation data
107
+ for (const key of ["name", "title", "label", "displayName"]) {
108
+ if (values[key] !== undefined && values[key] !== null) {
109
+ return String(values[key]);
110
+ }
111
+ }
112
+ // Fallback: search for first short string value in values
113
+ for (const val of Object.values(values)) {
114
+ if (typeof val === "string" && val.length > 0 && val.length < 200) {
115
+ return val;
116
+ }
117
+ }
118
+ }
119
+ if (title.id !== undefined && title.id !== null) {
120
+ return String(title.id);
121
+ }
122
+ }
123
+
124
+ // Check if it's a reference shape: { isEntityReference() } or similar
125
+ if ("isEntityReference" in title && typeof title.isEntityReference === "function" && title.isEntityReference()) {
126
+ return String(title.id);
127
+ }
128
+ if ("id" in title && "path" in title && !("__type" in title)) {
129
+ // Flat reference/relation-like object
130
+ return String(title.id);
131
+ }
132
+
133
+ // Check if it's a Date
134
+ if (title instanceof Date) {
135
+ return title.toLocaleDateString();
136
+ }
137
+
138
+ // Check if it has a string/number property like name/title/label/id
139
+ if ("name" in title && title.name !== undefined && title.name !== null && typeof title.name !== "object") {
140
+ return String(title.name);
141
+ }
142
+ if ("title" in title && title.title !== undefined && title.title !== null && typeof title.title !== "object") {
143
+ return String(title.title);
144
+ }
145
+ if ("label" in title && title.label !== undefined && title.label !== null && typeof title.label !== "object") {
146
+ return String(title.label);
147
+ }
148
+ if ("id" in title && title.id !== undefined && title.id !== null && typeof title.id !== "object") {
149
+ return String(title.id);
150
+ }
151
+
152
+ // Fallback: try converting to string, or JSON.stringify if it looks like a generic object
153
+ try {
154
+ const str = String(title);
155
+ if (str !== "[object Object]") {
156
+ return str;
157
+ }
158
+ return JSON.stringify(title);
159
+ } catch {
160
+ return "";
161
+ }
162
+ }
163
+
164
+