@jbrowse/plugin-data-management 2.13.0 → 2.14.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 (101) 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 +28 -1
  38. package/dist/HierarchicalTrackSelectorWidget/model.js +28 -1
  39. package/dist/PluginStoreWidget/components/AddCustomPluginDialog.js +15 -5
  40. package/dist/PluginStoreWidget/components/DeletePluginDialog.js +3 -1
  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/PluginStoreWidget/model.d.ts +6 -0
  45. package/dist/PluginStoreWidget/model.js +18 -0
  46. package/dist/ucsc-trackhub/doConnect.d.ts +5 -1
  47. package/dist/ucsc-trackhub/doConnect.js +0 -1
  48. package/dist/ucsc-trackhub/model.d.ts +23 -3
  49. package/dist/ucsc-trackhub/ucscTrackHub.d.ts +7 -7
  50. package/dist/ucsc-trackhub/ucscTrackHub.js +8 -10
  51. package/esm/AddConnectionWidget/components/AddConnectionWidget.js +3 -1
  52. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.js +3 -1
  53. package/esm/AddTrackWidget/components/AddTrackWidget.js +3 -1
  54. package/esm/AddTrackWidget/components/ConfirmTrack.js +10 -6
  55. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +2 -3
  56. package/esm/AddTrackWidget/components/PasteConfigWorkflow.js +6 -2
  57. package/esm/AddTrackWidget/components/TextIndexingConfig.js +16 -8
  58. package/esm/AddTrackWidget/components/TrackAdapterSelector.js +3 -1
  59. package/esm/AddTrackWidget/components/TrackTypeSelector.js +3 -1
  60. package/esm/AddTrackWidget/model.js +1 -1
  61. package/esm/AssemblyManager/AssemblyAddForm.d.ts +3 -2
  62. package/esm/AssemblyManager/AssemblyAddForm.js +38 -18
  63. package/esm/AssemblyManager/AssemblyManager.js +15 -5
  64. package/esm/AssemblyManager/AssemblyTable.js +3 -1
  65. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +6 -2
  66. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +13 -2
  67. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +7 -7
  68. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js +4 -4
  69. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js +6 -2
  70. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +4 -2
  71. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +12 -4
  72. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +24 -8
  73. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +8 -4
  74. package/esm/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.js +6 -2
  75. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +36 -12
  76. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +9 -3
  77. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +5 -1
  78. package/esm/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.js +6 -2
  79. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +3 -1
  80. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +4 -2
  81. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.js +12 -4
  82. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.js +3 -1
  83. package/esm/HierarchicalTrackSelectorWidget/components/util.d.ts +1 -1
  84. package/esm/HierarchicalTrackSelectorWidget/components/util.js +1 -1
  85. package/esm/HierarchicalTrackSelectorWidget/facetedModel.d.ts +1 -1
  86. package/esm/HierarchicalTrackSelectorWidget/facetedModel.js +1 -0
  87. package/esm/HierarchicalTrackSelectorWidget/model.d.ts +28 -1
  88. package/esm/HierarchicalTrackSelectorWidget/model.js +28 -1
  89. package/esm/PluginStoreWidget/components/AddCustomPluginDialog.js +15 -5
  90. package/esm/PluginStoreWidget/components/DeletePluginDialog.js +3 -1
  91. package/esm/PluginStoreWidget/components/InstalledPlugin.js +4 -3
  92. package/esm/PluginStoreWidget/components/PluginCard.js +1 -1
  93. package/esm/PluginStoreWidget/components/PluginStoreWidget.js +12 -4
  94. package/esm/PluginStoreWidget/model.d.ts +6 -0
  95. package/esm/PluginStoreWidget/model.js +18 -0
  96. package/esm/ucsc-trackhub/doConnect.d.ts +5 -1
  97. package/esm/ucsc-trackhub/doConnect.js +0 -1
  98. package/esm/ucsc-trackhub/model.d.ts +23 -3
  99. package/esm/ucsc-trackhub/ucscTrackHub.d.ts +7 -7
  100. package/esm/ucsc-trackhub/ucscTrackHub.js +8 -10
  101. package/package.json +3 -3
