@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.
- package/dist/AddConnectionWidget/components/AddConnectionWidget.d.ts +2 -2
- package/dist/AddConnectionWidget/components/AddConnectionWidget.js +17 -8
- package/dist/AddConnectionWidget/components/ConfigureConnection.d.ts +2 -2
- package/dist/AddConnectionWidget/components/ConfigureConnection.js +2 -1
- package/dist/AddConnectionWidget/components/ConnectionTypeSelect.d.ts +2 -2
- package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +5 -3
- package/dist/AddTrackWidget/components/AddTrackWidget.d.ts +3 -4
- package/dist/AddTrackWidget/components/AddTrackWidget.js +3 -3
- package/dist/AddTrackWidget/components/ConfirmTrack.d.ts +2 -2
- package/dist/AddTrackWidget/components/ConfirmTrack.js +3 -2
- package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +3 -4
- package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js +32 -27
- package/dist/AddTrackWidget/components/PasteConfigWorkflow.d.ts +3 -4
- package/dist/AddTrackWidget/components/PasteConfigWorkflow.js +10 -7
- package/dist/AddTrackWidget/components/TrackAdapterSelector.js +1 -1
- package/dist/AddTrackWidget/components/TrackSourceSelect.d.ts +3 -4
- package/dist/AddTrackWidget/components/TrackSourceSelect.js +3 -3
- package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.d.ts +2 -2
- package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +2 -1
- package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +2 -2
- package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +2 -1
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.d.ts +3 -5
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +2 -1
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.d.ts +3 -4
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js +5 -8
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.d.ts +3 -4
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js +3 -3
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.d.ts +2 -3
- package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +2 -3
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +13 -0
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +79 -0
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +31 -77
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.d.ts +3 -4
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.js +3 -3
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +5 -3
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +10 -4
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.d.ts +2 -2
- package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +50 -29
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.d.ts +2 -2
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +4 -2
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.d.ts +3 -4
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +3 -3
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.d.ts +2 -2
- package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +5 -6
- package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +24 -49
- package/dist/HierarchicalTrackSelectorWidget/components/util.js +1 -2
- package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +16 -13
- package/dist/HierarchicalTrackSelectorWidget/generateHierarchy.js +2 -2
- package/dist/HierarchicalTrackSelectorWidget/model.js +17 -12
- package/dist/PluginStoreWidget/components/AddCustomPluginDialog.d.ts +2 -2
- package/dist/PluginStoreWidget/components/AddCustomPluginDialog.js +2 -1
- package/dist/PluginStoreWidget/components/InstalledPlugin.d.ts +2 -2
- package/dist/PluginStoreWidget/components/InstalledPlugin.js +8 -4
- package/dist/PluginStoreWidget/components/InstalledPluginsList.d.ts +2 -2
- package/dist/PluginStoreWidget/components/InstalledPluginsList.js +2 -1
- package/dist/PluginStoreWidget/components/PluginCard.d.ts +2 -2
- package/dist/PluginStoreWidget/components/PluginCard.js +2 -1
- package/dist/PluginStoreWidget/components/PluginStoreWidget.d.ts +3 -4
- package/dist/PluginStoreWidget/components/PluginStoreWidget.js +3 -3
- package/dist/index.d.ts +1 -9
- package/dist/index.js +1 -4
- package/dist/ucsc-trackhub/model.js +2 -2
- package/esm/AddConnectionWidget/components/AddConnectionWidget.d.ts +2 -2
- package/esm/AddConnectionWidget/components/AddConnectionWidget.js +19 -10
- package/esm/AddConnectionWidget/components/ConfigureConnection.d.ts +2 -2
- package/esm/AddConnectionWidget/components/ConfigureConnection.js +2 -1
- package/esm/AddConnectionWidget/components/ConnectionTypeSelect.d.ts +2 -2
- package/esm/AddConnectionWidget/components/ConnectionTypeSelect.js +5 -3
- package/esm/AddTrackWidget/components/AddTrackWidget.d.ts +3 -4
- package/esm/AddTrackWidget/components/AddTrackWidget.js +3 -3
- package/esm/AddTrackWidget/components/ConfirmTrack.d.ts +2 -2
- package/esm/AddTrackWidget/components/ConfirmTrack.js +4 -3
- package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +3 -4
- package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +33 -28
- package/esm/AddTrackWidget/components/PasteConfigWorkflow.d.ts +3 -4
- package/esm/AddTrackWidget/components/PasteConfigWorkflow.js +11 -8
- package/esm/AddTrackWidget/components/TrackAdapterSelector.js +1 -1
- package/esm/AddTrackWidget/components/TrackSourceSelect.d.ts +3 -4
- package/esm/AddTrackWidget/components/TrackSourceSelect.js +3 -3
- package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.d.ts +2 -2
- package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +2 -1
- package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +2 -2
- package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +2 -1
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.d.ts +3 -5
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +2 -1
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.d.ts +3 -4
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js +6 -9
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.d.ts +3 -4
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js +3 -3
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.d.ts +2 -3
- package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +3 -2
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.d.ts +13 -0
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.js +50 -0
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +31 -54
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.d.ts +3 -4
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.js +3 -3
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +5 -3
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +10 -4
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.d.ts +2 -2
- package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +50 -29
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.d.ts +2 -2
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +4 -2
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.d.ts +3 -4
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +3 -3
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.d.ts +2 -2
- package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +5 -6
- package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +24 -26
- package/esm/HierarchicalTrackSelectorWidget/components/util.js +1 -2
- package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.d.ts +16 -13
- package/esm/HierarchicalTrackSelectorWidget/generateHierarchy.js +2 -2
- package/esm/HierarchicalTrackSelectorWidget/model.js +17 -12
- package/esm/PluginStoreWidget/components/AddCustomPluginDialog.d.ts +2 -2
- package/esm/PluginStoreWidget/components/AddCustomPluginDialog.js +2 -1
- package/esm/PluginStoreWidget/components/InstalledPlugin.d.ts +2 -2
- package/esm/PluginStoreWidget/components/InstalledPlugin.js +8 -4
- package/esm/PluginStoreWidget/components/InstalledPluginsList.d.ts +2 -2
- package/esm/PluginStoreWidget/components/InstalledPluginsList.js +2 -1
- package/esm/PluginStoreWidget/components/PluginCard.d.ts +2 -2
- package/esm/PluginStoreWidget/components/PluginCard.js +2 -1
- package/esm/PluginStoreWidget/components/PluginStoreWidget.d.ts +3 -4
- package/esm/PluginStoreWidget/components/PluginStoreWidget.js +3 -3
- package/esm/index.d.ts +1 -9
- package/esm/index.js +1 -3
- package/esm/ucsc-trackhub/model.js +2 -2
- package/package.json +5 -4
- package/dist/SetDefaultSession/SetDefaultSession.d.ts +0 -6
- package/dist/SetDefaultSession/SetDefaultSession.js +0 -38
- package/dist/SetDefaultSession/index.d.ts +0 -1
- package/dist/SetDefaultSession/index.js +0 -8
- package/esm/SetDefaultSession/SetDefaultSession.d.ts +0 -6
- package/esm/SetDefaultSession/SetDefaultSession.js +0 -33
- package/esm/SetDefaultSession/index.d.ts +0 -1
- package/esm/SetDefaultSession/index.js +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const react_1 = __importStar(require("react"));
|
|
30
|
+
const material_1 = require("@mui/material");
|
|
31
|
+
const mui_1 = require("tss-react/mui");
|
|
32
|
+
// icon
|
|
33
|
+
const Clear_1 = __importDefault(require("@mui/icons-material/Clear"));
|
|
34
|
+
const Minimize_1 = __importDefault(require("@mui/icons-material/Minimize"));
|
|
35
|
+
const Add_1 = __importDefault(require("@mui/icons-material/Add"));
|
|
36
|
+
const util_1 = require("@jbrowse/core/util");
|
|
37
|
+
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
38
|
+
facet: {
|
|
39
|
+
margin: 0,
|
|
40
|
+
marginLeft: theme.spacing(2),
|
|
41
|
+
},
|
|
42
|
+
select: {
|
|
43
|
+
marginBottom: theme.spacing(2),
|
|
44
|
+
},
|
|
45
|
+
}));
|
|
46
|
+
function ClearButton({ onClick }) {
|
|
47
|
+
return (react_1.default.createElement(material_1.Tooltip, { title: "Clear selection on this facet filter" },
|
|
48
|
+
react_1.default.createElement(material_1.IconButton, { onClick: () => onClick(), size: "small" },
|
|
49
|
+
react_1.default.createElement(Clear_1.default, null))));
|
|
50
|
+
}
|
|
51
|
+
function ExpandButton({ visible, onClick, }) {
|
|
52
|
+
return (react_1.default.createElement(material_1.Tooltip, { title: "Minimize/expand this facet filter" },
|
|
53
|
+
react_1.default.createElement(material_1.IconButton, { onClick: () => onClick(), size: "small" }, visible ? react_1.default.createElement(Minimize_1.default, null) : react_1.default.createElement(Add_1.default, null))));
|
|
54
|
+
}
|
|
55
|
+
function FacetFilter({ column, vals, width, dispatch, filters, }) {
|
|
56
|
+
const { classes } = useStyles();
|
|
57
|
+
const [visible, setVisible] = (0, react_1.useState)(true);
|
|
58
|
+
return (react_1.default.createElement(material_1.FormControl, { key: column.field, className: classes.facet, style: { width } },
|
|
59
|
+
react_1.default.createElement("div", { style: { display: 'flex' } },
|
|
60
|
+
react_1.default.createElement(material_1.Typography, null, column.field),
|
|
61
|
+
react_1.default.createElement(ClearButton, { onClick: () => dispatch({ key: column.field, val: [] }) }),
|
|
62
|
+
react_1.default.createElement(ExpandButton, { visible: visible, onClick: () => setVisible(!visible) })),
|
|
63
|
+
visible ? (react_1.default.createElement(material_1.Select, { multiple: true, native: true, className: classes.select, value: filters[column.field], onChange: event => {
|
|
64
|
+
dispatch({
|
|
65
|
+
key: column.field,
|
|
66
|
+
// @ts-expect-error
|
|
67
|
+
val: [...event.target.options]
|
|
68
|
+
.filter(opt => opt.selected)
|
|
69
|
+
.map(opt => opt.value),
|
|
70
|
+
});
|
|
71
|
+
} }, vals
|
|
72
|
+
.sort((a, b) => a[0].localeCompare(b[0]))
|
|
73
|
+
.map(([name, count]) => (react_1.default.createElement("option", { key: name, value: name },
|
|
74
|
+
(0, util_1.coarseStripHTML)(name),
|
|
75
|
+
" (",
|
|
76
|
+
count,
|
|
77
|
+
")"))))) : null));
|
|
78
|
+
}
|
|
79
|
+
exports.default = FacetFilter;
|
|
@@ -1,86 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
4
|
};
|
|
28
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
const react_1 =
|
|
30
|
-
const
|
|
31
|
-
const mui_1 = require("tss-react/mui");
|
|
32
|
-
// icon
|
|
33
|
-
const Clear_1 = __importDefault(require("@mui/icons-material/Clear"));
|
|
34
|
-
const Minimize_1 = __importDefault(require("@mui/icons-material/Minimize"));
|
|
35
|
-
const Add_1 = __importDefault(require("@mui/icons-material/Add"));
|
|
36
|
-
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
37
|
-
facet: {
|
|
38
|
-
margin: 0,
|
|
39
|
-
marginLeft: theme.spacing(2),
|
|
40
|
-
},
|
|
41
|
-
select: {
|
|
42
|
-
marginBottom: theme.spacing(2),
|
|
43
|
-
},
|
|
44
|
-
}));
|
|
45
|
-
function FacetFilter({ column, vals, width, dispatch, filters, }) {
|
|
46
|
-
const { classes } = useStyles();
|
|
47
|
-
const [visible, setVisible] = (0, react_1.useState)(true);
|
|
48
|
-
return (react_1.default.createElement(material_1.FormControl, { key: column.field, className: classes.facet, style: { width } },
|
|
49
|
-
react_1.default.createElement("div", { style: { display: 'flex' } },
|
|
50
|
-
react_1.default.createElement(material_1.Typography, null, column.field),
|
|
51
|
-
react_1.default.createElement(material_1.Tooltip, { title: "Clear selection on this facet filter" },
|
|
52
|
-
react_1.default.createElement(material_1.IconButton, { onClick: () => {
|
|
53
|
-
dispatch({ key: column.field, val: [] });
|
|
54
|
-
}, size: "small" },
|
|
55
|
-
react_1.default.createElement(Clear_1.default, null))),
|
|
56
|
-
react_1.default.createElement(material_1.Tooltip, { title: "Minimize/expand this facet filter" },
|
|
57
|
-
react_1.default.createElement(material_1.IconButton, { onClick: () => setVisible(!visible), size: "small" }, visible ? react_1.default.createElement(Minimize_1.default, null) : react_1.default.createElement(Add_1.default, null)))),
|
|
58
|
-
visible ? (react_1.default.createElement(material_1.Select, { multiple: true, native: true, className: classes.select, value: filters[column.field], onChange: event => {
|
|
59
|
-
// @ts-expect-error
|
|
60
|
-
const { options } = event.target;
|
|
61
|
-
const val = [];
|
|
62
|
-
const len = options.length;
|
|
63
|
-
for (let i = 0; i < len; i++) {
|
|
64
|
-
if (options[i].selected) {
|
|
65
|
-
val.push(options[i].value);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
dispatch({ key: column.field, val });
|
|
69
|
-
} }, vals
|
|
70
|
-
.sort((a, b) => a[0].localeCompare(b[0]))
|
|
71
|
-
.map(([name, count]) => (react_1.default.createElement("option", { key: name, value: name },
|
|
72
|
-
name,
|
|
73
|
-
" (",
|
|
74
|
-
count,
|
|
75
|
-
")"))))) : null));
|
|
76
|
-
}
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const FacetFilter_1 = __importDefault(require("./FacetFilter"));
|
|
77
8
|
function FacetFilters({ rows, columns, dispatch, filters, width, }) {
|
|
9
|
+
var _a, _b;
|
|
78
10
|
const facets = columns.slice(1);
|
|
79
|
-
const uniqs = facets.map(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
11
|
+
const uniqs = new Map(facets.map(f => [f.field, new Map()]));
|
|
12
|
+
// this code "stages the facet filters" in order that the user has selected
|
|
13
|
+
// them, which relies on the js behavior that the order of the returned keys is
|
|
14
|
+
// related to the insertion order.
|
|
15
|
+
const filterKeys = Object.keys(filters);
|
|
16
|
+
const facetKeys = facets.map(f => f.field);
|
|
17
|
+
const ret = new Set();
|
|
18
|
+
for (const entry of filterKeys) {
|
|
19
|
+
// give non-empty filters priority
|
|
20
|
+
if ((_a = filters[entry]) === null || _a === void 0 ? void 0 : _a.length) {
|
|
21
|
+
ret.add(entry);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
for (const entry of facetKeys) {
|
|
25
|
+
ret.add(entry);
|
|
26
|
+
}
|
|
27
|
+
let currentRows = rows;
|
|
28
|
+
for (const facet of ret) {
|
|
29
|
+
const elt = uniqs.get(facet);
|
|
30
|
+
for (const row of currentRows) {
|
|
31
|
+
const key = `${row[facet] || ''}`;
|
|
84
32
|
const val = elt.get(key);
|
|
85
33
|
// we don't allow filtering on empty yet
|
|
86
34
|
if (key) {
|
|
@@ -92,7 +40,13 @@ function FacetFilters({ rows, columns, dispatch, filters, width, }) {
|
|
|
92
40
|
}
|
|
93
41
|
}
|
|
94
42
|
}
|
|
43
|
+
const filter = ((_b = filters[facet]) === null || _b === void 0 ? void 0 : _b.length) ? new Set(filters[facet]) : undefined;
|
|
44
|
+
currentRows = currentRows.filter(row => {
|
|
45
|
+
return filter !== undefined ? filter.has(row[facet]) : true;
|
|
46
|
+
});
|
|
95
47
|
}
|
|
96
|
-
return (react_1.default.createElement("div", null, facets.map(
|
|
48
|
+
return (react_1.default.createElement("div", null, facets.map(column => {
|
|
49
|
+
return (react_1.default.createElement(FacetFilter_1.default, { key: column.field, vals: [...uniqs.get(column.field)], column: column, width: width, dispatch: dispatch, filters: filters }));
|
|
50
|
+
})));
|
|
97
51
|
}
|
|
98
52
|
exports.default = FacetFilters;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { HierarchicalTrackSelectorModel } from '../../model';
|
|
3
|
-
declare
|
|
3
|
+
declare const FacetedTrackSelectorDialog: (props: {
|
|
4
4
|
handleClose: () => void;
|
|
5
5
|
model: HierarchicalTrackSelectorModel;
|
|
6
|
-
})
|
|
7
|
-
|
|
8
|
-
export default _default;
|
|
6
|
+
}) => React.JSX.Element;
|
|
7
|
+
export default FacetedTrackSelectorDialog;
|
|
@@ -8,10 +8,10 @@ const material_1 = require("@mui/material");
|
|
|
8
8
|
const ui_1 = require("@jbrowse/core/ui");
|
|
9
9
|
const mobx_react_1 = require("mobx-react");
|
|
10
10
|
const FacetedSelector_1 = __importDefault(require("./FacetedSelector"));
|
|
11
|
-
function
|
|
11
|
+
const FacetedTrackSelectorDialog = (0, mobx_react_1.observer)(function (props) {
|
|
12
12
|
const { handleClose } = props;
|
|
13
13
|
return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, maxWidth: "xl", title: "Faceted track selector" },
|
|
14
14
|
react_1.default.createElement(material_1.DialogContent, null,
|
|
15
15
|
react_1.default.createElement(FacetedSelector_1.default, { ...props }))));
|
|
16
|
-
}
|
|
17
|
-
exports.default =
|
|
16
|
+
});
|
|
17
|
+
exports.default = FacetedTrackSelectorDialog;
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { HierarchicalTrackSelectorModel } from '../../model';
|
|
3
|
-
export default function FacetedHeader({ setFilterText, setUseShoppingCart,
|
|
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
|
-
|
|
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
|
-
|
|
12
|
+
showSparse: boolean;
|
|
13
|
+
showFilters: boolean;
|
|
12
14
|
model: HierarchicalTrackSelectorModel;
|
|
13
15
|
}): React.JSX.Element;
|
|
@@ -34,7 +34,7 @@ const Clear_1 = __importDefault(require("@mui/icons-material/Clear"));
|
|
|
34
34
|
const MoreVert_1 = __importDefault(require("@mui/icons-material/MoreVert"));
|
|
35
35
|
// locals
|
|
36
36
|
const ShoppingCart_1 = __importDefault(require("../ShoppingCart"));
|
|
37
|
-
function FacetedHeader({ setFilterText, setUseShoppingCart,
|
|
37
|
+
function FacetedHeader({ setFilterText, setUseShoppingCart, setShowSparse, setShowFilters, setShowOptions, showOptions, showSparse, showFilters, useShoppingCart, filterText, model, }) {
|
|
38
38
|
const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
|
|
39
39
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
40
40
|
react_1.default.createElement(material_1.Grid, { container: true, spacing: 4, alignItems: "center" },
|
|
@@ -60,9 +60,15 @@ function FacetedHeader({ setFilterText, setUseShoppingCart, setHideSparse, setSh
|
|
|
60
60
|
checked: useShoppingCart,
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
|
-
label: '
|
|
64
|
-
onClick: () =>
|
|
65
|
-
checked:
|
|
63
|
+
label: 'Show sparse metadata columns',
|
|
64
|
+
onClick: () => setShowSparse(!showSparse),
|
|
65
|
+
checked: showSparse,
|
|
66
|
+
type: 'checkbox',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
label: 'Show facet filters',
|
|
70
|
+
onClick: () => setShowFilters(!showFilters),
|
|
71
|
+
checked: showFilters,
|
|
66
72
|
type: 'checkbox',
|
|
67
73
|
},
|
|
68
74
|
{
|
|
@@ -6,7 +6,7 @@ export interface InfoArgs {
|
|
|
6
6
|
id: string;
|
|
7
7
|
conf: AnyConfigurationModel;
|
|
8
8
|
}
|
|
9
|
-
declare const
|
|
9
|
+
declare const FacetedSelector: ({ model, }: {
|
|
10
10
|
model: HierarchicalTrackSelectorModel;
|
|
11
11
|
}) => React.JSX.Element;
|
|
12
|
-
export default
|
|
12
|
+
export default FacetedSelector;
|
|
@@ -37,9 +37,11 @@ const tracks_1 = require("@jbrowse/core/util/tracks");
|
|
|
37
37
|
const ui_1 = require("@jbrowse/core/ui");
|
|
38
38
|
const SanitizedHTML_1 = __importDefault(require("@jbrowse/core/ui/SanitizedHTML"));
|
|
39
39
|
const Menu_1 = __importDefault(require("@jbrowse/core/ui/Menu"));
|
|
40
|
-
const ResizeBar_1 =
|
|
40
|
+
const ResizeBar_1 = __importDefault(require("@jbrowse/core/ui/ResizeBar"));
|
|
41
41
|
const util_1 = require("@jbrowse/core/util");
|
|
42
42
|
const configuration_1 = require("@jbrowse/core/configuration");
|
|
43
|
+
const useResizeBar_1 = require("@jbrowse/core/ui/useResizeBar");
|
|
44
|
+
const mui_1 = require("tss-react/mui");
|
|
43
45
|
// icons
|
|
44
46
|
const MoreHoriz_1 = __importDefault(require("@mui/icons-material/MoreHoriz"));
|
|
45
47
|
const util_2 = require("../../util");
|
|
@@ -47,24 +49,31 @@ const FacetedHeader_1 = __importDefault(require("./FacetedHeader"));
|
|
|
47
49
|
const FacetFilters_1 = __importDefault(require("./FacetFilters"));
|
|
48
50
|
const util_3 = require("./util");
|
|
49
51
|
const nonMetadataKeys = ['category', 'adapter', 'description'];
|
|
52
|
+
const useStyles = (0, mui_1.makeStyles)()({
|
|
53
|
+
cell: {
|
|
54
|
+
whiteSpace: 'nowrap',
|
|
55
|
+
overflow: 'hidden',
|
|
56
|
+
textOverflow: 'ellipsis',
|
|
57
|
+
},
|
|
58
|
+
});
|
|
50
59
|
const frac = 0.75;
|
|
51
|
-
|
|
60
|
+
const FacetedSelector = (0, mobx_react_1.observer)(function FacetedSelector({ model, }) {
|
|
52
61
|
var _a, _b;
|
|
62
|
+
const { classes } = useStyles();
|
|
53
63
|
const { view, selection } = model;
|
|
54
64
|
const { pluginManager } = (0, util_1.getEnv)(model);
|
|
55
|
-
const { ref, scrollLeft } = (0,
|
|
65
|
+
const { ref, scrollLeft } = (0, useResizeBar_1.useResizeBar)();
|
|
56
66
|
const [filterText, setFilterText] = (0, react_1.useState)('');
|
|
57
|
-
const [showOptions, setShowOptions] = (0,
|
|
67
|
+
const [showOptions, setShowOptions] = (0, util_1.useLocalStorage)('facet-showTableOptions', false);
|
|
58
68
|
const [info, setInfo] = (0, react_1.useState)();
|
|
59
69
|
const [useShoppingCart, setUseShoppingCart] = (0, react_1.useState)(false);
|
|
60
|
-
const [
|
|
61
|
-
const [
|
|
70
|
+
const [showSparse, setShowSparse] = (0, util_1.useLocalStorage)('facet-showSparse', false);
|
|
71
|
+
const [showFilters, setShowFilters] = (0, util_1.useLocalStorage)('facet-showFilters', true);
|
|
72
|
+
const [panelWidth, setPanelWidth] = (0, util_1.useLocalStorage)('facet-panelWidth', 400);
|
|
62
73
|
const session = (0, util_1.getSession)(model);
|
|
63
74
|
const filterDebounced = (0, util_1.useDebounce)(filterText, 400);
|
|
64
75
|
const tracks = view.tracks;
|
|
65
|
-
const [filters, dispatch] = (0, react_1.useReducer)((state, update) => {
|
|
66
|
-
return { ...state, [update.key]: update.val };
|
|
67
|
-
}, {});
|
|
76
|
+
const [filters, dispatch] = (0, react_1.useReducer)((state, update) => ({ ...state, [update.key]: update.val }), {});
|
|
68
77
|
const rows = (0, react_1.useMemo)(() => {
|
|
69
78
|
// metadata is spread onto the object for easier access and sorting
|
|
70
79
|
// by the mui data grid (it's unable to sort by nested objects)
|
|
@@ -85,10 +94,10 @@ exports.default = (0, mobx_react_1.observer)(function FacetedSelector({ model, }
|
|
|
85
94
|
};
|
|
86
95
|
});
|
|
87
96
|
}, [model, filterDebounced, session]);
|
|
88
|
-
const filteredNonMetadataKeys = (0, react_1.useMemo)(() => nonMetadataKeys.filter(f =>
|
|
89
|
-
const filteredMetadataKeys = (0, react_1.useMemo)(() => [...new Set(rows.flatMap(row => (0, util_3.getRootKeys)(row.metadata)))].filter(f =>
|
|
97
|
+
const filteredNonMetadataKeys = (0, react_1.useMemo)(() => nonMetadataKeys.filter(f => showSparse ? true : rows.map(r => r[f]).filter(f => !!f).length > 5), [showSparse, rows]);
|
|
98
|
+
const filteredMetadataKeys = (0, react_1.useMemo)(() => [...new Set(rows.flatMap(row => (0, util_3.getRootKeys)(row.metadata)))].filter(f => showSparse
|
|
90
99
|
? true
|
|
91
|
-
: rows.map(r => r.metadata[f]).filter(f => !!f).length > 5), [
|
|
100
|
+
: rows.map(r => r.metadata[f]).filter(f => !!f).length > 5), [showSparse, rows]);
|
|
92
101
|
const fields = (0, react_1.useMemo)(() => ['name', ...filteredNonMetadataKeys, ...filteredMetadataKeys], [filteredNonMetadataKeys, filteredMetadataKeys]);
|
|
93
102
|
const [widths, setWidths] = (0, react_1.useState)({
|
|
94
103
|
name: (0, util_1.measureGridWidth)(rows.map(r => r.name), { maxWidth: 500, stripHTML: true }) + 15,
|
|
@@ -124,15 +133,15 @@ exports.default = (0, mobx_react_1.observer)(function FacetedSelector({ model, }
|
|
|
124
133
|
(0, util_1.measureGridWidth)(rows.map(r => r.metadata[e]), { stripHTML: true, maxWidth: 400 }),
|
|
125
134
|
])),
|
|
126
135
|
}));
|
|
127
|
-
}, [filteredMetadataKeys, visible, filteredNonMetadataKeys,
|
|
128
|
-
const widthsDebounced = (0, util_1.useDebounce)(widths,
|
|
136
|
+
}, [filteredMetadataKeys, visible, filteredNonMetadataKeys, showSparse, rows]);
|
|
137
|
+
const widthsDebounced = (0, util_1.useDebounce)(widths, 200);
|
|
129
138
|
const columns = [
|
|
130
139
|
{
|
|
131
140
|
field: 'name',
|
|
132
141
|
hideable: false,
|
|
133
142
|
renderCell: (params) => {
|
|
134
143
|
const { value, id, row } = params;
|
|
135
|
-
return (react_1.default.createElement(
|
|
144
|
+
return (react_1.default.createElement("div", { className: classes.cell },
|
|
136
145
|
react_1.default.createElement(SanitizedHTML_1.default, { html: value }),
|
|
137
146
|
react_1.default.createElement(material_1.IconButton, { onClick: e => setInfo({
|
|
138
147
|
target: e.currentTarget,
|
|
@@ -150,7 +159,7 @@ exports.default = (0, mobx_react_1.observer)(function FacetedSelector({ model, }
|
|
|
150
159
|
width: (_a = widthsDebounced[e]) !== null && _a !== void 0 ? _a : 100,
|
|
151
160
|
renderCell: (params) => {
|
|
152
161
|
const { value } = params;
|
|
153
|
-
return value ? react_1.default.createElement(SanitizedHTML_1.default, { html: value }) : '';
|
|
162
|
+
return (react_1.default.createElement("div", { className: classes.cell }, value ? react_1.default.createElement(SanitizedHTML_1.default, { html: value }) : ''));
|
|
154
163
|
},
|
|
155
164
|
});
|
|
156
165
|
}),
|
|
@@ -161,19 +170,22 @@ exports.default = (0, mobx_react_1.observer)(function FacetedSelector({ model, }
|
|
|
161
170
|
width: (_a = widthsDebounced[e]) !== null && _a !== void 0 ? _a : 100,
|
|
162
171
|
renderCell: (params) => {
|
|
163
172
|
const { value } = params;
|
|
164
|
-
return value ? react_1.default.createElement(SanitizedHTML_1.default, { html: value }) : '';
|
|
173
|
+
return (react_1.default.createElement("div", { className: classes.cell }, value ? react_1.default.createElement(SanitizedHTML_1.default, { html: value }) : ''));
|
|
165
174
|
},
|
|
166
175
|
});
|
|
167
176
|
}),
|
|
168
177
|
];
|
|
169
|
-
const shownTrackIds = tracks.map(t => t.configuration.trackId);
|
|
170
|
-
const arrFilters = Object.entries(filters)
|
|
178
|
+
const shownTrackIds = new Set(tracks.map(t => t.configuration.trackId));
|
|
179
|
+
const arrFilters = Object.entries(filters)
|
|
180
|
+
.filter(f => f[1].length > 0)
|
|
181
|
+
.map(([key, val]) => [key, new Set(val)]);
|
|
182
|
+
const filteredRows = rows.filter(row => arrFilters.every(([key, val]) => val.has(row[key])));
|
|
171
183
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
172
184
|
info ? (react_1.default.createElement(Menu_1.default, { 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) => {
|
|
173
185
|
callback();
|
|
174
186
|
setInfo(undefined);
|
|
175
187
|
}, open: !!info, onClose: () => setInfo(undefined) })) : null,
|
|
176
|
-
react_1.default.createElement(FacetedHeader_1.default, {
|
|
188
|
+
react_1.default.createElement(FacetedHeader_1.default, { setShowSparse: setShowSparse, setShowFilters: setShowFilters, setShowOptions: setShowOptions, setFilterText: setFilterText, setUseShoppingCart: setUseShoppingCart, showFilters: showFilters, showSparse: showSparse, showOptions: showOptions, filterText: filterText, useShoppingCart: useShoppingCart, model: model }),
|
|
177
189
|
react_1.default.createElement("div", { ref: ref, style: {
|
|
178
190
|
display: 'flex',
|
|
179
191
|
overflow: 'hidden',
|
|
@@ -182,21 +194,22 @@ exports.default = (0, mobx_react_1.observer)(function FacetedSelector({ model, }
|
|
|
182
194
|
} },
|
|
183
195
|
react_1.default.createElement("div", { style: {
|
|
184
196
|
height: window.innerHeight * frac,
|
|
185
|
-
width: window.innerWidth * frac - panelWidth,
|
|
197
|
+
width: window.innerWidth * frac - (showFilters ? panelWidth : 0),
|
|
186
198
|
} },
|
|
187
199
|
react_1.default.createElement(ResizeBar_1.default, { 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) => [
|
|
188
200
|
entry[0],
|
|
189
201
|
newWidths[idx],
|
|
190
202
|
]))), scrollLeft: scrollLeft }),
|
|
191
|
-
react_1.default.createElement(x_data_grid_1.DataGrid, { rows:
|
|
203
|
+
react_1.default.createElement(x_data_grid_1.DataGrid, { rows: filteredRows, columnVisibilityModel: visible, onColumnVisibilityModelChange: newModel => setVisible(newModel), columnHeaderHeight: 35, checkboxSelection: true, disableRowSelectionOnClick: true, keepNonExistentRowsSelected: true, onRowSelectionModelChange: userSelectedIds => {
|
|
192
204
|
if (!useShoppingCart) {
|
|
193
205
|
const a1 = shownTrackIds;
|
|
194
|
-
const a2 = userSelectedIds;
|
|
206
|
+
const a2 = new Set(userSelectedIds);
|
|
195
207
|
// synchronize the user selection with the view
|
|
196
208
|
// see share https://stackoverflow.com/a/33034768/2129219
|
|
197
209
|
(0, mobx_1.transaction)(() => {
|
|
198
|
-
|
|
199
|
-
|
|
210
|
+
;
|
|
211
|
+
[...a1].filter(x => !a2.has(x)).map(t => view.hideTrack(t));
|
|
212
|
+
[...a2].filter(x => !a1.has(x)).map(t => view.showTrack(t));
|
|
200
213
|
});
|
|
201
214
|
}
|
|
202
215
|
else {
|
|
@@ -205,10 +218,18 @@ exports.default = (0, mobx_react_1.observer)(function FacetedSelector({ model, }
|
|
|
205
218
|
const tracks = userSelectedIds.map(id => (0, mobx_state_tree_1.resolveIdentifier)(schema, root, id));
|
|
206
219
|
model.setSelection(tracks);
|
|
207
220
|
}
|
|
208
|
-
}, rowSelectionModel: useShoppingCart
|
|
221
|
+
}, rowSelectionModel: useShoppingCart
|
|
222
|
+
? selection.map(s => s.trackId)
|
|
223
|
+
: [...shownTrackIds], slots: { toolbar: showOptions ? x_data_grid_1.GridToolbar : null }, slotProps: {
|
|
209
224
|
toolbar: { printOptions: { disableToolbarButton: true } },
|
|
210
225
|
}, columns: columns, rowHeight: 25 })),
|
|
211
|
-
react_1.default.createElement(
|
|
212
|
-
|
|
213
|
-
react_1.default.createElement(
|
|
226
|
+
showFilters ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
227
|
+
react_1.default.createElement(ui_1.ResizeHandle, { vertical: true, onDrag: dist => setPanelWidth(panelWidth - dist), style: { marginLeft: 5, background: 'grey', width: 5 } }),
|
|
228
|
+
react_1.default.createElement("div", { style: {
|
|
229
|
+
width: panelWidth,
|
|
230
|
+
overflowY: 'auto',
|
|
231
|
+
overflowX: 'hidden',
|
|
232
|
+
} },
|
|
233
|
+
react_1.default.createElement(FacetFilters_1.default, { width: panelWidth - 10, rows: rows, columns: columns, dispatch: dispatch, filters: filters })))) : null)));
|
|
214
234
|
});
|
|
235
|
+
exports.default = FacetedSelector;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { HierarchicalTrackSelectorModel } from '../../model';
|
|
3
|
-
declare const
|
|
3
|
+
declare const HamburgerMenu: ({ model, }: {
|
|
4
4
|
model: HierarchicalTrackSelectorModel;
|
|
5
5
|
}) => React.JSX.Element;
|
|
6
|
-
export default
|
|
6
|
+
export default HamburgerMenu;
|
|
@@ -38,15 +38,16 @@ const CloseConnectionDlg = (0, react_1.lazy)(() => Promise.resolve().then(() =>
|
|
|
38
38
|
const DeleteConnectionDlg = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('../dialogs/DeleteConnectionDialog'))));
|
|
39
39
|
const ManageConnectionsDlg = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('../dialogs/ManageConnectionsDialog'))));
|
|
40
40
|
const ToggleConnectionsDlg = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('../dialogs/ToggleConnectionsDialog'))));
|
|
41
|
-
|
|
41
|
+
const HamburgerMenu = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
42
42
|
const session = (0, util_1.getSession)(model);
|
|
43
43
|
const [modalInfo, setModalInfo] = (0, react_1.useState)();
|
|
44
44
|
const [deleteDlgDetails, setDeleteDlgDetails] = (0, react_1.useState)();
|
|
45
45
|
const [connectionToggleOpen, setConnectionToggleOpen] = (0, react_1.useState)(false);
|
|
46
46
|
const [connectionManagerOpen, setConnectionManagerOpen] = (0, react_1.useState)(false);
|
|
47
47
|
function breakConnection(connectionConf, deletingConnection) {
|
|
48
|
+
var _a;
|
|
48
49
|
const name = (0, configuration_1.readConfObject)(connectionConf, 'name');
|
|
49
|
-
const result = session.prepareToBreakConnection(connectionConf);
|
|
50
|
+
const result = (_a = session.prepareToBreakConnection) === null || _a === void 0 ? void 0 : _a.call(session, connectionConf);
|
|
50
51
|
if (result) {
|
|
51
52
|
const [safelyBreakConnection, dereferenceTypeCount] = result;
|
|
52
53
|
if (Object.keys(dereferenceTypeCount).length > 0) {
|
|
@@ -143,3 +144,4 @@ exports.default = (0, mobx_react_1.observer)(function HamburgerMenu({ model, })
|
|
|
143
144
|
connectionManagerOpen ? (react_1.default.createElement(ManageConnectionsDlg, { handleClose: () => setConnectionManagerOpen(false), breakConnection: breakConnection, session: session })) : null,
|
|
144
145
|
connectionToggleOpen ? (react_1.default.createElement(ToggleConnectionsDlg, { handleClose: () => setConnectionToggleOpen(false), session: session, breakConnection: breakConnection })) : null)));
|
|
145
146
|
});
|
|
147
|
+
exports.default = HamburgerMenu;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { HierarchicalTrackSelectorModel } from '../../model';
|
|
3
|
-
declare
|
|
3
|
+
declare const HierarchicalTrackSelectorHeader: ({ model, setHeaderHeight, }: {
|
|
4
4
|
model: HierarchicalTrackSelectorModel;
|
|
5
5
|
setHeaderHeight: (n: number) => void;
|
|
6
|
-
})
|
|
7
|
-
|
|
8
|
-
export default _default;
|
|
6
|
+
}) => React.JSX.Element;
|
|
7
|
+
export default HierarchicalTrackSelectorHeader;
|
|
@@ -54,7 +54,7 @@ const SearchTracksTextField = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
|
54
54
|
react_1.default.createElement(Clear_1.default, null)))),
|
|
55
55
|
} }));
|
|
56
56
|
});
|
|
57
|
-
|
|
57
|
+
const HierarchicalTrackSelectorHeader = (0, mobx_react_1.observer)(function ({ model, setHeaderHeight, }) {
|
|
58
58
|
const { classes } = useStyles();
|
|
59
59
|
const [facetedOpen, setFacetedOpen] = (0, react_1.useState)(false);
|
|
60
60
|
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" },
|
|
@@ -64,5 +64,5 @@ function HierarchicalTrackSelectorHeader({ model, setHeaderHeight, }) {
|
|
|
64
64
|
react_1.default.createElement(SearchTracksTextField, { model: model }),
|
|
65
65
|
react_1.default.createElement(material_1.Button, { className: classes.menuIcon, onClick: () => setFacetedOpen(true) }, "Open faceted selector")),
|
|
66
66
|
react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement("div", null) }, facetedOpen ? (react_1.default.createElement(FacetedDialog, { handleClose: () => setFacetedOpen(false), model: model })) : null)));
|
|
67
|
-
}
|
|
68
|
-
exports.default =
|
|
67
|
+
});
|
|
68
|
+
exports.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
|
|
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
|
|
9
|
+
export default HierarchicalTree;
|
|
@@ -51,7 +51,7 @@ function getNodeData(node, nestingLevel, extra, selection) {
|
|
|
51
51
|
// this is the main tree component for the hierarchical track selector in note:
|
|
52
52
|
// in jbrowse-web the toolbar is position="sticky" which means the autosizer
|
|
53
53
|
// includes the height of the toolbar, so we subtract the given offsets
|
|
54
|
-
|
|
54
|
+
const HierarchicalTree = (0, mobx_react_1.observer)(function HierarchicalTree({ height, tree, model, }) {
|
|
55
55
|
const { filterText, selection, view } = model;
|
|
56
56
|
const treeRef = (0, react_1.useRef)(null);
|
|
57
57
|
const session = (0, util_1.getSession)(model);
|
|
@@ -65,15 +65,13 @@ exports.default = (0, mobx_react_1.observer)(function HierarchicalTree({ height,
|
|
|
65
65
|
drawerPosition,
|
|
66
66
|
}), [view, model, drawerPosition, tree]);
|
|
67
67
|
const treeWalker = (0, react_1.useCallback)(function* treeWalker() {
|
|
68
|
-
for (
|
|
69
|
-
|
|
70
|
-
yield getNodeData(r, 0, extra, obj);
|
|
68
|
+
for (const child of tree.children) {
|
|
69
|
+
yield getNodeData(child, 0, extra, obj);
|
|
71
70
|
}
|
|
72
71
|
while (true) {
|
|
73
72
|
// @ts-expect-error
|
|
74
73
|
const parentMeta = yield;
|
|
75
|
-
for (
|
|
76
|
-
const curr = parentMeta.node.children[i];
|
|
74
|
+
for (const curr of parentMeta.node.children) {
|
|
77
75
|
yield getNodeData(curr, parentMeta.nestingLevel + 1, extra, obj);
|
|
78
76
|
}
|
|
79
77
|
}
|
|
@@ -88,3 +86,4 @@ exports.default = (0, mobx_react_1.observer)(function HierarchicalTree({ height,
|
|
|
88
86
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
89
87
|
react_1.default.createElement(react_vtree_1.VariableSizeTree, { ref: treeRef, treeWalker: treeWalker, height: height }, TrackListNode_1.default)));
|
|
90
88
|
});
|
|
89
|
+
exports.default = HierarchicalTree;
|