@jbrowse/core 2.1.4 → 2.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail.d.ts +4 -3
  2. package/BaseFeatureWidget/BaseFeatureDetail.js +16 -17
  3. package/BaseFeatureWidget/SequenceBox.d.ts +29 -0
  4. package/BaseFeatureWidget/SequenceBox.js +61 -0
  5. package/BaseFeatureWidget/SequenceFeatureDetails.d.ts +2 -8
  6. package/BaseFeatureWidget/SequenceFeatureDetails.js +123 -135
  7. package/BaseFeatureWidget/SequenceFeatureSettingsDialog.d.ts +9 -0
  8. package/BaseFeatureWidget/SequenceFeatureSettingsDialog.js +71 -0
  9. package/BaseFeatureWidget/SequenceHelpDialog.d.ts +4 -0
  10. package/BaseFeatureWidget/SequenceHelpDialog.js +51 -0
  11. package/BaseFeatureWidget/SequencePanel.d.ts +10 -0
  12. package/BaseFeatureWidget/SequencePanel.js +72 -0
  13. package/BaseFeatureWidget/index.d.ts +7 -0
  14. package/BaseFeatureWidget/index.js +21 -5
  15. package/BaseFeatureWidget/test_data/DLGAP3.d.ts +80 -0
  16. package/BaseFeatureWidget/test_data/DLGAP3.js +585 -0
  17. package/BaseFeatureWidget/test_data/NCDN.d.ts +141 -0
  18. package/BaseFeatureWidget/test_data/NCDN.js +1118 -0
  19. package/BaseFeatureWidget/types.d.ts +2 -2
  20. package/BaseFeatureWidget/util.d.ts +13 -2
  21. package/BaseFeatureWidget/util.js +13 -1
  22. package/PluginLoader.d.ts +29 -13
  23. package/PluginLoader.js +47 -77
  24. package/PluginManager.d.ts +4 -3
  25. package/PluginManager.js +16 -8
  26. package/assemblyManager/assembly.d.ts +8 -15
  27. package/assemblyManager/assembly.js +14 -17
  28. package/assemblyManager/assemblyManager.d.ts +37 -86
  29. package/assemblyManager/assemblyManager.js +2 -1
  30. package/configuration/configurationSlot.js +2 -1
  31. package/data_adapters/CytobandAdapter.js +1 -1
  32. package/package.json +3 -3
  33. package/pluggableElementTypes/ViewType.d.ts +2 -0
  34. package/pluggableElementTypes/ViewType.js +1 -0
  35. package/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +7 -5
  36. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +3 -2
  37. package/pluggableElementTypes/models/BaseDisplayModel.d.ts +1 -1
  38. package/pluggableElementTypes/models/BaseDisplayModel.js +3 -2
  39. package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -1
  40. package/pluggableElementTypes/models/BaseTrackModel.js +1 -1
  41. package/pluggableElementTypes/models/baseTrackConfig.js +16 -4
  42. package/rpc/RpcManager.d.ts +1 -1
  43. package/rpc/RpcManager.js +4 -1
  44. package/rpc/WebWorkerRpcDriver.d.ts +2 -0
  45. package/rpc/WebWorkerRpcDriver.js +21 -11
  46. package/rpc/configSchema.js +4 -1
  47. package/tsconfig.build.tsbuildinfo +1 -1
  48. package/ui/AboutDialog.d.ts +6 -0
  49. package/ui/AboutDialog.js +42 -20
  50. package/ui/App.d.ts +1 -1
  51. package/ui/App.js +49 -42
  52. package/ui/DrawerWidget.js +11 -6
  53. package/ui/FatalErrorDialog.d.ts +6 -22
  54. package/ui/FatalErrorDialog.js +10 -29
  55. package/ui/theme.d.ts +18 -171
  56. package/ui/theme.js +17 -20
  57. package/util/calculateStaticBlocks.js +3 -8
  58. package/util/index.d.ts +5 -1
  59. package/util/index.js +34 -11
  60. package/util/simpleFeature.d.ts +1 -2
  61. package/util/stats.js +7 -5
  62. package/util/tracks.d.ts +5 -2
  63. package/util/tracks.js +15 -5
  64. package/util/types/index.d.ts +1 -1
  65. package/util/types/index.js +3 -1
