@jbrowse/plugin-wiggle 2.7.0 → 2.7.2

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 (43) hide show
  1. package/dist/DensityRenderer/DensityRenderer.js +2 -2
  2. package/dist/LinePlotRenderer/LinePlotRenderer.js +2 -2
  3. package/dist/MultiDensityRenderer/MultiDensityRenderer.js +5 -8
  4. package/dist/MultiLineRenderer/MultiLineRenderer.js +5 -9
  5. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +2 -102
  6. package/dist/MultiLinearWiggleDisplay/components/SourcesGrid.d.ts +8 -0
  7. package/dist/MultiLinearWiggleDisplay/components/SourcesGrid.js +138 -0
  8. package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +5 -5
  9. package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +5 -9
  10. package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js +5 -8
  11. package/dist/Tooltip.js +4 -1
  12. package/dist/XYPlotRenderer/XYPlotRenderer.js +2 -2
  13. package/dist/drawDensity.d.ts +17 -0
  14. package/dist/drawDensity.js +66 -0
  15. package/dist/drawLine.d.ts +19 -0
  16. package/dist/drawLine.js +73 -0
  17. package/dist/drawXY.d.ts +19 -0
  18. package/dist/{drawxy.js → drawXY.js} +11 -147
  19. package/dist/util.d.ts +1 -0
  20. package/dist/util.js +17 -1
  21. package/esm/DensityRenderer/DensityRenderer.js +1 -1
  22. package/esm/LinePlotRenderer/LinePlotRenderer.js +1 -1
  23. package/esm/MultiDensityRenderer/MultiDensityRenderer.js +4 -7
  24. package/esm/MultiLineRenderer/MultiLineRenderer.js +4 -8
  25. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +2 -102
  26. package/esm/MultiLinearWiggleDisplay/components/SourcesGrid.d.ts +8 -0
  27. package/esm/MultiLinearWiggleDisplay/components/SourcesGrid.js +110 -0
  28. package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +4 -4
  29. package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +4 -8
  30. package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js +4 -7
  31. package/esm/Tooltip.js +5 -2
  32. package/esm/XYPlotRenderer/XYPlotRenderer.js +1 -1
  33. package/esm/drawDensity.d.ts +17 -0
  34. package/esm/drawDensity.js +62 -0
  35. package/esm/drawLine.d.ts +19 -0
  36. package/esm/drawLine.js +69 -0
  37. package/esm/drawXY.d.ts +19 -0
  38. package/esm/{drawxy.js → drawXY.js} +2 -136
  39. package/esm/util.d.ts +1 -0
  40. package/esm/util.js +15 -0
  41. package/package.json +2 -2
  42. package/dist/drawxy.d.ts +0 -49
  43. package/esm/drawxy.d.ts +0 -49
@@ -3,11 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const drawxy_1 = require("../drawxy");
6
+ const drawDensity_1 = require("../drawDensity");
7
7
  const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
8
8
  class DensityRenderer extends WiggleBaseRenderer_1.default {
9
9
  async draw(ctx, props) {
10
- return (0, drawxy_1.drawDensity)(ctx, props);
10
+ return (0, drawDensity_1.drawDensity)(ctx, props);
11
11
  }
12
12
  }
13
13
  exports.default = DensityRenderer;
@@ -5,10 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
7
7
  const util_1 = require("../util");
