@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.
Files changed (155) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +5 -3
  2. package/dist/AlignmentsFeatureDetail/BreakendOptionDialog.js +12 -4
  3. package/dist/AlignmentsFeatureDetail/Formatter.js +6 -2
  4. package/dist/AlignmentsFeatureDetail/SuppAlignmentsLocStrings.js +4 -2
  5. package/dist/AlignmentsFeatureDetail/getSAFeatures.js +4 -4
  6. package/dist/AlignmentsFeatureDetail/launchBreakpointSplitView.js +2 -2
  7. package/dist/BamAdapter/BamAdapter.js +12 -18
  8. package/dist/BamAdapter/BamSlightlyLazyFeature.js +0 -1
  9. package/dist/CramAdapter/CramAdapter.d.ts +1 -1
  10. package/dist/CramAdapter/CramAdapter.js +7 -6
  11. package/dist/CramAdapter/CramTestAdapters.js +8 -2
  12. package/dist/GuessAlignmentsTypes/index.js +2 -2
  13. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +2 -2
  14. package/dist/LinearAlignmentsDisplay/models/model.d.ts +13 -20
  15. package/dist/LinearAlignmentsDisplay/models/model.js +13 -3
  16. package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +9 -4
  17. package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +41 -22
  18. package/dist/LinearPileupDisplay/components/{ColorByModifications.js → ColorByModificationsDialog.js} +3 -1
  19. package/dist/LinearPileupDisplay/components/{ColorByTag.js → ColorByTagDialog.js} +4 -2
  20. package/dist/LinearPileupDisplay/components/GroupByDialog.d.ts +11 -0
  21. package/dist/LinearPileupDisplay/components/GroupByDialog.js +129 -0
  22. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +1 -3
  23. package/dist/LinearPileupDisplay/components/{SetFeatureHeight.js → SetFeatureHeightDialog.js} +9 -3
  24. package/{esm/LinearPileupDisplay/components/SetMaxHeight.d.ts → dist/LinearPileupDisplay/components/SetMaxHeightDialog.d.ts} +1 -1
  25. package/dist/LinearPileupDisplay/components/{SetMaxHeight.js → SetMaxHeightDialog.js} +7 -3
  26. package/dist/LinearPileupDisplay/components/{SortByTag.d.ts → SortByTagDialog.d.ts} +1 -1
  27. package/dist/LinearPileupDisplay/components/{SortByTag.js → SortByTagDialog.js} +7 -3
  28. package/dist/LinearPileupDisplay/configSchema.js +0 -1
  29. package/dist/LinearPileupDisplay/model.d.ts +58 -46
  30. package/dist/LinearPileupDisplay/model.js +69 -41
  31. package/dist/LinearReadArcsDisplay/components/ReactComponent.js +1 -0
  32. package/dist/LinearReadArcsDisplay/model.d.ts +2 -2
  33. package/dist/LinearReadArcsDisplay/model.js +37 -13
  34. package/dist/LinearReadCloudDisplay/components/ReactComponent.js +4 -1
  35. package/dist/LinearReadCloudDisplay/drawPairChains.js +3 -3
  36. package/dist/LinearReadCloudDisplay/model.d.ts +4 -8
  37. package/dist/LinearReadCloudDisplay/model.js +16 -6
  38. package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  39. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +1 -1
  40. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +1 -1
  41. package/dist/LinearSNPCoverageDisplay/models/model.js +15 -5
  42. package/dist/MismatchParser/index.js +12 -10
  43. package/dist/PileupRPC/base.d.ts +1 -1
  44. package/dist/PileupRPC/methods/GetGlobalValueForTag.d.ts +1 -1
  45. package/dist/PileupRPC/methods/GetReducedFeatures.d.ts +3 -3
  46. package/dist/PileupRPC/methods/GetVisibleModifications.d.ts +1 -1
  47. package/dist/PileupRenderer/PileupLayoutSession.d.ts +1 -1
  48. package/dist/PileupRenderer/PileupLayoutSession.js +3 -2
  49. package/dist/PileupRenderer/PileupRenderer.d.ts +1 -1
  50. package/dist/PileupRenderer/PileupRenderer.js +16 -13
  51. package/dist/PileupRenderer/colorBy.js +3 -5
  52. package/dist/PileupRenderer/components/PileupRendering.d.ts +1 -1
  53. package/dist/PileupRenderer/components/PileupRendering.js +65 -60
  54. package/dist/PileupRenderer/getAlignmentShapeColor.js +24 -16
  55. package/dist/PileupRenderer/layoutFeature.js +6 -1
  56. package/dist/PileupRenderer/layoutFeatures.js +1 -7
  57. package/dist/PileupRenderer/makeImageData.d.ts +1 -1
  58. package/dist/PileupRenderer/makeImageData.js +1 -0
  59. package/dist/PileupRenderer/renderAlignmentShape.js +1 -1
  60. package/dist/PileupRenderer/renderMismatches.js +1 -1
  61. package/dist/PileupRenderer/renderSoftClipping.js +1 -1
  62. package/dist/PileupRenderer/util.js +3 -5
  63. package/dist/SNPCoverageAdapter/generateCoverageBins.js +4 -10
  64. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +2 -2
  65. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +2 -5
  66. package/dist/index.js +3 -1
  67. package/dist/shared/BaseDisplayComponent.js +3 -1
  68. package/dist/shared/{FilterByTag.js → FilterByTagDialog.js} +16 -6
  69. package/dist/shared/color.js +2 -2
  70. package/dist/shared/index.d.ts +24 -20
  71. package/dist/shared/index.js +4 -5
  72. package/dist/shared/renderSvg.js +1 -3
  73. package/dist/util.d.ts +1 -1
  74. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +5 -3
  75. package/esm/AlignmentsFeatureDetail/BreakendOptionDialog.js +12 -4
  76. package/esm/AlignmentsFeatureDetail/Formatter.js +6 -2
  77. package/esm/AlignmentsFeatureDetail/SuppAlignmentsLocStrings.js +4 -2
  78. package/esm/AlignmentsFeatureDetail/getSAFeatures.js +4 -4
  79. package/esm/AlignmentsFeatureDetail/launchBreakpointSplitView.js +2 -2
  80. package/esm/BamAdapter/BamAdapter.js +12 -18
  81. package/esm/BamAdapter/BamSlightlyLazyFeature.js +0 -1
  82. package/esm/CramAdapter/CramAdapter.d.ts +1 -1
  83. package/esm/CramAdapter/CramAdapter.js +7 -6
  84. package/esm/CramAdapter/CramTestAdapters.js +8 -2
  85. package/esm/GuessAlignmentsTypes/index.js +2 -2
  86. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +2 -2
  87. package/esm/LinearAlignmentsDisplay/models/model.d.ts +13 -20
  88. package/esm/LinearAlignmentsDisplay/models/model.js +13 -3
  89. package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +9 -4
  90. package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +42 -23
  91. package/esm/LinearPileupDisplay/components/{ColorByModifications.js → ColorByModificationsDialog.js} +3 -1
  92. package/esm/LinearPileupDisplay/components/{ColorByTag.js → ColorByTagDialog.js} +4 -2
  93. package/esm/LinearPileupDisplay/components/GroupByDialog.d.ts +11 -0
  94. package/esm/LinearPileupDisplay/components/GroupByDialog.js +104 -0
  95. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +1 -3
  96. package/esm/LinearPileupDisplay/components/{SetFeatureHeight.js → SetFeatureHeightDialog.js} +9 -3
  97. package/{dist/LinearPileupDisplay/components/SetMaxHeight.d.ts → esm/LinearPileupDisplay/components/SetMaxHeightDialog.d.ts} +1 -1
  98. package/esm/LinearPileupDisplay/components/{SetMaxHeight.js → SetMaxHeightDialog.js} +7 -3
  99. package/esm/LinearPileupDisplay/components/{SortByTag.d.ts → SortByTagDialog.d.ts} +1 -1
  100. package/esm/LinearPileupDisplay/components/{SortByTag.js → SortByTagDialog.js} +7 -3
  101. package/esm/LinearPileupDisplay/configSchema.js +0 -1
  102. package/esm/LinearPileupDisplay/model.d.ts +58 -46
  103. package/esm/LinearPileupDisplay/model.js +69 -41
  104. package/esm/LinearReadArcsDisplay/components/ReactComponent.js +1 -0
  105. package/esm/LinearReadArcsDisplay/model.d.ts +2 -2
  106. package/esm/LinearReadArcsDisplay/model.js +37 -13
  107. package/esm/LinearReadCloudDisplay/components/ReactComponent.js +4 -1
  108. package/esm/LinearReadCloudDisplay/drawPairChains.js +3 -3
  109. package/esm/LinearReadCloudDisplay/model.d.ts +4 -8
  110. package/esm/LinearReadCloudDisplay/model.js +16 -6
  111. package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  112. package/esm/LinearSNPCoverageDisplay/components/Tooltip.js +1 -1
  113. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +1 -1
  114. package/esm/LinearSNPCoverageDisplay/models/model.js +15 -5
  115. package/esm/MismatchParser/index.js +12 -10
  116. package/esm/PileupRPC/base.d.ts +1 -1
  117. package/esm/PileupRPC/methods/GetGlobalValueForTag.d.ts +1 -1
  118. package/esm/PileupRPC/methods/GetReducedFeatures.d.ts +3 -3
  119. package/esm/PileupRPC/methods/GetVisibleModifications.d.ts +1 -1
  120. package/esm/PileupRenderer/PileupLayoutSession.d.ts +1 -1
  121. package/esm/PileupRenderer/PileupLayoutSession.js +3 -2
  122. package/esm/PileupRenderer/PileupRenderer.d.ts +1 -1
  123. package/esm/PileupRenderer/PileupRenderer.js +16 -13
  124. package/esm/PileupRenderer/colorBy.js +3 -5
  125. package/esm/PileupRenderer/components/PileupRendering.d.ts +1 -1
  126. package/esm/PileupRenderer/components/PileupRendering.js +65 -60
  127. package/esm/PileupRenderer/getAlignmentShapeColor.js +24 -16
  128. package/esm/PileupRenderer/layoutFeature.js +6 -1
  129. package/esm/PileupRenderer/layoutFeatures.js +1 -7
  130. package/esm/PileupRenderer/makeImageData.d.ts +1 -1
  131. package/esm/PileupRenderer/makeImageData.js +1 -0
  132. package/esm/PileupRenderer/renderAlignmentShape.js +1 -1
  133. package/esm/PileupRenderer/renderMismatches.js +1 -1
  134. package/esm/PileupRenderer/renderSoftClipping.js +1 -1
  135. package/esm/PileupRenderer/util.js +3 -5
  136. package/esm/SNPCoverageAdapter/generateCoverageBins.js +4 -10
  137. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +2 -2
  138. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +2 -5
  139. package/esm/index.js +3 -1
  140. package/esm/shared/BaseDisplayComponent.js +3 -1
  141. package/esm/shared/{FilterByTag.js → FilterByTagDialog.js} +16 -6
  142. package/esm/shared/color.js +2 -2
  143. package/esm/shared/index.d.ts +24 -20
  144. package/esm/shared/index.js +4 -5
  145. package/esm/shared/renderSvg.js +1 -3
  146. package/esm/util.d.ts +1 -1
  147. package/package.json +6 -6
  148. /package/dist/LinearPileupDisplay/components/{ColorByModifications.d.ts → ColorByModificationsDialog.d.ts} +0 -0
  149. /package/dist/LinearPileupDisplay/components/{ColorByTag.d.ts → ColorByTagDialog.d.ts} +0 -0
  150. /package/dist/LinearPileupDisplay/components/{SetFeatureHeight.d.ts → SetFeatureHeightDialog.d.ts} +0 -0
  151. /package/dist/shared/{FilterByTag.d.ts → FilterByTagDialog.d.ts} +0 -0
  152. /package/esm/LinearPileupDisplay/components/{ColorByModifications.d.ts → ColorByModificationsDialog.d.ts} +0 -0
  153. /package/esm/LinearPileupDisplay/components/{ColorByTag.d.ts → ColorByTagDialog.d.ts} +0 -0
  154. /package/esm/LinearPileupDisplay/components/{SetFeatureHeight.d.ts → SetFeatureHeightDialog.d.ts} +0 -0
  155. /package/esm/shared/{FilterByTag.d.ts → FilterByTagDialog.d.ts} +0 -0
