@rebasepro/cms 0.17.3 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/{CollectionEditorDialog-B-akreOU.js → CollectionEditorDialog-BeX4b92r.js} +13 -7
- package/dist/{CollectionEditorDialog-B-akreOU.js.map → CollectionEditorDialog-BeX4b92r.js.map} +1 -1
- package/dist/{PropertyEditView-CiY84wkR.js → PropertyEditView-C7thfj4L.js} +3 -3
- package/dist/{PropertyEditView-CiY84wkR.js.map → PropertyEditView-C7thfj4L.js.map} +1 -1
- package/dist/{RouterCollectionsStudioView-DkAWda4N.js → RouterCollectionsStudioView-BtjzvB6E.js} +4 -4
- package/dist/{RouterCollectionsStudioView-DkAWda4N.js.map → RouterCollectionsStudioView-BtjzvB6E.js.map} +1 -1
- package/dist/{SchemaChangeDialog-DceT8QFX.js → SchemaChangeDialog-CkqK6KOC.js} +4 -2
- package/dist/{SchemaChangeDialog-DceT8QFX.js.map → SchemaChangeDialog-CkqK6KOC.js.map} +1 -1
- package/dist/collection_editor/api/generateCollectionApi.d.ts +1 -2
- package/dist/collection_editor_ui.d.ts +2 -0
- package/dist/collection_editor_ui.js +6 -5
- package/dist/collection_editor_ui.js.map +1 -1
- package/dist/components/DeleteEntityDialog.d.ts +2 -3
- package/dist/components/RebaseLayout.d.ts +11 -4
- package/dist/components/field_configs.d.ts +1 -1
- package/dist/editor/sanitize-html.d.ts +15 -0
- package/dist/editor.js +195 -10
- package/dist/editor.js.map +1 -1
- package/dist/{export-Ben8E355.js → export--arni_VY.js} +2 -2
- package/dist/{export-Ben8E355.js.map → export--arni_VY.js.map} +1 -1
- package/dist/form/components/LabelWithIcon.d.ts +10 -0
- package/dist/{history-DIEVd26f.js → history-C2TpoQwi.js} +2 -2
- package/dist/{history-DIEVd26f.js.map → history-C2TpoQwi.js.map} +1 -1
- package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +1 -1
- package/dist/hooks/navigation/useResolvedViews.d.ts +1 -1
- package/dist/hooks/navigation/useTopLevelNavigation.d.ts +1 -1
- package/dist/{import-D25x7ko-.js → import-DTkXNoBg.js} +2 -2
- package/dist/{import-D25x7ko-.js.map → import-DTkXNoBg.js.map} +1 -1
- package/dist/index.js +78 -33
- package/dist/index.js.map +1 -1
- package/dist/util/propertyConfigMapper.d.ts +1 -1
- package/dist/util-CfLFggP7.js +57 -0
- package/dist/util-CfLFggP7.js.map +1 -0
- package/dist/{util-DVqnqlLn.js → util-DE1WQW6h.js} +134 -112
- package/dist/util-DE1WQW6h.js.map +1 -0
- package/package.json +42 -34
- package/dist/util-DVqnqlLn.js.map +0 -1
- package/src/collection_editor/CollectionEditorDialogsContext.tsx +0 -25
- package/src/collection_editor/ConfigControllerProvider.tsx +0 -395
- package/src/collection_editor/_cms_internals.ts +0 -41
- package/src/collection_editor/api/generateCollectionApi.ts +0 -126
- package/src/collection_editor/api/index.ts +0 -1
- package/src/collection_editor/extensibility_types.ts +0 -168
- package/src/collection_editor/index.ts +0 -108
- package/src/collection_editor/liveSchemaClient.ts +0 -285
- package/src/collection_editor/relation_kinds.ts +0 -44
- package/src/collection_editor/serializable_types.ts +0 -535
- package/src/collection_editor/serializable_utils.ts +0 -729
- package/src/collection_editor/types/collection_editor_controller.tsx +0 -62
- package/src/collection_editor/types/collection_inference.ts +0 -18
- package/src/collection_editor/types/config_controller.tsx +0 -121
- package/src/collection_editor/ui/AddKanbanColumnAction.tsx +0 -199
- package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +0 -51
- package/src/collection_editor/ui/EditorCollectionAction.tsx +0 -54
- package/src/collection_editor/ui/EditorCollectionActionStart.tsx +0 -90
- package/src/collection_editor/ui/EditorEntityAction.tsx +0 -50
- package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +0 -114
- package/src/collection_editor/ui/KanbanSetupAction.tsx +0 -43
- package/src/collection_editor/ui/MissingReferenceWidget.tsx +0 -35
- package/src/collection_editor/ui/NewCollectionButton.tsx +0 -27
- package/src/collection_editor/ui/NewCollectionCard.tsx +0 -48
- package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +0 -49
- package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +0 -260
- package/src/collection_editor/ui/collection_editor/AIModifiedPathsContext.tsx +0 -90
- package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +0 -388
- package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +0 -1098
- package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +0 -301
- package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +0 -172
- package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +0 -620
- package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +0 -530
- package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +0 -462
- package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +0 -104
- package/src/collection_editor/ui/collection_editor/CollectionYupValidation.tsx +0 -9
- package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +0 -199
- package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +0 -315
- package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +0 -164
- package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +0 -40
- package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/EnumForm.tsx +0 -373
- package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +0 -288
- package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +0 -141
- package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +0 -194
- package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +0 -53
- package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +0 -980
- package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +0 -164
- package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +0 -364
- package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +0 -44
- package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +0 -41
- package/src/collection_editor/ui/collection_editor/SchemaChangeDialog.tsx +0 -470
- package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +0 -256
- package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +0 -68
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +0 -67
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +0 -296
- package/src/collection_editor/ui/collection_editor/import/clean_import_data.ts +0 -57
- package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +0 -147
- package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +0 -41
- package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +0 -113
- package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +0 -250
- package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +0 -126
- package/src/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.tsx +0 -20
- package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +0 -153
- package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +0 -217
- package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +0 -117
- package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +0 -129
- package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +0 -335
- package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +0 -107
- package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +0 -403
- package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +0 -148
- package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +0 -91
- package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +0 -34
- package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +0 -49
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +0 -925
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +0 -28
- package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +0 -626
- package/src/collection_editor/ui/collection_editor/properties/conditions/index.ts +0 -6
- package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +0 -93
- package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +0 -52
- package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +0 -63
- package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +0 -114
- package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +0 -154
- package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +0 -28
- package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +0 -112
- package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +0 -183
- package/src/collection_editor/ui/collection_editor/templates/products_template.ts +0 -88
- package/src/collection_editor/ui/collection_editor/templates/users_template.ts +0 -42
- package/src/collection_editor/ui/collection_editor/util.ts +0 -28
- package/src/collection_editor/ui/collection_editor/utils/strings.ts +0 -1
- package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +0 -276
- package/src/collection_editor/useCollectionEditorController.tsx +0 -9
- package/src/collection_editor/useCollectionsConfigController.tsx +0 -9
- package/src/collection_editor/useJsonCollectionsConfigController.tsx +0 -297
- package/src/collection_editor/useLiveSchemaEditing.tsx +0 -315
- package/src/collection_editor/useLocalCollectionsConfigController.tsx +0 -341
- package/src/collection_editor/useSafeSnackbarController.ts +0 -9
- package/src/collection_editor/validateCollectionJson.ts +0 -440
- package/src/collection_editor_ui.ts +0 -21
- package/src/components/AdditionalFieldValue.tsx +0 -68
- package/src/components/AdminModeSyncer.tsx +0 -56
- package/src/components/ArrayContainer.tsx +0 -542
- package/src/components/ClearFilterSortButton.tsx +0 -56
- package/src/components/CollectionEditorDialogs.tsx +0 -69
- package/src/components/CollectionPanel.tsx +0 -179
- package/src/components/CollectionTableBinding/CollectionRowActions.tsx +0 -244
- package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +0 -394
- package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +0 -172
- package/src/components/CollectionTableBinding/PropertyTableCell.tsx +0 -350
- package/src/components/CollectionTableBinding/column_utils.tsx +0 -155
- package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +0 -131
- package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +0 -193
- package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +0 -192
- package/src/components/CollectionTableBinding/fields/TableRelationSelectorField.tsx +0 -42
- package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +0 -324
- package/src/components/CollectionTableBinding/fields/VirtualTableSelect.tsx +0 -132
- package/src/components/CollectionTableBinding/fields/VirtualTableUserSelect.tsx +0 -41
- package/src/components/CollectionTableBinding/index.tsx +0 -14
- package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +0 -96
- package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +0 -309
- package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +0 -80
- package/src/components/CollectionTableBinding/internal/common.tsx +0 -74
- package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +0 -422
- package/src/components/CollectionTableBinding/internal/popup_field/useDraggable.tsx +0 -99
- package/src/components/CollectionTableBinding/internal/popup_field/useWindowSize.tsx +0 -22
- package/src/components/CollectionTableBinding/table_bindings.tsx +0 -350
- package/src/components/CollectionViewBinding/BoardCardBinding.tsx +0 -263
- package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +0 -662
- package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +0 -159
- package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +0 -1430
- package/src/components/CollectionViewBinding/CollectionViewActions.tsx +0 -227
- package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +0 -1603
- package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +0 -240
- package/src/components/CollectionViewBinding/EntityCardBinding.tsx +0 -239
- package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +0 -298
- package/src/components/CollectionViewBinding/FiltersDialog.tsx +0 -218
- package/src/components/CollectionViewBinding/SearchExplanation.tsx +0 -106
- package/src/components/CollectionViewBinding/SearchHighlight.tsx +0 -311
- package/src/components/CollectionViewBinding/SlotValue.tsx +0 -156
- package/src/components/CollectionViewBinding/SortButton.tsx +0 -354
- package/src/components/CollectionViewBinding/SplitListCloseButton.tsx +0 -49
- package/src/components/CollectionViewBinding/SplitListShowButton.tsx +0 -28
- package/src/components/CollectionViewBinding/SplitListView.tsx +0 -488
- package/src/components/CollectionViewBinding/SplitViewContext.tsx +0 -34
- package/src/components/CollectionViewBinding/ViewModeToggle.tsx +0 -250
- package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +0 -81
- package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +0 -181
- package/src/components/CollectionViewBinding/useBoardDataController.tsx +0 -802
- package/src/components/CollectionViewBinding/usePreviewSlots.ts +0 -703
- package/src/components/CollectionViewBinding/useSelectionController.tsx +0 -40
- package/src/components/CollectionViewBinding/utils.ts +0 -22
- package/src/components/DefaultAppBar.tsx +0 -264
- package/src/components/DefaultDrawer.tsx +0 -593
- package/src/components/DeleteEntityDialog.tsx +0 -205
- package/src/components/DetailViewBinding.tsx +0 -731
- package/src/components/DrawerNavigationGroup.tsx +0 -141
- package/src/components/DrawerNavigationItem.tsx +0 -115
- package/src/components/EditFormActions.tsx +0 -303
- package/src/components/EditViewBinding.tsx +0 -1069
- package/src/components/EntityDisplayHeader.tsx +0 -170
- package/src/components/EntityIdentityBar.tsx +0 -428
- package/src/components/EntityInspector.tsx +0 -156
- package/src/components/EntityPreviewBinding.tsx +0 -432
- package/src/components/EntityPreviewNesting.tsx +0 -50
- package/src/components/EntityViewBinding.tsx +0 -374
- package/src/components/FieldCaption.tsx +0 -14
- package/src/components/HomePage/ContentHomePage.tsx +0 -586
- package/src/components/HomePage/FavouritesView.tsx +0 -60
- package/src/components/HomePage/HomePageDnD.tsx +0 -704
- package/src/components/HomePage/NavigationCard.tsx +0 -81
- package/src/components/HomePage/NavigationCardBinding.tsx +0 -107
- package/src/components/HomePage/NavigationGroup.tsx +0 -156
- package/src/components/HomePage/RenameGroupDialog.tsx +0 -123
- package/src/components/HomePage/SmallNavigationCard.tsx +0 -41
- package/src/components/HomePage/index.tsx +0 -5
- package/src/components/InlineEntityPreview.tsx +0 -149
- package/src/components/JsonPreviewBinding.tsx +0 -66
- package/src/components/PropertyCollectionView.tsx +0 -336
- package/src/components/PropertyConfigBadge.tsx +0 -28
- package/src/components/PropertyIdCopyTooltip.tsx +0 -47
- package/src/components/RebaseAuthGate.tsx +0 -44
- package/src/components/RebaseCMS.tsx +0 -30
- package/src/components/RebaseLayout.tsx +0 -80
- package/src/components/RebaseNavigation.tsx +0 -369
- package/src/components/RebaseRouteDefs.tsx +0 -127
- package/src/components/RebaseShell.tsx +0 -83
- package/src/components/ReferenceTable/SelectionTableBinding.tsx +0 -389
- package/src/components/ReferenceWidget.tsx +0 -156
- package/src/components/RelationSelector.tsx +0 -926
- package/src/components/SearchIconsView.tsx +0 -78
- package/src/components/SelectableTable/SelectableTable.tsx +0 -309
- package/src/components/SelectableTable/SelectableTableContext.tsx +0 -7
- package/src/components/SelectableTable/SelectionStore.ts +0 -43
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +0 -59
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +0 -146
- package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +0 -190
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +0 -250
- package/src/components/SelectableTable/filters/RelationFilterField.tsx +0 -238
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +0 -282
- package/src/components/SelectableTable/filters/null_filter.ts +0 -63
- package/src/components/SideDialogs.tsx +0 -238
- package/src/components/SidePanelBinding.tsx +0 -361
- package/src/components/SidePanelProvider.tsx +0 -80
- package/src/components/UserSelector.tsx +0 -513
- package/src/components/admin/CreationResultDialog.tsx +0 -138
- package/src/components/admin/index.ts +0 -1
- package/src/components/app/AppBar.tsx +0 -17
- package/src/components/app/Drawer.tsx +0 -38
- package/src/components/app/Scaffold.tsx +0 -366
- package/src/components/app/index.ts +0 -4
- package/src/components/app/useApp.tsx +0 -36
- package/src/components/common/default_entity_actions.tsx +0 -440
- package/src/components/common/index.ts +0 -1
- package/src/components/field_configs.tsx +0 -506
- package/src/components/history/EntityHistoryEntry.tsx +0 -203
- package/src/components/history/EntityHistoryView.tsx +0 -206
- package/src/components/history/LastEditedByFormAction.tsx +0 -24
- package/src/components/history/LastEditedByIndicator.tsx +0 -95
- package/src/components/history/UserChip.tsx +0 -15
- package/src/components/history/index.tsx +0 -5
- package/src/components/index.ts +0 -63
- package/src/contexts/BreacrumbsContext.tsx +0 -45
- package/src/contexts/SideDialogsControllerContext.tsx +0 -5
- package/src/contexts/SidePanelControllerContext.tsx +0 -5
- package/src/data_export/export/BasicExportAction.tsx +0 -142
- package/src/data_export/export/ExportCollectionAction.tsx +0 -321
- package/src/data_export/export/export.ts +0 -295
- package/src/data_export/export/fetch_export_data.ts +0 -90
- package/src/data_export/export/index.ts +0 -4
- package/src/data_export/index.ts +0 -1
- package/src/data_import/components/DataNewPropertiesMapping.tsx +0 -261
- package/src/data_import/components/ImportFileUpload.tsx +0 -42
- package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +0 -58
- package/src/data_import/components/ImportSaveInProgress.tsx +0 -121
- package/src/data_import/components/index.ts +0 -4
- package/src/data_import/hooks/index.ts +0 -1
- package/src/data_import/hooks/useImportConfig.tsx +0 -34
- package/src/data_import/import/ImportCollectionAction.tsx +0 -461
- package/src/data_import/import/index.ts +0 -1
- package/src/data_import/index.ts +0 -5
- package/src/data_import/types/column_mapping.ts +0 -32
- package/src/data_import/types/index.ts +0 -1
- package/src/data_import/utils/csv.ts +0 -153
- package/src/data_import/utils/data.ts +0 -181
- package/src/data_import/utils/file_headers.ts +0 -14
- package/src/data_import/utils/file_to_json.ts +0 -149
- package/src/data_import/utils/get_import_inference_type.ts +0 -33
- package/src/data_import/utils/get_properties_mapping.ts +0 -67
- package/src/data_import/utils/index.ts +0 -5
- package/src/data_import/utils/save_entities.ts +0 -138
- package/src/data_import/utils/transforms.ts +0 -70
- package/src/editor/components/SlashCommandMenu.tsx +0 -532
- package/src/editor/components/editor-bubble-item.tsx +0 -32
- package/src/editor/components/editor-bubble.tsx +0 -143
- package/src/editor/components/image-bubble.tsx +0 -183
- package/src/editor/components/index.ts +0 -14
- package/src/editor/components/table-bubble.tsx +0 -233
- package/src/editor/editor.tsx +0 -529
- package/src/editor/extensions/HighlightDecorationExtension.ts +0 -115
- package/src/editor/extensions/Image.ts +0 -159
- package/src/editor/extensions/TextLoadingDecorationExtension.tsx +0 -107
- package/src/editor/extensions/clipboard.ts +0 -72
- package/src/editor/extensions/custom-keymap.ts +0 -25
- package/src/editor/extensions/drag-and-drop.tsx +0 -508
- package/src/editor/hooks/useProseMirror.ts +0 -126
- package/src/editor/hooks/useProseMirrorContext.ts +0 -15
- package/src/editor/index.ts +0 -2
- package/src/editor/markdown-it-plugins.d.ts +0 -24
- package/src/editor/markdown.ts +0 -204
- package/src/editor/nodeViews/ImageComponent.tsx +0 -20
- package/src/editor/nodeViews/ReactNodeView.tsx +0 -89
- package/src/editor/nodeViews/TaskItemComponent.tsx +0 -30
- package/src/editor/nodeViews/index.ts +0 -35
- package/src/editor/plugins/index.ts +0 -58
- package/src/editor/plugins/inputrules.ts +0 -82
- package/src/editor/plugins/placeholderPlugin.ts +0 -55
- package/src/editor/plugins/slashCommandPlugin.ts +0 -65
- package/src/editor/schema.ts +0 -339
- package/src/editor/selectors/ai-selector.tsx +0 -110
- package/src/editor/selectors/color-selector.tsx +0 -199
- package/src/editor/selectors/link-selector.tsx +0 -122
- package/src/editor/selectors/node-selector.tsx +0 -159
- package/src/editor/selectors/text-buttons.tsx +0 -79
- package/src/editor/types.ts +0 -6
- package/src/editor/useProseMirror.ts +0 -125
- package/src/editor/utils/prosemirror-utils.ts +0 -113
- package/src/editor/utils/remove_classes.ts +0 -18
- package/src/editor/utils/useDebouncedCallback.ts +0 -25
- package/src/form/EntityForm.tsx +0 -761
- package/src/form/EntityFormActions.tsx +0 -160
- package/src/form/EntityFormBinding.tsx +0 -342
- package/src/form/PropertyFieldBinding.tsx +0 -348
- package/src/form/components/ErrorFocus.tsx +0 -44
- package/src/form/components/FieldBlock.tsx +0 -189
- package/src/form/components/FieldHelperText.tsx +0 -84
- package/src/form/components/FormRail.tsx +0 -153
- package/src/form/components/FormSections.tsx +0 -145
- package/src/form/components/LabelWithIcon.tsx +0 -43
- package/src/form/components/LabelWithIconAndTooltip.tsx +0 -28
- package/src/form/components/LocalChangesMenu.tsx +0 -147
- package/src/form/components/StorageItemPreview.tsx +0 -81
- package/src/form/components/StorageUploadProgress.tsx +0 -118
- package/src/form/components/index.tsx +0 -6
- package/src/form/components/useRailVisible.tsx +0 -47
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +0 -109
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +0 -172
- package/src/form/field_bindings/BinaryFieldBinding.tsx +0 -177
- package/src/form/field_bindings/BlockFieldBinding.tsx +0 -282
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +0 -78
- package/src/form/field_bindings/GeopointFieldBinding.tsx +0 -200
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +0 -574
- package/src/form/field_bindings/MapFieldBinding.tsx +0 -120
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +0 -259
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +0 -130
- package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +0 -168
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +0 -94
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +0 -146
- package/src/form/field_bindings/RelationFieldBinding.tsx +0 -202
- package/src/form/field_bindings/RepeatFieldBinding.tsx +0 -143
- package/src/form/field_bindings/SelectFieldBinding.tsx +0 -111
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +0 -521
- package/src/form/field_bindings/SwitchFieldBinding.tsx +0 -70
- package/src/form/field_bindings/TextFieldBinding.tsx +0 -189
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +0 -71
- package/src/form/field_bindings/VectorFieldBinding.tsx +0 -209
- package/src/form/form_utils.ts +0 -243
- package/src/form/index.tsx +0 -36
- package/src/form/useClearRestoreValue.tsx +0 -36
- package/src/form/useUndoableDiscard.ts +0 -39
- package/src/form/validation.ts +0 -583
- package/src/hooks/index.ts +0 -16
- package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +0 -22
- package/src/hooks/navigation/contexts/NavigationStateContext.tsx +0 -16
- package/src/hooks/navigation/contexts/UrlContext.tsx +0 -24
- package/src/hooks/navigation/contexts/index.ts +0 -14
- package/src/hooks/navigation/useAsyncResolver.ts +0 -100
- package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +0 -218
- package/src/hooks/navigation/useBuildNavigationStateController.tsx +0 -134
- package/src/hooks/navigation/useBuildUrlController.tsx +0 -66
- package/src/hooks/navigation/useNavigationResolution.ts +0 -271
- package/src/hooks/navigation/useResolvedCollections.ts +0 -102
- package/src/hooks/navigation/useResolvedViews.tsx +0 -139
- package/src/hooks/navigation/useTopLevelNavigation.ts +0 -273
- package/src/hooks/navigation/utils.ts +0 -200
- package/src/hooks/useAdminContext.tsx +0 -83
- package/src/hooks/useBreadcrumbsController.tsx +0 -17
- package/src/hooks/useBuildSideDialogsController.tsx +0 -145
- package/src/hooks/useBuildSidePanel.tsx +0 -315
- package/src/hooks/useChildViewSource.ts +0 -46
- package/src/hooks/useEntityDisplay.tsx +0 -262
- package/src/hooks/useEntityDisplayTitle.tsx +0 -49
- package/src/hooks/useHistory.ts +0 -178
- package/src/hooks/useRecordActions.tsx +0 -69
- package/src/hooks/useResolvedNavigationFrom.tsx +0 -167
- package/src/hooks/useResolvedUsers.ts +0 -148
- package/src/hooks/useSelectionDialog.tsx +0 -58
- package/src/hooks/useSideDialogsController.tsx +0 -25
- package/src/hooks/useSidePanel.tsx +0 -13
- package/src/index.ts +0 -124
- package/src/preview/PropertyPreview.tsx +0 -331
- package/src/preview/compact_text.ts +0 -68
- package/src/preview/components/ArrayEnumPreview.tsx +0 -39
- package/src/preview/components/BooleanPreview.tsx +0 -28
- package/src/preview/components/DatePreview.tsx +0 -106
- package/src/preview/components/EmptyValue.tsx +0 -10
- package/src/preview/components/EnumValuesChip.tsx +0 -39
- package/src/preview/components/ImagePreview.tsx +0 -144
- package/src/preview/components/InlineEntityListPreview.tsx +0 -42
- package/src/preview/components/ReferencePreview.tsx +0 -235
- package/src/preview/components/RelationPreview.tsx +0 -271
- package/src/preview/components/StorageThumbnail.tsx +0 -147
- package/src/preview/components/UrlComponentPreview.tsx +0 -116
- package/src/preview/components/UserPreview.tsx +0 -30
- package/src/preview/components/date_fns_locales.ts +0 -125
- package/src/preview/index.ts +0 -26
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -73
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +0 -67
- package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +0 -77
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -49
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -70
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +0 -79
- package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +0 -35
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +0 -79
- package/src/preview/property_previews/MapPropertyPreview.tsx +0 -198
- package/src/preview/property_previews/NumberPropertyPreview.tsx +0 -39
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +0 -276
- package/src/preview/property_previews/StringPropertyPreview.tsx +0 -70
- package/src/preview/util.ts +0 -39
- package/src/routes/CustomViewRoute.tsx +0 -33
- package/src/routes/RebaseRoute.tsx +0 -467
- package/src/routes/index.ts +0 -2
- package/src/types/components/EntityFormActionsProps.tsx +0 -20
- package/src/types/components/EntityFormProps.tsx +0 -119
- package/src/types/components/PropertyPreviewProps.tsx +0 -85
- package/src/types/components/formex.tsx +0 -2
- package/src/types/components/index.ts +0 -3
- package/src/types/fields.tsx +0 -340
- package/src/types/index.ts +0 -4
- package/src/util/dataControllerAdapter.ts +0 -88
- package/src/util/entity_actions.ts +0 -28
- package/src/util/index.ts +0 -5
- package/src/util/navigation_utils.ts +0 -89
- package/src/util/number_format.ts +0 -46
- package/src/util/previews.ts +0 -131
- package/src/util/propertyConfigMapper.ts +0 -134
- package/src/util/property_utils.tsx +0 -236
- package/src/util/resolutions.ts +0 -96
- package/src/util/view_constants.ts +0 -33
- package/src/util/view_mode.ts +0 -176
|
@@ -1,467 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import type { ViewMode, AdminCollection } from "@rebasepro/cms-types";
|
|
3
|
-
import { useLocation } from "react-router";
|
|
4
|
-
import { EditViewBinding } from "../components/EditViewBinding";
|
|
5
|
-
import { DetailViewBinding } from "../components/DetailViewBinding";
|
|
6
|
-
import { useCallback, useEffect, useRef, useState } from "react";
|
|
7
|
-
import { useNavigate } from "react-router";
|
|
8
|
-
import { CollectionViewBinding } from "../components/CollectionViewBinding/CollectionViewBinding";
|
|
9
|
-
import { ErrorView, NotFoundPage, useUserConfigurationPersistence, useComponentOverride, useNavigationBlocker } from "@rebasepro/app";
|
|
10
|
-
import { resolveOpenEntityMode, resolveViewMode } from "../util/view_mode";
|
|
11
|
-
import { UnsavedChangesDialog } from "@rebasepro/app";
|
|
12
|
-
import { CenteredView, CircularProgressCenter } from "@rebasepro/ui";
|
|
13
|
-
import { NavigationViewCollectionInternal, NavigationViewEntityCustomInternal, NavigationViewInternal } from "@rebasepro/app";
|
|
14
|
-
import { getNavigationEntriesFromPath } from "@rebasepro/app";
|
|
15
|
-
import { toArray } from "@rebasepro/utils";
|
|
16
|
-
import { useCollectionRegistryController } from "../hooks/navigation/contexts/CollectionRegistryContext";
|
|
17
|
-
import { useUrlController } from "../hooks/navigation/contexts/UrlContext";
|
|
18
|
-
import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
|
|
19
|
-
|
|
20
|
-
export function RebaseRoute() {
|
|
21
|
-
|
|
22
|
-
const location = useLocation();
|
|
23
|
-
const collectionRegistry = useCollectionRegistryController();
|
|
24
|
-
const urlController = useUrlController();
|
|
25
|
-
const breadcrumbs = useBreadcrumbsController();
|
|
26
|
-
const userConfigPersistence = useUserConfigurationPersistence();
|
|
27
|
-
const ResolvedCollectionView = useComponentOverride("Collection.View", CollectionViewBinding);
|
|
28
|
-
|
|
29
|
-
const hash = location.hash;
|
|
30
|
-
const isSidePanel = hash.includes("#side");
|
|
31
|
-
const isNew = hash.includes("#new") || hash.includes("#new_side");
|
|
32
|
-
const isCopy = hash.includes("#copy");
|
|
33
|
-
const isFullScreen = hash.includes("#full");
|
|
34
|
-
|
|
35
|
-
const pathname = location.pathname;
|
|
36
|
-
const navigationPath = urlController.urlPathToDataPath(pathname);
|
|
37
|
-
|
|
38
|
-
const navigationEntries = getNavigationEntriesFromPath({
|
|
39
|
-
path: navigationPath,
|
|
40
|
-
collections: collectionRegistry.collections ?? []
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
useEffect(() => {
|
|
44
|
-
breadcrumbs.set({
|
|
45
|
-
breadcrumbs: navigationEntries.map((entry) => {
|
|
46
|
-
|
|
47
|
-
if (entry.type === "entity") {
|
|
48
|
-
return ({
|
|
49
|
-
title: String(entry.entityId),
|
|
50
|
-
url: urlController.buildUrlCollectionPath(entry.path)
|
|
51
|
-
});
|
|
52
|
-
} else if (entry.type === "custom_view") {
|
|
53
|
-
return ({
|
|
54
|
-
title: String(entry.view.name ?? entry.view.key),
|
|
55
|
-
url: urlController.buildUrlCollectionPath(entry.path)
|
|
56
|
-
});
|
|
57
|
-
} else if (entry.type === "collection") {
|
|
58
|
-
return ({
|
|
59
|
-
title: entry.collection.name,
|
|
60
|
-
url: urlController.buildUrlCollectionPath(entry.path),
|
|
61
|
-
id: entry.path
|
|
62
|
-
});
|
|
63
|
-
} else {
|
|
64
|
-
throw new Error("Unexpected navigation entry type");
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
|
-
});
|
|
68
|
-
}, [navigationEntries.map(entry => entry.path).join(",")]);
|
|
69
|
-
|
|
70
|
-
if (isNew) {
|
|
71
|
-
// New entities always use full-screen mode, even for split-layout collections
|
|
72
|
-
return <EntityFullScreenRoute
|
|
73
|
-
pathname={pathname}
|
|
74
|
-
navigationEntries={navigationEntries}
|
|
75
|
-
isNew={true}
|
|
76
|
-
isCopy={false}
|
|
77
|
-
/>;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (navigationEntries.length === 1 && navigationEntries[0].type === "collection") {
|
|
81
|
-
let collection: AdminCollection<any> | undefined;
|
|
82
|
-
collection = collectionRegistry.getCollection(navigationEntries[0].id);
|
|
83
|
-
if (!collection)
|
|
84
|
-
collection = collectionRegistry.getCollection(navigationEntries[0].slug);
|
|
85
|
-
if (!collection) {
|
|
86
|
-
if (!collectionRegistry.initialised) {
|
|
87
|
-
return <CircularProgressCenter/>;
|
|
88
|
-
}
|
|
89
|
-
return <UnresolvedCollectionView path={navigationEntries[0].slug}/>;
|
|
90
|
-
}
|
|
91
|
-
return <ResolvedCollectionView
|
|
92
|
-
key={`collection_view_${collection.slug}`}
|
|
93
|
-
{...collection}
|
|
94
|
-
parentCollectionSlugs={[]} parentEntityIds={[]}
|
|
95
|
-
path={collection.slug}
|
|
96
|
-
updateUrl={true}
|
|
97
|
-
Actions={toArray(collection.Actions)}/>
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if (isSidePanel) {
|
|
101
|
-
const lastCollectionEntry = [...navigationEntries].reverse().find((entry) => entry.type === "collection");
|
|
102
|
-
if (lastCollectionEntry) {
|
|
103
|
-
let collection: AdminCollection<any> | undefined;
|
|
104
|
-
const firstEntry = navigationEntries[0] as NavigationViewCollectionInternal<any>;
|
|
105
|
-
collection = collectionRegistry.getCollection(firstEntry.id);
|
|
106
|
-
if (!collection)
|
|
107
|
-
collection = collectionRegistry.getCollection(firstEntry.slug);
|
|
108
|
-
if (!collection) {
|
|
109
|
-
if (!collectionRegistry.initialised) {
|
|
110
|
-
return <CircularProgressCenter/>;
|
|
111
|
-
}
|
|
112
|
-
return <UnresolvedCollectionView path={firstEntry.slug}/>;
|
|
113
|
-
}
|
|
114
|
-
return <ResolvedCollectionView
|
|
115
|
-
key={`collection_view_${collection.slug}`}
|
|
116
|
-
{...collection}
|
|
117
|
-
parentCollectionSlugs={[]} parentEntityIds={[]}
|
|
118
|
-
path={collection.slug}
|
|
119
|
-
updateUrl={true}
|
|
120
|
-
Actions={toArray(collection.Actions)}/>;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Check if this is a simple entity route (collection + entity) for a split-layout collection.
|
|
125
|
-
// If so, render the collection view with the entity shown in the split detail panel
|
|
126
|
-
// instead of the full-screen editor. This keeps the master-detail UX with clean URLs.
|
|
127
|
-
//
|
|
128
|
-
// Also handles subcollection tabs: /c/customers/39/orders produces 3 entries
|
|
129
|
-
// (collection→entity→subcollection). We extract the subcollection slug as selectedTab.
|
|
130
|
-
const lastEntityEntry = navigationEntries.find((entry) => entry.type === "entity");
|
|
131
|
-
const firstCollectionEntry = navigationEntries[0];
|
|
132
|
-
if (
|
|
133
|
-
!isFullScreen &&
|
|
134
|
-
!isCopy &&
|
|
135
|
-
firstCollectionEntry?.type === "collection" &&
|
|
136
|
-
lastEntityEntry?.type === "entity" &&
|
|
137
|
-
(navigationEntries.length === 2 || navigationEntries.length === 3)
|
|
138
|
-
) {
|
|
139
|
-
let collection: AdminCollection<any> | undefined;
|
|
140
|
-
collection = collectionRegistry.getCollection(firstCollectionEntry.id);
|
|
141
|
-
if (!collection)
|
|
142
|
-
collection = collectionRegistry.getCollection(firstCollectionEntry.slug);
|
|
143
|
-
|
|
144
|
-
const effectiveOpenMode = collection
|
|
145
|
-
? resolveOpenEntityMode({
|
|
146
|
-
collection,
|
|
147
|
-
viewMode: resolveViewMode({
|
|
148
|
-
collection,
|
|
149
|
-
search: location.search,
|
|
150
|
-
savedViewMode: userConfigPersistence?.getCollectionConfig(collection.slug)?.defaultViewMode as ViewMode | undefined
|
|
151
|
-
})
|
|
152
|
-
})
|
|
153
|
-
: undefined;
|
|
154
|
-
if (collection && effectiveOpenMode === "split") {
|
|
155
|
-
// Extract subcollection tab from the 3rd entry if present
|
|
156
|
-
let selectedTab: string | undefined;
|
|
157
|
-
if (navigationEntries.length === 3) {
|
|
158
|
-
const thirdEntry = navigationEntries[2];
|
|
159
|
-
if (thirdEntry.type === "collection") {
|
|
160
|
-
selectedTab = thirdEntry.collection.slug;
|
|
161
|
-
} else if (thirdEntry.type === "custom_view") {
|
|
162
|
-
selectedTab = thirdEntry.view.key;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
// Fallback: check for unregistered tabs (e.g. __json, __rebase_history)
|
|
166
|
-
// that aren't parsed as navigation entries
|
|
167
|
-
if (!selectedTab && (navigationEntries.length === 2) && lastEntityEntry) {
|
|
168
|
-
const entityIdStr = String(lastEntityEntry.entityId);
|
|
169
|
-
const entityIdIdx = pathname.lastIndexOf(`/${entityIdStr}`);
|
|
170
|
-
if (entityIdIdx >= 0) {
|
|
171
|
-
const afterEntity = pathname.substring(entityIdIdx + 1 + entityIdStr.length);
|
|
172
|
-
const trailingSegment = afterEntity.startsWith("/") ? afterEntity.substring(1) : afterEntity;
|
|
173
|
-
if (trailingSegment.length > 0) {
|
|
174
|
-
selectedTab = trailingSegment;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return <ResolvedCollectionView
|
|
179
|
-
key={`collection_view_${collection.slug}`}
|
|
180
|
-
{...collection}
|
|
181
|
-
parentCollectionSlugs={[]} parentEntityIds={[]}
|
|
182
|
-
path={collection.slug}
|
|
183
|
-
updateUrl={true}
|
|
184
|
-
selectedEntityId={lastEntityEntry.entityId}
|
|
185
|
-
selectedTab={selectedTab}
|
|
186
|
-
Actions={toArray(collection.Actions)}/>;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return <EntityFullScreenRoute
|
|
191
|
-
pathname={pathname}
|
|
192
|
-
navigationEntries={navigationEntries}
|
|
193
|
-
isNew={isNew}
|
|
194
|
-
isCopy={isCopy}
|
|
195
|
-
/>;
|
|
196
|
-
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
function getSelectedTabFromUrl(isNew: boolean, lastCustomView: NavigationViewCollectionInternal<any> | NavigationViewEntityCustomInternal<any> | undefined) {
|
|
200
|
-
if (isNew) {
|
|
201
|
-
return undefined;
|
|
202
|
-
} else if (lastCustomView) {
|
|
203
|
-
if (lastCustomView.type === "custom_view") {
|
|
204
|
-
return lastCustomView.view.key;
|
|
205
|
-
} else if (lastCustomView.type === "collection") {
|
|
206
|
-
return lastCustomView.id ?? lastCustomView.slug;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
return undefined;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
function EntityFullScreenRoute({
|
|
213
|
-
pathname,
|
|
214
|
-
navigationEntries,
|
|
215
|
-
isNew,
|
|
216
|
-
isCopy
|
|
217
|
-
}: {
|
|
218
|
-
pathname: string;
|
|
219
|
-
navigationEntries: NavigationViewInternal[],
|
|
220
|
-
isNew: boolean,
|
|
221
|
-
isCopy: boolean
|
|
222
|
-
}) {
|
|
223
|
-
|
|
224
|
-
const collectionRegistry = useCollectionRegistryController();
|
|
225
|
-
const urlController = useUrlController();
|
|
226
|
-
const navigate = useNavigate();
|
|
227
|
-
const location = useLocation();
|
|
228
|
-
const userConfigPersistence = useUserConfigurationPersistence();
|
|
229
|
-
|
|
230
|
-
// defaultValues may be carried via location.state when openNewDocument() is called
|
|
231
|
-
// for full-screen mode. We read it once on mount — after that, the form owns its state.
|
|
232
|
-
const defaultValues = (location.state as { defaultValues?: Record<string, unknown> } | null)?.defaultValues;
|
|
233
|
-
|
|
234
|
-
// Preserve the current hash (e.g. #full) across tab/save navigations
|
|
235
|
-
const hash = location.hash;
|
|
236
|
-
|
|
237
|
-
const navigationPath = urlController.urlPathToDataPath(pathname);
|
|
238
|
-
|
|
239
|
-
// is navigating away blocked
|
|
240
|
-
const blocked = useRef(false);
|
|
241
|
-
|
|
242
|
-
const lastEntityEntry = [...navigationEntries].reverse().find((entry) => entry.type === "entity");
|
|
243
|
-
const navigationEntriesAfterEntity = lastEntityEntry ? navigationEntries.slice(navigationEntries.indexOf(lastEntityEntry) + 1) : [];
|
|
244
|
-
|
|
245
|
-
const lastCustomView = [...navigationEntriesAfterEntity].reverse().find(
|
|
246
|
-
(entry) => entry.type === "custom_view" || entry.type === "collection"
|
|
247
|
-
) as NavigationViewCollectionInternal<any> | NavigationViewEntityCustomInternal<any> | undefined;
|
|
248
|
-
|
|
249
|
-
const entityId = lastEntityEntry && "entityId" in lastEntityEntry ? lastEntityEntry.entityId : undefined;
|
|
250
|
-
|
|
251
|
-
// Derive tab from navigation entries (works for registered custom views)
|
|
252
|
-
let urlTab = getSelectedTabFromUrl(isNew, lastCustomView);
|
|
253
|
-
|
|
254
|
-
// Fallback: internal tabs like __json or __rebase_history aren't registered as
|
|
255
|
-
// entity views, so the navigation parser ignores them. Check the raw pathname
|
|
256
|
-
// for a trailing segment after the entity ID to catch those cases.
|
|
257
|
-
if (!urlTab && entityId && !isNew) {
|
|
258
|
-
const entityIdStr = String(entityId);
|
|
259
|
-
const entityIdIdx = pathname.lastIndexOf(`/${entityIdStr}`);
|
|
260
|
-
if (entityIdIdx >= 0) {
|
|
261
|
-
const afterEntity = pathname.substring(entityIdIdx + 1 + entityIdStr.length);
|
|
262
|
-
const trailingSegment = afterEntity.startsWith("/") ? afterEntity.substring(1) : afterEntity;
|
|
263
|
-
if (trailingSegment.length > 0 && trailingSegment !== "edit") {
|
|
264
|
-
urlTab = trailingSegment;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
const [selectedTab, setSelectedTab] = useState<string | undefined>(urlTab);
|
|
270
|
-
|
|
271
|
-
const parentCollectionSlugs = collectionRegistry.getParentCollectionSlugs(navigationPath);
|
|
272
|
-
const parentEntityIds = collectionRegistry.getParentEntityIds(navigationPath);
|
|
273
|
-
useEffect(() => {
|
|
274
|
-
if (urlTab !== selectedTab) {
|
|
275
|
-
setSelectedTab(urlTab);
|
|
276
|
-
}
|
|
277
|
-
}, [urlTab]);
|
|
278
|
-
|
|
279
|
-
const basePath = !entityId || isNew
|
|
280
|
-
? pathname
|
|
281
|
-
: pathname.substring(0, pathname.lastIndexOf(`/${entityId}`));
|
|
282
|
-
|
|
283
|
-
const entityPath = basePath + `/${entityId}`;
|
|
284
|
-
|
|
285
|
-
const blocker = useNavigationBlocker(useCallback(({
|
|
286
|
-
currentLocation,
|
|
287
|
-
nextLocation
|
|
288
|
-
}) => {
|
|
289
|
-
if (nextLocation.pathname.startsWith(entityPath))
|
|
290
|
-
return false;
|
|
291
|
-
|
|
292
|
-
// Side panel overlay navigations preserve the underlying form via
|
|
293
|
-
// base_location in router state — no data is lost in either direction.
|
|
294
|
-
|
|
295
|
-
// Opening a side panel (e.g. clicking a relation arrow)
|
|
296
|
-
const nextHash = nextLocation.hash;
|
|
297
|
-
if (nextHash === "#side" || nextHash === "#new_side")
|
|
298
|
-
return false;
|
|
299
|
-
|
|
300
|
-
// Closing a side panel (navigate(-1) back to the form's own path)
|
|
301
|
-
const currentHash = currentLocation.hash;
|
|
302
|
-
if ((currentHash === "#side" || currentHash === "#new_side") &&
|
|
303
|
-
(nextLocation.pathname === basePath ||
|
|
304
|
-
nextLocation.pathname.startsWith(entityPath)))
|
|
305
|
-
return false;
|
|
306
|
-
|
|
307
|
-
return blocked.current;
|
|
308
|
-
}, [entityPath, basePath]));
|
|
309
|
-
|
|
310
|
-
const lastCollectionEntry = [...navigationEntries].reverse().find((entry) => entry.type === "collection");
|
|
311
|
-
|
|
312
|
-
if (isNew && !lastCollectionEntry) {
|
|
313
|
-
if (!collectionRegistry.initialised) {
|
|
314
|
-
return <CircularProgressCenter/>;
|
|
315
|
-
}
|
|
316
|
-
throw new Error("INTERNAL: No collection found in the navigation");
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
if (!isNew && !lastEntityEntry) {
|
|
320
|
-
if (!collectionRegistry.initialised) {
|
|
321
|
-
return <CircularProgressCenter/>;
|
|
322
|
-
}
|
|
323
|
-
return <NotFoundPage/>;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
const rawCollection = isNew
|
|
327
|
-
? (lastCollectionEntry && "collection" in lastCollectionEntry ? lastCollectionEntry.collection : undefined)!
|
|
328
|
-
: (lastEntityEntry && "parentCollection" in lastEntityEntry ? lastEntityEntry.parentCollection : undefined)!;
|
|
329
|
-
const collection = collectionRegistry.getCollection(rawCollection.slug) || rawCollection;
|
|
330
|
-
const fullIdPath = isNew ? lastCollectionEntry!.slug : lastEntityEntry!.slug;
|
|
331
|
-
const collectionPath = urlController.resolveDatabasePathsFrom(fullIdPath);
|
|
332
|
-
const isEditRoute = pathname.endsWith("/edit") || pathname.split("/").pop() === "edit";
|
|
333
|
-
// Determine if this is a detail-view-first collection showing the view page
|
|
334
|
-
const isDetailMode = collection.defaultEntityAction === "view" && !isNew && !isCopy && entityId && !isEditRoute;
|
|
335
|
-
|
|
336
|
-
// A record is full screen either because its collection has no list to show
|
|
337
|
-
// beside it, or because the user folded that list away. Only the second is
|
|
338
|
-
// reversible, and it is reversible by dropping `#full` alone: this is the
|
|
339
|
-
// same URL the split route reads, so the same conditions decide it.
|
|
340
|
-
const splitListAvailable = !isNew && !isCopy && entityId !== undefined &&
|
|
341
|
-
navigationEntries[0]?.type === "collection" &&
|
|
342
|
-
(navigationEntries.length === 2 || navigationEntries.length === 3) &&
|
|
343
|
-
resolveOpenEntityMode({
|
|
344
|
-
collection,
|
|
345
|
-
viewMode: resolveViewMode({
|
|
346
|
-
collection,
|
|
347
|
-
search: location.search,
|
|
348
|
-
savedViewMode: userConfigPersistence?.getCollectionConfig(collection.slug)?.defaultViewMode as ViewMode | undefined
|
|
349
|
-
})
|
|
350
|
-
}) === "split";
|
|
351
|
-
|
|
352
|
-
const showList = splitListAvailable
|
|
353
|
-
? () => navigate({
|
|
354
|
-
pathname,
|
|
355
|
-
search: location.search,
|
|
356
|
-
hash: ""
|
|
357
|
-
})
|
|
358
|
-
: undefined;
|
|
359
|
-
|
|
360
|
-
if (isDetailMode) {
|
|
361
|
-
return <>
|
|
362
|
-
<DetailViewBinding
|
|
363
|
-
key={collection.slug + "_view_" + entityId}
|
|
364
|
-
entityId={entityId}
|
|
365
|
-
collection={collection}
|
|
366
|
-
layout={"full_screen"}
|
|
367
|
-
path={collectionPath}
|
|
368
|
-
selectedTab={selectedTab ?? undefined}
|
|
369
|
-
onShowList={showList}
|
|
370
|
-
onEditClick={() => {
|
|
371
|
-
const editUrl = urlController.buildUrlCollectionPath(`${collectionPath}/${entityId}`) + "/edit";
|
|
372
|
-
navigate(editUrl + hash);
|
|
373
|
-
}}
|
|
374
|
-
onTabChange={(params) => {
|
|
375
|
-
setSelectedTab(params.selectedTab);
|
|
376
|
-
const newSelectedTab = params.selectedTab;
|
|
377
|
-
if (newSelectedTab) {
|
|
378
|
-
navigate(`${basePath}/${entityId}/${newSelectedTab}${hash}`, { replace: true });
|
|
379
|
-
} else {
|
|
380
|
-
navigate(`${basePath}/${entityId}${hash}`, { replace: true });
|
|
381
|
-
}
|
|
382
|
-
}}
|
|
383
|
-
parentCollectionSlugs={parentCollectionSlugs}
|
|
384
|
-
parentEntityIds={parentEntityIds}
|
|
385
|
-
/>
|
|
386
|
-
</>;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
return <>
|
|
390
|
-
<EditViewBinding
|
|
391
|
-
key={collection.slug + "_" + (isNew ? "new" : (isCopy ? entityId + "_copy" : entityId))}
|
|
392
|
-
entityId={isNew ? undefined : entityId}
|
|
393
|
-
collection={collection}
|
|
394
|
-
layout={"full_screen"}
|
|
395
|
-
path={collectionPath}
|
|
396
|
-
copy={isCopy}
|
|
397
|
-
selectedTab={selectedTab ?? undefined}
|
|
398
|
-
onShowList={showList}
|
|
399
|
-
defaultValues={isNew ? defaultValues : undefined}
|
|
400
|
-
onValuesModified={(modified) => blocked.current = modified}
|
|
401
|
-
navigateBack={() => {
|
|
402
|
-
const detailUrl = urlController.buildUrlCollectionPath(`${collectionPath}/${entityId}`);
|
|
403
|
-
navigate(detailUrl + hash);
|
|
404
|
-
}}
|
|
405
|
-
onSaved={(params) => {
|
|
406
|
-
const newSelectedTab = params.selectedTab;
|
|
407
|
-
const newEntityId = params.entityId;
|
|
408
|
-
const savedHash = isNew ? "" : hash;
|
|
409
|
-
if (newSelectedTab) {
|
|
410
|
-
navigate(`${basePath}/${newEntityId}/${newSelectedTab}${savedHash}`, { replace: true });
|
|
411
|
-
} else {
|
|
412
|
-
navigate(`${basePath}/${newEntityId}${savedHash}`, { replace: true });
|
|
413
|
-
}
|
|
414
|
-
}}
|
|
415
|
-
onTabChange={(params) => {
|
|
416
|
-
setSelectedTab(params.selectedTab);
|
|
417
|
-
if (isNew) {
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
const newSelectedTab = params.selectedTab;
|
|
421
|
-
if (newSelectedTab) {
|
|
422
|
-
navigate(`${basePath}/${entityId}/${newSelectedTab}${hash}`, { replace: true });
|
|
423
|
-
} else {
|
|
424
|
-
navigate(`${basePath}/${entityId}${hash}`, { replace: true });
|
|
425
|
-
}
|
|
426
|
-
}}
|
|
427
|
-
parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}
|
|
428
|
-
/>
|
|
429
|
-
|
|
430
|
-
<UnsavedChangesDialog
|
|
431
|
-
open={blocker?.state === "blocked"}
|
|
432
|
-
handleOk={() => blocker?.proceed?.()}
|
|
433
|
-
handleCancel={() => blocker?.reset?.()}
|
|
434
|
-
body={"You have unsaved changes in this entity."}/>
|
|
435
|
-
</>;
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
/**
|
|
439
|
-
* Shown when a URL names a collection the registry cannot resolve.
|
|
440
|
-
*
|
|
441
|
-
* This used to be `return null`, which renders an empty pane inside the app
|
|
442
|
-
* chrome: the sidebar, the nav highlight and the breadcrumb all still work,
|
|
443
|
-
* because those read the collections array directly, while the view itself is
|
|
444
|
-
* blank. Nothing is thrown, and the only trace is a `console.debug` — so the
|
|
445
|
-
* panel looks like it lost its data rather than like it failed to find the
|
|
446
|
-
* collection, and there is no string to search for.
|
|
447
|
-
*
|
|
448
|
-
* A slug containing slashes went unresolvable this way and cost an afternoon to
|
|
449
|
-
* find. The lookup is fixed; this is the part that made it expensive.
|
|
450
|
-
*/
|
|
451
|
-
function UnresolvedCollectionView({ path }: { path: string }) {
|
|
452
|
-
// Warn, not debug: this is a route that renders nothing useful, and it
|
|
453
|
-
// should be visible at the console's default level.
|
|
454
|
-
useEffect(() => {
|
|
455
|
-
console.warn(
|
|
456
|
-
`[rebase] No collection is registered for "${path}", so this route has nothing to render. ` +
|
|
457
|
-
"Check that the collection is in the collections array and that its slug matches the URL."
|
|
458
|
-
);
|
|
459
|
-
}, [path]);
|
|
460
|
-
|
|
461
|
-
return <CenteredView>
|
|
462
|
-
<ErrorView
|
|
463
|
-
title={"Collection not found"}
|
|
464
|
-
error={`Nothing is registered for "${path}".`}
|
|
465
|
-
tooltip={"The URL names a collection the panel does not know about. It may have been renamed or removed from the collections array, or the slug may not match the path."}/>
|
|
466
|
-
</CenteredView>;
|
|
467
|
-
}
|
package/src/routes/index.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Entity } from "@rebasepro/types";
|
|
2
|
-
|
|
3
|
-
import { FormContext } from "../fields";
|
|
4
|
-
import { FormexController } from "./formex";
|
|
5
|
-
import type { AdminCollection } from "@rebasepro/cms-types";
|
|
6
|
-
|
|
7
|
-
export interface EntityFormActionsProps {
|
|
8
|
-
path: string;
|
|
9
|
-
collection: AdminCollection;
|
|
10
|
-
entity?: Entity;
|
|
11
|
-
savingError?: Error;
|
|
12
|
-
formex: FormexController<Record<string, unknown>>;
|
|
13
|
-
disabled: boolean;
|
|
14
|
-
status: "new" | "existing" | "copy";
|
|
15
|
-
pluginActions: React.ReactNode[];
|
|
16
|
-
openEntityMode?: "side_panel" | "full_screen" | "split" | "dialog";
|
|
17
|
-
showDefaultActions?: boolean;
|
|
18
|
-
navigateBack: () => void;
|
|
19
|
-
formContext: FormContext
|
|
20
|
-
}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { Entity, EntityStatus } from "@rebasepro/types";
|
|
2
|
-
|
|
3
|
-
import { EntityCustomViewParams, AdminCollection } from "@rebasepro/cms-types";
|
|
4
|
-
import { FormContext } from "../fields";
|
|
5
|
-
import { FormexController } from "./formex";
|
|
6
|
-
import { EntityFormActionsProps } from "./EntityFormActionsProps";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Props for the headless EntityForm component.
|
|
10
|
-
* This form can be used without admin context — all backend concerns
|
|
11
|
-
* (save, caching, analytics, plugin slots) are provided via callbacks.
|
|
12
|
-
*/
|
|
13
|
-
export type EntityFormProps<M extends Record<string, unknown>> = {
|
|
14
|
-
path: string;
|
|
15
|
-
fullIdPath?: string;
|
|
16
|
-
collection: AdminCollection<M>;
|
|
17
|
-
entityId?: string | number;
|
|
18
|
-
entity?: Entity<M>;
|
|
19
|
-
databaseId?: string;
|
|
20
|
-
onIdChange?: (id: string | number) => void;
|
|
21
|
-
onValuesModified?: (modified: boolean, values: M) => void;
|
|
22
|
-
onSaved?: (params: OnUpdateParams) => void;
|
|
23
|
-
initialDirtyValues?: Partial<M>; // dirty cached entity in memory
|
|
24
|
-
onFormContextReady?: (formContext: FormContext<M>) => void;
|
|
25
|
-
className?: string;
|
|
26
|
-
initialStatus: EntityStatus;
|
|
27
|
-
onStatusChange?: (status: EntityStatus) => void;
|
|
28
|
-
onEntityChange?: (entity: Entity<M>) => void;
|
|
29
|
-
formex?: FormexController<M>;
|
|
30
|
-
openEntityMode?: "side_panel" | "full_screen" | "split" | "dialog";
|
|
31
|
-
/**
|
|
32
|
-
* If true, the form will be disabled and no actions will be available
|
|
33
|
-
*/
|
|
34
|
-
disabled?: boolean;
|
|
35
|
-
/**
|
|
36
|
-
* Include the copy and delete actions in the form
|
|
37
|
-
*/
|
|
38
|
-
showDefaultActions?: boolean;
|
|
39
|
-
|
|
40
|
-
EntityFormActionsComponent?: React.FC<EntityFormActionsProps>;
|
|
41
|
-
|
|
42
|
-
navigateBack?: () => void;
|
|
43
|
-
|
|
44
|
-
Builder?: React.ComponentType<EntityCustomViewParams<M>>;
|
|
45
|
-
|
|
46
|
-
children?: React.ReactNode;
|
|
47
|
-
|
|
48
|
-
// --- Headless callbacks (replace internal admin hooks) ---
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Called on form submit with the values to save.
|
|
52
|
-
* The EntityFormBinding wrapper provides this automatically.
|
|
53
|
-
* When using EntityForm standalone, provide your own save logic.
|
|
54
|
-
*/
|
|
55
|
-
onSubmit?: (values: M, formex: FormexController<M>) => Promise<Entity<M> | void> | void;
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Called when form values change (deferred).
|
|
59
|
-
* The EntityFormBinding wrapper uses this for entity caching.
|
|
60
|
-
*/
|
|
61
|
-
onValuesChangeDeferred?: (values: M, controller: FormexController<M>) => void;
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Called when the form is reset.
|
|
65
|
-
*/
|
|
66
|
-
onReset?: () => void;
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Validate that a field value is unique.
|
|
70
|
-
* The EntityFormBinding wrapper provides this via the data layer.
|
|
71
|
-
*/
|
|
72
|
-
uniqueFieldValidator?: (params: { name: string; value: unknown }) => Promise<boolean>;
|
|
73
|
-
|
|
74
|
-
// --- Slots (replace useSlot) ---
|
|
75
|
-
|
|
76
|
-
/** Content rendered before the form fields */
|
|
77
|
-
beforeFields?: React.ReactNode;
|
|
78
|
-
/** Content rendered after the form fields */
|
|
79
|
-
afterFields?: React.ReactNode;
|
|
80
|
-
/** Plugin-provided action elements */
|
|
81
|
-
pluginActions?: React.ReactNode[];
|
|
82
|
-
|
|
83
|
-
// --- Local changes (managed externally in binding) ---
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Initial values for the form, after applying local changes.
|
|
87
|
-
* If not provided, computed from entity + collection defaults.
|
|
88
|
-
*/
|
|
89
|
-
computedInitialValues?: Partial<M>;
|
|
90
|
-
/**
|
|
91
|
-
* Whether there are unsaved local changes in the cache.
|
|
92
|
-
*/
|
|
93
|
-
hasLocalChanges?: boolean;
|
|
94
|
-
/**
|
|
95
|
-
* The local changes data for the manual-apply menu.
|
|
96
|
-
*/
|
|
97
|
-
localChangesData?: Partial<M>;
|
|
98
|
-
/**
|
|
99
|
-
* Whether manual-apply local changes mode is enabled.
|
|
100
|
-
*/
|
|
101
|
-
manualApplyLocalChanges?: boolean;
|
|
102
|
-
/**
|
|
103
|
-
* Cache key for the local changes menu.
|
|
104
|
-
*/
|
|
105
|
-
localChangesCacheKey?: string;
|
|
106
|
-
/**
|
|
107
|
-
* Callback when local changes are cleared.
|
|
108
|
-
*/
|
|
109
|
-
onClearLocalChanges?: () => void;
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
export type OnUpdateParams = {
|
|
113
|
-
entity: Entity<Record<string, unknown>>,
|
|
114
|
-
status: EntityStatus,
|
|
115
|
-
path: string,
|
|
116
|
-
entityId?: string | number;
|
|
117
|
-
selectedTab?: string;
|
|
118
|
-
collection: AdminCollection<Record<string, unknown>>
|
|
119
|
-
};
|