@jbrowse/core 1.6.5 → 1.6.8

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 (58) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail.js +1 -3
  2. package/BaseFeatureWidget/index.d.ts +1 -1
  3. package/PluginLoader.d.ts +1 -1
  4. package/PluginManager.d.ts +4 -2
  5. package/ReExports/modules.d.ts +4 -2
  6. package/TextSearch/TextSearchManager.d.ts +2 -2
  7. package/assemblyManager/assemblyConfigSchema.d.ts +1 -1
  8. package/assemblyManager/assemblyManager.d.ts +22 -22
  9. package/configuration/index.d.ts +1 -1
  10. package/configuration/util.js +1 -5
  11. package/data_adapters/BaseAdapter.d.ts +2 -1
  12. package/data_adapters/BaseAdapter.js +90 -110
  13. package/data_adapters/CytobandAdapter.d.ts +1 -1
  14. package/package.json +2 -2
  15. package/pluggableElementTypes/RpcMethodType.js +1 -1
  16. package/pluggableElementTypes/models/InternetAccountModel.d.ts +103 -7
  17. package/pluggableElementTypes/models/InternetAccountModel.js +296 -10
  18. package/pluggableElementTypes/models/baseConnectionConfig.d.ts +1 -1
  19. package/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +1 -1
  20. package/pluggableElementTypes/models/baseInternetAccountConfig.js +16 -1
  21. package/pluggableElementTypes/models/baseTrackConfig.d.ts +1 -1
  22. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.d.ts +1 -0
  23. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +46 -22
  24. package/pluggableElementTypes/renderers/FeatureRendererType.js +14 -19
  25. package/rpc/BaseRpcDriver.d.ts +7 -8
  26. package/rpc/BaseRpcDriver.js +151 -87
  27. package/rpc/BaseRpcDriver.test.js +55 -36
  28. package/rpc/MainThreadRpcDriver.d.ts +1 -1
  29. package/rpc/MainThreadRpcDriver.js +25 -16
  30. package/rpc/RpcManager.d.ts +1 -1
  31. package/rpc/RpcManager.js +29 -11
  32. package/rpc/WebWorkerRpcDriver.d.ts +1 -1
  33. package/rpc/WebWorkerRpcDriver.js +43 -11
  34. package/rpc/configSchema.d.ts +1 -1
  35. package/rpc/configSchema.js +14 -6
  36. package/ui/ErrorMessage.js +23 -8
  37. package/ui/FileSelector/FileSelector.js +1 -1
  38. package/ui/ReturnToImportFormDialog.d.ts +9 -0
  39. package/ui/ReturnToImportFormDialog.js +63 -0
  40. package/ui/Tooltip.d.ts +1 -1
  41. package/ui/Tooltip.js +2 -2
  42. package/ui/index.d.ts +2 -0
  43. package/ui/index.js +18 -0
  44. package/ui/theme.d.ts +8 -0
  45. package/ui/theme.js +9 -0
  46. package/ui/theme.test.js +2 -2
  47. package/util/Base1DViewModel.d.ts +2 -0
  48. package/util/Base1DViewModel.js +9 -0
  49. package/util/index.d.ts +7 -4
  50. package/util/index.js +67 -31
  51. package/util/index.test.js +35 -14
  52. package/util/io/index.d.ts +2 -1
  53. package/util/io/index.js +97 -86
  54. package/util/offscreenCanvasPonyfill.js +2 -2
  55. package/util/simpleFeature.d.ts +4 -0
  56. package/util/tracks.js +4 -1
  57. package/util/types/index.d.ts +2 -2
  58. package/util/types/index.js +3 -3
