@jbrowse/plugin-alignments 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.
Files changed (94) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +216 -0
  2. package/dist/AlignmentsFeatureDetail/index.js +63 -0
  3. package/dist/AlignmentsFeatureDetail/index.test.js +60 -0
  4. package/dist/AlignmentsTrack/index.js +37 -0
  5. package/dist/BamAdapter/BamAdapter.js +598 -0
  6. package/dist/BamAdapter/BamAdapter.test.js +177 -0
  7. package/dist/BamAdapter/BamSlightlyLazyFeature.d.ts +1 -10
  8. package/dist/BamAdapter/BamSlightlyLazyFeature.js +176 -0
  9. package/dist/BamAdapter/MismatchParser.d.ts +3 -5
  10. package/dist/BamAdapter/MismatchParser.js +384 -0
  11. package/dist/BamAdapter/MismatchParser.test.js +259 -0
  12. package/dist/BamAdapter/configSchema.js +48 -0
  13. package/dist/BamAdapter/index.js +36 -0
  14. package/dist/CramAdapter/CramAdapter.js +660 -0
  15. package/dist/CramAdapter/CramAdapter.test.js +138 -0
  16. package/dist/CramAdapter/CramSlightlyLazyFeature.d.ts +1 -2
  17. package/dist/CramAdapter/CramSlightlyLazyFeature.js +447 -0
  18. package/dist/CramAdapter/CramTestAdapters.js +234 -0
  19. package/dist/CramAdapter/configSchema.js +40 -0
  20. package/dist/CramAdapter/index.js +36 -0
  21. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js +97 -0
  22. package/dist/HtsgetBamAdapter/configSchema.js +31 -0
  23. package/dist/HtsgetBamAdapter/index.js +42 -0
  24. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +69 -0
  25. package/dist/LinearAlignmentsDisplay/index.js +31 -0
  26. package/dist/LinearAlignmentsDisplay/models/configSchema.js +25 -0
  27. package/dist/LinearAlignmentsDisplay/models/configSchema.test.js +83 -0
  28. package/dist/LinearAlignmentsDisplay/models/model.js +250 -0
  29. package/dist/LinearPileupDisplay/components/ColorByModifications.js +123 -0
  30. package/dist/LinearPileupDisplay/components/ColorByTag.js +98 -0
  31. package/dist/LinearPileupDisplay/components/FilterByTag.js +203 -0
  32. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +32 -0
  33. package/dist/LinearPileupDisplay/components/SetFeatureHeight.js +99 -0
  34. package/dist/LinearPileupDisplay/components/SetMaxHeight.js +90 -0
  35. package/dist/LinearPileupDisplay/components/SortByTag.js +95 -0
  36. package/dist/LinearPileupDisplay/configSchema.js +47 -0
  37. package/dist/LinearPileupDisplay/configSchema.test.js +92 -0
  38. package/dist/LinearPileupDisplay/index.js +30 -0
  39. package/dist/LinearPileupDisplay/model.js +602 -0
  40. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +63 -0
  41. package/dist/LinearSNPCoverageDisplay/index.js +30 -0
  42. package/dist/LinearSNPCoverageDisplay/models/configSchema.js +57 -0
  43. package/dist/LinearSNPCoverageDisplay/models/configSchema.test.js +62 -0
  44. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +2 -2
  45. package/dist/LinearSNPCoverageDisplay/models/model.js +237 -0
  46. package/dist/NestedFrequencyTable.js +152 -0
  47. package/dist/PileupRPC/rpcMethods.js +285 -0
  48. package/dist/PileupRenderer/PileupLayoutSession.js +79 -0
  49. package/dist/PileupRenderer/PileupRenderer.d.ts +20 -6
  50. package/dist/PileupRenderer/PileupRenderer.js +1220 -0
  51. package/dist/PileupRenderer/components/PileupRendering.js +270 -0
  52. package/dist/PileupRenderer/components/PileupRendering.test.js +36 -0
  53. package/dist/PileupRenderer/configSchema.js +72 -0
  54. package/dist/PileupRenderer/index.js +25 -0
  55. package/dist/PileupRenderer/sortUtil.js +112 -0
  56. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +3 -11
  57. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +606 -0
  58. package/dist/SNPCoverageAdapter/configSchema.js +22 -0
  59. package/dist/SNPCoverageAdapter/index.js +45 -0
  60. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +296 -0
  61. package/dist/SNPCoverageRenderer/configSchema.js +40 -0
  62. package/dist/SNPCoverageRenderer/index.js +34 -0
  63. package/dist/declare.d.js +1 -0
  64. package/dist/index.js +154 -6
  65. package/dist/index.test.js +26 -0
  66. package/dist/plugin-alignments.cjs.development.js +591 -552
  67. package/dist/plugin-alignments.cjs.development.js.map +1 -1
  68. package/dist/plugin-alignments.cjs.production.min.js +1 -1
  69. package/dist/plugin-alignments.cjs.production.min.js.map +1 -1
  70. package/dist/plugin-alignments.esm.js +594 -555
  71. package/dist/plugin-alignments.esm.js.map +1 -1
  72. package/dist/shared.js +96 -0
  73. package/dist/util.d.ts +4 -0
  74. package/dist/util.js +135 -0
  75. package/package.json +5 -9
  76. package/src/BamAdapter/BamAdapter.ts +45 -15
  77. package/src/BamAdapter/BamSlightlyLazyFeature.ts +11 -79
  78. package/src/BamAdapter/MismatchParser.test.ts +53 -297
  79. package/src/BamAdapter/MismatchParser.ts +54 -116
  80. package/src/BamAdapter/configSchema.ts +0 -4
  81. package/src/CramAdapter/CramAdapter.ts +42 -15
  82. package/src/CramAdapter/CramSlightlyLazyFeature.ts +3 -10
  83. package/src/LinearPileupDisplay/components/ColorByModifications.tsx +76 -80
  84. package/src/LinearPileupDisplay/components/ColorByTag.tsx +24 -23
  85. package/src/LinearPileupDisplay/components/FilterByTag.tsx +73 -68
  86. package/src/LinearPileupDisplay/components/SetFeatureHeight.tsx +28 -26
  87. package/src/LinearPileupDisplay/components/SetMaxHeight.tsx +24 -13
  88. package/src/LinearPileupDisplay/components/SortByTag.tsx +29 -21
  89. package/src/LinearPileupDisplay/model.ts +8 -22
  90. package/src/LinearSNPCoverageDisplay/models/model.ts +6 -36
  91. package/src/PileupRenderer/PileupRenderer.tsx +178 -60
  92. package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +189 -244
  93. package/src/SNPCoverageRenderer/SNPCoverageRenderer.ts +12 -11
  94. package/src/util.ts +25 -0
