@jbrowse/core 2.4.2 → 2.6.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 (223) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +16 -0
  2. package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +45 -0
  3. package/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +15 -0
  4. package/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +52 -0
  5. package/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +13 -0
  6. package/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +27 -0
  7. package/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.d.ts +15 -0
  8. package/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +98 -0
  9. package/BaseFeatureWidget/BaseFeatureDetail/FieldName.d.ts +16 -0
  10. package/BaseFeatureWidget/BaseFeatureDetail/FieldName.js +32 -0
  11. package/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +17 -0
  12. package/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +23 -0
  13. package/BaseFeatureWidget/BaseFeatureDetail/UriField.d.ts +18 -0
  14. package/BaseFeatureWidget/BaseFeatureDetail/UriField.js +31 -0
  15. package/BaseFeatureWidget/BaseFeatureDetail/UriLink.d.ts +7 -0
  16. package/BaseFeatureWidget/BaseFeatureDetail/UriLink.js +13 -0
  17. package/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +33 -0
  18. package/BaseFeatureWidget/BaseFeatureDetail/index.js +170 -0
  19. package/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +5 -0
  20. package/BaseFeatureWidget/BaseFeatureDetail/util.js +46 -0
  21. package/BaseFeatureWidget/SequenceFeatureDetails/CDNASequence.d.ts +13 -0
  22. package/BaseFeatureWidget/SequenceFeatureDetails/CDNASequence.js +25 -0
  23. package/BaseFeatureWidget/SequenceFeatureDetails/CDSSequence.d.ts +6 -0
  24. package/BaseFeatureWidget/SequenceFeatureDetails/CDSSequence.js +12 -0
  25. package/BaseFeatureWidget/SequenceFeatureDetails/GenomicSequence.d.ts +6 -0
  26. package/BaseFeatureWidget/SequenceFeatureDetails/GenomicSequence.js +14 -0
  27. package/BaseFeatureWidget/SequenceFeatureDetails/ProteinSequence.d.ts +9 -0
  28. package/BaseFeatureWidget/SequenceFeatureDetails/ProteinSequence.js +18 -0
  29. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.d.ts +3 -0
  30. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +143 -0
  31. package/BaseFeatureWidget/{SequenceFeatureSettingsDialog.d.ts → SequenceFeatureDetails/SequenceFeatureSettingsDialog.d.ts} +2 -2
  32. package/BaseFeatureWidget/{SequenceFeatureSettingsDialog.js → SequenceFeatureDetails/SequenceFeatureSettingsDialog.js} +1 -1
  33. package/BaseFeatureWidget/{SequenceHelpDialog.d.ts → SequenceFeatureDetails/SequenceHelpDialog.d.ts} +2 -2
  34. package/BaseFeatureWidget/{SequenceHelpDialog.js → SequenceFeatureDetails/SequenceHelpDialog.js} +6 -9
  35. package/BaseFeatureWidget/{SequencePanel.d.ts → SequenceFeatureDetails/SequencePanel.d.ts} +1 -1
  36. package/BaseFeatureWidget/{SequencePanel.js → SequenceFeatureDetails/SequencePanel.js} +10 -8
  37. package/BaseFeatureWidget/SequenceFeatureDetails/hooks.d.ts +10 -0
  38. package/BaseFeatureWidget/SequenceFeatureDetails/hooks.js +73 -0
  39. package/BaseFeatureWidget/SequenceFeatureDetails/index.d.ts +3 -0
  40. package/BaseFeatureWidget/SequenceFeatureDetails/index.js +68 -0
  41. package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/DLGAP3.d.ts +17 -17
  42. package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/NCDN.d.ts +16 -16
  43. package/BaseFeatureWidget/SequenceFeatureDetails/util.d.ts +6 -0
  44. package/BaseFeatureWidget/SequenceFeatureDetails/util.js +11 -0
  45. package/BaseFeatureWidget/index.d.ts +4 -1
  46. package/BaseFeatureWidget/index.js +29 -17
  47. package/BaseFeatureWidget/types.d.ts +2 -2
  48. package/BaseFeatureWidget/util.js +15 -5
  49. package/Plugin.d.ts +1 -1
  50. package/PluginLoader.js +17 -0
  51. package/PluginManager.d.ts +8 -5
  52. package/PluginManager.js +3 -0
  53. package/README.md +0 -2
  54. package/ReExports/list.js +1 -0
  55. package/ReExports/modules.d.ts +8 -5
  56. package/ReExports/modules.js +7 -7
  57. package/TextSearch/TextSearchManager.d.ts +2 -9
  58. package/assemblyManager/assembly.d.ts +91 -8
  59. package/assemblyManager/assembly.js +92 -8
  60. package/assemblyManager/assemblyConfigSchema.d.ts +52 -1
  61. package/assemblyManager/assemblyConfigSchema.js +1 -0
  62. package/assemblyManager/assemblyManager.d.ts +227 -58
  63. package/assemblyManager/assemblyManager.js +72 -13
  64. package/assemblyManager/index.d.ts +1 -0
  65. package/configuration/configurationSchema.d.ts +14 -16
  66. package/configuration/configurationSchema.js +4 -2
  67. package/configuration/index.d.ts +1 -1
  68. package/configuration/types.d.ts +15 -0
  69. package/configuration/types.js +2 -0
  70. package/configuration/util.d.ts +5 -3
  71. package/configuration/util.js +18 -18
  72. package/data_adapters/BaseAdapter/BaseAdapter.d.ts +23 -0
  73. package/data_adapters/BaseAdapter/BaseAdapter.js +37 -0
  74. package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +128 -0
  75. package/data_adapters/{BaseAdapter.js → BaseAdapter/BaseFeatureDataAdapter.js} +58 -88
  76. package/data_adapters/BaseAdapter/BaseOptions.d.ts +16 -0
  77. package/data_adapters/BaseAdapter/BaseOptions.js +2 -0
  78. package/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.d.ts +9 -0
  79. package/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.js +2 -0
  80. package/data_adapters/BaseAdapter/BaseSequenceAdapter.d.ts +13 -0
  81. package/data_adapters/BaseAdapter/BaseSequenceAdapter.js +10 -0
  82. package/data_adapters/BaseAdapter/BaseTextSearchAdapter.d.ts +6 -0
  83. package/data_adapters/BaseAdapter/BaseTextSearchAdapter.js +2 -0
  84. package/data_adapters/BaseAdapter/RegionsAdapter.d.ts +6 -0
  85. package/data_adapters/BaseAdapter/RegionsAdapter.js +2 -0
  86. package/data_adapters/BaseAdapter/index.d.ts +15 -0
  87. package/data_adapters/BaseAdapter/index.js +25 -0
  88. package/data_adapters/BaseAdapter/types.d.ts +21 -0
  89. package/data_adapters/BaseAdapter/types.js +2 -0
  90. package/data_adapters/BaseAdapter/util.d.ts +12 -0
  91. package/data_adapters/BaseAdapter/util.js +23 -0
  92. package/data_adapters/CytobandAdapter/configSchema.d.ts +11 -1
  93. package/package.json +4 -4
  94. package/pluggableElementTypes/AdapterType.d.ts +1 -1
  95. package/pluggableElementTypes/ConnectionType.d.ts +1 -1
  96. package/pluggableElementTypes/DisplayType.d.ts +1 -1
  97. package/pluggableElementTypes/InternetAccountType.d.ts +1 -1
  98. package/pluggableElementTypes/RpcMethodType.d.ts +9 -7
  99. package/pluggableElementTypes/RpcMethodType.js +9 -7
  100. package/pluggableElementTypes/TextSearchAdapterType.d.ts +1 -1
  101. package/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +18 -0
  102. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +9 -0
  103. package/pluggableElementTypes/models/BaseDisplayModel.d.ts +10 -1
  104. package/pluggableElementTypes/models/BaseDisplayModel.js +9 -1
  105. package/pluggableElementTypes/models/BaseTrackModel.d.ts +2 -1
  106. package/pluggableElementTypes/models/BaseTrackModel.js +4 -2
  107. package/pluggableElementTypes/models/BaseViewModel.d.ts +46 -2
  108. package/pluggableElementTypes/models/BaseViewModel.js +6 -0
  109. package/pluggableElementTypes/models/InternetAccountModel.d.ts +36 -2
  110. package/pluggableElementTypes/models/InternetAccountModel.js +33 -21
  111. package/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -2
  112. package/pluggableElementTypes/models/baseConnectionConfig.js +2 -1
  113. package/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +42 -1
  114. package/pluggableElementTypes/models/baseInternetAccountConfig.js +1 -1
  115. package/pluggableElementTypes/models/baseTrackConfig.d.ts +120 -3
  116. package/pluggableElementTypes/models/baseTrackConfig.js +7 -5
  117. package/pluggableElementTypes/models/index.d.ts +1 -1
  118. package/pluggableElementTypes/renderers/BoxRendererType.js +1 -2
  119. package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +2 -2
  120. package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +4 -2
  121. package/pluggableElementTypes/renderers/FeatureRendererType.js +4 -6
  122. package/pluggableElementTypes/renderers/RendererType.d.ts +1 -1
  123. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +2 -2
  124. package/pluggableElementTypes/renderers/ServerSideRenderedContent.d.ts +1 -1
  125. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +1 -1
  126. package/rpc/BaseRpcDriver.js +1 -7
  127. package/rpc/RpcManager.d.ts +8 -1
  128. package/rpc/RpcManager.js +1 -1
  129. package/rpc/baseRpcConfig.d.ts +10 -1
  130. package/rpc/configSchema.d.ts +14 -1
  131. package/rpc/coreRpcMethods.d.ts +1 -1
  132. package/rpc/coreRpcMethods.js +3 -3
  133. package/rpc/mainThreadRpcConfig.d.ts +7 -1
  134. package/rpc/methods/{CoreEstimateRegionStats.d.ts → CoreGetFeatureDensityStats.d.ts} +2 -2
  135. package/rpc/methods/{CoreEstimateRegionStats.js → CoreGetFeatureDensityStats.js} +4 -4
  136. package/rpc/methods/CoreGetFeatureDetails.js +5 -5
  137. package/rpc/webWorkerRpcConfig.d.ts +7 -1
  138. package/tsconfig.build.tsbuildinfo +1 -1
  139. package/ui/AppLogo.d.ts +2 -2
  140. package/ui/AssemblySelector.d.ts +2 -2
  141. package/ui/AssemblySelector.js +1 -1
  142. package/ui/CascadingMenu.d.ts +2 -2
  143. package/ui/CascadingMenuButton.d.ts +8 -0
  144. package/ui/CascadingMenuButton.js +20 -0
  145. package/ui/ColorPicker.d.ts +4 -4
  146. package/ui/Dialog.d.ts +5 -5
  147. package/ui/Dialog.js +19 -7
  148. package/ui/DropDownMenu.d.ts +2 -2
  149. package/ui/EditableTypography.js +1 -1
  150. package/ui/ErrorMessage.d.ts +2 -2
  151. package/ui/ErrorMessage.js +6 -2
  152. package/ui/FactoryResetDialog.d.ts +2 -2
  153. package/ui/FatalErrorDialog.d.ts +6 -7
  154. package/ui/FatalErrorDialog.js +7 -7
  155. package/ui/FileSelector/FileSelector.d.ts +2 -2
  156. package/ui/FileSelector/FileSelector.js +3 -2
  157. package/ui/FileSelector/LocalFileChooser.d.ts +2 -2
  158. package/ui/FileSelector/UrlChooser.d.ts +3 -4
  159. package/ui/FileSelector/UrlChooser.js +8 -10
  160. package/ui/Icons.d.ts +10 -10
  161. package/ui/LoadingEllipses.d.ts +2 -2
  162. package/ui/Logo.d.ts +3 -3
  163. package/ui/Menu.d.ts +2 -2
  164. package/ui/PrerenderedCanvas.d.ts +2 -2
  165. package/ui/ResizeBar.d.ts +1 -1
  166. package/ui/ResizeBar.js +1 -1
  167. package/ui/ResizeHandle.d.ts +2 -2
  168. package/ui/ReturnToImportFormDialog.d.ts +2 -2
  169. package/ui/SanitizedHTML.d.ts +2 -2
  170. package/ui/SanitizedHTML.js +6 -0
  171. package/ui/Snackbar.d.ts +7 -9
  172. package/ui/Snackbar.js +12 -17
  173. package/ui/SnackbarModel.d.ts +9 -3
  174. package/ui/SnackbarModel.js +3 -3
  175. package/ui/Tooltip.d.ts +2 -2
  176. package/ui/index.d.ts +0 -1
  177. package/ui/index.js +1 -3
  178. package/ui/react-colorful.d.ts +1 -1
  179. package/ui/theme.js +3 -18
  180. package/util/Base1DUtils.js +2 -1
  181. package/util/QuickLRU.d.ts +1 -1
  182. package/util/blockTypes.js +1 -1
  183. package/util/formatFastaStrings.js +1 -1
  184. package/util/index.d.ts +18 -2
  185. package/util/index.js +77 -11
  186. package/util/io/index.js +1 -1
  187. package/util/layouts/PrecomputedMultiLayout.d.ts +1 -1
  188. package/util/mst-reflection.js +1 -2
  189. package/util/offscreenCanvasUtils.d.ts +2 -2
  190. package/util/stats.d.ts +5 -5
  191. package/util/types/index.d.ts +9 -3
  192. package/util/types/index.js +6 -2
  193. package/util/types/mst.d.ts +12 -9
  194. package/util/types/util.d.ts +0 -3
  195. package/BaseFeatureWidget/BaseFeatureDetail.d.ts +0 -62
  196. package/BaseFeatureWidget/BaseFeatureDetail.js +0 -378
  197. package/BaseFeatureWidget/SequenceBox.d.ts +0 -29
  198. package/BaseFeatureWidget/SequenceBox.js +0 -63
  199. package/BaseFeatureWidget/SequenceFeatureDetails.d.ts +0 -3
  200. package/BaseFeatureWidget/SequenceFeatureDetails.js +0 -230
  201. package/data_adapters/BaseAdapter.d.ts +0 -138
  202. package/ui/AboutDialog.d.ts +0 -12
  203. package/ui/AboutDialog.js +0 -125
  204. package/ui/App.d.ts +0 -18
  205. package/ui/App.js +0 -114
  206. package/ui/AppToolbar.d.ts +0 -19
  207. package/ui/AppToolbar.js +0 -56
  208. package/ui/Drawer.d.ts +0 -8
  209. package/ui/Drawer.js +0 -34
  210. package/ui/DrawerWidget.d.ts +0 -6
  211. package/ui/DrawerWidget.js +0 -130
  212. package/ui/ViewContainer.d.ts +0 -9
  213. package/ui/ViewContainer.js +0 -76
  214. package/ui/ViewContainerTitle.d.ts +0 -6
  215. package/ui/ViewContainerTitle.js +0 -42
  216. package/ui/ViewLauncher.d.ts +0 -18
  217. package/ui/ViewLauncher.js +0 -50
  218. package/ui/ViewMenu.d.ts +0 -9
  219. package/ui/ViewMenu.js +0 -69
  220. package/ui/ViewPanel.d.ts +0 -19
  221. package/ui/ViewPanel.js +0 -49
  222. /package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/DLGAP3.js +0 -0
  223. /package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/NCDN.js +0 -0
