@jbrowse/plugin-linear-genome-view 2.10.3 → 2.11.1

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 (80) hide show
  1. package/dist/BaseLinearDisplay/components/Tooltip.js +1 -0
  2. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js +0 -1
  3. package/dist/BasicTrack/index.d.ts +1 -2
  4. package/dist/BasicTrack/index.js +3 -2
  5. package/dist/FeatureTrack/index.d.ts +1 -2
  6. package/dist/FeatureTrack/index.js +3 -2
  7. package/dist/LaunchLinearGenomeView/index.d.ts +1 -2
  8. package/dist/LaunchLinearGenomeView/index.js +17 -8
  9. package/dist/LinearBareDisplay/index.d.ts +1 -2
  10. package/dist/LinearBareDisplay/index.js +3 -2
  11. package/dist/LinearBasicDisplay/components/SetMaxHeight.d.ts +1 -1
  12. package/dist/LinearBasicDisplay/index.d.ts +1 -2
  13. package/dist/LinearBasicDisplay/index.js +3 -2
  14. package/dist/LinearGenomeView/components/Cytobands.d.ts +1 -125
  15. package/dist/LinearGenomeView/components/Cytobands.js +11 -12
  16. package/dist/LinearGenomeView/components/ExportSvgDialog.js +9 -5
  17. package/dist/LinearGenomeView/components/Highlight.d.ts +3 -3
  18. package/dist/LinearGenomeView/components/Highlight.js +21 -17
  19. package/dist/LinearGenomeView/components/MiniControls.js +13 -15
  20. package/dist/LinearGenomeView/components/OverviewHighlight.d.ts +1 -1
  21. package/dist/LinearGenomeView/components/OverviewHighlight.js +20 -11
  22. package/dist/LinearGenomeView/components/OverviewRubberband.d.ts +1 -1
  23. package/dist/LinearGenomeView/components/OverviewScalebar.js +4 -1
  24. package/dist/LinearGenomeView/components/OverviewScalebarPolygon.d.ts +1 -1
  25. package/dist/LinearGenomeView/components/OverviewScalebarPolygon.js +2 -1
  26. package/dist/LinearGenomeView/components/RefNameAutocomplete/index.d.ts +9 -9
  27. package/dist/LinearGenomeView/components/RefNameAutocomplete/index.js +28 -35
  28. package/dist/LinearGenomeView/components/Rubberband.d.ts +1 -1
  29. package/dist/LinearGenomeView/components/SearchBox.d.ts +1 -1
  30. package/dist/LinearGenomeView/components/SearchResultsTable.js +1 -1
  31. package/dist/LinearGenomeView/components/TrackContainer.js +10 -23
  32. package/dist/LinearGenomeView/components/TrackLabel.js +33 -6
  33. package/dist/LinearGenomeView/components/ZoomControls.js +4 -4
  34. package/dist/LinearGenomeView/model.d.ts +67 -7
  35. package/dist/LinearGenomeView/model.js +102 -16
  36. package/dist/LinearGenomeView/svgcomponents/SVGHeader.js +1 -1
  37. package/dist/LinearGenomeView/svgcomponents/SVGLinearGenomeView.js +1 -1
  38. package/dist/LinearGenomeView/svgcomponents/SVGTrackLabel.js +1 -1
  39. package/dist/index.d.ts +159 -21
  40. package/esm/BaseLinearDisplay/components/Tooltip.js +1 -0
  41. package/esm/BaseLinearDisplay/models/serverSideRenderedBlock.js +0 -1
  42. package/esm/BasicTrack/index.d.ts +1 -2
  43. package/esm/BasicTrack/index.js +2 -2
  44. package/esm/FeatureTrack/index.d.ts +1 -2
  45. package/esm/FeatureTrack/index.js +2 -2
  46. package/esm/LaunchLinearGenomeView/index.d.ts +1 -2
  47. package/esm/LaunchLinearGenomeView/index.js +16 -8
  48. package/esm/LinearBareDisplay/index.d.ts +1 -2
  49. package/esm/LinearBareDisplay/index.js +2 -2
  50. package/esm/LinearBasicDisplay/components/SetMaxHeight.d.ts +1 -1
  51. package/esm/LinearBasicDisplay/index.d.ts +1 -2
  52. package/esm/LinearBasicDisplay/index.js +2 -2
  53. package/esm/LinearGenomeView/components/Cytobands.d.ts +1 -125
  54. package/esm/LinearGenomeView/components/Cytobands.js +11 -12
  55. package/esm/LinearGenomeView/components/ExportSvgDialog.js +9 -5
  56. package/esm/LinearGenomeView/components/Highlight.d.ts +3 -3
  57. package/esm/LinearGenomeView/components/Highlight.js +21 -17
  58. package/esm/LinearGenomeView/components/MiniControls.js +14 -16
  59. package/esm/LinearGenomeView/components/OverviewHighlight.d.ts +1 -1
  60. package/esm/LinearGenomeView/components/OverviewHighlight.js +20 -11
  61. package/esm/LinearGenomeView/components/OverviewRubberband.d.ts +1 -1
  62. package/esm/LinearGenomeView/components/OverviewScalebar.js +5 -2
  63. package/esm/LinearGenomeView/components/OverviewScalebarPolygon.d.ts +1 -1
  64. package/esm/LinearGenomeView/components/OverviewScalebarPolygon.js +2 -1
  65. package/esm/LinearGenomeView/components/RefNameAutocomplete/index.d.ts +9 -9
  66. package/esm/LinearGenomeView/components/RefNameAutocomplete/index.js +28 -35
  67. package/esm/LinearGenomeView/components/Rubberband.d.ts +1 -1
  68. package/esm/LinearGenomeView/components/SearchBox.d.ts +1 -1
  69. package/esm/LinearGenomeView/components/SearchResultsTable.js +1 -1
  70. package/esm/LinearGenomeView/components/TrackContainer.js +10 -23
  71. package/esm/LinearGenomeView/components/TrackLabel.js +33 -6
  72. package/esm/LinearGenomeView/components/TracksContainer.js +2 -2
  73. package/esm/LinearGenomeView/components/ZoomControls.js +4 -4
  74. package/esm/LinearGenomeView/model.d.ts +67 -7
  75. package/esm/LinearGenomeView/model.js +103 -17
  76. package/esm/LinearGenomeView/svgcomponents/SVGHeader.js +1 -1
  77. package/esm/LinearGenomeView/svgcomponents/SVGLinearGenomeView.js +1 -1
  78. package/esm/LinearGenomeView/svgcomponents/SVGTrackLabel.js +2 -2
  79. package/esm/index.d.ts +159 -21
  80. package/package.json +2 -2
