@jbrowse/plugin-linear-genome-view 2.10.3 → 2.11.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/models/serverSideRenderedBlock.js +0 -1
- package/dist/LaunchLinearGenomeView/index.js +14 -6
- package/dist/LinearBasicDisplay/components/SetMaxHeight.d.ts +1 -1
- package/dist/LinearGenomeView/components/Cytobands.d.ts +1 -125
- package/dist/LinearGenomeView/components/ExportSvgDialog.js +9 -5
- package/dist/LinearGenomeView/components/Highlight.d.ts +3 -3
- package/dist/LinearGenomeView/components/Highlight.js +21 -17
- package/dist/LinearGenomeView/components/MiniControls.js +13 -15
- package/dist/LinearGenomeView/components/OverviewHighlight.d.ts +1 -1
- package/dist/LinearGenomeView/components/OverviewHighlight.js +20 -11
- package/dist/LinearGenomeView/components/OverviewRubberband.d.ts +1 -1
- package/dist/LinearGenomeView/components/OverviewScalebar.js +4 -1
- package/dist/LinearGenomeView/components/OverviewScalebarPolygon.d.ts +1 -1
- package/dist/LinearGenomeView/components/RefNameAutocomplete/index.d.ts +9 -9
- package/dist/LinearGenomeView/components/RefNameAutocomplete/index.js +28 -35
- package/dist/LinearGenomeView/components/Rubberband.d.ts +1 -1
- package/dist/LinearGenomeView/components/SearchBox.d.ts +1 -1
- package/dist/LinearGenomeView/components/SearchResultsTable.js +1 -1
- package/dist/LinearGenomeView/components/TrackContainer.js +10 -23
- package/dist/LinearGenomeView/components/TrackLabel.js +33 -6
- package/dist/LinearGenomeView/components/ZoomControls.js +4 -4
- package/dist/LinearGenomeView/model.d.ts +67 -7
- package/dist/LinearGenomeView/model.js +102 -16
- package/dist/LinearGenomeView/svgcomponents/SVGLinearGenomeView.js +1 -1
- package/dist/index.d.ts +159 -21
- package/esm/BaseLinearDisplay/models/serverSideRenderedBlock.js +0 -1
- package/esm/LaunchLinearGenomeView/index.js +14 -6
- package/esm/LinearBasicDisplay/components/SetMaxHeight.d.ts +1 -1
- package/esm/LinearGenomeView/components/Cytobands.d.ts +1 -125
- package/esm/LinearGenomeView/components/ExportSvgDialog.js +9 -5
- package/esm/LinearGenomeView/components/Highlight.d.ts +3 -3
- package/esm/LinearGenomeView/components/Highlight.js +21 -17
- package/esm/LinearGenomeView/components/MiniControls.js +14 -16
- package/esm/LinearGenomeView/components/OverviewHighlight.d.ts +1 -1
- package/esm/LinearGenomeView/components/OverviewHighlight.js +20 -11
- package/esm/LinearGenomeView/components/OverviewRubberband.d.ts +1 -1
- package/esm/LinearGenomeView/components/OverviewScalebar.js +5 -2
- package/esm/LinearGenomeView/components/OverviewScalebarPolygon.d.ts +1 -1
- package/esm/LinearGenomeView/components/RefNameAutocomplete/index.d.ts +9 -9
- package/esm/LinearGenomeView/components/RefNameAutocomplete/index.js +28 -35
- package/esm/LinearGenomeView/components/Rubberband.d.ts +1 -1
- package/esm/LinearGenomeView/components/SearchBox.d.ts +1 -1
- package/esm/LinearGenomeView/components/SearchResultsTable.js +1 -1
- package/esm/LinearGenomeView/components/TrackContainer.js +10 -23
- package/esm/LinearGenomeView/components/TrackLabel.js +33 -6
- package/esm/LinearGenomeView/components/TracksContainer.js +2 -2
- package/esm/LinearGenomeView/components/ZoomControls.js +4 -4
- package/esm/LinearGenomeView/model.d.ts +67 -7
- package/esm/LinearGenomeView/model.js +103 -17
- package/esm/LinearGenomeView/svgcomponents/SVGLinearGenomeView.js +1 -1
- package/esm/index.d.ts +159 -21
- package/package.json +2 -2
|
@@ -25,11 +25,19 @@ exports.default = (pluginManager) => {
|
|
|
25
25
|
view.setHideHeader(!nav);
|
|
26
26
|
}
|
|
27
27
|
if (highlight !== undefined) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
highlight.forEach(async (h) => {
|
|
29
|
+
if (h) {
|
|
30
|
+
const parsedLocString = (0, util_1.parseLocString)(h, refName => isValidRefName(refName, assembly));
|
|
31
|
+
const location = {
|
|
32
|
+
...parsedLocString,
|
|
33
|
+
assemblyName: assembly,
|
|
34
|
+
};
|
|
35
|
+
if ((location === null || location === void 0 ? void 0 : location.start) !== undefined &&
|
|
36
|
+
(location === null || location === void 0 ? void 0 : location.end) !== undefined) {
|
|
37
|
+
view.addToHighlights(location);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
33
41
|
}
|
|
34
42
|
await (0, searchUtils_1.handleSelectedRegion)({ input: loc, model: view, assembly: asm });
|
|
35
43
|
const idsNotFound = [];
|
|
@@ -39,7 +47,7 @@ exports.default = (pluginManager) => {
|
|
|
39
47
|
}
|
|
40
48
|
}
|
|
41
49
|
catch (e) {
|
|
42
|
-
session.
|
|
50
|
+
session.notifyError(`${e}`, e);
|
|
43
51
|
throw e;
|
|
44
52
|
}
|
|
45
53
|
});
|
|
@@ -4,131 +4,7 @@ import { ContentBlock } from '@jbrowse/core/util/blockTypes';
|
|
|
4
4
|
import { Assembly } from '@jbrowse/core/assemblyManager/assembly';
|
|
5
5
|
declare const Cytobands: ({ overview, block, assembly, }: {
|
|
6
6
|
overview: Base1DViewModel;
|
|
7
|
-
assembly?:
|
|
8
|
-
configuration: any;
|
|
9
|
-
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
10
|
-
error: unknown;
|
|
11
|
-
loaded: boolean;
|
|
12
|
-
loadingP: Promise<void> | undefined;
|
|
13
|
-
volatileRegions: import("@jbrowse/core/assemblyManager/assembly").BasicRegion[] | undefined;
|
|
14
|
-
refNameAliases: {
|
|
15
|
-
[x: string]: string | undefined;
|
|
16
|
-
} | undefined;
|
|
17
|
-
lowerCaseRefNameAliases: {
|
|
18
|
-
[x: string]: string | undefined;
|
|
19
|
-
} | undefined;
|
|
20
|
-
cytobands: import("@jbrowse/core/util").Feature[] | undefined;
|
|
21
|
-
} & {
|
|
22
|
-
getConf(arg: string): any;
|
|
23
|
-
} & {
|
|
24
|
-
readonly initialized: boolean;
|
|
25
|
-
readonly name: string;
|
|
26
|
-
readonly regions: import("@jbrowse/core/assemblyManager/assembly").BasicRegion[] | undefined;
|
|
27
|
-
readonly aliases: string[];
|
|
28
|
-
readonly displayName: string | undefined;
|
|
29
|
-
hasName(name: string): boolean;
|
|
30
|
-
readonly allAliases: string[];
|
|
31
|
-
readonly allRefNames: string[] | undefined;
|
|
32
|
-
readonly lowerCaseRefNames: string[] | undefined;
|
|
33
|
-
readonly allRefNamesWithLowerCase: string[] | undefined;
|
|
34
|
-
readonly rpcManager: import("@jbrowse/core/rpc/RpcManager").default;
|
|
35
|
-
readonly refNameColors: string[];
|
|
36
|
-
} & {
|
|
37
|
-
readonly refNames: string[] | undefined;
|
|
38
|
-
} & {
|
|
39
|
-
getCanonicalRefName(refName: string): string | undefined;
|
|
40
|
-
getRefNameColor(refName: string): string | undefined;
|
|
41
|
-
isValidRefName(refName: string): boolean;
|
|
42
|
-
} & {
|
|
43
|
-
setLoaded({ adapterRegionsWithAssembly, refNameAliases, lowerCaseRefNameAliases, cytobands, }: import("@jbrowse/core/assemblyManager/assembly").Loading): void;
|
|
44
|
-
setError(e: unknown): void;
|
|
45
|
-
setRegions(regions: import("@jbrowse/core/util").Region[]): void;
|
|
46
|
-
setRefNameAliases(aliases: {
|
|
47
|
-
[x: string]: string | undefined;
|
|
48
|
-
}, lcAliases: {
|
|
49
|
-
[x: string]: string | undefined;
|
|
50
|
-
}): void;
|
|
51
|
-
setCytobands(cytobands: import("@jbrowse/core/util").Feature[]): void;
|
|
52
|
-
setLoadingP(p?: Promise<void> | undefined): void;
|
|
53
|
-
load(): Promise<void>;
|
|
54
|
-
loadPre(): Promise<void>;
|
|
55
|
-
} & {
|
|
56
|
-
getAdapterMapEntry(adapterConf: {
|
|
57
|
-
[x: string]: unknown;
|
|
58
|
-
}, options: import("@jbrowse/core/data_adapters/BaseAdapter").BaseOptions): Promise<import("@jbrowse/core/assemblyManager/assembly").RefNameMap>;
|
|
59
|
-
getRefNameMapForAdapter(adapterConf: {
|
|
60
|
-
[x: string]: unknown;
|
|
61
|
-
}, opts: import("@jbrowse/core/data_adapters/BaseAdapter").BaseOptions): Promise<{
|
|
62
|
-
[x: string]: string | undefined;
|
|
63
|
-
}>;
|
|
64
|
-
getReverseRefNameMapForAdapter(adapterConf: {
|
|
65
|
-
[x: string]: unknown;
|
|
66
|
-
}, opts: import("@jbrowse/core/data_adapters/BaseAdapter").BaseOptions): Promise<{
|
|
67
|
-
[x: string]: string | undefined;
|
|
68
|
-
}>;
|
|
69
|
-
} & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
|
|
70
|
-
configuration: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
|
|
71
|
-
}, {
|
|
72
|
-
error: unknown;
|
|
73
|
-
loaded: boolean;
|
|
74
|
-
loadingP: Promise<void> | undefined;
|
|
75
|
-
volatileRegions: import("@jbrowse/core/assemblyManager/assembly").BasicRegion[] | undefined;
|
|
76
|
-
refNameAliases: {
|
|
77
|
-
[x: string]: string | undefined;
|
|
78
|
-
} | undefined;
|
|
79
|
-
lowerCaseRefNameAliases: {
|
|
80
|
-
[x: string]: string | undefined;
|
|
81
|
-
} | undefined;
|
|
82
|
-
cytobands: import("@jbrowse/core/util").Feature[] | undefined;
|
|
83
|
-
} & {
|
|
84
|
-
getConf(arg: string): any;
|
|
85
|
-
} & {
|
|
86
|
-
readonly initialized: boolean;
|
|
87
|
-
readonly name: string;
|
|
88
|
-
readonly regions: import("@jbrowse/core/assemblyManager/assembly").BasicRegion[] | undefined;
|
|
89
|
-
readonly aliases: string[];
|
|
90
|
-
readonly displayName: string | undefined;
|
|
91
|
-
hasName(name: string): boolean;
|
|
92
|
-
readonly allAliases: string[];
|
|
93
|
-
readonly allRefNames: string[] | undefined;
|
|
94
|
-
readonly lowerCaseRefNames: string[] | undefined;
|
|
95
|
-
readonly allRefNamesWithLowerCase: string[] | undefined;
|
|
96
|
-
readonly rpcManager: import("@jbrowse/core/rpc/RpcManager").default;
|
|
97
|
-
readonly refNameColors: string[];
|
|
98
|
-
} & {
|
|
99
|
-
readonly refNames: string[] | undefined;
|
|
100
|
-
} & {
|
|
101
|
-
getCanonicalRefName(refName: string): string | undefined;
|
|
102
|
-
getRefNameColor(refName: string): string | undefined;
|
|
103
|
-
isValidRefName(refName: string): boolean;
|
|
104
|
-
} & {
|
|
105
|
-
setLoaded({ adapterRegionsWithAssembly, refNameAliases, lowerCaseRefNameAliases, cytobands, }: import("@jbrowse/core/assemblyManager/assembly").Loading): void;
|
|
106
|
-
setError(e: unknown): void;
|
|
107
|
-
setRegions(regions: import("@jbrowse/core/util").Region[]): void;
|
|
108
|
-
setRefNameAliases(aliases: {
|
|
109
|
-
[x: string]: string | undefined;
|
|
110
|
-
}, lcAliases: {
|
|
111
|
-
[x: string]: string | undefined;
|
|
112
|
-
}): void;
|
|
113
|
-
setCytobands(cytobands: import("@jbrowse/core/util").Feature[]): void;
|
|
114
|
-
setLoadingP(p?: Promise<void> | undefined): void;
|
|
115
|
-
load(): Promise<void>;
|
|
116
|
-
loadPre(): Promise<void>;
|
|
117
|
-
} & {
|
|
118
|
-
getAdapterMapEntry(adapterConf: {
|
|
119
|
-
[x: string]: unknown;
|
|
120
|
-
}, options: import("@jbrowse/core/data_adapters/BaseAdapter").BaseOptions): Promise<import("@jbrowse/core/assemblyManager/assembly").RefNameMap>;
|
|
121
|
-
getRefNameMapForAdapter(adapterConf: {
|
|
122
|
-
[x: string]: unknown;
|
|
123
|
-
}, opts: import("@jbrowse/core/data_adapters/BaseAdapter").BaseOptions): Promise<{
|
|
124
|
-
[x: string]: string | undefined;
|
|
125
|
-
}>;
|
|
126
|
-
getReverseRefNameMapForAdapter(adapterConf: {
|
|
127
|
-
[x: string]: unknown;
|
|
128
|
-
}, opts: import("@jbrowse/core/data_adapters/BaseAdapter").BaseOptions): Promise<{
|
|
129
|
-
[x: string]: string | undefined;
|
|
130
|
-
}>;
|
|
131
|
-
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>) | undefined;
|
|
7
|
+
assembly?: Assembly;
|
|
132
8
|
block: ContentBlock;
|
|
133
9
|
}) => React.JSX.Element;
|
|
134
10
|
export default Cytobands;
|
|
@@ -35,6 +35,10 @@ function LoadingMessage() {
|
|
|
35
35
|
function useSvgLocal(key, val) {
|
|
36
36
|
return (0, util_1.useLocalStorage)('svg-' + key, val);
|
|
37
37
|
}
|
|
38
|
+
function TextField2({ children, ...rest }) {
|
|
39
|
+
return (react_1.default.createElement("div", null,
|
|
40
|
+
react_1.default.createElement(material_1.TextField, { ...rest }, children)));
|
|
41
|
+
}
|
|
38
42
|
function ExportSvgDialog({ model, handleClose, }) {
|
|
39
43
|
const session = (0, util_1.getSession)(model);
|
|
40
44
|
const offscreenCanvas = typeof OffscreenCanvas !== 'undefined';
|
|
@@ -47,15 +51,13 @@ function ExportSvgDialog({ model, handleClose, }) {
|
|
|
47
51
|
return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, title: "Export SVG" },
|
|
48
52
|
react_1.default.createElement(material_1.DialogContent, null,
|
|
49
53
|
error ? (react_1.default.createElement(ui_1.ErrorMessage, { error: error })) : loading ? (react_1.default.createElement(LoadingMessage, null)) : null,
|
|
50
|
-
react_1.default.createElement(
|
|
51
|
-
react_1.default.createElement("
|
|
52
|
-
react_1.default.createElement(material_1.TextField, { select: true, label: "Track label positioning", variant: "outlined", style: { width: 150 }, value: trackLabels, onChange: event => setTrackLabels(event.target.value) },
|
|
54
|
+
react_1.default.createElement(TextField2, { helperText: "filename", value: filename, onChange: event => setFilename(event.target.value) }),
|
|
55
|
+
react_1.default.createElement(TextField2, { select: true, label: "Track label positioning", variant: "outlined", style: { width: 150 }, value: trackLabels, onChange: event => setTrackLabels(event.target.value) },
|
|
53
56
|
react_1.default.createElement(material_1.MenuItem, { value: "offset" }, "Offset"),
|
|
54
57
|
react_1.default.createElement(material_1.MenuItem, { value: "overlay" }, "Overlay"),
|
|
55
58
|
react_1.default.createElement(material_1.MenuItem, { value: "left" }, "Left"),
|
|
56
59
|
react_1.default.createElement(material_1.MenuItem, { value: "none" }, "None")),
|
|
57
|
-
react_1.default.createElement("
|
|
58
|
-
session.allThemes ? (react_1.default.createElement(material_1.TextField, { select: true, label: "Theme", variant: "outlined", value: themeName, onChange: event => setThemeName(event.target.value) }, Object.entries(session.allThemes()).map(([key, val]) => (react_1.default.createElement(material_1.MenuItem, { key: key, value: key },
|
|
60
|
+
session.allThemes ? (react_1.default.createElement(TextField2, { select: true, label: "Theme", variant: "outlined", value: themeName, onChange: event => setThemeName(event.target.value) }, Object.entries(session.allThemes()).map(([key, val]) => (react_1.default.createElement(material_1.MenuItem, { key: key, value: key },
|
|
59
61
|
// @ts-expect-error
|
|
60
62
|
val.name || '(Unknown name)'))))) : null,
|
|
61
63
|
offscreenCanvas ? (react_1.default.createElement(material_1.FormControlLabel, { control: react_1.default.createElement(material_1.Checkbox, { checked: rasterizeLayers, onChange: () => setRasterizeLayers(val => !val) }), label: "Rasterize canvas based tracks? File may be much larger if this is turned off" })) : (react_1.default.createElement(material_1.Typography, null, "Note: rasterizing layers not yet supported in this browser, so SVG size may be large"))),
|
|
@@ -76,6 +78,8 @@ function ExportSvgDialog({ model, handleClose, }) {
|
|
|
76
78
|
catch (e) {
|
|
77
79
|
console.error(e);
|
|
78
80
|
setError(e);
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
79
83
|
setLoading(false);
|
|
80
84
|
}
|
|
81
85
|
} }, "Submit"))));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { LinearGenomeViewModel } from '../model';
|
|
3
3
|
type LGV = LinearGenomeViewModel;
|
|
4
|
-
declare const
|
|
4
|
+
declare const HighlightGroup: ({ model, }: {
|
|
5
5
|
model: LGV;
|
|
6
|
-
}) => React.JSX.Element
|
|
7
|
-
export default
|
|
6
|
+
}) => React.JSX.Element[];
|
|
7
|
+
export default HighlightGroup;
|
|
@@ -38,28 +38,28 @@ const Link_1 = __importDefault(require("@mui/icons-material/Link"));
|
|
|
38
38
|
const Close_1 = __importDefault(require("@mui/icons-material/Close"));
|
|
39
39
|
const Bookmark_1 = __importDefault(require("@mui/icons-material/Bookmark"));
|
|
40
40
|
const useStyles = (0, mui_1.makeStyles)()(theme => {
|
|
41
|
-
var _a, _b
|
|
41
|
+
var _a, _b;
|
|
42
42
|
return ({
|
|
43
43
|
highlight: {
|
|
44
44
|
height: '100%',
|
|
45
45
|
position: 'absolute',
|
|
46
|
-
|
|
46
|
+
overflow: 'hidden',
|
|
47
|
+
background: `${(0, colord_1.colord)((_b = (_a = theme.palette.highlight) === null || _a === void 0 ? void 0 : _a.main) !== null && _b !== void 0 ? _b : 'goldenrod')
|
|
47
48
|
.alpha(0.35)
|
|
48
49
|
.toRgbString()}`,
|
|
49
|
-
borderLeft: `1px solid ${(_d = (_c = theme.palette.quaternary) === null || _c === void 0 ? void 0 : _c.main) !== null && _d !== void 0 ? _d : 'goldenrod'}`,
|
|
50
|
-
borderRight: `1px solid ${(_f = (_e = theme.palette.quaternary) === null || _e === void 0 ? void 0 : _e.main) !== null && _f !== void 0 ? _f : 'goldenrod'}`,
|
|
51
50
|
},
|
|
52
51
|
});
|
|
53
52
|
});
|
|
54
|
-
const Highlight = (0, mobx_react_1.observer)(function Highlight({ model }) {
|
|
55
|
-
var _a, _b;
|
|
53
|
+
const Highlight = (0, mobx_react_1.observer)(function Highlight({ model, highlight, }) {
|
|
54
|
+
var _a, _b, _c;
|
|
56
55
|
const { classes } = useStyles();
|
|
57
56
|
const [open, setOpen] = (0, react_1.useState)(false);
|
|
58
57
|
const anchorEl = (0, react_1.useRef)(null);
|
|
59
|
-
const color = (_b = (_a = (0, material_1.useTheme)().palette.
|
|
58
|
+
const color = (_b = (_a = (0, material_1.useTheme)().palette.highlight) === null || _a === void 0 ? void 0 : _a.main) !== null && _b !== void 0 ? _b : 'goldenrod';
|
|
60
59
|
const session = (0, util_1.getSession)(model);
|
|
60
|
+
const { assemblyManager } = session;
|
|
61
61
|
const dismissHighlight = () => {
|
|
62
|
-
model.
|
|
62
|
+
model.removeHighlight(highlight);
|
|
63
63
|
};
|
|
64
64
|
const menuItems = [
|
|
65
65
|
{
|
|
@@ -76,7 +76,7 @@ const Highlight = (0, mobx_react_1.observer)(function Highlight({ model }) {
|
|
|
76
76
|
bookmarkWidget = session.addWidget('GridBookmarkWidget', 'GridBookmark');
|
|
77
77
|
}
|
|
78
78
|
// @ts-ignore
|
|
79
|
-
bookmarkWidget.addBookmark(
|
|
79
|
+
bookmarkWidget.addBookmark(highlight);
|
|
80
80
|
dismissHighlight();
|
|
81
81
|
},
|
|
82
82
|
},
|
|
@@ -84,9 +84,6 @@ const Highlight = (0, mobx_react_1.observer)(function Highlight({ model }) {
|
|
|
84
84
|
function handleClose() {
|
|
85
85
|
setOpen(false);
|
|
86
86
|
}
|
|
87
|
-
if (!model.highlight) {
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
87
|
// coords
|
|
91
88
|
const mapCoords = (r) => {
|
|
92
89
|
const s = model.bpToPx({
|
|
@@ -104,19 +101,26 @@ const Highlight = (0, mobx_react_1.observer)(function Highlight({ model }) {
|
|
|
104
101
|
}
|
|
105
102
|
: undefined;
|
|
106
103
|
};
|
|
107
|
-
const
|
|
108
|
-
|
|
104
|
+
const asm = assemblyManager.get(highlight === null || highlight === void 0 ? void 0 : highlight.assemblyName);
|
|
105
|
+
const h = mapCoords({
|
|
106
|
+
...highlight,
|
|
107
|
+
refName: (_c = asm === null || asm === void 0 ? void 0 : asm.getCanonicalRefName(highlight.refName)) !== null && _c !== void 0 ? _c : highlight.refName,
|
|
108
|
+
});
|
|
109
|
+
return h ? (react_1.default.createElement("div", { className: classes.highlight, style: {
|
|
109
110
|
left: h.left,
|
|
110
111
|
width: h.width,
|
|
111
112
|
} },
|
|
112
113
|
react_1.default.createElement(material_1.Tooltip, { title: 'Highlighted from URL parameter', arrow: true },
|
|
113
|
-
react_1.default.createElement(material_1.IconButton, { ref: anchorEl, onClick: () => setOpen(true) },
|
|
114
|
+
react_1.default.createElement(material_1.IconButton, { ref: anchorEl, onClick: () => setOpen(true), style: { zIndex: 3 } },
|
|
114
115
|
react_1.default.createElement(Link_1.default, { fontSize: "small", sx: {
|
|
115
116
|
color: `${(0, colord_1.colord)(color).darken(0.2).toRgbString()}`,
|
|
116
117
|
} }))),
|
|
117
118
|
react_1.default.createElement(ui_1.Menu, { anchorEl: anchorEl.current, onMenuItemClick: (_event, callback) => {
|
|
118
119
|
callback(session);
|
|
119
120
|
handleClose();
|
|
120
|
-
}, open: open, onClose: handleClose, menuItems: menuItems }))) : null
|
|
121
|
+
}, open: open, onClose: handleClose, menuItems: menuItems }))) : null;
|
|
122
|
+
});
|
|
123
|
+
const HighlightGroup = (0, mobx_react_1.observer)(function HighlightGroup({ model, }) {
|
|
124
|
+
return model.highlight.map((highlight, idx) => (react_1.default.createElement(Highlight, { key: JSON.stringify(highlight) + '-' + idx, model: model, highlight: highlight })));
|
|
121
125
|
});
|
|
122
|
-
exports.default =
|
|
126
|
+
exports.default = HighlightGroup;
|
|
@@ -6,13 +6,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const react_1 = __importDefault(require("react"));
|
|
7
7
|
const mobx_react_1 = require("mobx-react");
|
|
8
8
|
const material_1 = require("@mui/material");
|
|
9
|
+
const CascadingMenuButton_1 = __importDefault(require("@jbrowse/core/ui/CascadingMenuButton"));
|
|
10
|
+
const mui_1 = require("tss-react/mui");
|
|
11
|
+
const util_1 = require("@jbrowse/core/util");
|
|
9
12
|
// icons
|
|
10
13
|
const ZoomIn_1 = __importDefault(require("@mui/icons-material/ZoomIn"));
|
|
11
14
|
const ZoomOut_1 = __importDefault(require("@mui/icons-material/ZoomOut"));
|
|
12
15
|
const KeyboardArrowDown_1 = __importDefault(require("@mui/icons-material/KeyboardArrowDown"));
|
|
13
|
-
const CascadingMenuButton_1 = __importDefault(require("@jbrowse/core/ui/CascadingMenuButton"));
|
|
14
|
-
const mui_1 = require("tss-react/mui");
|
|
15
|
-
const util_1 = require("@jbrowse/core/util");
|
|
16
16
|
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
17
17
|
background: {
|
|
18
18
|
position: 'absolute',
|
|
@@ -21,22 +21,20 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
|
21
21
|
background: theme.palette.background.paper,
|
|
22
22
|
},
|
|
23
23
|
focusedBackground: {
|
|
24
|
-
background: theme.palette.secondary.light,
|
|
25
|
-
svg: {
|
|
26
|
-
fill: theme.palette.secondary.contrastText,
|
|
27
|
-
},
|
|
24
|
+
background: (0, material_1.alpha)(theme.palette.secondary.light, 0.2),
|
|
28
25
|
},
|
|
29
26
|
}));
|
|
30
27
|
const MiniControls = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
31
|
-
const { classes
|
|
28
|
+
const { classes } = useStyles();
|
|
32
29
|
const { id, bpPerPx, maxBpPerPx, minBpPerPx, scaleFactor, hideHeader } = model;
|
|
33
30
|
const { focusedViewId } = (0, util_1.getSession)(model);
|
|
34
|
-
return hideHeader ? (react_1.default.createElement(material_1.Paper, { className:
|
|
35
|
-
react_1.default.createElement(
|
|
36
|
-
react_1.default.createElement(
|
|
37
|
-
|
|
38
|
-
react_1.default.createElement(
|
|
39
|
-
|
|
40
|
-
react_1.default.createElement(
|
|
31
|
+
return hideHeader ? (react_1.default.createElement(material_1.Paper, { className: classes.background },
|
|
32
|
+
react_1.default.createElement(material_1.Paper, { className: focusedViewId === id ? classes.focusedBackground : undefined },
|
|
33
|
+
react_1.default.createElement(CascadingMenuButton_1.default, { menuItems: model.menuItems() },
|
|
34
|
+
react_1.default.createElement(KeyboardArrowDown_1.default, { fontSize: "small" })),
|
|
35
|
+
react_1.default.createElement(material_1.IconButton, { "data-testid": "zoom_out", onClick: () => model.zoom(bpPerPx * 2), disabled: bpPerPx >= maxBpPerPx - 0.0001 || scaleFactor !== 1 },
|
|
36
|
+
react_1.default.createElement(ZoomOut_1.default, { fontSize: "small" })),
|
|
37
|
+
react_1.default.createElement(material_1.IconButton, { "data-testid": "zoom_in", onClick: () => model.zoom(bpPerPx / 2), disabled: bpPerPx <= minBpPerPx + 0.0001 || scaleFactor !== 1 },
|
|
38
|
+
react_1.default.createElement(ZoomIn_1.default, { fontSize: "small" }))))) : null;
|
|
41
39
|
});
|
|
42
40
|
exports.default = MiniControls;
|
|
@@ -7,23 +7,26 @@ const react_1 = __importDefault(require("react"));
|
|
|
7
7
|
const mobx_react_1 = require("mobx-react");
|
|
8
8
|
const mui_1 = require("tss-react/mui");
|
|
9
9
|
const colord_1 = require("@jbrowse/core/util/colord");
|
|
10
|
+
const util_1 = require("@jbrowse/core/util");
|
|
10
11
|
const useStyles = (0, mui_1.makeStyles)()(theme => {
|
|
11
12
|
var _a, _b, _c, _d, _e, _f;
|
|
12
13
|
return ({
|
|
13
14
|
highlight: {
|
|
14
15
|
height: '100%',
|
|
15
16
|
position: 'absolute',
|
|
16
|
-
background: `${(0, colord_1.colord)((_b = (_a = theme.palette.
|
|
17
|
+
background: `${(0, colord_1.colord)((_b = (_a = theme.palette.highlight) === null || _a === void 0 ? void 0 : _a.main) !== null && _b !== void 0 ? _b : 'goldenrod')
|
|
17
18
|
.alpha(0.35)
|
|
18
19
|
.toRgbString()}`,
|
|
19
|
-
borderLeft: `1px solid ${(_d = (_c = theme.palette.
|
|
20
|
-
borderRight: `1px solid ${(_f = (_e = theme.palette.
|
|
20
|
+
borderLeft: `1px solid ${(_d = (_c = theme.palette.highlight) === null || _c === void 0 ? void 0 : _c.main) !== null && _d !== void 0 ? _d : 'goldenrod'}`,
|
|
21
|
+
borderRight: `1px solid ${(_f = (_e = theme.palette.highlight) === null || _e === void 0 ? void 0 : _e.main) !== null && _f !== void 0 ? _f : 'goldenrod'}`,
|
|
21
22
|
},
|
|
22
23
|
});
|
|
23
24
|
});
|
|
24
25
|
const OverviewHighlight = (0, mobx_react_1.observer)(function OverviewHighlight({ model, overview, }) {
|
|
25
26
|
const { classes } = useStyles();
|
|
26
27
|
const { cytobandOffset } = model;
|
|
28
|
+
const session = (0, util_1.getSession)(model);
|
|
29
|
+
const { assemblyManager } = session;
|
|
27
30
|
// coords
|
|
28
31
|
const mapCoords = (r) => {
|
|
29
32
|
const s = overview.bpToPx({
|
|
@@ -41,13 +44,19 @@ const OverviewHighlight = (0, mobx_react_1.observer)(function OverviewHighlight(
|
|
|
41
44
|
}
|
|
42
45
|
: undefined;
|
|
43
46
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
47
|
+
return model.highlight
|
|
48
|
+
.map(h => {
|
|
49
|
+
var _a;
|
|
50
|
+
const asm = assemblyManager.get(h === null || h === void 0 ? void 0 : h.assemblyName);
|
|
51
|
+
return mapCoords({
|
|
52
|
+
...h,
|
|
53
|
+
refName: (_a = asm === null || asm === void 0 ? void 0 : asm.getCanonicalRefName(h.refName)) !== null && _a !== void 0 ? _a : h.refName,
|
|
54
|
+
});
|
|
55
|
+
})
|
|
56
|
+
.filter(util_1.notEmpty)
|
|
57
|
+
.map(({ left, width }, idx) => (react_1.default.createElement("div", { key: `${left}_${width}_${idx}`, className: classes.highlight, style: {
|
|
58
|
+
width: width,
|
|
59
|
+
left: left,
|
|
60
|
+
} })));
|
|
52
61
|
});
|
|
53
62
|
exports.default = OverviewHighlight;
|
|
@@ -5,6 +5,6 @@ type LGV = LinearGenomeViewModel;
|
|
|
5
5
|
declare const OverviewRubberband: ({ model, overview, ControlComponent, }: {
|
|
6
6
|
model: LGV;
|
|
7
7
|
overview: Base1DViewModel;
|
|
8
|
-
ControlComponent?: React.ReactElement
|
|
8
|
+
ControlComponent?: React.ReactElement;
|
|
9
9
|
}) => React.JSX.Element;
|
|
10
10
|
export default OverviewRubberband;
|
|
@@ -146,6 +146,7 @@ const Scalebar = (0, mobx_react_1.observer)(function ({ model, scale, overview,
|
|
|
146
146
|
const { classes } = useStyles();
|
|
147
147
|
const theme = (0, material_1.useTheme)();
|
|
148
148
|
const { dynamicBlocks, showCytobands, cytobandOffset } = model;
|
|
149
|
+
const { pluginManager } = (0, util_1.getEnv)(model);
|
|
149
150
|
const visibleRegions = dynamicBlocks.contentBlocks;
|
|
150
151
|
const overviewVisibleRegions = overview.dynamicBlocks;
|
|
151
152
|
const { tertiary, primary } = theme.palette;
|
|
@@ -166,6 +167,7 @@ const Scalebar = (0, mobx_react_1.observer)(function ({ model, scale, overview,
|
|
|
166
167
|
}) || 0;
|
|
167
168
|
const color = showCytobands ? '#f00' : scalebarColor;
|
|
168
169
|
const transparency = showCytobands ? 0.1 : 0.3;
|
|
170
|
+
const additional = pluginManager.evaluateExtensionPoint('LinearGenomeView-OverviewScalebarComponent', undefined, { model, overview });
|
|
169
171
|
return (react_1.default.createElement("div", { className: classes.scalebar },
|
|
170
172
|
react_1.default.createElement("div", { className: classes.scalebarVisibleRegion, style: {
|
|
171
173
|
width: lastOverviewPx - firstOverviewPx,
|
|
@@ -181,7 +183,8 @@ const Scalebar = (0, mobx_react_1.observer)(function ({ model, scale, overview,
|
|
|
181
183
|
backgroundImage: 'repeating-linear-gradient(90deg, transparent, transparent 1px, rgba(255,255,255,.5) 1px, rgba(255,255,255,.5) 3px)',
|
|
182
184
|
} })) : (react_1.default.createElement(OverviewBox, { scale: scale, block: block, model: model, overview: overview, key: `${JSON.stringify(block)}-${idx}` }));
|
|
183
185
|
}),
|
|
184
|
-
react_1.default.createElement(OverviewHighlight_1.default, { model: model, overview: overview })
|
|
186
|
+
react_1.default.createElement(OverviewHighlight_1.default, { model: model, overview: overview }),
|
|
187
|
+
additional));
|
|
185
188
|
});
|
|
186
189
|
const OverviewScalebar = (0, mobx_react_1.observer)(function ({ model, children, }) {
|
|
187
190
|
const { classes } = useStyles();
|
|
@@ -4,6 +4,6 @@ import { LinearGenomeViewModel } from '..';
|
|
|
4
4
|
declare const OverviewScalebarPolygon: ({ model, overview, useOffset, }: {
|
|
5
5
|
model: LinearGenomeViewModel;
|
|
6
6
|
overview: Base1DViewModel;
|
|
7
|
-
useOffset?: boolean
|
|
7
|
+
useOffset?: boolean;
|
|
8
8
|
}) => React.JSX.Element | null;
|
|
9
9
|
export default OverviewScalebarPolygon;
|
|
@@ -4,15 +4,15 @@ import { TextFieldProps as TFP } from '@mui/material';
|
|
|
4
4
|
import { LinearGenomeViewModel } from '../../model';
|
|
5
5
|
declare const RefNameAutocomplete: ({ model, onSelect, assemblyName, style, fetchResults, onChange, value, showHelp, minWidth, maxWidth, TextFieldProps, }: {
|
|
6
6
|
model: LinearGenomeViewModel;
|
|
7
|
-
onSelect?: (
|
|
8
|
-
onChange?: (
|
|
9
|
-
assemblyName?: string
|
|
10
|
-
value?: string
|
|
7
|
+
onSelect?: (region: BaseResult) => void;
|
|
8
|
+
onChange?: (val: string) => void;
|
|
9
|
+
assemblyName?: string;
|
|
10
|
+
value?: string;
|
|
11
11
|
fetchResults: (query: string) => Promise<BaseResult[]>;
|
|
12
|
-
style?: React.CSSProperties
|
|
13
|
-
minWidth?: number
|
|
14
|
-
maxWidth?: number
|
|
15
|
-
showHelp?: boolean
|
|
16
|
-
TextFieldProps?: TFP
|
|
12
|
+
style?: React.CSSProperties;
|
|
13
|
+
minWidth?: number;
|
|
14
|
+
maxWidth?: number;
|
|
15
|
+
showHelp?: boolean;
|
|
16
|
+
TextFieldProps?: TFP;
|
|
17
17
|
}) => React.JSX.Element;
|
|
18
18
|
export default RefNameAutocomplete;
|
|
@@ -45,7 +45,8 @@ const RefNameAutocomplete = (0, mobx_react_1.observer)(function ({ model, onSele
|
|
|
45
45
|
const assembly = assemblyName ? assemblyManager.get(assemblyName) : undefined;
|
|
46
46
|
const { coarseVisibleLocStrings, hasDisplayedRegions } = model;
|
|
47
47
|
(0, react_1.useEffect)(() => {
|
|
48
|
-
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
49
|
+
;
|
|
49
50
|
(async () => {
|
|
50
51
|
try {
|
|
51
52
|
if (debouncedSearch === '' || !assemblyName) {
|
|
@@ -53,21 +54,14 @@ const RefNameAutocomplete = (0, mobx_react_1.observer)(function ({ model, onSele
|
|
|
53
54
|
}
|
|
54
55
|
setLoaded(false);
|
|
55
56
|
const results = await fetchResults(debouncedSearch);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
setSearchOptions((0, util_2.getDeduplicatedResult)(results));
|
|
59
|
-
}
|
|
57
|
+
setLoaded(true);
|
|
58
|
+
setSearchOptions((0, util_2.getDeduplicatedResult)(results));
|
|
60
59
|
}
|
|
61
60
|
catch (e) {
|
|
62
61
|
console.error(e);
|
|
63
|
-
|
|
64
|
-
session.notify(`${e}`, 'error');
|
|
65
|
-
}
|
|
62
|
+
session.notifyError(`${e}`, e);
|
|
66
63
|
}
|
|
67
64
|
})();
|
|
68
|
-
return () => {
|
|
69
|
-
active = false;
|
|
70
|
-
};
|
|
71
65
|
}, [assemblyName, fetchResults, debouncedSearch, session, model]);
|
|
72
66
|
const inputBoxVal = coarseVisibleLocStrings || value || '';
|
|
73
67
|
// heuristic, text width + 60 accommodates help icon and search icon
|
|
@@ -82,29 +76,28 @@ const RefNameAutocomplete = (0, mobx_react_1.observer)(function ({ model, onSele
|
|
|
82
76
|
}))) || [], [regions]);
|
|
83
77
|
// notes on implementation:
|
|
84
78
|
// The selectOnFocus setting helps highlight the field when clicked
|
|
85
|
-
return (react_1.default.createElement(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}, options: (searchOptions === null || searchOptions === void 0 ? void 0 : searchOptions.length) ? searchOptions : regionOptions, getOptionDisabled: option => option.group === 'limitOption', filterOptions: (opts, { inputValue }) => (0, util_2.getFiltered)(opts, inputValue), renderInput: params => (react_1.default.createElement(AutocompleteTextField_1.default, { showHelp: showHelp, params: params, inputBoxVal: inputBoxVal, TextFieldProps: TextFieldProps, setCurrentSearch: setCurrentSearch, setInputValue: setInputValue })), getOptionLabel: opt => typeof opt === 'string' ? opt : opt.result.getDisplayString() })));
|
|
79
|
+
return (react_1.default.createElement(material_1.Autocomplete, { "data-testid": "autocomplete", disableListWrap: true, disableClearable: true, disabled: !assemblyName, freeSolo: true, includeInputInList: true, selectOnFocus: true, style: { ...style, width }, value: inputBoxVal, loading: !loaded, inputValue: inputValue, onInputChange: (_event, newInputValue) => {
|
|
80
|
+
setInputValue(newInputValue);
|
|
81
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(newInputValue);
|
|
82
|
+
}, loadingText: "loading results", open: open, onOpen: () => setOpen(true), onClose: () => {
|
|
83
|
+
setOpen(false);
|
|
84
|
+
setLoaded(true);
|
|
85
|
+
if (hasDisplayedRegions) {
|
|
86
|
+
setCurrentSearch('');
|
|
87
|
+
setSearchOptions(undefined);
|
|
88
|
+
}
|
|
89
|
+
}, onChange: (_event, selectedOption) => {
|
|
90
|
+
if (!selectedOption || !assemblyName) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (typeof selectedOption === 'string') {
|
|
94
|
+
// handles string inputs on keyPress enter
|
|
95
|
+
onSelect === null || onSelect === void 0 ? void 0 : onSelect(new BaseResults_1.default({ label: selectedOption }));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectedOption.result);
|
|
99
|
+
}
|
|
100
|
+
setInputValue(inputBoxVal);
|
|
101
|
+
}, options: (searchOptions === null || searchOptions === void 0 ? void 0 : searchOptions.length) ? searchOptions : regionOptions, getOptionDisabled: option => option.group === 'limitOption', filterOptions: (opts, { inputValue }) => (0, util_2.getFiltered)(opts, inputValue), renderInput: params => (react_1.default.createElement(AutocompleteTextField_1.default, { showHelp: showHelp, params: params, inputBoxVal: inputBoxVal, TextFieldProps: TextFieldProps, setCurrentSearch: setCurrentSearch, setInputValue: setInputValue })), getOptionLabel: opt => typeof opt === 'string' ? opt : opt.result.getDisplayString() }));
|
|
109
102
|
});
|
|
110
103
|
exports.default = RefNameAutocomplete;
|
|
@@ -3,6 +3,6 @@ import { LinearGenomeViewModel } from '..';
|
|
|
3
3
|
type LGV = LinearGenomeViewModel;
|
|
4
4
|
declare const Rubberband: ({ model, ControlComponent, }: {
|
|
5
5
|
model: LGV;
|
|
6
|
-
ControlComponent?: React.ReactElement
|
|
6
|
+
ControlComponent?: React.ReactElement;
|
|
7
7
|
}) => React.JSX.Element;
|
|
8
8
|
export default Rubberband;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { LinearGenomeViewModel } from '..';
|
|
3
3
|
declare const SearchBox: ({ model, showHelp, }: {
|
|
4
|
-
showHelp?: boolean
|
|
4
|
+
showHelp?: boolean;
|
|
5
5
|
model: LinearGenomeViewModel;
|
|
6
6
|
}) => React.JSX.Element;
|
|
7
7
|
export default SearchBox;
|