@jbrowse/plugin-wiggle 2.13.1 → 2.14.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 (89) hide show
  1. package/dist/BigWigAdapter/BigWigAdapter.d.ts +1 -1
  2. package/dist/BigWigAdapter/BigWigAdapter.js +1 -1
  3. package/dist/CreateMultiWiggleExtension/ConfirmDialog.js +12 -4
  4. package/dist/LinearWiggleDisplay/components/SetColorDialog.js +12 -4
  5. package/dist/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  6. package/dist/LinearWiggleDisplay/components/Tooltip.js +7 -2
  7. package/dist/LinearWiggleDisplay/models/model.d.ts +1 -1
  8. package/dist/LinearWiggleDisplay/models/model.js +10 -4
  9. package/dist/MultiLinearWiggleDisplay/components/ScoreLegend.js +1 -2
  10. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +3 -1
  11. package/dist/MultiLinearWiggleDisplay/components/SourcesGrid.js +22 -8
  12. package/dist/MultiLinearWiggleDisplay/components/Tooltip.js +4 -7
  13. package/dist/MultiLinearWiggleDisplay/components/YScaleBars.js +2 -2
  14. package/dist/MultiLinearWiggleDisplay/models/model.d.ts +1 -1
  15. package/dist/MultiLinearWiggleDisplay/models/model.js +16 -6
  16. package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
  17. package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
  18. package/dist/MultiWiggleAdapter/MultiWiggleAdapter.js +1 -3
  19. package/dist/MultiWiggleAddTrackWorkflow/AddTrackWorkflow.js +8 -4
  20. package/dist/MultiWiggleRendering.d.ts +4 -4
  21. package/dist/MultiWiggleRendering.js +6 -3
  22. package/dist/Tooltip.d.ts +1 -1
  23. package/dist/Tooltip.js +1 -1
  24. package/dist/WiggleBaseRenderer.d.ts +1 -1
  25. package/dist/WiggleBaseRenderer.js +1 -1
  26. package/dist/WiggleRPC/MultiWiggleGetSources.d.ts +1 -1
  27. package/dist/WiggleRPC/MultiWiggleGetSources.js +0 -1
  28. package/dist/WiggleRPC/WiggleGetGlobalQuantitativeStats.js +0 -1
  29. package/dist/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.d.ts +2 -2
  30. package/dist/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js +0 -1
  31. package/dist/WiggleRendering.d.ts +3 -3
  32. package/dist/WiggleRendering.js +3 -3
  33. package/dist/drawDensity.js +5 -3
  34. package/dist/drawLine.js +5 -3
  35. package/dist/drawXY.js +5 -3
  36. package/dist/index.d.ts +3 -3
  37. package/dist/index.js +1 -1
  38. package/dist/shared/SetMinMaxDialog.d.ts +2 -2
  39. package/dist/shared/SetMinMaxDialog.js +6 -2
  40. package/dist/shared/YScaleBar.d.ts +1 -1
  41. package/dist/shared/modelShared.d.ts +5 -5
  42. package/dist/shared/modelShared.js +15 -5
  43. package/dist/util.d.ts +2 -2
  44. package/dist/util.js +8 -11
  45. package/esm/BigWigAdapter/BigWigAdapter.d.ts +1 -1
  46. package/esm/BigWigAdapter/BigWigAdapter.js +1 -1
  47. package/esm/CreateMultiWiggleExtension/ConfirmDialog.js +12 -4
  48. package/esm/LinearWiggleDisplay/components/SetColorDialog.js +12 -4
  49. package/esm/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  50. package/esm/LinearWiggleDisplay/components/Tooltip.js +7 -2
  51. package/esm/LinearWiggleDisplay/models/model.d.ts +1 -1
  52. package/esm/LinearWiggleDisplay/models/model.js +10 -4
  53. package/esm/MultiLinearWiggleDisplay/components/ScoreLegend.js +1 -2
  54. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +3 -1
  55. package/esm/MultiLinearWiggleDisplay/components/SourcesGrid.js +22 -8
  56. package/esm/MultiLinearWiggleDisplay/components/Tooltip.js +4 -7
  57. package/esm/MultiLinearWiggleDisplay/components/YScaleBars.js +2 -2
  58. package/esm/MultiLinearWiggleDisplay/models/model.d.ts +1 -1
  59. package/esm/MultiLinearWiggleDisplay/models/model.js +16 -6
  60. package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
  61. package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
  62. package/esm/MultiWiggleAdapter/MultiWiggleAdapter.js +1 -3
  63. package/esm/MultiWiggleAddTrackWorkflow/AddTrackWorkflow.js +8 -4
  64. package/esm/MultiWiggleRendering.d.ts +4 -4
  65. package/esm/MultiWiggleRendering.js +6 -3
  66. package/esm/Tooltip.d.ts +1 -1
  67. package/esm/Tooltip.js +1 -1
  68. package/esm/WiggleBaseRenderer.d.ts +1 -1
  69. package/esm/WiggleBaseRenderer.js +1 -1
  70. package/esm/WiggleRPC/MultiWiggleGetSources.d.ts +1 -1
  71. package/esm/WiggleRPC/MultiWiggleGetSources.js +0 -1
  72. package/esm/WiggleRPC/WiggleGetGlobalQuantitativeStats.js +0 -1
  73. package/esm/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.d.ts +2 -2
  74. package/esm/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js +0 -1
  75. package/esm/WiggleRendering.d.ts +3 -3
  76. package/esm/WiggleRendering.js +3 -3
  77. package/esm/drawDensity.js +5 -3
  78. package/esm/drawLine.js +5 -3
  79. package/esm/drawXY.js +5 -3
  80. package/esm/index.d.ts +3 -3
  81. package/esm/index.js +1 -1
  82. package/esm/shared/SetMinMaxDialog.d.ts +2 -2
  83. package/esm/shared/SetMinMaxDialog.js +6 -2
  84. package/esm/shared/YScaleBar.d.ts +1 -1
  85. package/esm/shared/modelShared.d.ts +5 -5
  86. package/esm/shared/modelShared.js +15 -5
  87. package/esm/util.d.ts +2 -2
  88. package/esm/util.js +8 -11
  89. package/package.json +5 -6
