@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.
Files changed (83) hide show
  1. package/dist/AddTrackWidget/model.d.ts +81 -0
  2. package/dist/AddTrackWidget/model.js +81 -0
  3. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +1 -1
  4. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +11 -53
  5. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +5 -7
  6. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +12 -11
  7. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.d.ts +5 -7
  8. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +11 -8
  9. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +1 -11
  10. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +9 -7
  11. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +40 -135
  12. package/dist/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.d.ts +12 -0
  13. package/dist/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.js +57 -0
  14. package/dist/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.d.ts +6 -0
  15. package/dist/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.js +42 -0
  16. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +71 -46
  17. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +5 -34
  18. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +8 -3
  19. package/dist/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.d.ts +6 -0
  20. package/dist/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.js +42 -0
  21. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +7 -6
  22. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +9 -28
  23. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.d.ts +12 -0
  24. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.js +50 -0
  25. package/dist/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
  26. package/dist/HierarchicalTrackSelectorWidget/components/util.js +5 -1
  27. package/dist/HierarchicalTrackSelectorWidget/facetedModel.d.ts +128 -0
  28. package/dist/HierarchicalTrackSelectorWidget/facetedModel.js +206 -0
  29. package/dist/HierarchicalTrackSelectorWidget/facetedUtil.d.ts +2 -0
  30. package/dist/HierarchicalTrackSelectorWidget/{components/faceted/util.js → facetedUtil.js} +5 -1
  31. package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +17 -5
  32. package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.js +27 -21
  33. package/dist/HierarchicalTrackSelectorWidget/model.d.ts +196 -17
  34. package/dist/HierarchicalTrackSelectorWidget/model.js +178 -23
  35. package/dist/ucsc-trackhub/doConnect.d.ts +1 -0
  36. package/dist/ucsc-trackhub/doConnect.js +131 -0
  37. package/dist/ucsc-trackhub/model.d.ts +19 -2
  38. package/dist/ucsc-trackhub/model.js +16 -71
  39. package/dist/ucsc-trackhub/ucscTrackHub.d.ts +161 -4
  40. package/dist/ucsc-trackhub/ucscTrackHub.js +49 -166
  41. package/esm/AddTrackWidget/model.d.ts +81 -0
  42. package/esm/AddTrackWidget/model.js +81 -0
  43. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +1 -1
  44. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +12 -31
  45. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +5 -7
  46. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +13 -11
  47. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.d.ts +5 -7
  48. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +12 -8
  49. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +1 -11
  50. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +9 -7
  51. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +41 -113
  52. package/esm/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.d.ts +12 -0
  53. package/esm/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.js +29 -0
  54. package/esm/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.d.ts +6 -0
  55. package/esm/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.js +37 -0
  56. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +71 -46
  57. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +6 -12
  58. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +8 -3
  59. package/esm/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.d.ts +6 -0
  60. package/esm/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.js +37 -0
  61. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +7 -6
  62. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +8 -27
  63. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.d.ts +12 -0
  64. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.js +45 -0
  65. package/esm/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
  66. package/esm/HierarchicalTrackSelectorWidget/components/util.js +5 -1
  67. package/esm/HierarchicalTrackSelectorWidget/facetedModel.d.ts +128 -0
  68. package/esm/HierarchicalTrackSelectorWidget/facetedModel.js +202 -0
  69. package/esm/HierarchicalTrackSelectorWidget/facetedUtil.d.ts +2 -0
  70. package/esm/HierarchicalTrackSelectorWidget/{components/faceted/util.js → facetedUtil.js} +3 -0
  71. package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +17 -5
  72. package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.js +27 -21
  73. package/esm/HierarchicalTrackSelectorWidget/model.d.ts +196 -17
  74. package/esm/HierarchicalTrackSelectorWidget/model.js +180 -25
  75. package/esm/ucsc-trackhub/doConnect.d.ts +1 -0
  76. package/esm/ucsc-trackhub/doConnect.js +127 -0
  77. package/esm/ucsc-trackhub/model.d.ts +19 -2
  78. package/esm/ucsc-trackhub/model.js +17 -72
  79. package/esm/ucsc-trackhub/ucscTrackHub.d.ts +161 -4
  80. package/esm/ucsc-trackhub/ucscTrackHub.js +48 -141
  81. package/package.json +3 -3
  82. package/dist/HierarchicalTrackSelectorWidget/components/faceted/util.d.ts +0 -1
  83. 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
- self.selection = self.selection.filter(f => !elt.includes(f));
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 trackConfigurations() {
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
- * #method
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
- connectionHierarchy(connection) {
189
- return generateHierarchy({
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.trackConfigurations,
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
- children: self.allTracks
220
- .map(s => ({
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, readConfObject, getConf, } from '@jbrowse/core/configuration';
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
- var _a, _b;
16
- const session = getSession(self);
17
- const notLoadedAssemblies = [];
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
  }