package/rpc/RpcManager.js CHANGED
@@ -25,6 +25,10 @@ var _WebWorkerRpcDriver = _interopRequireDefault(require("./WebWorkerRpcDriver")
25
25
 
26
26
  var _MainThreadRpcDriver = _interopRequireDefault(require("./MainThreadRpcDriver"));
27
27
 
28
+ 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; }
29
+
30
+ 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; }
31
+
28
32
  var DriverClasses = {
29
33
  WebWorkerRpcDriver: _WebWorkerRpcDriver.default,
30
34
  MainThreadRpcDriver: _MainThreadRpcDriver.default
@@ -54,21 +58,35 @@ var RpcManager = /*#__PURE__*/function () {
54
58
  return driver;
55
59
  }
56
60
 
57
- var backendConfiguration = this.backendConfigurations[backendName];
58
- var DriverClassImpl = DriverClasses[backendName];
61
+ var newDriver;
62
+ var config = this.mainConfiguration.drivers.get('WebWorkerRpcDriver');
59
63
 
60
- if (!DriverClassImpl) {
61
- throw new Error("requested RPC driver \"".concat(backendName, "\" is not installed"));
62
- }
64
+ if (backendName === 'MainThreadRpcDriver') {
65
+ var backendConfiguration = this.backendConfigurations.MainThreadRpcDriver;
63
66
 
64
- if (!backendConfiguration) {
65
- throw new Error("requested RPC driver \"".concat(backendName, "\" is missing config"));
66
- } // eslint-disable-next-line @typescript-eslint/no-explicit-any
67
+ if (!backendConfiguration) {
68
+ throw new Error("requested RPC driver \"".concat(backendName, "\" is missing config"));
69
+ }
67
70
 
71
+ newDriver = new _MainThreadRpcDriver.default(_objectSpread(_objectSpread({}, backendConfiguration), {}, {
72
+ config: config
73
+ }));
74
+ } else if (backendName === 'WebWorkerRpcDriver') {
75
+ var _backendConfiguration = this.backendConfigurations.WebWorkerRpcDriver;
76
+
77
+ if (!_backendConfiguration) {
78
+ throw new Error("requested RPC driver \"".concat(backendName, "\" is missing config"));
79
+ }
80
+
81
+ newDriver = new _WebWorkerRpcDriver.default(_objectSpread(_objectSpread({}, _backendConfiguration), {}, {
82
+ config: config
83
+ }), {
84
+ plugins: this.pluginManager.runtimePluginDefinitions
85
+ });
86
+ } else {
87
+ throw new Error("requested RPC driver \"".concat(backendName, "\" is not installed"));
88
+ }
68
89
 
69
- var newDriver = new DriverClassImpl(backendConfiguration, {
70
- plugins: this.pluginManager.runtimePluginDefinitions
71
- });
72
90
  this.driverObjects.set(backendName, newDriver);
73
91
  return newDriver;
74
92
  }
@@ -24,6 +24,6 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
24
24
  constructor(args: WebWorkerRpcDriverConstructorArgs, workerBootConfiguration: {
25
25
  plugins: PluginDefinition[];
26
26
  });
27
- makeWorker(): WebWorkerHandle;
27
+ makeWorker(): Promise<WebWorkerHandle>;
28
28
  }
29
29
  export {};
