@jbrowse/plugin-data-management 1.4.1 → 1.5.2

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
@@ -2,19 +2,15 @@ import React, { useState, useEffect, lazy, Suspense, useRef, useMemo, useCallbac
2
2
  import ConnectionType from '@jbrowse/core/pluggableElementTypes/ConnectionType';
3
3
  import WidgetType from '@jbrowse/core/pluggableElementTypes/WidgetType';
4
4
  import Plugin from '@jbrowse/core/Plugin';
5
- import { objectHash, getSession, isElectron, isAbstractMenuManager } from '@jbrowse/core/util';
6
- import NoteAddIcon from '@material-ui/icons/NoteAdd';
7
- import InputIcon from '@material-ui/icons/Input';
8
- import ExtensionIcon from '@material-ui/icons/Extension';
9
5
  import { baseConnectionConfig, BaseConnectionModelFactory } from '@jbrowse/core/pluggableElementTypes/models';
10
- import { ConfigurationSchema, ConfigurationReference, readConfObject, getConf } from '@jbrowse/core/configuration';
6
+ import { ConfigurationSchema, ConfigurationReference, getConf, readConfObject } from '@jbrowse/core/configuration';
7
+ import { objectHash, getSession, isElectron } from '@jbrowse/core/util';
11
8
  import { types, getParent, getEnv, getRoot } from 'mobx-state-tree';
12
- import { GenomesFile, TrackDbFile, HubFile } from '@gmod/ucsc-hub';
13
9
  import { openLocation } from '@jbrowse/core/util/io';
14
- import { generateUnknownTrackConf, generateUnsupportedTrackConf, guessAdapter, UNSUPPORTED, guessTrackType, UNKNOWN } from '@jbrowse/core/util/tracks';
10
+ import { generateUnknownTrackConf, generateUnsupportedTrackConf, guessAdapter, getFileName, UNSUPPORTED, guessTrackType, UNKNOWN } from '@jbrowse/core/util/tracks';
15
11
  import { ElementId } from '@jbrowse/core/util/types/mst';
16
12
  import { observer, PropTypes } from 'mobx-react';
17
- import { ListItem, IconButton, Typography, Tooltip, Dialog, DialogTitle, DialogContent, DialogActions, Button, List, Card, CardContent, Link, CardActions, TextField as TextField$1, InputAdornment, Accordion, AccordionSummary, makeStyles as makeStyles$1, Grid, TableRow, TableCell, TableContainer, Paper as Paper$1, Table, TableHead, TableBody, MenuItem, Fab, Menu, FormControlLabel, Checkbox, Stepper, Step, StepLabel, StepContent, DialogContentText } from '@material-ui/core';
13
+ import { ListItem, IconButton, Typography, Tooltip, Dialog, DialogTitle, DialogContent, DialogActions, Button, List, Card, CardContent, Link, CardActions, makeStyles as makeStyles$1, DialogContentText, TextField, Collapse, InputAdornment, Accordion, AccordionSummary, TableRow, TableCell, TableContainer, Paper, Table, TableHead, TableBody, Grid, MenuItem, Fab, Menu, FormControlLabel, Checkbox, ListSubheader, Stepper, Step, StepLabel, StepContent } from '@material-ui/core';
18
14
  import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
19
15
  import ClearIcon from '@material-ui/icons/Clear';
20
16
  import InfoOutlinedIcon from '@material-ui/icons/InfoOutlined';
@@ -25,22 +21,8 @@ import { isSessionWithSessionPlugins } from '@jbrowse/core/util/types';
25
21
  import PersonIcon from '@material-ui/icons/Person';
26
22
  import AddIcon from '@material-ui/icons/Add';
27
23
  import CheckIcon from '@material-ui/icons/Check';
28
- import Dialog$1 from '@material-ui/core/Dialog';
29
- import DialogTitle$1 from '@material-ui/core/DialogTitle';
30
- import TextField from '@material-ui/core/TextField';
31
- import Button$1 from '@material-ui/core/Button';
24
+ import clsx from 'clsx';
32
25
  import IconButton$1 from '@material-ui/core/IconButton';
33
- import DialogContent$1 from '@material-ui/core/DialogContent';
34
- import DialogActions$1 from '@material-ui/core/DialogActions';
35
- import List$1 from '@material-ui/core/List';
36
- import ListItem$1 from '@material-ui/core/ListItem';
37
- import ListItemIcon from '@material-ui/core/ListItemIcon';
38
- import ListItemText from '@material-ui/core/ListItemText';
39
- import ListSubheader from '@material-ui/core/ListSubheader';
40
- import Paper from '@material-ui/core/Paper';
41
- import Typography$1 from '@material-ui/core/Typography';
42
- import Radio from '@material-ui/core/Radio';
43
- import pluralize from 'pluralize';
44
26
  import ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos';
45
27
  import CreateIcon from '@material-ui/icons/Create';
46
28
  import DeleteIcon from '@material-ui/icons/Delete';
@@ -54,14 +36,16 @@ import PowerOutlinedIcon from '@material-ui/icons/PowerOutlined';
54
36
  import AutoSizer from 'react-virtualized-auto-sizer';
55
37
  import JBrowseMenu from '@jbrowse/core/ui/Menu';
56
38
  import { VariableSizeTree } from 'react-vtree';
57
- import Link$1 from '@material-ui/core/Link';
58
- import MenuItem$1 from '@material-ui/core/MenuItem';
59
- import { FileSelector as FileSelector$1 } from '@jbrowse/core/ui';
60
39
  import { Alert } from '@material-ui/lab';
40
+ import { FileSelector as FileSelector$1 } from '@jbrowse/core/ui';
41
+ import Button$1 from '@material-ui/core/Button';
61
42
  import Step$1 from '@material-ui/core/Step';
62
43
  import StepContent$1 from '@material-ui/core/StepContent';
63
44
  import StepLabel$1 from '@material-ui/core/StepLabel';
64
45
  import Stepper$1 from '@material-ui/core/Stepper';
46
+ import Typography$1 from '@material-ui/core/Typography';
47
+ import MenuItem$1 from '@material-ui/core/MenuItem';
48
+ import TextField$1 from '@material-ui/core/TextField';
65
49
  import OpenInNewIcon from '@material-ui/icons/OpenInNew';
66
50
 
67
51
  function ownKeys(object, enumerableOnly) {
@@ -246,6 +230,8 @@ function _assertThisInitialized(self) {
246
230
  function _possibleConstructorReturn(self, call) {
247
231
  if (call && (typeof call === "object" || typeof call === "function")) {
248
232
  return call;
233
+ } else if (call !== void 0) {
234
+ throw new TypeError("Derived constructors may only return object or undefined");
249
235
  }
250
236
 
251
237
  return _assertThisInitialized(self);
@@ -406,7 +392,8 @@ var ucscConfigSchema = /*#__PURE__*/ConfigurationSchema('UCSCTrackHubConnection'
406
392
  hubTxtLocation: {
407
393
  type: 'fileLocation',
408
394
  defaultValue: {
409
- uri: 'http://mysite.com/path/to/hub.txt'
395
+ uri: 'http://mysite.com/path/to/hub.txt',
396
+ locationType: 'UriLocation'
410
397
  },
411
398
  description: 'location of the hub file (usually called hub.txt)'
412
399
  },
@@ -516,11 +503,9 @@ var runtime_1 = /*#__PURE__*/createCommonjsModule(function (module) {
516
503
 
517
504
 
518
505
  var IteratorPrototype = {};
519
-
520
- IteratorPrototype[iteratorSymbol] = function () {
506
+ define(IteratorPrototype, iteratorSymbol, function () {
521
507
  return this;
522
- };
523
-
508
+ });
524
509
  var getProto = Object.getPrototypeOf;
525
510
  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
526
511
 
@@ -531,8 +516,9 @@ var runtime_1 = /*#__PURE__*/createCommonjsModule(function (module) {
531
516
  }
532
517
 
533
518
  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
534
- GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
535
- GeneratorFunctionPrototype.constructor = GeneratorFunction;
519
+ GeneratorFunction.prototype = GeneratorFunctionPrototype;
520
+ define(Gp, "constructor", GeneratorFunctionPrototype);
521
+ define(GeneratorFunctionPrototype, "constructor", GeneratorFunction);
536
522
  GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the
537
523
  // Iterator interface in terms of a single ._invoke method.
538
524
 
@@ -637,11 +623,9 @@ var runtime_1 = /*#__PURE__*/createCommonjsModule(function (module) {
637
623
  }
638
624
 
639
625
  defineIteratorMethods(AsyncIterator.prototype);
640
-
641
- AsyncIterator.prototype[asyncIteratorSymbol] = function () {
626
+ define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
642
627
  return this;
643
- };
644
-
628
+ });
645
629
  exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
646
630
  // AsyncIterator objects; they just return a Promise for the value of
647
631
  // the final result produced by the iterator.
@@ -818,13 +802,12 @@ var runtime_1 = /*#__PURE__*/createCommonjsModule(function (module) {
818
802
  // object to not be returned from this call. This ensures that doesn't happen.
819
803
  // See https://github.com/facebook/regenerator/issues/274 for more details.
820
804
 
821
- Gp[iteratorSymbol] = function () {
805
+ define(Gp, iteratorSymbol, function () {
822
806
  return this;
823
- };
824
-
825
- Gp.toString = function () {
807
+ });
808
+ define(Gp, "toString", function () {
826
809
  return "[object Generator]";
827
- };
810
+ });
828
811
 
829
812
  function pushTryEntry(locs) {
830
813
  var entry = {
@@ -1136,14 +1119,19 @@ var runtime_1 = /*#__PURE__*/createCommonjsModule(function (module) {
1136
1119
  } catch (accidentalStrictMode) {
1137
1120
  // This module should not be running in strict mode, so the above
1138
1121
  // assignment should always work unless something is misconfigured. Just
1139
- // in case runtime.js accidentally runs in strict mode, we can escape
1122
+ // in case runtime.js accidentally runs in strict mode, in modern engines
1123
+ // we can explicitly access globalThis. In older engines we can escape
1140
1124
  // strict mode using a global Function call. This could conceivably fail
1141
1125
  // if a Content Security Policy forbids using Function, but in that case
1142
1126
  // the proper solution is to fix the accidental strict mode problem. If
1143
1127
  // you've misconfigured your bundler to force strict mode and applied a
1144
1128
  // CSP to forbid Function, and you're not willing to fix either of those
1145
1129
  // problems, please detail your unique predicament in a GitHub issue.
1146
- Function("r", "regeneratorRuntime = r")(runtime);
1130
+ if (typeof globalThis === "object") {
1131
+ globalThis.regeneratorRuntime = runtime;
1132
+ } else {
1133
+ Function("r", "regeneratorRuntime = r")(runtime);
1134
+ }
1147
1135
  }
1148
1136
  });
1149
1137
 
@@ -1153,7 +1141,8 @@ function fetchHubFile(_x) {
1153
1141
 
1154
1142
  function _fetchHubFile() {
1155
1143
  _fetchHubFile = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee(hubFileLocation) {
1156
- var hubFileText;
1144
+ var hubFileText, _yield$import, HubFile;
1145
+
1157
1146
  return runtime_1.wrap(function _callee$(_context) {
1158
1147
  while (1) {
1159
1148
  switch (_context.prev = _context.next) {
@@ -1164,19 +1153,25 @@ function _fetchHubFile() {
1164
1153
 
1165
1154
  case 3:
1166
1155
  hubFileText = _context.sent;
1156
+ _context.next = 6;
1157
+ return import('@gmod/ucsc-hub');
1158
+
1159
+ case 6:
1160
+ _yield$import = _context.sent;
1161
+ HubFile = _yield$import.HubFile;
1167
1162
  return _context.abrupt("return", new HubFile(hubFileText));
1168
1163
 
1169
- case 7:
1170
- _context.prev = 7;
1164
+ case 11:
1165
+ _context.prev = 11;
1171
1166
  _context.t0 = _context["catch"](0);
1172
1167
  throw new Error("Not a valid hub.txt file, got error: '".concat(_context.t0, "'"));
1173
1168
 
1174
- case 10:
1169
+ case 14:
1175
1170
  case "end":
1176
1171
  return _context.stop();
1177
1172
  }
1178
1173
  }
1179
- }, _callee, null, [[0, 7]]);
1174
+ }, _callee, null, [[0, 11]]);
1180
1175
  }));
1181
1176
  return _fetchHubFile.apply(this, arguments);
1182
1177
  }
@@ -1187,7 +1182,8 @@ function fetchGenomesFile(_x2) {
1187
1182
 
1188
1183
  function _fetchGenomesFile() {
1189
1184
  _fetchGenomesFile = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee2(genomesFileLocation) {
1190
- var genomesFileText;
1185
+ var genomesFileText, _yield$import2, GenomesFile;
1186
+
1191
1187
  return runtime_1.wrap(function _callee2$(_context2) {
1192
1188
  while (1) {
1193
1189
  switch (_context2.prev = _context2.next) {
@@ -1197,9 +1193,15 @@ function _fetchGenomesFile() {
1197
1193
 
1198
1194
  case 2:
1199
1195
  genomesFileText = _context2.sent;
1196
+ _context2.next = 5;
1197
+ return import('@gmod/ucsc-hub');
1198
+
1199
+ case 5:
1200
+ _yield$import2 = _context2.sent;
1201
+ GenomesFile = _yield$import2.GenomesFile;
1200
1202
  return _context2.abrupt("return", new GenomesFile(genomesFileText));
1201
1203
 
1202
- case 4:
1204
+ case 8:
1203
1205
  case "end":
1204
1206
  return _context2.stop();
1205
1207
  }
@@ -1215,7 +1217,8 @@ function fetchTrackDbFile(_x3) {
1215
1217
 
1216
1218
  function _fetchTrackDbFile() {
1217
1219
  _fetchTrackDbFile = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee3(trackDbFileLocation) {
1218
- var trackDbFileText;
1220
+ var text, _yield$import3, TrackDbFile;
1221
+
1219
1222
  return runtime_1.wrap(function _callee3$(_context3) {
1220
1223
  while (1) {
1221
1224
  switch (_context3.prev = _context3.next) {
@@ -1224,10 +1227,16 @@ function _fetchTrackDbFile() {
1224
1227
  return openLocation(trackDbFileLocation).readFile('utf8');
1225
1228
 
1226
1229
  case 2:
1227
- trackDbFileText = _context3.sent;
1228
- return _context3.abrupt("return", new TrackDbFile(trackDbFileText));
1230
+ text = _context3.sent;
1231
+ _context3.next = 5;
1232
+ return import('@gmod/ucsc-hub');
1229
1233
 
1230
- case 4:
1234
+ case 5:
1235
+ _yield$import3 = _context3.sent;
1236
+ TrackDbFile = _yield$import3.TrackDbFile;
1237
+ return _context3.abrupt("return", new TrackDbFile(text));
1238
+
1239
+ case 8:
1231
1240
  case "end":
1232
1241
  return _context3.stop();
1233
1242
  }
@@ -1295,11 +1304,13 @@ function makeTrackConfig(track, categories, trackDbFileLocation, trackDb, sequen
1295
1304
 
1296
1305
  if (trackDbFileLocation.uri) {
1297
1306
  bigDataLocation = {
1298
- uri: new URL(track.get('bigDataUrl'), trackDbFileLocation.uri).href
1307
+ uri: new URL(track.get('bigDataUrl'), trackDbFileLocation.uri).href,
1308
+ locationType: 'UriLocation'
1299
1309
  };
1300
1310
  } else {
1301
1311
  bigDataLocation = {
1302
- localPath: track.get('bigDataUrl')
1312
+ localPath: track.get('bigDataUrl'),
1313
+ locationType: 'LocalPathLocation'
1303
1314
  };
1304
1315
  }
1305
1316
 
@@ -1309,15 +1320,19 @@ function makeTrackConfig(track, categories, trackDbFileLocation, trackDb, sequen
1309
1320
  case 'bam':
1310
1321
  if (trackDbFileLocation.uri) {
1311
1322
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1312
- uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href
1323
+ uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href,
1324
+ locationType: 'UriLocation'
1313
1325
  } : {
1314
- uri: new URL("".concat(track.get('bigDataUrl'), ".bai"), trackDbFileLocation.uri).href
1326
+ uri: new URL("".concat(track.get('bigDataUrl'), ".bai"), trackDbFileLocation.uri).href,
1327
+ locationType: 'UriLocation'
1315
1328
  };
1316
1329
  } else {
1317
1330
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1318
- localPath: track.get('bigDataIndex')
1331
+ localPath: track.get('bigDataIndex'),
1332
+ locationType: 'LocalPathLocation'
1319
1333
  } : {
1320
- localPath: "".concat(track.get('bigDataUrl'), ".bai")
1334
+ localPath: "".concat(track.get('bigDataUrl'), ".bai"),
1335
+ locationType: 'LocalPathLocation'
1321
1336
  };
1322
1337
  }
1323
1338
 
@@ -1467,15 +1482,19 @@ function makeTrackConfig(track, categories, trackDbFileLocation, trackDb, sequen
1467
1482
  case 'cram':
1468
1483
  if (trackDbFileLocation.uri) {
1469
1484
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1470
- uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href
1485
+ uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href,
1486
+ locationType: 'UriLocation'
1471
1487
  } : {
1472
- uri: new URL("".concat(track.get('bigDataUrl'), ".crai"), trackDbFileLocation.uri).href
1488
+ uri: new URL("".concat(track.get('bigDataUrl'), ".crai"), trackDbFileLocation.uri).href,
1489
+ locationType: 'UriLocation'
1473
1490
  };
1474
1491
  } else {
1475
1492
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1476
- localPath: track.get('bigDataIndex')
1493
+ localPath: track.get('bigDataIndex'),
1494
+ locationType: 'LocalPathLocation'
1477
1495
  } : {
1478
- localPath: "".concat(track.get('bigDataUrl'), ".crai")
1496
+ localPath: "".concat(track.get('bigDataUrl'), ".crai"),
1497
+ locationType: 'LocalPathLocation'
1479
1498
  };
1480
1499
  }
1481
1500
 
@@ -1519,15 +1538,19 @@ function makeTrackConfig(track, categories, trackDbFileLocation, trackDb, sequen
1519
1538
  case 'vcfTabix':
1520
1539
  if (trackDbFileLocation.uri) {
1521
1540
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1522
- uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href
1541
+ uri: new URL(track.get('bigDataIndex'), trackDbFileLocation.uri).href,
1542
+ locationType: 'UriLocation'
1523
1543
  } : {
1524
- uri: new URL("".concat(track.get('bigDataUrl'), ".tbi"), trackDbFileLocation.uri).href
1544
+ uri: new URL("".concat(track.get('bigDataUrl'), ".tbi"), trackDbFileLocation.uri).href,
1545
+ locationType: 'UriLocation'
1525
1546
  };
1526
1547
  } else {
1527
1548
  bigDataIndexLocation = track.get('bigDataIndex') ? {
1528
- localPath: track.get('bigDataIndex')
1549
+ localPath: track.get('bigDataIndex'),
1550
+ locationType: 'LocalPathLocation'
1529
1551
  } : {
1530
- localPath: "".concat(track.get('bigDataUrl'), ".tbi")
1552
+ localPath: "".concat(track.get('bigDataUrl'), ".tbi"),
1553
+ locationType: 'LocalPathLocation'
1531
1554
  };
1532
1555
  }
1533
1556
 
@@ -1578,22 +1601,17 @@ function UCSCTrackHubConnection(pluginManager) {
1578
1601
  }).actions(function (self) {
1579
1602
  return {
1580
1603
  connect: function connect() {
1581
- var connectionName = readConfObject(self.configuration, 'name');
1582
- var hubFileLocation = readConfObject(self.configuration, 'hubTxtLocation');
1604
+ var connectionName = getConf(self, 'name');
1605
+ var hubFileLocation = getConf(self, 'hubTxtLocation');
1583
1606
  var session = getSession(self);
1584
1607
  fetchHubFile(hubFileLocation).then(function (hubFile) {
1585
- var genomesFileLocation;
1586
-
1587
- if (hubFileLocation.uri) {
1588
- genomesFileLocation = {
1589
- uri: new URL(hubFile.get('genomesFile'), hubFileLocation.uri).href
1590
- };
1591
- } else {
1592
- genomesFileLocation = {
1593
- localPath: hubFile.get('genomesFile')
1594
- };
1595
- }
1596
-
1608
+ var genomesFileLocation = hubFileLocation.uri ? {
1609
+ uri: new URL(hubFile.get('genomesFile'), hubFileLocation.uri).href,
1610
+ locationType: 'UriLocation'
1611
+ } : {
1612
+ localPath: hubFile.get('genomesFile'),
1613
+ locationType: 'LocalPathLocation'
1614
+ };
1597
1615
  return Promise.all([hubFile, fetchGenomesFile(genomesFileLocation)]);
1598
1616
  }).then(function (_ref) {
1599
1617
  var _ref2 = _slicedToArray(_ref, 2),
@@ -1611,7 +1629,7 @@ function UCSCTrackHubConnection(pluginManager) {
1611
1629
  genomeName = _step$value[0],
1612
1630
  genome = _step$value[1];
1613
1631
 
1614
- var assemblyNames = readConfObject(self.configuration, 'assemblyNames');
1632
+ var assemblyNames = getConf(self, 'assemblyNames');
1615
1633
 
1616
1634
  if (assemblyNames.length > 0 && !assemblyNames.includes(genomeName)) {
1617
1635
  return "break";
@@ -1625,18 +1643,13 @@ function UCSCTrackHubConnection(pluginManager) {
1625
1643
  throw new Error("Cannot find assembly for \"".concat(genomeName, "\" from the genomes file for connection \"").concat(connectionName, "\""));
1626
1644
  }
1627
1645
 
1628
- var trackDbFileLocation = void 0;
1629
-
1630
- if (hubFileLocation.uri) {
1631
- trackDbFileLocation = {
1632
- uri: new URL(genome.get('trackDb'), new URL(hubFile.get('genomesFile'), hubFileLocation.uri)).href
1633
- };
1634
- } else {
1635
- trackDbFileLocation = {
1636
- localPath: genome.get('trackDb')
1637
- };
1638
- }
1639
-
1646
+ var trackDbFileLocation = hubFileLocation.uri ? {
1647
+ uri: new URL(genome.get('trackDb'), new URL(hubFile.get('genomesFile'), hubFileLocation.uri)).href,
1648
+ locationType: 'UriLocation'
1649
+ } : {
1650
+ localPath: genome.get('trackDb'),
1651
+ locationType: 'LocalPathLocation'
1652
+ };
1640
1653
  trackDbData.push(Promise.all([trackDbFileLocation, fetchTrackDbFile(trackDbFileLocation), genomeName, assemblyConf]));
1641
1654
  };
1642
1655
 
@@ -1694,13 +1707,6 @@ function isAbsoluteUrl() {
1694
1707
  }
1695
1708
  }
1696
1709
 
1697
- function getFileName(track) {
1698
- var uri = 'uri' in track ? track.uri : undefined;
1699
- var localPath = 'localPath' in track ? track.localPath : undefined;
1700
- var blob = 'blobId' in track ? track : undefined;
1701
- 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)) || '';
1702
- }
1703
-
1704
1710
  function f(pluginManager) {
1705
1711
  return types.model('AddTrackModel', {
1706
1712
  id: ElementId,
@@ -1756,7 +1762,7 @@ function f(pluginManager) {
1756
1762
  var trackData = self.trackData,
1757
1763
  indexTrackData = self.indexTrackData,
1758
1764
  adapterHint = self.adapterHint;
1759
- return trackData ? guessAdapter(trackData, indexTrackData, getFileName, adapterHint) : undefined;
1765
+ return trackData ? guessAdapter(trackData, indexTrackData, adapterHint, self) : undefined;
1760
1766
  },
1761
1767
 
1762
1768
  get trackName() {
@@ -1823,7 +1829,7 @@ function f(pluginManager) {
1823
1829
  },
1824
1830
 
1825
1831
  get trackType() {
1826
- return self.altTrackType || (this.trackAdapter ? guessTrackType(this.trackAdapter.type) : '');
1832
+ return self.altTrackType || (this.trackAdapter ? guessTrackType(this.trackAdapter.type, self) : '');
1827
1833
  }
1828
1834
 
1829
1835
  };
@@ -1865,9 +1871,9 @@ var hasAnyOverlap = function hasAnyOverlap() {
1865
1871
  function passesFilter(filter, config) {
1866
1872
  var name = getTrackName(config);
1867
1873
  var categories = readConfObject(config, 'category') || [];
1868
- var regexp = new RegExp(filter, 'i');
1869
- return !!name.match(regexp) || categories.filter(function (cat) {
1870
- return !!cat.match(regexp);
1874
+ var filterLower = filter.toLowerCase();
1875
+ return !!name.toLowerCase().includes(filterLower) || categories.filter(function (cat) {
1876
+ return !!cat.toLowerCase().includes(filterLower);
1871
1877
  }).length;
1872
1878
  }
1873
1879
 
@@ -2142,15 +2148,17 @@ var useStyles = /*#__PURE__*/makeStyles(function () {
2142
2148
  },
2143
2149
  dialogContainer: {
2144
2150
  margin: 15
2151
+ },
2152
+ lockedPluginTooltip: {
2153
+ marginRight: '0.5rem'
2145
2154
  }
2146
2155
  };
2147
2156
  });
2148
2157
 
2149
2158
  function LockedPlugin() {
2159
+ var classes = useStyles();
2150
2160
  return /*#__PURE__*/React.createElement(Tooltip, {
2151
- style: {
2152
- marginRight: '0.5rem'
2153
- },
2161
+ className: classes.lockedPluginTooltip,
2154
2162
  title: "This plugin was installed by an administrator, you cannot remove it."
2155
2163
  }, /*#__PURE__*/React.createElement(LockIcon, null));
2156
2164
  }
@@ -2212,7 +2220,7 @@ function InstalledPlugin(_ref2) {
2212
2220
  onClose: function onClose(name) {
2213
2221
  if (name) {
2214
2222
  var pluginMetadata = pluginManager.pluginMetadata[plugin.name];
2215
- var pluginUrl = pluginMetadata.url;
2223
+ var pluginUrl = pluginMetadata.url || pluginMetadata.esmUrl || pluginMetadata.umdUrl || pluginMetadata.cjsUrl;
2216
2224
 
2217
2225
  if (adminMode) {
2218
2226
  jbrowse.removePlugin(pluginUrl);
@@ -2264,7 +2272,7 @@ function InstalledPluginsList(_ref) {
2264
2272
 
2265
2273
  var InstalledPluginsList$1 = /*#__PURE__*/observer(InstalledPluginsList);
2266
2274
 
2267
- var useStyles$1 = /*#__PURE__*/makeStyles(function () {
2275
+ var useStyles$1 = /*#__PURE__*/makeStyles$1(function () {
2268
2276
  return {
2269
2277
  card: {
2270
2278
  margin: '1em'
@@ -2348,101 +2356,194 @@ function PluginCard(_ref) {
2348
2356
 
2349
2357
  var PluginCard$1 = /*#__PURE__*/observer(PluginCard);
2350
2358
 
2351
- var useStyles$2 = /*#__PURE__*/makeStyles(function () {
2359
+ var useStyles$2 = /*#__PURE__*/makeStyles$1(function (theme) {
2352
2360
  return {
2353
- closeDialog: {
2361
+ closeButton: {
2354
2362
  position: 'absolute',
2355
- right: 0,
2356
- top: 0
2363
+ right: theme.spacing(1),
2364
+ top: theme.spacing(1)
2357
2365
  },
2358
- dialogContainer: {
2359
- margin: 15,
2366
+ dialogContent: {
2360
2367
  display: 'flex',
2361
2368
  flexDirection: 'column'
2369
+ },
2370
+ expand: {
2371
+ transform: 'rotate(0deg)',
2372
+ marginLeft: 'auto',
2373
+ transition: theme.transitions.create('transform', {
2374
+ duration: theme.transitions.duration.shortest
2375
+ })
2376
+ },
2377
+ expandOpen: {
2378
+ transform: 'rotate(180deg)'
2362
2379
  }
2363
2380
  };
2364
2381
  });
2365
2382
 
2366
2383
  function CustomPluginForm(_ref) {
2367
2384
  var open = _ref.open,
2368
- _onClose = _ref.onClose,
2385
+ onClose = _ref.onClose,
2369
2386
  model = _ref.model;
2370
2387
  var classes = useStyles$2();
2371
2388
 
2372
- var _useState = useState({
2373
- name: '',
2374
- url: ''
2375
- }),
2389
+ var _useState = useState(''),
2376
2390
  _useState2 = _slicedToArray(_useState, 2),
2377
- formInput = _useState2[0],
2378
- setFormInput = _useState2[1];
2391
+ umdPluginName = _useState2[0],
2392
+ setUMDPluginName = _useState2[1];
2379
2393
 
2380
- var handleChange = function handleChange(event) {
2381
- setFormInput(_objectSpread2(_objectSpread2({}, formInput), {}, _defineProperty({}, event.target.name, event.target.value)));
2382
- };
2394
+ var _useState3 = useState(''),
2395
+ _useState4 = _slicedToArray(_useState3, 2),
2396
+ umdPluginUrl = _useState4[0],
2397
+ setUMDPluginUrl = _useState4[1];
2398
+
2399
+ var _useState5 = useState(''),
2400
+ _useState6 = _slicedToArray(_useState5, 2),
2401
+ esmPluginUrl = _useState6[0],
2402
+ setESMPluginUrl = _useState6[1];
2403
+
2404
+ var _useState7 = useState(''),
2405
+ _useState8 = _slicedToArray(_useState7, 2),
2406
+ cjsPluginUrl = _useState8[0],
2407
+ setCJSPluginUrl = _useState8[1];
2408
+
2409
+ var _useState9 = useState(false),
2410
+ _useState10 = _slicedToArray(_useState9, 2),
2411
+ advancedOptionsOpen = _useState10[0],
2412
+ setAdvancedOptionsOpen = _useState10[1];
2413
+
2414
+ function handleChange(event) {
2415
+ var _event$target = event.target,
2416
+ name = _event$target.name,
2417
+ value = _event$target.value;
2418
+
2419
+ if (name === 'umdName') {
2420
+ setUMDPluginName(value);
2421
+ }
2422
+
2423
+ if (name === 'umdUrl') {
2424
+ setUMDPluginUrl(value);
2425
+ }
2426
+
2427
+ if (name === 'esmUrl') {
2428
+ setESMPluginUrl(value);
2429
+ }
2430
+
2431
+ if (name === 'cjsUrl') {
2432
+ setCJSPluginUrl(value);
2433
+ }
2434
+ }
2435
+
2436
+ function handleOpenAdvancedOptions() {
2437
+ setAdvancedOptionsOpen(!advancedOptionsOpen);
2438
+ }
2383
2439
 
2384
2440
  var rootModel = getRoot(model);
2385
2441
  var jbrowse = rootModel.jbrowse;
2442
+ var ready = Boolean(umdPluginName && umdPluginUrl || esmPluginUrl || cjsPluginUrl);
2386
2443
 
2387
- var handleSubmit = function handleSubmit() {
2388
- jbrowse.addPlugin({
2389
- name: formInput.name,
2390
- url: formInput.url
2391
- });
2392
- };
2444
+ function handleSubmit() {
2445
+ if (!ready) {
2446
+ return;
2447
+ }
2393
2448
 
2394
- return /*#__PURE__*/React.createElement(Dialog$1, {
2395
- open: open,
2396
- onClose: function onClose() {
2397
- return _onClose(false);
2449
+ var pluginDefinition = {};
2450
+
2451
+ if (umdPluginName && umdPluginUrl) {
2452
+ pluginDefinition.name = umdPluginName;
2453
+ pluginDefinition.umdUrl = umdPluginUrl;
2398
2454
  }
2399
- }, /*#__PURE__*/React.createElement(DialogTitle$1, null, /*#__PURE__*/React.createElement(IconButton$1, {
2400
- className: classes.closeDialog,
2401
- "aria-label": "close-dialog",
2455
+
2456
+ if (esmPluginUrl) {
2457
+ pluginDefinition.esmUrl = esmPluginUrl;
2458
+ }
2459
+
2460
+ if (cjsPluginUrl) {
2461
+ pluginDefinition.cjsUrl = cjsPluginUrl;
2462
+ }
2463
+
2464
+ jbrowse.addPlugin(pluginDefinition);
2465
+ }
2466
+
2467
+ function handleClose() {
2468
+ setUMDPluginName('');
2469
+ setUMDPluginUrl('');
2470
+ setESMPluginUrl('');
2471
+ setCJSPluginUrl('');
2472
+ onClose();
2473
+ }
2474
+
2475
+ return /*#__PURE__*/React.createElement(Dialog, {
2476
+ open: open,
2477
+ onClose: handleClose
2478
+ }, /*#__PURE__*/React.createElement(DialogTitle, null, "Add custom plugin", /*#__PURE__*/React.createElement(IconButton$1, {
2479
+ size: "medium",
2480
+ className: classes.closeButton,
2402
2481
  onClick: function onClick() {
2403
- return _onClose(false);
2482
+ return onClose();
2404
2483
  }
2405
- }, /*#__PURE__*/React.createElement(CloseIcon, null))), /*#__PURE__*/React.createElement("div", {
2406
- className: classes.dialogContainer
2407
- }, /*#__PURE__*/React.createElement(TextField, {
2408
- id: "name-input",
2409
- name: "name",
2484
+ }, /*#__PURE__*/React.createElement(CloseIcon, null))), /*#__PURE__*/React.createElement("form", {
2485
+ onSubmit: handleSubmit
2486
+ }, /*#__PURE__*/React.createElement(DialogContent, {
2487
+ className: classes.dialogContent
2488
+ }, /*#__PURE__*/React.createElement(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.createElement(TextField, {
2489
+ id: "umd-name-input",
2490
+ name: "umdName",
2410
2491
  label: "Plugin name",
2411
2492
  variant: "outlined",
2412
- value: formInput.name,
2413
- onChange: handleChange,
2414
- multiline: true
2493
+ value: umdPluginName,
2494
+ onChange: handleChange
2415
2495
  }), /*#__PURE__*/React.createElement(TextField, {
2416
- id: "url-input",
2417
- name: "url",
2496
+ id: "umd-url-input",
2497
+ name: "umdUrl",
2418
2498
  label: "Plugin URL",
2419
2499
  variant: "outlined",
2420
- value: formInput.url,
2421
- onChange: handleChange,
2422
- multiline: true
2423
- }), /*#__PURE__*/React.createElement(Button$1, {
2500
+ value: umdPluginUrl,
2501
+ onChange: handleChange
2502
+ }), /*#__PURE__*/React.createElement(DialogContentText, {
2503
+ onClick: handleOpenAdvancedOptions
2504
+ }, /*#__PURE__*/React.createElement(IconButton$1, {
2505
+ className: clsx(classes.expand, _defineProperty({}, classes.expandOpen, advancedOptionsOpen)),
2506
+ "aria-expanded": advancedOptionsOpen,
2507
+ "aria-label": "show more"
2508
+ }, /*#__PURE__*/React.createElement(ExpandMoreIcon, null)), "Advanced options"), /*#__PURE__*/React.createElement(Collapse, {
2509
+ "in": advancedOptionsOpen
2510
+ }, /*#__PURE__*/React.createElement("div", {
2511
+ className: classes.dialogContent
2512
+ }, /*#__PURE__*/React.createElement(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.createElement(TextField, {
2513
+ id: "esm-url-input",
2514
+ name: "esmUrl",
2515
+ label: "ESM build URL",
2516
+ variant: "outlined",
2517
+ value: esmPluginUrl,
2518
+ onChange: handleChange
2519
+ }), /*#__PURE__*/React.createElement(TextField, {
2520
+ id: "cjs-url-input",
2521
+ name: "cjsUrl",
2522
+ label: "CJS build URL",
2523
+ variant: "outlined",
2524
+ value: cjsPluginUrl,
2525
+ onChange: handleChange
2526
+ })))), /*#__PURE__*/React.createElement(DialogActions, null, /*#__PURE__*/React.createElement(Button, {
2527
+ variant: "contained",
2528
+ onClick: handleClose
2529
+ }, "Cancel"), /*#__PURE__*/React.createElement(Button, {
2424
2530
  variant: "contained",
2425
2531
  color: "primary",
2426
- style: {
2427
- marginTop: '1.5rem'
2428
- },
2429
- onClick: handleSubmit
2430
- }, "Add plugin")));
2532
+ onClick: handleSubmit,
2533
+ disabled: !ready
2534
+ }, "Submit"))));
2431
2535
  }
2432
2536
 
2433
2537
  var CustomPluginForm$1 = /*#__PURE__*/observer(CustomPluginForm);
2434
2538
 
2435
2539
  var useStyles$3 = /*#__PURE__*/makeStyles$1(function (theme) {
2436
2540
  return {
2437
- accordion: {
2438
- marginTop: '1em'
2541
+ root: {
2542
+ margin: theme.spacing(1)
2439
2543
  },
2440
2544
  expandIcon: {
2441
2545
  color: '#fff'
2442
2546
  },
2443
- searchBox: {
2444
- marginBottom: theme.spacing(2)
2445
- },
2446
2547
  adminBadge: {
2447
2548
  margin: '0.5em',
2448
2549
  borderRadius: 3,
@@ -2464,7 +2565,7 @@ function PluginStoreWidget(_ref) {
2464
2565
  var model = _ref.model;
2465
2566
  var classes = useStyles$3();
2466
2567
 
2467
- var _useState = useState([]),
2568
+ var _useState = useState(),
2468
2569
  _useState2 = _slicedToArray(_useState, 2),
2469
2570
  pluginArray = _useState2[0],
2470
2571
  setPluginArray = _useState2[1];
@@ -2486,60 +2587,71 @@ function PluginStoreWidget(_ref) {
2486
2587
  pluginManager = _getEnv.pluginManager;
2487
2588
 
2488
2589
  useEffect(function () {
2489
- var killed = false;
2590
+ var controller = new AbortController();
2591
+ var signal = controller.signal;
2490
2592
 
2491
2593
  _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee() {
2492
- var fetchResult, array;
2594
+ var response, err, array;
2493
2595
  return runtime_1.wrap(function _callee$(_context) {
2494
2596
  while (1) {
2495
2597
  switch (_context.prev = _context.next) {
2496
2598
  case 0:
2497
2599
  _context.prev = 0;
2498
2600
  _context.next = 3;
2499
- return fetch('https://jbrowse.org/plugin-store/plugins.json');
2601
+ return fetch('https://jbrowse.org/plugin-store/plugins.json', {
2602
+ signal: signal
2603
+ });
2500
2604
 
2501
2605
  case 3:
2502
- fetchResult = _context.sent;
2606
+ response = _context.sent;
2503
2607
 
2504
- if (fetchResult.ok) {
2505
- _context.next = 6;
2608
+ if (response.ok) {
2609
+ _context.next = 9;
2506
2610
  break;
2507
2611
  }
2508
2612
 
2509
- throw new Error('Failed to fetch plugin data');
2613
+ _context.next = 7;
2614
+ return response.text();
2615
+
2616
+ case 7:
2617
+ err = _context.sent;
2618
+ throw new Error("Failed to fetch plugin data: ".concat(response.status, " ").concat(response.statusText, " ").concat(err));
2510
2619
 
2511
- case 6:
2512
- _context.next = 8;
2513
- return fetchResult.json();
2620
+ case 9:
2621
+ _context.next = 11;
2622
+ return response.json();
2514
2623
 
2515
- case 8:
2624
+ case 11:
2516
2625
  array = _context.sent;
2517
2626
 
2518
- if (!killed) {
2627
+ if (!signal.aborted) {
2519
2628
  setPluginArray(array.plugins);
2520
2629
  }
2521
2630
 
2522
- _context.next = 15;
2631
+ _context.next = 19;
2523
2632
  break;
2524
2633
 
2525
- case 12:
2526
- _context.prev = 12;
2634
+ case 15:
2635
+ _context.prev = 15;
2527
2636
  _context.t0 = _context["catch"](0);
2637
+ console.error(_context.t0);
2528
2638
  setError(_context.t0);
2529
2639
 
2530
- case 15:
2640
+ case 19:
2531
2641
  case "end":
2532
2642
  return _context.stop();
2533
2643
  }
2534
2644
  }
2535
- }, _callee, null, [[0, 12]]);
2645
+ }, _callee, null, [[0, 15]]);
2536
2646
  }))();
2537
2647
 
2538
2648
  return function () {
2539
- killed = true;
2649
+ controller.abort();
2540
2650
  };
2541
2651
  }, []);
2542
- return /*#__PURE__*/React.createElement("div", null, adminMode && /*#__PURE__*/React.createElement(React.Fragment, null, !isElectron && /*#__PURE__*/React.createElement("div", {
2652
+ return /*#__PURE__*/React.createElement("div", {
2653
+ className: classes.root
2654
+ }, adminMode && /*#__PURE__*/React.createElement(React.Fragment, null, !isElectron && /*#__PURE__*/React.createElement("div", {
2543
2655
  className: classes.adminBadge
2544
2656
  }, /*#__PURE__*/React.createElement(InfoOutlinedIcon, {
2545
2657
  style: {
@@ -2555,10 +2667,11 @@ function PluginStoreWidget(_ref) {
2555
2667
  }
2556
2668
  }, "Add custom plugin")), /*#__PURE__*/React.createElement(CustomPluginForm$1, {
2557
2669
  open: customPluginFormOpen,
2558
- onClose: setCustomPluginFormOpen,
2670
+ onClose: function onClose() {
2671
+ return setCustomPluginFormOpen(false);
2672
+ },
2559
2673
  model: model
2560
- })), /*#__PURE__*/React.createElement(TextField$1, {
2561
- className: classes.searchBox,
2674
+ })), /*#__PURE__*/React.createElement(TextField, {
2562
2675
  label: "Filter plugins",
2563
2676
  value: model.filterText,
2564
2677
  onChange: function onChange(event) {
@@ -2600,7 +2713,12 @@ function PluginStoreWidget(_ref) {
2600
2713
  variant: "h5"
2601
2714
  }, "Available plugins")), error ? /*#__PURE__*/React.createElement(Typography, {
2602
2715
  color: "error"
2603
- }, "".concat(error)) : pluginArray.length ? pluginArray.filter(function (plugin) {
2716
+ }, "".concat(error)) : pluginArray ? pluginArray.filter(function (plugin) {
2717
+ // If pugin only has cjsUrl, don't display outside desktop
2718
+ if (!isElectron && !(plugin.esmUrl || plugin.url || plugin.umdUrl)) {
2719
+ return false;
2720
+ }
2721
+
2604
2722
  return plugin.name.toLowerCase().includes(model.filterText.toLowerCase());
2605
2723
  }).map(function (plugin) {
2606
2724
  return /*#__PURE__*/React.createElement(PluginCard$1, {
@@ -2725,171 +2843,56 @@ var _default = /*#__PURE__*/function (_Plugin) {
2725
2843
  }
2726
2844
  }, {
2727
2845
  key: "configure",
2728
- value: function configure(pluginManager) {
2729
- if (isAbstractMenuManager(pluginManager.rootModel)) {
2730
- pluginManager.rootModel.appendToMenu('File', {
2731
- label: 'Open track',
2732
- icon: NoteAddIcon,
2733
- onClick: function onClick(session) {
2734
- if (session.views.length === 0) {
2735
- session.notify('Please open a view to add a track first');
2736
- } else if (session.views.length >= 1) {
2737
- var widget = session.addWidget('AddTrackWidget', 'addTrackWidget', {
2738
- view: session.views[0].id
2739
- });
2740
- session.showWidget(widget);
2741
-
2742
- if (session.views.length > 1) {
2743
- 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");
2744
- }
2745
- }
2746
- }
2747
- });
2748
- pluginManager.rootModel.appendToMenu('File', {
2749
- label: 'Open connection',
2750
- icon: InputIcon,
2751
- onClick: function onClick(session) {
2752
- var widget = session.addWidget('AddConnectionWidget', 'addConnectionWidget');
2753
- session.showWidget(widget);
2754
- }
2755
- });
2756
- pluginManager.rootModel.appendToMenu('File', {
2757
- label: 'Plugin store',
2758
- icon: ExtensionIcon,
2759
- onClick: function onClick(session) {
2760
- var widget = session.addWidget('PluginStoreWidget', 'pluginStoreWidget');
2761
- session.showWidget(widget);
2762
- }
2763
- });
2764
- }
2765
- }
2846
+ value: function configure(pluginManager) {}
2766
2847
  }]);
2767
2848
 
2768
2849
  return _default;
2769
2850
  }(Plugin);
2770
2851
 
2771
- var useStyles$4 = /*#__PURE__*/makeStyles(function (theme) {
2772
- return {
2773
- root: {
2774
- margin: theme.spacing(1)
2775
- },
2776
- message: {
2777
- padding: theme.spacing(3)
2778
- },
2779
- titleBox: {
2780
- color: '#fff',
2781
- backgroundColor: theme.palette.primary.main,
2782
- textAlign: 'center'
2783
- },
2784
- dialogContent: {
2785
- width: 600
2786
- },
2787
- resetButton: {
2788
- justifyContent: 'center',
2789
- marginBottom: '6px'
2790
- }
2791
- };
2792
- });
2793
- var CurrentSession = /*#__PURE__*/observer(function (_ref) {
2794
- var session = _ref.session,
2795
- selectedDefault = _ref.selectedDefault,
2796
- handleRadio = _ref.handleRadio;
2797
- var classes = useStyles$4();
2798
- return /*#__PURE__*/React.createElement(Paper, {
2799
- className: classes.root
2800
- }, /*#__PURE__*/React.createElement(List$1, {
2801
- subheader: /*#__PURE__*/React.createElement(ListSubheader, null, "Currently open session")
2802
- }, /*#__PURE__*/React.createElement(ListItem$1, null, /*#__PURE__*/React.createElement(ListItemIcon, null, /*#__PURE__*/React.createElement(Radio, {
2803
- checked: session.name === selectedDefault,
2804
- onChange: function onChange() {
2805
- return handleRadio(session);
2806
- }
2807
- })), /*#__PURE__*/React.createElement(ListItemText, {
2808
- primary: session.name
2809
- }))));
2810
- });
2811
- var SetDefaultSession$1 = /*#__PURE__*/observer(function (_ref2) {
2812
- var rootModel = _ref2.rootModel,
2813
- open = _ref2.open,
2814
- onClose = _ref2.onClose,
2815
- currentDefault = _ref2.currentDefault;
2816
- var classes = useStyles$4();
2817
- var session = rootModel.session;
2852
+ function canSetDefaultSession(obj) {
2853
+ return _typeof(obj) === 'object' && !!obj && 'jbrowse' in obj;
2854
+ }
2818
2855
 
2819
- var _useState = useState(currentDefault),
2820
- _useState2 = _slicedToArray(_useState, 2),
2821
- selectedDefault = _useState2[0],
2822
- setSelectedDefault = _useState2[1]; // eslint-disable-next-line @typescript-eslint/no-explicit-any
2856
+ var SetDefaultSession$1 = /*#__PURE__*/observer(function (_ref) {
2857
+ var rootModel = _ref.rootModel,
2858
+ onClose = _ref.onClose;
2823
2859
 
2860
+ if (!rootModel) {
2861
+ return null;
2862
+ }
2824
2863
 
2825
- function handleRadio(sessionSnapshot) {
2826
- setSelectedDefault(sessionSnapshot.name);
2827
- rootModel.jbrowse.setDefaultSessionConf(sessionSnapshot);
2828
- session.notify("Set default session to ".concat(sessionSnapshot.name), 'success');
2864
+ if (!canSetDefaultSession(rootModel)) {
2865
+ console.error('Incorrect rootmodel');
2866
+ return null;
2829
2867
  }
2830
2868
 
2831
- return /*#__PURE__*/React.createElement(Dialog$1, {
2832
- open: open
2833
- }, /*#__PURE__*/React.createElement(DialogTitle$1, {
2834
- className: classes.titleBox
2835
- }, "Set Default Session"), /*#__PURE__*/React.createElement(DialogContent$1, null, /*#__PURE__*/React.createElement(Grid, {
2836
- className: classes.resetButton,
2837
- container: true
2838
- }, /*#__PURE__*/React.createElement(Grid, {
2839
- item: true
2840
- }, /*#__PURE__*/React.createElement(Button$1, {
2841
- color: "secondary",
2869
+ var jbrowse = rootModel.jbrowse,
2870
+ session = rootModel.session;
2871
+ return /*#__PURE__*/React.createElement(Dialog, {
2872
+ open: true,
2873
+ onClose: onClose
2874
+ }, /*#__PURE__*/React.createElement(DialogTitle, null, "Set default session"), /*#__PURE__*/React.createElement(DialogContent, null, /*#__PURE__*/React.createElement(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.createElement(DialogActions, null, /*#__PURE__*/React.createElement(Button, {
2842
2875
  variant: "contained",
2843
2876
  onClick: function onClick() {
2844
- setSelectedDefault('New session');
2845
- rootModel.jbrowse.setDefaultSessionConf({
2877
+ jbrowse.setDefaultSessionConf({
2846
2878
  name: "New session"
2847
2879
  });
2848
- session.notify('Reset default session', 'success');
2849
- }
2850
- }, "Clear default session"))), /*#__PURE__*/React.createElement(CurrentSession, {
2851
- session: session,
2852
- selectedDefault: selectedDefault,
2853
- handleRadio: handleRadio
2854
- }), /*#__PURE__*/React.createElement(Paper, {
2855
- className: classes.root
2856
- }, /*#__PURE__*/React.createElement(List$1, {
2857
- subheader: /*#__PURE__*/React.createElement(ListSubheader, null, "Saved sessions")
2858
- }, session.savedSessions.length ? session.savedSessions.map( // eslint-disable-next-line @typescript-eslint/no-explicit-any
2859
- function (sessionSnapshot) {
2860
- var _sessionSnapshot$view = sessionSnapshot.views,
2861
- views = _sessionSnapshot$view === void 0 ? [] : _sessionSnapshot$view;
2862
- var totalTracks = views // eslint-disable-next-line @typescript-eslint/no-explicit-any
2863
- .map(function (view) {
2864
- return view.tracks.length;
2865
- }).reduce(function (a, b) {
2866
- return a + b;
2867
- }, 0);
2868
-
2869
- if (sessionSnapshot.name !== session.name) {
2870
- return /*#__PURE__*/React.createElement(ListItem$1, {
2871
- key: sessionSnapshot.name
2872
- }, /*#__PURE__*/React.createElement(ListItemIcon, null, /*#__PURE__*/React.createElement(Radio, {
2873
- checked: sessionSnapshot.name === selectedDefault,
2874
- onChange: function onChange() {
2875
- return handleRadio(sessionSnapshot);
2876
- }
2877
- })), /*#__PURE__*/React.createElement(ListItemText, {
2878
- primary: sessionSnapshot.name,
2879
- secondary: "".concat(views.length, " ").concat(pluralize('view', views.length), "; ").concat(totalTracks, "\n open ").concat(pluralize('track', totalTracks))
2880
- }));
2880
+ onClose();
2881
2881
  }
2882
-
2883
- return null;
2884
- }) : /*#__PURE__*/React.createElement(Typography$1, {
2885
- className: classes.message
2886
- }, "No saved sessions found")))), /*#__PURE__*/React.createElement(DialogActions$1, null, /*#__PURE__*/React.createElement(Button$1, {
2882
+ }, "Clear default session"), /*#__PURE__*/React.createElement(Button, {
2887
2883
  color: "secondary",
2888
2884
  variant: "contained",
2889
2885
  onClick: function onClick() {
2890
- onClose(false);
2886
+ return onClose();
2891
2887
  }
2892
- }, "Return")));
2888
+ }, "Cancel"), /*#__PURE__*/React.createElement(Button, {
2889
+ color: "primary",
2890
+ variant: "contained",
2891
+ onClick: function onClick() {
2892
+ jbrowse.setDefaultSessionConf(session);
2893
+ onClose();
2894
+ }
2895
+ }, "Set current session as default")));
2893
2896
  });
2894
2897
 
2895
2898
 
@@ -2899,7 +2902,7 @@ var index = {
2899
2902
  'default': SetDefaultSession$1
2900
2903
  };
2901
2904
 
2902
- var useStyles$5 = /*#__PURE__*/makeStyles$1(function () {
2905
+ var useStyles$4 = /*#__PURE__*/makeStyles$1(function () {
2903
2906
  return {
2904
2907
  table: {
2905
2908
  minWidth: 500,
@@ -2920,7 +2923,7 @@ var AssemblyTable = /*#__PURE__*/observer(function (_ref) {
2920
2923
  var rootModel = _ref.rootModel,
2921
2924
  setIsAssemblyBeingEdited = _ref.setIsAssemblyBeingEdited,
2922
2925
  setAssemblyBeingEdited = _ref.setAssemblyBeingEdited;
2923
- var classes = useStyles$5();
2926
+ var classes = useStyles$4();
2924
2927
 
2925
2928
  function removeAssembly(name) {
2926
2929
  rootModel.jbrowse.removeAssemblyConf(name);
@@ -2954,7 +2957,7 @@ var AssemblyTable = /*#__PURE__*/observer(function (_ref) {
2954
2957
  }))));
2955
2958
  });
2956
2959
  return /*#__PURE__*/React.createElement(TableContainer, {
2957
- component: Paper$1
2960
+ component: Paper
2958
2961
  }, /*#__PURE__*/React.createElement(Table, {
2959
2962
  className: classes.table
2960
2963
  }, /*#__PURE__*/React.createElement(TableHead, null, /*#__PURE__*/React.createElement(TableRow, null, /*#__PURE__*/React.createElement(TableCell, null, /*#__PURE__*/React.createElement(Typography, {
@@ -2968,7 +2971,7 @@ var AssemblyTable = /*#__PURE__*/observer(function (_ref) {
2968
2971
  }, "Actions")))), /*#__PURE__*/React.createElement(TableBody, null, rows)));
2969
2972
  });
2970
2973
 
2971
- var useStyles$6 = /*#__PURE__*/makeStyles$1(function (theme) {
2974
+ var useStyles$5 = /*#__PURE__*/makeStyles$1(function (theme) {
2972
2975
  return {
2973
2976
  root: {
2974
2977
  flexGrow: 1,
@@ -2995,7 +2998,7 @@ var AdapterSelector = /*#__PURE__*/observer(function (_ref) {
2995
2998
  var adapterSelection = _ref.adapterSelection,
2996
2999
  setAdapterSelection = _ref.setAdapterSelection,
2997
3000
  adapterTypes = _ref.adapterTypes;
2998
- return /*#__PURE__*/React.createElement(TextField$1, {
3001
+ return /*#__PURE__*/React.createElement(TextField, {
2999
3002
  value: adapterSelection,
3000
3003
  label: "Type",
3001
3004
  select: true,
@@ -3080,10 +3083,13 @@ var AdapterInput = /*#__PURE__*/observer(function (_ref2) {
3080
3083
 
3081
3084
  return null;
3082
3085
  });
3086
+ var blank = {
3087
+ uri: ''
3088
+ };
3083
3089
  var AssemblyAddForm = /*#__PURE__*/observer(function (_ref3) {
3084
3090
  var rootModel = _ref3.rootModel,
3085
3091
  setFormOpen = _ref3.setFormOpen;
3086
- var classes = useStyles$6();
3092
+ var classes = useStyles$5();
3087
3093
  var adapterTypes = ['IndexedFastaAdapter', 'BgzipFastaAdapter', 'TwoBitAdapter'];
3088
3094
 
3089
3095
  var _useState = useState(''),
@@ -3101,37 +3107,27 @@ var AssemblyAddForm = /*#__PURE__*/observer(function (_ref3) {
3101
3107
  adapterSelection = _useState6[0],
3102
3108
  setAdapterSelection = _useState6[1];
3103
3109
 
3104
- var _useState7 = useState({
3105
- uri: ''
3106
- }),
3110
+ var _useState7 = useState(blank),
3107
3111
  _useState8 = _slicedToArray(_useState7, 2),
3108
3112
  fastaLocation = _useState8[0],
3109
3113
  setFastaLocation = _useState8[1];
3110
3114
 
3111
- var _useState9 = useState({
3112
- uri: ''
3113
- }),
3115
+ var _useState9 = useState(blank),
3114
3116
  _useState10 = _slicedToArray(_useState9, 2),
3115
3117
  faiLocation = _useState10[0],
3116
3118
  setFaiLocation = _useState10[1];
3117
3119
 
3118
- var _useState11 = useState({
3119
- uri: ''
3120
- }),
3120
+ var _useState11 = useState(blank),
3121
3121
  _useState12 = _slicedToArray(_useState11, 2),
3122
3122
  gziLocation = _useState12[0],
3123
3123
  setGziLocation = _useState12[1];
3124
3124
 
3125
- var _useState13 = useState({
3126
- uri: ''
3127
- }),
3125
+ var _useState13 = useState(blank),
3128
3126
  _useState14 = _slicedToArray(_useState13, 2),
3129
3127
  twoBitLocation = _useState14[0],
3130
3128
  setTwoBitLocation = _useState14[1];
3131
3129
 
3132
- var _useState15 = useState({
3133
- uri: ''
3134
- }),
3130
+ var _useState15 = useState(blank),
3135
3131
  _useState16 = _slicedToArray(_useState15, 2),
3136
3132
  chromSizesLocation = _useState16[0],
3137
3133
  setChromSizesLocation = _useState16[1];
@@ -3140,8 +3136,7 @@ var AssemblyAddForm = /*#__PURE__*/observer(function (_ref3) {
3140
3136
  if (assemblyName === '') {
3141
3137
  rootModel.session.notify("Can't create an assembly without a name");
3142
3138
  } else {
3143
- setFormOpen(false); // setIsAssemblyBeingEdited(true)
3144
-
3139
+ setFormOpen(false);
3145
3140
  var newAssembly;
3146
3141
 
3147
3142
  if (adapterSelection === 'IndexedFastaAdapter') {
@@ -3190,9 +3185,9 @@ var AssemblyAddForm = /*#__PURE__*/observer(function (_ref3) {
3190
3185
 
3191
3186
  return /*#__PURE__*/React.createElement("div", {
3192
3187
  className: classes.root
3193
- }, /*#__PURE__*/React.createElement(Paper$1, {
3188
+ }, /*#__PURE__*/React.createElement(Paper, {
3194
3189
  className: classes.paper
3195
- }, /*#__PURE__*/React.createElement(TextField$1, {
3190
+ }, /*#__PURE__*/React.createElement(TextField, {
3196
3191
  id: "assembly-name",
3197
3192
  inputProps: {
3198
3193
  'data-testid': 'assembly-name'
@@ -3204,7 +3199,7 @@ var AssemblyAddForm = /*#__PURE__*/observer(function (_ref3) {
3204
3199
  onChange: function onChange(event) {
3205
3200
  return setAssemblyName(event.target.value);
3206
3201
  }
3207
- }), /*#__PURE__*/React.createElement(TextField$1, {
3202
+ }), /*#__PURE__*/React.createElement(TextField, {
3208
3203
  id: "assembly-name",
3209
3204
  inputProps: {
3210
3205
  'data-testid': 'assembly-display-name'
@@ -3256,7 +3251,7 @@ var AssemblyEditor = /*#__PURE__*/observer(function (_ref) {
3256
3251
  });
3257
3252
  });
3258
3253
 
3259
- var useStyles$7 = /*#__PURE__*/makeStyles(function (theme) {
3254
+ var useStyles$6 = /*#__PURE__*/makeStyles(function (theme) {
3260
3255
  return {
3261
3256
  titleBox: {
3262
3257
  color: '#fff',
@@ -3283,7 +3278,7 @@ var useStyles$7 = /*#__PURE__*/makeStyles(function (theme) {
3283
3278
  var AssemblyManager$1 = /*#__PURE__*/observer(function (_ref) {
3284
3279
  var rootModel = _ref.rootModel,
3285
3280
  _onClose = _ref.onClose;
3286
- var classes = useStyles$7();
3281
+ var classes = useStyles$6();
3287
3282
 
3288
3283
  var _useState = useState(false),
3289
3284
  _useState2 = _slicedToArray(_useState, 2),
@@ -3380,7 +3375,7 @@ var ManageConnectionsDialog = /*#__PURE__*/lazy(function () {
3380
3375
  var ToggleConnectionsDialog = /*#__PURE__*/lazy(function () {
3381
3376
  return Promise.resolve().then(function () { return ToggleConnectionsDialog$2; });
3382
3377
  });
3383
- var useStyles$8 = /*#__PURE__*/makeStyles$1(function (theme) {
3378
+ var useStyles$7 = /*#__PURE__*/makeStyles$1(function (theme) {
3384
3379
  var _theme$palette$tertia, _theme$palette$tertia2;
3385
3380
 
3386
3381
  return {
@@ -3450,11 +3445,13 @@ var Node = function Node(props) {
3450
3445
  _onChange = data.onChange,
3451
3446
  toggleCollapse = data.toggleCollapse,
3452
3447
  conf = data.conf,
3453
- onMoreInfo = data.onMoreInfo;
3454
- var classes = useStyles$8();
3448
+ onMoreInfo = data.onMoreInfo,
3449
+ drawerPosition = data.drawerPosition;
3450
+ var classes = useStyles$7();
3455
3451
  var width = 10;
3456
3452
  var marginLeft = nestingLevel * width + (isLeaf ? width : 0);
3457
3453
  var unsupported = name && (name.endsWith('(Unsupported)') || name.endsWith('(Unknown)'));
3454
+ var description = conf && readConfObject(conf, ['description']) || '';
3458
3455
  return /*#__PURE__*/React.createElement("div", {
3459
3456
  style: style,
3460
3457
  className: !isLeaf ? classes.accordionBase : undefined
@@ -3482,7 +3479,10 @@ var Node = function Node(props) {
3482
3479
  className: !isLeaf ? classes.accordionColor : undefined
3483
3480
  }, !isLeaf ? /*#__PURE__*/React.createElement("div", {
3484
3481
  className: classes.accordionText
3485
- }, /*#__PURE__*/React.createElement(Typography, null, isOpen ? /*#__PURE__*/React.createElement(ArrowDropDownIcon, null) : /*#__PURE__*/React.createElement(ArrowRightIcon, null), name)) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FormControlLabel, {
3482
+ }, /*#__PURE__*/React.createElement(Typography, null, isOpen ? /*#__PURE__*/React.createElement(ArrowDropDownIcon, null) : /*#__PURE__*/React.createElement(ArrowRightIcon, null), name)) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Tooltip, {
3483
+ title: description,
3484
+ placement: drawerPosition === 'left' ? 'right' : 'left'
3485
+ }, /*#__PURE__*/React.createElement(FormControlLabel, {
3486
3486
  className: classes.checkboxLabel,
3487
3487
  control: /*#__PURE__*/React.createElement(Checkbox, {
3488
3488
  className: classes.compactCheckbox,
@@ -3497,7 +3497,7 @@ var Node = function Node(props) {
3497
3497
  }
3498
3498
  }),
3499
3499
  label: name
3500
- }), /*#__PURE__*/React.createElement(IconButton, {
3500
+ })), /*#__PURE__*/React.createElement(IconButton, {
3501
3501
  onClick: function onClick(e) {
3502
3502
  return onMoreInfo({
3503
3503
  target: e.currentTarget,
@@ -3543,6 +3543,7 @@ var HierarchicalTree = /*#__PURE__*/observer(function (_ref) {
3543
3543
  setMoreInfo = _useState2[1];
3544
3544
 
3545
3545
  var session = getSession(model);
3546
+ var drawerPosition = session.drawerPosition;
3546
3547
  var extra = useMemo(function () {
3547
3548
  return {
3548
3549
  onChange: function onChange(trackId) {
@@ -3551,9 +3552,10 @@ var HierarchicalTree = /*#__PURE__*/observer(function (_ref) {
3551
3552
  toggleCollapse: function toggleCollapse(pathName) {
3552
3553
  return model.toggleCategory(pathName);
3553
3554
  },
3554
- onMoreInfo: setMoreInfo
3555
+ onMoreInfo: setMoreInfo,
3556
+ drawerPosition: drawerPosition
3555
3557
  };
3556
- }, [view, model]);
3558
+ }, [view, model, drawerPosition]);
3557
3559
  var treeWalker = useCallback( /*#__PURE__*/runtime_1.mark(function treeWalker() {
3558
3560
  var i, parentMeta, _i, curr;
3559
3561
 
@@ -3671,7 +3673,7 @@ var HierarchicalTrackSelectorContainer = /*#__PURE__*/observer(function (_ref5)
3671
3673
  var model = _ref5.model,
3672
3674
  toolbarHeight = _ref5.toolbarHeight,
3673
3675
  overrideDimensions = _ref5.overrideDimensions;
3674
- var classes = useStyles$8();
3676
+ var classes = useStyles$7();
3675
3677
  var session = getSession(model);
3676
3678
 
3677
3679
  var _useState3 = useState(null),
@@ -3722,7 +3724,7 @@ var HierarchicalTrackSelectorHeader = /*#__PURE__*/observer(function (_ref6) {
3722
3724
  setHeaderHeight = _ref6.setHeaderHeight,
3723
3725
  setAssemblyIdx = _ref6.setAssemblyIdx,
3724
3726
  assemblyIdx = _ref6.assemblyIdx;
3725
- var classes = useStyles$8();
3727
+ var classes = useStyles$7();
3726
3728
  var session = getSession(model);
3727
3729
 
3728
3730
  var _useState5 = useState(),
@@ -3836,7 +3838,7 @@ var HierarchicalTrackSelectorHeader = /*#__PURE__*/observer(function (_ref6) {
3836
3838
  onClick: function onClick(event) {
3837
3839
  setConnectionAnchorEl(event.currentTarget);
3838
3840
  }
3839
- }, /*#__PURE__*/React.createElement(PowerOutlinedIcon, null)), /*#__PURE__*/React.createElement(TextField$1, {
3841
+ }, /*#__PURE__*/React.createElement(PowerOutlinedIcon, null)), /*#__PURE__*/React.createElement(TextField, {
3840
3842
  className: classes.searchBox,
3841
3843
  label: "Filter tracks",
3842
3844
  value: model.filterText,
@@ -3940,7 +3942,7 @@ var HierarchicalTrackSelector$1 = {
3940
3942
  'default': HierarchicalTrackSelectorContainer
3941
3943
  };
3942
3944
 
3943
- var useStyles$9 = /*#__PURE__*/makeStyles(function (theme) {
3945
+ var useStyles$8 = /*#__PURE__*/makeStyles$1(function (theme) {
3944
3946
  return {
3945
3947
  spacing: {
3946
3948
  marginBottom: theme.spacing(3)
@@ -3953,28 +3955,76 @@ function StatusMessage(_ref) {
3953
3955
 
3954
3956
  var trackAdapter = _ref.trackAdapter,
3955
3957
  trackType = _ref.trackType;
3956
- var classes = useStyles$9();
3957
- return trackAdapter.type === 'SNPCoverageAdapter' ? /*#__PURE__*/React.createElement(Typography$1, {
3958
+ var classes = useStyles$8();
3959
+ return trackAdapter.type === 'SNPCoverageAdapter' ? /*#__PURE__*/React.createElement(Typography, {
3958
3960
  className: classes.spacing
3959
- }, "Selected ", /*#__PURE__*/React.createElement("code", null, trackType), ". Using adapter", ' ', /*#__PURE__*/React.createElement("code", null, trackAdapter.type), " with subadapter", ' ', /*#__PURE__*/React.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.createElement(Typography$1, {
3961
+ }, "Selected ", /*#__PURE__*/React.createElement("code", null, trackType), ". Using adapter", ' ', /*#__PURE__*/React.createElement("code", null, trackAdapter.type), " with subadapter", ' ', /*#__PURE__*/React.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.createElement(Typography, {
3960
3962
  className: classes.spacing
3961
3963
  }, "Using adapter ", /*#__PURE__*/React.createElement("code", null, trackAdapter.type), " and guessing track type", ' ', /*#__PURE__*/React.createElement("code", null, trackType), ". Please enter a track name and, if necessary, update the track type.");
3962
3964
  }
3965
+ /**
3966
+ * categorizeAdapters takes a list of adapters and sorts their menu item elements under an appropriate ListSubheader
3967
+ * element. In this way, adapters that are from external plugins can have headers that differentiate them from the
3968
+ * out-of-the-box plugins.
3969
+ * @param adaptersList - a list of adapters found in the PluginManager
3970
+ * @returns a series of JSX elements that are ListSubheaders followed by the adapters
3971
+ * found under that subheader
3972
+ */
3973
+
3974
+
3975
+ function categorizeAdapters(adaptersList) {
3976
+ var currentCategory = ''; // eslint-disable-next-line @typescript-eslint/no-explicit-any
3977
+
3978
+ var items = [];
3979
+ adaptersList.forEach(function (adapter) {
3980
+ var _adapter$adapterMetad;
3981
+
3982
+ if ((_adapter$adapterMetad = adapter.adapterMetadata) !== null && _adapter$adapterMetad !== void 0 && _adapter$adapterMetad.category) {
3983
+ var _adapter$adapterMetad2, _adapter$adapterMetad7, _adapter$adapterMetad8;
3984
+
3985
+ if (currentCategory !== ((_adapter$adapterMetad2 = adapter.adapterMetadata) === null || _adapter$adapterMetad2 === void 0 ? void 0 : _adapter$adapterMetad2.category)) {
3986
+ var _adapter$adapterMetad3, _adapter$adapterMetad4, _adapter$adapterMetad5, _adapter$adapterMetad6;
3987
+
3988
+ currentCategory = (_adapter$adapterMetad3 = adapter.adapterMetadata) === null || _adapter$adapterMetad3 === void 0 ? void 0 : _adapter$adapterMetad3.category;
3989
+ items.push( /*#__PURE__*/React.createElement(ListSubheader, {
3990
+ key: (_adapter$adapterMetad4 = adapter.adapterMetadata) === null || _adapter$adapterMetad4 === void 0 ? void 0 : _adapter$adapterMetad4.category,
3991
+ value: (_adapter$adapterMetad5 = adapter.adapterMetadata) === null || _adapter$adapterMetad5 === void 0 ? void 0 : _adapter$adapterMetad5.category
3992
+ }, (_adapter$adapterMetad6 = adapter.adapterMetadata) === null || _adapter$adapterMetad6 === void 0 ? void 0 : _adapter$adapterMetad6.category));
3993
+ }
3963
3994
 
3964
- function TrackAdapterSelector(_ref2) {
3965
- var adapterHint = _ref2.adapterHint,
3966
- model = _ref2.model;
3967
- var classes = useStyles$9();
3995
+ items.push( /*#__PURE__*/React.createElement(MenuItem, {
3996
+ key: adapter.name,
3997
+ value: adapter.name
3998
+ }, (_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));
3999
+ }
4000
+ });
4001
+ return items;
4002
+ }
4003
+
4004
+ function getAdapterTypes(pluginManager) {
4005
+ return pluginManager.getElementTypesInGroup('adapter');
4006
+ }
4007
+
4008
+ function getTrackTypes(pluginManager) {
4009
+ return pluginManager.getElementTypesInGroup('track');
4010
+ }
4011
+
4012
+ var TrackAdapterSelector = /*#__PURE__*/observer(function (_ref2) {
4013
+ var model = _ref2.model;
4014
+ var classes = useStyles$8();
3968
4015
  var session = getSession(model);
4016
+ var trackAdapter = model.trackAdapter; // prettier-ignore
4017
+
4018
+ var adapters = getAdapterTypes(getEnv(session).pluginManager);
3969
4019
  return /*#__PURE__*/React.createElement(TextField, {
3970
4020
  className: classes.spacing,
3971
- value: adapterHint,
4021
+ value: (trackAdapter === null || trackAdapter === void 0 ? void 0 : trackAdapter.type) !== 'UNKNOWN' ? trackAdapter === null || trackAdapter === void 0 ? void 0 : trackAdapter.type : '',
3972
4022
  label: "adapterType",
3973
- helperText: "An adapter type",
4023
+ helperText: "Select an adapter type",
3974
4024
  select: true,
3975
4025
  fullWidth: true,
3976
4026
  onChange: function onChange(event) {
3977
- model.setAdapterHint(event.target.value);
4027
+ return model.setAdapterHint(event.target.value);
3978
4028
  },
3979
4029
  SelectProps: {
3980
4030
  // @ts-ignore
@@ -3982,56 +4032,119 @@ function TrackAdapterSelector(_ref2) {
3982
4032
  'data-testid': 'adapterTypeSelect'
3983
4033
  }
3984
4034
  }
3985
- }, getEnv(session).pluginManager.getElementTypesInGroup('adapter') // Exclude SNPCoverageAdapter from primary adapter user selection
4035
+ }, adapters // Excludes any adapter with the 'adapterMetadata.hiddenFromGUI' property, and anything with the 'adapterMetadata.category' property
3986
4036
  .filter(function (elt) {
3987
- return elt.name !== 'SNPCoverageAdapter';
4037
+ var _elt$adapterMetadata, _elt$adapterMetadata2;
4038
+
4039
+ 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);
3988
4040
  }).map(function (elt) {
3989
- return /*#__PURE__*/React.createElement(MenuItem$1, {
4041
+ var _elt$adapterMetadata3, _elt$adapterMetadata4;
4042
+
4043
+ return /*#__PURE__*/React.createElement(MenuItem, {
3990
4044
  key: elt.name,
3991
4045
  value: elt.name
3992
- }, elt.name);
3993
- }));
3994
- }
4046
+ }, (_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);
4047
+ }), categorizeAdapters(adapters.filter(function (elt) {
4048
+ var _elt$adapterMetadata5;
4049
+
4050
+ return !((_elt$adapterMetadata5 = elt.adapterMetadata) !== null && _elt$adapterMetadata5 !== void 0 && _elt$adapterMetadata5.hiddenFromGUI);
4051
+ })));
4052
+ });
3995
4053
 
3996
4054
  function UnknownAdapterPrompt(_ref3) {
3997
4055
  var model = _ref3.model;
3998
- var classes = useStyles$9();
3999
- var adapterHint = model.adapterHint;
4000
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Typography$1, {
4056
+ var classes = useStyles$8();
4057
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Typography, {
4001
4058
  className: classes.spacing
4002
- }, "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.createElement(Link$1, {
4059
+ }, "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.createElement(Link, {
4003
4060
  href: "https://github.com/GMOD/jbrowse-components/releases",
4004
4061
  target: "_blank",
4005
4062
  rel: "noopener noreferrer"
4006
- }, "check for new releases"), ' ', "of JBrowse to see if they support this data type or", ' ', /*#__PURE__*/React.createElement(Link$1, {
4063
+ }, "check for new releases"), ' ', "of JBrowse to see if they support this data type or", ' ', /*#__PURE__*/React.createElement(Link, {
4007
4064
  href: "https://github.com/GMOD/jbrowse-components/issues/new",
4008
4065
  target: "_blank",
4009
4066
  rel: "noopener noreferrer"
4010
4067
  }, "file an issue"), ' ', "and add a feature request for this data type."), /*#__PURE__*/React.createElement(TrackAdapterSelector, {
4011
- adapterHint: adapterHint,
4012
4068
  model: model
4013
4069
  }));
4014
4070
  }
4015
4071
 
4016
- function ConfirmTrack(_ref4) {
4072
+ var TrackTypeSelector = /*#__PURE__*/observer(function (_ref4) {
4017
4073
  var model = _ref4.model;
4018
- var classes = useStyles$9();
4074
+ var classes = useStyles$8();
4019
4075
  var session = getSession(model);
4076
+ var trackType = model.trackType;
4077
+ var trackTypes = getTrackTypes(getEnv(session).pluginManager);
4078
+ return /*#__PURE__*/React.createElement(TextField, {
4079
+ className: classes.spacing,
4080
+ value: trackType,
4081
+ label: "trackType",
4082
+ helperText: "Select a track type",
4083
+ select: true,
4084
+ fullWidth: true,
4085
+ onChange: function onChange(event) {
4086
+ model.setTrackType(event.target.value);
4087
+ },
4088
+ SelectProps: {
4089
+ // @ts-ignore
4090
+ SelectDisplayProps: {
4091
+ 'data-testid': 'trackTypeSelect'
4092
+ }
4093
+ }
4094
+ }, trackTypes.map(function (_ref5) {
4095
+ var name = _ref5.name;
4096
+ return /*#__PURE__*/React.createElement(MenuItem, {
4097
+ key: name,
4098
+ value: name
4099
+ }, name);
4100
+ }));
4101
+ });
4102
+ var TrackAssemblySelector = /*#__PURE__*/observer(function (_ref6) {
4103
+ var model = _ref6.model;
4104
+ var session = getSession(model);
4105
+ var assembly = model.assembly;
4106
+ return /*#__PURE__*/React.createElement(TextField, {
4107
+ value: assembly,
4108
+ label: "assemblyName",
4109
+ helperText: "Assembly to which the track will be added",
4110
+ select: true,
4111
+ fullWidth: true,
4112
+ onChange: function onChange(event) {
4113
+ return model.setAssembly(event.target.value);
4114
+ },
4115
+ SelectProps: {
4116
+ // @ts-ignore
4117
+ SelectDisplayProps: {
4118
+ 'data-testid': 'assemblyNameSelect'
4119
+ }
4120
+ }
4121
+ }, session.assemblies.map(function (conf) {
4122
+ return readConfObject(conf, 'name');
4123
+ }).map(function (name) {
4124
+ return /*#__PURE__*/React.createElement(MenuItem, {
4125
+ key: name,
4126
+ value: name
4127
+ }, name);
4128
+ }));
4129
+ });
4130
+
4131
+ function ConfirmTrack(_ref7) {
4132
+ var model = _ref7.model;
4133
+ var classes = useStyles$8();
4020
4134
  var trackName = model.trackName,
4021
4135
  trackAdapter = model.trackAdapter,
4022
4136
  trackType = model.trackType,
4023
- assembly = model.assembly,
4024
4137
  warningMessage = model.warningMessage,
4025
4138
  adapterHint = model.adapterHint;
4026
4139
 
4027
4140
  if (model.unsupported) {
4028
- return /*#__PURE__*/React.createElement(Typography$1, {
4141
+ return /*#__PURE__*/React.createElement(Typography, {
4029
4142
  className: classes.spacing
4030
- }, "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.createElement(Link$1, {
4143
+ }, "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.createElement(Link, {
4031
4144
  href: "https://github.com/GMOD/jbrowse-components/releases",
4032
4145
  target: "_blank",
4033
4146
  rel: "noopener noreferrer"
4034
- }, "check for new releases"), ' ', "of JBrowse or", ' ', /*#__PURE__*/React.createElement(Link$1, {
4147
+ }, "check for new releases"), ' ', "of JBrowse or", ' ', /*#__PURE__*/React.createElement(Link, {
4035
4148
  href: "https://github.com/GMOD/jbrowse-components/issues/new",
4036
4149
  target: "_blank",
4037
4150
  rel: "noopener noreferrer"
@@ -4044,21 +4157,22 @@ function ConfirmTrack(_ref4) {
4044
4157
  });
4045
4158
  }
4046
4159
 
4160
+ if (adapterHint === '' && trackAdapter) {
4161
+ model.setAdapterHint(trackAdapter.type);
4162
+ }
4163
+
4047
4164
  if (!(trackAdapter !== null && trackAdapter !== void 0 && trackAdapter.type)) {
4048
- return /*#__PURE__*/React.createElement(Typography$1, null, "Could not recognize this data type.");
4165
+ return /*#__PURE__*/React.createElement(Typography, null, "Could not recognize this data type.");
4049
4166
  }
4050
4167
 
4051
- return /*#__PURE__*/React.createElement(React.Fragment, null, trackAdapter ? /*#__PURE__*/React.createElement(StatusMessage, {
4168
+ return /*#__PURE__*/React.createElement("div", null, trackAdapter ? /*#__PURE__*/React.createElement(StatusMessage, {
4052
4169
  trackAdapter: trackAdapter,
4053
4170
  trackType: trackType
4054
- }) : null, warningMessage ? /*#__PURE__*/React.createElement(Typography$1, {
4171
+ }) : null, warningMessage ? /*#__PURE__*/React.createElement(Typography, {
4055
4172
  style: {
4056
4173
  color: 'orange'
4057
4174
  }
4058
- }, warningMessage) : null, /*#__PURE__*/React.createElement(TrackAdapterSelector, {
4059
- adapterHint: adapterHint,
4060
- model: model
4061
- }), /*#__PURE__*/React.createElement(TextField, {
4175
+ }, warningMessage) : null, /*#__PURE__*/React.createElement(TextField, {
4062
4176
  className: classes.spacing,
4063
4177
  label: "trackName",
4064
4178
  helperText: "A name for this track",
@@ -4070,88 +4184,58 @@ function ConfirmTrack(_ref4) {
4070
4184
  inputProps: {
4071
4185
  'data-testid': 'trackNameInput'
4072
4186
  }
4073
- }), /*#__PURE__*/React.createElement(TextField, {
4074
- className: classes.spacing,
4075
- value: trackType,
4076
- label: "trackType",
4077
- helperText: "A track type",
4078
- select: true,
4079
- fullWidth: true,
4080
- onChange: function onChange(event) {
4081
- model.setTrackType(event.target.value);
4082
- },
4083
- SelectProps: {
4084
- // @ts-ignore
4085
- SelectDisplayProps: {
4086
- 'data-testid': 'trackTypeSelect'
4087
- }
4088
- }
4089
- }, getEnv(session).pluginManager.getElementTypesInGroup('track') // eslint-disable-next-line @typescript-eslint/no-explicit-any
4090
- .map(function (_ref5) {
4091
- var name = _ref5.name;
4092
- return /*#__PURE__*/React.createElement(MenuItem$1, {
4093
- key: name,
4094
- value: name
4095
- }, name);
4096
- })), /*#__PURE__*/React.createElement(TextField, {
4097
- value: assembly,
4098
- label: "assemblyName",
4099
- helperText: "Assembly to which the track will be added",
4100
- select: true,
4101
- fullWidth: true,
4102
- onChange: function onChange(event) {
4103
- model.setAssembly(event.target.value);
4104
- },
4105
- SelectProps: {
4106
- // @ts-ignore
4107
- SelectDisplayProps: {
4108
- 'data-testid': 'assemblyNameSelect'
4109
- }
4110
- }
4111
- }, session.assemblies.map(function (assemblyConf) {
4112
- var assemblyName = readConfObject(assemblyConf, 'name');
4113
- return /*#__PURE__*/React.createElement(MenuItem$1, {
4114
- key: assemblyName,
4115
- value: assemblyName
4116
- }, assemblyName);
4117
- })));
4187
+ }), /*#__PURE__*/React.createElement(TrackAdapterSelector, {
4188
+ model: model
4189
+ }), /*#__PURE__*/React.createElement(TrackTypeSelector, {
4190
+ model: model
4191
+ }), /*#__PURE__*/React.createElement(TrackAssemblySelector, {
4192
+ model: model
4193
+ }));
4118
4194
  }
4119
4195
 
4120
4196
  var ConfirmTrack$1 = /*#__PURE__*/observer(ConfirmTrack);
4121
4197
 
4122
- var useStyles$a = /*#__PURE__*/makeStyles(function (theme) {
4198
+ var useStyles$9 = /*#__PURE__*/makeStyles$1(function (theme) {
4123
4199
  return {
4124
- root: {
4125
- display: 'flex',
4126
- flexDirection: 'column'
4127
- },
4128
4200
  paper: {
4201
+ display: 'flex',
4202
+ flexDirection: 'column',
4129
4203
  padding: theme.spacing(1)
4204
+ },
4205
+ spacer: {
4206
+ height: theme.spacing(8)
4130
4207
  }
4131
4208
  };
4132
4209
  });
4133
4210
 
4134
4211
  function TrackSourceSelect(_ref) {
4135
4212
  var model = _ref.model;
4136
- var classes = useStyles$a();
4137
- return /*#__PURE__*/React.createElement("div", {
4138
- className: classes.root
4139
- }, /*#__PURE__*/React.createElement(Paper, {
4213
+ var classes = useStyles$9();
4214
+ var rootModel = getRoot(model);
4215
+ return /*#__PURE__*/React.createElement(Paper, {
4140
4216
  className: classes.paper
4141
4217
  }, /*#__PURE__*/React.createElement(FileSelector$1, {
4142
4218
  name: "Main file",
4143
4219
  description: "",
4144
4220
  location: model.trackData,
4145
- setLocation: model.setTrackData
4221
+ setLocation: model.setTrackData,
4222
+ setName: model.setTrackName,
4223
+ rootModel: rootModel
4224
+ }), /*#__PURE__*/React.createElement("div", {
4225
+ className: classes.spacer
4146
4226
  }), /*#__PURE__*/React.createElement(FileSelector$1, {
4147
4227
  name: "Index file",
4148
- description: "Automatically inferred from the URL if not supplied",
4228
+ description: "(Optional) The URL of the index file is automatically inferred from the URL of the main file if it is not supplied.",
4149
4229
  location: model.indexTrackData,
4150
- setLocation: model.setIndexTrackData
4151
- })));
4230
+ setLocation: model.setIndexTrackData,
4231
+ setName: model.setTrackName,
4232
+ rootModel: rootModel
4233
+ }));
4152
4234
  }
4153
4235
 
4154
- var useStyles$b = /*#__PURE__*/makeStyles$1(function (theme) {
4236
+ var TrackSourceSelect$1 = /*#__PURE__*/observer(TrackSourceSelect);
4237
+
4238
+ var useStyles$a = /*#__PURE__*/makeStyles$1(function (theme) {
4155
4239
  return {
4156
4240
  root: {
4157
4241
  marginTop: theme.spacing(1)
@@ -4184,7 +4268,7 @@ function AddTrackWidget(_ref) {
4184
4268
  activeStep = _useState2[0],
4185
4269
  setActiveStep = _useState2[1];
4186
4270
 
4187
- var classes = useStyles$b();
4271
+ var classes = useStyles$a();
4188
4272
  var session = getSession(model);
4189
4273
  var assembly = model.assembly,
4190
4274
  trackAdapter = model.trackAdapter,
@@ -4200,7 +4284,7 @@ function AddTrackWidget(_ref) {
4200
4284
  function getStepContent(step) {
4201
4285
  switch (step) {
4202
4286
  case 0:
4203
- return /*#__PURE__*/React.createElement(TrackSourceSelect, {
4287
+ return /*#__PURE__*/React.createElement(TrackSourceSelect$1, {
4204
4288
  model: model
4205
4289
  });
4206
4290
 
@@ -4215,38 +4299,61 @@ function AddTrackWidget(_ref) {
4215
4299
  }
4216
4300
 
4217
4301
  function handleNext() {
4218
- if (activeStep !== steps.length - 1) {
4219
- setActiveStep(activeStep + 1);
4220
- return;
4221
- }
4222
-
4223
- var trackId = "".concat(trackName.toLowerCase().replace(/ /g, '_'), "-").concat(Date.now()).concat(session.adminMode ? '' : '-sessionTrack');
4224
- var assemblyInstance = session.assemblyManager.get(assembly);
4302
+ return _handleNext.apply(this, arguments);
4303
+ }
4225
4304
 
4226
- if (trackAdapter && trackAdapter.type !== 'UNKNOWN') {
4227
- // @ts-ignore
4228
- session.addTrackConf({
4229
- trackId: trackId,
4230
- type: trackType,
4231
- name: trackName,
4232
- assemblyNames: [assembly],
4233
- adapter: _objectSpread2(_objectSpread2({}, trackAdapter), {}, {
4234
- sequenceAdapter: getConf(assemblyInstance, ['sequence', 'adapter'])
4235
- })
4236
- });
4305
+ function _handleNext() {
4306
+ _handleNext = _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee() {
4307
+ var trackId, assemblyInstance;
4308
+ return runtime_1.wrap(function _callee$(_context) {
4309
+ while (1) {
4310
+ switch (_context.prev = _context.next) {
4311
+ case 0:
4312
+ if (!(activeStep !== steps.length - 1)) {
4313
+ _context.next = 3;
4314
+ break;
4315
+ }
4237
4316
 
4238
- if (model.view) {
4239
- model.view.showTrack(trackId);
4240
- } else {
4241
- session.notify('Open a new view, or use the track selector in an existing view, to view this track', 'info');
4242
- }
4317
+ setActiveStep(activeStep + 1);
4318
+ return _context.abrupt("return");
4243
4319
 
4244
- model.clearData(); // @ts-ignore
4320
+ case 3:
4321
+ trackId = "".concat(trackName.toLowerCase().replace(/ /g, '_'), "-").concat(Date.now()).concat(session.adminMode ? '' : '-sessionTrack');
4322
+ assemblyInstance = session.assemblyManager.get(assembly);
4323
+
4324
+ if (trackAdapter && trackAdapter.type !== 'UNKNOWN') {
4325
+ // @ts-ignore
4326
+ session.addTrackConf({
4327
+ trackId: trackId,
4328
+ type: trackType,
4329
+ name: trackName,
4330
+ assemblyNames: [assembly],
4331
+ adapter: _objectSpread2(_objectSpread2({}, trackAdapter), {}, {
4332
+ sequenceAdapter: getConf(assemblyInstance, ['sequence', 'adapter'])
4333
+ })
4334
+ });
4335
+
4336
+ if (model.view) {
4337
+ model.view.showTrack(trackId);
4338
+ } else {
4339
+ session.notify('Open a new view, or use the track selector in an existing view, to view this track', 'info');
4340
+ }
4341
+
4342
+ model.clearData(); // @ts-ignore
4343
+
4344
+ session.hideWidget(model);
4345
+ } else {
4346
+ setTrackErrorMessage('Failed to add track.\nThe configuration of this file is not currently supported.');
4347
+ }
4245
4348
 
4246
- session.hideWidget(model);
4247
- } else {
4248
- setTrackErrorMessage('Failed to add track.\nThe configuration of this file is not currently supported.');
4249
- }
4349
+ case 6:
4350
+ case "end":
4351
+ return _context.stop();
4352
+ }
4353
+ }
4354
+ }, _callee);
4355
+ }));
4356
+ return _handleNext.apply(this, arguments);
4250
4357
  }
4251
4358
 
4252
4359
  function handleBack() {
@@ -4341,7 +4448,7 @@ function ConnectionTypeSelect(props) {
4341
4448
 
4342
4449
  return /*#__PURE__*/React.createElement("form", {
4343
4450
  autoComplete: "off"
4344
- }, /*#__PURE__*/React.createElement(TextField, {
4451
+ }, /*#__PURE__*/React.createElement(TextField$1, {
4345
4452
  value: connectionType.name,
4346
4453
  label: "connectionType",
4347
4454
  helperText: connectionType.description ? /*#__PURE__*/React.createElement(React.Fragment, null, connectionType.description, connectionType.url ? /*#__PURE__*/React.createElement(IconButton$1, {
@@ -4362,7 +4469,7 @@ function ConnectionTypeSelect(props) {
4362
4469
  })));
4363
4470
  }
4364
4471
 
4365
- var useStyles$c = /*#__PURE__*/makeStyles(function (theme) {
4472
+ var useStyles$b = /*#__PURE__*/makeStyles(function (theme) {
4366
4473
  return {
4367
4474
  root: {
4368
4475
  marginTop: theme.spacing(1)
@@ -4404,7 +4511,7 @@ function AddConnectionWidget(_ref) {
4404
4511
  activeStep = _useState8[0],
4405
4512
  setActiveStep = _useState8[1];
4406
4513
 
4407
- var classes = useStyles$c();
4514
+ var classes = useStyles$b();
4408
4515
  var session = getSession(model);
4409
4516
 
4410
4517
  var _getEnv = getEnv(session),
@@ -4577,7 +4684,7 @@ var DeleteConnectionDialog$3 = {
4577
4684
  'default': DeleteConnectionDialog$2
4578
4685
  };
4579
4686
 
4580
- var useStyles$d = /*#__PURE__*/makeStyles$1(function (theme) {
4687
+ var useStyles$c = /*#__PURE__*/makeStyles$1(function (theme) {
4581
4688
  return {
4582
4689
  closeButton: {
4583
4690
  position: 'absolute',
@@ -4596,7 +4703,7 @@ function ManageConnectionsDlg(_ref) {
4596
4703
  var session = _ref.session,
4597
4704
  handleClose = _ref.handleClose,
4598
4705
  breakConnection = _ref.breakConnection;
4599
- var classes = useStyles$d();
4706
+ var classes = useStyles$c();
4600
4707
  var adminMode = session.adminMode,
4601
4708
  connections = session.connections,
4602
4709
  sessionConnections = session.sessionConnections;
@@ -4642,7 +4749,7 @@ var ManageConnectionsDialog$2 = {
4642
4749
  'default': ManageConnectionsDialog$1
4643
4750
  };
4644
4751
 
4645
- var useStyles$e = /*#__PURE__*/makeStyles$1(function (theme) {
4752
+ var useStyles$d = /*#__PURE__*/makeStyles$1(function (theme) {
4646
4753
  return {
4647
4754
  closeButton: {
4648
4755
  position: 'absolute',
@@ -4662,7 +4769,7 @@ function ToggleConnectionDialog(_ref) {
4662
4769
  handleClose = _ref.handleClose,
4663
4770
  assemblyName = _ref.assemblyName,
4664
4771
  breakConnection = _ref.breakConnection;
4665
- var classes = useStyles$e();
4772
+ var classes = useStyles$d();
4666
4773
  var connections = session.connections,
4667
4774
  connectionInstances = session.connectionInstances;
4668
4775
  var assemblySpecificConnections = connections.filter(function (c) {