@jbrowse/plugin-data-management 2.13.1 → 2.15.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 (97) hide show
  1. package/dist/AddConnectionWidget/components/AddConnectionWidget.js +3 -1
  2. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +3 -1
  3. package/dist/AddTrackWidget/components/AddTrackWidget.js +3 -1
  4. package/dist/AddTrackWidget/components/ConfirmTrack.js +10 -6
  5. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js +2 -3
  6. package/dist/AddTrackWidget/components/PasteConfigWorkflow.js +6 -2
  7. package/dist/AddTrackWidget/components/TextIndexingConfig.js +16 -8
  8. package/dist/AddTrackWidget/components/TrackAdapterSelector.js +3 -1
  9. package/dist/AddTrackWidget/components/TrackTypeSelector.js +3 -1
  10. package/dist/AddTrackWidget/model.js +1 -1
  11. package/dist/AssemblyManager/AssemblyAddForm.d.ts +3 -2
  12. package/dist/AssemblyManager/AssemblyAddForm.js +38 -18
  13. package/dist/AssemblyManager/AssemblyManager.js +15 -5
  14. package/dist/AssemblyManager/AssemblyTable.js +3 -1
  15. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +6 -2
  16. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +13 -2
  17. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +7 -7
  18. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js +4 -4
  19. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js +6 -2
  20. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +4 -2
  21. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +12 -4
  22. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +24 -8
  23. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +8 -4
  24. package/dist/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.js +6 -2
  25. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +36 -12
  26. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +9 -3
  27. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +5 -1
  28. package/dist/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.js +6 -2
  29. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +3 -1
  30. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +4 -2
  31. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.js +12 -4
  32. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.js +3 -1
  33. package/dist/HierarchicalTrackSelectorWidget/components/util.d.ts +1 -1
  34. package/dist/HierarchicalTrackSelectorWidget/components/util.js +1 -1
  35. package/dist/HierarchicalTrackSelectorWidget/facetedModel.d.ts +1 -1
  36. package/dist/HierarchicalTrackSelectorWidget/facetedModel.js +1 -0
  37. package/dist/HierarchicalTrackSelectorWidget/model.d.ts +1 -1
  38. package/dist/HierarchicalTrackSelectorWidget/model.js +1 -1
  39. package/dist/PluginStoreWidget/components/AddCustomPluginDialog.js +15 -5
  40. package/dist/PluginStoreWidget/components/DeletePluginDialog.js +6 -2
  41. package/dist/PluginStoreWidget/components/InstalledPlugin.js +4 -3
  42. package/dist/PluginStoreWidget/components/PluginCard.js +1 -1
  43. package/dist/PluginStoreWidget/components/PluginStoreWidget.js +12 -4
  44. package/dist/ucsc-trackhub/doConnect.d.ts +5 -1
  45. package/dist/ucsc-trackhub/doConnect.js +0 -1
  46. package/dist/ucsc-trackhub/model.d.ts +23 -3
  47. package/dist/ucsc-trackhub/ucscTrackHub.d.ts +7 -7
  48. package/dist/ucsc-trackhub/ucscTrackHub.js +8 -10
  49. package/esm/AddConnectionWidget/components/AddConnectionWidget.js +3 -1
  50. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.js +3 -1
  51. package/esm/AddTrackWidget/components/AddTrackWidget.js +3 -1
  52. package/esm/AddTrackWidget/components/ConfirmTrack.js +10 -6
  53. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +2 -3
  54. package/esm/AddTrackWidget/components/PasteConfigWorkflow.js +6 -2
  55. package/esm/AddTrackWidget/components/TextIndexingConfig.js +16 -8
  56. package/esm/AddTrackWidget/components/TrackAdapterSelector.js +3 -1
  57. package/esm/AddTrackWidget/components/TrackTypeSelector.js +3 -1
  58. package/esm/AddTrackWidget/model.js +1 -1
  59. package/esm/AssemblyManager/AssemblyAddForm.d.ts +3 -2
  60. package/esm/AssemblyManager/AssemblyAddForm.js +38 -18
  61. package/esm/AssemblyManager/AssemblyManager.js +15 -5
  62. package/esm/AssemblyManager/AssemblyTable.js +3 -1
  63. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +6 -2
  64. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +13 -2
  65. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +7 -7
  66. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js +4 -4
  67. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js +6 -2
  68. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +4 -2
  69. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +12 -4
  70. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +24 -8
  71. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +8 -4
  72. package/esm/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.js +6 -2
  73. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +36 -12
  74. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +9 -3
  75. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +5 -1
  76. package/esm/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.js +6 -2
  77. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +3 -1
  78. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +4 -2
  79. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.js +12 -4
  80. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.js +3 -1
  81. package/esm/HierarchicalTrackSelectorWidget/components/util.d.ts +1 -1
  82. package/esm/HierarchicalTrackSelectorWidget/components/util.js +1 -1
  83. package/esm/HierarchicalTrackSelectorWidget/facetedModel.d.ts +1 -1
  84. package/esm/HierarchicalTrackSelectorWidget/facetedModel.js +1 -0
  85. package/esm/HierarchicalTrackSelectorWidget/model.d.ts +1 -1
  86. package/esm/HierarchicalTrackSelectorWidget/model.js +1 -1
  87. package/esm/PluginStoreWidget/components/AddCustomPluginDialog.js +15 -5
  88. package/esm/PluginStoreWidget/components/DeletePluginDialog.js +6 -2
  89. package/esm/PluginStoreWidget/components/InstalledPlugin.js +4 -3
  90. package/esm/PluginStoreWidget/components/PluginCard.js +1 -1
  91. package/esm/PluginStoreWidget/components/PluginStoreWidget.js +12 -4
  92. package/esm/ucsc-trackhub/doConnect.d.ts +5 -1
  93. package/esm/ucsc-trackhub/doConnect.js +0 -1
  94. package/esm/ucsc-trackhub/model.d.ts +23 -3
  95. package/esm/ucsc-trackhub/ucscTrackHub.d.ts +7 -7
  96. package/esm/ucsc-trackhub/ucscTrackHub.js +8 -10
  97. package/package.json +5 -5
