@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,306 @@
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
+ exports.generateHierarchy = generateHierarchy;
10
+
11
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
12
+
13
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
14
+
15
+ var _mobxStateTree = require("mobx-state-tree");
16
+
17
+ var _configuration = require("@jbrowse/core/configuration");
18
+
19
+ var _util = require("@jbrowse/core/util");
20
+
21
+ var _mst = require("@jbrowse/core/util/types/mst");
22
+
23
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
24
+
25
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
26
+
27
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
28
+
29
+ var hasAnyOverlap = function hasAnyOverlap() {
30
+ var a1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
31
+ var a2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
32
+ return !!a1.find(function (value) {
33
+ return a2.includes(value);
34
+ });
35
+ };
36
+
37
+ function passesFilter(filter, config) {
38
+ var name = getTrackName(config);
39
+ var categories = (0, _configuration.readConfObject)(config, 'category') || [];
40
+ var filterLower = filter.toLowerCase();
41
+ return !!name.toLowerCase().includes(filterLower) || categories.filter(function (cat) {
42
+ return !!cat.toLowerCase().includes(filterLower);
43
+ }).length;
44
+ }
45
+
46
+ function getTrackName(config) {
47
+ if (!config.trackId) {
48
+ throw new Error('not a track');
49
+ }
50
+
51
+ return (0, _configuration.readConfObject)(config, 'name') || "Reference sequence (".concat((0, _configuration.readConfObject)((0, _mobxStateTree.getParent)(config), 'name'), ")");
52
+ }
53
+
54
+ function generateHierarchy(model, trackConfigurations, collapsed) {
55
+ var hierarchy = {
56
+ children: []
57
+ };
58
+ var filterText = model.filterText,
59
+ view = model.view;
60
+ trackConfigurations.filter(function (trackConf) {
61
+ return passesFilter(filterText, trackConf);
62
+ }).forEach(function (trackConf) {
63
+ // copy the categories since this array can be mutated downstream
64
+ var categories = (0, _toConsumableArray2["default"])((0, _configuration.readConfObject)(trackConf, 'category') || []); // silly thing where if trackId ends with sessionTrack, then push it to
65
+ // a category that starts with a space to force sort to the top...
66
+ // double whammy hackyness
67
+
68
+ if (trackConf.trackId.endsWith('sessionTrack')) {
69
+ categories.unshift(' Session tracks');
70
+ }
71
+
72
+ var currLevel = hierarchy; // find existing category to put track into or create it
73
+
74
+ var _loop = function _loop(i) {
75
+ var category = categories[i];
76
+ var ret = currLevel.children.find(function (c) {
77
+ return c.name === category;
78
+ });
79
+ var id = categories.slice(0, i + 1).join(',');
80
+
81
+ if (!ret) {
82
+ var n = {
83
+ children: [],
84
+ name: category,
85
+ id: id,
86
+ isOpenByDefault: !collapsed.get(id)
87
+ };
88
+ currLevel.children.push(n);
89
+ currLevel = n;
90
+ } else {
91
+ currLevel = ret;
92
+ }
93
+ };
94
+
95
+ for (var i = 0; i < categories.length; i++) {
96
+ _loop(i);
97
+ } // using splice here tries to group leaf nodes above hierarchical nodes
98
+
99
+
100
+ currLevel.children.splice(currLevel.children.findIndex(function (elt) {
101
+ return elt.children.length;
102
+ }), 0, {
103
+ id: trackConf.trackId,
104
+ name: getTrackName(trackConf),
105
+ conf: trackConf,
106
+ checked: !!view.tracks.find(function (f) {
107
+ return f.configuration === trackConf;
108
+ }),
109
+ children: []
110
+ });
111
+ });
112
+ return hierarchy.children;
113
+ }
114
+
115
+ var _default = function _default(pluginManager) {
116
+ return _mobxStateTree.types.model('HierarchicalTrackSelectorWidget', {
117
+ id: _mst.ElementId,
118
+ type: _mobxStateTree.types.literal('HierarchicalTrackSelectorWidget'),
119
+ collapsed: _mobxStateTree.types.map(_mobxStateTree.types["boolean"]),
120
+ filterText: '',
121
+ view: _mobxStateTree.types.safeReference(pluginManager.pluggableMstType('view', 'stateModel'))
122
+ }).actions(function (self) {
123
+ return {
124
+ setView: function setView(view) {
125
+ self.view = view;
126
+ },
127
+ toggleCategory: function toggleCategory(pathName) {
128
+ self.collapsed.set(pathName, !self.collapsed.get(pathName));
129
+ },
130
+ clearFilterText: function clearFilterText() {
131
+ self.filterText = '';
132
+ },
133
+ setFilterText: function setFilterText(newText) {
134
+ self.filterText = newText;
135
+ }
136
+ };
137
+ }).views(function (self) {
138
+ return {
139
+ getRefSeqTrackConf: function getRefSeqTrackConf(assemblyName) {
140
+ var _getSession = (0, _util.getSession)(self),
141
+ assemblyManager = _getSession.assemblyManager;
142
+
143
+ var assembly = assemblyManager.get(assemblyName);
144
+ var trackConf = assembly === null || assembly === void 0 ? void 0 : assembly.configuration.sequence;
145
+ var viewType = pluginManager.getViewType(self.view.type);
146
+
147
+ if (trackConf) {
148
+ var _iterator = _createForOfIteratorHelper(trackConf.displays),
149
+ _step;
150
+
151
+ try {
152
+ var _loop2 = function _loop2() {
153
+ var display = _step.value;
154
+
155
+ if (viewType.displayTypes.find(function (displayType) {
156
+ return displayType.name === display.type;
157
+ })) {
158
+ return {
159
+ v: trackConf
160
+ };
161
+ }
162
+ };
163
+
164
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
165
+ var _ret = _loop2();
166
+
167
+ if ((0, _typeof2["default"])(_ret) === "object") return _ret.v;
168
+ }
169
+ } catch (err) {
170
+ _iterator.e(err);
171
+ } finally {
172
+ _iterator.f();
173
+ }
174
+ }
175
+
176
+ return undefined;
177
+ },
178
+ trackConfigurations: function trackConfigurations(assemblyName) {
179
+ if (!self.view) {
180
+ return [];
181
+ }
182
+
183
+ var session = (0, _util.getSession)(self);
184
+ var trackConfigurations = session.tracks,
185
+ assemblyManager = session.assemblyManager;
186
+ var assembly = assemblyManager.get(assemblyName);
187
+
188
+ if (!assembly) {
189
+ return [];
190
+ }
191
+
192
+ var refseq = self.getRefSeqTrackConf(assemblyName); // filter out tracks that don't match the current assembly (check all
193
+ // assembly aliases) and display types
194
+
195
+ return (refseq ? [refseq] : []).concat((0, _toConsumableArray2["default"])(trackConfigurations.filter(function (conf) {
196
+ var trackConfAssemblies = (0, _configuration.readConfObject)(conf, 'assemblyNames');
197
+ var allAliases = assembly.allAliases;
198
+ return hasAnyOverlap(allAliases, trackConfAssemblies);
199
+ }).filter(function (conf) {
200
+ var _pluginManager$getVie = pluginManager.getViewType(self.view.type),
201
+ displayTypes = _pluginManager$getVie.displayTypes;
202
+
203
+ var compatibleDisplays = displayTypes.map(function (display) {
204
+ return display.name;
205
+ });
206
+ var trackDisplays = conf.displays.map(function (display) {
207
+ return display.type;
208
+ });
209
+ return hasAnyOverlap(compatibleDisplays, trackDisplays);
210
+ })));
211
+ },
212
+
213
+ get assemblyNames() {
214
+ return self.view ? self.view.assemblyNames : [];
215
+ },
216
+
217
+ connectionTrackConfigurations: function connectionTrackConfigurations(assemblyName, connection) {
218
+ if (!self.view) {
219
+ return [];
220
+ }
221
+
222
+ var trackConfigurations = connection.tracks;
223
+ var session = (0, _util.getSession)(self);
224
+ var assemblyManager = session.assemblyManager;
225
+ var assembly = assemblyManager.get(assemblyName);
226
+
227
+ if (!(assembly && assembly.initialized)) {
228
+ return [];
229
+ } // filter out tracks that don't match the current display types
230
+
231
+
232
+ return trackConfigurations.filter(function (conf) {
233
+ var trackConfAssemblies = (0, _configuration.readConfObject)(conf, 'assemblyNames');
234
+ var allAliases = assembly.allAliases;
235
+ return hasAnyOverlap(allAliases, trackConfAssemblies);
236
+ }).filter(function (conf) {
237
+ var _pluginManager$getVie2 = pluginManager.getViewType(self.view.type),
238
+ displayTypes = _pluginManager$getVie2.displayTypes;
239
+
240
+ var compatibleDisplays = displayTypes.map(function (display) {
241
+ return display.name;
242
+ });
243
+ var trackDisplays = conf.displays.map(function (display) {
244
+ return display.type;
245
+ });
246
+ return hasAnyOverlap(compatibleDisplays, trackDisplays);
247
+ });
248
+ },
249
+ hierarchy: function hierarchy(assemblyName) {
250
+ var _this = this;
251
+
252
+ var hier = generateHierarchy(self, self.trackConfigurations(assemblyName), self.collapsed);
253
+ var session = (0, _util.getSession)(self);
254
+ var conns = session.connectionInstances.filter(function (conn) {
255
+ var configAssemblyNames = (0, _configuration.readConfObject)(conn.configuration, 'assemblyNames');
256
+
257
+ if (configAssemblyNames.length === 0) {
258
+ return true;
259
+ }
260
+
261
+ return configAssemblyNames.includes(assemblyName);
262
+ }).map(function (conn, index) {
263
+ var c = session.connections[index];
264
+ return {
265
+ id: c.connectionId,
266
+ name: (0, _configuration.readConfObject)(c, 'name'),
267
+ children: _this.connectionHierarchy(assemblyName, conn),
268
+ state: {
269
+ expanded: true
270
+ }
271
+ };
272
+ });
273
+ return {
274
+ name: 'Root',
275
+ id: 'Root',
276
+ children: [{
277
+ name: 'Tracks',
278
+ id: 'Tracks',
279
+ children: hier
280
+ }].concat((0, _toConsumableArray2["default"])(conns))
281
+ };
282
+ },
283
+ connectionHierarchy: function connectionHierarchy(assemblyName, connection) {
284
+ return generateHierarchy(self, self.connectionTrackConfigurations(assemblyName, connection), self.collapsed);
285
+ },
286
+ // This recursively gets tracks from lower paths
287
+ allTracksInCategoryPath: function allTracksInCategoryPath(path, connection, assemblyName) {
288
+ var currentHier = connection ? self.connectionHierarchy(connection) : self.hierarchy(assemblyName);
289
+ path.forEach(function (pathItem) {
290
+ currentHier = currentHier.get(pathItem) || new Map();
291
+ });
292
+ var tracks = {};
293
+ currentHier.forEach(function (contents, name) {
294
+ if (contents.trackId) {
295
+ tracks[contents.trackId] = contents;
296
+ } else {
297
+ tracks = Object.assign(tracks, self.allTracksInCategoryPath(path.concat([name])));
298
+ }
299
+ });
300
+ return tracks;
301
+ }
302
+ };
303
+ });
304
+ };
305
+
306
+ exports["default"] = _default;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ var _model = require("./model");
4
+
5
+ xtest('can generate hierarchy correctly', function () {
6
+ var trackConfigurations = [{
7
+ trackId: 'zonker',
8
+ category: {
9
+ expr: {
10
+ evalSync: function evalSync() {
11
+ return ['Bar', 'Baz'];
12
+ }
13
+ }
14
+ }
15
+ }, {
16
+ trackId: 'zoo'
17
+ }, {
18
+ trackId: 'bee',
19
+ category: {
20
+ expr: {
21
+ evalSync: function evalSync() {
22
+ return ['Bar'];
23
+ }
24
+ }
25
+ }
26
+ }];
27
+ expect((0, _model.generateHierarchy)(trackConfigurations)).toEqual(new Map([['Bar', new Map([['bee', trackConfigurations[2]], ['Baz', new Map([['zonker', trackConfigurations[0]]])]])], ['zoo', trackConfigurations[1]]]));
28
+ });
@@ -0,0 +1,217 @@
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
+ var _react = _interopRequireWildcard(require("react"));
17
+
18
+ var _mobxReact = require("mobx-react");
19
+
20
+ var _mobxStateTree = require("mobx-state-tree");
21
+
22
+ var _clsx2 = _interopRequireDefault(require("clsx"));
23
+
24
+ var _core = require("@material-ui/core");
25
+
26
+ var _IconButton = _interopRequireDefault(require("@material-ui/core/IconButton"));
27
+
28
+ var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
29
+
30
+ var _ExpandMore = _interopRequireDefault(require("@material-ui/icons/ExpandMore"));
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 (theme) {
38
+ return {
39
+ closeButton: {
40
+ position: 'absolute',
41
+ right: theme.spacing(1),
42
+ top: theme.spacing(1)
43
+ },
44
+ dialogContent: {
45
+ display: 'flex',
46
+ flexDirection: 'column'
47
+ },
48
+ expand: {
49
+ transform: 'rotate(0deg)',
50
+ marginLeft: 'auto',
51
+ transition: theme.transitions.create('transform', {
52
+ duration: theme.transitions.duration.shortest
53
+ })
54
+ },
55
+ expandOpen: {
56
+ transform: 'rotate(180deg)'
57
+ }
58
+ };
59
+ });
60
+
61
+ function CustomPluginForm(_ref) {
62
+ var open = _ref.open,
63
+ onClose = _ref.onClose,
64
+ model = _ref.model;
65
+ var classes = useStyles();
66
+
67
+ var _useState = (0, _react.useState)(''),
68
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
69
+ umdPluginName = _useState2[0],
70
+ setUMDPluginName = _useState2[1];
71
+
72
+ var _useState3 = (0, _react.useState)(''),
73
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
74
+ umdPluginUrl = _useState4[0],
75
+ setUMDPluginUrl = _useState4[1];
76
+
77
+ var _useState5 = (0, _react.useState)(''),
78
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
79
+ esmPluginUrl = _useState6[0],
80
+ setESMPluginUrl = _useState6[1];
81
+
82
+ var _useState7 = (0, _react.useState)(''),
83
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
84
+ cjsPluginUrl = _useState8[0],
85
+ setCJSPluginUrl = _useState8[1];
86
+
87
+ var _useState9 = (0, _react.useState)(false),
88
+ _useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
89
+ advancedOptionsOpen = _useState10[0],
90
+ setAdvancedOptionsOpen = _useState10[1];
91
+
92
+ function handleChange(event) {
93
+ var _event$target = event.target,
94
+ name = _event$target.name,
95
+ value = _event$target.value;
96
+
97
+ if (name === 'umdName') {
98
+ setUMDPluginName(value);
99
+ }
100
+
101
+ if (name === 'umdUrl') {
102
+ setUMDPluginUrl(value);
103
+ }
104
+
105
+ if (name === 'esmUrl') {
106
+ setESMPluginUrl(value);
107
+ }
108
+
109
+ if (name === 'cjsUrl') {
110
+ setCJSPluginUrl(value);
111
+ }
112
+ }
113
+
114
+ function handleOpenAdvancedOptions() {
115
+ setAdvancedOptionsOpen(!advancedOptionsOpen);
116
+ }
117
+
118
+ var rootModel = (0, _mobxStateTree.getRoot)(model);
119
+ var jbrowse = rootModel.jbrowse;
120
+ var ready = Boolean(umdPluginName && umdPluginUrl || esmPluginUrl || cjsPluginUrl);
121
+
122
+ function handleSubmit() {
123
+ if (!ready) {
124
+ return;
125
+ }
126
+
127
+ var pluginDefinition = {};
128
+
129
+ if (umdPluginName && umdPluginUrl) {
130
+ pluginDefinition.name = umdPluginName;
131
+ pluginDefinition.umdUrl = umdPluginUrl;
132
+ }
133
+
134
+ if (esmPluginUrl) {
135
+ pluginDefinition.esmUrl = esmPluginUrl;
136
+ }
137
+
138
+ if (cjsPluginUrl) {
139
+ pluginDefinition.cjsUrl = cjsPluginUrl;
140
+ }
141
+
142
+ jbrowse.addPlugin(pluginDefinition);
143
+ }
144
+
145
+ function handleClose() {
146
+ setUMDPluginName('');
147
+ setUMDPluginUrl('');
148
+ setESMPluginUrl('');
149
+ setCJSPluginUrl('');
150
+ onClose();
151
+ }
152
+
153
+ return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
154
+ open: open,
155
+ onClose: handleClose
156
+ }, /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, null, "Add custom plugin", /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
157
+ size: "medium",
158
+ className: classes.closeButton,
159
+ onClick: function onClick() {
160
+ return onClose();
161
+ }
162
+ }, /*#__PURE__*/_react["default"].createElement(_Close["default"], null))), /*#__PURE__*/_react["default"].createElement("form", {
163
+ onSubmit: handleSubmit
164
+ }, /*#__PURE__*/_react["default"].createElement(_core.DialogContent, {
165
+ className: classes.dialogContent
166
+ }, /*#__PURE__*/_react["default"].createElement(_core.DialogContentText, null, "Enter the name of the plugin and its URL. The name should match what is defined in the plugin's build."), /*#__PURE__*/_react["default"].createElement(_core.TextField, {
167
+ id: "umd-name-input",
168
+ name: "umdName",
169
+ label: "Plugin name",
170
+ variant: "outlined",
171
+ value: umdPluginName,
172
+ onChange: handleChange
173
+ }), /*#__PURE__*/_react["default"].createElement(_core.TextField, {
174
+ id: "umd-url-input",
175
+ name: "umdUrl",
176
+ label: "Plugin URL",
177
+ variant: "outlined",
178
+ value: umdPluginUrl,
179
+ onChange: handleChange
180
+ }), /*#__PURE__*/_react["default"].createElement(_core.DialogContentText, {
181
+ onClick: handleOpenAdvancedOptions
182
+ }, /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
183
+ className: (0, _clsx2["default"])(classes.expand, (0, _defineProperty2["default"])({}, classes.expandOpen, advancedOptionsOpen)),
184
+ "aria-expanded": advancedOptionsOpen,
185
+ "aria-label": "show more"
186
+ }, /*#__PURE__*/_react["default"].createElement(_ExpandMore["default"], null)), "Advanced options"), /*#__PURE__*/_react["default"].createElement(_core.Collapse, {
187
+ "in": advancedOptionsOpen
188
+ }, /*#__PURE__*/_react["default"].createElement("div", {
189
+ className: classes.dialogContent
190
+ }, /*#__PURE__*/_react["default"].createElement(_core.DialogContentText, null, "The above fields assume that the plugin is built in UMD format. If your plugin is in another format, or you have additional builds you want to add (such as a CJS build for using NodeJS APIs in desktop), you can enter the URLs for those builds below."), /*#__PURE__*/_react["default"].createElement(_core.TextField, {
191
+ id: "esm-url-input",
192
+ name: "esmUrl",
193
+ label: "ESM build URL",
194
+ variant: "outlined",
195
+ value: esmPluginUrl,
196
+ onChange: handleChange
197
+ }), /*#__PURE__*/_react["default"].createElement(_core.TextField, {
198
+ id: "cjs-url-input",
199
+ name: "cjsUrl",
200
+ label: "CJS build URL",
201
+ variant: "outlined",
202
+ value: cjsPluginUrl,
203
+ onChange: handleChange
204
+ })))), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
205
+ variant: "contained",
206
+ onClick: handleClose
207
+ }, "Cancel"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
208
+ variant: "contained",
209
+ color: "primary",
210
+ onClick: handleSubmit,
211
+ disabled: !ready
212
+ }, "Submit"))));
213
+ }
214
+
215
+ var _default = (0, _mobxReact.observer)(CustomPluginForm);
216
+
217
+ exports["default"] = _default;
@@ -0,0 +1,138 @@
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 _core = require("@material-ui/core");
21
+
22
+ var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
23
+
24
+ var _Lock = _interopRequireDefault(require("@material-ui/icons/Lock"));
25
+
26
+ var _util = require("@jbrowse/core/util");
27
+
28
+ var _types = require("@jbrowse/core/util/types");
29
+
30
+ 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); }
31
+
32
+ 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; }
33
+
34
+ var useStyles = (0, _core.makeStyles)(function () {
35
+ return {
36
+ closeDialog: {
37
+ position: 'absolute',
38
+ right: 0,
39
+ top: 0
40
+ },
41
+ dialogContainer: {
42
+ margin: 15
43
+ },
44
+ lockedPluginTooltip: {
45
+ marginRight: '0.5rem'
46
+ }
47
+ };
48
+ });
49
+
50
+ function LockedPlugin() {
51
+ var classes = useStyles();
52
+ return /*#__PURE__*/_react["default"].createElement(_core.Tooltip, {
53
+ className: classes.lockedPluginTooltip,
54
+ title: "This plugin was installed by an administrator, you cannot remove it."
55
+ }, /*#__PURE__*/_react["default"].createElement(_Lock["default"], null));
56
+ }
57
+
58
+ function PluginDialog(_ref) {
59
+ var _onClose = _ref.onClose,
60
+ plugin = _ref.plugin;
61
+ var classes = useStyles();
62
+ return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
63
+ open: true,
64
+ onClose: function onClose() {
65
+ return _onClose();
66
+ }
67
+ }, /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, null, /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
68
+ className: classes.closeDialog,
69
+ "aria-label": "close-dialog",
70
+ onClick: function onClick() {
71
+ return _onClose();
72
+ }
73
+ }, /*#__PURE__*/_react["default"].createElement(_Close["default"], null))), /*#__PURE__*/_react["default"].createElement(_core.DialogContent, null, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Please confirm that you want to remove ", plugin, ". Note: if any resources in this session still use this plugin, it may cause your session to crash"), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
74
+ variant: "contained",
75
+ color: "primary",
76
+ onClick: function onClick() {
77
+ // avoid showing runtime plugin warning
78
+ window.setTimeout(function () {
79
+ _onClose(plugin);
80
+ }, 500);
81
+ }
82
+ }, "Confirm"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
83
+ variant: "contained",
84
+ color: "secondary",
85
+ onClick: function onClick() {
86
+ _onClose();
87
+ }
88
+ }, "Cancel"))));
89
+ }
90
+
91
+ function InstalledPlugin(_ref2) {
92
+ var plugin = _ref2.plugin,
93
+ model = _ref2.model,
94
+ pluginManager = _ref2.pluginManager;
95
+
96
+ var _useState = (0, _react.useState)(),
97
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
98
+ dialogPlugin = _useState2[0],
99
+ setDialogPlugin = _useState2[1];
100
+
101
+ var session = (0, _util.getSession)(model);
102
+ var _ref3 = session,
103
+ sessionPlugins = _ref3.sessionPlugins;
104
+ var isSessionPlugin = sessionPlugins === null || sessionPlugins === void 0 ? void 0 : sessionPlugins.some(function (p) {
105
+ return pluginManager.pluginMetadata[plugin.name].url === p.url;
106
+ });
107
+ var rootModel = (0, _mobxStateTree.getParent)(model, 3);
108
+ var jbrowse = rootModel.jbrowse,
109
+ adminMode = rootModel.adminMode;
110
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, dialogPlugin ? /*#__PURE__*/_react["default"].createElement(PluginDialog, {
111
+ plugin: dialogPlugin,
112
+ onClose: function onClose(name) {
113
+ if (name) {
114
+ var pluginMetadata = pluginManager.pluginMetadata[plugin.name];
115
+
116
+ if (adminMode) {
117
+ jbrowse.removePlugin(pluginMetadata);
118
+ } else if ((0, _types.isSessionWithSessionPlugins)(session)) {
119
+ session.removeSessionPlugin(pluginMetadata);
120
+ }
121
+ }
122
+
123
+ setDialogPlugin(undefined);
124
+ }
125
+ }) : null, /*#__PURE__*/_react["default"].createElement(_core.ListItem, {
126
+ key: plugin.name
127
+ }, adminMode || isSessionPlugin ? /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
128
+ "aria-label": "removePlugin",
129
+ "data-testid": "removePlugin-".concat(plugin.name),
130
+ onClick: function onClick() {
131
+ return setDialogPlugin(plugin.name);
132
+ }
133
+ }, /*#__PURE__*/_react["default"].createElement(_Close["default"], null)) : /*#__PURE__*/_react["default"].createElement(LockedPlugin, null), /*#__PURE__*/_react["default"].createElement(_core.Typography, null, plugin.name)));
134
+ }
135
+
136
+ var _default = (0, _mobxReact.observer)(InstalledPlugin);
137
+
138
+ exports["default"] = _default;