@rebasepro/admin 0.9.0 → 0.9.1-canary.0de22e0

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 (264) hide show
  1. package/README.md +7 -7
  2. package/dist/{CollectionEditorDialog-B-7uW3iJ.js → CollectionEditorDialog-D7odTn0N.js} +150 -36
  3. package/dist/CollectionEditorDialog-D7odTn0N.js.map +1 -0
  4. package/dist/{PropertyEditView-7KMTcrqi.js → PropertyEditView-i51tFOfM.js} +6 -6
  5. package/dist/PropertyEditView-i51tFOfM.js.map +1 -0
  6. package/dist/{RouterCollectionsStudioView-epqIbZrJ.js → RouterCollectionsStudioView-B9AjTCjT.js} +5 -5
  7. package/dist/RouterCollectionsStudioView-B9AjTCjT.js.map +1 -0
  8. package/dist/collection_editor/api/generateCollectionApi.d.ts +4 -4
  9. package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +1 -1
  10. package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +1 -1
  11. package/dist/collection_editor/useSafeSnackbarController.d.ts +1 -1
  12. package/dist/collection_editor_ui.js +5 -5
  13. package/dist/collection_editor_ui.js.map +1 -1
  14. package/dist/components/CollectionTableBinding/CollectionTableBindingProps.d.ts +1 -1
  15. package/dist/components/CollectionTableBinding/internal/EntityTableCell.d.ts +1 -1
  16. package/dist/components/CollectionTableBinding/internal/popup_field/PopupFormField.d.ts +1 -1
  17. package/dist/components/CollectionTableBinding/table_bindings.d.ts +1 -1
  18. package/dist/components/CollectionViewBinding/hooks/useCollectionInlineEditor.d.ts +1 -1
  19. package/dist/components/{RebaseCMS.d.ts → RebaseAdmin.d.ts} +2 -2
  20. package/dist/components/RebaseLayout.d.ts +5 -4
  21. package/dist/components/RebaseShell.d.ts +1 -0
  22. package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
  23. package/dist/components/SelectableTable/SelectableTableContext.d.ts +1 -1
  24. package/dist/components/SidePanelProvider.d.ts +1 -1
  25. package/dist/components/field_configs.d.ts +17 -0
  26. package/dist/components/index.d.ts +1 -1
  27. package/dist/contexts/BreacrumbsContext.d.ts +1 -1
  28. package/dist/editor.js +1 -1
  29. package/dist/editor.js.map +1 -1
  30. package/dist/export-BM6HPujv.js +518 -0
  31. package/dist/export-BM6HPujv.js.map +1 -0
  32. package/dist/form/components/LocalChangesMenu.d.ts +1 -1
  33. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  34. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +1 -1
  35. package/dist/{history-7X5bON_n.js → history-CtIPJxvQ.js} +6 -6
  36. package/dist/history-CtIPJxvQ.js.map +1 -0
  37. package/dist/hooks/useSelectionDialog.d.ts +1 -1
  38. package/dist/import-DzQnT03v.js +328 -0
  39. package/dist/import-DzQnT03v.js.map +1 -0
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.js +3300 -2
  42. package/dist/index.js.map +1 -0
  43. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  44. package/dist/preview/util.d.ts +1 -0
  45. package/dist/types/components/formex.d.ts +1 -1
  46. package/dist/util/view_mode.d.ts +54 -0
  47. package/dist/{src-sUZfe29F.js → util-XFwQ9FEc.js} +17554 -21391
  48. package/dist/util-XFwQ9FEc.js.map +1 -0
  49. package/package.json +12 -17
  50. package/src/collection_editor/ConfigControllerProvider.tsx +1 -1
  51. package/src/collection_editor/api/generateCollectionApi.ts +4 -4
  52. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +1 -1
  53. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +1 -1
  54. package/src/collection_editor/ui/EditorCollectionAction.tsx +1 -1
  55. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +1 -1
  56. package/src/collection_editor/ui/EditorEntityAction.tsx +1 -1
  57. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +1 -1
  58. package/src/collection_editor/ui/KanbanSetupAction.tsx +1 -1
  59. package/src/collection_editor/ui/MissingReferenceWidget.tsx +1 -1
  60. package/src/collection_editor/ui/NewCollectionButton.tsx +1 -1
  61. package/src/collection_editor/ui/NewCollectionCard.tsx +1 -1
  62. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +1 -1
  63. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +1 -1
  64. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +3 -3
  65. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +3 -3
  66. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +2 -2
  67. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +2 -2
  68. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +139 -13
  69. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +1 -1
  70. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +1 -1
  71. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +1 -1
  72. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +2 -2
  73. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +2 -2
  74. package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +1 -1
  75. package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +1 -1
  76. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +2 -2
  77. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +2 -2
  78. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +2 -2
  79. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +2 -2
  80. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +2 -2
  81. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +1 -1
  82. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +1 -1
  83. package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +1 -1
  84. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +2 -2
  85. package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +1 -1
  86. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +1 -1
  87. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +2 -2
  88. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +1 -1
  89. package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +1 -1
  90. package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +3 -3
  91. package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +2 -2
  92. package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +3 -3
  93. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +2 -2
  94. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +2 -2
  95. package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +2 -2
  96. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +2 -2
  97. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +1 -1
  98. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +1 -1
  99. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +2 -2
  100. package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +2 -2
  101. package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +1 -1
  102. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +1 -1
  103. package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +1 -1
  104. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +1 -1
  105. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +1 -1
  106. package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +2 -2
  107. package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +2 -2
  108. package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +2 -2
  109. package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +2 -2
  110. package/src/collection_editor/useSafeSnackbarController.ts +1 -1
  111. package/src/components/AdminModeSyncer.tsx +1 -1
  112. package/src/components/ArrayContainer.tsx +1 -1
  113. package/src/components/ClearFilterSortButton.tsx +1 -1
  114. package/src/components/CollectionPanel.tsx +1 -1
  115. package/src/components/CollectionTableBinding/CollectionRowActions.tsx +3 -3
  116. package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +3 -3
  117. package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +1 -1
  118. package/src/components/CollectionTableBinding/PropertyTableCell.tsx +1 -1
  119. package/src/components/CollectionTableBinding/column_utils.tsx +1 -1
  120. package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +2 -2
  121. package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +2 -2
  122. package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +2 -2
  123. package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +1 -1
  124. package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +1 -1
  125. package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +2 -2
  126. package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +1 -1
  127. package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +4 -4
  128. package/src/components/CollectionTableBinding/table_bindings.tsx +1 -1
  129. package/src/components/CollectionViewBinding/BoardCardBinding.tsx +2 -2
  130. package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +4 -4
  131. package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +1 -1
  132. package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +3 -3
  133. package/src/components/CollectionViewBinding/CollectionViewActions.tsx +3 -3
  134. package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +77 -127
  135. package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +5 -9
  136. package/src/components/CollectionViewBinding/EntityCardBinding.tsx +3 -3
  137. package/src/components/CollectionViewBinding/FiltersDialog.tsx +19 -1
  138. package/src/components/CollectionViewBinding/SplitListView.tsx +114 -63
  139. package/src/components/CollectionViewBinding/ViewModeToggle.tsx +1 -1
  140. package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +2 -2
  141. package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +2 -2
  142. package/src/components/CollectionViewBinding/useBoardDataController.tsx +9 -3
  143. package/src/components/CollectionViewBinding/usePreviewSlots.ts +1 -1
  144. package/src/components/DefaultAppBar.tsx +3 -3
  145. package/src/components/DefaultDrawer.tsx +3 -3
  146. package/src/components/DeleteEntityDialog.tsx +1 -1
  147. package/src/components/DetailViewBinding.tsx +7 -5
  148. package/src/components/DrawerNavigationGroup.tsx +2 -2
  149. package/src/components/EditFormActions.tsx +6 -6
  150. package/src/components/EditViewBinding.tsx +9 -8
  151. package/src/components/EntityPreviewBinding.tsx +5 -4
  152. package/src/components/EntityViewBinding.tsx +2 -2
  153. package/src/components/HomePage/ContentHomePage.tsx +6 -5
  154. package/src/components/HomePage/FavouritesView.tsx +2 -2
  155. package/src/components/HomePage/NavigationCardBinding.tsx +3 -3
  156. package/src/components/HomePage/NavigationGroup.tsx +1 -1
  157. package/src/components/HomePage/RenameGroupDialog.tsx +1 -1
  158. package/src/components/JsonPreviewBinding.tsx +1 -1
  159. package/src/components/{RebaseCMS.tsx → RebaseAdmin.tsx} +3 -3
  160. package/src/components/RebaseAuthGate.tsx +2 -2
  161. package/src/components/RebaseLayout.tsx +7 -13
  162. package/src/components/RebaseNavigation.tsx +18 -3
  163. package/src/components/RebaseRouteDefs.tsx +3 -3
  164. package/src/components/RebaseShell.tsx +2 -1
  165. package/src/components/ReferenceTable/SelectionTableBinding.tsx +7 -6
  166. package/src/components/ReferenceWidget.tsx +1 -1
  167. package/src/components/RelationSelector.tsx +1 -1
  168. package/src/components/SearchIconsView.tsx +2 -2
  169. package/src/components/SelectableTable/SelectableTable.tsx +2 -2
  170. package/src/components/SelectableTable/SelectableTableContext.tsx +1 -1
  171. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +1 -1
  172. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +1 -1
  173. package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +1 -1
  174. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +2 -2
  175. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +1 -1
  176. package/src/components/SideDialogs.tsx +1 -1
  177. package/src/components/SidePanelBinding.tsx +47 -9
  178. package/src/components/SidePanelProvider.tsx +15 -12
  179. package/src/components/UserSelector.tsx +1 -1
  180. package/src/components/admin/CreationResultDialog.tsx +6 -3
  181. package/src/components/app/Scaffold.tsx +6 -2
  182. package/src/components/common/default_entity_actions.tsx +123 -25
  183. package/src/components/field_configs.tsx +42 -25
  184. package/src/components/history/EntityHistoryEntry.tsx +1 -1
  185. package/src/components/history/EntityHistoryView.tsx +5 -5
  186. package/src/components/history/LastEditedByIndicator.tsx +2 -2
  187. package/src/components/index.ts +1 -1
  188. package/src/contexts/BreacrumbsContext.tsx +1 -1
  189. package/src/data_export/export/BasicExportAction.tsx +1 -1
  190. package/src/data_export/export/ExportCollectionAction.tsx +1 -1
  191. package/src/data_import/components/DataNewPropertiesMapping.tsx +1 -1
  192. package/src/data_import/components/ImportFileUpload.tsx +1 -1
  193. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +3 -5
  194. package/src/data_import/components/ImportSaveInProgress.tsx +1 -1
  195. package/src/data_import/import/ImportCollectionAction.tsx +8 -8
  196. package/src/data_import/utils/data.ts +2 -2
  197. package/src/data_import/utils/get_properties_mapping.ts +1 -1
  198. package/src/editor/components/image-bubble.tsx +1 -1
  199. package/src/editor/components/table-bubble.tsx +1 -1
  200. package/src/editor/editor.tsx +1 -1
  201. package/src/editor/selectors/color-selector.tsx +1 -1
  202. package/src/editor/selectors/link-selector.tsx +1 -1
  203. package/src/editor/selectors/node-selector.tsx +2 -2
  204. package/src/editor/selectors/text-buttons.tsx +1 -1
  205. package/src/form/EntityForm.tsx +8 -5
  206. package/src/form/EntityFormActions.tsx +1 -1
  207. package/src/form/EntityFormBinding.tsx +7 -5
  208. package/src/form/PropertyFieldBinding.tsx +3 -3
  209. package/src/form/components/ErrorFocus.tsx +1 -1
  210. package/src/form/components/LocalChangesMenu.tsx +3 -3
  211. package/src/form/components/StorageItemPreview.tsx +1 -1
  212. package/src/form/components/StorageUploadProgress.tsx +3 -3
  213. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +3 -2
  214. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +4 -3
  215. package/src/form/field_bindings/BlockFieldBinding.tsx +4 -3
  216. package/src/form/field_bindings/DateTimeFieldBinding.tsx +3 -2
  217. package/src/form/field_bindings/KeyValueFieldBinding.tsx +4 -3
  218. package/src/form/field_bindings/MapFieldBinding.tsx +3 -2
  219. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +4 -3
  220. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +2 -1
  221. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +3 -2
  222. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +2 -1
  223. package/src/form/field_bindings/ReferenceFieldBinding.tsx +5 -4
  224. package/src/form/field_bindings/RelationFieldBinding.tsx +3 -2
  225. package/src/form/field_bindings/RepeatFieldBinding.tsx +3 -2
  226. package/src/form/field_bindings/SelectFieldBinding.tsx +2 -1
  227. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +5 -4
  228. package/src/form/field_bindings/SwitchFieldBinding.tsx +2 -1
  229. package/src/form/field_bindings/TextFieldBinding.tsx +2 -1
  230. package/src/form/field_bindings/UserSelectFieldBinding.tsx +2 -1
  231. package/src/form/field_bindings/VectorFieldBinding.tsx +2 -1
  232. package/src/form/form_utils.ts +1 -1
  233. package/src/hooks/navigation/useNavigationResolution.ts +19 -4
  234. package/src/hooks/useBuildSidePanel.tsx +10 -2
  235. package/src/hooks/useCMSContext.tsx +1 -1
  236. package/src/hooks/useHistory.ts +1 -1
  237. package/src/hooks/useResolvedNavigationFrom.tsx +4 -2
  238. package/src/hooks/useSelectionDialog.tsx +3 -3
  239. package/src/index.ts +3 -3
  240. package/src/preview/PropertyPreview.tsx +2 -2
  241. package/src/preview/components/DatePreview.tsx +1 -1
  242. package/src/preview/components/EnumValuesChip.tsx +1 -1
  243. package/src/preview/components/ImagePreview.tsx +2 -2
  244. package/src/preview/components/ReferencePreview.tsx +3 -3
  245. package/src/preview/components/RelationPreview.tsx +3 -3
  246. package/src/preview/components/StorageThumbnail.tsx +1 -1
  247. package/src/preview/components/UrlComponentPreview.tsx +2 -9
  248. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -1
  249. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -1
  250. package/src/preview/property_previews/ArrayOneOfPreview.tsx +1 -1
  251. package/src/preview/property_previews/ArrayPropertyPreview.tsx +1 -1
  252. package/src/preview/property_previews/NumberPropertyPreview.tsx +1 -1
  253. package/src/preview/util.ts +9 -0
  254. package/src/routes/CustomViewRoute.tsx +2 -1
  255. package/src/routes/RebaseRoute.tsx +21 -26
  256. package/src/types/components/formex.tsx +1 -1
  257. package/src/util/navigation_utils.ts +2 -5
  258. package/src/util/previews.ts +4 -2
  259. package/src/util/view_mode.ts +102 -0
  260. package/dist/CollectionEditorDialog-B-7uW3iJ.js.map +0 -1
  261. package/dist/PropertyEditView-7KMTcrqi.js.map +0 -1
  262. package/dist/RouterCollectionsStudioView-epqIbZrJ.js.map +0 -1
  263. package/dist/history-7X5bON_n.js.map +0 -1
  264. package/dist/src-sUZfe29F.js.map +0 -1