@@ -29,12 +29,14 @@ const material_1 = require("@mui/material");
29
29
  const ui_1 = require("@jbrowse/core/ui");
30
30
  const ColorByTagDialog = (0, mobx_react_1.observer)(function ({ model, handleClose, }) {
31
31
  const [tag, setTag] = (0, react_1.useState)('');
32
- const validTag = tag.match(/^[A-Za-z][A-Za-z0-9]$/);
32
+ const validTag = /^[A-Za-z][A-Za-z0-9]$/.exec(tag);
33
33
  return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, title: "Color by tag" },
34
34
  react_1.default.createElement(material_1.DialogContent, { style: { overflowX: 'hidden' } },
35
35
  react_1.default.createElement(material_1.Typography, null, "Enter tag to color by: "),
36
36
  react_1.default.createElement(material_1.Typography, { color: "textSecondary" }, "Examples: XS or TS for RNA-seq inferred read strand, ts (lower-case) for minimap2 read strand, HP for haplotype, RG for read group, etc."),
37
- react_1.default.createElement(material_1.TextField, { value: tag, onChange: event => setTag(event.target.value), placeholder: "Enter tag name", inputProps: { maxLength: 2 }, error: tag.length === 2 && !validTag, helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '', autoComplete: "off" }),
37
+ react_1.default.createElement(material_1.TextField, { value: tag, onChange: event => {
38
+ setTag(event.target.value);
39
+ }, placeholder: "Enter tag name", inputProps: { maxLength: 2 }, error: tag.length === 2 && !validTag, helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '', autoComplete: "off" }),
38
40
  react_1.default.createElement(material_1.DialogActions, null,
39
41
  react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", onClick: () => {
40
42
  model.setColorScheme({ type: 'tag', tag });
@@ -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,129 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const react_1 = __importStar(require("react"));
27
+ const mobx_react_1 = require("mobx-react");
28
+ const material_1 = require("@mui/material");
29
+ const ui_1 = require("@jbrowse/core/ui");
30
+ const mobx_state_tree_1 = require("mobx-state-tree");
31
+ const util_1 = require("@jbrowse/core/util");
32
+ // locals
33
+ const shared_1 = require("../../shared");
34
+ function clone(c) {
35
+ return JSON.parse(JSON.stringify(c));
36
+ }
37
+ const GroupByTagDialog = (0, mobx_react_1.observer)(function (props) {
38
+ const { model, handleClose } = props;
39
+ const [tag, setTag] = (0, react_1.useState)('');
40
+ const [tagSet, setTagSet] = (0, react_1.useState)();
41
+ const [loading, setLoading] = (0, react_1.useState)(false);
42
+ const [error, setError] = (0, react_1.useState)();
43
+ const [includeUndefined, setIncludeUndefined] = (0, react_1.useState)(true);
44
+ const validTag = /^[A-Za-z][A-Za-z0-9]$/.exec(tag);
45
+ const isInvalid = tag.length === 2 && !validTag;
46
+ const debouncedTag = (0, util_1.useDebounce)(tag, 1000);
47
+ (0, react_1.useEffect)(() => {
48
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
49
+ ;
50
+ (async () => {
51
+ try {
52
+ if (!isInvalid) {
53
+ setError(undefined);
54
+ setLoading(true);
55
+ const vals = await (0, shared_1.getUniqueTagValues)({
56
+ self: model,
57
+ tag: debouncedTag,
58
+ blocks: (0, util_1.getContainingView)(model)
59
+ .staticBlocks,
60
+ });
61
+ setTagSet(vals);
62
+ }
63
+ }
64
+ catch (e) {
65
+ console.error(e);
66
+ setError(e);
67
+ }
68
+ finally {
69
+ setLoading(false);
70
+ }
71
+ })();
72
+ }, [model, isInvalid, debouncedTag]);
73
+ return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, title: "Group by tag" },
74
+ react_1.default.createElement(material_1.DialogContent, null,
75
+ react_1.default.createElement(material_1.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"),
76
+ react_1.default.createElement(material_1.Typography, { color: "textSecondary" }, "Examples: HP for haplotype, RG for read group, etc."),
77
+ react_1.default.createElement(material_1.FormControlLabel, { control: react_1.default.createElement(material_1.Checkbox, { checked: includeUndefined, onChange: () => {
78
+ setIncludeUndefined(!includeUndefined);
79
+ } }), label: "Make a new subtrack for undefined values of tag as well?" }),
80
+ react_1.default.createElement(material_1.TextField, { value: tag, onChange: event => {
81
+ setTag(event.target.value);
82
+ }, placeholder: "Enter tag name", inputProps: {
83
+ maxLength: 2,
84
+ 'data-testid': 'group-tag-name-input',
85
+ }, error: isInvalid, helperText: isInvalid ? 'Not a valid tag' : '', autoComplete: "off", "data-testid": "group-tag-name" }),
86
+ error ? (react_1.default.createElement(ui_1.ErrorMessage, { error: error })) : loading ? (react_1.default.createElement(ui_1.LoadingEllipses, { title: "Loading unique tags" })) : tagSet ? (react_1.default.createElement("div", null,
87
+ react_1.default.createElement("div", null,
88
+ "Found unique ",
89
+ tag,
90
+ " values:"),
91
+ react_1.default.createElement("div", null, tagSet.join(', ')))) : null),
92
+ react_1.default.createElement(material_1.DialogActions, null,
93
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", type: "submit", disabled: !tagSet, autoFocus: true, onClick: () => {
94
+ const track = (0, util_1.getContainingTrack)(model);
95
+ const trackConf = clone((0, mobx_state_tree_1.getSnapshot)(track.configuration));
96
+ const session = (0, util_1.getSession)(model);
97
+ if (tagSet) {
98
+ const ret = [...tagSet];
99
+ if (includeUndefined) {
100
+ ret.push(undefined);
101
+ }
102
+ for (const tagValue of ret) {
103
+ // @ts-expect-error
104
+ const newTrackConf = session.addTrackConf({
105
+ ...trackConf,
106
+ trackId: `${trackConf.trackId}-${tag}:${tagValue}-${+Date.now()}-sessionTrack`,
107
+ name: `${trackConf.name} ${tag}:${tagValue}`,
108
+ displays: undefined,
109
+ });
110
+ const view = (0, util_1.getContainingView)(model);
111
+ const t = view.showTrack(newTrackConf.trackId);
112
+ const d = t.displays[0];
113
+ d.setFilterBy({
114
+ flagInclude: 0,
115
+ flagExclude: 1540,
116
+ tagFilter: {
117
+ tag,
118
+ value: tagValue,
119
+ },
120
+ });
121
+ }
122
+ }
123
+ handleClose();
124
+ } }, "Submit"),
125
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => {
126
+ handleClose();
127
+ } }, "Cancel"))));
128
+ });
129
+ exports.default = GroupByTagDialog;
@@ -10,8 +10,6 @@ const LinearPileupDisplayBlurb = (0, mobx_react_1.observer)(function ({ model, }
10
10
  var _a;
11
11
  const { sortedBy } = model;
12
12
  return sortedBy ? (react_1.default.createElement("div", { "data-testid": `blurb-${sortedBy}` },
13
- react_1.default.createElement(material_1.Typography, { color: "secondary", variant: "caption" }, sortedBy
14
- ? `Sorted by ${(_a = sortedBy.tag) !== null && _a !== void 0 ? _a : sortedBy.type} at ${sortedBy.refName}:${sortedBy.pos}`
15
- : null))) : null;
13
+ react_1.default.createElement(material_1.Typography, { color: "secondary", variant: "caption" }, `Sorted by ${(_a = sortedBy.tag) !== null && _a !== void 0 ? _a : sortedBy.type} at ${sortedBy.refName}:${sortedBy.pos}`))) : null;
16
14
  });
