@jbrowse/plugin-wiggle 2.6.2 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/CreateMultiWiggleExtension/index.js +14 -11
  2. package/dist/LinearWiggleDisplay/components/SetColorDialog.d.ts +6 -7
  3. package/dist/LinearWiggleDisplay/components/SetColorDialog.js +3 -3
  4. package/dist/LinearWiggleDisplay/components/Tooltip.js +1 -1
  5. package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +0 -1
  6. package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.js +0 -3
  7. package/dist/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
  8. package/dist/MultiLinearWiggleDisplay/components/ColorLegend.d.ts +9 -0
  9. package/dist/MultiLinearWiggleDisplay/components/ColorLegend.js +28 -0
  10. package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +3 -4
  11. package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.js +3 -3
  12. package/dist/MultiLinearWiggleDisplay/components/RectBg.d.ts +9 -0
  13. package/dist/MultiLinearWiggleDisplay/components/RectBg.js +11 -0
  14. package/dist/MultiLinearWiggleDisplay/components/ScoreLegend.d.ts +6 -0
  15. package/dist/MultiLinearWiggleDisplay/components/ScoreLegend.js +22 -0
  16. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +7 -1
  17. package/dist/MultiLinearWiggleDisplay/components/Tooltip.d.ts +3 -2
  18. package/dist/MultiLinearWiggleDisplay/components/Tooltip.js +1 -1
  19. package/dist/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -8
  20. package/dist/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.js +4 -92
  21. package/dist/MultiLinearWiggleDisplay/components/YScaleBars.d.ts +8 -0
  22. package/dist/MultiLinearWiggleDisplay/components/YScaleBars.js +53 -0
  23. package/dist/MultiLinearWiggleDisplay/components/util.d.ts +2 -0
  24. package/dist/MultiLinearWiggleDisplay/components/util.js +16 -5
  25. package/dist/MultiLinearWiggleDisplay/models/renderSvg.js +2 -2
  26. package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
  27. package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -26
  28. package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +16 -12
  29. package/dist/MultiWiggleRendering.d.ts +3 -4
  30. package/dist/MultiWiggleRendering.js +7 -5
  31. package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js +0 -25
  32. package/dist/Tooltip.d.ts +5 -6
  33. package/dist/Tooltip.js +3 -3
  34. package/dist/WiggleRendering.d.ts +3 -4
  35. package/dist/WiggleRendering.js +3 -3
  36. package/dist/XYPlotRenderer/XYPlotRenderer.js +0 -25
  37. package/dist/drawxy.d.ts +0 -1
  38. package/dist/drawxy.js +17 -6
  39. package/dist/shared/YScaleBar.d.ts +2 -2
  40. package/dist/shared/YScaleBar.js +2 -1
  41. package/dist/shared/modelShared.d.ts +4 -1
  42. package/esm/CreateMultiWiggleExtension/index.js +14 -11
  43. package/esm/LinearWiggleDisplay/components/SetColorDialog.d.ts +6 -7
  44. package/esm/LinearWiggleDisplay/components/SetColorDialog.js +3 -3
  45. package/esm/LinearWiggleDisplay/components/Tooltip.js +1 -1
  46. package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +0 -1
  47. package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.js +0 -1
  48. package/esm/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
  49. package/esm/MultiLinearWiggleDisplay/components/ColorLegend.d.ts +9 -0
  50. package/esm/MultiLinearWiggleDisplay/components/ColorLegend.js +23 -0
  51. package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +3 -4
  52. package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.js +3 -3
  53. package/esm/MultiLinearWiggleDisplay/components/RectBg.d.ts +9 -0
  54. package/esm/MultiLinearWiggleDisplay/components/RectBg.js +6 -0
  55. package/esm/MultiLinearWiggleDisplay/components/ScoreLegend.d.ts +6 -0
  56. package/esm/MultiLinearWiggleDisplay/components/ScoreLegend.js +17 -0
  57. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +7 -1
  58. package/esm/MultiLinearWiggleDisplay/components/Tooltip.d.ts +3 -2
  59. package/esm/MultiLinearWiggleDisplay/components/Tooltip.js +1 -1
  60. package/esm/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -8
  61. package/esm/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.js +5 -91
  62. package/esm/MultiLinearWiggleDisplay/components/YScaleBars.d.ts +8 -0
  63. package/esm/MultiLinearWiggleDisplay/components/YScaleBars.js +47 -0
  64. package/esm/MultiLinearWiggleDisplay/components/util.d.ts +2 -0
  65. package/esm/MultiLinearWiggleDisplay/components/util.js +14 -4
  66. package/esm/MultiLinearWiggleDisplay/models/renderSvg.js +2 -2
  67. package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
  68. package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -3
  69. package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +17 -13
  70. package/esm/MultiWiggleRendering.d.ts +3 -4
  71. package/esm/MultiWiggleRendering.js +7 -5
  72. package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js +0 -2
  73. package/esm/Tooltip.d.ts +5 -6
  74. package/esm/Tooltip.js +3 -3
  75. package/esm/WiggleRendering.d.ts +3 -4
  76. package/esm/WiggleRendering.js +3 -3
  77. package/esm/XYPlotRenderer/XYPlotRenderer.js +0 -2
  78. package/esm/drawxy.d.ts +0 -1
  79. package/esm/drawxy.js +17 -6
  80. package/esm/shared/YScaleBar.d.ts +2 -2
  81. package/esm/shared/YScaleBar.js +2 -1
  82. package/esm/shared/modelShared.d.ts +4 -1
  83. package/package.json +3 -4