@@ -123,17 +123,49 @@ var WebWorkerRpcDriver = /*#__PURE__*/function (_BaseRpcDriver) {
123
123
 
124
124
  (0, _createClass2.default)(WebWorkerRpcDriver, [{
125
125
  key: "makeWorker",
126
- value: function makeWorker() {
127
- // note that we are making a Rpc.Client connection with a worker pool of
128
- // one for each worker, because we want to do our own state-group-aware
129
- // load balancing rather than using librpc's builtin round-robin
130
- var worker = new WebWorkerHandle({
131
- workers: [new this.WorkerClass()]
132
- }); // send the worker its boot configuration using info from the pluginManager
133
-
134
- worker.workers[0].postMessage(this.workerBootConfiguration);
135
- return worker;
136
- }
126
+ value: function () {
127
+ var _makeWorker = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
128
+ var _this2 = this;
129
+
130
+ var worker, p;
131
+ return _regenerator.default.wrap(function _callee2$(_context2) {
132
+ while (1) {
133
+ switch (_context2.prev = _context2.next) {
134
+ case 0:
135
+ // note that we are making a Rpc.Client connection with a worker pool of
136
+ // one for each worker, because we want to do our own state-group-aware
137
+ // load balancing rather than using librpc's builtin round-robin
138
+ worker = new WebWorkerHandle({
139
+ workers: [new this.WorkerClass()]
140
+ }); // send the worker its boot configuration using info from the pluginManager
141
+
142
+ p = new Promise(function (resolve, reject) {
143
+ worker.workers[0].onmessage = function (e) {
144
+ if (e.data === 'ready') {
145
+ resolve(worker);
146
+ } else if (e.data === 'readyForConfig') {
147
+ worker.workers[0].postMessage(_this2.workerBootConfiguration);
148
+ } else {
149
+ reject();
150
+ }
151
+ };
152
+ });
153
+ return _context2.abrupt("return", p);
154
+
155
+ case 3:
156
+ case "end":
157
+ return _context2.stop();
158
+ }
159
+ }
160
+ }, _callee2, this);
161
+ }));
162
+
163
+ function makeWorker() {
164
+ return _makeWorker.apply(this, arguments);
165
+ }
166
+
167
+ return makeWorker;
168
+ }()
137
169
  }]);
138
170
  return WebWorkerRpcDriver;
139
171
  }(_BaseRpcDriver2.default);
@@ -1,2 +1,2 @@
1
- declare const _default: import("../configuration/configurationSchema").AnyConfigurationSchemaType;
1
+ declare const _default: import("../configuration").AnyConfigurationSchemaType;
2
2
  export default _default;
@@ -9,14 +9,22 @@ var _mobxStateTree = require("mobx-state-tree");
9
9
 
10
10
  var _configuration = require("../configuration");
11
11
 
