@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.
- package/dist/AddConnectionWidget/components/AddConnectionWidget.js +3 -1
- package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +3 -1
- package/dist/AddTrackWidget/components/AddTrackWidget.js +3 -1
- package/dist/AddTrackWidget/components/ConfirmTrack.js +10 -6
- package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js +2 -3
- package/dist/AddTrackWidget/components/PasteConfigWorkflow.js +6 -2
- package/dist/AddTrackWidget/components/TextIndexingConfig.js +16 -8
- package/dist/AddTrackWidget/components/TrackAdapterSelector.js +3 -1
- package/dist/AddTrackWidget/components/TrackTypeSelector.js +3 -1
- package/dist/AddTrackWidget/model.js +1 -1
- package/dist/AssemblyManager/AssemblyAddForm.d.ts +3 -2
- package/dist/AssemblyManager/AssemblyAddForm.js +38 -18
- package/dist/AssemblyManager/AssemblyManager.js +15 -5
- package/dist/AssemblyManager/AssemblyTable.js +3 -1
- package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +6 -2
- package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +13 -2
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +7 -7
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js +4 -4
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js +6 -2
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +4 -2
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +12 -4
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +24 -8
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +8 -4
- package/dist/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.js +6 -2
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +36 -12
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +9 -3
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +5 -1
- package/dist/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.js +6 -2
- package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +3 -1
- package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +4 -2
- package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.js +12 -4
- package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.js +3 -1
- package/dist/HierarchicalTrackSelectorWidget/components/util.d.ts +1 -1
- package/dist/HierarchicalTrackSelectorWidget/components/util.js +1 -1
- package/dist/HierarchicalTrackSelectorWidget/facetedModel.d.ts +1 -1
- package/dist/HierarchicalTrackSelectorWidget/facetedModel.js +1 -0
- package/dist/HierarchicalTrackSelectorWidget/model.d.ts +1 -1
- package/dist/HierarchicalTrackSelectorWidget/model.js +1 -1
- package/dist/PluginStoreWidget/components/AddCustomPluginDialog.js +15 -5
- package/dist/PluginStoreWidget/components/DeletePluginDialog.js +6 -2
- package/dist/PluginStoreWidget/components/InstalledPlugin.js +4 -3
- package/dist/PluginStoreWidget/components/PluginCard.js +1 -1
- package/dist/PluginStoreWidget/components/PluginStoreWidget.js +12 -4
- package/dist/ucsc-trackhub/doConnect.d.ts +5 -1
- package/dist/ucsc-trackhub/doConnect.js +0 -1
- package/dist/ucsc-trackhub/model.d.ts +23 -3
- package/dist/ucsc-trackhub/ucscTrackHub.d.ts +7 -7
- package/dist/ucsc-trackhub/ucscTrackHub.js +8 -10
- package/esm/AddConnectionWidget/components/AddConnectionWidget.js +3 -1
- package/esm/AddConnectionWidget/components/ConnectionTypeSelect.js +3 -1
- package/esm/AddTrackWidget/components/AddTrackWidget.js +3 -1
- package/esm/AddTrackWidget/components/ConfirmTrack.js +10 -6
- package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +2 -3
- package/esm/AddTrackWidget/components/PasteConfigWorkflow.js +6 -2
- package/esm/AddTrackWidget/components/TextIndexingConfig.js +16 -8
- package/esm/AddTrackWidget/components/TrackAdapterSelector.js +3 -1
- package/esm/AddTrackWidget/components/TrackTypeSelector.js +3 -1
- package/esm/AddTrackWidget/model.js +1 -1
- package/esm/AssemblyManager/AssemblyAddForm.d.ts +3 -2
- package/esm/AssemblyManager/AssemblyAddForm.js +38 -18
- package/esm/AssemblyManager/AssemblyManager.js +15 -5
- package/esm/AssemblyManager/AssemblyTable.js +3 -1
- package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +6 -2
- package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +13 -2
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +7 -7
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js +4 -4
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js +6 -2
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +4 -2
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +12 -4
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +24 -8
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +8 -4
- package/esm/HierarchicalTrackSelectorWidget/components/tree/FavoriteTracks.js +6 -2
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +36 -12
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +9 -3
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +5 -1
- package/esm/HierarchicalTrackSelectorWidget/components/tree/RecentlyUsedTracks.js +6 -2
- package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +3 -1
- package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +4 -2
- package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabelMenu.js +12 -4
- package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.js +3 -1
- package/esm/HierarchicalTrackSelectorWidget/components/util.d.ts +1 -1
- package/esm/HierarchicalTrackSelectorWidget/components/util.js +1 -1
- package/esm/HierarchicalTrackSelectorWidget/facetedModel.d.ts +1 -1
- package/esm/HierarchicalTrackSelectorWidget/facetedModel.js +1 -0
- package/esm/HierarchicalTrackSelectorWidget/model.d.ts +1 -1
- package/esm/HierarchicalTrackSelectorWidget/model.js +1 -1
- package/esm/PluginStoreWidget/components/AddCustomPluginDialog.js +15 -5
- package/esm/PluginStoreWidget/components/DeletePluginDialog.js +6 -2
- package/esm/PluginStoreWidget/components/InstalledPlugin.js +4 -3
- package/esm/PluginStoreWidget/components/PluginCard.js +1 -1
- package/esm/PluginStoreWidget/components/PluginStoreWidget.js +12 -4
- package/esm/ucsc-trackhub/doConnect.d.ts +5 -1
- package/esm/ucsc-trackhub/doConnect.js +0 -1
- package/esm/ucsc-trackhub/model.d.ts +23 -3
- package/esm/ucsc-trackhub/ucscTrackHub.d.ts +7 -7
- package/esm/ucsc-trackhub/ucscTrackHub.js +8 -10
- package/package.json +5 -5
|
@@ -67,10 +67,10 @@ const FacetedSelector = (0, mobx_react_1.observer)(function FacetedSelector({ mo
|
|
|
67
67
|
(0, util_1.measureGridWidth)(rows.map(r => r[e]), { maxWidth: 400, stripHTML: true }),
|
|
68
68
|
])),
|
|
69
69
|
...Object.fromEntries(filteredMetadataKeys
|
|
70
|
-
.filter(f => visible[
|
|
70
|
+
.filter(f => visible[`metadata.${f}`])
|
|
71
71
|
.map(e => {
|
|
72
72
|
return [
|
|
73
|
-
|
|
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[
|
|
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 =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
157
|
+
onClick: () => {
|
|
158
|
+
model.collapseSubCategories();
|
|
159
|
+
},
|
|
150
160
|
},
|
|
151
161
|
]
|
|
152
162
|
: []),
|
|
153
163
|
{
|
|
154
164
|
label: 'Collapse top-level categories',
|
|
155
|
-
onClick: () =>
|
|
165
|
+
onClick: () => {
|
|
166
|
+
model.collapseTopLevelCategories();
|
|
167
|
+
},
|
|
156
168
|
},
|
|
157
169
|
{
|
|
158
170
|
label: 'Expand all categories',
|
|
159
|
-
onClick: () =>
|
|
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: () =>
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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 =>
|
|
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: () =>
|
|
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 =>
|
|
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) =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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 = (
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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", {
|
|
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',
|
|
@@ -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(
|
|
11
|
+
.flat(Number.POSITIVE_INFINITY)
|
|
12
12
|
: [];
|
|
13
13
|
}
|
|
14
14
|
function treeToMap(tree, map = new Map()) {
|
|
@@ -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):
|
|
37
|
+
setPanelWidth(width: number): number;
|
|
38
38
|
setUseShoppingCart(f: boolean): void;
|
|
39
39
|
setFilterText(str: string): void;
|
|
40
40
|
setShowSparse(f: boolean): void;
|
|
@@ -364,7 +364,7 @@ function stateTreeFactory(pluginManager) {
|
|
|
364
364
|
const { connectionInstances = [] } = (0, util_1.getSession)(self);
|
|
365
365
|
return [
|
|
366
366
|
...this.configAndSessionTrackConfigurations,
|
|
367
|
-
...
|
|
367
|
+
...connectionInstances.flatMap(c => c.tracks),
|
|
368
368
|
];
|
|
369
369
|
},
|
|
370
370
|
/**
|
|
@@ -75,9 +75,15 @@ const AddCustomPluginDialog = (0, mobx_react_1.observer)(function ({ onClose, mo
|
|
|
75
75
|
react_1.default.createElement("form", { onSubmit: handleSubmit },
|
|
76
76
|
react_1.default.createElement(material_1.DialogContent, { className: classes.dialogContent },
|
|
77
77
|
react_1.default.createElement(material_1.DialogContentText, null, "Enter the name of the plugin and its URL. The name should match what is defined in the plugin's build."),
|
|
78
|
-
react_1.default.createElement(material_1.TextField, { label: "Plugin name", variant: "outlined", value: umdPluginName, onChange: event =>
|
|
79
|
-
|
|
80
|
-
|
|
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 =>
|
|
90
|
-
|
|
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: () =>
|
|
11
|
+
return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: () => {
|
|
12
|
+
onClose();
|
|
13
|
+
}, title: `Remove ${plugin}` },
|
|
12
14
|
react_1.default.createElement(material_1.DialogContent, null,
|
|
13
15
|
react_1.default.createElement(material_1.Typography, null,
|
|
14
16
|
"Please confirm that you want to remove ",
|
|
@@ -22,5 +24,7 @@ function DeletePluginDialog({ onClose, plugin, }) {
|
|
|
22
24
|
onClose(plugin);
|
|
23
25
|
}, 500);
|
|
24
26
|
} }, "Confirm"),
|
|
25
|
-
react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () =>
|
|
27
|
+
react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => {
|
|
28
|
+
onClose();
|
|
29
|
+
} }, "Cancel"))));
|
|
26
30
|
}
|
|
@@ -47,13 +47,12 @@ function LockedPlugin() {
|
|
|
47
47
|
react_1.default.createElement(Lock_1.default, null)));
|
|
48
48
|
}
|
|
49
49
|
const InstalledPlugin = (0, mobx_react_1.observer)(function ({ plugin, model, }) {
|
|
50
|
-
var _a;
|
|
51
50
|
const [dialogPlugin, setDialogPlugin] = (0, react_1.useState)();
|
|
52
51
|
const { pluginManager } = (0, util_1.getEnv)(model);
|
|
53
52
|
const session = (0, util_1.getSession)(model);
|
|
54
53
|
const { jbrowse, adminMode } = session;
|
|
55
54
|
const isSessionPlugin = (0, types_1.isSessionWithSessionPlugins)(session)
|
|
56
|
-
? (_a =
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
79
|
-
|
|
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: () =>
|
|
87
|
+
react_1.default.createElement(material_1.IconButton, { onClick: () => {
|
|
88
|
+
model.clearFilterText();
|
|
89
|
+
} },
|
|
82
90
|
react_1.default.createElement(Clear_1.default, null)))),
|
|
83
91
|
} }),
|
|
84
92
|
react_1.default.createElement(material_1.Accordion, { defaultExpanded: true },
|
|
@@ -1 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { AnyConfigurationModel } from '@jbrowse/core/configuration';
|
|
2
|
+
export declare function doConnect(self: {
|
|
3
|
+
configuration: AnyConfigurationModel;
|
|
4
|
+
addTrackConfs: (arg: Record<string, unknown>[]) => void;
|
|
5
|
+
}): Promise<void>;
|
|
@@ -10,7 +10,6 @@ const nanoid_1 = require("@jbrowse/core/util/nanoid");
|
|
|
10
10
|
function resolve(uri, baseUri) {
|
|
11
11
|
return new URL(uri, baseUri).href;
|
|
12
12
|
}
|
|
13
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
13
|
async function doConnect(self) {
|
|
15
14
|
var _a;
|
|
16
15
|
const session = (0, util_1.getSession)(self);
|
|
@@ -56,9 +56,29 @@ export default function UCSCTrackHubConnection(pluginManager: PluginManager): im
|
|
|
56
56
|
connect(_arg: import("@jbrowse/core/configuration").AnyConfigurationModel): void;
|
|
57
57
|
} & {
|
|
58
58
|
afterAttach(): void;
|
|
59
|
-
addTrackConf(trackConf:
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
addTrackConf(trackConf: ({
|
|
60
|
+
[x: string]: any;
|
|
61
|
+
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
62
|
+
setSubschema(slotName: string, data: Record<string, unknown>): Record<string, unknown> | ({
|
|
63
|
+
[x: string]: any;
|
|
64
|
+
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
65
|
+
setSubschema(slotName: string, data: Record<string, unknown>): Record<string, unknown> | ({
|
|
66
|
+
[x: string]: any;
|
|
67
|
+
} & import("mobx-state-tree/dist/internal").NonEmptyObject & any & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>);
|
|
68
|
+
} & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>);
|
|
69
|
+
} & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>) | Record<string, unknown>): any;
|
|
70
|
+
addTrackConfs(trackConfs: (({
|
|
71
|
+
[x: string]: any;
|
|
72
|
+
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
73
|
+
setSubschema(slotName: string, data: Record<string, unknown>): Record<string, unknown> | ({
|
|
74
|
+
[x: string]: any;
|
|
75
|
+
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
76
|
+
setSubschema(slotName: string, data: Record<string, unknown>): Record<string, unknown> | ({
|
|
77
|
+
[x: string]: any;
|
|
78
|
+
} & import("mobx-state-tree/dist/internal").NonEmptyObject & any & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>);
|
|
79
|
+
} & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>);
|
|
80
|
+
} & import("mobx-state-tree").IStateTreeNode<import("@jbrowse/core/configuration").AnyConfigurationSchemaType>) | Record<string, unknown>)[]): void;
|
|
81
|
+
setTrackConfs(trackConfs: import("@jbrowse/core/configuration").AnyConfigurationModel[]): void;
|
|
62
82
|
clear(): void;
|
|
63
83
|
} & {
|
|
64
84
|
/**
|
|
@@ -35,8 +35,8 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
|
|
|
35
35
|
trackId: string;
|
|
36
36
|
assemblyNames: string[];
|
|
37
37
|
type: string;
|
|
38
|
-
name: string;
|
|
39
|
-
description: string;
|
|
38
|
+
name: string | undefined;
|
|
39
|
+
description: string | undefined;
|
|
40
40
|
category: string[];
|
|
41
41
|
adapter: {
|
|
42
42
|
type: string;
|
|
@@ -63,7 +63,7 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
|
|
|
63
63
|
assemblyNames: string[];
|
|
64
64
|
type: string;
|
|
65
65
|
name: string;
|
|
66
|
-
description: string;
|
|
66
|
+
description: string | undefined;
|
|
67
67
|
category: string[];
|
|
68
68
|
adapter: {
|
|
69
69
|
type: string;
|
|
@@ -88,7 +88,7 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
|
|
|
88
88
|
assemblyNames: string[];
|
|
89
89
|
type: string;
|
|
90
90
|
name: string;
|
|
91
|
-
description: string;
|
|
91
|
+
description: string | undefined;
|
|
92
92
|
category: string[];
|
|
93
93
|
adapter: {
|
|
94
94
|
type: string;
|
|
@@ -110,7 +110,7 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
|
|
|
110
110
|
assemblyNames: string[];
|
|
111
111
|
type: string;
|
|
112
112
|
name: string;
|
|
113
|
-
description: string;
|
|
113
|
+
description: string | undefined;
|
|
114
114
|
category: string[];
|
|
115
115
|
adapter: {
|
|
116
116
|
type: string;
|
|
@@ -132,7 +132,7 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
|
|
|
132
132
|
assemblyNames: string[];
|
|
133
133
|
type: string;
|
|
134
134
|
name: string;
|
|
135
|
-
description: string;
|
|
135
|
+
description: string | undefined;
|
|
136
136
|
category: string[];
|
|
137
137
|
adapter: {
|
|
138
138
|
type: string;
|
|
@@ -159,7 +159,7 @@ export declare function generateTracks({ trackDb, trackDbLoc, assemblyName, sequ
|
|
|
159
159
|
assemblyNames: string[];
|
|
160
160
|
type: string;
|
|
161
161
|
name: string;
|
|
162
|
-
description: string;
|
|
162
|
+
description: string | undefined;
|
|
163
163
|
category: string[];
|
|
164
164
|
adapter: {
|
|
165
165
|
type: string;
|