@jbrowse/plugin-linear-comparative-view 2.15.4 → 2.16.0

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 (101) hide show
  1. package/dist/LaunchLinearSyntenyView.js +41 -11
  2. package/dist/LinearComparativeDisplay/stateModelFactory.d.ts +14 -9
  3. package/dist/LinearComparativeDisplay/stateModelFactory.js +8 -9
  4. package/dist/LinearComparativeView/components/Header.d.ts +2 -3
  5. package/dist/LinearComparativeView/components/Header.js +72 -62
  6. package/dist/LinearComparativeView/components/HeaderSearchBoxes.d.ts +6 -0
  7. package/dist/LinearComparativeView/components/HeaderSearchBoxes.js +34 -0
  8. package/dist/LinearComparativeView/components/LinearComparativeRenderArea.d.ts +6 -0
  9. package/dist/LinearComparativeView/components/LinearComparativeRenderArea.js +61 -0
  10. package/dist/LinearComparativeView/components/LinearComparativeView.d.ts +2 -4
  11. package/dist/LinearComparativeView/components/LinearComparativeView.js +3 -67
  12. package/dist/LinearComparativeView/components/Rubberband.js +1 -1
  13. package/dist/LinearComparativeView/index.js +3 -0
  14. package/dist/LinearComparativeView/model.d.ts +265 -12
  15. package/dist/LinearComparativeView/model.js +45 -75
  16. package/dist/LinearSyntenyDisplay/afterAttach.js +5 -3
  17. package/dist/LinearSyntenyDisplay/components/LinearSyntenyRendering.js +32 -24
  18. package/dist/LinearSyntenyDisplay/components/SyntenyContextMenu.js +12 -6
  19. package/dist/LinearSyntenyDisplay/components/util.d.ts +2 -1
  20. package/dist/LinearSyntenyDisplay/components/util.js +5 -5
  21. package/dist/LinearSyntenyDisplay/drawSynteny.d.ts +1 -1
  22. package/dist/LinearSyntenyDisplay/drawSynteny.js +28 -22
  23. package/dist/LinearSyntenyDisplay/index.js +1 -1
  24. package/dist/LinearSyntenyDisplay/model.d.ts +12 -11
  25. package/dist/LinearSyntenyDisplay/model.js +7 -0
  26. package/dist/LinearSyntenyView/components/ImportForm/{ImportCustomTrack.d.ts → AddCustomTrack.d.ts} +2 -3
  27. package/dist/LinearSyntenyView/components/ImportForm/{ImportCustomTrack.js → AddCustomTrack.js} +3 -3
  28. package/dist/LinearSyntenyView/components/ImportForm/LinearSyntenyImportForm.js +195 -0
  29. package/dist/LinearSyntenyView/components/ImportForm/Spacer.d.ts +2 -0
  30. package/dist/LinearSyntenyView/components/ImportForm/Spacer.js +10 -0
  31. package/dist/LinearSyntenyView/components/ImportForm/TrackSelector.d.ts +10 -0
  32. package/dist/LinearSyntenyView/components/ImportForm/{ImportSyntenyTrackSelector.js → TrackSelector.js} +15 -20
  33. package/dist/LinearSyntenyView/components/ImportForm/TrackSelectorUtil.d.ts +14 -0
  34. package/dist/LinearSyntenyView/components/ImportForm/TrackSelectorUtil.js +52 -0
  35. package/dist/LinearSyntenyView/components/LinearSyntenyView.js +3 -3
  36. package/dist/LinearSyntenyView/index.js +1 -1
  37. package/dist/LinearSyntenyView/model.d.ts +267 -9
  38. package/dist/LinearSyntenyView/model.js +2 -2
  39. package/dist/LinearSyntenyView/svgcomponents/SVGLinearGenomeView.d.ts +12 -0
  40. package/dist/LinearSyntenyView/svgcomponents/SVGLinearGenomeView.js +19 -0
  41. package/dist/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.d.ts +1 -3
  42. package/dist/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.js +36 -27
  43. package/dist/LinearSyntenyViewHelper/index.d.ts +2 -0
  44. package/dist/LinearSyntenyViewHelper/index.js +25 -0
  45. package/dist/LinearSyntenyViewHelper/stateModelFactory.d.ts +30 -0
  46. package/dist/LinearSyntenyViewHelper/stateModelFactory.js +105 -0
  47. package/dist/index.js +2 -0
  48. package/esm/LaunchLinearSyntenyView.js +41 -11
  49. package/esm/LinearComparativeDisplay/stateModelFactory.d.ts +14 -9
  50. package/esm/LinearComparativeDisplay/stateModelFactory.js +9 -10
  51. package/esm/LinearComparativeView/components/Header.d.ts +2 -3
  52. package/esm/LinearComparativeView/components/Header.js +73 -63
  53. package/esm/LinearComparativeView/components/HeaderSearchBoxes.d.ts +6 -0
  54. package/esm/LinearComparativeView/components/HeaderSearchBoxes.js +29 -0
  55. package/esm/LinearComparativeView/components/LinearComparativeRenderArea.d.ts +6 -0
  56. package/esm/LinearComparativeView/components/LinearComparativeRenderArea.js +56 -0
  57. package/esm/LinearComparativeView/components/LinearComparativeView.d.ts +2 -4
  58. package/esm/LinearComparativeView/components/LinearComparativeView.js +3 -67
  59. package/esm/LinearComparativeView/components/Rubberband.js +1 -1
  60. package/esm/LinearComparativeView/index.js +3 -0
  61. package/esm/LinearComparativeView/model.d.ts +265 -12
  62. package/esm/LinearComparativeView/model.js +47 -77
  63. package/esm/LinearSyntenyDisplay/afterAttach.js +6 -4
  64. package/esm/LinearSyntenyDisplay/components/LinearSyntenyRendering.js +33 -25
  65. package/esm/LinearSyntenyDisplay/components/SyntenyContextMenu.js +12 -6
  66. package/esm/LinearSyntenyDisplay/components/util.d.ts +2 -1
  67. package/esm/LinearSyntenyDisplay/components/util.js +5 -5
  68. package/esm/LinearSyntenyDisplay/drawSynteny.d.ts +1 -1
  69. package/esm/LinearSyntenyDisplay/drawSynteny.js +28 -22
  70. package/esm/LinearSyntenyDisplay/index.js +1 -1
  71. package/esm/LinearSyntenyDisplay/model.d.ts +12 -11
  72. package/esm/LinearSyntenyDisplay/model.js +8 -1
  73. package/esm/LinearSyntenyView/components/ImportForm/{ImportCustomTrack.d.ts → AddCustomTrack.d.ts} +2 -3
  74. package/esm/LinearSyntenyView/components/ImportForm/{ImportCustomTrack.js → AddCustomTrack.js} +3 -3
  75. package/esm/LinearSyntenyView/components/ImportForm/LinearSyntenyImportForm.js +167 -0
  76. package/esm/LinearSyntenyView/components/ImportForm/Spacer.d.ts +2 -0
  77. package/esm/LinearSyntenyView/components/ImportForm/Spacer.js +4 -0
  78. package/esm/LinearSyntenyView/components/ImportForm/TrackSelector.d.ts +10 -0
  79. package/esm/LinearSyntenyView/components/ImportForm/{ImportSyntenyTrackSelector.js → TrackSelector.js} +15 -20
  80. package/esm/LinearSyntenyView/components/ImportForm/TrackSelectorUtil.d.ts +14 -0
  81. package/esm/LinearSyntenyView/components/ImportForm/TrackSelectorUtil.js +23 -0
  82. package/esm/LinearSyntenyView/components/LinearSyntenyView.js +3 -3
  83. package/esm/LinearSyntenyView/index.js +1 -1
  84. package/esm/LinearSyntenyView/model.d.ts +267 -9
  85. package/esm/LinearSyntenyView/model.js +2 -2
  86. package/esm/LinearSyntenyView/svgcomponents/SVGLinearGenomeView.d.ts +12 -0
  87. package/esm/LinearSyntenyView/svgcomponents/SVGLinearGenomeView.js +13 -0
  88. package/esm/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.d.ts +1 -3
  89. package/esm/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.js +38 -29
  90. package/esm/LinearSyntenyViewHelper/index.d.ts +2 -0
  91. package/esm/LinearSyntenyViewHelper/index.js +19 -0
  92. package/esm/LinearSyntenyViewHelper/stateModelFactory.d.ts +30 -0
  93. package/esm/LinearSyntenyViewHelper/stateModelFactory.js +102 -0
  94. package/esm/index.js +2 -0
  95. package/package.json +2 -2
  96. package/dist/LinearSyntenyView/components/ImportForm/ImportSyntenyTrackSelector.d.ts +0 -9
  97. package/dist/LinearSyntenyView/components/ImportForm/index.js +0 -138
  98. package/esm/LinearSyntenyView/components/ImportForm/ImportSyntenyTrackSelector.d.ts +0 -9
  99. package/esm/LinearSyntenyView/components/ImportForm/index.js +0 -110
  100. /package/dist/LinearSyntenyView/components/ImportForm/{index.d.ts → LinearSyntenyImportForm.d.ts} +0 -0
  101. /package/esm/LinearSyntenyView/components/ImportForm/{index.d.ts → LinearSyntenyImportForm.d.ts} +0 -0
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = LaunchLinearSyntenyView;
4
+ const util_1 = require("@jbrowse/core/util");
4
5
  const mobx_1 = require("mobx");