8
- const drawxy_1 = require("../drawxy");
8
+ const drawLine_1 = require("../drawLine");
9
9
  class LinePlotRenderer extends WiggleBaseRenderer_1.default {
10
10
  async draw(ctx, props) {
11
- return (0, drawxy_1.drawLine)(ctx, {
11
+ return (0, drawLine_1.drawLine)(ctx, {
12
12
  ...props,
13
13
  offset: util_1.YSCALEBAR_LABEL_OFFSET,
14
14
  colorCallback: () => 'grey',
@@ -5,23 +5,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const util_1 = require("@jbrowse/core/util");
7
7
  const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
8
- const drawxy_1 = require("../drawxy");
8
+ const drawDensity_1 = require("../drawDensity");
9
9
  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
13
  const [region] = regions;
14
- const groups = (0, util_1.groupBy)([...features.values()], f => f.get('source'));
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;
17
17
  let feats = [];
18
18
  ctx.save();
19
19
  sources.forEach(source => {
20
- const features = groups[source.name];
21
- if (!features) {
22
- return;
23
- }
24
- const { reducedFeatures } = (0, drawxy_1.drawDensity)(ctx, {
20
+ const features = groups[source.name] || [];
21
+ const { reducedFeatures } = (0, drawDensity_1.drawDensity)(ctx, {
25
22
  ...props,
26
23
  features,
27
24
  height,
@@ -32,7 +29,7 @@ class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
32
29
  ctx.lineTo(width, height);
33
30
  ctx.stroke();
34
31
  ctx.translate(0, height);
35
- feats = [...feats, ...reducedFeatures];
32
+ feats = feats.concat(reducedFeatures);
36
33
  });
37
34
  ctx.restore();
38
35
  return { reducedFeatures: feats };
@@ -4,25 +4,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const util_1 = require("@jbrowse/core/util");
7
- const drawxy_1 = require("../drawxy");
7
+ const drawLine_1 = require("../drawLine");
8
8
  const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
9
9
  class MultiLineRenderer extends WiggleBaseRenderer_1.default {
10
10
  // @ts-expect-error
11
11
  async draw(ctx, props) {
12
12
  const { sources, features } = props;
13
- const groups = (0, util_1.groupBy)([...features.values()], f => f.get('source'));
13
+ const groups = (0, util_1.groupBy)(features.values(), f => f.get('source'));
14
14
  let feats = [];
15
15
  sources.forEach(source => {
16
- const features = groups[source.name];
17
- if (!features) {
18
- return;
19
- }
20
- const { reducedFeatures } = (0, drawxy_1.drawLine)(ctx, {
16
+ const { reducedFeatures } = (0, drawLine_1.drawLine)(ctx, {
21
17
  ...props,
22
- features,
18
+ features: groups[source.name] || [],
23
19
  colorCallback: () => source.color || 'blue',
24
20
  });
25
- feats = [...feats, ...reducedFeatures];
21
+ feats = feats.concat(reducedFeatures);
26
22
  });
27
23
  return { reducedFeatures: feats };
28
24
  }
@@ -30,27 +30,14 @@ const react_1 = __importStar(require("react"));
30
30
  const material_1 = require("@mui/material");
31
31
  const mui_1 = require("tss-react/mui");
32
32
  const util_1 = require("@jbrowse/core/util");
33
- const x_data_grid_1 = require("@mui/x-data-grid");
34
33
  const clone_1 = __importDefault(require("clone"));
35
34
  // locals
36
35
  const DraggableDialog_1 = __importDefault(require("./DraggableDialog"));
37
- const ColorPicker_1 = __importStar(require("@jbrowse/core/ui/ColorPicker"));
38
- const util_2 = require("./util");
39
- // icons
40
- const KeyboardDoubleArrowUp_1 = __importDefault(require("@mui/icons-material/KeyboardDoubleArrowUp"));
41
- const KeyboardDoubleArrowDown_1 = __importDefault(require("@mui/icons-material/KeyboardDoubleArrowDown"));
42
- const KeyboardArrowDown_1 = __importDefault(require("@mui/icons-material/KeyboardArrowDown"));
43
- const KeyboardArrowUp_1 = __importDefault(require("@mui/icons-material/KeyboardArrowUp"));
44
- const UriLink_1 = __importDefault(require("@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/UriLink"));
36
+ const SourcesGrid_1 = __importDefault(require("./SourcesGrid"));
45
37
  const useStyles = (0, mui_1.makeStyles)()({
46
38
  content: {
47
39
  minWidth: 800,
48
40
  },
49
- cell: {
50
- whiteSpace: 'nowrap',
51
- overflow: 'hidden',
52
- textOverflow: 'ellipsis',
53
- },
54
41
  });
55
42
  function SetColorDialog({ model, handleClose, }) {
56
43
  const { classes } = useStyles();
@@ -71,7 +58,7 @@ function SetColorDialog({ model, handleClose, }) {
71
58
  react_1.default.createElement("li", null, "Changes are applied when you hit Submit"),
72
59
  react_1.default.createElement("li", null, "You can click and drag the dialog box to move it on the screen"),
73
60
  react_1.default.createElement("li", null, "Columns in the table can be hidden using a vertical '...' menu on the right side of each column")))) : null,
74
- react_1.default.createElement(SourcesGrid, { rows: currLayout, onChange: setCurrLayout, showTips: showTips })),
61
+ react_1.default.createElement(SourcesGrid_1.default, { rows: currLayout, onChange: setCurrLayout, showTips: showTips })),
75
62
  react_1.default.createElement(material_1.DialogActions, null,
76
63
  react_1.default.createElement(material_1.Button, { variant: "contained", type: "submit", color: "inherit", onClick: () => {
77
64
  model.clearLayout();
@@ -87,90 +74,3 @@ function SetColorDialog({ model, handleClose, }) {
87
74
  } }, "Submit"))));
88
75
  }
89
76
  exports.default = SetColorDialog;
90
- function SourcesGrid({ rows, onChange, showTips, }) {
91
- const { classes } = useStyles();
92
- const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
93
- const [selected, setSelected] = (0, react_1.useState)([]);
94
- // @ts-expect-error
95
- const { name: _name, color: _color, baseUri: _baseUri, ...rest } = rows[0];
96
- const [widgetColor, setWidgetColor] = (0, react_1.useState)('blue');
97
- const [currSort, setCurrSort] = (0, react_1.useState)({
98
- idx: 0,
99
- field: null,
100
- });
101
- return (react_1.default.createElement("div", null,
102
- react_1.default.createElement(material_1.Button, { disabled: !selected.length, onClick: event => setAnchorEl(event.currentTarget) }, "Change color of selected items"),
103
- react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveUp)([...rows], selected)), disabled: !selected.length },
104
- react_1.default.createElement(KeyboardArrowUp_1.default, null),
105
- showTips ? 'Move selected items up' : null),
106
- react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveDown)([...rows], selected)), disabled: !selected.length },
107
- react_1.default.createElement(KeyboardArrowDown_1.default, null),
108
- showTips ? 'Move selected items down' : null),
109
- react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveUp)([...rows], selected, rows.length)), disabled: !selected.length },
110
- react_1.default.createElement(KeyboardDoubleArrowUp_1.default, null),
111
- showTips ? 'Move selected items to top' : null),
112
- react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveDown)([...rows], selected, rows.length)), disabled: !selected.length },
113
- react_1.default.createElement(KeyboardDoubleArrowDown_1.default, null),
114
- showTips ? 'Move selected items to bottom' : null),
115
- react_1.default.createElement(ColorPicker_1.ColorPopover, { anchorEl: anchorEl, color: widgetColor, onChange: c => {
116
- setWidgetColor(c);
117
- selected.forEach(id => {
118
- const elt = rows.find(f => f.name === id);
119
- if (elt) {
120
- elt.color = c;
121
- }
122
- });
123
- onChange([...rows]);
124
- }, onClose: () => setAnchorEl(null) }),
125
- react_1.default.createElement("div", { style: { height: 400, width: '100%' } },
126
- 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: [
127
- {
128
- field: 'color',
129
- headerName: 'Color',
130
- renderCell: params => {
131
- const { value, id } = params;
132
- return (react_1.default.createElement(ColorPicker_1.default, { color: value || 'blue', onChange: c => {
133
- const elt = rows.find(f => f.name === id);
134
- if (elt) {
135
- elt.color = c;
136
- }
137
- onChange([...rows]);
138
- } }));
139
- },
140
- },
141
- {
142
- field: 'name',
143
- sortingOrder: [null],
144
- headerName: 'Name',
145
- width: (0, util_1.measureGridWidth)(rows.map(r => r.name)),
146
- },
147
- ...Object.keys(rest).map(val => ({
148
- field: val,
149
- sortingOrder: [null],
150
- renderCell: (params) => {
151
- const { value } = params;
152
- return (react_1.default.createElement("div", { className: classes.cell }, (0, util_1.isUriLocation)(value) ? (react_1.default.createElement(UriLink_1.default, { value: value })) : (react_1.default.createElement(react_1.default.Fragment, null, (0, util_1.getStr)(value)))));
153
- },
154
- // @ts-ignore
155
- width: (0, util_1.measureGridWidth)(rows.map(r => r[val])),
156
- })),
157
- ], sortModel: [
158
- /* we control the sort as a controlled component using onSortModelChange */
159
- ], onSortModelChange: args => {
160
- const sort = args[0];
161
- const idx = (currSort.idx + 1) % 2;
162
- const field = (sort === null || sort === void 0 ? void 0 : sort.field) || currSort.field;
163
- setCurrSort({ idx, field });
164
- onChange(field
165
- ? [...rows].sort((a, b) => {
166
- // @ts-expect-error
167
- const aa = (0, util_1.getStr)(a[field]);
168
- // @ts-expect-error
169
- const bb = (0, util_1.getStr)(b[field]);
170
- return idx === 1
171
- ? aa.localeCompare(bb)
172
- : bb.localeCompare(aa);
173
- })
174
- : rows);
175
- } }))));
176
- }
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { Source } from '../../util';
3
+ declare function SourcesGrid({ rows, onChange, showTips, }: {
4
+ rows: Source[];
5
+ onChange: (arg: Source[]) => void;
6
+ showTips: boolean;
7
+ }): React.JSX.Element;
8
+ export default SourcesGrid;
@@ -0,0 +1,138 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const react_1 = __importStar(require("react"));
30
+ const material_1 = require("@mui/material");
31
+ const util_1 = require("@jbrowse/core/util");
32
+ const x_data_grid_1 = require("@mui/x-data-grid");
33
+ const mui_1 = require("tss-react/mui");
34
+ // locals
35
+ const ColorPicker_1 = __importStar(require("@jbrowse/core/ui/ColorPicker"));
36
+ const util_2 = require("./util");
37
+ // icons
38
+ const KeyboardDoubleArrowUp_1 = __importDefault(require("@mui/icons-material/KeyboardDoubleArrowUp"));
39
+ const KeyboardDoubleArrowDown_1 = __importDefault(require("@mui/icons-material/KeyboardDoubleArrowDown"));
40
+ const KeyboardArrowDown_1 = __importDefault(require("@mui/icons-material/KeyboardArrowDown"));
41
+ const KeyboardArrowUp_1 = __importDefault(require("@mui/icons-material/KeyboardArrowUp"));
42
+ const ui_1 = require("@jbrowse/core/ui");
43
+ const useStyles = (0, mui_1.makeStyles)()({
44
+ cell: {
45
+ whiteSpace: 'nowrap',
46
+ overflow: 'hidden',
47
+ textOverflow: 'ellipsis',
48
+ },
49
+ });
50
+ function SourcesGrid({ rows, onChange, showTips, }) {
51
+ const { classes } = useStyles();
52
+ const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
53
+ const [selected, setSelected] = (0, react_1.useState)([]);
54
+ // @ts-expect-error
55
+ const { name: _name, color: _color, baseUri: _baseUri, ...rest } = rows[0];
56
+ const [widgetColor, setWidgetColor] = (0, react_1.useState)('blue');
57
+ const [currSort, setCurrSort] = (0, react_1.useState)({
58
+ idx: 0,
59
+ field: null,
60
+ });
61
+ return (react_1.default.createElement("div", null,
62
+ react_1.default.createElement(material_1.Button, { disabled: !selected.length, onClick: event => setAnchorEl(event.currentTarget) }, "Change color of selected items"),
63
+ react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveUp)([...rows], selected)), disabled: !selected.length },
64
+ react_1.default.createElement(KeyboardArrowUp_1.default, null),
65
+ showTips ? 'Move selected items up' : null),
66
+ react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveDown)([...rows], selected)), disabled: !selected.length },
67
+ react_1.default.createElement(KeyboardArrowDown_1.default, null),
68
+ showTips ? 'Move selected items down' : null),
69
+ react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveUp)([...rows], selected, rows.length)), disabled: !selected.length },
70
+ react_1.default.createElement(KeyboardDoubleArrowUp_1.default, null),
71
+ showTips ? 'Move selected items to top' : null),
72
+ react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveDown)([...rows], selected, rows.length)), disabled: !selected.length },
73
+ react_1.default.createElement(KeyboardDoubleArrowDown_1.default, null),
74
+ showTips ? 'Move selected items to bottom' : null),
75
+ react_1.default.createElement(ColorPicker_1.ColorPopover, { anchorEl: anchorEl, color: widgetColor, onChange: c => {
76
+ setWidgetColor(c);
77
+ selected.forEach(id => {
78
+ const elt = rows.find(f => f.name === id);
79
+ if (elt) {
80
+ elt.color = c;
81
+ }
82
+ });
83
+ onChange([...rows]);
84
+ }, onClose: () => setAnchorEl(null) }),
85
+ react_1.default.createElement("div", { style: { height: 400, width: '100%' } },
86
+ 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: [
87
+ {
88
+ field: 'color',
89
+ headerName: 'Color',
90
+ renderCell: params => {
91
+ const { value, id } = params;
92
+ return (react_1.default.createElement(ColorPicker_1.default, { color: value || 'blue', onChange: c => {
93
+ const elt = rows.find(f => f.name === id);
94
+ if (elt) {
95
+ elt.color = c;
96
+ }
97
+ onChange([...rows]);
98
+ } }));
99
+ },
100
+ },
101
+ {
102
+ field: 'name',
103
+ sortingOrder: [null],
104
+ headerName: 'Name',
105
+ width: (0, util_1.measureGridWidth)(rows.map(r => r.name)),
106
+ },
107
+ ...Object.keys(rest).map(val => ({
108
+ field: val,
109
+ sortingOrder: [null],
110
+ renderCell: (params) => {
111
+ const { value } = params;
112
+ return (react_1.default.createElement("div", { className: classes.cell },
113
+ react_1.default.createElement(ui_1.SanitizedHTML, { html: (0, util_1.getStr)(value) })));
114
+ },
115
+ // @ts-ignore
116
+ width: (0, util_1.measureGridWidth)(rows.map(r => r[val])),
117
+ })),
118
+ ], sortModel: [
119
+ /* we control the sort as a controlled component using onSortModelChange */
120
+ ], onSortModelChange: args => {
121
+ const sort = args[0];
122
+ const idx = (currSort.idx + 1) % 2;
123
+ const field = (sort === null || sort === void 0 ? void 0 : sort.field) || currSort.field;
124
+ setCurrSort({ idx, field });
125
+ onChange(field
126
+ ? [...rows].sort((a, b) => {
127
+ // @ts-expect-error
128
+ const aa = (0, util_1.getStr)(a[field]);
129
+ // @ts-expect-error
130
+ const bb = (0, util_1.getStr)(b[field]);
131
+ return idx === 1
132
+ ? aa.localeCompare(bb)
133
+ : bb.localeCompare(aa);
134
+ })
135
+ : rows);
136
+ } }))));
137
+ }
138
+ exports.default = SourcesGrid;
@@ -4,22 +4,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const util_1 = require("@jbrowse/core/util");
7
- const drawxy_1 = require("../drawxy");
7
+ const drawLine_1 = require("../drawLine");
8
8
  const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
