@jbrowse/core 2.16.0 → 2.17.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.
Files changed (38) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail/BaseCard.d.ts +3 -0
  2. package/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +27 -0
  3. package/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +3 -0
  4. package/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +33 -0
  5. package/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +11 -0
  6. package/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +66 -0
  7. package/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +3 -0
  8. package/BaseFeatureWidget/BaseFeatureDetail/Position.js +20 -0
  9. package/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +2 -12
  10. package/BaseFeatureWidget/BaseFeatureDetail/index.js +24 -124
  11. package/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +21 -0
  12. package/BaseFeatureWidget/SequenceFeatureDetails/model.js +39 -9
  13. package/BaseFeatureWidget/stateModelFactory.d.ts +4 -1
  14. package/BaseFeatureWidget/stateModelFactory.js +5 -1
  15. package/BaseFeatureWidget/util.d.ts +1 -0
  16. package/BaseFeatureWidget/util.js +4 -0
  17. package/ReExports/modules.js +3 -3
  18. package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +5 -0
  19. package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +10 -0
  20. package/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +2 -1
  21. package/data_adapters/CytobandAdapter/CytobandAdapter.js +10 -10
  22. package/package.json +3 -3
  23. package/tsconfig.build.tsbuildinfo +1 -1
  24. package/ui/AssemblySelector.js +5 -2
  25. package/ui/FileSelector/UrlChooser.js +3 -1
  26. package/ui/SanitizedHTML.js +4 -1
  27. package/ui/theme.js +28 -48
  28. package/util/index.d.ts +13 -13
  29. package/util/index.js +74 -53
  30. package/util/simpleFeature.d.ts +0 -8
  31. package/util/stats.d.ts +1 -8
  32. package/util/stats.js +0 -35
  33. package/ReExports/Attributes.d.ts +0 -1
  34. package/ReExports/Attributes.js +0 -6
  35. package/ReExports/BaseCard.d.ts +0 -1
  36. package/ReExports/BaseCard.js +0 -6
  37. package/ReExports/FeatureDetails.d.ts +0 -1
  38. package/ReExports/FeatureDetails.js +0 -6
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { BaseCardProps } from '../types';
3
+ export default function BaseCard({ children, title, defaultExpanded, }: BaseCardProps): React.JSX.Element;
@@ -0,0 +1,27 @@
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
+ exports.default = BaseCard;
7
+ const react_1 = __importDefault(require("react"));
8
+ const material_1 = require("@mui/material");
9
+ const mui_1 = require("tss-react/mui");
10
+ // icons
11
+ const ExpandMore_1 = __importDefault(require("@mui/icons-material/ExpandMore"));
12
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
13
+ expansionPanelDetails: {
14
+ display: 'block',
15
+ padding: theme.spacing(1),
16
+ },
17
+ icon: {
18
+ color: theme.palette.tertiary.contrastText || '#fff',
19
+ },
20
+ }));
21
+ function BaseCard({ children, title, defaultExpanded = true, }) {
22
+ const { classes } = useStyles();
23
+ return (react_1.default.createElement(material_1.Accordion, { defaultExpanded: defaultExpanded },
24
+ react_1.default.createElement(material_1.AccordionSummary, { expandIcon: react_1.default.createElement(ExpandMore_1.default, { className: classes.icon }) },
25
+ react_1.default.createElement(material_1.Typography, { variant: "button" }, title)),
26
+ react_1.default.createElement(material_1.AccordionDetails, { className: classes.expansionPanelDetails }, children)));
27
+ }
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { BaseProps } from '../types';
3
+ export default function CoreDetails(props: BaseProps): React.JSX.Element;
@@ -0,0 +1,33 @@
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
+ exports.default = CoreDetails;
7
+ const react_1 = __importDefault(require("react"));
8
+ // locals
9
+ const util_1 = require("../../util");
10
+ const SimpleField_1 = __importDefault(require("./SimpleField"));
11
+ const Position_1 = __importDefault(require("./Position"));
12
+ function CoreDetails(props) {
13
+ const { feature } = props;
14
+ const obj = feature;
15
+ const formattedFeat = { ...obj, ...obj.__jbrowsefmt };
16
+ const { start, end } = formattedFeat;
17
+ const displayedDetails = {
18
+ ...formattedFeat,
19
+ length: (0, util_1.toLocale)(end - start),
20
+ };
21
+ const coreRenderedDetails = {
22
+ description: 'Description',
23
+ name: 'Name',
24
+ length: 'Length',
25
+ type: 'Type',
26
+ };
27
+ return (react_1.default.createElement(react_1.default.Fragment, null,
28
+ react_1.default.createElement(SimpleField_1.default, { name: "Position", value: react_1.default.createElement(Position_1.default, { ...props, feature: formattedFeat }) }),
29
+ Object.entries(coreRenderedDetails)
30
+ .map(([key, name]) => [name, displayedDetails[key]])
31
+ .filter(([, value]) => value != null)
32
+ .map(([name, value]) => (react_1.default.createElement(SimpleField_1.default, { key: name, name: name, value: value })))));
33
+ }
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { IAnyStateTreeNode } from 'mobx-state-tree';
3
+ import { SimpleFeatureSerialized } from '../../util';
4
+ export default function FeatureDetails(props: {
5
+ model: IAnyStateTreeNode;
6
+ feature: SimpleFeatureSerialized;
7
+ depth?: number;
8
+ omit?: string[];
9
+ descriptions?: Record<string, React.ReactNode>;
10
+ formatter?: (val: unknown, key: string) => React.ReactNode;
11
+ }): React.JSX.Element;
@@ -0,0 +1,66 @@
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
+ exports.default = FeatureDetails;
7
+ const react_1 = __importDefault(require("react"));
8
+ const ErrorBoundary_1 = require("@jbrowse/core/ui/ErrorBoundary");
9
+ const material_1 = require("@mui/material");
10
+ // locals
11
+ const util_1 = require("../../util");
12
+ const ui_1 = require("../../ui");
13
+ const util_2 = require("./util");
14
+ const SequenceFeatureDetails_1 = __importDefault(require("../SequenceFeatureDetails"));
15
+ const Attributes_1 = __importDefault(require("./Attributes"));
16
+ const BaseCard_1 = __importDefault(require("./BaseCard"));
17
+ const CoreDetails_1 = __importDefault(require("./CoreDetails"));
18
+ // coreDetails are omitted in some circumstances
19
+ const coreDetails = [
20
+ 'name',
21
+ 'start',
22
+ 'end',
23
+ 'strand',
24
+ 'refName',
25
+ 'description',
26
+ 'type',
27
+ ];
28
+ function FeatureDetails(props) {
29
+ const { omit = [], model, feature, depth = 0 } = props;
30
+ const { maxDepth } = model;
31
+ const { mate, name = '', id = '', type = '', subfeatures, uniqueId } = feature;
32
+ const pm = (0, util_1.getEnv)(model).pluginManager;
33
+ const session = (0, util_1.getSession)(model);
34
+ const ExtraPanel = pm.evaluateExtensionPoint('Core-extraFeaturePanel', null, {
35
+ session,
36
+ feature,
37
+ model,
38
+ });
39
+ const m = mate;
40
+ return (react_1.default.createElement(BaseCard_1.default, { title: (0, util_2.generateTitle)(name, id, type) },
41
+ react_1.default.createElement(material_1.Typography, null, "Core details"),
42
+ react_1.default.createElement(CoreDetails_1.default, { ...props }),
43
+ m ? (react_1.default.createElement(react_1.default.Fragment, null,
44
+ react_1.default.createElement(material_1.Divider, null),
45
+ react_1.default.createElement(material_1.Typography, null, "Mate details"),
46
+ react_1.default.createElement(CoreDetails_1.default, { ...props, feature: {
47
+ ...m,
48
+ start: m.start,
49
+ end: m.end,
50
+ refName: m.refName,
51
+ uniqueId: `${uniqueId}-mate`,
52
+ } }))) : null,
53
+ react_1.default.createElement(material_1.Divider, null),
54
+ react_1.default.createElement(material_1.Typography, null, "Attributes"),
55
+ react_1.default.createElement(Attributes_1.default, { attributes: feature, ...props, omit: omit, omitSingleLevel: coreDetails }),
56
+ react_1.default.createElement(ErrorBoundary_1.ErrorBoundary, { FallbackComponent: e => react_1.default.createElement(ui_1.ErrorMessage, { error: e.error }) },
57
+ react_1.default.createElement(SequenceFeatureDetails_1.default, { ...props })),
58
+ ExtraPanel ? (react_1.default.createElement(react_1.default.Fragment, null,
59
+ react_1.default.createElement(material_1.Divider, null),
60
+ react_1.default.createElement(BaseCard_1.default, { title: ExtraPanel.name },
61
+ react_1.default.createElement(ExtraPanel.Component, { ...props })))) : null,
62
+ depth < maxDepth && (subfeatures === null || subfeatures === void 0 ? void 0 : subfeatures.length) ? (react_1.default.createElement(BaseCard_1.default, { title: "Subfeatures", defaultExpanded: depth < 1 }, subfeatures.map((sub, idx) => (react_1.default.createElement(FeatureDetails, { key: JSON.stringify(sub), feature: {
63
+ ...sub,
64
+ uniqueId: `${uniqueId}_${idx}`,
65
+ }, model: model, depth: depth + 1 }))))) : null));
66
+ }
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { BaseProps } from '../types';
3
+ export default function Position(props: BaseProps): React.JSX.Element;
@@ -0,0 +1,20 @@
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
+ exports.default = Position;
7
+ const react_1 = __importDefault(require("react"));
8
+ const util_1 = require("../../util");
9
+ function Position(props) {
10
+ const { feature } = props;
11
+ const strand = feature.strand;
12
+ const strandMap = {
13
+ '-1': '-',
14
+ '0': '',
15
+ '1': '+',
16
+ };
17
+ const str = strandMap[strand] ? `(${strandMap[strand]})` : '';
18
+ const loc = (0, util_1.assembleLocString)(feature);
19
+ return react_1.default.createElement(react_1.default.Fragment, null, `${loc} ${str}`);
20
+ }
@@ -1,8 +1,5 @@
1
1
  import React from 'react';