@@ -14,7 +14,7 @@ export default class BigWigAdapter extends BaseFeatureDataAdapter {
14
14
  header: Awaited<ReturnType<BigWig["getHeader"]>>;
15
15
  }>;
16
16
  getRefNames(opts?: BaseOptions): Promise<string[]>;
17
- refIdToName(refId: number): Promise<string>;
17
+ refIdToName(refId: number): Promise<string | undefined>;
18
18
  getGlobalStats(opts?: BaseOptions): Promise<import("@jbrowse/core/util/stats").QuantitativeStats>;
19
19
  getFeatures(region: Region, opts?: WiggleOptions): import("rxjs").Observable<Feature>;
20
20
  getMultiRegionFeatureDensityStats(_regions: Region[]): Promise<{
@@ -18,7 +18,7 @@ class BigWigAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
18
18
  }
19
19
  async setup(opts) {
20
20
  if (!this.setupP) {
21
- this.setupP = this.setupPre(opts).catch(e => {
21
+ this.setupP = this.setupPre(opts).catch((e) => {
22
22
  this.setupP = undefined;
23
23
  throw e;
24
24
  });
@@ -33,7 +33,9 @@ const configuration_1 = require("@jbrowse/core/configuration");
33
33
  const ConfirmDialog = ({ tracks, onClose, }) => {
34
34
  const [val, setVal] = (0, react_1.useState)(`MultiWiggle ${Date.now()}`);
35
35
  const allQuant = tracks.every(t => t.type === 'QuantitativeTrack');
36
- return (react_1.default.createElement(Dialog_1.default, { open: true, onClose: () => onClose(false), title: "Confirm multi-wiggle track create" },
36
+ return (react_1.default.createElement(Dialog_1.default, { open: true, onClose: () => {
37
+ onClose(false);
38
+ }, title: "Confirm multi-wiggle track create" },
37
39
  react_1.default.createElement(material_1.DialogContent, null,
38
40
  react_1.default.createElement(material_1.Typography, null,
39
41
  !allQuant
@@ -44,10 +46,16 @@ const ConfirmDialog = ({ tracks, onClose, }) => {
44
46
  (0, configuration_1.readConfObject)(track, 'name'),
45
47
  " - ",
46
48
  track.type)))),
47
- react_1.default.createElement(material_1.TextField, { value: val, onChange: event => setVal(event.target.value), helperText: "Track name" }),
49
+ react_1.default.createElement(material_1.TextField, { value: val, onChange: event => {
50
+ setVal(event.target.value);
51
+ }, helperText: "Track name" }),
48
52
  react_1.default.createElement(material_1.Typography, null, "Confirm creation of track?")),
49
53
  react_1.default.createElement(material_1.DialogActions, null,
50
- react_1.default.createElement(material_1.Button, { onClick: () => onClose(false), color: "primary" }, "Cancel"),
51
- react_1.default.createElement(material_1.Button, { onClick: () => onClose(true, { name: val }), color: "primary", variant: "contained", autoFocus: true }, "Submit"))));
54
+ react_1.default.createElement(material_1.Button, { onClick: () => {
55
+ onClose(false);
56
+ }, color: "primary" }, "Cancel"),
57
+ react_1.default.createElement(material_1.Button, { onClick: () => {
58
+ onClose(true, { name: val });
59
+ }, color: "primary", variant: "contained", autoFocus: true }, "Submit"))));
52
60
  };
53
61
  exports.default = ConfirmDialog;
@@ -33,8 +33,12 @@ const SetColorDialog = (0, mobx_react_1.observer)(function SetColorDialog({ mode
33
33
  return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, title: "Set color" },
34
34
  react_1.default.createElement(material_1.DialogContent, null,
35
35
  react_1.default.createElement(material_1.Typography, null, "Select either an overall color, or the positive/negative colors. Note that density renderers only work properly with positive/negative colors"),
36
- react_1.default.createElement(material_1.FormControlLabel, { checked: !posneg, onClick: () => setPosNeg(false), control: react_1.default.createElement(material_1.Radio, null), label: "Overall color" }),
37
- react_1.default.createElement(material_1.FormControlLabel, { checked: posneg, onClick: () => setPosNeg(true), control: react_1.default.createElement(material_1.Radio, null), label: "Positive/negative color" }),
36
+ react_1.default.createElement(material_1.FormControlLabel, { checked: !posneg, onClick: () => {
37
+ setPosNeg(false);
38
+ }, control: react_1.default.createElement(material_1.Radio, null), label: "Overall color" }),
39
+ react_1.default.createElement(material_1.FormControlLabel, { checked: posneg, onClick: () => {
40
+ setPosNeg(true);
41
+ }, control: react_1.default.createElement(material_1.Radio, null), label: "Positive/negative color" }),
38
42
  posneg ? (react_1.default.createElement(react_1.default.Fragment, null,
39
43
  react_1.default.createElement(material_1.Typography, null, "Positive color"),
40
44
  react_1.default.createElement(ColorPicker_1.ColorPicker, { color: model.posColor || 'black', onChange: event => {
@@ -47,13 +51,17 @@ const SetColorDialog = (0, mobx_react_1.observer)(function SetColorDialog({ mode
47
51
  model.setColor(undefined);
48
52
  } }))) : (react_1.default.createElement(react_1.default.Fragment, null,
49
53
  react_1.default.createElement(material_1.Typography, null, "Overall color"),
50
- react_1.default.createElement(ColorPicker_1.ColorPicker, { color: model.color || 'black', onChange: event => model.setColor(event) })))),
54
+ react_1.default.createElement(ColorPicker_1.ColorPicker, { color: model.color || 'black', onChange: event => {
55
+ model.setColor(event);
56
+ } })))),
51
57
  react_1.default.createElement(material_1.DialogActions, null,
52
58
  react_1.default.createElement(material_1.Button, { onClick: () => {
53
59
  model.setPosColor(undefined);
54
60
  model.setNegColor(undefined);
55
61
  model.setColor(undefined);
56
62
  }, color: "secondary", variant: "contained" }, "Restore default"),
57
- react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", type: "submit", onClick: () => handleClose() }, "Submit"))));
63
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", type: "submit", onClick: () => {
64
+ handleClose();
65
+ } }, "Submit"))));
58
66
  });