@@ -146,6 +146,7 @@ const Scalebar = (0, mobx_react_1.observer)(function ({ model, scale, overview,
146
146
  const { classes } = useStyles();
147
147
  const theme = (0, material_1.useTheme)();
148
148
  const { dynamicBlocks, showCytobands, cytobandOffset } = model;
149
+ const { pluginManager } = (0, util_1.getEnv)(model);
149
150
  const visibleRegions = dynamicBlocks.contentBlocks;
150
151
  const overviewVisibleRegions = overview.dynamicBlocks;
151
152
  const { tertiary, primary } = theme.palette;
@@ -166,6 +167,7 @@ const Scalebar = (0, mobx_react_1.observer)(function ({ model, scale, overview,
166
167
  }) || 0;
167
168
  const color = showCytobands ? '#f00' : scalebarColor;
168
169
  const transparency = showCytobands ? 0.1 : 0.3;
170
+ const additional = pluginManager.evaluateExtensionPoint('LinearGenomeView-OverviewScalebarComponent', undefined, { model, overview });
169
171
  return (react_1.default.createElement("div", { className: classes.scalebar },
170
172
  react_1.default.createElement("div", { className: classes.scalebarVisibleRegion, style: {
171
173
  width: lastOverviewPx - firstOverviewPx,
@@ -181,7 +183,8 @@ const Scalebar = (0, mobx_react_1.observer)(function ({ model, scale, overview,
181
183
  backgroundImage: 'repeating-linear-gradient(90deg, transparent, transparent 1px, rgba(255,255,255,.5) 1px, rgba(255,255,255,.5) 3px)',
182
184
  } })) : (react_1.default.createElement(OverviewBox, { scale: scale, block: block, model: model, overview: overview, key: `${JSON.stringify(block)}-${idx}` }));
183
185
  }),
184
- react_1.default.createElement(OverviewHighlight_1.default, { model: model, overview: overview })));
186
+ react_1.default.createElement(OverviewHighlight_1.default, { model: model, overview: overview }),
187
+ additional));
185
188
  });
