@jbrowse/plugin-data-management 2.8.0 → 2.10.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 (85) hide show
  1. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js +4 -8
  2. package/dist/AddTrackWidget/model.d.ts +81 -0
  3. package/dist/AddTrackWidget/model.js +81 -0
  4. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +1 -1
  5. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +11 -53
  6. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +5 -7
  7. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +12 -11
  8. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.d.ts +5 -7
  9. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +11 -8
  10. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +1 -11
  11. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +9 -7
  12. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +40 -135
  13. package/dist/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.d.ts +12 -0
  14. package/dist/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.js +59 -0
  15. package/dist/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.d.ts +6 -0
  16. package/dist/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.js +45 -0
  17. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +71 -46
  18. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +5 -34
  19. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +8 -3
  20. package/dist/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.d.ts +6 -0
  21. package/dist/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.js +42 -0
  22. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +7 -6
  23. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +9 -28
  24. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.d.ts +12 -0
  25. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.js +50 -0
  26. package/dist/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
  27. package/dist/HierarchicalTrackSelectorWidget/components/util.js +5 -1
  28. package/dist/HierarchicalTrackSelectorWidget/facetedModel.d.ts +128 -0
  29. package/dist/HierarchicalTrackSelectorWidget/facetedModel.js +206 -0
  30. package/dist/HierarchicalTrackSelectorWidget/facetedUtil.d.ts +2 -0
  31. package/dist/HierarchicalTrackSelectorWidget/{components/faceted/util.js → facetedUtil.js} +5 -1
  32. package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +17 -5
  33. package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.js +27 -21
  34. package/dist/HierarchicalTrackSelectorWidget/model.d.ts +193 -15
  35. package/dist/HierarchicalTrackSelectorWidget/model.js +209 -22
  36. package/dist/ucsc-trackhub/doConnect.d.ts +1 -0
  37. package/dist/ucsc-trackhub/doConnect.js +131 -0
  38. package/dist/ucsc-trackhub/model.d.ts +19 -2
  39. package/dist/ucsc-trackhub/model.js +16 -71
  40. package/dist/ucsc-trackhub/ucscTrackHub.d.ts +161 -4
  41. package/dist/ucsc-trackhub/ucscTrackHub.js +49 -166
  42. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +4 -8
  43. package/esm/AddTrackWidget/model.d.ts +81 -0
  44. package/esm/AddTrackWidget/model.js +81 -0
  45. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +1 -1
  46. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +12 -31
  47. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +5 -7
  48. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +13 -11
  49. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.d.ts +5 -7
  50. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +12 -8
  51. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +1 -11
  52. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +9 -7
  53. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +41 -113
  54. package/esm/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.d.ts +12 -0
  55. package/esm/HierarchicalTrackSelectorWidget/components/tree/DropdownTrackSelector.js +31 -0
  56. package/esm/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.d.ts +6 -0
  57. package/esm/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.js +40 -0
  58. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +71 -46
  59. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +6 -12
  60. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +8 -3
  61. package/esm/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.d.ts +6 -0
  62. package/esm/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.js +37 -0
  63. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +7 -6
  64. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +8 -27
  65. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.d.ts +12 -0
  66. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.js +45 -0
  67. package/esm/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
  68. package/esm/HierarchicalTrackSelectorWidget/components/util.js +5 -1
  69. package/esm/HierarchicalTrackSelectorWidget/facetedModel.d.ts +128 -0
  70. package/esm/HierarchicalTrackSelectorWidget/facetedModel.js +202 -0
  71. package/esm/HierarchicalTrackSelectorWidget/facetedUtil.d.ts +2 -0
  72. package/esm/HierarchicalTrackSelectorWidget/{components/faceted/util.js → facetedUtil.js} +3 -0
  73. package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +17 -5
  74. package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.js +27 -21
  75. package/esm/HierarchicalTrackSelectorWidget/model.d.ts +193 -15
  76. package/esm/HierarchicalTrackSelectorWidget/model.js +211 -24
  77. package/esm/ucsc-trackhub/doConnect.d.ts +1 -0
  78. package/esm/ucsc-trackhub/doConnect.js +127 -0
  79. package/esm/ucsc-trackhub/model.d.ts +19 -2
  80. package/esm/ucsc-trackhub/model.js +17 -72
  81. package/esm/ucsc-trackhub/ucscTrackHub.d.ts +161 -4
  82. package/esm/ucsc-trackhub/ucscTrackHub.js +48 -141
  83. package/package.json +3 -4
  84. package/dist/HierarchicalTrackSelectorWidget/components/faceted/util.d.ts +0 -1
  85. package/esm/HierarchicalTrackSelectorWidget/components/faceted/util.d.ts +0 -1