@@ -48,17 +48,20 @@ function default_1(pm) {
48
48
  ];
49
49
  const now = +Date.now();
50
50
  const trackId = `multitrack-${now}-sessionTrack`;
51
- (0, util_1.getSession)(model).addTrackConf({
52
- type: 'MultiQuantitativeTrack',
53
- trackId,
54
- name: arg.name,
55
- assemblyNames,
56
- adapter: {
57
- type: 'MultiWiggleAdapter',
58
- subadapters,
59
- },
60
- });
61
- model.view.showTrack(trackId);
51
+ const session = (0, util_1.getSession)(model);
52
+ if ((0, util_1.isSessionWithAddTracks)(session)) {
53
+ session.addTrackConf({
54
+ type: 'MultiQuantitativeTrack',
55
+ trackId,
56
+ name: arg.name,
57
+ assemblyNames,
58
+ adapter: {
59
+ type: 'MultiWiggleAdapter',
60
+ subadapters,
61
+ },
62
+ });
63
+ model.view.showTrack(trackId);
64
+ }
62
65
  }
63
66
  (0, util_1.getSession)(model).queueDialog(handleClose => [
64
67
  ConfirmDialog,
@@ -1,14 +1,13 @@
1
1
  import React from 'react';
2
- declare function SetColorDialog({ model, handleClose, }: {
2
+ declare const SetColorDialog: ({ model, handleClose, }: {
3
3
  model: {
4
- color?: string;
5
- posColor?: string;
6
- negColor?: string;
4
+ color?: string | undefined;
5
+ posColor?: string | undefined;
6
+ negColor?: string | undefined;
7
7
  setColor: (arg?: string) => void;
8
8
  setPosColor: (arg?: string) => void;
9
9
  setNegColor: (arg?: string) => void;
10
10
  };
11
11
  handleClose: () => void;
12
- }): React.JSX.Element;
13
- declare const _default: typeof SetColorDialog;
14
- export default _default;
12
+ }) => React.JSX.Element;
13
+ export default SetColorDialog;
@@ -28,7 +28,7 @@ const mobx_react_1 = require("mobx-react");
28
28
  const material_1 = require("@mui/material");
29
29
  const ui_1 = require("@jbrowse/core/ui");
30
30
  const ColorPicker_1 = require("@jbrowse/core/ui/ColorPicker");
31
- function SetColorDialog({ model, handleClose, }) {
31
+ const SetColorDialog = (0, mobx_react_1.observer)(function SetColorDialog({ model, handleClose, }) {
32
32
  const [posneg, setPosNeg] = (0, react_1.useState)(false);
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,
@@ -55,5 +55,5 @@ function SetColorDialog({ model, handleClose, }) {
55
55
  model.setColor(undefined);
56
56
  }, color: "secondary", variant: "contained" }, "Restore default"),
57
57
  react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", type: "submit", onClick: () => handleClose() }, "Submit"))));
58
- }
59
- exports.default = (0, mobx_react_1.observer)(SetColorDialog);
58
+ });
59
+ exports.default = SetColorDialog;
@@ -10,7 +10,7 @@ const mobx_react_1 = require("mobx-react");
10
10
  const Tooltip_1 = __importDefault(require("../../Tooltip"));
11
11
  const util_1 = require("../../util");
12
12
  const en = (n) => n.toLocaleString('en-US');
