@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.
- package/README.md +7 -7
- package/dist/{CollectionEditorDialog-B-7uW3iJ.js → CollectionEditorDialog-D7odTn0N.js} +150 -36
- package/dist/CollectionEditorDialog-D7odTn0N.js.map +1 -0
- package/dist/{PropertyEditView-7KMTcrqi.js → PropertyEditView-i51tFOfM.js} +6 -6
- package/dist/PropertyEditView-i51tFOfM.js.map +1 -0
- package/dist/{RouterCollectionsStudioView-epqIbZrJ.js → RouterCollectionsStudioView-B9AjTCjT.js} +5 -5
- package/dist/RouterCollectionsStudioView-B9AjTCjT.js.map +1 -0
- package/dist/collection_editor/api/generateCollectionApi.d.ts +4 -4
- package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +1 -1
- package/dist/collection_editor/useSafeSnackbarController.d.ts +1 -1
- package/dist/collection_editor_ui.js +5 -5
- package/dist/collection_editor_ui.js.map +1 -1
- package/dist/components/CollectionTableBinding/CollectionTableBindingProps.d.ts +1 -1
- package/dist/components/CollectionTableBinding/internal/EntityTableCell.d.ts +1 -1
- package/dist/components/CollectionTableBinding/internal/popup_field/PopupFormField.d.ts +1 -1
- package/dist/components/CollectionTableBinding/table_bindings.d.ts +1 -1
- package/dist/components/CollectionViewBinding/hooks/useCollectionInlineEditor.d.ts +1 -1
- package/dist/components/{RebaseCMS.d.ts → RebaseAdmin.d.ts} +2 -2
- package/dist/components/RebaseLayout.d.ts +5 -4
- package/dist/components/RebaseShell.d.ts +1 -0
- package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
- package/dist/components/SelectableTable/SelectableTableContext.d.ts +1 -1
- package/dist/components/SidePanelProvider.d.ts +1 -1
- package/dist/components/field_configs.d.ts +17 -0
- package/dist/components/index.d.ts +1 -1
- package/dist/contexts/BreacrumbsContext.d.ts +1 -1
- package/dist/editor.js +1 -1
- package/dist/editor.js.map +1 -1
- package/dist/export-BM6HPujv.js +518 -0
- package/dist/export-BM6HPujv.js.map +1 -0
- package/dist/form/components/LocalChangesMenu.d.ts +1 -1
- package/dist/form/components/StorageUploadProgress.d.ts +1 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +1 -1
- package/dist/{history-7X5bON_n.js → history-CtIPJxvQ.js} +6 -6
- package/dist/history-CtIPJxvQ.js.map +1 -0
- package/dist/hooks/useSelectionDialog.d.ts +1 -1
- package/dist/import-DzQnT03v.js +328 -0
- package/dist/import-DzQnT03v.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3300 -2
- package/dist/index.js.map +1 -0
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/preview/util.d.ts +1 -0
- package/dist/types/components/formex.d.ts +1 -1
- package/dist/util/view_mode.d.ts +54 -0
- package/dist/{src-sUZfe29F.js → util-XFwQ9FEc.js} +17554 -21391
- package/dist/util-XFwQ9FEc.js.map +1 -0
- package/package.json +12 -17
- package/src/collection_editor/ConfigControllerProvider.tsx +1 -1
- package/src/collection_editor/api/generateCollectionApi.ts +4 -4
- package/src/collection_editor/ui/AddKanbanColumnAction.tsx +1 -1
- package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +1 -1
- package/src/collection_editor/ui/EditorCollectionAction.tsx +1 -1
- package/src/collection_editor/ui/EditorCollectionActionStart.tsx +1 -1
- package/src/collection_editor/ui/EditorEntityAction.tsx +1 -1
- package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +1 -1
- package/src/collection_editor/ui/KanbanSetupAction.tsx +1 -1
- package/src/collection_editor/ui/MissingReferenceWidget.tsx +1 -1
- package/src/collection_editor/ui/NewCollectionButton.tsx +1 -1
- package/src/collection_editor/ui/NewCollectionCard.tsx +1 -1
- package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +139 -13
- package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/EnumForm.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +2 -2
- package/src/collection_editor/useSafeSnackbarController.ts +1 -1
- package/src/components/AdminModeSyncer.tsx +1 -1
- package/src/components/ArrayContainer.tsx +1 -1
- package/src/components/ClearFilterSortButton.tsx +1 -1
- package/src/components/CollectionPanel.tsx +1 -1
- package/src/components/CollectionTableBinding/CollectionRowActions.tsx +3 -3
- package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +3 -3
- package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +1 -1
- package/src/components/CollectionTableBinding/PropertyTableCell.tsx +1 -1
- package/src/components/CollectionTableBinding/column_utils.tsx +1 -1
- package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +2 -2
- package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +2 -2
- package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +2 -2
- package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +1 -1
- package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +1 -1
- package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +2 -2
- package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +1 -1
- package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +4 -4
- package/src/components/CollectionTableBinding/table_bindings.tsx +1 -1
- package/src/components/CollectionViewBinding/BoardCardBinding.tsx +2 -2
- package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +4 -4
- package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +1 -1
- package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +3 -3
- package/src/components/CollectionViewBinding/CollectionViewActions.tsx +3 -3
- package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +77 -127
- package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +5 -9
- package/src/components/CollectionViewBinding/EntityCardBinding.tsx +3 -3
- package/src/components/CollectionViewBinding/FiltersDialog.tsx +19 -1
- package/src/components/CollectionViewBinding/SplitListView.tsx +114 -63
- package/src/components/CollectionViewBinding/ViewModeToggle.tsx +1 -1
- package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +2 -2
- package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +2 -2
- package/src/components/CollectionViewBinding/useBoardDataController.tsx +9 -3
- package/src/components/CollectionViewBinding/usePreviewSlots.ts +1 -1
- package/src/components/DefaultAppBar.tsx +3 -3
- package/src/components/DefaultDrawer.tsx +3 -3
- package/src/components/DeleteEntityDialog.tsx +1 -1
- package/src/components/DetailViewBinding.tsx +7 -5
- package/src/components/DrawerNavigationGroup.tsx +2 -2
- package/src/components/EditFormActions.tsx +6 -6
- package/src/components/EditViewBinding.tsx +9 -8
- package/src/components/EntityPreviewBinding.tsx +5 -4
- package/src/components/EntityViewBinding.tsx +2 -2
- package/src/components/HomePage/ContentHomePage.tsx +6 -5
- package/src/components/HomePage/FavouritesView.tsx +2 -2
- package/src/components/HomePage/NavigationCardBinding.tsx +3 -3
- package/src/components/HomePage/NavigationGroup.tsx +1 -1
- package/src/components/HomePage/RenameGroupDialog.tsx +1 -1
- package/src/components/JsonPreviewBinding.tsx +1 -1
- package/src/components/{RebaseCMS.tsx → RebaseAdmin.tsx} +3 -3
- package/src/components/RebaseAuthGate.tsx +2 -2
- package/src/components/RebaseLayout.tsx +7 -13
- package/src/components/RebaseNavigation.tsx +18 -3
- package/src/components/RebaseRouteDefs.tsx +3 -3
- package/src/components/RebaseShell.tsx +2 -1
- package/src/components/ReferenceTable/SelectionTableBinding.tsx +7 -6
- package/src/components/ReferenceWidget.tsx +1 -1
- package/src/components/RelationSelector.tsx +1 -1
- package/src/components/SearchIconsView.tsx +2 -2
- package/src/components/SelectableTable/SelectableTable.tsx +2 -2
- package/src/components/SelectableTable/SelectableTableContext.tsx +1 -1
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +1 -1
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +1 -1
- package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +1 -1
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +2 -2
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +1 -1
- package/src/components/SideDialogs.tsx +1 -1
- package/src/components/SidePanelBinding.tsx +47 -9
- package/src/components/SidePanelProvider.tsx +15 -12
- package/src/components/UserSelector.tsx +1 -1
- package/src/components/admin/CreationResultDialog.tsx +6 -3
- package/src/components/app/Scaffold.tsx +6 -2
- package/src/components/common/default_entity_actions.tsx +123 -25
- package/src/components/field_configs.tsx +42 -25
- package/src/components/history/EntityHistoryEntry.tsx +1 -1
- package/src/components/history/EntityHistoryView.tsx +5 -5
- package/src/components/history/LastEditedByIndicator.tsx +2 -2
- package/src/components/index.ts +1 -1
- package/src/contexts/BreacrumbsContext.tsx +1 -1
- package/src/data_export/export/BasicExportAction.tsx +1 -1
- package/src/data_export/export/ExportCollectionAction.tsx +1 -1
- package/src/data_import/components/DataNewPropertiesMapping.tsx +1 -1
- package/src/data_import/components/ImportFileUpload.tsx +1 -1
- package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +3 -5
- package/src/data_import/components/ImportSaveInProgress.tsx +1 -1
- package/src/data_import/import/ImportCollectionAction.tsx +8 -8
- package/src/data_import/utils/data.ts +2 -2
- package/src/data_import/utils/get_properties_mapping.ts +1 -1
- package/src/editor/components/image-bubble.tsx +1 -1
- package/src/editor/components/table-bubble.tsx +1 -1
- package/src/editor/editor.tsx +1 -1
- package/src/editor/selectors/color-selector.tsx +1 -1
- package/src/editor/selectors/link-selector.tsx +1 -1
- package/src/editor/selectors/node-selector.tsx +2 -2
- package/src/editor/selectors/text-buttons.tsx +1 -1
- package/src/form/EntityForm.tsx +8 -5
- package/src/form/EntityFormActions.tsx +1 -1
- package/src/form/EntityFormBinding.tsx +7 -5
- package/src/form/PropertyFieldBinding.tsx +3 -3
- package/src/form/components/ErrorFocus.tsx +1 -1
- package/src/form/components/LocalChangesMenu.tsx +3 -3
- package/src/form/components/StorageItemPreview.tsx +1 -1
- package/src/form/components/StorageUploadProgress.tsx +3 -3
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +3 -2
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +4 -3
- package/src/form/field_bindings/BlockFieldBinding.tsx +4 -3
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +3 -2
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +4 -3
- package/src/form/field_bindings/MapFieldBinding.tsx +3 -2
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +4 -3
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +2 -1
- package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +3 -2
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +2 -1
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +5 -4
- package/src/form/field_bindings/RelationFieldBinding.tsx +3 -2
- package/src/form/field_bindings/RepeatFieldBinding.tsx +3 -2
- package/src/form/field_bindings/SelectFieldBinding.tsx +2 -1
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +5 -4
- package/src/form/field_bindings/SwitchFieldBinding.tsx +2 -1
- package/src/form/field_bindings/TextFieldBinding.tsx +2 -1
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +2 -1
- package/src/form/field_bindings/VectorFieldBinding.tsx +2 -1
- package/src/form/form_utils.ts +1 -1
- package/src/hooks/navigation/useNavigationResolution.ts +19 -4
- package/src/hooks/useBuildSidePanel.tsx +10 -2
- package/src/hooks/useCMSContext.tsx +1 -1
- package/src/hooks/useHistory.ts +1 -1
- package/src/hooks/useResolvedNavigationFrom.tsx +4 -2
- package/src/hooks/useSelectionDialog.tsx +3 -3
- package/src/index.ts +3 -3
- package/src/preview/PropertyPreview.tsx +2 -2
- package/src/preview/components/DatePreview.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +1 -1
- package/src/preview/components/ImagePreview.tsx +2 -2
- package/src/preview/components/ReferencePreview.tsx +3 -3
- package/src/preview/components/RelationPreview.tsx +3 -3
- package/src/preview/components/StorageThumbnail.tsx +1 -1
- package/src/preview/components/UrlComponentPreview.tsx +2 -9
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +1 -1
- package/src/preview/property_previews/NumberPropertyPreview.tsx +1 -1
- package/src/preview/util.ts +9 -0
- package/src/routes/CustomViewRoute.tsx +2 -1
- package/src/routes/RebaseRoute.tsx +21 -26
- package/src/types/components/formex.tsx +1 -1
- package/src/util/navigation_utils.ts +2 -5
- package/src/util/previews.ts +4 -2
- package/src/util/view_mode.ts +102 -0
- package/dist/CollectionEditorDialog-B-7uW3iJ.js.map +0 -1
- package/dist/PropertyEditView-7KMTcrqi.js.map +0 -1
- package/dist/RouterCollectionsStudioView-epqIbZrJ.js.map +0 -1
- package/dist/history-7X5bON_n.js.map +0 -1
- 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/
|
|
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
|
-
| `
|
|
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 {
|
|
119
|
+
import { RebaseAdmin } from "@rebasepro/admin";
|
|
120
120
|
|
|
121
121
|
function App() {
|
|
122
122
|
return (
|
|
123
|
-
<
|
|
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/
|
|
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/
|
|
139
|
-
- [`@rebasepro/
|
|
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 {
|
|
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-
|
|
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/
|
|
9
|
-
import { Field, Formex, clone, getIn, useCreateFormex, useFormex } from "@rebasepro/
|
|
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/
|
|
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
|
-
|
|
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 || [
|
|
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
|
-
|
|
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] : [
|
|
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: [
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
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-
|
|
3744
|
+
//# sourceMappingURL=CollectionEditorDialog-D7odTn0N.js.map
|