@jbrowse/plugin-data-management 1.6.7 → 1.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 (66) hide show
  1. package/dist/AddConnectionWidget/components/AddConnectionWidget.js +178 -0
  2. package/dist/AddConnectionWidget/components/AddConnectionWidget.test.js +270 -0
  3. package/dist/AddConnectionWidget/components/ConfigureConnection.js +35 -0
  4. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +70 -0
  5. package/dist/AddConnectionWidget/index.js +21 -0
  6. package/dist/AddConnectionWidget/model.js +17 -0
  7. package/dist/AddTrackWidget/components/AddTrackWidget.js +215 -0
  8. package/dist/AddTrackWidget/components/AddTrackWidget.test.js +218 -0
  9. package/dist/AddTrackWidget/components/ConfirmTrack.js +277 -0
  10. package/dist/AddTrackWidget/components/TrackSourceSelect.js +60 -0
  11. package/dist/AddTrackWidget/index.js +21 -0
  12. package/dist/AddTrackWidget/index.test.js +291 -0
  13. package/dist/AddTrackWidget/model.js +167 -0
  14. package/dist/AssemblyManager/AssemblyAddForm.js +299 -0
  15. package/dist/AssemblyManager/AssemblyEditor.js +25 -0
  16. package/dist/AssemblyManager/AssemblyManager.js +144 -0
  17. package/dist/AssemblyManager/AssemblyManager.test.js +113 -0
  18. package/dist/AssemblyManager/AssemblyTable.js +92 -0
  19. package/dist/AssemblyManager/index.js +15 -0
  20. package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js +55 -0
  21. package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js +46 -0
  22. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +648 -0
  23. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.test.js +191 -0
  24. package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js +80 -0
  25. package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js +98 -0
  26. package/dist/HierarchicalTrackSelectorWidget/index.js +21 -0
  27. package/dist/HierarchicalTrackSelectorWidget/model.js +306 -0
  28. package/dist/HierarchicalTrackSelectorWidget/model.test.js +28 -0
  29. package/dist/PluginStoreWidget/components/CustomPluginForm.js +217 -0
  30. package/dist/PluginStoreWidget/components/InstalledPlugin.js +138 -0
  31. package/dist/PluginStoreWidget/components/InstalledPluginsList.js +47 -0
  32. package/dist/PluginStoreWidget/components/PluginCard.js +121 -0
  33. package/dist/PluginStoreWidget/components/PluginStoreWidget.js +240 -0
  34. package/dist/PluginStoreWidget/components/PluginStoreWidget.test.js +201 -0
  35. package/dist/PluginStoreWidget/index.js +29 -0
  36. package/dist/PluginStoreWidget/model.js +28 -0
  37. package/dist/PluginStoreWidget/model.test.js +17 -0
  38. package/dist/SetDefaultSession/SetDefaultSession.js +64 -0
  39. package/dist/SetDefaultSession/SetDefaultSession.test.js +75 -0
  40. package/dist/SetDefaultSession/index.js +15 -0
  41. package/dist/index.js +159 -6
  42. package/dist/index.test.js +56 -0
  43. package/dist/plugin-data-management.cjs.development.js +29 -23
  44. package/dist/plugin-data-management.cjs.development.js.map +1 -1
  45. package/dist/plugin-data-management.cjs.production.min.js +1 -1
  46. package/dist/plugin-data-management.cjs.production.min.js.map +1 -1
  47. package/dist/plugin-data-management.esm.js +29 -23
  48. package/dist/plugin-data-management.esm.js.map +1 -1
  49. package/dist/ucsc-trackhub/configSchema.js +30 -0
  50. package/dist/ucsc-trackhub/index.js +23 -0
  51. package/dist/ucsc-trackhub/model.js +130 -0
  52. package/dist/ucsc-trackhub/ucscAssemblies.js +13 -0
  53. package/dist/ucsc-trackhub/ucscTrackHub.js +503 -0
  54. package/package.json +3 -6
  55. package/src/AddConnectionWidget/components/AddConnectionWidget.test.js +1 -0
  56. package/src/AddTrackWidget/components/AddTrackWidget.test.js +1 -0
  57. package/src/AddTrackWidget/components/AddTrackWidget.tsx +1 -1
  58. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +94 -89
  59. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.test.js +1 -0
  60. package/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.js.snap +2 -2
  61. package/src/PluginStoreWidget/components/CustomPluginForm.tsx +1 -1
  62. package/src/PluginStoreWidget/components/InstalledPlugin.tsx +4 -2
  63. package/src/PluginStoreWidget/components/PluginCard.tsx +4 -2
  64. package/src/PluginStoreWidget/components/PluginStoreWidget.test.js +1 -0
  65. package/src/PluginStoreWidget/model.test.js +1 -0
  66. package/src/SetDefaultSession/SetDefaultSession.tsx +4 -3
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _mobxReact = require("mobx-react");
13
+
14
+ var _core = require("@material-ui/core");
15
+
16
+ var _InstalledPlugin = _interopRequireDefault(require("./InstalledPlugin"));
17
+
18
+ function InstalledPluginsList(_ref) {
19
+ var pluginManager = _ref.pluginManager,
20
+ model = _ref.model;
21
+ var _ref2 = pluginManager,
22
+ plugins = _ref2.plugins;
23
+ var corePlugins = plugins.filter(function (p) {
24
+ var _pluginManager$plugin;
25
+
26
+ return (_pluginManager$plugin = pluginManager.pluginMetadata[p.name]) === null || _pluginManager$plugin === void 0 ? void 0 : _pluginManager$plugin.isCore;
27
+ }).map(function (p) {
28
+ return p.name;
29
+ });
30
+ var externalPlugins = plugins.filter(function (plugin) {
31
+ return !corePlugins.includes(plugin.name);
32
+ });
33
+ return /*#__PURE__*/_react["default"].createElement(_core.List, null, externalPlugins.length ? externalPlugins.filter(function (plugin) {
34
+ return plugin.name.toLowerCase().includes(model.filterText.toLowerCase());
35
+ }).map(function (plugin) {
36
+ return /*#__PURE__*/_react["default"].createElement(_InstalledPlugin["default"], {
37
+ key: plugin.name,
38
+ plugin: plugin,
39
+ model: model,
40
+ pluginManager: pluginManager
41
+ });
42
+ }) : /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "No plugins currently installed"));
43
+ }
44
+
45
+ var _default = (0, _mobxReact.observer)(InstalledPluginsList);
46
+
47
+ exports["default"] = _default;
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports["default"] = void 0;
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var _mobxReact = require("mobx-react");
17
+
18
+ var _mobxStateTree = require("mobx-state-tree");
19
+
20
+ var _util = require("@jbrowse/core/util");
21
+
22
+ var _types = require("@jbrowse/core/util/types");
23
+
24
+ var _core = require("@material-ui/core");
25
+
26
+ var _Person = _interopRequireDefault(require("@material-ui/icons/Person"));
27
+
28
+ var _Add = _interopRequireDefault(require("@material-ui/icons/Add"));
29
+
30
+ var _Check = _interopRequireDefault(require("@material-ui/icons/Check"));
31
+
32
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
33
+
34
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
35
+
36
+ // icons
37
+ var useStyles = (0, _core.makeStyles)(function () {
38
+ return {
39
+ card: {
40
+ margin: '1em'
41
+ },
42
+ icon: {
43
+ marginLeft: '0.5em',
44
+ marginRight: '0.5em'
45
+ },
46
+ bold: {
47
+ fontWeight: 600
48
+ },
49
+ dataField: {
50
+ display: 'flex',
51
+ alignItems: 'center',
52
+ margin: '0.4em 0em'
53
+ }
54
+ };
55
+ });
56
+
57
+ function PluginCard(_ref) {
58
+ var plugin = _ref.plugin,
59
+ model = _ref.model,
60
+ adminMode = _ref.adminMode;
61
+ var classes = useStyles();
62
+ var session = (0, _util.getSession)(model);
63
+
64
+ var _ref2 = (0, _mobxStateTree.getEnv)(model),
65
+ pluginManager = _ref2.pluginManager;
66
+
67
+ var isInstalled = Boolean(pluginManager.runtimePluginDefinitions.find(function (pluginDefinition) {
68
+ return pluginDefinition.url === plugin.url;
69
+ }));
70
+
71
+ var _useState = (0, _react.useState)(false),
72
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
73
+ tempDisabled = _useState2[0],
74
+ setTempDisabled = _useState2[1];
75
+
76
+ var disableButton = isInstalled || tempDisabled;
77
+ var rootModel = (0, _mobxStateTree.getParent)(model, 3);
78
+ var jbrowse = rootModel.jbrowse;
79
+ return /*#__PURE__*/_react["default"].createElement(_core.Card, {
80
+ variant: "outlined",
81
+ key: plugin.name,
82
+ className: classes.card
83
+ }, /*#__PURE__*/_react["default"].createElement(_core.CardContent, null, /*#__PURE__*/_react["default"].createElement("div", {
84
+ className: classes.dataField
85
+ }, /*#__PURE__*/_react["default"].createElement(_core.Typography, {
86
+ variant: "h5"
87
+ }, /*#__PURE__*/_react["default"].createElement(_core.Link, {
88
+ href: "".concat(plugin.location, "#readme"),
89
+ target: "_blank",
90
+ rel: "noopener"
91
+ }, plugin.name))), /*#__PURE__*/_react["default"].createElement("div", {
92
+ className: classes.dataField
93
+ }, /*#__PURE__*/_react["default"].createElement(_Person["default"], {
94
+ style: {
95
+ marginRight: '0.5em'
96
+ }
97
+ }), /*#__PURE__*/_react["default"].createElement(_core.Typography, null, plugin.authors.join(', '))), /*#__PURE__*/_react["default"].createElement(_core.Typography, {
98
+ className: classes.bold
99
+ }, "Description:"), /*#__PURE__*/_react["default"].createElement(_core.Typography, null, plugin.description)), /*#__PURE__*/_react["default"].createElement(_core.CardActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
100
+ variant: "contained",
101
+ color: "primary",
102
+ disabled: disableButton,
103
+ startIcon: isInstalled ? /*#__PURE__*/_react["default"].createElement(_Check["default"], null) : /*#__PURE__*/_react["default"].createElement(_Add["default"], null),
104
+ onClick: function onClick() {
105
+ if (adminMode) {
106
+ jbrowse.addPlugin({
107
+ name: plugin.name,
108
+ url: plugin.url
109
+ });
110
+ } else if ((0, _types.isSessionWithSessionPlugins)(session)) {
111
+ session.addSessionPlugin(plugin);
112
+ }
113
+
114
+ setTempDisabled(true);
115
+ }
116
+ }, isInstalled ? 'Installed' : 'Install')));
117
+ }
118
+
119
+ var _default = (0, _mobxReact.observer)(PluginCard);
120
+
121
+ exports["default"] = _default;
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports["default"] = void 0;
11
+
12
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
+
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
+
16
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
+
18
+ var _react = _interopRequireWildcard(require("react"));
19
+
20
+ var _mobxReact = require("mobx-react");
21
+
22
+ var _mobxStateTree = require("mobx-state-tree");
23
+
24
+ var _core = require("@material-ui/core");
25
+
26
+ var _util = require("@jbrowse/core/util");
27
+
28
+ var _ExpandMore = _interopRequireDefault(require("@material-ui/icons/ExpandMore"));
29
+
30
+ var _Clear = _interopRequireDefault(require("@material-ui/icons/Clear"));
31
+
32
+ var _InfoOutlined = _interopRequireDefault(require("@material-ui/icons/InfoOutlined"));
33
+
34
+ var _InstalledPluginsList = _interopRequireDefault(require("./InstalledPluginsList"));
35
+
36
+ var _PluginCard = _interopRequireDefault(require("./PluginCard"));
37
+
38
+ var _CustomPluginForm = _interopRequireDefault(require("./CustomPluginForm"));
39
+
40
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
41
+
42
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
43
+
44
+ // icons
45
+ // locals
46
+ var useStyles = (0, _core.makeStyles)(function (theme) {
47
+ return {
48
+ root: {
49
+ margin: theme.spacing(1)
50
+ },
51
+ expandIcon: {
52
+ color: '#fff'
53
+ },
54
+ adminBadge: {
55
+ margin: '0.5em',
56
+ borderRadius: 3,
57
+ // this is the quaternary color in JB2 palette
58
+ backgroundColor: '#FFB11D',
59
+ padding: '1em',
60
+ display: 'flex',
61
+ alignContent: 'center'
62
+ },
63
+ customPluginButton: {
64
+ margin: '0.5em',
65
+ display: 'flex',
66
+ justifyContent: 'center'
67
+ }
68
+ };
69
+ });
70
+
71
+ function PluginStoreWidget(_ref) {
72
+ var model = _ref.model;
73
+ var classes = useStyles();
74
+
75
+ var _useState = (0, _react.useState)(),
76
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
77
+ pluginArray = _useState2[0],
78
+ setPluginArray = _useState2[1];
79
+
80
+ var _useState3 = (0, _react.useState)(),
81
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
82
+ error = _useState4[0],
83
+ setError = _useState4[1];
84
+
85
+ var _useState5 = (0, _react.useState)(false),
86
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
87
+ customPluginFormOpen = _useState6[0],
88
+ setCustomPluginFormOpen = _useState6[1];
89
+
90
+ var _getSession = (0, _util.getSession)(model),
91
+ adminMode = _getSession.adminMode;
92
+
93
+ var _getEnv = (0, _mobxStateTree.getEnv)(model),
94
+ pluginManager = _getEnv.pluginManager;
95
+
96
+ (0, _react.useEffect)(function () {
97
+ var controller = new AbortController();
98
+ var signal = controller.signal;
99
+ (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
100
+ var response, err, array;
101
+ return _regenerator["default"].wrap(function _callee$(_context) {
102
+ while (1) {
103
+ switch (_context.prev = _context.next) {
104
+ case 0:
105
+ _context.prev = 0;
106
+ _context.next = 3;
107
+ return fetch('https://jbrowse.org/plugin-store/plugins.json', {
108
+ signal: signal
109
+ });
110
+
111
+ case 3:
112
+ response = _context.sent;
113
+
114
+ if (response.ok) {
115
+ _context.next = 9;
116
+ break;
117
+ }
118
+
119
+ _context.next = 7;
120
+ return response.text();
121
+
122
+ case 7:
123
+ err = _context.sent;
124
+ throw new Error("Failed to fetch plugin data: ".concat(response.status, " ").concat(response.statusText, " ").concat(err));
125
+
126
+ case 9:
127
+ _context.next = 11;
128
+ return response.json();
129
+
130
+ case 11:
131
+ array = _context.sent;
132
+
133
+ if (!signal.aborted) {
134
+ setPluginArray(array.plugins);
135
+ }
136
+
137
+ _context.next = 19;
138
+ break;
139
+
140
+ case 15:
141
+ _context.prev = 15;
142
+ _context.t0 = _context["catch"](0);
143
+ console.error(_context.t0);
144
+ setError(_context.t0);
145
+
146
+ case 19:
147
+ case "end":
148
+ return _context.stop();
149
+ }
150
+ }
151
+ }, _callee, null, [[0, 15]]);
152
+ }))();
153
+ return function () {
154
+ controller.abort();
155
+ };
156
+ }, []);
157
+ return /*#__PURE__*/_react["default"].createElement("div", {
158
+ className: classes.root
159
+ }, adminMode && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !_util.isElectron && /*#__PURE__*/_react["default"].createElement("div", {
160
+ className: classes.adminBadge
161
+ }, /*#__PURE__*/_react["default"].createElement(_InfoOutlined["default"], {
162
+ style: {
163
+ marginRight: '0.3em'
164
+ }
165
+ }), /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "You are using the ", /*#__PURE__*/_react["default"].createElement("code", null, "admin-server"), ". 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.")), /*#__PURE__*/_react["default"].createElement("div", {
166
+ className: classes.customPluginButton
167
+ }, /*#__PURE__*/_react["default"].createElement(_core.Button, {
168
+ variant: "contained",
169
+ color: "primary",
170
+ onClick: function onClick() {
171
+ return setCustomPluginFormOpen(true);
172
+ }
173
+ }, "Add custom plugin")), /*#__PURE__*/_react["default"].createElement(_CustomPluginForm["default"], {
174
+ open: customPluginFormOpen,
175
+ onClose: function onClose() {
176
+ return setCustomPluginFormOpen(false);
177
+ },
178
+ model: model
179
+ })), /*#__PURE__*/_react["default"].createElement(_core.TextField, {
180
+ label: "Filter plugins",
181
+ value: model.filterText,
182
+ onChange: function onChange(event) {
183
+ return model.setFilterText(event.target.value);
184
+ },
185
+ fullWidth: true,
186
+ InputProps: {
187
+ endAdornment: /*#__PURE__*/_react["default"].createElement(_core.InputAdornment, {
188
+ position: "end"
189
+ }, /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
190
+ color: "secondary",
191
+ onClick: function onClick() {
192
+ return model.clearFilterText();
193
+ }
194
+ }, /*#__PURE__*/_react["default"].createElement(_Clear["default"], null)))
195
+ }
196
+ }), /*#__PURE__*/_react["default"].createElement(_core.Accordion, {
197
+ defaultExpanded: true
198
+ }, /*#__PURE__*/_react["default"].createElement(_core.AccordionSummary, {
199
+ expandIcon: /*#__PURE__*/_react["default"].createElement(_ExpandMore["default"], {
200
+ className: classes.expandIcon
201
+ })
202
+ }, /*#__PURE__*/_react["default"].createElement(_core.Typography, {
203
+ variant: "h5"
204
+ }, "Installed plugins")), /*#__PURE__*/_react["default"].createElement("div", {
205
+ style: {
206
+ margin: '1em'
207
+ }
208
+ }, /*#__PURE__*/_react["default"].createElement(_InstalledPluginsList["default"], {
209
+ pluginManager: pluginManager,
210
+ model: model
211
+ }))), /*#__PURE__*/_react["default"].createElement(_core.Accordion, {
212
+ defaultExpanded: true
213
+ }, /*#__PURE__*/_react["default"].createElement(_core.AccordionSummary, {
214
+ expandIcon: /*#__PURE__*/_react["default"].createElement(_ExpandMore["default"], {
215
+ className: classes.expandIcon
216
+ })
217
+ }, /*#__PURE__*/_react["default"].createElement(_core.Typography, {
218
+ variant: "h5"
219
+ }, "Available plugins")), error ? /*#__PURE__*/_react["default"].createElement(_core.Typography, {
220
+ color: "error"
221
+ }, "".concat(error)) : pluginArray ? pluginArray.filter(function (plugin) {
222
+ // If pugin only has cjsUrl, don't display outside desktop
223
+ if (!_util.isElectron && !(plugin.esmUrl || plugin.url || plugin.umdUrl)) {
224
+ return false;
225
+ }
226
+
227
+ return plugin.name.toLowerCase().includes(model.filterText.toLowerCase());
228
+ }).map(function (plugin) {
229
+ return /*#__PURE__*/_react["default"].createElement(_PluginCard["default"], {
230
+ key: plugin.name,
231
+ plugin: plugin,
232
+ model: model,
233
+ adminMode: !!adminMode
234
+ });
235
+ }) : /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Loading...")));
236
+ }
237
+
238
+ var _default = (0, _mobxReact.observer)(PluginStoreWidget);
239
+
240
+ exports["default"] = _default;
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+
11
+ var _react = _interopRequireDefault(require("react"));
12
+
13
+ var _mobxStateTree = require("mobx-state-tree");
14
+
15
+ var _react2 = require("@testing-library/react");
16
+
17
+ var _rootModel = require("@jbrowse/web/src/rootModel");
18
+
19
+ var _PluginStoreWidget = _interopRequireDefault(require("./PluginStoreWidget"));
20
+
21
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
22
+
23
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
24
+
25
+ jest.mock('@jbrowse/web/src/makeWorkerInstance', function () {
26
+ return function () {};
27
+ });
28
+ var plugins = {
29
+ plugins: [{
30
+ name: 'MsaView',
31
+ authors: ['Colin Diesh'],
32
+ description: 'multiple sequence alignment browser plugin for JBrowse 2',
33
+ location: 'https://github.com/GMOD/jbrowse-plugin-msaview',
34
+ url: 'https://unpkg.com/jbrowse-plugin-msaview/dist/jbrowse-plugin-msaview.umd.production.min.js',
35
+ license: 'Apache License 2.0',
36
+ image: 'https://raw.githubusercontent.com/GMOD/jbrowse-plugin-list/main/img/msaview-screenshot-fs8.png'
37
+ }]
38
+ };
39
+ describe('<PluginStoreWidget />', function () {
40
+ var session;
41
+ var model;
42
+ beforeEach(function () {
43
+ session = (0, _rootModel.createTestSession)();
44
+ model = session.addWidget('PluginStoreWidget', 'pluginStoreWidget');
45
+ var _window = window,
46
+ location = _window.location;
47
+ delete window.location;
48
+ window.location = _objectSpread(_objectSpread({}, location), {}, {
49
+ reload: jest.fn()
50
+ });
51
+ fetch.resetMocks();
52
+ fetch.mockResponse(JSON.stringify(plugins));
53
+ });
54
+ afterEach(_react2.cleanup);
55
+ it('renders with the available plugins', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
56
+ var _render, container, findByText;
57
+
58
+ return _regenerator["default"].wrap(function _callee$(_context) {
59
+ while (1) {
60
+ switch (_context.prev = _context.next) {
61
+ case 0:
62
+ _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_PluginStoreWidget["default"], {
63
+ model: model
64
+ })), container = _render.container, findByText = _render.findByText;
65
+ _context.next = 3;
66
+ return findByText('multiple sequence alignment browser plugin for JBrowse 2');
67
+
68
+ case 3:
69
+ expect(container.firstChild).toMatchSnapshot();
70
+
71
+ case 4:
72
+ case "end":
73
+ return _context.stop();
74
+ }
75
+ }
76
+ }, _callee);
77
+ })));
78
+ it('Installs a session plugin', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
79
+ var _render2, findByText;
80
+
81
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
82
+ while (1) {
83
+ switch (_context2.prev = _context2.next) {
84
+ case 0:
85
+ _render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_PluginStoreWidget["default"], {
86
+ model: model
87
+ })), findByText = _render2.findByText;
88
+ _context2.next = 3;
89
+ return findByText('multiple sequence alignment browser plugin for JBrowse 2');
90
+
91
+ case 3:
92
+ _context2.t0 = _react2.fireEvent;
93
+ _context2.next = 6;
94
+ return findByText('Install');
95
+
96
+ case 6:
97
+ _context2.t1 = _context2.sent;
98
+
99
+ _context2.t0.click.call(_context2.t0, _context2.t1);
100
+
101
+ _context2.next = 10;
102
+ return (0, _react2.waitFor)(function () {
103
+ expect(window.location.reload).toHaveBeenCalled();
104
+ });
105
+
106
+ case 10:
107
+ expect((0, _mobxStateTree.getSnapshot)(session.sessionPlugins)[0]).toEqual(plugins.plugins[0]);
108
+
109
+ case 11:
110
+ case "end":
111
+ return _context2.stop();
112
+ }
113
+ }
114
+ }, _callee2);
115
+ })));
116
+ it('plugin store admin - adds a custom plugin correctly', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
117
+ var _render3, findByText, getByText, getByLabelText;
118
+
119
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
120
+ while (1) {
121
+ switch (_context3.prev = _context3.next) {
122
+ case 0:
123
+ session = (0, _rootModel.createTestSession)({}, true);
124
+ model = session.addWidget('PluginStoreWidget', 'pluginStoreWidget');
125
+ _render3 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_PluginStoreWidget["default"], {
126
+ model: model
127
+ })), findByText = _render3.findByText, getByText = _render3.getByText, getByLabelText = _render3.getByLabelText;
128
+ _context3.next = 5;
129
+ return findByText('multiple sequence alignment browser plugin for JBrowse 2');
130
+
131
+ case 5:
132
+ _react2.fireEvent.click(getByText('Add custom plugin'));
133
+
134
+ _react2.fireEvent.change(getByLabelText('Plugin URL'), {
135
+ target: {
136
+ value: 'https://unpkg.com/jbrowse-plugin-msaview/dist/jbrowse-plugin-msaview.esm.js'
137
+ }
138
+ });
139
+
140
+ _react2.fireEvent.change(getByLabelText('Plugin name'), {
141
+ target: {
142
+ value: 'MsaView'
143
+ }
144
+ });
145
+
146
+ _react2.fireEvent.click(getByText('Submit'));
147
+
148
+ _context3.next = 11;
149
+ return (0, _react2.waitFor)(function () {
150
+ expect(window.location.reload).toHaveBeenCalled();
151
+ });
152
+
153
+ case 11:
154
+ expect((0, _mobxStateTree.getSnapshot)((0, _mobxStateTree.getParent)(session)).jbrowse.plugins).toEqual([{
155
+ name: 'MsaView',
156
+ umdUrl: 'https://unpkg.com/jbrowse-plugin-msaview/dist/jbrowse-plugin-msaview.esm.js'
157
+ }]);
158
+
159
+ case 12:
160
+ case "end":
161
+ return _context3.stop();
162
+ }
163
+ }
164
+ }, _callee3);
165
+ })));
166
+ it('plugin store admin - removes a custom plugin correctly', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
167
+ var rootModel, jbrowse, _render4, findByText, getByText, getByTestId;
168
+
169
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
170
+ while (1) {
171
+ switch (_context4.prev = _context4.next) {
172
+ case 0:
173
+ session = (0, _rootModel.createTestSession)({}, true);
174
+ model = session.addWidget('PluginStoreWidget', 'pluginStoreWidget');
175
+ rootModel = (0, _mobxStateTree.getParent)(session);
176
+ jbrowse = rootModel.jbrowse;
177
+ jbrowse.addPlugin(plugins.plugins[0]);
178
+ _render4 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_PluginStoreWidget["default"], {
179
+ model: model
180
+ })), findByText = _render4.findByText, getByText = _render4.getByText, getByTestId = _render4.getByTestId;
181
+ _context4.next = 8;
182
+ return findByText('multiple sequence alignment browser plugin for JBrowse 2');
183
+
184
+ case 8:
185
+ _react2.fireEvent.click(getByTestId('removePlugin-SVGPlugin'));
186
+
187
+ _react2.fireEvent.click(getByText('Confirm'));
188
+
189
+ _context4.next = 12;
190
+ return (0, _react2.waitFor)(function () {
191
+ expect(window.location.reload).toHaveBeenCalled();
192
+ });
193
+
194
+ case 12:
195
+ case "end":
196
+ return _context4.stop();
197
+ }
198
+ }
199
+ }, _callee4);
200
+ })));
201
+ });
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ Object.defineProperty(exports, "ReactComponent", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _PluginStoreWidget["default"];
12
+ }
13
+ });
14
+ exports.configSchema = void 0;
15
+ Object.defineProperty(exports, "stateModelFactory", {
16
+ enumerable: true,
17
+ get: function get() {
18
+ return _model["default"];
19
+ }
20
+ });
21
+
22
+ var _configuration = require("@jbrowse/core/configuration");
23
+
24
+ var _PluginStoreWidget = _interopRequireDefault(require("./components/PluginStoreWidget"));
25
+
26
+ var _model = _interopRequireDefault(require("./model"));
27
+
28
+ var configSchema = (0, _configuration.ConfigurationSchema)('PluginStoreWidget', {});
29
+ exports.configSchema = configSchema;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = f;
7
+
8
+ var _mobxStateTree = require("mobx-state-tree");
9
+
10
+ var _mst = require("@jbrowse/core/util/types/mst");
11
+
12
+ function f(pluginManager) {
13
+ return _mobxStateTree.types.model('PluginStoreModel', {
14
+ id: _mst.ElementId,
15
+ type: _mobxStateTree.types.literal('PluginStoreWidget'),
16
+ filterText: '',
17
+ view: _mobxStateTree.types.safeReference(pluginManager.pluggableMstType('view', 'stateModel'))
18
+ }).actions(function (self) {
19
+ return {
20
+ clearFilterText: function clearFilterText() {
21
+ self.filterText = '';
22
+ },
23
+ setFilterText: function setFilterText(newText) {
24
+ self.filterText = newText;
25
+ }
26
+ };
27
+ });
28
+ }