6
+ function makeMultiDimArray(str) {
7
+ return Array.isArray(str[0]) ? str : [str];
8
+ }
5
9
  function LaunchLinearSyntenyView(pluginManager) {
6
10
  pluginManager.addToExtensionPoint('LaunchView-LinearSyntenyView',
7
11
  // @ts-expect-error
@@ -24,7 +28,7 @@ function LaunchLinearSyntenyView(pluginManager) {
24
28
  };
25
29
  })));
26
30
  await Promise.all(model.views.map(view => (0, mobx_1.when)(() => view.initialized)));
27
- const idsNotFound = [];
31
+ let idsNotFound = [];
28
32
  await Promise.all(views.map(async (data, idx) => {
29
33
  const view = model.views[idx];
30
34
  const { assembly, loc, tracks = [] } = data;
@@ -33,14 +37,23 @@ function LaunchLinearSyntenyView(pluginManager) {
33
37
  throw new Error(`Assembly ${data.assembly} failed to load`);
34
38
  }
35
39
  await view.navToSearchString({ input: loc, assembly: asm });
36
- tracks.forEach(track => {
37
- tryTrack(view, track, idsNotFound);
38
- });
40
+ idsNotFound = [
41
+ ...idsNotFound,
42
+ ...tracks.map(trackId => tryTrackLGV({
43
+ model: view,
44
+ trackId,
45
+ })),
46
+ ];
39
47
  }));
