@jbrowse/plugin-data-management 1.5.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.
@@ -2,7 +2,7 @@
2
2
  import { PluginStoreModel } from '../model';
3
3
  declare function CustomPluginForm({ open, onClose, model, }: {
4
4
  open: boolean;
5
- onClose: () => void;
5
+ onClose(): void;
6
6
  model: PluginStoreModel;
7
7
  }): JSX.Element;
8
8
  declare const _default: typeof CustomPluginForm;
@@ -47,6 +47,7 @@ var types = require('@jbrowse/core/util/types');
47
47
  var PersonIcon = _interopDefault(require('@material-ui/icons/Person'));
48
48
  var AddIcon = _interopDefault(require('@material-ui/icons/Add'));
49
49
  var CheckIcon = _interopDefault(require('@material-ui/icons/Check'));
50
+ var clsx = _interopDefault(require('clsx'));
50
51
  var IconButton = _interopDefault(require('@material-ui/core/IconButton'));
51
52
  var ArrowBackIosIcon = _interopDefault(require('@material-ui/icons/ArrowBackIos'));
52
53
  var CreateIcon = _interopDefault(require('@material-ui/icons/Create'));
@@ -1799,7 +1800,8 @@ function f(pluginManager) {
1799
1800
 
1800
1801
  var track = self.trackData,
1801
1802
  index = self.indexTrackData;
1802
- return !!(index !== null && index !== void 0 && (_index$uri = index.uri) !== null && _index$uri !== void 0 && _index$uri.startsWith('ftp://') || track !== null && track !== void 0 && (_track$uri = track.uri) !== null && _track$uri !== void 0 && _track$uri.startsWith('ftp://'));
1803
+ return !!( // @ts-ignore
1804
+ index !== null && index !== void 0 && (_index$uri = index.uri) !== null && _index$uri !== void 0 && _index$uri.startsWith('ftp://') || track !== null && track !== void 0 && (_track$uri = track.uri) !== null && _track$uri !== void 0 && _track$uri.startsWith('ftp://'));
1803
1805
  },
1804
1806
 