17
15
  exports.default = LinearPileupDisplayBlurb;
@@ -36,14 +36,20 @@ const SetFeatureHeightDialog = (0, mobx_react_1.observer)(function (props) {
36
36
  return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, title: "Set feature height" },
37
37
  react_1.default.createElement(material_1.DialogContent, null,
38
38
  react_1.default.createElement(material_1.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."),
39
- react_1.default.createElement(material_1.TextField, { value: height, helperText: "Feature height", onChange: event => setHeight(event.target.value) }),
40
- react_1.default.createElement(material_1.FormControlLabel, { control: react_1.default.createElement(material_1.Checkbox, { checked: !!noSpacing, onChange: () => setNoSpacing(val => !val) }), label: "Remove spacing between features in y-direction?" }),
39
+ react_1.default.createElement(material_1.TextField, { value: height, helperText: "Feature height", onChange: event => {
40
+ setHeight(event.target.value);
41
+ } }),
42
+ react_1.default.createElement(material_1.FormControlLabel, { control: react_1.default.createElement(material_1.Checkbox, { checked: !!noSpacing, onChange: () => {
43
+ setNoSpacing(val => !val);
44
+ } }), label: "Remove spacing between features in y-direction?" }),
41
45
  react_1.default.createElement(material_1.DialogActions, null,
42
46
  react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", type: "submit", autoFocus: true, disabled: !ok, onClick: () => {
43
47
  model.setFeatureHeight(height !== '' && !Number.isNaN(+height) ? +height : undefined);
44
48
  model.setNoSpacing(noSpacing);
45
49
  handleClose();
46
50
  } }, "Submit"),
47
- react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => handleClose() }, "Cancel")))));
51
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => {
52
+ handleClose();
53
+ } }, "Cancel")))));
48
54
  });
