@rebasepro/cms 0.17.3 → 0.18.1

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 (449) hide show
  1. package/README.md +4 -0
  2. package/dist/{CollectionEditorDialog-B-akreOU.js → CollectionEditorDialog-BeX4b92r.js} +13 -7
  3. package/dist/{CollectionEditorDialog-B-akreOU.js.map → CollectionEditorDialog-BeX4b92r.js.map} +1 -1
  4. package/dist/{PropertyEditView-CiY84wkR.js → PropertyEditView-C7thfj4L.js} +3 -3
  5. package/dist/{PropertyEditView-CiY84wkR.js.map → PropertyEditView-C7thfj4L.js.map} +1 -1
  6. package/dist/{RouterCollectionsStudioView-DkAWda4N.js → RouterCollectionsStudioView-BtjzvB6E.js} +4 -4
  7. package/dist/{RouterCollectionsStudioView-DkAWda4N.js.map → RouterCollectionsStudioView-BtjzvB6E.js.map} +1 -1
  8. package/dist/{SchemaChangeDialog-DceT8QFX.js → SchemaChangeDialog-CkqK6KOC.js} +4 -2
  9. package/dist/{SchemaChangeDialog-DceT8QFX.js.map → SchemaChangeDialog-CkqK6KOC.js.map} +1 -1
  10. package/dist/collection_editor/api/generateCollectionApi.d.ts +1 -2
  11. package/dist/collection_editor_ui.d.ts +2 -0
  12. package/dist/collection_editor_ui.js +6 -5
  13. package/dist/collection_editor_ui.js.map +1 -1
  14. package/dist/components/DeleteEntityDialog.d.ts +2 -3
  15. package/dist/components/RebaseLayout.d.ts +11 -4
  16. package/dist/components/field_configs.d.ts +1 -1
  17. package/dist/editor/sanitize-html.d.ts +15 -0
  18. package/dist/editor.js +195 -10
  19. package/dist/editor.js.map +1 -1
  20. package/dist/{export-Ben8E355.js → export--arni_VY.js} +2 -2
  21. package/dist/{export-Ben8E355.js.map → export--arni_VY.js.map} +1 -1
  22. package/dist/form/components/LabelWithIcon.d.ts +10 -0
  23. package/dist/{history-DIEVd26f.js → history-C2TpoQwi.js} +2 -2
  24. package/dist/{history-DIEVd26f.js.map → history-C2TpoQwi.js.map} +1 -1
  25. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +1 -1
  26. package/dist/hooks/navigation/useResolvedViews.d.ts +1 -1
  27. package/dist/hooks/navigation/useTopLevelNavigation.d.ts +1 -1
  28. package/dist/{import-D25x7ko-.js → import-DTkXNoBg.js} +2 -2
  29. package/dist/{import-D25x7ko-.js.map → import-DTkXNoBg.js.map} +1 -1
  30. package/dist/index.js +78 -33
  31. package/dist/index.js.map +1 -1
  32. package/dist/util/propertyConfigMapper.d.ts +1 -1
  33. package/dist/util-CfLFggP7.js +57 -0
  34. package/dist/util-CfLFggP7.js.map +1 -0
  35. package/dist/{util-DVqnqlLn.js → util-DE1WQW6h.js} +134 -112
  36. package/dist/util-DE1WQW6h.js.map +1 -0
  37. package/package.json +42 -34
  38. package/dist/util-DVqnqlLn.js.map +0 -1
  39. package/src/collection_editor/CollectionEditorDialogsContext.tsx +0 -25
  40. package/src/collection_editor/ConfigControllerProvider.tsx +0 -395
  41. package/src/collection_editor/_cms_internals.ts +0 -41
  42. package/src/collection_editor/api/generateCollectionApi.ts +0 -126
  43. package/src/collection_editor/api/index.ts +0 -1
  44. package/src/collection_editor/extensibility_types.ts +0 -168
  45. package/src/collection_editor/index.ts +0 -108
  46. package/src/collection_editor/liveSchemaClient.ts +0 -285
  47. package/src/collection_editor/relation_kinds.ts +0 -44
  48. package/src/collection_editor/serializable_types.ts +0 -535
  49. package/src/collection_editor/serializable_utils.ts +0 -729
  50. package/src/collection_editor/types/collection_editor_controller.tsx +0 -62
  51. package/src/collection_editor/types/collection_inference.ts +0 -18
  52. package/src/collection_editor/types/config_controller.tsx +0 -121
  53. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +0 -199
  54. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +0 -51
  55. package/src/collection_editor/ui/EditorCollectionAction.tsx +0 -54
  56. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +0 -90
  57. package/src/collection_editor/ui/EditorEntityAction.tsx +0 -50
  58. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +0 -114
  59. package/src/collection_editor/ui/KanbanSetupAction.tsx +0 -43
  60. package/src/collection_editor/ui/MissingReferenceWidget.tsx +0 -35
  61. package/src/collection_editor/ui/NewCollectionButton.tsx +0 -27
  62. package/src/collection_editor/ui/NewCollectionCard.tsx +0 -48
  63. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +0 -49
  64. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +0 -260
  65. package/src/collection_editor/ui/collection_editor/AIModifiedPathsContext.tsx +0 -90
  66. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +0 -388
  67. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +0 -1098
  68. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +0 -301
  69. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +0 -172
  70. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +0 -620
  71. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +0 -530
  72. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +0 -462
  73. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +0 -104
  74. package/src/collection_editor/ui/collection_editor/CollectionYupValidation.tsx +0 -9
  75. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +0 -199
  76. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +0 -315
  77. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +0 -164
  78. package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +0 -40
  79. package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +0 -39
  80. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +0 -373
  81. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +0 -288
  82. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +0 -141
  83. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +0 -194
  84. package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +0 -53
  85. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +0 -980
  86. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +0 -164
  87. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +0 -364
  88. package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +0 -44
  89. package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +0 -41
  90. package/src/collection_editor/ui/collection_editor/SchemaChangeDialog.tsx +0 -470
  91. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +0 -256
  92. package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +0 -39
  93. package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +0 -68
  94. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +0 -67
  95. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +0 -296
  96. package/src/collection_editor/ui/collection_editor/import/clean_import_data.ts +0 -57
  97. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +0 -147
  98. package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +0 -41
  99. package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +0 -113
  100. package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +0 -250
  101. package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +0 -126
  102. package/src/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.tsx +0 -20
  103. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +0 -153
  104. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +0 -217
  105. package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +0 -117
  106. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +0 -129
  107. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +0 -335
  108. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +0 -107
  109. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +0 -403
  110. package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +0 -148
  111. package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +0 -91
  112. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +0 -34
  113. package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +0 -49
  114. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +0 -925
  115. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +0 -28
  116. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +0 -626
  117. package/src/collection_editor/ui/collection_editor/properties/conditions/index.ts +0 -6
  118. package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +0 -93
  119. package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +0 -52
  120. package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +0 -63
  121. package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +0 -114
  122. package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +0 -154
  123. package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +0 -28
  124. package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +0 -112
  125. package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +0 -183
  126. package/src/collection_editor/ui/collection_editor/templates/products_template.ts +0 -88
  127. package/src/collection_editor/ui/collection_editor/templates/users_template.ts +0 -42
  128. package/src/collection_editor/ui/collection_editor/util.ts +0 -28
  129. package/src/collection_editor/ui/collection_editor/utils/strings.ts +0 -1
  130. package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -39
  131. package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +0 -276
  132. package/src/collection_editor/useCollectionEditorController.tsx +0 -9
  133. package/src/collection_editor/useCollectionsConfigController.tsx +0 -9
  134. package/src/collection_editor/useJsonCollectionsConfigController.tsx +0 -297
  135. package/src/collection_editor/useLiveSchemaEditing.tsx +0 -315
  136. package/src/collection_editor/useLocalCollectionsConfigController.tsx +0 -341
  137. package/src/collection_editor/useSafeSnackbarController.ts +0 -9
  138. package/src/collection_editor/validateCollectionJson.ts +0 -440
  139. package/src/collection_editor_ui.ts +0 -21
  140. package/src/components/AdditionalFieldValue.tsx +0 -68
  141. package/src/components/AdminModeSyncer.tsx +0 -56
  142. package/src/components/ArrayContainer.tsx +0 -542
  143. package/src/components/ClearFilterSortButton.tsx +0 -56
  144. package/src/components/CollectionEditorDialogs.tsx +0 -69
  145. package/src/components/CollectionPanel.tsx +0 -179
  146. package/src/components/CollectionTableBinding/CollectionRowActions.tsx +0 -244
  147. package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +0 -394
  148. package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +0 -172
  149. package/src/components/CollectionTableBinding/PropertyTableCell.tsx +0 -350
  150. package/src/components/CollectionTableBinding/column_utils.tsx +0 -155
  151. package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +0 -131
  152. package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +0 -193
  153. package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +0 -192
  154. package/src/components/CollectionTableBinding/fields/TableRelationSelectorField.tsx +0 -42
  155. package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +0 -324
  156. package/src/components/CollectionTableBinding/fields/VirtualTableSelect.tsx +0 -132
  157. package/src/components/CollectionTableBinding/fields/VirtualTableUserSelect.tsx +0 -41
  158. package/src/components/CollectionTableBinding/index.tsx +0 -14
  159. package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +0 -96
  160. package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +0 -309
  161. package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +0 -80
  162. package/src/components/CollectionTableBinding/internal/common.tsx +0 -74
  163. package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +0 -422
  164. package/src/components/CollectionTableBinding/internal/popup_field/useDraggable.tsx +0 -99
  165. package/src/components/CollectionTableBinding/internal/popup_field/useWindowSize.tsx +0 -22
  166. package/src/components/CollectionTableBinding/table_bindings.tsx +0 -350
  167. package/src/components/CollectionViewBinding/BoardCardBinding.tsx +0 -263
  168. package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +0 -662
  169. package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +0 -159
  170. package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +0 -1430
  171. package/src/components/CollectionViewBinding/CollectionViewActions.tsx +0 -227
  172. package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +0 -1603
  173. package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +0 -240
  174. package/src/components/CollectionViewBinding/EntityCardBinding.tsx +0 -239
  175. package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +0 -298
  176. package/src/components/CollectionViewBinding/FiltersDialog.tsx +0 -218
  177. package/src/components/CollectionViewBinding/SearchExplanation.tsx +0 -106
  178. package/src/components/CollectionViewBinding/SearchHighlight.tsx +0 -311
  179. package/src/components/CollectionViewBinding/SlotValue.tsx +0 -156
  180. package/src/components/CollectionViewBinding/SortButton.tsx +0 -354
  181. package/src/components/CollectionViewBinding/SplitListCloseButton.tsx +0 -49
  182. package/src/components/CollectionViewBinding/SplitListShowButton.tsx +0 -28
  183. package/src/components/CollectionViewBinding/SplitListView.tsx +0 -488
  184. package/src/components/CollectionViewBinding/SplitViewContext.tsx +0 -34
  185. package/src/components/CollectionViewBinding/ViewModeToggle.tsx +0 -250
  186. package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +0 -81
  187. package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +0 -181
  188. package/src/components/CollectionViewBinding/useBoardDataController.tsx +0 -802
  189. package/src/components/CollectionViewBinding/usePreviewSlots.ts +0 -703
  190. package/src/components/CollectionViewBinding/useSelectionController.tsx +0 -40
  191. package/src/components/CollectionViewBinding/utils.ts +0 -22
  192. package/src/components/DefaultAppBar.tsx +0 -264
  193. package/src/components/DefaultDrawer.tsx +0 -593
  194. package/src/components/DeleteEntityDialog.tsx +0 -205
  195. package/src/components/DetailViewBinding.tsx +0 -731
  196. package/src/components/DrawerNavigationGroup.tsx +0 -141
  197. package/src/components/DrawerNavigationItem.tsx +0 -115
  198. package/src/components/EditFormActions.tsx +0 -303
  199. package/src/components/EditViewBinding.tsx +0 -1069
  200. package/src/components/EntityDisplayHeader.tsx +0 -170
  201. package/src/components/EntityIdentityBar.tsx +0 -428
  202. package/src/components/EntityInspector.tsx +0 -156
  203. package/src/components/EntityPreviewBinding.tsx +0 -432
  204. package/src/components/EntityPreviewNesting.tsx +0 -50
  205. package/src/components/EntityViewBinding.tsx +0 -374
  206. package/src/components/FieldCaption.tsx +0 -14
  207. package/src/components/HomePage/ContentHomePage.tsx +0 -586
  208. package/src/components/HomePage/FavouritesView.tsx +0 -60
  209. package/src/components/HomePage/HomePageDnD.tsx +0 -704
  210. package/src/components/HomePage/NavigationCard.tsx +0 -81
  211. package/src/components/HomePage/NavigationCardBinding.tsx +0 -107
  212. package/src/components/HomePage/NavigationGroup.tsx +0 -156
  213. package/src/components/HomePage/RenameGroupDialog.tsx +0 -123
  214. package/src/components/HomePage/SmallNavigationCard.tsx +0 -41
  215. package/src/components/HomePage/index.tsx +0 -5
  216. package/src/components/InlineEntityPreview.tsx +0 -149
  217. package/src/components/JsonPreviewBinding.tsx +0 -66
  218. package/src/components/PropertyCollectionView.tsx +0 -336
  219. package/src/components/PropertyConfigBadge.tsx +0 -28
  220. package/src/components/PropertyIdCopyTooltip.tsx +0 -47
  221. package/src/components/RebaseAuthGate.tsx +0 -44
  222. package/src/components/RebaseCMS.tsx +0 -30
  223. package/src/components/RebaseLayout.tsx +0 -80
  224. package/src/components/RebaseNavigation.tsx +0 -369
  225. package/src/components/RebaseRouteDefs.tsx +0 -127
  226. package/src/components/RebaseShell.tsx +0 -83
  227. package/src/components/ReferenceTable/SelectionTableBinding.tsx +0 -389
  228. package/src/components/ReferenceWidget.tsx +0 -156
  229. package/src/components/RelationSelector.tsx +0 -926
  230. package/src/components/SearchIconsView.tsx +0 -78
  231. package/src/components/SelectableTable/SelectableTable.tsx +0 -309
  232. package/src/components/SelectableTable/SelectableTableContext.tsx +0 -7
  233. package/src/components/SelectableTable/SelectionStore.ts +0 -43
  234. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +0 -59
  235. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +0 -146
  236. package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +0 -190
  237. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +0 -250
  238. package/src/components/SelectableTable/filters/RelationFilterField.tsx +0 -238
  239. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +0 -282
  240. package/src/components/SelectableTable/filters/null_filter.ts +0 -63
  241. package/src/components/SideDialogs.tsx +0 -238
  242. package/src/components/SidePanelBinding.tsx +0 -361
  243. package/src/components/SidePanelProvider.tsx +0 -80
  244. package/src/components/UserSelector.tsx +0 -513
  245. package/src/components/admin/CreationResultDialog.tsx +0 -138
  246. package/src/components/admin/index.ts +0 -1
  247. package/src/components/app/AppBar.tsx +0 -17
  248. package/src/components/app/Drawer.tsx +0 -38
  249. package/src/components/app/Scaffold.tsx +0 -366
  250. package/src/components/app/index.ts +0 -4
  251. package/src/components/app/useApp.tsx +0 -36
  252. package/src/components/common/default_entity_actions.tsx +0 -440
  253. package/src/components/common/index.ts +0 -1
  254. package/src/components/field_configs.tsx +0 -506
  255. package/src/components/history/EntityHistoryEntry.tsx +0 -203
  256. package/src/components/history/EntityHistoryView.tsx +0 -206
  257. package/src/components/history/LastEditedByFormAction.tsx +0 -24
  258. package/src/components/history/LastEditedByIndicator.tsx +0 -95
  259. package/src/components/history/UserChip.tsx +0 -15
  260. package/src/components/history/index.tsx +0 -5
  261. package/src/components/index.ts +0 -63
  262. package/src/contexts/BreacrumbsContext.tsx +0 -45
  263. package/src/contexts/SideDialogsControllerContext.tsx +0 -5
  264. package/src/contexts/SidePanelControllerContext.tsx +0 -5
  265. package/src/data_export/export/BasicExportAction.tsx +0 -142
  266. package/src/data_export/export/ExportCollectionAction.tsx +0 -321
  267. package/src/data_export/export/export.ts +0 -295
  268. package/src/data_export/export/fetch_export_data.ts +0 -90
  269. package/src/data_export/export/index.ts +0 -4
  270. package/src/data_export/index.ts +0 -1
  271. package/src/data_import/components/DataNewPropertiesMapping.tsx +0 -261
  272. package/src/data_import/components/ImportFileUpload.tsx +0 -42
  273. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +0 -58
  274. package/src/data_import/components/ImportSaveInProgress.tsx +0 -121
  275. package/src/data_import/components/index.ts +0 -4
  276. package/src/data_import/hooks/index.ts +0 -1
  277. package/src/data_import/hooks/useImportConfig.tsx +0 -34
  278. package/src/data_import/import/ImportCollectionAction.tsx +0 -461
  279. package/src/data_import/import/index.ts +0 -1
  280. package/src/data_import/index.ts +0 -5
  281. package/src/data_import/types/column_mapping.ts +0 -32
  282. package/src/data_import/types/index.ts +0 -1
  283. package/src/data_import/utils/csv.ts +0 -153
  284. package/src/data_import/utils/data.ts +0 -181
  285. package/src/data_import/utils/file_headers.ts +0 -14
  286. package/src/data_import/utils/file_to_json.ts +0 -149
  287. package/src/data_import/utils/get_import_inference_type.ts +0 -33
  288. package/src/data_import/utils/get_properties_mapping.ts +0 -67
  289. package/src/data_import/utils/index.ts +0 -5
  290. package/src/data_import/utils/save_entities.ts +0 -138
  291. package/src/data_import/utils/transforms.ts +0 -70
  292. package/src/editor/components/SlashCommandMenu.tsx +0 -532
  293. package/src/editor/components/editor-bubble-item.tsx +0 -32
  294. package/src/editor/components/editor-bubble.tsx +0 -143
  295. package/src/editor/components/image-bubble.tsx +0 -183
  296. package/src/editor/components/index.ts +0 -14
  297. package/src/editor/components/table-bubble.tsx +0 -233
  298. package/src/editor/editor.tsx +0 -529
  299. package/src/editor/extensions/HighlightDecorationExtension.ts +0 -115
  300. package/src/editor/extensions/Image.ts +0 -159
  301. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +0 -107
  302. package/src/editor/extensions/clipboard.ts +0 -72
  303. package/src/editor/extensions/custom-keymap.ts +0 -25
  304. package/src/editor/extensions/drag-and-drop.tsx +0 -508
  305. package/src/editor/hooks/useProseMirror.ts +0 -126
  306. package/src/editor/hooks/useProseMirrorContext.ts +0 -15
  307. package/src/editor/index.ts +0 -2
  308. package/src/editor/markdown-it-plugins.d.ts +0 -24
  309. package/src/editor/markdown.ts +0 -204
  310. package/src/editor/nodeViews/ImageComponent.tsx +0 -20
  311. package/src/editor/nodeViews/ReactNodeView.tsx +0 -89
  312. package/src/editor/nodeViews/TaskItemComponent.tsx +0 -30
  313. package/src/editor/nodeViews/index.ts +0 -35
  314. package/src/editor/plugins/index.ts +0 -58
  315. package/src/editor/plugins/inputrules.ts +0 -82
  316. package/src/editor/plugins/placeholderPlugin.ts +0 -55
  317. package/src/editor/plugins/slashCommandPlugin.ts +0 -65
  318. package/src/editor/schema.ts +0 -339
  319. package/src/editor/selectors/ai-selector.tsx +0 -110
  320. package/src/editor/selectors/color-selector.tsx +0 -199
  321. package/src/editor/selectors/link-selector.tsx +0 -122
  322. package/src/editor/selectors/node-selector.tsx +0 -159
  323. package/src/editor/selectors/text-buttons.tsx +0 -79
  324. package/src/editor/types.ts +0 -6
  325. package/src/editor/useProseMirror.ts +0 -125
  326. package/src/editor/utils/prosemirror-utils.ts +0 -113
  327. package/src/editor/utils/remove_classes.ts +0 -18
  328. package/src/editor/utils/useDebouncedCallback.ts +0 -25
  329. package/src/form/EntityForm.tsx +0 -761
  330. package/src/form/EntityFormActions.tsx +0 -160
  331. package/src/form/EntityFormBinding.tsx +0 -342
  332. package/src/form/PropertyFieldBinding.tsx +0 -348
  333. package/src/form/components/ErrorFocus.tsx +0 -44
  334. package/src/form/components/FieldBlock.tsx +0 -189
  335. package/src/form/components/FieldHelperText.tsx +0 -84
  336. package/src/form/components/FormRail.tsx +0 -153
  337. package/src/form/components/FormSections.tsx +0 -145
  338. package/src/form/components/LabelWithIcon.tsx +0 -43
  339. package/src/form/components/LabelWithIconAndTooltip.tsx +0 -28
  340. package/src/form/components/LocalChangesMenu.tsx +0 -147
  341. package/src/form/components/StorageItemPreview.tsx +0 -81
  342. package/src/form/components/StorageUploadProgress.tsx +0 -118
  343. package/src/form/components/index.tsx +0 -6
  344. package/src/form/components/useRailVisible.tsx +0 -47
  345. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +0 -109
  346. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +0 -172
  347. package/src/form/field_bindings/BinaryFieldBinding.tsx +0 -177
  348. package/src/form/field_bindings/BlockFieldBinding.tsx +0 -282
  349. package/src/form/field_bindings/DateTimeFieldBinding.tsx +0 -78
  350. package/src/form/field_bindings/GeopointFieldBinding.tsx +0 -200
  351. package/src/form/field_bindings/KeyValueFieldBinding.tsx +0 -574
  352. package/src/form/field_bindings/MapFieldBinding.tsx +0 -120
  353. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +0 -259
  354. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +0 -130
  355. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +0 -168
  356. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +0 -94
  357. package/src/form/field_bindings/ReferenceFieldBinding.tsx +0 -146
  358. package/src/form/field_bindings/RelationFieldBinding.tsx +0 -202
  359. package/src/form/field_bindings/RepeatFieldBinding.tsx +0 -143
  360. package/src/form/field_bindings/SelectFieldBinding.tsx +0 -111
  361. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +0 -521
  362. package/src/form/field_bindings/SwitchFieldBinding.tsx +0 -70
  363. package/src/form/field_bindings/TextFieldBinding.tsx +0 -189
  364. package/src/form/field_bindings/UserSelectFieldBinding.tsx +0 -71
  365. package/src/form/field_bindings/VectorFieldBinding.tsx +0 -209
  366. package/src/form/form_utils.ts +0 -243
  367. package/src/form/index.tsx +0 -36
  368. package/src/form/useClearRestoreValue.tsx +0 -36
  369. package/src/form/useUndoableDiscard.ts +0 -39
  370. package/src/form/validation.ts +0 -583
  371. package/src/hooks/index.ts +0 -16
  372. package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +0 -22
  373. package/src/hooks/navigation/contexts/NavigationStateContext.tsx +0 -16
  374. package/src/hooks/navigation/contexts/UrlContext.tsx +0 -24
  375. package/src/hooks/navigation/contexts/index.ts +0 -14
  376. package/src/hooks/navigation/useAsyncResolver.ts +0 -100
  377. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +0 -218
  378. package/src/hooks/navigation/useBuildNavigationStateController.tsx +0 -134
  379. package/src/hooks/navigation/useBuildUrlController.tsx +0 -66
  380. package/src/hooks/navigation/useNavigationResolution.ts +0 -271
  381. package/src/hooks/navigation/useResolvedCollections.ts +0 -102
  382. package/src/hooks/navigation/useResolvedViews.tsx +0 -139
  383. package/src/hooks/navigation/useTopLevelNavigation.ts +0 -273
  384. package/src/hooks/navigation/utils.ts +0 -200
  385. package/src/hooks/useAdminContext.tsx +0 -83
  386. package/src/hooks/useBreadcrumbsController.tsx +0 -17
  387. package/src/hooks/useBuildSideDialogsController.tsx +0 -145
  388. package/src/hooks/useBuildSidePanel.tsx +0 -315
  389. package/src/hooks/useChildViewSource.ts +0 -46
  390. package/src/hooks/useEntityDisplay.tsx +0 -262
  391. package/src/hooks/useEntityDisplayTitle.tsx +0 -49
  392. package/src/hooks/useHistory.ts +0 -178
  393. package/src/hooks/useRecordActions.tsx +0 -69
  394. package/src/hooks/useResolvedNavigationFrom.tsx +0 -167
  395. package/src/hooks/useResolvedUsers.ts +0 -148
  396. package/src/hooks/useSelectionDialog.tsx +0 -58
  397. package/src/hooks/useSideDialogsController.tsx +0 -25
  398. package/src/hooks/useSidePanel.tsx +0 -13
  399. package/src/index.ts +0 -124
  400. package/src/preview/PropertyPreview.tsx +0 -331
  401. package/src/preview/compact_text.ts +0 -68
  402. package/src/preview/components/ArrayEnumPreview.tsx +0 -39
  403. package/src/preview/components/BooleanPreview.tsx +0 -28
  404. package/src/preview/components/DatePreview.tsx +0 -106
  405. package/src/preview/components/EmptyValue.tsx +0 -10
  406. package/src/preview/components/EnumValuesChip.tsx +0 -39
  407. package/src/preview/components/ImagePreview.tsx +0 -144
  408. package/src/preview/components/InlineEntityListPreview.tsx +0 -42
  409. package/src/preview/components/ReferencePreview.tsx +0 -235
  410. package/src/preview/components/RelationPreview.tsx +0 -271
  411. package/src/preview/components/StorageThumbnail.tsx +0 -147
  412. package/src/preview/components/UrlComponentPreview.tsx +0 -116
  413. package/src/preview/components/UserPreview.tsx +0 -30
  414. package/src/preview/components/date_fns_locales.ts +0 -125
  415. package/src/preview/index.ts +0 -26
  416. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -73
  417. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +0 -67
  418. package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +0 -77
  419. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -49
  420. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -70
  421. package/src/preview/property_previews/ArrayOneOfPreview.tsx +0 -79
  422. package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +0 -35
  423. package/src/preview/property_previews/ArrayPropertyPreview.tsx +0 -79
  424. package/src/preview/property_previews/MapPropertyPreview.tsx +0 -198
  425. package/src/preview/property_previews/NumberPropertyPreview.tsx +0 -39
  426. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +0 -276
  427. package/src/preview/property_previews/StringPropertyPreview.tsx +0 -70
  428. package/src/preview/util.ts +0 -39
  429. package/src/routes/CustomViewRoute.tsx +0 -33
  430. package/src/routes/RebaseRoute.tsx +0 -467
  431. package/src/routes/index.ts +0 -2
  432. package/src/types/components/EntityFormActionsProps.tsx +0 -20
  433. package/src/types/components/EntityFormProps.tsx +0 -119
  434. package/src/types/components/PropertyPreviewProps.tsx +0 -85
  435. package/src/types/components/formex.tsx +0 -2
  436. package/src/types/components/index.ts +0 -3
  437. package/src/types/fields.tsx +0 -340
  438. package/src/types/index.ts +0 -4
  439. package/src/util/dataControllerAdapter.ts +0 -88
  440. package/src/util/entity_actions.ts +0 -28
  441. package/src/util/index.ts +0 -5
  442. package/src/util/navigation_utils.ts +0 -89
  443. package/src/util/number_format.ts +0 -46
  444. package/src/util/previews.ts +0 -131
  445. package/src/util/propertyConfigMapper.ts +0 -134
  446. package/src/util/property_utils.tsx +0 -236
  447. package/src/util/resolutions.ts +0 -96
  448. package/src/util/view_constants.ts +0 -33
  449. package/src/util/view_mode.ts +0 -176
