Skip to content

Commit 70bc8ad

Browse files
committed
Implement getContextMenuGroups
1 parent c2f3d78 commit 70bc8ad

File tree

3 files changed

+83
-4
lines changed

3 files changed

+83
-4
lines changed

packages/compass-connections-navigation/src/connections-navigation-tree.tsx

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import type {
1212
Connection,
1313
} from './tree-data';
1414
import type {
15-
ContextMenuItem,
15+
ContextMenuItemGroup,
1616
ItemAction,
1717
ItemSeparator,
1818
} from '@mongodb-js/compass-components';
@@ -32,6 +32,7 @@ import {
3232
databaseItemActions,
3333
notConnectedConnectionItemActions,
3434
} from './item-actions';
35+
import { itemActionsToContextMenuGroups } from './context-menus';
3536

3637
const ConnectionsNavigationContainerStyles = css({
3738
display: 'flex',
@@ -223,10 +224,58 @@ const ConnectionsNavigationTree: React.FunctionComponent<
223224
);
224225

225226
const getContextMenuGroups = useCallback(
226-
(item: SidebarTreeItem): ContextMenuItem[][] => {
227-
return [[{ label: item.id, onAction() {} }]];
227+
function getContextMenuGroups(
228+
item: SidebarTreeItem
229+
): ContextMenuItemGroup[] {
230+
switch (item.type) {
231+
case 'placeholder':
232+
return [];
233+
case 'connection':
234+
return itemActionsToContextMenuGroups(
235+
item,
236+
onItemAction,
237+
item.connectionStatus === 'connected'
238+
? connectedConnectionItemActions({
239+
hasWriteActionsDisabled: item.hasWriteActionsDisabled,
240+
isShellEnabled: item.isShellEnabled,
241+
connectionInfo: item.connectionInfo,
242+
isPerformanceTabAvailable: item.isPerformanceTabAvailable,
243+
isPerformanceTabSupported: item.isPerformanceTabSupported,
244+
})
245+
: notConnectedConnectionItemActions({
246+
connectionInfo: item.connectionInfo,
247+
connectionStatus: item.connectionStatus,
248+
})
249+
);
250+
case 'database':
251+
return [
252+
...itemActionsToContextMenuGroups(
253+
item,
254+
onItemAction,
255+
databaseItemActions({
256+
hasWriteActionsDisabled: item.hasWriteActionsDisabled,
257+
})
258+
),
259+
// Include menu items on the connection level
260+
...getContextMenuGroups(item.connectionItem),
261+
];
262+
default:
263+
return [
264+
...itemActionsToContextMenuGroups(
265+
item,
266+
onItemAction,
267+
collectionItemActions({
268+
hasWriteActionsDisabled: item.hasWriteActionsDisabled,
269+
type: item.type,
270+
isRenameCollectionEnabled,
271+
})
272+
),
273+
// Include menu items on the database (and connection) level
274+
...getContextMenuGroups(item.databaseItem),
275+
];
276+
}
228277
},
229-
[]
278+
[onItemAction]
230279
);
231280

232281
const isTestEnv = process.env.NODE_ENV === 'test';
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import {
2+
splitBySeparator,
3+
type ContextMenuItemGroup,
4+
} from '@mongodb-js/compass-components';
5+
6+
import type { NavigationItemActions } from './item-actions';
7+
import type { Actions } from './constants';
8+
import type { SidebarActionableItem } from './tree-data';
9+
10+
export function itemActionsToContextMenuGroups(
11+
item: SidebarActionableItem,
12+
onItemAction: (item: SidebarActionableItem, action: Actions) => void,
13+
itemActions: NavigationItemActions
14+
): ContextMenuItemGroup[] {
15+
return splitBySeparator<Actions>(itemActions).map((actions) =>
16+
actions.map(({ label, action }) => ({
17+
label,
18+
onAction() {
19+
onItemAction(item, action as Actions);
20+
},
21+
}))
22+
);
23+
}

packages/compass-connections-navigation/src/tree-data.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ export type DatabaseTreeItem = VirtualTreeItem & {
100100
colorCode?: string;
101101
isExpanded: boolean;
102102
connectionId: string;
103+
connectionItem: ConnectedConnectionTreeItem;
103104
dbName: string;
104105
hasWriteActionsDisabled: boolean;
105106
isNonExistent: boolean;
@@ -111,6 +112,7 @@ export type CollectionTreeItem = VirtualTreeItem & {
111112
type: 'collection' | 'view' | 'timeseries';
112113
colorCode?: string;
113114
connectionId: string;
115+
databaseItem: DatabaseTreeItem;
114116
namespace: string;
115117
hasWriteActionsDisabled: boolean;
116118
isNonExistent: boolean;
@@ -240,6 +242,7 @@ const connectedConnectionToItems = ({
240242
databases.flatMap((database, databaseIndex) => {
241243
return databaseToItems({
242244
connectionId: connectionInfo.id,
245+
connectionItem: connectionTI,
243246
database,
244247
expandedItems: expandedItems[connectionInfo.id] || {},
245248
level: 2,
@@ -262,6 +265,7 @@ const databaseToItems = ({
262265
isNonExistent,
263266
},
264267
connectionId,
268+
connectionItem,
265269
expandedItems = {},
266270
level,
267271
colorCode,
@@ -271,6 +275,7 @@ const databaseToItems = ({
271275
}: {
272276
database: Database;
273277
connectionId: string;
278+
connectionItem: ConnectedConnectionTreeItem;
274279
expandedItems?: Record<string, boolean>;
275280
level: number;
276281
colorCode?: string;
@@ -289,6 +294,7 @@ const databaseToItems = ({
289294
isExpanded,
290295
colorCode,
291296
connectionId,
297+
connectionItem,
292298
dbName: id,
293299
isExpandable: true,
294300
hasWriteActionsDisabled,
@@ -330,6 +336,7 @@ const databaseToItems = ({
330336
posInSet: collectionIndex + 1,
331337
colorCode,
332338
connectionId,
339+
databaseItem: databaseTI,
333340
namespace: id,
334341
hasWriteActionsDisabled,
335342
isExpandable: false,

0 commit comments

Comments
 (0)