@@ -0,0 +1,51 @@
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 material_1 = require("@mui/material");
8
+ const mui_1 = require("tss-react/mui");
9
+ // icons
10
+ const Close_1 = __importDefault(require("@mui/icons-material/Close"));
11
+ const Settings_1 = __importDefault(require("@mui/icons-material/Settings"));
12
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
13
+ closeButton: {
14
+ position: 'absolute',
15
+ right: theme.spacing(1),
16
+ top: theme.spacing(1),
17
+ color: theme.palette.grey[500],
18
+ },
19
+ dialogContent: {},
20
+ }));
21
+ function HelpDialog({ handleClose, }) {
22
+ const { classes } = useStyles();
23
+ return (react_1.default.createElement(material_1.Dialog, { maxWidth: "xl", open: true, onClose: () => handleClose() },
24
+ react_1.default.createElement(material_1.DialogTitle, null,
25
+ "Feature sequence panel",
26
+ handleClose ? (react_1.default.createElement(material_1.IconButton, { className: classes.closeButton, onClick: () => handleClose() },
27
+ react_1.default.createElement(Close_1.default, null))) : null),
28
+ react_1.default.createElement(material_1.Divider, null),
29
+ react_1.default.createElement(material_1.DialogContent, { className: classes.dialogContent },
30
+ react_1.default.createElement(material_1.Typography, { paragraph: true }, "The \"Feature sequence\" panel shows the underlying genomic sequence for a given feature, fetched from the reference genome."),
31
+ react_1.default.createElement(material_1.Typography, null, "For gene features, this panel does special calculations to e.g. stitch together the coding sequence, the options are:"),
32
+ react_1.default.createElement("ul", null,
33
+ react_1.default.createElement("li", null, "CDS - shows the stitched together CDS sequences"),
34
+ react_1.default.createElement("li", null, "Protein - the translated coding sequence, with the \"standard\" genetic code"),
35
+ react_1.default.createElement("li", null, "cDNA - shows the UTRs and stitched together CDS sequences"),
36
+ react_1.default.createElement("li", null, "Gene w/ introns - the sequence underlying the entire gene including including introns, with UTR and CDS highlighted"),
37
+ react_1.default.createElement("li", null, "Gene w/ Nbp introns - same \"Gene w/ introns\", but limiting to a subset of the intron sequence displayed"),
38
+ react_1.default.createElement("li", null, "Gene +/- Nbp up+down stream - same as \"Gene w/ introns\" but with up and downstream sequence displayed"),
39
+ 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")),
40
+ react_1.default.createElement(material_1.Typography, { paragraph: true }, "For other feature types, the options are:"),
41
+ react_1.default.createElement("ul", null,
42
+ react_1.default.createElement("li", null, "Feature sequence - the reference genome sequence underlying the feature"),
43
+ 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")),
44
+ react_1.default.createElement(material_1.Typography, null,
45
+ "Note: you can use the \"gear icon\" ",
46
+ react_1.default.createElement(Settings_1.default, null),
47
+ " to edit the number of bp displayed up/downstream and in the intron region")),
48
+ react_1.default.createElement(material_1.DialogActions, null,
49
+ react_1.default.createElement(material_1.Button, { onClick: () => handleClose(), autoFocus: true, variant: "contained" }, "Close"))));
50
+ }
51
+ exports.default = HelpDialog;
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { ParentFeat, SeqState } from './util';
3
+ interface SequencePanelProps {
4
+ sequence: SeqState;
5
+ feature: ParentFeat;
6
+ mode: string;
7
+ intronBp?: number;
8
+ }
9
+ declare const SequencePanel: React.ForwardRefExoticComponent<SequencePanelProps & React.RefAttributes<HTMLDivElement>>;
10
+ export default SequencePanel;
@@ -0,0 +1,72 @@
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
+ const SequenceBox_1 = require("./SequenceBox");
10
+ const SequencePanel = react_1.default.forwardRef((props, ref) => {
11
+ const { feature, mode, intronBp = 10 } = props;
12
+ let { sequence: { seq, upstream = '', downstream = '' }, } = props;
13
+ const { subfeatures = [] } = feature;
14
+ const children = subfeatures
15
+ .sort((a, b) => a.start - b.start)
16
+ .map(sub => ({
17
+ ...sub,
18
+ start: sub.start - feature.start,
19
+ end: sub.end - feature.start,
20
+ }));
21
+ // we filter duplicate entries in cds and exon lists duplicate entries may be
22
+ // rare but was seen in Gencode v36 track NCList, likely a bug on GFF3 or
23
+ // probably worth ignoring here (produces broken protein translations if
24
+ // included)
25
+ //
26
+ // position 1:224,800,006..225,203,064 gene ENSG00000185842.15 first
27
+ // transcript ENST00000445597.6
28
+ //
29
+ // http://localhost:3000/?config=test_data%2Fconfig.json&session=share-FUl7G1isvF&password=HXh5Y
30
+ let cds = (0, util_2.dedupe)(children.filter(sub => sub.type === 'CDS'));
31
+ let utr = (0, util_2.dedupe)(children.filter(sub => sub.type.match(/utr/i)));
32
+ let exons = (0, util_2.dedupe)(children.filter(sub => sub.type === 'exon'));
33
+ if (!utr.length && cds.length && exons.length) {
34
+ utr = (0, util_2.calculateUTRs)(cds, exons);
35
+ }
36
+ if (!utr.length && cds.length && !exons.length) {
37
+ utr = (0, util_2.calculateUTRs2)(cds, {
38
+ start: 0,
39
+ end: feature.end - feature.start,
40
+ type: 'gene',
41
+ });
42
+ }
43
+ if (feature.strand === -1) {
44
+ // doing this in a single assignment is needed because downstream and
45
+ // upstream are swapped so this avoids a temp variable
46
+ ;
47
+ [seq, upstream, downstream] = [
48
+ (0, util_1.revcom)(seq),
49
+ (0, util_1.revcom)(downstream),
50
+ (0, util_1.revcom)(upstream),
51
+ ];
52
+ cds = (0, util_2.revlist)(cds, seq.length);
53
+ exons = (0, util_2.revlist)(exons, seq.length);
54
+ utr = (0, util_2.revlist)(utr, seq.length);
55
+ }
56
+ const codonTable = (0, util_1.generateCodonTable)(util_1.defaultCodonTable);
57
+ return (react_1.default.createElement("div", { ref: ref, "data-testid": "sequence_panel" },
58
+ react_1.default.createElement("div", { style: {
59
+ fontFamily: 'monospace',
60
+ wordWrap: 'break-word',
61
+ overflow: 'auto',
62
+ fontSize: 12,
63
+ maxWidth: 600,
64
+ maxHeight: 500,
65
+ } },
66
+ `>${feature.name ||
67
+ feature.id ||
68
+ feature.refName + ':' + (feature.start + 1) + '-' + feature.end}-${mode}\n`,
69
+ react_1.default.createElement("br", null),
70
+ mode === 'genomic' ? (react_1.default.createElement(SequenceBox_1.Genomic, { sequence: seq })) : mode === 'genomic_sequence_updown' ? (react_1.default.createElement(SequenceBox_1.Genomic, { sequence: seq, upstream: upstream, downstream: downstream })) : mode === 'cds' ? (react_1.default.createElement(SequenceBox_1.GeneCDS, { cds: cds, sequence: seq })) : mode === 'cdna' ? (react_1.default.createElement(SequenceBox_1.GenecDNA, { exons: exons, cds: cds, utr: utr, sequence: seq, intronBp: intronBp })) : mode === 'protein' ? (react_1.default.createElement(SequenceBox_1.GeneProtein, { cds: cds, codonTable: codonTable, sequence: seq })) : mode === 'gene' ? (react_1.default.createElement(SequenceBox_1.GenecDNA, { exons: exons, cds: cds, utr: utr, sequence: seq, includeIntrons: true, intronBp: intronBp })) : mode === 'gene_collapsed_intron' ? (react_1.default.createElement(SequenceBox_1.GenecDNA, { exons: exons, cds: cds, sequence: seq, utr: utr, includeIntrons: true, collapseIntron: true, intronBp: intronBp })) : mode === 'gene_updownstream' ? (react_1.default.createElement(SequenceBox_1.GenecDNA, { 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(SequenceBox_1.GenecDNA, { 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")))));
71
+ });
72
+ exports.default = SequencePanel;
@@ -8,10 +8,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
8
8
  unformattedFeatureData: import("mobx-state-tree").IType<any, any, any>;
9
9
  view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
10
10
  track: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
11
+ trackId: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
12
+ trackType: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
11
13
  }, {
12
14
  setFeatureData(featureData: Record<string, unknown>): void;
13
15
  clearFeatureData(): void;
14
16
  setFormattedData(feat: Record<string, unknown>): void;
17
+ setExtra(type?: string, trackId?: string): void;
15
18
  } & {
16
19
  afterCreate(): void;
17
20
  }, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
@@ -22,11 +25,15 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
22
25
  unformattedFeatureData: import("mobx-state-tree").IType<any, any, any>;
23
26
  view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
24
27
  track: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
28
+ trackId: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
29
+ trackType: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
25
30
  }>>, {
26
31
  id: string;
27
32
  type: "BaseFeatureWidget";
28
33
  track: import("mobx-state-tree").ReferenceIdentifier | undefined;
29
34
  view: import("mobx-state-tree").ReferenceIdentifier | undefined;
35
+ trackId: string | undefined;
36
+ trackType: string | undefined;
30
37
  formattedFields: any;
31
38
  finalizedFeatureData: any;
32
39
  }>;
@@ -6,8 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.stateModelFactory = exports.configSchema = void 0;
7
7
  const mobx_state_tree_1 = require("mobx-state-tree");
8
8
  const mobx_1 = require("mobx");
9
- const configuration_1 = require("../configuration");
10
9
  const clone_1 = __importDefault(require("clone"));
10
+ const configuration_1 = require("../configuration");
11
+ const util_1 = require("../util");
11
12
  const mst_1 = require("../util/types/mst");
12
13
  const configSchema = (0, configuration_1.ConfigurationSchema)('BaseFeatureWidget', {});
13
14
  exports.configSchema = configSchema;
@@ -32,8 +33,9 @@ function stateModelFactory(pluginManager) {
32
33
  unformattedFeatureData: mobx_state_tree_1.types.frozen(),
33
34
  view: mobx_state_tree_1.types.safeReference(pluginManager.pluggableMstType('view', 'stateModel')),
34
35
  track: mobx_state_tree_1.types.safeReference(pluginManager.pluggableMstType('track', 'stateModel')),
36
+ trackId: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
37
+ trackType: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
35
38
  })
36
- .volatile(() => ({}))
37
39
  .actions(self => ({
38
40
  setFeatureData(featureData) {
39
41
  self.unformattedFeatureData = featureData;
@@ -44,20 +46,34 @@ function stateModelFactory(pluginManager) {
44
46
  setFormattedData(feat) {
45
47
  self.featureData = feat;
46
48
  },
49
+ setExtra(type, trackId) {
50
+ self.trackId = trackId;
51
+ self.trackType = type;
52
+ },
47
53
  }))
48
54
  .actions(self => ({
49
55
  afterCreate() {
50
56
  (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(() => {
57
+ var _a, _b;
58
+ 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);
51
59
  const { unformattedFeatureData, track } = self;
60
+ const session = (0, util_1.getSession)(self);
52
61
  if (unformattedFeatureData) {
53
62
  const feature = (0, clone_1.default)(unformattedFeatureData);
63
+ const f = (obj, arg2) => (0, configuration_1.getConf)(obj, ['formatDetails', arg2], { feature });
54
64
  if (track) {
55
65
  // eslint-disable-next-line no-underscore-dangle
56
- feature.__jbrowsefmt = (0, configuration_1.getConf)(track, ['formatDetails', 'feature'], { feature });
66
+ feature.__jbrowsefmt = {
67
+ ...f(session, 'feature'),
68
+ ...f(track, 'feature'),
69
+ };
57
70
  const depth = (0, configuration_1.getConf)(track, ['formatDetails', 'depth']);
58
- formatSubfeatures(feature, depth, subfeature => {
71
+ formatSubfeatures(feature, depth, sub => {
59
72
  // eslint-disable-next-line no-underscore-dangle
60
- subfeature.__jbrowsefmt = (0, configuration_1.getConf)(track, ['formatDetails', 'subfeatures'], { feature: subfeature });
73
+ sub.__jbrowsefmt = {
74
+ ...f(session, 'subfeature'),
75
+ ...f(track, 'subfeature'),
76
+ };
61
77
  });
62
78
  }
63
79
  self.setFormattedData(feature);
@@ -0,0 +1,80 @@
1
+ declare namespace _default {
2
+ const source: string;
3
+ const type: string;
4
+ const start: number;
5
+ const end: number;
6
+ const strand: number;
7
+ const phase: number;
8
+ const refName: string;
9
+ const id: string;
10
+ const dbxref: string[];
11
+ const name: string;
12
+ const description: string;
13
+ const gbkey: string;
14
+ const gene: string;
15
+ const gene_biotype: string;
16
+ const gene_synonym: string[];
17
+ const subfeatures: {
18
+ source: string;
19
+ type: string;
20
+ start: number;
21
+ end: number;
22
+ strand: number;
23
+ phase: number;
24
+ refName: string;
25
+ id: string;
26
+ parent: string;
27
+ dbxref: string[];
28
+ name: string;
29
+ gbkey: string;
30
+ gene: string;
31
+ product: string;
32
+ tag: string;
33
+ transcript_id: string;
34
+ subfeatures: ({
35
+ source: string;
36
+ type: string;
37
+ start: number;
38
+ end: number;
39
+ strand: number;
40
+ phase: number;
41
+ refName: string;
42
+ parent: string;
43
+ dbxref: string[];
44
+ gbkey: string;
45
+ gene: string;
46
+ product: string;
47
+ tag: string;
48
+ transcript_id: string;
49
+ uniqueId: string;
50
+ parentId: string;
51
+ id?: undefined;
52
+ name?: undefined;
53
+ protein_id?: undefined;
54
+ } | {
55
+ source: string;
56
+ type: string;
57
+ start: number;
58
+ end: number;
59
+ strand: number;
60
+ phase: number;
61
+ refName: string;
62
+ id: string;
63
+ parent: string;
64
+ dbxref: string[];
65
+ name: string;
66
+ gbkey: string;
67
+ gene: string;
68
+ product: string;
69
+ protein_id: string;
70
+ tag: string;
71
+ uniqueId: string;
72
+ parentId: string;
73
+ transcript_id?: undefined;
74
+ })[];
75
+ uniqueId: string;
76
+ parentId: string;
77
+ }[];
78
+ const uniqueId: string;
79
+ }
80
+ export default _default;