13
- const TooltipContents = react_1.default.forwardRef(function ({ feature }, ref) {
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
16
  const name = feature.get('refName');
@@ -4,4 +4,3 @@ declare const LinearWiggleDisplay: (props: {
4
4
  model: WiggleDisplayModel;
5
5
  }) => React.JSX.Element;
6
6
  export default LinearWiggleDisplay;
7
- export { default as YScaleBar } from '../../shared/YScaleBar';
@@ -3,7 +3,6 @@ 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
- exports.YScaleBar = void 0;
7
6
  const react_1 = __importDefault(require("react"));
8
7
  const mobx_react_1 = require("mobx-react");
9
8
  const util_1 = require("@jbrowse/core/util");
@@ -31,5 +30,3 @@ const LinearWiggleDisplay = (0, mobx_react_1.observer)((props) => {
31
30
  react_1.default.createElement(YScaleBar_1.default, { model: model }))) : null));
32
31
  });
33
32
  exports.default = LinearWiggleDisplay;
34
- var YScaleBar_2 = require("../../shared/YScaleBar");
35
- Object.defineProperty(exports, "YScaleBar", { enumerable: true, get: function () { return __importDefault(YScaleBar_2).default; } });
@@ -12,7 +12,7 @@ class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
12
12
  const { bpPerPx, sources, regions, features } = props;
13
13
  const [region] = regions;
14
14
  const groups = (0, util_1.groupBy)([...features.values()], f => f.get('source'));
15
- const height = props.height / Object.keys(groups).length;
15
+ const height = props.height / sources.length;
16
16
  const width = (region.end - region.start) / bpPerPx;
17
17
  let feats = [];
18
18
  ctx.save();
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { WiggleDisplayModel } from '../models/model';
3
+ declare const ColorLegend: ({ model, rowHeight, labelWidth, exportSVG, }: {
4
+ model: WiggleDisplayModel;
5
+ rowHeight: number;
6
+ labelWidth: number;
7
+ exportSVG?: boolean | undefined;
8
+ }) => React.JSX.Element | null;
9
+ export default ColorLegend;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const mobx_react_1 = require("mobx-react");
8
+ const RectBg_1 = __importDefault(require("./RectBg"));
9
+ const ColorLegend = (0, mobx_react_1.observer)(function ({ model, rowHeight, labelWidth, exportSVG, }) {
10
+ const { needsCustomLegend, needsScalebar, needsFullHeightScalebar, rowHeightTooSmallForScalebar, renderColorBoxes, sources, } = model;
11
+ const svgFontSize = Math.min(rowHeight, 12);
12
+ const canDisplayLabel = rowHeight > 11;
13
+ const colorBoxWidth = renderColorBoxes ? 15 : 0;
14
+ const legendWidth = labelWidth + colorBoxWidth + 5;
15
+ const svgOffset = exportSVG ? 10 : 0;
16
+ const extraOffset = svgOffset || (needsScalebar && !rowHeightTooSmallForScalebar ? 50 : 0);
17
+ return sources ? (react_1.default.createElement(react_1.default.Fragment, null,
18
+ /* 0.25 for hanging letters like g */
19
+ needsFullHeightScalebar ? (react_1.default.createElement(RectBg_1.default, { y: 0, x: extraOffset, width: legendWidth, height: (sources.length + 0.25) * rowHeight })) : null,
20
+ sources.map((source, idx) => {
21
+ const boxHeight = Math.min(20, rowHeight);
22
+ return (react_1.default.createElement(react_1.default.Fragment, { key: `${source.name}-${idx}` },
23
+ needsFullHeightScalebar ? null : (react_1.default.createElement(RectBg_1.default, { y: idx * rowHeight + 1, x: extraOffset, width: legendWidth, height: boxHeight })),
24
+ source.color ? (react_1.default.createElement(RectBg_1.default, { y: idx * rowHeight + 1, x: extraOffset, width: colorBoxWidth, height: needsCustomLegend ? rowHeight : boxHeight, color: source.color })) : null,
25
+ canDisplayLabel ? (react_1.default.createElement("text", { y: idx * rowHeight + 13, x: extraOffset + colorBoxWidth + 2, fontSize: svgFontSize }, source.name)) : null));
26
+ }))) : null;
27
+ });
28
+ exports.default = ColorLegend;
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { DialogProps } from '@mui/material';
3
- declare function DraggableDialog(props: DialogProps & {
3
+ declare const DraggableDialog: (props: DialogProps & {
4
4
  title: string;
5
- }): React.JSX.Element;
6
- declare const _default: typeof DraggableDialog;
7
- export default _default;
5
+ }) => React.JSX.Element;
6
+ export default DraggableDialog;
@@ -23,7 +23,7 @@ function PaperComponent(props) {
23
23
  return (react_1.default.createElement(react_draggable_1.default, { handle: "#draggable-dialog-title", cancel: '[class*="MuiDialogContent-root"]' },
24
24
  react_1.default.createElement(material_1.Paper, { ...props })));
25
25
  }
