@jbrowse/plugin-breakpoint-split-view 3.7.0 → 4.0.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 (102) hide show
  1. package/esm/BreakpointAlignmentsFeatureDetail/BreakpointAlignmentsFeatureDetail.js +1 -1
  2. package/esm/BreakpointAlignmentsFeatureDetail/index.js +2 -2
  3. package/esm/BreakpointGetFeatures/BreakpointGetFeatures.d.ts +51 -0
  4. package/esm/BreakpointGetFeatures/BreakpointGetFeatures.js +57 -0
  5. package/esm/BreakpointGetFeatures/index.d.ts +2 -0
  6. package/esm/BreakpointGetFeatures/index.js +4 -0
  7. package/esm/BreakpointSplitView/BreakpointSplitView.js +33 -47
  8. package/esm/BreakpointSplitView/components/AlignmentConnections.d.ts +2 -7
  9. package/esm/BreakpointSplitView/components/AlignmentConnections.js +20 -25
  10. package/esm/BreakpointSplitView/components/Breakends.d.ts +2 -7
  11. package/esm/BreakpointSplitView/components/Breakends.js +28 -59
  12. package/esm/BreakpointSplitView/components/BreakpointSplitView.d.ts +1 -1
  13. package/esm/BreakpointSplitView/components/BreakpointSplitView.js +19 -6
  14. package/esm/BreakpointSplitView/components/BreakpointSplitViewOverlay.d.ts +1 -1
  15. package/esm/BreakpointSplitView/components/BreakpointSplitViewOverlay.js +3 -3
  16. package/esm/BreakpointSplitView/components/ExportSvgDialog.d.ts +1 -1
  17. package/esm/BreakpointSplitView/components/ExportSvgDialog.js +5 -1
  18. package/esm/BreakpointSplitView/components/Header.d.ts +2 -2
  19. package/esm/BreakpointSplitView/components/Header.js +4 -4
  20. package/esm/BreakpointSplitView/components/HeaderSearchBoxes.js +2 -2
  21. package/esm/BreakpointSplitView/components/Overlay.d.ts +1 -1
  22. package/esm/BreakpointSplitView/components/Overlay.js +8 -11
  23. package/esm/BreakpointSplitView/components/PairedFeatures.d.ts +2 -7
  24. package/esm/BreakpointSplitView/components/PairedFeatures.js +22 -47
  25. package/esm/BreakpointSplitView/components/Rubberband.d.ts +6 -0
  26. package/esm/BreakpointSplitView/components/Rubberband.js +27 -0
  27. package/esm/BreakpointSplitView/components/RubberbandSpan.d.ts +15 -0
  28. package/esm/BreakpointSplitView/components/RubberbandSpan.js +30 -0
  29. package/esm/BreakpointSplitView/components/RubberbandTooltip.d.ts +5 -0
  30. package/esm/BreakpointSplitView/components/RubberbandTooltip.js +17 -0
  31. package/esm/BreakpointSplitView/components/Translocations.d.ts +2 -7
  32. package/esm/BreakpointSplitView/components/Translocations.js +23 -58
  33. package/esm/BreakpointSplitView/components/VerticalGuide.d.ts +6 -0
  34. package/esm/BreakpointSplitView/components/VerticalGuide.js +24 -0
  35. package/esm/BreakpointSplitView/components/overlayUtils.d.ts +24 -0
  36. package/esm/BreakpointSplitView/components/overlayUtils.js +47 -0
  37. package/esm/BreakpointSplitView/components/rubberbandUtil.d.ts +4 -0
  38. package/esm/BreakpointSplitView/components/rubberbandUtil.js +3 -0
  39. package/esm/BreakpointSplitView/components/useRangeSelect.d.ts +59 -0
  40. package/esm/BreakpointSplitView/components/useRangeSelect.js +121 -0
  41. package/esm/BreakpointSplitView/components/util.js +1 -2
  42. package/esm/BreakpointSplitView/getClip.js +4 -4
  43. package/esm/BreakpointSplitView/index.js +2 -2
  44. package/esm/BreakpointSplitView/model.d.ts +402 -117
  45. package/esm/BreakpointSplitView/model.js +105 -41
  46. package/esm/BreakpointSplitView/svgcomponents/SVGBreakpointSplitView.d.ts +2 -2
  47. package/esm/BreakpointSplitView/svgcomponents/SVGBreakpointSplitView.js +8 -8
  48. package/esm/BreakpointSplitView/types.d.ts +8 -0
  49. package/esm/BreakpointSplitView/util.d.ts +1 -1
  50. package/esm/BreakpointSplitView/util.js +8 -17
  51. package/esm/LaunchBreakpointSplitView/index.d.ts +2 -0
  52. package/esm/LaunchBreakpointSplitView/index.js +12 -0
  53. package/esm/index.js +7 -6
  54. package/package.json +28 -34
  55. package/dist/BreakpointAlignmentsFeatureDetail/BreakpointAlignmentsFeatureDetail.d.ts +0 -10
  56. package/dist/BreakpointAlignmentsFeatureDetail/BreakpointAlignmentsFeatureDetail.js +0 -12
  57. package/dist/BreakpointAlignmentsFeatureDetail/index.d.ts +0 -2
  58. package/dist/BreakpointAlignmentsFeatureDetail/index.js +0 -67
  59. package/dist/BreakpointSplitView/BreakpointSplitView.d.ts +0 -34
  60. package/dist/BreakpointSplitView/BreakpointSplitView.js +0 -84
  61. package/dist/BreakpointSplitView/components/AlignmentConnections.d.ts +0 -8
  62. package/dist/BreakpointSplitView/components/AlignmentConnections.js +0 -133
  63. package/dist/BreakpointSplitView/components/Breakends.d.ts +0 -8
  64. package/dist/BreakpointSplitView/components/Breakends.js +0 -95
  65. package/dist/BreakpointSplitView/components/BreakpointSplitView.d.ts +0 -5
  66. package/dist/BreakpointSplitView/components/BreakpointSplitView.js +0 -46
  67. package/dist/BreakpointSplitView/components/BreakpointSplitViewOverlay.d.ts +0 -5
  68. package/dist/BreakpointSplitView/components/BreakpointSplitViewOverlay.js +0 -33
  69. package/dist/BreakpointSplitView/components/ExportSvgDialog.d.ts +0 -7
  70. package/dist/BreakpointSplitView/components/ExportSvgDialog.js +0 -57
  71. package/dist/BreakpointSplitView/components/Header.d.ts +0 -5
  72. package/dist/BreakpointSplitView/components/Header.js +0 -52
  73. package/dist/BreakpointSplitView/components/HeaderSearchBoxes.d.ts +0 -5
  74. package/dist/BreakpointSplitView/components/HeaderSearchBoxes.js +0 -24
  75. package/dist/BreakpointSplitView/components/Overlay.d.ts +0 -8
  76. package/dist/BreakpointSplitView/components/Overlay.js +0 -27
  77. package/dist/BreakpointSplitView/components/PairedFeatures.d.ts +0 -8
  78. package/dist/BreakpointSplitView/components/PairedFeatures.js +0 -75
  79. package/dist/BreakpointSplitView/components/Translocations.d.ts +0 -8
  80. package/dist/BreakpointSplitView/components/Translocations.js +0 -99
  81. package/dist/BreakpointSplitView/components/getOrientationColor.d.ts +0 -41
  82. package/dist/BreakpointSplitView/components/getOrientationColor.js +0 -103
  83. package/dist/BreakpointSplitView/components/util.d.ts +0 -8
  84. package/dist/BreakpointSplitView/components/util.js +0 -142
  85. package/dist/BreakpointSplitView/getClip.d.ts +0 -1
  86. package/dist/BreakpointSplitView/getClip.js +0 -10
  87. package/dist/BreakpointSplitView/index.d.ts +0 -2
  88. package/dist/BreakpointSplitView/index.js +0 -52
  89. package/dist/BreakpointSplitView/model.d.ts +0 -344
  90. package/dist/BreakpointSplitView/model.js +0 -256
  91. package/dist/BreakpointSplitView/svgcomponents/SVGBackground.d.ts +0 -5
  92. package/dist/BreakpointSplitView/svgcomponents/SVGBackground.js +0 -10
  93. package/dist/BreakpointSplitView/svgcomponents/SVGBreakpointSplitView.d.ts +0 -5
  94. package/dist/BreakpointSplitView/svgcomponents/SVGBreakpointSplitView.js +0 -41
  95. package/dist/BreakpointSplitView/svgcomponents/util.d.ts +0 -4
  96. package/dist/BreakpointSplitView/svgcomponents/util.js +0 -18
  97. package/dist/BreakpointSplitView/types.d.ts +0 -22
  98. package/dist/BreakpointSplitView/types.js +0 -2
  99. package/dist/BreakpointSplitView/util.d.ts +0 -28
  100. package/dist/BreakpointSplitView/util.js +0 -67
  101. package/dist/index.d.ts +0 -7
  102. package/dist/index.js +0 -20
