@rebasepro/studio 0.0.1-canary.09e5ec5
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/LICENSE +114 -0
- package/README.md +159 -0
- package/dist/ApiExplorer-gMJt5JrS.js +1053 -0
- package/dist/ApiExplorer-gMJt5JrS.js.map +1 -0
- package/dist/AuthSimulationSelector-BF4rkRGp.js +118 -0
- package/dist/AuthSimulationSelector-BF4rkRGp.js.map +1 -0
- package/dist/BranchesView-DcHZtvXo.js +292 -0
- package/dist/BranchesView-DcHZtvXo.js.map +1 -0
- package/dist/CronJobsView-CijCToeK.js +456 -0
- package/dist/CronJobsView-CijCToeK.js.map +1 -0
- package/dist/JSEditor-D8nVp3Lp.js +1308 -0
- package/dist/JSEditor-D8nVp3Lp.js.map +1 -0
- package/dist/MonacoEditor-CMYEjiRf.js +161 -0
- package/dist/MonacoEditor-CMYEjiRf.js.map +1 -0
- package/dist/RLSEditor-DBH09u9v.js +1831 -0
- package/dist/RLSEditor-DBH09u9v.js.map +1 -0
- package/dist/SQLEditor-CkVx9vgr.js +1792 -0
- package/dist/SQLEditor-CkVx9vgr.js.map +1 -0
- package/dist/SchemaVisualizer-BgD5Zb77.js +1069 -0
- package/dist/SchemaVisualizer-BgD5Zb77.js.map +1 -0
- package/dist/StorageView-CTqGFhY9.js +907 -0
- package/dist/StorageView-CTqGFhY9.js.map +1 -0
- package/dist/common/src/collections/CollectionRegistry.d.ts +56 -0
- package/dist/common/src/collections/index.d.ts +1 -0
- package/dist/common/src/data/buildRebaseData.d.ts +14 -0
- package/dist/common/src/index.d.ts +3 -0
- package/dist/common/src/util/builders.d.ts +57 -0
- package/dist/common/src/util/callbacks.d.ts +6 -0
- package/dist/common/src/util/collections.d.ts +11 -0
- package/dist/common/src/util/common.d.ts +2 -0
- package/dist/common/src/util/conditions.d.ts +26 -0
- package/dist/common/src/util/entities.d.ts +58 -0
- package/dist/common/src/util/enums.d.ts +3 -0
- package/dist/common/src/util/index.d.ts +16 -0
- package/dist/common/src/util/navigation_from_path.d.ts +34 -0
- package/dist/common/src/util/navigation_utils.d.ts +20 -0
- package/dist/common/src/util/parent_references_from_path.d.ts +6 -0
- package/dist/common/src/util/paths.d.ts +14 -0
- package/dist/common/src/util/permissions.d.ts +5 -0
- package/dist/common/src/util/references.d.ts +2 -0
- package/dist/common/src/util/relations.d.ts +22 -0
- package/dist/common/src/util/resolutions.d.ts +72 -0
- package/dist/common/src/util/storage.d.ts +24 -0
- package/dist/core/src/components/AIIcon.d.ts +16 -0
- package/dist/core/src/components/ConfirmationDialog.d.ts +9 -0
- package/dist/core/src/components/Debug/UIReferenceView.d.ts +1 -0
- package/dist/core/src/components/Debug/UIStyleGuide.d.ts +1 -0
- package/dist/core/src/components/ErrorTooltip.d.ts +2 -0
- package/dist/core/src/components/ErrorView.d.ts +21 -0
- package/dist/core/src/components/LanguageToggle.d.ts +1 -0
- package/dist/core/src/components/LoginView/LoginView.d.ts +68 -0
- package/dist/core/src/components/LoginView/index.d.ts +2 -0
- package/dist/core/src/components/NotFoundPage.d.ts +1 -0
- package/dist/core/src/components/RebaseAuth.d.ts +10 -0
- package/dist/core/src/components/RebaseLogo.d.ts +7 -0
- package/dist/core/src/components/UnsavedChangesDialog.d.ts +9 -0
- package/dist/core/src/components/UserDisplay.d.ts +7 -0
- package/dist/core/src/components/UserSelectPopover.d.ts +62 -0
- package/dist/core/src/components/UserSettingsView.d.ts +1 -0
- package/dist/core/src/components/common/index.d.ts +6 -0
- package/dist/core/src/components/common/table_height.d.ts +5 -0
- package/dist/core/src/components/common/types.d.ts +63 -0
- package/dist/core/src/components/common/useColumnsIds.d.ts +9 -0
- package/dist/core/src/components/common/useDataTableController.d.ts +45 -0
- package/dist/core/src/components/common/useDebouncedData.d.ts +9 -0
- package/dist/core/src/components/common/useScrollRestoration.d.ts +14 -0
- package/dist/core/src/components/index.d.ts +16 -0
- package/dist/core/src/contexts/AdminModeController.d.ts +4 -0
- package/dist/core/src/contexts/AnalyticsContext.d.ts +3 -0
- package/dist/core/src/contexts/AuthControllerContext.d.ts +3 -0
- package/dist/core/src/contexts/CustomizationControllerContext.d.ts +3 -0
- package/dist/core/src/contexts/DataDriverContext.d.ts +3 -0
- package/dist/core/src/contexts/DatabaseAdminContext.d.ts +3 -0
- package/dist/core/src/contexts/DialogsProvider.d.ts +4 -0
- package/dist/core/src/contexts/EffectiveRoleController.d.ts +4 -0
- package/dist/core/src/contexts/InternalUserManagementContext.d.ts +3 -0
- package/dist/core/src/contexts/ModeController.d.ts +4 -0
- package/dist/core/src/contexts/RebaseClientInstanceContext.d.ts +6 -0
- package/dist/core/src/contexts/RebaseDataContext.d.ts +3 -0
- package/dist/core/src/contexts/SnackbarProvider.d.ts +2 -0
- package/dist/core/src/contexts/StorageSourceContext.d.ts +3 -0
- package/dist/core/src/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
- package/dist/core/src/contexts/index.d.ts +13 -0
- package/dist/core/src/core/PluginLifecycleManager.d.ts +17 -0
- package/dist/core/src/core/PluginProviderStack.d.ts +21 -0
- package/dist/core/src/core/Rebase.d.ts +14 -0
- package/dist/core/src/core/RebaseProps.d.ts +136 -0
- package/dist/core/src/core/RebaseRouter.d.ts +4 -0
- package/dist/core/src/core/RebaseRoutes.d.ts +17 -0
- package/dist/core/src/core/index.d.ts +4 -0
- package/dist/core/src/hooks/ApiConfigContext.d.ts +24 -0
- package/dist/core/src/hooks/data/delete.d.ts +31 -0
- package/dist/core/src/hooks/data/save.d.ts +34 -0
- package/dist/core/src/hooks/data/useCollectionFetch.d.ts +51 -0
- package/dist/core/src/hooks/data/useData.d.ts +13 -0
- package/dist/core/src/hooks/data/useDataOrder.d.ts +12 -0
- package/dist/core/src/hooks/data/useEntityFetch.d.ts +38 -0
- package/dist/core/src/hooks/data/useRelationSelector.d.ts +52 -0
- package/dist/core/src/hooks/data/useUserSelector.d.ts +31 -0
- package/dist/core/src/hooks/index.d.ts +37 -0
- package/dist/core/src/hooks/useAdminModeController.d.ts +19 -0
- package/dist/core/src/hooks/useAnalyticsController.d.ts +5 -0
- package/dist/core/src/hooks/useAuthController.d.ts +11 -0
- package/dist/core/src/hooks/useAuthSubscription.d.ts +2 -0
- package/dist/core/src/hooks/useBackendStorageSource.d.ts +30 -0
- package/dist/core/src/hooks/useBridgeRegistration.d.ts +18 -0
- package/dist/core/src/hooks/useBrowserTitleAndIcon.d.ts +6 -0
- package/dist/core/src/hooks/useBuildAdminModeController.d.ts +6 -0
- package/dist/core/src/hooks/useBuildEffectiveRoleController.d.ts +8 -0
- package/dist/core/src/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
- package/dist/core/src/hooks/useBuildModeController.d.ts +6 -0
- package/dist/core/src/hooks/useClipboard.d.ts +57 -0
- package/dist/core/src/hooks/useCollapsedGroups.d.ts +12 -0
- package/dist/core/src/hooks/useCustomizationController.d.ts +11 -0
- package/dist/core/src/hooks/useDialogsController.d.ts +11 -0
- package/dist/core/src/hooks/useEffectiveRoleController.d.ts +7 -0
- package/dist/core/src/hooks/useInternalUserManagementController.d.ts +12 -0
- package/dist/core/src/hooks/useLargeLayout.d.ts +1 -0
- package/dist/core/src/hooks/useModeController.d.ts +19 -0
- package/dist/core/src/hooks/usePermissions.d.ts +12 -0
- package/dist/core/src/hooks/useRebaseClient.d.ts +5 -0
- package/dist/core/src/hooks/useRebaseContext.d.ts +11 -0
- package/dist/core/src/hooks/useRebaseRegistry.d.ts +34 -0
- package/dist/core/src/hooks/useSlot.d.ts +18 -0
- package/dist/core/src/hooks/useSnackbarController.d.ts +20 -0
- package/dist/core/src/hooks/useStorageSource.d.ts +7 -0
- package/dist/core/src/hooks/useStudioBridge.d.ts +91 -0
- package/dist/core/src/hooks/useTranslation.d.ts +17 -0
- package/dist/core/src/hooks/useUnsavedChangesDialog.d.ts +12 -0
- package/dist/core/src/hooks/useUserConfigurationPersistence.d.ts +8 -0
- package/dist/core/src/hooks/useValidateAuthenticator.d.ts +21 -0
- package/dist/core/src/i18n/RebaseI18nProvider.d.ts +33 -0
- package/dist/core/src/index.d.ts +15 -0
- package/dist/core/src/internal/common.d.ts +3 -0
- package/dist/core/src/internal/useRestoreScroll.d.ts +6 -0
- package/dist/core/src/locales/de.d.ts +2 -0
- package/dist/core/src/locales/en.d.ts +10 -0
- package/dist/core/src/locales/es.d.ts +10 -0
- package/dist/core/src/locales/fr.d.ts +2 -0
- package/dist/core/src/locales/hi.d.ts +2 -0
- package/dist/core/src/locales/it.d.ts +2 -0
- package/dist/core/src/locales/pt.d.ts +7 -0
- package/dist/core/src/util/constants.d.ts +1 -0
- package/dist/core/src/util/createFormexStub.d.ts +2 -0
- package/dist/core/src/util/entity_cache.d.ts +27 -0
- package/dist/core/src/util/enums.d.ts +5 -0
- package/dist/core/src/util/icon_list.d.ts +5 -0
- package/dist/core/src/util/icon_synonyms.d.ts +1 -0
- package/dist/core/src/util/icons.d.ts +20 -0
- package/dist/core/src/util/index.d.ts +10 -0
- package/dist/core/src/util/previews.d.ts +4 -0
- package/dist/core/src/util/useStorageUploadController.d.ts +38 -0
- package/dist/core/src/util/useTraceUpdate.d.ts +2 -0
- package/dist/formex/src/Field.d.ts +52 -0
- package/dist/formex/src/Formex.d.ts +7 -0
- package/dist/formex/src/index.d.ts +5 -0
- package/dist/formex/src/types.d.ts +40 -0
- package/dist/formex/src/useCreateFormex.d.ts +14 -0
- package/dist/formex/src/utils.d.ts +16 -0
- package/dist/index.es.js +726 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +9647 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/studio/src/components/ApiExplorer/ApiExplorer.d.ts +9 -0
- package/dist/studio/src/components/ApiExplorer/EndpointDetail.d.ts +9 -0
- package/dist/studio/src/components/ApiExplorer/TryItPanel.d.ts +15 -0
- package/dist/studio/src/components/ApiExplorer/parseSpec.d.ts +16 -0
- package/dist/studio/src/components/ApiExplorer/types.d.ts +90 -0
- package/dist/studio/src/components/AuthSimulationSelector.d.ts +11 -0
- package/dist/studio/src/components/Branches/BranchesView.d.ts +1 -0
- package/dist/studio/src/components/CronJobs/CronJobsView.d.ts +1 -0
- package/dist/studio/src/components/JSEditor/JSEditor.d.ts +1 -0
- package/dist/studio/src/components/JSEditor/JSEditorSidebar.d.ts +21 -0
- package/dist/studio/src/components/JSEditor/JSMonacoEditor.d.ts +18 -0
- package/dist/studio/src/components/RLSEditor/PolicyEditor.d.ts +9 -0
- package/dist/studio/src/components/RLSEditor/RLSEditor.d.ts +19 -0
- package/dist/studio/src/components/RLSEditor/index.d.ts +1 -0
- package/dist/studio/src/components/RebaseStudio.d.ts +2 -0
- package/dist/studio/src/components/SQLEditor/ExplainVisualizer.d.ts +24 -0
- package/dist/studio/src/components/SQLEditor/MonacoEditor.d.ts +17 -0
- package/dist/studio/src/components/SQLEditor/SQLEditor.d.ts +11 -0
- package/dist/studio/src/components/SQLEditor/SQLEditorSidebar.d.ts +21 -0
- package/dist/studio/src/components/SQLEditor/SchemaBrowser.d.ts +8 -0
- package/dist/studio/src/components/SchemaVisualizer/RelationEdge.d.ts +3 -0
- package/dist/studio/src/components/SchemaVisualizer/SchemaVisualizer.d.ts +2 -0
- package/dist/studio/src/components/SchemaVisualizer/TableNode.d.ts +3 -0
- package/dist/studio/src/components/SchemaVisualizer/index.d.ts +5 -0
- package/dist/studio/src/components/SchemaVisualizer/schema-visualizer.utils.d.ts +42 -0
- package/dist/studio/src/components/SchemaVisualizer/useSchemaGraph.d.ts +37 -0
- package/dist/studio/src/components/StorageView/StorageView.d.ts +1 -0
- package/dist/studio/src/components/StudioHomePage.d.ts +9 -0
- package/dist/studio/src/index.d.ts +4 -0
- package/dist/studio/src/utils/entities.d.ts +0 -0
- package/dist/studio/src/utils/pgColumnToProperty.d.ts +6 -0
- package/dist/studio/src/utils/sql_utils.d.ts +52 -0
- package/dist/types/src/controllers/analytics_controller.d.ts +7 -0
- package/dist/types/src/controllers/auth.d.ts +119 -0
- package/dist/types/src/controllers/client.d.ts +170 -0
- package/dist/types/src/controllers/collection_registry.d.ts +45 -0
- package/dist/types/src/controllers/customization_controller.d.ts +60 -0
- package/dist/types/src/controllers/data.d.ts +168 -0
- package/dist/types/src/controllers/data_driver.d.ts +160 -0
- package/dist/types/src/controllers/database_admin.d.ts +11 -0
- package/dist/types/src/controllers/dialogs_controller.d.ts +36 -0
- package/dist/types/src/controllers/effective_role.d.ts +4 -0
- package/dist/types/src/controllers/email.d.ts +34 -0
- package/dist/types/src/controllers/index.d.ts +18 -0
- package/dist/types/src/controllers/local_config_persistence.d.ts +20 -0
- package/dist/types/src/controllers/navigation.d.ts +213 -0
- package/dist/types/src/controllers/registry.d.ts +54 -0
- package/dist/types/src/controllers/side_dialogs_controller.d.ts +67 -0
- package/dist/types/src/controllers/side_entity_controller.d.ts +90 -0
- package/dist/types/src/controllers/snackbar.d.ts +24 -0
- package/dist/types/src/controllers/storage.d.ts +171 -0
- package/dist/types/src/index.d.ts +4 -0
- package/dist/types/src/rebase_context.d.ts +105 -0
- package/dist/types/src/types/backend.d.ts +536 -0
- package/dist/types/src/types/builders.d.ts +15 -0
- package/dist/types/src/types/chips.d.ts +5 -0
- package/dist/types/src/types/collections.d.ts +856 -0
- package/dist/types/src/types/cron.d.ts +102 -0
- package/dist/types/src/types/data_source.d.ts +64 -0
- package/dist/types/src/types/entities.d.ts +145 -0
- package/dist/types/src/types/entity_actions.d.ts +98 -0
- package/dist/types/src/types/entity_callbacks.d.ts +173 -0
- package/dist/types/src/types/entity_link_builder.d.ts +7 -0
- package/dist/types/src/types/entity_overrides.d.ts +10 -0
- package/dist/types/src/types/entity_views.d.ts +61 -0
- package/dist/types/src/types/export_import.d.ts +21 -0
- package/dist/types/src/types/index.d.ts +23 -0
- package/dist/types/src/types/locales.d.ts +4 -0
- package/dist/types/src/types/modify_collections.d.ts +5 -0
- package/dist/types/src/types/plugins.d.ts +279 -0
- package/dist/types/src/types/properties.d.ts +1176 -0
- package/dist/types/src/types/property_config.d.ts +70 -0
- package/dist/types/src/types/relations.d.ts +336 -0
- package/dist/types/src/types/slots.d.ts +252 -0
- package/dist/types/src/types/translations.d.ts +870 -0
- package/dist/types/src/types/user_management_delegate.d.ts +121 -0
- package/dist/types/src/types/websockets.d.ts +78 -0
- package/dist/types/src/users/index.d.ts +2 -0
- package/dist/types/src/users/roles.d.ts +22 -0
- package/dist/types/src/users/user.d.ts +46 -0
- package/dist/ui/src/components/Alert.d.ts +12 -0
- package/dist/ui/src/components/Autocomplete.d.ts +21 -0
- package/dist/ui/src/components/Avatar.d.ts +11 -0
- package/dist/ui/src/components/Badge.d.ts +8 -0
- package/dist/ui/src/components/BooleanSwitch.d.ts +14 -0
- package/dist/ui/src/components/BooleanSwitchWithLabel.d.ts +17 -0
- package/dist/ui/src/components/Button.d.ts +14 -0
- package/dist/ui/src/components/Card.d.ts +9 -0
- package/dist/ui/src/components/CenteredView.d.ts +9 -0
- package/dist/ui/src/components/Checkbox.d.ts +13 -0
- package/dist/ui/src/components/Chip.d.ts +26 -0
- package/dist/ui/src/components/CircularProgress.d.ts +5 -0
- package/dist/ui/src/components/CircularProgressCenter.d.ts +11 -0
- package/dist/ui/src/components/Collapse.d.ts +9 -0
- package/dist/ui/src/components/ColorPicker.d.ts +30 -0
- package/dist/ui/src/components/Container.d.ts +8 -0
- package/dist/ui/src/components/DateTimeField.d.ts +24 -0
- package/dist/ui/src/components/DebouncedTextField.d.ts +2 -0
- package/dist/ui/src/components/Dialog.d.ts +39 -0
- package/dist/ui/src/components/DialogActions.d.ts +7 -0
- package/dist/ui/src/components/DialogContent.d.ts +7 -0
- package/dist/ui/src/components/DialogTitle.d.ts +10 -0
- package/dist/ui/src/components/ErrorBoundary.d.ts +11 -0
- package/dist/ui/src/components/ExpandablePanel.d.ts +12 -0
- package/dist/ui/src/components/FileUpload.d.ts +23 -0
- package/dist/ui/src/components/IconButton.d.ts +12 -0
- package/dist/ui/src/components/InfoLabel.d.ts +5 -0
- package/dist/ui/src/components/InputLabel.d.ts +11 -0
- package/dist/ui/src/components/Label.d.ts +7 -0
- package/dist/ui/src/components/LoadingButton.d.ts +7 -0
- package/dist/ui/src/components/Markdown.d.ts +10 -0
- package/dist/ui/src/components/Menu.d.ts +23 -0
- package/dist/ui/src/components/Menubar.d.ts +80 -0
- package/dist/ui/src/components/MultiSelect.d.ts +48 -0
- package/dist/ui/src/components/Paper.d.ts +6 -0
- package/dist/ui/src/components/Popover.d.ts +24 -0
- package/dist/ui/src/components/RadioGroup.d.ts +28 -0
- package/dist/ui/src/components/ResizablePanels.d.ts +18 -0
- package/dist/ui/src/components/SearchBar.d.ts +22 -0
- package/dist/ui/src/components/Select.d.ts +43 -0
- package/dist/ui/src/components/Separator.d.ts +5 -0
- package/dist/ui/src/components/Sheet.d.ts +22 -0
- package/dist/ui/src/components/Skeleton.d.ts +6 -0
- package/dist/ui/src/components/Slider.d.ts +21 -0
- package/dist/ui/src/components/Table.d.ts +34 -0
- package/dist/ui/src/components/Tabs.d.ts +19 -0
- package/dist/ui/src/components/TextField.d.ts +58 -0
- package/dist/ui/src/components/TextareaAutosize.d.ts +43 -0
- package/dist/ui/src/components/ToggleButtonGroup.d.ts +30 -0
- package/dist/ui/src/components/Tooltip.d.ts +19 -0
- package/dist/ui/src/components/Typography.d.ts +36 -0
- package/dist/ui/src/components/VirtualTable/VirtualTable.d.ts +11 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableCell.d.ts +21 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableHeader.d.ts +29 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableHeaderRow.d.ts +2 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableProps.d.ts +243 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableRow.d.ts +3 -0
- package/dist/ui/src/components/VirtualTable/index.d.ts +3 -0
- package/dist/ui/src/components/VirtualTable/types.d.ts +38 -0
- package/dist/ui/src/components/common/SelectInputLabel.d.ts +5 -0
- package/dist/ui/src/components/index.d.ts +53 -0
- package/dist/ui/src/hooks/PortalContainerContext.d.ts +31 -0
- package/dist/ui/src/hooks/index.d.ts +6 -0
- package/dist/ui/src/hooks/useDebounceCallback.d.ts +1 -0
- package/dist/ui/src/hooks/useDebounceValue.d.ts +1 -0
- package/dist/ui/src/hooks/useDebouncedCallback.d.ts +1 -0
- package/dist/ui/src/hooks/useInjectStyles.d.ts +7 -0
- package/dist/ui/src/hooks/useOutsideAlerter.d.ts +5 -0
- package/dist/ui/src/icons/GitHubIcon.d.ts +2 -0
- package/dist/ui/src/icons/HandleIcon.d.ts +1 -0
- package/dist/ui/src/icons/Icon.d.ts +20 -0
- package/dist/ui/src/icons/cool_icon_keys.d.ts +1 -0
- package/dist/ui/src/icons/icon_keys.d.ts +1 -0
- package/dist/ui/src/icons/index.d.ts +6 -0
- package/dist/ui/src/index.d.ts +5 -0
- package/dist/ui/src/styles.d.ts +12 -0
- package/dist/ui/src/util/chip_colors.d.ts +4 -0
- package/dist/ui/src/util/cls.d.ts +2 -0
- package/dist/ui/src/util/debounce.d.ts +10 -0
- package/dist/ui/src/util/hash.d.ts +1 -0
- package/dist/ui/src/util/index.d.ts +4 -0
- package/dist/ui/src/util/key_to_icon_component.d.ts +1 -0
- package/package.json +84 -0
- package/src/components/ApiExplorer/ApiExplorer.tsx +290 -0
- package/src/components/ApiExplorer/EndpointDetail.tsx +271 -0
- package/src/components/ApiExplorer/TryItPanel.tsx +510 -0
- package/src/components/ApiExplorer/parseSpec.ts +104 -0
- package/src/components/ApiExplorer/types.ts +84 -0
- package/src/components/AuthSimulationSelector.tsx +77 -0
- package/src/components/Branches/BranchesView.tsx +370 -0
- package/src/components/CronJobs/CronJobsView.tsx +346 -0
- package/src/components/JSEditor/JSEditor.tsx +1033 -0
- package/src/components/JSEditor/JSEditorSidebar.tsx +340 -0
- package/src/components/JSEditor/JSMonacoEditor.tsx +390 -0
- package/src/components/RLSEditor/PolicyEditor.tsx +444 -0
- package/src/components/RLSEditor/RLSEditor.tsx +692 -0
- package/src/components/RLSEditor/index.ts +1 -0
- package/src/components/RebaseStudio.tsx +121 -0
- package/src/components/SQLEditor/ExplainVisualizer.tsx +128 -0
- package/src/components/SQLEditor/MonacoEditor.tsx +203 -0
- package/src/components/SQLEditor/SQLEditor.tsx +1419 -0
- package/src/components/SQLEditor/SQLEditorSidebar.tsx +174 -0
- package/src/components/SQLEditor/SchemaBrowser.tsx +158 -0
- package/src/components/SchemaVisualizer/RelationEdge.tsx +102 -0
- package/src/components/SchemaVisualizer/SchemaVisualizer.tsx +665 -0
- package/src/components/SchemaVisualizer/TableNode.tsx +257 -0
- package/src/components/SchemaVisualizer/index.ts +5 -0
- package/src/components/SchemaVisualizer/schema-visualizer.utils.ts +140 -0
- package/src/components/SchemaVisualizer/useSchemaGraph.ts +397 -0
- package/src/components/StorageView/StorageView.tsx +1035 -0
- package/src/components/StudioHomePage.tsx +357 -0
- package/src/index.ts +31 -0
- package/src/utils/entities.ts +2 -0
- package/src/utils/pgColumnToProperty.test.ts +401 -0
- package/src/utils/pgColumnToProperty.ts +275 -0
- package/src/utils/sql_utils.test.ts +265 -0
- package/src/utils/sql_utils.ts +291 -0
- package/src/vite-env.d.ts +1 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Typography, cls, iconSize } from "@rebasepro/ui";
|
|
3
|
+
import { KeyRoundIcon } from "lucide-react";
|
|
4
|
+
import { UserSelectPopover, SelectableUser } from "@rebasepro/core";
|
|
5
|
+
|
|
6
|
+
export interface AuthSimulationSelectorProps {
|
|
7
|
+
authMode: "jwt" | "none";
|
|
8
|
+
setAuthMode: (mode: "jwt" | "none") => void;
|
|
9
|
+
selectedUser: SelectableUser | null;
|
|
10
|
+
setSelectedUser: (user: SelectableUser | null) => void;
|
|
11
|
+
users: SelectableUser[];
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
currentUser: SelectableUser | null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function AuthSimulationSelector({
|
|
17
|
+
authMode,
|
|
18
|
+
setAuthMode,
|
|
19
|
+
selectedUser,
|
|
20
|
+
setSelectedUser,
|
|
21
|
+
users,
|
|
22
|
+
loading,
|
|
23
|
+
currentUser
|
|
24
|
+
}: AuthSimulationSelectorProps) {
|
|
25
|
+
return (
|
|
26
|
+
<div className="flex flex-wrap items-center gap-3">
|
|
27
|
+
<KeyRoundIcon size={iconSize.small} className="text-text-secondary dark:text-text-secondary-dark" />
|
|
28
|
+
<Typography
|
|
29
|
+
variant="caption"
|
|
30
|
+
className="text-text-secondary dark:text-text-secondary-dark text-xs font-medium"
|
|
31
|
+
>
|
|
32
|
+
Auth:
|
|
33
|
+
</Typography>
|
|
34
|
+
<button
|
|
35
|
+
onClick={() => setAuthMode("jwt")}
|
|
36
|
+
className={cls(
|
|
37
|
+
"px-3 py-1 text-xs rounded-full border transition-all",
|
|
38
|
+
authMode === "jwt"
|
|
39
|
+
? "bg-primary/15 text-primary dark:text-primary-dark border-primary/30 font-medium"
|
|
40
|
+
: "border-surface-300 dark:border-surface-600 text-text-secondary dark:text-text-secondary-dark hover:border-primary/30"
|
|
41
|
+
)}
|
|
42
|
+
>
|
|
43
|
+
JWT Token
|
|
44
|
+
</button>
|
|
45
|
+
<button
|
|
46
|
+
onClick={() => setAuthMode("none")}
|
|
47
|
+
className={cls(
|
|
48
|
+
"px-3 py-1 text-xs rounded-full border transition-all",
|
|
49
|
+
authMode === "none"
|
|
50
|
+
? "bg-red-500/15 text-red-600 dark:text-red-400 border-red-500/30 font-medium"
|
|
51
|
+
: "border-surface-300 dark:border-surface-600 text-text-secondary dark:text-text-secondary-dark hover:border-red-500/30"
|
|
52
|
+
)}
|
|
53
|
+
>
|
|
54
|
+
No Auth
|
|
55
|
+
</button>
|
|
56
|
+
|
|
57
|
+
{authMode === "jwt" && (
|
|
58
|
+
<>
|
|
59
|
+
<div className="w-px h-4 bg-surface-300 dark:bg-surface-600 mx-1" />
|
|
60
|
+
<Typography
|
|
61
|
+
variant="caption"
|
|
62
|
+
className="text-text-secondary dark:text-text-secondary-dark text-xs font-medium"
|
|
63
|
+
>
|
|
64
|
+
Run as:
|
|
65
|
+
</Typography>
|
|
66
|
+
<UserSelectPopover
|
|
67
|
+
selectedUser={selectedUser}
|
|
68
|
+
onUserSelected={setSelectedUser}
|
|
69
|
+
users={users}
|
|
70
|
+
loading={loading}
|
|
71
|
+
currentUser={currentUser}
|
|
72
|
+
/>
|
|
73
|
+
</>
|
|
74
|
+
)}
|
|
75
|
+
</div>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
|
|
2
|
+
import React, { useState, useEffect, useRef, useCallback } from "react";
|
|
3
|
+
import { Typography, cls, defaultBorderMixin, Button, Chip, CircularProgress, IconButton, Paper, Dialog, DialogTitle, DialogContent, DialogActions, TextField, Select, SelectItem, Alert , iconSize } from "@rebasepro/ui";
|
|
4
|
+
import { GitBranchIcon, Trash2Icon, RefreshCwIcon, PlusIcon, CopyIcon } from "lucide-react";
|
|
5
|
+
import { useRebaseContext, useSnackbarController, ConfirmationDialog } from "@rebasepro/core";
|
|
6
|
+
import { isBranchAdmin } from "@rebasepro/types";
|
|
7
|
+
import type { BranchInfo } from "@rebasepro/types";
|
|
8
|
+
|
|
9
|
+
function formatSize(bytes: number | undefined): string {
|
|
10
|
+
if (bytes === undefined || bytes === null) return "—";
|
|
11
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
12
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
13
|
+
if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
14
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function formatRelative(date: Date | string | undefined): string {
|
|
18
|
+
if (!date) return "—";
|
|
19
|
+
const d = date instanceof Date ? date : new Date(date);
|
|
20
|
+
if (isNaN(d.getTime())) return "—";
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
const diff = now - d.getTime();
|
|
23
|
+
if (diff < 60_000) return "just now";
|
|
24
|
+
if (diff < 3_600_000) { const m = Math.round(diff / 60_000); return `${m}m ago`; }
|
|
25
|
+
if (diff < 86_400_000) { const h = Math.round(diff / 3_600_000); return `${h}h ago`; }
|
|
26
|
+
if (diff < 604_800_000) { const d2 = Math.round(diff / 86_400_000); return `${d2}d ago`; }
|
|
27
|
+
return d.toLocaleDateString();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function BranchesView() {
|
|
31
|
+
const { databaseAdmin } = useRebaseContext();
|
|
32
|
+
const snackbar = useSnackbarController();
|
|
33
|
+
|
|
34
|
+
const [branches, setBranches] = useState<BranchInfo[]>([]);
|
|
35
|
+
const [loading, setLoading] = useState(true);
|
|
36
|
+
const [selectedBranch, setSelectedBranch] = useState<string | null>(null);
|
|
37
|
+
|
|
38
|
+
// Create dialog
|
|
39
|
+
const [createOpen, setCreateOpen] = useState(false);
|
|
40
|
+
const [newBranchName, setNewBranchName] = useState("");
|
|
41
|
+
const [sourceBranch, setSourceBranch] = useState<string | undefined>(undefined);
|
|
42
|
+
const [creating, setCreating] = useState(false);
|
|
43
|
+
|
|
44
|
+
// Delete confirm
|
|
45
|
+
const [deleteTarget, setDeleteTarget] = useState<string | null>(null);
|
|
46
|
+
const [deleting, setDeleting] = useState(false);
|
|
47
|
+
|
|
48
|
+
// Refs
|
|
49
|
+
const snackbarRef = useRef(snackbar);
|
|
50
|
+
snackbarRef.current = snackbar;
|
|
51
|
+
|
|
52
|
+
const branchAdmin = isBranchAdmin(databaseAdmin) ? databaseAdmin : undefined;
|
|
53
|
+
|
|
54
|
+
const loadBranches = useCallback(async () => {
|
|
55
|
+
if (!branchAdmin) {
|
|
56
|
+
setLoading(false);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const result = await branchAdmin.listBranches();
|
|
61
|
+
setBranches(result);
|
|
62
|
+
} catch (e: unknown) {
|
|
63
|
+
snackbarRef.current.open({
|
|
64
|
+
type: "error",
|
|
65
|
+
message: e instanceof Error ? e.message : String(e)
|
|
66
|
+
});
|
|
67
|
+
} finally {
|
|
68
|
+
setLoading(false);
|
|
69
|
+
}
|
|
70
|
+
}, [branchAdmin]);
|
|
71
|
+
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
loadBranches();
|
|
74
|
+
}, [loadBranches]);
|
|
75
|
+
|
|
76
|
+
const handleCreate = async () => {
|
|
77
|
+
if (!branchAdmin || !newBranchName.trim()) return;
|
|
78
|
+
setCreating(true);
|
|
79
|
+
try {
|
|
80
|
+
await branchAdmin.createBranch(newBranchName.trim(), sourceBranch ? { source: sourceBranch } : undefined);
|
|
81
|
+
snackbarRef.current.open({
|
|
82
|
+
type: "success",
|
|
83
|
+
message: `Branch "${newBranchName.trim()}" created successfully`
|
|
84
|
+
});
|
|
85
|
+
setCreateOpen(false);
|
|
86
|
+
setNewBranchName("");
|
|
87
|
+
setSourceBranch(undefined);
|
|
88
|
+
await loadBranches();
|
|
89
|
+
} catch (e: unknown) {
|
|
90
|
+
snackbarRef.current.open({
|
|
91
|
+
type: "error",
|
|
92
|
+
message: e instanceof Error ? e.message : String(e)
|
|
93
|
+
});
|
|
94
|
+
} finally {
|
|
95
|
+
setCreating(false);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const handleDelete = async () => {
|
|
100
|
+
if (!branchAdmin || !deleteTarget) return;
|
|
101
|
+
setDeleting(true);
|
|
102
|
+
try {
|
|
103
|
+
await branchAdmin.deleteBranch(deleteTarget);
|
|
104
|
+
snackbarRef.current.open({
|
|
105
|
+
type: "success",
|
|
106
|
+
message: `Branch "${deleteTarget}" deleted`
|
|
107
|
+
});
|
|
108
|
+
if (selectedBranch === deleteTarget) setSelectedBranch(null);
|
|
109
|
+
setDeleteTarget(null);
|
|
110
|
+
await loadBranches();
|
|
111
|
+
} catch (e: unknown) {
|
|
112
|
+
snackbarRef.current.open({
|
|
113
|
+
type: "error",
|
|
114
|
+
message: e instanceof Error ? e.message : String(e)
|
|
115
|
+
});
|
|
116
|
+
} finally {
|
|
117
|
+
setDeleting(false);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
// Not supported
|
|
122
|
+
if (!branchAdmin) {
|
|
123
|
+
return (
|
|
124
|
+
<div className="flex flex-col items-center justify-center h-full gap-4 text-center p-8">
|
|
125
|
+
<GitBranchIcon size={iconSize.large} className="text-surface-300 dark:text-surface-600"/>
|
|
126
|
+
<Typography variant="h6" color="secondary">Database Branching Not Available</Typography>
|
|
127
|
+
<Typography variant="body2" color="disabled" className="max-w-md">
|
|
128
|
+
Branching requires a PostgreSQL backend with an admin connection configured.
|
|
129
|
+
Set <code className="text-xs bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded font-mono">adminConnectionString</code> in your server configuration.
|
|
130
|
+
</Typography>
|
|
131
|
+
</div>
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (loading) {
|
|
136
|
+
return (
|
|
137
|
+
<div className="flex items-center justify-center h-full">
|
|
138
|
+
<CircularProgress/>
|
|
139
|
+
</div>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const selected = branches.find(b => b.name === selectedBranch);
|
|
144
|
+
|
|
145
|
+
return (
|
|
146
|
+
<div className="flex h-full w-full overflow-hidden bg-white dark:bg-surface-950">
|
|
147
|
+
{/* ── Branch List ── */}
|
|
148
|
+
<div className={cls("flex flex-col w-[340px] min-w-[280px] border-r h-full", defaultBorderMixin)}>
|
|
149
|
+
<div className={cls("flex items-center justify-between px-4 py-2.5 border-b bg-surface-50 dark:bg-surface-900 min-h-[48px]", defaultBorderMixin)}>
|
|
150
|
+
<div className="flex items-center gap-2">
|
|
151
|
+
<GitBranchIcon size={iconSize.small} className="text-primary"/>
|
|
152
|
+
<Typography variant="subtitle2" className="font-semibold">Branches</Typography>
|
|
153
|
+
<Chip size="smallest" className="bg-surface-200 dark:bg-surface-700 text-surface-600 dark:text-surface-300">{branches.length}</Chip>
|
|
154
|
+
</div>
|
|
155
|
+
<div className="flex items-center gap-1">
|
|
156
|
+
<IconButton size="small" onClick={loadBranches} title="Refresh">
|
|
157
|
+
<RefreshCwIcon size={iconSize.smallest}/>
|
|
158
|
+
</IconButton>
|
|
159
|
+
<IconButton size="small" onClick={() => setCreateOpen(true)} title="Create branch" className="text-primary">
|
|
160
|
+
<PlusIcon size={iconSize.smallest}/>
|
|
161
|
+
</IconButton>
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
<div className="flex-1 overflow-y-auto p-2 space-y-1">
|
|
165
|
+
{branches.length === 0 ? (
|
|
166
|
+
<div className="flex flex-col items-center justify-center h-full gap-3 text-center px-4">
|
|
167
|
+
<CopyIcon size={iconSize.small} className="text-surface-300 dark:text-surface-600"/>
|
|
168
|
+
<Typography variant="body2" color="disabled" className="text-[13px]">
|
|
169
|
+
No branches yet. Create one to start working with an isolated database copy.
|
|
170
|
+
</Typography>
|
|
171
|
+
<Button
|
|
172
|
+
size="small"
|
|
173
|
+
variant="outlined"
|
|
174
|
+
onClick={() => setCreateOpen(true)}
|
|
175
|
+
startIcon={<PlusIcon size={iconSize.smallest}/>}
|
|
176
|
+
>
|
|
177
|
+
Create Branch
|
|
178
|
+
</Button>
|
|
179
|
+
</div>
|
|
180
|
+
) : (
|
|
181
|
+
branches.map(branch => (
|
|
182
|
+
<div
|
|
183
|
+
key={branch.name}
|
|
184
|
+
onClick={() => setSelectedBranch(branch.name)}
|
|
185
|
+
className={cls(
|
|
186
|
+
"flex items-center gap-3 px-3 py-2.5 rounded-lg cursor-pointer transition-all",
|
|
187
|
+
selectedBranch === branch.name
|
|
188
|
+
? "bg-primary/10 dark:bg-primary/15 ring-1 ring-primary/30"
|
|
189
|
+
: "hover:bg-surface-100 dark:hover:bg-surface-950"
|
|
190
|
+
)}
|
|
191
|
+
>
|
|
192
|
+
<div className="w-2 h-2 rounded-full shrink-0 bg-emerald-500"/>
|
|
193
|
+
<div className="flex-1 min-w-0">
|
|
194
|
+
<Typography variant="body2" className="truncate font-medium text-[13px]">{branch.name}</Typography>
|
|
195
|
+
<Typography variant="caption" color="secondary" className="truncate text-[11px]">
|
|
196
|
+
from {branch.parentDatabase} · {formatRelative(branch.createdAt)}
|
|
197
|
+
</Typography>
|
|
198
|
+
</div>
|
|
199
|
+
{branch.sizeBytes !== undefined && (
|
|
200
|
+
<Typography variant="caption" color="disabled" className="font-mono text-[10px] shrink-0">
|
|
201
|
+
{formatSize(branch.sizeBytes)}
|
|
202
|
+
</Typography>
|
|
203
|
+
)}
|
|
204
|
+
</div>
|
|
205
|
+
))
|
|
206
|
+
)}
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
|
|
210
|
+
{/* ── Detail Panel ── */}
|
|
211
|
+
<div className="flex-1 flex flex-col min-w-0 h-full overflow-hidden">
|
|
212
|
+
{!selected ? (
|
|
213
|
+
<div className="flex flex-col items-center justify-center h-full gap-3">
|
|
214
|
+
<GitBranchIcon size={iconSize.large} className="text-surface-200 dark:text-surface-700"/>
|
|
215
|
+
<Typography variant="body2" color="disabled">
|
|
216
|
+
{branches.length === 0 ? "Create a branch to get started" : "Select a branch to view details"}
|
|
217
|
+
</Typography>
|
|
218
|
+
</div>
|
|
219
|
+
) : (
|
|
220
|
+
<>
|
|
221
|
+
{/* Header */}
|
|
222
|
+
<div className={cls("flex items-center justify-between px-5 py-3 border-b bg-white dark:bg-surface-950 min-h-[56px]", defaultBorderMixin)}>
|
|
223
|
+
<div className="flex items-center gap-3 min-w-0">
|
|
224
|
+
<div className="w-2.5 h-2.5 rounded-full bg-emerald-500"/>
|
|
225
|
+
<div className="min-w-0">
|
|
226
|
+
<Typography variant="subtitle1" className="font-semibold truncate">{selected.name}</Typography>
|
|
227
|
+
<Typography variant="caption" color="secondary" className="truncate">
|
|
228
|
+
Created from <span className="font-mono text-[11px]">{selected.parentDatabase}</span>
|
|
229
|
+
</Typography>
|
|
230
|
+
</div>
|
|
231
|
+
</div>
|
|
232
|
+
<div className="flex items-center gap-2 shrink-0">
|
|
233
|
+
<Button
|
|
234
|
+
size="small"
|
|
235
|
+
color="error"
|
|
236
|
+
variant="outlined"
|
|
237
|
+
onClick={() => setDeleteTarget(selected.name)}
|
|
238
|
+
startIcon={<Trash2Icon size={iconSize.smallest}/>}
|
|
239
|
+
>
|
|
240
|
+
Delete
|
|
241
|
+
</Button>
|
|
242
|
+
</div>
|
|
243
|
+
</div>
|
|
244
|
+
|
|
245
|
+
{/* Info Cards */}
|
|
246
|
+
<div className="px-5 py-4 bg-surface-50 dark:bg-surface-900/50">
|
|
247
|
+
<div className="grid grid-cols-2 md:grid-cols-4 gap-3">
|
|
248
|
+
<StatCard label="Branch Name" value={selected.name} mono/>
|
|
249
|
+
<StatCard label="Source Database" value={selected.parentDatabase} mono/>
|
|
250
|
+
<StatCard label="Created" value={formatRelative(selected.createdAt)}/>
|
|
251
|
+
<StatCard label="Size" value={formatSize(selected.sizeBytes)}/>
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
|
|
255
|
+
{/* Usage Info */}
|
|
256
|
+
<div className="flex-1 overflow-y-auto px-5 py-4">
|
|
257
|
+
<Alert color="info">
|
|
258
|
+
<Typography variant="body2" className="text-[13px]">
|
|
259
|
+
<strong>How to use this branch:</strong> Switch your application's database connection to
|
|
260
|
+
<code className="mx-1 px-1.5 py-0.5 rounded bg-surface-100 dark:bg-surface-950 font-mono text-[12px]">{selected.name}</code>
|
|
261
|
+
to work with an isolated copy of your data. Changes made to this branch won't affect your main database.
|
|
262
|
+
</Typography>
|
|
263
|
+
</Alert>
|
|
264
|
+
<div className="mt-4 p-4 rounded-lg border bg-surface-50 dark:bg-surface-900 border-surface-200 dark:border-surface-700">
|
|
265
|
+
<Typography variant="caption" className="text-[10px] uppercase tracking-wider text-surface-400 mb-2 block font-medium">Connection Details</Typography>
|
|
266
|
+
<div className="space-y-2">
|
|
267
|
+
<div className="flex items-center gap-2">
|
|
268
|
+
<Typography variant="caption" color="secondary" className="w-24 shrink-0 text-[11px]">Database:</Typography>
|
|
269
|
+
<Typography variant="body2" className="font-mono text-[12px]">{selected.name}</Typography>
|
|
270
|
+
</div>
|
|
271
|
+
<div className="flex items-center gap-2">
|
|
272
|
+
<Typography variant="caption" color="secondary" className="w-24 shrink-0 text-[11px]">Branched from:</Typography>
|
|
273
|
+
<Typography variant="body2" className="font-mono text-[12px]">{selected.parentDatabase}</Typography>
|
|
274
|
+
</div>
|
|
275
|
+
<div className="flex items-center gap-2">
|
|
276
|
+
<Typography variant="caption" color="secondary" className="w-24 shrink-0 text-[11px]">Created at:</Typography>
|
|
277
|
+
<Typography variant="body2" className="font-mono text-[12px]">
|
|
278
|
+
{selected.createdAt instanceof Date
|
|
279
|
+
? selected.createdAt.toLocaleString()
|
|
280
|
+
: new Date(selected.createdAt).toLocaleString()}
|
|
281
|
+
</Typography>
|
|
282
|
+
</div>
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
</div>
|
|
286
|
+
</>
|
|
287
|
+
)}
|
|
288
|
+
</div>
|
|
289
|
+
|
|
290
|
+
{/* ── Create Dialog ── */}
|
|
291
|
+
<Dialog open={createOpen} onOpenChange={setCreateOpen}>
|
|
292
|
+
<DialogTitle>Create New Branch</DialogTitle>
|
|
293
|
+
<DialogContent className="space-y-4 min-w-[400px]">
|
|
294
|
+
<Typography variant="body2" color="secondary" className="text-[13px]">
|
|
295
|
+
Create an isolated database copy. The branch will be a full clone of the source database at this point in time.
|
|
296
|
+
</Typography>
|
|
297
|
+
<div>
|
|
298
|
+
<TextField
|
|
299
|
+
label="Branch Name"
|
|
300
|
+
value={newBranchName}
|
|
301
|
+
onChange={(e) => setNewBranchName(e.target.value)}
|
|
302
|
+
placeholder="e.g. feature-auth, staging, preview-pr-42"
|
|
303
|
+
size="small"
|
|
304
|
+
autoFocus
|
|
305
|
+
/>
|
|
306
|
+
</div>
|
|
307
|
+
{branches.length > 0 && (
|
|
308
|
+
<div>
|
|
309
|
+
<Select
|
|
310
|
+
label="Source Database"
|
|
311
|
+
value={sourceBranch ?? ""}
|
|
312
|
+
onValueChange={(v) => setSourceBranch(v || undefined)}
|
|
313
|
+
placeholder="Default (main database)"
|
|
314
|
+
size="small"
|
|
315
|
+
renderValue={(v) => v || "Default (main database)"}
|
|
316
|
+
>
|
|
317
|
+
<SelectItem value="">Default (main database)</SelectItem>
|
|
318
|
+
{branches.map(b => (
|
|
319
|
+
<SelectItem key={b.name} value={b.name}>{b.name}</SelectItem>
|
|
320
|
+
))}
|
|
321
|
+
</Select>
|
|
322
|
+
</div>
|
|
323
|
+
)}
|
|
324
|
+
</DialogContent>
|
|
325
|
+
<DialogActions>
|
|
326
|
+
<Button variant="text" onClick={() => setCreateOpen(false)} disabled={creating}>
|
|
327
|
+
Cancel
|
|
328
|
+
</Button>
|
|
329
|
+
<Button
|
|
330
|
+
color="primary"
|
|
331
|
+
onClick={handleCreate}
|
|
332
|
+
disabled={!newBranchName.trim() || creating}
|
|
333
|
+
startIcon={creating ? <CircularProgress size="smallest"/> : <PlusIcon size={iconSize.smallest}/>}
|
|
334
|
+
>
|
|
335
|
+
{creating ? "Creating..." : "Create Branch"}
|
|
336
|
+
</Button>
|
|
337
|
+
</DialogActions>
|
|
338
|
+
</Dialog>
|
|
339
|
+
|
|
340
|
+
{/* ── Delete Confirm ── */}
|
|
341
|
+
<ConfirmationDialog
|
|
342
|
+
open={!!deleteTarget}
|
|
343
|
+
onAccept={handleDelete}
|
|
344
|
+
onCancel={() => setDeleteTarget(null)}
|
|
345
|
+
title="Delete Branch"
|
|
346
|
+
body={
|
|
347
|
+
<Typography variant="body2">
|
|
348
|
+
Are you sure you want to permanently delete the branch <strong>{deleteTarget}</strong>?
|
|
349
|
+
This action cannot be undone and all data in this branch will be lost.
|
|
350
|
+
</Typography>
|
|
351
|
+
}
|
|
352
|
+
loading={deleting}
|
|
353
|
+
/>
|
|
354
|
+
</div>
|
|
355
|
+
);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function StatCard({ label, value, mono }: {
|
|
359
|
+
label: string; value: string; mono?: boolean;
|
|
360
|
+
}) {
|
|
361
|
+
return (
|
|
362
|
+
<div className={cls("px-3 py-2 rounded-lg border bg-white dark:bg-surface-900", defaultBorderMixin)}>
|
|
363
|
+
<Typography variant="caption" color="secondary" className="text-[10px] uppercase tracking-wider font-medium">{label}</Typography>
|
|
364
|
+
<Typography variant="body2" className={cls(
|
|
365
|
+
"mt-0.5 font-semibold text-[13px] truncate",
|
|
366
|
+
mono && "font-mono"
|
|
367
|
+
)}>{value}</Typography>
|
|
368
|
+
</div>
|
|
369
|
+
);
|
|
370
|
+
}
|