Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Distinguish between SessionWithConnections and SessionWithConnectionEditing #3741

Merged
merged 1 commit into from Jun 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 11 additions & 3 deletions packages/core/util/types/index.ts
Expand Up @@ -192,14 +192,22 @@ export function isSessionModelWithWidgets(
): thing is SessionWithWidgets {
return isSessionModel(thing) && 'widgets' in thing
}

interface SessionWithConnections {
addConnectionConf: (arg: AnyConfigurationModel) => void
makeConnection: (arg: AnyConfigurationModel) => void
}

export function isSessionModelWithConnections(
thing: unknown,
): thing is SessionWithConnections {
return isSessionModel(thing) && 'makeConnection' in thing
}

interface SessionWithConnectionEditing {
addConnectionConf: (arg: AnyConfigurationModel) => void
}

export function isSessionModelWithConnectionEditing(
thing: unknown,
): thing is SessionWithConnectionEditing {
return isSessionModel(thing) && 'addConnectionConf' in thing
}

Expand Down
@@ -1,31 +1,29 @@
import React from 'react'
import {
Dialog,
DialogTitle,
DialogContent,
DialogContentText,
Button,
List,
ListItem,
DialogActions,
} from '@mui/material'
import { Dialog } from '@jbrowse/core/ui'
import { observer } from 'mobx-react'

function CloseConnectionDialog({
export default observer(function CloseConnectionDialog({
modalInfo = {},
setModalInfo,
onClose,
}: {
modalInfo?: {
name?: string
dereferenceTypeCount?: { [key: string]: number }
safelyBreakConnection?: Function
safelyBreakConnection?: () => void
}
setModalInfo: Function
onClose: () => void
}) {
const { name, dereferenceTypeCount, safelyBreakConnection } = modalInfo
return (
<Dialog open>
<DialogTitle>Close connection &quot;{name}&quot;</DialogTitle>
<Dialog open maxWidth="lg" title={`Close connection "${name}"`}>
<DialogContent>
{dereferenceTypeCount ? (
<>
Expand All @@ -44,7 +42,7 @@ function CloseConnectionDialog({
</DialogContentText>
</DialogContent>
<DialogActions>
<Button onClick={() => setModalInfo()} color="primary">
<Button onClick={() => onClose()} color="primary">
Cancel
</Button>
<Button
Expand All @@ -53,7 +51,7 @@ function CloseConnectionDialog({
modalInfo
? () => {
safelyBreakConnection?.()
setModalInfo()
onClose()
}
: () => {}
}
Expand All @@ -64,6 +62,4 @@ function CloseConnectionDialog({
</DialogActions>
</Dialog>
)
}

export default observer(CloseConnectionDialog)
})
Expand Up @@ -5,9 +5,10 @@ import { observer } from 'mobx-react'
import JBrowseMenu from '@jbrowse/core/ui/Menu'
import {
getSession,
isSessionModelWithConnectionEditing,
isSessionModelWithConnections,
isSessionModelWithWidgets,
isSessionWithAddTracks,
isSessionModelWithConnections,
} from '@jbrowse/core/util'
import {
AnyConfigurationModel,
Expand Down Expand Up @@ -43,7 +44,7 @@ const useStyles = makeStyles()(theme => ({

interface ModalArgs {
connectionConf: AnyConfigurationModel
safelyBreakConnection: Function
safelyBreakConnection: () => void
dereferenceTypeCount: { [key: string]: number }
name: string
}
Expand Down Expand Up @@ -90,46 +91,6 @@ export default observer(function HamburgerMenu({
}
}

const connectionMenuItems = [
{
label: 'Turn on/off connections...',
onClick: () => setConnectionToggleOpen(true),
},
]

if (isSessionModelWithConnections(session)) {
connectionMenuItems.unshift({
label: 'Add connection...',
onClick: () => {
if (isSessionModelWithWidgets(session)) {
session.showWidget(
session.addWidget('AddConnectionWidget', 'addConnectionWidget'),
)
}
},
})

connectionMenuItems.push({
label: 'Delete connections...',
onClick: () => setConnectionManagerOpen(true),
})
}

const trackMenuItems = [
{
label: 'Add track...',
onClick: () => {
if (isSessionModelWithWidgets(session)) {
session.showWidget(
session.addWidget('AddTrackWidget', 'addTrackWidget', {
view: model.view.id,
}),
)
}
},
},
]

return (
<>
<IconButton
Expand All @@ -148,15 +109,58 @@ export default observer(function HamburgerMenu({
}}
onClose={() => setMenuEl(undefined)}
menuItems={[
...(isSessionWithAddTracks(session) ? trackMenuItems : []),
...(session.makeConnection ? connectionMenuItems : []),
...(isSessionWithAddTracks(session)
? [
{
label: 'Add track...',
onClick: () => {
if (isSessionModelWithWidgets(session)) {
session.showWidget(
session.addWidget('AddTrackWidget', 'addTrackWidget', {
view: model.view.id,
}),
)
}
},
},
]
: []),
...(isSessionModelWithConnections(session)
? [
{
label: 'Turn on/off connections...',
onClick: () => setConnectionToggleOpen(true),
},
]
: []),
...(isSessionModelWithConnectionEditing(session)
? [
{
label: 'Add connection...',
onClick: () => {
if (isSessionModelWithWidgets(session)) {
session.showWidget(
session.addWidget(
'AddConnectionWidget',
'addConnectionWidget',
),
)
}
},
},
{
label: 'Delete connections...',
onClick: () => setConnectionManagerOpen(true),
},
]
: []),
]}
/>
<Suspense fallback={<div />}>
<Suspense fallback={<React.Fragment />}>
{modalInfo ? (
<CloseConnectionDlg
modalInfo={modalInfo}
setModalInfo={setModalInfo}
onClose={() => setModalInfo(undefined)}
/>
) : null}
{deleteDlgDetails ? (
Expand Down