@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/README.md CHANGED
@@ -12,7 +12,7 @@ pnpm add @rebasepro/admin
12
12
 
13
13
  ## What This Package Does
14
14
 
15
- `@rebasepro/admin` is the complete CMS layer of Rebase. It provides the admin panel UI — collection table/card views, snapshot editing forms, side-panel navigation, the visual collection (schema) editor, data import/export (CSV, JSON, Excel), and the app shell with auth gating, routing, and drawer layout. It sits on top of `@rebasepro/core` (runtime hooks/providers) and `@rebasepro/ui` (design system components).
15
+ `@rebasepro/admin` is the complete CMS layer of Rebase. It provides the admin panel UI — collection table/card views, snapshot editing forms, side-panel navigation, the visual collection (schema) editor, data import/export (CSV, JSON, Excel), and the app shell with auth gating, routing, and drawer layout. It sits on top of `@rebasepro/app` (runtime hooks/providers) and `@rebasepro/ui` (design system components).
16
16
 
17
17
  ## Key Exports
18
18
 
@@ -20,7 +20,7 @@ pnpm add @rebasepro/admin
20
20
 
21
21
  | Export | Description |
22
22
  |---|---|
23
- | `RebaseCMS` | Top-level CMS component — wires routing, auth, and layout together |
23
+ | `RebaseAdmin` | Top-level CMS component — wires routing, auth, and layout together |
24
24
  | `RebaseShell` | Outer shell (providers + chrome) without opinionated routing |
25
25
  | `RebaseAuthGate` | Auth-gated wrapper — shows login or the CMS based on session state |
26
26
  | `RebaseNavigation` | Renders the sidebar navigation from resolved collections/views |
@@ -116,11 +116,11 @@ import { RichTextEditor } from "@rebasepro/admin/editor";
116
116
  ## Quick Start
117
117
 