@@ -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;
@@ -101,14 +101,41 @@ export default function stateTreeFactory(pluginManager: PluginManager): import("
101
101
  afterAttach(): void;
102
102
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>, [undefined]>;
103
103
  }, {
104
+ /**
105
+ * #volatile
106
+ */
104
107
  favorites: string[];
108
+ /**
109
+ * #volatile
110
+ */
105
111
  recentlyUsed: string[];
112
+ /**
113
+ * #volatile
114
+ */
106
115
  selection: AnyConfigurationModel[];
116
+ /**
117
+ * #volatile
118
+ */
107
119
  sortTrackNames: MaybeBoolean;
120
+ /**
121
+ * #volatile
122
+ */
108
123
  sortCategories: MaybeBoolean;
124
+ /**
125
+ * #volatile
126
+ */
109
127
  collapsed: import("mobx").ObservableMap<string, boolean>;
128
+ /**
129
+ * #volatile
130
+ */
110
131
  filterText: string;
132
+ /**
133
+ * #volatile
134
+ */
111
135
  recentlyUsedCounter: number;
136
+ /**
137
+ * #volatile
138
+ */
112
139
  favoritesCounter: number;
113
140
  } & {
114
141
  /**
@@ -82,14 +82,41 @@ function stateTreeFactory(pluginManager) {
82
82
  faceted: mobx_state_tree_1.types.optional((0, facetedModel_1.facetedStateTreeF)(), {}),
83
83
  })
84
84
  .volatile(() => ({
85
+ /**
86
+ * #volatile
87
+ */
85
88
  favorites: localStorageGetJSON(favoritesK(), []),
89
+ /**
90
+ * #volatile
91
+ */
86
92
  recentlyUsed: [],
93
+ /**
94
+ * #volatile
95
+ */
87
96
  selection: [],
97
+ /**
98
+ * #volatile
99
+ */
88
100
  sortTrackNames: localStorageGetJSON(sortTrackNamesK(), undefined),
101
+ /**
102
+ * #volatile
103
+ */
89
104
  sortCategories: localStorageGetJSON(sortCategoriesK(), undefined),
105
+ /**
106
+ * #volatile
107
+ */
90
108
  collapsed: mobx_1.observable.map(),
109
+ /**
110
+ * #volatile
111
+ */
91
112
  filterText: '',
113
+ /**
114
+ * #volatile
115
+ */
92
116
  recentlyUsedCounter: 0,
117
+ /**
118
+ * #volatile
119
+ */
93
120
  favoritesCounter: 0,
94
121
  }))
95
122
  .views(self => ({
@@ -337,7 +364,7 @@ function stateTreeFactory(pluginManager) {
337
364
  const { connectionInstances = [] } = (0, util_1.getSession)(self);
338
365
  return [
339
366
  ...this.configAndSessionTrackConfigurations,
340
- ...((connectionInstances === null || connectionInstances === void 0 ? void 0 : connectionInstances.flatMap(c => c.tracks)) || []),
367
+ ...connectionInstances.flatMap(c => c.tracks),
341
368
  ];
342
369
  },
343
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 ",
@@ -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 },
@@ -6,7 +6,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
6
6
  filterText: import("mobx-state-tree").IType<string | undefined, string, string>;
7
7
  view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
8
8
  }, {
9
+ /**
10
+ * #action
11
+ */
9
12
  clearFilterText(): void;
13
+ /**
14
+ * #action
15
+ */
10
16
  setFilterText(newText: string): void;
11
17
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
12
18
  export type PluginStoreStateModel = ReturnType<typeof stateModelFactory>;
@@ -6,15 +6,33 @@ const mst_1 = require("@jbrowse/core/util/types/mst");
6
6
  function stateModelFactory(pluginManager) {
7
7
  return mobx_state_tree_1.types
8
8
  .model('PluginStoreModel', {
9
+ /**
10
+ * #property
11
+ */
9
12
  id: mst_1.ElementId,
13
+ /**
14
+ * #property
15
+ */
10
16
  type: mobx_state_tree_1.types.literal('PluginStoreWidget'),
17
+ /**
18
+ * #property
19
+ */
11
20
  filterText: '',
21
+ /**
22
+ * #property
23
+ */
12
24
  view: mobx_state_tree_1.types.safeReference(pluginManager.pluggableMstType('view', 'stateModel')),
13
25
  })
14
26
  .actions(self => ({
27
+ /**
28
+ * #action
29
+ */
15
30
  clearFilterText() {
16
31
  self.filterText = '';
17
32
  },
33
+ /**
34
+ * #action
35
+ */
18
36
  setFilterText(newText) {
19
37
  self.filterText = newText;
20
38
  },
@@ -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);