@jbrowse/plugin-alignments 2.13.1 → 2.15.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/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +5 -3
- package/dist/AlignmentsFeatureDetail/BreakendOptionDialog.js +12 -4
- package/dist/AlignmentsFeatureDetail/Formatter.js +6 -2
- package/dist/AlignmentsFeatureDetail/SuppAlignmentsLocStrings.js +4 -2
- package/dist/AlignmentsFeatureDetail/getSAFeatures.js +4 -4
- package/dist/AlignmentsFeatureDetail/launchBreakpointSplitView.js +2 -2
- package/dist/BamAdapter/BamAdapter.js +12 -18
- package/dist/BamAdapter/BamSlightlyLazyFeature.js +0 -1
- package/dist/CramAdapter/CramAdapter.d.ts +1 -1
- package/dist/CramAdapter/CramAdapter.js +7 -6
- package/dist/CramAdapter/CramTestAdapters.js +8 -2
- package/dist/GuessAlignmentsTypes/index.js +2 -2
- package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +2 -2
- package/dist/LinearAlignmentsDisplay/models/model.d.ts +13 -20
- package/dist/LinearAlignmentsDisplay/models/model.js +13 -3
- package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +9 -4
- package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +41 -22
- package/dist/LinearPileupDisplay/components/{ColorByModifications.js → ColorByModificationsDialog.js} +3 -1
- package/dist/LinearPileupDisplay/components/{ColorByTag.js → ColorByTagDialog.js} +4 -2
- package/dist/LinearPileupDisplay/components/GroupByDialog.d.ts +11 -0
- package/dist/LinearPileupDisplay/components/GroupByDialog.js +129 -0
- package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +1 -3
- package/dist/LinearPileupDisplay/components/{SetFeatureHeight.js → SetFeatureHeightDialog.js} +9 -3
- package/{esm/LinearPileupDisplay/components/SetMaxHeight.d.ts → dist/LinearPileupDisplay/components/SetMaxHeightDialog.d.ts} +1 -1
- package/dist/LinearPileupDisplay/components/{SetMaxHeight.js → SetMaxHeightDialog.js} +7 -3
- package/dist/LinearPileupDisplay/components/{SortByTag.d.ts → SortByTagDialog.d.ts} +1 -1
- package/dist/LinearPileupDisplay/components/{SortByTag.js → SortByTagDialog.js} +7 -3
- package/dist/LinearPileupDisplay/configSchema.js +0 -1
- package/dist/LinearPileupDisplay/model.d.ts +58 -46
- package/dist/LinearPileupDisplay/model.js +69 -41
- package/dist/LinearReadArcsDisplay/components/ReactComponent.js +1 -0
- package/dist/LinearReadArcsDisplay/model.d.ts +2 -2
- package/dist/LinearReadArcsDisplay/model.js +37 -13
- package/dist/LinearReadCloudDisplay/components/ReactComponent.js +4 -1
- package/dist/LinearReadCloudDisplay/drawPairChains.js +3 -3
- package/dist/LinearReadCloudDisplay/model.d.ts +4 -8
- package/dist/LinearReadCloudDisplay/model.js +16 -6
- package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
- package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +1 -1
- package/dist/LinearSNPCoverageDisplay/models/model.d.ts +1 -1
- package/dist/LinearSNPCoverageDisplay/models/model.js +15 -5
- package/dist/MismatchParser/index.js +12 -10
- package/dist/PileupRPC/base.d.ts +1 -1
- package/dist/PileupRPC/methods/GetGlobalValueForTag.d.ts +1 -1
- package/dist/PileupRPC/methods/GetReducedFeatures.d.ts +3 -3
- package/dist/PileupRPC/methods/GetVisibleModifications.d.ts +1 -1
- package/dist/PileupRenderer/PileupLayoutSession.d.ts +1 -1
- package/dist/PileupRenderer/PileupLayoutSession.js +3 -2
- package/dist/PileupRenderer/PileupRenderer.d.ts +1 -1
- package/dist/PileupRenderer/PileupRenderer.js +16 -13
- package/dist/PileupRenderer/colorBy.js +3 -5
- package/dist/PileupRenderer/components/PileupRendering.d.ts +1 -1
- package/dist/PileupRenderer/components/PileupRendering.js +65 -60
- package/dist/PileupRenderer/getAlignmentShapeColor.js +24 -16
- package/dist/PileupRenderer/layoutFeature.js +6 -1
- package/dist/PileupRenderer/layoutFeatures.js +1 -7
- package/dist/PileupRenderer/makeImageData.d.ts +1 -1
- package/dist/PileupRenderer/makeImageData.js +1 -0
- package/dist/PileupRenderer/renderAlignmentShape.js +1 -1
- package/dist/PileupRenderer/renderMismatches.js +1 -1
- package/dist/PileupRenderer/renderSoftClipping.js +1 -1
- package/dist/PileupRenderer/util.js +3 -5
- package/dist/SNPCoverageAdapter/generateCoverageBins.js +4 -10
- package/dist/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +2 -2
- package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +2 -5
- package/dist/index.js +3 -1
- package/dist/shared/BaseDisplayComponent.js +3 -1
- package/dist/shared/{FilterByTag.js → FilterByTagDialog.js} +16 -6
- package/dist/shared/color.js +2 -2
- package/dist/shared/index.d.ts +24 -20
- package/dist/shared/index.js +4 -5
- package/dist/shared/renderSvg.js +1 -3
- package/dist/util.d.ts +1 -1
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +5 -3
- package/esm/AlignmentsFeatureDetail/BreakendOptionDialog.js +12 -4
- package/esm/AlignmentsFeatureDetail/Formatter.js +6 -2
- package/esm/AlignmentsFeatureDetail/SuppAlignmentsLocStrings.js +4 -2
- package/esm/AlignmentsFeatureDetail/getSAFeatures.js +4 -4
- package/esm/AlignmentsFeatureDetail/launchBreakpointSplitView.js +2 -2
- package/esm/BamAdapter/BamAdapter.js +12 -18
- package/esm/BamAdapter/BamSlightlyLazyFeature.js +0 -1
- package/esm/CramAdapter/CramAdapter.d.ts +1 -1
- package/esm/CramAdapter/CramAdapter.js +7 -6
- package/esm/CramAdapter/CramTestAdapters.js +8 -2
- package/esm/GuessAlignmentsTypes/index.js +2 -2
- package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +2 -2
- package/esm/LinearAlignmentsDisplay/models/model.d.ts +13 -20
- package/esm/LinearAlignmentsDisplay/models/model.js +13 -3
- package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +9 -4
- package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +42 -23
- package/esm/LinearPileupDisplay/components/{ColorByModifications.js → ColorByModificationsDialog.js} +3 -1
- package/esm/LinearPileupDisplay/components/{ColorByTag.js → ColorByTagDialog.js} +4 -2
- package/esm/LinearPileupDisplay/components/GroupByDialog.d.ts +11 -0
- package/esm/LinearPileupDisplay/components/GroupByDialog.js +104 -0
- package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +1 -3
- package/esm/LinearPileupDisplay/components/{SetFeatureHeight.js → SetFeatureHeightDialog.js} +9 -3
- package/{dist/LinearPileupDisplay/components/SetMaxHeight.d.ts → esm/LinearPileupDisplay/components/SetMaxHeightDialog.d.ts} +1 -1
- package/esm/LinearPileupDisplay/components/{SetMaxHeight.js → SetMaxHeightDialog.js} +7 -3
- package/esm/LinearPileupDisplay/components/{SortByTag.d.ts → SortByTagDialog.d.ts} +1 -1
- package/esm/LinearPileupDisplay/components/{SortByTag.js → SortByTagDialog.js} +7 -3
- package/esm/LinearPileupDisplay/configSchema.js +0 -1
- package/esm/LinearPileupDisplay/model.d.ts +58 -46
- package/esm/LinearPileupDisplay/model.js +69 -41
- package/esm/LinearReadArcsDisplay/components/ReactComponent.js +1 -0
- package/esm/LinearReadArcsDisplay/model.d.ts +2 -2
- package/esm/LinearReadArcsDisplay/model.js +37 -13
- package/esm/LinearReadCloudDisplay/components/ReactComponent.js +4 -1
- package/esm/LinearReadCloudDisplay/drawPairChains.js +3 -3
- package/esm/LinearReadCloudDisplay/model.d.ts +4 -8
- package/esm/LinearReadCloudDisplay/model.js +16 -6
- package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
- package/esm/LinearSNPCoverageDisplay/components/Tooltip.js +1 -1
- package/esm/LinearSNPCoverageDisplay/models/model.d.ts +1 -1
- package/esm/LinearSNPCoverageDisplay/models/model.js +15 -5
- package/esm/MismatchParser/index.js +12 -10
- package/esm/PileupRPC/base.d.ts +1 -1
- package/esm/PileupRPC/methods/GetGlobalValueForTag.d.ts +1 -1
- package/esm/PileupRPC/methods/GetReducedFeatures.d.ts +3 -3
- package/esm/PileupRPC/methods/GetVisibleModifications.d.ts +1 -1
- package/esm/PileupRenderer/PileupLayoutSession.d.ts +1 -1
- package/esm/PileupRenderer/PileupLayoutSession.js +3 -2
- package/esm/PileupRenderer/PileupRenderer.d.ts +1 -1
- package/esm/PileupRenderer/PileupRenderer.js +16 -13
- package/esm/PileupRenderer/colorBy.js +3 -5
- package/esm/PileupRenderer/components/PileupRendering.d.ts +1 -1
- package/esm/PileupRenderer/components/PileupRendering.js +65 -60
- package/esm/PileupRenderer/getAlignmentShapeColor.js +24 -16
- package/esm/PileupRenderer/layoutFeature.js +6 -1
- package/esm/PileupRenderer/layoutFeatures.js +1 -7
- package/esm/PileupRenderer/makeImageData.d.ts +1 -1
- package/esm/PileupRenderer/makeImageData.js +1 -0
- package/esm/PileupRenderer/renderAlignmentShape.js +1 -1
- package/esm/PileupRenderer/renderMismatches.js +1 -1
- package/esm/PileupRenderer/renderSoftClipping.js +1 -1
- package/esm/PileupRenderer/util.js +3 -5
- package/esm/SNPCoverageAdapter/generateCoverageBins.js +4 -10
- package/esm/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +2 -2
- package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +2 -5
- package/esm/index.js +3 -1
- package/esm/shared/BaseDisplayComponent.js +3 -1
- package/esm/shared/{FilterByTag.js → FilterByTagDialog.js} +16 -6
- package/esm/shared/color.js +2 -2
- package/esm/shared/index.d.ts +24 -20
- package/esm/shared/index.js +4 -5
- package/esm/shared/renderSvg.js +1 -3
- package/esm/util.d.ts +1 -1
- package/package.json +6 -6
- /package/dist/LinearPileupDisplay/components/{ColorByModifications.d.ts → ColorByModificationsDialog.d.ts} +0 -0
- /package/dist/LinearPileupDisplay/components/{ColorByTag.d.ts → ColorByTagDialog.d.ts} +0 -0
- /package/dist/LinearPileupDisplay/components/{SetFeatureHeight.d.ts → SetFeatureHeightDialog.d.ts} +0 -0
- /package/dist/shared/{FilterByTag.d.ts → FilterByTagDialog.d.ts} +0 -0
- /package/esm/LinearPileupDisplay/components/{ColorByModifications.d.ts → ColorByModificationsDialog.d.ts} +0 -0
- /package/esm/LinearPileupDisplay/components/{ColorByTag.d.ts → ColorByTagDialog.d.ts} +0 -0
- /package/esm/LinearPileupDisplay/components/{SetFeatureHeight.d.ts → SetFeatureHeightDialog.d.ts} +0 -0
- /package/esm/shared/{FilterByTag.d.ts → FilterByTagDialog.d.ts} +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IAnyStateTreeNode } from 'mobx-state-tree';
|
|
3
|
+
import { AnyConfigurationModel } from '@jbrowse/core/configuration';
|
|
4
|
+
declare const GroupByTagDialog: (props: {
|
|
5
|
+
model: {
|
|
6
|
+
adapterConfig: AnyConfigurationModel;
|
|
7
|
+
configuration: AnyConfigurationModel;
|
|
8
|
+
} & IAnyStateTreeNode;
|
|
9
|
+
handleClose: () => void;
|
|
10
|
+
}) => React.JSX.Element;
|
|
11
|
+
export default GroupByTagDialog;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import { observer } from 'mobx-react';
|
|
3
|
+
import { Button, Checkbox, DialogActions, DialogContent, FormControlLabel, TextField, Typography, } from '@mui/material';
|
|
4
|
+
import { Dialog, ErrorMessage, LoadingEllipses } from '@jbrowse/core/ui';
|
|
5
|
+
import { getSnapshot } from 'mobx-state-tree';
|
|
6
|
+
import { getContainingTrack, getContainingView, getSession, useDebounce, } from '@jbrowse/core/util';
|
|
7
|
+
// locals
|
|
8
|
+
import { getUniqueTagValues } from '../../shared';
|
|
9
|
+
function clone(c) {
|
|
10
|
+
return JSON.parse(JSON.stringify(c));
|
|
11
|
+
}
|
|
12
|
+
const GroupByTagDialog = observer(function (props) {
|
|
13
|
+
const { model, handleClose } = props;
|
|
14
|
+
const [tag, setTag] = useState('');
|
|
15
|
+
const [tagSet, setTagSet] = useState();
|
|
16
|
+
const [loading, setLoading] = useState(false);
|
|
17
|
+
const [error, setError] = useState();
|
|
18
|
+
const [includeUndefined, setIncludeUndefined] = useState(true);
|
|
19
|
+
const validTag = /^[A-Za-z][A-Za-z0-9]$/.exec(tag);
|
|
20
|
+
const isInvalid = tag.length === 2 && !validTag;
|
|
21
|
+
const debouncedTag = useDebounce(tag, 1000);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
24
|
+
;
|
|
25
|
+
(async () => {
|
|
26
|
+
try {
|
|
27
|
+
if (!isInvalid) {
|
|
28
|
+
setError(undefined);
|
|
29
|
+
setLoading(true);
|
|
30
|
+
const vals = await getUniqueTagValues({
|
|
31
|
+
self: model,
|
|
32
|
+
tag: debouncedTag,
|
|
33
|
+
blocks: getContainingView(model)
|
|
34
|
+
.staticBlocks,
|
|
35
|
+
});
|
|
36
|
+
setTagSet(vals);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
console.error(e);
|
|
41
|
+
setError(e);
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
setLoading(false);
|
|
45
|
+
}
|
|
46
|
+
})();
|
|
47
|
+
}, [model, isInvalid, debouncedTag]);
|
|
48
|
+
return (React.createElement(Dialog, { open: true, onClose: handleClose, title: "Group by tag" },
|
|
49
|
+
React.createElement(DialogContent, null,
|
|
50
|
+
React.createElement(Typography, null, "Set the tag to group by. NOTE: this will make a set of fully functional subtracks with the filter by by default set to the values of the tag that are visible in the current view"),
|
|
51
|
+
React.createElement(Typography, { color: "textSecondary" }, "Examples: HP for haplotype, RG for read group, etc."),
|
|
52
|
+
React.createElement(FormControlLabel, { control: React.createElement(Checkbox, { checked: includeUndefined, onChange: () => {
|
|
53
|
+
setIncludeUndefined(!includeUndefined);
|
|
54
|
+
} }), label: "Make a new subtrack for undefined values of tag as well?" }),
|
|
55
|
+
React.createElement(TextField, { value: tag, onChange: event => {
|
|
56
|
+
setTag(event.target.value);
|
|
57
|
+
}, placeholder: "Enter tag name", inputProps: {
|
|
58
|
+
maxLength: 2,
|
|
59
|
+
'data-testid': 'group-tag-name-input',
|
|
60
|
+
}, error: isInvalid, helperText: isInvalid ? 'Not a valid tag' : '', autoComplete: "off", "data-testid": "group-tag-name" }),
|
|
61
|
+
error ? (React.createElement(ErrorMessage, { error: error })) : loading ? (React.createElement(LoadingEllipses, { title: "Loading unique tags" })) : tagSet ? (React.createElement("div", null,
|
|
62
|
+
React.createElement("div", null,
|
|
63
|
+
"Found unique ",
|
|
64
|
+
tag,
|
|
65
|
+
" values:"),
|
|
66
|
+
React.createElement("div", null, tagSet.join(', ')))) : null),
|
|
67
|
+
React.createElement(DialogActions, null,
|
|
68
|
+
React.createElement(Button, { variant: "contained", color: "primary", type: "submit", disabled: !tagSet, autoFocus: true, onClick: () => {
|
|
69
|
+
const track = getContainingTrack(model);
|
|
70
|
+
const trackConf = clone(getSnapshot(track.configuration));
|
|
71
|
+
const session = getSession(model);
|
|
72
|
+
if (tagSet) {
|
|
73
|
+
const ret = [...tagSet];
|
|
74
|
+
if (includeUndefined) {
|
|
75
|
+
ret.push(undefined);
|
|
76
|
+
}
|
|
77
|
+
for (const tagValue of ret) {
|
|
78
|
+
// @ts-expect-error
|
|
79
|
+
const newTrackConf = session.addTrackConf({
|
|
80
|
+
...trackConf,
|
|
81
|
+
trackId: `${trackConf.trackId}-${tag}:${tagValue}-${+Date.now()}-sessionTrack`,
|
|
82
|
+
name: `${trackConf.name} ${tag}:${tagValue}`,
|
|
83
|
+
displays: undefined,
|
|
84
|
+
});
|
|
85
|
+
const view = getContainingView(model);
|
|
86
|
+
const t = view.showTrack(newTrackConf.trackId);
|
|
87
|
+
const d = t.displays[0];
|
|
88
|
+
d.setFilterBy({
|
|
89
|
+
flagInclude: 0,
|
|
90
|
+
flagExclude: 1540,
|
|
91
|
+
tagFilter: {
|
|
92
|
+
tag,
|
|
93
|
+
value: tagValue,
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
handleClose();
|
|
99
|
+
} }, "Submit"),
|
|
100
|
+
React.createElement(Button, { variant: "contained", color: "secondary", onClick: () => {
|
|
101
|
+
handleClose();
|
|
102
|
+
} }, "Cancel"))));
|
|
103
|
+
});
|
|
104
|
+
export default GroupByTagDialog;
|
|
@@ -5,8 +5,6 @@ const LinearPileupDisplayBlurb = observer(function ({ model, }) {
|
|
|
5
5
|
var _a;
|
|
6
6
|
const { sortedBy } = model;
|
|
7
7
|
return sortedBy ? (React.createElement("div", { "data-testid": `blurb-${sortedBy}` },
|
|
8
|
-
React.createElement(Typography, { color: "secondary", variant: "caption" }, sortedBy
|
|
9
|
-
? `Sorted by ${(_a = sortedBy.tag) !== null && _a !== void 0 ? _a : sortedBy.type} at ${sortedBy.refName}:${sortedBy.pos}`
|
|
10
|
-
: null))) : null;
|
|
8
|
+
React.createElement(Typography, { color: "secondary", variant: "caption" }, `Sorted by ${(_a = sortedBy.tag) !== null && _a !== void 0 ? _a : sortedBy.type} at ${sortedBy.refName}:${sortedBy.pos}`))) : null;
|
|
11
9
|
});
|
|
12
10
|
export default LinearPileupDisplayBlurb;
|
package/esm/LinearPileupDisplay/components/{SetFeatureHeight.js → SetFeatureHeightDialog.js}
RENAMED
|
@@ -11,14 +11,20 @@ const SetFeatureHeightDialog = observer(function (props) {
|
|
|
11
11
|
return (React.createElement(Dialog, { open: true, onClose: handleClose, title: "Set feature height" },
|
|
12
12
|
React.createElement(DialogContent, null,
|
|
13
13
|
React.createElement(Typography, null, "Adjust the feature height and whether there is any spacing between features. Setting feature height to 1 and removing spacing makes the display very compact."),
|
|
14
|
-
React.createElement(TextField, { value: height, helperText: "Feature height", onChange: event =>
|
|
15
|
-
|
|
14
|
+
React.createElement(TextField, { value: height, helperText: "Feature height", onChange: event => {
|
|
15
|
+
setHeight(event.target.value);
|
|
16
|
+
} }),
|
|
17
|
+
React.createElement(FormControlLabel, { control: React.createElement(Checkbox, { checked: !!noSpacing, onChange: () => {
|
|
18
|
+
setNoSpacing(val => !val);
|
|
19
|
+
} }), label: "Remove spacing between features in y-direction?" }),
|
|
16
20
|
React.createElement(DialogActions, null,
|
|
17
21
|
React.createElement(Button, { variant: "contained", color: "primary", type: "submit", autoFocus: true, disabled: !ok, onClick: () => {
|
|
18
22
|
model.setFeatureHeight(height !== '' && !Number.isNaN(+height) ? +height : undefined);
|
|
19
23
|
model.setNoSpacing(noSpacing);
|
|
20
24
|
handleClose();
|
|
21
25
|
} }, "Submit"),
|
|
22
|
-
React.createElement(Button, { variant: "contained", color: "secondary", onClick: () =>
|
|
26
|
+
React.createElement(Button, { variant: "contained", color: "secondary", onClick: () => {
|
|
27
|
+
handleClose();
|
|
28
|
+
} }, "Cancel")))));
|
|
23
29
|
});
|
|
24
30
|
export default SetFeatureHeightDialog;
|
|
@@ -13,15 +13,19 @@ const SetMaxHeightDialog = observer(function (props) {
|
|
|
13
13
|
const { classes } = useStyles();
|
|
14
14
|
const { maxHeight = '' } = model;
|
|
15
15
|
const [max, setMax] = useState(`${maxHeight}`);
|
|
16
|
-
return (React.createElement(Dialog, { open: true, onClose: handleClose, title: "
|
|
16
|
+
return (React.createElement(Dialog, { open: true, onClose: handleClose, title: "Set max height" },
|
|
17
17
|
React.createElement(DialogContent, { className: classes.root },
|
|
18
18
|
React.createElement(Typography, null, "Set max height for the track. For example, you can increase this if the layout says \"Max height reached\""),
|
|
19
|
-
React.createElement(TextField, { value: max,
|
|
19
|
+
React.createElement(TextField, { value: max, autoFocus: true, onChange: event => {
|
|
20
|
+
setMax(event.target.value);
|
|
21
|
+
}, placeholder: "Enter max height for layout" }),
|
|
20
22
|
React.createElement(DialogActions, null,
|
|
21
23
|
React.createElement(Button, { variant: "contained", color: "primary", type: "submit", autoFocus: true, onClick: () => {
|
|
22
24
|
model.setMaxHeight(max !== '' && !Number.isNaN(+max) ? +max : undefined);
|
|
23
25
|
handleClose();
|
|
24
26
|
} }, "Submit"),
|
|
25
|
-
React.createElement(Button, { variant: "contained", color: "secondary", onClick: () =>
|
|
27
|
+
React.createElement(Button, { variant: "contained", color: "secondary", onClick: () => {
|
|
28
|
+
handleClose();
|
|
29
|
+
} }, "Cancel")))));
|
|
26
30
|
});
|
|
27
31
|
export default SetMaxHeightDialog;
|
|
@@ -5,12 +5,14 @@ import { Dialog } from '@jbrowse/core/ui';
|
|
|
5
5
|
const SortByTagDialog = observer(function (props) {
|
|
6
6
|
const { model, handleClose } = props;
|
|
7
7
|
const [tag, setTag] = useState('');
|
|
8
|
-
const validTag =
|
|
8
|
+
const validTag = /^[A-Za-z][A-Za-z0-9]$/.exec(tag);
|
|
9
9
|
return (React.createElement(Dialog, { open: true, onClose: handleClose, title: "Sort by tag" },
|
|
10
10
|
React.createElement(DialogContent, null,
|
|
11
11
|
React.createElement(Typography, null, "Set the tag to sort by"),
|
|
12
12
|
React.createElement(Typography, { color: "textSecondary" }, "Examples: HP for haplotype, RG for read group, etc."),
|
|
13
|
-
React.createElement(TextField, { value: tag, onChange: event =>
|
|
13
|
+
React.createElement(TextField, { value: tag, onChange: event => {
|
|
14
|
+
setTag(event.target.value);
|
|
15
|
+
}, placeholder: "Enter tag name", inputProps: {
|
|
14
16
|
maxLength: 2,
|
|
15
17
|
'data-testid': 'sort-tag-name-input',
|
|
16
18
|
}, error: tag.length === 2 && !validTag, helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '', autoComplete: "off", "data-testid": "sort-tag-name" }),
|
|
@@ -19,6 +21,8 @@ const SortByTagDialog = observer(function (props) {
|
|
|
19
21
|
model.setSortedBy('tag', tag);
|
|
20
22
|
handleClose();
|
|
21
23
|
} }, "Submit"),
|
|
22
|
-
React.createElement(Button, { variant: "contained", color: "secondary", onClick: () =>
|
|
24
|
+
React.createElement(Button, { variant: "contained", color: "secondary", onClick: () => {
|
|
25
|
+
handleClose();
|
|
26
|
+
} }, "Cancel")))));
|
|
23
27
|
});
|
|
24
28
|
export default SortByTagDialog;
|
|
@@ -6,7 +6,6 @@ import { types } from 'mobx-state-tree';
|
|
|
6
6
|
*/
|
|
7
7
|
function x() { } // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
8
8
|
function configSchemaF(pluginManager) {
|
|
9
|
-
// modify config schema to take in a sub coverage display
|
|
10
9
|
return ConfigurationSchema('LinearPileupDisplay', {
|
|
11
10
|
/**
|
|
12
11
|
* #slot
|
|
@@ -116,7 +116,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
116
116
|
readName: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
|
|
117
117
|
tagFilter: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IModelType<{
|
|
118
118
|
tag: import("mobx-state-tree").ISimpleType<string>;
|
|
119
|
-
value: import("mobx-state-tree").ISimpleType<string
|
|
119
|
+
value: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
|
|
120
120
|
}, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
|
|
121
121
|
}, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>, [undefined]>;
|
|
122
122
|
jexlFilters: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").IArrayType<import("mobx-state-tree").ISimpleType<string>>, [undefined]>;
|
|
@@ -154,8 +154,10 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
154
154
|
rendererTypeName: string;
|
|
155
155
|
error: unknown;
|
|
156
156
|
message: string | undefined;
|
|
157
|
-
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree"
|
|
158
|
-
|
|
157
|
+
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree" /**
|
|
158
|
+
* #property
|
|
159
|
+
*/)._NotCustomized>>;
|
|
160
|
+
onHorizontalScroll?: () => void;
|
|
159
161
|
blockState?: Record<string, any>;
|
|
160
162
|
}>;
|
|
161
163
|
readonly DisplayBlurb: import("react").FC<{
|
|
@@ -175,9 +177,9 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
175
177
|
rendererTypeName: string;
|
|
176
178
|
error: unknown;
|
|
177
179
|
message: string | undefined;
|
|
178
|
-
}, import("mobx-state-tree"
|
|
180
|
+
}, import("mobx-state-tree" /**
|
|
179
181
|
* #action
|
|
180
|
-
*/)._NotCustomized>>;
|
|
182
|
+
*/)._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
|
|
181
183
|
}> | null;
|
|
182
184
|
readonly adapterConfig: any;
|
|
183
185
|
readonly parentTrack: any;
|
|
@@ -267,7 +269,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
267
269
|
readonly autorunReady: boolean;
|
|
268
270
|
} & {
|
|
269
271
|
setTagsReady(flag: boolean): void;
|
|
270
|
-
setMaxHeight(n
|
|
272
|
+
setMaxHeight(n?: number): void;
|
|
271
273
|
setFeatureHeight(n?: number): void;
|
|
272
274
|
setNoSpacing(flag?: boolean): void;
|
|
273
275
|
setColorScheme(colorScheme: {
|
|
@@ -292,9 +294,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
292
294
|
setSubschema(slotName: string, data: Record<string, unknown>): Record<string, unknown> | ({
|
|
293
295
|
[x: string]: any;
|
|
294
296
|
} & import("mobx-state-tree/dist/internal").NonEmptyObject & any & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>);
|
|
295
|
-
} & import("mobx-state-tree"
|
|
296
|
-
* #property
|
|
297
|
-
*/).IStateTreeNode<AnyConfigurationSchemaType>);
|
|
297
|
+
} & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>);
|
|
298
298
|
} & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>;
|
|
299
299
|
} & {
|
|
300
300
|
readonly maxHeight: any;
|
|
@@ -335,6 +335,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
335
335
|
icon: import("@mui/material/OverridableComponent").OverridableComponent<import("@mui/material").SvgIconTypeMap<{}, "svg">> & {
|
|
336
336
|
muiName: string;
|
|
337
337
|
};
|
|
338
|
+
priority: number;
|
|
338
339
|
onClick: () => void;
|
|
339
340
|
})[];
|
|
340
341
|
} & {
|
|
@@ -426,49 +427,60 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
426
427
|
/**
|
|
427
428
|
* #method
|
|
428
429
|
*/
|
|
429
|
-
trackMenuItems():
|
|
430
|
-
label:
|
|
431
|
-
icon: import("@mui/material/OverridableComponent").OverridableComponent<import("@mui/material").SvgIconTypeMap<{}, "svg">> & {
|
|
430
|
+
trackMenuItems(): readonly [...import("@jbrowse/core/ui").MenuItem[], {
|
|
431
|
+
readonly label: "Color by...";
|
|
432
|
+
readonly icon: import("@mui/material/OverridableComponent").OverridableComponent<import("@mui/material").SvgIconTypeMap<{}, "svg">> & {
|
|
432
433
|
muiName: string;
|
|
433
434
|
};
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
}
|
|
444
|
-
disabled: boolean;
|
|
445
|
-
subMenu: {
|
|
435
|
+
readonly subMenu: readonly [{
|
|
436
|
+
readonly label: "Pair orientation";
|
|
437
|
+
readonly onClick: () => void;
|
|
438
|
+
}, {
|
|
439
|
+
readonly label: "Modifications or methylation";
|
|
440
|
+
readonly onClick: () => void;
|
|
441
|
+
}, {
|
|
442
|
+
readonly label: "Insert size";
|
|
443
|
+
readonly onClick: () => void;
|
|
444
|
+
}, ...{
|
|
446
445
|
label: string;
|
|
447
446
|
onClick: () => void;
|
|
448
|
-
}[];
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
447
|
+
}[]];
|
|
448
|
+
}, {
|
|
449
|
+
readonly label: "Sort by...";
|
|
450
|
+
readonly icon: import("@mui/material/OverridableComponent").OverridableComponent<import("@mui/material").SvgIconTypeMap<{}, "svg">> & {
|
|
451
|
+
muiName: string;
|
|
452
|
+
};
|
|
453
|
+
readonly disabled: boolean;
|
|
454
|
+
readonly subMenu: readonly [...{
|
|
455
455
|
label: string;
|
|
456
456
|
onClick: () => void;
|
|
457
|
-
}[]
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
457
|
+
}[], {
|
|
458
|
+
readonly label: "Sort by tag...";
|
|
459
|
+
readonly onClick: () => void;
|
|
460
|
+
}, {
|
|
461
|
+
readonly label: "Clear sort";
|
|
462
|
+
readonly onClick: () => void;
|
|
463
|
+
}];
|
|
464
|
+
}, {
|
|
465
|
+
readonly label: "Group by...";
|
|
466
|
+
readonly icon: import("@mui/material/OverridableComponent").OverridableComponent<import("@mui/material").SvgIconTypeMap<{}, "svg">> & {
|
|
467
|
+
muiName: string;
|
|
468
|
+
};
|
|
469
|
+
readonly onClick: () => void;
|
|
470
|
+
}, {
|
|
471
|
+
readonly label: "Show soft clipping";
|
|
472
|
+
readonly icon: import("@mui/material/OverridableComponent").OverridableComponent<import("@mui/material").SvgIconTypeMap<{}, "svg">> & {
|
|
473
|
+
muiName: string;
|
|
474
|
+
};
|
|
475
|
+
readonly type: "checkbox";
|
|
476
|
+
readonly checked: boolean;
|
|
477
|
+
readonly onClick: () => void;
|
|
478
|
+
}, {
|
|
479
|
+
readonly label: "Fade mismatches by quality";
|
|
480
|
+
readonly type: "checkbox";
|
|
481
|
+
readonly checked: any;
|
|
482
|
+
readonly onClick: () => void;
|
|
483
|
+
}];
|
|
472
484
|
} & {
|
|
473
485
|
afterAttach(): void;
|
|
474
486
|
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
|
|
@@ -8,12 +8,15 @@ import { createAutorun, randomColor, modificationColors } from '../util';
|
|
|
8
8
|
// icons
|
|
9
9
|
import VisibilityIcon from '@mui/icons-material/Visibility';
|
|
10
10
|
import SortIcon from '@mui/icons-material/Sort';
|
|
11
|
+
import WorkspacesIcon from '@mui/icons-material/Workspaces';
|
|
12
|
+
import ColorLensIcon from '@mui/icons-material/ColorLens';
|
|
11
13
|
// locals
|
|
12
14
|
import { SharedLinearPileupDisplayMixin } from './SharedLinearPileupDisplayMixin';
|
|
13
15
|
import { observable } from 'mobx';
|
|
14
|
-
//
|
|
15
|
-
const SortByTagDialog = lazy(() => import('./components/
|
|
16
|
-
const
|
|
16
|
+
// lazies
|
|
17
|
+
const SortByTagDialog = lazy(() => import('./components/SortByTagDialog'));
|
|
18
|
+
const GroupByDialog = lazy(() => import('./components/GroupByDialog'));
|
|
19
|
+
const ModificationsDialog = lazy(() => import('./components/ColorByModificationsDialog'));
|
|
17
20
|
/**
|
|
18
21
|
* #stateModel LinearPileupDisplay
|
|
19
22
|
* #category display
|
|
@@ -220,27 +223,43 @@ function stateModelFactory(configSchema) {
|
|
|
220
223
|
return [
|
|
221
224
|
...superTrackMenuItems(),
|
|
222
225
|
{
|
|
223
|
-
label: '
|
|
224
|
-
icon:
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
226
|
+
label: 'Color by...',
|
|
227
|
+
icon: ColorLensIcon,
|
|
228
|
+
subMenu: [
|
|
229
|
+
{
|
|
230
|
+
label: 'Pair orientation',
|
|
231
|
+
onClick: () => {
|
|
232
|
+
self.setColorScheme({ type: 'pairOrientation' });
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
label: 'Modifications or methylation',
|
|
237
|
+
onClick: () => {
|
|
238
|
+
getSession(self).queueDialog(doneCallback => [
|
|
239
|
+
ModificationsDialog,
|
|
240
|
+
{ model: self, handleClose: doneCallback },
|
|
241
|
+
]);
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
label: 'Insert size',
|
|
246
|
+
onClick: () => {
|
|
247
|
+
self.setColorScheme({ type: 'insertSize' });
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
...superColorSchemeSubMenuItems(),
|
|
251
|
+
],
|
|
235
252
|
},
|
|
236
253
|
{
|
|
237
|
-
label: 'Sort by',
|
|
254
|
+
label: 'Sort by...',
|
|
238
255
|
icon: SortIcon,
|
|
239
256
|
disabled: self.showSoftClipping,
|
|
240
257
|
subMenu: [
|
|
241
258
|
...['Start location', 'Read strand', 'Base pair'].map(option => ({
|
|
242
259
|
label: option,
|
|
243
|
-
onClick: () =>
|
|
260
|
+
onClick: () => {
|
|
261
|
+
self.setSortedBy(option);
|
|
262
|
+
},
|
|
244
263
|
})),
|
|
245
264
|
{
|
|
246
265
|
label: 'Sort by tag...',
|
|
@@ -253,38 +272,43 @@ function stateModelFactory(configSchema) {
|
|
|
253
272
|
},
|
|
254
273
|
{
|
|
255
274
|
label: 'Clear sort',
|
|
256
|
-
onClick: () => self.clearSelected(),
|
|
257
|
-
},
|
|
258
|
-
],
|
|
259
|
-
},
|
|
260
|
-
{
|
|
261
|
-
label: 'Color scheme',
|
|
262
|
-
subMenu: [
|
|
263
|
-
{
|
|
264
|
-
label: 'Pair orientation',
|
|
265
|
-
onClick: () => self.setColorScheme({ type: 'pairOrientation' }),
|
|
266
|
-
},
|
|
267
|
-
{
|
|
268
|
-
label: 'Modifications or methylation',
|
|
269
275
|
onClick: () => {
|
|
270
|
-
|
|
271
|
-
ModificationsDialog,
|
|
272
|
-
{ model: self, handleClose: doneCallback },
|
|
273
|
-
]);
|
|
276
|
+
self.clearSelected();
|
|
274
277
|
},
|
|
275
278
|
},
|
|
276
|
-
{
|
|
277
|
-
label: 'Insert size',
|
|
278
|
-
onClick: () => self.setColorScheme({ type: 'insertSize' }),
|
|
279
|
-
},
|
|
280
|
-
...superColorSchemeSubMenuItems(),
|
|
281
279
|
],
|
|
282
280
|
},
|
|
281
|
+
{
|
|
282
|
+
label: 'Group by...',
|
|
283
|
+
icon: WorkspacesIcon,
|
|
284
|
+
onClick: () => {
|
|
285
|
+
getSession(self).queueDialog(handleClose => [
|
|
286
|
+
GroupByDialog,
|
|
287
|
+
{ model: self, handleClose },
|
|
288
|
+
]);
|
|
289
|
+
},
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
label: 'Show soft clipping',
|
|
293
|
+
icon: VisibilityIcon,
|
|
294
|
+
type: 'checkbox',
|
|
295
|
+
checked: self.showSoftClipping,
|
|
296
|
+
onClick: () => {
|
|
297
|
+
self.toggleSoftClipping();
|
|
298
|
+
// if toggling from off to on, will break sort for this track
|
|
299
|
+
// so clear it
|
|
300
|
+
if (self.showSoftClipping) {
|
|
301
|
+
self.clearSelected();
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
},
|
|
283
305
|
{
|
|
284
306
|
label: 'Fade mismatches by quality',
|
|
285
307
|
type: 'checkbox',
|
|
286
308
|
checked: self.mismatchAlphaSetting,
|
|
287
|
-
onClick: () =>
|
|
309
|
+
onClick: () => {
|
|
310
|
+
self.toggleMismatchAlpha();
|
|
311
|
+
},
|
|
288
312
|
},
|
|
289
313
|
];
|
|
290
314
|
},
|
|
@@ -342,7 +366,11 @@ function stateModelFactory(configSchema) {
|
|
|
342
366
|
const { staticBlocks } = getContainingView(self);
|
|
343
367
|
if ((colorBy === null || colorBy === void 0 ? void 0 : colorBy.type) === 'modifications') {
|
|
344
368
|
const adapter = getConf(parentTrack, ['adapter']);
|
|
345
|
-
const vals = await getUniqueModificationValues(
|
|
369
|
+
const vals = await getUniqueModificationValues({
|
|
370
|
+
self,
|
|
371
|
+
adapterConfig: adapter,
|
|
372
|
+
blocks: staticBlocks,
|
|
373
|
+
});
|
|
346
374
|
self.updateModificationColorMap(vals);
|
|
347
375
|
}
|
|
348
376
|
self.setModificationsReady(true);
|
|
@@ -6,6 +6,7 @@ const Arcs = observer(function ({ model, }) {
|
|
|
6
6
|
const view = getContainingView(model);
|
|
7
7
|
const width = Math.round(view.dynamicBlocks.totalWidthPx);
|
|
8
8
|
const height = model.height;
|
|
9
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies:
|
|
9
10
|
const cb = useCallback((ref) => {
|
|
10
11
|
model.setRef(ref);
|
|
11
12
|
},
|
|
@@ -30,7 +30,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
30
30
|
readName: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
|
|
31
31
|
tagFilter: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IModelType<{
|
|
32
32
|
tag: import("mobx-state-tree").ISimpleType<string>;
|
|
33
|
-
value: import("mobx-state-tree").ISimpleType<string
|
|
33
|
+
value: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
|
|
34
34
|
}, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
|
|
35
35
|
}, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>, [undefined]>;
|
|
36
36
|
lineWidth: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<number>>;
|
|
@@ -65,7 +65,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
65
65
|
error: unknown;
|
|
66
66
|
message: string | undefined;
|
|
67
67
|
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
|
|
68
|
-
onHorizontalScroll?:
|
|
68
|
+
onHorizontalScroll?: () => void;
|
|
69
69
|
blockState?: Record<string, any>;
|
|
70
70
|
}>;
|
|
71
71
|
readonly DisplayBlurb: React.FC<{
|