@@ -0,0 +1,121 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { transaction } from 'mobx';
3
+ import { getRelativeX } from "./rubberbandUtil.js";
4
+ export function useRangeSelect(ref, model) {
5
+ const [startX, setStartX] = useState();
6
+ const [currentX, setCurrentX] = useState();
7
+ const [anchorPosition, setAnchorPosition] = useState();
8
+ const [guideX, setGuideX] = useState();
9
+ const mouseDragging = startX !== undefined && anchorPosition === undefined;
10
+ const handleClose = useCallback(() => {
11
+ setAnchorPosition(undefined);
12
+ setStartX(undefined);
13
+ setCurrentX(undefined);
14
+ }, []);
15
+ useEffect(() => {
16
+ function computeOffsets(offsetX) {
17
+ if (startX === undefined) {
18
+ return;
19
+ }
20
+ const leftPx = Math.min(startX, offsetX);
21
+ const rightPx = Math.max(startX, offsetX);
22
+ return model.views.map(view => ({
23
+ leftOffset: view.pxToBp(leftPx),
24
+ rightOffset: view.pxToBp(rightPx),
25
+ }));
26
+ }
27
+ function globalMouseMove(event) {
28
+ if (ref.current && mouseDragging) {
29
+ const relativeX = getRelativeX(event, ref.current);
30
+ setCurrentX(relativeX);
31
+ }
32
+ }
33
+ function globalMouseUp(event) {
34
+ if (startX !== undefined && ref.current) {
35
+ const { clientX, clientY } = event;
36
+ const offsetX = getRelativeX(event, ref.current);
37
+ if (Math.abs(offsetX - startX) <= 3) {
38
+ handleClose();
39
+ return;
40
+ }
41
+ setAnchorPosition({
42
+ offsetX,
43
+ clientX,
44
+ clientY,
45
+ });
46
+ const offsets = computeOffsets(offsetX);
47
+ if (offsets) {
48
+ transaction(() => {
49
+ for (const [idx, elt] of offsets.entries()) {
50
+ model.views[idx].setOffsets(elt.leftOffset, elt.rightOffset);
51
+ }
52
+ });
53
+ }
54
+ setGuideX(undefined);
55
+ }
56
+ }
57
+ if (mouseDragging) {
58
+ window.addEventListener('mousemove', globalMouseMove);
59
+ window.addEventListener('mouseup', globalMouseUp);
60
+ return () => {
61
+ window.removeEventListener('mousemove', globalMouseMove);
62
+ window.removeEventListener('mouseup', globalMouseUp);
63
+ };
64
+ }
65
+ return () => { };
66
+ }, [startX, mouseDragging, model, ref, handleClose]);
67
+ function mouseDown(event) {
68
+ event.preventDefault();
69
+ event.stopPropagation();
70
+ const relativeX = getRelativeX(event, ref.current);
71
+ setStartX(relativeX);
72
+ setCurrentX(relativeX);
73
+ }
74
+ function mouseMove(event) {
75
+ setGuideX(getRelativeX(event, ref.current));
76
+ }
77
+ function mouseOut() {
78
+ setGuideX(undefined);
79
+ transaction(() => {
80
+ for (const view of model.views) {
81
+ view.setOffsets(undefined, undefined);
82
+ }
83
+ });
84
+ }
85
+ function handleMenuItemClick(_, callback) {
86
+ callback();
87
+ handleClose();
88
+ }
89
+ const open = Boolean(anchorPosition);
90
+ if (startX === undefined) {
91
+ return {
92
+ open,
93
+ guideX,
94
+ mouseDown,
95
+ mouseMove,
96
+ mouseOut,
97
+ handleMenuItemClick,
98
+ };
99
+ }
100
+ const right = anchorPosition ? anchorPosition.offsetX : currentX || 0;
101
+ const left = Math.min(right, startX);
102
+ const width = Math.abs(right - startX);
103
+ const leftBpOffset = model.views.map(view => view.pxToBp(left));
104
+ const rightBpOffset = model.views.map(view => view.pxToBp(left + width));
105
+ const numOfBpSelected = model.views.map(view => Math.ceil(width * view.bpPerPx));
106
+ return {
107
+ open,
108
+ rubberbandOn: true,
109
+ mouseDown,
110
+ mouseMove,
111
+ mouseOut,
112
+ handleClose,
113
+ handleMenuItemClick,
114
+ leftBpOffset,
115
+ rightBpOffset,
116
+ anchorPosition,
117
+ numOfBpSelected,
118
+ width,
119
+ left,
120
+ };
121
+ }
@@ -32,13 +32,12 @@ export function getBadlyPairedAlignments(features) {
32
32
  return [...candidates.values()].filter(v => v.length > 1);
33
33
  }
