@jbrowse/plugin-linear-genome-view 1.6.9 → 1.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 (62) hide show
  1. package/dist/BaseLinearDisplay/components/BaseLinearDisplay.js +232 -0
  2. package/dist/BaseLinearDisplay/components/Block.js +86 -0
  3. package/dist/BaseLinearDisplay/components/LinearBlocks.js +110 -0
  4. package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +192 -0
  5. package/dist/BaseLinearDisplay/index.js +41 -0
  6. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js +763 -0
  7. package/dist/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.js +24 -0
  8. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js +328 -0
  9. package/dist/LinearBareDisplay/configSchema.js +19 -0
  10. package/dist/LinearBareDisplay/index.js +21 -0
  11. package/dist/LinearBareDisplay/index.test.js +33 -0
  12. package/dist/LinearBareDisplay/model.js +44 -0
  13. package/dist/LinearBasicDisplay/components/SetMaxHeight.js +94 -0
  14. package/dist/LinearBasicDisplay/configSchema.js +25 -0
  15. package/dist/LinearBasicDisplay/index.js +23 -0
  16. package/dist/LinearBasicDisplay/model.js +162 -0
  17. package/dist/LinearGenomeView/components/CenterLine.js +80 -0
  18. package/dist/LinearGenomeView/components/ExportSvgDialog.js +137 -0
  19. package/dist/LinearGenomeView/components/Header.js +144 -0
  20. package/dist/LinearGenomeView/components/HelpDialog.js +48 -0
  21. package/dist/LinearGenomeView/components/ImportForm.js +330 -0
  22. package/dist/LinearGenomeView/components/LinearGenomeView.js +129 -0
  23. package/dist/LinearGenomeView/components/LinearGenomeView.test.js +234 -0
  24. package/dist/LinearGenomeView/components/LinearGenomeViewSvg.js +349 -0
  25. package/dist/LinearGenomeView/components/MiniControls.js +83 -0
  26. package/dist/LinearGenomeView/components/OverviewRubberBand.js +310 -0
  27. package/dist/LinearGenomeView/components/OverviewScaleBar.js +403 -0
  28. package/dist/LinearGenomeView/components/RefNameAutocomplete.js +331 -0
  29. package/dist/LinearGenomeView/components/RubberBand.js +309 -0
  30. package/dist/LinearGenomeView/components/Ruler.js +101 -0
  31. package/dist/LinearGenomeView/components/ScaleBar.js +184 -0
  32. package/dist/LinearGenomeView/components/ScaleBar.test.js +180 -0
  33. package/dist/LinearGenomeView/components/SearchBox.js +201 -0
  34. package/dist/LinearGenomeView/components/SearchResultsDialog.js +159 -0
  35. package/dist/LinearGenomeView/components/SequenceDialog.js +304 -0
  36. package/dist/LinearGenomeView/components/TrackContainer.js +179 -0
  37. package/dist/LinearGenomeView/components/TrackLabel.js +165 -0
  38. package/dist/LinearGenomeView/components/TracksContainer.js +214 -0
  39. package/dist/LinearGenomeView/components/VerticalGuides.js +116 -0
  40. package/dist/LinearGenomeView/components/ZoomControls.js +92 -0
  41. package/dist/LinearGenomeView/components/util.js +16 -0
  42. package/dist/LinearGenomeView/index.js +1418 -0
  43. package/dist/LinearGenomeView/index.test.js +1170 -0
  44. package/dist/LinearGenomeView/util.js +93 -0
  45. package/dist/LinearGenomeView/util.test.js +78 -0
  46. package/dist/index.js +293 -6
  47. package/package.json +4 -8
  48. package/src/BaseLinearDisplay/models/BaseLinearDisplayModel.tsx +2 -0
  49. package/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts +10 -8
  50. package/src/LinearBasicDisplay/components/SetMaxHeight.tsx +1 -1
  51. package/src/LinearBasicDisplay/model.ts +17 -18
  52. package/src/LinearGenomeView/components/Header.tsx +1 -1
  53. package/src/LinearGenomeView/components/ImportForm.tsx +10 -4
  54. package/src/LinearGenomeView/components/LinearGenomeView.test.js +1 -0
  55. package/src/LinearGenomeView/components/OverviewScaleBar.tsx +2 -2
  56. package/src/LinearGenomeView/components/RubberBand.tsx +14 -24
  57. package/src/LinearGenomeView/components/ScaleBar.test.tsx +1 -0
  58. package/src/LinearGenomeView/components/ScaleBar.tsx +3 -6
  59. package/src/LinearGenomeView/components/SequenceDialog.tsx +1 -1
  60. package/src/LinearGenomeView/components/TrackLabel.tsx +1 -1
  61. package/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.js.snap +0 -4
  62. package/src/LinearGenomeView/index.tsx +2 -3
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _react = _interopRequireDefault(require("react"));
15
+
16
+ var _configuration = require("@jbrowse/core/configuration");
17
+
18
+ var _ui = require("@jbrowse/core/ui");
19
+
20
+ var _util = require("@jbrowse/core/util");
21
+
22
+ var _core = require("@material-ui/core");
23
+
24
+ var _MoreVert = _interopRequireDefault(require("@material-ui/icons/MoreVert"));
25
+
26
+ var _DragIndicator = _interopRequireDefault(require("@material-ui/icons/DragIndicator"));
27
+
28
+ var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
29
+
30
+ var _clsx = _interopRequireDefault(require("clsx"));
31
+
32
+ var _mobxReact = require("mobx-react");
33
+
34
+ // icons
35
+ var useStyles = (0, _core.makeStyles)(function (theme) {
36
+ return {
37
+ root: {
38
+ background: (0, _core.alpha)(theme.palette.background.paper, 0.8),
39
+ '&:hover': {
40
+ background: theme.palette.background.paper
41
+ },
42
+ transition: theme.transitions.create(['background'], {
43
+ duration: theme.transitions.duration.shortest
44
+ })
45
+ },
46
+ trackName: {
47
+ margin: '0 auto',
48
+ width: '90%',
49
+ fontSize: '0.8rem',
50
+ pointerEvents: 'none'
51
+ },
52
+ dragHandle: {
53
+ cursor: 'grab',
54
+ color: '#135560'
55
+ },
56
+ dragHandleIcon: {
57
+ display: 'inline-block',
58
+ verticalAlign: 'middle',
59
+ pointerEvents: 'none'
60
+ },
61
+ iconButton: {
62
+ padding: theme.spacing(1)
63
+ }
64
+ };
65
+ });
66
+
67
+ var TrackLabel = /*#__PURE__*/_react["default"].forwardRef(function (props, ref) {
68
+ var _session$getTrackActi;
69
+
70
+ var classes = useStyles();
71
+
72
+ var _React$useState = _react["default"].useState(null),
73
+ _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2),
74
+ anchorEl = _React$useState2[0],
75
+ setAnchorEl = _React$useState2[1];
76
+
77
+ var track = props.track,
78
+ className = props.className;
79
+ var view = (0, _util.getContainingView)(track);
80
+ var session = (0, _util.getSession)(track);
81
+ var trackConf = track.configuration;
82
+ var trackId = (0, _configuration.getConf)(track, 'trackId');
83
+
84
+ var handleClick = function handleClick(event) {
85
+ setAnchorEl(event.currentTarget);
86
+ };
87
+
88
+ var handleClose = function handleClose() {
89
+ setAnchorEl(null);
90
+ };
91
+
92
+ var onDragStart = function onDragStart(event) {
93
+ var target = event.target;
94
+
95
+ if (target.parentNode) {
96
+ event.dataTransfer.setDragImage(target.parentNode, 20, 20);
97
+ view.setDraggingTrackId(track.id);
98
+ }
99
+ };
100
+
101
+ var onDragEnd = function onDragEnd() {
102
+ view.setDraggingTrackId(undefined);
103
+ };
104
+
105
+ var trackName = (0, _configuration.getConf)(track, 'name');
106
+
107
+ if ((0, _configuration.getConf)(track, 'type') === 'ReferenceSequenceTrack') {
108
+ trackName = 'Reference Sequence';
109
+ session.assemblies.forEach(function (assembly) {
110
+ if (assembly.sequence === trackConf) {
111
+ trackName = "Reference Sequence (".concat((0, _configuration.readConfObject)(assembly, 'name'), ")");
112
+ }
113
+ });
114
+ }
115
+
116
+ function handleMenuItemClick(_, callback) {
117
+ callback();
118
+ handleClose();
119
+ }
120
+
121
+ var items = [].concat((0, _toConsumableArray2["default"])(((_session$getTrackActi = session.getTrackActionMenuItems) === null || _session$getTrackActi === void 0 ? void 0 : _session$getTrackActi.call(session, trackConf)) || []), (0, _toConsumableArray2["default"])(track.trackMenuItems())).sort(function (a, b) {
122
+ return (b.priority || 0) - (a.priority || 0);
123
+ });
124
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_core.Paper, {
125
+ ref: ref,
126
+ className: (0, _clsx["default"])(className, classes.root)
127
+ }, /*#__PURE__*/_react["default"].createElement("span", {
128
+ draggable: true,
129
+ className: classes.dragHandle,
130
+ onDragStart: onDragStart,
131
+ onDragEnd: onDragEnd,
132
+ "data-testid": "dragHandle-".concat(view.id, "-").concat(trackId)
133
+ }, /*#__PURE__*/_react["default"].createElement(_DragIndicator["default"], {
134
+ className: classes.dragHandleIcon
135
+ })), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
136
+ onClick: function onClick() {
137
+ return view.hideTrack(trackId);
138
+ },
139
+ className: classes.iconButton,
140
+ title: "close this track",
141
+ color: "secondary"
142
+ }, /*#__PURE__*/_react["default"].createElement(_Close["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.Typography, {
143
+ variant: "body1",
144
+ component: "span",
145
+ className: classes.trackName
146
+ }, trackName), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
147
+ "aria-controls": "simple-menu",
148
+ "aria-haspopup": "true",
149
+ onClick: handleClick,
150
+ className: classes.iconButton,
151
+ color: "secondary",
152
+ "data-testid": "track_menu_icon",
153
+ disabled: !items.length
154
+ }, /*#__PURE__*/_react["default"].createElement(_MoreVert["default"], null))), /*#__PURE__*/_react["default"].createElement(_ui.Menu, {
155
+ anchorEl: anchorEl,
156
+ onMenuItemClick: handleMenuItemClick,
157
+ open: Boolean(anchorEl),
158
+ onClose: handleClose,
159
+ menuItems: items
160
+ }));
161
+ });
162
+
163
+ var _default = (0, _mobxReact.observer)(TrackLabel);
164
+
165
+ exports["default"] = _default;
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports["default"] = void 0;
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _styles = require("@material-ui/core/styles");
15
+
16
+ var _mobxReact = require("mobx-react");
17
+
18
+ var _react = _interopRequireWildcard(require("react"));
19
+
20
+ var _normalizeWheel = _interopRequireDefault(require("normalize-wheel"));
21
+
22
+ var _ = require("..");
23
+
24
+ var _RubberBand = _interopRequireDefault(require("./RubberBand"));
25
+
26
+ var _ScaleBar = _interopRequireDefault(require("./ScaleBar"));
27
+
28
+ var _VerticalGuides = _interopRequireDefault(require("./VerticalGuides"));
29
+
30
+ var _CenterLine = _interopRequireDefault(require("./CenterLine"));
31
+
32
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
33
+
34
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
35
+
36
+ var useStyles = (0, _styles.makeStyles)(function (theme) {
37
+ return {
38
+ tracksContainer: {
39
+ position: 'relative',
40
+ borderRadius: theme.shape.borderRadius,
41
+ overflow: 'hidden'
42
+ },
43
+ spacer: {
44
+ position: 'relative',
45
+ height: _.RESIZE_HANDLE_HEIGHT
46
+ }
47
+ };
48
+ });
49
+
50
+ function TracksContainer(_ref) {
51
+ var children = _ref.children,
52
+ model = _ref.model;
53
+ var classes = useStyles(); // refs are to store these variables to avoid repeated rerenders associated
54
+ // with useState/setState
55
+
56
+ var delta = (0, _react.useRef)(0);
57
+ var scheduled = (0, _react.useRef)(false);
58
+ var timeout = (0, _react.useRef)();
59
+ var ref = (0, _react.useRef)(null);
60
+ var prevX = (0, _react.useRef)(0);
61
+
62
+ var _useState = (0, _react.useState)(false),
63
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
64
+ mouseDragging = _useState2[0],
65
+ setMouseDragging = _useState2[1];
66
+
67
+ (0, _react.useEffect)(function () {
68
+ var cleanup = function cleanup() {};
69
+
70
+ function globalMouseMove(event) {
71
+ event.preventDefault();
72
+ var currX = event.clientX;
73
+ var distance = currX - prevX.current;
74
+
75
+ if (distance) {
76
+ // use rAF to make it so multiple event handlers aren't fired per-frame
77
+ // see https://calendar.perfplanet.com/2013/the-runtime-performance-checklist/
78
+ if (!scheduled.current) {
79
+ scheduled.current = true;
80
+ window.requestAnimationFrame(function () {
81
+ model.horizontalScroll(-distance);
82
+ scheduled.current = false;
83
+ prevX.current = event.clientX;
84
+ });
85
+ }
86
+ }
87
+ }
88
+
89
+ function globalMouseUp() {
90
+ prevX.current = 0;
91
+
92
+ if (mouseDragging) {
93
+ setMouseDragging(false);
94
+ }
95
+ }
96
+
97
+ if (mouseDragging) {
98
+ window.addEventListener('mousemove', globalMouseMove, true);
99
+ window.addEventListener('mouseup', globalMouseUp, true);
100
+
101
+ cleanup = function cleanup() {
102
+ window.removeEventListener('mousemove', globalMouseMove, true);
103
+ window.removeEventListener('mouseup', globalMouseUp, true);
104
+ };
105
+ }
106
+
107
+ return cleanup;
108
+ }, [model, mouseDragging, prevX]);
109
+
110
+ function mouseDown(event) {
111
+ // check if clicking a draggable element or a resize handle
112
+ var target = event.target;
113
+
114
+ if (target.draggable || target.dataset.resizer) {
115
+ return;
116
+ } // otherwise do click and drag scroll
117
+
118
+
119
+ if (event.button === 0) {
120
+ prevX.current = event.clientX;
121
+ setMouseDragging(true);
122
+ }
123
+ } // this local mouseup is used in addition to the global because sometimes
124
+ // the global add/remove are not called in time, resulting in issue #533
125
+
126
+
127
+ function mouseUp(event) {
128
+ event.preventDefault();
129
+ setMouseDragging(false);
130
+ }
131
+
132
+ function mouseLeave(event) {
133
+ event.preventDefault();
134
+ }
135
+
136
+ (0, _react.useEffect)(function () {
137
+ var curr = ref.current; // if ctrl is held down, zoom in with y-scroll
138
+ // else scroll horizontally with x-scroll
139
+
140
+ function onWheel(origEvent) {
141
+ var event = (0, _normalizeWheel["default"])(origEvent);
142
+
143
+ if (origEvent.ctrlKey === true) {
144
+ origEvent.preventDefault();
145
+ delta.current += event.pixelY / 500;
146
+ model.setScaleFactor(delta.current < 0 ? 1 - delta.current : 1 / (1 + delta.current));
147
+
148
+ if (timeout.current) {
149
+ clearTimeout(timeout.current);
150
+ }
151
+
152
+ timeout.current = setTimeout(function () {
153
+ model.setScaleFactor(1);
154
+ model.zoomTo(delta.current > 0 ? model.bpPerPx * (1 + delta.current) : model.bpPerPx / (1 - delta.current));
155
+ delta.current = 0;
156
+ }, 300);
157
+ } else {
158
+ // this is needed to stop the event from triggering "back button
159
+ // action" on MacOSX etc. but is a heuristic to avoid preventing the
160
+ // inner-track scroll behavior
161
+ if (Math.abs(event.pixelX) > Math.abs(2 * event.pixelY)) {
162
+ origEvent.preventDefault();
163
+ }
164
+
165
+ delta.current += event.pixelX;
166
+
167
+ if (!scheduled.current) {
168
+ // use rAF to make it so multiple event handlers aren't fired per-frame
169
+ // see https://calendar.perfplanet.com/2013/the-runtime-performance-checklist/
170
+ scheduled.current = true;
171
+ window.requestAnimationFrame(function () {
172
+ model.horizontalScroll(delta.current);
173
+ delta.current = 0;
174
+ scheduled.current = false;
175
+ });
176
+ }
177
+ }
178
+ }
179
+
180
+ if (curr) {
181
+ curr.addEventListener('wheel', onWheel);
182
+ return function () {
183
+ curr.removeEventListener('wheel', onWheel);
184
+ };
185
+ }
186
+
187
+ return function () {};
188
+ }, [model]);
189
+ return /*#__PURE__*/_react["default"].createElement("div", {
190
+ ref: ref,
191
+ role: "presentation",
192
+ className: classes.tracksContainer,
193
+ onMouseDown: mouseDown,
194
+ onMouseUp: mouseUp,
195
+ onMouseLeave: mouseLeave
196
+ }, /*#__PURE__*/_react["default"].createElement(_VerticalGuides["default"], {
197
+ model: model
198
+ }), model.showCenterLine ? /*#__PURE__*/_react["default"].createElement(_CenterLine["default"], {
199
+ model: model
200
+ }) : null, /*#__PURE__*/_react["default"].createElement(_RubberBand["default"], {
201
+ model: model,
202
+ ControlComponent: /*#__PURE__*/_react["default"].createElement(_ScaleBar["default"], {
203
+ model: model,
204
+ style: {
205
+ height: _.SCALE_BAR_HEIGHT,
206
+ boxSizing: 'border-box'
207
+ }
208
+ })
209
+ }), children);
210
+ }
211
+
212
+ var _default = (0, _mobxReact.observer)(TracksContainer);
213
+
214
+ exports["default"] = _default;
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _blockTypes = require("@jbrowse/core/util/blockTypes");
11
+
12
+ var _styles = require("@material-ui/core/styles");
13
+
14
+ var _clsx = _interopRequireDefault(require("clsx"));
15
+
16
+ var _mobxReact = require("mobx-react");
17
+
18
+ var _react = _interopRequireDefault(require("react"));
19
+
20
+ var _Block = require("../../BaseLinearDisplay/components/Block");
21
+
22
+ var _util = require("../util");
23
+
24
+ var useStyles = (0, _styles.makeStyles)(function (theme) {
25
+ return {
26
+ verticalGuidesZoomContainer: {
27
+ position: 'absolute',
28
+ height: '100%',
29
+ width: '100%',
30
+ zIndex: 1,
31
+ pointerEvents: 'none'
32
+ },
33
+ verticalGuidesContainer: {
34
+ position: 'absolute',
35
+ height: '100%',
36
+ zIndex: 1,
37
+ pointerEvents: 'none',
38
+ display: 'flex'
39
+ },
40
+ tick: {
41
+ position: 'absolute',
42
+ height: '100%',
43
+ width: 1
44
+ },
45
+ majorTick: {
46
+ background: theme.palette.text.hint
47
+ },
48
+ minorTick: {
49
+ background: theme.palette.divider
50
+ }
51
+ };
52
+ });
53
+ var RenderedVerticalGuides = (0, _mobxReact.observer)(function (_ref) {
54
+ var model = _ref.model;
55
+ var classes = useStyles();
56
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, model.staticBlocks.map(function (block, index) {
57
+ if (block instanceof _blockTypes.ContentBlock) {
58
+ var ticks = (0, _util.makeTicks)(block.start, block.end, model.bpPerPx);
59
+ return /*#__PURE__*/_react["default"].createElement(_Block.ContentBlock, {
60
+ key: "".concat(block.key, "-").concat(index),
61
+ block: block
62
+ }, ticks.map(function (tick) {
63
+ var x = (block.reversed ? block.end - tick.base : tick.base - block.start) / model.bpPerPx;
64
+ return /*#__PURE__*/_react["default"].createElement("div", {
65
+ key: tick.base,
66
+ className: (0, _clsx["default"])(classes.tick, tick.type === 'major' || tick.type === 'labeledMajor' ? classes.majorTick : classes.minorTick),
67
+ style: {
68
+ left: x
69
+ }
70
+ });
71
+ }));
72
+ }
73
+
74
+ if (block instanceof _blockTypes.ElidedBlock) {
75
+ return /*#__PURE__*/_react["default"].createElement(_Block.ElidedBlock, {
76
+ key: block.key,
77
+ width: block.widthPx
78
+ });
79
+ }
80
+
81
+ if (block instanceof _blockTypes.InterRegionPaddingBlock) {
82
+ return /*#__PURE__*/_react["default"].createElement(_Block.InterRegionPaddingBlock, {
83
+ key: block.key,
84
+ width: block.widthPx,
85
+ boundary: block.variant === 'boundary'
86
+ });
87
+ }
88
+
89
+ return null;
90
+ }));
91
+ });
92
+
93
+ function VerticalGuides(_ref2) {
94
+ var model = _ref2.model;
95
+ var classes = useStyles(); // find the block that needs pinning to the left side for context
96
+
97
+ var offsetLeft = model.staticBlocks.offsetPx - model.offsetPx;
98
+ return /*#__PURE__*/_react["default"].createElement("div", {
99
+ className: classes.verticalGuidesZoomContainer,
100
+ style: {
101
+ transform: model.scaleFactor !== 1 ? "scaleX(".concat(model.scaleFactor, ")") : undefined
102
+ }
103
+ }, /*#__PURE__*/_react["default"].createElement("div", {
104
+ className: classes.verticalGuidesContainer,
105
+ style: {
106
+ left: offsetLeft,
107
+ width: model.staticBlocks.totalWidthPx
108
+ }
109
+ }, /*#__PURE__*/_react["default"].createElement(RenderedVerticalGuides, {
110
+ model: model
111
+ })));
112
+ }
113
+
114
+ var _default = (0, _mobxReact.observer)(VerticalGuides);
115
+
116
+ exports["default"] = _default;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports["default"] = void 0;
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var _mobxReact = require("mobx-react");
17
+
18
+ var _IconButton = _interopRequireDefault(require("@material-ui/core/IconButton"));
19
+
20
+ var _Slider = _interopRequireDefault(require("@material-ui/core/Slider"));
21
+
22
+ var _styles = require("@material-ui/core/styles");
23
+
24
+ var _ZoomIn = _interopRequireDefault(require("@material-ui/icons/ZoomIn"));
25
+
26
+ var _ZoomOut = _interopRequireDefault(require("@material-ui/icons/ZoomOut"));
27
+
28
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
+
30
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
+
32
+ var useStyles = (0, _styles.makeStyles)({
33
+ container: {
34
+ display: 'flex',
35
+ flexDirection: 'row',
36
+ alignItems: 'center'
37
+ },
38
+ slider: {
39
+ width: 70
40
+ }
41
+ });
42
+
43
+ function ZoomControls(_ref) {
44
+ var model = _ref.model;
45
+ var classes = useStyles();
46
+ var maxBpPerPx = model.maxBpPerPx,
47
+ minBpPerPx = model.minBpPerPx,
48
+ bpPerPx = model.bpPerPx,
49
+ scaleFactor = model.scaleFactor;
50
+
51
+ var _useState = (0, _react.useState)(-Math.log2(bpPerPx) * 100),
52
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
53
+ value = _useState2[0],
54
+ setValue = _useState2[1];
55
+
56
+ (0, _react.useEffect)(function () {
57
+ setValue(-Math.log2(bpPerPx) * 100);
58
+ }, [setValue, bpPerPx]);
59
+ return /*#__PURE__*/_react["default"].createElement("div", {
60
+ className: classes.container
61
+ }, /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
62
+ "data-testid": "zoom_out",
63
+ onClick: function onClick() {
64
+ model.zoom(bpPerPx * 2);
65
+ },
66
+ disabled: bpPerPx >= maxBpPerPx - 0.0001 || scaleFactor !== 1,
67
+ color: "secondary"
68
+ }, /*#__PURE__*/_react["default"].createElement(_ZoomOut["default"], null)), /*#__PURE__*/_react["default"].createElement(_Slider["default"], {
69
+ className: classes.slider,
70
+ value: value,
71
+ min: -Math.log2(maxBpPerPx) * 100,
72
+ max: -Math.log2(minBpPerPx) * 100,
73
+ onChange: function onChange(_, val) {
74
+ return setValue(val);
75
+ },
76
+ onChangeCommitted: function onChangeCommitted() {
77
+ return model.zoomTo(Math.pow(2, -value / 100));
78
+ },
79
+ disabled: scaleFactor !== 1
80
+ }), /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
81
+ "data-testid": "zoom_in",
82
+ onClick: function onClick() {
83
+ model.zoom(model.bpPerPx / 2);
84
+ },
85
+ disabled: bpPerPx <= minBpPerPx + 0.0001 || scaleFactor !== 1,
86
+ color: "secondary"
87
+ }, /*#__PURE__*/_react["default"].createElement(_ZoomIn["default"], null)));
88
+ }
89
+
90
+ var _default = (0, _mobxReact.observer)(ZoomControls);
91
+
92
+ exports["default"] = _default;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.dedupe = dedupe;
7
+
8
+ function dedupe() {
9
+ var results = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
10
+ var cb = arguments.length > 1 ? arguments[1] : undefined;
11
+ return results.filter(function (elt, idx, self) {
12
+ return idx === self.findIndex(function (t) {
13
+ return cb(t) === cb(elt);
14
+ });
15
+ });
16
+ }