package/src/index.ts CHANGED
@@ -46,7 +46,7 @@ export {
46
46
  DrawerFooterActions,
47
47
  AdminModeSyncer,
48
48
  // ContentHomePage is lazy-loaded — not re-exported here
49
- RebaseCMS,
49
+ RebaseAdmin,
50
50
  RebaseShell,
51
51
  RebaseAuthGate,
52
52
  RebaseNavigation,
@@ -77,7 +77,7 @@ export {
77
77
  mergeEntityActions,
78
78
  resolveEntityAction,
79
79
  resolveEntityView,
80
- // Property utilities (moved from @rebasepro/core — property-aware logic belongs in CMS)
80
+ // Property utilities (moved from @rebasepro/app — property-aware logic belongs in CMS)
81
81
  isReferenceProperty,
82
82
  isRelationProperty,
83
83
  getIconForWidget,
@@ -87,7 +87,7 @@ export {
87
87
  getBracketNotation,
88
88
  getPropertiesWithPropertiesOrder,
89
89
  getDefaultPropertiesOrder,
90
- // Preview utilities (moved from @rebasepro/core — property-aware logic belongs in CMS)
90
+ // Preview utilities (moved from @rebasepro/app — property-aware logic belongs in CMS)
91
91
  getEntityPreviewKeys,
92
92
  getEntityTitlePropertyKey
93
93
  } from "./util";
@@ -5,7 +5,7 @@ import { deepEqual as equal } from "fast-equals"
5
5
  import { EntityReference, EntityRelation } from "@rebasepro/types";
6
6
  import type { PropertyPreviewProps } from "../types/components/PropertyPreviewProps";
7
7
  import { resolveProperty, normalizeToEntityRelation } from "@rebasepro/common";
8
- import { useAuthController, useCustomizationController, resolveComponentRef } from "@rebasepro/core";
8
+ import { useAuthController, useCustomizationController, resolveComponentRef } from "@rebasepro/app";
9
9
  import { EmptyValue } from "./components/EmptyValue";
10
10
  import { UrlComponentPreview } from "./components/UrlComponentPreview";
11
11
  import { StorageThumbnail } from "./components/StorageThumbnail";
@@ -23,7 +23,7 @@ import { ReferencePreview } from "./components/ReferencePreview";
23
23
  import { DatePreview } from "./components/DatePreview";
24
24
  import { BooleanPreview } from "./components/BooleanPreview";
25
25
  import { NumberPropertyPreview } from "./property_previews/NumberPropertyPreview";
26
- import { ErrorView } from "@rebasepro/core";
26
+ import { ErrorView } from "@rebasepro/app";
27
27
  import { RelationPreview } from "./components/RelationPreview";
28
28
  import { UserPreview } from "./components/UserPreview";
29
29
 
@@ -2,7 +2,7 @@ import React from "react";
2
2
 
3
3
  import { format } from "date-fns";
4
4
  import * as locales from "date-fns/locale";
5
- import { useCustomizationController } from "@rebasepro/core";
5
+ import { useCustomizationController } from "@rebasepro/app";
6
6
  import { defaultDateFormat } from "@rebasepro/utils";
7
7
 
8
8
  export interface DatePreviewProps {
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import { Chip } from "@rebasepro/ui";
3
3
  import { EnumValues } from "@rebasepro/types";
4
4
  import { enumToObjectEntries, getLabelOrConfigFrom } from "@rebasepro/common";
5
- import { buildEnumLabel, getColorScheme } from "@rebasepro/core";
5
+ import { buildEnumLabel, getColorScheme } from "@rebasepro/app";
6
6
 
7
7
  export interface EnumValuesChipProps {
8
8
  enumValues?: EnumValues;
@@ -2,8 +2,8 @@ import { CopyIcon, ExternalLinkIcon, ImageOffIcon } from "@rebasepro/ui";
2
2
  import React, { CSSProperties, useMemo, useState, useEffect } from "react";import { IconButton, Tooltip } from "@rebasepro/ui";
3
3
  import { PreviewSize } from "../../types/components/PropertyPreviewProps";
4
4
  import { getThumbnailMeasure } from "../util";
5
- import { useTranslation } from "@rebasepro/core";
6
- import { sanitizeUrl } from "./UrlComponentPreview";
5
+ import { useTranslation } from "@rebasepro/app";
6
+ import { sanitizeUrl } from "../util";
7
7
 
8
8
  /**
9
9
  * @group Preview components
@@ -3,12 +3,12 @@ import * as React from "react";
3
3
 
4
4
  import { Entity, EntityReference } from "@rebasepro/types";
5
5
  import type { PreviewSize } from "../../types/components/PropertyPreviewProps";
6
- import { useCustomizationController, useFetch, useComponentOverride, CollectionScopeProvider } from "@rebasepro/core";
6
+ import { useCustomizationController, useFetch, useComponentOverride, CollectionScopeProvider } from "@rebasepro/app";
7
7
  import { Skeleton } from "@rebasepro/ui";
8
8
  import { ErrorBoundary } from "@rebasepro/ui";
9
- import { ErrorView } from "@rebasepro/core";
9
+ import { ErrorView } from "@rebasepro/app";
10
10
  import { EntityPreviewBinding, EntityPreviewContainer } from "../../components/EntityPreviewBinding";
11
- import { useCollectionRegistryController } from "../../index";
11
+ import { useCollectionRegistryController } from "../../hooks/navigation/contexts/CollectionRegistryContext";
12
12
  import { getEntityTitlePropertyKey } from "../../util/previews";
13
13
  import { getValueInPath } from "@rebasepro/utils";
14
14
 
@@ -3,10 +3,10 @@ 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, useFetch, ErrorView, useComponentOverride, CollectionScopeProvider } from "@rebasepro/core";
6
+ import { useCustomizationController, useFetch, ErrorView, useComponentOverride, CollectionScopeProvider } from "@rebasepro/app";
7
7
  import { Skeleton } from "@rebasepro/ui";
8
- import { EntityPreviewBinding, EntityPreviewContainer } from "../../components";
9
- import { useCollectionRegistryController } from "../../index";
8
+ import { EntityPreviewBinding, EntityPreviewContainer } from "../../components/EntityPreviewBinding";
9
+ import { useCollectionRegistryController } from "../../hooks/navigation/contexts/CollectionRegistryContext";
10
10
  import { getEntityTitlePropertyKey } from "../../util/previews";
11
11
  import { getValueInPath } from "@rebasepro/utils";
12
12
 
@@ -2,7 +2,7 @@ import React, { useEffect } from "react";
2
2
 
3
3
  import { renderSkeletonImageThumbnail } from "../property_previews/SkeletonPropertyComponent";
4
4
  import { UrlComponentPreview } from "./UrlComponentPreview";
5
- import { ErrorView, useStorageSource, useStorageSources } from "@rebasepro/core";
5
+ import { ErrorView, useStorageSource, useStorageSources } from "@rebasepro/app";
6
6
  import { resolveStorageSource } from "@rebasepro/common";
7
7
  import { DownloadConfig, FileType } from "@rebasepro/types";
8
8
  import type { PreviewSize } from "../../types/components/PropertyPreviewProps";
@@ -5,16 +5,9 @@ import { PreviewType } from "@rebasepro/types";
5
5
  import type { PreviewSize } from "../../types/components/PropertyPreviewProps";
6
6
  import { cls, ExternalLinkIcon, FileTextIcon, Tooltip, Typography } from "@rebasepro/ui";
7
7
  import { EmptyValue } from "./EmptyValue";
8
- import { getThumbnailMeasure } from "../util";
8
+ import { getThumbnailMeasure, sanitizeUrl } from "../util";
9
9
 
10
- export function sanitizeUrl(url: string | undefined): string {
11
- if (!url) return "about:blank";
12
- const trimmed = url.trim();
13
- if (/^(?:javascript|data|vbscript):/i.test(trimmed)) {
14
- return "about:blank";
15
- }
16
- return trimmed;
17
- }
10
+ export { sanitizeUrl };
18
11
 
19
12
  /**
20
13
  * @group Preview components
@@ -2,7 +2,7 @@ import type { ArrayProperty, Property } from "@rebasepro/types";
2
2
  import React from "react";
3
3
 
4
4
  import type { PropertyPreviewProps, PreviewSize } from "../../types/components/PropertyPreviewProps";
5
- import { useAuthController, useCustomizationController } from "@rebasepro/core";
5
+ import { useAuthController, useCustomizationController } from "@rebasepro/app";
6
6
  import { PropertyPreview } from "../PropertyPreview";
7
7
  import { ErrorBoundary } from "@rebasepro/ui";
8
8
 
@@ -1,7 +1,7 @@
1
1
  import type { ArrayProperty, StringProperty } from "@rebasepro/types";
2
2
  import React from "react";
3
3
  import type { PropertyPreviewProps } from "../../types/components/PropertyPreviewProps";
4
- import { StringPropertyPreview } from "../../preview";
4
+ import { StringPropertyPreview } from "./StringPropertyPreview";
5
5
  import { ErrorBoundary } from "@rebasepro/ui";
6
6
 
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import type { ArrayProperty, Property } from "@rebasepro/types";
2
2
  import React from "react";
3
3
  import type { PropertyPreviewProps, PreviewSize } from "../../types/components/PropertyPreviewProps";
4
- import { useAuthController, useCustomizationController } from "@rebasepro/core";
4
+ import { useAuthController, useCustomizationController } from "@rebasepro/app";
5
5
  import { PropertyPreview } from "../PropertyPreview";
6
6
  import { cls, defaultBorderMixin } from "@rebasepro/ui";
7
7
  import { ErrorBoundary } from "@rebasepro/ui";
@@ -2,7 +2,7 @@ import type { ArrayProperty, Property } from "@rebasepro/types";
2
2
  import React from "react";
3
3
 
4
4
  import type { PropertyPreviewProps, PreviewSize } from "../../types/components/PropertyPreviewProps";
5
- import { useAuthController, useCustomizationController } from "@rebasepro/core";
5
+ import { useAuthController, useCustomizationController } from "@rebasepro/app";
6
6
  import { PropertyPreview } from "../PropertyPreview";
7
7
  import { cls, defaultBorderMixin } from "@rebasepro/ui";
8
8
  import { ErrorBoundary } from "@rebasepro/ui";
@@ -1,7 +1,7 @@
1
1
  import type { NumberProperty } from "@rebasepro/types";
2
2
  import React from "react";
3
3
 
4
- import { EnumValuesChip } from "../../preview";
4
+ import { EnumValuesChip } from "../components/EnumValuesChip";
5
5
  import type { PropertyPreviewProps } from "../../types/components/PropertyPreviewProps";
6
6
  import { enumToObjectEntries } from "@rebasepro/common";
7
7
 
@@ -1,5 +1,14 @@
1
1
  import { CollectionSize } from "@rebasepro/types";
2
2
  import type { PreviewSize } from "../types/components/PropertyPreviewProps";
3
+ export function sanitizeUrl(url: string | undefined): string {
4
+ if (!url) return "about:blank";
5
+ const trimmed = url.trim();
6
+ if (/^(?:javascript|data|vbscript):/i.test(trimmed)) {
7
+ return "about:blank";
8
+ }
9
+ return trimmed;
10
+ }
11
+
3
12
  export const SMALL_THUMBNAIL = 40;
4
13
  export const MEDIUM_THUMBNAIL = 100;
5
14
  export const LARGE_THUMBNAIL = 200;
@@ -1,6 +1,7 @@
1
1
  import React, { useEffect, useRef } from "react";
2
2
  import type { AppView } from "@rebasepro/types";
3
- import { useBreadcrumbsController, useUrlController } from "../index";
3
+ import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
4
+ import { useUrlController } from "../hooks/navigation/contexts/UrlContext";
4
5
 
5
6
  export function CustomViewRoute({ view }: {
6
7
  view: AppView
@@ -1,17 +1,19 @@
1
1
  import type { CollectionConfig, ViewMode } from "@rebasepro/types";
2
- import { Blocker, useBlocker, useLocation } from "react-router-dom";
2
+ import { useLocation } from "react-router-dom";
3
3
  import { EditViewBinding } from "../components/EditViewBinding";
4
4
  import { DetailViewBinding } from "../components/DetailViewBinding";
5
- import { useEffect, useRef, useState } from "react";
5
+ import { useCallback, useEffect, useRef, useState } from "react";
6
6
  import { useNavigate } from "react-router-dom";
7
- import { CollectionViewBinding } from "../components";
8
- import { NotFoundPage, useUserConfigurationPersistence, useComponentOverride } from "@rebasepro/core";
9
- import { UnsavedChangesDialog } from "@rebasepro/core";
7
+ import { CollectionViewBinding } from "../components/CollectionViewBinding/CollectionViewBinding";
8
+ import { NotFoundPage, useUserConfigurationPersistence, useComponentOverride, useNavigationBlocker } from "@rebasepro/app";
9
+ import { resolveOpenEntityMode, resolveViewMode } from "../util/view_mode";
10
+ import { UnsavedChangesDialog } from "@rebasepro/app";
10
11
  import { CircularProgressCenter } from "@rebasepro/ui";
11
12
  import { getNavigationEntriesFromPath, NavigationViewCollectionInternal, NavigationViewEntityCustomInternal, NavigationViewInternal } from "@rebasepro/common";
12
13
  import { toArray } from "@rebasepro/utils";
13
- import { useCollectionRegistryController, useUrlController } from "../index";
14
- import { useBreadcrumbsController } from "../index";
14
+ import { useCollectionRegistryController } from "../hooks/navigation/contexts/CollectionRegistryContext";
15
+ import { useUrlController } from "../hooks/navigation/contexts/UrlContext";
16
+ import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
15
17
 
16
18
  export function RebaseRoute() {
17
19
 
@@ -145,23 +147,16 @@ export function RebaseRoute() {
145
147
  if (!collection)
146
148
  collection = collectionRegistry.getCollection(firstCollectionEntry.slug);
147
149
 
148
- // Resolve the effective openEntityMode based on the current view mode.
149
- // Priority: collection.openEntityMode (explicit) > view-mode-based default.
150
- // View mode priority: URL __view param > saved user config > collection default.
151
- let effectiveOpenMode: "side_panel" | "full_screen" | "split" | "dialog" | undefined = collection?.openEntityMode;
152
- if (!effectiveOpenMode && collection) {
153
- const urlViewParam = new URLSearchParams(location.search).get("__view");
154
- let currentViewMode: ViewMode = collection.defaultViewMode ?? "list";
155
- if (urlViewParam && ["list", "table", "kanban", "cards"].includes(urlViewParam)) {
156
- currentViewMode = urlViewParam as ViewMode;
157
- } else {
158
- const savedView = userConfigPersistence?.getCollectionConfig(collection.slug)?.defaultViewMode;
159
- if (savedView) currentViewMode = savedView as ViewMode;
160
- }
161
- if (currentViewMode === "kanban") effectiveOpenMode = "side_panel";
162
- else if (currentViewMode === "table" || currentViewMode === "cards") effectiveOpenMode = "full_screen";
163
- else effectiveOpenMode = "split";
164
- }
150
+ const effectiveOpenMode = collection
151
+ ? resolveOpenEntityMode({
152
+ collection,
153
+ viewMode: resolveViewMode({
154
+ collection,
155
+ search: location.search,
156
+ savedViewMode: userConfigPersistence?.getCollectionConfig(collection.slug)?.defaultViewMode as ViewMode | undefined
157
+ })
158
+ })
159
+ : undefined;
165
160
  if (collection && effectiveOpenMode === "split") {
166
161
  // Extract subcollection tab from the 3rd entry if present
167
162
  let selectedTab: string | undefined;
@@ -292,7 +287,7 @@ function EntityFullScreenRoute({
292
287
 
293
288
  const entityPath = basePath + `/${entityId}`;
294
289
 
295
- const blocker = useBlocker(({
290
+ const blocker = useNavigationBlocker(useCallback(({
296
291
  currentLocation,
297
292
  nextLocation
298
293
  }) => {
@@ -315,7 +310,7 @@ function EntityFullScreenRoute({
315
310
  return false;
316
311
 
317
312
  return blocked.current;
318
- });
313
+ }, [entityPath, basePath]));
319
314
 
320
315
  const lastCollectionEntry = [...navigationEntries].reverse().find((entry) => entry.type === "collection");
321
316
 
@@ -1,2 +1,2 @@
1
- export type { FormexController, FormexResetProps } from "@rebasepro/formex";
1
+ export type { FormexController, FormexResetProps } from "@rebasepro/forms";
2
2
 
@@ -1,4 +1,5 @@
1
1
  import type { CollectionConfig, UrlController, SidePanelController, NavigateOptions } from "@rebasepro/types";
2
+ import { withViewMode } from "./view_mode";
2
3
 
3
4
  // Canonical path utilities — single source of truth in @rebasepro/common
4
5
  export {
@@ -71,11 +72,7 @@ export function navigateToEntity({
71
72
  if (entityId && selectedTab) {
72
73
  to += `/${selectedTab}`;
73
74
  }
74
- // Preserve the __view query param so the target route knows the current view mode
75
- const currentViewParam = new URLSearchParams(window.location.search).get("__view");
76
- if (currentViewParam) {
77
- to += `${to.includes("?") ? "&" : "?"}__view=${currentViewParam}`;
78
- }
75
+ to = withViewMode(to);
79
76
  if (!entityId) {
80
77
  to += "#new";
81
78
  }
@@ -66,7 +66,9 @@ export function getEntityTitlePropertyKey<M extends Record<string, unknown>>(col
66
66
  const hasExplicitOrder = !!(collection.propertiesOrder as string[] | undefined);
67
67
  const orderToSearch = (collection.propertiesOrder as string[]) || Object.keys(collection.properties);
68
68
 
69
- // If explicit propertiesOrder is set, allow the first non-ID relation or string to be the titleKey
69
+ // If explicit propertiesOrder is set, allow the first non-ID relation or string to be the titleKey.
70
+ // Storage/image properties are excluded — they are rendered by the dedicated image slot,
71
+ // so using one here would duplicate the same image in both the image and title slots.
70
72
  if (hasExplicitOrder) {
71
73
  for (const key of orderToSearch) {
72
74
  const property = collection.properties[key];
@@ -76,7 +78,7 @@ export function getEntityTitlePropertyKey<M extends Record<string, unknown>>(col
76
78
  if (isIdProp || key === "id" || isHiddenProperty(prop)) {
77
79
  continue;
78
80
  }
79
- if (prop.type === "relation" || prop.type === "string") {
81
+ if (prop.type === "relation" || (prop.type === "string" && !isStorageProperty(prop))) {
80
82
  return key;
81
83
  }
82
84
  }
@@ -0,0 +1,102 @@
1
+ import type { CollectionConfig, ViewMode } from "@rebasepro/types";
2
+
3
+ /**
4
+ * Query param that carries the active collection view mode across navigations.
5
+ */
6
+ export const VIEW_MODE_PARAM = "__view";
7
+
8
+ export const VIEW_MODES: ViewMode[] = ["list", "table", "cards", "kanban"];
9
+
10
+ export const DEFAULT_VIEW_MODE: ViewMode = "list";
11
+
12
+ export type OpenEntityMode = "side_panel" | "full_screen" | "split" | "dialog";
13
+
14
+ export const DEFAULT_OPEN_ENTITY_MODE: OpenEntityMode = "split";
15
+
16
+ export function isViewMode(value: string | null | undefined): value is ViewMode {
17
+ return Boolean(value) && VIEW_MODES.includes(value as ViewMode);
18
+ }
19
+
20
+ /**
21
+ * Read the active view mode from a query string, if it holds a valid one.
22
+ *
23
+ * @param search a query string (e.g. `location.search`). Falls back to the
24
+ * current browser location when omitted.
25
+ */
26
+ export function getViewModeFromSearch(search?: string): ViewMode | null {
27
+ const source = search ?? (typeof window !== "undefined" ? window.location.search : "");
28
+ const value = new URLSearchParams(source).get(VIEW_MODE_PARAM);
29
+ return isViewMode(value) ? value : null;
30
+ }
31
+
32
+ /**
33
+ * Append the active view mode to a URL so the target route keeps rendering the
34
+ * view the user was last looking at.
35
+ *
36
+ * Every entity/collection navigation must go through this — a missed call site
37
+ * silently resets the user's view mode mid-session.
38
+ *
39
+ * @param url the URL to decorate. May already contain a query string and/or hash.
40
+ * @param search query string to read the view mode from. Defaults to the
41
+ * current browser location.
42
+ */
43
+ export function withViewMode(url: string, search?: string): string {
44
+ const viewMode = getViewModeFromSearch(search);
45
+ if (!viewMode) return url;
46
+
47
+ // Preserve any hash — the param belongs to the query, which precedes it.
48
+ const hashIndex = url.indexOf("#");
49
+ const hash = hashIndex >= 0 ? url.substring(hashIndex) : "";
50
+ const base = hashIndex >= 0 ? url.substring(0, hashIndex) : url;
51
+
52
+ if (new URLSearchParams(base.split("?")[1] ?? "").has(VIEW_MODE_PARAM)) {
53
+ return url;
54
+ }
55
+
56
+ const separator = base.includes("?") ? "&" : "?";
57
+ return `${base}${separator}${VIEW_MODE_PARAM}=${viewMode}${hash}`;
58
+ }
59
+
60
+ /**
61
+ * Resolve the view mode for a collection, honouring the documented priority:
62
+ * URL param > saved user config > collection default.
63
+ */
64
+ export function resolveViewMode({
65
+ collection,
66
+ search,
67
+ savedViewMode
68
+ }: {
69
+ collection?: Pick<CollectionConfig<any>, "defaultViewMode">;
70
+ search?: string;
71
+ savedViewMode?: ViewMode | null;
72
+ }): ViewMode {
73
+ const fromUrl = getViewModeFromSearch(search);
74
+ if (fromUrl) return fromUrl;
75
+ if (isViewMode(savedViewMode)) return savedViewMode;
76
+ return collection?.defaultViewMode ?? DEFAULT_VIEW_MODE;
77
+ }
78
+
79
+ /**
80
+ * Resolve how clicking an entity should present it.
81
+ *
82
+ * An explicit `collection.openEntityMode` always wins. Otherwise the mode is
83
+ * derived from the active view mode, so the presentation suits the surface the
84
+ * user is looking at: a board keeps its columns behind an overlay, a wide table
85
+ * hands the entity the full width, and list/card views use master-detail.
86
+ *
87
+ * This is the single source of truth — row clicks, find-by-id and the router
88
+ * must all resolve through it, otherwise the same entity opens differently
89
+ * depending on how it was reached.
90
+ */
91
+ export function resolveOpenEntityMode({
92
+ collection,
93
+ viewMode
94
+ }: {
95
+ collection?: Pick<CollectionConfig<any>, "openEntityMode">;
96
+ viewMode?: ViewMode;
97
+ }): OpenEntityMode {
98
+ if (collection?.openEntityMode) return collection.openEntityMode;
99
+ if (viewMode === "kanban") return "side_panel";
100
+ if (viewMode === "table" || viewMode === "cards") return "full_screen";
101
+ return DEFAULT_OPEN_ENTITY_MODE;
102
+ }