@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.
Files changed (86) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail.d.ts +14 -4
  2. package/BaseFeatureWidget/BaseFeatureDetail.js +97 -63
  3. package/BaseFeatureWidget/SequenceFeatureDetails.js +21 -15
  4. package/BaseFeatureWidget/index.d.ts +2 -2
  5. package/BaseFeatureWidget/index.js +5 -3
  6. package/BaseFeatureWidget/index.test.js +48 -30
  7. package/BaseFeatureWidget/types.d.ts +1 -0
  8. package/PluginManager.d.ts +68 -104
  9. package/ReExports/Attributes.d.ts +2 -0
  10. package/ReExports/Attributes.js +12 -0
  11. package/ReExports/BaseCard.d.ts +2 -0
  12. package/ReExports/BaseCard.js +12 -0
  13. package/ReExports/DataGrid.d.ts +2 -0
  14. package/ReExports/DataGrid.js +13 -0
  15. package/ReExports/FeatureDetails.d.ts +2 -0
  16. package/ReExports/FeatureDetails.js +12 -0
  17. package/ReExports/list.js +1 -1
  18. package/ReExports/material-ui-colors.d.ts +1 -19
  19. package/ReExports/material-ui-colors.js +11 -152
  20. package/ReExports/modules.d.ts +69 -109
  21. package/ReExports/modules.js +683 -127
  22. package/TextSearch/TextSearchManager.d.ts +3 -1
  23. package/assemblyManager/assembly.d.ts +6 -7
  24. package/assemblyManager/assembly.js +27 -16
  25. package/assemblyManager/assemblyManager.d.ts +82 -24
  26. package/assemblyManager/assemblyManager.js +11 -9
  27. package/configuration/util.d.ts +1 -1
  28. package/package.json +14 -16
  29. package/pluggableElementTypes/models/BaseDisplayModel.d.ts +10 -10
  30. package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -1
  31. package/pluggableElementTypes/models/BaseTrackModel.js +24 -25
  32. package/pluggableElementTypes/renderers/FeatureRendererType.js +17 -8
  33. package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +2 -2
  34. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +2 -2
  35. package/pluggableElementTypes/renderers/ServerSideRendererType.js +1 -1
  36. package/rpc/BaseRpcDriver.js +1 -1
  37. package/rpc/coreRpcMethods.d.ts +1 -3
  38. package/rpc/coreRpcMethods.js +5 -5
  39. package/tsconfig.build.tsbuildinfo +1 -1
  40. package/ui/AboutDialog.js +15 -10
  41. package/ui/App.js +18 -37
  42. package/ui/AssemblySelector.d.ts +1 -1
  43. package/ui/AssemblySelector.js +10 -5
  44. package/ui/CascadingMenu.js +10 -14
  45. package/ui/Drawer.js +8 -5
  46. package/ui/DrawerWidget.js +39 -45
  47. package/ui/DropDownMenu.d.ts +0 -8
  48. package/ui/DropDownMenu.js +9 -15
  49. package/ui/EditableTypography.d.ts +1 -1
  50. package/ui/EditableTypography.js +42 -48
  51. package/ui/ErrorMessage.js +13 -23
  52. package/ui/FactoryResetDialog.js +6 -6
  53. package/ui/FatalErrorDialog.js +5 -5
  54. package/ui/FileSelector/FileSelector.js +19 -19
  55. package/ui/FileSelector/LocalFileChooser.js +12 -8
  56. package/ui/FileSelector/UrlChooser.js +2 -2
  57. package/ui/Icons.d.ts +1 -1
  58. package/ui/Icons.js +1 -1
  59. package/ui/Menu.d.ts +1 -1
  60. package/ui/Menu.js +28 -29
  61. package/ui/PrerenderedCanvas.js +10 -1
  62. package/ui/ResizeHandle.js +8 -6
  63. package/ui/ReturnToImportFormDialog.js +14 -10
  64. package/ui/SanitizedHTML.js +15 -21
  65. package/ui/Snackbar.js +11 -9
  66. package/ui/Tooltip.d.ts +3 -1
  67. package/ui/Tooltip.js +5 -3
  68. package/ui/ViewContainer.js +38 -25
  69. package/ui/theme.d.ts +279 -131
  70. package/ui/theme.js +174 -154
  71. package/ui/theme.test.js +56 -75
  72. package/util/Base1DUtils.d.ts +32 -0
  73. package/util/Base1DUtils.js +213 -0
  74. package/util/Base1DViewModel.d.ts +16 -37
  75. package/util/Base1DViewModel.js +34 -166
  76. package/util/color/index.js +6 -6
  77. package/util/index.d.ts +12 -21
  78. package/util/index.js +29 -90
  79. package/util/layouts/GranularRectLayout.js +1 -3
  80. package/util/layouts/PrecomputedLayout.js +1 -3
  81. package/util/offscreenCanvasPonyfill.js +10 -12
  82. package/util/tracks.js +4 -2
  83. package/util/types/index.d.ts +14 -4
  84. package/util/types/index.js +6 -0
  85. package/util/types/mst.d.ts +3 -3
  86. 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: (props?: any) => import("@material-ui/styles").ClassNameMap<"expandIcon" | "expansionPanelDetails" | "field" | "fieldDescription" | "fieldName" | "fieldValue" | "fieldSubvalue">;
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.ReactElement;
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.ReactElement;
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.ReactElement) | undefined;
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 _core = require("@material-ui/core");
29
+ var _material = require("@mui/material");
30
30
 
