@jbrowse/plugin-circular-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.
- package/dist/BaseChordDisplay/components/BaseChordDisplay.js +53 -0
- package/dist/BaseChordDisplay/components/DisplayError.js +70 -0
- package/dist/BaseChordDisplay/components/Loading.js +122 -0
- package/dist/BaseChordDisplay/components/RpcRenderedSvgGroup.js +96 -0
- package/dist/BaseChordDisplay/index.js +31 -0
- package/dist/BaseChordDisplay/models/BaseChordDisplayModel.js +261 -0
- package/dist/BaseChordDisplay/models/baseChordDisplayConfig.js +20 -0
- package/dist/BaseChordDisplay/models/renderReaction.js +142 -0
- package/dist/CircularView/components/CircularView.js +203 -0
- package/dist/CircularView/components/ImportForm.js +97 -0
- package/dist/CircularView/components/Ruler.js +205 -0
- package/dist/CircularView/models/CircularView.js +422 -0
- package/dist/CircularView/models/slices.js +111 -0
- package/dist/CircularView/models/slices.test.js +83 -0
- package/dist/CircularView/models/viewportVisibleRegion.js +280 -0
- package/dist/CircularView/models/viewportVisibleRegion.test.js +130 -0
- package/dist/index.js +180 -6
- package/package.json +3 -6
|
@@ -0,0 +1,142 @@
|
|
|
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 _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
|
+
|
|
12
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
13
|
+
|
|
14
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
15
|
+
|
|
16
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
17
|
+
|
|
18
|
+
var _excluded = ["html"];
|
|
19
|
+
|
|
20
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
21
|
+
|
|
22
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
23
|
+
|
|
24
|
+
var _default = function _default(_ref) {
|
|
25
|
+
var jbrequire = _ref.jbrequire;
|
|
26
|
+
|
|
27
|
+
var _jbrequire = jbrequire('@jbrowse/core/util/tracks'),
|
|
28
|
+
getRpcSessionId = _jbrequire.getRpcSessionId;
|
|
29
|
+
|
|
30
|
+
var _jbrequire2 = jbrequire('@jbrowse/core/util'),
|
|
31
|
+
getContainingView = _jbrequire2.getContainingView;
|
|
32
|
+
|
|
33
|
+
var _jbrequire3 = jbrequire('@jbrowse/core/util'),
|
|
34
|
+
getSession = _jbrequire3.getSession;
|
|
35
|
+
|
|
36
|
+
function renderReactionData(self) {
|
|
37
|
+
var _view$displayedRegion;
|
|
38
|
+
|
|
39
|
+
var view = getContainingView(self);
|
|
40
|
+
var rendererType = self.rendererType;
|
|
41
|
+
|
|
42
|
+
var _getSession = getSession(view),
|
|
43
|
+
rpcManager = _getSession.rpcManager;
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
rendererType: rendererType,
|
|
47
|
+
rpcManager: rpcManager,
|
|
48
|
+
renderProps: self.renderProps(),
|
|
49
|
+
renderArgs: {
|
|
50
|
+
assemblyName: (_view$displayedRegion = view.displayedRegions[0]) === null || _view$displayedRegion === void 0 ? void 0 : _view$displayedRegion.assemblyName,
|
|
51
|
+
adapterConfig: JSON.parse(JSON.stringify(self.adapterConfig)),
|
|
52
|
+
rendererType: rendererType.name,
|
|
53
|
+
regions: JSON.parse(JSON.stringify(view.displayedRegions)),
|
|
54
|
+
blockDefinitions: self.blockDefinitions,
|
|
55
|
+
sessionId: getRpcSessionId(self),
|
|
56
|
+
timeout: 1000000
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function renderReactionEffect(_x, _x2, _x3) {
|
|
62
|
+
return _renderReactionEffect.apply(this, arguments);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function _renderReactionEffect() {
|
|
66
|
+
_renderReactionEffect = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(props, signal, self) {
|
|
67
|
+
var rendererType, rpcManager, cannotBeRenderedReason, renderArgs, renderProps, _yield$rendererType$r, html, data;
|
|
68
|
+
|
|
69
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
70
|
+
while (1) {
|
|
71
|
+
switch (_context.prev = _context.next) {
|
|
72
|
+
case 0:
|
|
73
|
+
if (props) {
|
|
74
|
+
_context.next = 2;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
throw new Error('cannot render with no props');
|
|
79
|
+
|
|
80
|
+
case 2:
|
|
81
|
+
rendererType = props.rendererType, rpcManager = props.rpcManager, cannotBeRenderedReason = props.cannotBeRenderedReason, renderArgs = props.renderArgs, renderProps = props.renderProps;
|
|
82
|
+
|
|
83
|
+
if (!cannotBeRenderedReason) {
|
|
84
|
+
_context.next = 5;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return _context.abrupt("return", {
|
|
89
|
+
message: cannotBeRenderedReason
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
case 5:
|
|
93
|
+
if (!(!props.renderProps.radius || !props.renderArgs.regions || !props.renderArgs.regions.length)) {
|
|
94
|
+
_context.next = 7;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return _context.abrupt("return", {
|
|
99
|
+
message: 'Skipping render'
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
case 7:
|
|
103
|
+
if (self.isCompatibleWithRenderer(rendererType)) {
|
|
104
|
+
_context.next = 9;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
throw new Error("renderer ".concat(rendererType.name, " is not compatible with this display type"));
|
|
109
|
+
|
|
110
|
+
case 9:
|
|
111
|
+
_context.next = 11;
|
|
112
|
+
return rendererType.renderInClient(rpcManager, _objectSpread(_objectSpread(_objectSpread({}, renderArgs), renderProps), {}, {
|
|
113
|
+
signal: signal
|
|
114
|
+
}));
|
|
115
|
+
|
|
116
|
+
case 11:
|
|
117
|
+
_yield$rendererType$r = _context.sent;
|
|
118
|
+
html = _yield$rendererType$r.html;
|
|
119
|
+
data = (0, _objectWithoutProperties2["default"])(_yield$rendererType$r, _excluded);
|
|
120
|
+
return _context.abrupt("return", {
|
|
121
|
+
html: html,
|
|
122
|
+
data: data,
|
|
123
|
+
renderingComponent: rendererType.ReactComponent
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
case 15:
|
|
127
|
+
case "end":
|
|
128
|
+
return _context.stop();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}, _callee);
|
|
132
|
+
}));
|
|
133
|
+
return _renderReactionEffect.apply(this, arguments);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
renderReactionData: renderReactionData,
|
|
138
|
+
renderReactionEffect: renderReactionEffect
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,203 @@
|
|
|
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 _react = _interopRequireDefault(require("react"));
|
|
11
|
+
|
|
12
|
+
var _mobxReact = require("mobx-react");
|
|
13
|
+
|
|
14
|
+
var _ui = require("@jbrowse/core/ui");
|
|
15
|
+
|
|
16
|
+
var _util = require("@jbrowse/core/util");
|
|
17
|
+
|
|
18
|
+
var _core = require("@material-ui/core");
|
|
19
|
+
|
|
20
|
+
var _colors = require("@material-ui/core/colors");
|
|
21
|
+
|
|
22
|
+
var _ZoomOut = _interopRequireDefault(require("@material-ui/icons/ZoomOut"));
|
|
23
|
+
|
|
24
|
+
var _ZoomIn = _interopRequireDefault(require("@material-ui/icons/ZoomIn"));
|
|
25
|
+
|
|
26
|
+
var _RotateLeft = _interopRequireDefault(require("@material-ui/icons/RotateLeft"));
|
|
27
|
+
|
|
28
|
+
var _RotateRight = _interopRequireDefault(require("@material-ui/icons/RotateRight"));
|
|
29
|
+
|
|
30
|
+
var _LockOutlined = _interopRequireDefault(require("@material-ui/icons/LockOutlined"));
|
|
31
|
+
|
|
32
|
+
var _LockOpen = _interopRequireDefault(require("@material-ui/icons/LockOpen"));
|
|
33
|
+
|
|
34
|
+
var _Icons = require("@jbrowse/core/ui/Icons");
|
|
35
|
+
|
|
36
|
+
var _Ruler = _interopRequireDefault(require("./Ruler"));
|
|
37
|
+
|
|
38
|
+
var _ImportForm = _interopRequireDefault(require("./ImportForm"));
|
|
39
|
+
|
|
40
|
+
// icons
|
|
41
|
+
// locals
|
|
42
|
+
var dragHandleHeight = 3;
|
|
43
|
+
var useStyles = (0, _core.makeStyles)(function (theme) {
|
|
44
|
+
return {
|
|
45
|
+
root: {
|
|
46
|
+
position: 'relative',
|
|
47
|
+
marginBottom: theme.spacing(1),
|
|
48
|
+
overflow: 'hidden',
|
|
49
|
+
background: 'white'
|
|
50
|
+
},
|
|
51
|
+
scroller: {
|
|
52
|
+
overflow: 'auto'
|
|
53
|
+
},
|
|
54
|
+
sliceRoot: {
|
|
55
|
+
background: 'none',
|
|
56
|
+
// background: theme.palette.background.paper,
|
|
57
|
+
boxSizing: 'content-box',
|
|
58
|
+
display: 'block'
|
|
59
|
+
},
|
|
60
|
+
iconButton: {
|
|
61
|
+
padding: '4px',
|
|
62
|
+
margin: '0 2px 0 2px'
|
|
63
|
+
},
|
|
64
|
+
controls: {
|
|
65
|
+
overflow: 'hidden',
|
|
66
|
+
whiteSpace: 'nowrap',
|
|
67
|
+
position: 'absolute',
|
|
68
|
+
background: _colors.grey[200],
|
|
69
|
+
boxSizing: 'border-box',
|
|
70
|
+
borderRight: '1px solid #a2a2a2',
|
|
71
|
+
borderBottom: '1px solid #a2a2a2',
|
|
72
|
+
left: 0,
|
|
73
|
+
top: 0
|
|
74
|
+
},
|
|
75
|
+
importFormContainer: {
|
|
76
|
+
marginBottom: theme.spacing(4)
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
var Slices = (0, _mobxReact.observer)(function (_ref) {
|
|
81
|
+
var model = _ref.model;
|
|
82
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, model.staticSlices.map(function (slice) {
|
|
83
|
+
return /*#__PURE__*/_react["default"].createElement(_Ruler["default"], {
|
|
84
|
+
key: (0, _util.assembleLocString)(slice.region.elided ? slice.region.regions[0] : slice.region),
|
|
85
|
+
model: model,
|
|
86
|
+
slice: slice
|
|
87
|
+
});
|
|
88
|
+
}), model.tracks.map(function (track) {
|
|
89
|
+
var display = track.displays[0];
|
|
90
|
+
return /*#__PURE__*/_react["default"].createElement(display.RenderingComponent, {
|
|
91
|
+
key: display.id,
|
|
92
|
+
display: display,
|
|
93
|
+
view: model
|
|
94
|
+
});
|
|
95
|
+
}));
|
|
96
|
+
});
|
|
97
|
+
var Controls = (0, _mobxReact.observer)(function (_ref2) {
|
|
98
|
+
var model = _ref2.model,
|
|
99
|
+
showingFigure = _ref2.showingFigure;
|
|
100
|
+
var classes = useStyles();
|
|
101
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
102
|
+
className: classes.controls
|
|
103
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
104
|
+
onClick: model.zoomOutButton,
|
|
105
|
+
className: classes.iconButton,
|
|
106
|
+
title: model.lockedFitToWindow ? 'unlock to zoom out' : 'zoom out',
|
|
107
|
+
disabled: !showingFigure || model.atMaxBpPerPx || model.lockedFitToWindow,
|
|
108
|
+
color: "secondary"
|
|
109
|
+
}, /*#__PURE__*/_react["default"].createElement(_ZoomOut["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
110
|
+
onClick: model.zoomInButton,
|
|
111
|
+
className: classes.iconButton,
|
|
112
|
+
title: "zoom in",
|
|
113
|
+
disabled: !showingFigure || model.atMinBpPerPx,
|
|
114
|
+
color: "secondary"
|
|
115
|
+
}, /*#__PURE__*/_react["default"].createElement(_ZoomIn["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
116
|
+
onClick: model.rotateCounterClockwiseButton,
|
|
117
|
+
className: classes.iconButton,
|
|
118
|
+
title: "rotate counter-clockwise",
|
|
119
|
+
disabled: !showingFigure,
|
|
120
|
+
color: "secondary"
|
|
121
|
+
}, /*#__PURE__*/_react["default"].createElement(_RotateLeft["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
122
|
+
onClick: model.rotateClockwiseButton,
|
|
123
|
+
className: classes.iconButton,
|
|
124
|
+
title: "rotate clockwise",
|
|
125
|
+
disabled: !showingFigure,
|
|
126
|
+
color: "secondary"
|
|
127
|
+
}, /*#__PURE__*/_react["default"].createElement(_RotateRight["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
128
|
+
onClick: model.toggleFitToWindowLock,
|
|
129
|
+
className: classes.iconButton,
|
|
130
|
+
title: model.lockedFitToWindow ? 'locked model to window size' : 'unlocked model to zoom further',
|
|
131
|
+
disabled: model.tooSmallToLock,
|
|
132
|
+
color: "secondary"
|
|
133
|
+
}, model.lockedFitToWindow ? /*#__PURE__*/_react["default"].createElement(_LockOutlined["default"], null) : /*#__PURE__*/_react["default"].createElement(_LockOpen["default"], null)), model.hideTrackSelectorButton ? null : /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
134
|
+
onClick: model.activateTrackSelector,
|
|
135
|
+
title: "Open track selector",
|
|
136
|
+
"data-testid": "circular_track_select",
|
|
137
|
+
color: "secondary"
|
|
138
|
+
}, /*#__PURE__*/_react["default"].createElement(_Icons.TrackSelector, null)));
|
|
139
|
+
});
|
|
140
|
+
var CircularView = (0, _mobxReact.observer)(function (_ref3) {
|
|
141
|
+
var model = _ref3.model;
|
|
142
|
+
var classes = useStyles();
|
|
143
|
+
var initialized = !!model.displayedRegions.length && model.figureWidth && model.figureHeight;
|
|
144
|
+
var showImportForm = !initialized && !model.disableImportForm;
|
|
145
|
+
var showFigure = initialized && !showImportForm;
|
|
146
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
147
|
+
className: classes.root,
|
|
148
|
+
style: {
|
|
149
|
+
width: model.width,
|
|
150
|
+
height: model.height
|
|
151
|
+
},
|
|
152
|
+
"data-testid": model.id
|
|
153
|
+
}, model.error ? /*#__PURE__*/_react["default"].createElement(_ui.ErrorMessage, {
|
|
154
|
+
error: model.error
|
|
155
|
+
}) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, showImportForm ? /*#__PURE__*/_react["default"].createElement(_ImportForm["default"], {
|
|
156
|
+
model: model
|
|
157
|
+
}) : null, /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !showFigure ? null : /*#__PURE__*/_react["default"].createElement("div", {
|
|
158
|
+
className: classes.scroller,
|
|
159
|
+
style: {
|
|
160
|
+
width: model.width,
|
|
161
|
+
height: model.height
|
|
162
|
+
}
|
|
163
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
164
|
+
className: classes.rotator,
|
|
165
|
+
style: {
|
|
166
|
+
transform: ["rotate(".concat(model.offsetRadians, "rad)")].join(' '),
|
|
167
|
+
transition: 'transform 0.5s',
|
|
168
|
+
transformOrigin: model.centerXY.map(function (x) {
|
|
169
|
+
return "".concat(x, "px");
|
|
170
|
+
}).join(' ')
|
|
171
|
+
}
|
|
172
|
+
}, /*#__PURE__*/_react["default"].createElement("svg", {
|
|
173
|
+
style: {
|
|
174
|
+
position: 'absolute',
|
|
175
|
+
left: 0,
|
|
176
|
+
top: 0
|
|
177
|
+
},
|
|
178
|
+
className: classes.sliceRoot,
|
|
179
|
+
width: "".concat(model.figureWidth, "px"),
|
|
180
|
+
height: "".concat(model.figureHeight, "px"),
|
|
181
|
+
version: "1.1"
|
|
182
|
+
}, /*#__PURE__*/_react["default"].createElement("g", {
|
|
183
|
+
transform: "translate(".concat(model.centerXY, ")")
|
|
184
|
+
}, /*#__PURE__*/_react["default"].createElement(Slices, {
|
|
185
|
+
model: model
|
|
186
|
+
}))))), /*#__PURE__*/_react["default"].createElement(Controls, {
|
|
187
|
+
model: model,
|
|
188
|
+
showingFigure: showFigure
|
|
189
|
+
}), model.hideVerticalResizeHandle ? null : /*#__PURE__*/_react["default"].createElement(_ui.ResizeHandle, {
|
|
190
|
+
onDrag: model.resizeHeight,
|
|
191
|
+
style: {
|
|
192
|
+
height: dragHandleHeight,
|
|
193
|
+
position: 'absolute',
|
|
194
|
+
bottom: 0,
|
|
195
|
+
left: 0,
|
|
196
|
+
background: '#ccc',
|
|
197
|
+
boxSizing: 'border-box',
|
|
198
|
+
borderTop: '1px solid #fafafa'
|
|
199
|
+
}
|
|
200
|
+
}))));
|
|
201
|
+
});
|
|
202
|
+
var _default = CircularView;
|
|
203
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,97 @@
|
|
|
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 _core = require("@material-ui/core");
|
|
17
|
+
|
|
18
|
+
var _mobxReact = require("mobx-react");
|
|
19
|
+
|
|
20
|
+
var _util = require("@jbrowse/core/util");
|
|
21
|
+
|
|
22
|
+
var _ErrorMessage = _interopRequireDefault(require("@jbrowse/core/ui/ErrorMessage"));
|
|
23
|
+
|
|
24
|
+
var _AssemblySelector = _interopRequireDefault(require("@jbrowse/core/ui/AssemblySelector"));
|
|
25
|
+
|
|
26
|
+
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); }
|
|
27
|
+
|
|
28
|
+
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; }
|
|
29
|
+
|
|
30
|
+
var useStyles = (0, _core.makeStyles)(function (theme) {
|
|
31
|
+
return {
|
|
32
|
+
importFormContainer: {
|
|
33
|
+
marginBottom: theme.spacing(4)
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}); // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
|
|
38
|
+
var ImportForm = (0, _mobxReact.observer)(function (_ref) {
|
|
39
|
+
var model = _ref.model;
|
|
40
|
+
var classes = useStyles();
|
|
41
|
+
var session = (0, _util.getSession)(model);
|
|
42
|
+
var modelError = model.error;
|
|
43
|
+
var assemblyNames = session.assemblyNames,
|
|
44
|
+
assemblyManager = session.assemblyManager;
|
|
45
|
+
|
|
46
|
+
var _useState = (0, _react.useState)(assemblyNames[0]),
|
|
47
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
48
|
+
selectedAsm = _useState2[0],
|
|
49
|
+
setSelectedAsm = _useState2[1];
|
|
50
|
+
|
|
51
|
+
var _useState3 = (0, _react.useState)(modelError),
|
|
52
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
53
|
+
error = _useState4[0],
|
|
54
|
+
setError = _useState4[1];
|
|
55
|
+
|
|
56
|
+
var assembly = assemblyManager.get(selectedAsm);
|
|
57
|
+
var assemblyError = assemblyNames.length ? assembly === null || assembly === void 0 ? void 0 : assembly.error : 'No configured assemblies';
|
|
58
|
+
var regions = (assembly === null || assembly === void 0 ? void 0 : assembly.regions) || [];
|
|
59
|
+
var err = assemblyError || error;
|
|
60
|
+
return /*#__PURE__*/_react["default"].createElement(_core.Container, {
|
|
61
|
+
className: classes.importFormContainer
|
|
62
|
+
}, err ? /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
63
|
+
container: true,
|
|
64
|
+
spacing: 1,
|
|
65
|
+
justifyContent: "center",
|
|
66
|
+
alignItems: "center"
|
|
67
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
68
|
+
item: true
|
|
69
|
+
}, /*#__PURE__*/_react["default"].createElement(_ErrorMessage["default"], {
|
|
70
|
+
error: err
|
|
71
|
+
}))) : null, /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
72
|
+
container: true,
|
|
73
|
+
spacing: 1,
|
|
74
|
+
justifyContent: "center",
|
|
75
|
+
alignItems: "center"
|
|
76
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
77
|
+
item: true
|
|
78
|
+
}, /*#__PURE__*/_react["default"].createElement(_AssemblySelector["default"], {
|
|
79
|
+
onChange: function onChange(val) {
|
|
80
|
+
setError(undefined);
|
|
81
|
+
setSelectedAsm(val);
|
|
82
|
+
},
|
|
83
|
+
session: session,
|
|
84
|
+
selected: selectedAsm
|
|
85
|
+
})), /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
86
|
+
item: true
|
|
87
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
88
|
+
disabled: !(regions !== null && regions !== void 0 && regions.length),
|
|
89
|
+
onClick: function onClick() {
|
|
90
|
+
return model.setDisplayedRegions(regions);
|
|
91
|
+
},
|
|
92
|
+
variant: "contained",
|
|
93
|
+
color: "primary"
|
|
94
|
+
}, regions.length ? 'Open' : 'Loading…'))));
|
|
95
|
+
});
|
|
96
|
+
var _default = ImportForm;
|
|
97
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,205 @@
|
|
|
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 _react = _interopRequireDefault(require("react"));
|
|
13
|
+
|
|
14
|
+
var _mobxReact = require("mobx-react");
|
|
15
|
+
|
|
16
|
+
var _util = require("@jbrowse/core/util");
|
|
17
|
+
|
|
18
|
+
var _color = require("@jbrowse/core/util/color");
|
|
19
|
+
|
|
20
|
+
var _styles = require("@material-ui/core/styles");
|
|
21
|
+
|
|
22
|
+
var useStyles = (0, _styles.makeStyles)({
|
|
23
|
+
rulerLabel: {
|
|
24
|
+
fontSize: '0.8rem',
|
|
25
|
+
fontWeight: 500,
|
|
26
|
+
lineHeight: 1.6,
|
|
27
|
+
letterSpacing: '0.0075em'
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
function sliceArcPath(slice, radiusPx, startBase, endBase) {
|
|
32
|
+
// A rx ry x-axis-rotation large-arc-flag sweep-flag x y
|
|
33
|
+
if (slice.flipped) {
|
|
34
|
+
;
|
|
35
|
+
var _ref = [endBase, startBase];
|
|
36
|
+
startBase = _ref[0];
|
|
37
|
+
endBase = _ref[1];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
var startXY = slice.bpToXY(startBase, radiusPx);
|
|
41
|
+
var endXY = slice.bpToXY(endBase, radiusPx);
|
|
42
|
+
var largeArc = Math.abs(endBase - startBase) / slice.bpPerRadian > Math.PI ? '1' : '0';
|
|
43
|
+
var sweepFlag = '1';
|
|
44
|
+
return ['M'].concat((0, _toConsumableArray2["default"])(startXY), ['A', radiusPx, radiusPx, '0', largeArc, sweepFlag], (0, _toConsumableArray2["default"])(endXY)).join(' ');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
var ElisionRulerArc = (0, _mobxReact.observer)(function (_ref2) {
|
|
48
|
+
var model = _ref2.model,
|
|
49
|
+
slice = _ref2.slice;
|
|
50
|
+
var theme = (0, _styles.useTheme)();
|
|
51
|
+
var modelRadiusPx = model.radiusPx;
|
|
52
|
+
var radiusPx = modelRadiusPx + 1;
|
|
53
|
+
var endRadians = slice.endRadians,
|
|
54
|
+
startRadians = slice.startRadians,
|
|
55
|
+
region = slice.region;
|
|
56
|
+
var startXY = (0, _util.polarToCartesian)(radiusPx, startRadians);
|
|
57
|
+
var endXY = (0, _util.polarToCartesian)(radiusPx, endRadians);
|
|
58
|
+
var widthPx = (endRadians - startRadians) * radiusPx;
|
|
59
|
+
var largeArc = endRadians - startRadians > Math.PI ? '1' : '0'; // TODO: draw the elision
|
|
60
|
+
|
|
61
|
+
var centerRadians = (endRadians + startRadians) / 2;
|
|
62
|
+
var regionCountString = "[".concat(Number(region.regions.length).toLocaleString(), "]");
|
|
63
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(RulerLabel, {
|
|
64
|
+
text: regionCountString,
|
|
65
|
+
view: model,
|
|
66
|
+
maxWidthPx: widthPx,
|
|
67
|
+
radians: centerRadians,
|
|
68
|
+
radiusPx: radiusPx,
|
|
69
|
+
title: "".concat(Number(region.regions.length).toLocaleString(), " more regions"),
|
|
70
|
+
color: theme.palette.text.primary
|
|
71
|
+
}), /*#__PURE__*/_react["default"].createElement("path", {
|
|
72
|
+
d: ['M'].concat((0, _toConsumableArray2["default"])(startXY), ['A', radiusPx, radiusPx, '0', largeArc, '1'], (0, _toConsumableArray2["default"])(endXY)).join(' '),
|
|
73
|
+
stroke: theme.palette.text.secondary,
|
|
74
|
+
strokeWidth: 2,
|
|
75
|
+
strokeDasharray: "2,2",
|
|
76
|
+
fill: "none"
|
|
77
|
+
}));
|
|
78
|
+
});
|
|
79
|
+
var RulerLabel = (0, _mobxReact.observer)(function (_ref3) {
|
|
80
|
+
var view = _ref3.view,
|
|
81
|
+
text = _ref3.text,
|
|
82
|
+
maxWidthPx = _ref3.maxWidthPx,
|
|
83
|
+
radians = _ref3.radians,
|
|
84
|
+
radiusPx = _ref3.radiusPx,
|
|
85
|
+
title = _ref3.title,
|
|
86
|
+
color = _ref3.color;
|
|
87
|
+
var classes = useStyles();
|
|
88
|
+
var textXY = (0, _util.polarToCartesian)(radiusPx + 5, radians);
|
|
89
|
+
|
|
90
|
+
if (!text) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (text.length * 6.5 < maxWidthPx) {
|
|
95
|
+
// text is rotated parallel to the ruler arc
|
|
96
|
+
return /*#__PURE__*/_react["default"].createElement("text", {
|
|
97
|
+
x: 0,
|
|
98
|
+
y: 0,
|
|
99
|
+
className: classes.rulerLabel,
|
|
100
|
+
textAnchor: "middle",
|
|
101
|
+
dominantBaseline: "baseline",
|
|
102
|
+
transform: "translate(".concat(textXY, ") rotate(").concat((0, _util.radToDeg)(radians) + 90, ")"),
|
|
103
|
+
style: {
|
|
104
|
+
fill: color
|
|
105
|
+
}
|
|
106
|
+
}, text, /*#__PURE__*/_react["default"].createElement("title", null, title || text));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (maxWidthPx > 4) {
|
|
110
|
+
// text is rotated perpendicular to the ruler arc
|
|
111
|
+
var overallRotation = (0, _util.radToDeg)(radians + view.offsetRadians - Math.PI / 2);
|
|
112
|
+
|
|
113
|
+
if (overallRotation >= 180) {
|
|
114
|
+
return /*#__PURE__*/_react["default"].createElement("text", {
|
|
115
|
+
x: 0,
|
|
116
|
+
y: 0,
|
|
117
|
+
className: classes.rulerLabel,
|
|
118
|
+
textAnchor: "start",
|
|
119
|
+
dominantBaseline: "middle",
|
|
120
|
+
transform: "translate(".concat(textXY, ") rotate(").concat((0, _util.radToDeg)(radians), ")"),
|
|
121
|
+
style: {
|
|
122
|
+
fill: color
|
|
123
|
+
}
|
|
124
|
+
}, text, /*#__PURE__*/_react["default"].createElement("title", null, title || text));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return /*#__PURE__*/_react["default"].createElement("text", {
|
|
128
|
+
x: 0,
|
|
129
|
+
y: 0,
|
|
130
|
+
className: classes.rulerLabel,
|
|
131
|
+
textAnchor: "end",
|
|
132
|
+
dominantBaseline: "middle",
|
|
133
|
+
transform: "translate(".concat(textXY, ") rotate(").concat((0, _util.radToDeg)(radians) + 180, ")"),
|
|
134
|
+
style: {
|
|
135
|
+
fill: color
|
|
136
|
+
}
|
|
137
|
+
}, text, /*#__PURE__*/_react["default"].createElement("title", null, title || text));
|
|
138
|
+
} // if you get here there is no room for the text at all
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
return null;
|
|
142
|
+
});
|
|
143
|
+
var RegionRulerArc = (0, _mobxReact.observer)(function (_ref4) {
|
|
144
|
+
var model = _ref4.model,
|
|
145
|
+
slice = _ref4.slice;
|
|
146
|
+
var theme = (0, _styles.useTheme)();
|
|
147
|
+
var radiusPx = model.radiusPx;
|
|
148
|
+
var region = slice.region,
|
|
149
|
+
endRadians = slice.endRadians,
|
|
150
|
+
startRadians = slice.startRadians;
|
|
151
|
+
var centerRadians = (endRadians + startRadians) / 2;
|
|
152
|
+
var widthPx = (endRadians - startRadians) * radiusPx;
|
|
153
|
+
var session = (0, _util.getSession)(model);
|
|
154
|
+
var color;
|
|
155
|
+
var assembly = session.assemblyManager.get(slice.region.assemblyName);
|
|
156
|
+
|
|
157
|
+
if (assembly) {
|
|
158
|
+
color = assembly.getRefNameColor(region.refName);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (color) {
|
|
162
|
+
try {
|
|
163
|
+
color = (0, _color.makeContrasting)(color, theme.palette.background.paper);
|
|
164
|
+
} catch (error) {
|
|
165
|
+
color = theme.palette.text.primary;
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
color = theme.palette.text.primary;
|
|
169
|
+
} // TODO: slice flipping
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(RulerLabel, {
|
|
173
|
+
text: region.refName,
|
|
174
|
+
view: model,
|
|
175
|
+
maxWidthPx: widthPx,
|
|
176
|
+
radians: centerRadians,
|
|
177
|
+
radiusPx: radiusPx,
|
|
178
|
+
color: color
|
|
179
|
+
}), /*#__PURE__*/_react["default"].createElement("path", {
|
|
180
|
+
d: sliceArcPath(slice, radiusPx + 1, region.start, region.end),
|
|
181
|
+
stroke: color,
|
|
182
|
+
strokeWidth: 2,
|
|
183
|
+
fill: "none"
|
|
184
|
+
}, /*#__PURE__*/_react["default"].createElement("title", null, region.refName)));
|
|
185
|
+
});
|
|
186
|
+
var CircularRuler = (0, _mobxReact.observer)(function Ruler(_ref5) {
|
|
187
|
+
var model = _ref5.model,
|
|
188
|
+
slice = _ref5.slice;
|
|
189
|
+
|
|
190
|
+
if (slice.region.elided) {
|
|
191
|
+
return /*#__PURE__*/_react["default"].createElement(ElisionRulerArc, {
|
|
192
|
+
key: (0, _util.assembleLocString)(slice.region.regions[0]),
|
|
193
|
+
model: model,
|
|
194
|
+
slice: slice
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return /*#__PURE__*/_react["default"].createElement(RegionRulerArc, {
|
|
199
|
+
key: (0, _util.assembleLocString)(slice.region),
|
|
200
|
+
model: model,
|
|
201
|
+
slice: slice
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
var _default = CircularRuler;
|
|
205
|
+
exports["default"] = _default;
|