@@ -0,0 +1,170 @@
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
+ exports.Attributes = exports.FeatureDetails = exports.BaseAttributes = exports.BaseCoreDetails = exports.BaseCard = exports.useStyles = void 0;
30
+ /* eslint-disable @typescript-eslint/no-explicit-any */
31
+ const react_1 = __importStar(require("react"));
32
+ const react_error_boundary_1 = require("react-error-boundary");
33
+ const material_1 = require("@mui/material");
34
+ const mui_1 = require("tss-react/mui");
35
+ const mobx_react_1 = require("mobx-react");
36
+ // icons
37
+ const ExpandMore_1 = __importDefault(require("@mui/icons-material/ExpandMore"));
38
+ // locals
39
+ const util_1 = require("../../util");
40
+ const ui_1 = require("../../ui");
41
+ const SequenceFeatureDetails_1 = __importDefault(require("../SequenceFeatureDetails"));
42
+ const SimpleField_1 = __importDefault(require("./SimpleField"));
43
+ const Attributes_1 = __importDefault(require("./Attributes"));
44
+ const util_2 = require("./util");
45
+ // coreDetails are omitted in some circumstances
46
+ const coreDetails = [
47
+ 'name',
48
+ 'start',
49
+ 'end',
50
+ 'strand',
51
+ 'refName',
52
+ 'description',
53
+ 'type',
54
+ ];
55
+ exports.useStyles = (0, mui_1.makeStyles)()(theme => {
56
+ var _a;
57
+ return ({
58
+ expansionPanelDetails: {
59
+ display: 'block',
60
+ padding: theme.spacing(1),
61
+ },
62
+ expandIcon: {
63
+ color: ((_a = theme.palette.tertiary) === null || _a === void 0 ? void 0 : _a.contrastText) || '#fff',
64
+ },
65
+ });
66
+ });
67
+ function BaseCard({ children, title, defaultExpanded = true, }) {
68
+ const { classes } = (0, exports.useStyles)();
69
+ const [expanded, setExpanded] = (0, react_1.useState)(defaultExpanded);
70
+ return (react_1.default.createElement(material_1.Accordion, { expanded: expanded, onChange: () => setExpanded(s => !s), TransitionProps: { unmountOnExit: true, timeout: 150 } },
71
+ react_1.default.createElement(material_1.AccordionSummary, { expandIcon: react_1.default.createElement(ExpandMore_1.default, { className: classes.expandIcon }) },
72
+ react_1.default.createElement(material_1.Typography, { variant: "button" },
73
+ " ",
74
+ title)),
75
+ react_1.default.createElement(material_1.AccordionDetails, { className: classes.expansionPanelDetails }, children)));
76
+ }
77
+ exports.BaseCard = BaseCard;
78
+ function Position(props) {
79
+ const { feature } = props;
80
+ const strand = feature.strand;
81
+ const strandMap = {
82
+ '-1': '-',
83
+ '0': '',
84
+ '1': '+',
85
+ };
86
+ const str = strandMap[strand] ? `(${strandMap[strand]})` : '';
87
+ // @ts-expect-error
88
+ const loc = (0, util_1.assembleLocString)(feature);
89
+ return react_1.default.createElement(react_1.default.Fragment, null, `${loc} ${str}`);
90
+ }
91
+ function CoreDetails(props) {
92
+ const { feature } = props;
93
+ const obj = feature;
94
+ // eslint-disable-next-line no-underscore-dangle
95
+ const formattedFeat = { ...obj, ...obj.__jbrowsefmt };
96
+ const { start, end } = formattedFeat;
97
+ const displayedDetails = {
98
+ ...formattedFeat,
99
+ length: (0, util_2.toLocale)(end - start),
100
+ };
101
+ const coreRenderedDetails = {
102
+ description: 'Description',
103
+ name: 'Name',
104
+ length: 'Length',
105
+ type: 'Type',
106
+ };
107
+ return (react_1.default.createElement(react_1.default.Fragment, null,
108
+ react_1.default.createElement(SimpleField_1.default, { name: "Position", value: react_1.default.createElement(Position, { ...props, feature: formattedFeat }) }),
109
+ Object.entries(coreRenderedDetails)
110
+ .map(([key, name]) => [name, displayedDetails[key]])
111
+ .filter(([, value]) => value != null)
112
+ .map(([name, value]) => (react_1.default.createElement(SimpleField_1.default, { key: name, name: name, value: value })))));
113
+ }
114
+ const BaseCoreDetails = (props) => {
115
+ return (react_1.default.createElement(BaseCard, { ...props, title: "Primary data" },
116
+ react_1.default.createElement(CoreDetails, { ...props })));
117
+ };
118
+ exports.BaseCoreDetails = BaseCoreDetails;
119
+ const BaseAttributes = (props) => {
120
+ const { feature } = props;
121
+ return (react_1.default.createElement(BaseCard, { ...props, title: "Attributes" },
122
+ react_1.default.createElement(Attributes_1.default, { ...props, attributes: feature })));
123
+ };
124
+ exports.BaseAttributes = BaseAttributes;
125
+ function FeatureDetails(props) {
126
+ const { omit = [], model, feature, depth = 0 } = props;
127
+ const { mate, name = '', id = '', type = '', subfeatures, uniqueId } = feature;
128
+ const pm = (0, util_1.getEnv)(model).pluginManager;
129
+ const session = (0, util_1.getSession)(model);
130
+ const ExtraPanel = pm.evaluateExtensionPoint('Core-extraFeaturePanel', null, {
131
+ session,
132
+ feature,
133
+ model,
134
+ });
135
+ return (react_1.default.createElement(BaseCard, { title: (0, util_2.generateTitle)(name, id, type) },
136
+ react_1.default.createElement(material_1.Typography, null, "Core details"),
137
+ react_1.default.createElement(CoreDetails, { ...props }),
138
+ mate ? (react_1.default.createElement(react_1.default.Fragment, null,
139
+ react_1.default.createElement(material_1.Divider, null),
140
+ react_1.default.createElement(material_1.Typography, null, "Mate details"),
141
+ react_1.default.createElement(CoreDetails, { ...props, feature: { ...mate, uniqueId: uniqueId + '-mate' } }))) : null,
142
+ react_1.default.createElement(material_1.Divider, null),
143
+ react_1.default.createElement(material_1.Typography, null, "Attributes"),
144
+ react_1.default.createElement(Attributes_1.default, { attributes: feature, ...props, omit: omit, omitSingleLevel: coreDetails }),
145
+ react_1.default.createElement(react_error_boundary_1.ErrorBoundary, { FallbackComponent: e => react_1.default.createElement(ui_1.ErrorMessage, { error: e.error }) },
146
+ react_1.default.createElement(SequenceFeatureDetails_1.default, { ...props })),
147
+ ExtraPanel ? (react_1.default.createElement(react_1.default.Fragment, null,
148
+ react_1.default.createElement(material_1.Divider, null),
149
+ react_1.default.createElement(BaseCard, { title: ExtraPanel.name },
150
+ react_1.default.createElement(ExtraPanel.Component, { ...props })))) : null,
151
+ (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: { ...sub, uniqueId: `${uniqueId}_${idx}` }, model: model, depth: depth + 1 }))))) : null));
152
+ }
153
+ exports.FeatureDetails = FeatureDetails;
154
+ exports.default = (0, mobx_react_1.observer)(function ({ model }) {
155
+ const { error, featureData } = model;
156
+ if (error) {
157
+ return react_1.default.createElement(ui_1.ErrorMessage, { error: error });
158
+ }
159
+ if (!featureData) {
160
+ return null;
161
+ }
162
+ // replacing undefined with null helps with allowing fields to be hidden,
163
+ // setting null is not allowed by jexl so we set it to undefined to hide. see
164
+ // config guide. this replacement happens both here and when snapshotting the
165
+ // featureData
166
+ const g = JSON.parse(JSON.stringify(featureData, (_, v) => (v === undefined ? null : v)));
167
+ return (0, util_2.isEmpty)(g) ? null : react_1.default.createElement(FeatureDetails, { model: model, feature: g });
168
+ });
169
+ var Attributes_2 = require("./Attributes");
170
+ Object.defineProperty(exports, "Attributes", { enumerable: true, get: function () { return __importDefault(Attributes_2).default; } });
@@ -0,0 +1,5 @@
1
+ export declare function isEmpty(obj: Record<string, unknown>): boolean;
2
+ export declare function generateTitle(name: unknown, id: unknown, type: unknown): string;
3
+ export declare function generateMaxWidth(array: unknown[][], prefix: string[]): number;
4
+ export declare function toLocale(n: number): string;
5
+ export declare function accessNested(arr: string[], obj?: Record<string, unknown>): string | undefined;
@@ -0,0 +1,46 @@
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.accessNested = exports.toLocale = exports.generateMaxWidth = exports.generateTitle = exports.isEmpty = void 0;
7
+ const is_object_1 = __importDefault(require("is-object"));
8
+ const util_1 = require("../../util");
9
+ const util_2 = require("../util");
10
+ function isEmpty(obj) {
11
+ return Object.keys(obj).length === 0;
12
+ }
13
+ exports.isEmpty = isEmpty;
14
+ function generateTitle(name, id, type) {
15
+ return [(0, util_2.ellipses)(`${name}` || `${id}`), `${type}`]
16
+ .filter(f => !!f)
17
+ .join(' - ');
18
+ }
19
+ exports.generateTitle = generateTitle;
20
+ function generateMaxWidth(array, prefix) {
21
+ return (Math.ceil((0, util_1.max)(array.map(key => (0, util_1.measureText)([...prefix, key[0]].join('.'), 12)))) + 10);
22
+ }
23
+ exports.generateMaxWidth = generateMaxWidth;
24
+ function toLocale(n) {
25
+ return n.toLocaleString('en-US');
26
+ }
27
+ exports.toLocale = toLocale;
28
+ // pick using a path from an object, similar to _.get from lodash with special
29
+ // logic for Descriptions from e.g. VCF headers
30
+ //
31
+ // @param arr example ['a','b'], obj = {a:{b:'hello}}
32
+ // @returns hello (with special addition to grab description also)
33
+ function accessNested(arr, obj = {}) {
34
+ let obj2 = obj;
35
+ arr.forEach(elt => {
36
+ if ((0, is_object_1.default)(obj2)) {
37
+ obj2 = obj2[elt];
38
+ }
39
+ });
40
+ return typeof obj2 === 'string'
41
+ ? obj2
42
+ : (0, is_object_1.default)(obj2) && typeof (obj2 === null || obj2 === void 0 ? void 0 : obj2.Description) === 'string'
43
+ ? obj2.Description
44
+ : undefined;
45
+ }
46
+ exports.accessNested = accessNested;
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { Feat } from '../util';
3
+ export default function CDNASequence({ utr, cds, exons, sequence, upstream, downstream, includeIntrons, collapseIntron, intronBp, }: {
4
+ utr: Feat[];
5
+ cds: Feat[];
6
+ exons: Feat[];
7
+ sequence: string;
8
+ upstream?: string;
9
+ downstream?: string;
10
+ includeIntrons?: boolean;
11
+ collapseIntron?: boolean;
12
+ intronBp: number;
13
+ }): React.JSX.Element;
@@ -0,0 +1,25 @@
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 CDNASequence({ utr, cds, exons, sequence, upstream, downstream, includeIntrons, collapseIntron, intronBp, }) {
9
+ const chunks = (cds.length ? [...cds, ...utr].sort((a, b) => a.start - b.start) : exons).filter(f => f.start !== f.end);
10
+ return (react_1.default.createElement(react_1.default.Fragment, null,
11
+ upstream ? (react_1.default.createElement("span", { style: { background: util_1.updownstreamColor } }, upstream)) : null,
12
+ chunks.map((chunk, idx) => {
13
+ var _a;
14
+ const intron = sequence.slice(chunk.end, (_a = chunks[idx + 1]) === null || _a === void 0 ? void 0 : _a.start);
15
+ return (react_1.default.createElement(react_1.default.Fragment, { key: JSON.stringify(chunk) },
16
+ react_1.default.createElement("span", { style: {
17
+ background: chunk.type === 'CDS' ? util_1.cdsColor : util_1.utrColor,
18
+ } }, sequence.slice(chunk.start, chunk.end)),
19
+ includeIntrons && idx < chunks.length - 1 ? (react_1.default.createElement("span", { style: { background: util_1.intronColor } }, collapseIntron && intron.length > intronBp * 2
20
+ ? `${intron.slice(0, intronBp)}...${intron.slice(-intronBp)}`
21
+ : intron)) : null));
22
+ }),
23
+ downstream ? (react_1.default.createElement("span", { style: { background: util_1.updownstreamColor } }, downstream)) : null));
24
+ }
25
+ exports.default = CDNASequence;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { Feat } from '../util';
3
+ export default function CDSSequence({ cds, sequence, }: {
4
+ cds: Feat[];
5
+ sequence: string;
6
+ }): React.JSX.Element;
@@ -0,0 +1,12 @@
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 CDSSequence({ cds, sequence, }) {
10
+ return react_1.default.createElement("span", { style: { background: util_1.cdsColor } }, (0, util_2.stitch)(cds, sequence));
11
+ }
12
+ exports.default = CDSSequence;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export default function GenomicSequence({ sequence, upstream, downstream, }: {
3
+ sequence: string;
4
+ upstream?: string;
5
+ downstream?: string;
6
+ }): React.JSX.Element;
@@ -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,9 @@
1
+ import React from 'react';
2
+ import { Feat } from '../util';
3
+ export default function ProteinSequence({ cds, sequence, codonTable, }: {
4
+ cds: Feat[];
5
+ sequence: string;
6
+ codonTable: {
7
+ [key: string]: string;
8
+ };
9
+ }): React.JSX.Element;
@@ -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,3 @@
1
+ import React from 'react';
2
+ import { BaseProps } from './../types';
3
+ export default function SequenceFeatureDetails({ model, feature: prefeature, }: BaseProps): React.JSX.Element;
@@ -0,0 +1,143 @@
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 seqPanelRef = (0, react_1.useRef)(null);
60
+ const [intronBp, setIntronBp] = (0, util_1.useLocalStorage)('intronBp', 10);
61
+ const [upDownBp, setUpDownBp] = (0, util_1.useLocalStorage)('upDownBp', 500);
62
+ const [copied, setCopied] = (0, react_1.useState)(false);
63
+ const [copiedHtml, setCopiedHtml] = (0, react_1.useState)(false);
64
+ const [force, setForce] = (0, react_1.useState)(false);
65
+ const hasCDS = (_a = feature.subfeatures) === null || _a === void 0 ? void 0 : _a.some(sub => sub.type === 'CDS');
66
+ const hasExon = (_b = feature.subfeatures) === null || _b === void 0 ? void 0 : _b.some(sub => sub.type === 'exon');
67
+ const hasExonOrCDS = hasExon || hasCDS;
68
+ const { sequence, error } = (0, hooks_1.useFeatureSequence)(model, prefeature, upDownBp, force);
69
+ const [mode, setMode] = (0, react_1.useState)(hasCDS ? 'cds' : hasExon ? 'cdna' : 'genomic');
70
+ const rest = {
71
+ ...(hasCDS ? { cds: 'CDS' } : {}),
72
+ ...(hasCDS ? { protein: 'Protein' } : {}),
73
+ ...(hasExonOrCDS ? { cdna: 'cDNA' } : {}),
74
+ ...(hasExonOrCDS ? { gene: `Genomic w/ full introns` } : {}),
75
+ ...(hasExonOrCDS
76
+ ? {
77
+ gene_updownstream: `Genomic w/ full introns +/- ${upDownBp}bp up+down stream`,
78
+ }
79
+ : {}),
80
+ ...(hasExonOrCDS
81
+ ? { gene_collapsed_intron: `Genomic w/ ${intronBp}bp intron` }
82
+ : {}),
83
+ ...(hasExonOrCDS
84
+ ? {
85
+ gene_updownstream_collapsed_intron: `Genomic w/ ${intronBp}bp intron +/- ${upDownBp}bp up+down stream `,
86
+ }
87
+ : {}),
88
+ ...(!hasExonOrCDS ? { genomic: 'Genomic' } : {}),
89
+ ...(!hasExonOrCDS
90
+ ? {
91
+ genomic_sequence_updownstream: `Genomic +/- ${upDownBp}bp up+down stream`,
92
+ }
93
+ : {}),
94
+ };
95
+ return (react_1.default.createElement("div", { className: classes.container2 },
96
+ react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
97
+ 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))))),
98
+ react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
99
+ react_1.default.createElement(material_1.Button, { className: classes.button, variant: "contained", onClick: () => {
100
+ const ref = seqPanelRef.current;
101
+ if (ref) {
102
+ (0, copy_to_clipboard_1.default)(ref.textContent || '', { format: 'text/plain' });
103
+ setCopied(true);
104
+ setTimeout(() => setCopied(false), 1000);
105
+ }
106
+ } }, copied ? 'Copied to clipboard!' : 'Copy plaintext')),
107
+ react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
108
+ 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" },
109
+ react_1.default.createElement(material_1.Button, { className: classes.button, variant: "contained", onClick: () => {
110
+ const ref = seqPanelRef.current;
111
+ if (!ref) {
112
+ return;
113
+ }
114
+ (0, copy_to_clipboard_1.default)(ref.innerHTML, { format: 'text/html' });
115
+ setCopiedHtml(true);
116
+ setTimeout(() => setCopiedHtml(false), 1000);
117
+ } }, copiedHtml ? 'Copied to clipboard!' : 'Copy HTML'))),
118
+ react_1.default.createElement(Settings, { upDownBp: upDownBp, intronBp: intronBp, setIntronBp: setIntronBp, setUpDownBp: setUpDownBp }),
119
+ react_1.default.createElement("br", null),
120
+ feature.type === 'gene' ? (react_1.default.createElement(material_1.Typography, null, "Note: inspect subfeature sequences for protein/CDS computations")) : null,
121
+ 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,
122
+ react_1.default.createElement(material_1.Typography, { color: "error" }, sequence.error),
123
+ 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) },
124
+ 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"))));
125
+ }
126
+ exports.default = SequenceFeatureDetails;
127
+ function Settings({ intronBp, upDownBp, setIntronBp, setUpDownBp, }) {
128
+ const { classes } = useStyles();
129
+ const [settingsDlgOpen, setSettingsDlgOpen] = (0, react_1.useState)(false);
130
+ return (react_1.default.createElement(react_1.default.Fragment, null,
131
+ react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
132
+ react_1.default.createElement(material_1.IconButton, { onClick: () => setSettingsDlgOpen(true) },
133
+ react_1.default.createElement(Settings_1.default, null))),
134
+ settingsDlgOpen ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement("div", null) },
135
+ react_1.default.createElement(SettingsDlg, { handleClose: arg => {
136
+ if (arg) {
137
+ const { upDownBp, intronBp } = arg;
138
+ setIntronBp(intronBp);
139
+ setUpDownBp(upDownBp);
140
+ }
141
+ setSettingsDlgOpen(false);
142
+ }, upDownBp: upDownBp, intronBp: intronBp }))) : null));
143
+ }
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
1
+ import React from 'react';
2
2
  export default function SequenceFeatureSettingsDialog({ handleClose, intronBp: intronBpArg, upDownBp: upDownBpArg, }: {
3
3
  handleClose: (arg?: {
4
4
  intronBp: number;
@@ -6,4 +6,4 @@ export default function SequenceFeatureSettingsDialog({ handleClose, intronBp: i
6
6
  }) => void;
7
7
  intronBp: number;
8
8
  upDownBp: number;
9
- }): JSX.Element;
9
+ }): React.JSX.Element;
@@ -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: 'Feature sequence settings' },
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) })),
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
1
+ import React from 'react';
2
2
  export default function HelpDialog({ handleClose, }: {
3
3
  handleClose: () => void;
4
- }): JSX.Element;
4
+ }): React.JSX.Element;
@@ -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 UTRs and stitched together CDS sequences"),
20
- react_1.default.createElement("li", null, "Gene w/ introns - the sequence underlying the entire gene including including introns, with UTR and CDS highlighted"),
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 'copy DNA' of transcript, formed from exon sequences"),
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, "Feature sequence - the reference genome sequence underlying the feature"),
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
  }
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { ParentFeat, SeqState } from './util';
2
+ import { ParentFeat, SeqState } from '../util';
3
3
  interface SeqPanelProps {
4
4
  sequence: SeqState;
5
5
  feature: ParentFeat;
@@ -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("../util");
8
- const util_2 = require("./util");
9
- const SequenceBox_1 = require("./SequenceBox");
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
- /* raw styles so that html copy works */
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: 500,
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(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")))));
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
+ };