@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
@@ -40,7 +40,7 @@ function sortConfs(confs, sortNames, sortCategories) {
40
40
  }
41
41
  return ret.map(a => a[0]);
42
42
  }
43
- function generateHierarchy({ model, trackConfs, extra, }) {
43
+ function generateHierarchy({ model, trackConfs, extra, noCategories, menuItems, }) {
44
44
  const hierarchy = { children: [] };
45
45
  const { collapsed, filterText, activeSortTrackNames, activeSortCategories, view, } = model;
46
46
  if (!view) {
@@ -59,25 +59,29 @@ function generateHierarchy({ model, trackConfs, extra, }) {
59
59
  categories.unshift(' Session tracks');
60
60
  }
61
61
  let currLevel = hierarchy;
62
- // find existing category to put track into or create it
63
- for (let i = 0; i < categories.length; i++) {
64
- const category = categories[i];
65
- const ret = currLevel.children.find(c => c.name === category);
66
- const id = [extra, categories.slice(0, i + 1).join(',')]
67
- .filter(f => !!f)
68
- .join('-');
69
- if (!ret) {
70
- const n = {
71
- children: [],
72
- name: category,
73
- id,
74
- isOpenByDefault: !collapsed.get(id),
75
- };
76
- currLevel.children.push(n);
77
- currLevel = n;
78
- }
79
- else {
80
- currLevel = ret;
62
+ if (!noCategories) {
63
+ // find existing category to put track into or create it
64
+ for (let i = 0; i < categories.length; i++) {
65
+ const category = categories[i];
66
+ const ret = currLevel.children.find(c => c.name === category);
67
+ const id = [extra, categories.slice(0, i + 1).join(',')]
68
+ .filter(f => !!f)
69
+ .join('-');
70
+ if (!ret) {
71
+ const n = {
72
+ children: [],
73
+ name: category,
74
+ id,
75
+ isOpenByDefault: !collapsed.get(id),
76
+ menuItems,
77
+ type: 'category',
78
+ };
79
+ currLevel.children.push(n);
80
+ currLevel = n;
81
+ }
82
+ else {
83
+ currLevel = ret;
84
+ }
81
85
  }
82
86
  }
83
87
  // uses splice to try to put all leaf nodes above "category nodes" if you
@@ -86,11 +90,13 @@ function generateHierarchy({ model, trackConfs, extra, }) {
86
90
  const r = currLevel.children.findIndex(elt => elt.children.length);
87
91
  const idx = r === -1 ? currLevel.children.length : r;
88
92
  currLevel.children.splice(idx, 0, {
89
- id: conf.trackId,
93
+ id: [extra, conf.trackId].filter(f => !!f).join(','),
94
+ trackId: conf.trackId,
90
95
  name: (0, tracks_1.getTrackName)(conf, session),
91
96
  conf,
92
97
  checked: viewTracks.some(f => f.configuration === conf),
93
98
  children: [],
99
+ type: 'track',
94
100
  });
95
101
  }
96
102
  return hierarchy.children;
@@ -1,7 +1,7 @@
1
1
  import { Instance } from 'mobx-state-tree';
2
2
  import { AnyConfigurationModel } from '@jbrowse/core/configuration';
3
3
  import PluginManager from '@jbrowse/core/PluginManager';
4
- import { TreeNode } from './generateHierarchy';
4
+ type MaybeAnyConfigurationModel = AnyConfigurationModel | undefined;
5
5
  /**
6
6
  * #stateModel HierarchicalTrackSelectorWidget
7
7
  */
@@ -34,6 +34,90 @@ export default function stateTreeFactory(pluginManager: PluginManager): import("
34
34
  * #property
35
35
  */
36
36
  view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
37
+ /**
38
+ * #property
39
+ * this is removed in postProcessSnapshot, so is generally only loaded
40
+ * from localstorage
41
+ */
42
+ favorites: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").IArrayType<import("mobx-state-tree").ISimpleType<string>>, [undefined]>;
43
+ /**
44
+ * #property
45
+ * this is removed in postProcessSnapshot, so is generally only loaded
46
+ * from localstorage
47
+ */
48
+ recentlyUsed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").IArrayType<import("mobx-state-tree").ISimpleType<string>>, [undefined]>;
49
+ /**
50
+ * #property
51
+ */
52
+ faceted: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").IModelType<{
53
+ filterText: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
54
+ showSparse: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
55
+ showFilters: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
56
+ showOptions: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
57
+ panelWidth: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<number>, [undefined]>;
58
+ }, {
59
+ /**
60
+ * #property
61
+ */
62
+ visible: Record<string, boolean>;
63
+ widths: Record<string, number | undefined>;
64
+ useShoppingCart: boolean;
65
+ filters: import("mobx").ObservableMap<string, string[]>;
66
+ } & {
67
+ setFilter(key: string, value: string[]): void;
68
+ setPanelWidth(width: number): void;
69
+ setUseShoppingCart(f: boolean): void;
70
+ setFilterText(str: string): void;
71
+ setShowSparse(f: boolean): void;
72
+ setShowOptions(f: boolean): void;
73
+ setShowFilters(f: boolean): void;
74
+ } & {
75
+ readonly allTrackConfigurations: ({
76
+ [x: string]: any;
77
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
78
+ setSubschema(slotName: string, data: unknown): any;
79
+ } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>)[];
80
+ } & {
81
+ readonly rows: {
82
+ readonly id: string;
83
+ readonly conf: {
84
+ [x: string]: any;
85
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
86
+ setSubschema(slotName: string, data: unknown): any;
87
+ } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>;
88
+ readonly name: string;
89
+ readonly category: string; /**
90
+ * #action
91
+ */
92
+ readonly adapter: string;
93
+ readonly description: string;
94
+ readonly metadata: any;
95
+ }[];
96
+ } & {
97
+ readonly filteredNonMetadataKeys: string[] | readonly ["category", "adapter", "description"];
98
+ readonly metadataKeys: string[];
99
+ readonly filteredMetadataKeys: string[];
100
+ readonly fields: string[];
101
+ readonly filteredRows: {
102
+ readonly id: string;
103
+ readonly conf: {
104
+ [x: string]: any;
105
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
106
+ setSubschema(slotName: string, data: unknown): any;
107
+ } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>;
108
+ readonly name: string;
109
+ readonly category: string; /**
110
+ * #action
111
+ */
112
+ readonly adapter: string;
113
+ readonly description: string;
114
+ readonly metadata: any;
115
+ }[];
116
+ } & {
117
+ setVisible(args: Record<string, boolean>): void;
118
+ setWidths(args: Record<string, number | undefined>): void;
119
+ afterAttach(): void;
120
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>, [undefined]>;
37
121
  }, {
38
122
  selection: ({
39
123
  [x: string]: any;
@@ -41,6 +125,25 @@ export default function stateTreeFactory(pluginManager: PluginManager): import("
41
125
  setSubschema(slotName: string, data: unknown): any;
42
126
  } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>)[];
43
127
  filterText: string;
128
+ recentlyUsedCounter: number;
129
+ favoritesCounter: number;
130
+ } & {
131
+ /**
132
+ * #getter
133
+ */
134
+ readonly selectionSet: Set<{
135
+ [x: string]: any;
136
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
137
+ setSubschema(slotName: string, data: unknown): any;
138
+ } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>>;
139
+ /**
140
+ * #getter
141
+ */
142
+ readonly favoritesSet: Set<string>;
143
+ /**
144
+ * #getter
145
+ */
146
+ readonly recentlyUsedSet: Set<string>;
44
147
  } & {
45
148
  /**
46
149
  * #action
@@ -66,6 +169,34 @@ export default function stateTreeFactory(pluginManager: PluginManager): import("
66
169
  * #action
67
170
  */
68
171
  clearSelection(): void;
172
+ /**
173
+ * #action
174
+ */
175
+ addToFavorites(trackId: string): void;
176
+ /**
177
+ * #action
178
+ */
179
+ removeFromFavorites(trackId: string): void;
180
+ /**
181
+ * #action
182
+ */
183
+ clearFavorites(): void;
184
+ /**
185
+ * #action
186
+ */
187
+ setRecentlyUsedCounter(val: number): void;
188
+ /**
189
+ * #action
190
+ */
191
+ setFavoritesCounter(val: number): void;
192
+ /**
193
+ * #action
194
+ */
195
+ addToRecentlyUsed(id: string): void;
196
+ /**
197
+ * #action
198
+ */
199
+ clearRecentlyUsed(): void;
69
200
  /**
70
201
  * #action
71
202
  */
@@ -94,7 +225,19 @@ export default function stateTreeFactory(pluginManager: PluginManager): import("
94
225
  /**
95
226
  * #method
96
227
  */
97
- getRefSeqTrackConf(assemblyName: string): AnyConfigurationModel | undefined;
228
+ isSelected(track: AnyConfigurationModel): boolean;
229
+ /**
230
+ * #method
231
+ */
232
+ isFavorite(trackId: string): boolean;
233
+ /**
234
+ * #method
235
+ */
236
+ isRecentlyUsed(trackId: string): boolean;
237
+ /**
238
+ * #method
239
+ */
240
+ getRefSeqTrackConf(assemblyName: string): MaybeAnyConfigurationModel;
98
241
  } & {
99
242
  /**
100
243
  * #getter
@@ -110,34 +253,42 @@ export default function stateTreeFactory(pluginManager: PluginManager): import("
110
253
  */
111
254
  readonly activeSortCategories: any;
112
255
  /**
113
- * #method
114
- * filter out tracks that don't match the current display types
256
+ * #getter
257
+ * filter out tracks that don't match the current assembly/display types
115
258
  */
116
- connectionTrackConfigurations(connection: {
117
- tracks: AnyConfigurationModel[];
118
- }): ({
259
+ readonly configAndSessionTrackConfigurations: ({
119
260
  [x: string]: any;
120
261
  } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
121
262
  setSubschema(slotName: string, data: unknown): any;
122
263
  } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>)[];
264
+ readonly allTrackConfigurations: ({
265
+ [x: string]: any;
266
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
267
+ setSubschema(slotName: string, data: unknown): any;
268
+ } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>)[];
269
+ } & {
123
270
  /**
124
271
  * #getter
125
- * filter out tracks that don't match the current assembly/display types
272
+ * filters out tracks that are not in the favorites group
126
273
  */
127
- readonly trackConfigurations: ({
274
+ readonly favoriteTracks: ({
128
275
  [x: string]: any;
129
276
  } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
130
277
  setSubschema(slotName: string, data: unknown): any;
131
278
  } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>)[];
132
- } & {
133
279
  /**
134
- * #method
280
+ * #getter
281
+ * filters out tracks that are not in the recently used group
135
282
  */
136
- connectionHierarchy(connection: {
137
- name: string;
138
- tracks: AnyConfigurationModel[];
139
- }): TreeNode[];
283
+ readonly recentlyUsedTracks: ({
284
+ [x: string]: any;
285
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
286
+ setSubschema(slotName: string, data: unknown): any;
287
+ } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>)[];
140
288
  } & {
289
+ /**
290
+ * #getter
291
+ */
141
292
  readonly allTracks: {
142
293
  group: any;
143
294
  tracks: ({
@@ -145,6 +296,8 @@ export default function stateTreeFactory(pluginManager: PluginManager): import("
145
296
  } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
146
297
  setSubschema(slotName: string, data: unknown): any;
147
298
  } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>)[];
299
+ noCategories: boolean;
300
+ menuItems: never[];
148
301
  }[];
149
302
  } & {
150
303
  /**
@@ -153,10 +306,15 @@ export default function stateTreeFactory(pluginManager: PluginManager): import("
153
306
  readonly hierarchy: {
154
307
  name: string;
155
308
  id: string;
309
+ isOpenByDefault: boolean;
310
+ type: "category";
156
311
  children: {
157
312
  name: any;
158
313
  id: any;
159
- children: TreeNode[];
314
+ type: "category";
315
+ isOpenByDefault: boolean;
316
+ menuItems: never[];
317
+ children: import("./generateHierarchy").TreeNode[];
160
318
  }[];
161
319
  };
162
320
  } & {
@@ -171,7 +329,28 @@ export default function stateTreeFactory(pluginManager: PluginManager): import("
171
329
  } & {
172
330
  afterCreate(): void;
173
331
  } & {
332
+ /**
333
+ * #getter
334
+ */
174
335
  readonly hasAnySubcategories: boolean;
175
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
336
+ } & {
337
+ afterAttach(): void;
338
+ }, import("mobx-state-tree")._NotCustomized, {
339
+ type: "HierarchicalTrackSelectorWidget";
340
+ view: import("mobx-state-tree").ReferenceIdentifier | undefined;
341
+ id: string;
342
+ collapsed: import("mobx").IKeyValueMap<boolean>;
343
+ initialized: boolean | undefined;
344
+ sortTrackNames: boolean | undefined;
345
+ sortCategories: boolean | undefined;
346
+ faceted: import("mobx-state-tree").ModelSnapshotType<{
347
+ filterText: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
348
+ showSparse: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
349
+ showFilters: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
350
+ showOptions: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
351
+ panelWidth: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<number>, [undefined]>;
352
+ }>;
353
+ }>;
176
354
  export type HierarchicalTrackSelectorStateModel = ReturnType<typeof stateTreeFactory>;
177
355
  export type HierarchicalTrackSelectorModel = Instance<HierarchicalTrackSelectorStateModel>;
356
+ export {};
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const mobx_state_tree_1 = require("mobx-state-tree");
4
+ const mobx_1 = require("mobx");
4
5
  const configuration_1 = require("@jbrowse/core/configuration");
5
6
  const util_1 = require("@jbrowse/core/util");
6
7
  const mst_1 = require("@jbrowse/core/util/types/mst");
@@ -8,6 +9,24 @@ const mst_1 = require("@jbrowse/core/util/types/mst");
8
9
  const filterTracks_1 = require("./filterTracks");
9
10
  const generateHierarchy_1 = require("./generateHierarchy");
10
11
  const util_2 = require("./util");
12
+ const facetedModel_1 = require("./facetedModel");
13
+ // for settings that are config dependent
14
+ function postNoConfigF() {
15
+ return typeof window !== undefined
16
+ ? [window.location.host, window.location.pathname].join('-')
17
+ : 'empty';
18
+ }
19
+ // for settings that are not config dependent
20
+ function postF() {
21
+ return typeof window !== undefined
22
+ ? [
23
+ postNoConfigF(),
24
+ new URLSearchParams(window.location.search).get('config'),
25
+ ].join('-')
26
+ : 'empty';
27
+ }
28
+ const lsKeyFavoritesF = () => `favoriteTracks-${postF()}}`;
29
+ const lsKeyRecentlyUsedF = () => `recentlyUsedTracks-${postF()}}`;
11
30
  /**
12
31
  * #stateModel HierarchicalTrackSelectorWidget
13
32
  */
@@ -42,10 +61,48 @@ function stateTreeFactory(pluginManager) {
42
61
  * #property
43
62
  */
44
63
  view: mobx_state_tree_1.types.safeReference(pluginManager.pluggableMstType('view', 'stateModel')),
64
+ /**
65
+ * #property
66
+ * this is removed in postProcessSnapshot, so is generally only loaded
67
+ * from localstorage
68
+ */
69
+ favorites: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.array(mobx_state_tree_1.types.string), () => JSON.parse((0, util_1.localStorageGetItem)(lsKeyFavoritesF()) || '[]')),
70
+ /**
71
+ * #property
72
+ * this is removed in postProcessSnapshot, so is generally only loaded
73
+ * from localstorage
74
+ */
75
+ recentlyUsed: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.array(mobx_state_tree_1.types.string), () => JSON.parse((0, util_1.localStorageGetItem)(lsKeyRecentlyUsedF()) || '[]')),
76
+ /**
77
+ * #property
78
+ */
79
+ faceted: mobx_state_tree_1.types.optional((0, facetedModel_1.facetedStateTreeF)(), {}),
45
80
  })
46
81
  .volatile(() => ({
47
82
  selection: [],
48
83
  filterText: '',
84
+ recentlyUsedCounter: 0,
85
+ favoritesCounter: 0,
86
+ }))
87
+ .views(self => ({
88
+ /**
89
+ * #getter
90
+ */
91
+ get selectionSet() {
92
+ return new Set(self.selection);
93
+ },
94
+ /**
95
+ * #getter
96
+ */
97
+ get favoritesSet() {
98
+ return new Set(self.favorites);
99
+ },
100
+ /**
101
+ * #getter
102
+ */
103
+ get recentlyUsedSet() {
104
+ return new Set(self.recentlyUsed);
105
+ },
49
106
  }))
50
107
  .actions(self => ({
51
108
  /**
@@ -76,7 +133,8 @@ function stateTreeFactory(pluginManager) {
76
133
  * #action
77
134
  */
78
135
  removeFromSelection(elt) {
79
- self.selection = self.selection.filter(f => !elt.includes(f));
136
+ const s = new Set(elt);
137
+ self.selection = self.selection.filter(f => !s.has(f));
80
138
  },
81
139
  /**
82
140
  * #action
@@ -84,6 +142,55 @@ function stateTreeFactory(pluginManager) {
84
142
  clearSelection() {
85
143
  self.selection = [];
86
144
  },
145
+ /**
146
+ * #action
147
+ */
148
+ addToFavorites(trackId) {
149
+ self.favoritesCounter += 1;
150
+ self.favorites.push(trackId);
151
+ },
152
+ /**
153
+ * #action
154
+ */
155
+ removeFromFavorites(trackId) {
156
+ self.favorites.remove(trackId);
157
+ },
158
+ /**
159
+ * #action
160
+ */
161
+ clearFavorites() {
162
+ self.favorites.clear();
163
+ },
164
+ /**
165
+ * #action
166
+ */
167
+ setRecentlyUsedCounter(val) {
168
+ self.recentlyUsedCounter = val;
169
+ },
170
+ /**
171
+ * #action
172
+ */
173
+ setFavoritesCounter(val) {
174
+ self.favoritesCounter = val;
175
+ },
176
+ /**
177
+ * #action
178
+ */
179
+ addToRecentlyUsed(id) {
180
+ self.recentlyUsedCounter += 1;
181
+ if (!self.recentlyUsed.includes(id)) {
182
+ if (self.recentlyUsed.length >= 10) {
183
+ self.recentlyUsed.shift();
184
+ }
185
+ self.recentlyUsed.push(id);
186
+ }
187
+ },
188
+ /**
189
+ * #action
190
+ */
191
+ clearRecentlyUsed() {
192
+ self.recentlyUsed.clear();
193
+ },
87
194
  /**
88
195
  * #action
89
196
  */
@@ -122,6 +229,24 @@ function stateTreeFactory(pluginManager) {
122
229
  },
123
230
  }))
124
231
  .views(self => ({
232
+ /**
233
+ * #method
234
+ */
235
+ isSelected(track) {
236
+ return self.selectionSet.has(track);
237
+ },
238
+ /**
239
+ * #method
240
+ */
241
+ isFavorite(trackId) {
242
+ return self.favoritesSet.has(trackId);
243
+ },
244
+ /**
245
+ * #method
246
+ */
247
+ isRecentlyUsed(trackId) {
248
+ return self.recentlyUsedSet.has(trackId);
249
+ },
125
250
  /**
126
251
  * #method
127
252
  */
@@ -165,47 +290,58 @@ function stateTreeFactory(pluginManager) {
165
290
  var _a;
166
291
  return ((_a = self.sortCategories) !== null && _a !== void 0 ? _a : (0, configuration_1.getConf)((0, util_1.getSession)(self), ['hierarchical', 'sort', 'categories']));
167
292
  },
168
- /**
169
- * #method
170
- * filter out tracks that don't match the current display types
171
- */
172
- connectionTrackConfigurations(connection) {
173
- return (0, filterTracks_1.filterTracks)(connection.tracks, self);
174
- },
175
293
  /**
176
294
  * #getter
177
295
  * filter out tracks that don't match the current assembly/display types
178
296
  */
179
- get trackConfigurations() {
297
+ get configAndSessionTrackConfigurations() {
180
298
  return [
181
299
  ...self.assemblyNames.map(a => self.getRefSeqTrackConf(a)),
182
300
  ...(0, filterTracks_1.filterTracks)((0, util_1.getSession)(self).tracks, self),
183
301
  ].filter(util_1.notEmpty);
184
302
  },
303
+ get allTrackConfigurations() {
304
+ const { connectionInstances = [] } = (0, util_1.getSession)(self);
305
+ return [
306
+ ...this.configAndSessionTrackConfigurations,
307
+ ...connectionInstances === null || connectionInstances === void 0 ? void 0 : connectionInstances.flatMap(c => c.tracks),
308
+ ];
309
+ },
185
310
  }))
186
311
  .views(self => ({
187
312
  /**
188
- * #method
313
+ * #getter
314
+ * filters out tracks that are not in the favorites group
315
+ */
316
+ get favoriteTracks() {
317
+ return self.allTrackConfigurations.filter(t => self.favoritesSet.has(t.trackId));
318
+ },
319
+ /**
320
+ * #getter
321
+ * filters out tracks that are not in the recently used group
189
322
  */
190
- connectionHierarchy(connection) {
191
- return (0, generateHierarchy_1.generateHierarchy)({
192
- model: self,
193
- trackConfs: self.connectionTrackConfigurations(connection),
194
- extra: connection.name,
195
- });
323
+ get recentlyUsedTracks() {
324
+ return self.allTrackConfigurations.filter(t => self.recentlyUsedSet.has(t.trackId));
196
325
  },
197
326
  }))
198
327
  .views(self => ({
328
+ /**
329
+ * #getter
330
+ */
199
331
  get allTracks() {
200
332
  const { connectionInstances = [] } = (0, util_1.getSession)(self);
201
333
  return [
202
334
  {
203
335
  group: 'Tracks',
204
- tracks: self.trackConfigurations,
336
+ tracks: self.configAndSessionTrackConfigurations,
337
+ noCategories: false,
338
+ menuItems: [],
205
339
  },
206
340
  ...connectionInstances.flatMap(c => ({
207
341
  group: (0, configuration_1.getConf)(c, 'name'),
208
342
  tracks: c.tracks,
343
+ noCategories: false,
344
+ menuItems: [],
209
345
  })),
210
346
  ];
211
347
  },
@@ -218,17 +354,21 @@ function stateTreeFactory(pluginManager) {
218
354
  return {
219
355
  name: 'Root',
220
356
  id: 'Root',
221
- children: self.allTracks
222
- .map(s => ({
357
+ isOpenByDefault: true,
358
+ type: 'category',
359
+ children: self.allTracks.map(s => ({
223
360
  name: s.group,
224
361
  id: s.group,
362
+ type: 'category',
363
+ isOpenByDefault: !self.collapsed.get(s.group),
364
+ menuItems: s.menuItems,
225
365
  children: (0, generateHierarchy_1.generateHierarchy)({
226
366
  model: self,
227
367
  trackConfs: s.tracks,
368
+ extra: s.group,
369
+ noCategories: s.noCategories,
228
370
  }),
229
- }))
230
- // always keep the Tracks entry at idx 0
231
- .filter((f, idx) => idx === 0 || !!f.children.length),
371
+ })),
232
372
  };
233
373
  },
234
374
  }))
@@ -288,9 +428,24 @@ function stateTreeFactory(pluginManager) {
288
428
  },
289
429
  }))
290
430
  .views(self => ({
431
+ /**
432
+ * #getter
433
+ */
291
434
  get hasAnySubcategories() {
292
435
  return self.allTracks.some(group => group.tracks.some(t => { var _a; return ((_a = (0, configuration_1.readConfObject)(t, 'category')) === null || _a === void 0 ? void 0 : _a.length) > 1; }));
293
436
  },
294
- }));
437
+ }))
438
+ .actions(self => ({
439
+ afterAttach() {
440
+ (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(() => {
441
+ (0, util_1.localStorageSetItem)(lsKeyFavoritesF(), JSON.stringify(self.favorites));
442
+ (0, util_1.localStorageSetItem)(lsKeyRecentlyUsedF(), JSON.stringify(self.recentlyUsed));
443
+ }));
444
+ },
445
+ }))
446
+ .postProcessSnapshot(snap => {
447
+ const { favorites: _, recentlyUsed: __, ...rest } = snap;
448
+ return rest;
449
+ });
295
450
  }
296
451
  exports.default = stateTreeFactory;
@@ -0,0 +1 @@
1
+ export declare function doConnect(self: any): Promise<void>;