118
118
  ```tsx
119
- import { RebaseCMS } from "@rebasepro/admin";
119
+ import { RebaseAdmin } from "@rebasepro/admin";
120
120
 
121
121
  function App() {
122
122
  return (
123
- <RebaseCMS
123
+ <RebaseAdmin
124
124
  collections={[/* your collection configs */]}
125
125
  authController={authController}
126
126
  dataSource={dataSource}
@@ -131,9 +131,9 @@ function App() {
131
131
 
132
132
  ## Related Packages
133
133
 
134
- - [`@rebasepro/core`](../core) — Runtime hooks, providers, auth components, and context
134
+ - [`@rebasepro/app`](../app) — Runtime hooks, providers, auth components, and context
135
135
  - [`@rebasepro/ui`](../ui) — Design system components (buttons, dialogs, inputs, etc.)
136
136
  - [`@rebasepro/common`](../common) — Shared utilities, collection registry, query builder
137
137
  - [`@rebasepro/types`](../types) — TypeScript type definitions
138
- - [`@rebasepro/formex`](../formex) — Form state management
139
- - [`@rebasepro/schema-inference`](../schema-inference) — Schema introspection from databases
138
+ - [`@rebasepro/forms`](../forms) — Form state management
139
+ - [`@rebasepro/inference`](../inference) — Schema introspection from databases
@@ -1,18 +1,18 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { At as useImportConfig, Bn as useUrlController, Bt as getFieldId, Ct as useCollectionEditorController, Et as convertDataToEntity, Ft as PropertyConfigBadge, Hn as useNavigationStateController, Mt as ImportFileUpload, Qn as CollectionTableBinding, Tt as DataNewPropertiesMapping, Wn as useCollectionRegistryController, Xn as useSelectionController, dn as SearchIconsView, fn as FieldCaption, h as toSerializableCollectionConfig, i as namespaceToPropertiesOrderPath, jt as ImportSaveInProgress, kt as getInferenceType, n as getFullIdPath, r as idToPropertiesPath, s as CollectionGenerationApiError, t as getFullId, u as validateCollectionJson, v as useCollectionsConfigController, wt as ImportNewPropertyFieldPreview, zt as getFieldConfig } from "./src-sUZfe29F.js";
3
- import { a as updatePropertyFromWidget, c as useAIModifiedPaths, i as supportedFields, l as useSafeSnackbarController, n as PropertyForm, o as PropertyTree, r as PropertyFormDialog, s as AIModifiedPathsProvider } from "./PropertyEditView-7KMTcrqi.js";
2
+ import { Dt as ImportSaveInProgress, Et as useImportConfig, Mt as PropertyConfigBadge, Nn as useCollectionRegistryController, Nt as SearchIconsView, O as getFieldConfig, Ot as ImportFileUpload, Pt as FieldCaption, Qt as CollectionTableBinding, St as convertDataToEntity, Tt as getInferenceType, Xt as useSelectionController, _t as useCollectionEditorController, an as useNavigationStateController, bt as ImportNewPropertyFieldPreview, g as useCollectionsConfigController, i as namespaceToPropertiesOrderPath, k as getFieldId, l as validateCollectionJson, n as getFullIdPath, o as CollectionGenerationApiError, p as toSerializableCollectionConfig, r as idToPropertiesPath, rn as useUrlController, t as getFullId, xt as DataNewPropertiesMapping } from "./util-XFwQ9FEc.js";
3
+ import { a as updatePropertyFromWidget, c as useAIModifiedPaths, i as supportedFields, l as useSafeSnackbarController, n as PropertyForm, o as PropertyTree, r as PropertyFormDialog, s as AIModifiedPathsProvider } from "./PropertyEditView-i51tFOfM.js";
4
4
  import * as React$1 from "react";
5
5
  import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
6
6
  import { Alert, AppWindow, ArrowLeftIcon, BooleanSwitchWithLabel, Button, Card, CheckIcon, Chip, CircularProgress, CircularProgressCenter, CodeIcon, ColumnsIcon, Container, CopyIcon, DebouncedTextField, Dialog, DialogActions, DialogContent, DialogTitle, ErrorBoundary, FileIcon, FileSearchIcon, FileTextIcon, IconButton, KanbanIcon, KeyIcon, LayoutGridIcon, ListIcon, LoadingButton, Menu, MultiSelect, MultiSelectItem, PanelLeftIcon, Paper, PlusIcon, Select, SelectItem, ShoppingCartIcon, SquareIcon, Tab, TableIcon, Tabs, TextField, ToggleButtonGroup, Tooltip, Trash2Icon, Typography, UserIcon, XIcon, cls, coolIconKeys, defaultBorderMixin, iconSize } from "@rebasepro/ui";
7
- import { getSubcollections, getTableName, isPropertyBuilder, removeInitialAndTrailingSlashes } from "@rebasepro/common";
8
- import { AIIcon, ConfirmationDialog, ErrorView, IconForView, UnsavedChangesDialog, useAuthController, useCustomizationController, useLargeLayout, useRebaseContext, useUnsavedChangesDialog } from "@rebasepro/core";
9
- import { Field, Formex, clone, getIn, useCreateFormex, useFormex } from "@rebasepro/formex";
10
- import { z } from "zod";
11
- import { camelCase, isEmptyObject, mergeDeep, prettifyIdentifier, randomString, removeUndefined, singular, slugify, toSnakeCase, unslugify } from "@rebasepro/utils";
12
- import { getDataSourceCapabilities } from "@rebasepro/types";
7
+ import { getEffectiveSecurityRules, getSubcollections, getTableName, isPropertyBuilder, removeInitialAndTrailingSlashes } from "@rebasepro/common";
8
+ import { AIIcon, ConfirmationDialog, ErrorView, IconForView, UnsavedChangesDialog, useAuthController, useCustomizationController, useLargeLayout, useRebaseContext, useUnsavedChangesDialog } from "@rebasepro/app";
9
+ import { Field, Formex, clone, getIn, useCreateFormex, useFormex } from "@rebasepro/forms";
13
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
+ import { camelCase, getPolicyNamesForRule, getPolicyNamesForRules, isEmptyObject, mergeDeep, prettifyIdentifier, randomString, removeUndefined, singular, slugify, toSnakeCase, unslugify } from "@rebasepro/utils";
12
+ import { getDataSourceCapabilities } from "@rebasepro/types";
13
+ import { z } from "zod";
14
+ import { buildEntityPropertiesFromData, buildPropertyFromData } from "@rebasepro/inference";
14
15
  import { Highlight, themes } from "prism-react-renderer";
15
- import { buildEntityPropertiesFromData, buildPropertyFromData } from "@rebasepro/schema-inference";
16
16
  import JSON5 from "json5";
17
17
  //#region src/collection_editor/ui/collection_editor/CollectionYupValidation.tsx
18
18
  var CollectionEditorSchema = z.object({
@@ -682,7 +682,7 @@ function DisplaySettingsForm({ expandKanban, standalone }) {
682
682
  //#region src/collection_editor/ui/collection_editor/GetCodeDialog.tsx
683
683
  function GetCodeDialog({ collection, onOpenChange, open }) {
684
684
  const snackbarController = useSafeSnackbarController();
685
- const code = collection ? "import { CollectionConfig } from \"@rebasepro/core\";\n\nconst " + (collection?.name ? camelCase(collection.name) : "my") + "Collection:CollectionConfig = " + JSON5.stringify(collectionToCode({ ...collection }), null, " ") : "No collection selected";
685
+ const code = collection ? "import { CollectionConfig } from \"@rebasepro/app\";\n\nconst " + (collection?.name ? camelCase(collection.name) : "my") + "Collection:CollectionConfig = " + JSON5.stringify(collectionToCode({ ...collection }), null, " ") : "No collection selected";
686
686
  return /* @__PURE__ */ jsxs(Dialog, {
687
687
  open,
688
688
  onOpenChange,
@@ -2381,7 +2381,61 @@ function CollectionRLSTab() {
2381
2381
  values.table,
2382
2382
  values.alias
2383
2383
  ]);
2384
- const unmappedPolicies = dbPolicies.filter((dp) => !rules.some((r) => r.name === dp.policyname));
2384
+ /**
2385
+ * Application roles available to `SecurityRule.roles`.
2386
+ *
2387
+ * Deliberately NOT `fetchAvailableRoles` — that returns native pg_roles
2388
+ * (postgres, rebase_user, …), which can never satisfy an application-role
2389
+ * condition.
2390
+ */
2391
+ const [availableRoles, setAvailableRoles] = useState([]);
2392
+ const [rolesUnavailable, setRolesUnavailable] = useState(false);
2393
+ useEffect(() => {
2394
+ let mounted = true;
2395
+ const fetchRoles = async () => {
2396
+ if (!databaseAdmin?.fetchApplicationRoles) {
2397
+ if (mounted) setRolesUnavailable(true);
2398
+ return;
2399
+ }
2400
+ try {
2401
+ const fetched = await databaseAdmin.fetchApplicationRoles();
2402
+ if (mounted) {
2403
+ setAvailableRoles(fetched);
2404
+ setRolesUnavailable(false);
2405
+ }
2406
+ } catch (e) {
2407
+ console.error("Failed to fetch application roles", e);
2408
+ if (mounted) setRolesUnavailable(true);
2409
+ }
2410
+ };
2411
+ fetchRoles();
2412
+ return () => {
2413
+ mounted = false;
2414
+ };
2415
+ }, [databaseAdmin]);
2416
+ const tableName = values.id || values.table || values.alias;
2417
+ /**
2418
+ * Every policy name `rebase db push` would write for this collection.
2419
+ *
2420
+ * Two things make this more than `rules.map(r => r.name)`:
2421
+ * - a rule without an explicit `name` becomes `<table>_<op>_<hash>`, so
2422
+ * comparing `rule.name` to `policyname` never matches for it;
2423
+ * - the generator also injects the safe-by-default baseline
2424
+ * (`<table>_default_admin_*`), which is in no collection's `securityRules`.
2425
+ *
2426
+ * Missing either made Rebase's own policies look hand-written, and offered to
2427
+ * import them back into the codebase that produced them.
2428
+ */
2429
+ const generatedPolicyNames = useMemo(() => {
2430
+ if (!tableName) return /* @__PURE__ */ new Set();
2431
+ const effectiveRules = getEffectiveSecurityRules(values);
2432
+ return getPolicyNamesForRules([...rules, ...effectiveRules], tableName);
2433
+ }, [
2434
+ rules,
2435
+ tableName,
2436
+ values
2437
+ ]);
2438
+ const unmappedPolicies = dbPolicies.filter((dp) => !generatedPolicyNames.has(dp.policyname));
2385
2439
  const handleSave = async (newPolicy) => {
2386
2440
  const rule = {
2387
2441
  name: newPolicy.policyname ?? "",
@@ -2437,7 +2491,7 @@ function CollectionRLSTab() {
2437
2491
  }), /* @__PURE__ */ jsx(Typography, {
2438
2492
  variant: "subtitle2",
2439
2493
  className: "truncate",
2440
- children: rule.name
2494
+ children: rule.name || (tableName ? getPolicyNamesForRule(rule, tableName).join(", ") : "Unnamed policy")
2441
2495
  })]
2442
2496
  }), /* @__PURE__ */ jsxs("div", {
2443
2497
  className: "flex gap-2 text-xs pl-6 overflow-x-auto hide-scrollbar",
@@ -2461,7 +2515,7 @@ function CollectionRLSTab() {
2461
2515
  tablename: values.id || values.table || values.alias || "your_table",
2462
2516
  permissive: (rule.mode || "permissive").toUpperCase(),
2463
2517
  cmd: (rule.operation || "ALL").toUpperCase(),
2464
- roles: rule.roles || ["public"],
2518
+ roles: rule.roles || [],
2465
2519
  qual: rule.using || null,
2466
2520
  with_check: rule.withCheck || null
2467
2521
  }),
@@ -2566,6 +2620,8 @@ function CollectionRLSTab() {
2566
2620
  children: editingPolicy && /* @__PURE__ */ jsx(InlinePolicyEditor, {
2567
2621
  policy: editingPolicy === "new" ? void 0 : editingPolicy,
2568
2622
  table: values.id || values.table || values.alias || "your_table",
2623
+ availableRoles,
2624
+ rolesUnavailable,
2569
2625
  onSave: handleSave,
2570
2626
  onCancel: () => setEditingPolicy(null)
2571
2627
  })
@@ -2580,20 +2636,31 @@ var COMMAND_OPTIONS = [
2580
2636
  "UPDATE",
2581
2637
  "DELETE"
2582
2638
  ];
2583
- var ROLE_OPTIONS = [
2584
- "public",
2585
- "authenticated",
2586
- "anon",
2587
- "admin"
2588
- ];
2589
- function InlinePolicyEditor({ policy, table, onSave, onCancel }) {
2639
+ function InlinePolicyEditor({ policy, table, availableRoles, rolesUnavailable, onSave, onCancel }) {
2590
2640
  const [name, setName] = useState(policy?.policyname || "");
2591
2641
  const [behavior, setBehavior] = useState(policy?.permissive || "PERMISSIVE");
2592
2642
  const [command, setCommand] = useState(policy?.cmd || "ALL");
2593
- const [roles, setRoles] = useState(policy?.roles ? Array.isArray(policy.roles) ? policy.roles : [policy.roles] : ["public"]);
2643
+ const [roles, setRoles] = useState(policy?.roles ? Array.isArray(policy.roles) ? policy.roles : [policy.roles] : []);
2644
+ const [customRole, setCustomRole] = useState("");
2594
2645
  const [usingExpr, setUsingExpr] = useState(policy?.qual || "");
2595
2646
  const [checkExpr, setCheckExpr] = useState(policy?.with_check || "");
2596
2647
  const showCheck = command === "ALL" || command === "INSERT" || command === "UPDATE";
2648
+ /**
2649
+ * Roles offered in the dropdown: those in use in the project, plus any the
2650
+ * rule already carries. The union matters — application roles are derived
2651
+ * from what users hold, so a role that is referenced here but assigned to
2652
+ * nobody would otherwise vanish from its own policy on the next save.
2653
+ */
2654
+ const roleOptions = useMemo(() => Array.from(new Set([...availableRoles, ...roles])).sort(), [availableRoles, roles]);
2655
+ const addCustomRole = () => {
2656
+ const trimmed = customRole.trim();
2657
+ if (!trimmed || roles.includes(trimmed)) {
2658
+ setCustomRole("");
2659
+ return;
2660
+ }
2661
+ setRoles([...roles, trimmed]);
2662
+ setCustomRole("");
2663
+ };
2597
2664
  return /* @__PURE__ */ jsxs(Fragment, { children: [
2598
2665
  /* @__PURE__ */ jsxs(DialogTitle, {
2599
2666
  variant: "h6",
@@ -2663,20 +2730,67 @@ function InlinePolicyEditor({ policy, table, onSave, onCancel }) {
2663
2730
  }),
2664
2731
  /* @__PURE__ */ jsxs("div", {
2665
2732
  className: "flex flex-col gap-1.5",
2666
- children: [/* @__PURE__ */ jsx(Typography, {
2667
- variant: "caption",
2668
- className: "uppercase tracking-wider text-text-secondary",
2669
- children: "Target Roles"
2670
- }), /* @__PURE__ */ jsx(MultiSelect, {
2671
- size: "small",
2672
- value: roles,
2673
- onValueChange: setRoles,
2674
- placeholder: "Select roles",
2675
- children: ROLE_OPTIONS.map((r) => /* @__PURE__ */ jsx(MultiSelectItem, {
2676
- value: r,
2677
- children: r
2678
- }, r))
2679
- })]
2733
+ children: [
2734
+ /* @__PURE__ */ jsx(Typography, {
2735
+ variant: "caption",
2736
+ className: "uppercase tracking-wider text-text-secondary",
2737
+ children: "Application Roles"
2738
+ }),
2739
+ /* @__PURE__ */ jsxs(Typography, {
2740
+ variant: "caption",
2741
+ className: "text-text-secondary opacity-80 -mt-1",
2742
+ children: [
2743
+ "Roles held by users of this project, matched via ",
2744
+ /* @__PURE__ */ jsx("span", {
2745
+ className: "font-mono",
2746
+ children: "auth.roles()"
2747
+ }),
2748
+ ". These are not PostgreSQL roles — leave empty to apply the policy to everyone."
2749
+ ]
2750
+ }),
2751
+ roleOptions.length > 0 && /* @__PURE__ */ jsx(MultiSelect, {
2752
+ size: "small",
2753
+ value: roles,
2754
+ onValueChange: setRoles,
2755
+ placeholder: "Select roles",
2756
+ children: roleOptions.map((r) => /* @__PURE__ */ jsx(MultiSelectItem, {
2757
+ value: r,
2758
+ children: r
2759
+ }, r))
2760
+ }),
2761
+ rolesUnavailable && roleOptions.length === 0 && /* @__PURE__ */ jsx(Typography, {
2762
+ variant: "caption",
2763
+ className: "text-text-secondary opacity-80",
2764
+ children: "Could not load the project's roles — enter them manually below."
2765
+ }),
2766
+ !rolesUnavailable && roleOptions.length === 0 && /* @__PURE__ */ jsx(Typography, {
2767
+ variant: "caption",
2768
+ className: "text-text-secondary opacity-80",
2769
+ children: "No roles are assigned to any user yet — enter one manually below."
2770
+ }),
2771
+ /* @__PURE__ */ jsxs("div", {
2772
+ className: "flex gap-2 items-center",
2773
+ children: [/* @__PURE__ */ jsx(TextField, {
2774
+ size: "small",
2775
+ value: customRole,
2776
+ onChange: (e) => setCustomRole(e.target.value),
2777
+ onKeyDown: (e) => {
2778
+ if (e.key === "Enter") {
2779
+ e.preventDefault();
2780
+ addCustomRole();
2781
+ }
2782
+ },
2783
+ placeholder: "Add a role not listed, e.g. editor"
2784
+ }), /* @__PURE__ */ jsx(Button, {
2785
+ size: "small",
2786
+ variant: "outlined",
2787
+ color: "neutral",
2788
+ disabled: !customRole.trim(),
2789
+ onClick: addCustomRole,
2790
+ children: "Add"
2791
+ })]
2792
+ })
2793
+ ]
2680
2794
  }),
2681
2795
  command !== "INSERT" && /* @__PURE__ */ jsxs("div", {
2682
2796
  className: "flex flex-col gap-1.5",
@@ -3627,4 +3741,4 @@ var validateId = (value, isNewCollection, existingPaths, existingIds) => {
3627
3741
  //#endregion
3628
3742
  export { CollectionEditorDialog as n, CollectionEditorDialog_exports as r, CollectionEditor as t };
3629
3743
 
3630
- //# sourceMappingURL=CollectionEditorDialog-B-7uW3iJ.js.map
3744
+ //# sourceMappingURL=CollectionEditorDialog-D7odTn0N.js.map