@jbrowse/core 2.4.2 → 2.5.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/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +16 -0
- package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +46 -0
- package/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +15 -0
- package/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +69 -0
- package/BaseFeatureWidget/BaseFeatureDetail/BasicField.d.ts +17 -0
- package/BaseFeatureWidget/BaseFeatureDetail/BasicField.js +23 -0
- package/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +12 -0
- package/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +26 -0
- package/BaseFeatureWidget/BaseFeatureDetail/DataGrid.d.ts +14 -0
- package/BaseFeatureWidget/BaseFeatureDetail/DataGrid.js +98 -0
- package/BaseFeatureWidget/BaseFeatureDetail/FieldName.d.ts +16 -0
- package/BaseFeatureWidget/BaseFeatureDetail/FieldName.js +32 -0
- package/BaseFeatureWidget/BaseFeatureDetail/UriField.d.ts +17 -0
- package/BaseFeatureWidget/BaseFeatureDetail/UriField.js +31 -0
- package/BaseFeatureWidget/BaseFeatureDetail/UriLink.d.ts +6 -0
- package/BaseFeatureWidget/BaseFeatureDetail/UriLink.js +13 -0
- package/BaseFeatureWidget/{BaseFeatureDetail.d.ts → BaseFeatureDetail/index.d.ts} +4 -4
- package/BaseFeatureWidget/{BaseFeatureDetail.js → BaseFeatureDetail/index.js} +12 -9
- package/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +4 -0
- package/BaseFeatureWidget/BaseFeatureDetail/util.js +23 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/CDNASequence.d.ts +12 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/CDNASequence.js +25 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/CDSSequence.d.ts +5 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/CDSSequence.js +12 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/GenomicSequence.d.ts +5 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/GenomicSequence.js +14 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/ProteinSequence.d.ts +8 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/ProteinSequence.js +18 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.d.ts +2 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +146 -0
- package/BaseFeatureWidget/{SequenceFeatureSettingsDialog.d.ts → SequenceFeatureDetails/SequenceFeatureSettingsDialog.d.ts} +0 -1
- package/BaseFeatureWidget/{SequenceFeatureSettingsDialog.js → SequenceFeatureDetails/SequenceFeatureSettingsDialog.js} +1 -1
- package/BaseFeatureWidget/{SequenceHelpDialog.d.ts → SequenceFeatureDetails/SequenceHelpDialog.d.ts} +0 -1
- package/BaseFeatureWidget/{SequenceHelpDialog.js → SequenceFeatureDetails/SequenceHelpDialog.js} +6 -9
- package/BaseFeatureWidget/{SequencePanel.d.ts → SequenceFeatureDetails/SequencePanel.d.ts} +1 -1
- package/BaseFeatureWidget/{SequencePanel.js → SequenceFeatureDetails/SequencePanel.js} +10 -8
- package/BaseFeatureWidget/SequenceFeatureDetails/hooks.d.ts +10 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/hooks.js +73 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/index.d.ts +2 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/index.js +68 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/util.d.ts +6 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/util.js +11 -0
- package/BaseFeatureWidget/index.d.ts +4 -1
- package/BaseFeatureWidget/index.js +29 -17
- package/BaseFeatureWidget/types.d.ts +2 -2
- package/Plugin.d.ts +1 -1
- package/PluginLoader.js +17 -0
- package/PluginManager.d.ts +5 -2
- package/PluginManager.js +3 -0
- package/ReExports/list.js +1 -0
- package/ReExports/modules.d.ts +5 -2
- package/ReExports/modules.js +7 -4
- package/TextSearch/TextSearchManager.d.ts +2 -9
- package/assemblyManager/assembly.d.ts +91 -8
- package/assemblyManager/assembly.js +92 -8
- package/assemblyManager/assemblyConfigSchema.d.ts +50 -1
- package/assemblyManager/assemblyManager.d.ts +115 -58
- package/assemblyManager/assemblyManager.js +60 -12
- package/configuration/configurationSchema.d.ts +14 -16
- package/configuration/configurationSchema.js +4 -2
- package/configuration/index.d.ts +1 -1
- package/configuration/types.d.ts +13 -0
- package/configuration/types.js +2 -0
- package/configuration/util.d.ts +5 -3
- package/configuration/util.js +18 -18
- package/data_adapters/BaseAdapter/BaseAdapter.d.ts +23 -0
- package/data_adapters/BaseAdapter/BaseAdapter.js +37 -0
- package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +128 -0
- package/data_adapters/{BaseAdapter.js → BaseAdapter/BaseFeatureDataAdapter.js} +58 -88
- package/data_adapters/BaseAdapter/BaseOptions.d.ts +16 -0
- package/data_adapters/BaseAdapter/BaseOptions.js +2 -0
- package/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.d.ts +9 -0
- package/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.js +2 -0
- package/data_adapters/BaseAdapter/BaseSequenceAdapter.d.ts +13 -0
- package/data_adapters/BaseAdapter/BaseSequenceAdapter.js +10 -0
- package/data_adapters/BaseAdapter/BaseTextSearchAdapter.d.ts +6 -0
- package/data_adapters/BaseAdapter/BaseTextSearchAdapter.js +2 -0
- package/data_adapters/BaseAdapter/RegionsAdapter.d.ts +6 -0
- package/data_adapters/BaseAdapter/RegionsAdapter.js +2 -0
- package/data_adapters/BaseAdapter/index.d.ts +15 -0
- package/data_adapters/BaseAdapter/index.js +25 -0
- package/data_adapters/BaseAdapter/types.d.ts +21 -0
- package/data_adapters/BaseAdapter/types.js +2 -0
- package/data_adapters/BaseAdapter/util.d.ts +12 -0
- package/data_adapters/BaseAdapter/util.js +23 -0
- package/data_adapters/CytobandAdapter/configSchema.d.ts +11 -1
- package/package.json +4 -4
- package/pluggableElementTypes/AdapterType.d.ts +1 -1
- package/pluggableElementTypes/ConnectionType.d.ts +1 -1
- package/pluggableElementTypes/DisplayType.d.ts +1 -1
- package/pluggableElementTypes/InternetAccountType.d.ts +1 -1
- package/pluggableElementTypes/TextSearchAdapterType.d.ts +1 -1
- package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -1
- package/pluggableElementTypes/models/BaseTrackModel.js +3 -2
- package/pluggableElementTypes/models/InternetAccountModel.d.ts +30 -0
- package/pluggableElementTypes/models/InternetAccountModel.js +6 -1
- package/pluggableElementTypes/models/baseConnectionConfig.d.ts +18 -1
- package/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +42 -1
- package/pluggableElementTypes/models/baseTrackConfig.d.ts +118 -1
- package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +0 -1
- package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +1 -1
- package/pluggableElementTypes/renderers/RendererType.d.ts +1 -1
- package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +0 -1
- package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +1 -1
- package/rpc/RpcManager.d.ts +8 -1
- package/rpc/RpcManager.js +1 -1
- package/rpc/baseRpcConfig.d.ts +10 -1
- package/rpc/configSchema.d.ts +14 -1
- package/rpc/coreRpcMethods.d.ts +1 -1
- package/rpc/coreRpcMethods.js +3 -3
- package/rpc/mainThreadRpcConfig.d.ts +7 -1
- package/rpc/methods/{CoreEstimateRegionStats.d.ts → CoreGetFeatureDensityStats.d.ts} +2 -2
- package/rpc/methods/{CoreEstimateRegionStats.js → CoreGetFeatureDensityStats.js} +4 -4
- package/rpc/methods/CoreGetFeatureDetails.js +5 -5
- package/rpc/webWorkerRpcConfig.d.ts +7 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/AboutDialog.d.ts +0 -1
- package/ui/AppLogo.d.ts +0 -1
- package/ui/AssemblySelector.d.ts +0 -1
- package/ui/CascadingMenu.d.ts +0 -1
- package/ui/ColorPicker.d.ts +0 -1
- package/ui/Dialog.d.ts +0 -1
- package/ui/Dialog.js +14 -1
- package/ui/DrawerWidget.d.ts +1 -2
- package/ui/DrawerWidget.js +5 -3
- package/ui/DropDownMenu.d.ts +0 -1
- package/ui/ErrorMessage.d.ts +0 -1
- package/ui/FactoryResetDialog.d.ts +0 -1
- package/ui/FatalErrorDialog.d.ts +0 -1
- package/ui/FileSelector/FileSelector.d.ts +0 -1
- package/ui/FileSelector/LocalFileChooser.d.ts +0 -1
- package/ui/FileSelector/UrlChooser.d.ts +0 -1
- package/ui/Icons.d.ts +0 -1
- package/ui/LoadingEllipses.d.ts +0 -1
- package/ui/Logo.d.ts +0 -1
- package/ui/PrerenderedCanvas.d.ts +0 -1
- package/ui/ResizeBar.js +1 -1
- package/ui/ResizeHandle.d.ts +0 -1
- package/ui/ReturnToImportFormDialog.d.ts +0 -1
- package/ui/SanitizedHTML.d.ts +0 -1
- package/ui/SanitizedHTML.js +6 -0
- package/ui/Snackbar.d.ts +0 -1
- package/ui/Tooltip.d.ts +0 -1
- package/ui/ViewContainerTitle.d.ts +0 -1
- package/ui/ViewLauncher.d.ts +0 -1
- package/ui/ViewMenu.d.ts +1 -2
- package/ui/ViewPanel.d.ts +0 -1
- package/ui/react-colorful.d.ts +1 -1
- package/ui/theme.js +3 -18
- package/util/index.d.ts +4 -2
- package/util/index.js +13 -4
- package/util/layouts/PrecomputedMultiLayout.d.ts +1 -1
- package/util/stats.d.ts +5 -5
- package/util/types/index.d.ts +3 -1
- package/util/types/mst.d.ts +12 -9
- package/BaseFeatureWidget/SequenceBox.d.ts +0 -29
- package/BaseFeatureWidget/SequenceBox.js +0 -63
- package/BaseFeatureWidget/SequenceFeatureDetails.d.ts +0 -3
- package/BaseFeatureWidget/SequenceFeatureDetails.js +0 -230
- package/data_adapters/BaseAdapter.d.ts +0 -138
- /package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/DLGAP3.d.ts +0 -0
- /package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/DLGAP3.js +0 -0
- /package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/NCDN.d.ts +0 -0
- /package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/NCDN.js +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const util_1 = require("./util");
|
|
8
|
+
function GenomicSequence({ sequence, upstream, downstream, }) {
|
|
9
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
10
|
+
upstream ? (react_1.default.createElement("span", { style: { background: util_1.updownstreamColor } }, upstream)) : null,
|
|
11
|
+
react_1.default.createElement("span", { style: { background: util_1.genomeColor } }, sequence),
|
|
12
|
+
downstream ? (react_1.default.createElement("span", { style: { background: util_1.updownstreamColor } }, downstream)) : null));
|
|
13
|
+
}
|
|
14
|
+
exports.default = GenomicSequence;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const util_1 = require("../util");
|
|
8
|
+
const util_2 = require("./util");
|
|
9
|
+
function ProteinSequence({ cds, sequence, codonTable, }) {
|
|
10
|
+
const str = (0, util_1.stitch)(cds, sequence);
|
|
11
|
+
let protein = '';
|
|
12
|
+
for (let i = 0; i < str.length; i += 3) {
|
|
13
|
+
// use & symbol for undefined codon, or partial slice
|
|
14
|
+
protein += codonTable[str.slice(i, i + 3)] || '&';
|
|
15
|
+
}
|
|
16
|
+
return react_1.default.createElement("span", { style: { background: util_2.proteinColor } }, protein);
|
|
17
|
+
}
|
|
18
|
+
exports.default = ProteinSequence;
|
|
@@ -0,0 +1,146 @@
|
|
|
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
|
+
const copy_to_clipboard_1 = __importDefault(require("copy-to-clipboard"));
|
|
33
|
+
// locals
|
|
34
|
+
const util_1 = require("../../util");
|
|
35
|
+
const ui_1 = require("../../ui");
|
|
36
|
+
// icons
|
|
37
|
+
const Settings_1 = __importDefault(require("@mui/icons-material/Settings"));
|
|
38
|
+
const hooks_1 = require("./hooks");
|
|
39
|
+
// lazies
|
|
40
|
+
const SettingsDlg = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./SequenceFeatureSettingsDialog'))));
|
|
41
|
+
const SequencePanel = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./SequencePanel'))));
|
|
42
|
+
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
43
|
+
button: {
|
|
44
|
+
margin: theme.spacing(1),
|
|
45
|
+
},
|
|
46
|
+
formControl: {
|
|
47
|
+
margin: 0,
|
|
48
|
+
},
|
|
49
|
+
container2: {
|
|
50
|
+
marginTop: theme.spacing(1),
|
|
51
|
+
},
|
|
52
|
+
}));
|
|
53
|
+
// set the key on this component to feature.id to clear state after new feature
|
|
54
|
+
// is selected
|
|
55
|
+
function SequenceFeatureDetails({ model, feature: prefeature, }) {
|
|
56
|
+
var _a, _b;
|
|
57
|
+
const { classes } = useStyles();
|
|
58
|
+
const feature = prefeature;
|
|
59
|
+
const hasCDS = (_a = feature.subfeatures) === null || _a === void 0 ? void 0 : _a.some(sub => sub.type === 'CDS');
|
|
60
|
+
const hasExon = (_b = feature.subfeatures) === null || _b === void 0 ? void 0 : _b.some(sub => sub.type === 'exon');
|
|
61
|
+
const seqPanelRef = (0, react_1.useRef)(null);
|
|
62
|
+
const [intronBp, setIntronBp] = (0, util_1.useLocalStorage)('intronBp', 10);
|
|
63
|
+
const [upDownBp, setUpDownBp] = (0, util_1.useLocalStorage)('upDownBp', 500);
|
|
64
|
+
const [copied, setCopied] = (0, react_1.useState)(false);
|
|
65
|
+
const [copiedHtml, setCopiedHtml] = (0, react_1.useState)(false);
|
|
66
|
+
const [force, setForce] = (0, react_1.useState)(false);
|
|
67
|
+
const { sequence, error } = (0, hooks_1.useFeatureSequence)(model, prefeature, upDownBp, force);
|
|
68
|
+
const [mode, setMode] = (0, react_1.useState)(hasCDS ? 'cds' : hasExon ? 'cdna' : 'genomic');
|
|
69
|
+
const rest = {
|
|
70
|
+
...(hasCDS ? { cds: 'CDS' } : {}),
|
|
71
|
+
...(hasCDS ? { protein: 'Protein' } : {}),
|
|
72
|
+
...(hasExon ? { cdna: 'cDNA' } : {}),
|
|
73
|
+
...(hasExon
|
|
74
|
+
? {
|
|
75
|
+
gene: `Genomic w/ full introns`,
|
|
76
|
+
}
|
|
77
|
+
: {}),
|
|
78
|
+
...(hasExon
|
|
79
|
+
? {
|
|
80
|
+
gene_updownstream: `Genomic w/ full introns +/- ${upDownBp}bp up+down stream`,
|
|
81
|
+
}
|
|
82
|
+
: {}),
|
|
83
|
+
...(hasExon
|
|
84
|
+
? { gene_collapsed_intron: `Genomic w/ ${intronBp}bp intron` }
|
|
85
|
+
: {}),
|
|
86
|
+
...(hasExon
|
|
87
|
+
? {
|
|
88
|
+
gene_updownstream_collapsed_intron: `Genomic w/ ${intronBp}bp intron +/- ${upDownBp}bp up+down stream `,
|
|
89
|
+
}
|
|
90
|
+
: {}),
|
|
91
|
+
...(!hasExon ? { genomic: 'Genomic' } : {}),
|
|
92
|
+
...(!hasExon
|
|
93
|
+
? {
|
|
94
|
+
genomic_sequence_updownstream: `Genomic +/- ${upDownBp}bp up+down stream`,
|
|
95
|
+
}
|
|
96
|
+
: {}),
|
|
97
|
+
};
|
|
98
|
+
return (react_1.default.createElement("div", { className: classes.container2 },
|
|
99
|
+
react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
|
|
100
|
+
react_1.default.createElement(material_1.Select, { value: mode, onChange: event => setMode(event.target.value) }, Object.entries(rest).map(([key, val]) => (react_1.default.createElement(material_1.MenuItem, { key: key, value: key }, val))))),
|
|
101
|
+
react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
|
|
102
|
+
react_1.default.createElement(material_1.Button, { className: classes.button, variant: "contained", onClick: () => {
|
|
103
|
+
const ref = seqPanelRef.current;
|
|
104
|
+
if (ref) {
|
|
105
|
+
(0, copy_to_clipboard_1.default)(ref.textContent || '', { format: 'text/plain' });
|
|
106
|
+
setCopied(true);
|
|
107
|
+
setTimeout(() => setCopied(false), 1000);
|
|
108
|
+
}
|
|
109
|
+
} }, copied ? 'Copied to clipboard!' : 'Copy plaintext')),
|
|
110
|
+
react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
|
|
111
|
+
react_1.default.createElement(material_1.Tooltip, { title: "The 'Copy HTML' function retains the colors from the sequence panel but cannot be pasted into some programs like notepad that only expect plain text" },
|
|
112
|
+
react_1.default.createElement(material_1.Button, { className: classes.button, variant: "contained", onClick: () => {
|
|
113
|
+
const ref = seqPanelRef.current;
|
|
114
|
+
if (!ref) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
(0, copy_to_clipboard_1.default)(ref.innerHTML, { format: 'text/html' });
|
|
118
|
+
setCopiedHtml(true);
|
|
119
|
+
setTimeout(() => setCopiedHtml(false), 1000);
|
|
120
|
+
} }, copiedHtml ? 'Copied to clipboard!' : 'Copy HTML'))),
|
|
121
|
+
react_1.default.createElement(Settings, { upDownBp: upDownBp, intronBp: intronBp, setIntronBp: setIntronBp, setUpDownBp: setUpDownBp }),
|
|
122
|
+
react_1.default.createElement("br", null),
|
|
123
|
+
feature.type === 'gene' ? (react_1.default.createElement(material_1.Typography, null, "Note: inspect subfeature sequences for protein/CDS computations")) : null,
|
|
124
|
+
error ? (react_1.default.createElement(material_1.Typography, { color: "error" }, `${error}`)) : !sequence ? (react_1.default.createElement(ui_1.LoadingEllipses, null)) : sequence ? ('error' in sequence ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
125
|
+
react_1.default.createElement(material_1.Typography, { color: "error" }, sequence.error),
|
|
126
|
+
react_1.default.createElement(material_1.Button, { variant: "contained", color: "inherit", onClick: () => setForce(true) }, "Force load"))) : (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(ui_1.LoadingEllipses, null) },
|
|
127
|
+
react_1.default.createElement(SequencePanel, { ref: seqPanelRef, feature: feature, mode: mode, sequence: sequence, intronBp: intronBp })))) : (react_1.default.createElement(material_1.Typography, null, "No sequence found"))));
|
|
128
|
+
}
|
|
129
|
+
exports.default = SequenceFeatureDetails;
|
|
130
|
+
function Settings({ intronBp, upDownBp, setIntronBp, setUpDownBp, }) {
|
|
131
|
+
const { classes } = useStyles();
|
|
132
|
+
const [settingsDlgOpen, setSettingsDlgOpen] = (0, react_1.useState)(false);
|
|
133
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
134
|
+
react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
|
|
135
|
+
react_1.default.createElement(material_1.IconButton, { onClick: () => setSettingsDlgOpen(true) },
|
|
136
|
+
react_1.default.createElement(Settings_1.default, null))),
|
|
137
|
+
settingsDlgOpen ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement("div", null) },
|
|
138
|
+
react_1.default.createElement(SettingsDlg, { handleClose: arg => {
|
|
139
|
+
if (arg) {
|
|
140
|
+
const { upDownBp, intronBp } = arg;
|
|
141
|
+
setIntronBp(intronBp);
|
|
142
|
+
setUpDownBp(upDownBp);
|
|
143
|
+
}
|
|
144
|
+
setSettingsDlgOpen(false);
|
|
145
|
+
}, upDownBp: upDownBp, intronBp: intronBp }))) : null));
|
|
146
|
+
}
|
|
@@ -42,7 +42,7 @@ function SequenceFeatureSettingsDialog({ handleClose, intronBp: intronBpArg, upD
|
|
|
42
42
|
const [upDownBp, setUpDownBp] = (0, react_1.useState)(`${upDownBpArg}`);
|
|
43
43
|
const intronBpValid = !Number.isNaN(+intronBp);
|
|
44
44
|
const upDownBpValid = !Number.isNaN(+upDownBp);
|
|
45
|
-
return (react_1.default.createElement(ui_1.Dialog, { maxWidth: "xl", open: true, onClose: () => handleClose(), title:
|
|
45
|
+
return (react_1.default.createElement(ui_1.Dialog, { maxWidth: "xl", open: true, onClose: () => handleClose(), title: "Feature sequence settings" },
|
|
46
46
|
react_1.default.createElement(material_1.DialogContent, { className: classes.dialogContent },
|
|
47
47
|
react_1.default.createElement(material_1.TextField, { label: "Number of intronic bases around splice site to display", className: classes.formElt, value: intronBp, helperText: !intronBpValid ? 'Not a number' : '', error: !intronBpValid, onChange: event => setIntronBp(event.target.value) }),
|
|
48
48
|
react_1.default.createElement(material_1.TextField, { label: "Number of bases up/down stream of feature to display", className: classes.formElt, value: upDownBp, helperText: !upDownBpValid ? 'Not a number' : '', error: !upDownBpValid, onChange: event => setUpDownBp(event.target.value) })),
|
package/BaseFeatureWidget/{SequenceHelpDialog.js → SequenceFeatureDetails/SequenceHelpDialog.js}
RENAMED
|
@@ -16,19 +16,16 @@ function HelpDialog({ handleClose, }) {
|
|
|
16
16
|
react_1.default.createElement("ul", null,
|
|
17
17
|
react_1.default.createElement("li", null, "CDS - shows the stitched together CDS sequences"),
|
|
18
18
|
react_1.default.createElement("li", null, "Protein - the translated coding sequence, with the \"standard\" genetic code"),
|
|
19
|
-
react_1.default.createElement("li", null, "cDNA - shows the
|
|
20
|
-
react_1.default.createElement("li", null, "
|
|
21
|
-
react_1.default.createElement("li", null, "Gene w/ Nbp introns - same \"Gene w/ introns\", but limiting to a subset of the intron sequence displayed"),
|
|
22
|
-
react_1.default.createElement("li", null, "Gene +/- Nbp up+down stream - same as \"Gene w/ introns\" but with up and downstream sequence displayed"),
|
|
23
|
-
react_1.default.createElement("li", null, "Gene +/- Nbp up+down stream, Nbp introns - same as \"Gene w/ introns\", but with limited intron sequence displayed and up and downstream sequence")),
|
|
19
|
+
react_1.default.createElement("li", null, "cDNA - shows the 'DNA' version of transcript, formed from exons, including non-coding genes"),
|
|
20
|
+
react_1.default.createElement("li", null, "Genomic w/ introns +/- Nbp up+down stream - the sequence underlying the entire gene including including introns, with UTR and CDS highlighted")),
|
|
24
21
|
react_1.default.createElement(material_1.Typography, { paragraph: true }, "For other feature types, the options are:"),
|
|
25
22
|
react_1.default.createElement("ul", null,
|
|
26
|
-
react_1.default.createElement("li", null, "
|
|
27
|
-
react_1.default.createElement("li", null, "Feature sequence +/- Nbp up+down stream - the reference genome sequence underlying the feature, with the up and downstream sequence")),
|
|
23
|
+
react_1.default.createElement("li", null, "Genomic +/- Nbp up+down stream - the reference genome sequence underlying the feature, with the up and downstream sequence")),
|
|
28
24
|
react_1.default.createElement(material_1.Typography, null,
|
|
29
|
-
"Note: you can use the \"gear icon\" ",
|
|
25
|
+
"Note 1: you can use the \"gear icon\" ",
|
|
30
26
|
react_1.default.createElement(Settings_1.default, null),
|
|
31
|
-
" to edit the number of bp displayed up/downstream and in the intron region")
|
|
27
|
+
" to edit the number of bp displayed up/downstream and in the intron region"),
|
|
28
|
+
react_1.default.createElement(material_1.Typography, null, "Note 2: The 'Copy HTML' function retains the colors from the sequence panel but cannot be pasted into some programs like notepad that only expect plain text.")),
|
|
32
29
|
react_1.default.createElement(material_1.DialogActions, null,
|
|
33
30
|
react_1.default.createElement(material_1.Button, { onClick: () => handleClose(), autoFocus: true, variant: "contained" }, "Close"))));
|
|
34
31
|
}
|
|
@@ -4,9 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const react_1 = __importDefault(require("react"));
|
|
7
|
-
const util_1 = require("
|
|
8
|
-
const util_2 = require("
|
|
9
|
-
const
|
|
7
|
+
const util_1 = require("../../util");
|
|
8
|
+
const util_2 = require("../util");
|
|
9
|
+
const CDNASequence_1 = __importDefault(require("./CDNASequence"));
|
|
10
|
+
const ProteinSequence_1 = __importDefault(require("./ProteinSequence"));
|
|
11
|
+
const GenomicSequence_1 = __importDefault(require("./GenomicSequence"));
|
|
12
|
+
const CDSSequence_1 = __importDefault(require("./CDSSequence"));
|
|
10
13
|
const SeqPanel = react_1.default.forwardRef(function (props, ref) {
|
|
11
14
|
const { feature, mode, intronBp = 10 } = props;
|
|
12
15
|
let { sequence: { seq, upstream = '', downstream = '' }, } = props;
|
|
@@ -55,21 +58,20 @@ const SeqPanel = react_1.default.forwardRef(function (props, ref) {
|
|
|
55
58
|
}
|
|
56
59
|
const codonTable = (0, util_1.generateCodonTable)(util_1.defaultCodonTable);
|
|
57
60
|
return (react_1.default.createElement("div", { ref: ref, "data-testid": "sequence_panel" },
|
|
58
|
-
react_1.default.createElement("div", { style:
|
|
59
|
-
|
|
60
|
-
{
|
|
61
|
+
react_1.default.createElement("div", { style: {
|
|
62
|
+
/* raw styles instead of className so that html copy works */
|
|
61
63
|
fontFamily: 'monospace',
|
|
62
64
|
wordWrap: 'break-word',
|
|
63
65
|
overflow: 'auto',
|
|
64
66
|
color: 'black',
|
|
65
67
|
fontSize: 12,
|
|
66
68
|
maxWidth: 600,
|
|
67
|
-
maxHeight:
|
|
69
|
+
maxHeight: 300,
|
|
68
70
|
} },
|
|
69
71
|
react_1.default.createElement("span", { style: { background: 'white' } }, `>${feature.name ||
|
|
70
72
|
feature.id ||
|
|
71
73
|
`${feature.refName}:${feature.start + 1}-${feature.end}`}-${mode}\n`),
|
|
72
74
|
react_1.default.createElement("br", null),
|
|
73
|
-
mode === 'genomic' ? (react_1.default.createElement(
|
|
75
|
+
mode === 'genomic' ? (react_1.default.createElement(GenomicSequence_1.default, { sequence: seq })) : mode === 'genomic_sequence_updownstream' ? (react_1.default.createElement(GenomicSequence_1.default, { sequence: seq, upstream: upstream, downstream: downstream })) : mode === 'cds' ? (react_1.default.createElement(CDSSequence_1.default, { cds: cds, sequence: seq })) : mode === 'cdna' ? (react_1.default.createElement(CDNASequence_1.default, { exons: exons, cds: cds, utr: utr, sequence: seq, intronBp: intronBp })) : mode === 'protein' ? (react_1.default.createElement(ProteinSequence_1.default, { cds: cds, codonTable: codonTable, sequence: seq })) : mode === 'gene' ? (react_1.default.createElement(CDNASequence_1.default, { exons: exons, cds: cds, utr: utr, sequence: seq, includeIntrons: true, intronBp: intronBp })) : mode === 'gene_collapsed_intron' ? (react_1.default.createElement(CDNASequence_1.default, { exons: exons, cds: cds, sequence: seq, utr: utr, includeIntrons: true, collapseIntron: true, intronBp: intronBp })) : mode === 'gene_updownstream' ? (react_1.default.createElement(CDNASequence_1.default, { exons: exons, cds: cds, sequence: seq, utr: utr, upstream: upstream, downstream: downstream, includeIntrons: true, intronBp: intronBp })) : mode === 'gene_updownstream_collapsed_intron' ? (react_1.default.createElement(CDNASequence_1.default, { exons: exons, cds: cds, sequence: seq, utr: utr, upstream: upstream, downstream: downstream, includeIntrons: true, collapseIntron: true, intronBp: intronBp })) : (react_1.default.createElement("div", null, "Unknown type")))));
|
|
74
76
|
});
|
|
75
77
|
exports.default = SeqPanel;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SeqState, ErrorState } from '../util';
|
|
2
|
+
import { SimpleFeatureSerialized } from '../../util';
|
|
3
|
+
export declare function useFeatureSequence(model: {
|
|
4
|
+
view: {
|
|
5
|
+
assemblyNames: string[];
|
|
6
|
+
};
|
|
7
|
+
} | undefined, feature: SimpleFeatureSerialized, upDownBp: number, forceLoad: boolean): {
|
|
8
|
+
sequence: SeqState | ErrorState | undefined;
|
|
9
|
+
error: unknown;
|
|
10
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useFeatureSequence = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const util_1 = require("../../util");
|
|
6
|
+
const configuration_1 = require("../../configuration");
|
|
7
|
+
const BPLIMIT = 500000;
|
|
8
|
+
function useFeatureSequence(model, feature, upDownBp, forceLoad) {
|
|
9
|
+
const [sequence, setSequence] = (0, react_1.useState)();
|
|
10
|
+
const [error, setError] = (0, react_1.useState)();
|
|
11
|
+
(0, react_1.useEffect)(() => {
|
|
12
|
+
var _a;
|
|
13
|
+
let finished = false;
|
|
14
|
+
if (!model) {
|
|
15
|
+
return () => { };
|
|
16
|
+
}
|
|
17
|
+
const { assemblyManager, rpcManager } = (0, util_1.getSession)(model);
|
|
18
|
+
const [assemblyName] = ((_a = model.view) === null || _a === void 0 ? void 0 : _a.assemblyNames) || [];
|
|
19
|
+
async function fetchSeq(start, end, refName) {
|
|
20
|
+
const assembly = await assemblyManager.waitForAssembly(assemblyName);
|
|
21
|
+
if (!assembly) {
|
|
22
|
+
throw new Error('assembly not found');
|
|
23
|
+
}
|
|
24
|
+
const sessionId = 'getSequence';
|
|
25
|
+
const feats = await rpcManager.call(sessionId, 'CoreGetFeatures', {
|
|
26
|
+
adapterConfig: (0, configuration_1.getConf)(assembly, ['sequence', 'adapter']),
|
|
27
|
+
sessionId,
|
|
28
|
+
regions: [
|
|
29
|
+
{
|
|
30
|
+
start,
|
|
31
|
+
end,
|
|
32
|
+
refName: assembly.getCanonicalRefName(refName),
|
|
33
|
+
assemblyName,
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
});
|
|
37
|
+
const [feat] = feats;
|
|
38
|
+
return (feat === null || feat === void 0 ? void 0 : feat.get('seq')) || '';
|
|
39
|
+
}
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
41
|
+
;
|
|
42
|
+
(async () => {
|
|
43
|
+
try {
|
|
44
|
+
setError(undefined);
|
|
45
|
+
const { start, end, refName } = feature;
|
|
46
|
+
if (!forceLoad && end - start > BPLIMIT) {
|
|
47
|
+
setSequence({
|
|
48
|
+
error: `Genomic sequence larger than ${BPLIMIT}bp, use "force load" button to display`,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const b = start - upDownBp;
|
|
53
|
+
const e = end + upDownBp;
|
|
54
|
+
const seq = await fetchSeq(start, end, refName);
|
|
55
|
+
const up = await fetchSeq(Math.max(0, b), start, refName);
|
|
56
|
+
const down = await fetchSeq(end, e, refName);
|
|
57
|
+
if (!finished) {
|
|
58
|
+
setSequence({ seq, upstream: up, downstream: down });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
console.error(e);
|
|
64
|
+
setError(e);
|
|
65
|
+
}
|
|
66
|
+
})();
|
|
67
|
+
return () => {
|
|
68
|
+
finished = true;
|
|
69
|
+
};
|
|
70
|
+
}, [feature, model, upDownBp, forceLoad]);
|
|
71
|
+
return { sequence, error };
|
|
72
|
+
}
|
|
73
|
+
exports.useFeatureSequence = useFeatureSequence;
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
const ui_1 = require("../../ui");
|
|
33
|
+
// icons
|
|
34
|
+
const Help_1 = __importDefault(require("@mui/icons-material/Help"));
|
|
35
|
+
// lazies
|
|
36
|
+
const HelpDlg = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./SequenceHelpDialog'))));
|
|
37
|
+
const SequenceFeatureDetails = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./SequenceFeatureDetails'))));
|
|
38
|
+
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
39
|
+
formControl: {
|
|
40
|
+
margin: 0,
|
|
41
|
+
},
|
|
42
|
+
container: {
|
|
43
|
+
marginTop: theme.spacing(4),
|
|
44
|
+
marginBottom: theme.spacing(4),
|
|
45
|
+
},
|
|
46
|
+
}));
|
|
47
|
+
// display the stitched-together sequence of a gene's CDS, cDNA, or protein
|
|
48
|
+
// sequence. this is a best effort and weird genomic phenomena could lead these
|
|
49
|
+
// to not be 100% accurate
|
|
50
|
+
function SequenceFeaturePanel({ model, feature }) {
|
|
51
|
+
const { classes } = useStyles();
|
|
52
|
+
const [shown, setShown] = (0, react_1.useState)(false);
|
|
53
|
+
const [helpShown, setHelpShown] = (0, react_1.useState)(false);
|
|
54
|
+
return !model ? null : (react_1.default.createElement("div", { className: classes.container },
|
|
55
|
+
react_1.default.createElement(material_1.Button, { variant: "contained", onClick: () => setShown(!shown) }, shown ? 'Hide feature sequence' : 'Show feature sequence'),
|
|
56
|
+
react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
|
|
57
|
+
react_1.default.createElement(material_1.IconButton, { onClick: () => setHelpShown(true) },
|
|
58
|
+
react_1.default.createElement(Help_1.default, null))),
|
|
59
|
+
shown ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(ui_1.LoadingEllipses, null) },
|
|
60
|
+
react_1.default.createElement(SequenceFeatureDetails
|
|
61
|
+
/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion */
|
|
62
|
+
, {
|
|
63
|
+
/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion */
|
|
64
|
+
key: feature.uniqueId, model: model, feature: feature }))) : null,
|
|
65
|
+
helpShown ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement("div", null) },
|
|
66
|
+
react_1.default.createElement(HelpDlg, { handleClose: () => setHelpShown(false) }))) : null));
|
|
67
|
+
}
|
|
68
|
+
exports.default = SequenceFeaturePanel;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const intronColor: undefined;
|
|
2
|
+
export declare const utrColor = "rgb(200,240,240)";
|
|
3
|
+
export declare const proteinColor = "rgb(220,160,220)";
|
|
4
|
+
export declare const cdsColor = "rgb(220,220,180)";
|
|
5
|
+
export declare const updownstreamColor = "rgba(250,200,200)";
|
|
6
|
+
export declare const genomeColor = "rgb(200,280,200)";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.genomeColor = exports.updownstreamColor = exports.cdsColor = exports.proteinColor = exports.utrColor = exports.intronColor = void 0;
|
|
4
|
+
// note that these are currently put into the style section instead of being
|
|
5
|
+
// defined in classes to aid copy and paste to an external document e.g. word
|
|
6
|
+
exports.intronColor = undefined;
|
|
7
|
+
exports.utrColor = 'rgb(200,240,240)';
|
|
8
|
+
exports.proteinColor = 'rgb(220,160,220)';
|
|
9
|
+
exports.cdsColor = 'rgb(220,220,180)';
|
|
10
|
+
exports.updownstreamColor = 'rgba(250,200,200)';
|
|
11
|
+
exports.genomeColor = 'rgb(200,280,200)';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import PluginManager from '../PluginManager';
|
|
2
|
-
declare const configSchema: import("../configuration").
|
|
2
|
+
declare const configSchema: import("../configuration/configurationSchema").ConfigurationSchemaType<{}, import("../configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
|
|
3
3
|
export default function stateModelFactory(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
|
|
4
4
|
id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
5
5
|
type: import("mobx-state-tree").ISimpleType<"BaseFeatureWidget">;
|
|
@@ -11,10 +11,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
11
11
|
trackId: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
|
|
12
12
|
trackType: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
|
|
13
13
|
}, {
|
|
14
|
+
error: unknown;
|
|
15
|
+
} & {
|
|
14
16
|
setFeatureData(featureData: Record<string, unknown>): void;
|
|
15
17
|
clearFeatureData(): void;
|
|
16
18
|
setFormattedData(feat: Record<string, unknown>): void;
|
|
17
19
|
setExtra(type?: string, trackId?: string): void;
|
|
20
|
+
setError(e: unknown): void;
|
|
18
21
|
} & {
|
|
19
22
|
afterCreate(): void;
|
|
20
23
|
}, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
|
|
@@ -36,6 +36,9 @@ function stateModelFactory(pluginManager) {
|
|
|
36
36
|
trackId: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
|
|
37
37
|
trackType: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
|
|
38
38
|
})
|
|
39
|
+
.volatile(() => ({
|
|
40
|
+
error: undefined,
|
|
41
|
+
}))
|
|
39
42
|
.actions(self => ({
|
|
40
43
|
setFeatureData(featureData) {
|
|
41
44
|
self.unformattedFeatureData = featureData;
|
|
@@ -50,30 +53,39 @@ function stateModelFactory(pluginManager) {
|
|
|
50
53
|
self.trackId = trackId;
|
|
51
54
|
self.trackType = type;
|
|
52
55
|
},
|
|
56
|
+
setError(e) {
|
|
57
|
+
self.error = e;
|
|
58
|
+
},
|
|
53
59
|
}))
|
|
54
60
|
.actions(self => ({
|
|
55
61
|
afterCreate() {
|
|
56
62
|
(0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(() => {
|
|
57
63
|
var _a, _b;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (track) {
|
|
68
|
-
// eslint-disable-next-line no-underscore-dangle
|
|
69
|
-
feature.__jbrowsefmt = combine('feature', feature);
|
|
70
|
-
const depth = (0, configuration_1.getConf)(track, ['formatDetails', 'depth']);
|
|
71
|
-
formatSubfeatures(feature, depth, sub => {
|
|
72
|
-
// eslint-disable-next-line no-underscore-dangle
|
|
73
|
-
sub.__jbrowsefmt = combine('subfeatures', sub);
|
|
64
|
+
try {
|
|
65
|
+
self.setExtra((_a = self.track) === null || _a === void 0 ? void 0 : _a.type, (_b = self.track) === null || _b === void 0 ? void 0 : _b.configuration.trackId);
|
|
66
|
+
const { unformattedFeatureData, track } = self;
|
|
67
|
+
const session = (0, util_1.getSession)(self);
|
|
68
|
+
if (unformattedFeatureData) {
|
|
69
|
+
const feature = (0, clone_1.default)(unformattedFeatureData);
|
|
70
|
+
const combine = (arg2, feature) => ({
|
|
71
|
+
...(0, configuration_1.getConf)(session, ['formatDetails', arg2], { feature }),
|
|
72
|
+
...(0, configuration_1.getConf)(track, ['formatDetails', arg2], { feature }),
|
|
74
73
|
});
|
|
74
|
+
if (track) {
|
|
75
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
76
|
+
feature.__jbrowsefmt = combine('feature', feature);
|
|
77
|
+
const depth = (0, configuration_1.getConf)(track, ['formatDetails', 'depth']);
|
|
78
|
+
formatSubfeatures(feature, depth, sub => {
|
|
79
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
80
|
+
sub.__jbrowsefmt = combine('subfeatures', sub);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
self.setFormattedData(feature);
|
|
75
84
|
}
|
|
76
|
-
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
console.error(e);
|
|
88
|
+
self.setError(e);
|
|
77
89
|
}
|
|
78
90
|
}));
|
|
79
91
|
},
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { IAnyStateTreeNode } from 'mobx-state-tree';
|
|
3
|
-
import {
|
|
3
|
+
import { SimpleFeatureSerialized } from '../util/simpleFeature';
|
|
4
4
|
import { AbstractViewModel } from '../util';
|
|
5
5
|
export interface BaseProps extends BaseCardProps {
|
|
6
|
-
feature:
|
|
6
|
+
feature: SimpleFeatureSerialized;
|
|
7
7
|
formatter?: (val: unknown, key: string) => React.ReactNode;
|
|
8
8
|
descriptions?: Record<string, React.ReactNode>;
|
|
9
9
|
model?: IAnyStateTreeNode & {
|
package/Plugin.d.ts
CHANGED
package/PluginLoader.js
CHANGED
|
@@ -25,6 +25,20 @@ function isCJSPluginDefinition(def) {
|
|
|
25
25
|
return def.cjsUrl !== undefined;
|
|
26
26
|
}
|
|
27
27
|
exports.isCJSPluginDefinition = isCJSPluginDefinition;
|
|
28
|
+
function pluginDescriptionString(pluginDefinition) {
|
|
29
|
+
var _a;
|
|
30
|
+
if (isUMDPluginDefinition(pluginDefinition)) {
|
|
31
|
+
return `UMD plugin ${pluginDefinition.name}`;
|
|
32
|
+
}
|
|
33
|
+
if (isESMPluginDefinition(pluginDefinition)) {
|
|
34
|
+
return `ESM plugin ${pluginDefinition.esmUrl ||
|
|
35
|
+
((_a = pluginDefinition.esmLoc) === null || _a === void 0 ? void 0 : _a.uri)}`;
|
|
36
|
+
}
|
|
37
|
+
if (isCJSPluginDefinition(pluginDefinition)) {
|
|
38
|
+
return `CJS plugin ${pluginDefinition.cjsUrl}`;
|
|
39
|
+
}
|
|
40
|
+
return 'unknown plugin';
|
|
41
|
+
}
|
|
28
42
|
function isInWebWorker() {
|
|
29
43
|
return Boolean('WorkerGlobalScope' in globalThis);
|
|
30
44
|
}
|
|
@@ -115,6 +129,9 @@ class PluginLoader {
|
|
|
115
129
|
else {
|
|
116
130
|
throw new Error(`Could not determine plugin type: ${JSON.stringify(def)}`);
|
|
117
131
|
}
|
|
132
|
+
if (!plugin.default) {
|
|
133
|
+
throw new Error(`${pluginDescriptionString(def)} does not have a default export, cannot load`);
|
|
134
|
+
}
|
|
118
135
|
return plugin.default;
|
|
119
136
|
}
|
|
120
137
|
installGlobalReExports(target) {
|