1805
1807
  get isRelativeTrackUrl() {
@@ -1895,9 +1897,9 @@ var hasAnyOverlap = function hasAnyOverlap() {
1895
1897
  function passesFilter(filter, config) {
1896
1898
  var name = getTrackName(config);
1897
1899
  var categories = configuration.readConfObject(config, 'category') || [];
1898
- var regexp = new RegExp(filter, 'i');
1899
- return !!name.match(regexp) || categories.filter(function (cat) {
1900
- 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);
1901
1903
  }).length;
1902
1904
  }
1903
1905
 
@@ -2244,7 +2246,7 @@ function InstalledPlugin(_ref2) {
2244
2246
  onClose: function onClose(name) {
2245
2247
  if (name) {
2246
2248
  var pluginMetadata = pluginManager.pluginMetadata[plugin.name];
2247
- var pluginUrl = pluginMetadata.url;
2249
+ var pluginUrl = pluginMetadata.url || pluginMetadata.esmUrl || pluginMetadata.umdUrl || pluginMetadata.cjsUrl;
2248
2250
 
2249
2251
  if (adminMode) {
2250
2252
  jbrowse.removePlugin(pluginUrl);
@@ -2380,87 +2382,182 @@ function PluginCard(_ref) {
2380
2382
 
2381
2383
  var PluginCard$1 = /*#__PURE__*/mobxReact.observer(PluginCard);
2382
2384
 
2383
- var useStyles$2 = /*#__PURE__*/core.makeStyles(function () {
2385
+ var useStyles$2 = /*#__PURE__*/core.makeStyles(function (theme) {
2384
2386
  return {
2385
- closeDialog: {
2387
+ closeButton: {
2386
2388
  position: 'absolute',
2387
- right: 0,
2388
- top: 0
2389
+ right: theme.spacing(1),
2390
+ top: theme.spacing(1)
2389
2391
  },
2390
- dialogContainer: {
2391
- margin: 15,
2392
+ dialogContent: {
2392
2393
  display: 'flex',
2393
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)'
2394
2405
  }
2395
2406
  };
2396
2407
  });
2397
2408
 
2398
2409
  function CustomPluginForm(_ref) {
2399
2410
  var open = _ref.open,
2400
- _onClose = _ref.onClose,
2411
+ onClose = _ref.onClose,
2401
2412
  model = _ref.model;
2402
2413
  var classes = useStyles$2();
2403
2414
 
2404
2415
  var _useState = React.useState(''),
2405
2416
  _useState2 = _slicedToArray(_useState, 2),
2406
- formName = _useState2[0],
2407
- setFormName = _useState2[1];
2417
+ umdPluginName = _useState2[0],
2418
+ setUMDPluginName = _useState2[1];
2408
2419
 
2409
2420
  var _useState3 = React.useState(''),
2410
2421
  _useState4 = _slicedToArray(_useState3, 2),
2411
- formUrl = _useState4[0],
2412
- setFormUrl = _useState4[1];
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
+ }
2413
2465
 
2414
2466
  var rootModel = mobxStateTree.getRoot(model);
2415
2467
  var jbrowse = rootModel.jbrowse;
2468
+ var ready = Boolean(umdPluginName && umdPluginUrl || esmPluginUrl || cjsPluginUrl);
2469
+
2470
+ function handleSubmit() {
2471
+ if (!ready) {
2472
+ return;
2473
+ }
2474
+
2475
+ var pluginDefinition = {};
2476
+
2477
+ if (umdPluginName && umdPluginUrl) {
2478
+ pluginDefinition.name = umdPluginName;
2479
+ pluginDefinition.umdUrl = umdPluginUrl;
2480
+ }
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
+
2416
2501
  return /*#__PURE__*/React__default.createElement(core.Dialog, {
2417
2502
  open: open,
2418
- onClose: function onClose() {
2419
- return _onClose();
2420
- }
2503
+ onClose: handleClose
2421
2504
  }, /*#__PURE__*/React__default.createElement(core.DialogTitle, null, "Add custom plugin", /*#__PURE__*/React__default.createElement(IconButton, {
2422
- className: classes.closeDialog,
2505
+ size: "medium",
2506
+ className: classes.closeButton,
2423
2507
  onClick: function onClick() {
2424
- return _onClose();
2508
+ return onClose();
2425
2509
  }
2426
- }, /*#__PURE__*/React__default.createElement(CloseIcon, null))), /*#__PURE__*/React__default.createElement(core.DialogContent, null, /*#__PURE__*/React__default.createElement("div", {
2427
- className: classes.dialogContainer
2428
- }, /*#__PURE__*/React__default.createElement(core.Typography, null, "Specify the name and URL path of your plugin source"), /*#__PURE__*/React__default.createElement(core.TextField, {
2429
- id: "name-input",
2430
- 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",
2431
2517
  label: "Plugin name",
2432
2518
  variant: "outlined",
2433
- value: formName,
2434
- onChange: function onChange(event) {
2435
- return setFormName(event.target.value);
2436
- }
2519
+ value: umdPluginName,
2520
+ onChange: handleChange
2437
2521
  }), /*#__PURE__*/React__default.createElement(core.TextField, {
2438
- id: "url-input",
2439
- name: "url",
2522
+ id: "umd-url-input",
2523
+ name: "umdUrl",
2440
2524
  label: "Plugin URL",
2441
2525
  variant: "outlined",
2442
- value: formUrl,
2443
- onChange: function onChange(event) {
2444
- return setFormUrl(event.target.value);
2445
- }
2446
- }))), /*#__PURE__*/React__default.createElement(core.DialogActions, null, /*#__PURE__*/React__default.createElement(core.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, {
2447
2553
  variant: "contained",
2448
- color: "secondary",
2449
- onClick: function onClick() {
2450
- return _onClose();
2451
- }
2554
+ onClick: handleClose
2452
2555
  }, "Cancel"), /*#__PURE__*/React__default.createElement(core.Button, {
2453
2556
  variant: "contained",
2454
2557
  color: "primary",
2455
- onClick: function onClick() {
2456
- jbrowse.addPlugin({
2457
- name: formName,
2458
- url: formUrl
2459
- });
2460
-
2461
- _onClose();
2462
- }
2463
- }, "Submit")));
2558
+ onClick: handleSubmit,
2559
+ disabled: !ready
2560
+ }, "Submit"))));
2464
2561
  }
2465
2562
 
2466
2563
  var CustomPluginForm$1 = /*#__PURE__*/mobxReact.observer(CustomPluginForm);
@@ -2516,7 +2613,8 @@ function PluginStoreWidget(_ref) {
2516
2613
  pluginManager = _getEnv.pluginManager;
2517
2614
 
2518
2615
  React.useEffect(function () {
2519
- var killed = false;
2616
+ var controller = new AbortController();
2617
+ var signal = controller.signal;
2520
2618
 
2521
2619
  _asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee() {
2522
2620
  var response, err, array;
@@ -2526,7 +2624,9 @@ function PluginStoreWidget(_ref) {
2526
2624
  case 0:
2527
2625
  _context.prev = 0;
2528
2626
  _context.next = 3;
2529
- return fetch('https://jbrowse.org/plugin-store/plugins.json');
2627
+ return fetch('https://jbrowse.org/plugin-store/plugins.json', {
2628
+ signal: signal
2629
+ });
2530
2630
 
2531
2631
  case 3:
2532
2632
  response = _context.sent;
@@ -2550,7 +2650,7 @@ function PluginStoreWidget(_ref) {
2550
2650
  case 11:
2551
2651
  array = _context.sent;
2552
2652
 
2553
- if (!killed) {
2653
+ if (!signal.aborted) {
2554
2654
  setPluginArray(array.plugins);
2555
2655
  }
2556
2656
 
@@ -2572,7 +2672,7 @@ function PluginStoreWidget(_ref) {
2572
2672
  }))();
2573
2673
 
2574
2674
  return function () {
2575
- killed = true;
2675
+ controller.abort();
2576
2676
  };
2577
2677
  }, []);
2578
2678
  return /*#__PURE__*/React__default.createElement("div", {
@@ -2640,6 +2740,11 @@ function PluginStoreWidget(_ref) {
2640
2740
  }, "Available plugins")), error ? /*#__PURE__*/React__default.createElement(core.Typography, {
2641
2741
  color: "error"
2642
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
+
2643
2748
  return plugin.name.toLowerCase().includes(model.filterText.toLowerCase());
2644
2749
  }).map(function (plugin) {
2645
2750
  return /*#__PURE__*/React__default.createElement(PluginCard$1, {