@jbrowse/plugin-data-management 2.6.3 → 2.7.1

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 (133) hide show
  1. package/dist/AddConnectionWidget/components/AddConnectionWidget.d.ts +2 -2
  2. package/dist/AddConnectionWidget/components/AddConnectionWidget.js +17 -8
  3. package/dist/AddConnectionWidget/components/ConfigureConnection.d.ts +2 -2
  4. package/dist/AddConnectionWidget/components/ConfigureConnection.js +2 -1
  5. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.d.ts +2 -2
  6. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +5 -3
  7. package/dist/AddTrackWidget/components/AddTrackWidget.d.ts +3 -4
  8. package/dist/AddTrackWidget/components/AddTrackWidget.js +3 -3
  9. package/dist/AddTrackWidget/components/ConfirmTrack.d.ts +2 -2
  10. package/dist/AddTrackWidget/components/ConfirmTrack.js +3 -2
  11. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +3 -4
  12. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js +32 -27
  13. package/dist/AddTrackWidget/components/PasteConfigWorkflow.d.ts +3 -4
  14. package/dist/AddTrackWidget/components/PasteConfigWorkflow.js +10 -7
  15. package/dist/AddTrackWidget/components/TrackAdapterSelector.js +1 -1
  16. package/dist/AddTrackWidget/components/TrackSourceSelect.d.ts +3 -4
  17. package/dist/AddTrackWidget/components/TrackSourceSelect.js +3 -3
  18. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.d.ts +2 -2
  19. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +2 -1
  20. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +2 -2
  21. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +2 -1
  22. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.d.ts +3 -5
  23. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +2 -1
  24. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.d.ts +3 -4
  25. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js +5 -8
  26. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.d.ts +3 -4
  27. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js +3 -3
  28. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.d.ts +2 -3
  29. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +2 -3
  30. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +13 -0
  31. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +79 -0
  32. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +31 -77
  33. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.d.ts +3 -4
  34. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.js +3 -3
  35. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +5 -3
  36. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +10 -4
  37. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.d.ts +2 -2
  38. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +50 -29
  39. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.d.ts +2 -2
  40. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +4 -2
  41. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.d.ts +3 -4
  42. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +3 -3
  43. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.d.ts +2 -2
  44. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +5 -6
  45. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +24 -49
  46. package/dist/HierarchicalTrackSelectorWidget/components/util.js +1 -2
  47. package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +16 -13
  48. package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.js +2 -2
  49. package/dist/HierarchicalTrackSelectorWidget/model.js +17 -12
  50. package/dist/PluginStoreWidget/components/AddCustomPluginDialog.d.ts +2 -2
  51. package/dist/PluginStoreWidget/components/AddCustomPluginDialog.js +2 -1
  52. package/dist/PluginStoreWidget/components/InstalledPlugin.d.ts +2 -2
  53. package/dist/PluginStoreWidget/components/InstalledPlugin.js +8 -4
  54. package/dist/PluginStoreWidget/components/InstalledPluginsList.d.ts +2 -2
  55. package/dist/PluginStoreWidget/components/InstalledPluginsList.js +2 -1
  56. package/dist/PluginStoreWidget/components/PluginCard.d.ts +2 -2
  57. package/dist/PluginStoreWidget/components/PluginCard.js +2 -1
  58. package/dist/PluginStoreWidget/components/PluginStoreWidget.d.ts +3 -4
  59. package/dist/PluginStoreWidget/components/PluginStoreWidget.js +3 -3
  60. package/dist/index.d.ts +1 -9
  61. package/dist/index.js +1 -4
  62. package/dist/ucsc-trackhub/model.js +2 -2
  63. package/esm/AddConnectionWidget/components/AddConnectionWidget.d.ts +2 -2
  64. package/esm/AddConnectionWidget/components/AddConnectionWidget.js +19 -10
  65. package/esm/AddConnectionWidget/components/ConfigureConnection.d.ts +2 -2
  66. package/esm/AddConnectionWidget/components/ConfigureConnection.js +2 -1
  67. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.d.ts +2 -2
  68. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.js +5 -3
  69. package/esm/AddTrackWidget/components/AddTrackWidget.d.ts +3 -4
  70. package/esm/AddTrackWidget/components/AddTrackWidget.js +3 -3
  71. package/esm/AddTrackWidget/components/ConfirmTrack.d.ts +2 -2
  72. package/esm/AddTrackWidget/components/ConfirmTrack.js +4 -3
  73. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +3 -4
  74. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +33 -28
  75. package/esm/AddTrackWidget/components/PasteConfigWorkflow.d.ts +3 -4
  76. package/esm/AddTrackWidget/components/PasteConfigWorkflow.js +11 -8
  77. package/esm/AddTrackWidget/components/TrackAdapterSelector.js +1 -1
  78. package/esm/AddTrackWidget/components/TrackSourceSelect.d.ts +3 -4
  79. package/esm/AddTrackWidget/components/TrackSourceSelect.js +3 -3
  80. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.d.ts +2 -2
  81. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +2 -1
  82. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +2 -2
  83. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +2 -1
  84. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.d.ts +3 -5
  85. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +2 -1
  86. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.d.ts +3 -4
  87. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js +6 -9
  88. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.d.ts +3 -4
  89. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js +3 -3
  90. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.d.ts +2 -3
  91. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +3 -2
  92. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +13 -0
  93. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +50 -0
  94. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +31 -54
  95. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.d.ts +3 -4
  96. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.js +3 -3
  97. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +5 -3
  98. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +10 -4
  99. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.d.ts +2 -2
  100. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +50 -29
  101. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.d.ts +2 -2
  102. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +4 -2
  103. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.d.ts +3 -4
  104. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +3 -3
  105. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.d.ts +2 -2
  106. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +5 -6
  107. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +24 -26
  108. package/esm/HierarchicalTrackSelectorWidget/components/util.js +1 -2
  109. package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +16 -13
  110. package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.js +2 -2
  111. package/esm/HierarchicalTrackSelectorWidget/model.js +17 -12
  112. package/esm/PluginStoreWidget/components/AddCustomPluginDialog.d.ts +2 -2
  113. package/esm/PluginStoreWidget/components/AddCustomPluginDialog.js +2 -1
  114. package/esm/PluginStoreWidget/components/InstalledPlugin.d.ts +2 -2
  115. package/esm/PluginStoreWidget/components/InstalledPlugin.js +8 -4
  116. package/esm/PluginStoreWidget/components/InstalledPluginsList.d.ts +2 -2
  117. package/esm/PluginStoreWidget/components/InstalledPluginsList.js +2 -1
  118. package/esm/PluginStoreWidget/components/PluginCard.d.ts +2 -2
  119. package/esm/PluginStoreWidget/components/PluginCard.js +2 -1
  120. package/esm/PluginStoreWidget/components/PluginStoreWidget.d.ts +3 -4
  121. package/esm/PluginStoreWidget/components/PluginStoreWidget.js +3 -3
  122. package/esm/index.d.ts +1 -9
  123. package/esm/index.js +1 -3
  124. package/esm/ucsc-trackhub/model.js +2 -2
  125. package/package.json +5 -4
  126. package/dist/SetDefaultSession/SetDefaultSession.d.ts +0 -6
  127. package/dist/SetDefaultSession/SetDefaultSession.js +0 -38
  128. package/dist/SetDefaultSession/index.d.ts +0 -1
  129. package/dist/SetDefaultSession/index.js +0 -8
  130. package/esm/SetDefaultSession/SetDefaultSession.d.ts +0 -6
  131. package/esm/SetDefaultSession/SetDefaultSession.js +0 -33
  132. package/esm/SetDefaultSession/index.d.ts +0 -1
  133. package/esm/SetDefaultSession/index.js +0 -1
