@jbrowse/core 2.15.4 → 2.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) 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 +3 -12
  10. package/BaseFeatureWidget/BaseFeatureDetail/index.js +22 -124
  11. package/BaseFeatureWidget/stateModelFactory.d.ts +3 -0
  12. package/BaseFeatureWidget/stateModelFactory.js +5 -1
  13. package/BaseFeatureWidget/util.d.ts +1 -0
  14. package/BaseFeatureWidget/util.js +4 -0
  15. package/PluginManager.d.ts +1 -0
  16. package/PluginManager.js +3 -0
  17. package/ReExports/modules.js +3 -3
  18. package/assemblyManager/assemblyManager.d.ts +0 -7
  19. package/assemblyManager/assemblyManager.js +8 -15
  20. package/package.json +2 -3
  21. package/pluggableElementTypes/ViewType.d.ts +6 -1
  22. package/pluggableElementTypes/ViewType.js +2 -0
  23. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.js +0 -3
  24. package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +0 -3
  25. package/rpc/BaseRpcDriver.js +4 -4
  26. package/tsconfig.build.tsbuildinfo +1 -1
  27. package/ui/Dialog.js +2 -2
  28. package/ui/ErrorBoundary.d.ts +16 -0
  29. package/ui/ErrorBoundary.js +41 -0
  30. package/util/index.js +2 -3
  31. package/ReExports/Attributes.d.ts +0 -1
  32. package/ReExports/Attributes.js +0 -6
  33. package/ReExports/BaseCard.d.ts +0 -1
  34. package/ReExports/BaseCard.js +0 -6
  35. package/ReExports/FeatureDetails.d.ts +0 -1
  36. 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,7 @@
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;
3
+ import BaseCard from './BaseCard';
4
+ import FeatureDetails from './FeatureDetails';
6
5
  export declare const BaseCoreDetails: (props: BaseProps) => React.JSX.Element;
7
6
  export declare const BaseAttributes: (props: BaseProps) => React.JSX.Element;