26
- function DraggableDialog(props) {
26
+ const DraggableDialog = (0, mobx_react_1.observer)(function DraggableDialog(props) {
27
27
  const { classes } = useStyles();
28
28
  const { title, children, onClose } = props;
29
29
  return (react_1.default.createElement(material_1.Dialog, { ...props, PaperComponent: PaperComponent, "aria-labelledby": "draggable-dialog-title" // this area is important for the draggable functionality
@@ -38,5 +38,5 @@ function DraggableDialog(props) {
38
38
  react_1.default.createElement(Close_1.default, null))) : null),
39
39
  react_1.default.createElement(material_1.Divider, null),
40
40
  children)));
41
- }
42
- exports.default = (0, mobx_react_1.observer)(DraggableDialog);
41
+ });
42
+ exports.default = DraggableDialog;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ declare const RectBg: (props: {
3
+ x: number;
4
+ y: number;
5
+ width: number;
6
+ height: number;
7
+ color?: string;
8
+ }) => React.JSX.Element;
9
+ export default RectBg;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const RectBg = (props) => {
8
+ const { color = 'rgb(255,255,255,0.8)' } = props;
9
+ return react_1.default.createElement("rect", { ...props, fill: color });
10
+ };
11
+ exports.default = RectBg;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { WiggleDisplayModel } from '../models/model';
3
+ declare const ScoreLegend: ({ model }: {
4
+ model: WiggleDisplayModel;
5
+ }) => React.JSX.Element;
6
+ export default ScoreLegend;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const util_1 = require("@jbrowse/core/util");
8
+ const mobx_react_1 = require("mobx-react");
9
+ const RectBg_1 = __importDefault(require("./RectBg"));
10
+ const ScoreLegend = (0, mobx_react_1.observer)(({ model }) => {
11
+ const { ticks, scaleType } = model;
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)' : '');
15
+ const len = (0, util_1.measureText)(legend, 14);
16
+ const padding = 25;
17
+ const xpos = width - len - padding;
18
+ return (react_1.default.createElement(react_1.default.Fragment, null,
19
+ react_1.default.createElement(RectBg_1.default, { y: 0, x: xpos, width: len + 6, height: 16 }),
20
+ react_1.default.createElement("text", { y: 13, x: xpos }, legend)));
21
+ });
22
+ exports.default = ScoreLegend;
@@ -46,6 +46,11 @@ const useStyles = (0, mui_1.makeStyles)()({
46
46
  content: {
47
47
  minWidth: 800,
48
48
  },
49
+ cell: {
50
+ whiteSpace: 'nowrap',
51
+ overflow: 'hidden',
52
+ textOverflow: 'ellipsis',
53
+ },
49
54
  });
50
55
  function SetColorDialog({ model, handleClose, }) {
51
56
  const { classes } = useStyles();
@@ -83,6 +88,7 @@ function SetColorDialog({ model, handleClose, }) {
83
88
  }
84
89
  exports.default = SetColorDialog;
85
90
  function SourcesGrid({ rows, onChange, showTips, }) {
91
+ const { classes } = useStyles();
86
92
  const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
87
93
  const [selected, setSelected] = (0, react_1.useState)([]);
88
94
  // @ts-expect-error
@@ -143,7 +149,7 @@ function SourcesGrid({ rows, onChange, showTips, }) {
143
149
  sortingOrder: [null],
144
150
  renderCell: (params) => {
145
151
  const { value } = params;
146
- return (0, util_1.isUriLocation)(value) ? (react_1.default.createElement(UriLink_1.default, { value: value })) : ((0, util_1.getStr)(value));
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)))));
147
153
  },
148
154
  // @ts-ignore
149
155
  width: (0, util_1.measureGridWidth)(rows.map(r => r[val])),
@@ -2,12 +2,13 @@ import React from 'react';
2
2
  import { Feature } from '@jbrowse/core/util';
3
3
  import { Source } from '../../util';
4
4
  import { TooltipContentsComponent } from '../../Tooltip';
5
- declare const TooltipContents: React.ForwardRefExoticComponent<{
5
+ interface Props {
6
6
  model: {
7
7
  sources: Source[];
8
8
  };
9
9
  feature: Feature;
10
- } & React.RefAttributes<HTMLDivElement>>;
10
+ }
11
+ declare const TooltipContents: React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLDivElement>>;
11
12
  type Coord = [number, number];
