@jbrowse/plugin-data-management 2.6.2 → 2.7.0

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 (161) hide show
  1. package/dist/AddConnectionWidget/components/AddConnectionWidget.d.ts +2 -2
  2. package/dist/AddConnectionWidget/components/AddConnectionWidget.js +17 -8
  3. package/dist/AddConnectionWidget/components/ConfigureConnection.d.ts +2 -2
  4. package/dist/AddConnectionWidget/components/ConfigureConnection.js +2 -1
  5. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.d.ts +2 -2
  6. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +5 -3
  7. package/dist/AddTrackWidget/components/AddTrackWidget.d.ts +3 -4
  8. package/dist/AddTrackWidget/components/AddTrackWidget.js +3 -3
  9. package/dist/AddTrackWidget/components/ConfirmTrack.d.ts +2 -2
  10. package/dist/AddTrackWidget/components/ConfirmTrack.js +3 -2
  11. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +3 -4
  12. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js +32 -27
  13. package/dist/AddTrackWidget/components/PasteConfigWorkflow.d.ts +3 -4
  14. package/dist/AddTrackWidget/components/PasteConfigWorkflow.js +10 -7
  15. package/dist/AddTrackWidget/components/TrackAdapterSelector.js +1 -1
  16. package/dist/AddTrackWidget/components/TrackSourceSelect.d.ts +3 -4
  17. package/dist/AddTrackWidget/components/TrackSourceSelect.js +3 -3
  18. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.d.ts +2 -2
  19. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +2 -1
  20. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +2 -2
  21. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +2 -1
  22. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.d.ts +3 -5
  23. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +2 -1
  24. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.d.ts +3 -4
  25. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js +5 -8
  26. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.d.ts +3 -4
  27. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js +3 -3
  28. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.d.ts +2 -3
  29. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +2 -3
  30. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +13 -0
  31. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +72 -0
  32. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +31 -77
  33. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.d.ts +3 -4
  34. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.js +3 -3
  35. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +5 -3
  36. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +10 -4
  37. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.d.ts +2 -2
  38. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +53 -33
  39. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.d.ts +2 -2
  40. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +39 -21
  41. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.d.ts +3 -4
  42. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +13 -9
  43. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.d.ts +4 -3
  44. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +5 -6
  45. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +22 -0
  46. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +3 -3
  47. package/dist/HierarchicalTrackSelectorWidget/components/util.d.ts +2 -1
  48. package/dist/HierarchicalTrackSelectorWidget/components/util.js +1 -2
  49. package/dist/HierarchicalTrackSelectorWidget/filterTracks.d.ts +12 -0
  50. package/dist/HierarchicalTrackSelectorWidget/filterTracks.js +32 -0
  51. package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +21 -0
  52. package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.js +98 -0
  53. package/dist/HierarchicalTrackSelectorWidget/model.d.ts +68 -28
  54. package/dist/HierarchicalTrackSelectorWidget/model.js +147 -117
  55. package/dist/HierarchicalTrackSelectorWidget/util.d.ts +12 -0
  56. package/dist/HierarchicalTrackSelectorWidget/util.js +53 -0
  57. package/dist/PluginStoreWidget/components/AddCustomPluginDialog.d.ts +7 -0
  58. package/dist/PluginStoreWidget/components/{CustomPluginForm.js → AddCustomPluginDialog.js} +13 -21
  59. package/dist/PluginStoreWidget/components/DeletePluginDialog.d.ts +5 -0
  60. package/dist/PluginStoreWidget/components/DeletePluginDialog.js +28 -0
  61. package/dist/PluginStoreWidget/components/InstalledPlugin.d.ts +3 -6
  62. package/dist/PluginStoreWidget/components/InstalledPlugin.js +24 -51
  63. package/dist/PluginStoreWidget/components/InstalledPluginsList.d.ts +3 -4
  64. package/dist/PluginStoreWidget/components/InstalledPluginsList.js +7 -9
  65. package/dist/PluginStoreWidget/components/PluginCard.d.ts +2 -2
  66. package/dist/PluginStoreWidget/components/PluginCard.js +5 -6
  67. package/dist/PluginStoreWidget/components/PluginStoreWidget.d.ts +3 -4
  68. package/dist/PluginStoreWidget/components/PluginStoreWidget.js +14 -42
  69. package/dist/PluginStoreWidget/components/util.d.ts +5 -0
  70. package/dist/PluginStoreWidget/components/util.js +29 -0
  71. package/dist/PluginStoreWidget/model.d.ts +2 -2
  72. package/dist/PluginStoreWidget/model.js +2 -2
  73. package/dist/index.d.ts +1 -9
  74. package/dist/index.js +1 -4
  75. package/dist/ucsc-trackhub/model.js +2 -2
  76. package/esm/AddConnectionWidget/components/AddConnectionWidget.d.ts +2 -2
  77. package/esm/AddConnectionWidget/components/AddConnectionWidget.js +19 -10
  78. package/esm/AddConnectionWidget/components/ConfigureConnection.d.ts +2 -2
  79. package/esm/AddConnectionWidget/components/ConfigureConnection.js +2 -1
  80. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.d.ts +2 -2
  81. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.js +5 -3
  82. package/esm/AddTrackWidget/components/AddTrackWidget.d.ts +3 -4
  83. package/esm/AddTrackWidget/components/AddTrackWidget.js +3 -3
  84. package/esm/AddTrackWidget/components/ConfirmTrack.d.ts +2 -2
  85. package/esm/AddTrackWidget/components/ConfirmTrack.js +4 -3
  86. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +3 -4
  87. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +33 -28
  88. package/esm/AddTrackWidget/components/PasteConfigWorkflow.d.ts +3 -4
  89. package/esm/AddTrackWidget/components/PasteConfigWorkflow.js +11 -8
  90. package/esm/AddTrackWidget/components/TrackAdapterSelector.js +1 -1
  91. package/esm/AddTrackWidget/components/TrackSourceSelect.d.ts +3 -4
  92. package/esm/AddTrackWidget/components/TrackSourceSelect.js +3 -3
  93. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.d.ts +2 -2
  94. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +2 -1
  95. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +2 -2
  96. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +2 -1
  97. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.d.ts +3 -5
  98. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +2 -1
  99. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.d.ts +3 -4
  100. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js +6 -9
  101. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.d.ts +3 -4
  102. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js +3 -3
  103. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.d.ts +2 -3
  104. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +3 -2
  105. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +13 -0
  106. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +43 -0
  107. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +31 -54
  108. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.d.ts +3 -4
  109. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.js +3 -3
  110. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +5 -3
  111. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +10 -4
  112. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.d.ts +2 -2
  113. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +51 -31
  114. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.d.ts +2 -2
  115. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +38 -20
  116. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.d.ts +3 -4
  117. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +13 -9
  118. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.d.ts +4 -3
  119. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +5 -6
  120. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +22 -0
  121. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +2 -2
  122. package/esm/HierarchicalTrackSelectorWidget/components/util.d.ts +2 -1
  123. package/esm/HierarchicalTrackSelectorWidget/components/util.js +1 -2
  124. package/esm/HierarchicalTrackSelectorWidget/filterTracks.d.ts +12 -0
  125. package/esm/HierarchicalTrackSelectorWidget/filterTracks.js +28 -0
  126. package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +21 -0
  127. package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.js +94 -0
  128. package/esm/HierarchicalTrackSelectorWidget/model.d.ts +68 -28
  129. package/esm/HierarchicalTrackSelectorWidget/model.js +149 -116
  130. package/esm/HierarchicalTrackSelectorWidget/util.d.ts +12 -0
  131. package/esm/HierarchicalTrackSelectorWidget/util.js +45 -0
  132. package/esm/PluginStoreWidget/components/AddCustomPluginDialog.d.ts +7 -0
  133. package/esm/PluginStoreWidget/components/{CustomPluginForm.js → AddCustomPluginDialog.js} +13 -21
  134. package/esm/PluginStoreWidget/components/DeletePluginDialog.d.ts +5 -0
  135. package/esm/PluginStoreWidget/components/DeletePluginDialog.js +22 -0
  136. package/esm/PluginStoreWidget/components/InstalledPlugin.d.ts +3 -6
  137. package/esm/PluginStoreWidget/components/InstalledPlugin.js +27 -54
  138. package/esm/PluginStoreWidget/components/InstalledPluginsList.d.ts +3 -4
  139. package/esm/PluginStoreWidget/components/InstalledPluginsList.js +7 -9
  140. package/esm/PluginStoreWidget/components/PluginCard.d.ts +2 -2
  141. package/esm/PluginStoreWidget/components/PluginCard.js +5 -6
  142. package/esm/PluginStoreWidget/components/PluginStoreWidget.d.ts +3 -4
  143. package/esm/PluginStoreWidget/components/PluginStoreWidget.js +15 -43
  144. package/esm/PluginStoreWidget/components/util.d.ts +5 -0
  145. package/esm/PluginStoreWidget/components/util.js +25 -0
  146. package/esm/PluginStoreWidget/model.d.ts +2 -2
  147. package/esm/PluginStoreWidget/model.js +1 -1
  148. package/esm/index.d.ts +1 -9
  149. package/esm/index.js +1 -3
  150. package/esm/ucsc-trackhub/model.js +2 -2
  151. package/package.json +5 -4
  152. package/dist/PluginStoreWidget/components/CustomPluginForm.d.ts +0 -9
  153. package/dist/SetDefaultSession/SetDefaultSession.d.ts +0 -6
  154. package/dist/SetDefaultSession/SetDefaultSession.js +0 -38
  155. package/dist/SetDefaultSession/index.d.ts +0 -1
  156. package/dist/SetDefaultSession/index.js +0 -8
  157. package/esm/PluginStoreWidget/components/CustomPluginForm.d.ts +0 -9
  158. package/esm/SetDefaultSession/SetDefaultSession.d.ts +0 -6
  159. package/esm/SetDefaultSession/SetDefaultSession.js +0 -33
  160. package/esm/SetDefaultSession/index.d.ts +0 -1
  161. package/esm/SetDefaultSession/index.js +0 -1