8
7
  export interface BaseInputProps extends BaseCardProps {
@@ -11,14 +10,6 @@ export interface BaseInputProps extends BaseCardProps {
11
10
  descriptions?: Record<string, React.ReactNode>;
12
11
  formatter?: (val: unknown, key: string) => React.ReactNode;
13
12
  }
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
13
  declare const BaseFeatureDetail: ({ model }: BaseInputProps) => React.JSX.Element | null;
23
14
  export default BaseFeatureDetail;
24
- export { default as Attributes } from './Attributes';
15
+ export { BaseCard, FeatureDetails };
@@ -3,149 +3,47 @@ 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 react_error_boundary_1 = require("react-error-boundary");
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
+ exports.BaseCard = BaseCard_1.default;
17
+ const CoreDetails_1 = __importDefault(require("./CoreDetails"));
18
+ const FeatureDetails_1 = __importDefault(require("./FeatureDetails"));
19
+ exports.FeatureDetails = FeatureDetails_1.default;
83
20
  const BaseCoreDetails = (props) => {
84
21
  const { title = 'Primary data' } = props;
85
- return (react_1.default.createElement(BaseCard, { ...props, title: title },
86
- react_1.default.createElement(CoreDetails, { ...props })));
22
+ return (react_1.default.createElement(BaseCard_1.default, { ...props, title: title },
23
+ react_1.default.createElement(CoreDetails_1.default, { ...props })));
87
24
  };
88
25
  exports.BaseCoreDetails = BaseCoreDetails;
89
26
  const BaseAttributes = (props) => {
90
27
  const { feature } = props;
91
- return (react_1.default.createElement(BaseCard, { ...props, title: "Attributes" },
28
+ return (react_1.default.createElement(BaseCard_1.default, { ...props, title: "Attributes" },
92
29
  react_1.default.createElement(Attributes_1.default, { ...props, attributes: feature })));
93
30
  };
94
31
  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(react_error_boundary_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
32
  const BaseFeatureDetail = (0, mobx_react_1.observer)(function ({ model }) {
135
33
  const { error, featureData } = model;
136
34
  if (error) {
137
35
  return react_1.default.createElement(ui_1.ErrorMessage, { error: error });
138
36
  }
139
- if (!featureData) {
37
+ else if (!featureData) {
140
38
  return null;
141
39
  }
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 });
40
+ else {
41
+ // replacing undefined with null helps with allowing fields to be hidden,
42
+ // setting null is not allowed by jexl so we set it to undefined to hide.
43
+ // see config guide. this replacement happens both here and when
44
+ // snapshotting the featureData
45
+ const featureData2 = (0, util_2.replaceUndefinedWithNull)(featureData);
46
+ return (0, util_1.isEmpty)(featureData2) ? null : (react_1.default.createElement(FeatureDetails_1.default, { model: model, feature: featureData2 }));
47
+ }
148
48
  });
149
49
  exports.default = BaseFeatureDetail;
150
- var Attributes_2 = require("./Attributes");
151
- Object.defineProperty(exports, "Attributes", { enumerable: true, get: function () { return __importDefault(Attributes_2).default; } });
@@ -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
  /**
@@ -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
+ }
@@ -106,6 +106,7 @@ export default class PluginManager {
106
106
  addElementType(groupName: PluggableElementTypeGroup, creationCallback: (pluginManager: PluginManager) => PluggableElementType): this;
107
107
  getElementType(groupName: PluggableElementTypeGroup, typeName: string): PluggableElementBase | undefined;
108
108
  getElementTypesInGroup(groupName: PluggableElementTypeGroup): PluggableElementBase[];
109
+ getViewElements(): ViewType[];
109
110
  getTrackElements(): TrackType[];
110
111
  getConnectionElements(): ConnectionType[];
111
112
  getAddTrackWorkflowElements(): AddTrackWorkflowType[];
package/PluginManager.js CHANGED
@@ -242,6 +242,9 @@ class PluginManager {
242
242
  getElementTypesInGroup(groupName) {
243
243
  return this.getElementTypeRecord(groupName).all();
244
244
  }
245
+ getViewElements() {
246
+ return this.getElementTypesInGroup('view');
247
+ }
245
248
  getTrackElements() {
246
249
  return this.getElementTypesInGroup('track');
247
250
  }
@@ -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 => ({
@@ -572,12 +572,5 @@ declare function assemblyManagerFactory(conf: IAnyType, pm: PluginManager): impo
572
572
  * used as a reference. snapshots cannot be used
573
573
  */
574
574
  addAssembly(configuration: any): void;
575
- /**
576
- * #action
577
- * private: you would generally want to add to manipulate
578
- * jbrowse.assemblies, session.sessionAssemblies, or
579
- * session.temporaryAssemblies instead of using this directly
580
- */
581
- replaceAssembly(idx: number, configuration: any): void;
582
575
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
583
576
  export default assemblyManagerFactory;
@@ -4,8 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const mobx_state_tree_1 = require("mobx-state-tree");
7
- const util_1 = require("../util");
8
7
  const mobx_1 = require("mobx");
8
+ // locals
9
+ const util_1 = require("../util");
9
10
  const configuration_1 = require("../configuration");
10
11
  const assembly_1 = __importDefault(require("./assembly"));
11
12
  /**
@@ -130,16 +131,17 @@ function assemblyManagerFactory(conf, pm) {
130
131
  .actions(self => ({
131
132
  afterAttach() {
132
133
  (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.reaction)(() => self.assemblyList, assemblyConfs => {
133
- self.assemblies.forEach(asm => {
134
+ for (const asm of self.assemblies) {
134
135
  if (!asm.configuration) {
135
136
  this.removeAssembly(asm);
136
137
  }
137
- });
138
- assemblyConfs.forEach(conf => {
139
- if (!self.assemblies.some(a => a.name === (0, configuration_1.readConfObject)(conf, 'name'))) {
138
+ }
139
+ for (const conf of assemblyConfs) {
140
+ const name = (0, configuration_1.readConfObject)(conf, 'name');
141
+ if (!self.assemblies.some(a => a.name === name)) {
140
142
  this.addAssembly(conf);
141
143
  }
142
- });
144
+ }
143
145
  }, { fireImmediately: true, name: 'assemblyManagerAfterAttach' }));
144
146
  },
145
147
  /**
@@ -164,15 +166,6 @@ function assemblyManagerFactory(conf, pm) {
164
166
  addAssembly(configuration) {
165
167
  self.assemblies.push({ configuration });
166
168
  },
167
- /**
168
- * #action
169
- * private: you would generally want to add to manipulate
170
- * jbrowse.assemblies, session.sessionAssemblies, or
171
- * session.temporaryAssemblies instead of using this directly
172
- */
173
- replaceAssembly(idx, configuration) {
174
- self.assemblies[idx] = (0, mobx_state_tree_1.cast)({ configuration });
175
- },
176
169
  }));
177
170
  }
178
171
  exports.default = assemblyManagerFactory;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/core",
3
- "version": "2.15.4",
3
+ "version": "2.16.1",
4
4
  "description": "JBrowse 2 core libraries used by plugins",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -54,7 +54,6 @@
54
54
  "load-script": "^2.0.0",
55
55
  "material-ui-popup-state": "^5.0.0",
56
56
  "rbush": "^3.0.1",
57
- "react-error-boundary": "^4.0.3",
58
57
  "serialize-error": "^8.0.0",
