@jbrowse/plugin-linear-genome-view 2.10.0 → 2.10.2
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/util.js +4 -2
- package/dist/LaunchLinearGenomeView/index.js +8 -2
- package/dist/LinearBasicDisplay/model.d.ts +10 -20
- package/dist/LinearBasicDisplay/model.js +2 -2
- package/dist/LinearGenomeView/components/ExportSvgDialog.d.ts +1 -1
- package/dist/LinearGenomeView/components/ExportSvgDialog.js +2 -2
- package/dist/LinearGenomeView/components/OverviewScalebar.d.ts +0 -8
- package/dist/LinearGenomeView/components/OverviewScalebar.js +23 -55
- package/dist/LinearGenomeView/components/OverviewScalebarPolygon.d.ts +9 -0
- package/dist/LinearGenomeView/components/OverviewScalebarPolygon.js +46 -0
- package/dist/LinearGenomeView/components/RefNameAutocomplete/EndAdornment.js +1 -1
- package/dist/LinearGenomeView/components/RefNameAutocomplete/index.js +9 -10
- package/dist/LinearGenomeView/model.d.ts +5 -5
- package/dist/LinearGenomeView/model.js +15 -15
- package/dist/LinearGenomeView/svgcomponents/SVGHeader.js +2 -2
- package/dist/index.d.ts +30 -30
- package/esm/BaseLinearDisplay/models/util.js +4 -2
- package/esm/LaunchLinearGenomeView/index.js +8 -2
- package/esm/LinearBasicDisplay/model.d.ts +10 -20
- package/esm/LinearBasicDisplay/model.js +2 -2
- package/esm/LinearGenomeView/components/ExportSvgDialog.d.ts +1 -1
- package/esm/LinearGenomeView/components/ExportSvgDialog.js +1 -1
- package/esm/LinearGenomeView/components/OverviewScalebar.d.ts +0 -8
- package/esm/LinearGenomeView/components/OverviewScalebar.js +23 -53
- package/esm/LinearGenomeView/components/OverviewScalebarPolygon.d.ts +9 -0
- package/esm/LinearGenomeView/components/OverviewScalebarPolygon.js +41 -0
- package/esm/LinearGenomeView/components/RefNameAutocomplete/EndAdornment.js +1 -1
- package/esm/LinearGenomeView/components/RefNameAutocomplete/index.js +10 -11
- package/esm/LinearGenomeView/model.d.ts +5 -5
- package/esm/LinearGenomeView/model.js +15 -15
- package/esm/LinearGenomeView/svgcomponents/SVGHeader.js +2 -2
- package/esm/index.d.ts +30 -30
- package/package.json +2 -2
|
@@ -20,8 +20,10 @@ function getDisplayStr(totalBytes) {
|
|
|
20
20
|
exports.getDisplayStr = getDisplayStr;
|
|
21
21
|
// stabilize clipid under test for snapshot
|
|
22
22
|
function getId(id, index) {
|
|
23
|
-
const
|
|
24
|
-
return
|
|
23
|
+
const notJest = typeof jest === 'undefined';
|
|
24
|
+
return ['clip', notJest ? id : 'jest', index, notJest ? Math.random() : '']
|
|
25
|
+
.filter(f => !!f)
|
|
26
|
+
.join('-');
|
|
25
27
|
}
|
|
26
28
|
exports.getId = getId;
|
|
27
29
|
async function getFeatureDensityStatsPre(self) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const util_1 = require("@jbrowse/core/util");
|
|
4
|
-
const searchUtils_1 = require("
|
|
4
|
+
const searchUtils_1 = require("../searchUtils");
|
|
5
5
|
exports.default = (pluginManager) => {
|
|
6
6
|
pluginManager.addToExtensionPoint('LaunchView-LinearGenomeView',
|
|
7
7
|
// @ts-expect-error
|
|
8
|
-
async ({ session, assembly, loc, tracks = [], }) => {
|
|
8
|
+
async ({ session, assembly, loc, tracks = [], tracklist, nav, }) => {
|
|
9
9
|
try {
|
|
10
10
|
const { assemblyManager } = session;
|
|
11
11
|
const view = session.addView('LinearGenomeView', {});
|
|
@@ -23,6 +23,12 @@ exports.default = (pluginManager) => {
|
|
|
23
23
|
if (idsNotFound.length) {
|
|
24
24
|
throw new Error(`Could not resolve identifiers: ${idsNotFound.join(',')}`);
|
|
25
25
|
}
|
|
26
|
+
if (tracklist) {
|
|
27
|
+
view.activateTrackSelector();
|
|
28
|
+
}
|
|
29
|
+
if (nav !== undefined) {
|
|
30
|
+
view.setHideHeader(!nav);
|
|
31
|
+
}
|
|
26
32
|
}
|
|
27
33
|
catch (e) {
|
|
28
34
|
session.notify(`${e}`, 'error');
|
|
@@ -37,9 +37,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
37
37
|
isLeftEndOfDisplayedRegion: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
38
38
|
isRightEndOfDisplayedRegion: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
39
39
|
}, {
|
|
40
|
-
renderInProgress: AbortController | undefined;
|
|
41
|
-
* #property
|
|
42
|
-
*/
|
|
40
|
+
renderInProgress: AbortController | undefined;
|
|
43
41
|
filled: boolean;
|
|
44
42
|
reactElement: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
45
43
|
features: Map<string, import("@jbrowse/core/util").Feature> | undefined;
|
|
@@ -159,12 +157,11 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
159
157
|
}, {
|
|
160
158
|
rendererTypeName: string;
|
|
161
159
|
error: unknown;
|
|
162
|
-
message: string | undefined;
|
|
160
|
+
message: string | undefined; /**
|
|
161
|
+
* #action
|
|
162
|
+
*/
|
|
163
163
|
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
|
|
164
164
|
}> | null;
|
|
165
|
-
/**
|
|
166
|
-
* #action
|
|
167
|
-
*/
|
|
168
165
|
readonly adapterConfig: any;
|
|
169
166
|
readonly parentTrack: any;
|
|
170
167
|
renderProps(): any;
|
|
@@ -193,9 +190,6 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
193
190
|
} & {
|
|
194
191
|
readonly currentBytesRequested: number;
|
|
195
192
|
readonly currentFeatureScreenDensity: number;
|
|
196
|
-
/**
|
|
197
|
-
* #getter
|
|
198
|
-
*/
|
|
199
193
|
readonly maxFeatureScreenDensity: any;
|
|
200
194
|
readonly featureDensityStatsReady: boolean;
|
|
201
195
|
readonly maxAllowableBytes: number;
|
|
@@ -205,7 +199,9 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
205
199
|
setCurrStatsBpPerPx(n: number): void;
|
|
206
200
|
setFeatureDensityStatsLimit(stats?: import("@jbrowse/core/data_adapters/BaseAdapter").FeatureDensityStats | undefined): void;
|
|
207
201
|
getFeatureDensityStats(): Promise<import("@jbrowse/core/data_adapters/BaseAdapter").FeatureDensityStats>;
|
|
208
|
-
setFeatureDensityStatsP(arg: any): void;
|
|
202
|
+
setFeatureDensityStatsP(arg: any): void; /**
|
|
203
|
+
* #method
|
|
204
|
+
*/
|
|
209
205
|
setFeatureDensityStats(featureDensityStats?: import("@jbrowse/core/data_adapters/BaseAdapter").FeatureDensityStats | undefined): void;
|
|
210
206
|
clearFeatureDensityStats(): void;
|
|
211
207
|
} & {
|
|
@@ -275,9 +271,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
275
271
|
readonly rendererConfig: {
|
|
276
272
|
[x: string]: any;
|
|
277
273
|
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
278
|
-
setSubschema(slotName: string, data: unknown): any;
|
|
279
|
-
* #property
|
|
280
|
-
*/
|
|
274
|
+
setSubschema(slotName: string, data: unknown): any;
|
|
281
275
|
} & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>;
|
|
282
276
|
} & {
|
|
283
277
|
/**
|
|
@@ -304,9 +298,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
304
298
|
config: {
|
|
305
299
|
[x: string]: any;
|
|
306
300
|
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
307
|
-
setSubschema(slotName: string, data: unknown): any;
|
|
308
|
-
* #property
|
|
309
|
-
*/
|
|
301
|
+
setSubschema(slotName: string, data: unknown): any;
|
|
310
302
|
} & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>;
|
|
311
303
|
};
|
|
312
304
|
/**
|
|
@@ -341,9 +333,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
341
333
|
isLeftEndOfDisplayedRegion: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
342
334
|
isRightEndOfDisplayedRegion: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
343
335
|
}, {
|
|
344
|
-
renderInProgress: AbortController | undefined;
|
|
345
|
-
* #property
|
|
346
|
-
*/
|
|
336
|
+
renderInProgress: AbortController | undefined;
|
|
347
337
|
filled: boolean;
|
|
348
338
|
reactElement: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
349
339
|
features: Map<string, import("@jbrowse/core/util").Feature> | undefined;
|
|
@@ -34,7 +34,7 @@ const mobx_state_tree_1 = require("mobx-state-tree");
|
|
|
34
34
|
const Visibility_1 = __importDefault(require("@mui/icons-material/Visibility"));
|
|
35
35
|
// locals
|
|
36
36
|
const BaseLinearDisplay_1 = require("../BaseLinearDisplay");
|
|
37
|
-
const
|
|
37
|
+
const SetMaxHeightDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./components/SetMaxHeight'))));
|
|
38
38
|
/**
|
|
39
39
|
* #stateModel LinearBasicDisplay
|
|
40
40
|
* #category display
|
|
@@ -202,7 +202,7 @@ function stateModelFactory(configSchema) {
|
|
|
202
202
|
label: 'Set max height',
|
|
203
203
|
onClick: () => {
|
|
204
204
|
(0, util_1.getSession)(self).queueDialog(handleClose => [
|
|
205
|
-
|
|
205
|
+
SetMaxHeightDialog,
|
|
206
206
|
{ model: self, handleClose },
|
|
207
207
|
]);
|
|
208
208
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ExportSvgOptions } from '..';
|
|
3
|
-
export default function
|
|
3
|
+
export default function ExportSvgDialog({ model, handleClose, }: {
|
|
4
4
|
model: {
|
|
5
5
|
exportSvg(opts: ExportSvgOptions): Promise<void>;
|
|
6
6
|
};
|
|
@@ -35,7 +35,7 @@ function LoadingMessage() {
|
|
|
35
35
|
function useSvgLocal(key, val) {
|
|
36
36
|
return (0, util_1.useLocalStorage)('svg-' + key, val);
|
|
37
37
|
}
|
|
38
|
-
function
|
|
38
|
+
function ExportSvgDialog({ model, handleClose, }) {
|
|
39
39
|
const session = (0, util_1.getSession)(model);
|
|
40
40
|
const offscreenCanvas = typeof OffscreenCanvas !== 'undefined';
|
|
41
41
|
const [rasterizeLayers, setRasterizeLayers] = (0, react_1.useState)(offscreenCanvas);
|
|
@@ -80,4 +80,4 @@ function ExportSvgDlg({ model, handleClose, }) {
|
|
|
80
80
|
}
|
|
81
81
|
} }, "Submit"))));
|
|
82
82
|
}
|
|
83
|
-
exports.default =
|
|
83
|
+
exports.default = ExportSvgDialog;
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel';
|
|
3
2
|
import { LinearGenomeViewModel } from '..';
|
|
4
|
-
declare const Polygon: ({ model, overview, useOffset, }: {
|
|
5
|
-
model: LGV;
|
|
6
|
-
overview: Base1DViewModel;
|
|
7
|
-
useOffset?: boolean | undefined;
|
|
8
|
-
}) => React.JSX.Element | null;
|
|
9
3
|
type LGV = LinearGenomeViewModel;
|
|
10
4
|
declare const OverviewScalebar: ({ model, children, }: {
|
|
11
5
|
model: LGV;
|
|
12
6
|
children: React.ReactNode;
|
|
13
7
|
}) => React.JSX.Element;
|
|
14
|
-
export { Polygon };
|
|
15
|
-
export { default as Cytobands } from './Cytobands';
|
|
16
8
|
export default OverviewScalebar;
|
|
@@ -26,7 +26,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.Cytobands = exports.Polygon = void 0;
|
|
30
29
|
const react_1 = __importStar(require("react"));
|
|
31
30
|
const material_1 = require("@mui/material");
|
|
32
31
|
const mui_1 = require("tss-react/mui");
|
|
@@ -38,9 +37,10 @@ const blockTypes_1 = require("@jbrowse/core/util/blockTypes");
|
|
|
38
37
|
// locals
|
|
39
38
|
const __1 = require("..");
|
|
40
39
|
const util_2 = require("../util");
|
|
40
|
+
const util_3 = require("./util");
|
|
41
41
|
const OverviewRubberband_1 = __importDefault(require("./OverviewRubberband"));
|
|
42
42
|
const Cytobands_1 = __importDefault(require("./Cytobands"));
|
|
43
|
-
const
|
|
43
|
+
const OverviewScalebarPolygon_1 = __importDefault(require("./OverviewScalebarPolygon"));
|
|
44
44
|
const wholeSeqSpacer = 2;
|
|
45
45
|
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
46
46
|
scalebar: {
|
|
@@ -94,56 +94,14 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
|
94
94
|
position: 'absolute',
|
|
95
95
|
},
|
|
96
96
|
}));
|
|
97
|
-
const Polygon = (0, mobx_react_1.observer)(function ({ model, overview, useOffset = true, }) {
|
|
98
|
-
const theme = (0, material_1.useTheme)();
|
|
99
|
-
const multiplier = Number(useOffset);
|
|
100
|
-
const { interRegionPaddingWidth, offsetPx, dynamicBlocks, cytobandOffset } = model;
|
|
101
|
-
const { contentBlocks, totalWidthPxWithoutBorders } = dynamicBlocks;
|
|
102
|
-
const { tertiary, primary } = theme.palette;
|
|
103
|
-
const polygonColor = tertiary ? tertiary.light : primary.light;
|
|
104
|
-
// catches possible null from at's below
|
|
105
|
-
if (!contentBlocks.length) {
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
const first = contentBlocks.at(0);
|
|
109
|
-
const last = contentBlocks.at(-1);
|
|
110
|
-
const topLeft = (overview.bpToPx({
|
|
111
|
-
...first,
|
|
112
|
-
coord: first.reversed ? first.end : first.start,
|
|
113
|
-
}) || 0) +
|
|
114
|
-
cytobandOffset * multiplier;
|
|
115
|
-
const topRight = (overview.bpToPx({
|
|
116
|
-
...last,
|
|
117
|
-
coord: last.reversed ? last.start : last.end,
|
|
118
|
-
}) || 0) +
|
|
119
|
-
cytobandOffset * multiplier;
|
|
120
|
-
const startPx = Math.max(0, -offsetPx);
|
|
121
|
-
const endPx = startPx +
|
|
122
|
-
totalWidthPxWithoutBorders +
|
|
123
|
-
(contentBlocks.length * interRegionPaddingWidth) / 2;
|
|
124
|
-
const points = [
|
|
125
|
-
[startPx, __1.HEADER_BAR_HEIGHT],
|
|
126
|
-
[endPx, __1.HEADER_BAR_HEIGHT],
|
|
127
|
-
[topRight, 0],
|
|
128
|
-
[topLeft, 0],
|
|
129
|
-
];
|
|
130
|
-
return (react_1.default.createElement("polygon", { points: points.toString(), fill: (0, material_1.alpha)(polygonColor, 0.3), stroke: (0, material_1.alpha)(polygonColor, 0.8) }));
|
|
131
|
-
});
|
|
132
|
-
exports.Polygon = Polygon;
|
|
133
97
|
const OverviewBox = (0, mobx_react_1.observer)(function ({ scale, model, block, overview, }) {
|
|
134
98
|
const { classes, cx } = useStyles();
|
|
135
99
|
const theme = (0, material_1.useTheme)();
|
|
136
100
|
const { cytobandOffset, showCytobands } = model;
|
|
137
|
-
const {
|
|
138
|
-
const { majorPitch } = (0, util_2.chooseGridPitch)(scale, 120, 15);
|
|
101
|
+
const { reversed, refName, assemblyName } = block;
|
|
139
102
|
const { assemblyManager } = (0, util_1.getSession)(model);
|
|
140
103
|
const assembly = assemblyManager.get(assemblyName);
|
|
141
104
|
const refNameColor = assembly === null || assembly === void 0 ? void 0 : assembly.getRefNameColor(refName);
|
|
142
|
-
const tickLabels = [];
|
|
143
|
-
for (let i = 0; i < Math.floor((end - start) / majorPitch); i++) {
|
|
144
|
-
const offsetLabel = (i + 1) * majorPitch;
|
|
145
|
-
tickLabels.push(reversed ? end - offsetLabel : start + offsetLabel);
|
|
146
|
-
}
|
|
147
105
|
const canDisplayCytobands = showCytobands && (0, util_3.getCytobands)(assembly, block.refName).length;
|
|
148
106
|
return (react_1.default.createElement("div", null,
|
|
149
107
|
react_1.default.createElement(material_1.Typography, { style: {
|
|
@@ -161,16 +119,28 @@ const OverviewBox = (0, mobx_react_1.observer)(function ({ scale, model, block,
|
|
|
161
119
|
width: block.widthPx,
|
|
162
120
|
borderColor: refNameColor,
|
|
163
121
|
} },
|
|
164
|
-
!canDisplayCytobands
|
|
165
|
-
? tickLabels.map((tickLabel, labelIdx) => (react_1.default.createElement(material_1.Typography, { key: `${JSON.stringify(block)}-${tickLabel}-${labelIdx}`, className: classes.scalebarLabel, variant: "body2", style: {
|
|
166
|
-
left: ((labelIdx + 1) * majorPitch) / scale,
|
|
167
|
-
pointerEvents: 'none',
|
|
168
|
-
color: refNameColor,
|
|
169
|
-
} }, (0, util_1.getTickDisplayStr)(tickLabel, overview.bpPerPx))))
|
|
170
|
-
: null,
|
|
122
|
+
!canDisplayCytobands ? (react_1.default.createElement(TickLabels, { model: model, overview: overview, scale: scale, block: block })) : null,
|
|
171
123
|
canDisplayCytobands ? (react_1.default.createElement("svg", { style: { width: '100%' } },
|
|
172
124
|
react_1.default.createElement(Cytobands_1.default, { overview: overview, assembly: assembly, block: block }))) : null)));
|
|
173
125
|
});
|
|
126
|
+
const TickLabels = (0, mobx_react_1.observer)(function ({ block, scale, overview, model, }) {
|
|
127
|
+
const { classes } = useStyles();
|
|
128
|
+
const { start, end, reversed, refName, assemblyName } = block;
|
|
129
|
+
const { majorPitch } = (0, util_2.chooseGridPitch)(scale, 120, 15);
|
|
130
|
+
const { assemblyManager } = (0, util_1.getSession)(model);
|
|
131
|
+
const assembly = assemblyManager.get(assemblyName);
|
|
132
|
+
const refNameColor = assembly === null || assembly === void 0 ? void 0 : assembly.getRefNameColor(refName);
|
|
133
|
+
const tickLabels = [];
|
|
134
|
+
for (let i = 0; i < Math.floor((end - start) / majorPitch); i++) {
|
|
135
|
+
const offsetLabel = (i + 1) * majorPitch;
|
|
136
|
+
tickLabels.push(reversed ? end - offsetLabel : start + offsetLabel);
|
|
137
|
+
}
|
|
138
|
+
return tickLabels.map((tickLabel, labelIdx) => (react_1.default.createElement(material_1.Typography, { key: `${JSON.stringify(block)}-${tickLabel}-${labelIdx}`, className: classes.scalebarLabel, variant: "body2", style: {
|
|
139
|
+
left: ((labelIdx + 1) * majorPitch) / scale,
|
|
140
|
+
pointerEvents: 'none',
|
|
141
|
+
color: refNameColor,
|
|
142
|
+
} }, (0, util_1.getTickDisplayStr)(tickLabel, overview.bpPerPx))));
|
|
143
|
+
});
|
|
174
144
|
const Scalebar = (0, mobx_react_1.observer)(function ({ model, scale, overview, }) {
|
|
175
145
|
const { classes } = useStyles();
|
|
176
146
|
const theme = (0, material_1.useTheme)();
|
|
@@ -235,9 +205,7 @@ const OverviewScalebar = (0, mobx_react_1.observer)(function ({ model, children,
|
|
|
235
205
|
react_1.default.createElement(OverviewRubberband_1.default, { model: model, overview: overview, ControlComponent: react_1.default.createElement(Scalebar, { model: model, overview: overview, scale: scale }) }),
|
|
236
206
|
react_1.default.createElement("div", { className: classes.overview },
|
|
237
207
|
react_1.default.createElement("svg", { height: __1.HEADER_BAR_HEIGHT, className: classes.overviewSvg },
|
|
238
|
-
react_1.default.createElement(
|
|
208
|
+
react_1.default.createElement(OverviewScalebarPolygon_1.default, { model: model, overview: overview })),
|
|
239
209
|
children)));
|
|
240
210
|
});
|
|
241
|
-
var Cytobands_2 = require("./Cytobands");
|
|
242
|
-
Object.defineProperty(exports, "Cytobands", { enumerable: true, get: function () { return __importDefault(Cytobands_2).default; } });
|
|
243
211
|
exports.default = OverviewScalebar;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel';
|
|
3
|
+
import { LinearGenomeViewModel } from '..';
|
|
4
|
+
declare const OverviewScalebarPolygon: ({ model, overview, useOffset, }: {
|
|
5
|
+
model: LinearGenomeViewModel;
|
|
6
|
+
overview: Base1DViewModel;
|
|
7
|
+
useOffset?: boolean | undefined;
|
|
8
|
+
}) => React.JSX.Element | null;
|
|
9
|
+
export default OverviewScalebarPolygon;
|
|
@@ -0,0 +1,46 @@
|
|
|
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 material_1 = require("@mui/material");
|
|
8
|
+
const mobx_react_1 = require("mobx-react");
|
|
9
|
+
// locals
|
|
10
|
+
const __1 = require("..");
|
|
11
|
+
const OverviewScalebarPolygon = (0, mobx_react_1.observer)(function ({ model, overview, useOffset = true, }) {
|
|
12
|
+
const theme = (0, material_1.useTheme)();
|
|
13
|
+
const multiplier = Number(useOffset);
|
|
14
|
+
const { interRegionPaddingWidth, offsetPx, dynamicBlocks, cytobandOffset } = model;
|
|
15
|
+
const { contentBlocks, totalWidthPxWithoutBorders } = dynamicBlocks;
|
|
16
|
+
const { tertiary, primary } = theme.palette;
|
|
17
|
+
const polygonColor = tertiary ? tertiary.light : primary.light;
|
|
18
|
+
// catches possible null from at's below
|
|
19
|
+
if (!contentBlocks.length) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const first = contentBlocks.at(0);
|
|
23
|
+
const last = contentBlocks.at(-1);
|
|
24
|
+
const topLeft = (overview.bpToPx({
|
|
25
|
+
...first,
|
|
26
|
+
coord: first.reversed ? first.end : first.start,
|
|
27
|
+
}) || 0) +
|
|
28
|
+
cytobandOffset * multiplier;
|
|
29
|
+
const topRight = (overview.bpToPx({
|
|
30
|
+
...last,
|
|
31
|
+
coord: last.reversed ? last.start : last.end,
|
|
32
|
+
}) || 0) +
|
|
33
|
+
cytobandOffset * multiplier;
|
|
34
|
+
const startPx = Math.max(0, -offsetPx);
|
|
35
|
+
const endPx = startPx +
|
|
36
|
+
totalWidthPxWithoutBorders +
|
|
37
|
+
(contentBlocks.length * interRegionPaddingWidth) / 2;
|
|
38
|
+
const points = [
|
|
39
|
+
[startPx, __1.HEADER_BAR_HEIGHT],
|
|
40
|
+
[endPx, __1.HEADER_BAR_HEIGHT],
|
|
41
|
+
[topRight, 0],
|
|
42
|
+
[topLeft, 0],
|
|
43
|
+
];
|
|
44
|
+
return (react_1.default.createElement("polygon", { points: points.toString(), fill: (0, material_1.alpha)(polygonColor, 0.3), stroke: (0, material_1.alpha)(polygonColor, 0.8) }));
|
|
45
|
+
});
|
|
46
|
+
exports.default = OverviewScalebarPolygon;
|
|
@@ -38,7 +38,7 @@ function HelpAdornment() {
|
|
|
38
38
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
39
39
|
react_1.default.createElement(material_1.IconButton, { onClick: () => setHelpDialogDisplayed(true), size: "small" },
|
|
40
40
|
react_1.default.createElement(Help_1.default, { fontSize: "small" })),
|
|
41
|
-
isHelpDialogDisplayed ? (react_1.default.createElement(react_1.Suspense, { fallback:
|
|
41
|
+
isHelpDialogDisplayed ? (react_1.default.createElement(react_1.Suspense, { fallback: null },
|
|
42
42
|
react_1.default.createElement(HelpDialog, { handleClose: () => setHelpDialogDisplayed(false) }))) : null));
|
|
43
43
|
}
|
|
44
44
|
function EndAdornment({ showHelp, endAdornment, }) {
|
|
@@ -34,7 +34,6 @@ const material_1 = require("@mui/material");
|
|
|
34
34
|
const util_2 = require("./util");
|
|
35
35
|
const AutocompleteTextField_1 = __importDefault(require("./AutocompleteTextField"));
|
|
36
36
|
const RefNameAutocomplete = (0, mobx_react_1.observer)(function ({ model, onSelect, assemblyName, style, fetchResults, onChange, value, showHelp = true, minWidth = 200, maxWidth = 550, TextFieldProps = {}, }) {
|
|
37
|
-
var _a;
|
|
38
37
|
const session = (0, util_1.getSession)(model);
|
|
39
38
|
const { assemblyManager } = session;
|
|
40
39
|
const [open, setOpen] = (0, react_1.useState)(false);
|
|
@@ -73,6 +72,14 @@ const RefNameAutocomplete = (0, mobx_react_1.observer)(function ({ model, onSele
|
|
|
73
72
|
const inputBoxVal = coarseVisibleLocStrings || value || '';
|
|
74
73
|
// heuristic, text width + 60 accommodates help icon and search icon
|
|
75
74
|
const width = Math.min(Math.max((0, util_1.measureText)(inputBoxVal, 14) + 100, minWidth), maxWidth);
|
|
75
|
+
const regions = assembly === null || assembly === void 0 ? void 0 : assembly.regions;
|
|
76
|
+
const regionOptions = (0, react_1.useMemo)(() => (regions === null || regions === void 0 ? void 0 : regions.map(option => ({
|
|
77
|
+
result: new BaseResults_1.RefSequenceResult({
|
|
78
|
+
refName: option.refName,
|
|
79
|
+
label: option.refName,
|
|
80
|
+
matchedAttribute: 'refName',
|
|
81
|
+
}),
|
|
82
|
+
}))) || [], [regions]);
|
|
76
83
|
// notes on implementation:
|
|
77
84
|
// The selectOnFocus setting helps highlight the field when clicked
|
|
78
85
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
@@ -98,14 +105,6 @@ const RefNameAutocomplete = (0, mobx_react_1.observer)(function ({ model, onSele
|
|
|
98
105
|
onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectedOption.result);
|
|
99
106
|
}
|
|
100
107
|
setInputValue(inputBoxVal);
|
|
101
|
-
}, options:
|
|
102
|
-
? ((_a = assembly === null || assembly === void 0 ? void 0 : assembly.regions) === null || _a === void 0 ? void 0 : _a.map(option => ({
|
|
103
|
-
result: new BaseResults_1.RefSequenceResult({
|
|
104
|
-
refName: option.refName,
|
|
105
|
-
label: option.refName,
|
|
106
|
-
matchedAttribute: 'refName',
|
|
107
|
-
}),
|
|
108
|
-
}))) || []
|
|
109
|
-
: searchOptions, 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() })));
|
|
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() })));
|
|
110
109
|
});
|
|
111
110
|
exports.default = RefNameAutocomplete;
|
|
@@ -238,19 +238,19 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
238
238
|
/**
|
|
239
239
|
* #action
|
|
240
240
|
*/
|
|
241
|
-
|
|
241
|
+
setHideHeader(b: boolean): void;
|
|
242
242
|
/**
|
|
243
243
|
* #action
|
|
244
244
|
*/
|
|
245
|
-
|
|
245
|
+
setHideHeaderOverview(b: boolean): void;
|
|
246
246
|
/**
|
|
247
247
|
* #action
|
|
248
248
|
*/
|
|
249
|
-
|
|
249
|
+
setHideNoTracksActive(b: boolean): void;
|
|
250
250
|
/**
|
|
251
251
|
* #action
|
|
252
252
|
*/
|
|
253
|
-
|
|
253
|
+
setShowGridlines(b: boolean): void;
|
|
254
254
|
/**
|
|
255
255
|
* #action
|
|
256
256
|
*/
|
|
@@ -306,7 +306,7 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
306
306
|
/**
|
|
307
307
|
* #action
|
|
308
308
|
*/
|
|
309
|
-
|
|
309
|
+
setShowCenterLine(b: boolean): void;
|
|
310
310
|
/**
|
|
311
311
|
* #action
|
|
312
312
|
*/
|
|
@@ -447,26 +447,26 @@ function stateModelFactory(pluginManager) {
|
|
|
447
447
|
/**
|
|
448
448
|
* #action
|
|
449
449
|
*/
|
|
450
|
-
|
|
451
|
-
self.hideHeader =
|
|
450
|
+
setHideHeader(b) {
|
|
451
|
+
self.hideHeader = b;
|
|
452
452
|
},
|
|
453
453
|
/**
|
|
454
454
|
* #action
|
|
455
455
|
*/
|
|
456
|
-
|
|
457
|
-
self.hideHeaderOverview =
|
|
456
|
+
setHideHeaderOverview(b) {
|
|
457
|
+
self.hideHeaderOverview = b;
|
|
458
458
|
},
|
|
459
459
|
/**
|
|
460
460
|
* #action
|
|
461
461
|
*/
|
|
462
|
-
|
|
463
|
-
self.hideNoTracksActive =
|
|
462
|
+
setHideNoTracksActive(b) {
|
|
463
|
+
self.hideNoTracksActive = b;
|
|
464
464
|
},
|
|
465
465
|
/**
|
|
466
466
|
* #action
|
|
467
467
|
*/
|
|
468
|
-
|
|
469
|
-
self.showGridlines =
|
|
468
|
+
setShowGridlines(b) {
|
|
469
|
+
self.showGridlines = b;
|
|
470
470
|
},
|
|
471
471
|
/**
|
|
472
472
|
* #action
|
|
@@ -642,8 +642,8 @@ function stateModelFactory(pluginManager) {
|
|
|
642
642
|
/**
|
|
643
643
|
* #action
|
|
644
644
|
*/
|
|
645
|
-
|
|
646
|
-
self.showCenterLine =
|
|
645
|
+
setShowCenterLine(b) {
|
|
646
|
+
self.showCenterLine = b;
|
|
647
647
|
},
|
|
648
648
|
/**
|
|
649
649
|
* #action
|
|
@@ -920,32 +920,32 @@ function stateModelFactory(pluginManager) {
|
|
|
920
920
|
label: 'Show center line',
|
|
921
921
|
type: 'checkbox',
|
|
922
922
|
checked: self.showCenterLine,
|
|
923
|
-
onClick: self.
|
|
923
|
+
onClick: () => self.setShowCenterLine(!self.showCenterLine),
|
|
924
924
|
},
|
|
925
925
|
{
|
|
926
926
|
label: 'Show header',
|
|
927
927
|
type: 'checkbox',
|
|
928
928
|
checked: !self.hideHeader,
|
|
929
|
-
onClick: self.
|
|
929
|
+
onClick: () => self.setHideHeader(!self.hideHeader),
|
|
930
930
|
},
|
|
931
931
|
{
|
|
932
932
|
label: 'Show header overview',
|
|
933
933
|
type: 'checkbox',
|
|
934
934
|
checked: !self.hideHeaderOverview,
|
|
935
|
-
onClick: self.
|
|
935
|
+
onClick: () => self.setHideHeaderOverview(!self.hideHeaderOverview),
|
|
936
936
|
disabled: self.hideHeader,
|
|
937
937
|
},
|
|
938
938
|
{
|
|
939
939
|
label: 'Show no tracks active button',
|
|
940
940
|
type: 'checkbox',
|
|
941
941
|
checked: !self.hideNoTracksActive,
|
|
942
|
-
onClick: self.
|
|
942
|
+
onClick: () => self.setHideNoTracksActive(!self.hideNoTracksActive),
|
|
943
943
|
},
|
|
944
944
|
{
|
|
945
945
|
label: 'Show guidelines',
|
|
946
946
|
type: 'checkbox',
|
|
947
947
|
checked: self.showGridlines,
|
|
948
|
-
onClick: self.
|
|
948
|
+
onClick: () => self.setShowGridlines(!self.showGridlines),
|
|
949
949
|
},
|
|
950
950
|
...(canShowCytobands
|
|
951
951
|
? [
|
|
@@ -10,9 +10,9 @@ const material_1 = require("@mui/material");
|
|
|
10
10
|
// locals
|
|
11
11
|
const __1 = require("..");
|
|
12
12
|
const Cytobands_1 = __importDefault(require("../components/Cytobands"));
|
|
13
|
-
const OverviewScalebar_1 = require("../components/OverviewScalebar");
|
|
14
13
|
const SVGRuler_1 = __importDefault(require("./SVGRuler"));
|
|
15
14
|
const SVGScalebar_1 = __importDefault(require("./SVGScalebar"));
|
|
15
|
+
const OverviewScalebarPolygon_1 = __importDefault(require("../components/OverviewScalebarPolygon"));
|
|
16
16
|
function SVGHeader({ model, fontSize, cytobandHeight, rulerHeight, }) {
|
|
17
17
|
const { width, assemblyNames, showCytobands, displayedRegions } = model;
|
|
18
18
|
const { assemblyManager } = (0, util_1.getSession)(model);
|
|
@@ -49,7 +49,7 @@ function SVGHeader({ model, fontSize, cytobandHeight, rulerHeight, }) {
|
|
|
49
49
|
react_1.default.createElement(Cytobands_1.default, { overview: overview, assembly: assembly, block: block }),
|
|
50
50
|
react_1.default.createElement("rect", { stroke: "red", fill: "rgb(255,0,0,0.1)", width: Math.max(lastOverviewPx - firstOverviewPx, 0.5), height: __1.HEADER_OVERVIEW_HEIGHT - 1, x: firstOverviewPx, y: 0.5 }),
|
|
51
51
|
react_1.default.createElement("g", { transform: `translate(0,${__1.HEADER_OVERVIEW_HEIGHT})` },
|
|
52
|
-
react_1.default.createElement(
|
|
52
|
+
react_1.default.createElement(OverviewScalebarPolygon_1.default, { overview: overview, model: model, useOffset: false })))) : null,
|
|
53
53
|
react_1.default.createElement("g", { transform: `translate(0 ${fontSize + y})` },
|
|
54
54
|
react_1.default.createElement(SVGScalebar_1.default, { model: model, fontSize: fontSize })),
|
|
55
55
|
react_1.default.createElement("g", { transform: `translate(0 ${rulerHeight + y})` },
|