@jbrowse/plugin-linear-genome-view 2.7.0 → 2.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/BaseLinearDisplay/components/LinearBlocks.js +1 -1
  2. package/dist/BaseLinearDisplay/components/Tooltip.js +4 -2
  3. package/dist/LinearGenomeView/components/LinearGenomeView.js +29 -7
  4. package/dist/LinearGenomeView/components/OverviewRubberband.js +5 -2
  5. package/dist/LinearGenomeView/components/TrackLabel.js +2 -18
  6. package/dist/LinearGenomeView/components/TrackLabelContainer.js +2 -2
  7. package/dist/LinearGenomeView/components/TrackLabelDragHandle.d.ts +9 -0
  8. package/dist/LinearGenomeView/components/TrackLabelDragHandle.js +32 -0
  9. package/dist/LinearGenomeView/index.d.ts +1 -2
  10. package/dist/LinearGenomeView/index.js +3 -2
  11. package/dist/LinearGenomeView/model.d.ts +7 -1
  12. package/dist/LinearGenomeView/model.js +30 -19
  13. package/dist/LinearGenomeView/svgcomponents/SVGTrackLabel.js +3 -1
  14. package/dist/index.d.ts +52 -15
  15. package/dist/index.js +19 -0
  16. package/esm/BaseLinearDisplay/components/LinearBlocks.js +1 -1
  17. package/esm/BaseLinearDisplay/components/Tooltip.js +4 -2
  18. package/esm/LinearGenomeView/components/LinearGenomeView.js +29 -7
  19. package/esm/LinearGenomeView/components/OverviewRubberband.js +5 -2
  20. package/esm/LinearGenomeView/components/TrackLabel.js +2 -18
  21. package/esm/LinearGenomeView/components/TrackLabelContainer.js +2 -2
  22. package/esm/LinearGenomeView/components/TrackLabelDragHandle.d.ts +9 -0
  23. package/esm/LinearGenomeView/components/TrackLabelDragHandle.js +27 -0
  24. package/esm/LinearGenomeView/index.d.ts +1 -2
  25. package/esm/LinearGenomeView/index.js +2 -2
  26. package/esm/LinearGenomeView/model.d.ts +7 -1
  27. package/esm/LinearGenomeView/model.js +30 -19
  28. package/esm/LinearGenomeView/svgcomponents/SVGTrackLabel.js +3 -1
  29. package/esm/index.d.ts +52 -15
  30. package/esm/index.js +19 -0
  31. package/package.json +2 -2
@@ -51,7 +51,7 @@ const RenderedBlocks = (0, mobx_react_1.observer)(function ({ model, }) {
51
51
  if (block instanceof blockTypes_1.InterRegionPaddingBlock) {
52
52
  return (react_1.default.createElement(Block_1.InterRegionPaddingBlock, { key: block.key, width: block.widthPx, style: { background: 'none' }, boundary: block.variant === 'boundary' }));
53
53
  }
54
- throw new Error(`invalid block type ${typeof block}`);
54
+ throw new Error(`invalid block type ${JSON.stringify(block)}`);
55
55
  })));
56
56
  });
57
57
  exports.RenderedBlocks = RenderedBlocks;