49
55
  exports.default = SetFeatureHeightDialog;
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  declare const SetMaxHeightDialog: (props: {
3
3
  model: {
4
4
  maxHeight?: number;
5
- setMaxHeight: Function;
5
+ setMaxHeight: (arg?: number) => void;
6
6
  };
7
7
  handleClose: () => void;
8
8
  }) => React.JSX.Element;
@@ -38,15 +38,19 @@ const SetMaxHeightDialog = (0, mobx_react_1.observer)(function (props) {
38
38
  const { classes } = useStyles();
39
39
  const { maxHeight = '' } = model;
40
40
  const [max, setMax] = (0, react_1.useState)(`${maxHeight}`);
41
- return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, title: "Filter options" },
41
+ return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, title: "Set max height" },
42
42
  react_1.default.createElement(material_1.DialogContent, { className: classes.root },
43
43
  react_1.default.createElement(material_1.Typography, null, "Set max height for the track. For example, you can increase this if the layout says \"Max height reached\""),
44
- react_1.default.createElement(material_1.TextField, { value: max, onChange: event => setMax(event.target.value), placeholder: "Enter max height for layout" }),
44
+ react_1.default.createElement(material_1.TextField, { value: max, autoFocus: true, onChange: event => {
45
+ setMax(event.target.value);
46
+ }, placeholder: "Enter max height for layout" }),
45
47
  react_1.default.createElement(material_1.DialogActions, null,
46
48
  react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", type: "submit", autoFocus: true, onClick: () => {
47
49
  model.setMaxHeight(max !== '' && !Number.isNaN(+max) ? +max : undefined);
48
50
  handleClose();
49
51
  } }, "Submit"),