186
189
  const OverviewScalebar = (0, mobx_react_1.observer)(function ({ model, children, }) {
187
190
  const { classes } = useStyles();
@@ -4,6 +4,6 @@ import { LinearGenomeViewModel } from '..';
4
4
  declare const OverviewScalebarPolygon: ({ model, overview, useOffset, }: {
5
5
  model: LinearGenomeViewModel;
6
6
  overview: Base1DViewModel;
7
- useOffset?: boolean | undefined;
7
+ useOffset?: boolean;
8
8
  }) => React.JSX.Element | null;
9
9
  export default OverviewScalebarPolygon;
@@ -8,6 +8,7 @@ const material_1 = require("@mui/material");
8
8
  const mobx_react_1 = require("mobx-react");
9
9
  // locals
10
10
  const __1 = require("..");
11
+ const util_1 = require("@jbrowse/core/util");
11
12
  const OverviewScalebarPolygon = (0, mobx_react_1.observer)(function ({ model, overview, useOffset = true, }) {
12
13
  const theme = (0, material_1.useTheme)();
13
14
  const multiplier = Number(useOffset);
@@ -41,6 +42,6 @@ const OverviewScalebarPolygon = (0, mobx_react_1.observer)(function ({ model, ov
41
42
  [topRight, 0],
42
43
  [topLeft, 0],
43
44
  ];
44
- return (react_1.default.createElement("polygon", { points: points.toString(), fill: (0, material_1.alpha)(polygonColor, 0.3), stroke: (0, material_1.alpha)(polygonColor, 0.8) }));
45
+ return (react_1.default.createElement("polygon", { points: points.toString(), ...(0, util_1.getFillProps)((0, material_1.alpha)(polygonColor, 0.3)), ...(0, util_1.getStrokeProps)((0, material_1.alpha)(polygonColor, 0.8)) }));
45
46
  });
46
47
  exports.default = OverviewScalebarPolygon;
@@ -4,15 +4,15 @@ import { TextFieldProps as TFP } from '@mui/material';
4
4
  import { LinearGenomeViewModel } from '../../model';
5
5
  declare const RefNameAutocomplete: ({ model, onSelect, assemblyName, style, fetchResults, onChange, value, showHelp, minWidth, maxWidth, TextFieldProps, }: {
6
6
  model: LinearGenomeViewModel;
7
- onSelect?: ((region: BaseResult) => void) | undefined;
8
- onChange?: ((val: string) => void) | undefined;
9
- assemblyName?: string | undefined;
10
- value?: string | undefined;
7
+ onSelect?: (region: BaseResult) => void;
8
+ onChange?: (val: string) => void;
9
+ assemblyName?: string;
10
+ value?: string;
11
11
  fetchResults: (query: string) => Promise<BaseResult[]>;
12
- style?: React.CSSProperties | undefined;
13
- minWidth?: number | undefined;
14
- maxWidth?: number | undefined;
15
- showHelp?: boolean | undefined;
16
- TextFieldProps?: TFP | undefined;
12
+ style?: React.CSSProperties;
13
+ minWidth?: number;
14
+ maxWidth?: number;
15
+ showHelp?: boolean;
16
+ TextFieldProps?: TFP;
17
17
  }) => React.JSX.Element;
18
18
  export default RefNameAutocomplete;
@@ -45,7 +45,8 @@ const RefNameAutocomplete = (0, mobx_react_1.observer)(function ({ model, onSele
45
45
  const assembly = assemblyName ? assemblyManager.get(assemblyName) : undefined;
46
46
  const { coarseVisibleLocStrings, hasDisplayedRegions } = model;
47
47
  (0, react_1.useEffect)(() => {
48
- let active = true;
48
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
49
+ ;
49
50
  (async () => {
50
51
  try {
51
52
  if (debouncedSearch === '' || !assemblyName) {
@@ -53,21 +54,14 @@ const RefNameAutocomplete = (0, mobx_react_1.observer)(function ({ model, onSele
53
54
  }
54
55
  setLoaded(false);
55
56
  const results = await fetchResults(debouncedSearch);
56
- if (active) {
57
- setLoaded(true);
58
- setSearchOptions((0, util_2.getDeduplicatedResult)(results));
59
- }
57
+ setLoaded(true);
58
+ setSearchOptions((0, util_2.getDeduplicatedResult)(results));
60
59
  }
61
60
  catch (e) {
62
61
  console.error(e);
63
- if (active) {
64
- session.notify(`${e}`, 'error');
65
- }
62
+ session.notifyError(`${e}`, e);
66
63
  }
67
64
  })();
68
- return () => {
69
- active = false;
70
- };
71
65
  }, [assemblyName, fetchResults, debouncedSearch, session, model]);
72
66
  const inputBoxVal = coarseVisibleLocStrings || value || '';
73
67
  // heuristic, text width + 60 accommodates help icon and search icon
@@ -82,29 +76,28 @@ const RefNameAutocomplete = (0, mobx_react_1.observer)(function ({ model, onSele
82
76
  }))) || [], [regions]);
83
77
  // notes on implementation:
84
78
  // The selectOnFocus setting helps highlight the field when clicked
85
- return (react_1.default.createElement(react_1.default.Fragment, null,
86
- react_1.default.createElement(material_1.Autocomplete, { "data-testid": "autocomplete", disableListWrap: true, disableClearable: true, disabled: !assemblyName, freeSolo: true, includeInputInList: true, selectOnFocus: true, style: { ...style, width }, value: inputBoxVal, loading: !loaded, inputValue: inputValue, onInputChange: (_event, newInputValue) => {
87
- setInputValue(newInputValue);
88
- onChange === null || onChange === void 0 ? void 0 : onChange(newInputValue);
89
- }, loadingText: "loading results", open: open, onOpen: () => setOpen(true), onClose: () => {
90
- setOpen(false);
91
- setLoaded(true);
92
- if (hasDisplayedRegions) {
93
- setCurrentSearch('');
94
- setSearchOptions(undefined);
95
- }
96
- }, onChange: (_event, selectedOption) => {
97
- if (!selectedOption || !assemblyName) {
98
- return;
99
- }
100
- if (typeof selectedOption === 'string') {
101
- // handles string inputs on keyPress enter
102
- onSelect === null || onSelect === void 0 ? void 0 : onSelect(new BaseResults_1.default({ label: selectedOption }));
103
- }
104
- else {
105
- onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectedOption.result);
106
- }
107
- setInputValue(inputBoxVal);
108
- }, options: (searchOptions === null || searchOptions === void 0 ? void 0 : searchOptions.length) ? searchOptions : regionOptions, getOptionDisabled: option => option.group === 'limitOption', filterOptions: (opts, { inputValue }) => (0, util_2.getFiltered)(opts, inputValue), renderInput: params => (react_1.default.createElement(AutocompleteTextField_1.default, { showHelp: showHelp, params: params, inputBoxVal: inputBoxVal, TextFieldProps: TextFieldProps, setCurrentSearch: setCurrentSearch, setInputValue: setInputValue })), getOptionLabel: opt => typeof opt === 'string' ? opt : opt.result.getDisplayString() })));
79
+ return (react_1.default.createElement(material_1.Autocomplete, { "data-testid": "autocomplete", disableListWrap: true, disableClearable: true, disabled: !assemblyName, freeSolo: true, includeInputInList: true, selectOnFocus: true, style: { ...style, width }, value: inputBoxVal, loading: !loaded, inputValue: inputValue, onInputChange: (_event, newInputValue) => {
80
+ setInputValue(newInputValue);
81
+ onChange === null || onChange === void 0 ? void 0 : onChange(newInputValue);
82
+ }, loadingText: "loading results", open: open, onOpen: () => setOpen(true), onClose: () => {
83
+ setOpen(false);
84
+ setLoaded(true);
85
+ if (hasDisplayedRegions) {
86
+ setCurrentSearch('');
87
+ setSearchOptions(undefined);
88
+ }
89
+ }, onChange: (_event, selectedOption) => {
90
+ if (!selectedOption || !assemblyName) {
91
+ return;
92
+ }
93
+ if (typeof selectedOption === 'string') {
94
+ // handles string inputs on keyPress enter
95
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(new BaseResults_1.default({ label: selectedOption }));
96
+ }
97
+ else {
98
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectedOption.result);
99
+ }
100
+ setInputValue(inputBoxVal);
101
+ }, options: (searchOptions === null || searchOptions === void 0 ? void 0 : searchOptions.length) ? searchOptions : regionOptions, getOptionDisabled: option => option.group === 'limitOption', filterOptions: (opts, { inputValue }) => (0, util_2.getFiltered)(opts, inputValue), renderInput: params => (react_1.default.createElement(AutocompleteTextField_1.default, { showHelp: showHelp, params: params, inputBoxVal: inputBoxVal, TextFieldProps: TextFieldProps, setCurrentSearch: setCurrentSearch, setInputValue: setInputValue })), getOptionLabel: opt => typeof opt === 'string' ? opt : opt.result.getDisplayString() }));
109
102
  });
110
103
  exports.default = RefNameAutocomplete;
@@ -3,6 +3,6 @@ import { LinearGenomeViewModel } from '..';
3
3
  type LGV = LinearGenomeViewModel;
4
4
  declare const Rubberband: ({ model, ControlComponent, }: {
5
5
  model: LGV;
6
- ControlComponent?: React.ReactElement<any, string | React.JSXElementConstructor<any>> | undefined;
6
+ ControlComponent?: React.ReactElement;
7
7
  }) => React.JSX.Element;
8
8
  export default Rubberband;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { LinearGenomeViewModel } from '..';
3
3
  declare const SearchBox: ({ model, showHelp, }: {
4
- showHelp?: boolean | undefined;
4
+ showHelp?: boolean;
5
5
  model: LinearGenomeViewModel;
6
6
  }) => React.JSX.Element;
7
7
  export default SearchBox;
@@ -74,7 +74,7 @@ function SearchResultsTable({ searchResults, assemblyName: optAssemblyName, mode
74
74
  }
75
75
  catch (e) {
76
76
  console.error(e);
77
- session.notify(`${e}`, 'error');
77
+ session.notifyError(`${e}`, e);
78
78
  }
79
79
  handleClose();
80
80
  }, color: "primary", variant: "contained" }, "Go")))))))));
