@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
@@ -13,41 +13,57 @@ export default function FacetedHeader({ model, }) {
13
13
  return (React.createElement(React.Fragment, null,
14
14
  React.createElement(Grid, { container: true, spacing: 4, alignItems: "center" },
15
15
  React.createElement(Grid, { item: true },
16
- React.createElement(TextField, { label: "Search...", value: faceted.filterText, onChange: event => faceted.setFilterText(event.target.value), InputProps: {
16
+ React.createElement(TextField, { label: "Search...", value: faceted.filterText, onChange: event => {
17
+ faceted.setFilterText(event.target.value);
18
+ }, InputProps: {
17
19
  endAdornment: (React.createElement(InputAdornment, { position: "end" },
18
- React.createElement(IconButton, { onClick: () => faceted.setFilterText('') },
20
+ React.createElement(IconButton, { onClick: () => {
21
+ faceted.setFilterText('');
22
+ } },
19
23
  React.createElement(ClearIcon, null)))),
20
24
  } })),
21
25
  React.createElement(Grid, { item: true },
22
- React.createElement(IconButton, { onClick: event => setAnchorEl(event.currentTarget) },
26
+ React.createElement(IconButton, { onClick: event => {
27
+ setAnchorEl(event.currentTarget);
28
+ } },
23
29
  React.createElement(MoreVert, null))),
24
30
  React.createElement(Grid, { item: true },
25
31
  React.createElement(ShoppingCart, { model: model }))),
26
- React.createElement(Menu, { anchorEl: anchorEl, open: !!anchorEl, onClose: () => setAnchorEl(null), onMenuItemClick: (_event, callback) => {
32
+ React.createElement(Menu, { anchorEl: anchorEl, open: !!anchorEl, onClose: () => {
33
+ setAnchorEl(null);
34
+ }, onMenuItemClick: (_event, callback) => {
27
35
  callback();
28
36
  setAnchorEl(null);
29
37
  }, menuItems: [
30
38
  {
31
39
  label: 'Add tracks to selection instead of turning them on/off',
32
- onClick: () => faceted.setUseShoppingCart(!useShoppingCart),
40
+ onClick: () => {
41
+ faceted.setUseShoppingCart(!useShoppingCart);
42
+ },
33
43
  type: 'checkbox',
34
44
  checked: useShoppingCart,
35
45
  },
36
46
  {
37
47
  label: 'Show sparse metadata columns',
38
- onClick: () => faceted.setShowSparse(!showSparse),
48
+ onClick: () => {
49
+ faceted.setShowSparse(!showSparse);
50
+ },
39
51
  checked: showSparse,
40
52
  type: 'checkbox',
41
53
  },
42
54
  {
43
55
  label: 'Show facet filters',
44
- onClick: () => faceted.setShowFilters(!showFilters),
56
+ onClick: () => {
57
+ faceted.setShowFilters(!showFilters);
58
+ },
45
59
  checked: showFilters,
46
60
  type: 'checkbox',
47
61
  },
48
62
  {
49
63
  label: 'Show extra table options',
50
- onClick: () => faceted.setShowOptions(!showOptions),
64
+ onClick: () => {
65
+ faceted.setShowOptions(!showOptions);
66
+ },
51
67
  checked: showOptions,
52
68
  type: 'checkbox',
53
69
  },
@@ -39,10 +39,10 @@ const FacetedSelector = observer(function FacetedSelector({ model, }) {
39
39
  measureGridWidth(rows.map(r => r[e]), { maxWidth: 400, stripHTML: true }),
40
40
  ])),
41
41
  ...Object.fromEntries(filteredMetadataKeys
42
- .filter(f => visible['metadata.' + f])
42
+ .filter(f => visible[`metadata.${f}`])
43
43
  .map(e => {
44
44
  return [
45
- 'metadata.' + e,
45
+ `metadata.${e}`,
46
46
  measureGridWidth(rows.map(r => r.metadata[e]), { maxWidth: 400, stripHTML: true }),
47
47
  ];
48
48
  })),
@@ -78,7 +78,7 @@ const FacetedSelector = observer(function FacetedSelector({ model, }) {
78
78
  headerName: ['name', ...filteredNonMetadataKeys].includes(e)
79
79
  ? `${e} (from metadata)`
80
80
  : e,
81
- width: (_a = widths['metadata.' + e]) !== null && _a !== void 0 ? _a : 100,
81
+ width: (_a = widths[`metadata.${e}`]) !== null && _a !== void 0 ? _a : 100,
82
82
  valueGetter: (_, row) => { var _a; return `${(_a = row.metadata[e]) !== null && _a !== void 0 ? _a : ''}`; },
83
83
  renderCell: params => {
84
84
  const val = params.value;
@@ -99,7 +99,11 @@ const FacetedSelector = observer(function FacetedSelector({ model, }) {
99
99
  height: window.innerHeight * frac,
100
100
  width: window.innerWidth * frac - (showFilters ? panelWidth : 0),
101
101
  } },
102
- React.createElement(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 => {
102
+ React.createElement(DataGrid, { rows: filteredRows, onColumnWidthChange: arg => {
103
+ setWidths({ ...widths, [arg.colDef.field]: arg.width });
104
+ }, columnVisibilityModel: visible, onColumnVisibilityModelChange: n => {
105
+ faceted.setVisible(n);
106
+ }, columnHeaderHeight: 35, checkboxSelection: true, disableRowSelectionOnClick: true, keepNonExistentRowsSelected: true, onRowSelectionModelChange: userSelectedIds => {
103
107
  if (!useShoppingCart) {
104
108
  const a1 = shownTrackIds;
105
109
  const a2 = new Set(userSelectedIds);
@@ -16,12 +16,16 @@ const useStyles = makeStyles()({
16
16
  const FavoriteTracks = observer(function ({ model, }) {
17
17
  const { classes } = useStyles();
18
18
  const { view, favoriteTracks } = model;
19
- return view ? (React.createElement(DropdownTrackSelector, { onClick: () => model.setFavoritesCounter(0), tracks: favoriteTracks, model: model, extraMenuItems: favoriteTracks.length
19
+ return view ? (React.createElement(DropdownTrackSelector, { onClick: () => {
20
+ model.setFavoritesCounter(0);
21
+ }, tracks: favoriteTracks, model: model, extraMenuItems: favoriteTracks.length
20
22
  ? [
21
23
  { type: 'divider' },
22
24
  {
23
25
  label: 'Clear favorites',
24
- onClick: () => model.clearFavorites(),
26
+ onClick: () => {
27
+ model.clearFavorites();
28
+ },
25
29
  },
26
30
  ]
27
31
  : [
@@ -70,7 +70,9 @@ const HamburgerMenu = observer(function ({ model, }) {
70
70
  ? [
71
71
  {
72
72
  label: 'Turn on/off connections...',
73
- onClick: () => setConnectionToggleOpen(true),
73
+ onClick: () => {
74
+ setConnectionToggleOpen(true);
75
+ },
74
76
  },
75
77
  ]
76
78
  : []),
@@ -86,7 +88,9 @@ const HamburgerMenu = observer(function ({ model, }) {
86
88
  },
87
89
  {
88
90
  label: 'Delete connections...',
89
- onClick: () => setConnectionManagerOpen(true),
91
+ onClick: () => {
92
+ setConnectionManagerOpen(true);
93
+ },
90
94
  },
91
95
  ]
92
96
  : []),
@@ -100,13 +104,17 @@ const HamburgerMenu = observer(function ({ model, }) {
100
104
  label: 'Sort tracks by name',
101
105
  type: 'checkbox',
102
106
  checked: model.activeSortTrackNames,
103
- onClick: () => model.setSortTrackNames(!model.activeSortTrackNames),
107
+ onClick: () => {
108
+ model.setSortTrackNames(!model.activeSortTrackNames);
109
+ },
104
110
  },
105
111
  {
106
112
  label: 'Sort categories by name',
107
113
  type: 'checkbox',
108
114
  checked: model.activeSortCategories,
109
- onClick: () => model.setSortCategories(!model.activeSortCategories),
115
+ onClick: () => {
116
+ model.setSortCategories(!model.activeSortCategories);
117
+ },
110
118
  },
111
119
  ],
112
120
  },
@@ -118,27 +126,43 @@ const HamburgerMenu = observer(function ({ model, }) {
118
126
  ? [
119
127
  {
120
128
  label: 'Collapse subcategories',
121
- onClick: () => model.collapseSubCategories(),
129
+ onClick: () => {
130
+ model.collapseSubCategories();
131
+ },
122
132
  },
123
133
  ]
124
134
  : []),
125
135
  {
126
136
  label: 'Collapse top-level categories',
127
- onClick: () => model.collapseTopLevelCategories(),
137
+ onClick: () => {
138
+ model.collapseTopLevelCategories();
139
+ },
128
140
  },
129
141
  {
130
142
  label: 'Expand all categories',
131
- onClick: () => model.expandAllCategories(),
143
+ onClick: () => {
144
+ model.expandAllCategories();
145
+ },
132
146
  },
133
147
  ],
134
148
  },
135
149
  ] },
136
150
  React.createElement(MenuIcon, null)),
137
151
  React.createElement(Suspense, { fallback: null },
138
- modalInfo ? (React.createElement(CloseConnectionDialog, { modalInfo: modalInfo, onClose: () => setModalInfo(undefined) })) : null,
139
- deleteDialogDetails ? (React.createElement(DeleteConnectionDialog, { handleClose: () => setDeleteDialogDetails(undefined), deleteDialogDetails: deleteDialogDetails, session: session })) : null,
140
- connectionManagerOpen ? (React.createElement(ManageConnectionsDialog, { handleClose: () => setConnectionManagerOpen(false), breakConnection: breakConnection, session: session })) : null,
141
- connectionToggleOpen ? (React.createElement(ToggleConnectionsDialog, { handleClose: () => setConnectionToggleOpen(false), session: session, breakConnection: breakConnection })) : null,
142
- facetedOpen ? (React.createElement(FacetedDialog, { handleClose: () => setFacetedOpen(false), model: model })) : null)));
152
+ modalInfo ? (React.createElement(CloseConnectionDialog, { modalInfo: modalInfo, onClose: () => {
153
+ setModalInfo(undefined);
154
+ } })) : null,
155
+ deleteDialogDetails ? (React.createElement(DeleteConnectionDialog, { handleClose: () => {
156
+ setDeleteDialogDetails(undefined);
157
+ }, deleteDialogDetails: deleteDialogDetails, session: session })) : null,
158
+ connectionManagerOpen ? (React.createElement(ManageConnectionsDialog, { handleClose: () => {
159
+ setConnectionManagerOpen(false);
160
+ }, breakConnection: breakConnection, session: session })) : null,
161
+ connectionToggleOpen ? (React.createElement(ToggleConnectionsDialog, { handleClose: () => {
162
+ setConnectionToggleOpen(false);
163
+ }, session: session, breakConnection: breakConnection })) : null,
164
+ facetedOpen ? (React.createElement(FacetedDialog, { handleClose: () => {
165
+ setFacetedOpen(false);
166
+ }, model: model })) : null)));
143
167
  });
144
168
  export default HamburgerMenu;
@@ -16,14 +16,20 @@ const useStyles = makeStyles()(theme => ({
16
16
  const SearchTracksTextField = observer(function ({ model, }) {
17
17
  const { filterText } = model;
18
18
  const { classes } = useStyles();
19
- return (React.createElement(TextField, { className: classes.searchBox, label: "Filter tracks", value: filterText, onChange: event => model.setFilterText(event.target.value), fullWidth: true, InputProps: {
19
+ return (React.createElement(TextField, { className: classes.searchBox, label: "Filter tracks", value: filterText, onChange: event => {
20
+ model.setFilterText(event.target.value);
21
+ }, fullWidth: true, InputProps: {
20
22
  endAdornment: (React.createElement(InputAdornment, { position: "end" },
21
- React.createElement(IconButton, { onClick: () => model.clearFilterText() },
23
+ React.createElement(IconButton, { onClick: () => {
24
+ model.clearFilterText();
25
+ } },
22
26
  React.createElement(ClearIcon, null)))),
23
27
  } }));
24
28
  });
25
29
  const HierarchicalTrackSelectorHeader = observer(function ({ model, setHeaderHeight, }) {
26
- return (React.createElement("div", { ref: ref => setHeaderHeight((ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect().height) || 0), "data-testid": "hierarchical_track_selector" },
30
+ return (React.createElement("div", { ref: ref => {
31
+ setHeaderHeight((ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect().height) || 0);
32
+ }, "data-testid": "hierarchical_track_selector" },
27
33
  React.createElement("div", { style: { display: 'flex' } },
28
34
  React.createElement(HamburgerMenu, { model: model }),
29
35
  React.createElement(ShoppingCart, { model: model }),
@@ -36,7 +36,9 @@ const HierarchicalTree = observer(function HierarchicalTree({ height, tree, mode
36
36
  model.addToRecentlyUsed(trackId);
37
37
  }
38
38
  },
39
- toggleCollapse: (pathName) => model.toggleCategory(pathName),
39
+ toggleCollapse: (pathName) => {
40
+ model.toggleCategory(pathName);
41
+ },
40
42
  tree,
41
43
  model,
42
44
  drawerPosition,
@@ -49,6 +51,7 @@ const HierarchicalTree = observer(function HierarchicalTree({ height, tree, mode
49
51
  for (const child of tree.children) {
50
52
  yield getNodeData(child, 0, extra, obj);
51
53
  }
54
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
52
55
  while (true) {
53
56
  // @ts-expect-error
54
57
  const parentMeta = yield;
@@ -58,6 +61,7 @@ const HierarchicalTree = observer(function HierarchicalTree({ height, tree, mode
58
61
  }
59
62
  }
60
63
  }, [tree, extra, obj]);
64
+ /* biome-ignore lint/correctness/useExhaustiveDependencies: */
61
65
  useEffect(() => {
62
66
  // @ts-expect-error
63
67
  treeRef.current.recomputeTree({
@@ -13,12 +13,16 @@ const useStyles = makeStyles()({
13
13
  const RecentlyUsedTracks = observer(function ({ model, }) {
14
14
  const { classes } = useStyles();
15
15
  const { view, recentlyUsedCounter, recentlyUsedTracks } = model;
16
- return view ? (React.createElement(DropdownTrackSelector, { onClick: () => model.setRecentlyUsedCounter(0), model: model, tracks: recentlyUsedTracks, extraMenuItems: recentlyUsedTracks.length
16
+ return view ? (React.createElement(DropdownTrackSelector, { onClick: () => {
17
+ model.setRecentlyUsedCounter(0);
18
+ }, model: model, tracks: recentlyUsedTracks, extraMenuItems: recentlyUsedTracks.length
17
19
  ? [
18
20
  { type: 'divider' },
19
21
  {
20
22
  label: 'Clear recently used',
21
- onClick: () => model.clearRecentlyUsed(),
23
+ onClick: () => {
24
+ model.clearRecentlyUsed();
25
+ },
22
26
  },
23
27
  ]
24
28
  : [
@@ -78,5 +78,7 @@ export default function Category({ isOpen, setOpen, data, }) {
78
78
  ], onMenuItemClick: (_event, callback) => {
79
79
  callback();
80
80
  setMenuEl(null);
81
- }, open: Boolean(menuEl), onClose: () => setMenuEl(null) })) : null));
81
+ }, open: Boolean(menuEl), onClose: () => {
82
+ setMenuEl(null);
83
+ } })) : null));
82
84
  }
@@ -23,10 +23,12 @@ const useStyles = makeStyles()(theme => ({
23
23
  export default function TrackLabel({ data }) {
24
24
  const { classes } = useStyles();
25
25
  const { checked, conf, model, drawerPosition, id, trackId, name, onChange, selected, } = data;
26
- const description = (conf && readConfObject(conf, 'description')) || '';
26
+ const description = readConfObject(conf, 'description');
27
27
  return (React.createElement(React.Fragment, null,
28
28
  React.createElement(Tooltip, { title: description + (selected ? ' (in selection)' : ''), placement: drawerPosition === 'left' ? 'right' : 'left' },
29
- React.createElement(FormControlLabel, { className: classes.checkboxLabel, control: React.createElement(Checkbox, { className: classes.compactCheckbox, checked: checked, onChange: () => onChange(trackId), disabled: isUnsupported(name), inputProps: {
29
+ React.createElement(FormControlLabel, { className: classes.checkboxLabel, control: React.createElement(Checkbox, { className: classes.compactCheckbox, checked: checked, onChange: () => {
30
+ onChange(trackId);
31
+ }, disabled: isUnsupported(name), inputProps: {
30
32
  // @ts-expect-error
31
33
  'data-testid': `htsTrackEntry-${id}`,
32
34
  } }), label: React.createElement("div", { "data-testid": `htsTrackLabel-${id}`, style: { background: selected ? '#cccc' : undefined } },
@@ -19,23 +19,31 @@ const TrackLabelMenu = function ({ id, trackId, stopPropagation, model, setOpen,
19
19
  model.isFavorite(trackId)
20
20
  ? {
21
21
  label: 'Remove from favorites',
22
- onClick: () => model.removeFromFavorites(trackId),
22
+ onClick: () => {
23
+ model.removeFromFavorites(trackId);
24
+ },
23
25
  icon: StarIcon,
24
26
  }
25
27
  : {
26
28
  label: 'Add to favorites',
27
- onClick: () => model.addToFavorites(trackId),
29
+ onClick: () => {
30
+ model.addToFavorites(trackId);
31
+ },
28
32
  icon: FilledStarIcon,
29
33
  },
30
34
  {
31
35
  label: 'Add to selection',
32
- onClick: () => model.addToSelection([conf]),
36
+ onClick: () => {
37
+ model.addToSelection([conf]);
38
+ },
33
39
  },
34
40
  ...(model.isSelected(conf)
35
41
  ? [
36
42
  {
37
43
  label: 'Remove from selection',
38
- onClick: () => model.removeFromSelection([conf]),
44
+ onClick: () => {
45
+ model.removeFromSelection([conf]);
46
+ },
39
47
  },
40
48
  ]
41
49
  : []),
@@ -37,7 +37,9 @@ export default function Node({ data, isOpen, style, setOpen, }) {
37
37
  const width = 10;
38
38
  const marginLeft = nestingLevel * width + (isLeaf ? width : 0);
39
39
  return (React.createElement("div", { style: style, className: !isLeaf ? classes.accordionBase : undefined },
40
- new Array(nestingLevel).fill(0).map((_, idx) => (React.createElement("div", { key: `mark-${idx}`, style: { left: idx * width + 4, height: style === null || style === void 0 ? void 0 : style.height }, className: classes.nestingLevelMarker }))),
40
+ new Array(nestingLevel).fill(0).map((_, idx) => (React.createElement("div", {
41
+ /* biome-ignore lint/suspicious/noArrayIndexKey: */
42
+ key: `mark-${idx}`, style: { left: idx * width + 4, height: style === null || style === void 0 ? void 0 : style.height }, className: classes.nestingLevelMarker }))),
41
43
  React.createElement("div", { className: !isLeaf ? classes.accordionCard : undefined, style: {
42
44
  marginLeft,
43
45
  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;
@@ -3,7 +3,7 @@ export function getAllChildren(subtree) {
3
3
  return (subtree === null || subtree === void 0 ? void 0 : subtree.type) === 'category'
4
4
  ? subtree.children
5
5
  .map(t => (t.type === 'category' ? getAllChildren(t) : t.conf))
6
- .flat(Infinity)
6
+ .flat(Number.POSITIVE_INFINITY)
7
7
  : [];
8
8
  }
9
9
  export 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
  */
@@ -51,6 +51,7 @@ export function facetedStateTreeF() {
51
51
  */
52
52
  setPanelWidth(width) {
53
53
  self.panelWidth = width;
54
+ return self.panelWidth;
54
55
  },
55
56
  /**
56
57
  * #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;
@@ -361,7 +361,7 @@ export default function stateTreeFactory(pluginManager) {
361
361
  const { connectionInstances = [] } = getSession(self);
362
362
  return [
363
363
  ...this.configAndSessionTrackConfigurations,
364
- ...((connectionInstances === null || connectionInstances === void 0 ? void 0 : connectionInstances.flatMap(c => c.tracks)) || []),
364
+ ...connectionInstances.flatMap(c => c.tracks),
365
365
  ];
366
366
  },
367
367
  /**
@@ -47,9 +47,15 @@ const AddCustomPluginDialog = observer(function ({ onClose, model, }) {
47
47
  React.createElement("form", { onSubmit: handleSubmit },
48
48
  React.createElement(DialogContent, { className: classes.dialogContent },
49
49
  React.createElement(DialogContentText, null, "Enter the name of the plugin and its URL. The name should match what is defined in the plugin's build."),
50
- React.createElement(TextField, { label: "Plugin name", variant: "outlined", value: umdPluginName, onChange: event => setUMDPluginName(event.target.value) }),
51
- React.createElement(TextField, { label: "Plugin URL", variant: "outlined", value: umdPluginUrl, onChange: event => setUMDPluginUrl(event.target.value) }),
52
- React.createElement(DialogContentText, { onClick: () => setAdvancedOptionsOpen(!advancedOptionsOpen) },
50
+ React.createElement(TextField, { label: "Plugin name", variant: "outlined", value: umdPluginName, onChange: event => {
51
+ setUMDPluginName(event.target.value);
52
+ } }),
53
+ React.createElement(TextField, { label: "Plugin URL", variant: "outlined", value: umdPluginUrl, onChange: event => {
54
+ setUMDPluginUrl(event.target.value);
55
+ } }),
56
+ React.createElement(DialogContentText, { onClick: () => {
57
+ setAdvancedOptionsOpen(!advancedOptionsOpen);
58
+ } },
53
59
  React.createElement(IconButton, { className: cx(classes.expand, {
54
60
  [classes.expandOpen]: advancedOptionsOpen,
55
61
  }), "aria-expanded": advancedOptionsOpen, "aria-label": "show more" },
@@ -58,8 +64,12 @@ const AddCustomPluginDialog = observer(function ({ onClose, model, }) {
58
64
  React.createElement(Collapse, { in: advancedOptionsOpen },
59
65
  React.createElement("div", { className: classes.dialogContent },
60
66
  React.createElement(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."),
61
- React.createElement(TextField, { label: "ESM build URL", variant: "outlined", value: esmPluginUrl, onChange: event => setESMPluginUrl(event.target.value) }),
62
- React.createElement(TextField, { label: "CJS build URL", variant: "outlined", value: cjsPluginUrl, onChange: event => setCJSPluginUrl(event.target.value) })))),
67
+ React.createElement(TextField, { label: "ESM build URL", variant: "outlined", value: esmPluginUrl, onChange: event => {
68
+ setESMPluginUrl(event.target.value);
69
+ } }),
70
+ React.createElement(TextField, { label: "CJS build URL", variant: "outlined", value: cjsPluginUrl, onChange: event => {
71
+ setCJSPluginUrl(event.target.value);
72
+ } })))),
63
73
  React.createElement(DialogActions, null,
64
74
  React.createElement(Button, { variant: "contained", onClick: onClose }, "Cancel"),
65
75
  React.createElement(Button, { variant: "contained", color: "primary", onClick: handleSubmit, disabled: !ready }, "Submit")))));
@@ -2,7 +2,9 @@ import React from 'react';
2
2
  import { Button, DialogActions, DialogContent, Typography } from '@mui/material';
3
3
  import { Dialog } from '@jbrowse/core/ui';
4
4
  export default function DeletePluginDialog({ onClose, plugin, }) {
5
- return (React.createElement(Dialog, { open: true, onClose: () => onClose(), title: `Remove ${plugin}` },
5
+ return (React.createElement(Dialog, { open: true, onClose: () => {
6
+ onClose();
7
+ }, title: `Remove ${plugin}` },
6
8
  React.createElement(DialogContent, null,
7
9
  React.createElement(Typography, null,
8
10
  "Please confirm that you want to remove ",
@@ -16,5 +18,7 @@ export default function DeletePluginDialog({ onClose, plugin, }) {
16
18
  onClose(plugin);
17
19
  }, 500);
18
20
  } }, "Confirm"),
19
- React.createElement(Button, { variant: "contained", color: "secondary", onClick: () => onClose() }, "Cancel"))));
21
+ React.createElement(Button, { variant: "contained", color: "secondary", onClick: () => {
22
+ onClose();
23
+ } }, "Cancel"))));
20
24
  }
@@ -19,13 +19,12 @@ function LockedPlugin() {
19
19
  React.createElement(LockIcon, null)));
20
20
  }
21
21
  const InstalledPlugin = observer(function ({ plugin, model, }) {
22
- var _a;
23
22
  const [dialogPlugin, setDialogPlugin] = useState();
24
23
  const { pluginManager } = getEnv(model);
25
24
  const session = getSession(model);
26
25
  const { jbrowse, adminMode } = session;
27
26
  const isSessionPlugin = isSessionWithSessionPlugins(session)
28
- ? (_a = session.sessionPlugins) === null || _a === void 0 ? void 0 : _a.some(p => pluginManager.pluginMetadata[plugin.name].url === p.url)
27
+ ? session.sessionPlugins.some(p => { var _a; return ((_a = pluginManager.pluginMetadata[plugin.name]) === null || _a === void 0 ? void 0 : _a.url) === p.url; })
29
28
  : false;
30
29
  return (React.createElement(React.Fragment, null,
31
30
  dialogPlugin ? (React.createElement(Suspense, { fallback: null },
@@ -42,7 +41,9 @@ const InstalledPlugin = observer(function ({ plugin, model, }) {
42
41
  setDialogPlugin(undefined);
43
42
  } }))) : null,
44
43
  React.createElement(ListItem, { key: plugin.name },
45
- adminMode || isSessionPlugin ? (React.createElement(IconButton, { "data-testid": `removePlugin-${plugin.name}`, onClick: () => setDialogPlugin(plugin.name) },
44
+ adminMode || isSessionPlugin ? (React.createElement(IconButton, { "data-testid": `removePlugin-${plugin.name}`, onClick: () => {
45
+ setDialogPlugin(plugin.name);
46
+ } },
46
47
  React.createElement(CloseIcon, null))) : (React.createElement(LockedPlugin, null)),
47
48
  React.createElement(Typography, null, plugin.name))));
48
49
  });
@@ -30,10 +30,10 @@ const PluginCard = observer(function PluginCard({ plugin, model, adminMode, }) {
30
30
  const session = getSession(model);
31
31
  const { pluginManager } = getEnv(model);
32
32
  const { runtimePluginDefinitions } = pluginManager;
33
+ // @ts-expect-error
33
34
  const isInstalled = runtimePluginDefinitions.some(d => d.url === plugin.url);
34
35
  const [tempDisabled, setTempDisabled] = useState(false);
35
36
  const disableButton = isInstalled || tempDisabled;
36
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
37
  const rootModel = getParent(model, 3);
38
38
  const { jbrowse } = rootModel;
39
39
  return (React.createElement(Card, { variant: "outlined", key: plugin.name, className: classes.card },
@@ -45,12 +45,20 @@ const PluginStoreWidget = observer(function ({ model, }) {
45
45
  "You are using the ",
46
46
  React.createElement("code", null, "admin-server"),
47
47
  ". 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."))),
48
- React.createElement(Button, { className: classes.customPluginButton, variant: "contained", onClick: () => setOpen(true) }, "Add custom plugin"),
48
+ React.createElement(Button, { className: classes.customPluginButton, variant: "contained", onClick: () => {
49
+ setOpen(true);
50
+ } }, "Add custom plugin"),
49
51
  open ? (React.createElement(Suspense, { fallback: null },
50
- React.createElement(AddCustomPluginDialog, { onClose: () => setOpen(false), model: model }))) : null)),
51
- React.createElement(TextField, { label: "Filter plugins", value: model.filterText, onChange: event => model.setFilterText(event.target.value), fullWidth: true, InputProps: {
52
+ React.createElement(AddCustomPluginDialog, { onClose: () => {
53
+ setOpen(false);
54
+ }, model: model }))) : null)),
55
+ React.createElement(TextField, { label: "Filter plugins", value: model.filterText, onChange: event => {
56
+ model.setFilterText(event.target.value);
57
+ }, fullWidth: true, InputProps: {
52
58
  endAdornment: (React.createElement(InputAdornment, { position: "end" },
53
- React.createElement(IconButton, { onClick: () => model.clearFilterText() },
59
+ React.createElement(IconButton, { onClick: () => {
60
+ model.clearFilterText();
61
+ } },
54
62
  React.createElement(ClearIcon, null)))),
55
63
  } }),
56
64
  React.createElement(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>;
@@ -7,7 +7,6 @@ import { nanoid } from '@jbrowse/core/util/nanoid';
7
7
  function resolve(uri, baseUri) {
8
8
  return new URL(uri, baseUri).href;
9
9
  }
10
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
10
  export async function doConnect(self) {
12
11
  var _a;
13
12
  const session = 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
  /**