@jbrowse/plugin-variants 1.6.7 → 1.7.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/ChordVariantDisplay/index.js +33 -0
- package/dist/ChordVariantDisplay/models/ChordVariantDisplay.js +76 -0
- package/dist/LinearVariantDisplay/configSchema.js +18 -0
- package/dist/LinearVariantDisplay/configSchema.test.js +92 -0
- package/dist/LinearVariantDisplay/index.js +23 -0
- package/dist/LinearVariantDisplay/model.d.ts +1 -1
- package/dist/LinearVariantDisplay/model.js +75 -0
- package/dist/StructuralVariantChordRenderer/ReactComponent.js +228 -0
- package/dist/StructuralVariantChordRenderer/index.js +48 -0
- package/dist/VariantFeatureWidget/BreakendOptionDialog.js +127 -0
- package/dist/VariantFeatureWidget/VariantFeatureWidget.js +251 -0
- package/dist/VariantFeatureWidget/VariantFeatureWidget.test.js +56 -0
- package/dist/VariantFeatureWidget/index.js +35 -0
- package/dist/VcfAdapter/VcfAdapter.js +383 -0
- package/dist/VcfAdapter/VcfAdapter.test.js +55 -0
- package/dist/VcfAdapter/configSchema.js +22 -0
- package/dist/VcfAdapter/index.js +15 -0
- package/dist/VcfTabixAdapter/VcfFeature.js +261 -0
- package/dist/VcfTabixAdapter/VcfFeature.test.js +106 -0
- package/dist/VcfTabixAdapter/VcfTabixAdapter.js +392 -0
- package/dist/VcfTabixAdapter/VcfTabixAdapter.test.js +99 -0
- package/dist/VcfTabixAdapter/configSchema.js +38 -0
- package/dist/VcfTabixAdapter/index.js +15 -0
- package/dist/index.js +214 -6
- package/dist/index.test.js +37 -0
- package/package.json +3 -6
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
exports["default"] = void 0;
|
|
11
|
+
|
|
12
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
+
|
|
14
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
15
|
+
|
|
16
|
+
var _mobxReact = require("mobx-react");
|
|
17
|
+
|
|
18
|
+
var _core = require("@material-ui/core");
|
|
19
|
+
|
|
20
|
+
var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
|
|
21
|
+
|
|
22
|
+
var _mobxStateTree = require("mobx-state-tree");
|
|
23
|
+
|
|
24
|
+
var _util = require("@jbrowse/core/util");
|
|
25
|
+
|
|
26
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
27
|
+
|
|
28
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
29
|
+
|
|
30
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
31
|
+
var useStyles = (0, _core.makeStyles)(function (theme) {
|
|
32
|
+
return {
|
|
33
|
+
closeButton: {
|
|
34
|
+
position: 'absolute',
|
|
35
|
+
right: theme.spacing(1),
|
|
36
|
+
top: theme.spacing(1),
|
|
37
|
+
color: theme.palette.grey[500]
|
|
38
|
+
},
|
|
39
|
+
block: {
|
|
40
|
+
display: 'block'
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
function BreakendOptionDialog(_ref) {
|
|
46
|
+
var model = _ref.model,
|
|
47
|
+
handleClose = _ref.handleClose,
|
|
48
|
+
feature = _ref.feature,
|
|
49
|
+
viewType = _ref.viewType;
|
|
50
|
+
var classes = useStyles();
|
|
51
|
+
|
|
52
|
+
var _useState = (0, _react.useState)(true),
|
|
53
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
54
|
+
copyTracks = _useState2[0],
|
|
55
|
+
setCopyTracks = _useState2[1];
|
|
56
|
+
|
|
57
|
+
var _useState3 = (0, _react.useState)(true),
|
|
58
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
59
|
+
mirrorTracks = _useState4[0],
|
|
60
|
+
setMirrorTracks = _useState4[1];
|
|
61
|
+
|
|
62
|
+
return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
|
|
63
|
+
open: true,
|
|
64
|
+
onClose: handleClose
|
|
65
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, null, "Breakpoint split view options", handleClose ? /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
66
|
+
className: classes.closeButton,
|
|
67
|
+
onClick: function onClick() {
|
|
68
|
+
return handleClose();
|
|
69
|
+
}
|
|
70
|
+
}, /*#__PURE__*/_react["default"].createElement(_Close["default"], null)) : null), /*#__PURE__*/_react["default"].createElement(_core.Divider, null), /*#__PURE__*/_react["default"].createElement(_core.DialogContent, null, /*#__PURE__*/_react["default"].createElement(_core.FormControlLabel, {
|
|
71
|
+
className: classes.block,
|
|
72
|
+
control: /*#__PURE__*/_react["default"].createElement(_core.Checkbox, {
|
|
73
|
+
checked: copyTracks,
|
|
74
|
+
onChange: function onChange() {
|
|
75
|
+
return setCopyTracks(function (val) {
|
|
76
|
+
return !val;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}),
|
|
80
|
+
label: "Copy tracks into the new view"
|
|
81
|
+
}), /*#__PURE__*/_react["default"].createElement(_core.FormControlLabel, {
|
|
82
|
+
className: classes.block,
|
|
83
|
+
control: /*#__PURE__*/_react["default"].createElement(_core.Checkbox, {
|
|
84
|
+
checked: mirrorTracks,
|
|
85
|
+
onChange: function onChange() {
|
|
86
|
+
return setMirrorTracks(function (val) {
|
|
87
|
+
return !val;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}),
|
|
91
|
+
label: "Mirror tracks vertically in vertically stacked view"
|
|
92
|
+
})), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
93
|
+
onClick: function onClick() {
|
|
94
|
+
var view = model.view;
|
|
95
|
+
var session = (0, _util.getSession)(model);
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
var viewSnapshot = viewType.snapshotFromBreakendFeature(feature, view);
|
|
99
|
+
viewSnapshot.views[0].offsetPx -= view.width / 2 + 100;
|
|
100
|
+
viewSnapshot.views[1].offsetPx -= view.width / 2 + 100;
|
|
101
|
+
viewSnapshot.featureData = feature;
|
|
102
|
+
var viewTracks = (0, _mobxStateTree.getSnapshot)(view.tracks);
|
|
103
|
+
viewSnapshot.views[0].tracks = viewTracks;
|
|
104
|
+
viewSnapshot.views[1].tracks = mirrorTracks ? viewTracks.slice().reverse() : viewTracks;
|
|
105
|
+
session.addView('BreakpointSplitView', viewSnapshot);
|
|
106
|
+
} catch (e) {
|
|
107
|
+
console.error(e);
|
|
108
|
+
session.notify("".concat(e));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
handleClose();
|
|
112
|
+
},
|
|
113
|
+
variant: "contained",
|
|
114
|
+
color: "primary",
|
|
115
|
+
autoFocus: true
|
|
116
|
+
}, "OK"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
117
|
+
onClick: function onClick() {
|
|
118
|
+
return handleClose();
|
|
119
|
+
},
|
|
120
|
+
color: "secondary",
|
|
121
|
+
variant: "contained"
|
|
122
|
+
}, "Cancel")));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
var _default = (0, _mobxReact.observer)(BreakendOptionDialog);
|
|
126
|
+
|
|
127
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
exports["default"] = void 0;
|
|
11
|
+
|
|
12
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
13
|
+
|
|
14
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
15
|
+
|
|
16
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
+
|
|
18
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
19
|
+
|
|
20
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
21
|
+
|
|
22
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
23
|
+
|
|
24
|
+
var _core = require("@material-ui/core");
|
|
25
|
+
|
|
26
|
+
var _simpleFeature = _interopRequireDefault(require("@jbrowse/core/util/simpleFeature"));
|
|
27
|
+
|
|
28
|
+
var _xDataGrid = require("@mui/x-data-grid");
|
|
29
|
+
|
|
30
|
+
var _mobxReact = require("mobx-react");
|
|
31
|
+
|
|
32
|
+
var _util = require("@jbrowse/core/util");
|
|
33
|
+
|
|
34
|
+
var _mobxStateTree = require("mobx-state-tree");
|
|
35
|
+
|
|
36
|
+
var _BaseFeatureDetail = require("@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail");
|
|
37
|
+
|
|
38
|
+
var _BreakendOptionDialog = _interopRequireDefault(require("./BreakendOptionDialog"));
|
|
39
|
+
|
|
40
|
+
var _vcf = require("@gmod/vcf");
|
|
41
|
+
|
|
42
|
+
var _excluded = ["samples"];
|
|
43
|
+
|
|
44
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
45
|
+
|
|
46
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
47
|
+
|
|
48
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
49
|
+
|
|
50
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
51
|
+
|
|
52
|
+
function VariantSamples(props) {
|
|
53
|
+
var _useState = (0, _react.useState)({}),
|
|
54
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
55
|
+
filter = _useState2[0],
|
|
56
|
+
setFilter = _useState2[1];
|
|
57
|
+
|
|
58
|
+
var _useState3 = (0, _react.useState)(false),
|
|
59
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
60
|
+
showFilters = _useState4[0],
|
|
61
|
+
setShowFilters = _useState4[1];
|
|
62
|
+
|
|
63
|
+
var feature = props.feature;
|
|
64
|
+
var _feature$samples = feature.samples,
|
|
65
|
+
samples = _feature$samples === void 0 ? {} : _feature$samples;
|
|
66
|
+
var preFilteredRows = Object.entries(samples);
|
|
67
|
+
|
|
68
|
+
if (!preFilteredRows.length) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
var infoFields = ['sample'].concat((0, _toConsumableArray2["default"])(Object.keys(preFilteredRows[0][1]))).map(function (field) {
|
|
73
|
+
return {
|
|
74
|
+
field: field
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
var error;
|
|
78
|
+
var rows = [];
|
|
79
|
+
var filters = Object.keys(filter); // catch some error thrown from regex
|
|
80
|
+
// note: maps all values into a string, if this is not done rows are not
|
|
81
|
+
// sortable by the data-grid
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
rows = preFilteredRows.map(function (row) {
|
|
85
|
+
return _objectSpread(_objectSpread({}, Object.fromEntries(Object.entries(row[1]).map(function (entry) {
|
|
86
|
+
return [entry[0], String(entry[1])];
|
|
87
|
+
}))), {}, {
|
|
88
|
+
sample: row[0],
|
|
89
|
+
id: row[0]
|
|
90
|
+
});
|
|
91
|
+
}).filter(function (row) {
|
|
92
|
+
return filters.length ? filters.every(function (key) {
|
|
93
|
+
var val = row[key];
|
|
94
|
+
var currFilter = filter[key];
|
|
95
|
+
return currFilter ? val.match(new RegExp(currFilter, 'i')) : true;
|
|
96
|
+
}) : true;
|
|
97
|
+
});
|
|
98
|
+
} catch (e) {
|
|
99
|
+
error = e;
|
|
100
|
+
} // disableSelectionOnClick helps avoid
|
|
101
|
+
// https://github.com/mui-org/material-ui-x/issues/1197
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
return /*#__PURE__*/_react["default"].createElement(_BaseFeatureDetail.BaseCard, (0, _extends2["default"])({}, props, {
|
|
105
|
+
title: "Samples"
|
|
106
|
+
}), error ? /*#__PURE__*/_react["default"].createElement(_core.Typography, {
|
|
107
|
+
color: "error"
|
|
108
|
+
}, "".concat(error)) : null, /*#__PURE__*/_react["default"].createElement(_core.FormControlLabel, {
|
|
109
|
+
control: /*#__PURE__*/_react["default"].createElement(_core.Checkbox, {
|
|
110
|
+
checked: showFilters,
|
|
111
|
+
onChange: function onChange() {
|
|
112
|
+
return setShowFilters(function (f) {
|
|
113
|
+
return !f;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}),
|
|
117
|
+
label: "Show sample filters"
|
|
118
|
+
}), showFilters ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "These filters can use a plain text search or regex style query, e.g. in the genotype field, entering 1 will query for all genotypes that include the first alternate allele e.g. 0|1 or 1|1, entering [1-9]\\d* will find any non-zero allele e.g. 0|2 or 2/33"), infoFields.map(function (_ref) {
|
|
119
|
+
var field = _ref.field;
|
|
120
|
+
return /*#__PURE__*/_react["default"].createElement(_core.TextField, {
|
|
121
|
+
key: "filter-".concat(field),
|
|
122
|
+
placeholder: "Filter ".concat(field),
|
|
123
|
+
value: filter[field] || '',
|
|
124
|
+
onChange: function onChange(event) {
|
|
125
|
+
return setFilter(_objectSpread(_objectSpread({}, filter), {}, (0, _defineProperty2["default"])({}, field, event.target.value)));
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
})) : null, /*#__PURE__*/_react["default"].createElement("div", {
|
|
129
|
+
style: {
|
|
130
|
+
height: 600,
|
|
131
|
+
width: '100%',
|
|
132
|
+
overflow: 'auto'
|
|
133
|
+
}
|
|
134
|
+
}, /*#__PURE__*/_react["default"].createElement(_xDataGrid.DataGrid, {
|
|
135
|
+
rows: rows,
|
|
136
|
+
columns: infoFields,
|
|
137
|
+
rowHeight: 20,
|
|
138
|
+
headerHeight: 25,
|
|
139
|
+
disableSelectionOnClick: true,
|
|
140
|
+
disableColumnMenu: true
|
|
141
|
+
})));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function BreakendPanel(props) {
|
|
145
|
+
var model = props.model,
|
|
146
|
+
locStrings = props.locStrings,
|
|
147
|
+
feature = props.feature;
|
|
148
|
+
var session = (0, _util.getSession)(model);
|
|
149
|
+
|
|
150
|
+
var _getEnv = (0, _mobxStateTree.getEnv)(session),
|
|
151
|
+
pluginManager = _getEnv.pluginManager;
|
|
152
|
+
|
|
153
|
+
var _useState5 = (0, _react.useState)(false),
|
|
154
|
+
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
|
155
|
+
breakpointDialog = _useState6[0],
|
|
156
|
+
setBreakpointDialog = _useState6[1];
|
|
157
|
+
|
|
158
|
+
var viewType;
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
viewType = pluginManager.getViewType('BreakpointSplitView');
|
|
162
|
+
} catch (e) {// ignore
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
var simpleFeature = new _simpleFeature["default"](feature);
|
|
166
|
+
return /*#__PURE__*/_react["default"].createElement(_BaseFeatureDetail.BaseCard, (0, _extends2["default"])({}, props, {
|
|
167
|
+
title: "Breakends"
|
|
168
|
+
}), /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Link to linear view of breakend endpoints"), /*#__PURE__*/_react["default"].createElement("ul", null, locStrings.map(function (locString) {
|
|
169
|
+
return /*#__PURE__*/_react["default"].createElement("li", {
|
|
170
|
+
key: "".concat(JSON.stringify(locString))
|
|
171
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Link, {
|
|
172
|
+
href: "#",
|
|
173
|
+
onClick: function onClick(event) {
|
|
174
|
+
event.preventDefault();
|
|
175
|
+
var view = model.view;
|
|
176
|
+
|
|
177
|
+
try {
|
|
178
|
+
if (view) {
|
|
179
|
+
var _view$navToLocString;
|
|
180
|
+
|
|
181
|
+
(_view$navToLocString = view.navToLocString) === null || _view$navToLocString === void 0 ? void 0 : _view$navToLocString.call(view, locString);
|
|
182
|
+
} else {
|
|
183
|
+
throw new Error('No view associated with this feature detail panel anymore');
|
|
184
|
+
}
|
|
185
|
+
} catch (e) {
|
|
186
|
+
console.error(e);
|
|
187
|
+
session.notify("".concat(e));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}, "LGV - ".concat(locString)));
|
|
191
|
+
})), viewType ? /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Launch split views with breakend source and target"), /*#__PURE__*/_react["default"].createElement("ul", null, locStrings.map(function (locString) {
|
|
192
|
+
return /*#__PURE__*/_react["default"].createElement("li", {
|
|
193
|
+
key: "".concat(JSON.stringify(locString))
|
|
194
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Link, {
|
|
195
|
+
href: "#",
|
|
196
|
+
onClick: function onClick(event) {
|
|
197
|
+
event.preventDefault();
|
|
198
|
+
setBreakpointDialog(true);
|
|
199
|
+
}
|
|
200
|
+
}, "".concat(feature.refName, ":").concat(feature.start, " // ").concat(locString, " (split view)")));
|
|
201
|
+
})), breakpointDialog ? /*#__PURE__*/_react["default"].createElement(_BreakendOptionDialog["default"], {
|
|
202
|
+
model: model,
|
|
203
|
+
feature: simpleFeature,
|
|
204
|
+
viewType: viewType,
|
|
205
|
+
handleClose: function handleClose() {
|
|
206
|
+
setBreakpointDialog(false);
|
|
207
|
+
}
|
|
208
|
+
}) : null) : null);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function VariantFeatureDetails(props) {
|
|
212
|
+
var model = props.model;
|
|
213
|
+
var featureData = model.featureData,
|
|
214
|
+
descriptions = model.descriptions;
|
|
215
|
+
var feat = JSON.parse(JSON.stringify(featureData));
|
|
216
|
+
var samples = feat.samples,
|
|
217
|
+
rest = (0, _objectWithoutProperties2["default"])(feat, _excluded);
|
|
218
|
+
var basicDescriptions = {
|
|
219
|
+
CHROM: 'chromosome: An identifier from the reference genome',
|
|
220
|
+
POS: 'position: The reference position, with the 1st base having position 1',
|
|
221
|
+
ID: 'identifier: Semi-colon separated list of unique identifiers where available',
|
|
222
|
+
REF: 'reference base(s): Each base must be one of A,C,G,T,N (case insensitive).',
|
|
223
|
+
ALT: 'alternate base(s): Comma-separated list of alternate non-reference alleles',
|
|
224
|
+
QUAL: 'quality: Phred-scaled quality score for the assertion made in ALT',
|
|
225
|
+
FILTER: 'filter status: PASS if this position has passed all filters, otherwise a semicolon-separated list of codes for filters that fail'
|
|
226
|
+
};
|
|
227
|
+
return /*#__PURE__*/_react["default"].createElement(_core.Paper, {
|
|
228
|
+
"data-testid": "variant-side-drawer"
|
|
229
|
+
}, /*#__PURE__*/_react["default"].createElement(_BaseFeatureDetail.FeatureDetails, (0, _extends2["default"])({
|
|
230
|
+
feature: rest,
|
|
231
|
+
descriptions: _objectSpread(_objectSpread({}, basicDescriptions), descriptions)
|
|
232
|
+
}, props)), /*#__PURE__*/_react["default"].createElement(_core.Divider, null), feat.type === 'breakend' ? /*#__PURE__*/_react["default"].createElement(BreakendPanel, {
|
|
233
|
+
feature: feat,
|
|
234
|
+
locStrings: feat.ALT.map(function (alt) {
|
|
235
|
+
var _parseBreakend;
|
|
236
|
+
|
|
237
|
+
return ((_parseBreakend = (0, _vcf.parseBreakend)(alt)) === null || _parseBreakend === void 0 ? void 0 : _parseBreakend.MatePosition) || '';
|
|
238
|
+
}),
|
|
239
|
+
model: model
|
|
240
|
+
}) : null, feat.type === 'translocation' ? /*#__PURE__*/_react["default"].createElement(BreakendPanel, {
|
|
241
|
+
feature: feat,
|
|
242
|
+
model: model,
|
|
243
|
+
locStrings: ["".concat(feat.INFO.CHR2[0], ":").concat(feat.INFO.END)]
|
|
244
|
+
}) : null, /*#__PURE__*/_react["default"].createElement(VariantSamples, (0, _extends2["default"])({
|
|
245
|
+
feature: feat
|
|
246
|
+
}, props)));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
var _default = (0, _mobxReact.observer)(VariantFeatureDetails);
|
|
250
|
+
|
|
251
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _react = _interopRequireDefault(require("react"));
|
|
6
|
+
|
|
7
|
+
var _react2 = require("@testing-library/react");
|
|
8
|
+
|
|
9
|
+
var _mobxStateTree = require("mobx-state-tree");
|
|
10
|
+
|
|
11
|
+
var _configuration = require("@jbrowse/core/configuration");
|
|
12
|
+
|
|
13
|
+
var _PluginManager = _interopRequireDefault(require("@jbrowse/core/PluginManager"));
|
|
14
|
+
|
|
15
|
+
var _ = require(".");
|
|
16
|
+
|
|
17
|
+
var _VariantFeatureWidget = _interopRequireDefault(require("./VariantFeatureWidget"));
|
|
18
|
+
|
|
19
|
+
describe('VariantTrack widget', function () {
|
|
20
|
+
it('renders with just the required model elements', function () {
|
|
21
|
+
console.warn = jest.fn();
|
|
22
|
+
var pluginManager = new _PluginManager["default"]([]);
|
|
23
|
+
|
|
24
|
+
var Session = _mobxStateTree.types.model({
|
|
25
|
+
rpcManager: _mobxStateTree.types.optional(_mobxStateTree.types.frozen(), {}),
|
|
26
|
+
pluginManager: _mobxStateTree.types.optional(_mobxStateTree.types.frozen(), {}),
|
|
27
|
+
configuration: (0, _configuration.ConfigurationSchema)('test', {}),
|
|
28
|
+
widget: (0, _.stateModelFactory)(pluginManager)
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
var model = Session.create({
|
|
32
|
+
widget: {
|
|
33
|
+
type: 'VariantFeatureWidget'
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
model.widget.setFeatureData({
|
|
37
|
+
refName: 'ctgA',
|
|
38
|
+
start: 176,
|
|
39
|
+
end: 177,
|
|
40
|
+
name: 'rs123',
|
|
41
|
+
REF: 'A',
|
|
42
|
+
ALT: ['<TRA>'],
|
|
43
|
+
QUAL: 10.4,
|
|
44
|
+
INFO: {
|
|
45
|
+
MQ: 5
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
var _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_VariantFeatureWidget["default"], {
|
|
50
|
+
model: model.widget
|
|
51
|
+
})),
|
|
52
|
+
container = _render.container;
|
|
53
|
+
|
|
54
|
+
expect(container.firstChild).toMatchSnapshot();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.configSchema = void 0;
|
|
7
|
+
exports.stateModelFactory = stateModelFactory;
|
|
8
|
+
|
|
9
|
+
var _configuration = require("@jbrowse/core/configuration");
|
|
10
|
+
|
|
11
|
+
var _mst = require("@jbrowse/core/util/types/mst");
|
|
12
|
+
|
|
13
|
+
var _mobxStateTree = require("mobx-state-tree");
|
|
14
|
+
|
|
15
|
+
var configSchema = (0, _configuration.ConfigurationSchema)('VariantFeatureWidget', {});
|
|
16
|
+
exports.configSchema = configSchema;
|
|
17
|
+
|
|
18
|
+
function stateModelFactory(pluginManager) {
|
|
19
|
+
return _mobxStateTree.types.model('VariantFeatureWidget', {
|
|
20
|
+
id: _mst.ElementId,
|
|
21
|
+
type: _mobxStateTree.types.literal('VariantFeatureWidget'),
|
|
22
|
+
view: _mobxStateTree.types.safeReference(pluginManager.pluggableMstType('view', 'stateModel')),
|
|
23
|
+
featureData: _mobxStateTree.types.frozen(),
|
|
24
|
+
descriptions: _mobxStateTree.types.frozen()
|
|
25
|
+
}).actions(function (self) {
|
|
26
|
+
return {
|
|
27
|
+
setFeatureData: function setFeatureData(data) {
|
|
28
|
+
self.featureData = data;
|
|
29
|
+
},
|
|
30
|
+
clearFeatureData: function clearFeatureData() {
|
|
31
|
+
self.featureData = undefined;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
}
|