@@ -7,14 +7,12 @@ const react_1 = __importDefault(require("react"));
7
7
  const mobx_react_1 = require("mobx-react");
8
8
  const material_1 = require("@mui/material");
9
9
  const InstalledPlugin_1 = __importDefault(require("./InstalledPlugin"));
10
- function InstalledPluginsList({ pluginManager, model, }) {
10
+ const InstalledPluginsList = (0, mobx_react_1.observer)(function InstalledPluginsList({ pluginManager, model, }) {
11
11
  const { plugins } = pluginManager;
12
- const corePlugins = new Set(plugins
13
- .filter(p => { var _a; return (_a = pluginManager.pluginMetadata[p.name]) === null || _a === void 0 ? void 0 : _a.isCore; })
14
- .map(p => p.name));
15
- const externalPlugins = plugins.filter(plugin => !corePlugins.has(plugin.name));
12
+ const { filterText } = model;
13
+ const externalPlugins = plugins.filter(p => { var _a; return !((_a = pluginManager.pluginMetadata[p.name]) === null || _a === void 0 ? void 0 : _a.isCore); });
16
14
  return (react_1.default.createElement(material_1.List, null, externalPlugins.length > 0 ? (externalPlugins
17
- .filter(plugin => plugin.name.toLowerCase().includes(model.filterText.toLowerCase()))
18
- .map(plugin => (react_1.default.createElement(InstalledPlugin_1.default, { key: plugin.name, plugin: plugin, model: model, pluginManager: pluginManager })))) : (react_1.default.createElement(material_1.Typography, null, "No plugins currently installed"))));
19
- }
20
- exports.default = (0, mobx_react_1.observer)(InstalledPluginsList);
15
+ .filter(p => p.name.toLowerCase().includes(filterText.toLowerCase()))
16
+ .map(p => react_1.default.createElement(InstalledPlugin_1.default, { key: p.name, plugin: p, model: model }))) : (react_1.default.createElement(material_1.Typography, null, "No plugins currently installed"))));
17
+ });
18
+ exports.default = InstalledPluginsList;
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
2
  import { JBrowsePlugin } from '@jbrowse/core/util/types';