59
67
  exports.default = SetColorDialog;
@@ -4,7 +4,7 @@ import { TooltipContentsComponent } from '../../Tooltip';
4
4
  type Coord = [number, number];
5
5
  declare const WiggleTooltip: (props: {
6
6
  model: {
7
- featureUnderMouse: Feature;
7
+ featureUnderMouse?: Feature;
8
8
  };
9
9
  height: number;
10
10
  offsetMouseCoord: Coord;
@@ -13,8 +13,13 @@ const en = (n) => n.toLocaleString('en-US');
13
13
  const TooltipContents = react_1.default.forwardRef(function TooltipContents2({ feature }, ref) {
14
14
  const start = feature.get('start');
15
15
  const end = feature.get('end');
16
- const name = feature.get('refName');
17
- const loc = [name, start === end ? en(start) : `${en(start)}..${en(end)}`]
16
+ const refName = feature.get('refName');
17
+ const name = feature.get('name');
18
+ const loc = [
19
+ refName,
20
+ name,
21
+ start === end ? en(start) : `${en(start)}..${en(end)}`,
22
+ ]
18
23
  .filter(f => !!f)
19
24
  .join(':');
20
25
  return feature.get('summary') !== undefined ? (react_1.default.createElement("div", { ref: ref },
@@ -155,7 +155,7 @@ declare function stateModelFactory(pluginManager: PluginManager, configSchema: A
155
155
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree" /**
156
156
  * #getter
157
157
  */)._NotCustomized>>;
158
- onHorizontalScroll?: Function;
158
+ onHorizontalScroll?: () => void;
159
159
  blockState?: Record<string, any>;
160
160
  }>;
161
161
  readonly DisplayBlurb: React.FC<{
@@ -136,7 +136,7 @@ function stateModelFactory(pluginManager, configSchema) {
136
136
  if (self.filled) {
137
137
  return 0;
138
138
  }
139
- else if (!self.filled && self.minSize === 1) {
139
+ else if (self.minSize === 1) {
140
140
  return 1;
141
141
  }
142
142
  else {
@@ -167,7 +167,9 @@ function stateModelFactory(pluginManager, configSchema) {
167
167
  label: elt,
168
168
  type: 'radio',
169
169
  checked: self.fillSetting === idx,
170
- onClick: () => self.setFill(idx),
170
+ onClick: () => {
171
+ self.setFill(idx);
172
+ },
171
173
  })),
172
174
  },
173
175
  ]
@@ -178,7 +180,9 @@ function stateModelFactory(pluginManager, configSchema) {
178
180
  type: 'checkbox',
179
181
  label: 'Draw cross hatches',
180
182
  checked: self.displayCrossHatchesSetting,
181
- onClick: () => self.toggleCrossHatches(),
183
+ onClick: () => {
184
+ self.toggleCrossHatches();
185
+ },
182
186
  },
183
187
  ]
184
188
  : []),
@@ -190,7 +194,9 @@ function stateModelFactory(pluginManager, configSchema) {
190
194
  label: key,
191
195
  type: 'radio',
192
196
  checked: self.rendererTypeNameSimple === key,
193
- onClick: () => self.setRendererType(key),
197
+ onClick: () => {
198
+ self.setRendererType(key);
199
+ },
194
200
  })),
195
201
  },
196
202
  ]