12
13
  declare const WiggleTooltip: (props: {
13
14
  model: {
@@ -10,7 +10,7 @@ const mobx_react_1 = require("mobx-react");
10
10
  const util_1 = require("../../util");
11
11
  const Tooltip_1 = __importDefault(require("../../Tooltip"));
12
12
  const en = (n) => n.toLocaleString('en-US');
13
- const TooltipContents = react_1.default.forwardRef(({ model, feature }, ref) => {
13
+ const TooltipContents = react_1.default.forwardRef(function TooltipContents2({ model, feature }, ref) {
14
14
  const start = feature.get('start');
15
15
  const end = feature.get('end');
16
16
  const refName = feature.get('refName');
@@ -1,12 +1,6 @@
1
1
  import React from 'react';
2
2
  import { WiggleDisplayModel } from '../models/model';
3
- export declare const StatBars: (props: {
4
- model: WiggleDisplayModel;
5
- orientation?: string;
6
- exportSVG?: boolean;
7
- }) => React.JSX.Element | null;
8
- declare const _default: (props: {
3
+ declare const MultiLinearWiggleDisplayComponent: (props: {
9
4
  model: WiggleDisplayModel;
10
5
  }) => React.JSX.Element;
11
- export default _default;
12
- export { default as YScaleBar } from '../../shared/YScaleBar';
6
+ export default MultiLinearWiggleDisplayComponent;
@@ -3,102 +3,14 @@ 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
- exports.YScaleBar = exports.StatBars = void 0;
7
6
  const react_1 = __importDefault(require("react"));
8
- const util_1 = require("@jbrowse/core/util");
9
- const configuration_1 = require("@jbrowse/core/configuration");
10
7
  const plugin_linear_genome_view_1 = require("@jbrowse/plugin-linear-genome-view");
11
8
  const mobx_react_1 = require("mobx-react");
12
- const YScaleBar_1 = __importDefault(require("../../shared/YScaleBar"));
13
- const trackLabelFontSize = 12.8;
14
- function getOffset(model) {
15
- const { prefersOffset } = model;
16
- const { trackLabels } = (0, util_1.getContainingView)(model);
17
- const track = (0, util_1.getContainingTrack)(model);
18
- const trackName = (0, configuration_1.getConf)(track, 'name');
19
- return trackLabels === 'overlapping' && !prefersOffset
20
- ? (0, util_1.measureText)(trackName, trackLabelFontSize) + 100
21
- : 10;
22
- }
23
- const Wrapper = (0, mobx_react_1.observer)(function ({ children, model, exportSVG, }) {
24
- if (exportSVG) {
25
- return react_1.default.createElement(react_1.default.Fragment, null, children);
26
- }
27
- else {
28
- const { height } = model;
29
- return (react_1.default.createElement("svg", { style: {
30
- position: 'absolute',
31
- top: 0,
32
- left: 0,
33
- pointerEvents: 'none',
34
- height,
35
- width: (0, util_1.getContainingView)(model).width,
36
- } }, children));
37
- }
38
- });
39
- const RectBg = (props) => {
40
- const { color = 'rgb(255,255,255,0.8)' } = props;
41
- return react_1.default.createElement("rect", { ...props, fill: color });
42
- };
43
- const ScoreLegend = (0, mobx_react_1.observer)(({ model }) => {
44
- const { ticks, scaleType } = model;
45
- const { width } = (0, util_1.getContainingView)(model);
46
- const legend = `[${ticks === null || ticks === void 0 ? void 0 : ticks.values[0]}-${ticks === null || ticks === void 0 ? void 0 : ticks.values[1]}]` +
47
- (scaleType === 'log' ? ' (log scale)' : '');
48
- const len = (0, util_1.measureText)(legend, 14);
49
- const padding = 25;
50
- const xpos = width - len - padding;
51
- return (react_1.default.createElement(react_1.default.Fragment, null,
52
- react_1.default.createElement(RectBg, { y: 0, x: xpos, width: len + 6, height: 16 }),
53
- react_1.default.createElement("text", { y: 13, x: xpos }, legend)));
54
- });
55
- const ColorLegend = (0, mobx_react_1.observer)(function ({ model, rowHeight, labelWidth, exportSVG, }) {
56
- const { needsCustomLegend, needsScalebar, needsFullHeightScalebar, rowHeightTooSmallForScalebar, renderColorBoxes, sources, } = model;
57
- const svgFontSize = Math.min(rowHeight, 12);
58
- const canDisplayLabel = rowHeight > 11;
59
- const colorBoxWidth = renderColorBoxes ? 15 : 0;
60
- const legendWidth = labelWidth + colorBoxWidth + 5;
61
- const svgOffset = exportSVG ? 10 : 0;
62
- const extraOffset = svgOffset || (needsScalebar && !rowHeightTooSmallForScalebar ? 50 : 0);
63
- return sources ? (react_1.default.createElement(react_1.default.Fragment, null,
64
- /* 0.25 for hanging letters like g */
65
- needsFullHeightScalebar ? (react_1.default.createElement(RectBg, { y: 0, x: extraOffset, width: legendWidth, height: (sources.length + 0.25) * rowHeight })) : null,
66
- sources.map((source, idx) => {
67
- const boxHeight = Math.min(20, rowHeight);
68
- return (react_1.default.createElement(react_1.default.Fragment, { key: `${source.name}-${idx}` },
69
- needsFullHeightScalebar ? null : (react_1.default.createElement(RectBg, { y: idx * rowHeight + 1, x: extraOffset, width: legendWidth, height: boxHeight })),
70
- source.color ? (react_1.default.createElement(RectBg, { y: idx * rowHeight + 1, x: extraOffset, width: colorBoxWidth, height: needsCustomLegend ? rowHeight : boxHeight, color: source.color })) : null,
71
- canDisplayLabel ? (react_1.default.createElement("text", { y: idx * rowHeight + 13, x: extraOffset + colorBoxWidth + 2, fontSize: svgFontSize }, source.name)) : null));
72
- }))) : null;
73
- });
74
- exports.StatBars = (0, mobx_react_1.observer)(function (props) {
75
- const { model, orientation, exportSVG } = props;
76
- const { stats, needsCustomLegend, needsFullHeightScalebar, rowHeightTooSmallForScalebar, rowHeight, sources, ticks, } = model;
77
- const svgFontSize = Math.min(rowHeight, 12);
78
- const canDisplayLabel = rowHeight > 11;
79
- const { width: viewWidth } = (0, util_1.getContainingView)(model);
80
- const minWidth = 20;
81
- const ready = stats && sources;
82
- if (!ready) {
83
- return null;
84
- }
85
- const labelWidth = Math.max(...(sources
86
- .map(s => (0, util_1.measureText)(s.name, svgFontSize))
87
- .map(width => (canDisplayLabel ? width : minWidth)) || [0]));
88
- return (react_1.default.createElement(Wrapper, { ...props }, needsFullHeightScalebar ? (react_1.default.createElement(react_1.default.Fragment, null,
89
- react_1.default.createElement("g", { transform: `translate(${!exportSVG ? getOffset(model) : 0},0)` },
90
- react_1.default.createElement(YScaleBar_1.default, { model: model, orientation: orientation })),
91
- react_1.default.createElement("g", { transform: `translate(${viewWidth - labelWidth - 100},0)` },
92
- react_1.default.createElement(ColorLegend, { exportSVG: exportSVG, model: model, rowHeight: 12, labelWidth: labelWidth })))) : (react_1.default.createElement(react_1.default.Fragment, null,
93
- react_1.default.createElement(ColorLegend, { exportSVG: exportSVG, model: model, rowHeight: model.rowHeight, labelWidth: labelWidth }),
94
- rowHeightTooSmallForScalebar || needsCustomLegend ? (react_1.default.createElement(ScoreLegend, { ...props })) : (sources.map((_source, idx) => (react_1.default.createElement("g", { transform: `translate(0 ${rowHeight * idx})`, key: `${JSON.stringify(ticks)}-${idx}` },
95
- react_1.default.createElement(YScaleBar_1.default, { model: model, orientation: orientation })))))))));
96
- });
97
- exports.default = (0, mobx_react_1.observer)((props) => {
9
+ const YScaleBars_1 = __importDefault(require("./YScaleBars"));
10
+ const MultiLinearWiggleDisplayComponent = (0, mobx_react_1.observer)((props) => {
98
11
  const { model } = props;
99
12
  return (react_1.default.createElement("div", null,
100
13
  react_1.default.createElement(plugin_linear_genome_view_1.BaseLinearDisplayComponent, { ...props }),
101
- react_1.default.createElement(exports.StatBars, { model: model })));
14
+ react_1.default.createElement(YScaleBars_1.default, { model: model })));
102
15
  });
103
- var YScaleBar_2 = require("../../shared/YScaleBar");
104
- Object.defineProperty(exports, "YScaleBar", { enumerable: true, get: function () { return __importDefault(YScaleBar_2).default; } });
16
+ exports.default = MultiLinearWiggleDisplayComponent;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { WiggleDisplayModel } from '../models/model';
3
+ export declare const YScaleBars: (props: {
4
+ model: WiggleDisplayModel;
5
+ orientation?: string;
6
+ exportSVG?: boolean;
7
+ }) => React.JSX.Element | null;
8
+ export default YScaleBars;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.YScaleBars = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const util_1 = require("@jbrowse/core/util");
9
+ const mobx_react_1 = require("mobx-react");
10
+ const YScaleBar_1 = __importDefault(require("../../shared/YScaleBar"));
11
+ const ColorLegend_1 = __importDefault(require("./ColorLegend"));
12
+ const ScoreLegend_1 = __importDefault(require("./ScoreLegend"));
13
+ const util_2 = require("./util");
14
+ const Wrapper = (0, mobx_react_1.observer)(function ({ children, model, exportSVG, }) {
15
+ if (exportSVG) {
16
+ return react_1.default.createElement(react_1.default.Fragment, null, children);
17
+ }
18
+ else {
19
+ const { height } = model;
20
+ return (react_1.default.createElement("svg", { style: {
21
+ position: 'absolute',
22
+ top: 0,
23
+ left: 0,
24
+ pointerEvents: 'none',
25
+ height,
26
+ width: (0, util_1.getContainingView)(model).width,
27
+ } }, children));
28
+ }
29
+ });
30
+ exports.YScaleBars = (0, mobx_react_1.observer)(function (props) {
31
+ const { model, orientation, exportSVG } = props;
32
+ const { stats, needsCustomLegend, needsFullHeightScalebar, rowHeightTooSmallForScalebar, rowHeight, sources, ticks, } = model;
33
+ const svgFontSize = Math.min(rowHeight, 12);
34
+ const canDisplayLabel = rowHeight > 11;
35
+ const { width: viewWidth } = (0, util_1.getContainingView)(model);
36
+ const minWidth = 20;
37
+ const ready = stats && sources;
38
+ if (!ready) {
39
+ return null;
40
+ }
41
+ const labelWidth = Math.max(...(sources
42
+ .map(s => (0, util_1.measureText)(s.name, svgFontSize))
43
+ .map(width => (canDisplayLabel ? width : minWidth)) || [0]));
44
+ return (react_1.default.createElement(Wrapper, { ...props }, needsFullHeightScalebar ? (react_1.default.createElement(react_1.default.Fragment, null,
45
+ react_1.default.createElement("g", { transform: `translate(${!exportSVG ? (0, util_2.getOffset)(model) : 0},0)` },
46
+ react_1.default.createElement(YScaleBar_1.default, { model: model, orientation: orientation })),
47
+ react_1.default.createElement("g", { transform: `translate(${viewWidth - labelWidth - 100},0)` },
48
+ react_1.default.createElement(ColorLegend_1.default, { exportSVG: exportSVG, model: model, rowHeight: 12, labelWidth: labelWidth })))) : (react_1.default.createElement(react_1.default.Fragment, null,
49
+ react_1.default.createElement(ColorLegend_1.default, { exportSVG: exportSVG, model: model, rowHeight: model.rowHeight, labelWidth: labelWidth }),
50
+ rowHeightTooSmallForScalebar || needsCustomLegend ? (react_1.default.createElement(ScoreLegend_1.default, { ...props })) : (sources.map((_source, idx) => (react_1.default.createElement("g", { transform: `translate(0 ${rowHeight * idx})`, key: `${JSON.stringify(ticks)}-${idx}` },
51
+ react_1.default.createElement(YScaleBar_1.default, { model: model, orientation: orientation })))))))));
52
+ });
53
+ exports.default = exports.YScaleBars;
@@ -1,3 +1,4 @@
1
+ import { WiggleDisplayModel } from '../models/model';
1
2
  export declare function moveUp(arr: {
2
3
  name: string;
3
4
  }[], sel: string[], by?: number): {
@@ -8,3 +9,4 @@ export declare function moveDown(arr: {
8
9
  }[], sel: string[], by?: number): {
9
10
  name: string;
10
11
  }[];
12
+ export declare function getOffset(model: WiggleDisplayModel): number;
@@ -1,13 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.moveDown = exports.moveUp = void 0;
3
+ exports.getOffset = exports.moveDown = exports.moveUp = void 0;
4
+ const util_1 = require("@jbrowse/core/util");
5
+ const configuration_1 = require("@jbrowse/core/configuration");
4
6
  function moveUp(arr, sel, by = 1) {
5
7
  const idxs = sel
6
8
  .map(l => arr.findIndex(v => v.name === l))
7
9
  .sort((a, b) => a - b);
8
10
  let lastIdx = 0;
9
- for (let i = 0; i < idxs.length; i++) {
10
- const old = idxs[i];
11
+ for (const old of idxs) {
11
12
  const idx = Math.max(lastIdx, old - by);
12
13
  if (idx >= lastIdx) {
13
14
  arr.splice(idx, 0, arr.splice(old, 1)[0]);
@@ -22,8 +23,7 @@ function moveDown(arr, sel, by = 1) {
22
23
  .map(l => arr.findIndex(v => v.name === l))
23
24
  .sort((a, b) => b - a);
24
25
  let lastIdx = arr.length - 1;
25
- for (let i = 0; i < idxs.length; i++) {
26
- const old = idxs[i];
26
+ for (const old of idxs) {
27
27
  const idx = Math.min(lastIdx, old + by);
28
28
  if (idx <= lastIdx) {
29
29
  arr.splice(idx, 0, arr.splice(old, 1)[0]);
@@ -33,3 +33,14 @@ function moveDown(arr, sel, by = 1) {
33
33
  return arr;
34
34
  }
35
35
  exports.moveDown = moveDown;
36
+ const trackLabelFontSize = 12.8;
37
+ function getOffset(model) {
38
+ const { prefersOffset } = model;
39
+ const { trackLabels } = (0, util_1.getContainingView)(model);
40
+ const track = (0, util_1.getContainingTrack)(model);
41
+ const trackName = (0, configuration_1.getConf)(track, 'name');
42
+ return trackLabels === 'overlapping' && !prefersOffset
43
+ ? (0, util_1.measureText)(trackName, trackLabelFontSize) + 100
44
+ : 10;
45
+ }
46
+ exports.getOffset = getOffset;
@@ -7,13 +7,13 @@ exports.renderSvg = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const util_1 = require("@jbrowse/core/util");
9
9
  const mobx_1 = require("mobx");
10
- const WiggleDisplayComponent_1 = require("../components/WiggleDisplayComponent");
10
+ const YScaleBars_1 = __importDefault(require("../components/YScaleBars"));
11
11
  async function renderSvg(self, opts, superRenderSvg) {
12
12
  await (0, mobx_1.when)(() => !!self.stats && !!self.regionCannotBeRenderedText);
13
13
  const { offsetPx } = (0, util_1.getContainingView)(self);
14
14
  return (react_1.default.createElement(react_1.default.Fragment, null,
15
15
  react_1.default.createElement("g", { id: "snpcov" }, await superRenderSvg(opts)),
16
16
  react_1.default.createElement("g", { transform: `translate(${Math.max(-offsetPx, 0)})` },
17
- react_1.default.createElement(WiggleDisplayComponent_1.StatBars, { model: self, orientation: "left", exportSVG: true }))));
17
+ react_1.default.createElement(YScaleBars_1.default, { model: self, orientation: "left", exportSVG: true }))));
18
18
  }
19
19
  exports.renderSvg = renderSvg;
@@ -12,7 +12,7 @@ class MultiRowLineRenderer extends WiggleBaseRenderer_1.default {
12
12
  const { bpPerPx, sources, regions, features } = props;
13
13
  const [region] = regions;
14
14
  const groups = (0, util_1.groupBy)([...features.values()], f => f.get('source'));
15
- const height = props.height / Object.keys(groups).length;
15
+ const height = props.height / sources.length;
16
16
  const width = (region.end - region.start) / bpPerPx;
17
17
  let feats = [];
18
18
  ctx.save();
@@ -1,27 +1,4 @@
1
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
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
4
  };
@@ -35,9 +12,8 @@ class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
35
12
  const { bpPerPx, sources, regions, features } = props;
36
13
  const [region] = regions;
37
14
  const groups = (0, util_1.groupBy)([...features.values()], f => f.get('source'));
38
- const height = props.height / Object.keys(groups).length;
15
+ const height = props.height / sources.length;
39
16
  const width = (region.end - region.start) / bpPerPx;
40
- const Color = await Promise.resolve().then(() => __importStar(require('color'))).then(f => f.default);
41
17
  let feats = [];
42
18
  ctx.save();
43
19
  sources.forEach(source => {
@@ -50,7 +26,6 @@ class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
50
26
  features,
51
27
  height,
52
28
  colorCallback: () => source.color || 'blue',
53
- Color,
54
29
  });
55
30
  ctx.strokeStyle = 'rgba(200,200,200,0.8)';
56
31
  ctx.beginPath();