@@ -53,7 +53,8 @@ const TooltipContents = react_1.default.forwardRef(function TooltipContents2({ m
53
53
  return (react_1.default.createElement("div", { ref: ref }, react_1.default.isValidElement(message) ? (message) : message ? (react_1.default.createElement(ui_1.SanitizedHTML, { html: String(message) })) : null));
54
54
  });
55
55
  const Tooltip = (0, mobx_react_1.observer)(({ model, clientMouseCoord, }) => {
56
- const { classes } = useStyles();
56
+ var _a, _b;
57
+ const { theme, classes } = useStyles();
57
58
  const { featureUnderMouse } = model;
58
59
  const [width, setWidth] = (0, react_1.useState)(0);
59
60
  const [popperElt, setPopperElt] = (0, react_1.useState)(null);
@@ -79,7 +80,8 @@ const Tooltip = (0, mobx_react_1.observer)(({ model, clientMouseCoord, }) => {
79
80
  const contents = featureUnderMouse
80
81
  ? (0, configuration_1.getConf)(model, 'mouseover', { feature: featureUnderMouse })
81
82
  : undefined;
82
- return featureUnderMouse && contents ? (react_1.default.createElement(material_1.Portal, null,
83
+ const popperTheme = (_a = theme === null || theme === void 0 ? void 0 : theme.components) === null || _a === void 0 ? void 0 : _a.MuiPopper;
84
+ return featureUnderMouse && contents ? (react_1.default.createElement(material_1.Portal, { container: (_b = popperTheme === null || popperTheme === void 0 ? void 0 : popperTheme.defaultProps) === null || _b === void 0 ? void 0 : _b.container },
83
85
  react_1.default.createElement("div", { ref: setPopperElt, className: classes.tooltip,
84
86
  // zIndex needed to go over widget drawer
85
87
  style: { ...styles.popper, zIndex: 100000 }, ...attributes.popper },
@@ -30,12 +30,12 @@ const react_1 = __importStar(require("react"));
30
30
  const material_1 = require("@mui/material");
31
31
  const mui_1 = require("tss-react/mui");
32
32
  const ui_1 = require("@jbrowse/core/ui");
33
+ const util_1 = require("@jbrowse/core/util");
33
34
  const mobx_react_1 = require("mobx-react");
34
35
  // icons
35
36
  const Icons_1 = require("@jbrowse/core/ui/Icons");
36
37
  const TrackContainer_1 = __importDefault(require("./TrackContainer"));
37
38
  const TracksContainer_1 = __importDefault(require("./TracksContainer"));
38
- const util_1 = require("@jbrowse/core/util");
39
39
  const ImportForm = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./ImportForm'))));
40
40
  const useStyles = (0, mui_1.makeStyles)()(theme => ({
41
41
  note: {
@@ -43,14 +43,28 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
43
43
  paddingTop: theme.spacing(1),
44
44
  paddingBottom: theme.spacing(1),
45
45
  },
46
+ rel: {
47
+ position: 'relative',
48
+ },
49
+ top: {
50
+ zIndex: 1000,
51
+ },
46
52
  }));
53
+ function NoTracksActive({ model }) {
54
+ const { classes } = useStyles();
55
+ const { hideNoTracksActive } = model;
56
+ return (react_1.default.createElement(material_1.Paper, { className: classes.note }, !hideNoTracksActive ? (react_1.default.createElement(react_1.default.Fragment, null,
57
+ react_1.default.createElement(material_1.Typography, null, "No tracks active."),
58
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", onClick: () => model.activateTrackSelector(), className: classes.top, startIcon: react_1.default.createElement(Icons_1.TrackSelector, null) }, "Open track selector"))) : (react_1.default.createElement("div", { style: { height: '48px' } }))));
59
+ }
47
60
  const LinearGenomeView = (0, mobx_react_1.observer)(({ model }) => {
48
61
  const { tracks, error, initialized, hasDisplayedRegions } = model;
49
- const { classes } = useStyles();
50
62
  const ref = (0, react_1.useRef)(null);
51
63
  const session = (0, util_1.getSession)(model);
64
+ const { classes } = useStyles();
52
65
  (0, react_1.useEffect)(() => {
53
- // sets the focused view id based on a click within the LGV; necessary for subviews to be focused properly
66
+ // sets the focused view id based on a click within the LGV;
67
+ // necessary for subviews to be focused properly
54
68
  function handleSelectView(e) {
55
69
  var _a, _b;
56
70
  if (e.target instanceof Element && ((_a = ref === null || ref === void 0 ? void 0 : ref.current) === null || _a === void 0 ? void 0 : _a.contains(e.target))) {
@@ -72,11 +86,19 @@ const LinearGenomeView = (0, mobx_react_1.observer)(({ model }) => {
72
86
  }
73
87
  const MiniControlsComponent = model.MiniControlsComponent();
74
88
  const HeaderComponent = model.HeaderComponent();
75
- return (react_1.default.createElement("div", { style: { position: 'relative' }, ref: ref },
89
+ return (react_1.default.createElement("div", { className: classes.rel, ref: ref, onMouseLeave: () => session.setHovered(undefined), onMouseMove: event => {
90
+ const c = ref.current;
91
+ if (!c) {
92
+ return;
93
+ }
94
+ const { tracks } = model;
95
+ const leftPx = event.clientX - c.getBoundingClientRect().left;
96
+ const hoverPosition = model.pxToBp(leftPx);
97
+ const hoverFeature = tracks.find(t => t.displays[0].featureUnderMouse);
98
+ session.setHovered({ hoverPosition, hoverFeature });
99
+ } },
76
100
  react_1.default.createElement(HeaderComponent, { model: model }),
77
101
  react_1.default.createElement(MiniControlsComponent, { model: model }),
78
- react_1.default.createElement(TracksContainer_1.default, { model: model }, !tracks.length ? (react_1.default.createElement(material_1.Paper, { variant: "outlined", className: classes.note }, !model.hideNoTracksActive ? (react_1.default.createElement(react_1.default.Fragment, null,
79
- react_1.default.createElement(material_1.Typography, null, "No tracks active."),
80
- react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", onClick: model.activateTrackSelector, style: { zIndex: 1000 }, startIcon: react_1.default.createElement(Icons_1.TrackSelector, null) }, "Open track selector"))) : (react_1.default.createElement("div", { style: { height: '48px' } })))) : (tracks.map(track => (react_1.default.createElement(TrackContainer_1.default, { key: track.id, model: model, track: track })))))));
102
+ react_1.default.createElement(TracksContainer_1.default, { model: model }, !tracks.length ? (react_1.default.createElement(NoTracksActive, { model: model })) : (tracks.map(track => (react_1.default.createElement(TrackContainer_1.default, { key: track.id, model: model, track: track })))))));
81
103
  });
82
104
  exports.default = LinearGenomeView;
@@ -46,6 +46,9 @@ const useStyles = (0, mui_1.makeStyles)()({
46
46
  position: 'absolute',
47
47
  zIndex: 10,
48
48
  },
49
+ rel: {
50
+ position: 'relative',
51
+ },
49
52
  });
50
53
  const HoverTooltip = (0, mobx_react_1.observer)(function ({ model, open, guideX, overview, }) {
51
54
  var _a;
@@ -131,7 +134,7 @@ const OverviewRubberband = (0, mobx_react_1.observer)(function OverviewRubberban
131
134
  setGuideX(undefined);
132
135
  }
133
136
  if (startX === undefined) {
134
- return (react_1.default.createElement("div", { style: { position: 'relative' } },
137
+ return (react_1.default.createElement("div", { className: classes.rel },
135
138
  guideX !== undefined ? (react_1.default.createElement(HoverTooltip, { model: model, open: !mouseDragging, overview: overview, guideX: guideX })) : null,
136
139
  react_1.default.createElement("div", { className: classes.rubberbandControl, ref: controlsRef, onMouseDown: mouseDown, onMouseOut: mouseOut, onMouseMove: mouseMove }, ControlComponent)));
137
140
  }
@@ -152,7 +155,7 @@ const OverviewRubberband = (0, mobx_react_1.observer)(function OverviewRubberban
152
155
  [leftBpOffset, rightBpOffset] = [rightBpOffset, leftBpOffset];
153
156
  }
154
157
  }
155
- return (react_1.default.createElement("div", { style: { position: 'relative' } },
158
+ return (react_1.default.createElement("div", { className: classes.rel },
156
159
  leftBpOffset && rightBpOffset ? (react_1.default.createElement(RubberbandSpan_1.default, { leftBpOffset: leftBpOffset, rightBpOffset: rightBpOffset, width: Math.abs(width), left: left })) : null,
157
160
  react_1.default.createElement("div", { "data-testid": "rubberband_controls", className: classes.rubberbandControl, ref: controlsRef, onMouseDown: mouseDown, onMouseOut: mouseOut, onMouseMove: mouseMove }, ControlComponent)));
158
161
  });
@@ -14,10 +14,10 @@ const ui_1 = require("@jbrowse/core/ui");
14
14
  const CascadingMenuButton_1 = __importDefault(require("@jbrowse/core/ui/CascadingMenuButton"));
15
15
  // icons
16
16
  const MoreVert_1 = __importDefault(require("@mui/icons-material/MoreVert"));
17
- const DragIndicator_1 = __importDefault(require("@mui/icons-material/DragIndicator"));
18
17
  const Close_1 = __importDefault(require("@mui/icons-material/Close"));
19
18
  const Minimize_1 = __importDefault(require("@mui/icons-material/Minimize"));
20
19
  const Add_1 = __importDefault(require("@mui/icons-material/Add"));
20
+ const TrackLabelDragHandle_1 = __importDefault(require("./TrackLabelDragHandle"));
21
21
  const useStyles = (0, mui_1.makeStyles)()(theme => ({
22
22
  root: {
23
23
  background: (0, material_1.alpha)(theme.palette.background.paper, 0.8),
@@ -34,14 +34,6 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
34
34
  fontSize: '0.8rem',
35
35
  pointerEvents: 'none',
36
36
  },
37
- dragHandle: {
38
- cursor: 'grab',
39
- },
40
- dragHandleIcon: {
41
- display: 'inline-block',
42
- verticalAlign: 'middle',
43
- pointerEvents: 'none',
44
- },
45
37
  iconButton: {
46
38
  padding: theme.spacing(1),
47
39
  },
@@ -65,15 +57,7 @@ const TrackLabel = (0, mobx_react_1.observer)(react_1.default.forwardRef(functio
65
57
  ...track.trackMenuItems(),
66
58
  ].sort((a, b) => ((b === null || b === void 0 ? void 0 : b.priority) || 0) - ((a === null || a === void 0 ? void 0 : a.priority) || 0));
67
59
  return (react_1.default.createElement(material_1.Paper, { ref: ref, className: cx(className, classes.root) },
68
- react_1.default.createElement("span", { draggable: true, className: classes.dragHandle, onDragStart: event => {
69
- const target = event.currentTarget;
70
- if (target.parentNode) {
71
- const parent = target.parentNode;
72
- event.dataTransfer.setDragImage(parent, 20, 20);
73
- view.setDraggingTrackId(track.id);
74
- }
75
- }, onDragEnd: () => view.setDraggingTrackId(undefined), "data-testid": `dragHandle-${view.id}-${trackId}` },
76
- react_1.default.createElement(DragIndicator_1.default, { className: classes.dragHandleIcon, fontSize: "small" })),
60
+ react_1.default.createElement(TrackLabelDragHandle_1.default, { track: track, trackId: trackId, view: view }),
77
61
  react_1.default.createElement(material_1.IconButton, { onClick: () => view.hideTrack(trackId), className: classes.iconButton, title: "close this track" },
78
62
  react_1.default.createElement(Close_1.default, { fontSize: "small" })),
79
63
  react_1.default.createElement(material_1.Typography, { variant: "body1", component: "span", className: classes.trackName },
@@ -23,9 +23,9 @@ const TrackLabelContainer = (0, mobx_react_1.observer)(function ({ track, view,
23
23
  const { classes, cx } = useStyles();
24
24
  const display = track.displays[0];
25
25
  const { trackLabel, trackLabelOverlap, trackLabelOffset } = classes;
26
- const labelStyle = view.trackLabels !== 'overlapping' || display.prefersOffset
26
+ const labelStyle = view.trackLabelsSetting !== 'overlapping' || display.prefersOffset
27
27
  ? trackLabelOffset
28
28
  : trackLabelOverlap;
29
- return view.trackLabels !== 'hidden' ? (react_1.default.createElement(TrackLabel_1.default, { track: track, className: cx(trackLabel, labelStyle) })) : null;
29
+ return view.trackLabelsSetting !== 'hidden' ? (react_1.default.createElement(TrackLabel_1.default, { track: track, className: cx(trackLabel, labelStyle) })) : null;
30
30
  });
31
31
  exports.default = TrackLabelContainer;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { BaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models';
3
+ import { LinearGenomeViewModel } from '..';
4
+ declare function TrackLabelDragHandle({ trackId, view, track, }: {
5
+ trackId: string;
6
+ track: BaseTrackModel;
7
+ view: LinearGenomeViewModel;
8
+ }): React.JSX.Element;
9
+ export default TrackLabelDragHandle;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const mui_1 = require("tss-react/mui");
8
+ // icons
9
+ const DragIndicator_1 = __importDefault(require("@mui/icons-material/DragIndicator"));
10
+ const useStyles = (0, mui_1.makeStyles)()({
11
+ dragHandle: {
12
+ cursor: 'grab',
13
+ },
14
+ dragHandleIcon: {
15
+ display: 'inline-block',
16
+ verticalAlign: 'middle',
17
+ pointerEvents: 'none',
18
+ },
19
+ });
20
+ function TrackLabelDragHandle({ trackId, view, track, }) {
21
+ const { classes } = useStyles();
22
+ return (react_1.default.createElement("span", { draggable: true, className: classes.dragHandle, onDragStart: event => {
23
+ const target = event.currentTarget;
24
+ if (target.parentNode) {
25
+ const parent = target.parentNode;
26
+ event.dataTransfer.setDragImage(parent, 20, 20);
27
+ view.setDraggingTrackId(track.id);
28
+ }
29
+ }, onDragEnd: () => view.setDraggingTrackId(undefined), "data-testid": `dragHandle-${view.id}-${trackId}` },
30
+ react_1.default.createElement(DragIndicator_1.default, { className: classes.dragHandleIcon, fontSize: "small" })));
31
+ }
32
+ exports.default = TrackLabelDragHandle;
@@ -1,4 +1,3 @@
1
1
  import PluginManager from '@jbrowse/core/PluginManager';
2
- declare const _default: (pluginManager: PluginManager) => void;
3
- export default _default;
2
+ export default function LinearGenomeViewF(pluginManager: PluginManager): void;
4
3
  export * from './model';
@@ -29,7 +29,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const react_1 = require("react");
30
30
  const pluggableElementTypes_1 = require("@jbrowse/core/pluggableElementTypes");
31
31
  const model_1 = require("./model");
32
- exports.default = (pluginManager) => {
32
+ function LinearGenomeViewF(pluginManager) {
33
33
  pluginManager.addViewType(() => {
34
34
  return new pluggableElementTypes_1.ViewType({
35
35
  name: 'LinearGenomeView',
@@ -38,5 +38,6 @@ exports.default = (pluginManager) => {
38
38
  ReactComponent: (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./components/LinearGenomeView')))),
39
39
  });
40
40
  });
41
- };
41
+ }
42
+ exports.default = LinearGenomeViewF;
42
43
  __exportStar(require("./model"), exports);
@@ -71,9 +71,9 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
71
71
  hideHeaderOverview: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
72
72
  hideNoTracksActive: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
73
73
  trackSelectorType: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
74
- trackLabels: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
75
74
  showCenterLine: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
76
75
  showCytobandsSetting: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
76
+ trackLabels: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
77
77
  showGridlines: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
78
78
  }, {
79
79
  width: number;
@@ -96,6 +96,12 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
96
96
  leftOffset: BpOffset | undefined;
97
97
  rightOffset: BpOffset | undefined;
98
98
  } & {
99
+ /**
100
+ * #getter
101
+ * this is the effective value of the track labels setting, incorporating
102
+ * both the config and view state. use this instead of view.trackLabels
103
+ */
104
+ readonly trackLabelsSetting: any;
99
105
  /**
100
106
  * #getter
101
107
  */
@@ -85,7 +85,7 @@ exports.WIDGET_HEIGHT = 32;
85
85
  */
86
86
  function stateModelFactory(pluginManager) {
87
87
  return mobx_state_tree_1.types
88
- .compose(models_1.BaseViewModel, mobx_state_tree_1.types.model('LinearGenomeView', {
88
+ .compose('LinearGenomeView', models_1.BaseViewModel, mobx_state_tree_1.types.model({
89
89
  /**
90
90
  * #property
91
91
  */
@@ -137,12 +137,6 @@ function stateModelFactory(pluginManager) {
137
137
  * #property
138
138
  */
139
139
  trackSelectorType: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.enumeration(['hierarchical']), 'hierarchical'),
140
- /**
141
- * #property
142
- * how to display the track labels, can be "overlapping", "offset", or
143
- * "hidden"
144
- */
145
- trackLabels: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.string, () => (0, util_1.localStorageGetItem)('lgv-trackLabels') || 'overlapping'),
146
140
  /**
147
141
  * #property
148
142
  * show the "center line"
@@ -153,6 +147,15 @@ function stateModelFactory(pluginManager) {
153
147
  * show the "cytobands" in the overview scale bar
154
148
  */
155
149
  showCytobandsSetting: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.boolean, () => Boolean(JSON.parse((0, util_1.localStorageGetItem)('lgv-showCytobands') || 'true'))),
150
+ /**
151
+ * #property
152
+ * how to display the track labels, can be "overlapping", "offset", or
153
+ * "hidden", or empty string "" (which results in conf being used). see
154
+ * LinearGenomeViewPlugin
155
+ * https://jbrowse.org/jb2/docs/config/lineargenomeviewplugin/ docs for
156
+ * how conf is used
157
+ */
158
+ trackLabels: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.string, () => (0, util_1.localStorageGetItem)('lgv-trackLabels') || ''),
156
159
  /**
157
160
  * #property
158
161
  * show the "gridlines" in the track area
@@ -175,6 +178,18 @@ function stateModelFactory(pluginManager) {
175
178
  rightOffset: undefined,
176
179
  }))
177
180
  .views(self => ({
181
+ /**
182
+ * #getter
183
+ * this is the effective value of the track labels setting, incorporating
184
+ * both the config and view state. use this instead of view.trackLabels
185
+ */
186
+ get trackLabelsSetting() {
187
+ const sessionSetting = (0, configuration_1.getConf)((0, util_1.getSession)(self), [
188
+ 'LinearGenomeViewPlugin',
189
+ 'trackLabels',
190
+ ]);
191
+ return self.trackLabels || sessionSetting;
192
+ },
178
193
  /**
179
194
  * #getter
180
195
  */
@@ -615,6 +630,7 @@ function stateModelFactory(pluginManager) {
615
630
  * #action
616
631
  */
617
632
  setTrackLabels(setting) {
633
+ localStorage.setItem('lgv-trackLabels', setting);
618
634
  self.trackLabels = setting;
619
635
  },
620
636
  /**
@@ -945,21 +961,21 @@ function stateModelFactory(pluginManager) {
945
961
  label: 'Overlapping',
946
962
  icon: Visibility_1.default,
947
963
  type: 'radio',
948
- checked: self.trackLabels === 'overlapping',
964
+ checked: self.trackLabelsSetting === 'overlapping',
949
965
  onClick: () => self.setTrackLabels('overlapping'),
950
966
  },
951
967
  {
952
968
  label: 'Offset',
953
969
  icon: Visibility_1.default,
954
970
  type: 'radio',
955
- checked: self.trackLabels === 'offset',
971
+ checked: self.trackLabelsSetting === 'offset',
956
972
  onClick: () => self.setTrackLabels('offset'),
957
973
  },
958
974
  {
959
975
  label: 'Hidden',
960
976
  icon: Visibility_1.default,
961
977
  type: 'radio',
962
- checked: self.trackLabels === 'hidden',
978
+ checked: self.trackLabelsSetting === 'hidden',
963
979
  onClick: () => self.setTrackLabels('hidden'),
964
980
  },
965
981
  ],
@@ -1050,9 +1066,8 @@ function stateModelFactory(pluginManager) {
1050
1066
  }, { delay: 150 }));
1051
1067
  (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(() => {
1052
1068
  const s = (s) => JSON.stringify(s);
1053
- const { trackLabels, showCytobandsSetting, showCenterLine } = self;
1069
+ const { showCytobandsSetting, showCenterLine } = self;
1054
1070
  if (typeof localStorage !== 'undefined') {
1055
- localStorage.setItem('lgv-trackLabels', trackLabels);
1056
1071
  localStorage.setItem('lgv-showCytobands', s(showCytobandsSetting));
1057
1072
  localStorage.setItem('lgv-showCenterLine', s(showCenterLine));
1058
1073
  }
@@ -1264,22 +1279,18 @@ function stateModelFactory(pluginManager) {
1264
1279
  if (session.focusedViewId === self.id && (e.ctrlKey || e.metaKey)) {
1265
1280
  if (e.code === 'ArrowLeft') {
1266
1281
  e.preventDefault();
1267
- // pan left
1268
1282
  self.slide(-0.9);
1269
1283
  }
1270
- if (e.code === 'ArrowRight') {
1284
+ else if (e.code === 'ArrowRight') {
1271
1285
  e.preventDefault();
1272
- // pan right
1273
1286
  self.slide(0.9);
1274
1287
  }
1275
- if (e.code === 'ArrowUp' && self.scaleFactor === 1) {
1288
+ else if (e.code === 'ArrowUp' && self.scaleFactor === 1) {
1276
1289
  e.preventDefault();
1277
- // zoom in
1278
1290
  self.zoom(self.bpPerPx / 2);
1279
1291
  }
1280
- if (e.code === 'ArrowDown' && self.scaleFactor === 1) {
1292
+ else if (e.code === 'ArrowDown' && self.scaleFactor === 1) {
1281
1293
  e.preventDefault();
1282
- // zoom out
1283
1294
  self.zoom(self.bpPerPx * 2);
1284
1295
  }
1285
1296
  }
@@ -5,11 +5,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const material_1 = require("@mui/material");
8
+ const util_1 = require("@jbrowse/core/util");
8
9
  function SVGTrackLabel({ trackLabels, trackName, fontSize, trackLabelOffset, x, }) {
9
10
  const theme = (0, material_1.useTheme)();
10
11
  const fill = theme.palette.text.primary;
11
12
  const xoff = trackLabels === 'overlay' ? 5 : 0;
12
13
  const yoff = trackLabels === 'offset' ? 5 : 0;
13
- return trackLabels !== 'none' ? (react_1.default.createElement("g", null, trackLabels === 'left' ? (react_1.default.createElement("text", { x: trackLabelOffset - 40, y: 20, fill: fill, fontSize: fontSize, dominantBaseline: "hanging", textAnchor: "end" }, trackName)) : (react_1.default.createElement("text", { x: x + xoff, y: yoff, fill: fill, fontSize: fontSize, dominantBaseline: "hanging" }, trackName)))) : null;
14
+ const name = (0, util_1.coarseStripHTML)(trackName);
15
+ return trackLabels !== 'none' ? (react_1.default.createElement("g", null, trackLabels === 'left' ? (react_1.default.createElement("text", { x: trackLabelOffset - 40, y: 20, fill: fill, fontSize: fontSize, dominantBaseline: "hanging", textAnchor: "end" }, name)) : (react_1.default.createElement("text", { x: x + xoff, y: yoff, fill: fill, fontSize: fontSize, dominantBaseline: "hanging" }, name)))) : null;
14
16
  }
15
17
  exports.default = SVGTrackLabel;