@jbrowse/plugin-data-management 1.4.4 → 1.5.3

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 (37) hide show
  1. package/dist/AddTrackWidget/components/TrackSourceSelect.d.ts +2 -1
  2. package/dist/AddTrackWidget/model.d.ts +1 -363
  3. package/dist/PluginStoreWidget/components/CustomPluginForm.d.ts +1 -1
  4. package/dist/PluginStoreWidget/components/PluginCard.d.ts +2 -2
  5. package/dist/SetDefaultSession/SetDefaultSession.d.ts +4 -6
  6. package/dist/index.d.ts +8 -12
  7. package/dist/plugin-data-management.cjs.development.js +627 -501
  8. package/dist/plugin-data-management.cjs.development.js.map +1 -1
  9. package/dist/plugin-data-management.cjs.production.min.js +1 -1
  10. package/dist/plugin-data-management.cjs.production.min.js.map +1 -1
  11. package/dist/plugin-data-management.esm.js +614 -507
  12. package/dist/plugin-data-management.esm.js.map +1 -1
  13. package/package.json +3 -2
  14. package/src/AddConnectionWidget/components/AddConnectionWidget.test.js +3 -8
  15. package/src/AddTrackWidget/components/AddTrackWidget.test.js +2 -3
  16. package/src/AddTrackWidget/components/AddTrackWidget.tsx +4 -2
  17. package/src/AddTrackWidget/components/ConfirmTrack.tsx +160 -88
  18. package/src/AddTrackWidget/components/TrackSourceSelect.tsx +30 -23
  19. package/src/AddTrackWidget/components/__snapshots__/AddTrackWidget.test.js.snap +157 -124
  20. package/src/AddTrackWidget/index.test.jsx +78 -26
  21. package/src/AddTrackWidget/model.ts +5 -14
  22. package/src/AssemblyManager/AssemblyAddForm.tsx +7 -6
  23. package/src/AssemblyManager/AssemblyManager.test.tsx +1 -0
  24. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +27 -17
  25. package/src/HierarchicalTrackSelectorWidget/model.js +3 -2
  26. package/src/PluginStoreWidget/components/CustomPluginForm.tsx +164 -56
  27. package/src/PluginStoreWidget/components/InstalledPlugin.tsx +10 -2
  28. package/src/PluginStoreWidget/components/PluginCard.tsx +7 -9
  29. package/src/PluginStoreWidget/components/PluginStoreWidget.test.js +9 -10
  30. package/src/PluginStoreWidget/components/PluginStoreWidget.tsx +36 -26
  31. package/src/PluginStoreWidget/components/__snapshots__/PluginStoreWidget.test.js.snap +89 -51
  32. package/src/SetDefaultSession/SetDefaultSession.test.tsx +7 -81
  33. package/src/SetDefaultSession/SetDefaultSession.tsx +51 -162
  34. package/src/index.ts +1 -51
  35. package/src/ucsc-trackhub/configSchema.js +4 -1
  36. package/src/ucsc-trackhub/model.js +31 -31
  37. package/src/ucsc-trackhub/ucscTrackHub.js +40 -12
@@ -4,19 +4,34 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
6
 
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) { return e; } else {
9
+ var n = {};
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ var d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: function () {
16
+ return e[k];
17
+ }
18
+ });
19
+ });
20
+ }
21
+ n['default'] = e;
22
+ return n;
23
+ }
24
+ }
25
+
7
26
  var React = require('react');
8
27
  var React__default = _interopDefault(React);
9
28
  var ConnectionType = _interopDefault(require('@jbrowse/core/pluggableElementTypes/ConnectionType'));
10
29
  var WidgetType = _interopDefault(require('@jbrowse/core/pluggableElementTypes/WidgetType'));
11
30
  var Plugin = _interopDefault(require('@jbrowse/core/Plugin'));
12
- var util = require('@jbrowse/core/util');
13
- var NoteAddIcon = _interopDefault(require('@material-ui/icons/NoteAdd'));
14
- var InputIcon = _interopDefault(require('@material-ui/icons/Input'));
15
- var ExtensionIcon = _interopDefault(require('@material-ui/icons/Extension'));
16
31
  var models = require('@jbrowse/core/pluggableElementTypes/models');
17
32
  var configuration = require('@jbrowse/core/configuration');
33
+ var util = require('@jbrowse/core/util');
18
34
  var mobxStateTree = require('mobx-state-tree');
19
- var ucscHub = require('@gmod/ucsc-hub');
20
35
  var io = require('@jbrowse/core/util/io');
21
36
  var tracks = require('@jbrowse/core/util/tracks');
22
37
  var mst = require('@jbrowse/core/util/types/mst');
@@ -32,22 +47,8 @@ var types = require('@jbrowse/core/util/types');
32
47
  var PersonIcon = _interopDefault(require('@material-ui/icons/Person'));
33
48
  var AddIcon = _interopDefault(require('@material-ui/icons/Add'));
34
49
  var CheckIcon = _interopDefault(require('@material-ui/icons/Check'));
35
- var Dialog = _interopDefault(require('@material-ui/core/Dialog'));
36
- var DialogTitle = _interopDefault(require('@material-ui/core/DialogTitle'));
37
- var TextField = _interopDefault(require('@material-ui/core/TextField'));
38
- var Button = _interopDefault(require('@material-ui/core/Button'));
50
+ var clsx = _interopDefault(require('clsx'));
39
51
  var IconButton = _interopDefault(require('@material-ui/core/IconButton'));
40
- var DialogContent = _interopDefault(require('@material-ui/core/DialogContent'));
41
- var DialogActions = _interopDefault(require('@material-ui/core/DialogActions'));
42
- var List = _interopDefault(require('@material-ui/core/List'));
43
- var ListItem = _interopDefault(require('@material-ui/core/ListItem'));
44
- var ListItemIcon = _interopDefault(require('@material-ui/core/ListItemIcon'));
45
- var ListItemText = _interopDefault(require('@material-ui/core/ListItemText'));
46
- var ListSubheader = _interopDefault(require('@material-ui/core/ListSubheader'));
47
- var Paper = _interopDefault(require('@material-ui/core/Paper'));
48
- var Typography = _interopDefault(require('@material-ui/core/Typography'));
49
- var Radio = _interopDefault(require('@material-ui/core/Radio'));
50
- var pluralize = _interopDefault(require('pluralize'));
51
52
  var ArrowBackIosIcon = _interopDefault(require('@material-ui/icons/ArrowBackIos'));
52
53
  var CreateIcon = _interopDefault(require('@material-ui/icons/Create'));
53
54
  var DeleteIcon = _interopDefault(require('@material-ui/icons/Delete'));