@@ -1,262 +0,0 @@
1
- import type { AdminCollection, EntityDisplayRole } from "@rebasepro/cms-types";
2
- import type { Entity, Property } from "@rebasepro/types";
3
- import { ENTITY_DISPLAY_ROLES } from "@rebasepro/cms-types";
4
- import { useEffect, useMemo, useSyncExternalStore } from "react";
5
- import {
6
- EntityDisplayCache,
7
- entityDisplayKey,
8
- getDisplayPropertyKey,
9
- getDisplayResolver,
10
- getPropertyInPath,
11
- useRebaseContext
12
- } from "@rebasepro/app";
13
- import { getValueInPath } from "@rebasepro/utils";
14
-
15
- import { getEntityTitlePropertyKeyForEntity, isUserSelectProperty, resolveTitleToString } from "../util/previews";
16
- import { getUserLabel, useResolvedUser } from "./useResolvedUsers";
17
-
18
- /**
19
- * What fills one display role for one record.
20
- *
21
- * `value` is `undefined` rather than a placeholder when nothing resolved,
22
- * because the substitute differs by surface and each one knows its own better
23
- * than this hook does: a page heading wants the singular collection name, a link
24
- * wants the id, a draft wants "New customer". A single baked-in fallback is
25
- * exactly what produced three different ones scattered across the consumers.
26
- */
27
- export interface ResolvedDisplayValue<T = unknown> {
28
- /** What goes in the slot. `undefined` when the record has nothing for it. */
29
- value: T | undefined;
30
- /**
31
- * A resolver is in flight, and `value` currently holds the derived answer or
32
- * nothing. Surfaces that can show a skeleton may; none has to.
33
- */
34
- loading: boolean;
35
- /**
36
- * Set only when the value came from a property of this collection. Carries
37
- * what a rich renderer needs — a status shows as its enum's coloured chip,
38
- * an image as a storage thumbnail — which a bare resolved string cannot
39
- * describe.
40
- */
41
- source?: {
42
- key: string;
43
- property: Property | undefined;
44
- value: unknown;
45
- };
46
- }
47
-
48
- /**
49
- * One shared store, so every surface agrees on a record and resolves it once.
50
- *
51
- * Module-level rather than a provider: two app instances on one page share a
52
- * cache keyed by collection path and record id, which *is* the same record.
53
- * Nothing here is user-specific — a resolver that reads per-user data must
54
- * invalidate on sign-out, which {@link useEntityDisplayCache} exposes.
55
- */
56
- let sharedCache: EntityDisplayCache | undefined;
57
-
58
- /**
59
- * The store behind {@link useEntityDisplay}, for invalidating after a write.
60
- *
61
- * Built on first use rather than at module scope. Importing a module should not
62
- * construct anything: it runs during SSR where there is nothing to cache, and it
63
- * made this module unimportable from any test that stubs `@rebasepro/app` —
64
- * which several do, and which is a legitimate thing for them to do.
65
- */
66
- export function useEntityDisplayCache(): EntityDisplayCache {
67
- if (!sharedCache) sharedCache = new EntityDisplayCache();
68
- return sharedCache;
69
- }
70
-
71
- export interface UseEntityDisplayParams<M extends Record<string, unknown>> {
72
- /**
73
- * Optional because several callers look the collection up in the registry by
74
- * path and may not find it — a relation into a collection the panel does not
75
- * register. A hook that could not be called until that succeeded would have
76
- * to sit below an early return, which is not where hooks go.
77
- */
78
- collection?: AdminCollection<M>;
79
- /**
80
- * The record. A resolver is handed the whole entity — its id and path are
81
- * how it reaches anything the record does not carry — so a computed value is
82
- * only available once there is an entity to compute it from.
83
- */
84
- entity?: Entity<M>;
85
- /**
86
- * Values to read a declared path from when they are newer than the entity:
87
- * the live form values while editing. Falls back to `entity.values`.
88
- */
89
- values?: Record<string, unknown>;
90
- /** Set false to skip resolver work entirely — a draft has nothing to show. */
91
- enabled?: boolean;
92
- }
93
-
94
- /**
95
- * What fills one display role of one record.
96
- *
97
- * This is the only implementation. Before it there were seven for the title
98
- * alone — the identity bar, the detail header, inline previews, reference cards,
99
- * list slots, relation chips and the headless view — each re-deriving it from
100
- * `collection.properties` and disagreeing about the answer.
101
- *
102
- * Resolution order, per role:
103
- *
104
- * 1. `admin.display[role]` as a **resolver** — awaited, cached per record and
105
- * role, with the derived value showing meanwhile so nothing flickers empty.
106
- * 2. `admin.display[role]` as a **property path** (or, for the title, the
107
- * deprecated `titleProperty`).
108
- * 3. The **derived** answer: for the title, the best-ranked property carrying a
109
- * readable value; for the rest, today's per-role heuristics.
110
- *
111
- * A user-picker title resolves to the person behind the id, as it always did —
112
- * that path is now here rather than in two of the seven.
113
- */
114
- export function useEntityDisplay<T = unknown, M extends Record<string, unknown> = Record<string, unknown>>(
115
- role: EntityDisplayRole,
116
- {
117
- collection,
118
- entity,
119
- values: valuesProp,
120
- enabled = true
121
- }: UseEntityDisplayParams<M>
122
- ): ResolvedDisplayValue<T> {
123
-
124
- const context = useRebaseContext();
125
- const cache = useEntityDisplayCache();
126
-
127
- const values = valuesProp ?? entity?.values;
128
-
129
- /* ---- the declared or derived key ------------------------------------- */
130
-
131
- // The title is the one role with a ranking behind it: several candidates,
132
- // best first, skipping the ones that hold nothing for *this* record. The
133
- // others are a single declared or derived key.
134
- const declaredKey = collection ? getDisplayPropertyKey(collection, role) : undefined;
135
- const propertyKey = collection && role === "title" && !declaredKey
136
- ? getEntityTitlePropertyKeyForEntity(collection, values, entity?.id)
137
- : declaredKey;
138
-
139
- const rawValue = values && propertyKey ? getValueInPath(values, propertyKey) : undefined;
140
-
141
- // A user picker stores an auth id and renders the person: resolved like a
142
- // relation, and hooked unconditionally so the hook order never changes.
143
- const titleUser = useResolvedUser(
144
- collection && role === "title" && isUserSelectProperty(collection, propertyKey) && typeof rawValue === "string"
145
- ? rawValue
146
- : undefined
147
- );
148
-
149
- const derived = useMemo<T | undefined>(() => {
150
- if (titleUser) return getUserLabel(titleUser) as T;
151
- if (rawValue === undefined || rawValue === null) return undefined;
152
- // Only text roles get flattened to a string; a date stays a date and an
153
- // image stays whatever the storage property holds, so the renderer can
154
- // still format them.
155
- if (role === "title" || role === "subtitle" || role === "status") {
156
- return (resolveTitleToString(rawValue) || undefined) as T | undefined;
157
- }
158
- return rawValue as T;
159
- }, [titleUser, rawValue, role]);
160
-
161
- /* ---- the computed answer --------------------------------------------- */
162
-
163
- const resolver = collection ? getDisplayResolver(collection, role) : undefined;
164
- const canResolve = Boolean(enabled && resolver && entity);
165
- const key = entity ? entityDisplayKey(entity.path, entity.id, role) : undefined;
166
-
167
- const resolved = useSyncExternalStore<unknown>(
168
- // Subscribing unconditionally keeps the hook order stable. The store
169
- // only notifies when an entry changes, so a collection with no resolver
170
- // never re-renders from it.
171
- cb => cache.subscribe(cb),
172
- () => (canResolve && key ? cache.peek(key) : undefined),
173
- // Server render: nothing is resolved, so every slot starts at its
174
- // fallback and hydration does not disagree with the markup.
175
- () => undefined
176
- );
177
-
178
- const loading = Boolean(canResolve && key && resolved === undefined);
179
-
180
- useEffect(() => {
181
- if (!canResolve || !key || !resolver || !entity) return;
182
- if (cache.peek(key) !== undefined) return;
183
- cache.resolve(key, () => resolver({
184
- entity,
185
- context
186
- })).catch(() => {
187
- // Unreachable, and kept only so it stays that way: `resolve` records a
188
- // failure as "nothing" and returns a RESOLVED promise, which is why
189
- // the warning that used to live here could never run — see the note on
190
- // `EntityDisplayCache.resolve`. The cache reports the failure itself
191
- // now, once per key. This exists so that if `resolve` ever starts
192
- // rejecting, it surfaces as a caught no-op rather than an unhandled
193
- // rejection during render.
194
- });
195
- }, [cache, canResolve, key, resolver, entity, context, role]);
196
-
197
- /* ---- the answer ------------------------------------------------------ */
198
-
199
- // A resolver that produced nothing falls back to the derived value rather
200
- // than to blank: it said this record has no computed answer for the role,
201
- // not that the role should be empty.
202
- const computed = canResolve && resolved !== null ? resolved as T | undefined : undefined;
203
- const value = computed ?? derived;
204
-
205
- return useMemo(() => ({
206
- value,
207
- loading,
208
- source: collection && propertyKey && value === derived && derived !== undefined
209
- ? {
210
- key: propertyKey,
211
- property: getPropertyInPath(collection.properties, propertyKey),
212
- value: rawValue
213
- }
214
- : undefined
215
- }), [value, loading, propertyKey, derived, collection, rawValue]);
216
- }
217
-
218
- /**
219
- * Every display role of a record at once — what a list row, a card or a board
220
- * card needs, in one call rather than six.
221
- *
222
- * The role list is iterated from {@link ENTITY_DISPLAY_ROLES} so the hook order
223
- * is fixed and adding a role does not mean editing every caller.
224
- */
225
- export function useEntityDisplayValues<M extends Record<string, unknown>>(
226
- params: UseEntityDisplayParams<M>
227
- ): Record<EntityDisplayRole, ResolvedDisplayValue> & { loading: boolean } {
228
-
229
- // Not a loop over `useEntityDisplay`: the number of hooks a component calls
230
- // has to be fixed at compile time, and a role added to the array later would
231
- // silently change it. Written out, it is checked by the return type.
232
- const title = useEntityDisplay<string, M>("title", params);
233
- const subtitle = useEntityDisplay<string, M>("subtitle", params);
234
- const image = useEntityDisplay<string, M>("image", params);
235
- const status = useEntityDisplay<string, M>("status", params);
236
- const date = useEntityDisplay<Date | string | number, M>("date", params);
237
- const tags = useEntityDisplay<string[] | string, M>("tags", params);
238
-
239
- return useMemo(() => ({
240
- title,
241
- subtitle,
242
- image,
243
- status,
244
- date,
245
- tags,
246
- loading: title.loading || subtitle.loading || image.loading
247
- || status.loading || date.loading || tags.loading
248
- }), [title, subtitle, image, status, date, tags]);
249
- }
250
-
251
- /**
252
- * What the record is called — the one role asked for often enough on its own to
253
- * deserve a name.
254
- */
255
- export function useEntityTitle<M extends Record<string, unknown>>(
256
- params: UseEntityDisplayParams<M>
257
- ): ResolvedDisplayValue<string> {
258
- return useEntityDisplay<string, M>("title", params);
259
- }
260
-
261
- /** Re-exported so a caller can iterate roles without reaching into types. */
262
- export { ENTITY_DISPLAY_ROLES };
@@ -1,49 +0,0 @@
1
- import type { AdminCollection } from "@rebasepro/cms-types";
2
- import type { Entity, EntityStatus } from "@rebasepro/types";
3
- import { useEntityTitle } from "./useEntityDisplay";
4
-
5
- export interface UseEntityDisplayTitleParams<M extends Record<string, unknown>> {
6
- collection: AdminCollection<M>;
7
- /** The record. Needed for a computed title; see {@link useEntityTitle}. */
8
- entity?: Entity<M>;
9
- /** Live form values, when they are ahead of the entity. */
10
- values?: Record<string, unknown>;
11
- status: EntityStatus;
12
- }
13
-
14
- /**
15
- * The heading for a record: the identity bar and the breadcrumb.
16
- *
17
- * Everything about *what a record is called* lives in {@link useEntityTitle}.
18
- * What is left here is the heading's own two rules, which are presentation, not
19
- * identity:
20
- *
21
- * The guard on `status` is the first. The title resolver returns the first
22
- * candidate carrying a value, and on a brand new entity the only values are the
23
- * property defaults — so creating a blog post opened a page headed **draft**,
24
- * the default of its `status` enum. A record that does not exist yet has no
25
- * name; it has an intent.
26
- *
27
- * The fallback is the second. A page needs a heading even when the record has
28
- * nothing readable in it, and the honest one is what kind of thing it is.
29
- */
30
- export function useEntityDisplayTitle<M extends Record<string, unknown>>({
31
- collection,
32
- entity,
33
- values,
34
- status
35
- }: UseEntityDisplayTitleParams<M>): string {
36
-
37
- const isNew = status === "new";
38
- const singular = collection.singularName ?? collection.name;
39
-
40
- const { value: title } = useEntityTitle<M>({
41
- collection,
42
- entity,
43
- values,
44
- enabled: !isNew
45
- });
46
-
47
- if (isNew) return `New ${singular.toLowerCase()}`;
48
- return title ?? singular;
49
- }
@@ -1,178 +0,0 @@
1
- import { useCallback, useEffect, useRef, useState, useMemo } from "react";
2
- import { useApiBase, useApiConfig } from "@rebasepro/app";
3
- import type { EntityHistoryEntry } from "@rebasepro/types";
4
-
5
- /**
6
- * What the history REST endpoint returns. The fourth declaration of this shape
7
- * — the two drivers had one each and disagreed on `updated_at` — now an alias
8
- * of the one in `@rebasepro/types`.
9
- */
10
- export type HistoryEntryData = EntityHistoryEntry;
11
-
12
- export interface UseEntityHistoryResult {
13
- entries: HistoryEntryData[];
14
- total: number;
15
- isLoading: boolean;
16
- hasMore: boolean;
17
- error?: Error;
18
- loadMore: () => void;
19
- revert: (historyId: string) => Promise<Record<string, unknown>>;
20
- }
21
-
22
- /**
23
- * Hook to fetch entity history from the backend REST API.
24
- * Replaces the old subcollection-based approach with a proper API call.
25
- */
26
- export function useHistory(params: {
27
- slug: string;
28
- entityId: string | number | undefined;
29
- enabled?: boolean;
30
- pageSize?: number;
31
- /**
32
- * Bumped by the caller when the record is saved. A save is the one event
33
- * that adds a revision, and nothing else here would notice it: without
34
- * this the open panel keeps showing the list it fetched when it opened,
35
- * so the revision you just created never appears.
36
- */
37
- refreshToken?: number;
38
- }): UseEntityHistoryResult {
39
- const { slug, entityId, enabled = true, pageSize = 10, refreshToken } = params;
40
- const apiConfig = useApiConfig();
41
- const apiBase = useApiBase();
42
-
43
- const [entries, setEntries] = useState<HistoryEntryData[]>([]);
44
- const [total, setTotal] = useState(0);
45
- const [isLoading, setIsLoading] = useState(false);
46
- const [hasMore, setHasMore] = useState(true);
47
- const [error, setError] = useState<Error | undefined>();
48
- const [offset, setOffset] = useState(0);
49
- const [refreshTrigger, setRefreshTrigger] = useState(0);
50
-
51
- // Track the current entity identity so we can detect stale responses.
52
- // `refreshToken` is part of the identity on purpose: a save makes the list
53
- // we are holding a stale page of a longer list, which is the same problem
54
- // as having moved to a different record.
55
- const entityKey = `${slug}/${entityId}/${refreshToken ?? 0}`;
56
- const currentEntityRef = useRef<string | undefined>(undefined);
57
-
58
- const fetchEntries = useCallback(async (
59
- currentOffset: number,
60
- signal?: AbortSignal
61
- ) => {
62
- if (!apiConfig?.apiUrl || !entityId || !enabled) return;
63
-
64
- setIsLoading(true);
65
- setError(undefined);
66
-
67
- try {
68
- const token = await apiConfig.getAuthToken?.();
69
- const headers: Record<string, string> = {
70
- "Content-Type": "application/json"
71
- };
72
- if (token) headers["Authorization"] = `Bearer ${token}`;
73
-
74
- const url = `${apiBase}/data/${slug}/${entityId}/history?limit=${pageSize}&offset=${currentOffset}`;
75
- const response = await fetch(url, { headers,
76
- signal });
77
-
78
- // Check if the request was aborted or the entity changed while in-flight
79
- if (signal?.aborted) return;
80
- if (currentEntityRef.current !== entityKey) return;
81
-
82
- if (!response.ok) {
83
- const errorData = await response.json().catch(() => ({ error: { message: response.statusText } }));
84
- throw new Error(errorData.error?.message || `Failed to fetch history (${response.status})`);
85
- }
86
-
87
- const result = await response.json();
88
-
89
- if (currentOffset === 0) {
90
- setEntries(result.data);
91
- } else {
92
- setEntries(prev => [...prev, ...result.data]);
93
- }
94
-
95
- setTotal(result.meta.total);
96
- setHasMore(result.meta.hasMore);
97
- } catch (err) {
98
- // Don't set error state for intentional aborts
99
- if (err instanceof DOMException && err.name === "AbortError") return;
100
- setError(err instanceof Error ? err : new Error(String(err)));
101
- } finally {
102
- setIsLoading(false);
103
- }
104
- }, [apiConfig, apiBase, slug, entityId, entityKey, enabled, pageSize]);
105
-
106
- // Single unified effect: reset state when entity changes, fetch when offset changes.
107
- // Uses AbortController to cancel stale requests on entity change or unmount.
108
- useEffect(() => {
109
- const isNewEntity = currentEntityRef.current !== entityKey;
110
-
111
- if (isNewEntity) {
112
- // Reset state for new entity
113
- currentEntityRef.current = entityKey;
114
- setEntries([]);
115
- setTotal(0);
116
- setHasMore(true);
117
- setOffset(0);
118
- }
119
-
120
- if (!enabled || !entityId) return;
121
-
122
- const abortController = new AbortController();
123
- // When entity changed, always fetch from offset 0
124
- const effectiveOffset = isNewEntity ? 0 : offset;
125
- fetchEntries(effectiveOffset, abortController.signal);
126
-
127
- return () => {
128
- abortController.abort();
129
- };
130
- }, [fetchEntries, offset, enabled, entityId, entityKey, refreshTrigger]);
131
-
132
- const loadMore = useCallback(() => {
133
- if (!isLoading && hasMore && offset + entries.length < total) {
134
- setOffset(prev => prev + pageSize);
135
- }
136
- }, [isLoading, hasMore, pageSize, offset, entries.length, total]);
137
-
138
- const revert = useCallback(async (historyId: string): Promise<Record<string, unknown>> => {
139
- if (!apiConfig?.apiUrl || !entityId) {
140
- throw new Error("Cannot revert: missing API configuration or entity ID");
141
- }
142
-
143
- const token = await apiConfig.getAuthToken?.();
144
- const headers: Record<string, string> = {
145
- "Content-Type": "application/json"
146
- };
147
- if (token) headers["Authorization"] = `Bearer ${token}`;
148
-
149
- const url = `${apiBase}/data/${slug}/${entityId}/history/${historyId}/revert`;
150
- const response = await fetch(url, { method: "POST",
151
- headers });
152
-
153
- if (!response.ok) {
154
- const errorData = await response.json().catch(() => ({ error: { message: response.statusText } }));
155
- throw new Error(errorData.error?.message || `Failed to revert (${response.status})`);
156
- }
157
-
158
- const result = await response.json();
159
-
160
- // Refresh the history list after revert by resetting the entity ref
161
- // and triggering the effect.
162
- currentEntityRef.current = undefined;
163
- setRefreshTrigger(prev => prev + 1);
164
-
165
- // Return the reverted entity data so callers can update the form
166
- return result.data as Record<string, unknown>;
167
- }, [apiConfig, apiBase, slug, entityId]);
168
-
169
- return useMemo(() => ({
170
- entries,
171
- total,
172
- isLoading,
173
- hasMore,
174
- error,
175
- loadMore,
176
- revert
177
- }), [entries, total, isLoading, hasMore, error, loadMore, revert]);
178
- }
@@ -1,69 +0,0 @@
1
- import type { EntityAction, AdminCollection } from "@rebasepro/cms-types";
2
- import type { Entity } from "@rebasepro/types";
3
- import { useMemo } from "react";
4
- import { useCustomizationController, usePermissions } from "@rebasepro/app";
5
- import { copyEntityAction, deleteEntityAction, unlinkEntityAction } from "../components/common/default_entity_actions";
6
- import { mergeEntityActions } from "../util/entity_actions";
7
- import { resolveEntityAction } from "../util/resolutions";
8
- import { useChildViewSource } from "./useChildViewSource";
9
-
10
- export interface UseRecordActionsParams<M extends Record<string, unknown>> {
11
- collection: AdminCollection<M>;
12
- path: string;
13
- entity?: Entity<M>;
14
- }
15
-
16
- /**
17
- * The actions you can perform *on* a record — copy, delete, and whatever the
18
- * collection adds — resolved against the current user's permissions.
19
- *
20
- * Extracted from the form's footer so the identity bar can own them. They are
21
- * not ways to leave the form, so they never belonged next to Save; putting them
22
- * in the bar's overflow menu is what let the footer disappear instead of
23
- * becoming a full-width strip holding two icon buttons.
24
- */
25
- export function useRecordActions<M extends Record<string, unknown>>({
26
- collection,
27
- path,
28
- entity
29
- }: UseRecordActionsParams<M>): EntityAction[] {
30
-
31
- const { canCreate, canDelete } = usePermissions();
32
- const customizationController = useCustomizationController();
33
-
34
- // Rows shared through a junction: the delete action here removes the link,
35
- // because that is what the server does for this path.
36
- const childViewSource = useChildViewSource(path);
37
- const isLinkedChildView = childViewSource?.kind === "relation" && childViewSource.mode === "linked";
38
-
39
- return useMemo((): EntityAction[] => {
40
- const customEntityActions = (collection.entityActions ?? [])
41
- .map(action => resolveEntityAction(action, customizationController.entityActions))
42
- .filter(Boolean) as EntityAction[];
43
-
44
- const createEnabled = canCreate(collection, path);
45
- const deleteEnabled = entity ? canDelete(collection, path, entity) : false;
46
- const disableActions = collection.disableDefaultActions ?? [];
47
-
48
- const actions: EntityAction[] = [];
49
- if (createEnabled && !disableActions.includes("copy"))
50
- actions.push(copyEntityAction);
51
- if (deleteEnabled && !disableActions.includes("delete"))
52
- actions.push(isLinkedChildView ? unlinkEntityAction : deleteEntityAction);
53
-
54
- const merged = customEntityActions.length
55
- ? mergeEntityActions(actions, customEntityActions)
56
- : actions;
57
-
58
- return merged.filter(a => a.includeInForm === undefined || a.includeInForm);
59
- }, [
60
- canCreate,
61
- canDelete,
62
- collection,
63
- path,
64
- customizationController.entityActions?.length,
65
- entity,
66
- collection.disableDefaultActions,
67
- isLinkedChildView
68
- ]);
69
- }