@jbrowse/plugin-linear-genome-view 2.8.0 → 2.10.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/BaseLinearDisplay/components/Tooltip.js +18 -50
- package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +4 -16
- package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js +8 -1
- package/dist/BasicTrack/configSchema.d.ts +5 -0
- package/dist/FeatureTrack/configSchema.d.ts +5 -0
- package/dist/LaunchLinearGenomeView/index.js +16 -14
- package/dist/LinearBareDisplay/model.d.ts +8 -11
- package/dist/LinearBareDisplay/model.js +2 -1
- package/dist/LinearBasicDisplay/model.d.ts +30 -33
- package/dist/LinearBasicDisplay/model.js +3 -0
- package/dist/LinearGenomeView/components/CenterLine.js +1 -1
- package/dist/LinearGenomeView/components/Cytobands.d.ts +18 -6
- package/dist/LinearGenomeView/components/Cytobands.js +8 -2
- package/dist/LinearGenomeView/components/ImportForm.js +26 -74
- package/dist/LinearGenomeView/components/ImportFormRefNameAutocomplete.d.ts +12 -0
- package/dist/LinearGenomeView/components/ImportFormRefNameAutocomplete.js +29 -0
- package/dist/LinearGenomeView/components/OverviewScalebar.js +1 -1
- package/dist/LinearGenomeView/components/SearchBox.js +19 -56
- package/dist/LinearGenomeView/components/TracksContainer.js +1 -1
- package/dist/LinearGenomeView/model.d.ts +18 -2
- package/dist/LinearGenomeView/model.js +19 -0
- package/dist/LinearGenomeView/svgcomponents/SVGLinearGenomeView.d.ts +0 -7
- package/dist/LinearGenomeView/svgcomponents/SVGLinearGenomeView.js +11 -13
- package/dist/LinearGenomeView/svgcomponents/util.d.ts +8 -0
- package/dist/LinearGenomeView/svgcomponents/util.js +9 -0
- package/dist/index.d.ts +776 -7
- package/dist/index.js +5 -4
- package/dist/searchUtils.d.ts +26 -0
- package/dist/searchUtils.js +90 -0
- package/esm/BaseLinearDisplay/components/Tooltip.js +16 -28
- package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +4 -16
- package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.js +8 -1
- package/esm/BasicTrack/configSchema.d.ts +5 -0
- package/esm/FeatureTrack/configSchema.d.ts +5 -0
- package/esm/LaunchLinearGenomeView/index.js +16 -14
- package/esm/LinearBareDisplay/model.d.ts +8 -11
- package/esm/LinearBareDisplay/model.js +2 -1
- package/esm/LinearBasicDisplay/model.d.ts +30 -33
- package/esm/LinearBasicDisplay/model.js +3 -0
- package/esm/LinearGenomeView/components/CenterLine.js +1 -1
- package/esm/LinearGenomeView/components/Cytobands.d.ts +18 -6
- package/esm/LinearGenomeView/components/Cytobands.js +8 -2
- package/esm/LinearGenomeView/components/ImportForm.js +26 -74
- package/esm/LinearGenomeView/components/ImportFormRefNameAutocomplete.d.ts +12 -0
- package/esm/LinearGenomeView/components/ImportFormRefNameAutocomplete.js +24 -0
- package/esm/LinearGenomeView/components/OverviewScalebar.js +1 -1
- package/esm/LinearGenomeView/components/SearchBox.js +20 -57
- package/esm/LinearGenomeView/components/TracksContainer.js +1 -1
- package/esm/LinearGenomeView/model.d.ts +18 -2
- package/esm/LinearGenomeView/model.js +19 -0
- package/esm/LinearGenomeView/svgcomponents/SVGLinearGenomeView.d.ts +0 -7
- package/esm/LinearGenomeView/svgcomponents/SVGLinearGenomeView.js +9 -10
- package/esm/LinearGenomeView/svgcomponents/util.d.ts +8 -0
- package/esm/LinearGenomeView/svgcomponents/util.js +5 -0
- package/esm/index.d.ts +776 -7
- package/esm/index.js +4 -3
- package/esm/searchUtils.d.ts +26 -0
- package/esm/searchUtils.js +79 -0
- package/package.json +4 -6
|
@@ -34,9 +34,8 @@ const material_1 = require("@mui/material");
|
|
|
34
34
|
const ui_1 = require("@jbrowse/core/ui");
|
|
35
35
|
// icons
|
|
36
36
|
const Close_1 = __importDefault(require("@mui/icons-material/Close"));
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
const util_2 = require("./util");
|
|
37
|
+
const searchUtils_1 = require("../../searchUtils");
|
|
38
|
+
const ImportFormRefNameAutocomplete_1 = __importDefault(require("./ImportFormRefNameAutocomplete"));
|
|
40
39
|
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
41
40
|
importFormContainer: {
|
|
42
41
|
padding: theme.spacing(2),
|
|
@@ -52,11 +51,10 @@ const LinearGenomeViewImportForm = (0, mobx_react_1.observer)(function ({ model,
|
|
|
52
51
|
var _a;
|
|
53
52
|
const { classes } = useStyles();
|
|
54
53
|
const session = (0, util_1.getSession)(model);
|
|
55
|
-
const { assemblyNames, assemblyManager
|
|
56
|
-
const {
|
|
54
|
+
const { assemblyNames, assemblyManager } = session;
|
|
55
|
+
const { error } = model;
|
|
57
56
|
const [selectedAsm, setSelectedAsm] = (0, react_1.useState)(assemblyNames[0]);
|
|
58
57
|
const [option, setOption] = (0, react_1.useState)();
|
|
59
|
-
const searchScope = model.searchScope(selectedAsm);
|
|
60
58
|
const assembly = assemblyManager.get(selectedAsm);
|
|
61
59
|
const assemblyError = assemblyNames.length
|
|
62
60
|
? assembly === null || assembly === void 0 ? void 0 : assembly.error
|
|
@@ -74,74 +72,37 @@ const LinearGenomeViewImportForm = (0, mobx_react_1.observer)(function ({ model,
|
|
|
74
72
|
(0, react_1.useEffect)(() => {
|
|
75
73
|
setValue(r0);
|
|
76
74
|
}, [r0, selectedAsm]);
|
|
77
|
-
async function navToOption(option) {
|
|
78
|
-
const location = option.getLocation();
|
|
79
|
-
const trackId = option.getTrackId();
|
|
80
|
-
if (location) {
|
|
81
|
-
await model.navToLocString(location, selectedAsm);
|
|
82
|
-
if (trackId) {
|
|
83
|
-
model.showTrack(trackId);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// gets a string as input, or use stored option results from previous query,
|
|
88
|
-
// then re-query and
|
|
89
|
-
// 1) if it has multiple results: pop a dialog
|
|
90
|
-
// 2) if it's a single result navigate to it
|
|
91
|
-
// 3) else assume it's a locstring and navigate to it
|
|
92
|
-
async function handleSelectedRegion(input) {
|
|
93
|
-
var _a;
|
|
94
|
-
try {
|
|
95
|
-
if ((option === null || option === void 0 ? void 0 : option.getDisplayString()) === input && option.hasLocation()) {
|
|
96
|
-
await navToOption(option);
|
|
97
|
-
}
|
|
98
|
-
else if ((_a = option === null || option === void 0 ? void 0 : option.results) === null || _a === void 0 ? void 0 : _a.length) {
|
|
99
|
-
model.setSearchResults(option.results, option.getLabel(), selectedAsm);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
const [ref, rest] = (0, util_2.splitLast)(input, ':');
|
|
103
|
-
const allRefs = (assembly === null || assembly === void 0 ? void 0 : assembly.allRefNamesWithLowerCase) || [];
|
|
104
|
-
if (allRefs.includes(input) ||
|
|
105
|
-
(allRefs.includes(ref) && !Number.isNaN(Number.parseInt(rest, 10)))) {
|
|
106
|
-
await model.navToLocString(input, selectedAsm);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
const results = await (0, util_2.fetchResults)({
|
|
110
|
-
queryString: input,
|
|
111
|
-
searchType: 'exact',
|
|
112
|
-
searchScope,
|
|
113
|
-
rankSearchResults,
|
|
114
|
-
textSearchManager,
|
|
115
|
-
assembly,
|
|
116
|
-
});
|
|
117
|
-
if (results.length > 1) {
|
|
118
|
-
model.setSearchResults(results, input.toLowerCase(), selectedAsm);
|
|
119
|
-
}
|
|
120
|
-
else if (results.length === 1) {
|
|
121
|
-
await navToOption(results[0]);
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
await model.navToLocString(input, selectedAsm);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
catch (e) {
|
|
130
|
-
console.error(e);
|
|
131
|
-
session.notify(`${e}`, 'warning');
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
75
|
// implementation notes:
|
|
135
76
|
// having this wrapped in a form allows intuitive use of enter key to submit
|
|
136
77
|
return (react_1.default.createElement("div", { className: classes.container },
|
|
137
78
|
displayError ? react_1.default.createElement(ui_1.ErrorMessage, { error: displayError }) : null,
|
|
138
79
|
react_1.default.createElement(material_1.Container, { className: classes.importFormContainer },
|
|
139
80
|
react_1.default.createElement("form", { onSubmit: async (event) => {
|
|
81
|
+
var _a;
|
|
140
82
|
event.preventDefault();
|
|
141
83
|
model.setError(undefined);
|
|
142
84
|
if (value) {
|
|
143
85
|
// has it's own error handling
|
|
144
|
-
|
|
86
|
+
try {
|
|
87
|
+
if ((option === null || option === void 0 ? void 0 : option.getDisplayString()) === value &&
|
|
88
|
+
option.hasLocation()) {
|
|
89
|
+
await (0, searchUtils_1.navToOption)({
|
|
90
|
+
option,
|
|
91
|
+
model,
|
|
92
|
+
assemblyName: selectedAsm,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else if ((_a = option === null || option === void 0 ? void 0 : option.results) === null || _a === void 0 ? void 0 : _a.length) {
|
|
96
|
+
model.setSearchResults(option.results, option.getLabel(), selectedAsm);
|
|
97
|
+
}
|
|
98
|
+
else if (assembly) {
|
|
99
|
+
await (0, searchUtils_1.handleSelectedRegion)({ input: value, assembly, model });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
console.error(e);
|
|
104
|
+
session.notify(`${e}`, 'warning');
|
|
105
|
+
}
|
|
145
106
|
}
|
|
146
107
|
} },
|
|
147
108
|
react_1.default.createElement(material_1.Grid, { container: true, spacing: 1, justifyContent: "center", alignItems: "center" },
|
|
@@ -149,16 +110,7 @@ const LinearGenomeViewImportForm = (0, mobx_react_1.observer)(function ({ model,
|
|
|
149
110
|
react_1.default.createElement(material_1.FormControl, null,
|
|
150
111
|
react_1.default.createElement(ui_1.AssemblySelector, { onChange: val => setSelectedAsm(val), localStorageKey: "lgv", session: session, selected: selectedAsm }))),
|
|
151
112
|
react_1.default.createElement(material_1.Grid, { item: true }, selectedAsm ? (assemblyError ? (react_1.default.createElement(Close_1.default, { style: { color: 'red' } })) : assemblyLoaded ? (react_1.default.createElement(material_1.FormControl, null,
|
|
152
|
-
react_1.default.createElement(
|
|
153
|
-
queryString,
|
|
154
|
-
assembly,
|
|
155
|
-
textSearchManager,
|
|
156
|
-
rankSearchResults,
|
|
157
|
-
searchScope,
|
|
158
|
-
}), model: model, assemblyName: selectedAsm, value: value, minWidth: 270, onChange: str => setValue(str), onSelect: val => setOption(val), TextFieldProps: {
|
|
159
|
-
variant: 'outlined',
|
|
160
|
-
helperText: 'Enter sequence name, feature name, or location',
|
|
161
|
-
} }))) : (react_1.default.createElement(material_1.CircularProgress, { size: 20, disableShrink: true }))) : null),
|
|
113
|
+
react_1.default.createElement(ImportFormRefNameAutocomplete_1.default, { value: value, setValue: setValue, selectedAsm: selectedAsm, setOption: setOption, model: model }))) : (react_1.default.createElement(material_1.CircularProgress, { size: 20, disableShrink: true }))) : null),
|
|
162
114
|
react_1.default.createElement(material_1.Grid, { item: true },
|
|
163
115
|
react_1.default.createElement(material_1.FormControl, null,
|
|
164
116
|
react_1.default.createElement(material_1.Button, { type: "submit", disabled: !value, className: classes.button, variant: "contained", color: "primary" }, "Open")),
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import BaseResult from '@jbrowse/core/TextSearch/BaseResults';
|
|
3
|
+
import { LinearGenomeViewModel } from '..';
|
|
4
|
+
type LGV = LinearGenomeViewModel;
|
|
5
|
+
declare const ImportFormRefNameAutocomplete: ({ model, selectedAsm, value, setValue, setOption, }: {
|
|
6
|
+
value: string;
|
|
7
|
+
setValue: (arg: string) => void;
|
|
8
|
+
model: LGV;
|
|
9
|
+
selectedAsm: string;
|
|
10
|
+
setOption: (arg: BaseResult) => void;
|
|
11
|
+
}) => React.JSX.Element;
|
|
12
|
+
export default ImportFormRefNameAutocomplete;
|
|
@@ -0,0 +1,29 @@
|
|
|
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 util_1 = require("@jbrowse/core/util");
|
|
9
|
+
// locals
|
|
10
|
+
const RefNameAutocomplete_1 = __importDefault(require("./RefNameAutocomplete"));
|
|
11
|
+
const util_2 = require("./util");
|
|
12
|
+
const ImportFormRefNameAutocomplete = (0, mobx_react_1.observer)(function ({ model, selectedAsm, value, setValue, setOption, }) {
|
|
13
|
+
const session = (0, util_1.getSession)(model);
|
|
14
|
+
const { assemblyManager, textSearchManager } = session;
|
|
15
|
+
const { rankSearchResults } = model;
|
|
16
|
+
const searchScope = model.searchScope(selectedAsm);
|
|
17
|
+
const assembly = assemblyManager.get(selectedAsm);
|
|
18
|
+
return (react_1.default.createElement(RefNameAutocomplete_1.default, { fetchResults: queryString => (0, util_2.fetchResults)({
|
|
19
|
+
queryString,
|
|
20
|
+
assembly,
|
|
21
|
+
textSearchManager,
|
|
22
|
+
rankSearchResults,
|
|
23
|
+
searchScope,
|
|
24
|
+
}), model: model, assemblyName: selectedAsm, value: value, minWidth: 270, onChange: str => setValue(str), onSelect: val => setOption(val), TextFieldProps: {
|
|
25
|
+
variant: 'outlined',
|
|
26
|
+
helperText: 'Enter sequence name, feature name, or location',
|
|
27
|
+
} }));
|
|
28
|
+
});
|
|
29
|
+
exports.default = ImportFormRefNameAutocomplete;
|
|
@@ -225,7 +225,7 @@ const OverviewScalebar = (0, mobx_react_1.observer)(function ({ model, children,
|
|
|
225
225
|
overview.showAllRegions();
|
|
226
226
|
return overview;
|
|
227
227
|
}, [
|
|
228
|
-
JSON.stringify(displayedRegions),
|
|
228
|
+
JSON.stringify(displayedRegions), // eslint-disable-line react-hooks/exhaustive-deps
|
|
229
229
|
model.minimumBlockWidth,
|
|
230
230
|
modWidth,
|
|
231
231
|
displayedRegions,
|
|
@@ -12,16 +12,12 @@ const util_1 = require("@jbrowse/core/util");
|
|
|
12
12
|
const RefNameAutocomplete_1 = __importDefault(require("./RefNameAutocomplete"));
|
|
13
13
|
const util_2 = require("./util");
|
|
14
14
|
const __1 = require("..");
|
|
15
|
+
const searchUtils_1 = require("../../searchUtils");
|
|
15
16
|
const useStyles = (0, mui_1.makeStyles)()(() => ({
|
|
16
17
|
headerRefName: {
|
|
17
18
|
minWidth: 100,
|
|
18
19
|
},
|
|
19
20
|
}));
|
|
20
|
-
function checkRef(str, allRefs) {
|
|
21
|
-
const [ref, rest] = (0, util_2.splitLast)(str, ':');
|
|
22
|
-
return (allRefs.includes(str) ||
|
|
23
|
-
(allRefs.includes(ref) && !Number.isNaN(Number.parseInt(rest, 10))));
|
|
24
|
-
}
|
|
25
21
|
const SearchBox = (0, mobx_react_1.observer)(function ({ model, showHelp, }) {
|
|
26
22
|
const { classes } = useStyles();
|
|
27
23
|
const theme = (0, material_1.useTheme)();
|
|
@@ -31,61 +27,28 @@ const SearchBox = (0, mobx_react_1.observer)(function ({ model, showHelp, }) {
|
|
|
31
27
|
const assemblyName = assemblyNames[0];
|
|
32
28
|
const assembly = assemblyManager.get(assemblyName);
|
|
33
29
|
const searchScope = model.searchScope(assemblyName);
|
|
34
|
-
async
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (trackId) {
|
|
40
|
-
model.showTrack(trackId);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
// gets a string as input, or use stored option results from previous query,
|
|
45
|
-
// then re-query and
|
|
46
|
-
// 1) if it has multiple results: pop a dialog
|
|
47
|
-
// 2) if it's a single result navigate to it
|
|
48
|
-
// 3) else assume it's a locstring and navigate to it
|
|
49
|
-
async function handleSelectedRegion(option) {
|
|
50
|
-
var _a;
|
|
51
|
-
try {
|
|
52
|
-
const input = option.getLabel();
|
|
53
|
-
const allRefs = (assembly === null || assembly === void 0 ? void 0 : assembly.allRefNamesWithLowerCase) || [];
|
|
54
|
-
if (option.hasLocation()) {
|
|
55
|
-
await navToOption(option);
|
|
56
|
-
}
|
|
57
|
-
else if ((_a = option.results) === null || _a === void 0 ? void 0 : _a.length) {
|
|
58
|
-
model.setSearchResults(option.results, option.getLabel());
|
|
59
|
-
}
|
|
60
|
-
else if (input.split(' ').every(entry => checkRef(entry, allRefs))) {
|
|
61
|
-
await model.navToLocString(input, assemblyName);
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
const results = await (0, util_2.fetchResults)({
|
|
65
|
-
queryString: input,
|
|
66
|
-
searchType: 'exact',
|
|
67
|
-
searchScope,
|
|
68
|
-
rankSearchResults,
|
|
69
|
-
textSearchManager,
|
|
70
|
-
assembly,
|
|
71
|
-
});
|
|
72
|
-
if (results.length > 1) {
|
|
73
|
-
model.setSearchResults(results, input.toLowerCase());
|
|
30
|
+
return (react_1.default.createElement(RefNameAutocomplete_1.default, { showHelp: showHelp, onSelect: async (option) => {
|
|
31
|
+
var _a;
|
|
32
|
+
try {
|
|
33
|
+
if (option.hasLocation()) {
|
|
34
|
+
await (0, searchUtils_1.navToOption)({ option, model, assemblyName });
|
|
74
35
|
}
|
|
75
|
-
else if (results
|
|
76
|
-
|
|
36
|
+
else if ((_a = option.results) === null || _a === void 0 ? void 0 : _a.length) {
|
|
37
|
+
model.setSearchResults(option.results, option.getLabel());
|
|
77
38
|
}
|
|
78
|
-
else {
|
|
79
|
-
await
|
|
39
|
+
else if (assembly) {
|
|
40
|
+
await (0, searchUtils_1.handleSelectedRegion)({
|
|
41
|
+
input: option.getLabel(),
|
|
42
|
+
assembly,
|
|
43
|
+
model,
|
|
44
|
+
});
|
|
80
45
|
}
|
|
81
46
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return (react_1.default.createElement(RefNameAutocomplete_1.default, { showHelp: showHelp, onSelect: handleSelectedRegion, assemblyName: assemblyName, fetchResults: queryString => (0, util_2.fetchResults)({
|
|
47
|
+
catch (e) {
|
|
48
|
+
console.error(e);
|
|
49
|
+
(0, util_1.getSession)(model).notify(`${e}`, 'warning');
|
|
50
|
+
}
|
|
51
|
+
}, assemblyName: assemblyName, fetchResults: queryString => (0, util_2.fetchResults)({
|
|
89
52
|
queryString,
|
|
90
53
|
searchScope,
|
|
91
54
|
rankSearchResults,
|
|
@@ -30,6 +30,7 @@ const react_1 = __importStar(require("react"));
|
|
|
30
30
|
const mui_1 = require("tss-react/mui");
|
|
31
31
|
const mobx_react_1 = require("mobx-react");
|
|
32
32
|
const ui_1 = require("@jbrowse/core/ui");
|
|
33
|
+
const util_1 = require("@jbrowse/core/util");
|
|
33
34
|
// local utils
|
|
34
35
|
const __1 = require("..");
|
|
35
36
|
const hooks_1 = require("./hooks");
|
|
@@ -40,7 +41,6 @@ const Gridlines_1 = __importDefault(require("./Gridlines"));
|
|
|
40
41
|
const CenterLine_1 = __importDefault(require("./CenterLine"));
|
|
41
42
|
const VerticalGuide_1 = __importDefault(require("./VerticalGuide"));
|
|
42
43
|
const RubberbandSpan_1 = __importDefault(require("./RubberbandSpan"));
|
|
43
|
-
const util_1 = require("@jbrowse/core/util");
|
|
44
44
|
const useStyles = (0, mui_1.makeStyles)()({
|
|
45
45
|
tracksContainer: {
|
|
46
46
|
position: 'relative',
|
|
@@ -6,6 +6,7 @@ import BaseResult from '@jbrowse/core/TextSearch/BaseResults';
|
|
|
6
6
|
import { BlockSet, BaseBlock } from '@jbrowse/core/util/blockTypes';
|
|
7
7
|
import { Instance } from 'mobx-state-tree';
|
|
8
8
|
import PluginManager from '@jbrowse/core/PluginManager';
|
|
9
|
+
import { Assembly } from '@jbrowse/core/assemblyManager/assembly';
|
|
9
10
|
export interface BpOffset {
|
|
10
11
|
refName?: string;
|
|
11
12
|
index: number;
|
|
@@ -20,7 +21,9 @@ export interface BpOffset {
|
|
|
20
21
|
export interface ExportSvgOptions {
|
|
21
22
|
rasterizeLayers?: boolean;
|
|
22
23
|
filename?: string;
|
|
23
|
-
Wrapper?: React.FC<
|
|
24
|
+
Wrapper?: React.FC<{
|
|
25
|
+
children: React.ReactNode;
|
|
26
|
+
}>;
|
|
24
27
|
fontSize?: number;
|
|
25
28
|
rulerHeight?: number;
|
|
26
29
|
textHeight?: number;
|
|
@@ -46,6 +49,9 @@ export declare const WIDGET_HEIGHT = 32;
|
|
|
46
49
|
/**
|
|
47
50
|
* #stateModel LinearGenomeView
|
|
48
51
|
* #category view
|
|
52
|
+
*
|
|
53
|
+
* extends
|
|
54
|
+
* - [BaseViewModel](../baseviewmodel)
|
|
49
55
|
*/
|
|
50
56
|
export declare function stateModelFactory(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
|
|
51
57
|
id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
@@ -292,7 +298,7 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
292
298
|
/**
|
|
293
299
|
* #action
|
|
294
300
|
*/
|
|
295
|
-
toggleTrack(trackId: string):
|
|
301
|
+
toggleTrack(trackId: string): boolean;
|
|
296
302
|
/**
|
|
297
303
|
* #action
|
|
298
304
|
*/
|
|
@@ -463,6 +469,16 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
463
469
|
* navigating to the locstring
|
|
464
470
|
*/
|
|
465
471
|
navToLocString(input: string, optAssemblyName?: string): Promise<void>;
|
|
472
|
+
/**
|
|
473
|
+
* #action
|
|
474
|
+
* Performs a text index search, and navigates to it immediately if a
|
|
475
|
+
* single result is returned. Will pop up a search dialog if multiple
|
|
476
|
+
* results are returned
|
|
477
|
+
*/
|
|
478
|
+
navToSearchString({ input, assembly, }: {
|
|
479
|
+
input: string;
|
|
480
|
+
assembly: Assembly;
|
|
481
|
+
}): Promise<void>;
|
|
466
482
|
/**
|
|
467
483
|
* #action
|
|
468
484
|
* Similar to `navToLocString`, but accepts parsed location objects
|
|
@@ -53,6 +53,7 @@ const MenuOpen_1 = __importDefault(require("@mui/icons-material/MenuOpen"));
|
|
|
53
53
|
const MiniControls_1 = __importDefault(require("./components/MiniControls"));
|
|
54
54
|
const Header_1 = __importDefault(require("./components/Header"));
|
|
55
55
|
const util_2 = require("./util");
|
|
56
|
+
const searchUtils_1 = require("../searchUtils");
|
|
56
57
|
// lazies
|
|
57
58
|
const ReturnToImportFormDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('@jbrowse/core/ui/ReturnToImportFormDialog'))));
|
|
58
59
|
const SequenceSearchDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./components/SequenceSearchDialog'))));
|
|
@@ -82,6 +83,9 @@ exports.WIDGET_HEIGHT = 32;
|
|
|
82
83
|
/**
|
|
83
84
|
* #stateModel LinearGenomeView
|
|
84
85
|
* #category view
|
|
86
|
+
*
|
|
87
|
+
* extends
|
|
88
|
+
* - [BaseViewModel](../baseviewmodel)
|
|
85
89
|
*/
|
|
86
90
|
function stateModelFactory(pluginManager) {
|
|
87
91
|
return mobx_state_tree_1.types
|
|
@@ -624,7 +628,9 @@ function stateModelFactory(pluginManager) {
|
|
|
624
628
|
// if none had that configuration, turn one on
|
|
625
629
|
if (!hiddenCount) {
|
|
626
630
|
self.showTrack(trackId);
|
|
631
|
+
return true;
|
|
627
632
|
}
|
|
633
|
+
return false;
|
|
628
634
|
},
|
|
629
635
|
/**
|
|
630
636
|
* #action
|
|
@@ -1106,6 +1112,19 @@ function stateModelFactory(pluginManager) {
|
|
|
1106
1112
|
}
|
|
1107
1113
|
return this.navToLocations((0, util_2.parseLocStrings)(input, assemblyName, isValidRefName), assemblyName);
|
|
1108
1114
|
},
|
|
1115
|
+
/**
|
|
1116
|
+
* #action
|
|
1117
|
+
* Performs a text index search, and navigates to it immediately if a
|
|
1118
|
+
* single result is returned. Will pop up a search dialog if multiple
|
|
1119
|
+
* results are returned
|
|
1120
|
+
*/
|
|
1121
|
+
async navToSearchString({ input, assembly, }) {
|
|
1122
|
+
await (0, searchUtils_1.handleSelectedRegion)({
|
|
1123
|
+
input,
|
|
1124
|
+
assembly,
|
|
1125
|
+
model: self,
|
|
1126
|
+
});
|
|
1127
|
+
},
|
|
1109
1128
|
/**
|
|
1110
1129
|
* #action
|
|
1111
1130
|
* Similar to `navToLocString`, but accepts parsed location objects
|
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
import { LinearGenomeViewModel, ExportSvgOptions } from '..';
|
|
2
2
|
type LGV = LinearGenomeViewModel;
|
|
3
|
-
interface Display {
|
|
4
|
-
height: number;
|
|
5
|
-
}
|
|
6
|
-
interface Track {
|
|
7
|
-
displays: Display[];
|
|
8
|
-
}
|
|
9
|
-
export declare function totalHeight(tracks: Track[], textHeight: number, trackLabels: string): number;
|
|
10
3
|
export declare function renderToSvg(model: LGV, opts: ExportSvgOptions): Promise<string>;
|
|
11
4
|
export { default as SVGRuler } from './SVGRuler';
|
|
12
5
|
export { default as SVGTracks } from './SVGTracks';
|
|
@@ -3,35 +3,33 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SVGTracks = exports.SVGRuler = exports.renderToSvg =
|
|
6
|
+
exports.SVGTracks = exports.SVGRuler = exports.renderToSvg = void 0;
|
|
7
7
|
/* eslint-disable react-refresh/only-export-components */
|
|
8
8
|
const react_1 = __importDefault(require("react"));
|
|
9
|
-
const server_1 = require("react-dom/server");
|
|
10
9
|
const mobx_1 = require("mobx");
|
|
11
10
|
const util_1 = require("@jbrowse/core/util");
|
|
12
11
|
const material_1 = require("@mui/material");
|
|
13
12
|
const ui_1 = require("@jbrowse/core/ui");
|
|
13
|
+
const tracks_1 = require("@jbrowse/core/util/tracks");
|
|
14
|
+
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
14
15
|
const SVGBackground_1 = __importDefault(require("./SVGBackground"));
|
|
15
16
|
const SVGTracks_1 = __importDefault(require("./SVGTracks"));
|
|
16
17
|
const SVGHeader_1 = __importDefault(require("./SVGHeader"));
|
|
17
|
-
const
|
|
18
|
-
function totalHeight(tracks, textHeight, trackLabels) {
|
|
19
|
-
return (0, util_1.sum)(tracks.map(t => t.displays[0].height +
|
|
20
|
-
(['none', 'left'].includes(trackLabels) ? 0 : textHeight)));
|
|
21
|
-
}
|
|
22
|
-
exports.totalHeight = totalHeight;
|
|
18
|
+
const util_2 = require("./util");
|
|
23
19
|
// render LGV to SVG
|
|
24
20
|
async function renderToSvg(model, opts) {
|
|
25
|
-
var _a;
|
|
26
21
|
await (0, mobx_1.when)(() => model.initialized);
|
|
27
22
|
const { textHeight = 18, headerHeight = 40, rulerHeight = 50, fontSize = 13, cytobandHeight = 100, trackLabels = 'offset', themeName = 'default', Wrapper = ({ children }) => react_1.default.createElement(react_1.default.Fragment, null, children), } = opts;
|
|
28
23
|
const session = (0, util_1.getSession)(model);
|
|
29
|
-
const
|
|
24
|
+
const { allThemes } = session;
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
26
|
+
const { createRootFn } = (0, mobx_state_tree_1.getRoot)(model);
|
|
27
|
+
const theme = allThemes === null || allThemes === void 0 ? void 0 : allThemes()[themeName];
|
|
30
28
|
const { width, tracks, showCytobands } = model;
|
|
31
29
|
const shift = 50;
|
|
32
30
|
const c = +showCytobands * cytobandHeight;
|
|
33
31
|
const offset = headerHeight + rulerHeight + c + 10;
|
|
34
|
-
const height = totalHeight(tracks, textHeight, trackLabels) + offset + 100;
|
|
32
|
+
const height = (0, util_2.totalHeight)(tracks, textHeight, trackLabels) + offset + 100;
|
|
35
33
|
const displayResults = await Promise.all(tracks.map(async (track) => {
|
|
36
34
|
const display = track.displays[0];
|
|
37
35
|
await (0, mobx_1.when)(() => !display.renderProps().notReady);
|
|
@@ -41,14 +39,14 @@ async function renderToSvg(model, opts) {
|
|
|
41
39
|
const trackLabelOffset = trackLabels === 'left' ? trackLabelMaxLen : 0;
|
|
42
40
|
const w = width + trackLabelOffset;
|
|
43
41
|
// the xlink namespace is used for rendering <image> tag
|
|
44
|
-
return (0,
|
|
42
|
+
return (0, util_1.renderToStaticMarkup)(react_1.default.createElement(material_1.ThemeProvider, { theme: (0, ui_1.createJBrowseTheme)(theme) },
|
|
45
43
|
react_1.default.createElement(Wrapper, null,
|
|
46
44
|
react_1.default.createElement("svg", { width: w, height: height, xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink", viewBox: [0, 0, w + shift * 2, height].toString() },
|
|
47
45
|
react_1.default.createElement(SVGBackground_1.default, { width: w, height: height, shift: shift }),
|
|
48
46
|
react_1.default.createElement("g", { transform: `translate(${shift} 0)` },
|
|
49
47
|
react_1.default.createElement("g", { transform: `translate(${trackLabelOffset})` },
|
|
50
48
|
react_1.default.createElement(SVGHeader_1.default, { model: model, fontSize: fontSize, rulerHeight: rulerHeight, cytobandHeight: cytobandHeight })),
|
|
51
|
-
react_1.default.createElement(SVGTracks_1.default, { textHeight: textHeight, fontSize: fontSize, model: model, displayResults: displayResults, offset: offset, trackLabels: trackLabels, trackLabelOffset: trackLabelOffset }))))));
|
|
49
|
+
react_1.default.createElement(SVGTracks_1.default, { textHeight: textHeight, fontSize: fontSize, model: model, displayResults: displayResults, offset: offset, trackLabels: trackLabels, trackLabelOffset: trackLabelOffset }))))), createRootFn);
|
|
52
50
|
}
|
|
53
51
|
exports.renderToSvg = renderToSvg;
|
|
54
52
|
var SVGRuler_1 = require("./SVGRuler");
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.totalHeight = void 0;
|
|
4
|
+
const util_1 = require("@jbrowse/core/util");
|
|
5
|
+
function totalHeight(tracks, textHeight, trackLabels) {
|
|
6
|
+
return (0, util_1.sum)(tracks.map(t => t.displays[0].height +
|
|
7
|
+
(['none', 'left'].includes(trackLabels) ? 0 : textHeight)));
|
|
8
|
+
}
|
|
9
|
+
exports.totalHeight = totalHeight;
|