40
- tracks.forEach(track => {
41
- tryTrack(model, track, idsNotFound);
42
- });
43
- if (idsNotFound.length) {
48
+ idsNotFound = [
49
+ ...idsNotFound,
50
+ ...makeMultiDimArray(tracks).flatMap((trackSet, level) => trackSet.map(trackId => tryTrackSynteny({
51
+ model,
52
+ trackId,
53
+ level,
54
+ }))),
55
+ ];
56
+ if (idsNotFound.filter(util_1.notEmpty).length) {
44
57
  throw new Error(`Could not resolve identifiers: ${idsNotFound.join(',')}`);
45
58
  }
46
59
  }
@@ -50,16 +63,33 @@ function LaunchLinearSyntenyView(pluginManager) {
50
63
  }
51
64
  });
52
65
  }
53
- function tryTrack(model, trackId, idsNotFound) {
66
+ function tryTrackLGV({ model, trackId, }) {
54
67
  try {
55
68
  model.showTrack(trackId);
56
69
  }
57
70
  catch (e) {
58
- if (/Could not resolve identifier/.exec(`${e}`)) {
59
- idsNotFound.push(trackId);
71
+ if (/Could not resolve identifier/.exec(`${e}`) ||
72
+ /track not found/.exec(`${e}`)) {
73
+ return trackId;
74
+ }
75
+ else {
76
+ throw e;
77
+ }
78
+ }
79
+ return undefined;
80
+ }
81
+ function tryTrackSynteny({ model, trackId, level, }) {
82
+ try {
83
+ model.showTrack(trackId, level);
84
+ }
85
+ catch (e) {
86
+ if (/Could not resolve identifier/.exec(`${e}`) ||
87
+ /track not found/.exec(`${e}`)) {
88
+ return trackId;
60
89
  }
61
90
  else {
62
91
  throw e;
63
92
  }
64
93
  }
94
+ return undefined;
65
95
  }
@@ -11,9 +11,14 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
11
11
  type: import("mobx-state-tree").ISimpleType<string>;
12
12
  rpcDriverName: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
13
13
  } & {
14
+ /**
15
+ * #property
16
+ */
14
17
  type: import("mobx-state-tree").ISimpleType<"LinearComparativeDisplay">;
18
+ /**
19
+ * #property
20
+ */
15
21
  configuration: AnyConfigurationSchemaType;
16
- height: import("mobx-state-tree").IType<number | undefined, number, number>;
17
22
  }, {
18
23
  rendererTypeName: string;
19
24
  error: unknown;
@@ -24,9 +29,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
24
29
  id: string;
25
30
  type: string;
26
31
  rpcDriverName: string | undefined;
27
- } & import("mobx-state-tree/dist/internal" /**
28
- * #property
29
- */).NonEmptyObject & {
32
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
30
33
  rendererTypeName: string;
31
34
  error: unknown;
32
35
  message: string | undefined;
@@ -99,7 +102,6 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
99
102
  } & import("mobx-state-tree/dist/internal").NonEmptyObject & any & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>);
