@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.
- package/dist/LaunchLinearSyntenyView.js +41 -11
- package/dist/LinearComparativeDisplay/stateModelFactory.d.ts +14 -9
- package/dist/LinearComparativeDisplay/stateModelFactory.js +8 -9
- package/dist/LinearComparativeView/components/Header.d.ts +2 -3
- package/dist/LinearComparativeView/components/Header.js +72 -62
- package/dist/LinearComparativeView/components/HeaderSearchBoxes.d.ts +6 -0
- package/dist/LinearComparativeView/components/HeaderSearchBoxes.js +34 -0
- package/dist/LinearComparativeView/components/LinearComparativeRenderArea.d.ts +6 -0
- package/dist/LinearComparativeView/components/LinearComparativeRenderArea.js +61 -0
- package/dist/LinearComparativeView/components/LinearComparativeView.d.ts +2 -4
- package/dist/LinearComparativeView/components/LinearComparativeView.js +3 -67
- package/dist/LinearComparativeView/components/Rubberband.js +1 -1
- package/dist/LinearComparativeView/index.js +3 -0
- package/dist/LinearComparativeView/model.d.ts +265 -12
- package/dist/LinearComparativeView/model.js +45 -75
- package/dist/LinearSyntenyDisplay/afterAttach.js +5 -3
- package/dist/LinearSyntenyDisplay/components/LinearSyntenyRendering.js +32 -24
- package/dist/LinearSyntenyDisplay/components/SyntenyContextMenu.js +12 -6
- package/dist/LinearSyntenyDisplay/components/util.d.ts +2 -1
- package/dist/LinearSyntenyDisplay/components/util.js +5 -5
- package/dist/LinearSyntenyDisplay/drawSynteny.d.ts +1 -1
- package/dist/LinearSyntenyDisplay/drawSynteny.js +28 -22
- package/dist/LinearSyntenyDisplay/index.js +1 -1
- package/dist/LinearSyntenyDisplay/model.d.ts +12 -11
- package/dist/LinearSyntenyDisplay/model.js +7 -0
- package/dist/LinearSyntenyView/components/ImportForm/{ImportCustomTrack.d.ts → AddCustomTrack.d.ts} +2 -3
- package/dist/LinearSyntenyView/components/ImportForm/{ImportCustomTrack.js → AddCustomTrack.js} +3 -3
- package/dist/LinearSyntenyView/components/ImportForm/LinearSyntenyImportForm.js +195 -0
- package/dist/LinearSyntenyView/components/ImportForm/Spacer.d.ts +2 -0
- package/dist/LinearSyntenyView/components/ImportForm/Spacer.js +10 -0
- package/dist/LinearSyntenyView/components/ImportForm/TrackSelector.d.ts +10 -0
- package/dist/LinearSyntenyView/components/ImportForm/{ImportSyntenyTrackSelector.js → TrackSelector.js} +15 -20
- package/dist/LinearSyntenyView/components/ImportForm/TrackSelectorUtil.d.ts +14 -0
- package/dist/LinearSyntenyView/components/ImportForm/TrackSelectorUtil.js +52 -0
- package/dist/LinearSyntenyView/components/LinearSyntenyView.js +3 -3
- package/dist/LinearSyntenyView/index.js +1 -1
- package/dist/LinearSyntenyView/model.d.ts +267 -9
- package/dist/LinearSyntenyView/model.js +2 -2
- package/dist/LinearSyntenyView/svgcomponents/SVGLinearGenomeView.d.ts +12 -0
- package/dist/LinearSyntenyView/svgcomponents/SVGLinearGenomeView.js +19 -0
- package/dist/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.d.ts +1 -3
- package/dist/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.js +36 -27
- package/dist/LinearSyntenyViewHelper/index.d.ts +2 -0
- package/dist/LinearSyntenyViewHelper/index.js +25 -0
- package/dist/LinearSyntenyViewHelper/stateModelFactory.d.ts +30 -0
- package/dist/LinearSyntenyViewHelper/stateModelFactory.js +105 -0
- package/dist/index.js +2 -0
- package/esm/LaunchLinearSyntenyView.js +41 -11
- package/esm/LinearComparativeDisplay/stateModelFactory.d.ts +14 -9
- package/esm/LinearComparativeDisplay/stateModelFactory.js +9 -10
- package/esm/LinearComparativeView/components/Header.d.ts +2 -3
- package/esm/LinearComparativeView/components/Header.js +73 -63
- package/esm/LinearComparativeView/components/HeaderSearchBoxes.d.ts +6 -0
- package/esm/LinearComparativeView/components/HeaderSearchBoxes.js +29 -0
- package/esm/LinearComparativeView/components/LinearComparativeRenderArea.d.ts +6 -0
- package/esm/LinearComparativeView/components/LinearComparativeRenderArea.js +56 -0
- package/esm/LinearComparativeView/components/LinearComparativeView.d.ts +2 -4
- package/esm/LinearComparativeView/components/LinearComparativeView.js +3 -67
- package/esm/LinearComparativeView/components/Rubberband.js +1 -1
- package/esm/LinearComparativeView/index.js +3 -0
- package/esm/LinearComparativeView/model.d.ts +265 -12
- package/esm/LinearComparativeView/model.js +47 -77
- package/esm/LinearSyntenyDisplay/afterAttach.js +6 -4
- package/esm/LinearSyntenyDisplay/components/LinearSyntenyRendering.js +33 -25
- package/esm/LinearSyntenyDisplay/components/SyntenyContextMenu.js +12 -6
- package/esm/LinearSyntenyDisplay/components/util.d.ts +2 -1
- package/esm/LinearSyntenyDisplay/components/util.js +5 -5
- package/esm/LinearSyntenyDisplay/drawSynteny.d.ts +1 -1
- package/esm/LinearSyntenyDisplay/drawSynteny.js +28 -22
- package/esm/LinearSyntenyDisplay/index.js +1 -1
- package/esm/LinearSyntenyDisplay/model.d.ts +12 -11
- package/esm/LinearSyntenyDisplay/model.js +8 -1
- package/esm/LinearSyntenyView/components/ImportForm/{ImportCustomTrack.d.ts → AddCustomTrack.d.ts} +2 -3
- package/esm/LinearSyntenyView/components/ImportForm/{ImportCustomTrack.js → AddCustomTrack.js} +3 -3
- package/esm/LinearSyntenyView/components/ImportForm/LinearSyntenyImportForm.js +167 -0
- package/esm/LinearSyntenyView/components/ImportForm/Spacer.d.ts +2 -0
- package/esm/LinearSyntenyView/components/ImportForm/Spacer.js +4 -0
- package/esm/LinearSyntenyView/components/ImportForm/TrackSelector.d.ts +10 -0
- package/esm/LinearSyntenyView/components/ImportForm/{ImportSyntenyTrackSelector.js → TrackSelector.js} +15 -20
- package/esm/LinearSyntenyView/components/ImportForm/TrackSelectorUtil.d.ts +14 -0
- package/esm/LinearSyntenyView/components/ImportForm/TrackSelectorUtil.js +23 -0
- package/esm/LinearSyntenyView/components/LinearSyntenyView.js +3 -3
- package/esm/LinearSyntenyView/index.js +1 -1
- package/esm/LinearSyntenyView/model.d.ts +267 -9
- package/esm/LinearSyntenyView/model.js +2 -2
- package/esm/LinearSyntenyView/svgcomponents/SVGLinearGenomeView.d.ts +12 -0
- package/esm/LinearSyntenyView/svgcomponents/SVGLinearGenomeView.js +13 -0
- package/esm/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.d.ts +1 -3
- package/esm/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.js +38 -29
- package/esm/LinearSyntenyViewHelper/index.d.ts +2 -0
- package/esm/LinearSyntenyViewHelper/index.js +19 -0
- package/esm/LinearSyntenyViewHelper/stateModelFactory.d.ts +30 -0
- package/esm/LinearSyntenyViewHelper/stateModelFactory.js +102 -0
- package/esm/index.js +2 -0
- package/package.json +2 -2
- package/dist/LinearSyntenyView/components/ImportForm/ImportSyntenyTrackSelector.d.ts +0 -9
- package/dist/LinearSyntenyView/components/ImportForm/index.js +0 -138
- package/esm/LinearSyntenyView/components/ImportForm/ImportSyntenyTrackSelector.d.ts +0 -9
- package/esm/LinearSyntenyView/components/ImportForm/index.js +0 -110
- /package/dist/LinearSyntenyView/components/ImportForm/{index.d.ts → LinearSyntenyImportForm.d.ts} +0 -0
- /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
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
idsNotFound = [
|
|
41
|
+
...idsNotFound,
|
|
42
|
+
...tracks.map(trackId => tryTrackLGV({
|
|
43
|
+
model: view,
|
|
44
|
+
trackId,
|
|
45
|
+
})),
|
|
46
|
+
];
|
|
39
47
|
}));
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
137
|
-
// something under our control. Compare to
|
|
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
|
|
161
|
+
const { adapterConfig, level } = renderProps;
|
|
162
|
+
const view = renderProps.view.views[level];
|
|
164
163
|
const features = (await rpcManager.call('getFeats', 'CoreGetFeatures', {
|
|
165
|
-
regions:
|
|
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
|
-
|
|
4
|
-
|
|
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
|
|
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
|
|
39
|
-
const useStyles = (0, mui_1.makeStyles)()(
|
|
40
|
-
|
|
41
|
-
|
|
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
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
react_1.default.createElement(
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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,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,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
|
-
|
|
4
|
-
|
|
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
|
|
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(
|
|
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
|
|
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')))),
|