50
- react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => handleClose() }, "Cancel")))));
52
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => {
53
+ handleClose();
54
+ } }, "Cancel")))));
51
55
  });
52
56
  exports.default = SetMaxHeightDialog;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  declare const SortByTagDialog: (props: {
3
3
  model: {
4
- setSortedBy: Function;
4
+ setSortedBy: (arg: string, arg2: string) => void;
5
5
  };
6
6
  handleClose: () => void;
7
7
  }) => React.JSX.Element;
@@ -30,12 +30,14 @@ const ui_1 = require("@jbrowse/core/ui");
30
30
  const SortByTagDialog = (0, mobx_react_1.observer)(function (props) {
31
31
  const { model, handleClose } = props;
32
32
  const [tag, setTag] = (0, react_1.useState)('');
33
- const validTag = tag.match(/^[A-Za-z][A-Za-z0-9]$/);
33
+ const validTag = /^[A-Za-z][A-Za-z0-9]$/.exec(tag);
34
34
  return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, title: "Sort by tag" },
35
35
  react_1.default.createElement(material_1.DialogContent, null,
36
36
  react_1.default.createElement(material_1.Typography, null, "Set the tag to sort by"),
37
37
  react_1.default.createElement(material_1.Typography, { color: "textSecondary" }, "Examples: HP for haplotype, RG for read group, etc."),
38
- react_1.default.createElement(material_1.TextField, { value: tag, onChange: event => setTag(event.target.value), placeholder: "Enter tag name", inputProps: {
38
+ react_1.default.createElement(material_1.TextField, { value: tag, onChange: event => {
39
+ setTag(event.target.value);
40
+ }, placeholder: "Enter tag name", inputProps: {
39
41
  maxLength: 2,
40
42
  'data-testid': 'sort-tag-name-input',
41
43
  }, error: tag.length === 2 && !validTag, helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '', autoComplete: "off", "data-testid": "sort-tag-name" }),
@@ -44,6 +46,8 @@ const SortByTagDialog = (0, mobx_react_1.observer)(function (props) {
44
46
  model.setSortedBy('tag', tag);
45
47
  handleClose();
46
48
  } }, "Submit"),
47
- react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => handleClose() }, "Cancel")))));
49
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => {
50
+ handleClose();
51
+ } }, "Cancel")))));
48
52
  });