100
103
  } & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>);
101
104
  } & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>;
102
- height: number;
103
105
  } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
104
106
  rendererTypeName: string;
105
107
  error: unknown;
@@ -110,9 +112,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
110
112
  id: string;
111
113
  type: string;
112
114
  rpcDriverName: string | undefined;
113
- } & import("mobx-state-tree/dist/internal" /**
114
- * #property
115
- */).NonEmptyObject & {
115
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
116
116
  rendererTypeName: string;
117
117
  error: unknown;
118
118
  message: string | undefined;
@@ -169,9 +169,14 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
169
169
  type: import("mobx-state-tree").ISimpleType<string>;
170
170
  rpcDriverName: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
171
171
  } & {
172
+ /**
173
+ * #property
174
+ */
172
175
  type: import("mobx-state-tree").ISimpleType<"LinearComparativeDisplay">;
176
+ /**
177
+ * #property
178
+ */
173
179
  configuration: AnyConfigurationSchemaType;
174
- height: import("mobx-state-tree").IType<number | undefined, number, number>;
175
180
  }, {
176
181
  rendererTypeName: string;
177
182
  error: unknown;
@@ -21,10 +21,6 @@ function stateModelFactory(configSchema) {
21
21
  * #property
22
22
  */
23
23
  configuration: (0, configuration_1.ConfigurationReference)(configSchema),
24
- /**
25
- * #property
26
- */
27
- height: 100,
28
24
  }))