@@ -33,7 +33,6 @@ const mobx_react_1 = require("mobx-react");
33
33
  const mobx_state_tree_1 = require("mobx-state-tree");
34
34
  const react_error_boundary_1 = require("react-error-boundary");
35
35
  const ui_1 = require("@jbrowse/core/ui");
36
- const util_1 = require("@jbrowse/core/util");
37
36
  const TrackLabelContainer_1 = __importDefault(require("./TrackLabelContainer"));
38
37
  const TrackRenderingContainer_1 = __importDefault(require("./TrackRenderingContainer"));
39
38
  const useStyles = (0, mui_1.makeStyles)()({
@@ -46,40 +45,28 @@ const useStyles = (0, mui_1.makeStyles)()({
46
45
  position: 'relative',
47
46
  zIndex: 2,
48
47
  },
49
- overlay: {
50
- pointerEvents: 'none',
51
- position: 'absolute',
52
- top: 0,
53
- left: 0,
54
- width: '100%',
55
- zIndex: 3,
56
- },
57
48
  });
58
49
  const TrackContainer = (0, mobx_react_1.observer)(function ({ model, track, }) {
59
50
  const { classes } = useStyles();
60
51
  const display = track.displays[0];
61
52
  const { draggingTrackId } = model;
62
- const ref2 = (0, react_1.useRef)(null);
63
- const dimmed = draggingTrackId !== undefined && draggingTrackId !== display.id;
64
- const debouncedOnDragEnter = (0, util_1.useDebouncedCallback)(() => {
65
- if ((0, mobx_state_tree_1.isAlive)(display) && dimmed) {
66
- model.moveTrack(draggingTrackId, track.id);
67
- }
68
- }, 100);
69
- return (react_1.default.createElement(material_1.Paper, { ref: ref2, className: classes.root, variant: "outlined", onClick: event => {
53
+ const ref = (0, react_1.useRef)(null);
54
+ return (react_1.default.createElement(material_1.Paper, { ref: ref, className: classes.root, variant: "outlined", onClick: event => {
70
55
  var _a;
71
56
  if (event.detail === 2 && !track.displays[0].featureIdUnderMouse) {
72
- const left = ((_a = ref2.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left) || 0;
57
+ const left = ((_a = ref.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left) || 0;
73
58
  model.zoomTo(model.bpPerPx / 2, event.clientX - left, true);
74
59
  }
75
60
  } },
76
61
  react_1.default.createElement(TrackLabelContainer_1.default, { track: track, view: model }),
77
62
  react_1.default.createElement(react_error_boundary_1.ErrorBoundary, { FallbackComponent: e => react_1.default.createElement(ui_1.ErrorMessage, { error: e.error }) },
78
- react_1.default.createElement(TrackRenderingContainer_1.default, { model: model, track: track, onDragEnter: debouncedOnDragEnter })),
79
- react_1.default.createElement("div", { className: classes.overlay, style: {
80
- height: display.height,
81
- background: dimmed ? 'rgba(0, 0, 0, 0.4)' : undefined,
82
- }, onDragEnter: debouncedOnDragEnter }),
63
+ react_1.default.createElement(TrackRenderingContainer_1.default, { model: model, track: track, onDragEnter: () => {
64
+ if ((0, mobx_state_tree_1.isAlive)(display) &&
65
+ draggingTrackId !== undefined &&
66
+ draggingTrackId !== display.id) {
67
+ model.moveTrack(draggingTrackId, track.id);
68
+ }
69
+ } })),
83
70
  react_1.default.createElement(ui_1.ResizeHandle, { onDrag: display.resizeHeight, className: classes.resizeHandle })));
84
71
  });
85
72
  exports.default = TrackContainer;
@@ -17,6 +17,10 @@ const MoreVert_1 = __importDefault(require("@mui/icons-material/MoreVert"));
17
17
  const Close_1 = __importDefault(require("@mui/icons-material/Close"));
18
18
  const Minimize_1 = __importDefault(require("@mui/icons-material/Minimize"));
19
19
  const Add_1 = __importDefault(require("@mui/icons-material/Add"));
20
+ const KeyboardDoubleArrowDown_1 = __importDefault(require("@mui/icons-material/KeyboardDoubleArrowDown"));
21
+ const KeyboardDoubleArrowUp_1 = __importDefault(require("@mui/icons-material/KeyboardDoubleArrowUp"));
22
+ const KeyboardArrowDown_1 = __importDefault(require("@mui/icons-material/KeyboardArrowDown"));
23
+ const KeyboardArrowUp_1 = __importDefault(require("@mui/icons-material/KeyboardArrowUp"));
20
24
  const TrackLabelDragHandle_1 = __importDefault(require("./TrackLabelDragHandle"));
21
25
  const useStyles = (0, mui_1.makeStyles)()(theme => ({
22
26
  root: {
@@ -24,9 +28,6 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
24
28
  '&:hover': {
25
29
  background: theme.palette.background.paper,
26
30
  },
27
- transition: theme.transitions.create(['background'], {
28
- duration: theme.transitions.duration.shortest,
29
- }),
30
31
  },
31
32
  trackName: {
32
33
  margin: '0 auto',
@@ -49,9 +50,35 @@ const TrackLabel = (0, mobx_react_1.observer)(react_1.default.forwardRef(functio
49
50
  const trackName = (0, tracks_1.getTrackName)(trackConf, session);
50
51
  const items = [
51
52
  {
52
- label: minimized ? 'Restore track' : 'Minimize track',
53
- icon: minimized ? Add_1.default : Minimize_1.default,
54
- onClick: () => track.setMinimized(!minimized),
53
+ label: 'Track order',
54
+ type: 'subMenu',
55
+ subMenu: [
56
+ {
57
+ label: minimized ? 'Restore track' : 'Minimize track',
58
+ icon: minimized ? Add_1.default : Minimize_1.default,
59
+ onClick: () => track.setMinimized(!minimized),
60
+ },
61
+ {
62
+ label: 'Move track to top',
63
+ icon: KeyboardDoubleArrowUp_1.default,
64
+ onClick: () => view.moveTrackToTop(track.id),
65
+ },
66
+ {
67
+ label: 'Move track up',
68
+ icon: KeyboardArrowUp_1.default,
69
+ onClick: () => view.moveTrackUp(track.id),
70
+ },
71
+ {
72
+ label: 'Move track down',
73
+ icon: KeyboardArrowDown_1.default,
74
+ onClick: () => view.moveTrackDown(track.id),
75
+ },
76
+ {
77
+ label: 'Move track to bottom',
78
+ icon: KeyboardDoubleArrowDown_1.default,
79
+ onClick: () => view.moveTrackToBottom(track.id),
80
+ },
81
+ ],
55
82
  },
56
83
  ...(((_a = session.getTrackActionMenuItems) === null || _a === void 0 ? void 0 : _a.call(session, trackConf)) || []),
57
84
  ...track.trackMenuItems(),
@@ -45,16 +45,16 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
45
45
  }));
46
46
  const ZoomControls = (0, mobx_react_1.observer)(function ({ model, }) {
47
47
  const { classes } = useStyles();
48
- const { maxBpPerPx, minBpPerPx, bpPerPx, scaleFactor } = model;
48
+ const { maxBpPerPx, minBpPerPx, bpPerPx } = model;
49
49
  const [value, setValue] = (0, react_1.useState)(-Math.log2(bpPerPx) * 100);
50
50
  (0, react_1.useEffect)(() => {
51
51
  setValue(-Math.log2(bpPerPx) * 100);
52
52
  }, [setValue, bpPerPx]);
53
53
  return (react_1.default.createElement("div", { className: classes.container },
54
- react_1.default.createElement(material_1.IconButton, { "data-testid": "zoom_out", onClick: () => model.zoom(bpPerPx * 2), disabled: bpPerPx >= maxBpPerPx - 0.0001 || scaleFactor !== 1, size: "large" },
54
+ react_1.default.createElement(material_1.IconButton, { "data-testid": "zoom_out", onClick: () => model.zoom(bpPerPx * 2), disabled: bpPerPx >= maxBpPerPx - 0.0001, size: "large" },
55
55
  react_1.default.createElement(ZoomOut_1.default, null)),
56
- react_1.default.createElement(material_1.Slider, { size: "small", className: classes.slider, value: value, min: -Math.log2(maxBpPerPx) * 100, max: -Math.log2(minBpPerPx) * 100, onChange: (_, val) => setValue(val), onChangeCommitted: () => model.zoomTo(2 ** (-value / 100)), disabled: scaleFactor !== 1 }),
57
- react_1.default.createElement(material_1.IconButton, { "data-testid": "zoom_in", onClick: () => model.zoom(model.bpPerPx / 2), disabled: bpPerPx <= minBpPerPx + 0.0001 || scaleFactor !== 1, size: "large" },
56
+ react_1.default.createElement(material_1.Slider, { size: "small", className: classes.slider, value: value, min: -Math.log2(maxBpPerPx) * 100, max: -Math.log2(minBpPerPx) * 100, onChange: (_, val) => setValue(val), onChangeCommitted: () => model.zoomTo(2 ** (-value / 100)) }),
57
+ react_1.default.createElement(material_1.IconButton, { "data-testid": "zoom_in", onClick: () => model.zoom(model.bpPerPx / 2), disabled: bpPerPx <= minBpPerPx + 0.0001, size: "large" },
58
58
  react_1.default.createElement(ZoomIn_1.default, null))));
59
59
  });
60
60
  exports.default = ZoomControls;
@@ -81,7 +81,8 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
81
81
  showCytobandsSetting: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
82
82
  trackLabels: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
83
83
  showGridlines: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
84
- highlight: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IType<Required<ParsedLocString>, Required<ParsedLocString>, Required<ParsedLocString>>>;
84
+ highlight: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").IArrayType<import("mobx-state-tree").IType<Required<ParsedLocString>, Required<ParsedLocString>, Required<ParsedLocString>>>, [undefined]>;
85
+ colorByCDS: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
85
86
  }, {
86
87
  width: number;
87
88
  } & {
@@ -224,6 +225,10 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
224
225
  */
225
226
  readonly trackTypeActions: Map<string, MenuItem[]>;
226
227
  } & {
228
+ /**
229
+ * #action
230
+ */
231
+ setColorByCDS(flag: boolean): void;
227
232
  /**
228
233
  * #action
229
234
  */
@@ -255,7 +260,15 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
255
260
  /**
256
261
  * #action
257
262
  */
258
- setHighlight(highlight: Required<ParsedLocString> | undefined): void;
263
+ addToHighlights(highlight: Required<ParsedLocString>): void;
264
+ /**
265
+ * #action
266
+ */
267
+ setHighlight(highlight: Required<ParsedLocString>[] | undefined): void;
268
+ /**
269
+ * #action
270
+ */
271
+ removeHighlight(highlight: Required<ParsedLocString>): void;
259
272
  /**
260
273
  * #action
261
274
  */
@@ -292,6 +305,22 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
292
305
  */
293
306
  hideTrack(trackId: string): number;
294
307
  } & {
308
+ /**
309
+ * #action
310
+ */
311
+ moveTrackDown(id: string): void;
312
+ /**
313
+ * #action
314
+ */
315
+ moveTrackUp(id: string): void;
316
+ /**
317
+ * #action
318
+ */
319
+ moveTrackToTop(id: string): void;
320
+ /**
321
+ * #action
322
+ */
323
+ moveTrackToBottom(id: string): void;
295
324
  /**
296
325
  * #action
297
326
  */
@@ -528,20 +557,21 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
528
557
  bpToPx({ refName, coord, regionNumber, }: {
529
558
  refName: string;
530
559
  coord: number;
531
- regionNumber?: number | undefined;
560
+ regionNumber?: number;
532
561
  }): {
533
562
  index: number;
534
563
  offsetPx: number;
535
564
  } | undefined;
536
565
  /**
537
566
  * #method
538
- * scrolls the view to center on the given bp. if that is not in any
539
- * of the displayed regions, does nothing
567
+ * scrolls the view to center on the given bp. if that is not in any of
568
+ * the displayed regions, does nothing
569
+ *
540
570
  * @param coord - basepair at which you want to center the view
541
571
  * @param refName - refName of the displayedRegion you are centering at
542
572
  * @param regionNumber - index of the displayedRegion
543
573
  */
544
- centerAt(coord: number, refName: string, regionNumber: number): void;
574
+ centerAt(coord: number, refName: string, regionNumber?: number): void;
545
575
  /**
546
576
  * #method
547
577
  */
@@ -572,7 +602,37 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
572
602
  } | undefined;
573
603
  } & {
574
604
  afterCreate(): void;
575
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
605
+ }, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
606
+ id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
607
+ displayName: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
608
+ minimized: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
609
+ } & {
610
+ id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
611
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
612
+ offsetPx: import("mobx-state-tree").IType<number | undefined, number, number>;
613
+ bpPerPx: import("mobx-state-tree").IType<number | undefined, number, number>;
614
+ displayedRegions: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
615
+ refName: import("mobx-state-tree").ISimpleType<string>;
616
+ start: import("mobx-state-tree").ISimpleType<number>;
617
+ end: import("mobx-state-tree").ISimpleType<number>;
618
+ reversed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
619
+ } & {
620
+ assemblyName: import("mobx-state-tree").ISimpleType<string>;
621
+ }, {
622
+ setRefName(newRefName: string): void;
623
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
624
+ tracks: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyType>;
625
+ hideHeader: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
626
+ hideHeaderOverview: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
627
+ hideNoTracksActive: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
628
+ trackSelectorType: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
629
+ showCenterLine: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
630
+ showCytobandsSetting: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
631
+ trackLabels: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
632
+ showGridlines: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
633
+ highlight: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").IArrayType<import("mobx-state-tree").IType<Required<ParsedLocString>, Required<ParsedLocString>, Required<ParsedLocString>>>, [undefined]>;
634
+ colorByCDS: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
635
+ }>>, import("mobx-state-tree")._NotCustomized>;
576
636
  export type LinearGenomeViewStateModel = ReturnType<typeof stateModelFactory>;
577
637
  export type LinearGenomeViewModel = Instance<LinearGenomeViewStateModel>;
578
638
  export { default as ReactComponent, default as LinearGenomeView, } from './components/LinearGenomeView';