@@ -0,0 +1,203 @@
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
+ 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); }
23
+
24
+ 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; }
25
+
26
+ var useStyles = (0, _core.makeStyles)(function (theme) {
27
+ return {
28
+ paper: {
29
+ padding: theme.spacing(2),
30
+ margin: theme.spacing(2)
31
+ },
32
+ closeButton: {
33
+ position: 'absolute',
34
+ right: theme.spacing(1),
35
+ top: theme.spacing(1),
36
+ color: theme.palette.grey[500]
37
+ },
38
+ field: {
39
+ margin: theme.spacing(2)
40
+ }
41
+ };
42
+ });
43
+ var flagNames = ['read paired', 'read mapped in proper pair', 'read unmapped', 'mate unmapped', 'read reverse strand', 'mate reverse strand', 'first in pair', 'second in pair', 'not primary alignment', 'read fails platform/vendor quality checks', 'read is PCR or optical duplicate', 'supplementary alignment'];
44
+
45
+ function Bitmask(props) {
46
+ var _props$flag = props.flag,
47
+ flag = _props$flag === void 0 ? 0 : _props$flag,
48
+ setFlag = props.setFlag;
49
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_core.TextField, {
50
+ type: "number",
51
+ value: flag,
52
+ onChange: function onChange(event) {
53
+ return setFlag(+event.target.value);
54
+ }
55
+ }), flagNames.map(function (name, index) {
56
+ var val = flag & 1 << index;
57
+ var key = "".concat(name, "_").concat(val);
58
+ return /*#__PURE__*/_react["default"].createElement("div", {
59
+ key: key
60
+ }, /*#__PURE__*/_react["default"].createElement("input", {
61
+ type: "checkbox",
62
+ checked: Boolean(val),
63
+ onChange: function onChange(event) {
64
+ if (event.target.checked) {
65
+ setFlag(flag | 1 << index);
66
+ } else {
67
+ setFlag(flag & ~(1 << index));
68
+ }
69
+ }
70
+ }), /*#__PURE__*/_react["default"].createElement("label", {
71
+ htmlFor: key
72
+ }, name));
73
+ }));
74
+ }
75
+
76
+ function FilterByTagDlg(props) {
77
+ var _filterBy$tagFilter, _filterBy$tagFilter2;
78
+
79
+ var model = props.model,
80
+ handleClose = props.handleClose;
81
+ var classes = useStyles();
82
+ var filterBy = model.filterBy;
83
+
84
+ var _useState = (0, _react.useState)(filterBy === null || filterBy === void 0 ? void 0 : filterBy.flagInclude),
85
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
86
+ flagInclude = _useState2[0],
87
+ setFlagInclude = _useState2[1];
88
+
89
+ var _useState3 = (0, _react.useState)(filterBy === null || filterBy === void 0 ? void 0 : filterBy.flagExclude),
90
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
91
+ flagExclude = _useState4[0],
92
+ setFlagExclude = _useState4[1];
93
+
94
+ var _useState5 = (0, _react.useState)((filterBy === null || filterBy === void 0 ? void 0 : (_filterBy$tagFilter = filterBy.tagFilter) === null || _filterBy$tagFilter === void 0 ? void 0 : _filterBy$tagFilter.tag) || ''),
95
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
96
+ tag = _useState6[0],
97
+ setTag = _useState6[1];
98
+
99
+ var _useState7 = (0, _react.useState)((filterBy === null || filterBy === void 0 ? void 0 : (_filterBy$tagFilter2 = filterBy.tagFilter) === null || _filterBy$tagFilter2 === void 0 ? void 0 : _filterBy$tagFilter2.value) || ''),
100
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
101
+ tagValue = _useState8[0],
102
+ setTagValue = _useState8[1];
103
+
104
+ var _useState9 = (0, _react.useState)((filterBy === null || filterBy === void 0 ? void 0 : filterBy.readName) || ''),
105
+ _useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
106
+ readName = _useState10[0],
107
+ setReadName = _useState10[1];
108
+
109
+ var validTag = tag.match(/^[A-Za-z][A-Za-z0-9]$/);
110
+ var site = 'https://broadinstitute.github.io/picard/explain-flags.html';
111
+ return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
112
+ open: true,
113
+ onClose: handleClose
114
+ }, /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, null, "Filter options", /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
115
+ "aria-label": "close",
116
+ className: classes.closeButton,
117
+ onClick: handleClose
118
+ }, /*#__PURE__*/_react["default"].createElement(_Close["default"], null))), /*#__PURE__*/_react["default"].createElement(_core.DialogContent, null, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Set filter bitmask options. Refer to ", /*#__PURE__*/_react["default"].createElement(_core.Link, {
119
+ href: site
120
+ }, site), ' ', "for details"), /*#__PURE__*/_react["default"].createElement(_core.Paper, {
121
+ className: classes.paper,
122
+ variant: "outlined"
123
+ }, /*#__PURE__*/_react["default"].createElement("div", {
124
+ style: {
125
+ display: 'flex'
126
+ }
127
+ }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Read must have ALL these flags"), /*#__PURE__*/_react["default"].createElement(Bitmask, {
128
+ flag: flagInclude,
129
+ setFlag: setFlagInclude
130
+ })), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Read must have NONE of these flags"), /*#__PURE__*/_react["default"].createElement(Bitmask, {
131
+ flag: flagExclude,
132
+ setFlag: setFlagExclude
133
+ })))), /*#__PURE__*/_react["default"].createElement(_core.Paper, {
134
+ className: classes.paper,
135
+ variant: "outlined"
136
+ }, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Filter by tag name and value. Use * in the value field to get all reads containing any value for that tag. Example: filter tag name SA with value * to get all split/supplementary reads. Other examples include HP for haplotype, or RG for read group"), /*#__PURE__*/_react["default"].createElement(_core.TextField, {
137
+ className: classes.field,
138
+ value: tag,
139
+ onChange: function onChange(event) {
140
+ setTag(event.target.value);
141
+ },
142
+ placeholder: "Enter tag name",
143
+ inputProps: {
144
+ maxLength: 2,
145
+ 'data-testid': 'color-tag-name-input'
146
+ },
147
+ error: tag.length === 2 && !validTag,
148
+ helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '',
149
+ "data-testid": "color-tag-name"
150
+ }), /*#__PURE__*/_react["default"].createElement(_core.TextField, {
151
+ className: classes.field,
152
+ value: tagValue,
153
+ onChange: function onChange(event) {
154
+ setTagValue(event.target.value);
155
+ },
156
+ placeholder: "Enter tag value",
157
+ inputProps: {
158
+ 'data-testid': 'color-tag-name-input'
159
+ },
160
+ "data-testid": "color-tag-value"
161
+ })), /*#__PURE__*/_react["default"].createElement(_core.Paper, {
162
+ className: classes.paper,
163
+ variant: "outlined"
164
+ }, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Filter by read name"), /*#__PURE__*/_react["default"].createElement(_core.TextField, {
165
+ className: classes.field,
166
+ value: readName,
167
+ onChange: function onChange(event) {
168
+ setReadName(event.target.value);
169
+ },
170
+ placeholder: "Enter read name",
171
+ inputProps: {
172
+ 'data-testid': 'color-tag-readname-input'
173
+ },
174
+ "data-testid": "color-tag-readname"
175
+ })), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
176
+ variant: "contained",
177
+ color: "primary",
178
+ autoFocus: true,
179
+ type: "submit",
180
+ onClick: function onClick() {
181
+ model.setFilterBy({
182
+ flagInclude: flagInclude,
183
+ flagExclude: flagExclude,
184
+ readName: readName,
185
+ tagFilter: tag !== '' ? {
186
+ tag: tag,
187
+ value: tagValue
188
+ } : undefined
189
+ });
190
+ handleClose();
191
+ }
192
+ }, "Submit"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
193
+ variant: "contained",
194
+ color: "secondary",
195
+ onClick: function onClick() {
196
+ return handleClose();
197
+ }
198
+ }, "Cancel"))));
199
+ }
200
+
201
+ var _default = (0, _mobxReact.observer)(FilterByTagDlg);
202
+
203
+ exports["default"] = _default;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _mobxReact = require("mobx-react");
13
+
14
+ var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
15
+
16
+ function LinearPileupDisplayBlurb(props) {
17
+ var model = props.model;
18
+ var sortedBy = model.sortedBy;
19
+ return sortedBy ? /*#__PURE__*/_react["default"].createElement("div", {
20
+ "data-testid": "blurb-".concat(model.sortedBy),
21
+ style: {
22
+ backgroundColor: 'white'
23
+ }
24
+ }, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
25
+ color: "secondary",
26
+ variant: "caption"
27
+ }, model.sortedBy ? "Sorted by ".concat(sortedBy.type.toLowerCase(), " at ").concat(sortedBy.refName, ":").concat(sortedBy.pos) : null)) : null;
28
+ }
29
+
30
+ var _default = (0, _mobxReact.observer)(LinearPileupDisplayBlurb);
31
+
32
+ exports["default"] = _default;
@@ -0,0 +1,99 @@
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
+ 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); }
23
+
24
+ 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; }
25
+
26
+ var useStyles = (0, _core.makeStyles)(function (theme) {
27
+ return {
28
+ closeButton: {
29
+ position: 'absolute',
30
+ right: theme.spacing(1),
31
+ top: theme.spacing(1),
32
+ color: theme.palette.grey[500]
33
+ }
34
+ };
35
+ });
36
+
37
+ function SetFeatureHeightDlg(props) {
38
+ var classes = useStyles();
39
+ var model = props.model,
40
+ handleClose = props.handleClose;
41
+ var featureHeightSetting = model.featureHeightSetting,
42
+ noSpacingSetting = model.noSpacing;
43
+
44
+ var _useState = (0, _react.useState)("".concat(featureHeightSetting)),
45
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
46
+ height = _useState2[0],
47
+ setHeight = _useState2[1];
48
+
49
+ var _useState3 = (0, _react.useState)(noSpacingSetting),
50
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
51
+ noSpacing = _useState4[0],
52
+ setNoSpacing = _useState4[1];
53
+
54
+ var ok = height !== '' && !Number.isNaN(+height);
55
+ return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
56
+ open: true,
57
+ onClose: handleClose
58
+ }, /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, null, "Set feature height", /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
59
+ className: classes.closeButton,
60
+ onClick: handleClose
61
+ }, /*#__PURE__*/_react["default"].createElement(_Close["default"], null))), /*#__PURE__*/_react["default"].createElement(_core.DialogContent, null, /*#__PURE__*/_react["default"].createElement(_core.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."), /*#__PURE__*/_react["default"].createElement(_core.TextField, {
62
+ value: height,
63
+ helperText: "Feature height",
64
+ onChange: function onChange(event) {
65
+ setHeight(event.target.value);
66
+ }
67
+ }), /*#__PURE__*/_react["default"].createElement(_core.FormControlLabel, {
68
+ control: /*#__PURE__*/_react["default"].createElement(_core.Checkbox, {
69
+ checked: !!noSpacing,
70
+ onChange: function onChange() {
71
+ return setNoSpacing(function (val) {
72
+ return !val;
73
+ });
74
+ }
75
+ }),
76
+ label: "Remove spacing between features in y-direction?"
77
+ }), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
78
+ variant: "contained",
79
+ color: "primary",
80
+ type: "submit",
81
+ autoFocus: true,
82
+ disabled: !ok,
83
+ onClick: function onClick() {
84
+ model.setFeatureHeight(height !== '' && !Number.isNaN(+height) ? +height : undefined);
85
+ model.setNoSpacing(noSpacing);
86
+ handleClose();
87
+ }
88
+ }, "Submit"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
89
+ variant: "contained",
90
+ color: "secondary",
91
+ onClick: function onClick() {
92
+ return handleClose();
93
+ }
94
+ }, "Cancel"))));
95
+ }
96
+
97
+ var _default = (0, _mobxReact.observer)(SetFeatureHeightDlg);
98
+
99
+ exports["default"] = _default;
@@ -0,0 +1,90 @@
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
+ 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); }
23
+
24
+ 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; }
25
+
26
+ var useStyles = (0, _core.makeStyles)(function (theme) {
27
+ return {
28
+ root: {
29
+ width: 500
30
+ },
31
+ closeButton: {
32
+ position: 'absolute',
33
+ right: theme.spacing(1),
34
+ top: theme.spacing(1),
35
+ color: theme.palette.grey[500]
36
+ },
37
+ field: {
38
+ margin: theme.spacing(2)
39
+ }
40
+ };
41
+ });
42
+
43
+ function SetMaxHeightDlg(props) {
44
+ var model = props.model,
45
+ handleClose = props.handleClose;
46
+ var classes = useStyles();
47
+ var _model$maxHeight = model.maxHeight,
48
+ maxHeight = _model$maxHeight === void 0 ? '' : _model$maxHeight;
49
+
50
+ var _useState = (0, _react.useState)("".concat(maxHeight)),
51
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
52
+ max = _useState2[0],
53
+ setMax = _useState2[1];
54
+
55
+ return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
56
+ open: true,
57
+ onClose: handleClose
58
+ }, /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, null, "Filter options", /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
59
+ "aria-label": "close",
60
+ className: classes.closeButton,
61
+ onClick: handleClose
62
+ }, /*#__PURE__*/_react["default"].createElement(_Close["default"], null))), /*#__PURE__*/_react["default"].createElement(_core.DialogContent, {
63
+ className: classes.root
64
+ }, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Set max height for the track. For example, you can increase this if the layout says \"Max height reached\""), /*#__PURE__*/_react["default"].createElement(_core.TextField, {
65
+ value: max,
66
+ onChange: function onChange(event) {
67
+ setMax(event.target.value);
68
+ },
69
+ placeholder: "Enter max height for layout"
70
+ }), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
71
+ variant: "contained",
72
+ color: "primary",
73
+ type: "submit",
74
+ autoFocus: true,
75
+ onClick: function onClick() {
76
+ model.setMaxHeight(max !== '' && !Number.isNaN(+max) ? +max : undefined);
77
+ handleClose();
78
+ }
79
+ }, "Submit"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
80
+ variant: "contained",
81
+ color: "secondary",
82
+ onClick: function onClick() {
83
+ return handleClose();
84
+ }
85
+ }, "Cancel"))));
86
+ }
87
+
88
+ var _default = (0, _mobxReact.observer)(SetMaxHeightDlg);
89
+
90
+ exports["default"] = _default;
@@ -0,0 +1,95 @@
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
+ 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); }
23
+
24
+ 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; }
25
+
26
+ var useStyles = (0, _core.makeStyles)(function (theme) {
27
+ return {
28
+ root: {
29
+ margin: 0,
30
+ padding: theme.spacing(2)
31
+ },
32
+ closeButton: {
33
+ position: 'absolute',
34
+ right: theme.spacing(1),
35
+ top: theme.spacing(1),
36
+ color: theme.palette.grey[500]
37
+ }
38
+ };
39
+ });
40
+
41
+ function SortByTagDlg(props) {
42
+ var classes = useStyles();
43
+ var model = props.model,
44
+ handleClose = props.handleClose;
45
+
46
+ var _useState = (0, _react.useState)(''),
47
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
48
+ tag = _useState2[0],
49
+ setTag = _useState2[1];
50
+
51
+ var validTag = tag.match(/^[A-Za-z][A-Za-z0-9]$/);
52
+ return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
53
+ open: true,
54
+ onClose: handleClose
55
+ }, /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, null, "Sort by tag", /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
56
+ "aria-label": "close",
57
+ className: classes.closeButton,
58
+ onClick: handleClose
59
+ }, /*#__PURE__*/_react["default"].createElement(_Close["default"], null))), /*#__PURE__*/_react["default"].createElement(_core.DialogContent, null, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Set the tag to sort by"), /*#__PURE__*/_react["default"].createElement(_core.Typography, {
60
+ color: "textSecondary"
61
+ }, "Examples: HP for haplotype, RG for read group, etc."), /*#__PURE__*/_react["default"].createElement(_core.TextField, {
62
+ value: tag,
63
+ onChange: function onChange(event) {
64
+ return setTag(event.target.value);
65
+ },
66
+ placeholder: "Enter tag name",
67
+ inputProps: {
68
+ maxLength: 2,
69
+ 'data-testid': 'sort-tag-name-input'
70
+ },
71
+ error: tag.length === 2 && !validTag,
72
+ helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '',
73
+ autoComplete: "off",
74
+ "data-testid": "sort-tag-name"
75
+ }), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
76
+ variant: "contained",
77
+ color: "primary",
78
+ type: "submit",
79
+ autoFocus: true,
80
+ onClick: function onClick() {
81
+ model.setSortedBy('tag', tag);
82
+ handleClose();
83
+ }
84
+ }, "Submit"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
85
+ variant: "contained",
86
+ color: "secondary",
87
+ onClick: function onClick() {
88
+ return handleClose();
89
+ }
90
+ }, "Cancel"))));
91
+ }
92
+
93
+ var _default = (0, _mobxReact.observer)(SortByTagDlg);
94
+
95
+ exports["default"] = _default;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+
8
+ var _configuration = require("@jbrowse/core/configuration");
9
+
10
+ var _pluginLinearGenomeView = require("@jbrowse/plugin-linear-genome-view");
11
+
12
+ var _mobxStateTree = require("mobx-state-tree");
13
+
14
+ function PileupConfigFactory(pluginManager) {
15
+ var PileupRendererConfigSchema = pluginManager.getRendererType('PileupRenderer').configSchema;
16
+ var SvgFeatureRendererConfigSchema = pluginManager.getRendererType('SvgFeatureRenderer').configSchema; // modify config schema to take in a sub coverage display
17
+
18
+ return (0, _configuration.ConfigurationSchema)('LinearPileupDisplay', {
19
+ defaultRendering: {
20
+ type: 'stringEnum',
21
+ model: _mobxStateTree.types.enumeration('Rendering', ['pileup', 'svg']),
22
+ defaultValue: 'pileup'
23
+ },
24
+ renderers: (0, _configuration.ConfigurationSchema)('RenderersConfiguration', {
25
+ PileupRenderer: PileupRendererConfigSchema,
26
+ SvgFeatureRenderer: SvgFeatureRendererConfigSchema
27
+ }),
28
+ renderer: '',
29
+ maxFeatureScreenDensity: {
30
+ type: 'number',
31
+ description: 'maximum features per pixel that is displayed in the view',
32
+ defaultValue: 5
33
+ },
34
+ colorScheme: {
35
+ type: 'stringEnum',
36
+ model: _mobxStateTree.types.enumeration('colorScheme', ['strand', 'normal', 'insertSize', 'insertSizeAndOrientation', 'mappingQuality', 'tag']),
37
+ description: 'color scheme to use',
38
+ defaultValue: 'normal'
39
+ }
40
+ }, {
41
+ baseConfiguration: (0, _pluginLinearGenomeView.linearBasicDisplayConfigSchemaFactory)(pluginManager),
42
+ explicitlyTyped: true
43
+ });
44
+ }
45
+
46
+ var _default = PileupConfigFactory;
47
+ exports["default"] = _default;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
6
+
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
+
9
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
10
+
11
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
12
+
13
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
14
+
15
+ var _Plugin3 = _interopRequireDefault(require("@jbrowse/core/Plugin"));
16
+
17
+ var _PluginManager = _interopRequireDefault(require("@jbrowse/core/PluginManager"));
18
+
19
+ var _BoxRendererType = _interopRequireDefault(require("@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType"));
20
+
21
+ var _pluginSvg = require("@jbrowse/plugin-svg");
22
+
23
+ var _PileupRenderer = _interopRequireDefault(require("../PileupRenderer"));
24
+
25
+ var _configSchema = _interopRequireDefault(require("./configSchema"));
26
+
27
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
28
+
29
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
30
+
31
+ // mock warnings to avoid unnecessary outputs
32
+ beforeEach(function () {
33
+ jest.spyOn(console, 'warn').mockImplementation(function () {});
34
+ });
35
+ afterEach(function () {
36
+ console.warn.mockRestore();
37
+ });
38
+
39
+ var PileupRendererPlugin = /*#__PURE__*/function (_Plugin) {
40
+ (0, _inherits2["default"])(PileupRendererPlugin, _Plugin);
41
+
42
+ var _super = _createSuper(PileupRendererPlugin);
43
+
44
+ function PileupRendererPlugin() {
45
+ (0, _classCallCheck2["default"])(this, PileupRendererPlugin);
46
+ return _super.apply(this, arguments);
47
+ }
48
+
49
+ (0, _createClass2["default"])(PileupRendererPlugin, [{
50
+ key: "install",
51
+ value: function install(pluginManager) {
52
+ (0, _PileupRenderer["default"])(pluginManager);
53
+ }
54
+ }]);
55
+ return PileupRendererPlugin;
56
+ }(_Plugin3["default"]);
57
+
58
+ var SvgFeatureRendererPlugin = /*#__PURE__*/function (_Plugin2) {
59
+ (0, _inherits2["default"])(SvgFeatureRendererPlugin, _Plugin2);
60
+
61
+ var _super2 = _createSuper(SvgFeatureRendererPlugin);
62
+
63
+ function SvgFeatureRendererPlugin() {
64
+ (0, _classCallCheck2["default"])(this, SvgFeatureRendererPlugin);
65
+ return _super2.apply(this, arguments);
66
+ }
67
+
68
+ (0, _createClass2["default"])(SvgFeatureRendererPlugin, [{
69
+ key: "install",
70
+ value: function install(pluginManager) {
71
+ pluginManager.addRendererType(function () {
72
+ return new _BoxRendererType["default"]({
73
+ name: 'SvgFeatureRenderer',
74
+ ReactComponent: _pluginSvg.SvgFeatureRendererReactComponent,
75
+ configSchema: _pluginSvg.svgFeatureRendererConfigSchema,
76
+ pluginManager: pluginManager
77
+ });
78
+ });
79
+ }
80
+ }]);
81
+ return SvgFeatureRendererPlugin;
82
+ }(_Plugin3["default"]);
83
+
84
+ test('has a type attr', function () {
85
+ var configSchema = (0, _configSchema["default"])(new _PluginManager["default"]([new PileupRendererPlugin(), new SvgFeatureRendererPlugin()]).createPluggableElements().configure());
86
+ var config = configSchema.create({
87
+ type: 'LinearPileupDisplay',
88
+ displayId: 'display0',
89
+ name: 'Zonker Display'
90
+ });
91
+ expect(config.type).toEqual('LinearPileupDisplay');
92
+ });