49
53
  exports.default = SortByTagDialog;
@@ -8,7 +8,6 @@ const mobx_state_tree_1 = require("mobx-state-tree");
8
8
  */
9
9
  function x() { } // eslint-disable-line @typescript-eslint/no-unused-vars
10
10
  function configSchemaF(pluginManager) {
11
- // modify config schema to take in a sub coverage display
12
11
  return (0, configuration_1.ConfigurationSchema)('LinearPileupDisplay', {
13
12
  /**
14
13
  * #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")._NotCustomized>>;
158
- onHorizontalScroll?: Function;
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")._NotCustomized, 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: number): void;
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(): (import("@jbrowse/core/ui").MenuDivider | import("@jbrowse/core/ui").MenuSubHeader | import("@jbrowse/core/ui").NormalMenuItem | import("@jbrowse/core/ui").CheckboxMenuItem | import("@jbrowse/core/ui").RadioMenuItem | import("@jbrowse/core/ui").SubMenuItem | {
430
- label: string;
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
- type: string;
435
- checked: boolean;
436
- onClick: () => void;
437
- disabled?: undefined;
438
- subMenu?: undefined;
439
- } | {
440
- label: string;
441
- icon: import("@mui/material/OverridableComponent").OverridableComponent<import("@mui/material").SvgIconTypeMap<{}, "svg">> & {
442
- muiName: string;
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
- type?: undefined;
450
- checked?: undefined;
451
- onClick?: undefined;
452
- } | {
453
- label: string;
454
- subMenu: {
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
- icon?: undefined;
459
- type?: undefined;
460
- checked?: undefined;
461
- onClick?: undefined;
462
- disabled?: undefined;
463
- } | {
464
- label: string;
465
- type: string;
466
- checked: any;
467
- onClick: () => void;
468
- icon?: undefined;
469
- disabled?: undefined;
470
- subMenu?: undefined;
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>;
@@ -36,12 +36,15 @@ const util_2 = require("../util");
36
36
  // icons
37
37
  const Visibility_1 = __importDefault(require("@mui/icons-material/Visibility"));
38
38
  const Sort_1 = __importDefault(require("@mui/icons-material/Sort"));
39
+ const Workspaces_1 = __importDefault(require("@mui/icons-material/Workspaces"));
40
+ const ColorLens_1 = __importDefault(require("@mui/icons-material/ColorLens"));
39
41
  // locals
40
42
  const SharedLinearPileupDisplayMixin_1 = require("./SharedLinearPileupDisplayMixin");
41
43
  const mobx_1 = require("mobx");
42
- // lzies
43
- const SortByTagDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./components/SortByTag'))));
44
- const ModificationsDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./components/ColorByModifications'))));
44
+ // lazies
45
+ const SortByTagDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./components/SortByTagDialog'))));
46
+ const GroupByDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./components/GroupByDialog'))));
47
+ const ModificationsDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./components/ColorByModificationsDialog'))));
45
48
  /**
46
49
  * #stateModel LinearPileupDisplay
47
50
  * #category display
@@ -248,27 +251,43 @@ function stateModelFactory(configSchema) {
248
251
  return [
249
252
  ...superTrackMenuItems(),
250
253
  {
251
- label: 'Show soft clipping',
252
- icon: Visibility_1.default,
253
- type: 'checkbox',
254
- checked: self.showSoftClipping,
255
- onClick: () => {
256
- self.toggleSoftClipping();
257
- // if toggling from off to on, will break sort for this track
258
- // so clear it
259
- if (self.showSoftClipping) {
260
- self.clearSelected();
261
- }
262
- },
254
+ label: 'Color by...',
255
+ icon: ColorLens_1.default,
256
+ subMenu: [
257
+ {
258
+ label: 'Pair orientation',
259
+ onClick: () => {
260
+ self.setColorScheme({ type: 'pairOrientation' });
261
+ },
262
+ },
263
+ {
264
+ label: 'Modifications or methylation',
265
+ onClick: () => {
266
+ (0, util_1.getSession)(self).queueDialog(doneCallback => [
267
+ ModificationsDialog,
268
+ { model: self, handleClose: doneCallback },
269
+ ]);
270
+ },
271
+ },
272
+ {
273
+ label: 'Insert size',
274
+ onClick: () => {
275
+ self.setColorScheme({ type: 'insertSize' });
276
+ },
277
+ },
278
+ ...superColorSchemeSubMenuItems(),
279
+ ],
263
280
  },
264
281
  {
265
- label: 'Sort by',
282
+ label: 'Sort by...',
266
283
  icon: Sort_1.default,
267
284
  disabled: self.showSoftClipping,
268
285
  subMenu: [
269
286
  ...['Start location', 'Read strand', 'Base pair'].map(option => ({
270
287
  label: option,
271
- onClick: () => self.setSortedBy(option),
288
+ onClick: () => {
289
+ self.setSortedBy(option);
290
+ },
272
291
  })),
273
292
  {
274
293
  label: 'Sort by tag...',
@@ -281,38 +300,43 @@ function stateModelFactory(configSchema) {
281
300
  },
282
301
  {
283
302
  label: 'Clear sort',
284
- onClick: () => self.clearSelected(),
285
- },
286
- ],
287
- },
288
- {
289
- label: 'Color scheme',
290
- subMenu: [
291
- {
292
- label: 'Pair orientation',
293
- onClick: () => self.setColorScheme({ type: 'pairOrientation' }),
294
- },
295
- {
296
- label: 'Modifications or methylation',
297
303
  onClick: () => {
298
- (0, util_1.getSession)(self).queueDialog(doneCallback => [
299
- ModificationsDialog,
300
- { model: self, handleClose: doneCallback },
301
- ]);
304
+ self.clearSelected();
302
305
  },
303
306
  },
304
- {
305
- label: 'Insert size',
306
- onClick: () => self.setColorScheme({ type: 'insertSize' }),
307
- },
308
- ...superColorSchemeSubMenuItems(),
309
307
  ],
310
308
  },
309
+ {
310
+ label: 'Group by...',
311
+ icon: Workspaces_1.default,
312
+ onClick: () => {
313
+ (0, util_1.getSession)(self).queueDialog(handleClose => [
314
+ GroupByDialog,
315
+ { model: self, handleClose },
316
+ ]);
317
+ },
318
+ },
319
+ {
320
+ label: 'Show soft clipping',
321
+ icon: Visibility_1.default,
322
+ type: 'checkbox',
323
+ checked: self.showSoftClipping,
324
+ onClick: () => {
325
+ self.toggleSoftClipping();
326
+ // if toggling from off to on, will break sort for this track
327
+ // so clear it
328
+ if (self.showSoftClipping) {
329
+ self.clearSelected();
330
+ }
331
+ },
332
+ },
311
333
  {
312
334
  label: 'Fade mismatches by quality',
313
335
  type: 'checkbox',
314
336
  checked: self.mismatchAlphaSetting,
315
- onClick: () => self.toggleMismatchAlpha(),
337
+ onClick: () => {
338
+ self.toggleMismatchAlpha();
339
+ },
316
340
  },
317
341
  ];
318
342
  },
@@ -370,7 +394,11 @@ function stateModelFactory(configSchema) {
370
394
  const { staticBlocks } = (0, util_1.getContainingView)(self);
371
395
  if ((colorBy === null || colorBy === void 0 ? void 0 : colorBy.type) === 'modifications') {
372
396
  const adapter = (0, configuration_1.getConf)(parentTrack, ['adapter']);
373
- const vals = await (0, shared_1.getUniqueModificationValues)(self, adapter, colorBy, staticBlocks);
397
+ const vals = await (0, shared_1.getUniqueModificationValues)({
398
+ self,
399
+ adapterConfig: adapter,
400
+ blocks: staticBlocks,
401
+ });
374
402
  self.updateModificationColorMap(vals);
375
403
  }
376
404
  self.setModificationsReady(true);
@@ -34,6 +34,7 @@ const Arcs = (0, mobx_react_1.observer)(function ({ model, }) {
34
34
  const view = (0, util_1.getContainingView)(model);
35
35
  const width = Math.round(view.dynamicBlocks.totalWidthPx);
36
36
  const height = model.height;
37
+ // biome-ignore lint/correctness/useExhaustiveDependencies:
37
38
  const cb = (0, react_1.useCallback)((ref) => {
38
39
  model.setRef(ref);
39
40
  },
@@ -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?: Function;
68
+ onHorizontalScroll?: () => void;
69
69
  blockState?: Record<string, any>;
70
70
  }>;
71
71
  readonly DisplayBlurb: React.FC<{