@@ -1,13 +1,15 @@
1
1
  import React from 'react';
2
2
  import { HierarchicalTrackSelectorModel } from '../../model';
3
- export default function FacetedHeader({ setFilterText, setUseShoppingCart, setHideSparse, setShowOptions, showOptions, hideSparse, useShoppingCart, filterText, model, }: {
3
+ export default function FacetedHeader({ setFilterText, setUseShoppingCart, setShowSparse, setShowFilters, setShowOptions, showOptions, showSparse, showFilters, useShoppingCart, filterText, model, }: {
4
4
  setFilterText: (arg: string) => void;
5
5
  setUseShoppingCart: (arg: boolean) => void;
6
- setHideSparse: (arg: boolean) => void;
6
+ setShowSparse: (arg: boolean) => void;
7
+ setShowFilters: (arg: boolean) => void;
7
8
  setShowOptions: (arg: boolean) => void;
8
9
  filterText: string;
9
10
  showOptions: boolean;
10
11
  useShoppingCart: boolean;
11
- hideSparse: boolean;
12
+ showSparse: boolean;
13
+ showFilters: boolean;
12
14
  model: HierarchicalTrackSelectorModel;
13
15
  }): React.JSX.Element;
@@ -6,7 +6,7 @@ import ClearIcon from '@mui/icons-material/Clear';
6
6
  import MoreVert from '@mui/icons-material/MoreVert';
7
7
  // locals
8
8
  import ShoppingCart from '../ShoppingCart';
9
- export default function FacetedHeader({ setFilterText, setUseShoppingCart, setHideSparse, setShowOptions, showOptions, hideSparse, useShoppingCart, filterText, model, }) {
9
+ export default function FacetedHeader({ setFilterText, setUseShoppingCart, setShowSparse, setShowFilters, setShowOptions, showOptions, showSparse, showFilters, useShoppingCart, filterText, model, }) {
10
10
  const [anchorEl, setAnchorEl] = useState(null);
11
11
  return (React.createElement(React.Fragment, null,
12
12
  React.createElement(Grid, { container: true, spacing: 4, alignItems: "center" },
@@ -32,9 +32,15 @@ export default function FacetedHeader({ setFilterText, setUseShoppingCart, setHi
32
32
  checked: useShoppingCart,
33
33
  },
34
34
  {
35
- label: 'Hide sparse metadata columns',
36
- onClick: () => setHideSparse(!hideSparse),
37
- checked: hideSparse,
35
+ label: 'Show sparse metadata columns',
36
+ onClick: () => setShowSparse(!showSparse),
37
+ checked: showSparse,
38
+ type: 'checkbox',
39
+ },
40
+ {
41
+ label: 'Show facet filters',
42
+ onClick: () => setShowFilters(!showFilters),
43
+ checked: showFilters,
38
44
  type: 'checkbox',
39
45
  },
40
46
  {
@@ -6,7 +6,7 @@ export interface InfoArgs {
6
6
  id: string;
7
7
  conf: AnyConfigurationModel;
8
8
  }
9
- declare const _default: ({ model, }: {
9
+ declare const FacetedSelector: ({ model, }: {
10
10
  model: HierarchicalTrackSelectorModel;
11
11
  }) => React.JSX.Element;
12
- export default _default;
12
+ export default FacetedSelector;
@@ -9,9 +9,11 @@ import { getTrackName } from '@jbrowse/core/util/tracks';
9
9
  import { ResizeHandle } from '@jbrowse/core/ui';
10
10
  import SanitizedHTML from '@jbrowse/core/ui/SanitizedHTML';
11
11
  import JBrowseMenu from '@jbrowse/core/ui/Menu';
12
- import ResizeBar, { useResizeBar } from '@jbrowse/core/ui/ResizeBar';
13
- import { getEnv, getSession, measureGridWidth, useDebounce, } from '@jbrowse/core/util';
12
+ import ResizeBar from '@jbrowse/core/ui/ResizeBar';
13
+ import { getEnv, getSession, measureGridWidth, useDebounce, useLocalStorage, } from '@jbrowse/core/util';
14
14
  import { readConfObject, } from '@jbrowse/core/configuration';
15
+ import { useResizeBar } from '@jbrowse/core/ui/useResizeBar';
16
+ import { makeStyles } from 'tss-react/mui';
15
17
  // icons
16
18
  import MoreHoriz from '@mui/icons-material/MoreHoriz';
17
19
  import { matches } from '../../util';
@@ -19,24 +21,31 @@ import FacetedHeader from './FacetedHeader';
19
21
  import FacetFilters from './FacetFilters';
20
22
  import { getRootKeys } from './util';
21
23
  const nonMetadataKeys = ['category', 'adapter', 'description'];
24
+ const useStyles = makeStyles()({
25
+ cell: {
26
+ whiteSpace: 'nowrap',
27
+ overflow: 'hidden',
28
+ textOverflow: 'ellipsis',
29
+ },
30
+ });
22
31
  const frac = 0.75;
23
- export default observer(function FacetedSelector({ model, }) {
32
+ const FacetedSelector = observer(function FacetedSelector({ model, }) {
24
33
  var _a, _b;
34
+ const { classes } = useStyles();
25
35
  const { view, selection } = model;
26
36
  const { pluginManager } = getEnv(model);
27
37
  const { ref, scrollLeft } = useResizeBar();
28
38
  const [filterText, setFilterText] = useState('');
29
- const [showOptions, setShowOptions] = useState(false);
39
+ const [showOptions, setShowOptions] = useLocalStorage('facet-showTableOptions', false);
30
40
  const [info, setInfo] = useState();
31
41
  const [useShoppingCart, setUseShoppingCart] = useState(false);
32
- const [hideSparse, setHideSparse] = useState(true);
33
- const [panelWidth, setPanelWidth] = useState(400);
42
+ const [showSparse, setShowSparse] = useLocalStorage('facet-showSparse', false);
43
+ const [showFilters, setShowFilters] = useLocalStorage('facet-showFilters', true);
44
+ const [panelWidth, setPanelWidth] = useLocalStorage('facet-panelWidth', 400);
34
45
  const session = getSession(model);
35
46
  const filterDebounced = useDebounce(filterText, 400);
36
47
  const tracks = view.tracks;
37
- const [filters, dispatch] = useReducer((state, update) => {
38
- return { ...state, [update.key]: update.val };
39
- }, {});
48
+ const [filters, dispatch] = useReducer((state, update) => ({ ...state, [update.key]: update.val }), {});
40
49
  const rows = useMemo(() => {
41
50
  // metadata is spread onto the object for easier access and sorting
42
51
  // by the mui data grid (it's unable to sort by nested objects)
@@ -57,10 +66,10 @@ export default observer(function FacetedSelector({ model, }) {
57
66
  };
58
67
  });
59
68
  }, [model, filterDebounced, session]);
60
- const filteredNonMetadataKeys = useMemo(() => nonMetadataKeys.filter(f => !hideSparse ? true : rows.map(r => r[f]).filter(f => !!f).length > 5), [hideSparse, rows]);
61
- const filteredMetadataKeys = useMemo(() => [...new Set(rows.flatMap(row => getRootKeys(row.metadata)))].filter(f => !hideSparse
69
+ const filteredNonMetadataKeys = useMemo(() => nonMetadataKeys.filter(f => showSparse ? true : rows.map(r => r[f]).filter(f => !!f).length > 5), [showSparse, rows]);
70
+ const filteredMetadataKeys = useMemo(() => [...new Set(rows.flatMap(row => getRootKeys(row.metadata)))].filter(f => showSparse
62
71
  ? true
63
- : rows.map(r => r.metadata[f]).filter(f => !!f).length > 5), [hideSparse, rows]);
72
+ : rows.map(r => r.metadata[f]).filter(f => !!f).length > 5), [showSparse, rows]);
64
73
  const fields = useMemo(() => ['name', ...filteredNonMetadataKeys, ...filteredMetadataKeys], [filteredNonMetadataKeys, filteredMetadataKeys]);
65
74
  const [widths, setWidths] = useState({
66
75
  name: measureGridWidth(rows.map(r => r.name), { maxWidth: 500, stripHTML: true }) + 15,
@@ -96,15 +105,15 @@ export default observer(function FacetedSelector({ model, }) {
96
105
  measureGridWidth(rows.map(r => r.metadata[e]), { stripHTML: true, maxWidth: 400 }),
97
106
  ])),
98
107
  }));
99
- }, [filteredMetadataKeys, visible, filteredNonMetadataKeys, hideSparse, rows]);
100
- const widthsDebounced = useDebounce(widths, 400);
108
+ }, [filteredMetadataKeys, visible, filteredNonMetadataKeys, showSparse, rows]);
109
+ const widthsDebounced = useDebounce(widths, 200);
101
110
  const columns = [
102
111
  {
103
112
  field: 'name',
104
113
  hideable: false,
105
114
  renderCell: (params) => {
106
115
  const { value, id, row } = params;
107
- return (React.createElement(React.Fragment, null,
116
+ return (React.createElement("div", { className: classes.cell },
108
117
  React.createElement(SanitizedHTML, { html: value }),
109
118
  React.createElement(IconButton, { onClick: e => setInfo({
110
119
  target: e.currentTarget,
@@ -122,7 +131,7 @@ export default observer(function FacetedSelector({ model, }) {
122
131
  width: (_a = widthsDebounced[e]) !== null && _a !== void 0 ? _a : 100,
123
132
  renderCell: (params) => {
124
133
  const { value } = params;
125
- return value ? React.createElement(SanitizedHTML, { html: value }) : '';
134
+ return (React.createElement("div", { className: classes.cell }, value ? React.createElement(SanitizedHTML, { html: value }) : ''));
126
135
  },
127
136
  });
128
137
  }),
@@ -133,19 +142,22 @@ export default observer(function FacetedSelector({ model, }) {
133
142
  width: (_a = widthsDebounced[e]) !== null && _a !== void 0 ? _a : 100,
134
143
  renderCell: (params) => {
135
144
  const { value } = params;
136
- return value ? React.createElement(SanitizedHTML, { html: value }) : '';
145
+ return (React.createElement("div", { className: classes.cell }, value ? React.createElement(SanitizedHTML, { html: value }) : ''));
137
146
  },
138
147
  });
139
148
  }),
140
149
  ];
141
- const shownTrackIds = tracks.map(t => t.configuration.trackId);
142
- const arrFilters = Object.entries(filters).filter(f => f[1].length > 0);
150
+ const shownTrackIds = new Set(tracks.map(t => t.configuration.trackId));
151
+ const arrFilters = Object.entries(filters)
152
+ .filter(f => f[1].length > 0)
153
+ .map(([key, val]) => [key, new Set(val)]);
154
+ const filteredRows = rows.filter(row => arrFilters.every(([key, val]) => val.has(row[key])));
143
155
  return (React.createElement(React.Fragment, null,
144
156
  info ? (React.createElement(JBrowseMenu, { anchorEl: info === null || info === void 0 ? void 0 : info.target, menuItems: ((_b = session.getTrackActionMenuItems) === null || _b === void 0 ? void 0 : _b.call(session, info.conf)) || [], onMenuItemClick: (_event, callback) => {
145
157
  callback();
146
158
  setInfo(undefined);
147
159
  }, open: !!info, onClose: () => setInfo(undefined) })) : null,
148
- React.createElement(FacetedHeader, { setHideSparse: setHideSparse, setShowOptions: setShowOptions, setFilterText: setFilterText, setUseShoppingCart: setUseShoppingCart, hideSparse: hideSparse, showOptions: showOptions, filterText: filterText, useShoppingCart: useShoppingCart, model: model }),
160
+ React.createElement(FacetedHeader, { setShowSparse: setShowSparse, setShowFilters: setShowFilters, setShowOptions: setShowOptions, setFilterText: setFilterText, setUseShoppingCart: setUseShoppingCart, showFilters: showFilters, showSparse: showSparse, showOptions: showOptions, filterText: filterText, useShoppingCart: useShoppingCart, model: model }),
149
161
  React.createElement("div", { ref: ref, style: {
150
162
  display: 'flex',
151
163
  overflow: 'hidden',
@@ -154,21 +166,22 @@ export default observer(function FacetedSelector({ model, }) {
154
166
  } },
155
167
  React.createElement("div", { style: {
156
168
  height: window.innerHeight * frac,
157
- width: window.innerWidth * frac - panelWidth,
169
+ width: window.innerWidth * frac - (showFilters ? panelWidth : 0),
158
170
  } },
159
171
  React.createElement(ResizeBar, { checkbox: true, widths: Object.values(widths).map(f => f !== null && f !== void 0 ? f : 100), setWidths: newWidths => setWidths(Object.fromEntries(Object.entries(widths).map((entry, idx) => [
160
172
  entry[0],
161
173
  newWidths[idx],
162
174
  ]))), scrollLeft: scrollLeft }),
163
- React.createElement(DataGrid, { rows: rows.filter(row => arrFilters.every(([key, val]) => val.includes(row[key]))), columnVisibilityModel: visible, onColumnVisibilityModelChange: newModel => setVisible(newModel), columnHeaderHeight: 35, checkboxSelection: true, disableRowSelectionOnClick: true, keepNonExistentRowsSelected: true, onRowSelectionModelChange: userSelectedIds => {
175
+ React.createElement(DataGrid, { rows: filteredRows, columnVisibilityModel: visible, onColumnVisibilityModelChange: newModel => setVisible(newModel), columnHeaderHeight: 35, checkboxSelection: true, disableRowSelectionOnClick: true, keepNonExistentRowsSelected: true, onRowSelectionModelChange: userSelectedIds => {
164
176
  if (!useShoppingCart) {
165
177
  const a1 = shownTrackIds;
166
- const a2 = userSelectedIds;
178
+ const a2 = new Set(userSelectedIds);
167
179
  // synchronize the user selection with the view
168
180
  // see share https://stackoverflow.com/a/33034768/2129219
169
181
  transaction(() => {
170
- a1.filter(x => !a2.includes(x)).map(t => view.hideTrack(t));
171
- a2.filter(x => !a1.includes(x)).map(t => view.showTrack(t));
182
+ ;
183
+ [...a1].filter(x => !a2.has(x)).map(t => view.hideTrack(t));
184
+ [...a2].filter(x => !a1.has(x)).map(t => view.showTrack(t));
172
185
  });
173
186
  }
174
187
  else {
@@ -177,10 +190,18 @@ export default observer(function FacetedSelector({ model, }) {
177
190
  const tracks = userSelectedIds.map(id => resolveIdentifier(schema, root, id));
178
191
  model.setSelection(tracks);
179
192
  }
180
- }, rowSelectionModel: useShoppingCart ? selection.map(s => s.trackId) : shownTrackIds, slots: { toolbar: showOptions ? GridToolbar : null }, slotProps: {
193
+ }, rowSelectionModel: useShoppingCart
194
+ ? selection.map(s => s.trackId)
195
+ : [...shownTrackIds], slots: { toolbar: showOptions ? GridToolbar : null }, slotProps: {
181
196
  toolbar: { printOptions: { disableToolbarButton: true } },
182
197
  }, columns: columns, rowHeight: 25 })),
183
- React.createElement(ResizeHandle, { vertical: true, onDrag: dist => setPanelWidth(panelWidth - dist), style: { background: 'grey', width: 5 } }),
184
- React.createElement("div", { style: { width: panelWidth, overflowY: 'auto', overflowX: 'hidden' } },
185
- React.createElement(FacetFilters, { width: panelWidth - 10, rows: rows, columns: columns, dispatch: dispatch, filters: filters })))));
198
+ showFilters ? (React.createElement(React.Fragment, null,
199
+ React.createElement(ResizeHandle, { vertical: true, onDrag: dist => setPanelWidth(panelWidth - dist), style: { marginLeft: 5, background: 'grey', width: 5 } }),
200
+ React.createElement("div", { style: {
201
+ width: panelWidth,
202
+ overflowY: 'auto',
203
+ overflowX: 'hidden',
204
+ } },
205
+ React.createElement(FacetFilters, { width: panelWidth - 10, rows: rows, columns: columns, dispatch: dispatch, filters: filters })))) : null)));
186
206
  });
207
+ export default FacetedSelector;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { HierarchicalTrackSelectorModel } from '../../model';
3
- declare const _default: ({ model, }: {
3
+ declare const HamburgerMenu: ({ model, }: {
4
4
  model: HierarchicalTrackSelectorModel;
5
5
  }) => React.JSX.Element;
6
- export default _default;
6
+ export default HamburgerMenu;
@@ -10,15 +10,16 @@ const CloseConnectionDlg = lazy(() => import('../dialogs/CloseConnectionDialog')
10
10
  const DeleteConnectionDlg = lazy(() => import('../dialogs/DeleteConnectionDialog'));
11
11
  const ManageConnectionsDlg = lazy(() => import('../dialogs/ManageConnectionsDialog'));
12
12
  const ToggleConnectionsDlg = lazy(() => import('../dialogs/ToggleConnectionsDialog'));
13
- export default observer(function HamburgerMenu({ model, }) {
13
+ const HamburgerMenu = observer(function ({ model, }) {
14
14
  const session = getSession(model);
15
15
  const [modalInfo, setModalInfo] = useState();
16
16
  const [deleteDlgDetails, setDeleteDlgDetails] = useState();
17
17
  const [connectionToggleOpen, setConnectionToggleOpen] = useState(false);
18
18
  const [connectionManagerOpen, setConnectionManagerOpen] = useState(false);
19
19
  function breakConnection(connectionConf, deletingConnection) {
20
+ var _a;
20
21
  const name = readConfObject(connectionConf, 'name');
21
- const result = session.prepareToBreakConnection(connectionConf);
22
+ const result = (_a = session.prepareToBreakConnection) === null || _a === void 0 ? void 0 : _a.call(session, connectionConf);
22
23
  if (result) {
23
24
  const [safelyBreakConnection, dereferenceTypeCount] = result;
24
25
  if (Object.keys(dereferenceTypeCount).length > 0) {
@@ -115,3 +116,4 @@ export default observer(function HamburgerMenu({ model, }) {
115
116
  connectionManagerOpen ? (React.createElement(ManageConnectionsDlg, { handleClose: () => setConnectionManagerOpen(false), breakConnection: breakConnection, session: session })) : null,
116
117
  connectionToggleOpen ? (React.createElement(ToggleConnectionsDlg, { handleClose: () => setConnectionToggleOpen(false), session: session, breakConnection: breakConnection })) : null)));
117
118
  });
119
+ export default HamburgerMenu;
@@ -1,8 +1,7 @@
1
1
  import React from 'react';
2
2
  import { HierarchicalTrackSelectorModel } from '../../model';
3
- declare function HierarchicalTrackSelectorHeader({ model, setHeaderHeight, }: {
3
+ declare const HierarchicalTrackSelectorHeader: ({ model, setHeaderHeight, }: {
4
4
  model: HierarchicalTrackSelectorModel;
5
5
  setHeaderHeight: (n: number) => void;
6
- }): React.JSX.Element;
7
- declare const _default: typeof HierarchicalTrackSelectorHeader;
8
- export default _default;
6
+ }) => React.JSX.Element;
7
+ export default HierarchicalTrackSelectorHeader;
@@ -26,7 +26,7 @@ const SearchTracksTextField = observer(function ({ model, }) {
26
26
  React.createElement(ClearIcon, null)))),
27
27
  } }));
28
28
  });
29
- function HierarchicalTrackSelectorHeader({ model, setHeaderHeight, }) {
29
+ const HierarchicalTrackSelectorHeader = observer(function ({ model, setHeaderHeight, }) {
30
30
  const { classes } = useStyles();
31
31
  const [facetedOpen, setFacetedOpen] = useState(false);
32
32
  return (React.createElement("div", { ref: ref => setHeaderHeight((ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect().height) || 0), "data-testid": "hierarchical_track_selector" },
@@ -36,5 +36,5 @@ function HierarchicalTrackSelectorHeader({ model, setHeaderHeight, }) {
36
36
  React.createElement(SearchTracksTextField, { model: model }),
37
37
  React.createElement(Button, { className: classes.menuIcon, onClick: () => setFacetedOpen(true) }, "Open faceted selector")),
38
38
  React.createElement(Suspense, { fallback: React.createElement("div", null) }, facetedOpen ? (React.createElement(FacetedDialog, { handleClose: () => setFacetedOpen(false), model: model })) : null)));
39
- }
40
- export default observer(HierarchicalTrackSelectorHeader);
39
+ });
40
+ export default HierarchicalTrackSelectorHeader;
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
2
  import { TreeNode } from '../../generateHierarchy';
3
3
  import { HierarchicalTrackSelectorModel } from '../../model';
4
- declare const _default: ({ height, tree, model, }: {
4
+ declare const HierarchicalTree: ({ height, tree, model, }: {
5
5
  height: number;
6
6
  tree: TreeNode;
7
7
  model: HierarchicalTrackSelectorModel;
8
8
  }) => React.JSX.Element;
9
- export default _default;
9
+ export default HierarchicalTree;
@@ -23,7 +23,7 @@ function getNodeData(node, nestingLevel, extra, selection) {
23
23
  // this is the main tree component for the hierarchical track selector in note:
24
24
  // in jbrowse-web the toolbar is position="sticky" which means the autosizer
25
25
  // includes the height of the toolbar, so we subtract the given offsets
26
- export default observer(function HierarchicalTree({ height, tree, model, }) {
26
+ const HierarchicalTree = observer(function HierarchicalTree({ height, tree, model, }) {
27
27
  const { filterText, selection, view } = model;
28
28
  const treeRef = useRef(null);
29
29
  const session = getSession(model);
@@ -37,15 +37,13 @@ export default observer(function HierarchicalTree({ height, tree, model, }) {
37
37
  drawerPosition,
38
38
  }), [view, model, drawerPosition, tree]);
39
39
  const treeWalker = useCallback(function* treeWalker() {
40
- for (let i = 0; i < tree.children.length; i++) {
41
- const r = tree.children[i];
42
- yield getNodeData(r, 0, extra, obj);
40
+ for (const child of tree.children) {
41
+ yield getNodeData(child, 0, extra, obj);
43
42
  }
44
43
  while (true) {
45
44
  // @ts-expect-error
46
45
  const parentMeta = yield;
47
- for (let i = 0; i < parentMeta.node.children.length; i++) {
48
- const curr = parentMeta.node.children[i];
46
+ for (const curr of parentMeta.node.children) {
49
47
  yield getNodeData(curr, parentMeta.nestingLevel + 1, extra, obj);
50
48
  }
51
49
  }
@@ -60,3 +58,4 @@ export default observer(function HierarchicalTree({ height, tree, model, }) {
60
58
  return (React.createElement(React.Fragment, null,
61
59
  React.createElement(VariableSizeTree, { ref: treeRef, treeWalker: treeWalker, height: height }, Node)));
62
60
  });
61
+ export default HierarchicalTree;
@@ -1,14 +1,14 @@
1
- import React, { useState } from 'react';
2
- import { Checkbox, FormControlLabel, IconButton, Tooltip } from '@mui/material';
1
+ import React from 'react';
2
+ import { Checkbox, FormControlLabel, Tooltip } from '@mui/material';
3
3
  import { makeStyles } from 'tss-react/mui';
4
- import JBrowseMenu from '@jbrowse/core/ui/Menu';
5
4
  import { getSession } from '@jbrowse/core/util';
5
+ import SanitizedHTML from '@jbrowse/core/ui/SanitizedHTML';
6
6
  import { readConfObject, } from '@jbrowse/core/configuration';
7
7
  // icons
8
8
  import MoreHorizIcon from '@mui/icons-material/MoreHoriz';
9
9
  // locals
10
10
  import { isUnsupported } from '../util';
11
- import { SanitizedHTML } from '@jbrowse/core/ui';
11
+ import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton';
12
12
  const useStyles = makeStyles()(theme => ({
13
13
  compactCheckbox: {
14
14
  padding: 0,
@@ -21,10 +21,8 @@ const useStyles = makeStyles()(theme => ({
21
21
  },
22
22
  }));
23
23
  export default function TrackLabel({ data }) {
24
- var _a, _b;
25
24
  const { classes } = useStyles();
26
25
  const { checked, conf, model, drawerPosition, id, name, onChange, selected } = data;
27
- const [info, setInfo] = useState();
28
26
  const description = (conf && readConfObject(conf, ['description'])) || '';
29
27
  return (React.createElement(React.Fragment, null,
30
28
  React.createElement(Tooltip, { title: description + (selected ? ' (in selection)' : ''), placement: drawerPosition === 'left' ? 'right' : 'left' },
@@ -33,24 +31,24 @@ export default function TrackLabel({ data }) {
33
31
  'data-testid': `htsTrackEntry-${id}`,
34
32
  } }), label: React.createElement("div", { "data-testid": `htsTrackLabel-${id}`, style: { background: selected ? '#cccc' : undefined } },
35
33
  React.createElement(SanitizedHTML, { html: name })) })),
36
- React.createElement(IconButton, { onClick: e => setInfo({ target: e.currentTarget, id, conf }), style: { padding: 0 }, "data-testid": `htsTrackEntryMenu-${id}` },
37
- React.createElement(MoreHorizIcon, null)),
38
- info ? (React.createElement(JBrowseMenu, { anchorEl: info === null || info === void 0 ? void 0 : info.target, menuItems: [
39
- ...(((_b = (_a = getSession(model)).getTrackActionMenuItems) === null || _b === void 0 ? void 0 : _b.call(_a, info.conf)) || []),
40
- {
41
- label: 'Add to selection',
42
- onClick: () => model.addToSelection([info.conf]),
43
- },
44
- ...(selected
45
- ? [
46
- {
47
- label: 'Remove from selection',
48
- onClick: () => model.removeFromSelection([info.conf]),
49
- },
50
- ]
51
- : []),
52
- ], onMenuItemClick: (_event, callback) => {
53
- callback();
54
- setInfo(undefined);
55
- }, open: Boolean(info), onClose: () => setInfo(undefined) })) : null));
34
+ React.createElement(TrackMenuButton, { model: model, selected: selected, id: id, conf: conf })));
35
+ }
36
+ function TrackMenuButton({ id, model, selected, conf, }) {
37
+ var _a, _b;
38
+ return (React.createElement(CascadingMenuButton, { style: { padding: 0 }, "data-testid": `htsTrackEntryMenu-${id}`, menuItems: [
39
+ ...(((_b = (_a = getSession(model)).getTrackActionMenuItems) === null || _b === void 0 ? void 0 : _b.call(_a, conf)) || []),
40
+ {
41
+ label: 'Add to selection',
42
+ onClick: () => model.addToSelection([conf]),
43
+ },
44
+ ...(selected
45
+ ? [
46
+ {
47
+ label: 'Remove from selection',
48
+ onClick: () => model.removeFromSelection([conf]),
49
+ },
50
+ ]
51
+ : []),
52
+ ] },
53
+ React.createElement(MoreHorizIcon, null)));
56
54
  }
@@ -6,8 +6,7 @@ export function treeToMap(tree, map = new Map()) {
6
6
  if (tree.id && tree.children.length) {
7
7
  map.set(tree.id, tree);
8
8
  }
9
- for (let i = 0; i < tree.children.length; i++) {
10
- const node = tree.children[i];
9
+ for (const node of tree.children) {
11
10
  treeToMap(node, map);
12
11
  }
13
12
  return map;
@@ -1,21 +1,24 @@
1
1
  import { AnyConfigurationModel } from '@jbrowse/core/configuration';
2
- export type TreeNode = {
2
+ export interface TreeNode {
3
3
  name: string;
4
4
  id: string;
5
5
  conf?: AnyConfigurationModel;
6
6
  checked?: boolean;
7
7
  isOpenByDefault?: boolean;
8
8
  children: TreeNode[];
9
- };
10
- export declare function generateHierarchy(model: {
11
- filterText: string;
12
- activeSortTrackNames: boolean;
13
- activeSortCategories: boolean;
14
- view?: {
15
- tracks: {
16
- configuration: AnyConfigurationModel;
17
- }[];
9
+ }
10
+ export declare function generateHierarchy({ model, trackConfs, extra, }: {
11
+ model: {
12
+ filterText: string;
13
+ activeSortTrackNames: boolean;
14
+ activeSortCategories: boolean;
15
+ collapsed: Map<string, boolean>;
16
+ view?: {
17
+ tracks: {
18
+ configuration: AnyConfigurationModel;
19
+ }[];
20
+ };
18
21
  };
19
- }, trackConfs: AnyConfigurationModel[], collapsed: {
20
- get: (arg: string) => boolean | undefined;
21
- }, extra?: string): TreeNode[];
22
+ trackConfs: AnyConfigurationModel[];
23
+ extra?: string;
24
+ }): TreeNode[];
@@ -37,9 +37,9 @@ function sortConfs(confs, sortNames, sortCategories) {
37
37
  }
38
38
  return ret.map(a => a[0]);
39
39
  }
40
- export function generateHierarchy(model, trackConfs, collapsed, extra) {
40
+ export function generateHierarchy({ model, trackConfs, extra, }) {
41
41
  const hierarchy = { children: [] };
42
- const { filterText, activeSortTrackNames, activeSortCategories, view } = model;
42
+ const { collapsed, filterText, activeSortTrackNames, activeSortCategories, view, } = model;
43
43
  if (!view) {
44
44
  return [];
45
45
  }
@@ -186,7 +186,11 @@ export default function stateTreeFactory(pluginManager) {
186
186
  * #method
187
187
  */
188
188
  connectionHierarchy(connection) {
189
- return generateHierarchy(self, self.connectionTrackConfigurations(connection), self.collapsed, connection.name);
189
+ return generateHierarchy({
190
+ model: self,
191
+ trackConfs: self.connectionTrackConfigurations(connection),
192
+ extra: connection.name,
193
+ });
190
194
  },
191
195
  }))
192
196
  .views(self => ({
@@ -216,7 +220,10 @@ export default function stateTreeFactory(pluginManager) {
216
220
  .map(s => ({
217
221
  name: s.group,
218
222
  id: s.group,
219
- children: generateHierarchy(self, s.tracks, self.collapsed),
223
+ children: generateHierarchy({
224
+ model: self,
225
+ trackConfs: s.tracks,
226
+ }),
220
227
  }))
221
228
  // always keep the Tracks entry at idx 0
222
229
  .filter((f, idx) => idx === 0 || !!f.children.length),
@@ -260,21 +267,19 @@ export default function stateTreeFactory(pluginManager) {
260
267
  ])) {
261
268
  self.collapseTopLevelCategories();
262
269
  }
263
- else if (getConf(session, [
270
+ if (getConf(session, [
264
271
  'hierarchical',
265
272
  'defaultCollapsed',
266
273
  'subCategories',
267
274
  ])) {
268
275
  self.collapseSubCategories();
269
276
  }
270
- else {
271
- for (const entry of getConf(session, [
272
- 'hierarchical',
273
- 'defaultCollapsed',
274
- 'categoryNames',
275
- ])) {
276
- self.collapsed.set(entry, true);
277
- }
277
+ for (const entry of getConf(session, [
278
+ 'hierarchical',
279
+ 'defaultCollapsed',
280
+ 'categoryNames',
281
+ ])) {
282
+ self.collapsed.set(entry, true);
278
283
  }
279
284
  self.initialized = true;
280
285
  }
@@ -282,7 +287,7 @@ export default function stateTreeFactory(pluginManager) {
282
287
  }))
283
288
  .views(self => ({
284
289
  get hasAnySubcategories() {
285
- return self.allTracks.some(group => group.tracks.some(track => { var _a; return ((_a = readConfObject(track, 'category')) === null || _a === void 0 ? void 0 : _a.length) > 1; }));
290
+ return self.allTracks.some(group => group.tracks.some(t => { var _a; return ((_a = readConfObject(t, 'category')) === null || _a === void 0 ? void 0 : _a.length) > 1; }));
286
291
  },
287
292
  }));
288
293
  }
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { PluginStoreModel } from '../model';
3
- declare const _default: ({ onClose, model, }: {
3
+ declare const AddCustomPluginDialog: ({ onClose, model, }: {
4
4
  onClose: () => void;
5
5
  model: PluginStoreModel;
6
6
  }) => React.JSX.Element;
7
- export default _default;
7
+ export default AddCustomPluginDialog;
@@ -23,7 +23,7 @@ const useStyles = makeStyles()(theme => ({
23
23
  transform: 'rotate(180deg)',
24
24
  },
25
25
  }));
26
- export default observer(function ({ onClose, model, }) {
26
+ const AddCustomPluginDialog = observer(function ({ onClose, model, }) {
27
27
  const { classes, cx } = useStyles();
28
28
  const [umdPluginName, setUMDPluginName] = useState('');
29
29
  const [umdPluginUrl, setUMDPluginUrl] = useState('');
@@ -64,3 +64,4 @@ export default observer(function ({ onClose, model, }) {
64
64
  React.createElement(Button, { variant: "contained", onClick: onClose }, "Cancel"),
65
65
  React.createElement(Button, { variant: "contained", color: "primary", onClick: handleSubmit, disabled: !ready }, "Submit")))));
66
66
  });
67
+ export default AddCustomPluginDialog;
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
  import { BasePlugin } from '@jbrowse/core/util/types';
3
3
  import { PluginStoreModel } from '../model';
4
- declare const _default: ({ plugin, model, }: {
4
+ declare const InstalledPlugin: ({ plugin, model, }: {
5
5
  plugin: BasePlugin;
6
6
  model: PluginStoreModel;
7
7
  }) => React.JSX.Element;
8
- export default _default;
8
+ export default InstalledPlugin;
@@ -18,12 +18,15 @@ function LockedPlugin() {
18
18
  return (React.createElement(Tooltip, { className: classes.lockedPluginTooltip, title: "This plugin was installed by an administrator, you cannot remove it." },
19
19
  React.createElement(LockIcon, null)));
20
20
  }
21
- export default observer(function ({ plugin, model, }) {
21
+ const InstalledPlugin = observer(function ({ plugin, model, }) {
22
+ var _a;
22
23
  const [dialogPlugin, setDialogPlugin] = useState();
23
24
  const { pluginManager } = getEnv(model);
24
25
  const session = getSession(model);
25
- const { jbrowse, adminMode, sessionPlugins } = session;
26
- const isSessionPlugin = sessionPlugins === null || sessionPlugins === void 0 ? void 0 : sessionPlugins.some((p) => pluginManager.pluginMetadata[plugin.name].url === p.url);
26
+ const { jbrowse, adminMode } = session;
27
+ const isSessionPlugin = isSessionWithSessionPlugins(session)
28
+ ? (_a = session.sessionPlugins) === null || _a === void 0 ? void 0 : _a.some(p => pluginManager.pluginMetadata[plugin.name].url === p.url)
29
+ : false;
27
30
  return (React.createElement(React.Fragment, null,
28
31
  dialogPlugin ? (React.createElement(Suspense, { fallback: React.createElement(React.Fragment, null) },
29
32
  React.createElement(DeletePluginDialog, { plugin: dialogPlugin, onClose: name => {
@@ -39,7 +42,8 @@ export default observer(function ({ plugin, model, }) {
39
42
  setDialogPlugin(undefined);
40
43
  } }))) : null,
41
44
  React.createElement(ListItem, { key: plugin.name },
42
- adminMode || isSessionPlugin ? (React.createElement(IconButton, { "aria-label": "removePlugin", "data-testid": `removePlugin-${plugin.name}`, onClick: () => setDialogPlugin(plugin.name) },
45
+ adminMode || isSessionPlugin ? (React.createElement(IconButton, { "data-testid": `removePlugin-${plugin.name}`, onClick: () => setDialogPlugin(plugin.name) },
43
46
  React.createElement(CloseIcon, null))) : (React.createElement(LockedPlugin, null)),
44
47
  React.createElement(Typography, null, plugin.name))));
45
48
  });
49
+ export default InstalledPlugin;
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
  import PluginManager from '@jbrowse/core/PluginManager';
3
3
  import { PluginStoreModel } from '../model';
4
- declare const _default: ({ pluginManager, model, }: {
4
+ declare const InstalledPluginsList: ({ pluginManager, model, }: {
5
5
  pluginManager: PluginManager;
6
6
  model: PluginStoreModel;
7
7
  }) => React.JSX.Element;
8
- export default _default;
8
+ export default InstalledPluginsList;