@jbrowse/core 1.7.10 → 2.0.1
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/BaseFeatureWidget/BaseFeatureDetail.d.ts +14 -4
- package/BaseFeatureWidget/BaseFeatureDetail.js +97 -63
- package/BaseFeatureWidget/SequenceFeatureDetails.js +21 -15
- package/BaseFeatureWidget/index.d.ts +2 -2
- package/BaseFeatureWidget/index.js +5 -3
- package/BaseFeatureWidget/index.test.js +48 -30
- package/BaseFeatureWidget/types.d.ts +1 -0
- package/PluginManager.d.ts +68 -104
- package/ReExports/Attributes.d.ts +2 -0
- package/ReExports/Attributes.js +12 -0
- package/ReExports/BaseCard.d.ts +2 -0
- package/ReExports/BaseCard.js +12 -0
- package/ReExports/DataGrid.d.ts +2 -0
- package/ReExports/DataGrid.js +13 -0
- package/ReExports/FeatureDetails.d.ts +2 -0
- package/ReExports/FeatureDetails.js +12 -0
- package/ReExports/list.js +1 -1
- package/ReExports/material-ui-colors.d.ts +1 -19
- package/ReExports/material-ui-colors.js +11 -152
- package/ReExports/modules.d.ts +69 -109
- package/ReExports/modules.js +683 -127
- package/TextSearch/TextSearchManager.d.ts +3 -1
- package/assemblyManager/assembly.d.ts +6 -7
- package/assemblyManager/assembly.js +27 -16
- package/assemblyManager/assemblyManager.d.ts +82 -24
- package/assemblyManager/assemblyManager.js +11 -9
- package/configuration/util.d.ts +1 -1
- package/package.json +14 -16
- package/pluggableElementTypes/models/BaseDisplayModel.d.ts +10 -10
- package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -1
- package/pluggableElementTypes/models/BaseTrackModel.js +24 -25
- package/pluggableElementTypes/renderers/FeatureRendererType.js +17 -8
- package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +2 -2
- package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +2 -2
- package/pluggableElementTypes/renderers/ServerSideRendererType.js +1 -1
- package/rpc/BaseRpcDriver.js +1 -1
- package/rpc/coreRpcMethods.d.ts +1 -3
- package/rpc/coreRpcMethods.js +5 -5
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/AboutDialog.js +15 -10
- package/ui/App.js +18 -37
- package/ui/AssemblySelector.d.ts +1 -1
- package/ui/AssemblySelector.js +10 -5
- package/ui/CascadingMenu.js +10 -14
- package/ui/Drawer.js +8 -5
- package/ui/DrawerWidget.js +39 -45
- package/ui/DropDownMenu.d.ts +0 -8
- package/ui/DropDownMenu.js +9 -15
- package/ui/EditableTypography.d.ts +1 -1
- package/ui/EditableTypography.js +42 -48
- package/ui/ErrorMessage.js +13 -23
- package/ui/FactoryResetDialog.js +6 -6
- package/ui/FatalErrorDialog.js +5 -5
- package/ui/FileSelector/FileSelector.js +19 -19
- package/ui/FileSelector/LocalFileChooser.js +12 -8
- package/ui/FileSelector/UrlChooser.js +2 -2
- package/ui/Icons.d.ts +1 -1
- package/ui/Icons.js +1 -1
- package/ui/Menu.d.ts +1 -1
- package/ui/Menu.js +28 -29
- package/ui/PrerenderedCanvas.js +10 -1
- package/ui/ResizeHandle.js +8 -6
- package/ui/ReturnToImportFormDialog.js +14 -10
- package/ui/SanitizedHTML.js +15 -21
- package/ui/Snackbar.js +11 -9
- package/ui/Tooltip.d.ts +3 -1
- package/ui/Tooltip.js +5 -3
- package/ui/ViewContainer.js +38 -25
- package/ui/theme.d.ts +279 -131
- package/ui/theme.js +174 -154
- package/ui/theme.test.js +56 -75
- package/util/Base1DUtils.d.ts +32 -0
- package/util/Base1DUtils.js +213 -0
- package/util/Base1DViewModel.d.ts +16 -37
- package/util/Base1DViewModel.js +34 -166
- package/util/color/index.js +6 -6
- package/util/index.d.ts +12 -21
- package/util/index.js +29 -90
- package/util/layouts/GranularRectLayout.js +1 -3
- package/util/layouts/PrecomputedLayout.js +1 -3
- package/util/offscreenCanvasPonyfill.js +10 -12
- package/util/tracks.js +4 -2
- package/util/types/index.d.ts +14 -4
- package/util/types/index.js +6 -0
- package/util/types/mst.d.ts +3 -3
- package/util/types/mst.js +11 -7
|
@@ -2,7 +2,17 @@ import React from 'react';
|
|
|
2
2
|
import { IAnyStateTreeNode } from 'mobx-state-tree';
|
|
3
3
|
import { BaseCardProps, BaseProps } from './types';
|
|
4
4
|
import { SimpleFeatureSerialized } from '../util/simpleFeature';
|
|
5
|
-
export declare const useStyles: (
|
|
5
|
+
export declare const useStyles: (params: void, styleOverrides?: {
|
|
6
|
+
props: {
|
|
7
|
+
classes?: Record<string, string> | undefined;
|
|
8
|
+
} & Record<string, unknown>;
|
|
9
|
+
ownerState?: Record<string, unknown> | undefined;
|
|
10
|
+
} | undefined) => {
|
|
11
|
+
classes: Record<"expansionPanelDetails" | "expandIcon" | "field" | "fieldDescription" | "fieldName" | "fieldValue" | "fieldSubvalue", string>;
|
|
12
|
+
theme: import("@mui/material").Theme;
|
|
13
|
+
css: import("tss-react/types").Css;
|
|
14
|
+
cx: import("tss-react/types").Cx;
|
|
15
|
+
};
|
|
6
16
|
export declare function BaseCard({ children, title, defaultExpanded, }: BaseCardProps): JSX.Element;
|
|
7
17
|
export declare const FieldName: ({ description, name, width, prefix, }: {
|
|
8
18
|
description?: React.ReactNode;
|
|
@@ -24,7 +34,7 @@ export declare const BaseCoreDetails: (props: BaseProps) => JSX.Element;
|
|
|
24
34
|
interface AttributeProps {
|
|
25
35
|
attributes: Record<string, any>;
|
|
26
36
|
omit?: string[];
|
|
27
|
-
formatter?: (val: unknown, key: string) => React.
|
|
37
|
+
formatter?: (val: unknown, key: string) => React.ReactNode;
|
|
28
38
|
descriptions?: Record<string, React.ReactNode>;
|
|
29
39
|
prefix?: string[];
|
|
30
40
|
}
|
|
@@ -34,14 +44,14 @@ export interface BaseInputProps extends BaseCardProps {
|
|
|
34
44
|
omit?: string[];
|
|
35
45
|
model: any;
|
|
36
46
|
descriptions?: Record<string, React.ReactNode>;
|
|
37
|
-
formatter?: (val: unknown, key: string) => React.
|
|
47
|
+
formatter?: (val: unknown, key: string) => React.ReactNode;
|
|
38
48
|
}
|
|
39
49
|
export declare const FeatureDetails: (props: {
|
|
40
50
|
model: IAnyStateTreeNode;
|
|
41
51
|
feature: SimpleFeatureSerialized;
|
|
42
52
|
depth?: number | undefined;
|
|
43
53
|
omit?: string[] | undefined;
|
|
44
|
-
formatter?: ((val: unknown, key: string) => React.
|
|
54
|
+
formatter?: ((val: unknown, key: string) => React.ReactNode) | undefined;
|
|
45
55
|
}) => JSX.Element;
|
|
46
56
|
declare const BaseFeatureDetails: (props: BaseInputProps) => JSX.Element | null;
|
|
47
57
|
export default BaseFeatureDetails;
|
|
@@ -26,16 +26,16 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
26
26
|
|
|
27
27
|
var _reactErrorBoundary = require("react-error-boundary");
|
|
28
28
|
|
|
29
|
-
var
|
|
29
|
+
var _material = require("@mui/material");
|
|
30
30
|
|
|
31
|
-
var
|
|
31
|
+
var _mui = require("tss-react/mui");
|
|
32
|
+
|
|
33
|
+
var _ExpandMore = _interopRequireDefault(require("@mui/icons-material/ExpandMore"));
|
|
32
34
|
|
|
33
35
|
var _xDataGrid = require("@mui/x-data-grid");
|
|
34
36
|
|
|
35
37
|
var _mobxReact = require("mobx-react");
|
|
36
38
|
|
|
37
|
-
var _clsx = _interopRequireDefault(require("clsx"));
|
|
38
|
-
|
|
39
39
|
var _isObject = _interopRequireDefault(require("is-object"));
|
|
40
40
|
|
|
41
41
|
var _configuration = require("../configuration");
|
|
@@ -64,7 +64,7 @@ var MAX_FIELD_NAME_WIDTH = 170; // these are always omitted as too detailed
|
|
|
64
64
|
var globalOmit = ['__jbrowsefmt', 'length', 'position', 'subfeatures', 'uniqueId', 'exonFrames', 'parentId', 'thickStart', 'thickEnd']; // coreDetails are omitted in some circumstances
|
|
65
65
|
|
|
66
66
|
var coreDetails = ['name', 'start', 'end', 'strand', 'refName', 'description', 'type'];
|
|
67
|
-
var useStyles = (0,
|
|
67
|
+
var useStyles = (0, _mui.makeStyles)()(function (theme) {
|
|
68
68
|
return {
|
|
69
69
|
expansionPanelDetails: {
|
|
70
70
|
display: 'block',
|
|
@@ -86,6 +86,7 @@ var useStyles = (0, _core.makeStyles)(function (theme) {
|
|
|
86
86
|
wordBreak: 'break-all',
|
|
87
87
|
minWidth: '90px',
|
|
88
88
|
borderBottom: '1px solid #0003',
|
|
89
|
+
fontSize: 12,
|
|
89
90
|
background: theme.palette.grey[200],
|
|
90
91
|
marginRight: theme.spacing(1),
|
|
91
92
|
padding: theme.spacing(0.5)
|
|
@@ -93,6 +94,7 @@ var useStyles = (0, _core.makeStyles)(function (theme) {
|
|
|
93
94
|
fieldValue: {
|
|
94
95
|
wordBreak: 'break-word',
|
|
95
96
|
maxHeight: 300,
|
|
97
|
+
fontSize: 12,
|
|
96
98
|
padding: theme.spacing(0.5),
|
|
97
99
|
overflow: 'auto'
|
|
98
100
|
},
|
|
@@ -114,14 +116,16 @@ function BaseCard(_ref) {
|
|
|
114
116
|
title = _ref.title,
|
|
115
117
|
_ref$defaultExpanded = _ref.defaultExpanded,
|
|
116
118
|
defaultExpanded = _ref$defaultExpanded === void 0 ? true : _ref$defaultExpanded;
|
|
117
|
-
|
|
119
|
+
|
|
120
|
+
var _useStyles = useStyles(),
|
|
121
|
+
classes = _useStyles.classes;
|
|
118
122
|
|
|
119
123
|
var _useState = (0, _react.useState)(defaultExpanded),
|
|
120
124
|
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
121
125
|
expanded = _useState2[0],
|
|
122
126
|
setExpanded = _useState2[1];
|
|
123
127
|
|
|
124
|
-
return /*#__PURE__*/_react.default.createElement(
|
|
128
|
+
return /*#__PURE__*/_react.default.createElement(_material.Accordion, {
|
|
125
129
|
expanded: expanded,
|
|
126
130
|
onChange: function onChange() {
|
|
127
131
|
return setExpanded(function (s) {
|
|
@@ -131,13 +135,13 @@ function BaseCard(_ref) {
|
|
|
131
135
|
TransitionProps: {
|
|
132
136
|
unmountOnExit: true
|
|
133
137
|
}
|
|
134
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
138
|
+
}, /*#__PURE__*/_react.default.createElement(_material.AccordionSummary, {
|
|
135
139
|
expandIcon: /*#__PURE__*/_react.default.createElement(_ExpandMore.default, {
|
|
136
140
|
className: classes.expandIcon
|
|
137
141
|
})
|
|
138
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
142
|
+
}, /*#__PURE__*/_react.default.createElement(_material.Typography, {
|
|
139
143
|
variant: "button"
|
|
140
|
-
}, " ", title)), /*#__PURE__*/_react.default.createElement(
|
|
144
|
+
}, " ", title)), /*#__PURE__*/_react.default.createElement(_material.AccordionDetails, {
|
|
141
145
|
className: classes.expansionPanelDetails
|
|
142
146
|
}, children));
|
|
143
147
|
}
|
|
@@ -148,13 +152,17 @@ var FieldName = function FieldName(_ref2) {
|
|
|
148
152
|
width = _ref2.width,
|
|
149
153
|
_ref2$prefix = _ref2.prefix,
|
|
150
154
|
prefix = _ref2$prefix === void 0 ? [] : _ref2$prefix;
|
|
151
|
-
|
|
155
|
+
|
|
156
|
+
var _useStyles2 = useStyles(),
|
|
157
|
+
classes = _useStyles2.classes,
|
|
158
|
+
cx = _useStyles2.cx;
|
|
159
|
+
|
|
152
160
|
var val = [].concat((0, _toConsumableArray2.default)(prefix), [name]).join('.');
|
|
153
|
-
return description ? /*#__PURE__*/_react.default.createElement(
|
|
161
|
+
return description ? /*#__PURE__*/_react.default.createElement(_material.Tooltip, {
|
|
154
162
|
title: description,
|
|
155
163
|
placement: "left"
|
|
156
164
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
157
|
-
className: (
|
|
165
|
+
className: cx(classes.fieldDescription, classes.fieldName)
|
|
158
166
|
}, val)) : /*#__PURE__*/_react.default.createElement("div", {
|
|
159
167
|
className: classes.fieldName,
|
|
160
168
|
style: {
|
|
@@ -167,7 +175,10 @@ exports.FieldName = FieldName;
|
|
|
167
175
|
|
|
168
176
|
var BasicValue = function BasicValue(_ref3) {
|
|
169
177
|
var value = _ref3.value;
|
|
170
|
-
|
|
178
|
+
|
|
179
|
+
var _useStyles3 = useStyles(),
|
|
180
|
+
classes = _useStyles3.classes;
|
|
181
|
+
|
|
171
182
|
var isLink = "".concat(value).match(/^https?:\/\//);
|
|
172
183
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
173
184
|
className: classes.fieldValue
|
|
@@ -186,7 +197,10 @@ var SimpleValue = function SimpleValue(_ref4) {
|
|
|
186
197
|
description = _ref4.description,
|
|
187
198
|
prefix = _ref4.prefix,
|
|
188
199
|
width = _ref4.width;
|
|
189
|
-
|
|
200
|
+
|
|
201
|
+
var _useStyles4 = useStyles(),
|
|
202
|
+
classes = _useStyles4.classes;
|
|
203
|
+
|
|
190
204
|
return value !== null && value !== undefined ? /*#__PURE__*/_react.default.createElement("div", {
|
|
191
205
|
className: classes.field
|
|
192
206
|
}, /*#__PURE__*/_react.default.createElement(FieldName, {
|
|
@@ -207,7 +221,9 @@ var ArrayValue = function ArrayValue(_ref5) {
|
|
|
207
221
|
description = _ref5.description,
|
|
208
222
|
_ref5$prefix = _ref5.prefix,
|
|
209
223
|
prefix = _ref5$prefix === void 0 ? [] : _ref5$prefix;
|
|
210
|
-
|
|
224
|
+
|
|
225
|
+
var _useStyles5 = useStyles(),
|
|
226
|
+
classes = _useStyles5.classes;
|
|
211
227
|
|
|
212
228
|
if (value.length === 1) {
|
|
213
229
|
return (0, _isObject.default)(value[0]) ? /*#__PURE__*/_react.default.createElement(Attributes, {
|
|
@@ -276,22 +292,33 @@ function CoreDetails(props) {
|
|
|
276
292
|
position: "".concat(refName, ":").concat(toLocale(start + 1), "..").concat(toLocale(end), " ").concat(str)
|
|
277
293
|
});
|
|
278
294
|
|
|
279
|
-
var coreRenderedDetails =
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
295
|
+
var coreRenderedDetails = {
|
|
296
|
+
position: 'Position',
|
|
297
|
+
description: 'Description',
|
|
298
|
+
name: 'Name',
|
|
299
|
+
length: 'Length',
|
|
300
|
+
type: 'Type',
|
|
301
|
+
assemblyName: 'Assembly name'
|
|
302
|
+
};
|
|
303
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, Object.entries(coreRenderedDetails).map(function (_ref6) {
|
|
283
304
|
var _ref7 = (0, _slicedToArray2.default)(_ref6, 2),
|
|
284
|
-
|
|
305
|
+
key = _ref7[0],
|
|
306
|
+
name = _ref7[1];
|
|
285
307
|
|
|
286
|
-
return
|
|
287
|
-
}).
|
|
308
|
+
return [name, displayedDetails[key]];
|
|
309
|
+
}).filter(function (_ref8) {
|
|
288
310
|
var _ref9 = (0, _slicedToArray2.default)(_ref8, 2),
|
|
289
|
-
key = _ref9[0],
|
|
290
311
|
value = _ref9[1];
|
|
291
312
|
|
|
313
|
+
return value !== null && value !== undefined;
|
|
314
|
+
}).map(function (_ref10) {
|
|
315
|
+
var _ref11 = (0, _slicedToArray2.default)(_ref10, 2),
|
|
316
|
+
name = _ref11[0],
|
|
317
|
+
value = _ref11[1];
|
|
318
|
+
|
|
292
319
|
return /*#__PURE__*/_react.default.createElement(SimpleValue, {
|
|
293
|
-
key:
|
|
294
|
-
name:
|
|
320
|
+
key: name,
|
|
321
|
+
name: name,
|
|
295
322
|
value: value
|
|
296
323
|
});
|
|
297
324
|
}));
|
|
@@ -305,10 +332,10 @@ var BaseCoreDetails = function BaseCoreDetails(props) {
|
|
|
305
332
|
|
|
306
333
|
exports.BaseCoreDetails = BaseCoreDetails;
|
|
307
334
|
|
|
308
|
-
var DataGridDetails = function DataGridDetails(
|
|
309
|
-
var value =
|
|
310
|
-
prefix =
|
|
311
|
-
name =
|
|
335
|
+
var DataGridDetails = function DataGridDetails(_ref12) {
|
|
336
|
+
var value = _ref12.value,
|
|
337
|
+
prefix = _ref12.prefix,
|
|
338
|
+
name = _ref12.name;
|
|
312
339
|
var keys = Object.keys(value[0]).sort();
|
|
313
340
|
var unionKeys = new Set(keys);
|
|
314
341
|
value.forEach(function (val) {
|
|
@@ -319,10 +346,10 @@ var DataGridDetails = function DataGridDetails(_ref10) {
|
|
|
319
346
|
|
|
320
347
|
if (unionKeys.size < keys.length + 5) {
|
|
321
348
|
// avoids key 'id' from being used in row data
|
|
322
|
-
var rows = Object.entries(value).map(function (
|
|
323
|
-
var
|
|
324
|
-
k =
|
|
325
|
-
val =
|
|
349
|
+
var rows = Object.entries(value).map(function (_ref13) {
|
|
350
|
+
var _ref14 = (0, _slicedToArray2.default)(_ref13, 2),
|
|
351
|
+
k = _ref14[0],
|
|
352
|
+
val = _ref14[1];
|
|
326
353
|
|
|
327
354
|
var id = val.id,
|
|
328
355
|
rest = (0, _objectWithoutProperties2.default)(val, _excluded);
|
|
@@ -343,11 +370,18 @@ var DataGridDetails = function DataGridDetails(_ref10) {
|
|
|
343
370
|
colNames = (0, _toConsumableArray2.default)(unionKeys);
|
|
344
371
|
}
|
|
345
372
|
|
|
373
|
+
var getStr = function getStr(obj) {
|
|
374
|
+
return (0, _isObject.default)(obj) ? JSON.stringify(obj) : String(obj);
|
|
375
|
+
};
|
|
376
|
+
|
|
346
377
|
var columns = colNames.map(function (val) {
|
|
347
378
|
return {
|
|
348
379
|
field: val,
|
|
380
|
+
renderCell: function renderCell(val) {
|
|
381
|
+
return getStr(val.formattedValue);
|
|
382
|
+
},
|
|
349
383
|
width: Math.max.apply(Math, (0, _toConsumableArray2.default)(rows.map(function (row) {
|
|
350
|
-
return Math.min(Math.max((0, _util.measureText)(
|
|
384
|
+
return Math.min(Math.max((0, _util.measureText)(getStr(row[val]), 14) + 50, 80), 1000);
|
|
351
385
|
})))
|
|
352
386
|
};
|
|
353
387
|
}); // disableSelection on click helps avoid
|
|
@@ -363,11 +397,9 @@ var DataGridDetails = function DataGridDetails(_ref10) {
|
|
|
363
397
|
}
|
|
364
398
|
}, /*#__PURE__*/_react.default.createElement(_xDataGrid.DataGrid, {
|
|
365
399
|
disableSelectionOnClick: true,
|
|
366
|
-
rowHeight:
|
|
367
|
-
headerHeight: 25,
|
|
400
|
+
rowHeight: 25,
|
|
368
401
|
rows: rows,
|
|
369
402
|
rowsPerPageOptions: [],
|
|
370
|
-
hideFooterRowCount: true,
|
|
371
403
|
hideFooterSelectedRowCount: true,
|
|
372
404
|
columns: columns,
|
|
373
405
|
hideFooter: rows.length < 100
|
|
@@ -401,11 +433,14 @@ function generateMaxWidth(array, prefix) {
|
|
|
401
433
|
return Math.ceil(Math.max.apply(Math, arr)) + 10;
|
|
402
434
|
}
|
|
403
435
|
|
|
404
|
-
function UriAttribute(
|
|
405
|
-
var value =
|
|
406
|
-
prefix =
|
|
407
|
-
name =
|
|
408
|
-
|
|
436
|
+
function UriAttribute(_ref15) {
|
|
437
|
+
var value = _ref15.value,
|
|
438
|
+
prefix = _ref15.prefix,
|
|
439
|
+
name = _ref15.name;
|
|
440
|
+
|
|
441
|
+
var _useStyles6 = useStyles(),
|
|
442
|
+
classes = _useStyles6.classes;
|
|
443
|
+
|
|
409
444
|
var uri = value.uri,
|
|
410
445
|
_value$baseUri = value.baseUri,
|
|
411
446
|
baseUri = _value$baseUri === void 0 ? '' : _value$baseUri;
|
|
@@ -444,31 +479,30 @@ function Attributes(props) {
|
|
|
444
479
|
|
|
445
480
|
var formattedAttributes = _objectSpread(_objectSpread({}, rest), __jbrowsefmt);
|
|
446
481
|
|
|
447
|
-
var maxLabelWidth = generateMaxWidth(Object.entries(formattedAttributes).filter(function (
|
|
448
|
-
var _ref15 = (0, _slicedToArray2.default)(_ref14, 2),
|
|
449
|
-
k = _ref15[0],
|
|
450
|
-
v = _ref15[1];
|
|
451
|
-
|
|
452
|
-
return v !== undefined && !omits.includes(k);
|
|
453
|
-
}), prefix);
|
|
454
|
-
var labelWidth = maxLabelWidth <= MAX_FIELD_NAME_WIDTH ? maxLabelWidth : MAX_FIELD_NAME_WIDTH;
|
|
455
|
-
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, Object.entries(formattedAttributes).filter(function (_ref16) {
|
|
482
|
+
var maxLabelWidth = generateMaxWidth(Object.entries(formattedAttributes).filter(function (_ref16) {
|
|
456
483
|
var _ref17 = (0, _slicedToArray2.default)(_ref16, 2),
|
|
457
484
|
k = _ref17[0],
|
|
458
485
|
v = _ref17[1];
|
|
459
486
|
|
|
460
487
|
return v !== undefined && !omits.includes(k);
|
|
461
|
-
})
|
|
488
|
+
}), prefix);
|
|
489
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, Object.entries(formattedAttributes).filter(function (_ref18) {
|
|
462
490
|
var _ref19 = (0, _slicedToArray2.default)(_ref18, 2),
|
|
463
|
-
|
|
464
|
-
|
|
491
|
+
k = _ref19[0],
|
|
492
|
+
v = _ref19[1];
|
|
493
|
+
|
|
494
|
+
return v !== undefined && !omits.includes(k);
|
|
495
|
+
}).map(function (_ref20) {
|
|
496
|
+
var _ref21 = (0, _slicedToArray2.default)(_ref20, 2),
|
|
497
|
+
key = _ref21[0],
|
|
498
|
+
value = _ref21[1];
|
|
465
499
|
|
|
466
500
|
var description = accessNested([].concat((0, _toConsumableArray2.default)(prefix), [key]), descriptions);
|
|
467
501
|
|
|
468
502
|
if (Array.isArray(value)) {
|
|
469
503
|
// check if it looks like an array of objects, which could be used
|
|
470
504
|
// in data grid
|
|
471
|
-
return value.length >
|
|
505
|
+
return value.length > 1 && value.every(function (val) {
|
|
472
506
|
return (0, _isObject.default)(val);
|
|
473
507
|
}) ? /*#__PURE__*/_react.default.createElement(DataGridDetails, {
|
|
474
508
|
key: key,
|
|
@@ -488,13 +522,13 @@ function Attributes(props) {
|
|
|
488
522
|
name: key,
|
|
489
523
|
prefix: prefix,
|
|
490
524
|
value: value
|
|
491
|
-
}) : /*#__PURE__*/_react.default.createElement(Attributes, {
|
|
525
|
+
}) : /*#__PURE__*/_react.default.createElement(Attributes, (0, _extends2.default)({}, props, {
|
|
492
526
|
omit: omits,
|
|
493
527
|
key: key,
|
|
494
528
|
attributes: value,
|
|
495
529
|
descriptions: descriptions,
|
|
496
530
|
prefix: [].concat((0, _toConsumableArray2.default)(prefix), [key])
|
|
497
|
-
});
|
|
531
|
+
}));
|
|
498
532
|
} else {
|
|
499
533
|
return /*#__PURE__*/_react.default.createElement(SimpleValue, {
|
|
500
534
|
key: key,
|
|
@@ -502,7 +536,7 @@ function Attributes(props) {
|
|
|
502
536
|
value: formatter(value, key),
|
|
503
537
|
description: description,
|
|
504
538
|
prefix: prefix,
|
|
505
|
-
width:
|
|
539
|
+
width: Math.min(maxLabelWidth, MAX_FIELD_NAME_WIDTH)
|
|
506
540
|
});
|
|
507
541
|
}
|
|
508
542
|
}));
|
|
@@ -548,14 +582,14 @@ var FeatureDetails = function FeatureDetails(props) {
|
|
|
548
582
|
var sequenceTypes = (0, _configuration.getConf)(session, ['featureDetails', 'sequenceTypes']) || defaultSeqTypes;
|
|
549
583
|
return /*#__PURE__*/_react.default.createElement(BaseCard, {
|
|
550
584
|
title: generateTitle(name, id, type)
|
|
551
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
585
|
+
}, /*#__PURE__*/_react.default.createElement(_material.Typography, null, "Core details"), /*#__PURE__*/_react.default.createElement(CoreDetails, props), /*#__PURE__*/_react.default.createElement(_material.Divider, null), /*#__PURE__*/_react.default.createElement(_material.Typography, null, "Attributes"), /*#__PURE__*/_react.default.createElement(Attributes, (0, _extends2.default)({
|
|
552
586
|
attributes: feature
|
|
553
587
|
}, props, {
|
|
554
588
|
omit: [].concat((0, _toConsumableArray2.default)(omit), coreDetails)
|
|
555
589
|
})), sequenceTypes.includes(feature.type) ? /*#__PURE__*/_react.default.createElement(_reactErrorBoundary.ErrorBoundary, {
|
|
556
|
-
FallbackComponent: function FallbackComponent(
|
|
557
|
-
var error =
|
|
558
|
-
return /*#__PURE__*/_react.default.createElement(
|
|
590
|
+
FallbackComponent: function FallbackComponent(_ref22) {
|
|
591
|
+
var error = _ref22.error;
|
|
592
|
+
return /*#__PURE__*/_react.default.createElement(_material.Typography, {
|
|
559
593
|
color: "error"
|
|
560
594
|
}, "".concat(error));
|
|
561
595
|
}
|
|
@@ -22,7 +22,9 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
|
|
|
22
22
|
|
|
23
23
|
var _react = _interopRequireWildcard(require("react"));
|
|
24
24
|
|
|
25
|
-
var
|
|
25
|
+
var _material = require("@mui/material");
|
|
26
|
+
|
|
27
|
+
var _mui = require("tss-react/mui");
|
|
26
28
|
|
|
27
29
|
var _reactIntersectionObserver = require("react-intersection-observer");
|
|
28
30
|
|
|
@@ -42,7 +44,7 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
|
|
|
42
44
|
|
|
43
45
|
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; }
|
|
44
46
|
|
|
45
|
-
var useStyles = (0,
|
|
47
|
+
var useStyles = (0, _mui.makeStyles)()(function (theme) {
|
|
46
48
|
return {
|
|
47
49
|
button: {
|
|
48
50
|
margin: theme.spacing(1)
|
|
@@ -193,6 +195,7 @@ var SequencePanel = /*#__PURE__*/_react.default.forwardRef(function (_ref4, ref)
|
|
|
193
195
|
style: {
|
|
194
196
|
fontFamily: 'monospace',
|
|
195
197
|
wordWrap: 'break-word',
|
|
198
|
+
fontSize: 12,
|
|
196
199
|
maxWidth: 600
|
|
197
200
|
}
|
|
198
201
|
}, ">".concat(feature.name || feature.id || 'unknown', "-").concat(mode, "\n"), mode === 'cds' ? /*#__PURE__*/_react.default.createElement(GeneCDS, {
|
|
@@ -250,7 +253,10 @@ function SequenceFeatureDetails(_ref6) {
|
|
|
250
253
|
|
|
251
254
|
var model = _ref6.model,
|
|
252
255
|
feature = _ref6.feature;
|
|
253
|
-
|
|
256
|
+
|
|
257
|
+
var _useStyles = useStyles(),
|
|
258
|
+
classes = _useStyles.classes;
|
|
259
|
+
|
|
254
260
|
var parentFeature = feature;
|
|
255
261
|
var hasCDS = (_parentFeature$subfea = parentFeature.subfeatures) === null || _parentFeature$subfea === void 0 ? void 0 : _parentFeature$subfea.find(function (sub) {
|
|
256
262
|
return sub.type === 'CDS';
|
|
@@ -421,26 +427,26 @@ function SequenceFeatureDetails(_ref6) {
|
|
|
421
427
|
var loading = !sequence;
|
|
422
428
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
423
429
|
ref: ref
|
|
424
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
430
|
+
}, /*#__PURE__*/_react.default.createElement(_material.FormControl, null, /*#__PURE__*/_react.default.createElement(_material.Select, {
|
|
425
431
|
value: mode,
|
|
426
432
|
onChange: function onChange(event) {
|
|
427
433
|
return setMode(event.target.value);
|
|
428
434
|
}
|
|
429
|
-
}, hasCDS ? /*#__PURE__*/_react.default.createElement(
|
|
435
|
+
}, hasCDS ? /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
|
|
430
436
|
value: "cds"
|
|
431
|
-
}, "CDS") : null, hasCDS ? /*#__PURE__*/_react.default.createElement(
|
|
437
|
+
}, "CDS") : null, hasCDS ? /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
|
|
432
438
|
value: "protein"
|
|
433
|
-
}, "Protein") : null, /*#__PURE__*/_react.default.createElement(
|
|
439
|
+
}, "Protein") : null, /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
|
|
434
440
|
value: "gene"
|
|
435
|
-
}, "Gene w/ introns"), /*#__PURE__*/_react.default.createElement(
|
|
441
|
+
}, "Gene w/ introns"), /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
|
|
436
442
|
value: "gene_collapsed_intron"
|
|
437
|
-
}, "Gene w/ 10bp of intron"), /*#__PURE__*/_react.default.createElement(
|
|
443
|
+
}, "Gene w/ 10bp of intron"), /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
|
|
438
444
|
value: "gene_updownstream"
|
|
439
|
-
}, "Gene w/ 500bp up+down stream"), /*#__PURE__*/_react.default.createElement(
|
|
445
|
+
}, "Gene w/ 500bp up+down stream"), /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
|
|
440
446
|
value: "gene_updownstream_collapsed_intron"
|
|
441
|
-
}, "Gene w/ 500bp up+down stream w/ 10bp intron"), /*#__PURE__*/_react.default.createElement(
|
|
447
|
+
}, "Gene w/ 500bp up+down stream w/ 10bp intron"), /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
|
|
442
448
|
value: "cdna"
|
|
443
|
-
}, "cDNA")), /*#__PURE__*/_react.default.createElement(
|
|
449
|
+
}, "cDNA"))), /*#__PURE__*/_react.default.createElement(_material.Button, {
|
|
444
450
|
className: classes.button,
|
|
445
451
|
type: "button",
|
|
446
452
|
variant: "contained",
|
|
@@ -457,9 +463,9 @@ function SequenceFeatureDetails(_ref6) {
|
|
|
457
463
|
}, 1000);
|
|
458
464
|
}
|
|
459
465
|
}
|
|
460
|
-
}, copied ? 'Copied to clipboard!' : 'Copy as plaintext'), /*#__PURE__*/_react.default.createElement(
|
|
466
|
+
}, copied ? 'Copied to clipboard!' : 'Copy as plaintext'), /*#__PURE__*/_react.default.createElement(_material.Tooltip, {
|
|
461
467
|
title: "Note that 'Copy as HTML' can retain the colors but cannot be pasted into some programs like notepad that only expect plain text"
|
|
462
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
468
|
+
}, /*#__PURE__*/_react.default.createElement(_material.Button, {
|
|
463
469
|
className: classes.button,
|
|
464
470
|
type: "button",
|
|
465
471
|
variant: "contained",
|
|
@@ -478,7 +484,7 @@ function SequenceFeatureDetails(_ref6) {
|
|
|
478
484
|
}
|
|
479
485
|
}, copiedHtml ? 'Copied to clipboard!' : 'Copy as HTML')), /*#__PURE__*/_react.default.createElement("div", {
|
|
480
486
|
"data-testid": "feature_sequence"
|
|
481
|
-
}, error ? /*#__PURE__*/_react.default.createElement(
|
|
487
|
+
}, error ? /*#__PURE__*/_react.default.createElement(_material.Typography, {
|
|
482
488
|
color: "error"
|
|
483
489
|
}, "".concat(error)) : loading ? /*#__PURE__*/_react.default.createElement("div", null, "Loading gene sequence...") : sequence ? /*#__PURE__*/_react.default.createElement(SequencePanel, {
|
|
484
490
|
ref: seqPanelRef,
|
|
@@ -25,9 +25,9 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
25
25
|
}>>, {
|
|
26
26
|
id: string;
|
|
27
27
|
type: "BaseFeatureWidget";
|
|
28
|
-
formattedFields: any;
|
|
29
|
-
view: import("mobx-state-tree").ReferenceIdentifier | undefined;
|
|
30
28
|
track: import("mobx-state-tree").ReferenceIdentifier | undefined;
|
|
29
|
+
view: import("mobx-state-tree").ReferenceIdentifier | undefined;
|
|
30
|
+
formattedFields: any;
|
|
31
31
|
finalizedFeatureData: any;
|
|
32
32
|
}>;
|
|
33
33
|
export { configSchema, stateModelFactory };
|
|
@@ -111,9 +111,11 @@ function stateModelFactory(pluginManager) {
|
|
|
111
111
|
featureData: finalizedFeatureData
|
|
112
112
|
}, rest);
|
|
113
113
|
}).postProcessSnapshot(function (snap) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
// xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit
|
|
115
|
+
var _ref = snap,
|
|
116
|
+
unformattedFeatureData = _ref.unformattedFeatureData,
|
|
117
|
+
featureData = _ref.featureData,
|
|
118
|
+
rest = (0, _objectWithoutProperties2.default)(_ref, _excluded2); // finalizedFeatureData avoids running formatter twice if loading from
|
|
117
119
|
// snapshot
|
|
118
120
|
|
|
119
121
|
return _objectSpread({
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
6
|
+
|
|
7
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
8
|
+
|
|
5
9
|
var _react = _interopRequireDefault(require("react"));
|
|
6
10
|
|
|
7
11
|
var _react2 = require("@testing-library/react");
|
|
@@ -16,36 +20,50 @@ var _ = require(".");
|
|
|
16
20
|
|
|
17
21
|
var _BaseFeatureDetail = _interopRequireDefault(require("./BaseFeatureDetail"));
|
|
18
22
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
var pluginManager
|
|
23
|
+
// locals
|
|
24
|
+
test('open up a widget', /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
25
|
+
var pluginManager, Session, model, _render, container, findByText;
|
|
26
|
+
|
|
27
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
28
|
+
while (1) {
|
|
29
|
+
switch (_context.prev = _context.next) {
|
|
30
|
+
case 0:
|
|
31
|
+
console.warn = jest.fn();
|
|
32
|
+
pluginManager = new _PluginManager.default([]);
|
|
33
|
+
Session = _mobxStateTree.types.model({
|
|
34
|
+
pluginManager: _mobxStateTree.types.optional(_mobxStateTree.types.frozen(), {}),
|
|
35
|
+
rpcManager: _mobxStateTree.types.optional(_mobxStateTree.types.frozen(), {}),
|
|
36
|
+
configuration: (0, _configuration.ConfigurationSchema)('test', {}),
|
|
37
|
+
widget: (0, _.stateModelFactory)(pluginManager)
|
|
38
|
+
});
|
|
39
|
+
model = Session.create({
|
|
40
|
+
widget: {
|
|
41
|
+
type: 'BaseFeatureWidget'
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
_render = (0, _react2.render)( /*#__PURE__*/_react.default.createElement(_BaseFeatureDetail.default, {
|
|
45
|
+
model: model.widget
|
|
46
|
+
})), container = _render.container, findByText = _render.findByText;
|
|
47
|
+
model.widget.setFeatureData({
|
|
48
|
+
start: 2,
|
|
49
|
+
end: 102,
|
|
50
|
+
strand: 1,
|
|
51
|
+
score: 37,
|
|
52
|
+
refName: 'ctgA'
|
|
53
|
+
});
|
|
54
|
+
_context.t0 = expect;
|
|
55
|
+
_context.next = 9;
|
|
56
|
+
return findByText('ctgA:3..102 (+)');
|
|
22
57
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
widget: (0, _.stateModelFactory)(pluginManager)
|
|
28
|
-
});
|
|
58
|
+
case 9:
|
|
59
|
+
_context.t1 = _context.sent;
|
|
60
|
+
(0, _context.t0)(_context.t1).toBeTruthy();
|
|
61
|
+
expect(container.firstChild).toMatchSnapshot();
|
|
29
62
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
63
|
+
case 12:
|
|
64
|
+
case "end":
|
|
65
|
+
return _context.stop();
|
|
66
|
+
}
|
|
33
67
|
}
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
var _render = (0, _react2.render)( /*#__PURE__*/_react.default.createElement(_BaseFeatureDetail.default, {
|
|
37
|
-
model: model.widget
|
|
38
|
-
})),
|
|
39
|
-
container = _render.container,
|
|
40
|
-
getByText = _render.getByText;
|
|
41
|
-
|
|
42
|
-
model.widget.setFeatureData({
|
|
43
|
-
start: 2,
|
|
44
|
-
end: 102,
|
|
45
|
-
strand: 1,
|
|
46
|
-
score: 37,
|
|
47
|
-
refName: 'ctgA'
|
|
48
|
-
});
|
|
49
|
-
expect(container.firstChild).toMatchSnapshot();
|
|
50
|
-
expect(getByText('ctgA:3..102 (+)')).toBeTruthy();
|
|
51
|
-
});
|
|
68
|
+
}, _callee);
|
|
69
|
+
})));
|
|
@@ -4,6 +4,7 @@ import { SimpleFeatureSerialized } from '../util/simpleFeature';
|
|
|
4
4
|
import { AbstractViewModel } from '../util';
|
|
5
5
|
export interface BaseProps extends BaseCardProps {
|
|
6
6
|
feature: SimpleFeatureSerialized;
|
|
7
|
+
formatter?: (val: unknown, key: string) => React.ReactNode;
|
|
7
8
|
descriptions?: Record<string, React.ReactNode>;
|
|
8
9
|
model?: IAnyStateTreeNode & {
|
|
9
10
|
view?: AbstractViewModel & {
|