@jbrowse/plugin-data-management 1.6.9 → 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.
- package/dist/AddConnectionWidget/components/AddConnectionWidget.js +178 -0
- package/dist/AddConnectionWidget/components/AddConnectionWidget.test.js +270 -0
- package/dist/AddConnectionWidget/components/ConfigureConnection.js +35 -0
- package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +70 -0
- package/dist/AddConnectionWidget/index.js +21 -0
- package/dist/AddConnectionWidget/model.js +17 -0
- package/dist/AddTrackWidget/components/AddTrackWidget.js +215 -0
- package/dist/AddTrackWidget/components/AddTrackWidget.test.js +218 -0
- package/dist/AddTrackWidget/components/ConfirmTrack.js +277 -0
- package/dist/AddTrackWidget/components/TrackSourceSelect.js +60 -0
- package/dist/AddTrackWidget/index.js +21 -0
- package/dist/AddTrackWidget/index.test.js +291 -0
- package/dist/AddTrackWidget/model.js +167 -0
- package/dist/AssemblyManager/AssemblyAddForm.js +299 -0
- package/dist/AssemblyManager/AssemblyEditor.js +25 -0
- package/dist/AssemblyManager/AssemblyManager.js +144 -0
- package/dist/AssemblyManager/AssemblyManager.test.js +113 -0
- package/dist/AssemblyManager/AssemblyTable.js +92 -0
- package/dist/AssemblyManager/index.js +15 -0
- package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js +55 -0
- package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js +46 -0
- package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +648 -0
- package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.test.js +191 -0
- package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js +80 -0
- package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js +98 -0
- package/dist/HierarchicalTrackSelectorWidget/index.js +21 -0
- package/dist/HierarchicalTrackSelectorWidget/model.js +306 -0
- package/dist/HierarchicalTrackSelectorWidget/model.test.js +28 -0
- package/dist/PluginStoreWidget/components/CustomPluginForm.js +217 -0
- package/dist/PluginStoreWidget/components/InstalledPlugin.js +138 -0
- package/dist/PluginStoreWidget/components/InstalledPluginsList.js +47 -0
- package/dist/PluginStoreWidget/components/PluginCard.js +121 -0
- package/dist/PluginStoreWidget/components/PluginStoreWidget.js +240 -0
- package/dist/PluginStoreWidget/components/PluginStoreWidget.test.js +201 -0
- package/dist/PluginStoreWidget/index.js +29 -0
- package/dist/PluginStoreWidget/model.js +28 -0
- package/dist/PluginStoreWidget/model.test.js +17 -0
- package/dist/SetDefaultSession/SetDefaultSession.js +64 -0
- package/dist/SetDefaultSession/SetDefaultSession.test.js +75 -0
- package/dist/SetDefaultSession/index.js +15 -0
- package/dist/index.js +159 -6
- package/dist/index.test.js +56 -0
- package/dist/ucsc-trackhub/configSchema.js +30 -0
- package/dist/ucsc-trackhub/index.js +23 -0
- package/dist/ucsc-trackhub/model.js +130 -0
- package/dist/ucsc-trackhub/ucscAssemblies.js +13 -0
- package/dist/ucsc-trackhub/ucscTrackHub.js +503 -0
- package/package.json +3 -6
- package/src/AddConnectionWidget/components/AddConnectionWidget.test.js +1 -0
- package/src/AddTrackWidget/components/AddTrackWidget.test.js +1 -0
- package/src/AddTrackWidget/components/AddTrackWidget.tsx +1 -1
- package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.test.js +1 -0
- package/src/PluginStoreWidget/components/CustomPluginForm.tsx +1 -1
- package/src/PluginStoreWidget/components/InstalledPlugin.tsx +4 -2
- package/src/PluginStoreWidget/components/PluginCard.tsx +4 -2
- package/src/PluginStoreWidget/components/PluginStoreWidget.test.js +1 -0
- package/src/PluginStoreWidget/model.test.js +1 -0
- 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
|
+
}
|