1- import React , { useEffect } from 'react' ;
1+ import React , { useCallback , useEffect } from 'react' ;
22import { connect } from 'react-redux' ;
33import { type CollectionState , selectTab } from '../modules/collection-tab' ;
44import { css , ErrorBoundary , TabNavBar } from '@mongodb-js/compass-components' ;
@@ -19,6 +19,11 @@ import {
1919 useConnectionSupports ,
2020} from '@mongodb-js/compass-connections/provider' ;
2121import { usePreference } from 'compass-preferences-model/provider' ;
22+ import { useApplicationMenu } from '@mongodb-js/compass-electron-menu' ;
23+ import {
24+ useGlobalAppRegistry ,
25+ useLocalAppRegistry ,
26+ } from '@mongodb-js/compass-app-registry' ;
2227
2328type CollectionSubtabTrackingId = Lowercase < CollectionSubtab > extends infer U
2429 ? U extends string
@@ -228,13 +233,88 @@ const CollectionTabWithMetadata: React.FunctionComponent<
228233 ) ;
229234} ;
230235
236+ // Setup the Electron application menu for the collection tab
237+ function useCollectionTabApplicationMenu (
238+ collectionMetadata : CollectionMetadata | null
239+ ) {
240+ const localAppRegistry = useLocalAppRegistry ( ) ;
241+ const globalAppRegistry = useGlobalAppRegistry ( ) ;
242+ const connectionInfoRef = useConnectionInfoRef ( ) ;
243+ const preferencesReadOnly = usePreference ( 'readOnly' ) ;
244+
245+ const shareSchemaClick = useCallback ( ( ) => {
246+ localAppRegistry . emit ( 'menu-share-schema-json' ) ;
247+ } , [ localAppRegistry ] ) ;
248+
249+ const importClick = useCallback ( ( ) => {
250+ if ( ! collectionMetadata ) return ;
251+ globalAppRegistry . emit (
252+ 'open-import' ,
253+ {
254+ namespace : collectionMetadata . namespace ,
255+ origin : 'menu' ,
256+ } ,
257+ {
258+ connectionId : connectionInfoRef . current . id ,
259+ } ,
260+ { }
261+ ) ;
262+ } , [ collectionMetadata , globalAppRegistry , connectionInfoRef ] ) ;
263+
264+ const exportClick = useCallback ( ( ) => {
265+ if ( ! collectionMetadata ) return ;
266+ globalAppRegistry . emit (
267+ 'open-export' ,
268+ {
269+ exportFullCollection : true ,
270+ namespace : collectionMetadata . namespace ,
271+ origin : 'menu' ,
272+ } ,
273+ {
274+ connectionId : connectionInfoRef . current . id ,
275+ }
276+ ) ;
277+ } , [ collectionMetadata , globalAppRegistry , connectionInfoRef ] ) ;
278+
279+ useApplicationMenu ( {
280+ menu : collectionMetadata
281+ ? {
282+ label : '&Collection' ,
283+ submenu : [
284+ {
285+ label : '&Share Schema as JSON (Legacy)' ,
286+ accelerator : 'Alt+CmdOrCtrl+S' ,
287+ click : shareSchemaClick ,
288+ } ,
289+ {
290+ type : 'separator' ,
291+ } ,
292+ ...( preferencesReadOnly || collectionMetadata ?. isReadonly
293+ ? [ ]
294+ : [
295+ {
296+ label : '&Import Data' ,
297+ click : importClick ,
298+ } ,
299+ ] ) ,
300+ {
301+ label : '&Export Collection' ,
302+ click : exportClick ,
303+ } ,
304+ ] ,
305+ }
306+ : undefined ,
307+ } ) ;
308+ }
309+
231310const CollectionTab = ( {
232311 collectionMetadata,
233312 ...props
234313} : Omit < CollectionTabProps , 'collectionMetadata' > & {
235314 collectionMetadata : CollectionMetadata | null ;
236315} ) => {
237316 const QueryBarPlugin = useCollectionQueryBar ( ) ;
317+ useCollectionTabApplicationMenu ( collectionMetadata ) ;
238318
239319 if ( ! collectionMetadata ) {
240320 return null ;
0 commit comments