@@ -10,8 +10,7 @@ const RectBg_1 = __importDefault(require("./RectBg"));
10
10
  const ScoreLegend = (0, mobx_react_1.observer)(({ model }) => {
11
11
  const { ticks, scaleType } = model;
12
12
  const { width } = (0, util_1.getContainingView)(model);
13
- const legend = `[${ticks === null || ticks === void 0 ? void 0 : ticks.values[0]}-${ticks === null || ticks === void 0 ? void 0 : ticks.values[1]}]` +
14
- (scaleType === 'log' ? ' (log scale)' : '');
13
+ const legend = `[${ticks === null || ticks === void 0 ? void 0 : ticks.values[0]}-${ticks === null || ticks === void 0 ? void 0 : ticks.values[1]}]${scaleType === 'log' ? ' (log scale)' : ''}`;
15
14
  const len = (0, util_1.measureText)(legend, 14);
16
15
  const padding = 25;
17
16
  const xpos = width - len - padding;
@@ -47,7 +47,9 @@ function SetColorDialog({ model, handleClose, }) {
47
47
  const [showTips, setShowTips] = (0, util_1.useLocalStorage)('multiwiggle-showTips', true);
48
48
  return (react_1.default.createElement(DraggableDialog_1.default, { open: true, onClose: handleClose, maxWidth: "xl", title: 'Multi-wiggle color/arrangement editor' },
49
49
  react_1.default.createElement(material_1.DialogContent, { className: classes.content },
50
- react_1.default.createElement(material_1.Button, { variant: "contained", style: { float: 'right' }, onClick: () => setShowTips(!showTips) }, showTips ? 'Hide tips' : 'Show tips'),
50
+ react_1.default.createElement(material_1.Button, { variant: "contained", style: { float: 'right' }, onClick: () => {
51
+ setShowTips(!showTips);
52
+ } }, showTips ? 'Hide tips' : 'Show tips'),
51
53
  react_1.default.createElement("br", null),
52
54
  showTips ? (react_1.default.createElement(react_1.default.Fragment, null,
53
55
  "Helpful tips",
@@ -58,17 +58,27 @@ function SourcesGrid({ rows, onChange, showTips, }) {
58
58
  field: null,
59
59
  });
60
60
  return (react_1.default.createElement("div", null,
61
- react_1.default.createElement(material_1.Button, { disabled: !selected.length, onClick: event => setAnchorEl(event.currentTarget) }, "Change color of selected items"),
62
- react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveUp)([...rows], selected)), disabled: !selected.length },
61
+ react_1.default.createElement(material_1.Button, { disabled: !selected.length, onClick: event => {
62
+ setAnchorEl(event.currentTarget);
63
+ } }, "Change color of selected items"),
64
+ react_1.default.createElement(material_1.Button, { onClick: () => {
65
+ onChange((0, util_2.moveUp)([...rows], selected));
66
+ }, disabled: !selected.length },
63
67
  react_1.default.createElement(KeyboardArrowUp_1.default, null),
64
68
  showTips ? 'Move selected items up' : null),
65
- react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveDown)([...rows], selected)), disabled: !selected.length },
69
+ react_1.default.createElement(material_1.Button, { onClick: () => {
70
+ onChange((0, util_2.moveDown)([...rows], selected));
71
+ }, disabled: !selected.length },
66
72
  react_1.default.createElement(KeyboardArrowDown_1.default, null),
67
73
  showTips ? 'Move selected items down' : null),
68
- react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveUp)([...rows], selected, rows.length)), disabled: !selected.length },
74
+ react_1.default.createElement(material_1.Button, { onClick: () => {
75
+ onChange((0, util_2.moveUp)([...rows], selected, rows.length));
76
+ }, disabled: !selected.length },
69
77
  react_1.default.createElement(KeyboardDoubleArrowUp_1.default, null),
70
78
  showTips ? 'Move selected items to top' : null),
71
- react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveDown)([...rows], selected, rows.length)), disabled: !selected.length },
79
+ react_1.default.createElement(material_1.Button, { onClick: () => {
80
+ onChange((0, util_2.moveDown)([...rows], selected, rows.length));
81
+ }, disabled: !selected.length },
72
82
  react_1.default.createElement(KeyboardDoubleArrowDown_1.default, null),
73
83
  showTips ? 'Move selected items to bottom' : null),