@@ -122,9 +122,6 @@ const DefaultAddTrackWorkflow = (0, mobx_react_1.observer)(function ({ model, })
122
122
  };
123
123
  jobsManager.queueJob(newEntry);
124
124
  }
125
- else {
126
- session.notify('Open a new view, or use the track selector in an existing view, to view this track', 'info');
127
- }
128
125
  model.clearData();
129
126
  if ((0, util_1.isSessionModelWithWidgets)(session)) {
130
127
  session.hideWidget(model);
@@ -134,10 +131,6 @@ const DefaultAddTrackWorkflow = (0, mobx_react_1.observer)(function ({ model, })
134
131
  setTrackErrorMessage('Failed to add track.\nThe configuration of this file is not currently supported.');
135
132
  }
136
133
  }
137
- function handleBack() {
138
- setTrackErrorMessage(undefined);
139
- setActiveStep(activeStep - 1);
140
- }
141
134
  function isNextDisabled() {
142
135
  switch (activeStep) {
143
136
  case 0:
@@ -154,7 +147,10 @@ const DefaultAddTrackWorkflow = (0, mobx_react_1.observer)(function ({ model, })
154
147
  react_1.default.createElement(material_1.StepContent, null,
155
148
  getStepContent(idx),
156
149
  react_1.default.createElement("div", { className: classes.actionsContainer },
157
- react_1.default.createElement(material_1.Button, { disabled: activeStep === 0, onClick: handleBack, className: classes.button }, "Back"),
150
+ react_1.default.createElement(material_1.Button, { disabled: activeStep === 0, onClick: () => {
151
+ setTrackErrorMessage(undefined);
152
+ setActiveStep(activeStep - 1);
153
+ }, className: classes.button }, "Back"),
158
154
  react_1.default.createElement(material_1.Button, { disabled: isNextDisabled(), variant: "contained", color: "primary", onClick: handleNext, className: classes.button, "data-testid": "addTrackNextButton" }, activeStep === steps.length - 1 ? 'Add' : 'Next')),
159
155
  trackErrorMessage ? (react_1.default.createElement("div", { className: classes.alertContainer },
160
156
  react_1.default.createElement(material_1.Alert, { severity: "error" }, trackErrorMessage))) : null)))))));
@@ -5,9 +5,21 @@ interface IndexingAttr {
5
5
  attributes: string[];
6
6
  exclude: string[];
7
7
  }