31
- var _ExpandMore = _interopRequireDefault(require("@material-ui/icons/ExpandMore"));
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, _core.makeStyles)(function (theme) {
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
- var classes = useStyles();
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(_core.Accordion, {
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(_core.AccordionSummary, {
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(_core.Typography, {
142
+ }, /*#__PURE__*/_react.default.createElement(_material.Typography, {
139
143
  variant: "button"
140
- }, " ", title)), /*#__PURE__*/_react.default.createElement(_core.AccordionDetails, {
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
- var classes = useStyles();
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(_core.Tooltip, {
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: (0, _clsx.default)(classes.fieldDescription, classes.fieldName)
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
- var classes = useStyles();
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
- var classes = useStyles();
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
- var classes = useStyles();
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 = ['Position', 'Description', 'Name', 'Length', 'Type'];
280
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, coreRenderedDetails.map(function (key) {
281
- return [key, displayedDetails[key.toLowerCase()]];
282
- }).filter(function (_ref6) {
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
- value = _ref7[1];
305
+ key = _ref7[0],
306
+ name = _ref7[1];
285
307
 
286
- return value !== null && value !== undefined;
287
- }).map(function (_ref8) {
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: key,
294
- name: key,
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(_ref10) {
309
- var value = _ref10.value,
310
- prefix = _ref10.prefix,
311
- name = _ref10.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 (_ref11) {
323
- var _ref12 = (0, _slicedToArray2.default)(_ref11, 2),
324
- k = _ref12[0],
325
- val = _ref12[1];
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)(String(row[val]), 14) + 50, 80), 1000);
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: 20,
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(_ref13) {
405
- var value = _ref13.value,
406
- prefix = _ref13.prefix,
407
- name = _ref13.name;
408
- var classes = useStyles();
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 (_ref14) {
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
- }).map(function (_ref18) {
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
- key = _ref19[0],
464
- value = _ref19[1];
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 > 2 && value.every(function (val) {
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: labelWidth
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(_core.Typography, null, "Core details"), /*#__PURE__*/_react.default.createElement(CoreDetails, props), /*#__PURE__*/_react.default.createElement(_core.Divider, null), /*#__PURE__*/_react.default.createElement(_core.Typography, null, "Attributes"), /*#__PURE__*/_react.default.createElement(Attributes, (0, _extends2.default)({
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(_ref20) {
557
- var error = _ref20.error;
558
- return /*#__PURE__*/_react.default.createElement(_core.Typography, {
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 _core = require("@material-ui/core");
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, _core.makeStyles)(function (theme) {
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
- var classes = useStyles();
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(_core.Select, {
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(_core.MenuItem, {
435
+ }, hasCDS ? /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
430
436
  value: "cds"
431
- }, "CDS") : null, hasCDS ? /*#__PURE__*/_react.default.createElement(_core.MenuItem, {
437
+ }, "CDS") : null, hasCDS ? /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
432
438
  value: "protein"
433
- }, "Protein") : null, /*#__PURE__*/_react.default.createElement(_core.MenuItem, {
439
+ }, "Protein") : null, /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
434
440
  value: "gene"
435
- }, "Gene w/ introns"), /*#__PURE__*/_react.default.createElement(_core.MenuItem, {
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(_core.MenuItem, {
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(_core.MenuItem, {
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(_core.MenuItem, {
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(_core.Button, {
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(_core.Tooltip, {
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(_core.Button, {
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(_core.Typography, {
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
- var unformattedFeatureData = snap.unformattedFeatureData,
115
- featureData = snap.featureData,
116
- rest = (0, _objectWithoutProperties2.default)(snap, _excluded2); // finalizedFeatureData avoids running formatter twice if loading from
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
- test('open up a widget', function () {
20
- console.warn = jest.fn();
21
- var pluginManager = new _PluginManager.default([]);
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
- var Session = _mobxStateTree.types.model({
24
- pluginManager: _mobxStateTree.types.optional(_mobxStateTree.types.frozen(), {}),
25
- rpcManager: _mobxStateTree.types.optional(_mobxStateTree.types.frozen(), {}),
26
- configuration: (0, _configuration.ConfigurationSchema)('test', {}),
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
- var model = Session.create({
31
- widget: {
32
- type: 'BaseFeatureWidget'
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 & {