74
84
  react_1.default.createElement(ColorPicker_1.ColorPopover, { anchorEl: anchorEl, color: widgetColor, onChange: c => {
@@ -80,9 +90,13 @@ function SourcesGrid({ rows, onChange, showTips, }) {
80
90
  }
81
91
  });
82
92
  onChange([...rows]);
83
- }, onClose: () => setAnchorEl(null) }),
93
+ }, onClose: () => {
94
+ setAnchorEl(null);
95
+ } }),
84
96
  react_1.default.createElement("div", { style: { height: 400, width: '100%' } },
85
- react_1.default.createElement(x_data_grid_1.DataGrid, { getRowId: row => row.name, checkboxSelection: true, disableRowSelectionOnClick: true, onRowSelectionModelChange: arg => setSelected(arg), rows: rows, rowHeight: 25, columnHeaderHeight: 33, columns: [
97
+ react_1.default.createElement(x_data_grid_1.DataGrid, { getRowId: row => row.name, checkboxSelection: true, disableRowSelectionOnClick: true, onRowSelectionModelChange: arg => {
98
+ setSelected(arg);
99
+ }, rows: rows, rowHeight: 25, columnHeaderHeight: 33, columns: [
86
100
  {
87
101
  field: 'color',
88
102
  headerName: 'Color',
@@ -117,7 +131,7 @@ function SourcesGrid({ rows, onChange, showTips, }) {
117
131
  // thing since we are controlling sort instead of the default data
118
132
  // grid sort anyways
119
133
  const idx = (currSort.idx + 1) % 2;
120
- const field = (sort === null || sort === void 0 ? void 0 : sort.field) || currSort.field;
134
+ const field = sort.field || currSort.field;
121
135
  setCurrSort({ idx, field });
122
136
  onChange(field
123
137
  ? [...rows].sort((a, b) => {
@@ -28,13 +28,10 @@ const TooltipContents = react_1.default.forwardRef(function TooltipContents2({ m
28
28
  react_1.default.createElement("th", null, "color"),
29
29
  react_1.default.createElement("th", null, "source"),
30
30
  react_1.default.createElement("th", null, "score"))),
31
- react_1.default.createElement("tbody", null, Object.entries(sources).map(([source, data]) => {
32
- var _a;
33
- return (react_1.default.createElement("tr", { key: source },
34
- react_1.default.createElement("td", { style: { background: (_a = obj[source]) === null || _a === void 0 ? void 0 : _a.color } }, " "),
35
- react_1.default.createElement("td", null, source),
36
- react_1.default.createElement("td", null, (0, util_1.toP)(data.score))));
37
- })))) : (react_1.default.createElement("span", null,
31
+ react_1.default.createElement("tbody", null, Object.entries(sources).map(([source, data]) => (react_1.default.createElement("tr", { key: source },
32
+ react_1.default.createElement("td", { style: { background: obj[source].color } }, " "),
33
+ react_1.default.createElement("td", null, source),
34
+ react_1.default.createElement("td", null, (0, util_1.toP)(data.score)))))))) : (react_1.default.createElement("span", null,
38
35
  source,
39
36
  ' ',
40
37
  summary
@@ -33,9 +33,9 @@ exports.YScaleBars = (0, mobx_react_1.observer)(function (props) {
33
33
  if (!ready) {
34
34
  return null;
35
35
  }
36
- const labelWidth = Math.max(...(sources
36
+ const labelWidth = Math.max(...sources
37
37
  .map(s => (0, util_1.measureText)(s.name, svgFontSize))
38
- .map(width => (canDisplayLabel ? width : minWidth)) || [0]));
38
+ .map(width => (canDisplayLabel ? width : minWidth)));
39
39
  return (react_1.default.createElement(Wrapper, { ...props }, needsFullHeightScalebar ? (react_1.default.createElement(react_1.default.Fragment, null,
40
40
  react_1.default.createElement("g", { transform: `translate(${!exportSVG ? (0, util_2.getOffset)(model) : 0},0)` },
41
41
  react_1.default.createElement(YScaleBar_1.default, { model: model, orientation: orientation })),
@@ -157,7 +157,7 @@ export declare function stateModelFactory(pluginManager: PluginManager, configSc
157
157
  }, import("mobx-state-tree" /**
158
158
  * #property
159
159
  */)._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
160
- onHorizontalScroll?: Function;
160
+ onHorizontalScroll?: () => void;
161
161
  blockState?: Record<string, any>;
162
162
  }>;
163
163
  readonly DisplayBlurb: React.FC<{
@@ -277,8 +277,12 @@ function stateModelFactory(pluginManager, configSchema) {
277
277
  scaleOpts,
278
278
  sources,
279
279
  ticks,
280
- onMouseMove: (_, f) => self.setFeatureUnderMouse(f),
281
- onMouseLeave: () => self.setFeatureUnderMouse(undefined),
280
+ onMouseMove: (_, f) => {
281
+ self.setFeatureUnderMouse(f);
282
+ },
283
+ onMouseLeave: () => {
284
+ self.setFeatureUnderMouse(undefined);
285
+ },
282
286
  };
283
287
  },
284
288
  /**
@@ -300,7 +304,7 @@ function stateModelFactory(pluginManager, configSchema) {
300
304
  if (self.filled) {
301
305
  return 0;
302
306
  }
303
- else if (!self.filled && self.minSize === 1) {
307
+ else if (self.minSize === 1) {
304
308
  return 1;
305
309
  }
306
310
  else {
@@ -331,7 +335,9 @@ function stateModelFactory(pluginManager, configSchema) {
331
335
  label: elt,
332
336
  type: 'radio',
333
337
  checked: self.fillSetting === idx,
334
- onClick: () => self.setFill(idx),
338
+ onClick: () => {
339
+ self.setFill(idx);
340
+ },
335
341
  })),
336
342
  },
337
343
  ]
@@ -342,7 +348,9 @@ function stateModelFactory(pluginManager, configSchema) {
342
348
  type: 'checkbox',
343
349
  label: 'Draw cross hatches',
344
350
  checked: self.displayCrossHatchesSetting,
345
- onClick: () => self.toggleCrossHatches(),
351
+ onClick: () => {
352
+ self.toggleCrossHatches();
353
+ },
346
354
  },
347
355
  ]
348
356
  : []),
@@ -360,7 +368,9 @@ function stateModelFactory(pluginManager, configSchema) {
360
368
  label: key,
361
369
  type: 'radio',
362
370
  checked: self.rendererTypeNameSimple === key,
363
- onClick: () => self.setRendererType(key),
371
+ onClick: () => {
372
+ self.setRendererType(key);
373
+ },
364
374
  })),
365
375
  },
366
376
  ]
@@ -10,7 +10,7 @@ class MultiRowLineRenderer extends WiggleBaseRenderer_1.default {
10
10
  // @ts-expect-error
11
11
  async draw(ctx, props) {
12
12
  const { bpPerPx, sources, regions, features } = props;
13
- const [region] = regions;
13
+ const region = regions[0];
14
14
  const groups = (0, util_1.groupBy)(features.values(), f => f.get('source'));
15
15
  const height = props.height / sources.length;
16
16
  const width = (region.end - region.start) / bpPerPx;
@@ -10,7 +10,7 @@ class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
10
10
  // @ts-expect-error
11
11
  async draw(ctx, props) {
12
12
  const { bpPerPx, sources, regions, features } = props;
13
- const [region] = regions;
13
+ const region = regions[0];
14
14
  const groups = (0, util_1.groupBy)(features.values(), f => f.get('source'));
15
15
  const height = props.height / sources.length;
16
16
  const width = (region.end - region.start) / bpPerPx;
@@ -26,9 +26,7 @@ class MultiWiggleAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
26
26
  },
27
27
  }));
28
28
  }
29
- return Promise.all(
30
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
- subConfs.map(async (conf) => {
29
+ return Promise.all(subConfs.map(async (conf) => {
32
30
  const dataAdapter = (await getSubAdapter(conf))
33
31
  .dataAdapter;
34
32
  return {
@@ -51,11 +51,13 @@ function MultiWiggleWidget({ model }) {
51
51
  react_1.default.createElement("ul", null,
52
52
  react_1.default.createElement("li", null, "Enter list of URLs for bigwig files in the textbox"),
53
53
  react_1.default.createElement("li", null, "Or, use the button below the text box to select files from your computer")),
54
- react_1.default.createElement(material_1.TextField, { multiline: true, rows: 10, value: val, onChange: event => setVal(event.target.value), placeholder: 'Paste list of URLs here, or use file selector below', variant: "outlined", className: classes.textbox }),
54
+ react_1.default.createElement(material_1.TextField, { multiline: true, rows: 10, value: val, onChange: event => {
55
+ setVal(event.target.value);
56
+ }, placeholder: 'Paste list of URLs here, or use file selector below', variant: "outlined", className: classes.textbox }),
55
57
  react_1.default.createElement(material_1.Button, { variant: "outlined", component: "label" },
56
58
  "Choose Files from your computer",
57
59
  react_1.default.createElement("input", { type: "file", hidden: true, multiple: true, onChange: ({ target }) => {
58
- const res = [...((target === null || target === void 0 ? void 0 : target.files) || [])].map(file => ({
60
+ const res = [...(target.files || [])].map(file => ({
59
61
  type: 'BigWigAdapter',
60
62
  bigWigLocation: util_1.isElectron
61
63
  ? {
@@ -67,13 +69,15 @@ function MultiWiggleWidget({ model }) {
67
69
  }));
68
70
  setVal(JSON.stringify(res, null, 2));
69
71
  } })),
70
- react_1.default.createElement(material_1.TextField, { value: trackName, onChange: event => setTrackName(event.target.value), helperText: "Track name" }),
72
+ react_1.default.createElement(material_1.TextField, { value: trackName, onChange: event => {
73
+ setTrackName(event.target.value);
74
+ }, helperText: "Track name" }),
71
75
  react_1.default.createElement(material_1.Button, { variant: "contained", className: classes.submit, onClick: () => {
72
76
  var _a;
73
77
  const session = (0, util_1.getSession)(model);
74
78
  const trackId = [
75
79
  `${trackName.toLowerCase().replaceAll(' ', '_')}-${Date.now()}`,
76
- `${session.adminMode ? '' : '-sessionTrack'}`,
80
+ session.adminMode ? '' : '-sessionTrack',
77
81
  ].join('');
78
82
  // allow list of bigwigs in JSON format or line-by-line
79
83
  let bigWigs;
@@ -8,13 +8,13 @@ declare const MultiWiggleRendering: (props: {
8
8
  bpPerPx: number;
9
9
  width: number;
10
10
  height: number;
11
- onMouseLeave: Function;
12
- onMouseMove: Function;
13
- onFeatureClick: Function;
14
11
  blockKey: string;
15
12
  sources: Source[];
16
- displayModel: {
13
+ displayModel?: {
17
14
  isMultiRow: boolean;
18
15
  };
16
+ onMouseLeave?: (event: React.MouseEvent) => void;
17
+ onMouseMove?: (event: React.MouseEvent, arg?: Feature) => void;
18
+ onFeatureClick?: (event: React.MouseEvent, arg?: Feature) => void;
19
19
  }) => React.JSX.Element;
20
20
  export default MultiWiggleRendering;
@@ -29,8 +29,9 @@ const util_1 = require("@jbrowse/core/util");
29
29
  const ui_1 = require("@jbrowse/core/ui");
30
30
  const MultiWiggleRendering = (0, mobx_react_1.observer)(function (props) {
31
31
  const { regions, features, bpPerPx, width, height, sources, onMouseLeave = () => { }, onMouseMove = () => { }, onFeatureClick = () => { }, displayModel, } = props;
32
- const [region] = regions;
32
+ const region = regions[0];
33
33
  const ref = (0, react_1.useRef)(null);
34
+ const { isMultiRow } = displayModel || {};
34
35
  function getFeatureUnderMouse(eventClientX, eventClientY) {
35
36
  if (!ref.current) {
36
37
  return;
@@ -45,7 +46,7 @@ const MultiWiggleRendering = (0, mobx_react_1.observer)(function (props) {
45
46
  const px = region.reversed ? width - offsetX : offsetX;
46
47
  const mouseoverBp = region.start + bpPerPx * px;
47
48
  let featureUnderMouse;
48
- if (displayModel.isMultiRow) {
49
+ if (isMultiRow) {
49
50
  for (const feature of features.values()) {
50
51
  if (feature.get('source') !== source.name) {
51
52
  continue;
@@ -91,7 +92,9 @@ const MultiWiggleRendering = (0, mobx_react_1.observer)(function (props) {
91
92
  const { clientX, clientY } = event;
92
93
  const featureUnderMouse = getFeatureUnderMouse(clientX, clientY);
93
94
  onFeatureClick(event, featureUnderMouse);
94
- }, onMouseLeave: event => onMouseLeave(event), style: {
95
+ }, onMouseLeave: event => {
96
+ onMouseLeave(event);
97
+ }, style: {
95
98
  overflow: 'visible',
96
99
  position: 'relative',
97
100
  height,
package/dist/Tooltip.d.ts CHANGED
@@ -7,7 +7,7 @@ export type TooltipContentsComponent = React.ForwardRefExoticComponent<{
7
7
  } & React.RefAttributes<HTMLDivElement>>;
8
8
  declare const Tooltip: ({ model, height, clientMouseCoord, offsetMouseCoord, clientRect, TooltipContents, useClientY, }: {
9
9
  model: {
10
- featureUnderMouse: Feature;
10
+ featureUnderMouse?: Feature;
11
11
  };
12
12
  useClientY?: boolean;
13
13
  height: number;
package/dist/Tooltip.js CHANGED
@@ -50,7 +50,7 @@ const Tooltip = (0, mobx_react_1.observer)(function Tooltip({ model, height, cli
50
50
  const y = useClientY ? clientMouseCoord[1] : (clientRect === null || clientRect === void 0 ? void 0 : clientRect.top) || 0;
51
51
  const clientPoint = (0, react_2.useClientPoint)(context, { x, y });
52
52
  const { getFloatingProps } = (0, react_2.useInteractions)([clientPoint]);
53
- const popperTheme = (_a = theme === null || theme === void 0 ? void 0 : theme.components) === null || _a === void 0 ? void 0 : _a.MuiPopper;
53
+ const popperTheme = (_a = theme.components) === null || _a === void 0 ? void 0 : _a.MuiPopper;
54
54
  return featureUnderMouse ? (react_1.default.createElement(react_1.default.Fragment, null,
55
55
  react_1.default.createElement(material_1.Portal, { container: (_b = popperTheme === null || popperTheme === void 0 ? void 0 : popperTheme.defaultProps) === null || _b === void 0 ? void 0 : _b.container },
56
56
  react_1.default.createElement("div", { className: classes.tooltip, ref: refs.setFloating, style: {
@@ -52,6 +52,6 @@ export default abstract class WiggleBaseRenderer extends FeatureRendererType {
52
52
  * draw features to context given props, to be used by derived renderer
53
53
  * classes
54
54
  */
55
- abstract draw<T extends RenderArgsDeserializedWithFeatures>(ctx: CanvasRenderingContext2D, props: T): Promise<Record<string, unknown> | void>;
55
+ abstract draw<T extends RenderArgsDeserializedWithFeatures>(ctx: CanvasRenderingContext2D, props: T): Promise<Record<string, unknown> | undefined>;
56
56
  }
57
57
  export { type RenderArgsSerialized, type RenderResults, type ResultsDeserialized, type ResultsSerialized, } from '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType';
@@ -13,7 +13,7 @@ class WiggleBaseRenderer extends FeatureRendererType_1.default {
13
13
  async render(renderProps) {
14
14
  const features = await this.getFeatures(renderProps);
15
15
  const { height, regions, bpPerPx } = renderProps;
16
- const [region] = regions;
16
+ const region = regions[0];
17
17
  const width = (region.end - region.start) / bpPerPx;
18
18
  // @ts-expect-error
19
19
  const { reducedFeatures, ...rest } = await (0, util_1.renderToAbstractCanvas)(width, height, renderProps, ctx => this.draw(ctx, {
@@ -9,7 +9,7 @@ export declare class MultiWiggleGetSources extends RpcMethodType {
9
9
  serializeArguments(args: RenderArgs & {
10
10
  signal?: AbortSignal;
11
11
  statusCallback?: (arg: string) => void;
12
- }, rpcDriverClassName: string): Promise<{}>;
12
+ }, rpcDriverClassName: string): Promise<Record<string, unknown>>;
13
13
  execute(args: {
14
14
  adapterConfig: AnyConfigurationModel;
15
15
  signal?: RemoteAbortSignal;
@@ -13,7 +13,6 @@ class MultiWiggleGetSources extends RpcMethodType_1.default {
13
13
  super(...arguments);
14
14
  this.name = 'MultiWiggleGetSources';
15
15
  }
16
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
16
  async deserializeArguments(args, rpcDriverClassName) {
18
17
  const l = await super.deserializeArguments(args, rpcDriverClassName);
19
18
  return {
@@ -12,7 +12,6 @@ class WiggleGetGlobalQuantitativeStats extends RpcMethodType_1.default {
12
12
  super(...arguments);
13
13
  this.name = 'WiggleGetGlobalQuantitativeStats';
14
14
  }
15
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
15
  async deserializeArguments(args, rpcDriverClassName) {
17
16
  const l = await super.deserializeArguments(args, rpcDriverClassName);
18
17
  return {
@@ -8,9 +8,9 @@ export declare class WiggleGetMultiRegionQuantitativeStats extends RpcMethodType
8
8
  serializeArguments(args: RenderArgs & {
9
9
  signal?: AbortSignal;
10
10
  statusCallback?: (arg: string) => void;
11
- }, rpcDriverClassName: string): Promise<{}>;
11
+ }, rpcDriverClassName: string): Promise<Record<string, unknown>>;
12
12
  execute(args: {
13
- adapterConfig: {};
13
+ adapterConfig: Record<string, unknown>;
14
14
  signal?: RemoteAbortSignal;
15
15
  sessionId: string;
16
16
  headers?: Record<string, string>;
@@ -13,7 +13,6 @@ class WiggleGetMultiRegionQuantitativeStats extends RpcMethodType_1.default {
13
13
  super(...arguments);
14
14
  this.name = 'WiggleGetMultiRegionQuantitativeStats';
15
15
  }
16
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
16
  async deserializeArguments(args, rpcDriverClassName) {
18
17
  const l = await super.deserializeArguments(args, rpcDriverClassName);
19
18
  return {
@@ -7,9 +7,9 @@ declare const WiggleRendering: (props: {
7
7
  bpPerPx: number;
8
8
  width: number;
9
9
  height: number;
10
- onMouseLeave: Function;
11
- onMouseMove: Function;
12
- onFeatureClick: Function;
13
10
  blockKey: string;
11
+ onMouseLeave?: (event: React.MouseEvent) => void;
12
+ onMouseMove?: (event: React.MouseEvent, arg?: string) => void;
13
+ onFeatureClick?: (event: React.MouseEvent, arg?: string) => void;
14
14
  }) => React.JSX.Element;
15
15
  export default WiggleRendering;
@@ -27,8 +27,8 @@ const mobx_react_1 = require("mobx-react");
27
27
  const react_1 = __importStar(require("react"));
28
28
  const ui_1 = require("@jbrowse/core/ui");
29
29
  const WiggleRendering = (0, mobx_react_1.observer)(function (props) {
30
- const { regions, features, bpPerPx, width, height, onMouseLeave = () => { }, onMouseMove = () => { }, onFeatureClick = () => { }, } = props;
31
- const [region] = regions;
30
+ const { regions, features, bpPerPx, width, height, onMouseLeave, onMouseMove, onFeatureClick, } = props;
31
+ const region = regions[0];
32
32
  const ref = (0, react_1.useRef)(null);
33
33
  function getFeatureUnderMouse(eventClientX) {
34
34
  // calculates feature under mouse
@@ -50,7 +50,7 @@ const WiggleRendering = (0, mobx_react_1.observer)(function (props) {
50
50
  }
51
51
  return featureUnderMouse;
52
52
  }
53
- return (react_1.default.createElement("div", { ref: ref, "data-testid": "wiggle-rendering-test", onMouseMove: event => { var _a; return onMouseMove(event, (_a = getFeatureUnderMouse(event.clientX)) === null || _a === void 0 ? void 0 : _a.id()); }, onClick: event => { var _a; return onFeatureClick(event, (_a = getFeatureUnderMouse(event.clientX)) === null || _a === void 0 ? void 0 : _a.id()); }, onMouseLeave: event => onMouseLeave(event), style: {
53
+ return (react_1.default.createElement("div", { ref: ref, "data-testid": "wiggle-rendering-test", onMouseMove: e => { var _a; return onMouseMove === null || onMouseMove === void 0 ? void 0 : onMouseMove(e, (_a = getFeatureUnderMouse(e.clientX)) === null || _a === void 0 ? void 0 : _a.id()); }, onClick: e => { var _a; return onFeatureClick === null || onFeatureClick === void 0 ? void 0 : onFeatureClick(e, (_a = getFeatureUnderMouse(e.clientX)) === null || _a === void 0 ? void 0 : _a.id()); }, onMouseLeave: e => onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(e), style: {
54
54
  overflow: 'visible',
55
55
  position: 'relative',
56
56
  height,
@@ -9,7 +9,7 @@ const fudgeFactor = 0.3;
9
9
  const clipHeight = 2;
10
10
  function drawDensity(ctx, props) {
11
11
  const { features, regions, bpPerPx, scaleOpts, height, config } = props;
12
- const [region] = regions;
12
+ const region = regions[0];
13
13
  const pivot = (0, configuration_1.readConfObject)(config, 'bicolorPivot');
14
14
  const pivotValue = (0, configuration_1.readConfObject)(config, 'bicolorPivotValue');
15
15
  const negColor = (0, configuration_1.readConfObject)(config, 'negColor');
@@ -26,8 +26,10 @@ function drawDensity(ctx, props) {
26
26
  const cb = color === '#f0f'
27
27
  ? (_, score) => scale(score)
28
28
  : (feature, score) => (0, configuration_1.readConfObject)(config, 'color', { feature, score });
29
- const [niceMin, niceMax] = scale2.domain();
30
- let prevLeftPx = -Infinity;
29
+ const domain = scale2.domain();
30
+ const niceMin = domain[0];
31
+ const niceMax = domain[1];
32
+ let prevLeftPx = Number.NEGATIVE_INFINITY;
31
33
  let hasClipping = false;
32
34
  const reducedFeatures = [];
33
35
  for (const feature of features.values()) {