8
+ /**
9
+ * #stateModel AddTrackModel
10
+ */
8
11
  export default function f(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
12
+ /**
13
+ * #property
14
+ */
9
15
  id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
16
+ /**
17
+ * #property
18
+ */
10
19
  type: import("mobx-state-tree").ISimpleType<"AddTrackWidget">;
20
+ /**
21
+ * #property
22
+ */
11
23
  view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
12
24
  }, {
13
25
  trackSource: string;
@@ -20,30 +32,99 @@ export default function f(pluginManager: PluginManager): import("mobx-state-tree
20
32
  textIndexTrack: boolean;
21
33
  textIndexingConf: IndexingAttr | undefined;
22
34
  } & {
35
+ /**
36
+ * #action
37
+ */
23
38
  setAdapterHint(obj: string): void;
39
+ /**
40
+ * #action
41
+ */
24
42
  setTrackSource(str: string): void;
43
+ /**
44
+ * #action
45
+ */
25
46
  setTextIndexingConf(conf: IndexingAttr): void;
47
+ /**
48
+ * #action
49
+ */
26
50
  setTextIndexTrack(flag: boolean): void;
51
+ /**
52
+ * #action
53
+ */
27
54
  setTrackData(obj: FileLocation): void;
55
+ /**
56
+ * #action
57
+ */
28
58
  setIndexTrackData(obj: FileLocation): void;
59
+ /**
60
+ * #action
61
+ */
29
62
  setAssembly(str: string): void;
63
+ /**
64
+ * #action
65
+ */
30
66
  setTrackName(str: string): void;
67
+ /**
68
+ * #action
69
+ */
31
70
  setTrackType(str: string): void;
71
+ /**
72
+ * #action
73
+ */
32
74
  clearData(): void;
33
75
  } & {
76
+ /**
77
+ * #getter
78
+ */
34
79
  readonly trackAdapter: import("@jbrowse/core/util/tracks").AdapterConfig | undefined;
80
+ /**
81
+ * #getter
82
+ */
35
83
  readonly trackName: string;
84
+ /**
85
+ * #getter
86
+ */
36
87
  readonly isFtp: boolean;
88
+ /**
89
+ * #getter
90
+ */
37
91
  readonly isRelativeTrackUrl: boolean;
92
+ /**
93
+ * #getter
94
+ */
38
95
  readonly isRelativeIndexUrl: boolean;
96
+ /**
97
+ * #getter
98
+ */
39
99
  readonly isRelativeUrl: boolean;
100
+ /**
101
+ * #getter
102
+ */
40
103
  readonly trackHttp: any;
104
+ /**
105
+ * #getter
106
+ */
41
107
  readonly indexHttp: any;
108
+ /**
109
+ * #getter
110
+ */
42
111
  readonly wrongProtocol: any;
112
+ /**
113
+ * #getter
114
+ */
43
115
  readonly unsupported: boolean;
116
+ /**
117
+ * #getter
118
+ */
44
119
  readonly assembly: any;
120
+ /**
121
+ * #getter
122
+ */
45
123
  readonly trackType: string;
46
124
  } & {
125
+ /**
126
+ * #getter
127
+ */
47
128
  readonly warningMessage: "" | "Warning: JBrowse cannot access files using the ftp protocol" | "Warning: one or more of your files do not provide the protocol e.g.\n https://, please provide an absolute URL unless you are sure a\n relative URL is intended." | "Warning: You entered a http:// resources but we cannot access HTTP\n resources from JBrowse when it is running on https. Please use an\n https URL for your track, or access the JBrowse app from the http\n protocol";
48
129
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
49
130
  export type AddTrackStateModel = ReturnType<typeof f>;
@@ -12,11 +12,23 @@ function isAbsoluteUrl(url = '') {
12
12
  return url.startsWith('/');
13
13
  }
14
14
  }
15
+ /**
16
+ * #stateModel AddTrackModel
17
+ */
15
18
  function f(pluginManager) {
16
19
  return mobx_state_tree_1.types
17
20
  .model('AddTrackModel', {
21
+ /**
22
+ * #property
23
+ */
18
24
  id: mst_1.ElementId,
25
+ /**
26
+ * #property
27
+ */
19
28
  type: mobx_state_tree_1.types.literal('AddTrackWidget'),
29
+ /**
30
+ * #property
31
+ */
20
32
  view: mobx_state_tree_1.types.safeReference(pluginManager.pluggableMstType('view', 'stateModel')),
21
33
  })
22
34
  .volatile(() => ({
@@ -32,33 +44,63 @@ function f(pluginManager) {
32
44
  textIndexingConf: undefined,
33
45
  }))
34
46
  .actions(self => ({
47
+ /**
48
+ * #action
49
+ */
35
50
  setAdapterHint(obj) {
36
51
  self.adapterHint = obj;
37
52
  },
53
+ /**
54
+ * #action
55
+ */
38
56
  setTrackSource(str) {
39
57
  self.trackSource = str;
40
58
  },
59
+ /**
60
+ * #action
61
+ */
41
62
  setTextIndexingConf(conf) {
42
63
  self.textIndexingConf = conf;
43
64
  },
65
+ /**
66
+ * #action
67
+ */
44
68
  setTextIndexTrack(flag) {
45
69
  self.textIndexTrack = flag;
46
70
  },
71
+ /**
72
+ * #action
73
+ */
47
74
  setTrackData(obj) {
48
75
  self.trackData = obj;
49
76
  },
77
+ /**
78
+ * #action
79
+ */
50
80
  setIndexTrackData(obj) {
51
81
  self.indexTrackData = obj;
52
82
  },
83
+ /**
84
+ * #action
85
+ */
53
86
  setAssembly(str) {
54
87
  self.altAssemblyName = str;
55
88
  },
89
+ /**
90
+ * #action
91
+ */
56
92
  setTrackName(str) {
57
93
  self.altTrackName = str;
58
94
  },
95
+ /**
96
+ * #action
97
+ */
59
98
  setTrackType(str) {
60
99
  self.altTrackType = str;
61
100
  },
101
+ /**
102
+ * #action
103
+ */
62
104
  clearData() {
63
105
  self.trackSource = '';
64
106
  self.altTrackName = '';
@@ -72,16 +114,25 @@ function f(pluginManager) {
72
114
  },
73
115
  }))
74
116
  .views(self => ({
117
+ /**
118
+ * #getter
119
+ */
75
120
  get trackAdapter() {
76
121
  const { trackData, indexTrackData, adapterHint } = self;
77
122
  return trackData
78
123
  ? (0, tracks_1.guessAdapter)(trackData, indexTrackData, adapterHint, self)
79
124
  : undefined;
80
125
  },
126
+ /**
127
+ * #getter
128
+ */
81
129
  get trackName() {
82
130
  return (self.altTrackName ||
83
131
  (self.trackData ? (0, tracks_1.getFileName)(self.trackData) : ''));
84
132
  },
133
+ /**
134
+ * #getter
135
+ */
85
136
  get isFtp() {
86
137
  var _a, _b;
87
138
  const { trackData: track, indexTrackData: index } = self;
@@ -89,43 +140,70 @@ function f(pluginManager) {
89
140
  // @ts-expect-error
90
141
  (((_a = index === null || index === void 0 ? void 0 : index.uri) === null || _a === void 0 ? void 0 : _a.startsWith('ftp://')) || ((_b = track === null || track === void 0 ? void 0 : track.uri) === null || _b === void 0 ? void 0 : _b.startsWith('ftp://'))));
91
142
  },
143
+ /**
144
+ * #getter
145
+ */
92
146
  get isRelativeTrackUrl() {
93
147
  var _a;
94
148
  // @ts-expect-error
95
149
  const uri = (_a = self.trackData) === null || _a === void 0 ? void 0 : _a.uri;
96
150
  return uri ? !isAbsoluteUrl(uri) : false;
97
151
  },
152
+ /**
153
+ * #getter
154
+ */
98
155
  get isRelativeIndexUrl() {
99
156
  var _a;
100
157
  // @ts-expect-error
101
158
  const uri = (_a = self.indexTrackData) === null || _a === void 0 ? void 0 : _a.uri;
102
159
  return uri ? !isAbsoluteUrl(uri) : false;
103
160
  },
161
+ /**
162
+ * #getter
163
+ */
104
164
  get isRelativeUrl() {
105
165
  return this.isRelativeIndexUrl || this.isRelativeTrackUrl;
106
166
  },
167
+ /**
168
+ * #getter
169
+ */
107
170
  get trackHttp() {
108
171
  var _a, _b;
109
172
  // @ts-expect-error
110
173
  return (_b = (_a = self.trackData) === null || _a === void 0 ? void 0 : _a.uri) === null || _b === void 0 ? void 0 : _b.startsWith('http://');
111
174
  },
175
+ /**
176
+ * #getter
177
+ */
112
178
  get indexHttp() {
113
179
  var _a, _b;
114
180
  // @ts-expect-error
115
181
  return (_b = (_a = self.indexTrackData) === null || _a === void 0 ? void 0 : _a.uri) === null || _b === void 0 ? void 0 : _b.startsWith('http://');
116
182
  },
183
+ /**
184
+ * #getter
185
+ */
117
186
  get wrongProtocol() {
118
187
  return (window.location.protocol === 'https:' &&
119
188
  (this.trackHttp || this.indexHttp));
120
189
  },
190
+ /**
191
+ * #getter
192
+ */
121
193
  get unsupported() {
122
194
  var _a;
123
195
  return ((_a = this.trackAdapter) === null || _a === void 0 ? void 0 : _a.type) === tracks_1.UNSUPPORTED;
124
196
  },
197
+ /**
198
+ * #getter
199
+ */
125
200
  get assembly() {
126
201
  var _a;
127
202
  return self.altAssemblyName || ((_a = self.view.assemblyNames) === null || _a === void 0 ? void 0 : _a[0]);
128
203
  },
204
+ /**
205
+ * #getter
206
+ */
129
207
  get trackType() {
130
208
  return (self.altTrackType ||
131
209
  (this.trackAdapter
@@ -134,6 +212,9 @@ function f(pluginManager) {
134
212
  },
135
213
  }))
136
214
  .views(self => ({
215
+ /**
216
+ * #getter
217
+ */
137
218
  get warningMessage() {
138
219
  if (self.isFtp) {
139
220
  return `Warning: JBrowse cannot access files using the ftp protocol`;
@@ -2,5 +2,5 @@ import React from 'react';
2
2
  import { HierarchicalTrackSelectorModel } from '../model';
3
3
  declare const ShoppingCart: ({ model, }: {
4
4
  model: HierarchicalTrackSelectorModel;
5
- }) => React.JSX.Element;
5
+ }) => React.JSX.Element | null;
6
6
  export default ShoppingCart;
@@ -1,70 +1,28 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
4
  };
28
5
  Object.defineProperty(exports, "__esModule", { value: true });
29
- const react_1 = __importStar(require("react"));
6
+ const react_1 = __importDefault(require("react"));
30
7
  const material_1 = require("@mui/material");
31
- const mui_1 = require("tss-react/mui");
32
8
  const mobx_react_1 = require("mobx-react");
33
- const Menu_1 = __importDefault(require("@jbrowse/core/ui/Menu"));
34
9
  const util_1 = require("@jbrowse/core/util");
35
10
  // icons
36
11
  const ShoppingCart_1 = __importDefault(require("@mui/icons-material/ShoppingCart"));
37
- const useStyles = (0, mui_1.makeStyles)()(theme => ({
38
- searchBox: {
39
- margin: theme.spacing(2),
40
- },
41
- menuIcon: {
42
- marginRight: theme.spacing(1),
43
- marginBottom: 0,
44
- },
45
- }));
12
+ const CascadingMenuButton_1 = __importDefault(require("@jbrowse/core/ui/CascadingMenuButton"));
46
13
  const ShoppingCart = (0, mobx_react_1.observer)(function ({ model, }) {
47
- const { classes } = useStyles();
48
14
  const { selection } = model;
49
15
  const { pluginManager } = (0, util_1.getEnv)(model);
50
16
  const session = (0, util_1.getSession)(model);
51
- const [selectionEl, setSelectionEl] = (0, react_1.useState)();
52
17
  const items = pluginManager.evaluateExtensionPoint('TrackSelector-multiTrackMenuItems', [], { session });
53
- return (react_1.default.createElement(react_1.default.Fragment, null,
54
- selection.length ? (react_1.default.createElement(material_1.IconButton, { className: classes.menuIcon, onClick: event => setSelectionEl(event.currentTarget) },
55
- react_1.default.createElement(material_1.Badge, { badgeContent: selection.length, color: "primary" },
56
- react_1.default.createElement(ShoppingCart_1.default, null)))) : null,
57
- react_1.default.createElement(Menu_1.default, { anchorEl: selectionEl, open: Boolean(selectionEl), onMenuItemClick: (_, callback) => {
58
- callback();
59
- setSelectionEl(undefined);
60
- }, onClose: () => setSelectionEl(undefined), menuItems: [
61
- { label: 'Clear', onClick: () => model.clearSelection() },
62
- ...items.map(item => ({
63
- ...item,
64
- ...('onClick' in item
65
- ? { onClick: () => item.onClick(model) }
66
- : {}),
67
- })),
68
- ] })));
18
+ return selection.length ? (react_1.default.createElement(CascadingMenuButton_1.default, { menuItems: [
19
+ { label: 'Clear', onClick: () => model.clearSelection() },
20
+ ...items.map(item => ({
21
+ ...item,
22
+ ...('onClick' in item ? { onClick: () => item.onClick(model) } : {}),
23
+ })),
24
+ ] },
25
+ react_1.default.createElement(material_1.Badge, { badgeContent: selection.length, color: "primary" },
26
+ react_1.default.createElement(ShoppingCart_1.default, null)))) : null;
69
27
  });
70
28
  exports.default = ShoppingCart;
@@ -1,13 +1,11 @@
1
1
  import React from 'react';
2
- export default function FacetFilter({ column, vals, width, dispatch, filters, }: {
2
+ import { HierarchicalTrackSelectorModel } from '../../model';
3
+ declare const FacetFilter: ({ column, vals, width, model, }: {
3
4
  column: {
4
5
  field: string;
5
6
  };
6
7
  vals: [string, number][];
7
8
  width: number;
8
- dispatch: (arg: {
9
- key: string;
10
- val: string[];
11
- }) => void;
12
- filters: Record<string, string[]>;
13
- }): React.JSX.Element;
9
+ model: HierarchicalTrackSelectorModel;
10
+ }) => React.JSX.Element;
11
+ export default FacetFilter;
@@ -34,6 +34,7 @@ const Clear_1 = __importDefault(require("@mui/icons-material/Clear"));
34
34
  const Minimize_1 = __importDefault(require("@mui/icons-material/Minimize"));
35
35
  const Add_1 = __importDefault(require("@mui/icons-material/Add"));
36
36
  const util_1 = require("@jbrowse/core/util");
37
+ const mobx_react_1 = require("mobx-react");
37
38
  const useStyles = (0, mui_1.makeStyles)()(theme => ({
38
39
  facet: {
39
40
  margin: 0,
@@ -52,22 +53,22 @@ function ExpandButton({ visible, onClick, }) {
52
53
  return (react_1.default.createElement(material_1.Tooltip, { title: "Minimize/expand this facet filter" },
53
54
  react_1.default.createElement(material_1.IconButton, { onClick: () => onClick(), size: "small" }, visible ? react_1.default.createElement(Minimize_1.default, null) : react_1.default.createElement(Add_1.default, null))));
54
55
  }
55
- function FacetFilter({ column, vals, width, dispatch, filters, }) {
56
+ const FacetFilter = (0, mobx_react_1.observer)(function ({ column, vals, width, model, }) {
56
57
  const { classes } = useStyles();
57
58
  const [visible, setVisible] = (0, react_1.useState)(true);
59
+ const { faceted } = model;
60
+ const { filters } = faceted;
58
61
  return (react_1.default.createElement(material_1.FormControl, { key: column.field, className: classes.facet, style: { width } },
59
62
  react_1.default.createElement("div", { style: { display: 'flex' } },
60
63
  react_1.default.createElement(material_1.Typography, null, column.field),
61
- react_1.default.createElement(ClearButton, { onClick: () => dispatch({ key: column.field, val: [] }) }),
64
+ react_1.default.createElement(ClearButton, { onClick: () => model.faceted.setFilter(column.field, []) }),
62
65
  react_1.default.createElement(ExpandButton, { visible: visible, onClick: () => setVisible(!visible) })),
63
- visible ? (react_1.default.createElement(material_1.Select, { multiple: true, native: true, className: classes.select, value: filters[column.field], onChange: event => {
64
- dispatch({
65
- key: column.field,
66
- // @ts-expect-error
67
- val: [...event.target.options]
68
- .filter(opt => opt.selected)
69
- .map(opt => opt.value),
70
- });
66
+ visible ? (react_1.default.createElement(material_1.Select, { multiple: true, native: true, className: classes.select, value: filters.get(column.field) || [], onChange: event => {
67
+ faceted.setFilter(column.field,
68
+ // @ts-expect-error
69
+ [...event.target.options]
70
+ .filter(opt => opt.selected)
71
+ .map(opt => opt.value));
71
72
  } }, vals
72
73
  .sort((a, b) => a[0].localeCompare(b[0]))
73
74
  .map(([name, count]) => (react_1.default.createElement("option", { key: name, value: name },
@@ -75,5 +76,5 @@ function FacetFilter({ column, vals, width, dispatch, filters, }) {
75
76
  " (",
76
77
  count,
77
78
  ")"))))) : null));
78
- }
79
+ });
79
80
  exports.default = FacetFilter;
@@ -1,13 +1,11 @@
1
1
  import React from 'react';
2
- export default function FacetFilters({ rows, columns, dispatch, filters, width, }: {
2
+ import { HierarchicalTrackSelectorModel } from '../../model';
3
+ declare const FacetFilters: ({ rows, columns, width, model, }: {
3
4
  rows: Record<string, unknown>[];
4
- filters: Record<string, string[]>;
5
5
  columns: {
6
6
  field: string;
7
7
  }[];
8
- dispatch: (arg: {
9
- key: string;
10
- val: string[];
11
- }) => void;
12
8
  width: number;
13
- }): React.JSX.Element;
9
+ model: HierarchicalTrackSelectorModel;
10
+ }) => React.JSX.Element;
11
+ export default FacetFilters;
@@ -5,19 +5,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const FacetFilter_1 = __importDefault(require("./FacetFilter"));
8
- function FacetFilters({ rows, columns, dispatch, filters, width, }) {
8
+ const mobx_react_1 = require("mobx-react");
9
+ const FacetFilters = (0, mobx_react_1.observer)(function ({ rows, columns, width, model, }) {
9
10
  var _a, _b;
11
+ const { faceted } = model;
12
+ const { filters } = faceted;
10
13
  const facets = columns.slice(1);
11
14
  const uniqs = new Map(facets.map(f => [f.field, new Map()]));
12
15
  // this code "stages the facet filters" in order that the user has selected
13
16
  // them, which relies on the js behavior that the order of the returned keys is
14
17
  // related to the insertion order.
15
- const filterKeys = Object.keys(filters);
18
+ const filterKeys = faceted.filters.keys();
16
19
  const facetKeys = facets.map(f => f.field);
17
20
  const ret = new Set();
18
21
  for (const entry of filterKeys) {
19
22
  // give non-empty filters priority
20
- if ((_a = filters[entry]) === null || _a === void 0 ? void 0 : _a.length) {
23
+ if ((_a = filters.get(entry)) === null || _a === void 0 ? void 0 : _a.length) {
21
24
  ret.add(entry);
22
25
  }
23
26
  }
@@ -40,13 +43,13 @@ function FacetFilters({ rows, columns, dispatch, filters, width, }) {
40
43
  }
41
44
  }
42
45
  }
43
- const filter = ((_b = filters[facet]) === null || _b === void 0 ? void 0 : _b.length) ? new Set(filters[facet]) : undefined;
46
+ const filter = ((_b = filters.get(facet)) === null || _b === void 0 ? void 0 : _b.length)
47
+ ? new Set(filters.get(facet))
48
+ : undefined;
44
49
  currentRows = currentRows.filter(row => {
45
50
  return filter !== undefined ? filter.has(row[facet]) : true;
46
51
  });
47
52
  }
48
- return (react_1.default.createElement("div", null, facets.map(column => {
49
- return (react_1.default.createElement(FacetFilter_1.default, { key: column.field, vals: [...uniqs.get(column.field)], column: column, width: width, dispatch: dispatch, filters: filters }));
50
- })));
51
- }
53
+ return (react_1.default.createElement("div", null, facets.map(column => (react_1.default.createElement(FacetFilter_1.default, { key: column.field, vals: [...uniqs.get(column.field)], column: column, width: width, model: model })))));
54
+ });
52
55
  exports.default = FacetFilters;
@@ -1,15 +1,5 @@
1
1
  import React from 'react';
2
2
  import { HierarchicalTrackSelectorModel } from '../../model';
3
- export default function FacetedHeader({ setFilterText, setUseShoppingCart, setShowSparse, setShowFilters, setShowOptions, showOptions, showSparse, showFilters, useShoppingCart, filterText, model, }: {
4
- setFilterText: (arg: string) => void;
5
- setUseShoppingCart: (arg: boolean) => void;
6
- setShowSparse: (arg: boolean) => void;
7
- setShowFilters: (arg: boolean) => void;
8
- setShowOptions: (arg: boolean) => void;
9
- filterText: string;
10
- showOptions: boolean;
11
- useShoppingCart: boolean;
12
- showSparse: boolean;
13
- showFilters: boolean;
3
+ export default function FacetedHeader({ model, }: {
14
4
  model: HierarchicalTrackSelectorModel;
15
5
  }): React.JSX.Element;
@@ -34,14 +34,16 @@ const Clear_1 = __importDefault(require("@mui/icons-material/Clear"));
34
34
  const MoreVert_1 = __importDefault(require("@mui/icons-material/MoreVert"));
35
35
  // locals
36
36
  const ShoppingCart_1 = __importDefault(require("../ShoppingCart"));
37
- function FacetedHeader({ setFilterText, setUseShoppingCart, setShowSparse, setShowFilters, setShowOptions, showOptions, showSparse, showFilters, useShoppingCart, filterText, model, }) {
37
+ function FacetedHeader({ model, }) {
38
+ const { faceted } = model;
38
39
  const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
40
+ const { showOptions, showFilters, showSparse, useShoppingCart } = faceted;
39
41
  return (react_1.default.createElement(react_1.default.Fragment, null,
40
42
  react_1.default.createElement(material_1.Grid, { container: true, spacing: 4, alignItems: "center" },
41
43
  react_1.default.createElement(material_1.Grid, { item: true },
42
- react_1.default.createElement(material_1.TextField, { label: "Search...", value: filterText, onChange: event => setFilterText(event.target.value), InputProps: {
44
+ react_1.default.createElement(material_1.TextField, { label: "Search...", value: faceted.filterText, onChange: event => faceted.setFilterText(event.target.value), InputProps: {
43
45
  endAdornment: (react_1.default.createElement(material_1.InputAdornment, { position: "end" },
44
- react_1.default.createElement(material_1.IconButton, { onClick: () => setFilterText('') },
46
+ react_1.default.createElement(material_1.IconButton, { onClick: () => faceted.setFilterText('') },
45
47
  react_1.default.createElement(Clear_1.default, null)))),
46
48
  } })),
47
49
  react_1.default.createElement(material_1.Grid, { item: true },
@@ -55,25 +57,25 @@ function FacetedHeader({ setFilterText, setUseShoppingCart, setShowSparse, setSh
55
57
  }, menuItems: [
56
58
  {
57
59
  label: 'Add tracks to selection instead of turning them on/off',
58
- onClick: () => setUseShoppingCart(!useShoppingCart),
60
+ onClick: () => faceted.setUseShoppingCart(!useShoppingCart),
59
61
  type: 'checkbox',
60
62
  checked: useShoppingCart,
61
63
  },
62
64
  {
63
65
  label: 'Show sparse metadata columns',
64
- onClick: () => setShowSparse(!showSparse),
66
+ onClick: () => faceted.setShowSparse(!showSparse),
65
67
  checked: showSparse,
66
68
  type: 'checkbox',
67
69
  },
68
70
  {
69
71
  label: 'Show facet filters',
70
- onClick: () => setShowFilters(!showFilters),
72
+ onClick: () => faceted.setShowFilters(!showFilters),
71
73
  checked: showFilters,
72
74
  type: 'checkbox',
73
75
  },
74
76
  {
75
77
  label: 'Show extra table options',
76
- onClick: () => setShowOptions(!showOptions),
78
+ onClick: () => faceted.setShowOptions(!showOptions),
77
79
  checked: showOptions,
78
80
  type: 'checkbox',
79
81
  },