@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/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
|
-
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
6
|
-
import { sanitizeUrl } from "
|
|
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/
|
|
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/
|
|
9
|
+
import { ErrorView } from "@rebasepro/app";
|
|
10
10
|
import { EntityPreviewBinding, EntityPreviewContainer } from "../../components/EntityPreviewBinding";
|
|
11
|
-
import { useCollectionRegistryController } from "../../
|
|
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/
|
|
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 "../../
|
|
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/
|
|
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
|
|
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/
|
|
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 "
|
|
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/
|
|
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/
|
|
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 "
|
|
4
|
+
import { EnumValuesChip } from "../components/EnumValuesChip";
|
|
5
5
|
import type { PropertyPreviewProps } from "../../types/components/PropertyPreviewProps";
|
|
6
6
|
import { enumToObjectEntries } from "@rebasepro/common";
|
|
7
7
|
|
package/src/preview/util.ts
CHANGED
|
@@ -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
|
|
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 {
|
|
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/
|
|
9
|
-
import {
|
|
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
|
|
14
|
-
import {
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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 =
|
|
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/
|
|
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
|
-
|
|
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
|
}
|
package/src/util/previews.ts
CHANGED
|
@@ -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
|
+
}
|