3
3
  import { PluginStoreModel } from '../model';
4
- declare const _default: ({ plugin, model, adminMode, }: {
4
+ declare const PluginCard: ({ plugin, model, adminMode, }: {
5
5
  plugin: JBrowsePlugin;
6
6
  model: PluginStoreModel;
7
7
  adminMode: boolean;
8
8
  }) => React.JSX.Element;
9
- export default _default;
9
+ export default PluginCard;
@@ -39,7 +39,7 @@ const Add_1 = __importDefault(require("@mui/icons-material/Add"));
39
39
  const Check_1 = __importDefault(require("@mui/icons-material/Check"));
40
40
  const useStyles = (0, mui_1.makeStyles)()({
41
41
  card: {
42
- margin: '1em',
42
+ margin: '0.5em',
43
43
  },
44
44
  icon: {
45
45
  marginLeft: '0.5em',
@@ -51,10 +51,9 @@ const useStyles = (0, mui_1.makeStyles)()({
51
51
  dataField: {
52
52
  display: 'flex',
53
53
  alignItems: 'center',
54
- margin: '0.4em 0em',
55
54
  },
56
55
  });
57
- exports.default = (0, mobx_react_1.observer)(function PluginCard({ plugin, model, adminMode, }) {
56
+ const PluginCard = (0, mobx_react_1.observer)(function PluginCard({ plugin, model, adminMode, }) {
58
57
  const { classes } = useStyles();
59
58
  const session = (0, util_1.getSession)(model);
60
59
  const { pluginManager } = (0, util_1.getEnv)(model);
@@ -67,9 +66,8 @@ exports.default = (0, mobx_react_1.observer)(function PluginCard({ plugin, model
67
66
  const { jbrowse } = rootModel;
68
67
  return (react_1.default.createElement(material_1.Card, { variant: "outlined", key: plugin.name, className: classes.card },
69
68
  react_1.default.createElement(material_1.CardContent, null,
70
- react_1.default.createElement("div", { className: classes.dataField },
71
- react_1.default.createElement(material_1.Typography, { variant: "h5" },
72
- react_1.default.createElement(material_1.Link, { href: `${plugin.location}#readme`, target: "_blank", rel: "noopener" }, plugin.name))),
69
+ react_1.default.createElement(material_1.Typography, { variant: "h5" },
70
+ react_1.default.createElement(material_1.Link, { href: `${plugin.location}#readme`, target: "_blank", rel: "noopener" }, plugin.name)),
73
71
  react_1.default.createElement("div", { className: classes.dataField },
74
72
  react_1.default.createElement(Person_1.default, { style: { marginRight: '0.5em' } }),
75
73
  react_1.default.createElement(material_1.Typography, null, plugin.authors.join(', '))),
@@ -86,3 +84,4 @@ exports.default = (0, mobx_react_1.observer)(function PluginCard({ plugin, model
86
84
  setTempDisabled(true);
87
85
  } }, isInstalled ? 'Installed' : 'Install'))));
88
86
  });
87
+ exports.default = PluginCard;
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { PluginStoreModel } from '../model';
3
- declare function PluginStoreWidget({ model }: {
3
+ declare const PluginStoreWidget: ({ model, }: {
4
4
  model: PluginStoreModel;
5
- }): React.JSX.Element;
6
- declare const _default: typeof PluginStoreWidget;
7
- export default _default;
5
+ }) => React.JSX.Element;
6
+ export default PluginStoreWidget;
@@ -40,16 +40,14 @@ const InfoOutlined_1 = __importDefault(require("@mui/icons-material/InfoOutlined
40
40
  // locals
41
41
  const InstalledPluginsList_1 = __importDefault(require("./InstalledPluginsList"));
42
42
  const PluginCard_1 = __importDefault(require("./PluginCard"));
43
- const CustomPluginForm_1 = __importDefault(require("./CustomPluginForm"));
43
+ const util_2 = require("./util");
44
+ // lazies
45
+ const AddCustomPluginDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./AddCustomPluginDialog'))));
44
46
  const useStyles = (0, mui_1.makeStyles)()(theme => ({
45
- root: {
46
- margin: theme.spacing(1),
47
- },
48
47
  expandIcon: {
49
48
  color: theme.palette.tertiary.contrastText,
50
49
  },
51
50
  adminBadge: {
52
- margin: '0.5em',
53
51
  borderRadius: 3,
54
52
  backgroundColor: theme.palette.quaternary.main,
55
53
  padding: '1em',
@@ -57,43 +55,17 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
57
55
  alignContent: 'center',
58
56
  },
59
57
  customPluginButton: {
60
- margin: '0.5em',
58
+ margin: '1em auto',
61
59
  display: 'flex',
62
- justifyContent: 'center',
63
60
  },
64
61
  }));
65
- function PluginStoreWidget({ model }) {
62
+ const PluginStoreWidget = (0, mobx_react_1.observer)(function ({ model, }) {
66
63
  const { classes } = useStyles();
67
- const [pluginArray, setPluginArray] = (0, react_1.useState)();
68
- const [error, setError] = (0, react_1.useState)();
69
- const [customPluginFormOpen, setCustomPluginFormOpen] = (0, react_1.useState)(false);
64
+ const { plugins, error } = (0, util_2.useFetchPlugins)();
65
+ const [open, setOpen] = (0, react_1.useState)(false);
70
66
  const { adminMode } = (0, util_1.getSession)(model);
71
67
  const { pluginManager } = (0, mobx_state_tree_1.getEnv)(model);
72
- (0, react_1.useEffect)(() => {
73
- const controller = new AbortController();
74
- const { signal } = controller;
75
- (async () => {
76
- try {
77
- const response = await fetch('https://jbrowse.org/plugin-store/plugins.json', { signal });
78
- if (!response.ok) {
79
- const err = await response.text();
80
- throw new Error(`Failed to fetch plugin data: ${response.status} ${response.statusText} ${err}`);
81
- }
82
- const array = await response.json();
83
- if (!signal.aborted) {
84
- setPluginArray(array.plugins);
85
- }
86
- }
87
- catch (e) {
88
- console.error(e);
89
- setError(e);
90
- }
91
- })();
92
- return () => {
93
- controller.abort();
94
- };
95
- }, []);
96
- return (react_1.default.createElement("div", { className: classes.root },
68
+ return (react_1.default.createElement("div", null,
97
69
  adminMode && (react_1.default.createElement(react_1.default.Fragment, null,
98
70
  !util_1.isElectron && (react_1.default.createElement("div", { className: classes.adminBadge },
99
71
  react_1.default.createElement(InfoOutlined_1.default, { style: { marginRight: '0.3em' } }),
@@ -101,9 +73,9 @@ function PluginStoreWidget({ model }) {
101
73
  "You are using the ",
102
74
  react_1.default.createElement("code", null, "admin-server"),
103
75
  ". Any changes you make will be saved to your configuration file. You also have the ability to add custom plugins that are not in the store."))),
104
- react_1.default.createElement("div", { className: classes.customPluginButton },
105
- react_1.default.createElement(material_1.Button, { variant: "contained", onClick: () => setCustomPluginFormOpen(true) }, "Add custom plugin")),
106
- react_1.default.createElement(CustomPluginForm_1.default, { open: customPluginFormOpen, onClose: () => setCustomPluginFormOpen(false), model: model }))),
76
+ react_1.default.createElement(material_1.Button, { className: classes.customPluginButton, variant: "contained", onClick: () => setOpen(true) }, "Add custom plugin"),
77
+ open ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(react_1.default.Fragment, null) },
78
+ react_1.default.createElement(AddCustomPluginDialog, { onClose: () => setOpen(false), model: model }))) : null)),
107
79
  react_1.default.createElement(material_1.TextField, { label: "Filter plugins", value: model.filterText, onChange: event => model.setFilterText(event.target.value), fullWidth: true, InputProps: {
108
80
  endAdornment: (react_1.default.createElement(material_1.InputAdornment, { position: "end" },
109
81
  react_1.default.createElement(material_1.IconButton, { onClick: () => model.clearFilterText() },
@@ -117,7 +89,7 @@ function PluginStoreWidget({ model }) {
117
89
  react_1.default.createElement(material_1.Accordion, { defaultExpanded: true },
118
90
  react_1.default.createElement(material_1.AccordionSummary, { expandIcon: react_1.default.createElement(ExpandMore_1.default, { className: classes.expandIcon }) },
119
91
  react_1.default.createElement(material_1.Typography, { variant: "h5" }, "Available plugins")),
120
- error ? (react_1.default.createElement(material_1.Typography, { color: "error" }, `${error}`)) : pluginArray ? (pluginArray
92
+ error ? (react_1.default.createElement(material_1.Typography, { color: "error" }, `${error}`)) : plugins ? (plugins
121
93
  .filter(plugin => {
122
94
  // If plugin only has cjsUrl, don't display outside desktop
123
95
  return (!(util_1.isElectron && plugin.cjsUrl) &&
@@ -126,5 +98,5 @@ function PluginStoreWidget({ model }) {
126
98
  .includes(model.filterText.toLowerCase()));
127
99
  })
128
100
  .map(plugin => (react_1.default.createElement(PluginCard_1.default, { key: plugin.name, plugin: plugin, model: model, adminMode: !!adminMode })))) : (react_1.default.createElement(ui_1.LoadingEllipses, null)))));
129
- }
130
- exports.default = (0, mobx_react_1.observer)(PluginStoreWidget);
101
+ });
102
+ exports.default = PluginStoreWidget;
@@ -0,0 +1,5 @@
1
+ import { JBrowsePlugin } from '@jbrowse/core/util/types';
2
+ export declare function useFetchPlugins(): {
3
+ plugins: JBrowsePlugin[] | undefined;
4
+ error: unknown;
5
+ };
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useFetchPlugins = void 0;
4
+ const react_1 = require("react");
5
+ function useFetchPlugins() {
6
+ const [plugins, setPlugins] = (0, react_1.useState)();
7
+ const [error, setError] = (0, react_1.useState)();
8
+ (0, react_1.useEffect)(() => {
9
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
10
+ ;
11
+ (async () => {
12
+ try {
13
+ const res = await fetch('https://jbrowse.org/plugin-store/plugins.json');
14
+ if (!res.ok) {
15
+ const err = await res.text();
16
+ throw new Error(`HTTP ${res.status} fetching plugins: ${err}`);
17
+ }
18
+ const array = await res.json();
19
+ setPlugins(array.plugins);
20
+ }
21
+ catch (e) {
22
+ console.error(e);
23
+ setError(e);
24
+ }
25
+ })();
26
+ }, []);
27
+ return { plugins, error };
28
+ }
29
+ exports.useFetchPlugins = useFetchPlugins;
@@ -1,6 +1,6 @@
1
1
  import { Instance } from 'mobx-state-tree';
2
2
  import PluginManager from '@jbrowse/core/PluginManager';
3
- export default function f(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
3
+ export default function stateModelFactory(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
4
4
  id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
5
5
  type: import("mobx-state-tree").ISimpleType<"PluginStoreWidget">;
6
6
  filterText: import("mobx-state-tree").IType<string | undefined, string, string>;
@@ -9,5 +9,5 @@ export default function f(pluginManager: PluginManager): import("mobx-state-tree
9
9
  clearFilterText(): void;
10
10
  setFilterText(newText: string): void;
11
11
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
12
- export type PluginStoreStateModel = ReturnType<typeof f>;
12
+ export type PluginStoreStateModel = ReturnType<typeof stateModelFactory>;
13
13
  export type PluginStoreModel = Instance<PluginStoreStateModel>;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const mobx_state_tree_1 = require("mobx-state-tree");
4
4
  const mst_1 = require("@jbrowse/core/util/types/mst");
5
- function f(pluginManager) {
5
+ function stateModelFactory(pluginManager) {
6
6
  return mobx_state_tree_1.types
7
7
  .model('PluginStoreModel', {
8
8
  id: mst_1.ElementId,
@@ -19,4 +19,4 @@ function f(pluginManager) {
19
19
  },
20
20
  }));
21
21
  }
22
- exports.default = f;
22
+ exports.default = stateModelFactory;
package/dist/index.d.ts CHANGED
@@ -1,10 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import Plugin from '@jbrowse/core/Plugin';
3
3
  import PluginManager from '@jbrowse/core/PluginManager';
4
- declare const SetDefaultSession: import("react").LazyExoticComponent<({ rootModel, onClose }: {
5
- rootModel?: unknown;
6
- onClose: () => void;
7
- }) => import("react").JSX.Element | null>;
8
4
  declare const AssemblyManager: import("react").LazyExoticComponent<({ rootModel, onClose, }: {
9
5
  rootModel: any;
10
6
  onClose: (arg: boolean) => void;
@@ -16,14 +12,10 @@ export default class extends Plugin {
16
12
  rootModel: any;
17
13
  onClose: (arg: boolean) => void;
18
14
  }) => import("react").JSX.Element>;
19
- SetDefaultSession: import("react").LazyExoticComponent<({ rootModel, onClose }: {
20
- rootModel?: unknown;
21
- onClose: () => void;
22
- }) => import("react").JSX.Element | null>;
23
15
  };
24
16
  install(pluginManager: PluginManager): void;
25
17
  configure(_pluginManager: PluginManager): void;
26
18
  }
27
- export { AssemblyManager, SetDefaultSession };
19
+ export { AssemblyManager };
28
20
  export { type AddTrackModel } from './AddTrackWidget/model';
29
21
  export { type HierarchicalTrackSelectorModel } from './HierarchicalTrackSelectorWidget';
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.SetDefaultSession = exports.AssemblyManager = void 0;
29
+ exports.AssemblyManager = void 0;
30
30
  const react_1 = require("react");
31
31
  const Plugin_1 = __importDefault(require("@jbrowse/core/Plugin"));
32
32
  const ucsc_trackhub_1 = __importDefault(require("./ucsc-trackhub"));
@@ -34,8 +34,6 @@ const AddTrackWidget_1 = __importDefault(require("./AddTrackWidget"));
34
34
  const AddConnectionWidget_1 = __importDefault(require("./AddConnectionWidget"));
35
35
  const PluginStoreWidget_1 = __importDefault(require("./PluginStoreWidget"));
36
36
  const HierarchicalTrackSelectorWidget_1 = __importDefault(require("./HierarchicalTrackSelectorWidget"));
37
- const SetDefaultSession = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./SetDefaultSession'))));
38
- exports.SetDefaultSession = SetDefaultSession;
39
37
  const AssemblyManager = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./AssemblyManager'))));
40
38
  exports.AssemblyManager = AssemblyManager;
41
39
  class default_1 extends Plugin_1.default {
@@ -44,7 +42,6 @@ class default_1 extends Plugin_1.default {
44
42
  this.name = 'DataManagementPlugin';
45
43
  this.exports = {
46
44
  AssemblyManager,
47
- SetDefaultSession,
48
45
  };
49
46
  }
50
47
  install(pluginManager) {
@@ -40,7 +40,7 @@ function UCSCTrackHubConnection(pluginManager) {
40
40
  }))
41
41
  .actions(self => ({
42
42
  async connect() {
43
- var _a;
43
+ var _a, _b;
44
44
  const session = (0, util_1.getSession)(self);
45
45
  const notLoadedAssemblies = [];
46
46
  try {
@@ -108,7 +108,7 @@ function UCSCTrackHubConnection(pluginManager) {
108
108
  catch (e) {
109
109
  console.error(e);
110
110
  session.notify(`There was a problem connecting to the UCSC Track Hub "${self.configuration.name}". Please make sure you have entered a valid hub.txt file. The error that was thrown is: "${e}"`, 'error');
111
- session.breakConnection(self.configuration);
111
+ (_b = session.breakConnection) === null || _b === void 0 ? void 0 : _b.call(session, self.configuration);
112
112
  }
113
113
  },
114
114
  }));
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- declare const _default: ({ model, }: {
2
+ declare const AddConnectionWidget: ({ model }: {
3
3
  model: unknown;
4
4
  }) => React.JSX.Element;
5
- export default _default;
5
+ export default AddConnectionWidget;
@@ -1,11 +1,12 @@
1
- import React, { useState } from 'react';
1
+ import React, { useMemo, useState } from 'react';
2
2
  import { Button, Step, StepContent, StepLabel, Stepper } from '@mui/material';
3
- import { getSession, getEnv } from '@jbrowse/core/util';
3
+ import { getSession, getEnv, isSessionModelWithWidgets, } from '@jbrowse/core/util';
4
4
  import { makeStyles } from 'tss-react/mui';
5
5
  import { observer } from 'mobx-react';
6
6
  // locals
7
7
  import ConfigureConnection from './ConfigureConnection';
8
8
  import ConnectionTypeSelect from './ConnectionTypeSelect';
9
+ import { isSessionWithConnections } from '@jbrowse/product-core';
9
10
  const useStyles = makeStyles()(theme => ({
10
11
  root: {
11
12
  marginTop: theme.spacing(1),
@@ -22,13 +23,15 @@ const useStyles = makeStyles()(theme => ({
22
23
  },
23
24
  }));
24
25
  const steps = ['Select a Connection Type', 'Configure Connection'];
25
- export default observer(function AddConnectionWidget({ model, }) {
26
+ const AddConnectionWidget = observer(function ({ model }) {
26
27
  const [connectionType, setConnectionType] = useState();
27
- const [configModel, setConfigModel] = useState();
28
+ const [connectionId, setConnectionId] = useState();
28
29
  const [activeStep, setActiveStep] = useState(0);
29
30
  const { classes } = useStyles();
30
31
  const session = getSession(model);
31
32
  const { pluginManager } = getEnv(session);
33
+ // useMemo is needed for react@18+mobx-react@9, previous code called configScema.create directly in a setConfigModel useState hook setter but this caused infinite loop
34
+ const configModel = useMemo(() => connectionType === null || connectionType === void 0 ? void 0 : connectionType.configSchema.create({ connectionId }, getEnv(model)), [connectionId, connectionType, model]);
32
35
  return (React.createElement("div", { className: classes.root },
33
36
  React.createElement(Stepper, { className: classes.stepper, activeStep: activeStep, orientation: "vertical" }, steps.map(label => (React.createElement(Step, { key: label },
34
37
  React.createElement(StepLabel, null, label),
@@ -38,21 +41,27 @@ export default observer(function AddConnectionWidget({ model, }) {
38
41
  if (!c) {
39
42
  return;
40
43
  }
41
- const connectionId = `${c.name}-${Date.now()}`;
42
- setConfigModel(c.configSchema.create({ connectionId }, getEnv(model)));
44
+ setConnectionId(`${c.name}-${Date.now()}`);
43
45
  } })) : connectionType && configModel ? (React.createElement(ConfigureConnection, { connectionType: connectionType, model: configModel, session: session })) : null,
44
46
  React.createElement("div", { className: classes.actionsContainer },
45
47
  React.createElement(Button, { disabled: activeStep === 0, onClick: () => setActiveStep(activeStep - 1), className: classes.button }, "Back"),
46
48
  React.createElement(Button, { disabled: !((activeStep === 0 && connectionType) ||
47
49
  (activeStep === 1 && configModel)), variant: "contained", color: "primary", onClick: () => {
48
- var _a;
49
50
  if (activeStep === steps.length - 1) {
50
- const conf = session.addConnectionConf(configModel);
51
- (_a = session.makeConnection) === null || _a === void 0 ? void 0 : _a.call(session, conf);
52
- session.hideWidget(model);
51
+ if (configModel && isSessionWithConnections(session)) {
52
+ const conf = session.addConnectionConf(configModel);
53
+ session.makeConnection(conf);
54
+ }
55
+ else {
56
+ session.notify('No config model to add');
57
+ }
58
+ if (isSessionModelWithWidgets(session)) {
59
+ session.hideWidget(model);
60
+ }
53
61
  }
54
62
  else {
55
63
  setActiveStep(activeStep + 1);
56
64
  }
57
65
  }, className: classes.button, "data-testid": "addConnectionNext" }, activeStep === steps.length - 1 ? 'Connect' : 'Next')))))))));
58
66
  });
67
+ export default AddConnectionWidget;
@@ -2,9 +2,9 @@ import React from 'react';
2
2
  import { ConnectionType } from '@jbrowse/core/pluggableElementTypes';
3
3
  import { AnyConfigurationModel } from '@jbrowse/core/configuration';
4
4
  import { AbstractSessionModel } from '@jbrowse/core/util';
5
- declare const _default: ({ connectionType, model, session, }: {
5
+ declare const ConfigureConnection: ({ connectionType, model, session, }: {
6
6
  connectionType: ConnectionType;
7
7
  model: AnyConfigurationModel;
8
8
  session: AbstractSessionModel;
9
9
  }) => React.JSX.Element;
10
- export default _default;
10
+ export default ConfigureConnection;
@@ -2,8 +2,9 @@ import React, { Suspense } from 'react';
2
2
  import { observer } from 'mobx-react';
3
3
  import { ConfigurationEditor } from '@jbrowse/plugin-config';
4
4
  import { LoadingEllipses } from '@jbrowse/core/ui';
5
- export default observer(function ({ connectionType, model, session, }) {
5
+ const ConfigureConnection = observer(function ({ connectionType, model, session, }) {
6
6
  const ConfigEditorComponent = connectionType.configEditorComponent || ConfigurationEditor;
7
7
  return (React.createElement(Suspense, { fallback: React.createElement(LoadingEllipses, null) },
8
8
  React.createElement(ConfigEditorComponent, { model: { target: model }, session: session })));
9
9
  });
10
+ export default ConfigureConnection;
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
  import { ConnectionType } from '@jbrowse/core/pluggableElementTypes';
3
- declare const _default: ({ connectionTypeChoices, connectionType, setConnectionType, }: {
3
+ declare const ConnectionTypeSelect: ({ connectionTypeChoices, connectionType, setConnectionType, }: {
4
4
  connectionTypeChoices: ConnectionType[];
5
5
  connectionType?: ConnectionType | undefined;
6
6
  setConnectionType: (c?: ConnectionType) => void;
7
7
  }) => React.JSX.Element;
8
- export default _default;
8
+ export default ConnectionTypeSelect;
@@ -3,14 +3,16 @@ import { IconButton, MenuItem, TextField } from '@mui/material';
3
3
  import { observer } from 'mobx-react';
4
4
  // icons
5
5
  import OpenInNewIcon from '@mui/icons-material/OpenInNew';
6
- export default observer(function ConnectionTypeSelect({ connectionTypeChoices, connectionType, setConnectionType, }) {
6
+ const ConnectionTypeSelect = observer(function ConnectionTypeSelect({ connectionTypeChoices, connectionType, setConnectionType, }) {
7
+ const firstChoice = connectionTypeChoices[0];
7
8
  useEffect(() => {
8
9
  if (!connectionType) {
9
- setConnectionType(connectionTypeChoices[0]);
10
+ setConnectionType(firstChoice);
10
11
  }
11
- });
12
+ }, [connectionType, firstChoice, setConnectionType]);
12
13
  return (React.createElement("form", { autoComplete: "off" }, connectionType ? (React.createElement(TextField, { value: connectionType.name, label: "connectionType", helperText: connectionType.description ? (React.createElement(React.Fragment, null,
13
14
  connectionType.description,
14
15
  connectionType.url ? (React.createElement(IconButton, { href: connectionType.url, rel: "noopener noreferrer", target: "_blank" },
15
16
  React.createElement(OpenInNewIcon, null))) : null)) : null, select: true, fullWidth: true, onChange: event => setConnectionType(connectionTypeChoices.find(c => c.name === event.target.value)), variant: "outlined" }, connectionTypeChoices.map(c => (React.createElement(MenuItem, { key: c.name, value: c.name }, c.displayName || c.name))))) : null));
16
17
  });
18
+ export default ConnectionTypeSelect;
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { AddTrackModel } from '../model';
3
- declare function AddTrackSelector({ model }: {
3
+ declare const AddTrackSelector: ({ model, }: {
4
4
  model: AddTrackModel;
5
- }): React.JSX.Element;
6
- declare const _default: typeof AddTrackSelector;
7
- export default _default;
5
+ }) => React.JSX.Element;
6
+ export default AddTrackSelector;
@@ -4,7 +4,7 @@ import { FormControl, FormHelperText, Select, MenuItem } from '@mui/material';
4
4
  import { getEnv } from '@jbrowse/core/util';
5
5
  import DefaultAddTrackWorkflow from './DefaultAddTrackWorkflow';
6
6
  import PasteConfigWorkflow from './PasteConfigWorkflow';
7
- function AddTrackSelector({ model }) {
7
+ const AddTrackSelector = observer(function ({ model, }) {
8
8
  const [val, setVal] = useState('Default add track workflow');
9
9
  const { pluginManager } = getEnv(model);
10
10
  const widgets = pluginManager.getAddTrackWorkflowElements();
@@ -22,5 +22,5 @@ function AddTrackSelector({ model }) {
22
22
  React.createElement(FormHelperText, null, "Type of add track workflow")),
23
23
  React.createElement("br", null),
24
24
  React.createElement(Component, { model: model })));
25
- }
26
- export default observer(AddTrackSelector);
25
+ });
26
+ export default AddTrackSelector;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { AddTrackModel } from '../model';
3
- declare const _default: ({ model, }: {
3
+ declare const ConfirmTrack: ({ model, }: {
4
4
  model: AddTrackModel;
5
5
  }) => React.JSX.Element;
6
- export default _default;
6
+ export default ConfirmTrack;
@@ -1,7 +1,7 @@
1
1
  import React, { useEffect, useState } from 'react';
2
2
  import { Checkbox, FormControl, FormControlLabel, Link, TextField, Typography, } from '@mui/material';
3
3
  import { makeStyles } from 'tss-react/mui';
4
- import { supportedIndexingAdapters, getSession, isElectron, } from '@jbrowse/core/util';
4
+ import { isSupportedIndexingAdapter, getSession, isElectron, } from '@jbrowse/core/util';
5
5
  import { observer } from 'mobx-react';
6
6
  import { UNKNOWN } from '@jbrowse/core/util/tracks';
7
7
  import { AssemblySelector } from '@jbrowse/core/ui';
@@ -46,7 +46,7 @@ function UnknownAdapterPrompt({ model }) {
46
46
  "and add a feature request for this data type."),
47
47
  React.createElement(TrackAdapterSelector, { model: model })));
48
48
  }
49
- export default observer(function ConfirmTrack({ model, }) {
49
+ const ConfirmTrack = observer(function ConfirmTrack({ model, }) {
50
50
  const { classes } = useStyles();
51
51
  const [check, setCheck] = useState(true);
52
52
  const session = getSession(model);
@@ -74,7 +74,7 @@ export default observer(function ConfirmTrack({ model, }) {
74
74
  if (!(trackAdapter === null || trackAdapter === void 0 ? void 0 : trackAdapter.type)) {
75
75
  return React.createElement(Typography, null, "Could not recognize this data type.");
76
76
  }
77
- const supportedForIndexing = supportedIndexingAdapters(trackAdapter === null || trackAdapter === void 0 ? void 0 : trackAdapter.type);
77
+ const supportedForIndexing = isSupportedIndexingAdapter(trackAdapter === null || trackAdapter === void 0 ? void 0 : trackAdapter.type);
78
78
  return (React.createElement("div", null,
79
79
  trackAdapter ? (React.createElement(StatusMessage, { trackAdapter: trackAdapter, trackType: trackType })) : null,
80
80
  warningMessage ? (React.createElement(Typography, { style: { color: 'orange' } }, warningMessage)) : null,
@@ -95,3 +95,4 @@ export default observer(function ConfirmTrack({ model, }) {
95
95
  } }) }))),
96
96
  isElectron && check && supportedForIndexing ? (React.createElement(TextIndexingConfig, { model: model })) : null));
97
97
  });
98
+ export default ConfirmTrack;
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { AddTrackModel } from '../model';
3
- declare function AddTrackWorkflow({ model }: {
3
+ declare const DefaultAddTrackWorkflow: ({ model, }: {
4
4
  model: AddTrackModel;
5
- }): React.JSX.Element;
6
- declare const _default: typeof AddTrackWorkflow;
7
- export default _default;
5
+ }) => React.JSX.Element;
6
+ export default DefaultAddTrackWorkflow;