@jbrowse/plugin-data-management 2.7.2 → 2.9.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/AddTrackWidget/model.d.ts +81 -0
- package/dist/AddTrackWidget/model.js +81 -0
- package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +1 -1
- package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +11 -53
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +5 -7
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +12 -11
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.d.ts +5 -7
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +11 -8
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +1 -11
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +9 -7
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +40 -135
- package/dist/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.d.ts +12 -0
- package/dist/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.js +57 -0
- package/dist/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.d.ts +6 -0
- package/dist/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.js +42 -0
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +71 -46
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +5 -34
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +8 -3
- package/dist/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.d.ts +6 -0
- package/dist/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.js +42 -0
- package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +7 -6
- package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +9 -28
- package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.d.ts +12 -0
- package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.js +50 -0
- package/dist/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
- package/dist/HierarchicalTrackSelectorWidget/components/util.js +5 -1
- package/dist/HierarchicalTrackSelectorWidget/facetedModel.d.ts +128 -0
- package/dist/HierarchicalTrackSelectorWidget/facetedModel.js +206 -0
- package/dist/HierarchicalTrackSelectorWidget/facetedUtil.d.ts +2 -0
- package/dist/HierarchicalTrackSelectorWidget/{components/faceted/util.js → facetedUtil.js} +5 -1
- package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +17 -5
- package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.js +27 -21
- package/dist/HierarchicalTrackSelectorWidget/model.d.ts +196 -17
- package/dist/HierarchicalTrackSelectorWidget/model.js +178 -23
- package/dist/ucsc-trackhub/doConnect.d.ts +1 -0
- package/dist/ucsc-trackhub/doConnect.js +131 -0
- package/dist/ucsc-trackhub/model.d.ts +19 -2
- package/dist/ucsc-trackhub/model.js +16 -71
- package/dist/ucsc-trackhub/ucscTrackHub.d.ts +161 -4
- package/dist/ucsc-trackhub/ucscTrackHub.js +49 -166
- package/esm/AddTrackWidget/model.d.ts +81 -0
- package/esm/AddTrackWidget/model.js +81 -0
- package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +1 -1
- package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +12 -31
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +5 -7
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +13 -11
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.d.ts +5 -7
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +12 -8
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +1 -11
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +9 -7
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +41 -113
- package/esm/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.d.ts +12 -0
- package/esm/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.js +29 -0
- package/esm/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.d.ts +6 -0
- package/esm/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.js +37 -0
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +71 -46
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +6 -12
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +8 -3
- package/esm/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.d.ts +6 -0
- package/esm/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.js +37 -0
- package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +7 -6
- package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +8 -27
- package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.d.ts +12 -0
- package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.js +45 -0
- package/esm/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
- package/esm/HierarchicalTrackSelectorWidget/components/util.js +5 -1
- package/esm/HierarchicalTrackSelectorWidget/facetedModel.d.ts +128 -0
- package/esm/HierarchicalTrackSelectorWidget/facetedModel.js +202 -0
- package/esm/HierarchicalTrackSelectorWidget/facetedUtil.d.ts +2 -0
- package/esm/HierarchicalTrackSelectorWidget/{components/faceted/util.js → facetedUtil.js} +3 -0
- package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +17 -5
- package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.js +27 -21
- package/esm/HierarchicalTrackSelectorWidget/model.d.ts +196 -17
- package/esm/HierarchicalTrackSelectorWidget/model.js +180 -25
- package/esm/ucsc-trackhub/doConnect.d.ts +1 -0
- package/esm/ucsc-trackhub/doConnect.js +127 -0
- package/esm/ucsc-trackhub/model.d.ts +19 -2
- package/esm/ucsc-trackhub/model.js +17 -72
- package/esm/ucsc-trackhub/ucscTrackHub.d.ts +161 -4
- package/esm/ucsc-trackhub/ucscTrackHub.js +48 -141
- package/package.json +3 -3
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/util.d.ts +0 -1
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/util.d.ts +0 -1
|
@@ -1,11 +1,30 @@
|
|
|
1
|
-
import { types } from 'mobx-state-tree';
|
|
1
|
+
import { types, addDisposer } from 'mobx-state-tree';
|
|
2
|
+
import { autorun } from 'mobx';
|
|
2
3
|
import { getConf, readConfObject, } from '@jbrowse/core/configuration';
|
|
3
|
-
import { dedupe, getSession, notEmpty } from '@jbrowse/core/util';
|
|
4
|
+
import { dedupe, getSession, localStorageGetItem, localStorageSetItem, notEmpty, } from '@jbrowse/core/util';
|
|
4
5
|
import { ElementId } from '@jbrowse/core/util/types/mst';
|
|
5
6
|
// locals
|
|
6
7
|
import { filterTracks } from './filterTracks';
|
|
7
8
|
import { generateHierarchy } from './generateHierarchy';
|
|
8
9
|
import { findSubCategories, findTopLevelCategories } from './util';
|
|
10
|
+
import { facetedStateTreeF } from './facetedModel';
|
|
11
|
+
// for settings that are config dependent
|
|
12
|
+
function postNoConfigF() {
|
|
13
|
+
return typeof window !== undefined
|
|
14
|
+
? [window.location.host, window.location.pathname].join('-')
|
|
15
|
+
: 'empty';
|
|
16
|
+
}
|
|
17
|
+
// for settings that are not config dependent
|
|
18
|
+
function postF() {
|
|
19
|
+
return typeof window !== undefined
|
|
20
|
+
? [
|
|
21
|
+
postNoConfigF(),
|
|
22
|
+
new URLSearchParams(window.location.search).get('config'),
|
|
23
|
+
].join('-')
|
|
24
|
+
: 'empty';
|
|
25
|
+
}
|
|
26
|
+
const lsKeyFavoritesF = () => `favoriteTracks-${postF()}}`;
|
|
27
|
+
const lsKeyRecentlyUsedF = () => `recentlyUsedTracks-${postF()}}`;
|
|
9
28
|
/**
|
|
10
29
|
* #stateModel HierarchicalTrackSelectorWidget
|
|
11
30
|
*/
|
|
@@ -40,10 +59,48 @@ export default function stateTreeFactory(pluginManager) {
|
|
|
40
59
|
* #property
|
|
41
60
|
*/
|
|
42
61
|
view: types.safeReference(pluginManager.pluggableMstType('view', 'stateModel')),
|
|
62
|
+
/**
|
|
63
|
+
* #property
|
|
64
|
+
* this is removed in postProcessSnapshot, so is generally only loaded
|
|
65
|
+
* from localstorage
|
|
66
|
+
*/
|
|
67
|
+
favorites: types.optional(types.array(types.string), () => JSON.parse(localStorageGetItem(lsKeyFavoritesF()) || '[]')),
|
|
68
|
+
/**
|
|
69
|
+
* #property
|
|
70
|
+
* this is removed in postProcessSnapshot, so is generally only loaded
|
|
71
|
+
* from localstorage
|
|
72
|
+
*/
|
|
73
|
+
recentlyUsed: types.optional(types.array(types.string), () => JSON.parse(localStorageGetItem(lsKeyRecentlyUsedF()) || '[]')),
|
|
74
|
+
/**
|
|
75
|
+
* #property
|
|
76
|
+
*/
|
|
77
|
+
faceted: types.optional(facetedStateTreeF(), {}),
|
|
43
78
|
})
|
|
44
79
|
.volatile(() => ({
|
|
45
80
|
selection: [],
|
|
46
81
|
filterText: '',
|
|
82
|
+
recentlyUsedCounter: 0,
|
|
83
|
+
favoritesCounter: 0,
|
|
84
|
+
}))
|
|
85
|
+
.views(self => ({
|
|
86
|
+
/**
|
|
87
|
+
* #getter
|
|
88
|
+
*/
|
|
89
|
+
get selectionSet() {
|
|
90
|
+
return new Set(self.selection);
|
|
91
|
+
},
|
|
92
|
+
/**
|
|
93
|
+
* #getter
|
|
94
|
+
*/
|
|
95
|
+
get favoritesSet() {
|
|
96
|
+
return new Set(self.favorites);
|
|
97
|
+
},
|
|
98
|
+
/**
|
|
99
|
+
* #getter
|
|
100
|
+
*/
|
|
101
|
+
get recentlyUsedSet() {
|
|
102
|
+
return new Set(self.recentlyUsed);
|
|
103
|
+
},
|
|
47
104
|
}))
|
|
48
105
|
.actions(self => ({
|
|
49
106
|
/**
|
|
@@ -74,7 +131,8 @@ export default function stateTreeFactory(pluginManager) {
|
|
|
74
131
|
* #action
|
|
75
132
|
*/
|
|
76
133
|
removeFromSelection(elt) {
|
|
77
|
-
|
|
134
|
+
const s = new Set(elt);
|
|
135
|
+
self.selection = self.selection.filter(f => !s.has(f));
|
|
78
136
|
},
|
|
79
137
|
/**
|
|
80
138
|
* #action
|
|
@@ -82,6 +140,55 @@ export default function stateTreeFactory(pluginManager) {
|
|
|
82
140
|
clearSelection() {
|
|
83
141
|
self.selection = [];
|
|
84
142
|
},
|
|
143
|
+
/**
|
|
144
|
+
* #action
|
|
145
|
+
*/
|
|
146
|
+
addToFavorites(trackId) {
|
|
147
|
+
self.favoritesCounter += 1;
|
|
148
|
+
self.favorites.push(trackId);
|
|
149
|
+
},
|
|
150
|
+
/**
|
|
151
|
+
* #action
|
|
152
|
+
*/
|
|
153
|
+
removeFromFavorites(trackId) {
|
|
154
|
+
self.favorites.remove(trackId);
|
|
155
|
+
},
|
|
156
|
+
/**
|
|
157
|
+
* #action
|
|
158
|
+
*/
|
|
159
|
+
clearFavorites() {
|
|
160
|
+
self.favorites.clear();
|
|
161
|
+
},
|
|
162
|
+
/**
|
|
163
|
+
* #action
|
|
164
|
+
*/
|
|
165
|
+
setRecentlyUsedCounter(val) {
|
|
166
|
+
self.recentlyUsedCounter = val;
|
|
167
|
+
},
|
|
168
|
+
/**
|
|
169
|
+
* #action
|
|
170
|
+
*/
|
|
171
|
+
setFavoritesCounter(val) {
|
|
172
|
+
self.favoritesCounter = val;
|
|
173
|
+
},
|
|
174
|
+
/**
|
|
175
|
+
* #action
|
|
176
|
+
*/
|
|
177
|
+
addToRecentlyUsed(id) {
|
|
178
|
+
self.recentlyUsedCounter += 1;
|
|
179
|
+
if (!self.recentlyUsed.includes(id)) {
|
|
180
|
+
if (self.recentlyUsed.length >= 10) {
|
|
181
|
+
self.recentlyUsed.shift();
|
|
182
|
+
}
|
|
183
|
+
self.recentlyUsed.push(id);
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
/**
|
|
187
|
+
* #action
|
|
188
|
+
*/
|
|
189
|
+
clearRecentlyUsed() {
|
|
190
|
+
self.recentlyUsed.clear();
|
|
191
|
+
},
|
|
85
192
|
/**
|
|
86
193
|
* #action
|
|
87
194
|
*/
|
|
@@ -120,6 +227,24 @@ export default function stateTreeFactory(pluginManager) {
|
|
|
120
227
|
},
|
|
121
228
|
}))
|
|
122
229
|
.views(self => ({
|
|
230
|
+
/**
|
|
231
|
+
* #method
|
|
232
|
+
*/
|
|
233
|
+
isSelected(track) {
|
|
234
|
+
return self.selectionSet.has(track);
|
|
235
|
+
},
|
|
236
|
+
/**
|
|
237
|
+
* #method
|
|
238
|
+
*/
|
|
239
|
+
isFavorite(trackId) {
|
|
240
|
+
return self.favoritesSet.has(trackId);
|
|
241
|
+
},
|
|
242
|
+
/**
|
|
243
|
+
* #method
|
|
244
|
+
*/
|
|
245
|
+
isRecentlyUsed(trackId) {
|
|
246
|
+
return self.recentlyUsedSet.has(trackId);
|
|
247
|
+
},
|
|
123
248
|
/**
|
|
124
249
|
* #method
|
|
125
250
|
*/
|
|
@@ -163,47 +288,58 @@ export default function stateTreeFactory(pluginManager) {
|
|
|
163
288
|
var _a;
|
|
164
289
|
return ((_a = self.sortCategories) !== null && _a !== void 0 ? _a : getConf(getSession(self), ['hierarchical', 'sort', 'categories']));
|
|
165
290
|
},
|
|
166
|
-
/**
|
|
167
|
-
* #method
|
|
168
|
-
* filter out tracks that don't match the current display types
|
|
169
|
-
*/
|
|
170
|
-
connectionTrackConfigurations(connection) {
|
|
171
|
-
return filterTracks(connection.tracks, self);
|
|
172
|
-
},
|
|
173
291
|
/**
|
|
174
292
|
* #getter
|
|
175
293
|
* filter out tracks that don't match the current assembly/display types
|
|
176
294
|
*/
|
|
177
|
-
get
|
|
295
|
+
get configAndSessionTrackConfigurations() {
|
|
178
296
|
return [
|
|
179
297
|
...self.assemblyNames.map(a => self.getRefSeqTrackConf(a)),
|
|
180
298
|
...filterTracks(getSession(self).tracks, self),
|
|
181
299
|
].filter(notEmpty);
|
|
182
300
|
},
|
|
301
|
+
get allTrackConfigurations() {
|
|
302
|
+
const { connectionInstances = [] } = getSession(self);
|
|
303
|
+
return [
|
|
304
|
+
...this.configAndSessionTrackConfigurations,
|
|
305
|
+
...connectionInstances === null || connectionInstances === void 0 ? void 0 : connectionInstances.flatMap(c => c.tracks),
|
|
306
|
+
];
|
|
307
|
+
},
|
|
183
308
|
}))
|
|
184
309
|
.views(self => ({
|
|
185
310
|
/**
|
|
186
|
-
* #
|
|
311
|
+
* #getter
|
|
312
|
+
* filters out tracks that are not in the favorites group
|
|
313
|
+
*/
|
|
314
|
+
get favoriteTracks() {
|
|
315
|
+
return self.allTrackConfigurations.filter(t => self.favoritesSet.has(t.trackId));
|
|
316
|
+
},
|
|
317
|
+
/**
|
|
318
|
+
* #getter
|
|
319
|
+
* filters out tracks that are not in the recently used group
|
|
187
320
|
*/
|
|
188
|
-
|
|
189
|
-
return
|
|
190
|
-
model: self,
|
|
191
|
-
trackConfs: self.connectionTrackConfigurations(connection),
|
|
192
|
-
extra: connection.name,
|
|
193
|
-
});
|
|
321
|
+
get recentlyUsedTracks() {
|
|
322
|
+
return self.allTrackConfigurations.filter(t => self.recentlyUsedSet.has(t.trackId));
|
|
194
323
|
},
|
|
195
324
|
}))
|
|
196
325
|
.views(self => ({
|
|
326
|
+
/**
|
|
327
|
+
* #getter
|
|
328
|
+
*/
|
|
197
329
|
get allTracks() {
|
|
198
330
|
const { connectionInstances = [] } = getSession(self);
|
|
199
331
|
return [
|
|
200
332
|
{
|
|
201
333
|
group: 'Tracks',
|
|
202
|
-
tracks: self.
|
|
334
|
+
tracks: self.configAndSessionTrackConfigurations,
|
|
335
|
+
noCategories: false,
|
|
336
|
+
menuItems: [],
|
|
203
337
|
},
|
|
204
338
|
...connectionInstances.flatMap(c => ({
|
|
205
339
|
group: getConf(c, 'name'),
|
|
206
340
|
tracks: c.tracks,
|
|
341
|
+
noCategories: false,
|
|
342
|
+
menuItems: [],
|
|
207
343
|
})),
|
|
208
344
|
];
|
|
209
345
|
},
|
|
@@ -216,17 +352,21 @@ export default function stateTreeFactory(pluginManager) {
|
|
|
216
352
|
return {
|
|
217
353
|
name: 'Root',
|
|
218
354
|
id: 'Root',
|
|
219
|
-
|
|
220
|
-
|
|
355
|
+
isOpenByDefault: true,
|
|
356
|
+
type: 'category',
|
|
357
|
+
children: self.allTracks.map(s => ({
|
|
221
358
|
name: s.group,
|
|
222
359
|
id: s.group,
|
|
360
|
+
type: 'category',
|
|
361
|
+
isOpenByDefault: !self.collapsed.get(s.group),
|
|
362
|
+
menuItems: s.menuItems,
|
|
223
363
|
children: generateHierarchy({
|
|
224
364
|
model: self,
|
|
225
365
|
trackConfs: s.tracks,
|
|
366
|
+
extra: s.group,
|
|
367
|
+
noCategories: s.noCategories,
|
|
226
368
|
}),
|
|
227
|
-
}))
|
|
228
|
-
// always keep the Tracks entry at idx 0
|
|
229
|
-
.filter((f, idx) => idx === 0 || !!f.children.length),
|
|
369
|
+
})),
|
|
230
370
|
};
|
|
231
371
|
},
|
|
232
372
|
}))
|
|
@@ -286,8 +426,23 @@ export default function stateTreeFactory(pluginManager) {
|
|
|
286
426
|
},
|
|
287
427
|
}))
|
|
288
428
|
.views(self => ({
|
|
429
|
+
/**
|
|
430
|
+
* #getter
|
|
431
|
+
*/
|
|
289
432
|
get hasAnySubcategories() {
|
|
290
433
|
return self.allTracks.some(group => group.tracks.some(t => { var _a; return ((_a = readConfObject(t, 'category')) === null || _a === void 0 ? void 0 : _a.length) > 1; }));
|
|
291
434
|
},
|
|
292
|
-
}))
|
|
435
|
+
}))
|
|
436
|
+
.actions(self => ({
|
|
437
|
+
afterAttach() {
|
|
438
|
+
addDisposer(self, autorun(() => {
|
|
439
|
+
localStorageSetItem(lsKeyFavoritesF(), JSON.stringify(self.favorites));
|
|
440
|
+
localStorageSetItem(lsKeyRecentlyUsedF(), JSON.stringify(self.recentlyUsed));
|
|
441
|
+
}));
|
|
442
|
+
},
|
|
443
|
+
}))
|
|
444
|
+
.postProcessSnapshot(snap => {
|
|
445
|
+
const { favorites: _, recentlyUsed: __, ...rest } = snap;
|
|
446
|
+
return rest;
|
|
447
|
+
});
|
|
293
448
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function doConnect(self: any): Promise<void>;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { HubFile, SingleFileHub } from '@gmod/ucsc-hub';
|
|
2
|
+
import { generateTracks, fetchGenomesFile, fetchTrackDbFile, } from './ucscTrackHub';
|
|
3
|
+
import { getConf } from '@jbrowse/core/configuration';
|
|
4
|
+
import { getSession } from '@jbrowse/core/util';
|
|
5
|
+
import { openLocation } from '@jbrowse/core/util/io';
|
|
6
|
+
import { nanoid } from '@jbrowse/core/util/nanoid';
|
|
7
|
+
function resolve(uri, baseUri) {
|
|
8
|
+
return new URL(uri, baseUri).href;
|
|
9
|
+
}
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
+
export async function doConnect(self) {
|
|
12
|
+
var _a;
|
|
13
|
+
const session = getSession(self);
|
|
14
|
+
const notLoadedAssemblies = [];
|
|
15
|
+
try {
|
|
16
|
+
const hubFileLocation = getConf(self, 'hubTxtLocation');
|
|
17
|
+
const hubFileText = await openLocation(hubFileLocation).readFile('utf8');
|
|
18
|
+
// @ts-expect-error
|
|
19
|
+
const hubUri = resolve(hubFileLocation.uri, hubFileLocation.baseUri);
|
|
20
|
+
const { assemblyManager } = session;
|
|
21
|
+
if (hubFileText.includes('useOneFile on')) {
|
|
22
|
+
const hub = new SingleFileHub(hubFileText);
|
|
23
|
+
const { genome, tracks } = hub;
|
|
24
|
+
const genomeName = genome.name;
|
|
25
|
+
const asm = assemblyManager.get(genomeName);
|
|
26
|
+
if (!asm) {
|
|
27
|
+
// @ts-expect-error
|
|
28
|
+
session.addSessionAssembly({
|
|
29
|
+
name: genomeName,
|
|
30
|
+
sequence: {
|
|
31
|
+
type: 'ReferenceSequenceTrack',
|
|
32
|
+
trackId: `${genomeName}-${nanoid()}`,
|
|
33
|
+
adapter: {
|
|
34
|
+
type: 'TwoBitAdapter',
|
|
35
|
+
twoBitLocation: {
|
|
36
|
+
uri: resolve(genome.data.twoBitPath, hubUri),
|
|
37
|
+
},
|
|
38
|
+
chromSizesLocation: {
|
|
39
|
+
uri: resolve(genome.data.chromSizes, hubUri),
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const asm2 = assemblyManager.get(genomeName);
|
|
46
|
+
const sequenceAdapter = getConf(asm2, ['sequence', 'adapter']);
|
|
47
|
+
const tracksNew = generateTracks({
|
|
48
|
+
trackDb: tracks,
|
|
49
|
+
trackDbLoc: hubFileLocation,
|
|
50
|
+
assemblyName: genomeName,
|
|
51
|
+
sequenceAdapter,
|
|
52
|
+
});
|
|
53
|
+
self.addTrackConfs(tracksNew);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const hubFile = new HubFile(hubFileText);
|
|
57
|
+
const genomeFile = hubFile.data.genomesFile;
|
|
58
|
+
if (!genomeFile) {
|
|
59
|
+
throw new Error('genomesFile not found on hub');
|
|
60
|
+
}
|
|
61
|
+
// @ts-expect-error
|
|
62
|
+
const hubUri = resolve(hubFileLocation.uri, hubFileLocation.baseUri);
|
|
63
|
+
const genomesFileLocation = hubUri
|
|
64
|
+
? {
|
|
65
|
+
uri: resolve(genomeFile, hubUri),
|
|
66
|
+
locationType: 'UriLocation',
|
|
67
|
+
}
|
|
68
|
+
: {
|
|
69
|
+
localPath: genomeFile,
|
|
70
|
+
locationType: 'LocalPathLocation',
|
|
71
|
+
};
|
|
72
|
+
const genomesFile = await fetchGenomesFile(genomesFileLocation);
|
|
73
|
+
const map = {};
|
|
74
|
+
for (const [genomeName, genome] of Object.entries(genomesFile.data)) {
|
|
75
|
+
const assemblyNames = getConf(self, 'assemblyNames');
|
|
76
|
+
if (assemblyNames.length > 0 && !assemblyNames.includes(genomeName)) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const asm = assemblyManager.get(genomeName);
|
|
80
|
+
if (!asm) {
|
|
81
|
+
notLoadedAssemblies.push(genomeName);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
// @ts-expect-error
|
|
85
|
+
const db = genome.data.trackDb;
|
|
86
|
+
if (!db) {
|
|
87
|
+
throw new Error('genomesFile not found on hub');
|
|
88
|
+
}
|
|
89
|
+
const base = new URL(genomeFile, hubUri);
|
|
90
|
+
const loc = hubUri
|
|
91
|
+
? {
|
|
92
|
+
uri: new URL(db, base).href,
|
|
93
|
+
locationType: 'UriLocation',
|
|
94
|
+
}
|
|
95
|
+
: {
|
|
96
|
+
localPath: db,
|
|
97
|
+
locationType: 'LocalPathLocation',
|
|
98
|
+
};
|
|
99
|
+
const trackDb = await fetchTrackDbFile(loc);
|
|
100
|
+
const sequenceAdapter = getConf(asm, ['sequence', 'adapter']);
|
|
101
|
+
const tracks = generateTracks({
|
|
102
|
+
trackDb,
|
|
103
|
+
trackDbLoc: loc,
|
|
104
|
+
assemblyName: genomeName,
|
|
105
|
+
sequenceAdapter,
|
|
106
|
+
});
|
|
107
|
+
self.addTrackConfs(tracks);
|
|
108
|
+
map[genomeName] = tracks.length;
|
|
109
|
+
}
|
|
110
|
+
const loadedAssemblies = Object.entries(map);
|
|
111
|
+
const str1 = loadedAssemblies.length
|
|
112
|
+
? `Loaded data from these assemblies: ${loadedAssemblies
|
|
113
|
+
.map(([key, val]) => `${key} (${val} tracks)`)
|
|
114
|
+
.join(', ')}`
|
|
115
|
+
: '';
|
|
116
|
+
const str2 = notLoadedAssemblies.length
|
|
117
|
+
? `Skipped data from these assemblies: ${notLoadedAssemblies.join(', ')}`
|
|
118
|
+
: '';
|
|
119
|
+
session.notify([str1, str2].filter(f => !!f).join('. '), 'success');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
console.error(e);
|
|
124
|
+
session.notify(`${getConf(self, 'name')}: "${e}"`, 'error');
|
|
125
|
+
(_a = session.breakConnection) === null || _a === void 0 ? void 0 : _a.call(session, self.configuration);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import PluginManager from '@jbrowse/core/PluginManager';
|
|
2
|
+
/**
|
|
3
|
+
* #stateModel UCSCTrackHubConnection
|
|
4
|
+
* extends BaseConnectionModel
|
|
5
|
+
*/
|
|
2
6
|
export default function UCSCTrackHubConnection(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
|
|
3
7
|
name: import("mobx-state-tree").ISimpleType<string>;
|
|
4
8
|
tracks: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyModelType>;
|
|
@@ -10,11 +14,16 @@ export default function UCSCTrackHubConnection(pluginManager: PluginManager): im
|
|
|
10
14
|
};
|
|
11
15
|
assemblyNames: {
|
|
12
16
|
type: string;
|
|
13
|
-
defaultValue: never[];
|
|
17
|
+
defaultValue: never[]; /**
|
|
18
|
+
* #action
|
|
19
|
+
*/
|
|
14
20
|
description: string;
|
|
15
21
|
};
|
|
16
22
|
}, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, "connectionId">>;
|
|
17
23
|
} & {
|
|
24
|
+
/**
|
|
25
|
+
* #property
|
|
26
|
+
*/
|
|
18
27
|
configuration: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
|
|
19
28
|
hubTxtLocation: {
|
|
20
29
|
type: string;
|
|
@@ -25,7 +34,9 @@ export default function UCSCTrackHubConnection(pluginManager: PluginManager): im
|
|
|
25
34
|
description: string;
|
|
26
35
|
};
|
|
27
36
|
assemblyNames: {
|
|
28
|
-
type: string;
|
|
37
|
+
type: string; /**
|
|
38
|
+
* #property
|
|
39
|
+
*/
|
|
29
40
|
defaultValue: never[];
|
|
30
41
|
description: string;
|
|
31
42
|
};
|
|
@@ -41,6 +52,9 @@ export default function UCSCTrackHubConnection(pluginManager: PluginManager): im
|
|
|
41
52
|
description: string;
|
|
42
53
|
};
|
|
43
54
|
}, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, "connectionId">>, undefined>>;
|
|
55
|
+
/**
|
|
56
|
+
* #property
|
|
57
|
+
*/
|
|
44
58
|
type: import("mobx-state-tree").ISimpleType<"UCSCTrackHubConnection">;
|
|
45
59
|
}, {
|
|
46
60
|
connect(_arg: {
|
|
@@ -67,5 +81,8 @@ export default function UCSCTrackHubConnection(pluginManager: PluginManager): im
|
|
|
67
81
|
} & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>)[]): import("mobx-state-tree").IMSTArray<import("mobx-state-tree").IAnyModelType> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyModelType>>;
|
|
68
82
|
clear(): void;
|
|
69
83
|
} & {
|
|
84
|
+
/**
|
|
85
|
+
* #action
|
|
86
|
+
*/
|
|
70
87
|
connect(): Promise<void>;
|
|
71
88
|
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
|
|
@@ -1,87 +1,32 @@
|
|
|
1
1
|
import { BaseConnectionModelFactory } from '@jbrowse/core/pluggableElementTypes/models';
|
|
2
|
-
import { ConfigurationReference
|
|
3
|
-
import { getSession } from '@jbrowse/core/util';
|
|
2
|
+
import { ConfigurationReference } from '@jbrowse/core/configuration';
|
|
4
3
|
import { types } from 'mobx-state-tree';
|
|
5
4
|
// locals
|
|
6
5
|
import configSchema from './configSchema';
|
|
6
|
+
/**
|
|
7
|
+
* #stateModel UCSCTrackHubConnection
|
|
8
|
+
* extends BaseConnectionModel
|
|
9
|
+
*/
|
|
7
10
|
export default function UCSCTrackHubConnection(pluginManager) {
|
|
8
11
|
return types
|
|
9
12
|
.compose('UCSCTrackHubConnection', BaseConnectionModelFactory(pluginManager), types.model({
|
|
13
|
+
/**
|
|
14
|
+
* #property
|
|
15
|
+
*/
|
|
10
16
|
configuration: ConfigurationReference(configSchema),
|
|
17
|
+
/**
|
|
18
|
+
* #property
|
|
19
|
+
*/
|
|
11
20
|
type: types.literal('UCSCTrackHubConnection'),
|
|
12
21
|
}))
|
|
13
22
|
.actions(self => ({
|
|
23
|
+
/**
|
|
24
|
+
* #action
|
|
25
|
+
*/
|
|
14
26
|
async connect() {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
const hubFileLocation = getConf(self, 'hubTxtLocation');
|
|
20
|
-
const { generateTracks, fetchGenomesFile, fetchTrackDbFile, fetchHubFile, } = await import('./ucscTrackHub');
|
|
21
|
-
const hubFile = await fetchHubFile(hubFileLocation);
|
|
22
|
-
const genomeFile = hubFile.get('genomesFile');
|
|
23
|
-
if (!genomeFile) {
|
|
24
|
-
throw new Error('genomesFile not found on hub');
|
|
25
|
-
}
|
|
26
|
-
const hubUri = new URL(hubFileLocation.uri, hubFileLocation.baseUri);
|
|
27
|
-
const genomesFileLocation = hubUri
|
|
28
|
-
? {
|
|
29
|
-
uri: new URL(genomeFile, hubUri).href,
|
|
30
|
-
locationType: 'UriLocation',
|
|
31
|
-
}
|
|
32
|
-
: {
|
|
33
|
-
localPath: genomeFile,
|
|
34
|
-
locationType: 'LocalPathLocation',
|
|
35
|
-
};
|
|
36
|
-
const genomesFile = await fetchGenomesFile(genomesFileLocation);
|
|
37
|
-
const map = {};
|
|
38
|
-
for (const [genomeName, genome] of genomesFile) {
|
|
39
|
-
const assemblyNames = getConf(self, 'assemblyNames');
|
|
40
|
-
if (assemblyNames.length > 0 &&
|
|
41
|
-
!assemblyNames.includes(genomeName)) {
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
const conf = (_a = session.assemblyManager.get(genomeName)) === null || _a === void 0 ? void 0 : _a.configuration;
|
|
45
|
-
if (!conf) {
|
|
46
|
-
notLoadedAssemblies.push(genomeName);
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
const db = genome.get('trackDb');
|
|
50
|
-
if (!db) {
|
|
51
|
-
throw new Error('genomesFile not found on hub');
|
|
52
|
-
}
|
|
53
|
-
const base = new URL(genomeFile, hubUri);
|
|
54
|
-
const loc = hubUri
|
|
55
|
-
? {
|
|
56
|
-
uri: new URL(db, base).href,
|
|
57
|
-
locationType: 'UriLocation',
|
|
58
|
-
}
|
|
59
|
-
: {
|
|
60
|
-
localPath: db,
|
|
61
|
-
locationType: 'LocalPathLocation',
|
|
62
|
-
};
|
|
63
|
-
const trackDb = await fetchTrackDbFile(loc);
|
|
64
|
-
const seqAdapter = readConfObject(conf, ['sequence', 'adapter']);
|
|
65
|
-
const tracks = generateTracks(trackDb, loc, genomeName, seqAdapter);
|
|
66
|
-
self.addTrackConfs(tracks);
|
|
67
|
-
map[genomeName] = tracks.length;
|
|
68
|
-
}
|
|
69
|
-
const loadedAssemblies = Object.entries(map);
|
|
70
|
-
const str1 = loadedAssemblies.length
|
|
71
|
-
? `Loaded data from these assemblies: ${loadedAssemblies
|
|
72
|
-
.map(([key, val]) => `${key} (${val} tracks)`)
|
|
73
|
-
.join(', ')}`
|
|
74
|
-
: '';
|
|
75
|
-
const str2 = notLoadedAssemblies.length
|
|
76
|
-
? `Skipped data from these assemblies: ${notLoadedAssemblies.join(', ')}`
|
|
77
|
-
: '';
|
|
78
|
-
session.notify([str1, str2].filter(f => !!f).join('. '), 'success');
|
|
79
|
-
}
|
|
80
|
-
catch (e) {
|
|
81
|
-
console.error(e);
|
|
82
|
-
session.notify(`There was a problem connecting to the UCSC Track Hub "${self.configuration.name}". Please make sure you have entered a valid hub.txt file. The error that was thrown is: "${e}"`, 'error');
|
|
83
|
-
(_b = session.breakConnection) === null || _b === void 0 ? void 0 : _b.call(session, self.configuration);
|
|
84
|
-
}
|
|
27
|
+
const { doConnect } = await import('./doConnect');
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
29
|
+
doConnect(self);
|
|
85
30
|
},
|
|
86
31
|
}));
|
|
87
32
|
}
|