12
- var MainThreadRpcDriverConfigSchema = (0, _configuration.ConfigurationSchema)('MainThreadRpcDriver', {}, {
12
+ var BaseRpcDriverConfigSchema = (0, _configuration.ConfigurationSchema)('BaseRpcDriver', {
13
+ workerCount: {
14
+ type: 'number',
15
+ description: 'The number of workers to use. If 0 (the default) JBrowse will decide how many workers to use.',
16
+ defaultValue: 0
17
+ }
18
+ }, {
13
19
  explicitlyTyped: true
14
20
  });
15
- var WebWorkerRpcDriverConfigSchema = (0, _configuration.ConfigurationSchema)('WebWorkerRpcDriver', {}, {
16
- explicitlyTyped: true
21
+ var MainThreadRpcDriverConfigSchema = (0, _configuration.ConfigurationSchema)('MainThreadRpcDriver', {}, {
22
+ explicitlyTyped: true,
23
+ baseConfiguration: BaseRpcDriverConfigSchema
17
24
  });
18
- var ElectronRpcDriverConfigSchema = (0, _configuration.ConfigurationSchema)('ElectronRpcDriver', {}, {
19
- explicitlyTyped: true
25
+ var WebWorkerRpcDriverConfigSchema = (0, _configuration.ConfigurationSchema)('WebWorkerRpcDriver', {}, {
26
+ explicitlyTyped: true,
27
+ baseConfiguration: BaseRpcDriverConfigSchema
20
28
  });
21
29
 
22
30
  var _default = (0, _configuration.ConfigurationSchema)('RpcOptions', {
@@ -25,7 +33,7 @@ var _default = (0, _configuration.ConfigurationSchema)('RpcOptions', {
25
33
  description: 'the RPC driver to use for tracks and tasks that are not configured to use a specific RPC backend',
26
34
  defaultValue: 'MainThreadRpcDriver'
27
35
  },
28
- drivers: _mobxStateTree.types.optional(_mobxStateTree.types.map(_mobxStateTree.types.union(MainThreadRpcDriverConfigSchema, WebWorkerRpcDriverConfigSchema, ElectronRpcDriverConfigSchema)), {
36
+ drivers: _mobxStateTree.types.optional(_mobxStateTree.types.map(_mobxStateTree.types.union(MainThreadRpcDriverConfigSchema, WebWorkerRpcDriverConfigSchema)), {
29
37
  MainThreadRpcDriver: {
30
38
  type: 'MainThreadRpcDriver'
31
39
  }
@@ -32,22 +32,37 @@ var useStyles = (0, _core.makeStyles)(function (theme) {
32
32
  var ErrorMessage = function ErrorMessage(_ref) {
33
33
  var error = _ref.error;
34
34
  var classes = useStyles();
35
+ var snapshotError = '';
35
36
  var str = "".concat(error);
36
- var snapshotError = ''; // best effort to make a better error message than the default
37
- // mobx-state-tree
37
+ var findStr = 'is not assignable';
38
+ var idx = str.indexOf(findStr);
38
39
 
39
- var match = str.match(/.*at path "(.*)" snapshot `(.*)` is not assignable/);
40
+ if (idx !== -1) {
41
+ var trim = str.slice(0, idx + findStr.length); // best effort to make a better error message than the default
42
+ // mobx-state-tree
43
+ // case 1. element has a path
40
44
 
41
- if (match) {
42
- str = "Failed to load element at ".concat(match[1]);
43
- snapshotError = match[2];
45
+ var match = trim.match(/.*at path "(.*)" snapshot `(.*)` is not assignable/m);
46
+
47
+ if (match) {
48
+ str = "Failed to load element at ".concat(match[1], "...Failed element had snapshot");
49
+ snapshotError = match[2];
50
+ } // case 2. element has no path
51
+
52
+
53
+ var match2 = trim.match(/.*snapshot `(.*)` is not assignable/);
54
+
55
+ if (match2) {
56
+ str = "Failed to load element...Failed element had snapshot";
57
+ snapshotError = match2[1];
58
+ }
44
59
  }
45
60
 
46
61
  return /*#__PURE__*/_react.default.createElement("div", {
47
62
  className: classes.message
48
- }, str.slice(0, 10000), snapshotError ? /*#__PURE__*/_react.default.createElement("div", null, "... Failed element had snapshot:", /*#__PURE__*/_react.default.createElement("pre", {
63
+ }, str.slice(0, 10000), snapshotError ? /*#__PURE__*/_react.default.createElement("pre", {
49
64
  className: classes.errorBox
50
- }, JSON.stringify(JSON.parse(snapshotError), null, 2))) : null);
65
+ }, JSON.stringify(JSON.parse(snapshotError), null, 2)) : null);
51
66
  };
52
67
 
53
68
  var _default = ErrorMessage;
@@ -159,7 +159,7 @@ var FileSelector = (0, _mobxReact.observer)(function (props) {
159
159
  value: internetAccountId,
160
160
  "aria-label": name,
161
161
  title: name
162
- }, shorten(toggleContents || name, 5));
162
+ }, typeof toggleContents === 'string' ? shorten(toggleContents, 5) : toggleContents || shorten(name, 5));
163
163
  }), hiddenAccts.length ? /*#__PURE__*/_react.default.createElement(_lab.ToggleButton, {
164
164
  onClick: function onClick(event) {
165
165
  return setAnchorEl(event.target);
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ declare function ReturnToImportFormDialog({ model, handleClose, }: {
3
+ model: {
4
+ clearView: Function;
5
+ };
6
+ handleClose: () => void;
7
+ }): JSX.Element;
8
+ declare const _default: typeof ReturnToImportFormDialog;
9
+ export default _default;
@@ -0,0 +1,63 @@
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 _styles = require("@material-ui/core/styles");
15
+
16
+ var _core = require("@material-ui/core");
17
+
18
+ var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
19
+
20
+ var useStyles = (0, _styles.makeStyles)(function (theme) {
21
+ return {
22
+ closeButton: {
23
+ position: 'absolute',
24
+ right: theme.spacing(1),
25
+ top: theme.spacing(1),
26
+ color: theme.palette.grey[500]
27
+ }
28
+ };
29
+ });
30
+
31
+ function ReturnToImportFormDialog(_ref) {
32
+ var model = _ref.model,
33
+ handleClose = _ref.handleClose;
34
+ var classes = useStyles();
35
+ return /*#__PURE__*/_react.default.createElement(_core.Dialog, {
36
+ maxWidth: "xl",
37
+ open: true,
38
+ onClose: handleClose
39
+ }, /*#__PURE__*/_react.default.createElement(_core.DialogTitle, null, "Reference sequence", handleClose ? /*#__PURE__*/_react.default.createElement(_core.IconButton, {
40
+ className: classes.closeButton,
41
+ onClick: function onClick() {
42
+ return handleClose();
43
+ }
44
+ }, /*#__PURE__*/_react.default.createElement(_Close.default, null)) : null), /*#__PURE__*/_react.default.createElement(_core.Divider, null), /*#__PURE__*/_react.default.createElement(_core.DialogContent, null, /*#__PURE__*/_react.default.createElement(_core.Typography, null, "Are you sure you want to return to the import form? This will lose your current view")), /*#__PURE__*/_react.default.createElement(_core.DialogActions, null, /*#__PURE__*/_react.default.createElement(_core.Button, {
45
+ onClick: function onClick() {
46
+ model.clearView();
47
+ handleClose();
48
+ },
49
+ variant: "contained",
50
+ color: "primary",
51
+ autoFocus: true
52
+ }, "OK"), /*#__PURE__*/_react.default.createElement(_core.Button, {
53
+ onClick: function onClick() {
54
+ return handleClose();
55
+ },
56
+ color: "secondary",
57
+ variant: "contained"
58
+ }, "Cancel")));
59
+ }
60
+
61
+ var _default = (0, _mobxReact.observer)(ReturnToImportFormDialog);
62
+
63
+ exports.default = _default;
package/ui/Tooltip.d.ts CHANGED
@@ -5,7 +5,7 @@ declare const _default: ({ offsetX, offsetY, configuration, feature, timeout, }:
5
5
  offsetY: number;
6
6
  configuration: import("mobx-state-tree").ModelInstanceTypeProps<Record<string, any>> & {
7
7
  setSubschema(slotName: string, data: unknown): any;
8
- } & import("mobx-state-tree").IStateTreeNode<import("../configuration/configurationSchema").AnyConfigurationSchemaType>;
8
+ } & import("mobx-state-tree").IStateTreeNode<import("../configuration").AnyConfigurationSchemaType>;
9
9
  feature?: Feature | undefined;
10
10
  timeout?: number | undefined;
11
11
  }) => JSX.Element | null;
package/ui/Tooltip.js CHANGED
@@ -13,7 +13,7 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
13
13
 
14
14
  var _react = _interopRequireWildcard(require("react"));
15
15
 
16
- var _styles = require("@material-ui/core/styles");
16
+ var _core = require("@material-ui/core");
17
17
 
18
18
  var _mobxReact = require("mobx-react");
19
19
 
@@ -23,7 +23,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
23
23
 
24
24
  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; }
25
25
 
26
- var useStyles = (0, _styles.makeStyles)({
26
+ var useStyles = (0, _core.makeStyles)({
27
27
  hoverLabel: {
28
28
  border: '1px solid black',
29
29
  position: 'absolute',
package/ui/index.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  export * from './theme';
2
2
  export { LogoFull, Logomark } from './Logo';
3
3
  export { default as App } from './App';
4
+ export { default as ReturnToImportFormDialog } from './ReturnToImportFormDialog';
4
5
  export { default as ErrorMessage } from './ErrorMessage';
6
+ export { default as AssemblySelector } from './AssemblySelector';
5
7
  export { default as FileSelector } from './FileSelector';
6
8
  export { default as PrerenderedCanvas } from './PrerenderedCanvas';
7
9
  export { default as ResizeHandle } from './ResizeHandle';
package/ui/index.js CHANGED
@@ -11,7 +11,9 @@ var _exportNames = {
11
11
  LogoFull: true,
12
12
  Logomark: true,
13
13
  App: true,
14
+ ReturnToImportFormDialog: true,
14
15
  ErrorMessage: true,
16
+ AssemblySelector: true,
15
17
  FileSelector: true,
16
18
  PrerenderedCanvas: true,
17
19
  ResizeHandle: true,
@@ -28,6 +30,12 @@ Object.defineProperty(exports, "App", {
28
30
  return _App.default;
29
31
  }
30
32
  });
33
+ Object.defineProperty(exports, "AssemblySelector", {
34
+ enumerable: true,
35
+ get: function get() {
36
+ return _AssemblySelector.default;
37
+ }
38
+ });
31
39
  Object.defineProperty(exports, "EditableTypography", {
32
40
  enumerable: true,
33
41
  get: function get() {
@@ -88,6 +96,12 @@ Object.defineProperty(exports, "ResizeHandle", {
88
96
  return _ResizeHandle.default;
89
97
  }
90
98
  });
99
+ Object.defineProperty(exports, "ReturnToImportFormDialog", {
100
+ enumerable: true,
101
+ get: function get() {
102
+ return _ReturnToImportFormDialog.default;
103
+ }
104
+ });
91
105
  Object.defineProperty(exports, "SanitizedHTML", {
92
106
  enumerable: true,
93
107
  get: function get() {
@@ -119,8 +133,12 @@ var _Logo = require("./Logo");
119
133
 
120
134
  var _App = _interopRequireDefault(require("./App"));
121
135
 
136
+ var _ReturnToImportFormDialog = _interopRequireDefault(require("./ReturnToImportFormDialog"));
137
+
122
138
  var _ErrorMessage = _interopRequireDefault(require("./ErrorMessage"));
123
139
 
140
+ var _AssemblySelector = _interopRequireDefault(require("./AssemblySelector"));
141
+
124
142
  var _FileSelector = _interopRequireDefault(require("./FileSelector"));
125
143
 
126
144
  var _PrerenderedCanvas = _interopRequireDefault(require("./PrerenderedCanvas"));
package/ui/theme.d.ts CHANGED
@@ -115,6 +115,14 @@ export declare function createJBrowseDefaultOverrides(palette?: PaletteOptions):
115
115
  color: string;
116
116
  };
117
117
  };
118
+ MuiAccordion: {
119
+ root: {
120
+ margin: number;
121
+ '&$expanded': {
122
+ margin: number;
123
+ };
124
+ };
125
+ };
118
126
  MuiAccordionSummary: {
119
127
  root: {
120
128
  backgroundColor: string;
package/ui/theme.js CHANGED
@@ -137,6 +137,15 @@ function createJBrowseDefaultOverrides() {
137
137
  color: generatedPalette.tertiary.main
138
138
  }
139
139
  },
140
+ MuiAccordion: {
141
+ root: {
142
+ // avoid extra padding around accordion element
143
+ margin: 0,
144
+ '&$expanded': {
145
+ margin: 0
146
+ }
147
+ }
148
+ },
140
149
  MuiAccordionSummary: {
141
150
  root: {
142
151
  // !important needed to combat the MuiButton being applied to
package/ui/theme.test.js CHANGED
@@ -62,7 +62,7 @@ describe('theme utils', function () {
62
62
  }
63
63
  });
64
64
  expect((_theme$overrides = theme.overrides) === null || _theme$overrides === void 0 ? void 0 : _theme$overrides.MuiPaper).toEqual(muiPaperStyle);
65
- expect(Object.keys(theme.overrides || {}).length).toBe(9);
65
+ expect(Object.keys(theme.overrides || {}).length).toBe(10);
66
66
  });
67
67
  it('allows modifying a default override', function () {
68
68
  var _theme$overrides2;
@@ -78,7 +78,7 @@ describe('theme utils', function () {
78
78
  }
79
79
  });
80
80
  expect((_theme$overrides2 = theme.overrides) === null || _theme$overrides2 === void 0 ? void 0 : _theme$overrides2.MuiButton).toEqual(muiButtonStyle);
81
- expect(Object.keys(theme.overrides || {}).length).toBe(8);
81
+ expect(Object.keys(theme.overrides || {}).length).toBe(9);
82
82
  });
83
83
  it('allows adding a custom prop', function () {
84
84
  var _theme$props;
@@ -9,6 +9,7 @@ export interface BpOffset {
9
9
  end?: number;
10
10
  }
11
11
  declare const Base1DView: import("mobx-state-tree").IModelType<{
12
+ id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
12
13
  displayedRegions: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
13
14
  refName: import("mobx-state-tree").ISimpleType<string>;
14
15
  start: import("mobx-state-tree").ISimpleType<number>;
@@ -32,6 +33,7 @@ declare const Base1DView: import("mobx-state-tree").IModelType<{
32
33
  setVolatileWidth(width: number): void;
33
34
  } & {
34
35
  readonly width: number;
36
+ readonly assemblyNames: string[];
35
37
  readonly displayedRegionsTotalPx: number;
36
38
  readonly maxOffset: number;
37
39
  readonly minOffset: number;
@@ -9,6 +9,8 @@ exports.default = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
12
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
+
12
14
  var _mobxStateTree = require("mobx-state-tree");
13
15
 
14
16
  var _index = require("./index");
@@ -24,6 +26,7 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
24
26
  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; }
25
27
 
26
28
  var Base1DView = _mobxStateTree.types.model('Base1DView', {
29
+ id: _mst.ElementId,
27
30
  displayedRegions: _mobxStateTree.types.array(_mst.Region),
28
31
  bpPerPx: 0,
29
32
  offsetPx: 0,
@@ -52,6 +55,12 @@ var Base1DView = _mobxStateTree.types.model('Base1DView', {
52
55
  return self.volatileWidth;
53
56
  },
54
57
 
58
+ get assemblyNames() {
59
+ return (0, _toConsumableArray2.default)(new Set(self.displayedRegions.map(function (region) {
60
+ return region.assemblyName;
61
+ })));
62
+ },
63
+
55
64
  get displayedRegionsTotalPx() {
56
65
  return this.totalBp / self.bpPerPx;
57
66
  },
package/util/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { IAnyStateTreeNode } from 'mobx-state-tree';
2
2
  import { IReactionPublic, IReactionOptions } from 'mobx';
3
3
  import SimpleFeature, { Feature, isFeature } from './simpleFeature';
4
- import { TypeTestedByPredicate, Region, AssemblyManager } from './types';
4
+ import { AssemblyManager, Region, TypeTestedByPredicate } from './types';
5
+ export type { Feature };
5
6
  export * from './types';
6
7
  export * from './aborting';
7
8
  export * from './when';
@@ -65,6 +66,7 @@ export interface ParsedLocString {
65
66
  refName: string;
66
67
  start?: number;
67
68
  end?: number;
69
+ reversed?: boolean;
68
70
  }
69
71
  export declare function parseLocStringOneBased(locString: string, isValidRefName: (refName: string, assemblyName?: string) => boolean): ParsedLocString;
70
72
  /**
@@ -120,9 +122,9 @@ export declare function clamp(num: number, min: number, max: number): number;
120
122
  * @param region -
121
123
  * @param bpPerPx -
122
124
  */
123
- export declare function bpToPx(bp: number, region: {
124
- start: number;
125
- end: number;
125
+ export declare function bpToPx(bp: number, { reversed, end, start, }: {
126
+ start?: number;
127
+ end?: number;
126
128
  reversed?: boolean;
127
129
  }, bpPerPx: number): number;
128
130
  export declare function radToDeg(radians: number): number;
@@ -338,3 +340,4 @@ export declare function viewBpToPx({ refName, coord, regionNumber, self, }: {
338
340
  index: number;
339
341
  offsetPx: number;
340
342
  } | undefined;
343
+ export declare function getBpDisplayStr(totalBp: number): string;