@jbrowse/plugin-linear-genome-view
Version:
JBrowse 2 linear genome view
101 lines (100 loc) • 4.74 kB
JavaScript
import { jsx as _jsx } from "react/jsx-runtime";
import { useCallback } from 'react';
import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton';
import { getContainingView, getSession } from '@jbrowse/core/util';
import AddIcon from '@mui/icons-material/Add';
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
import KeyboardDoubleArrowDownIcon from '@mui/icons-material/KeyboardDoubleArrowDown';
import KeyboardDoubleArrowUpIcon from '@mui/icons-material/KeyboardDoubleArrowUp';
import LowPriorityIcon from '@mui/icons-material/LowPriority';
import MinimizeIcon from '@mui/icons-material/Minimize';
import MoreVertIcon from '@mui/icons-material/MoreVert';
import PushPinIcon from '@mui/icons-material/PushPin';
import { observer } from 'mobx-react';
const TrackLabelMenu = observer(function TrackLabelMenu({ track, }) {
const view = getContainingView(track);
const session = getSession(track);
const getMenuItems = useCallback(() => {
const trackConf = track.configuration;
const minimized = track.minimized;
const pinned = track.pinned;
const { isTopLevelView } = view;
const trackMenuItems = track.trackMenuItems();
const saveTrackData = trackMenuItems.find(item => 'label' in item && item.label === 'Save track data');
const remainingTrackMenuItems = trackMenuItems.filter(item => !('label' in item) || item.label !== 'Save track data');
const sessionItems = session.getTrackActionMenuItems?.(trackConf, saveTrackData ? [saveTrackData] : []) || [];
return [
{
label: 'Track order',
icon: LowPriorityIcon,
type: 'subMenu',
priority: 1000,
subMenu: [
...(!isTopLevelView
? []
: [
{
label: pinned ? 'Unpin track' : 'Pin track',
icon: PushPinIcon,
onClick: () => {
track.setPinned(!pinned);
},
},
]),
{
label: minimized ? 'Restore track' : 'Minimize track',
icon: minimized ? AddIcon : MinimizeIcon,
onClick: () => {
track.setMinimized(!minimized);
},
},
...(view.tracks.length > 2
? [
{
label: 'Move track to top',
icon: KeyboardDoubleArrowUpIcon,
onClick: () => {
view.moveTrackToTop(track.id);
},
},
]
: []),
...(view.tracks.length > 1
? [
{
label: 'Move track up',
icon: KeyboardArrowUpIcon,
onClick: () => {
view.moveTrackUp(track.id);
},
},
{
label: 'Move track down',
icon: KeyboardArrowDownIcon,
onClick: () => {
view.moveTrackDown(track.id);
},
},
]
: []),
...(view.tracks.length > 2
? [
{
label: 'Move track to bottom',
icon: KeyboardDoubleArrowDownIcon,
onClick: () => {
view.moveTrackToBottom(track.id);
},
},
]
: []),
],
},
...sessionItems,
...remainingTrackMenuItems,
].sort((a, b) => (b.priority || 0) - (a.priority || 0));
}, [track, view, session]);
return (_jsx(CascadingMenuButton, { menuItems: getMenuItems, "data-testid": "track_menu_icon", children: _jsx(MoreVertIcon, { fontSize: "small" }) }));
});
export default TrackLabelMenu;