2
- import { IAnyStateTreeNode } from 'mobx-state-tree';
3
- import { SimpleFeatureSerialized } from '../../util';
4
2
  import { BaseCardProps, BaseProps } from '../types';
5
- export declare function BaseCard({ children, title, defaultExpanded, }: BaseCardProps): React.JSX.Element;
6
3
  export declare const BaseCoreDetails: (props: BaseProps) => React.JSX.Element;
7
4
  export declare const BaseAttributes: (props: BaseProps) => React.JSX.Element;
8
5
  export interface BaseInputProps extends BaseCardProps {
@@ -11,14 +8,7 @@ export interface BaseInputProps extends BaseCardProps {
11
8
  descriptions?: Record<string, React.ReactNode>;
12
9
  formatter?: (val: unknown, key: string) => React.ReactNode;
13
10
  }
14
- export declare function FeatureDetails(props: {
15
- model: IAnyStateTreeNode;
16
- feature: SimpleFeatureSerialized;
17
- depth?: number;
18
- omit?: string[];
19
- descriptions?: Record<string, React.ReactNode>;
20
- formatter?: (val: unknown, key: string) => React.ReactNode;
21
- }): React.JSX.Element;
22
11
  declare const BaseFeatureDetail: ({ model }: BaseInputProps) => React.JSX.Element | null;
23
12
  export default BaseFeatureDetail;
24
- export { default as Attributes } from './Attributes';
13
+ export { default as BaseCard } from './BaseCard';
14
+ export { default as FeatureDetails } from './FeatureDetails';
@@ -3,149 +3,49 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Attributes = exports.BaseAttributes = exports.BaseCoreDetails = void 0;
7
- exports.BaseCard = BaseCard;
8
- exports.FeatureDetails = FeatureDetails;
6
+ exports.FeatureDetails = exports.BaseCard = exports.BaseAttributes = exports.BaseCoreDetails = void 0;
9
7
  const react_1 = __importDefault(require("react"));
10
- const ErrorBoundary_1 = require("@jbrowse/core/ui/ErrorBoundary");
11
- const material_1 = require("@mui/material");
12
- const mui_1 = require("tss-react/mui");
13
8
  const mobx_react_1 = require("mobx-react");
14
- // icons
15
- const ExpandMore_1 = __importDefault(require("@mui/icons-material/ExpandMore"));
16
- // locals
17
- const util_1 = require("../../util");
9
+ // utils
18
10
  const ui_1 = require("../../ui");
19
- const SequenceFeatureDetails_1 = __importDefault(require("../SequenceFeatureDetails"));
20
- const SimpleField_1 = __importDefault(require("./SimpleField"));
11
+ const util_1 = require("./util");
12
+ const util_2 = require("../util");
13
+ // locals
21
14
  const Attributes_1 = __importDefault(require("./Attributes"));
22
- const util_2 = require("./util");
23
- // coreDetails are omitted in some circumstances
24
- const coreDetails = [
25
- 'name',
26
- 'start',
27
- 'end',
28
- 'strand',
29
- 'refName',
30
- 'description',
31
- 'type',
32
- ];
33
- const useStyles = (0, mui_1.makeStyles)()(theme => ({
34
- expansionPanelDetails: {
35
- display: 'block',
36
- padding: theme.spacing(1),
37
- },
38
- icon: {
39
- color: theme.palette.tertiary.contrastText || '#fff',
40
- },
41
- }));
42
- function BaseCard({ children, title, defaultExpanded = true, }) {
43
- const { classes } = useStyles();
44
- return (react_1.default.createElement(material_1.Accordion, { defaultExpanded: defaultExpanded },
45
- react_1.default.createElement(material_1.AccordionSummary, { expandIcon: react_1.default.createElement(ExpandMore_1.default, { className: classes.icon }) },
46
- react_1.default.createElement(material_1.Typography, { variant: "button" }, title)),
47
- react_1.default.createElement(material_1.AccordionDetails, { className: classes.expansionPanelDetails }, children)));
48
- }
49
- function Position(props) {
50
- const { feature } = props;
51
- const strand = feature.strand;
52
- const strandMap = {
53
- '-1': '-',
54
- '0': '',
55
- '1': '+',
56
- };
57
- const str = strandMap[strand] ? `(${strandMap[strand]})` : '';
58
- const loc = (0, util_1.assembleLocString)(feature);
59
- return react_1.default.createElement(react_1.default.Fragment, null, `${loc} ${str}`);
60
- }
61
- function CoreDetails(props) {
62
- const { feature } = props;
63
- const obj = feature;
64
- const formattedFeat = { ...obj, ...obj.__jbrowsefmt };
65
- const { start, end } = formattedFeat;
66
- const displayedDetails = {
67
- ...formattedFeat,
68
- length: (0, util_1.toLocale)(end - start),
69
- };
70
- const coreRenderedDetails = {
71
- description: 'Description',
72
- name: 'Name',
73
- length: 'Length',
74
- type: 'Type',
75
- };
76
- return (react_1.default.createElement(react_1.default.Fragment, null,
77
- react_1.default.createElement(SimpleField_1.default, { name: "Position", value: react_1.default.createElement(Position, { ...props, feature: formattedFeat }) }),
78
- Object.entries(coreRenderedDetails)
79
- .map(([key, name]) => [name, displayedDetails[key]])
80
- .filter(([, value]) => value != null)
81
- .map(([name, value]) => (react_1.default.createElement(SimpleField_1.default, { key: name, name: name, value: value })))));
82
- }
15
+ const BaseCard_1 = __importDefault(require("./BaseCard"));
16
+ const CoreDetails_1 = __importDefault(require("./CoreDetails"));
17
+ const FeatureDetails_1 = __importDefault(require("./FeatureDetails"));
83
18
  const BaseCoreDetails = (props) => {
84
19
  const { title = 'Primary data' } = props;
85
- return (react_1.default.createElement(BaseCard, { ...props, title: title },
86
- react_1.default.createElement(CoreDetails, { ...props })));
20
+ return (react_1.default.createElement(BaseCard_1.default, { ...props, title: title },
21
+ react_1.default.createElement(CoreDetails_1.default, { ...props })));
87
22
  };
88
23
  exports.BaseCoreDetails = BaseCoreDetails;
89
24
  const BaseAttributes = (props) => {
90
25
  const { feature } = props;
91
- return (react_1.default.createElement(BaseCard, { ...props, title: "Attributes" },
26
+ return (react_1.default.createElement(BaseCard_1.default, { ...props, title: "Attributes" },
92
27
  react_1.default.createElement(Attributes_1.default, { ...props, attributes: feature })));
93
28
  };
94
29
  exports.BaseAttributes = BaseAttributes;
95
- function FeatureDetails(props) {
96
- const { omit = [], model, feature, depth = 0 } = props;
97
- const { maxDepth } = model;
98
- const { mate, name = '', id = '', type = '', subfeatures, uniqueId } = feature;
99
- const pm = (0, util_1.getEnv)(model).pluginManager;
100
- const session = (0, util_1.getSession)(model);
101
- const ExtraPanel = pm.evaluateExtensionPoint('Core-extraFeaturePanel', null, {
102
- session,
103
- feature,
104
- model,
105
- });
106
- const m = mate;
107
- return (react_1.default.createElement(BaseCard, { title: (0, util_2.generateTitle)(name, id, type) },
108
- react_1.default.createElement(material_1.Typography, null, "Core details"),
109
- react_1.default.createElement(CoreDetails, { ...props }),
110
- m ? (react_1.default.createElement(react_1.default.Fragment, null,
111
- react_1.default.createElement(material_1.Divider, null),
112
- react_1.default.createElement(material_1.Typography, null, "Mate details"),
113
- react_1.default.createElement(CoreDetails, { ...props, feature: {
114
- ...m,
115
- start: m.start,
116
- end: m.end,
117
- refName: m.refName,
118
- uniqueId: `${uniqueId}-mate`,
119
- } }))) : null,
120
- react_1.default.createElement(material_1.Divider, null),
121
- react_1.default.createElement(material_1.Typography, null, "Attributes"),
122
- react_1.default.createElement(Attributes_1.default, { attributes: feature, ...props, omit: omit, omitSingleLevel: coreDetails }),
123
- react_1.default.createElement(ErrorBoundary_1.ErrorBoundary, { FallbackComponent: e => react_1.default.createElement(ui_1.ErrorMessage, { error: e.error }) },
124
- react_1.default.createElement(SequenceFeatureDetails_1.default, { ...props })),
125
- ExtraPanel ? (react_1.default.createElement(react_1.default.Fragment, null,
126
- react_1.default.createElement(material_1.Divider, null),
127
- react_1.default.createElement(BaseCard, { title: ExtraPanel.name },
128
- react_1.default.createElement(ExtraPanel.Component, { ...props })))) : null,
129
- depth < maxDepth && (subfeatures === null || subfeatures === void 0 ? void 0 : subfeatures.length) ? (react_1.default.createElement(BaseCard, { title: "Subfeatures", defaultExpanded: depth < 1 }, subfeatures.map((sub, idx) => (react_1.default.createElement(FeatureDetails, { key: JSON.stringify(sub), feature: {
130
- ...sub,
131
- uniqueId: `${uniqueId}_${idx}`,
132
- }, model: model, depth: depth + 1 }))))) : null));
133
- }
134
30
  const BaseFeatureDetail = (0, mobx_react_1.observer)(function ({ model }) {
135
31
  const { error, featureData } = model;
136
32
  if (error) {
137
33
  return react_1.default.createElement(ui_1.ErrorMessage, { error: error });
138
34
  }
139
- if (!featureData) {
35
+ else if (!featureData) {
140
36
  return null;
141
37
  }
142
- // replacing undefined with null helps with allowing fields to be hidden,
143
- // setting null is not allowed by jexl so we set it to undefined to hide. see
144
- // config guide. this replacement happens both here and when snapshotting the
145
- // featureData
146
- const g = JSON.parse(JSON.stringify(featureData, (_, v) => (v === undefined ? null : v)));
147
- return (0, util_2.isEmpty)(g) ? null : react_1.default.createElement(FeatureDetails, { model: model, feature: g });
38
+ else {
39
+ // replacing undefined with null helps with allowing fields to be hidden,
40
+ // setting null is not allowed by jexl so we set it to undefined to hide.
41
+ // see config guide. this replacement happens both here and when
42
+ // snapshotting the featureData
43
+ const featureData2 = (0, util_2.replaceUndefinedWithNull)(featureData);
44
+ return (0, util_1.isEmpty)(featureData2) ? null : (react_1.default.createElement(FeatureDetails_1.default, { model: model, feature: featureData2 }));
45
+ }
148
46
  });
149
47
  exports.default = BaseFeatureDetail;
150
- var Attributes_2 = require("./Attributes");
151
- Object.defineProperty(exports, "Attributes", { enumerable: true, get: function () { return __importDefault(Attributes_2).default; } });
48
+ var BaseCard_2 = require("./BaseCard");
49
+ Object.defineProperty(exports, "BaseCard", { enumerable: true, get: function () { return __importDefault(BaseCard_2).default; } });
50
+ var FeatureDetails_2 = require("./FeatureDetails");
51
+ Object.defineProperty(exports, "FeatureDetails", { enumerable: true, get: function () { return __importDefault(FeatureDetails_2).default; } });
@@ -1,12 +1,33 @@
1
1
  import { Instance } from 'mobx-state-tree';
2
2
  import { SimpleFeatureSerialized } from '../../util';
3
3
  export declare function SequenceFeatureDetailsF(): import("mobx-state-tree").IModelType<{}, {
4
+ /**
5
+ * #volatile
6
+ */
4
7
  showCoordinatesSetting: string;
8
+ /**
9
+ * #volatile
10
+ */
5
11
  intronBp: number;
12
+ /**
13
+ * #volatile
14
+ */
6
15
  upDownBp: number;
16
+ /**
17
+ * #volatile
18
+ */
7
19
  upperCaseCDS: boolean;
20
+ /**
21
+ * #volatile
22
+ */
8
23
  charactersPerRow: number;
24
+ /**
25
+ * #volatile
26
+ */
9
27
  feature: SimpleFeatureSerialized | undefined;
28
+ /**
29
+ * #volatile
30
+ */
10
31
  mode: string;
11
32
  } & {
12
33
  /**
@@ -9,17 +9,47 @@ function localStorageGetNumber(key, defaultVal) {
9
9
  var _a;
10
10
  return +((_a = (0, util_1.localStorageGetItem)(key)) !== null && _a !== void 0 ? _a : defaultVal);
11
11
  }
12
+ function localStorageGetBoolean(key, defaultVal) {
13
+ return Boolean(JSON.parse((0, util_1.localStorageGetItem)(key) || JSON.stringify(defaultVal)));
14
+ }
15
+ function localStorageSetNumber(key, value) {
16
+ (0, util_1.localStorageSetItem)(key, JSON.stringify(value));
17
+ }
18
+ function localStorageSetBoolean(key, value) {
19
+ (0, util_1.localStorageSetItem)(key, JSON.stringify(value));
20
+ }
21
+ const p = 'sequenceFeatureDetails';
12
22
  function SequenceFeatureDetailsF() {
13
23
  return mobx_state_tree_1.types
14
24
  .model('SequenceFeatureDetails')
15
25
  .volatile(() => ({
16
- showCoordinatesSetting: (0, util_1.localStorageGetItem)('sequenceFeatureDetails-showCoordinatesSetting') ||
17
- 'none',
18
- intronBp: localStorageGetNumber('sequenceFeatureDetails-intronBp', 10),
19
- upDownBp: localStorageGetNumber('sequenceFeatureDetails-upDownBp', 100),
20
- upperCaseCDS: Boolean(JSON.parse((0, util_1.localStorageGetItem)('sequenceFeatureDetails-upperCaseCDS') || 'true')),
26
+ /**
27
+ * #volatile
28
+ */
29
+ showCoordinatesSetting: (0, util_1.localStorageGetItem)(`${p}-showCoordinatesSetting`) || 'none',
30
+ /**
31
+ * #volatile
32
+ */
33
+ intronBp: localStorageGetNumber(`${p}-intronBp`, 10),
34
+ /**
35
+ * #volatile
36
+ */
37
+ upDownBp: localStorageGetNumber(`${p}-upDownBp`, 100),
38
+ /**
39
+ * #volatile
40
+ */
41
+ upperCaseCDS: localStorageGetBoolean(`${p}-upperCaseCDS`, true),
42
+ /**
43
+ * #volatile
44
+ */
21
45
  charactersPerRow: 100,
46
+ /**
47
+ * #volatile
48
+ */
22
49
  feature: undefined,
50
+ /**
51
+ * #volatile
52
+ */
23
53
  mode: '',
24
54
  }))
25
55
  .actions(self => ({
@@ -100,10 +130,10 @@ function SequenceFeatureDetailsF() {
100
130
  .actions(self => ({
101
131
  afterAttach() {
102
132
  (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(() => {
103
- (0, util_1.localStorageSetItem)('sequenceFeatureDetails-upDownBp', JSON.stringify(self.upDownBp));
104
- (0, util_1.localStorageSetItem)('sequenceFeatureDetails-intronBp', JSON.stringify(self.intronBp));
105
- (0, util_1.localStorageSetItem)('sequenceFeatureDetails-upperCaseCDS', JSON.stringify(self.upperCaseCDS));
106
- (0, util_1.localStorageSetItem)('sequenceFeatureDetails-showCoordinatesSetting', self.showCoordinatesSetting);
133
+ localStorageSetNumber(`${p}-upDownBp`, self.upDownBp);
134
+ localStorageSetNumber(`${p}-intronBp`, self.intronBp);
135
+ localStorageSetBoolean(`${p}-upperCaseCDS`, self.upperCaseCDS);
136
+ (0, util_1.localStorageSetItem)(`${p}-showCoordinatesSetting`, self.showCoordinatesSetting);
107
137
  }));
108
138
  (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(() => {
109
139
  self.setMode(self.hasCDS ? 'cds' : self.hasExon ? 'cdna' : 'genomic');
@@ -76,6 +76,9 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
76
76
  afterAttach(): void;
77
77
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>, [undefined]>;
78
78
  }, {
79
+ /**
80
+ * #volatile
81
+ */
79
82
  error: unknown;
80
83
  } & {
81
84
  /**
@@ -176,8 +179,8 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
176
179
  trackId: string | undefined;
177
180
  trackType: string | undefined;
178
181
  maxDepth: number | undefined;
179
- formattedFields: any;
180
182
  sequenceFeatureDetails: import("mobx-state-tree").ModelSnapshotType<{}>;
183
+ formattedFields: any;
181
184
  finalizedFeatureData: any;
182
185
  }>;
183
186
  export type BaseFeatureWidgetStateModel = ReturnType<typeof stateModelFactory>;
@@ -11,6 +11,7 @@ const configuration_1 = require("../configuration");
11
11
  const util_1 = require("../util");
12
12
  const mst_1 = require("../util/types/mst");
13
13
  const model_1 = require("./SequenceFeatureDetails/model");
14
+ const util_2 = require("./util");
14
15
  function formatSubfeatures(obj, depth, parse, currentDepth = 0, returnObj = {}) {
15
16
  var _a;
16
17
  if (depth <= currentDepth) {
@@ -77,6 +78,9 @@ function stateModelFactory(pluginManager) {
77
78
  sequenceFeatureDetails: mobx_state_tree_1.types.optional((0, model_1.SequenceFeatureDetailsF)(), {}),
78
79
  })
79
80
  .volatile(() => ({
81
+ /**
82
+ * #volatile
83
+ */
80
84
  error: undefined,
81
85
  }))
82
86
  .actions(self => ({
@@ -163,7 +167,7 @@ function stateModelFactory(pluginManager) {
163
167
  // hidden, setting null is not allowed by jexl so we set it to
164
168
  // undefined to hide. see config guide. this replacement happens both
165
169
  // here and when displaying the featureData in base feature widget
166
- finalizedFeatureData: JSON.parse(JSON.stringify(featureData, (_, v) => (v === undefined ? null : v))),
170
+ finalizedFeatureData: (0, util_2.replaceUndefinedWithNull)(featureData),
167
171
  ...rest,
168
172
  };
169
173
  });
@@ -42,3 +42,4 @@ export declare function calculateUTRs2(cds: Feat[], parentFeat: Feat): {
42
42
  end: number;
43
43
  }[];
44
44
  export declare function ellipses(slug: string): string;
45
+ export declare function replaceUndefinedWithNull(obj: Record<string, unknown>): any;
@@ -6,6 +6,7 @@ exports.revlist = revlist;
6
6
  exports.calculateUTRs = calculateUTRs;
7
7
  exports.calculateUTRs2 = calculateUTRs2;
8
8
  exports.ellipses = ellipses;
9
+ exports.replaceUndefinedWithNull = replaceUndefinedWithNull;
9
10
  function stitch(subfeats, sequence) {
10
11
  return subfeats.map(sub => sequence.slice(sub.start, sub.end)).join('');
11
12
  }
@@ -64,3 +65,6 @@ function calculateUTRs2(cds, parentFeat) {
64
65
  function ellipses(slug) {
65
66
  return slug.length > 20 ? `${slug.slice(0, 20)}...` : slug;
66
67
  }
68
+ function replaceUndefinedWithNull(obj) {
69
+ return JSON.parse(JSON.stringify(obj, (_, v) => (v === undefined ? null : v)));
70
+ }
@@ -191,9 +191,9 @@ const MuiPrefixMUI = Object.fromEntries(Object.entries(LazyMUICore).map(([key, v
191
191
  `@mui/material/${key}`,
192
192
  value,
193
193
  ]));
194
- const Attributes = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./Attributes'))));
195
- const FeatureDetails = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./FeatureDetails'))));
196
- const BaseCard = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./BaseCard'))));
194
+ const Attributes = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('../BaseFeatureWidget/BaseFeatureDetail/Attributes'))));
195
+ const FeatureDetails = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('../BaseFeatureWidget/BaseFeatureDetail/FeatureDetails'))));
196
+ const BaseCard = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('../BaseFeatureWidget/BaseFeatureDetail/BaseCard'))));
197
197
  const DataGridEntries = {
198
198
  DataGrid: (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('@mui/x-data-grid'))).then(module => ({ default: module.DataGrid }))),
199
199
  GridActionsCellItem: (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('@mui/x-data-grid'))).then(module => ({
@@ -125,4 +125,9 @@ export declare abstract class BaseFeatureDataAdapter extends BaseAdapter {
125
125
  * is)
126
126
  */
127
127
  getMultiRegionFeatureDensityStats(regions: Region[], opts?: BaseOptions): Promise<FeatureDensityStats>;
128
+ getSources(regions: Region[]): Promise<{
129
+ name: string;
130
+ color?: string;
131
+ [key: string]: unknown;
132
+ }[]>;
128
133
  }
@@ -170,5 +170,15 @@ class BaseFeatureDataAdapter extends BaseAdapter_1.BaseAdapter {
170
170
  }
171
171
  return this.getRegionFeatureDensityStats(regions[0], opts);
172
172
  }
173
+ async getSources(regions) {
174
+ const features = await (0, rxjs_1.firstValueFrom)(this.getFeaturesInMultipleRegions(regions).pipe((0, operators_1.toArray)()));
175
+ const sources = new Set();
176
+ for (const f of features) {
177
+ sources.add(f.get('source'));
178
+ }
179
+ return [...sources].map(source => ({
180
+ name: source,
181
+ }));
182
+ }
173
183
  }
174
184
  exports.BaseFeatureDataAdapter = BaseFeatureDataAdapter;
@@ -1,6 +1,7 @@
1
1
  import { SimpleFeature } from '../../util';
2
2
  import { BaseAdapter } from '../BaseAdapter';
3
+ import { BaseOptions } from '../BaseAdapter/BaseOptions';
3
4
  export default class CytobandAdapter extends BaseAdapter {
4
- getData(): Promise<SimpleFeature[]>;
5
+ getData(opts?: BaseOptions): Promise<SimpleFeature[]>;
5
6
  freeResources(): void;
6
7
  }
@@ -1,20 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const bgzf_filehandle_1 = require("@gmod/bgzf-filehandle");
4
3
  // locals
5
4
  const util_1 = require("../../util");
6
5
  const io_1 = require("../../util/io");
7
6
  const BaseAdapter_1 = require("../BaseAdapter");
8
7
  class CytobandAdapter extends BaseAdapter_1.BaseAdapter {
9
- async getData() {
10
- const pm = this.pluginManager;
11
- const loc = this.getConf('cytobandLocation');
12
- if (loc.uri === '' || loc.uri === '/path/to/cytoband.txt.gz') {
8
+ async getData(opts) {
9
+ const conf = this.getConf('cytobandLocation');
10
+ if (conf.uri === '' || conf.uri === '/path/to/cytoband.txt.gz') {
13
11
  return [];
14
12
  }
15
- const buffer = await (0, io_1.openLocation)(loc, pm).readFile();
16
- const buf = (0, util_1.isGzip)(buffer) ? await (0, bgzf_filehandle_1.unzip)(buffer) : buffer;
17
- const text = new TextDecoder('utf8', { fatal: true }).decode(buf);
13
+ const pm = this.pluginManager;
14
+ const buf = await (0, util_1.fetchAndMaybeUnzip)((0, io_1.openLocation)(conf, pm), opts);
15
+ const decoder = new TextDecoder('utf8', { fatal: true });
16
+ const text = decoder.decode(buf);
18
17
  return text
19
18
  .split(/\n|\r\n|\r/)
20
19
  .filter(f => !!f.trim())
@@ -25,8 +24,9 @@ class CytobandAdapter extends BaseAdapter_1.BaseAdapter {
25
24
  refName: refName,
26
25
  start: +start,
27
26
  end: +end,
28
- name: name,
29
- type: type,
27
+ name,
28
+ type,
29
+ gieStain: type || name,
30
30
  });
31
31
  });
32
32
  }