@@ -61,14 +62,16 @@ var PowerOutlinedIcon = _interopDefault(require('@material-ui/icons/PowerOutline
61
62
  var AutoSizer = _interopDefault(require('react-virtualized-auto-sizer'));
62
63
  var JBrowseMenu = _interopDefault(require('@jbrowse/core/ui/Menu'));
63
64
  var reactVtree = require('react-vtree');
64
- var Link = _interopDefault(require('@material-ui/core/Link'));
65
- var MenuItem = _interopDefault(require('@material-ui/core/MenuItem'));
66
- var ui = require('@jbrowse/core/ui');
67
65
  var lab = require('@material-ui/lab');
66
+ var ui = require('@jbrowse/core/ui');
67
+ var Button = _interopDefault(require('@material-ui/core/Button'));
68
68
  var Step = _interopDefault(require('@material-ui/core/Step'));
69
69
  var StepContent = _interopDefault(require('@material-ui/core/StepContent'));
70
70
  var StepLabel = _interopDefault(require('@material-ui/core/StepLabel'));
71
71
  var Stepper = _interopDefault(require('@material-ui/core/Stepper'));
72
+ var Typography = _interopDefault(require('@material-ui/core/Typography'));
73
+ var MenuItem = _interopDefault(require('@material-ui/core/MenuItem'));
74
+ var TextField = _interopDefault(require('@material-ui/core/TextField'));
72
75
  var OpenInNewIcon = _interopDefault(require('@material-ui/icons/OpenInNew'));
73
76
 
74
77
  function ownKeys(object, enumerableOnly) {
@@ -253,6 +256,8 @@ function _assertThisInitialized(self) {
253
256
  function _possibleConstructorReturn(self, call) {
254
257
  if (call && (typeof call === "object" || typeof call === "function")) {
255
258
  return call;
259
+ } else if (call !== void 0) {
260
+ throw new TypeError("Derived constructors may only return object or undefined");
256
261
  }
257
262
 
258
263
  return _assertThisInitialized(self);
@@ -413,7 +418,8 @@ var ucscConfigSchema = /*#__PURE__*/configuration.ConfigurationSchema('UCSCTrack
413
418
  hubTxtLocation: {
414
419
  type: 'fileLocation',
415
420
  defaultValue: {
416
- uri: 'http://mysite.com/path/to/hub.txt'
421
+ uri: 'http://mysite.com/path/to/hub.txt',
422
+ locationType: 'UriLocation'
417
423
  },
418
424
  description: 'location of the hub file (usually called hub.txt)'
419
425
  },
@@ -523,11 +529,9 @@ var runtime_1 = /*#__PURE__*/createCommonjsModule(function (module) {
523
529
 
524
530
 
525
531
  var IteratorPrototype = {};
526
-
527
- IteratorPrototype[iteratorSymbol] = function () {
532
+ define(IteratorPrototype, iteratorSymbol, function () {
528
533
  return this;
529
- };
530
-
534
+ });
531
535
  var getProto = Object.getPrototypeOf;
532
536
  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
533
537
 
@@ -538,8 +542,9 @@ var runtime_1 = /*#__PURE__*/createCommonjsModule(function (module) {
538
542
  }
539
543
 
540
544
  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
541
- GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
542
- GeneratorFunctionPrototype.constructor = GeneratorFunction;
545
+ GeneratorFunction.prototype = GeneratorFunctionPrototype;
546
+ define(Gp, "constructor", GeneratorFunctionPrototype);
547
+ define(GeneratorFunctionPrototype, "constructor", GeneratorFunction);
543
548
  GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the
544
549
  // Iterator interface in terms of a single ._invoke method.
545
550
 
@@ -644,11 +649,9 @@ var runtime_1 = /*#__PURE__*/createCommonjsModule(function (module) {
644
649
  }
645
650
 
646
651
  defineIteratorMethods(AsyncIterator.prototype);
647
-
648
- AsyncIterator.prototype[asyncIteratorSymbol] = function () {
652
+ define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
649
653
  return this;
650
- };
651
-
654
+ });
652
655
  exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
653
656
  // AsyncIterator objects; they just return a Promise for the value of
654
657
  // the final result produced by the iterator.
@@ -825,13 +828,12 @@ var runtime_1 = /*#__PURE__*/createCommonjsModule(function (module) {
825
828
  // object to not be returned from this call. This ensures that doesn't happen.
826
829
  // See https://github.com/facebook/regenerator/issues/274 for more details.
827
830
 
828
- Gp[iteratorSymbol] = function () {
831
+ define(Gp, iteratorSymbol, function () {
829
832
  return this;
830
- };
831
-
832
- Gp.toString = function () {
833
+ });
834
+ define(Gp, "toString", function () {
833
835
  return "[object Generator]";
834
- };
836
+ });
835
837
 
836
838
  function pushTryEntry(locs) {
837
839
  var entry = {
@@ -1143,14 +1145,19 @@ var runtime_1 = /*#__PURE__*/createCommonjsModule(function (module) {
1143
1145
  } catch (accidentalStrictMode) {
1144
1146
  // This module should not be running in strict mode, so the above
1145
1147
  // assignment should always work unless something is misconfigured. Just
1146
- // in case runtime.js accidentally runs in strict mode, we can escape
1148
+ // in case runtime.js accidentally runs in strict mode, in modern engines
1149
+ // we can explicitly access globalThis. In older engines we can escape
1147
1150
  // strict mode using a global Function call. This could conceivably fail
1148
1151
  // if a Content Security Policy forbids using Function, but in that case
1149
1152
  // the proper solution is to fix the accidental strict mode problem. If
1150
1153
  // you've misconfigured your bundler to force strict mode and applied a
1151
1154
  // CSP to forbid Function, and you're not willing to fix either of those
1152
1155
  // problems, please detail your unique predicament in a GitHub issue.
1153
- Function("r", "regeneratorRuntime = r")(runtime);
1156
+ if (typeof globalThis === "object") {
1157
+ globalThis.regeneratorRuntime = runtime;
1158
+ } else {
1159
+ Function("r", "regeneratorRuntime = r")(runtime);
1160
+ }
1154
1161
  }
1155
1162
  });
1156
1163
 
@@ -1160,7 +1167,8 @@ function fetchHubFile(_x) {
1160
1167
 
1161
1168
  function _fetchHubFile() {
1162
1169
  _fetchHubFile = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee(hubFileLocation) {
1163
- var hubFileText;
1170
+ var hubFileText, _yield$import, HubFile;
1171
+
1164
1172
  return runtime_1.wrap(function _callee$(_context) {
1165
1173
  while (1) {
1166
1174
  switch (_context.prev = _context.next) {
@@ -1171,19 +1179,25 @@ function _fetchHubFile() {
1171
1179
 
1172
1180
  case 3:
1173
1181
  hubFileText = _context.sent;
1174
- return _context.abrupt("return", new ucscHub.HubFile(hubFileText));
1182
+ _context.next = 6;
1183
+ return new Promise(function (resolve) { resolve(_interopNamespace(require('@gmod/ucsc-hub'))); });
1175
1184
 
1176
- case 7:
1177
- _context.prev = 7;
1185
+ case 6:
1186
+ _yield$import = _context.sent;
1187
+ HubFile = _yield$import.HubFile;
1188
+ return _context.abrupt("return", new HubFile(hubFileText));
1189
+
1190
+ case 11:
1191
+ _context.prev = 11;
1178
1192
  _context.t0 = _context["catch"](0);
1179
1193
  throw new Error("Not a valid hub.txt file, got error: '".concat(_context.t0, "'"));
1180
1194
 
1181
- case 10:
1195
+ case 14:
1182
1196
  case "end":
1183
1197
  return _context.stop();
1184
1198
  }
1185
1199
  }
1186
- }, _callee, null, [[0, 7]]);
1200
+ }, _callee, null, [[0, 11]]);
1187
1201
  }));
1188
1202
  return _fetchHubFile.apply(this, arguments);
1189
1203
  }
@@ -1194,7 +1208,8 @@ function fetchGenomesFile(_x2) {
1194
1208
 
1195
1209
  function _fetchGenomesFile() {
1196
1210
  _fetchGenomesFile = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee2(genomesFileLocation) {
1197
- var genomesFileText;
1211
+ var genomesFileText, _yield$import2, GenomesFile;
1212
+
1198
1213
  return runtime_1.wrap(function _callee2$(_context2) {
1199
1214
  while (1) {
1200
1215
  switch (_context2.prev = _context2.next) {
@@ -1204,9 +1219,15 @@ function _fetchGenomesFile() {
1204
1219
 
1205
1220
  case 2:
1206
1221
  genomesFileText = _context2.sent;
1207
- return _context2.abrupt("return", new ucscHub.GenomesFile(genomesFileText));
1222
+ _context2.next = 5;
1223
+ return new Promise(function (resolve) { resolve(_interopNamespace(require('@gmod/ucsc-hub'))); });
1208
1224
 
1209
- case 4:
1225
+ case 5:
1226
+ _yield$import2 = _context2.sent;
1227
+ GenomesFile = _yield$import2.GenomesFile;
1228
+ return _context2.abrupt("return", new GenomesFile(genomesFileText));
1229
+
1230
+ case 8:
1210
1231
  case "end":
1211
1232
  return _context2.stop();
1212
1233
  }
@@ -1222,7 +1243,8 @@ function fetchTrackDbFile(_x3) {
1222
1243
 
1223
1244
  function _fetchTrackDbFile() {
1224
1245
  _fetchTrackDbFile = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee3(trackDbFileLocation) {
1225
- var trackDbFileText;
1246
+ var text, _yield$import3, TrackDbFile;
1247
+
1226
1248
  return runtime_1.wrap(function _callee3$(_context3) {
1227
1249
  while (1) {
1228
1250
  switch (_context3.prev = _context3.next) {
@@ -1231,10 +1253,16 @@ function _fetchTrackDbFile() {
1231
1253
  return io.openLocation(trackDbFileLocation).readFile('utf8');
1232
1254
 
1233
1255
  case 2:
1234
- trackDbFileText = _context3.sent;
1235
- return _context3.abrupt("return", new ucscHub.TrackDbFile(trackDbFileText));
1256
+ text = _context3.sent;
1257
+ _context3.next = 5;
1258
+ return new Promise(function (resolve) { resolve(_interopNamespace(require('@gmod/ucsc-hub'))); });
1236
1259
 
1237
- case 4:
1260
+ case 5:
1261
+ _yield$import3 = _context3.sent;
1262
+ TrackDbFile = _yield$import3.TrackDbFile;
1263
+ return _context3.abrupt("return", new TrackDbFile(text));
1264
+
1265
+ case 8:
1238
1266
  case "end":
1239
1267
  return _context3.stop();
1240
1268
  }
@@ -1302,11 +1330,13 @@ function makeTrackConfig(track, categories, trackDbFileLocation, trackDb, sequen
1302
1330
 
1303
1331
  if (trackDbFileLocation.uri) {
1304
1332
  bigDataLocation = {
1305
- uri: new URL(track.get('bigDataUrl'), trackDbFileLocation.uri).href
1333
+ uri: new URL(track.get('bigDataUrl'), trackDbFileLocation.uri).href,
1334
+ locationType: 'UriLocation'
1306
1335
  };
1307
1336
  } else {
1308
1337
  bigDataLocation = {
1309
- localPath: track.get('bigDataUrl')
1338
+ localPath: track.get('bigDataUrl'),
1339
+ locationType: 'LocalPathLocation'
1310
1340
  };
1311
1341
  }
1312
1342
 
@@ -1316,15 +1346,19 @@ function makeTrackConfig(track, categories, trackDbFileLocation, trackDb, sequen
1316
1346
  case 'bam':
1317
1347
  if (trackDbFileLocation.uri) {
1318
1348
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1319
- uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href
1349
+ uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href,
1350
+ locationType: 'UriLocation'
1320
1351
  } : {
1321
- uri: new URL("".concat(track.get('bigDataUrl'), ".bai"), trackDbFileLocation.uri).href
1352
+ uri: new URL("".concat(track.get('bigDataUrl'), ".bai"), trackDbFileLocation.uri).href,
1353
+ locationType: 'UriLocation'
1322
1354
  };
1323
1355
  } else {
1324
1356
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1325
- localPath: track.get('bigDataIndex')
1357
+ localPath: track.get('bigDataIndex'),
1358
+ locationType: 'LocalPathLocation'
1326
1359
  } : {
1327
- localPath: "".concat(track.get('bigDataUrl'), ".bai")
1360
+ localPath: "".concat(track.get('bigDataUrl'), ".bai"),
1361
+ locationType: 'LocalPathLocation'
1328
1362
  };
1329
1363
  }
1330
1364
 
@@ -1474,15 +1508,19 @@ function makeTrackConfig(track, categories, trackDbFileLocation, trackDb, sequen
1474
1508
  case 'cram':
1475
1509
  if (trackDbFileLocation.uri) {
1476
1510
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1477
- uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href
1511
+ uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href,
1512
+ locationType: 'UriLocation'
1478
1513
  } : {
1479
- uri: new URL("".concat(track.get('bigDataUrl'), ".crai"), trackDbFileLocation.uri).href
1514
+ uri: new URL("".concat(track.get('bigDataUrl'), ".crai"), trackDbFileLocation.uri).href,
1515
+ locationType: 'UriLocation'
1480
1516
  };
1481
1517
  } else {
1482
1518
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1483
- localPath: track.get('bigDataIndex')
1519
+ localPath: track.get('bigDataIndex'),
1520
+ locationType: 'LocalPathLocation'
1484
1521
  } : {
1485
- localPath: "".concat(track.get('bigDataUrl'), ".crai")
1522
+ localPath: "".concat(track.get('bigDataUrl'), ".crai"),
1523
+ locationType: 'LocalPathLocation'
1486
1524
  };
1487
1525
  }
1488
1526
 
@@ -1526,15 +1564,19 @@ function makeTrackConfig(track, categories, trackDbFileLocation, trackDb, sequen
1526
1564
  case 'vcfTabix':
1527
1565
  if (trackDbFileLocation.uri) {
1528
1566
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1529
- uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href
1567
+ uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href,
1568
+ locationType: 'UriLocation'
1530
1569
  } : {
1531
- uri: new URL("".concat(track.get('bigDataUrl'), ".tbi"), trackDbFileLocation.uri).href
1570
+ uri: new URL("".concat(track.get('bigDataUrl'), ".tbi"), trackDbFileLocation.uri).href,
1571
+ locationType: 'UriLocation'
1532
1572
  };
1533
1573
  } else {
1534
1574
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1535
- localPath: track.get('bigDataIndex')
1575
+ localPath: track.get('bigDataIndex'),
1576
+ locationType: 'LocalPathLocation'
1536
1577
  } : {
1537
- localPath: "".concat(track.get('bigDataUrl'), ".tbi")
1578
+ localPath: "".concat(track.get('bigDataUrl'), ".tbi"),
1579
+ locationType: 'LocalPathLocation'
1538
1580
  };
1539
1581
  }
1540
1582
 
@@ -1585,22 +1627,17 @@ function UCSCTrackHubConnection(pluginManager) {
1585
1627
  }).actions(function (self) {
1586
1628
  return {
1587
1629
  connect: function connect() {
1588
- var connectionName = configuration.readConfObject(self.configuration, 'name');
1589
- var hubFileLocation = configuration.readConfObject(self.configuration, 'hubTxtLocation');
1630
+ var connectionName = configuration.getConf(self, 'name');
1631
+ var hubFileLocation = configuration.getConf(self, 'hubTxtLocation');
1590
1632
  var session = util.getSession(self);
1591
1633
  fetchHubFile(hubFileLocation).then(function (hubFile) {
1592
- var genomesFileLocation;
1593
-
1594
- if (hubFileLocation.uri) {
1595
- genomesFileLocation = {
1596
- uri: new URL(hubFile.get('genomesFile'), hubFileLocation.uri).href
1597
- };
1598
- } else {
1599
- genomesFileLocation = {
1600
- localPath: hubFile.get('genomesFile')
1601
- };
1602
- }
1603
-
1634
+ var genomesFileLocation = hubFileLocation.uri ? {
1635
+ uri: new URL(hubFile.get('genomesFile'), hubFileLocation.uri).href,
1636
+ locationType: 'UriLocation'
1637
+ } : {
1638
+ localPath: hubFile.get('genomesFile'),
1639
+ locationType: 'LocalPathLocation'
1640
+ };
1604
1641
  return Promise.all([hubFile, fetchGenomesFile(genomesFileLocation)]);
1605
1642
  }).then(function (_ref) {
1606
1643
  var _ref2 = _slicedToArray(_ref, 2),
@@ -1618,7 +1655,7 @@ function UCSCTrackHubConnection(pluginManager) {
1618
1655
  genomeName = _step$value[0],
1619
1656
  genome = _step$value[1];
1620
1657
 
1621
- var assemblyNames = configuration.readConfObject(self.configuration, 'assemblyNames');
1658
+ var assemblyNames = configuration.getConf(self, 'assemblyNames');
1622
1659
 
1623
1660
  if (assemblyNames.length > 0 && !assemblyNames.includes(genomeName)) {
1624
1661
  return "break";
@@ -1632,18 +1669,13 @@ function UCSCTrackHubConnection(pluginManager) {
1632
1669
  throw new Error("Cannot find assembly for \"".concat(genomeName, "\" from the genomes file for connection \"").concat(connectionName, "\""));
1633
1670
  }
1634
1671
 
1635
- var trackDbFileLocation = void 0;
1636
-
1637
- if (hubFileLocation.uri) {
1638
- trackDbFileLocation = {
1639
- uri: new URL(genome.get('trackDb'), new URL(hubFile.get('genomesFile'), hubFileLocation.uri)).href
1640
- };
1641
- } else {
1642
- trackDbFileLocation = {
1643
- localPath: genome.get('trackDb')
1644
- };
1645
- }
1646
-
1672
+ var trackDbFileLocation = hubFileLocation.uri ? {
1673
+ uri: new URL(genome.get('trackDb'), new URL(hubFile.get('genomesFile'), hubFileLocation.uri)).href,
1674
+ locationType: 'UriLocation'
1675
+ } : {
1676
+ localPath: genome.get('trackDb'),
1677
+ locationType: 'LocalPathLocation'
1678
+ };
1647
1679
  trackDbData.push(Promise.all([trackDbFileLocation, fetchTrackDbFile(trackDbFileLocation), genomeName, assemblyConf]));
1648
1680
  };
1649
1681
 
@@ -1701,13 +1733,6 @@ function isAbsoluteUrl() {
1701
1733
  }
1702
1734
  }
1703
1735
 
1704
- function getFileName(track) {
1705
- var uri = 'uri' in track ? track.uri : undefined;
1706
- var localPath = 'localPath' in track ? track.localPath : undefined;
1707
- var blob = 'blobId' in track ? track : undefined;
1708
- return (blob === null || blob === void 0 ? void 0 : blob.name) || (uri === null || uri === void 0 ? void 0 : uri.slice(uri.lastIndexOf('/') + 1)) || (localPath === null || localPath === void 0 ? void 0 : localPath.slice(localPath.lastIndexOf('/') + 1)) || '';
1709
- }
1710
-
1711
1736
  function f(pluginManager) {
1712
1737
  return mobxStateTree.types.model('AddTrackModel', {
1713
1738
  id: mst.ElementId,
@@ -1763,11 +1788,11 @@ function f(pluginManager) {
1763
1788
  var trackData = self.trackData,
1764
1789
  indexTrackData = self.indexTrackData,
1765
1790
  adapterHint = self.adapterHint;
1766
- return trackData ? tracks.guessAdapter(trackData, indexTrackData, getFileName, adapterHint) : undefined;
1791
+ return trackData ? tracks.guessAdapter(trackData, indexTrackData, adapterHint, self) : undefined;
1767
1792
  },
1768
1793
 
1769
1794
  get trackName() {
1770
- return self.altTrackName || (self.trackData ? getFileName(self.trackData) : '');
1795
+ return self.altTrackName || (self.trackData ? tracks.getFileName(self.trackData) : '');
1771
1796
  },
1772
1797
 
1773
1798
  get isFtp() {
@@ -1830,7 +1855,7 @@ function f(pluginManager) {
1830
1855
  },
1831
1856
 
1832
1857
  get trackType() {
1833
- return self.altTrackType || (this.trackAdapter ? tracks.guessTrackType(this.trackAdapter.type) : '');
1858
+ return self.altTrackType || (this.trackAdapter ? tracks.guessTrackType(this.trackAdapter.type, self) : '');
1834
1859
  }
1835
1860
 
1836
1861
  };
@@ -1872,9 +1897,9 @@ var hasAnyOverlap = function hasAnyOverlap() {
1872
1897
  function passesFilter(filter, config) {
1873
1898
  var name = getTrackName(config);
1874
1899
  var categories = configuration.readConfObject(config, 'category') || [];
1875
- var regexp = new RegExp(filter, 'i');
1876
- return !!name.match(regexp) || categories.filter(function (cat) {
1877
- return !!cat.match(regexp);
1900
+ var filterLower = filter.toLowerCase();
1901
+ return !!name.toLowerCase().includes(filterLower) || categories.filter(function (cat) {
1902
+ return !!cat.toLowerCase().includes(filterLower);
1878
1903
  }).length;
1879
1904
  }
1880
1905
 
@@ -2149,15 +2174,17 @@ var useStyles = /*#__PURE__*/styles.makeStyles(function () {
2149
2174
  },
2150
2175
  dialogContainer: {
2151
2176
  margin: 15
2177
+ },
2178
+ lockedPluginTooltip: {
2179
+ marginRight: '0.5rem'
2152
2180
  }
2153
2181
  };
2154
2182
  });
2155
2183
 
2156
2184
  function LockedPlugin() {
2185
+ var classes = useStyles();
2157
2186
  return /*#__PURE__*/React__default.createElement(core.Tooltip, {
2158
- style: {
2159
- marginRight: '0.5rem'
2160
- },
2187
+ className: classes.lockedPluginTooltip,
2161
2188
  title: "This plugin was installed by an administrator, you cannot remove it."
2162
2189
  }, /*#__PURE__*/React__default.createElement(LockIcon, null));
2163
2190
  }
@@ -2219,7 +2246,7 @@ function InstalledPlugin(_ref2) {
2219
2246
  onClose: function onClose(name) {
2220
2247
  if (name) {
2221
2248
  var pluginMetadata = pluginManager.pluginMetadata[plugin.name];
2222
- var pluginUrl = pluginMetadata.url;
2249
+ var pluginUrl = pluginMetadata.url || pluginMetadata.esmUrl || pluginMetadata.umdUrl || pluginMetadata.cjsUrl;
2223
2250
 
2224
2251
  if (adminMode) {
2225
2252
  jbrowse.removePlugin(pluginUrl);
@@ -2271,7 +2298,7 @@ function InstalledPluginsList(_ref) {
2271
2298
 
2272
2299
  var InstalledPluginsList$1 = /*#__PURE__*/mobxReact.observer(InstalledPluginsList);
2273
2300
 
2274
- var useStyles$1 = /*#__PURE__*/styles.makeStyles(function () {
2301
+ var useStyles$1 = /*#__PURE__*/core.makeStyles(function () {
2275
2302
  return {
2276
2303
  card: {
2277
2304
  margin: '1em'
@@ -2355,101 +2382,194 @@ function PluginCard(_ref) {
2355
2382
 
2356
2383
  var PluginCard$1 = /*#__PURE__*/mobxReact.observer(PluginCard);
2357
2384
 
2358
- var useStyles$2 = /*#__PURE__*/styles.makeStyles(function () {
2385
+ var useStyles$2 = /*#__PURE__*/core.makeStyles(function (theme) {
2359
2386
  return {
2360
- closeDialog: {
2387
+ closeButton: {
2361
2388
  position: 'absolute',
2362
- right: 0,
2363
- top: 0
2389
+ right: theme.spacing(1),
2390
+ top: theme.spacing(1)
2364
2391
  },
2365
- dialogContainer: {
2366
- margin: 15,
2392
+ dialogContent: {
2367
2393
  display: 'flex',
2368
2394
  flexDirection: 'column'
2395
+ },
2396
+ expand: {
2397
+ transform: 'rotate(0deg)',
2398
+ marginLeft: 'auto',
2399
+ transition: theme.transitions.create('transform', {
2400
+ duration: theme.transitions.duration.shortest
2401
+ })
2402
+ },
2403
+ expandOpen: {
2404
+ transform: 'rotate(180deg)'
2369
2405
  }
2370
2406
  };
2371
2407
  });
2372
2408
 
2373
2409
  function CustomPluginForm(_ref) {
2374
2410
  var open = _ref.open,
2375
- _onClose = _ref.onClose,
2411
+ onClose = _ref.onClose,
2376
2412
  model = _ref.model;
2377
2413
  var classes = useStyles$2();
2378
2414
 
2379
- var _useState = React.useState({
2380
- name: '',
2381
- url: ''
2382
- }),
2415
+ var _useState = React.useState(''),
2383
2416
  _useState2 = _slicedToArray(_useState, 2),
2384
- formInput = _useState2[0],
2385
- setFormInput = _useState2[1];
2417
+ umdPluginName = _useState2[0],
2418
+ setUMDPluginName = _useState2[1];
2386
2419
 
2387
- var handleChange = function handleChange(event) {
2388
- setFormInput(_objectSpread2(_objectSpread2({}, formInput), {}, _defineProperty({}, event.target.name, event.target.value)));
2389
- };
2420
+ var _useState3 = React.useState(''),
2421
+ _useState4 = _slicedToArray(_useState3, 2),
2422
+ umdPluginUrl = _useState4[0],
2423
+ setUMDPluginUrl = _useState4[1];
2424
+
2425
+ var _useState5 = React.useState(''),
2426
+ _useState6 = _slicedToArray(_useState5, 2),
2427
+ esmPluginUrl = _useState6[0],
2428
+ setESMPluginUrl = _useState6[1];
2429
+
2430
+ var _useState7 = React.useState(''),
2431
+ _useState8 = _slicedToArray(_useState7, 2),
2432
+ cjsPluginUrl = _useState8[0],
2433
+ setCJSPluginUrl = _useState8[1];
2434
+
2435
+ var _useState9 = React.useState(false),
2436
+ _useState10 = _slicedToArray(_useState9, 2),
2437
+ advancedOptionsOpen = _useState10[0],
2438
+ setAdvancedOptionsOpen = _useState10[1];
2439
+
2440
+ function handleChange(event) {
2441
+ var _event$target = event.target,
2442
+ name = _event$target.name,
2443
+ value = _event$target.value;
2444
+
2445
+ if (name === 'umdName') {
2446
+ setUMDPluginName(value);
2447
+ }
2448
+
2449
+ if (name === 'umdUrl') {
2450
+ setUMDPluginUrl(value);
2451
+ }
2452
+
2453
+ if (name === 'esmUrl') {
2454
+ setESMPluginUrl(value);
2455
+ }
2456
+
2457
+ if (name === 'cjsUrl') {
2458
+ setCJSPluginUrl(value);
2459
+ }
2460
+ }
2461
+
2462
+ function handleOpenAdvancedOptions() {
2463
+ setAdvancedOptionsOpen(!advancedOptionsOpen);
2464
+ }
2390
2465
 
2391
2466
  var rootModel = mobxStateTree.getRoot(model);
2392
2467
  var jbrowse = rootModel.jbrowse;
2468
+ var ready = Boolean(umdPluginName && umdPluginUrl || esmPluginUrl || cjsPluginUrl);
2393
2469
 
2394
- var handleSubmit = function handleSubmit() {
2395
- jbrowse.addPlugin({
2396
- name: formInput.name,
2397
- url: formInput.url
2398
- });
2399
- };
2470
+ function handleSubmit() {
2471
+ if (!ready) {
2472
+ return;
2473
+ }
2400
2474
 
2401
- return /*#__PURE__*/React__default.createElement(Dialog, {
2402
- open: open,
2403
- onClose: function onClose() {
2404
- return _onClose(false);
2475
+ var pluginDefinition = {};
2476
+
2477
+ if (umdPluginName && umdPluginUrl) {
2478
+ pluginDefinition.name = umdPluginName;
2479
+ pluginDefinition.umdUrl = umdPluginUrl;
2405
2480
  }
2406
- }, /*#__PURE__*/React__default.createElement(DialogTitle, null, /*#__PURE__*/React__default.createElement(IconButton, {
2407
- className: classes.closeDialog,
2408
- "aria-label": "close-dialog",
2481
+
2482
+ if (esmPluginUrl) {
2483
+ pluginDefinition.esmUrl = esmPluginUrl;
2484
+ }
2485
+
2486
+ if (cjsPluginUrl) {
2487
+ pluginDefinition.cjsUrl = cjsPluginUrl;
2488
+ }
2489
+
2490
+ jbrowse.addPlugin(pluginDefinition);
2491
+ }
2492
+
2493
+ function handleClose() {
2494
+ setUMDPluginName('');
2495
+ setUMDPluginUrl('');
2496
+ setESMPluginUrl('');
2497
+ setCJSPluginUrl('');
2498
+ onClose();
2499
+ }
2500
+
2501
+ return /*#__PURE__*/React__default.createElement(core.Dialog, {
2502
+ open: open,
2503
+ onClose: handleClose
2504
+ }, /*#__PURE__*/React__default.createElement(core.DialogTitle, null, "Add custom plugin", /*#__PURE__*/React__default.createElement(IconButton, {
2505
+ size: "medium",
2506
+ className: classes.closeButton,
2409
2507
  onClick: function onClick() {
2410
- return _onClose(false);
2508
+ return onClose();
2411
2509
  }
2412
- }, /*#__PURE__*/React__default.createElement(CloseIcon, null))), /*#__PURE__*/React__default.createElement("div", {
2413
- className: classes.dialogContainer
2414
- }, /*#__PURE__*/React__default.createElement(TextField, {
2415
- id: "name-input",
2416
- name: "name",
2510
+ }, /*#__PURE__*/React__default.createElement(CloseIcon, null))), /*#__PURE__*/React__default.createElement("form", {
2511
+ onSubmit: handleSubmit
2512
+ }, /*#__PURE__*/React__default.createElement(core.DialogContent, {
2513
+ className: classes.dialogContent
2514
+ }, /*#__PURE__*/React__default.createElement(core.DialogContentText, null, "Enter the name of the plugin and its URL. The name should match what is defined in the plugin's build."), /*#__PURE__*/React__default.createElement(core.TextField, {
2515
+ id: "umd-name-input",
2516
+ name: "umdName",
2417
2517
  label: "Plugin name",
2418
2518
  variant: "outlined",
2419
- value: formInput.name,
2420
- onChange: handleChange,
2421
- multiline: true
2422
- }), /*#__PURE__*/React__default.createElement(TextField, {
2423
- id: "url-input",
2424
- name: "url",
2519
+ value: umdPluginName,
2520
+ onChange: handleChange
2521
+ }), /*#__PURE__*/React__default.createElement(core.TextField, {
2522
+ id: "umd-url-input",
2523
+ name: "umdUrl",
2425
2524
  label: "Plugin URL",
2426
2525
  variant: "outlined",
2427
- value: formInput.url,
2428
- onChange: handleChange,
2429
- multiline: true
2430
- }), /*#__PURE__*/React__default.createElement(Button, {
2526
+ value: umdPluginUrl,
2527
+ onChange: handleChange
2528
+ }), /*#__PURE__*/React__default.createElement(core.DialogContentText, {
2529
+ onClick: handleOpenAdvancedOptions
2530
+ }, /*#__PURE__*/React__default.createElement(IconButton, {
2531
+ className: clsx(classes.expand, _defineProperty({}, classes.expandOpen, advancedOptionsOpen)),
2532
+ "aria-expanded": advancedOptionsOpen,
2533
+ "aria-label": "show more"
2534
+ }, /*#__PURE__*/React__default.createElement(ExpandMoreIcon, null)), "Advanced options"), /*#__PURE__*/React__default.createElement(core.Collapse, {
2535
+ "in": advancedOptionsOpen
2536
+ }, /*#__PURE__*/React__default.createElement("div", {
2537
+ className: classes.dialogContent
2538
+ }, /*#__PURE__*/React__default.createElement(core.DialogContentText, null, "The above fields assume that the plugin is built in UMD format. If your plugin is in another format, or you have additional builds you want to add (such as a CJS build for using NodeJS APIs in desktop), you can enter the URLs for those builds below."), /*#__PURE__*/React__default.createElement(core.TextField, {
2539
+ id: "esm-url-input",
2540
+ name: "esmUrl",
2541
+ label: "ESM build URL",
2542
+ variant: "outlined",
2543
+ value: esmPluginUrl,
2544
+ onChange: handleChange
2545
+ }), /*#__PURE__*/React__default.createElement(core.TextField, {
2546
+ id: "cjs-url-input",
2547
+ name: "cjsUrl",
2548
+ label: "CJS build URL",
2549
+ variant: "outlined",
2550
+ value: cjsPluginUrl,
2551
+ onChange: handleChange
2552
+ })))), /*#__PURE__*/React__default.createElement(core.DialogActions, null, /*#__PURE__*/React__default.createElement(core.Button, {
2553
+ variant: "contained",
2554
+ onClick: handleClose
2555
+ }, "Cancel"), /*#__PURE__*/React__default.createElement(core.Button, {
2431
2556
  variant: "contained",
2432
2557
  color: "primary",
2433
- style: {
2434
- marginTop: '1.5rem'
2435
- },
2436
- onClick: handleSubmit
2437
- }, "Add plugin")));
2558
+ onClick: handleSubmit,
2559
+ disabled: !ready
2560
+ }, "Submit"))));
2438
2561
  }
2439
2562
 
2440
2563
  var CustomPluginForm$1 = /*#__PURE__*/mobxReact.observer(CustomPluginForm);
2441
2564
 
2442
2565
  var useStyles$3 = /*#__PURE__*/core.makeStyles(function (theme) {
2443
2566
  return {
2444
- accordion: {
2445
- marginTop: '1em'
2567
+ root: {
2568
+ margin: theme.spacing(1)
2446
2569
  },
2447
2570
  expandIcon: {
2448
2571
  color: '#fff'
2449
2572
  },
2450
- searchBox: {
2451
- marginBottom: theme.spacing(2)
2452
- },
2453
2573
  adminBadge: {
2454
2574
  margin: '0.5em',
2455
2575
  borderRadius: 3,
@@ -2471,7 +2591,7 @@ function PluginStoreWidget(_ref) {
2471
2591
  var model = _ref.model;
2472
2592
  var classes = useStyles$3();
2473
2593
 
2474
- var _useState = React.useState([]),
2594
+ var _useState = React.useState(),
2475
2595
  _useState2 = _slicedToArray(_useState, 2),
2476
2596
  pluginArray = _useState2[0],
2477
2597
  setPluginArray = _useState2[1];
@@ -2493,60 +2613,71 @@ function PluginStoreWidget(_ref) {
2493
2613
  pluginManager = _getEnv.pluginManager;
2494
2614
 
2495
2615
  React.useEffect(function () {
2496
- var killed = false;
2616
+ var controller = new AbortController();
2617
+ var signal = controller.signal;
2497
2618
 
2498
2619
  _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee() {
2499
- var fetchResult, array;
2620
+ var response, err, array;
2500
2621
  return runtime_1.wrap(function _callee$(_context) {
2501
2622
  while (1) {
2502
2623
  switch (_context.prev = _context.next) {
2503
2624
  case 0:
2504
2625
  _context.prev = 0;
2505
2626
  _context.next = 3;
2506
- return fetch('https://jbrowse.org/plugin-store/plugins.json');
2627
+ return fetch('https://jbrowse.org/plugin-store/plugins.json', {
2628
+ signal: signal
2629
+ });
2507
2630
 
2508
2631
  case 3:
2509
- fetchResult = _context.sent;
2632
+ response = _context.sent;
2510
2633
 
2511
- if (fetchResult.ok) {
2512
- _context.next = 6;
2634
+ if (response.ok) {
2635
+ _context.next = 9;
2513
2636
  break;
2514
2637
  }
2515
2638
 
2516
- throw new Error('Failed to fetch plugin data');
2639
+ _context.next = 7;
2640
+ return response.text();
2641
+
2642
+ case 7:
2643
+ err = _context.sent;
2644
+ throw new Error("Failed to fetch plugin data: ".concat(response.status, " ").concat(response.statusText, " ").concat(err));
2517
2645
 
2518
- case 6:
2519
- _context.next = 8;
2520
- return fetchResult.json();
2646
+ case 9:
2647
+ _context.next = 11;
2648
+ return response.json();
2521
2649
 
2522
- case 8:
2650
+ case 11:
2523
2651
  array = _context.sent;
2524
2652
 
2525
- if (!killed) {
2653
+ if (!signal.aborted) {
2526
2654
  setPluginArray(array.plugins);
2527
2655
  }
2528
2656
 
2529
- _context.next = 15;
2657
+ _context.next = 19;
2530
2658
  break;
2531
2659
 
2532
- case 12:
2533
- _context.prev = 12;
2660
+ case 15:
2661
+ _context.prev = 15;
2534
2662
  _context.t0 = _context["catch"](0);
2663
+ console.error(_context.t0);
2535
2664
  setError(_context.t0);
2536
2665
 
2537
- case 15:
2666
+ case 19:
2538
2667
  case "end":
2539
2668
  return _context.stop();
2540
2669
  }
2541
2670
  }
2542
- }, _callee, null, [[0, 12]]);
2671
+ }, _callee, null, [[0, 15]]);
2543
2672
  }))();
2544
2673
 
2545
2674
  return function () {
2546
- killed = true;
2675
+ controller.abort();
2547
2676
  };
2548
2677
  }, []);
2549
- return /*#__PURE__*/React__default.createElement("div", null, adminMode && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, !util.isElectron && /*#__PURE__*/React__default.createElement("div", {
2678
+ return /*#__PURE__*/React__default.createElement("div", {
2679
+ className: classes.root
2680
+ }, adminMode && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, !util.isElectron && /*#__PURE__*/React__default.createElement("div", {
2550
2681
  className: classes.adminBadge
2551
2682
  }, /*#__PURE__*/React__default.createElement(InfoOutlinedIcon, {
2552
2683
  style: {
@@ -2562,10 +2693,11 @@ function PluginStoreWidget(_ref) {
2562
2693
  }
2563
2694
  }, "Add custom plugin")), /*#__PURE__*/React__default.createElement(CustomPluginForm$1, {
2564
2695
  open: customPluginFormOpen,
2565
- onClose: setCustomPluginFormOpen,
2696
+ onClose: function onClose() {
2697
+ return setCustomPluginFormOpen(false);
2698
+ },
2566
2699
  model: model
2567
2700
  })), /*#__PURE__*/React__default.createElement(core.TextField, {
2568
- className: classes.searchBox,
2569
2701
  label: "Filter plugins",
2570
2702
  value: model.filterText,
2571
2703
  onChange: function onChange(event) {
@@ -2607,7 +2739,12 @@ function PluginStoreWidget(_ref) {
2607
2739
  variant: "h5"
2608
2740
  }, "Available plugins")), error ? /*#__PURE__*/React__default.createElement(core.Typography, {
2609
2741
  color: "error"
2610
- }, "".concat(error)) : pluginArray.length ? pluginArray.filter(function (plugin) {
2742
+ }, "".concat(error)) : pluginArray ? pluginArray.filter(function (plugin) {
2743
+ // If pugin only has cjsUrl, don't display outside desktop
2744
+ if (!util.isElectron && !(plugin.esmUrl || plugin.url || plugin.umdUrl)) {
2745
+ return false;
2746
+ }
2747
+
2611
2748
  return plugin.name.toLowerCase().includes(model.filterText.toLowerCase());
2612
2749
  }).map(function (plugin) {
2613
2750
  return /*#__PURE__*/React__default.createElement(PluginCard$1, {
@@ -2732,171 +2869,56 @@ var _default = /*#__PURE__*/function (_Plugin) {
2732
2869
  }
2733
2870
  }, {
2734
2871
  key: "configure",
2735
- value: function configure(pluginManager) {
2736
- if (util.isAbstractMenuManager(pluginManager.rootModel)) {
2737
- pluginManager.rootModel.appendToMenu('File', {
2738
- label: 'Open track',
2739
- icon: NoteAddIcon,
2740
- onClick: function onClick(session) {
2741
- if (session.views.length === 0) {
2742
- session.notify('Please open a view to add a track first');
2743
- } else if (session.views.length >= 1) {
2744
- var widget = session.addWidget('AddTrackWidget', 'addTrackWidget', {
2745
- view: session.views[0].id
2746
- });
2747
- session.showWidget(widget);
2748
-
2749
- if (session.views.length > 1) {
2750
- session.notify("This will add a track to the first view. Note: if you want to open a track in a specific view open the track selector for that view and use the add track (plus icon) in the bottom right");
2751
- }
2752
- }
2753
- }
2754
- });
2755
- pluginManager.rootModel.appendToMenu('File', {
2756
- label: 'Open connection',
2757
- icon: InputIcon,
2758
- onClick: function onClick(session) {
2759
- var widget = session.addWidget('AddConnectionWidget', 'addConnectionWidget');
2760
- session.showWidget(widget);
2761
- }
2762
- });
2763
- pluginManager.rootModel.appendToMenu('File', {
2764
- label: 'Plugin store',
2765
- icon: ExtensionIcon,
2766
- onClick: function onClick(session) {
2767
- var widget = session.addWidget('PluginStoreWidget', 'pluginStoreWidget');
2768
- session.showWidget(widget);
2769
- }
2770
- });
2771
- }
2772
- }
2872
+ value: function configure(pluginManager) {}
2773
2873
  }]);
2774
2874
 
2775
2875
  return _default;
2776
2876
  }(Plugin);
2777
2877
 
2778
- var useStyles$4 = /*#__PURE__*/styles.makeStyles(function (theme) {
2779
- return {
2780
- root: {
2781
- margin: theme.spacing(1)
2782
- },
2783
- message: {
2784
- padding: theme.spacing(3)
2785
- },
2786
- titleBox: {
2787
- color: '#fff',
2788
- backgroundColor: theme.palette.primary.main,
2789
- textAlign: 'center'
2790
- },
2791
- dialogContent: {
2792
- width: 600
2793
- },
2794
- resetButton: {
2795
- justifyContent: 'center',
2796
- marginBottom: '6px'
2797
- }
2798
- };
2799
- });
2800
- var CurrentSession = /*#__PURE__*/mobxReact.observer(function (_ref) {
2801
- var session = _ref.session,
2802
- selectedDefault = _ref.selectedDefault,
2803
- handleRadio = _ref.handleRadio;
2804
- var classes = useStyles$4();
2805
- return /*#__PURE__*/React__default.createElement(Paper, {
2806
- className: classes.root
2807
- }, /*#__PURE__*/React__default.createElement(List, {
2808
- subheader: /*#__PURE__*/React__default.createElement(ListSubheader, null, "Currently open session")
2809
- }, /*#__PURE__*/React__default.createElement(ListItem, null, /*#__PURE__*/React__default.createElement(ListItemIcon, null, /*#__PURE__*/React__default.createElement(Radio, {
2810
- checked: session.name === selectedDefault,
2811
- onChange: function onChange() {
2812
- return handleRadio(session);
2813
- }
2814
- })), /*#__PURE__*/React__default.createElement(ListItemText, {
2815
- primary: session.name
2816
- }))));
2817
- });
2818
- var SetDefaultSession$1 = /*#__PURE__*/mobxReact.observer(function (_ref2) {
2819
- var rootModel = _ref2.rootModel,
2820
- open = _ref2.open,
2821
- onClose = _ref2.onClose,
2822
- currentDefault = _ref2.currentDefault;
2823
- var classes = useStyles$4();
2824
- var session = rootModel.session;
2878
+ function canSetDefaultSession(obj) {
2879
+ return _typeof(obj) === 'object' && !!obj && 'jbrowse' in obj;
2880
+ }
2825
2881
 
2826
- var _useState = React.useState(currentDefault),
2827
- _useState2 = _slicedToArray(_useState, 2),
2828
- selectedDefault = _useState2[0],
2829
- setSelectedDefault = _useState2[1]; // eslint-disable-next-line @typescript-eslint/no-explicit-any
2882
+ var SetDefaultSession$1 = /*#__PURE__*/mobxReact.observer(function (_ref) {
2883
+ var rootModel = _ref.rootModel,
2884
+ onClose = _ref.onClose;
2830
2885
 
2886
+ if (!rootModel) {
2887
+ return null;
2888
+ }
2831
2889
 
2832
- function handleRadio(sessionSnapshot) {
2833
- setSelectedDefault(sessionSnapshot.name);
2834
- rootModel.jbrowse.setDefaultSessionConf(sessionSnapshot);
2835
- session.notify("Set default session to ".concat(sessionSnapshot.name), 'success');
2890
+ if (!canSetDefaultSession(rootModel)) {
2891
+ console.error('Incorrect rootmodel');
2892
+ return null;
2836
2893
  }
2837
2894
 
2838
- return /*#__PURE__*/React__default.createElement(Dialog, {
2839
- open: open
2840
- }, /*#__PURE__*/React__default.createElement(DialogTitle, {
2841
- className: classes.titleBox
2842
- }, "Set Default Session"), /*#__PURE__*/React__default.createElement(DialogContent, null, /*#__PURE__*/React__default.createElement(core.Grid, {
2843
- className: classes.resetButton,
2844
- container: true
2845
- }, /*#__PURE__*/React__default.createElement(core.Grid, {
2846
- item: true
2847
- }, /*#__PURE__*/React__default.createElement(Button, {
2848
- color: "secondary",
2895
+ var jbrowse = rootModel.jbrowse,
2896
+ session = rootModel.session;
2897
+ return /*#__PURE__*/React__default.createElement(core.Dialog, {
2898
+ open: true,
2899
+ onClose: onClose
2900
+ }, /*#__PURE__*/React__default.createElement(core.DialogTitle, null, "Set default session"), /*#__PURE__*/React__default.createElement(core.DialogContent, null, /*#__PURE__*/React__default.createElement(core.Typography, null, "Select \"Set current session as default\" to make your current session saved to the config file. You can also hit \"Clear default session\", which would remove the default session from the config.")), /*#__PURE__*/React__default.createElement(core.DialogActions, null, /*#__PURE__*/React__default.createElement(core.Button, {
2849
2901
  variant: "contained",
2850
2902
  onClick: function onClick() {
2851
- setSelectedDefault('New session');
2852
- rootModel.jbrowse.setDefaultSessionConf({
2903
+ jbrowse.setDefaultSessionConf({
2853
2904
  name: "New session"
2854
2905
  });
2855
- session.notify('Reset default session', 'success');
2906
+ onClose();
2856
2907
  }
2857
- }, "Clear default session"))), /*#__PURE__*/React__default.createElement(CurrentSession, {
2858
- session: session,
2859
- selectedDefault: selectedDefault,
2860
- handleRadio: handleRadio
2861
- }), /*#__PURE__*/React__default.createElement(Paper, {
2862
- className: classes.root
2863
- }, /*#__PURE__*/React__default.createElement(List, {
2864
- subheader: /*#__PURE__*/React__default.createElement(ListSubheader, null, "Saved sessions")
2865
- }, session.savedSessions.length ? session.savedSessions.map( // eslint-disable-next-line @typescript-eslint/no-explicit-any
2866
- function (sessionSnapshot) {
2867
- var _sessionSnapshot$view = sessionSnapshot.views,
2868
- views = _sessionSnapshot$view === void 0 ? [] : _sessionSnapshot$view;
2869
- var totalTracks = views // eslint-disable-next-line @typescript-eslint/no-explicit-any
2870
- .map(function (view) {
2871
- return view.tracks.length;
2872
- }).reduce(function (a, b) {
2873
- return a + b;
2874
- }, 0);
2875
-
2876
- if (sessionSnapshot.name !== session.name) {
2877
- return /*#__PURE__*/React__default.createElement(ListItem, {
2878
- key: sessionSnapshot.name
2879
- }, /*#__PURE__*/React__default.createElement(ListItemIcon, null, /*#__PURE__*/React__default.createElement(Radio, {
2880
- checked: sessionSnapshot.name === selectedDefault,
2881
- onChange: function onChange() {
2882
- return handleRadio(sessionSnapshot);
2883
- }
2884
- })), /*#__PURE__*/React__default.createElement(ListItemText, {
2885
- primary: sessionSnapshot.name,
2886
- secondary: "".concat(views.length, " ").concat(pluralize('view', views.length), "; ").concat(totalTracks, "\n open ").concat(pluralize('track', totalTracks))
2887
- }));
2888
- }
2889
-
2890
- return null;
2891
- }) : /*#__PURE__*/React__default.createElement(Typography, {
2892
- className: classes.message
2893
- }, "No saved sessions found")))), /*#__PURE__*/React__default.createElement(DialogActions, null, /*#__PURE__*/React__default.createElement(Button, {
2908
+ }, "Clear default session"), /*#__PURE__*/React__default.createElement(core.Button, {
2894
2909
  color: "secondary",
2895
2910
  variant: "contained",
2896
2911
  onClick: function onClick() {
2897
- onClose(false);
2912
+ return onClose();
2898
2913
  }
2899
- }, "Return")));
2914
+ }, "Cancel"), /*#__PURE__*/React__default.createElement(core.Button, {
2915
+ color: "primary",
2916
+ variant: "contained",
2917
+ onClick: function onClick() {
2918
+ jbrowse.setDefaultSessionConf(session);
2919
+ onClose();
2920
+ }
2921
+ }, "Set current session as default")));
2900
2922
  });
2901
2923
 
2902
2924
 
@@ -2906,7 +2928,7 @@ var index = {
2906
2928
  'default': SetDefaultSession$1
2907
2929
  };
2908
2930
 
2909
- var useStyles$5 = /*#__PURE__*/core.makeStyles(function () {
2931
+ var useStyles$4 = /*#__PURE__*/core.makeStyles(function () {
2910
2932
  return {
2911
2933
  table: {
2912
2934
  minWidth: 500,
@@ -2927,7 +2949,7 @@ var AssemblyTable = /*#__PURE__*/mobxReact.observer(function (_ref) {
2927
2949
  var rootModel = _ref.rootModel,
2928
2950
  setIsAssemblyBeingEdited = _ref.setIsAssemblyBeingEdited,
2929
2951
  setAssemblyBeingEdited = _ref.setAssemblyBeingEdited;
2930
- var classes = useStyles$5();
2952
+ var classes = useStyles$4();
2931
2953
 
2932
2954
  function removeAssembly(name) {
2933
2955
  rootModel.jbrowse.removeAssemblyConf(name);
@@ -2975,7 +2997,7 @@ var AssemblyTable = /*#__PURE__*/mobxReact.observer(function (_ref) {
2975
2997
  }, "Actions")))), /*#__PURE__*/React__default.createElement(core.TableBody, null, rows)));
2976
2998
  });
2977
2999
 
2978
- var useStyles$6 = /*#__PURE__*/core.makeStyles(function (theme) {
3000
+ var useStyles$5 = /*#__PURE__*/core.makeStyles(function (theme) {
2979
3001
  return {
2980
3002
  root: {
2981
3003
  flexGrow: 1,
@@ -3087,10 +3109,13 @@ var AdapterInput = /*#__PURE__*/mobxReact.observer(function (_ref2) {
3087
3109
 
3088
3110
  return null;
3089
3111
  });
3112
+ var blank = {
3113
+ uri: ''
3114
+ };
3090
3115
  var AssemblyAddForm = /*#__PURE__*/mobxReact.observer(function (_ref3) {
3091
3116
  var rootModel = _ref3.rootModel,
3092
3117
  setFormOpen = _ref3.setFormOpen;
3093
- var classes = useStyles$6();
3118
+ var classes = useStyles$5();
3094
3119
  var adapterTypes = ['IndexedFastaAdapter', 'BgzipFastaAdapter', 'TwoBitAdapter'];
3095
3120
 
3096
3121
  var _useState = React.useState(''),
@@ -3108,37 +3133,27 @@ var AssemblyAddForm = /*#__PURE__*/mobxReact.observer(function (_ref3) {
3108
3133
  adapterSelection = _useState6[0],
3109
3134
  setAdapterSelection = _useState6[1];
3110
3135
 
3111
- var _useState7 = React.useState({
3112
- uri: ''
3113
- }),
3136
+ var _useState7 = React.useState(blank),
3114
3137
  _useState8 = _slicedToArray(_useState7, 2),
3115
3138
  fastaLocation = _useState8[0],
3116
3139
  setFastaLocation = _useState8[1];
3117
3140
 
3118
- var _useState9 = React.useState({
3119
- uri: ''
3120
- }),
3141
+ var _useState9 = React.useState(blank),
3121
3142
  _useState10 = _slicedToArray(_useState9, 2),
3122
3143
  faiLocation = _useState10[0],
3123
3144
  setFaiLocation = _useState10[1];
3124
3145
 
3125
- var _useState11 = React.useState({
3126
- uri: ''
3127
- }),
3146
+ var _useState11 = React.useState(blank),
3128
3147
  _useState12 = _slicedToArray(_useState11, 2),
3129
3148
  gziLocation = _useState12[0],
3130
3149
  setGziLocation = _useState12[1];
3131
3150
 
3132
- var _useState13 = React.useState({
3133
- uri: ''
3134
- }),
3151
+ var _useState13 = React.useState(blank),
3135
3152
  _useState14 = _slicedToArray(_useState13, 2),
3136
3153
  twoBitLocation = _useState14[0],
3137
3154
  setTwoBitLocation = _useState14[1];
3138
3155
 
3139
- var _useState15 = React.useState({
3140
- uri: ''
3141
- }),
3156
+ var _useState15 = React.useState(blank),
3142
3157
  _useState16 = _slicedToArray(_useState15, 2),
3143
3158
  chromSizesLocation = _useState16[0],
3144
3159
  setChromSizesLocation = _useState16[1];
@@ -3147,8 +3162,7 @@ var AssemblyAddForm = /*#__PURE__*/mobxReact.observer(function (_ref3) {
3147
3162
  if (assemblyName === '') {
3148
3163
  rootModel.session.notify("Can't create an assembly without a name");
3149
3164
  } else {
3150
- setFormOpen(false); // setIsAssemblyBeingEdited(true)
3151
-
3165
+ setFormOpen(false);
3152
3166
  var newAssembly;
3153
3167
 
3154
3168
  if (adapterSelection === 'IndexedFastaAdapter') {
@@ -3263,7 +3277,7 @@ var AssemblyEditor = /*#__PURE__*/mobxReact.observer(function (_ref) {
3263
3277
  });
3264
3278
  });
3265
3279
 
3266
- var useStyles$7 = /*#__PURE__*/styles.makeStyles(function (theme) {
3280
+ var useStyles$6 = /*#__PURE__*/styles.makeStyles(function (theme) {
3267
3281
  return {
3268
3282
  titleBox: {
3269
3283
  color: '#fff',
@@ -3290,7 +3304,7 @@ var useStyles$7 = /*#__PURE__*/styles.makeStyles(function (theme) {
3290
3304
  var AssemblyManager$1 = /*#__PURE__*/mobxReact.observer(function (_ref) {
3291
3305
  var rootModel = _ref.rootModel,
3292
3306
  _onClose = _ref.onClose;
3293
- var classes = useStyles$7();
3307
+ var classes = useStyles$6();
3294
3308
 
3295
3309
  var _useState = React.useState(false),
3296
3310
  _useState2 = _slicedToArray(_useState, 2),
@@ -3387,7 +3401,7 @@ var ManageConnectionsDialog = /*#__PURE__*/React.lazy(function () {
3387
3401
  var ToggleConnectionsDialog = /*#__PURE__*/React.lazy(function () {
3388
3402
  return Promise.resolve().then(function () { return ToggleConnectionsDialog$2; });
3389
3403
  });
3390
- var useStyles$8 = /*#__PURE__*/core.makeStyles(function (theme) {
3404
+ var useStyles$7 = /*#__PURE__*/core.makeStyles(function (theme) {
3391
3405
  var _theme$palette$tertia, _theme$palette$tertia2;
3392
3406
 
3393
3407
  return {
@@ -3457,11 +3471,13 @@ var Node = function Node(props) {
3457
3471
  _onChange = data.onChange,
3458
3472
  toggleCollapse = data.toggleCollapse,
3459
3473
  conf = data.conf,
3460
- onMoreInfo = data.onMoreInfo;
3461
- var classes = useStyles$8();
3474
+ onMoreInfo = data.onMoreInfo,
3475
+ drawerPosition = data.drawerPosition;
3476
+ var classes = useStyles$7();
3462
3477
  var width = 10;
3463
3478
  var marginLeft = nestingLevel * width + (isLeaf ? width : 0);
3464
3479
  var unsupported = name && (name.endsWith('(Unsupported)') || name.endsWith('(Unknown)'));
3480
+ var description = conf && configuration.readConfObject(conf, ['description']) || '';
3465
3481
  return /*#__PURE__*/React__default.createElement("div", {
3466
3482
  style: style,
3467
3483
  className: !isLeaf ? classes.accordionBase : undefined
@@ -3489,7 +3505,10 @@ var Node = function Node(props) {
3489
3505
  className: !isLeaf ? classes.accordionColor : undefined
3490
3506
  }, !isLeaf ? /*#__PURE__*/React__default.createElement("div", {
3491
3507
  className: classes.accordionText
3492
- }, /*#__PURE__*/React__default.createElement(core.Typography, null, isOpen ? /*#__PURE__*/React__default.createElement(ArrowDropDownIcon, null) : /*#__PURE__*/React__default.createElement(ArrowRightIcon, null), name)) : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(core.FormControlLabel, {
3508
+ }, /*#__PURE__*/React__default.createElement(core.Typography, null, isOpen ? /*#__PURE__*/React__default.createElement(ArrowDropDownIcon, null) : /*#__PURE__*/React__default.createElement(ArrowRightIcon, null), name)) : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(core.Tooltip, {
3509
+ title: description,
3510
+ placement: drawerPosition === 'left' ? 'right' : 'left'
3511
+ }, /*#__PURE__*/React__default.createElement(core.FormControlLabel, {
3493
3512
  className: classes.checkboxLabel,
3494
3513
  control: /*#__PURE__*/React__default.createElement(core.Checkbox, {
3495
3514
  className: classes.compactCheckbox,
@@ -3504,7 +3523,7 @@ var Node = function Node(props) {
3504
3523
  }
3505
3524
  }),
3506
3525
  label: name
3507
- }), /*#__PURE__*/React__default.createElement(core.IconButton, {
3526
+ })), /*#__PURE__*/React__default.createElement(core.IconButton, {
3508
3527
  onClick: function onClick(e) {
3509
3528
  return onMoreInfo({
3510
3529
  target: e.currentTarget,
@@ -3550,6 +3569,7 @@ var HierarchicalTree = /*#__PURE__*/mobxReact.observer(function (_ref) {
3550
3569
  setMoreInfo = _useState2[1];
3551
3570
 
3552
3571
  var session = util.getSession(model);
3572
+ var drawerPosition = session.drawerPosition;
3553
3573
  var extra = React.useMemo(function () {
3554
3574
  return {
3555
3575
  onChange: function onChange(trackId) {
@@ -3558,9 +3578,10 @@ var HierarchicalTree = /*#__PURE__*/mobxReact.observer(function (_ref) {
3558
3578
  toggleCollapse: function toggleCollapse(pathName) {
3559
3579
  return model.toggleCategory(pathName);
3560
3580
  },
3561
- onMoreInfo: setMoreInfo
3581
+ onMoreInfo: setMoreInfo,
3582
+ drawerPosition: drawerPosition
3562
3583
  };
3563
- }, [view, model]);
3584
+ }, [view, model, drawerPosition]);
3564
3585
  var treeWalker = React.useCallback( /*#__PURE__*/runtime_1.mark(function treeWalker() {
3565
3586
  var i, parentMeta, _i, curr;
3566
3587
 
@@ -3678,7 +3699,7 @@ var HierarchicalTrackSelectorContainer = /*#__PURE__*/mobxReact.observer(functio
3678
3699
  var model = _ref5.model,
3679
3700
  toolbarHeight = _ref5.toolbarHeight,
3680
3701
  overrideDimensions = _ref5.overrideDimensions;
3681
- var classes = useStyles$8();
3702
+ var classes = useStyles$7();
3682
3703
  var session = util.getSession(model);
3683
3704
 
3684
3705
  var _useState3 = React.useState(null),
@@ -3729,7 +3750,7 @@ var HierarchicalTrackSelectorHeader = /*#__PURE__*/mobxReact.observer(function (
3729
3750
  setHeaderHeight = _ref6.setHeaderHeight,
3730
3751
  setAssemblyIdx = _ref6.setAssemblyIdx,
3731
3752
  assemblyIdx = _ref6.assemblyIdx;
3732
- var classes = useStyles$8();
3753
+ var classes = useStyles$7();
3733
3754
  var session = util.getSession(model);
3734
3755
 
3735
3756
  var _useState5 = React.useState(),
@@ -3947,7 +3968,7 @@ var HierarchicalTrackSelector$1 = {
3947
3968
  'default': HierarchicalTrackSelectorContainer
3948
3969
  };
3949
3970
 
3950
- var useStyles$9 = /*#__PURE__*/styles.makeStyles(function (theme) {
3971
+ var useStyles$8 = /*#__PURE__*/core.makeStyles(function (theme) {
3951
3972
  return {
3952
3973
  spacing: {
3953
3974
  marginBottom: theme.spacing(3)
@@ -3960,28 +3981,76 @@ function StatusMessage(_ref) {
3960
3981
 
3961
3982
  var trackAdapter = _ref.trackAdapter,
3962
3983
  trackType = _ref.trackType;
3963
- var classes = useStyles$9();
3964
- return trackAdapter.type === 'SNPCoverageAdapter' ? /*#__PURE__*/React__default.createElement(Typography, {
3984
+ var classes = useStyles$8();
3985
+ return trackAdapter.type === 'SNPCoverageAdapter' ? /*#__PURE__*/React__default.createElement(core.Typography, {
3965
3986
  className: classes.spacing
3966
- }, "Selected ", /*#__PURE__*/React__default.createElement("code", null, trackType), ". Using adapter", ' ', /*#__PURE__*/React__default.createElement("code", null, trackAdapter.type), " with subadapter", ' ', /*#__PURE__*/React__default.createElement("code", null, (_trackAdapter$subadap = trackAdapter.subadapter) === null || _trackAdapter$subadap === void 0 ? void 0 : _trackAdapter$subadap.type), ". Please enter a track name and, if necessary, update the track type.") : /*#__PURE__*/React__default.createElement(Typography, {
3987
+ }, "Selected ", /*#__PURE__*/React__default.createElement("code", null, trackType), ". Using adapter", ' ', /*#__PURE__*/React__default.createElement("code", null, trackAdapter.type), " with subadapter", ' ', /*#__PURE__*/React__default.createElement("code", null, (_trackAdapter$subadap = trackAdapter.subadapter) === null || _trackAdapter$subadap === void 0 ? void 0 : _trackAdapter$subadap.type), ". Please enter a track name and, if necessary, update the track type.") : /*#__PURE__*/React__default.createElement(core.Typography, {
3967
3988
  className: classes.spacing
3968
3989
  }, "Using adapter ", /*#__PURE__*/React__default.createElement("code", null, trackAdapter.type), " and guessing track type", ' ', /*#__PURE__*/React__default.createElement("code", null, trackType), ". Please enter a track name and, if necessary, update the track type.");
3969
3990
  }
3991
+ /**
3992
+ * categorizeAdapters takes a list of adapters and sorts their menu item elements under an appropriate ListSubheader
3993
+ * element. In this way, adapters that are from external plugins can have headers that differentiate them from the
3994
+ * out-of-the-box plugins.
3995
+ * @param adaptersList - a list of adapters found in the PluginManager
3996
+ * @returns a series of JSX elements that are ListSubheaders followed by the adapters
3997
+ * found under that subheader
3998
+ */
3999
+
4000
+
4001
+ function categorizeAdapters(adaptersList) {
4002
+ var currentCategory = ''; // eslint-disable-next-line @typescript-eslint/no-explicit-any
4003
+
4004
+ var items = [];
4005
+ adaptersList.forEach(function (adapter) {
4006
+ var _adapter$adapterMetad;
4007
+
4008
+ if ((_adapter$adapterMetad = adapter.adapterMetadata) !== null && _adapter$adapterMetad !== void 0 && _adapter$adapterMetad.category) {
4009
+ var _adapter$adapterMetad2, _adapter$adapterMetad7, _adapter$adapterMetad8;
4010
+
4011
+ if (currentCategory !== ((_adapter$adapterMetad2 = adapter.adapterMetadata) === null || _adapter$adapterMetad2 === void 0 ? void 0 : _adapter$adapterMetad2.category)) {
4012
+ var _adapter$adapterMetad3, _adapter$adapterMetad4, _adapter$adapterMetad5, _adapter$adapterMetad6;
4013
+
4014
+ currentCategory = (_adapter$adapterMetad3 = adapter.adapterMetadata) === null || _adapter$adapterMetad3 === void 0 ? void 0 : _adapter$adapterMetad3.category;
4015
+ items.push( /*#__PURE__*/React__default.createElement(core.ListSubheader, {
4016
+ key: (_adapter$adapterMetad4 = adapter.adapterMetadata) === null || _adapter$adapterMetad4 === void 0 ? void 0 : _adapter$adapterMetad4.category,
4017
+ value: (_adapter$adapterMetad5 = adapter.adapterMetadata) === null || _adapter$adapterMetad5 === void 0 ? void 0 : _adapter$adapterMetad5.category
4018
+ }, (_adapter$adapterMetad6 = adapter.adapterMetadata) === null || _adapter$adapterMetad6 === void 0 ? void 0 : _adapter$adapterMetad6.category));
4019
+ }
3970
4020
 
3971
- function TrackAdapterSelector(_ref2) {
3972
- var adapterHint = _ref2.adapterHint,
3973
- model = _ref2.model;
3974
- var classes = useStyles$9();
4021
+ items.push( /*#__PURE__*/React__default.createElement(core.MenuItem, {
4022
+ key: adapter.name,
4023
+ value: adapter.name
4024
+ }, (_adapter$adapterMetad7 = adapter.adapterMetadata) !== null && _adapter$adapterMetad7 !== void 0 && _adapter$adapterMetad7.displayName ? (_adapter$adapterMetad8 = adapter.adapterMetadata) === null || _adapter$adapterMetad8 === void 0 ? void 0 : _adapter$adapterMetad8.displayName : adapter.name));
4025
+ }
4026
+ });
4027
+ return items;
4028
+ }
4029
+
4030
+ function getAdapterTypes(pluginManager) {
4031
+ return pluginManager.getElementTypesInGroup('adapter');
4032
+ }
4033
+
4034
+ function getTrackTypes(pluginManager) {
4035
+ return pluginManager.getElementTypesInGroup('track');
4036
+ }
4037
+
4038
+ var TrackAdapterSelector = /*#__PURE__*/mobxReact.observer(function (_ref2) {
4039
+ var model = _ref2.model;
4040
+ var classes = useStyles$8();
3975
4041
  var session = util.getSession(model);
3976
- return /*#__PURE__*/React__default.createElement(TextField, {
4042
+ var trackAdapter = model.trackAdapter; // prettier-ignore
4043
+
4044
+ var adapters = getAdapterTypes(mobxStateTree.getEnv(session).pluginManager);
4045
+ return /*#__PURE__*/React__default.createElement(core.TextField, {
3977
4046
  className: classes.spacing,
3978
- value: adapterHint,
4047
+ value: (trackAdapter === null || trackAdapter === void 0 ? void 0 : trackAdapter.type) !== 'UNKNOWN' ? trackAdapter === null || trackAdapter === void 0 ? void 0 : trackAdapter.type : '',
3979
4048
  label: "adapterType",
3980
- helperText: "An adapter type",
4049
+ helperText: "Select an adapter type",
3981
4050
  select: true,
3982
4051
  fullWidth: true,
3983
4052
  onChange: function onChange(event) {
3984
- model.setAdapterHint(event.target.value);
4053
+ return model.setAdapterHint(event.target.value);
3985
4054
  },
3986
4055
  SelectProps: {
3987
4056
  // @ts-ignore
@@ -3989,56 +4058,119 @@ function TrackAdapterSelector(_ref2) {
3989
4058
  'data-testid': 'adapterTypeSelect'
3990
4059
  }
3991
4060
  }
3992
- }, mobxStateTree.getEnv(session).pluginManager.getElementTypesInGroup('adapter') // Exclude SNPCoverageAdapter from primary adapter user selection
4061
+ }, adapters // Excludes any adapter with the 'adapterMetadata.hiddenFromGUI' property, and anything with the 'adapterMetadata.category' property
3993
4062
  .filter(function (elt) {
3994
- return elt.name !== 'SNPCoverageAdapter';
4063
+ var _elt$adapterMetadata, _elt$adapterMetadata2;
4064
+
4065
+ return !((_elt$adapterMetadata = elt.adapterMetadata) !== null && _elt$adapterMetadata !== void 0 && _elt$adapterMetadata.hiddenFromGUI) && !((_elt$adapterMetadata2 = elt.adapterMetadata) !== null && _elt$adapterMetadata2 !== void 0 && _elt$adapterMetadata2.category);
3995
4066
  }).map(function (elt) {
3996
- return /*#__PURE__*/React__default.createElement(MenuItem, {
4067
+ var _elt$adapterMetadata3, _elt$adapterMetadata4;
4068
+
4069
+ return /*#__PURE__*/React__default.createElement(core.MenuItem, {
3997
4070
  key: elt.name,
3998
4071
  value: elt.name
3999
- }, elt.name);
4000
- }));
4001
- }
4072
+ }, (_elt$adapterMetadata3 = elt.adapterMetadata) !== null && _elt$adapterMetadata3 !== void 0 && _elt$adapterMetadata3.displayName ? (_elt$adapterMetadata4 = elt.adapterMetadata) === null || _elt$adapterMetadata4 === void 0 ? void 0 : _elt$adapterMetadata4.displayName : elt.name);
4073
+ }), categorizeAdapters(adapters.filter(function (elt) {
4074
+ var _elt$adapterMetadata5;
4075
+
4076
+ return !((_elt$adapterMetadata5 = elt.adapterMetadata) !== null && _elt$adapterMetadata5 !== void 0 && _elt$adapterMetadata5.hiddenFromGUI);
4077
+ })));
4078
+ });
4002
4079
 
4003
4080
  function UnknownAdapterPrompt(_ref3) {
4004
4081
  var model = _ref3.model;
4005
- var classes = useStyles$9();
4006
- var adapterHint = model.adapterHint;
4007
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Typography, {
4082
+ var classes = useStyles$8();
4083
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(core.Typography, {
4008
4084
  className: classes.spacing
4009
- }, "Was not able to guess the adapter type for this data, but it may be in the list below. If not, you can", ' ', /*#__PURE__*/React__default.createElement(Link, {
4085
+ }, "JBrowse was not able to guess the adapter type for this data, but it may be in the list below. If not, you can", ' ', /*#__PURE__*/React__default.createElement(core.Link, {
4010
4086
  href: "https://github.com/GMOD/jbrowse-components/releases",
4011
4087
  target: "_blank",
4012
4088
  rel: "noopener noreferrer"
4013
- }, "check for new releases"), ' ', "of JBrowse to see if they support this data type or", ' ', /*#__PURE__*/React__default.createElement(Link, {
4089
+ }, "check for new releases"), ' ', "of JBrowse to see if they support this data type or", ' ', /*#__PURE__*/React__default.createElement(core.Link, {
4014
4090
  href: "https://github.com/GMOD/jbrowse-components/issues/new",
4015
4091
  target: "_blank",
4016
4092
  rel: "noopener noreferrer"
4017
4093
  }, "file an issue"), ' ', "and add a feature request for this data type."), /*#__PURE__*/React__default.createElement(TrackAdapterSelector, {
4018
- adapterHint: adapterHint,
4019
4094
  model: model
4020
4095
  }));
4021
4096
  }
4022
4097
 
4023
- function ConfirmTrack(_ref4) {
4098
+ var TrackTypeSelector = /*#__PURE__*/mobxReact.observer(function (_ref4) {
4024
4099
  var model = _ref4.model;
4025
- var classes = useStyles$9();
4100
+ var classes = useStyles$8();
4026
4101
  var session = util.getSession(model);
4102
+ var trackType = model.trackType;
4103
+ var trackTypes = getTrackTypes(mobxStateTree.getEnv(session).pluginManager);
4104
+ return /*#__PURE__*/React__default.createElement(core.TextField, {
4105
+ className: classes.spacing,
4106
+ value: trackType,
4107
+ label: "trackType",
4108
+ helperText: "Select a track type",
4109
+ select: true,
4110
+ fullWidth: true,
4111
+ onChange: function onChange(event) {
4112
+ model.setTrackType(event.target.value);
4113
+ },
4114
+ SelectProps: {
4115
+ // @ts-ignore
4116
+ SelectDisplayProps: {
4117
+ 'data-testid': 'trackTypeSelect'
4118
+ }
4119
+ }
4120
+ }, trackTypes.map(function (_ref5) {
4121
+ var name = _ref5.name;
4122
+ return /*#__PURE__*/React__default.createElement(core.MenuItem, {
4123
+ key: name,
4124
+ value: name
4125
+ }, name);
4126
+ }));
4127
+ });
4128
+ var TrackAssemblySelector = /*#__PURE__*/mobxReact.observer(function (_ref6) {
4129
+ var model = _ref6.model;
4130
+ var session = util.getSession(model);
4131
+ var assembly = model.assembly;
4132
+ return /*#__PURE__*/React__default.createElement(core.TextField, {
4133
+ value: assembly,
4134
+ label: "assemblyName",
4135
+ helperText: "Assembly to which the track will be added",
4136
+ select: true,
4137
+ fullWidth: true,
4138
+ onChange: function onChange(event) {
4139
+ return model.setAssembly(event.target.value);
4140
+ },
4141
+ SelectProps: {
4142
+ // @ts-ignore
4143
+ SelectDisplayProps: {
4144
+ 'data-testid': 'assemblyNameSelect'
4145
+ }
4146
+ }
4147
+ }, session.assemblies.map(function (conf) {
4148
+ return configuration.readConfObject(conf, 'name');
4149
+ }).map(function (name) {
4150
+ return /*#__PURE__*/React__default.createElement(core.MenuItem, {
4151
+ key: name,
4152
+ value: name
4153
+ }, name);
4154
+ }));
4155
+ });
4156
+
4157
+ function ConfirmTrack(_ref7) {
4158
+ var model = _ref7.model;
4159
+ var classes = useStyles$8();
4027
4160
  var trackName = model.trackName,
4028
4161
  trackAdapter = model.trackAdapter,
4029
4162
  trackType = model.trackType,
4030
- assembly = model.assembly,
4031
4163
  warningMessage = model.warningMessage,
4032
4164
  adapterHint = model.adapterHint;
4033
4165
 
4034
4166
  if (model.unsupported) {
4035
- return /*#__PURE__*/React__default.createElement(Typography, {
4167
+ return /*#__PURE__*/React__default.createElement(core.Typography, {
4036
4168
  className: classes.spacing
4037
- }, "This version of JBrowse cannot display data of this type. It is possible, however, that there is a newer version that can display them. You can", ' ', /*#__PURE__*/React__default.createElement(Link, {
4169
+ }, "This version of JBrowse cannot display data of this type. It is possible, however, that there is a newer version that can display them. You can", ' ', /*#__PURE__*/React__default.createElement(core.Link, {
4038
4170
  href: "https://github.com/GMOD/jbrowse-components/releases",
4039
4171
  target: "_blank",
4040
4172
  rel: "noopener noreferrer"
4041
- }, "check for new releases"), ' ', "of JBrowse or", ' ', /*#__PURE__*/React__default.createElement(Link, {
4173
+ }, "check for new releases"), ' ', "of JBrowse or", ' ', /*#__PURE__*/React__default.createElement(core.Link, {
4042
4174
  href: "https://github.com/GMOD/jbrowse-components/issues/new",
4043
4175
  target: "_blank",
4044
4176
  rel: "noopener noreferrer"
@@ -4051,21 +4183,22 @@ function ConfirmTrack(_ref4) {
4051
4183
  });
4052
4184
  }
4053
4185
 
4186
+ if (adapterHint === '' && trackAdapter) {
4187
+ model.setAdapterHint(trackAdapter.type);
4188
+ }
4189
+
4054
4190
  if (!(trackAdapter !== null && trackAdapter !== void 0 && trackAdapter.type)) {
4055
- return /*#__PURE__*/React__default.createElement(Typography, null, "Could not recognize this data type.");
4191
+ return /*#__PURE__*/React__default.createElement(core.Typography, null, "Could not recognize this data type.");
4056
4192
  }
4057
4193
 
4058
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, trackAdapter ? /*#__PURE__*/React__default.createElement(StatusMessage, {
4194
+ return /*#__PURE__*/React__default.createElement("div", null, trackAdapter ? /*#__PURE__*/React__default.createElement(StatusMessage, {
4059
4195
  trackAdapter: trackAdapter,
4060
4196
  trackType: trackType
4061
- }) : null, warningMessage ? /*#__PURE__*/React__default.createElement(Typography, {
4197
+ }) : null, warningMessage ? /*#__PURE__*/React__default.createElement(core.Typography, {
4062
4198
  style: {
4063
4199
  color: 'orange'
4064
4200
  }
4065
- }, warningMessage) : null, /*#__PURE__*/React__default.createElement(TrackAdapterSelector, {
4066
- adapterHint: adapterHint,
4067
- model: model
4068
- }), /*#__PURE__*/React__default.createElement(TextField, {
4201
+ }, warningMessage) : null, /*#__PURE__*/React__default.createElement(core.TextField, {
4069
4202
  className: classes.spacing,
4070
4203
  label: "trackName",
4071
4204
  helperText: "A name for this track",
@@ -4077,88 +4210,58 @@ function ConfirmTrack(_ref4) {
4077
4210
  inputProps: {
4078
4211
  'data-testid': 'trackNameInput'
4079
4212
  }
4080
- }), /*#__PURE__*/React__default.createElement(TextField, {
4081
- className: classes.spacing,
4082
- value: trackType,
4083
- label: "trackType",
4084
- helperText: "A track type",
4085
- select: true,
4086
- fullWidth: true,
4087
- onChange: function onChange(event) {
4088
- model.setTrackType(event.target.value);
4089
- },
4090
- SelectProps: {
4091
- // @ts-ignore
4092
- SelectDisplayProps: {
4093
- 'data-testid': 'trackTypeSelect'
4094
- }
4095
- }
4096
- }, mobxStateTree.getEnv(session).pluginManager.getElementTypesInGroup('track') // eslint-disable-next-line @typescript-eslint/no-explicit-any
4097
- .map(function (_ref5) {
4098
- var name = _ref5.name;
4099
- return /*#__PURE__*/React__default.createElement(MenuItem, {
4100
- key: name,
4101
- value: name
4102
- }, name);
4103
- })), /*#__PURE__*/React__default.createElement(TextField, {
4104
- value: assembly,
4105
- label: "assemblyName",
4106
- helperText: "Assembly to which the track will be added",
4107
- select: true,
4108
- fullWidth: true,
4109
- onChange: function onChange(event) {
4110
- model.setAssembly(event.target.value);
4111
- },
4112
- SelectProps: {
4113
- // @ts-ignore
4114
- SelectDisplayProps: {
4115
- 'data-testid': 'assemblyNameSelect'
4116
- }
4117
- }
4118
- }, session.assemblies.map(function (assemblyConf) {
4119
- var assemblyName = configuration.readConfObject(assemblyConf, 'name');
4120
- return /*#__PURE__*/React__default.createElement(MenuItem, {
4121
- key: assemblyName,
4122
- value: assemblyName
4123
- }, assemblyName);
4124
- })));
4213
+ }), /*#__PURE__*/React__default.createElement(TrackAdapterSelector, {
4214
+ model: model
4215
+ }), /*#__PURE__*/React__default.createElement(TrackTypeSelector, {
4216
+ model: model
4217
+ }), /*#__PURE__*/React__default.createElement(TrackAssemblySelector, {
4218
+ model: model
4219
+ }));
4125
4220
  }
4126
4221
 
4127
4222
  var ConfirmTrack$1 = /*#__PURE__*/mobxReact.observer(ConfirmTrack);
4128
4223
 
4129
- var useStyles$a = /*#__PURE__*/styles.makeStyles(function (theme) {
4224
+ var useStyles$9 = /*#__PURE__*/core.makeStyles(function (theme) {
4130
4225
  return {
4131
- root: {
4132
- display: 'flex',
4133
- flexDirection: 'column'
4134
- },
4135
4226
  paper: {
4227
+ display: 'flex',
4228
+ flexDirection: 'column',
4136
4229
  padding: theme.spacing(1)
4230
+ },
4231
+ spacer: {
4232
+ height: theme.spacing(8)
4137
4233
  }
4138
4234
  };
4139
4235
  });
4140
4236
 
4141
4237
  function TrackSourceSelect(_ref) {
4142
4238
  var model = _ref.model;
4143
- var classes = useStyles$a();
4144
- return /*#__PURE__*/React__default.createElement("div", {
4145
- className: classes.root
4146
- }, /*#__PURE__*/React__default.createElement(Paper, {
4239
+ var classes = useStyles$9();
4240
+ var rootModel = mobxStateTree.getRoot(model);
4241
+ return /*#__PURE__*/React__default.createElement(core.Paper, {
4147
4242
  className: classes.paper
4148
4243
  }, /*#__PURE__*/React__default.createElement(ui.FileSelector, {
4149
4244
  name: "Main file",
4150
4245
  description: "",
4151
4246
  location: model.trackData,
4152
- setLocation: model.setTrackData
4247
+ setLocation: model.setTrackData,
4248
+ setName: model.setTrackName,
4249
+ rootModel: rootModel
4250
+ }), /*#__PURE__*/React__default.createElement("div", {
4251
+ className: classes.spacer
4153
4252
  }), /*#__PURE__*/React__default.createElement(ui.FileSelector, {
4154
4253
  name: "Index file",
4155
- description: "Automatically inferred from the URL if not supplied",
4254
+ description: "(Optional) The URL of the index file is automatically inferred from the URL of the main file if it is not supplied.",
4156
4255
  location: model.indexTrackData,
4157
- setLocation: model.setIndexTrackData
4158
- })));
4256
+ setLocation: model.setIndexTrackData,
4257
+ setName: model.setTrackName,
4258
+ rootModel: rootModel
4259
+ }));
4159
4260
  }
4160
4261
 
4161
- var useStyles$b = /*#__PURE__*/core.makeStyles(function (theme) {
4262
+ var TrackSourceSelect$1 = /*#__PURE__*/mobxReact.observer(TrackSourceSelect);
4263
+
4264
+ var useStyles$a = /*#__PURE__*/core.makeStyles(function (theme) {
4162
4265
  return {
4163
4266
  root: {
4164
4267
  marginTop: theme.spacing(1)
@@ -4191,7 +4294,7 @@ function AddTrackWidget(_ref) {
4191
4294
  activeStep = _useState2[0],
4192
4295
  setActiveStep = _useState2[1];
4193
4296
 
4194
- var classes = useStyles$b();
4297
+ var classes = useStyles$a();
4195
4298
  var session = util.getSession(model);
4196
4299
  var assembly = model.assembly,
4197
4300
  trackAdapter = model.trackAdapter,
@@ -4207,7 +4310,7 @@ function AddTrackWidget(_ref) {
4207
4310
  function getStepContent(step) {
4208
4311
  switch (step) {
4209
4312
  case 0:
4210
- return /*#__PURE__*/React__default.createElement(TrackSourceSelect, {
4313
+ return /*#__PURE__*/React__default.createElement(TrackSourceSelect$1, {
4211
4314
  model: model
4212
4315
  });
4213
4316
 
@@ -4222,38 +4325,61 @@ function AddTrackWidget(_ref) {
4222
4325
  }
4223
4326
 
4224
4327
  function handleNext() {
4225
- if (activeStep !== steps.length - 1) {
4226
- setActiveStep(activeStep + 1);
4227
- return;
4228
- }
4229
-
4230
- var trackId = "".concat(trackName.toLowerCase().replace(/ /g, '_'), "-").concat(Date.now()).concat(session.adminMode ? '' : '-sessionTrack');
4231
- var assemblyInstance = session.assemblyManager.get(assembly);
4328
+ return _handleNext.apply(this, arguments);
4329
+ }
4232
4330
 
4233
- if (trackAdapter && trackAdapter.type !== 'UNKNOWN') {
4234
- // @ts-ignore
4235
- session.addTrackConf({
4236
- trackId: trackId,
4237
- type: trackType,
4238
- name: trackName,
4239
- assemblyNames: [assembly],
4240
- adapter: _objectSpread2(_objectSpread2({}, trackAdapter), {}, {
4241
- sequenceAdapter: configuration.getConf(assemblyInstance, ['sequence', 'adapter'])
4242
- })
4243
- });
4331
+ function _handleNext() {
4332
+ _handleNext = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee() {
4333
+ var trackId, assemblyInstance;
4334
+ return runtime_1.wrap(function _callee$(_context) {
4335
+ while (1) {
4336
+ switch (_context.prev = _context.next) {
4337
+ case 0:
4338
+ if (!(activeStep !== steps.length - 1)) {
4339
+ _context.next = 3;
4340
+ break;
4341
+ }
4244
4342
 
4245
- if (model.view) {
4246
- model.view.showTrack(trackId);
4247
- } else {
4248
- session.notify('Open a new view, or use the track selector in an existing view, to view this track', 'info');
4249
- }
4343
+ setActiveStep(activeStep + 1);
4344
+ return _context.abrupt("return");
4250
4345
 
4251
- model.clearData(); // @ts-ignore
4346
+ case 3:
4347
+ trackId = "".concat(trackName.toLowerCase().replace(/ /g, '_'), "-").concat(Date.now()).concat(session.adminMode ? '' : '-sessionTrack');
4348
+ assemblyInstance = session.assemblyManager.get(assembly);
4349
+
4350
+ if (trackAdapter && trackAdapter.type !== 'UNKNOWN') {
4351
+ // @ts-ignore
4352
+ session.addTrackConf({
4353
+ trackId: trackId,
4354
+ type: trackType,
4355
+ name: trackName,
4356
+ assemblyNames: [assembly],
4357
+ adapter: _objectSpread2(_objectSpread2({}, trackAdapter), {}, {
4358
+ sequenceAdapter: configuration.getConf(assemblyInstance, ['sequence', 'adapter'])
4359
+ })
4360
+ });
4361
+
4362
+ if (model.view) {
4363
+ model.view.showTrack(trackId);
4364
+ } else {
4365
+ session.notify('Open a new view, or use the track selector in an existing view, to view this track', 'info');
4366
+ }
4367
+
4368
+ model.clearData(); // @ts-ignore
4369
+
4370
+ session.hideWidget(model);
4371
+ } else {
4372
+ setTrackErrorMessage('Failed to add track.\nThe configuration of this file is not currently supported.');
4373
+ }
4252
4374
 
4253
- session.hideWidget(model);
4254
- } else {
4255
- setTrackErrorMessage('Failed to add track.\nThe configuration of this file is not currently supported.');
4256
- }
4375
+ case 6:
4376
+ case "end":
4377
+ return _context.stop();
4378
+ }
4379
+ }
4380
+ }, _callee);
4381
+ }));
4382
+ return _handleNext.apply(this, arguments);
4257
4383
  }
4258
4384
 
4259
4385
  function handleBack() {
@@ -4369,7 +4495,7 @@ function ConnectionTypeSelect(props) {
4369
4495
  })));
4370
4496
  }
4371
4497
 
4372
- var useStyles$c = /*#__PURE__*/styles.makeStyles(function (theme) {
4498
+ var useStyles$b = /*#__PURE__*/styles.makeStyles(function (theme) {
4373
4499
  return {
4374
4500
  root: {
4375
4501
  marginTop: theme.spacing(1)
@@ -4411,7 +4537,7 @@ function AddConnectionWidget(_ref) {
4411
4537
  activeStep = _useState8[0],
4412
4538
  setActiveStep = _useState8[1];
4413
4539
 
4414
- var classes = useStyles$c();
4540
+ var classes = useStyles$b();
4415
4541
  var session = util.getSession(model);
4416
4542
 
4417
4543
  var _getEnv = mobxStateTree.getEnv(session),
@@ -4584,7 +4710,7 @@ var DeleteConnectionDialog$3 = {
4584
4710
  'default': DeleteConnectionDialog$2
4585
4711
  };
4586
4712
 
4587
- var useStyles$d = /*#__PURE__*/core.makeStyles(function (theme) {
4713
+ var useStyles$c = /*#__PURE__*/core.makeStyles(function (theme) {
4588
4714
  return {
4589
4715
  closeButton: {
4590
4716
  position: 'absolute',
@@ -4603,7 +4729,7 @@ function ManageConnectionsDlg(_ref) {
4603
4729
  var session = _ref.session,
4604
4730
  handleClose = _ref.handleClose,
4605
4731
  breakConnection = _ref.breakConnection;
4606
- var classes = useStyles$d();
4732
+ var classes = useStyles$c();
4607
4733
  var adminMode = session.adminMode,
4608
4734
  connections = session.connections,
4609
4735
  sessionConnections = session.sessionConnections;
@@ -4649,7 +4775,7 @@ var ManageConnectionsDialog$2 = {
4649
4775
  'default': ManageConnectionsDialog$1
4650
4776
  };
4651
4777
 
4652
- var useStyles$e = /*#__PURE__*/core.makeStyles(function (theme) {
4778
+ var useStyles$d = /*#__PURE__*/core.makeStyles(function (theme) {
4653
4779
  return {
4654
4780
  closeButton: {
4655
4781
  position: 'absolute',
@@ -4669,7 +4795,7 @@ function ToggleConnectionDialog(_ref) {
4669
4795
  handleClose = _ref.handleClose,
4670
4796
  assemblyName = _ref.assemblyName,
4671
4797
  breakConnection = _ref.breakConnection;
4672
- var classes = useStyles$e();
4798
+ var classes = useStyles$d();
4673
4799
  var connections = session.connections,
4674
4800
  connectionInstances = session.connectionInstances;
4675
4801
  var assemblySpecificConnections = connections.filter(function (c) {