29
25
  .volatile(( /* self */) => ({
30
26
  renderInProgress: undefined,
@@ -133,8 +129,9 @@ function stateModelFactory(configSchema) {
133
129
  function renderBlockData(self) {
134
130
  const { rpcManager } = (0, util_1.getSession)(self);
135
131
  const display = self;
136
- // Alternative to readConfObject(config) is below used because renderProps is
137
- // something under our control. Compare to serverSideRenderedBlock
132
+ // Alternative to readConfObject(config) is below used because
133
+ // renderProps is something under our control. Compare to
134
+ // serverSideRenderedBlock
138
135
  (0, configuration_1.readConfObject)(self.configuration);
139
136
  const { adapterConfig } = self;
140
137
  const parent = (0, util_1.getContainingView)(self);
@@ -145,6 +142,8 @@ function renderBlockData(self) {
145
142
  rpcManager,
146
143
  renderProps: {
147
144
  ...display.renderProps(),
145
+ // @ts-expect-error
146
+ level: (0, mobx_state_tree_1.getParent)(self, 4).level,
148
147
  view: parent,
149
148
  adapterConfig,
150
149
  sessionId,
@@ -159,10 +158,10 @@ async function renderBlockEffect(props) {
159
158
  return;
160
159
  }
161
160
  const { rpcManager, renderProps } = props;
162
- const { adapterConfig } = renderProps;
163
- const view0 = renderProps.view.views[0];
161
+ const { adapterConfig, level } = renderProps;
162
+ const view = renderProps.view.views[level];
164
163
  const features = (await rpcManager.call('getFeats', 'CoreGetFeatures', {
165
- regions: view0.staticBlocks.contentBlocks,
164
+ regions: view.staticBlocks.contentBlocks,
166
165
  sessionId: 'getFeats',
167
166
  adapterConfig,
168
167
  }));
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { LinearComparativeViewModel } from '../model';
3
- type LCV = LinearComparativeViewModel;
4
- declare const Header: ({ model }: {
5
- model: LCV;
3
+ declare const Header: ({ model, }: {
4
+ model: LinearComparativeViewModel;
6
5
  }) => React.JSX.Element;
7
6
  export default Header;
@@ -27,76 +27,86 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const react_1 = __importStar(require("react"));
30
+ const mobx_react_1 = require("mobx-react");
30
31
  const material_1 = require("@mui/material");
31
32
  const mui_1 = require("tss-react/mui");
32
- const plugin_linear_genome_view_1 = require("@jbrowse/plugin-linear-genome-view");
33
- const mobx_react_1 = require("mobx-react");
34
- const ui_1 = require("@jbrowse/core/ui");
33
+ const CascadingMenuButton_1 = __importDefault(require("@jbrowse/core/ui/CascadingMenuButton"));
35
34
  // icons
36
35
  const MoreVert_1 = __importDefault(require("@mui/icons-material/MoreVert"));
36
+ const Search_1 = __importDefault(require("@mui/icons-material/Search"));
37
37
  const Icons_1 = require("@jbrowse/core/ui/Icons");
38
- const CascadingMenuButton_1 = __importDefault(require("@jbrowse/core/ui/CascadingMenuButton"));
39
- const useStyles = (0, mui_1.makeStyles)()(() => ({
40
- headerBar: {
41
- gridArea: '1/1/auto/span 2',
42
- display: 'flex',
43
- },
44
- spacer: {
45
- flexGrow: 1,
38
+ const HeaderSearchBoxes_1 = __importDefault(require("./HeaderSearchBoxes"));
39
+ const useStyles = (0, mui_1.makeStyles)()({
40
+ inline: {
41
+ display: 'inline-flex',
46
42
  },
47
- iconButton: {
48
- margin: 5,
49
- },
50
- bp: {
51
- display: 'flex',
52
- alignItems: 'center',
53
- marginLeft: 10,
54
- },
55
- searchContainer: {
56
- marginLeft: 5,
57
- },
58
- searchBox: {
59
- display: 'flex',
60
- },
61
- }));
62
- const TrackSelector = (0, mobx_react_1.observer)(({ model }) => {
63
- return (react_1.default.createElement(CascadingMenuButton_1.default, { menuItems: [
64
- {
65
- label: 'Synteny track selector',
66
- onClick: () => model.activateTrackSelector(),
67
- },
68
- ...model.views.map((view, idx) => ({
69
- label: `View ${idx + 1} track selector`,
70
- onClick: () => view.activateTrackSelector(),
71
- })),
72
- ] },
73
- react_1.default.createElement(Icons_1.TrackSelector, null)));
74
43
  });
75
- const Header = (0, mobx_react_1.observer)(function ({ model }) {
44
+ const Header = (0, mobx_react_1.observer)(function ({ model, }) {
76
45
  const { classes } = useStyles();
77
- const [menuAnchorEl, setMenuAnchorEl] = (0, react_1.useState)();
78
- const anyShowHeaders = model.views.some(view => !view.hideHeader);
79
- return (react_1.default.createElement("div", { className: classes.headerBar },
80
- react_1.default.createElement(TrackSelector, { model: model }),
81
- react_1.default.createElement(material_1.IconButton, { onClick: event => {
82
- setMenuAnchorEl(event.currentTarget);
83
- }, className: classes.iconButton },
46
+ const { views } = model;
47
+ const [showSearchBoxes, setShowSearchBoxes] = (0, react_1.useState)(views.length <= 3);
48
+ const [sideBySide, setSideBySide] = (0, react_1.useState)(views.length <= 3);
49
+ return (react_1.default.createElement(material_1.FormGroup, { row: true },
50
+ react_1.default.createElement(CascadingMenuButton_1.default, { menuItems: [
51
+ {
52
+ label: 'Synteny track selectors',
53
+ type: 'subMenu',
54
+ subMenu: views.slice(0, -1).map((_, idx) => ({
55
+ label: `Row ${idx + 1}->${idx + 2} (${views[idx].assemblyNames.join(',')}->${views[idx + 1].assemblyNames.join(',')})`,
56
+ onClick: () => {
57
+ model.activateTrackSelector(idx);
58
+ },
59
+ })),
60
+ },
61
+ {
62
+ label: 'Row track selectors',
63
+ type: 'subMenu',
64
+ subMenu: views.map((view, idx) => ({
65
+ label: `Row ${idx + 1} track selector (${view.assemblyNames.join(',')})`,
66
+ onClick: () => view.activateTrackSelector(),
67
+ })),
68
+ },
69
+ ] },
70
+ react_1.default.createElement(Icons_1.TrackSelector, null)),
71
+ react_1.default.createElement(CascadingMenuButton_1.default, { menuItems: [
72
+ {
73
+ label: 'Row view menus',
74
+ type: 'subMenu',
75
+ subMenu: views.map((view, idx) => ({
76
+ label: `View ${idx + 1} Menu`,
77
+ subMenu: view.menuItems(),
78
+ })),
79
+ },
80
+ ...model.headerMenuItems(),
81
+ ] },
84
82
  react_1.default.createElement(MoreVert_1.default, null)),
85
- !anyShowHeaders
86
- ? model.views.map(view => (react_1.default.createElement("div", { key: view.id, className: classes.searchBox },
87
- react_1.default.createElement("div", { className: classes.searchContainer },
88
- react_1.default.createElement(plugin_linear_genome_view_1.SearchBox, { model: view, showHelp: false })),
89
- react_1.default.createElement("div", { className: classes.bp },
90
- react_1.default.createElement(material_1.Typography, { variant: "body2", color: "textSecondary", className: classes.bp },
91
- Math.round(view.coarseTotalBp).toLocaleString('en-US'),
92
- " bp")))))
93
- : null,
94
- react_1.default.createElement("div", { className: classes.spacer }),
95
- menuAnchorEl ? (react_1.default.createElement(ui_1.Menu, { anchorEl: menuAnchorEl, open: true, onMenuItemClick: (_event, callback) => {
96
- callback();
97
- setMenuAnchorEl(undefined);
98
- }, menuItems: model.headerMenuItems(), onClose: () => {
99
- setMenuAnchorEl(undefined);
100
- } })) : null));
83
+ react_1.default.createElement(CascadingMenuButton_1.default, { menuItems: [
84
+ {
85
+ label: 'Show search boxes',
86
+ type: 'checkbox',
87
+ checked: showSearchBoxes,
88
+ onClick: () => {
89
+ setShowSearchBoxes(!showSearchBoxes);
90
+ },
91
+ },
92
+ {
93
+ label: 'Orientation - Side-by-side',
94
+ type: 'radio',
95
+ checked: sideBySide,
96
+ onClick: () => {
97
+ setSideBySide(!sideBySide);
98
+ },
99
+ },
100
+ {
101
+ label: 'Orientation - Vertical',
102
+ type: 'radio',
103
+ checked: !sideBySide,
104
+ onClick: () => {
105
+ setSideBySide(!sideBySide);
106
+ },
107
+ },
108
+ ] },
109
+ react_1.default.createElement(Search_1.default, null)),
110
+ showSearchBoxes ? (react_1.default.createElement("span", { className: sideBySide ? classes.inline : undefined }, views.map(view => (react_1.default.createElement(HeaderSearchBoxes_1.default, { key: view.id, view: view }))))) : null));
101
111
  });
102
112
  exports.default = Header;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view';
3
+ declare const HeaderSearchBoxes: ({ view, }: {
4
+ view: LinearGenomeViewModel;
5
+ }) => React.JSX.Element;
6
+ export default HeaderSearchBoxes;
@@ -0,0 +1,34 @@
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 mobx_react_1 = require("mobx-react");
8
+ const material_1 = require("@mui/material");
9
+ const mui_1 = require("tss-react/mui");
10
+ // jbrowse
11
+ const plugin_linear_genome_view_1 = require("@jbrowse/plugin-linear-genome-view");
12
+ const util_1 = require("@jbrowse/core/util");
13
+ const useStyles = (0, mui_1.makeStyles)()(() => ({
14
+ bp: {
15
+ display: 'flex',
16
+ alignItems: 'center',
17
+ marginLeft: 10,
18
+ },
19
+ searchBox: {
20
+ display: 'flex',
21
+ },
22
+ }));
23
+ const HeaderSearchBoxes = (0, mobx_react_1.observer)(function ({ view, }) {
24
+ const { classes } = useStyles();
25
+ const { assemblyNames, coarseTotalBp } = view;
26
+ return (react_1.default.createElement("span", { className: classes.searchBox },
27
+ react_1.default.createElement(plugin_linear_genome_view_1.SearchBox, { model: view, showHelp: false }),
28
+ react_1.default.createElement(material_1.Typography, { variant: "body2", color: "textSecondary", className: classes.bp },
29
+ assemblyNames.join(','),
30
+ " ",
31
+ (0, util_1.toLocale)(Math.round(coarseTotalBp)),
32
+ " bp")));
33
+ });
34
+ exports.default = HeaderSearchBoxes;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { LinearComparativeViewModel } from '../model';
3
+ declare const LinearComparativeRenderArea: ({ model, }: {
4
+ model: LinearComparativeViewModel;
5
+ }) => React.JSX.Element;
6
+ export default LinearComparativeRenderArea;
@@ -0,0 +1,61 @@
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
+ const mobx_react_1 = require("mobx-react");
9
+ const util_1 = require("@jbrowse/core/util");
10
+ const ui_1 = require("@jbrowse/core/ui");
11
+ const configuration_1 = require("@jbrowse/core/configuration");
12
+ const useStyles = (0, mui_1.makeStyles)()({
13
+ container: {
14
+ display: 'grid',
15
+ },
16
+ overlay: {
17
+ zIndex: 100,
18
+ gridArea: '1/1',
19
+ },
20
+ resizeHandle: {
21
+ height: 4,
22
+ background: '#ccc',
23
+ },
24
+ });
25
+ function View({ view }) {
26
+ const { pluginManager } = (0, util_1.getEnv)(view);
27
+ const { ReactComponent } = pluginManager.getViewType(view.type);
28
+ return react_1.default.createElement(ReactComponent, { model: view });
29
+ }
30
+ const LinearComparativeRenderArea = (0, mobx_react_1.observer)(function ({ model, }) {
31
+ const { classes } = useStyles();
32
+ const { views, levels } = model;
33
+ const RenderList = [
34
+ react_1.default.createElement(View, { key: views[0].id, view: views[0] }),
35
+ ];
36
+ for (let i = 1; i < views.length; i++) {
37
+ const view = views[i];
38
+ const level = levels[i - 1];
39
+ RenderList.push(react_1.default.createElement(react_1.default.Fragment, { key: view.id },
40
+ react_1.default.createElement("div", { className: classes.container },
41
+ react_1.default.createElement(Overlays, { model: model, level: i - 1 })),
42
+ react_1.default.createElement(ui_1.ResizeHandle, { onDrag: n => level === null || level === void 0 ? void 0 : level.setHeight(level.height + n), className: classes.resizeHandle }),
43
+ react_1.default.createElement(View, { view: view })));
44
+ }
45
+ return react_1.default.createElement("div", { className: classes.container }, RenderList);
46
+ });
47
+ const Overlays = (0, mobx_react_1.observer)(function ({ model, level, }) {
48
+ var _a;
49
+ const { classes } = useStyles();
50
+ return (react_1.default.createElement(react_1.default.Fragment, null, (_a = model.levels[level]) === null || _a === void 0 ? void 0 : _a.tracks.map(track => {
51
+ const [display] = track.displays;
52
+ const { RenderingComponent } = display;
53
+ const trackId = (0, configuration_1.getConf)(track, 'trackId');
54
+ return RenderingComponent ? (react_1.default.createElement("div", { className: classes.overlay, key: trackId, style: {
55
+ height: display.height,
56
+ overflow: 'hidden',
57
+ } },
58
+ react_1.default.createElement(RenderingComponent, { model: display }))) : null;
59
+ })));
60
+ });
61
+ exports.default = LinearComparativeRenderArea;
@@ -1,8 +1,6 @@
1
1
  import React from 'react';
2
2
  import { LinearComparativeViewModel } from '../model';
3
- type LCV = LinearComparativeViewModel;
4
- declare const LinearComparativeView: (props: {
5
- ExtraButtons?: React.ReactNode;
6
- model: LCV;
3
+ declare const LinearComparativeView: ({ model, }: {
4
+ model: LinearComparativeViewModel;
7
5
  }) => React.JSX.Element;
8
6
  export default LinearComparativeView;
@@ -6,29 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const mui_1 = require("tss-react/mui");
8
8
  const mobx_react_1 = require("mobx-react");
9
- const configuration_1 = require("@jbrowse/core/configuration");
10
- const util_1 = require("@jbrowse/core/util");
11
- const ui_1 = require("@jbrowse/core/ui");
12
9
  const Rubberband_1 = __importDefault(require("./Rubberband"));
13
10
  const Header_1 = __importDefault(require("./Header"));
11
+ const LinearComparativeRenderArea_1 = __importDefault(require("./LinearComparativeRenderArea"));
14
12
  const useStyles = (0, mui_1.makeStyles)()(theme => ({
15
- container: {
16
- display: 'grid',
17
- },
18
- overlay: {
19
- zIndex: 100,
20
- gridArea: '1/1',
21
- },
22
- content: {
23
- gridArea: '1/1',
24
- position: 'relative',
25
- },
26
- grid: {
27
- display: 'grid',
28
- },
29
- relative: {
30
- position: 'relative',
31
- },
32
13
  // this helps keep the vertical guide inside the parent view container,
33
14
  // similar style exists in the single LGV's trackscontainer
34
15
  rubberbandContainer: {
@@ -44,56 +25,11 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
44
25
  },
45
26
  },
46
27
  }));
47
- const Overlays = (0, mobx_react_1.observer)(({ model }) => {
28
+ const LinearComparativeView = (0, mobx_react_1.observer)(function ({ model, }) {
48
29
  const { classes } = useStyles();
49
- return (react_1.default.createElement(react_1.default.Fragment, null, model.tracks.map(track => {
50
- const [display] = track.displays;
51
- const { RenderingComponent } = display;
52
- const trackId = (0, configuration_1.getConf)(track, 'trackId');
53
- return RenderingComponent ? (react_1.default.createElement("div", { className: classes.overlay, key: trackId, style: {
54
- height: model.middleComparativeHeight,
55
- overflow: 'hidden',
56
- } },
57
- react_1.default.createElement(RenderingComponent, { model: display }))) : null;
58
- })));
59
- });
60
- // The comparative is in the middle of the views
61
- const MiddleComparativeView = (0, mobx_react_1.observer)(({ model }) => {
62
- const { classes } = useStyles();
63
- const { views } = model;
64
- const { pluginManager } = (0, util_1.getEnv)(model);
65
- const { ReactComponent } = pluginManager.getViewType(views[0].type);
66
30
  return (react_1.default.createElement("div", { className: classes.rubberbandContainer },
67
31
  react_1.default.createElement(Header_1.default, { model: model }),
68
32
  react_1.default.createElement(Rubberband_1.default, { model: model, ControlComponent: react_1.default.createElement("div", { className: classes.rubberbandDiv }) }),
69
- react_1.default.createElement("div", { className: classes.container },
70
- react_1.default.createElement(ReactComponent, { model: views[0] }),
71
- react_1.default.createElement("div", { className: classes.grid },
72
- react_1.default.createElement(Overlays, { model: model })),
73
- react_1.default.createElement(ui_1.ResizeHandle, { onDrag: n => model.setMiddleComparativeHeight(model.middleComparativeHeight + n), style: {
74
- height: 4,
75
- background: '#ccc',
76
- } }),
77
- react_1.default.createElement(ReactComponent, { model: views[1] }))));
78
- });
79
- const OverlayComparativeView = (0, mobx_react_1.observer)(({ model }) => {
80
- const { classes } = useStyles();
81
- const { views } = model;
82
- const { pluginManager } = (0, util_1.getEnv)(model);
83
- return (react_1.default.createElement("div", { className: classes.rubberbandContainer },
84
- react_1.default.createElement(Header_1.default, { model: model }),
85
- react_1.default.createElement(Rubberband_1.default, { model: model, ControlComponent: react_1.default.createElement("div", { className: classes.rubberbandDiv }) }),
86
- react_1.default.createElement("div", { className: classes.container },
87
- react_1.default.createElement("div", { className: classes.content },
88
- react_1.default.createElement("div", { className: classes.relative }, views.map(view => {
89
- const { ReactComponent } = pluginManager.getViewType(view.type);
90
- return react_1.default.createElement(ReactComponent, { key: view.id, model: view });
91
- })),
92
- react_1.default.createElement(Overlays, { model: model })))));
93
- });
94
- const LinearComparativeView = (0, mobx_react_1.observer)(function (props) {
95
- const { model } = props;
96
- const middle = model.tracks.some(({ displays }) => displays.some((d) => (0, configuration_1.getConf)(d, 'middle')));
97
- return middle ? (react_1.default.createElement(MiddleComparativeView, { ...props })) : (react_1.default.createElement(OverlayComparativeView, { ...props }));
33
+ react_1.default.createElement(LinearComparativeRenderArea_1.default, { model: model })));
98
34
  });
99
35
  exports.default = LinearComparativeView;
@@ -168,7 +168,7 @@ const LinearComparativeRubberband = (0, mobx_react_1.observer)(function Rubberba
168
168
  react_1.default.createElement("div", { ref: controlsRef, className: classes.rubberbandControl, onMouseDown: mouseDown, onMouseOut: mouseOut, onMouseMove: mouseMove }, ControlComponent)));
169
169
  }
170
170
  const right = anchorPosition ? anchorPosition.offsetX : currentX || 0;
171
- const left = right < startX ? right : startX;
171
+ const left = Math.min(right, startX);
172
172
  const width = Math.abs(right - startX);
173
173
  const { views } = model;
174
174
  const leftBpOffset = views.map(view => view.pxToBp(left));
@@ -34,6 +34,9 @@ function LinearComparativeViewF(pluginManager) {
34
34
  pluginManager.addViewType(() => {
35
35
  return new ViewType_1.default({
36
36
  name: 'LinearComparativeView',
37
+ viewMetadata: {
38
+ hiddenFromGUI: true,
39
+ },
37
40
  displayName: 'Linear comparative view',
38
41
  stateModel: (0, model_1.default)(pluginManager),
39
42
  ReactComponent: (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./components/LinearComparativeView')))),