59
58
  "source-map-js": "^1.0.2",
60
59
  "svg-path-generator": "^1.1.0"
@@ -73,5 +72,5 @@
73
72
  "access": "public",
74
73
  "directory": "dist"
75
74
  },
76
- "gitHead": "686b4ad9016b3586e8230180f7adb44c238ba4fb"
75
+ "gitHead": "c6a658d2344989895543f0456b1cf7dd3b937769"
77
76
  }
@@ -7,17 +7,22 @@ type BasicView = React.ComponentType<{
7
7
  session?: IAnyStateTreeNode;
8
8
  }>;
9
9
  type ViewComponentType = React.LazyExoticComponent<BasicView> | BasicView;
10
+ interface ViewMetadata {
11
+ hiddenFromGUI?: boolean;
12
+ }
10
13
  export default class ViewType extends PluggableElementBase {
11
14
  ReactComponent: ViewComponentType;
12
15
  stateModel: IAnyModelType;
13
16
  displayTypes: DisplayType[];
17
+ viewMetadata: ViewMetadata;
14
18
  extendedName?: string;
15
19
  constructor(stuff: {
16
20
  name: string;
17
21
  displayName?: string;
18
- ReactComponent: ViewComponentType;
19
22
  stateModel: IAnyModelType;
20
23
  extendedName?: string;
24
+ viewMetadata?: ViewMetadata;
25
+ ReactComponent: ViewComponentType;
21
26
  });
22
27
  addDisplayType(display: DisplayType): void;
23
28
  }
@@ -8,7 +8,9 @@ class ViewType extends PluggableElementBase_1.default {
8
8
  constructor(stuff) {
9
9
  super(stuff);
10
10
  this.displayTypes = [];
11
+ this.viewMetadata = {};
11
12
  this.ReactComponent = stuff.ReactComponent;
13
+ this.viewMetadata = stuff.viewMetadata || {};
12
14
  this.stateModel = stuff.stateModel;
13
15
  this.extendedName = stuff.extendedName;
14
16
  }
@@ -72,7 +72,6 @@ const OldHydrate = (0, mobx_react_1.observer)(function OldHydrate(props) {
72
72
  function doHydrate() {
73
73
  if (domNode && html) {
74
74
  if (domNode.innerHTML) {
75
- // eslint-disable-next-line @typescript-eslint/no-deprecated
76
75
  (0, react_dom_1.unmountComponentAtNode)(domNode);
77
76
  }
78
77
  // setting outline:none fixes react "focusable" element issue. see
@@ -83,7 +82,6 @@ const OldHydrate = (0, mobx_react_1.observer)(function OldHydrate(props) {
83
82
  // hydration for when we have some free time. helps keep the
84
83
  // framerate up.
85
84
  (0, util_1.rIC)(() => {
86
- // eslint-disable-next-line @typescript-eslint/no-deprecated
87
85
  (0, react_dom_1.hydrate)(react_1.default.createElement(RenderingComponent, { ...props }), domNode);
88
86
  });
89
87
  }
@@ -91,7 +89,6 @@ const OldHydrate = (0, mobx_react_1.observer)(function OldHydrate(props) {
91
89
  doHydrate();
92
90
  return () => {
93
91
  if (domNode) {
94
- // eslint-disable-next-line @typescript-eslint/no-deprecated
95
92
  (0, react_dom_1.unmountComponentAtNode)(domNode);
96
93
  }
97
94
  };
@@ -75,11 +75,9 @@ const OldHydrate = (0, mobx_react_1.observer)(function ({ theme, html, Rendering
75
75
  const domNode = ref.current;
76
76
  function doHydrate() {
77
77
  if (domNode) {
78
- // eslint-disable-next-line @typescript-eslint/no-deprecated
79
78
  (0, react_dom_1.unmountComponentAtNode)(domNode);
80
79
  domNode.innerHTML = html;
81
80
  (0, util_1.rIC)(() => {
82
- // eslint-disable-next-line @typescript-eslint/no-deprecated
83
81
  (0, react_dom_1.hydrate)(react_1.default.createElement(styles_1.ThemeProvider, { theme: jbrowseTheme },
84
82
  react_1.default.createElement(RenderingComponent, { ...rest })), domNode);
85
83
  });
@@ -88,7 +86,6 @@ const OldHydrate = (0, mobx_react_1.observer)(function ({ theme, html, Rendering
88
86
  doHydrate();
89
87
  return () => {
90
88
  if (domNode) {
91
- // eslint-disable-next-line @typescript-eslint/no-deprecated
92
89
  (0, react_dom_1.unmountComponentAtNode)(domNode);
93
90
  }
94
91
  };