diff --git a/package-lock.json b/package-lock.json index c00a0c2813e..b3a41acb2e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46199,6 +46199,7 @@ "@mongodb-js/compass-workspaces": "^0.8.0", "@mongodb-js/my-queries-storage": "^0.8.0", "bson": "^6.6.0", + "compass-preferences-model": "^2.20.0", "fuse.js": "^6.5.3", "hadron-app-registry": "^9.1.11", "mongodb-ns": "^2.4.0", @@ -56867,6 +56868,7 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.6.0", "chai": "^4.3.4", + "compass-preferences-model": "^2.20.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", diff --git a/packages/compass-saved-aggregations-queries/package.json b/packages/compass-saved-aggregations-queries/package.json index 73092844413..9e7b410c81e 100644 --- a/packages/compass-saved-aggregations-queries/package.json +++ b/packages/compass-saved-aggregations-queries/package.json @@ -55,6 +55,7 @@ "@mongodb-js/compass-workspaces": "^0.8.0", "@mongodb-js/my-queries-storage": "^0.8.0", "bson": "^6.6.0", + "compass-preferences-model": "^2.20.0", "fuse.js": "^6.5.3", "hadron-app-registry": "^9.1.11", "mongodb-ns": "^2.4.0", diff --git a/packages/compass-saved-aggregations-queries/src/components/aggregations-queries-list.tsx b/packages/compass-saved-aggregations-queries/src/components/aggregations-queries-list.tsx index 89ee10e1630..d4a27a2de15 100644 --- a/packages/compass-saved-aggregations-queries/src/components/aggregations-queries-list.tsx +++ b/packages/compass-saved-aggregations-queries/src/components/aggregations-queries-list.tsx @@ -21,6 +21,10 @@ import { editItem } from '../stores/edit-item'; import { confirmDeleteItem } from '../stores/delete-item'; import { copyToClipboard } from '../stores/copy-to-clipboard'; import { useTrackOnChange } from '@mongodb-js/compass-logging/provider'; +import { + type ConnectionInfo, + useActiveConnections, +} from '@mongodb-js/compass-connections/provider'; const sortBy: { name: keyof Item; label: string }[] = [ { @@ -73,7 +77,7 @@ export type AggregationsQueriesListProps = { loading: boolean; items: Item[]; onMount(): void; - onOpenItem(id: string): void; + onOpenItem(id: string, activeConnections: ConnectionInfo[]): void; onEditItem(id: string): void; onDeleteItem(id: string): void; onCopyToClipboard(id: string): void; @@ -92,6 +96,8 @@ export const AggregationsQueriesList = ({ void onMount(); }, [onMount]); + const activeConnections = useActiveConnections(); + const { controls: filterControls, conditions: filters, @@ -155,7 +161,7 @@ export const AggregationsQueriesList = ({ (id: string, actionName: Action) => { switch (actionName) { case 'open': - onOpenItem(id); + onOpenItem(id, activeConnections); return; case 'rename': onEditItem(id); @@ -168,7 +174,7 @@ export const AggregationsQueriesList = ({ return; } }, - [onOpenItem, onEditItem, onDeleteItem, onCopyToClipboard] + [activeConnections, onOpenItem, onEditItem, onDeleteItem, onCopyToClipboard] ); const renderItem: React.ComponentProps['renderItem'] = diff --git a/packages/compass-saved-aggregations-queries/src/index.spec.tsx b/packages/compass-saved-aggregations-queries/src/index.spec.tsx index a66bed677d1..48c05008cc4 100644 --- a/packages/compass-saved-aggregations-queries/src/index.spec.tsx +++ b/packages/compass-saved-aggregations-queries/src/index.spec.tsx @@ -15,6 +15,10 @@ import type { PipelineStorage, FavoriteQueryStorage, } from '@mongodb-js/my-queries-storage/provider'; +import { ConnectionsManager } from '@mongodb-js/compass-connections/provider'; +import { createNoopLoggerAndTelemetry } from '@mongodb-js/compass-logging/provider'; +import { TestMongoDBInstanceManager } from '@mongodb-js/compass-app-stores/provider'; +import type { PreferencesAccess } from 'compass-preferences-model/provider'; describe('AggregationsQueriesList', function () { const sandbox = Sinon.createSandbox(); @@ -29,19 +33,43 @@ describe('AggregationsQueriesList', function () { updateAttributes: sandbox.stub().resolves({}), }; - const Plugin = MyQueriesPlugin.withMockServices({ - dataService, - instance, - favoriteQueryStorageAccess: { - getStorage() { - return queryStorage as unknown as FavoriteQueryStorage; - }, + const connectionsManager = new ConnectionsManager({ + logger: createNoopLoggerAndTelemetry().log.unbound, + }); + + const instancesManager = new TestMongoDBInstanceManager(); + + const preferencesAccess = { + getPreferences() { + return { + enableNewMultipleConnectionSystem: false, + }; }, - pipelineStorage: pipelineStorage as unknown as PipelineStorage, + } as PreferencesAccess; + let Plugin: any; + + beforeEach(function () { + sandbox + .stub(connectionsManager, 'getDataServiceForConnection') + .returns(dataService); + sandbox + .stub(instancesManager, 'getMongoDBInstanceForConnection') + .returns(instance); + Plugin = MyQueriesPlugin.withMockServices({ + connectionsManager, + instancesManager, + preferencesAccess, + favoriteQueryStorageAccess: { + getStorage() { + return queryStorage as unknown as FavoriteQueryStorage; + }, + }, + pipelineStorage: pipelineStorage as unknown as PipelineStorage, + }); }); afterEach(function () { - sandbox.resetHistory(); + sandbox.restore(); cleanup(); }); diff --git a/packages/compass-saved-aggregations-queries/src/index.ts b/packages/compass-saved-aggregations-queries/src/index.ts index cfc1defff5d..f9293d2d635 100644 --- a/packages/compass-saved-aggregations-queries/src/index.ts +++ b/packages/compass-saved-aggregations-queries/src/index.ts @@ -1,11 +1,6 @@ import { registerHadronPlugin } from 'hadron-app-registry'; -import { - connectionInfoAccessLocator, - dataServiceLocator, - type DataService, - type DataServiceLocator, -} from '@mongodb-js/compass-connections/provider'; -import { mongoDBInstanceLocator } from '@mongodb-js/compass-app-stores/provider'; +import { connectionsManagerLocator } from '@mongodb-js/compass-connections/provider'; +import { mongoDBInstancesManagerLocator } from '@mongodb-js/compass-app-stores/provider'; import { createLoggerAndTelemetryLocator } from '@mongodb-js/compass-logging/provider'; import { activatePlugin } from './stores'; import AggregationsQueriesList from './components/aggregations-queries-list'; @@ -15,19 +10,16 @@ import { pipelineStorageLocator, favoriteQueryStorageAccessLocator, } from '@mongodb-js/my-queries-storage/provider'; +import { preferencesLocator } from 'compass-preferences-model/provider'; const serviceLocators = { - dataService: dataServiceLocator as DataServiceLocator< - // Getting passed to the mongodb instance so hard to be more explicit - // about used methods - keyof DataService - >, - instance: mongoDBInstanceLocator, + connectionsManager: connectionsManagerLocator, + instancesManager: mongoDBInstancesManagerLocator, + preferencesAccess: preferencesLocator, logger: createLoggerAndTelemetryLocator('COMPASS-MY-QUERIES-UI'), workspaces: workspacesServiceLocator, pipelineStorage: pipelineStorageLocator, favoriteQueryStorageAccess: favoriteQueryStorageAccessLocator, - connectionInfoAccess: connectionInfoAccessLocator, }; export const MyQueriesPlugin = registerHadronPlugin< diff --git a/packages/compass-saved-aggregations-queries/src/stores/index.ts b/packages/compass-saved-aggregations-queries/src/stores/index.ts index 5de08c2e54b..7a54d6b570a 100644 --- a/packages/compass-saved-aggregations-queries/src/stores/index.ts +++ b/packages/compass-saved-aggregations-queries/src/stores/index.ts @@ -6,11 +6,8 @@ import type { ThunkAction } from 'redux-thunk'; import itemsReducer from './aggregations-queries-items'; import openItemReducer from './open-item'; import editItemReducer from './edit-item'; -import type { - ConnectionInfoAccess, - DataService, -} from '@mongodb-js/compass-connections/provider'; -import type { MongoDBInstance } from '@mongodb-js/compass-app-stores/provider'; +import { type ConnectionsManager } from '@mongodb-js/compass-connections/provider'; +import type { MongoDBInstancesManager } from '@mongodb-js/compass-app-stores/provider'; import type { LoggerAndTelemetry } from '@mongodb-js/compass-logging/provider'; import type { workspacesServiceLocator } from '@mongodb-js/compass-workspaces/provider'; import type { @@ -18,27 +15,28 @@ import type { PipelineStorage, FavoriteQueryStorage, } from '@mongodb-js/my-queries-storage/provider'; +import type { PreferencesAccess } from 'compass-preferences-model'; type MyQueriesServices = { - dataService: DataService; - instance: MongoDBInstance; + connectionsManager: ConnectionsManager; + instancesManager: MongoDBInstancesManager; + preferencesAccess: PreferencesAccess; globalAppRegistry: AppRegistry; logger: LoggerAndTelemetry; pipelineStorage?: PipelineStorage; workspaces: ReturnType; favoriteQueryStorageAccess?: FavoriteQueryStorageAccess; - connectionInfoAccess: ConnectionInfoAccess; }; export function configureStore({ globalAppRegistry, - dataService, - instance, + connectionsManager, + instancesManager, + preferencesAccess, logger, workspaces, pipelineStorage, favoriteQueryStorageAccess, - connectionInfoAccess, }: MyQueriesServices) { return createStore( combineReducers({ @@ -49,13 +47,13 @@ export function configureStore({ applyMiddleware( thunk.withExtraArgument({ globalAppRegistry, - dataService, - instance, + connectionsManager, + instancesManager, + preferencesAccess, logger, pipelineStorage, queryStorage: favoriteQueryStorageAccess?.getStorage(), workspaces, - connectionInfoAccess, }) ) ); diff --git a/packages/compass-saved-aggregations-queries/src/stores/open-item.ts b/packages/compass-saved-aggregations-queries/src/stores/open-item.ts index ead693e9c6f..157cc5fc7e1 100644 --- a/packages/compass-saved-aggregations-queries/src/stores/open-item.ts +++ b/packages/compass-saved-aggregations-queries/src/stores/open-item.ts @@ -1,13 +1,25 @@ -import type { ActionCreator, Reducer } from 'redux'; +import type { ActionCreator, AnyAction, Reducer } from 'redux'; import type { SavedQueryAggregationThunkAction } from '.'; import type { Item } from './aggregations-queries-items'; +import type { + ConnectionInfo, + DataService, +} from '@mongodb-js/compass-connections/provider'; +import type { MongoDBInstance } from '@mongodb-js/compass-app-stores/provider'; + +function isAction( + action: AnyAction, + type: A['type'] +): action is A { + return action.type === type; +} export type Status = 'initial' | 'fetching' | 'error' | 'ready'; export type State = { isModalOpen: boolean; selectedItem: Item | null; - createCollectionStatus: Status; + selectedConnection: string | null; databases: string[]; selectedDatabase: string | null; databasesStatus: Status; @@ -20,7 +32,7 @@ export type State = { const INITIAL_STATE: State = { isModalOpen: false, selectedItem: null, - createCollectionStatus: 'initial', + selectedConnection: null, databases: [], selectedDatabase: null, databasesStatus: 'initial', @@ -33,7 +45,7 @@ const INITIAL_STATE: State = { export enum ActionTypes { OpenModal = 'compass-saved-aggregations-queries/openModal', CloseModal = 'compass-saved-aggregations-queries/closeModal', - CreateNamespaceStatusChange = 'compass-saved-aggregations-queries/createNamespaceStatusChange', + ConnectionSelected = 'compass-saved-aggregations-queries/connectionSelected', SelectDatabase = 'compass-saved-aggregations-queries/selectDatabase', LoadDatabases = 'compass-saved-aggregations-queries/loadDatabases', LoadDatabasesSuccess = 'compass-saved-aggregations-queries/loadDatabasesSuccess', @@ -48,15 +60,16 @@ export enum ActionTypes { type OpenModalAction = { type: ActionTypes.OpenModal; selectedItem: Item; + selectedConnection?: string; }; type CloseModalAction = { type: ActionTypes.CloseModal; }; -type CreateNamespaceStatusChangeAction = { - type: ActionTypes.CreateNamespaceStatusChange; - status: Status; +type ConnectionSelectedAction = { + type: ActionTypes.ConnectionSelected; + connection: string; }; type SelectDatabaseAction = { @@ -95,7 +108,7 @@ type LoadCollectionsErrorAction = { type: ActionTypes.LoadCollectionsError; }; -type UpdateNamespaceChecked = { +type UpdateNamespaceCheckedAction = { type: ActionTypes.UpdateNamespaceChecked; updateItemNamespace: boolean; }; @@ -103,7 +116,7 @@ type UpdateNamespaceChecked = { export type Actions = | OpenModalAction | CloseModalAction - | CreateNamespaceStatusChangeAction + | ConnectionSelectedAction | SelectDatabaseAction | LoadDatabasesAction | LoadDatabasesErrorAction @@ -112,91 +125,188 @@ export type Actions = | LoadCollectionsAction | LoadCollectionsErrorAction | LoadCollectionsSuccessAction - | UpdateNamespaceChecked; + | UpdateNamespaceCheckedAction; const reducer: Reducer = (state = INITIAL_STATE, action) => { - switch (action.type) { - case ActionTypes.OpenModal: - return { - ...state, - selectedItem: action.selectedItem, - isModalOpen: true, - }; - case ActionTypes.CloseModal: - return { ...INITIAL_STATE }; - case ActionTypes.CreateNamespaceStatusChange: - return { - ...state, - createCollectionStatus: action.status, - }; - case ActionTypes.SelectDatabase: - return { - ...state, - selectedDatabase: action.database, - collections: [], - collectionsStatus: 'initial', - selectedCollection: null, - }; - case ActionTypes.LoadDatabases: - return { - ...state, - databasesStatus: 'fetching', - }; - case ActionTypes.LoadDatabasesError: - return { - ...state, - databasesStatus: 'error', - }; - case ActionTypes.LoadDatabasesSuccess: - return { - ...state, - databases: action.databases, - databasesStatus: 'ready', - }; - case ActionTypes.SelectCollection: - return { - ...state, - selectedCollection: action.collection, - }; - case ActionTypes.LoadCollections: - return { - ...state, - collectionsStatus: 'fetching', - }; - case ActionTypes.LoadCollectionsError: + if (isAction(action, ActionTypes.OpenModal)) { + return { + ...state, + selectedItem: action.selectedItem, + selectedConnection: action.selectedConnection ?? state.selectedConnection, + isModalOpen: true, + }; + } + + if (isAction(action, ActionTypes.CloseModal)) { + return { ...INITIAL_STATE }; + } + + if ( + isAction(action, ActionTypes.ConnectionSelected) + ) { + return { + ...state, + selectedConnection: action.connection, + selectedDatabase: null, + databases: [], + databasesStatus: 'initial', + collections: [], + collectionsStatus: 'initial', + selectedCollection: null, + }; + } + + if (isAction(action, ActionTypes.SelectDatabase)) { + return { + ...state, + selectedDatabase: action.database, + collections: [], + collectionsStatus: 'initial', + selectedCollection: null, + }; + } + + if (isAction(action, ActionTypes.LoadDatabases)) { + return { + ...state, + databasesStatus: 'fetching', + }; + } + + if ( + isAction(action, ActionTypes.LoadDatabasesError) + ) { + return { + ...state, + databasesStatus: 'error', + }; + } + + if ( + isAction( + action, + ActionTypes.LoadDatabasesSuccess + ) + ) { + return { + ...state, + databases: action.databases, + databasesStatus: 'ready', + }; + } + + if (isAction(action, ActionTypes.SelectCollection)) { + return { + ...state, + selectedCollection: action.collection, + }; + } + + if (isAction(action, ActionTypes.LoadCollections)) { + return { + ...state, + collectionsStatus: 'fetching', + }; + } + + if ( + isAction( + action, + ActionTypes.LoadCollectionsError + ) + ) { + return { + ...state, + collectionsStatus: 'error', + }; + } + + if ( + isAction( + action, + ActionTypes.LoadCollectionsSuccess + ) + ) { + return { + ...state, + collections: action.collections, + collectionsStatus: 'ready', + }; + } + + if ( + isAction( + action, + ActionTypes.UpdateNamespaceChecked + ) + ) { + return { + ...state, + updateItemNamespace: action.updateItemNamespace, + }; + } + + return state; +}; + +const getDataServiceAndInstanceForConnection = + ( + connection: string | null + ): SavedQueryAggregationThunkAction< + | { + dataService?: never; + instance?: never; + error: Error; + } + | { + dataService: DataService; + instance: MongoDBInstance; + error?: never; + } + > => + (_dispatch, _getState, { connectionsManager, instancesManager }) => { + if (!connection) { return { - ...state, - collectionsStatus: 'error', + error: new Error('Connection not provided'), }; - case ActionTypes.LoadCollectionsSuccess: + } + + const dataService = + connectionsManager.getDataServiceForConnection(connection); + if (!dataService) { return { - ...state, - collections: action.collections, - collectionsStatus: 'ready', + error: new Error( + `DataService for connection - ${connection} not found` + ), }; - case ActionTypes.UpdateNamespaceChecked: + } + + const instance = + instancesManager.getMongoDBInstanceForConnection(connection); + if (!instance) { return { - ...state, - updateItemNamespace: action.updateItemNamespace, + error: new Error(`Instance for connection - ${connection} not found`), }; - default: - return state; - } -}; - -export const updateItemNamespaceChecked = (updateItemNamespace: boolean) => ({ - type: ActionTypes.UpdateNamespaceChecked, - updateItemNamespace, -}); + } -const openModal = - (selectedItem: Item): SavedQueryAggregationThunkAction> => - async (dispatch, _getState, { instance, dataService }) => { - dispatch({ type: ActionTypes.OpenModal, selectedItem }); + return { + dataService, + instance, + }; + }; +const loadDatabasesForConnection = + (connectionId: string): SavedQueryAggregationThunkAction> => + async (dispatch) => { dispatch({ type: ActionTypes.LoadDatabases }); - try { + const { error, instance, dataService } = dispatch( + getDataServiceAndInstanceForConnection(connectionId) + ); + if (error) { + throw error; + } + await instance.fetchDatabases({ dataService }); dispatch({ type: ActionTypes.LoadDatabasesSuccess, @@ -207,21 +317,51 @@ const openModal = } }; -export const closeModal: ActionCreator = () => { - return { type: ActionTypes.CloseModal }; -}; +export const connectionSelected = + (selectedConnection: string): SavedQueryAggregationThunkAction => + (dispatch) => { + dispatch({ + type: ActionTypes.ConnectionSelected, + connection: selectedConnection, + }); + + void dispatch(loadDatabasesForConnection(selectedConnection)); + }; + +export const updateItemNamespaceChecked = (updateItemNamespace: boolean) => ({ + type: ActionTypes.UpdateNamespaceChecked, + updateItemNamespace, +}); + +const openModal = + ( + selectedItem: Item, + selectedConnection?: string + ): SavedQueryAggregationThunkAction => + (dispatch) => { + dispatch({ + type: ActionTypes.OpenModal, + selectedItem, + selectedConnection, + }); + + if (selectedConnection) { + void dispatch(loadDatabasesForConnection(selectedConnection)); + } + }; + +export const closeModal = (): CloseModalAction => ({ + type: ActionTypes.CloseModal, +}); const openItem = ( item: Item, + connection: string, database: string, collection: string ): SavedQueryAggregationThunkAction => - ( - _dispatch, - _getState, - { logger: { track }, workspaces, connectionInfoAccess } - ) => { + (_dispatch, _getState, { logger: { track }, workspaces }) => { track( item.type === 'aggregation' ? 'Aggregation Opened' @@ -232,11 +372,8 @@ const openItem = } ); - const { id: connectionId } = - connectionInfoAccess.getCurrentConnectionInfo(); - workspaces.openCollectionWorkspace( - connectionId, + connection, `${database}.${collection}`, { initialAggregation: @@ -251,8 +388,11 @@ const openItem = }; export const openSavedItem = - (id: string): SavedQueryAggregationThunkAction> => - async (dispatch, getState, { instance, dataService }) => { + ( + id: string, + activeConnections: ConnectionInfo[] + ): SavedQueryAggregationThunkAction> => + async (dispatch, getState, { preferencesAccess }) => { const { savedItems: { items }, } = getState(); @@ -264,28 +404,35 @@ export const openSavedItem = } const { database, collection } = item; + const multiConnectionsEnabled = + preferencesAccess.getPreferences().enableNewMultipleConnectionSystem; + + if (!multiConnectionsEnabled) { + // In single connections mode, we only expect one connections to be here + // in the list of active connections. + const [activeConnection] = activeConnections; + const { error, dataService, instance } = dispatch( + getDataServiceAndInstanceForConnection(activeConnection.id) + ); + if (error) { + return; + } - const coll = await instance.getNamespace({ - dataService, - database, - collection, - }); - - if (!coll) { - void dispatch(openModal(item)); - return; - } + const coll = await instance.getNamespace({ + dataService, + database, + collection, + }); - dispatch(openItem(item, database, collection)); - }; + if (!coll) { + dispatch(openModal(item, activeConnection.id)); + return; + } -export const updateNamespaceChecked = - (updateNamespaceChecked: boolean): SavedQueryAggregationThunkAction => - (dispatch) => { - dispatch({ - type: ActionTypes.UpdateNamespaceChecked, - updateNamespaceChecked, - }); + dispatch(openItem(item, activeConnection.id, database, collection)); + } else { + // TODO: COMPASS-7904 + } }; export const openSelectedItem = @@ -294,13 +441,19 @@ export const openSelectedItem = const { openItem: { selectedItem, + selectedConnection, selectedDatabase, selectedCollection, updateItemNamespace, }, } = getState(); - if (!selectedItem || !selectedDatabase || !selectedCollection) { + if ( + !selectedItem || + !selectedConnection || + !selectedDatabase || + !selectedCollection + ) { return; } @@ -318,14 +471,21 @@ export const openSelectedItem = } dispatch({ type: ActionTypes.CloseModal }); - dispatch(openItem(selectedItem, selectedDatabase, selectedCollection)); + dispatch( + openItem( + selectedItem, + selectedConnection, + selectedDatabase, + selectedCollection + ) + ); }; export const selectDatabase = (database: string): SavedQueryAggregationThunkAction> => - async (dispatch, getState, { instance, dataService }) => { + async (dispatch, getState) => { const { - openItem: { selectedDatabase }, + openItem: { selectedDatabase, selectedConnection }, } = getState(); if (database === selectedDatabase) { @@ -334,13 +494,20 @@ export const selectDatabase = dispatch({ type: ActionTypes.SelectDatabase, database }); - const db = instance.databases.get(database); + dispatch({ type: ActionTypes.LoadCollections }); + try { + const { error, instance, dataService } = dispatch( + getDataServiceAndInstanceForConnection(selectedConnection) + ); + if (error) { + throw error; + } - if (!db) { - return; - } + const db = instance.databases.get(database); + if (!db) { + throw new Error('Database not found'); + } - try { await db.fetchCollections({ dataService }); // Check with the the current value in case db was re-selected while we // were fetching diff --git a/packages/compass-sidebar/src/plugin.tsx b/packages/compass-sidebar/src/plugin.tsx index 9e2473bee0e..83d215f2520 100644 --- a/packages/compass-sidebar/src/plugin.tsx +++ b/packages/compass-sidebar/src/plugin.tsx @@ -5,12 +5,14 @@ import { css, defaultSidebarWidth, } from '@mongodb-js/compass-components'; -import type { ConnectionInfo } from '@mongodb-js/connection-info'; import { useActiveWorkspace } from '@mongodb-js/compass-workspaces/provider'; import Sidebar from './components/legacy/sidebar'; import { usePreference } from 'compass-preferences-model/provider'; import MultipleConnectionSidebar from './components/multiple-connections/sidebar'; -import { ConnectionInfoProvider } from '@mongodb-js/compass-connections/provider'; +import { + ConnectionInfoProvider, + useActiveConnections, +} from '@mongodb-js/compass-connections/provider'; const errorBoundaryStyles = css({ width: defaultSidebarWidth, @@ -18,15 +20,12 @@ const errorBoundaryStyles = css({ export interface SidebarPluginProps { showConnectionInfo?: boolean; - singleConnectionConnectionInfo?: ConnectionInfo; } const SidebarPlugin: React.FunctionComponent = ({ showConnectionInfo, - // TODO(COMPASS-7397): the need for passing this directly to sidebar should go - // away with refactoring compass-connection to a plugin - singleConnectionConnectionInfo, }) => { + const [activeConnection] = useActiveConnections(); const isMultiConnectionEnabled = usePreference( 'enableNewMultipleConnectionSystem' ); @@ -39,9 +38,7 @@ const SidebarPlugin: React.FunctionComponent = ({ sidebar = ; } else { sidebar = ( - + {(connectionInfo) => { return ( ); }} diff --git a/packages/compass-workspaces/src/components/index.tsx b/packages/compass-workspaces/src/components/index.tsx index 37b4beb68da..285f8716acf 100644 --- a/packages/compass-workspaces/src/components/index.tsx +++ b/packages/compass-workspaces/src/components/index.tsx @@ -10,15 +10,8 @@ import { import Workspaces from './workspaces'; import { connect } from '../stores/context'; import { WorkspacesServiceProvider } from '../provider'; -import type { ConnectionInfo } from '@mongodb-js/compass-connections/provider'; type WorkspacesWithSidebarProps = { - /** - * ConnectionInfo of the connection that Compass is connected to while in - * single connection mode. This is a temporary addition until we change My - * Queries plugin to be not dependent on DataService and MongoDBInstance. - */ - singleConnectionConnectionInfo?: ConnectionInfo; /** * Current active workspace tab */ @@ -94,7 +87,6 @@ const sidebarStyles = css({ const WorkspacesWithSidebar: React.FunctionComponent< WorkspacesWithSidebarProps > = ({ - singleConnectionConnectionInfo, activeTab, activeTabCollectionInfo, openOnEmptyWorkspace, @@ -120,10 +112,7 @@ const WorkspacesWithSidebar: React.FunctionComponent< {renderSidebar && React.createElement(renderSidebar)}
- +
{renderModals && React.createElement(renderModals)} diff --git a/packages/compass-workspaces/src/components/workspaces.tsx b/packages/compass-workspaces/src/components/workspaces.tsx index 212629eac93..d4f617e5f0d 100644 --- a/packages/compass-workspaces/src/components/workspaces.tsx +++ b/packages/compass-workspaces/src/components/workspaces.tsx @@ -32,7 +32,6 @@ import { connect } from '../stores/context'; import { WorkspaceTabStateProvider } from './workspace-tab-state-provider'; import { NamespaceProvider } from '@mongodb-js/compass-app-stores/provider'; import { - type ConnectionInfo, ConnectionInfoProvider, useTabConnectionTheme, } from '@mongodb-js/compass-connections/provider'; @@ -74,7 +73,6 @@ type CompassWorkspacesProps = { activeTab?: WorkspaceTab | null; collectionInfo: Record; openOnEmptyWorkspace?: OpenWorkspaceOptions | null; - singleConnectionConnectionInfo?: ConnectionInfo; onSelectTab(at: number): void; onSelectNextTab(): void; @@ -101,7 +99,6 @@ const CompassWorkspaces: React.FunctionComponent = ({ onCreateTab, onCloseTab, onNamespaceNotFound, - singleConnectionConnectionInfo, }) => { const { log, mongoLogId } = useLoggerAndTelemetry('COMPASS-WORKSPACES'); const { getWorkspacePluginByName } = useWorkspacePlugins(); @@ -183,23 +180,12 @@ const CompassWorkspaces: React.FunctionComponent = ({ const activeWorkspaceElement = useMemo(() => { switch (activeTab?.type) { - case 'Welcome': { + case 'Welcome': + case 'My Queries': { const Component = getWorkspacePluginByName(activeTab.type); return ; } - // TODO: Remove the ConnectionInfoProvider when we make My Queries - // workspace work independently of a DataService - case 'My Queries': { - const Component = getWorkspacePluginByName(activeTab.type); - return ( - - - - ); - } case 'Performance': case 'Databases': { const Component = getWorkspacePluginByName(activeTab.type); @@ -244,12 +230,7 @@ const CompassWorkspaces: React.FunctionComponent = ({ default: return null; } - }, [ - singleConnectionConnectionInfo, - activeTab, - getWorkspacePluginByName, - onNamespaceNotFound, - ]); + }, [activeTab, getWorkspacePluginByName, onNamespaceNotFound]); const onCreateNewTab = useCallback(() => { onCreateTab(openOnEmptyWorkspace); diff --git a/packages/compass/src/app/components/home.tsx b/packages/compass/src/app/components/home.tsx index c242039e697..3e4100c0044 100644 --- a/packages/compass/src/app/components/home.tsx +++ b/packages/compass/src/app/components/home.tsx @@ -345,31 +345,13 @@ function Home({ {multiConnectionsEnabled && ( - + )} {!multiConnectionsEnabled && (isConnected ? ( diff --git a/packages/compass/src/app/components/workspace.tsx b/packages/compass/src/app/components/workspace.tsx index 3bad0e62671..16d80c6a404 100644 --- a/packages/compass/src/app/components/workspace.tsx +++ b/packages/compass/src/app/components/workspace.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { css } from '@mongodb-js/compass-components'; -import type { ConnectionInfo } from '@mongodb-js/connection-storage/renderer'; import { CompassShellPlugin } from '@mongodb-js/compass-shell'; import { WorkspaceTab as CollectionWorkspace, @@ -36,7 +35,10 @@ import { import { ImportPlugin, ExportPlugin } from '@mongodb-js/compass-import-export'; import ExplainPlanCollectionTabModal from '@mongodb-js/compass-explain-plan'; import ExportToLanguageCollectionTabModal from '@mongodb-js/compass-export-to-language'; -import { ConnectionInfoProvider } from '@mongodb-js/compass-connections/provider'; +import { + ConnectionInfoProvider, + useActiveConnections, +} from '@mongodb-js/compass-connections/provider'; import { usePreference } from 'compass-preferences-model/provider'; const verticalSplitStyles = css({ @@ -53,14 +55,13 @@ const shellContainerStyles = css({ }); export default function Workspace({ - singleConnectionConnectionInfo, onActiveWorkspaceTabChange, }: { - singleConnectionConnectionInfo?: ConnectionInfo; onActiveWorkspaceTabChange: React.ComponentProps< typeof WorkspacesPlugin >['onActiveWorkspaceTabChange']; }): React.ReactElement { + const [activeConnection] = useActiveConnections(); const multiConnectionsEnabled = usePreference( 'enableNewMultipleConnectionSystem' ); @@ -96,13 +97,8 @@ export default function Workspace({ initialWorkspaceTabs={[ { type: multiConnectionsEnabled ? 'Welcome' : 'My Queries' }, ]} - singleConnectionConnectionInfo={singleConnectionConnectionInfo} onActiveWorkspaceTabChange={onActiveWorkspaceTabChange} - renderSidebar={() => ( - - )} + renderSidebar={() => } renderModals={() => ( <> @@ -117,9 +113,7 @@ export default function Workspace({
- +