9
9
  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
13
  const [region] = regions;
14
- const groups = (0, util_1.groupBy)([...features.values()], f => f.get('source'));
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;
17
17
  let feats = [];
18
18
  ctx.save();
19
19
  sources.forEach(source => {
20
- const { reducedFeatures } = (0, drawxy_1.drawLine)(ctx, {
20
+ const { reducedFeatures } = (0, drawLine_1.drawLine)(ctx, {
21
21
  ...props,
22
- features: groups[source.name],
22
+ features: groups[source.name] || [],
23
23
  height,
24
24
  colorCallback: () => source.color || 'blue',
25
25
  });
@@ -29,7 +29,7 @@ class MultiRowLineRenderer extends WiggleBaseRenderer_1.default {
29
29
  ctx.lineTo(width, height);
30
30
  ctx.stroke();
31
31
  ctx.translate(0, height);
32
- feats = [...feats, ...reducedFeatures];
32
+ feats = feats.concat(reducedFeatures);
33
33
  });
34
34
  ctx.restore();
35
35
  return { reducedFeatures: feats };
@@ -4,26 +4,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const util_1 = require("@jbrowse/core/util");
7
- const drawxy_1 = require("../drawxy");
7
+ const drawXY_1 = require("../drawXY");
8
8
  const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
9
9
  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
13
  const [region] = regions;
14
- const groups = (0, util_1.groupBy)([...features.values()], f => f.get('source'));
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;
17
17
  let feats = [];
18
18
  ctx.save();
19
19
  sources.forEach(source => {
20
- const features = groups[source.name];
21
- if (!features) {
22
- return;
23
- }
24
- const { reducedFeatures } = (0, drawxy_1.drawXY)(ctx, {
20
+ const { reducedFeatures } = (0, drawXY_1.drawXY)(ctx, {
25
21
  ...props,
26
- features,
22
+ features: groups[source.name] || [],
27
23
  height,
28
24
  colorCallback: () => source.color || 'blue',
29
25
  });
@@ -33,7 +29,7 @@ class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
33
29
  ctx.lineTo(width, height);
34
30
  ctx.stroke();
35
31
  ctx.translate(0, height);
36
- feats = [...feats, ...reducedFeatures];
32
+ feats = feats.concat(reducedFeatures);
37
33
  });
38
34
  ctx.restore();
39
35
  return { reducedFeatures: feats };
@@ -4,27 +4,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const util_1 = require("@jbrowse/core/util");
7
- const drawxy_1 = require("../drawxy");
7
+ const drawXY_1 = require("../drawXY");
8
8
  const util_2 = require("../util");
9
9
  const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
10
10
  class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
11
11
  // @ts-expect-error
12
12
  async draw(ctx, props) {
13
13
  const { sources, features } = props;
14
- const groups = (0, util_1.groupBy)([...features.values()], f => f.get('source'));
14
+ const groups = (0, util_1.groupBy)(features.values(), f => f.get('source'));
15
15
  let feats = [];
16
16
  for (const source of sources) {
17
- const features = groups[source.name];
18
- if (!features) {
19
- continue;
20
- }
21
- const { reducedFeatures } = (0, drawxy_1.drawXY)(ctx, {
17
+ const features = groups[source.name] || [];
18
+ const { reducedFeatures } = (0, drawXY_1.drawXY)(ctx, {
22
19
  ...props,
23
20
  features,
24
21
  offset: util_2.YSCALEBAR_LABEL_OFFSET,
25
22
  colorCallback: () => source.color || 'blue',
26
23
  });
27
- feats = [...feats, ...reducedFeatures];
24
+ feats = feats.concat(reducedFeatures);
28
25
  }
29
26
  return { reducedFeatures: feats };
30
27
  }
package/dist/Tooltip.js CHANGED
@@ -58,6 +58,8 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
58
58
  },
59
59
  }));
60
60
  const Tooltip = (0, mobx_react_1.observer)(function Tooltip({ model, height, clientMouseCoord, offsetMouseCoord, clientRect, TooltipContents, useClientY, }) {
61
+ var _a, _b;
62
+ const theme = (0, material_1.useTheme)();
61
63
  const { featureUnderMouse } = model;
62
64
  const [width, setWidth] = (0, react_1.useState)(0);
63
65
  const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
@@ -81,8 +83,9 @@ const Tooltip = (0, mobx_react_1.observer)(function Tooltip({ model, height, cli
81
83
  },
82
84
  }), [clientRect === null || clientRect === void 0 ? void 0 : clientRect.top, clientMouseCoord, width, useClientY]);
83
85
  const { styles, attributes } = (0, react_popper_1.usePopper)(virtElement, anchorEl);
86
+ const popperTheme = (_a = theme === null || theme === void 0 ? void 0 : theme.components) === null || _a === void 0 ? void 0 : _a.MuiPopper;
84
87
  return featureUnderMouse ? (react_1.default.createElement(react_1.default.Fragment, null,
85
- react_1.default.createElement(material_1.Portal, null,
88
+ 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 },
86
89
  react_1.default.createElement("div", { ref: setAnchorEl, className: classes.tooltip,
87
90
  // zIndex needed to go over widget drawer
88
91
  style: { ...styles.popper, zIndex: 100000 }, ...attributes.popper },
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const configuration_1 = require("@jbrowse/core/configuration");
7
- const drawxy_1 = require("../drawxy");
7
+ const drawXY_1 = require("../drawXY");
8
8
  const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
9
9
  const util_1 = require("../util");
10
10
  class XYPlotRenderer extends WiggleBaseRenderer_1.default {
@@ -16,7 +16,7 @@ class XYPlotRenderer extends WiggleBaseRenderer_1.default {
16
16
  const pivotValue = (0, configuration_1.readConfObject)(config, 'bicolorPivotValue');
17
17
  const negColor = (0, configuration_1.readConfObject)(config, 'negColor');
18
18
  const posColor = (0, configuration_1.readConfObject)(config, 'posColor');
19
- return (0, drawxy_1.drawXY)(ctx, {
19
+ return (0, drawXY_1.drawXY)(ctx, {
20
20
  ...props,
21
21
  colorCallback: (0, configuration_1.readConfObject)(config, 'color') === '#f0f'
22
22
  ? (_, score) => score < pivotValue ? negColor : posColor
@@ -0,0 +1,17 @@
1
+ import { AnyConfigurationModel } from '@jbrowse/core/configuration';
2
+ import { Feature, Region } from '@jbrowse/core/util';
3
+ import { ScaleOpts } from './util';
4
+ export declare function drawDensity(ctx: CanvasRenderingContext2D, props: {
5
+ features: Map<string, Feature> | Feature[];
6
+ regions: Region[];
7
+ bpPerPx: number;
8
+ scaleOpts: ScaleOpts;
9
+ height: number;
10
+ ticks: {
11
+ values: number[];
12
+ };
13
+ displayCrossHatches: boolean;
14
+ config: AnyConfigurationModel;
15
+ }): {
16
+ reducedFeatures: Feature[];
17
+ };
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.drawDensity = void 0;
4
+ const configuration_1 = require("@jbrowse/core/configuration");
5
+ const util_1 = require("@jbrowse/core/util");
6
+ // locals
7
+ const util_2 = require("./util");
8
+ const fudgeFactor = 0.3;
9
+ const clipHeight = 2;
10
+ function drawDensity(ctx, props) {
11
+ const { features, regions, bpPerPx, scaleOpts, height, config } = props;
12
+ const [region] = regions;
13
+ const pivot = (0, configuration_1.readConfObject)(config, 'bicolorPivot');
14
+ const pivotValue = (0, configuration_1.readConfObject)(config, 'bicolorPivotValue');
15
+ const negColor = (0, configuration_1.readConfObject)(config, 'negColor');
16
+ const posColor = (0, configuration_1.readConfObject)(config, 'posColor');
17
+ const color = (0, configuration_1.readConfObject)(config, 'color');
18
+ const clipColor = (0, configuration_1.readConfObject)(config, 'clipColor');
19
+ const crossing = pivot !== 'none' && scaleOpts.scaleType !== 'log';
20
+ const scale = (0, util_2.getScale)({
21
+ ...scaleOpts,
22
+ pivotValue: crossing ? pivotValue : undefined,
23
+ range: crossing ? [negColor, 'white', posColor] : ['white', posColor],
24
+ });
25
+ const scale2 = (0, util_2.getScale)({ ...scaleOpts, range: [0, height] });
26
+ const cb = color === '#f0f'
27
+ ? (_, score) => scale(score)
28
+ : (feature, score) => (0, configuration_1.readConfObject)(config, 'color', { feature, score });
29
+ const [niceMin, niceMax] = scale2.domain();
30
+ let prevLeftPx = -Infinity;
31
+ let hasClipping = false;
32
+ const reducedFeatures = [];
33
+ for (const feature of features.values()) {
34
+ const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
35
+ // create reduced features, avoiding multiple features per px
36
+ if (Math.floor(leftPx) !== Math.floor(prevLeftPx)) {
37
+ reducedFeatures.push(feature);
38
+ prevLeftPx = leftPx;
39
+ }
40
+ const score = feature.get('score');
41
+ hasClipping = hasClipping || score > niceMax || score < niceMin;
42
+ const w = rightPx - leftPx + fudgeFactor;
43
+ ctx.fillStyle = cb(feature, score);
44
+ ctx.fillRect(leftPx, 0, w, height);
45
+ }
46
+ // second pass: draw clipping
47
+ // avoid persisting the red fillstyle with save/restore
48
+ ctx.save();
49
+ if (hasClipping) {
50
+ ctx.fillStyle = clipColor;
51
+ for (const feature of features.values()) {
52
+ const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
53
+ const w = rightPx - leftPx + fudgeFactor;
54
+ const score = feature.get('score');
55
+ if (score > niceMax) {
56
+ (0, util_2.fillRectCtx)(leftPx, 0, w, clipHeight, ctx);
57
+ }
58
+ else if (score < niceMin && scaleOpts.scaleType !== 'log') {
59
+ (0, util_2.fillRectCtx)(leftPx, 0, w, clipHeight, ctx);
60
+ }
61
+ }
62
+ }
63
+ ctx.restore();
64
+ return { reducedFeatures };
65
+ }
66
+ exports.drawDensity = drawDensity;
@@ -0,0 +1,19 @@
1
+ import { AnyConfigurationModel } from '@jbrowse/core/configuration';
2
+ import { Feature, Region } from '@jbrowse/core/util';
3
+ import { ScaleOpts } from './util';
4
+ export declare function drawLine(ctx: CanvasRenderingContext2D, props: {
5
+ features: Map<string, Feature> | Feature[];
6
+ regions: Region[];
7
+ bpPerPx: number;
8
+ scaleOpts: ScaleOpts;
9
+ height: number;
10
+ ticks: {
11
+ values: number[];
12
+ };
13
+ displayCrossHatches: boolean;
14
+ colorCallback: (f: Feature, score: number) => string;
15
+ config: AnyConfigurationModel;
16
+ offset?: number;
17
+ }): {
18
+ reducedFeatures: Feature[];
19
+ };