@@ -67,10 +67,10 @@ const FacetedSelector = (0, mobx_react_1.observer)(function FacetedSelector({ mo
67
67
  (0, util_1.measureGridWidth)(rows.map(r => r[e]), { maxWidth: 400, stripHTML: true }),
68
68
  ])),
69
69
  ...Object.fromEntries(filteredMetadataKeys
70
- .filter(f => visible['metadata.' + f])
70
+ .filter(f => visible[`metadata.${f}`])
71
71
  .map(e => {
72
72
  return [
73
- 'metadata.' + e,
73
+ `metadata.${e}`,
74
74
  (0, util_1.measureGridWidth)(rows.map(r => r.metadata[e]), { maxWidth: 400, stripHTML: true }),
75
75
  ];
76
76
  })),
@@ -106,7 +106,7 @@ const FacetedSelector = (0, mobx_react_1.observer)(function FacetedSelector({ mo
106
106
  headerName: ['name', ...filteredNonMetadataKeys].includes(e)
107
107
  ? `${e} (from metadata)`
108
108
  : e,
109
- width: (_a = widths['metadata.' + e]) !== null && _a !== void 0 ? _a : 100,
109
+ width: (_a = widths[`metadata.${e}`]) !== null && _a !== void 0 ? _a : 100,
110
110
  valueGetter: (_, row) => { var _a; return `${(_a = row.metadata[e]) !== null && _a !== void 0 ? _a : ''}`; },
111
111
  renderCell: params => {
112
112
  const val = params.value;
@@ -127,7 +127,11 @@ const FacetedSelector = (0, mobx_react_1.observer)(function FacetedSelector({ mo
127
127
  height: window.innerHeight * frac,
128
128
  width: window.innerWidth * frac - (showFilters ? panelWidth : 0),
129
129
  } },
130
- react_1.default.createElement(x_data_grid_1.DataGrid, { rows: filteredRows, onColumnWidthChange: arg => setWidths({ ...widths, [arg.colDef.field]: arg.width }), columnVisibilityModel: visible, onColumnVisibilityModelChange: n => faceted.setVisible(n), columnHeaderHeight: 35, checkboxSelection: true, disableRowSelectionOnClick: true, keepNonExistentRowsSelected: true, onRowSelectionModelChange: userSelectedIds => {
130
+ react_1.default.createElement(x_data_grid_1.DataGrid, { rows: filteredRows, onColumnWidthChange: arg => {
131
+ setWidths({ ...widths, [arg.colDef.field]: arg.width });
132
+ }, columnVisibilityModel: visible, onColumnVisibilityModelChange: n => {
133
+ faceted.setVisible(n);
134
+ }, columnHeaderHeight: 35, checkboxSelection: true, disableRowSelectionOnClick: true, keepNonExistentRowsSelected: true, onRowSelectionModelChange: userSelectedIds => {
131
135
  if (!useShoppingCart) {
132
136
  const a1 = shownTrackIds;
133
137
  const a2 = new Set(userSelectedIds);
@@ -21,12 +21,16 @@ const useStyles = (0, mui_1.makeStyles)()({
21
21
  const FavoriteTracks = (0, mobx_react_1.observer)(function ({ model, }) {
22
22
  const { classes } = useStyles();
23
23
  const { view, favoriteTracks } = model;
24
- return view ? (react_1.default.createElement(DropdownTrackSelector_1.default, { onClick: () => model.setFavoritesCounter(0), tracks: favoriteTracks, model: model, extraMenuItems: favoriteTracks.length
24
+ return view ? (react_1.default.createElement(DropdownTrackSelector_1.default, { onClick: () => {
25
+ model.setFavoritesCounter(0);
26
+ }, tracks: favoriteTracks, model: model, extraMenuItems: favoriteTracks.length
25
27
  ? [
26
28
  { type: 'divider' },
27
29
  {
28
30
  label: 'Clear favorites',
29
- onClick: () => model.clearFavorites(),
31
+ onClick: () => {
32
+ model.clearFavorites();
33
+ },
30
34
  },
31
35
  ]
32
36
  : [
@@ -98,7 +98,9 @@ const HamburgerMenu = (0, mobx_react_1.observer)(function ({ model, }) {
98
98
  ? [
99
99
  {
100
100
  label: 'Turn on/off connections...',
101
- onClick: () => setConnectionToggleOpen(true),
101
+ onClick: () => {
102
+ setConnectionToggleOpen(true);
103
+ },
102
104
  },
103
105
  ]
104
106
  : []),
@@ -114,7 +116,9 @@ const HamburgerMenu = (0, mobx_react_1.observer)(function ({ model, }) {
114
116
  },
115
117
  {
116
118
  label: 'Delete connections...',
117
- onClick: () => setConnectionManagerOpen(true),
119
+ onClick: () => {
120
+ setConnectionManagerOpen(true);
121
+ },
118
122
  },
119
123
  ]
120
124
  : []),
@@ -128,13 +132,17 @@ const HamburgerMenu = (0, mobx_react_1.observer)(function ({ model, }) {
128
132
  label: 'Sort tracks by name',
129
133
  type: 'checkbox',
130
134
  checked: model.activeSortTrackNames,
131
- onClick: () => model.setSortTrackNames(!model.activeSortTrackNames),
135
+ onClick: () => {
136
+ model.setSortTrackNames(!model.activeSortTrackNames);
137
+ },
132
138
  },
133
139
  {
134
140
  label: 'Sort categories by name',
135
141
  type: 'checkbox',
136
142
  checked: model.activeSortCategories,
137
- onClick: () => model.setSortCategories(!model.activeSortCategories),
143
+ onClick: () => {
144
+ model.setSortCategories(!model.activeSortCategories);
145
+ },
138
146
  },
139
147
  ],
140
148
  },
@@ -146,27 +154,43 @@ const HamburgerMenu = (0, mobx_react_1.observer)(function ({ model, }) {
146
154
  ? [
147
155
  {
148
156
  label: 'Collapse subcategories',
149
- onClick: () => model.collapseSubCategories(),
157
+ onClick: () => {
158
+ model.collapseSubCategories();
159
+ },
150
160
  },
151
161
  ]
152
162
  : []),
153
163
  {
154
164
  label: 'Collapse top-level categories',
155
- onClick: () => model.collapseTopLevelCategories(),
165
+ onClick: () => {
166
+ model.collapseTopLevelCategories();
167
+ },
156
168
  },
157
169
  {
158
170
  label: 'Expand all categories',
159
- onClick: () => model.expandAllCategories(),
171
+ onClick: () => {
172
+ model.expandAllCategories();
173
+ },
160
174
  },
161
175
  ],
162
176
  },
163
177
  ] },
164
178
  react_1.default.createElement(Menu_1.default, null)),
165
179
  react_1.default.createElement(react_1.Suspense, { fallback: null },
166
- modalInfo ? (react_1.default.createElement(CloseConnectionDialog, { modalInfo: modalInfo, onClose: () => setModalInfo(undefined) })) : null,
167
- deleteDialogDetails ? (react_1.default.createElement(DeleteConnectionDialog, { handleClose: () => setDeleteDialogDetails(undefined), deleteDialogDetails: deleteDialogDetails, session: session })) : null,
168
- connectionManagerOpen ? (react_1.default.createElement(ManageConnectionsDialog, { handleClose: () => setConnectionManagerOpen(false), breakConnection: breakConnection, session: session })) : null,
169
- connectionToggleOpen ? (react_1.default.createElement(ToggleConnectionsDialog, { handleClose: () => setConnectionToggleOpen(false), session: session, breakConnection: breakConnection })) : null,
170
- facetedOpen ? (react_1.default.createElement(FacetedDialog, { handleClose: () => setFacetedOpen(false), model: model })) : null)));
180
+ modalInfo ? (react_1.default.createElement(CloseConnectionDialog, { modalInfo: modalInfo, onClose: () => {
181
+ setModalInfo(undefined);
182
+ } })) : null,
183
+ deleteDialogDetails ? (react_1.default.createElement(DeleteConnectionDialog, { handleClose: () => {
184
+ setDeleteDialogDetails(undefined);
185
+ }, deleteDialogDetails: deleteDialogDetails, session: session })) : null,
186
+ connectionManagerOpen ? (react_1.default.createElement(ManageConnectionsDialog, { handleClose: () => {
187
+ setConnectionManagerOpen(false);
188
+ }, breakConnection: breakConnection, session: session })) : null,
189
+ connectionToggleOpen ? (react_1.default.createElement(ToggleConnectionsDialog, { handleClose: () => {
190
+ setConnectionToggleOpen(false);
191
+ }, session: session, breakConnection: breakConnection })) : null,
192
+ facetedOpen ? (react_1.default.createElement(FacetedDialog, { handleClose: () => {
193
+ setFacetedOpen(false);
194
+ }, model: model })) : null)));
171
195
  });
172
196
  exports.default = HamburgerMenu;
@@ -21,14 +21,20 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
21
21
  const SearchTracksTextField = (0, mobx_react_1.observer)(function ({ model, }) {
22
22
  const { filterText } = model;
23
23
  const { classes } = useStyles();
24
- return (react_1.default.createElement(material_1.TextField, { className: classes.searchBox, label: "Filter tracks", value: filterText, onChange: event => model.setFilterText(event.target.value), fullWidth: true, InputProps: {
24
+ return (react_1.default.createElement(material_1.TextField, { className: classes.searchBox, label: "Filter tracks", value: filterText, onChange: event => {
25
+ model.setFilterText(event.target.value);
26
+ }, fullWidth: true, InputProps: {
25
27
  endAdornment: (react_1.default.createElement(material_1.InputAdornment, { position: "end" },
26
- react_1.default.createElement(material_1.IconButton, { onClick: () => model.clearFilterText() },
28
+ react_1.default.createElement(material_1.IconButton, { onClick: () => {
29
+ model.clearFilterText();
30
+ } },
27
31
  react_1.default.createElement(Clear_1.default, null)))),
28
32
  } }));
29
33
  });
30
34
  const HierarchicalTrackSelectorHeader = (0, mobx_react_1.observer)(function ({ model, setHeaderHeight, }) {
31
- return (react_1.default.createElement("div", { ref: ref => setHeaderHeight((ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect().height) || 0), "data-testid": "hierarchical_track_selector" },
35
+ return (react_1.default.createElement("div", { ref: ref => {
36
+ setHeaderHeight((ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect().height) || 0);
37
+ }, "data-testid": "hierarchical_track_selector" },
32
38
  react_1.default.createElement("div", { style: { display: 'flex' } },
33
39
  react_1.default.createElement(HamburgerMenu_1.default, { model: model }),
34
40
  react_1.default.createElement(ShoppingCart_1.default, { model: model }),
@@ -64,7 +64,9 @@ const HierarchicalTree = (0, mobx_react_1.observer)(function HierarchicalTree({
64
64
  model.addToRecentlyUsed(trackId);
65
65
  }
66
66
  },
67
- toggleCollapse: (pathName) => model.toggleCategory(pathName),
67
+ toggleCollapse: (pathName) => {
68
+ model.toggleCategory(pathName);
69
+ },
68
70
  tree,
69
71
  model,
70
72
  drawerPosition,
@@ -77,6 +79,7 @@ const HierarchicalTree = (0, mobx_react_1.observer)(function HierarchicalTree({
77
79
  for (const child of tree.children) {
78
80
  yield getNodeData(child, 0, extra, obj);
79
81
  }
82
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
80
83
  while (true) {
81
84
  // @ts-expect-error
82
85
  const parentMeta = yield;
@@ -86,6 +89,7 @@ const HierarchicalTree = (0, mobx_react_1.observer)(function HierarchicalTree({
86
89
  }
87
90
  }
88
91
  }, [tree, extra, obj]);
92
+ /* biome-ignore lint/correctness/useExhaustiveDependencies: */
89
93
  (0, react_1.useEffect)(() => {
90
94
  // @ts-expect-error
91
95
  treeRef.current.recomputeTree({
@@ -18,12 +18,16 @@ const useStyles = (0, mui_1.makeStyles)()({
18
18
  const RecentlyUsedTracks = (0, mobx_react_1.observer)(function ({ model, }) {
19
19
  const { classes } = useStyles();
20
20
  const { view, recentlyUsedCounter, recentlyUsedTracks } = model;
21
- return view ? (react_1.default.createElement(DropdownTrackSelector_1.default, { onClick: () => model.setRecentlyUsedCounter(0), model: model, tracks: recentlyUsedTracks, extraMenuItems: recentlyUsedTracks.length
21
+ return view ? (react_1.default.createElement(DropdownTrackSelector_1.default, { onClick: () => {
22
+ model.setRecentlyUsedCounter(0);
23
+ }, model: model, tracks: recentlyUsedTracks, extraMenuItems: recentlyUsedTracks.length
22
24
  ? [
23
25
  { type: 'divider' },
24
26
  {
25
27
  label: 'Clear recently used',
26
- onClick: () => model.clearRecentlyUsed(),
28
+ onClick: () => {
29
+ model.clearRecentlyUsed();
30
+ },
27
31
  },
28
32
  ]
29
33
  : [
@@ -107,5 +107,7 @@ function Category({ isOpen, setOpen, data, }) {
107
107
  ], onMenuItemClick: (_event, callback) => {
108
108
  callback();
109
109
  setMenuEl(null);
110
- }, open: Boolean(menuEl), onClose: () => setMenuEl(null) })) : null));
110
+ }, open: Boolean(menuEl), onClose: () => {
111
+ setMenuEl(null);
112
+ } })) : null));
111
113
  }
@@ -29,10 +29,12 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
29
29
  function TrackLabel({ data }) {
30
30
  const { classes } = useStyles();
31
31
  const { checked, conf, model, drawerPosition, id, trackId, name, onChange, selected, } = data;
32
- const description = (conf && (0, configuration_1.readConfObject)(conf, 'description')) || '';
32
+ const description = (0, configuration_1.readConfObject)(conf, 'description');
33
33
  return (react_1.default.createElement(react_1.default.Fragment, null,
34
34
  react_1.default.createElement(material_1.Tooltip, { title: description + (selected ? ' (in selection)' : ''), placement: drawerPosition === 'left' ? 'right' : 'left' },
35
- react_1.default.createElement(material_1.FormControlLabel, { className: classes.checkboxLabel, control: react_1.default.createElement(material_1.Checkbox, { className: classes.compactCheckbox, checked: checked, onChange: () => onChange(trackId), disabled: (0, util_1.isUnsupported)(name), inputProps: {
35
+ react_1.default.createElement(material_1.FormControlLabel, { className: classes.checkboxLabel, control: react_1.default.createElement(material_1.Checkbox, { className: classes.compactCheckbox, checked: checked, onChange: () => {
36
+ onChange(trackId);
37
+ }, disabled: (0, util_1.isUnsupported)(name), inputProps: {
36
38
  // @ts-expect-error
37
39
  'data-testid': `htsTrackEntry-${id}`,
38
40
  } }), label: react_1.default.createElement("div", { "data-testid": `htsTrackLabel-${id}`, style: { background: selected ? '#cccc' : undefined } },
@@ -24,23 +24,31 @@ const TrackLabelMenu = function ({ id, trackId, stopPropagation, model, setOpen,
24
24
  model.isFavorite(trackId)
25
25
  ? {
26
26
  label: 'Remove from favorites',
27
- onClick: () => model.removeFromFavorites(trackId),
27
+ onClick: () => {
28
+ model.removeFromFavorites(trackId);
29
+ },
28
30
  icon: StarBorderOutlined_1.default,
29
31
  }
30
32
  : {
31
33
  label: 'Add to favorites',
32
- onClick: () => model.addToFavorites(trackId),
34
+ onClick: () => {
35
+ model.addToFavorites(trackId);
36
+ },
33
37
  icon: Star_1.default,
34
38
  },
35
39
  {
36
40
  label: 'Add to selection',
37
- onClick: () => model.addToSelection([conf]),
41
+ onClick: () => {
42
+ model.addToSelection([conf]);
43
+ },
38
44
  },
39
45
  ...(model.isSelected(conf)
40
46
  ? [
41
47
  {
42
48
  label: 'Remove from selection',
43
- onClick: () => model.removeFromSelection([conf]),
49
+ onClick: () => {
50
+ model.removeFromSelection([conf]);
51
+ },
44
52
  },
45
53
  ]
46
54
  : []),
@@ -43,7 +43,9 @@ function Node({ data, isOpen, style, setOpen, }) {
43
43
  const width = 10;
44
44
  const marginLeft = nestingLevel * width + (isLeaf ? width : 0);
45
45
  return (react_1.default.createElement("div", { style: style, className: !isLeaf ? classes.accordionBase : undefined },
46
- new Array(nestingLevel).fill(0).map((_, idx) => (react_1.default.createElement("div", { key: `mark-${idx}`, style: { left: idx * width + 4, height: style === null || style === void 0 ? void 0 : style.height }, className: classes.nestingLevelMarker }))),
46
+ new Array(nestingLevel).fill(0).map((_, idx) => (react_1.default.createElement("div", {
47
+ /* biome-ignore lint/suspicious/noArrayIndexKey: */
48
+ key: `mark-${idx}`, style: { left: idx * width + 4, height: style === null || style === void 0 ? void 0 : style.height }, className: classes.nestingLevelMarker }))),
47
49
  react_1.default.createElement("div", { className: !isLeaf ? classes.accordionCard : undefined, style: {
48
50
  marginLeft,
49
51
  whiteSpace: 'nowrap',
@@ -11,7 +11,7 @@ export interface NodeData {
11
11
  trackId: string;
12
12
  isLeaf: boolean;
13
13
  name: string;
14
- onChange: Function;
14
+ onChange: (trackId: string) => void;
15
15
  toggleCollapse: (arg: string) => void;
16
16
  tree: TreeNode;
17
17
  selected: boolean;
@@ -8,7 +8,7 @@ function getAllChildren(subtree) {
8
8
  return (subtree === null || subtree === void 0 ? void 0 : subtree.type) === 'category'
9
9
  ? subtree.children
10
10
  .map(t => (t.type === 'category' ? getAllChildren(t) : t.conf))
11
- .flat(Infinity)
11
+ .flat(Number.POSITIVE_INFINITY)
12
12
  : [];
13
13
  }
14
14
  function treeToMap(tree, map = new Map()) {
@@ -35,7 +35,7 @@ export declare function facetedStateTreeF(): import("mobx-state-tree").IModelTyp
35
35
  /**
36
36
  * #action
37
37
  */
38
- setPanelWidth(width: number): void;
38
+ setPanelWidth(width: number): number;
39
39
  /**
40
40
  * #action
41
41
  */
@@ -54,6 +54,7 @@ function facetedStateTreeF() {
54
54
  */
55
55
  setPanelWidth(width) {
56
56
  self.panelWidth = width;
57
+ return self.panelWidth;
57
58
  },
58
59
  /**
59
60
  * #action
@@ -34,7 +34,7 @@ export default function stateTreeFactory(pluginManager: PluginManager): import("
34
34
  filters: import("mobx").ObservableMap<string, string[]>;
35
35
  } & {
36
36
  setFilter(key: string, value: string[]): void;
37
- setPanelWidth(width: number): void;
37
+ setPanelWidth(width: number): number;
38
38
  setUseShoppingCart(f: boolean): void;
39
39
  setFilterText(str: string): void;
40
40
  setShowSparse(f: boolean): void;
@@ -364,7 +364,7 @@ function stateTreeFactory(pluginManager) {
364
364
  const { connectionInstances = [] } = (0, util_1.getSession)(self);
365
365
  return [
366
366
  ...this.configAndSessionTrackConfigurations,
367
- ...((connectionInstances === null || connectionInstances === void 0 ? void 0 : connectionInstances.flatMap(c => c.tracks)) || []),
367
+ ...connectionInstances.flatMap(c => c.tracks),
368
368
  ];
369
369
  },
370
370
  /**
@@ -75,9 +75,15 @@ const AddCustomPluginDialog = (0, mobx_react_1.observer)(function ({ onClose, mo
75
75
  react_1.default.createElement("form", { onSubmit: handleSubmit },
76
76
  react_1.default.createElement(material_1.DialogContent, { className: classes.dialogContent },
77
77
  react_1.default.createElement(material_1.DialogContentText, null, "Enter the name of the plugin and its URL. The name should match what is defined in the plugin's build."),
78
- react_1.default.createElement(material_1.TextField, { label: "Plugin name", variant: "outlined", value: umdPluginName, onChange: event => setUMDPluginName(event.target.value) }),
79
- react_1.default.createElement(material_1.TextField, { label: "Plugin URL", variant: "outlined", value: umdPluginUrl, onChange: event => setUMDPluginUrl(event.target.value) }),
80
- react_1.default.createElement(material_1.DialogContentText, { onClick: () => setAdvancedOptionsOpen(!advancedOptionsOpen) },
78
+ react_1.default.createElement(material_1.TextField, { label: "Plugin name", variant: "outlined", value: umdPluginName, onChange: event => {
79
+ setUMDPluginName(event.target.value);
80
+ } }),
81
+ react_1.default.createElement(material_1.TextField, { label: "Plugin URL", variant: "outlined", value: umdPluginUrl, onChange: event => {
82
+ setUMDPluginUrl(event.target.value);
83
+ } }),
84
+ react_1.default.createElement(material_1.DialogContentText, { onClick: () => {
85
+ setAdvancedOptionsOpen(!advancedOptionsOpen);
86
+ } },
81
87
  react_1.default.createElement(IconButton_1.default, { className: cx(classes.expand, {
82
88
  [classes.expandOpen]: advancedOptionsOpen,
83
89
  }), "aria-expanded": advancedOptionsOpen, "aria-label": "show more" },
@@ -86,8 +92,12 @@ const AddCustomPluginDialog = (0, mobx_react_1.observer)(function ({ onClose, mo
86
92
  react_1.default.createElement(material_1.Collapse, { in: advancedOptionsOpen },
87
93
  react_1.default.createElement("div", { className: classes.dialogContent },
88
94
  react_1.default.createElement(material_1.DialogContentText, null, "The above fields assume that the plugin is built in UMD format. If your plugin is in another format, or you have additional builds you want to add (such as a CJS build for using NodeJS APIs in desktop), you can enter the URLs for those builds below."),
89
- react_1.default.createElement(material_1.TextField, { label: "ESM build URL", variant: "outlined", value: esmPluginUrl, onChange: event => setESMPluginUrl(event.target.value) }),
90
- react_1.default.createElement(material_1.TextField, { label: "CJS build URL", variant: "outlined", value: cjsPluginUrl, onChange: event => setCJSPluginUrl(event.target.value) })))),
95
+ react_1.default.createElement(material_1.TextField, { label: "ESM build URL", variant: "outlined", value: esmPluginUrl, onChange: event => {
96
+ setESMPluginUrl(event.target.value);
97
+ } }),
98
+ react_1.default.createElement(material_1.TextField, { label: "CJS build URL", variant: "outlined", value: cjsPluginUrl, onChange: event => {
99
+ setCJSPluginUrl(event.target.value);
100
+ } })))),
91
101
  react_1.default.createElement(material_1.DialogActions, null,
92
102
  react_1.default.createElement(material_1.Button, { variant: "contained", onClick: onClose }, "Cancel"),
93
103
  react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", onClick: handleSubmit, disabled: !ready }, "Submit")))));
@@ -8,7 +8,9 @@ const react_1 = __importDefault(require("react"));
8
8
  const material_1 = require("@mui/material");
9
9
  const ui_1 = require("@jbrowse/core/ui");
10
10
  function DeletePluginDialog({ onClose, plugin, }) {
11
- return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: () => onClose(), title: `Remove ${plugin}` },
11
+ return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: () => {
12
+ onClose();
13
+ }, title: `Remove ${plugin}` },
12
14
  react_1.default.createElement(material_1.DialogContent, null,
13
15
  react_1.default.createElement(material_1.Typography, null,
14
16
  "Please confirm that you want to remove ",
@@ -22,5 +24,7 @@ function DeletePluginDialog({ onClose, plugin, }) {
22
24
  onClose(plugin);
23
25
  }, 500);
24
26
  } }, "Confirm"),
25
- react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => onClose() }, "Cancel"))));
27
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => {
28
+ onClose();
29
+ } }, "Cancel"))));
26
30
  }
@@ -47,13 +47,12 @@ function LockedPlugin() {
47
47
  react_1.default.createElement(Lock_1.default, null)));
48
48
  }
49
49
  const InstalledPlugin = (0, mobx_react_1.observer)(function ({ plugin, model, }) {
50
- var _a;
51
50
  const [dialogPlugin, setDialogPlugin] = (0, react_1.useState)();
52
51
  const { pluginManager } = (0, util_1.getEnv)(model);
53
52
  const session = (0, util_1.getSession)(model);
54
53
  const { jbrowse, adminMode } = session;
55
54
  const isSessionPlugin = (0, types_1.isSessionWithSessionPlugins)(session)
56
- ? (_a = session.sessionPlugins) === null || _a === void 0 ? void 0 : _a.some(p => pluginManager.pluginMetadata[plugin.name].url === p.url)
55
+ ? session.sessionPlugins.some(p => { var _a; return ((_a = pluginManager.pluginMetadata[plugin.name]) === null || _a === void 0 ? void 0 : _a.url) === p.url; })
57
56
  : false;
58
57
  return (react_1.default.createElement(react_1.default.Fragment, null,
59
58
  dialogPlugin ? (react_1.default.createElement(react_1.Suspense, { fallback: null },
@@ -70,7 +69,9 @@ const InstalledPlugin = (0, mobx_react_1.observer)(function ({ plugin, model, })
70
69
  setDialogPlugin(undefined);
71
70
  } }))) : null,
72
71
  react_1.default.createElement(material_1.ListItem, { key: plugin.name },
73
- adminMode || isSessionPlugin ? (react_1.default.createElement(material_1.IconButton, { "data-testid": `removePlugin-${plugin.name}`, onClick: () => setDialogPlugin(plugin.name) },
72
+ adminMode || isSessionPlugin ? (react_1.default.createElement(material_1.IconButton, { "data-testid": `removePlugin-${plugin.name}`, onClick: () => {
73
+ setDialogPlugin(plugin.name);
74
+ } },
74
75
  react_1.default.createElement(Close_1.default, null))) : (react_1.default.createElement(LockedPlugin, null)),
75
76
  react_1.default.createElement(material_1.Typography, null, plugin.name))));
76
77
  });
@@ -58,10 +58,10 @@ const PluginCard = (0, mobx_react_1.observer)(function PluginCard({ plugin, mode
58
58
  const session = (0, util_1.getSession)(model);
59
59
  const { pluginManager } = (0, util_1.getEnv)(model);
60
60
  const { runtimePluginDefinitions } = pluginManager;
61
+ // @ts-expect-error
61
62
  const isInstalled = runtimePluginDefinitions.some(d => d.url === plugin.url);
62
63
  const [tempDisabled, setTempDisabled] = (0, react_1.useState)(false);
63
64
  const disableButton = isInstalled || tempDisabled;
64
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
65
65
  const rootModel = (0, mobx_state_tree_1.getParent)(model, 3);
66
66
  const { jbrowse } = rootModel;
67
67
  return (react_1.default.createElement(material_1.Card, { variant: "outlined", key: plugin.name, className: classes.card },
@@ -73,12 +73,20 @@ const PluginStoreWidget = (0, mobx_react_1.observer)(function ({ model, }) {
73
73
  "You are using the ",
74
74
  react_1.default.createElement("code", null, "admin-server"),
75
75
  ". Any changes you make will be saved to your configuration file. You also have the ability to add custom plugins that are not in the store."))),
76
- react_1.default.createElement(material_1.Button, { className: classes.customPluginButton, variant: "contained", onClick: () => setOpen(true) }, "Add custom plugin"),
76
+ react_1.default.createElement(material_1.Button, { className: classes.customPluginButton, variant: "contained", onClick: () => {
77
+ setOpen(true);
78
+ } }, "Add custom plugin"),
77
79
  open ? (react_1.default.createElement(react_1.Suspense, { fallback: null },
78
- react_1.default.createElement(AddCustomPluginDialog, { onClose: () => setOpen(false), model: model }))) : null)),
79
- react_1.default.createElement(material_1.TextField, { label: "Filter plugins", value: model.filterText, onChange: event => model.setFilterText(event.target.value), fullWidth: true, InputProps: {
80
+ react_1.default.createElement(AddCustomPluginDialog, { onClose: () => {
81
+ setOpen(false);
82
+ }, model: model }))) : null)),
83
+ react_1.default.createElement(material_1.TextField, { label: "Filter plugins", value: model.filterText, onChange: event => {
84
+ model.setFilterText(event.target.value);
85
+ }, fullWidth: true, InputProps: {
80
86
  endAdornment: (react_1.default.createElement(material_1.InputAdornment, { position: "end" },
81
- react_1.default.createElement(material_1.IconButton, { onClick: () => model.clearFilterText() },
87
+ react_1.default.createElement(material_1.IconButton, { onClick: () => {
88
+ model.clearFilterText();
89
+ } },
82
90
  react_1.default.createElement(Clear_1.default, null)))),
83
91
  } }),
84
92
  react_1.default.createElement(material_1.Accordion, { defaultExpanded: true },
@@ -1 +1,5 @@
1
- export declare function doConnect(self: any): Promise<void>;
1
+ import { AnyConfigurationModel } from '@jbrowse/core/configuration';
2
+ export declare function doConnect(self: {
3
+ configuration: AnyConfigurationModel;
4
+ addTrackConfs: (arg: Record<string, unknown>[]) => void;
5
+ }): Promise<void>;
@@ -10,7 +10,6 @@ const nanoid_1 = require("@jbrowse/core/util/nanoid");
10
10
  function resolve(uri, baseUri) {
11
11
  return new URL(uri, baseUri).href;
12
12
  }
13
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
13
  async function doConnect(self) {
15
14
  var _a;
16
15
  const session = (0, util_1.getSession)(self);
@@ -56,9 +56,29 @@ export default function UCSCTrackHubConnection(pluginManager: PluginManager): im
56
56
  connect(_arg: import("@jbrowse/core/configuration").AnyConfigurationModel): void;
57
57
  } & {
58
58
  afterAttach(): void;
59
- addTrackConf(trackConf: import("@jbrowse/core/configuration").AnyConfigurationModel): any;
60
- addTrackConfs(trackConfs: import("@jbrowse/core/configuration").AnyConfigurationModel[]): any[];
61
- setTrackConfs(trackConfs: import("@jbrowse/core/configuration").AnyConfigurationModel[]): 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>>;
59
+ addTrackConf(trackConf: ({
60
+ [x: string]: any;
61
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
62
+ setSubschema(slotName: string, data: Record<string, unknown>): Record<string, unknown> | ({
63
+ [x: string]: any;
64
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
65
+ setSubschema(slotName: string, data: Record<string, unknown>): Record<string, unknown> | ({
66
+ [x: string]: any;
67
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & any & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>);
68
+ } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>);
69
+ } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>) | Record<string, unknown>): any;
70
+ addTrackConfs(trackConfs: (({
71
+ [x: string]: any;
72
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
73
+ setSubschema(slotName: string, data: Record<string, unknown>): Record<string, unknown> | ({
74
+ [x: string]: any;
75
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
76
+ setSubschema(slotName: string, data: Record<string, unknown>): Record<string, unknown> | ({
77
+ [x: string]: any;
78
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & any & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>);
79
+ } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>);
80
+ } & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>) | Record<string, unknown>)[]): void;
81
+ setTrackConfs(trackConfs: import("@jbrowse/core/configuration").AnyConfigurationModel[]): void;
62
82
  clear(): void;
63
83
  } & {
64
84
  /**
@@ -35,8 +35,8 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
35
35
  trackId: string;
36
36
  assemblyNames: string[];
37
37
  type: string;
38
- name: string;
39
- description: string;
38
+ name: string | undefined;
39
+ description: string | undefined;
40
40
  category: string[];
41
41
  adapter: {
42
42
  type: string;
@@ -63,7 +63,7 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
63
63
  assemblyNames: string[];
64
64
  type: string;
65
65
  name: string;
66
- description: string;
66
+ description: string | undefined;
67
67
  category: string[];
68
68
  adapter: {
69
69
  type: string;
@@ -88,7 +88,7 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
88
88
  assemblyNames: string[];
89
89
  type: string;
90
90
  name: string;
91
- description: string;
91
+ description: string | undefined;
92
92
  category: string[];
93
93
  adapter: {
94
94
  type: string;
@@ -110,7 +110,7 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
110
110
  assemblyNames: string[];
111
111
  type: string;
112
112
  name: string;
113
- description: string;
113
+ description: string | undefined;
114
114
  category: string[];
115
115
  adapter: {
116
116
  type: string;
@@ -132,7 +132,7 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
132
132
  assemblyNames: string[];
133
133
  type: string;
134
134
  name: string;
135
- description: string;
135
+ description: string | undefined;
136
136
  category: string[];
137
137
  adapter: {
138
138
  type: string;
@@ -159,7 +159,7 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
159
159
  assemblyNames: string[];
160
160
  type: string;
161
161
  name: string;
162
- description: string;
162
+ description: string | undefined;
163
163
  category: string[];
164
164
  adapter: {
165
165
  type: string;