Skip to content

Commit 7df9902

Browse files
authored
feat(sidebar): move db stats to the connection modal COMPASS-6079 (#3408)
* move db stats to the connection modal * tweak padding
1 parent a4ea2b0 commit 7df9902

File tree

8 files changed

+76
-24
lines changed

8 files changed

+76
-24
lines changed

packages/compass-sidebar/src/components/connection-info-modal.tsx

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,20 @@ import type { MongoDBInstance } from 'mongodb-instance-model';
66
import type { ConnectionOptions } from '../modules/connection-options';
77
import { ENTERPRISE, COMMUNITY } from '../constants/server-version';
88

9+
type Collection = {
10+
id: string;
11+
name: string;
12+
type: string;
13+
};
14+
15+
type Database = {
16+
_id: string;
17+
name: string;
18+
collectionsStatus: string;
19+
collectionsLength: number;
20+
collections: Collection[];
21+
};
22+
923
type ConnectionInfo = {
1024
term: string;
1125
description: React.ReactChild;
@@ -76,10 +90,31 @@ function getVersionDistro(isEnterprise?: boolean): string {
7690

7791
type InfoParameters = {
7892
instance: MongoDBInstance;
93+
databases: Database[];
7994
connectionInfo: ConnectionInfo;
8095
connectionOptions: ConnectionOptions;
8196
};
8297

98+
function getStatsInfo({ instance, databases }: InfoParameters): ConnectionInfo {
99+
const isReady = instance.refreshingStatus === 'ready';
100+
101+
const numDbs = isReady ? databases.length : '-';
102+
const numCollections = isReady
103+
? databases.map((db) => db.collectionsLength).reduce((acc, n) => acc + n, 0)
104+
: '-';
105+
return {
106+
term: 'Stats',
107+
description: (
108+
<div>
109+
<div>{`${numDbs} DB${numDbs === 1 ? '' : 's'}`}</div>
110+
<div>{`${numCollections} Collection${
111+
numCollections === 1 ? '' : 's'
112+
}`}</div>
113+
</div>
114+
),
115+
};
116+
}
117+
83118
function getHostInfo({ instance }: InfoParameters): ConnectionInfo {
84119
const { type, servers } = instance.topologyDescription;
85120

@@ -178,6 +213,8 @@ function getInfos(infoParameters: InfoParameters) {
178213
return infos;
179214
}
180215

216+
infos.push(getStatsInfo(infoParameters));
217+
181218
infos.push(getHostInfo(infoParameters));
182219

183220
if (
@@ -198,16 +235,24 @@ function getInfos(infoParameters: InfoParameters) {
198235

199236
const mapStateToProps = (state: {
200237
instance: MongoDBInstance;
238+
databases: {
239+
databases: Database[];
240+
};
201241
connectionInfo: {
202242
connectionInfo: ConnectionInfo;
203243
};
204244
connectionOptions: ConnectionOptions;
205245
}) => {
206-
const { instance, connectionOptions } = state;
246+
const { instance, databases, connectionOptions } = state;
207247
const { connectionInfo } = state.connectionInfo;
208248

209249
return {
210-
infos: getInfos({ instance, connectionInfo, connectionOptions }),
250+
infos: getInfos({
251+
instance,
252+
databases: databases.databases,
253+
connectionInfo,
254+
connectionOptions,
255+
}),
211256
};
212257
};
213258

packages/compass-sidebar/src/components/csfle-marker.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
} from '@mongodb-js/compass-components';
1010

1111
const badgeContainerStyles = css({
12-
padding: `0 ${spacing[3]}px ${spacing[3]}px`,
12+
padding: `0 ${spacing[3]}px ${spacing[2]}px`,
1313
});
1414

1515
const badgeButtonStyles = css({

packages/compass-sidebar/src/components/db-stats.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
Subtitle,
1212
Overline,
1313
} from '@mongodb-js/compass-components';
14+
import type { MongoDBInstance } from 'mongodb-instance-model';
1415

1516
type RefreshingStatus =
1617
| 'initial'
@@ -99,9 +100,7 @@ export function DBStats({
99100
}
100101

101102
const mapStateToProps = (state: {
102-
instance?: {
103-
refreshingStatus: RefreshingStatus;
104-
};
103+
instance?: MongoDBInstance;
105104
databases: {
106105
databases: Database[];
107106
};

packages/compass-sidebar/src/components/non-genuine-marker.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
} from '@mongodb-js/compass-components';
1111

1212
const nonGenuineMarkerContainer = css({
13-
padding: `0 ${spacing[3]}px ${spacing[3]}px`,
13+
padding: `0 ${spacing[3]}px ${spacing[2]}px`,
1414
});
1515

1616
const nonGenuineMarkerButton = css({

packages/compass-sidebar/src/components/sidebar.tsx

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { connect } from 'react-redux';
44
import { getConnectionTitle } from 'mongodb-data-service';
55
import type { ConnectionInfo } from 'mongodb-data-service';
66
import {
7+
css,
8+
spacing,
79
ResizableSidebar,
810
useToast,
911
ToastVariant,
@@ -13,7 +15,6 @@ import { SaveConnectionModal } from '@mongodb-js/connection-form';
1315

1416
import SidebarTitle from './sidebar-title';
1517
import FavoriteIndicator from './favorite-indicator';
16-
import DBStats from './db-stats';
1718
import NavigationItems from './navigation-items';
1819
import ConnectionInfoModal from './connection-info-modal';
1920
import NonGenuineWarningModal from './non-genuine-warning-modal';
@@ -27,6 +28,11 @@ import type { MongoDBInstance } from 'mongodb-instance-model';
2728

2829
const TOAST_TIMEOUT_MS = 5000; // 5 seconds.
2930

31+
// NOTE: This covers both the typical case where we have no badges and the case where we do.
32+
const badgesPlaceholderStyles = css({
33+
paddingTop: spacing[3],
34+
});
35+
3036
// eslint-disable-next-line no-empty-pattern
3137
export function Sidebar({
3238
connectionInfo,
@@ -149,19 +155,20 @@ export function Sidebar({
149155
<FavoriteIndicator favorite={connectionInfo.favorite} />
150156
)}
151157

152-
{isExpanded && <DBStats />}
153-
{isExpanded && (
154-
<NonGenuineMarker
155-
isGenuine={isGenuine}
156-
showNonGenuineModal={showNonGenuineModal}
157-
/>
158-
)}
159-
{isExpanded && (
160-
<CSFLEMarker
161-
csfleMode={csfleMode}
162-
toggleCSFLEModalVisible={toggleCSFLEModalVisible}
163-
/>
164-
)}
158+
<div className={badgesPlaceholderStyles}>
159+
{isExpanded && (
160+
<NonGenuineMarker
161+
isGenuine={isGenuine}
162+
showNonGenuineModal={showNonGenuineModal}
163+
/>
164+
)}
165+
{isExpanded && (
166+
<CSFLEMarker
167+
csfleMode={csfleMode}
168+
toggleCSFLEModalVisible={toggleCSFLEModalVisible}
169+
/>
170+
)}
171+
</div>
165172

166173
<NavigationItems isExpanded={isExpanded} onAction={onAction} />
167174

packages/compass-sidebar/src/stores/store.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ store.onActivated = (appRegistry) => {
6565
}),
6666
};
6767
});
68+
6869
store.dispatch(changeDatabases(dbs));
6970
}, 300);
7071

@@ -121,7 +122,7 @@ store.onActivated = (appRegistry) => {
121122
onDatabasesChange(instance.databases);
122123
});
123124

124-
instance.on('change:databases.', () => {
125+
instance.on('change:databases', () => {
125126
onDatabasesChange(instance.databases);
126127
});
127128

packages/database-model/lib/model.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ const DatabaseModel = AmpersandModel.extend(
118118
// if possible if we haven't fetched collections yet, but use the real
119119
// number if real collections info is available
120120
collectionsLength: {
121-
deps: ['collection_count', 'collectionsStatus'],
121+
deps: ['collection_count', 'collectionsStatus', 'collections'],
122122
fn() {
123123
return ['ready', 'refreshing'].includes(this.collectionsStatus)
124124
? this.collections.length

packages/instance-model/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ declare class MongoDBInstanceProps {
5656
statusError: string | null;
5757
databasesStatus: string;
5858
databasesStatusError: string | null;
59-
refreshingStatus: string;
59+
refreshingStatus: 'initial' | 'fetching' | 'refreshing' | 'ready' | 'error';
6060
refreshingStatusError: string | null;
6161
isAtlas: boolean;
6262
atlasVersion: string;

0 commit comments

Comments
 (0)