34
34
  export function getMatchedAlignmentFeatures(features) {
35
- var _a;
36
35
  const candidates = new Map();
37
36
  const alreadySeen = new Set();
38
37
  for (const feature of features.values()) {
39
38
  const id = feature.id();
40
39
  const unmapped = feature.get('flags') & 4;
41
- const hasSA = !!((_a = feature.get('tags')) === null || _a === void 0 ? void 0 : _a.SA);
40
+ const hasSA = !!feature.get('tags')?.SA;
42
41
  if (!alreadySeen.has(id) && !unmapped && hasSA) {
43
42
  const n = feature.get('name');
44
43
  let val = candidates.get(n);
@@ -1,7 +1,7 @@
1
- const startClip = new RegExp(/(\d+)[SH]$/);
2
- const endClip = new RegExp(/^(\d+)([SH])/);
1
+ const startClip = /(\d+)[SH]$/;
2
+ const endClip = /^(\d+)([SH])/;
3
3
  export function getClip(cigar, strand) {
4
4
  return strand === -1
5
- ? +(startClip.exec(cigar) || [])[1] || 0
6
- : +(endClip.exec(cigar) || [])[1] || 0;
5
+ ? +(startClip.exec(cigar)?.[1] ?? 0)
6
+ : +(endClip.exec(cigar)?.[1] ?? 0);
7
7
  }
@@ -1,13 +1,13 @@
1
1
  import { lazy } from 'react';
2
2
  import { ViewType } from '@jbrowse/core/pluggableElementTypes';
3
- import stateModelFactory from './model';
3
+ import stateModelFactory from "./model.js";
4
4
  export default function BreakpointSplitViewF(pluginManager) {
5
5
  pluginManager.addViewType(() => {
6
6
  return new ViewType({
7
7
  name: 'BreakpointSplitView',
8
8
  displayName: 'Breakpoint split view',
9
9
  stateModel: stateModelFactory(pluginManager),
10
- ReactComponent: lazy(() => import('./components/BreakpointSplitView')),
10
+ ReactComponent: lazy(() => import("./components/BreakpointSplitView.js")),
11
11
  });
12
12
  });
13
13
  }