@jbrowse/core 2.2.1 → 2.3.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 (96) hide show
  1. package/BaseFeatureWidget/SequenceFeatureDetails.js +1 -0
  2. package/BaseFeatureWidget/SequenceFeatureSettingsDialog.js +2 -17
  3. package/BaseFeatureWidget/SequenceHelpDialog.js +3 -19
  4. package/PluginManager.d.ts +4 -0
  5. package/PluginManager.js +12 -0
  6. package/README.md +6 -2
  7. package/data_adapters/BaseAdapter.d.ts +1 -1
  8. package/package.json +3 -3
  9. package/pluggableElementTypes/AdapterType.d.ts +4 -4
  10. package/pluggableElementTypes/AdapterType.js +0 -1
  11. package/pluggableElementTypes/AddTrackWorkflowType.d.ts +3 -3
  12. package/pluggableElementTypes/ConnectionType.d.ts +0 -1
  13. package/pluggableElementTypes/ConnectionType.js +0 -1
  14. package/pluggableElementTypes/DisplayType.d.ts +9 -0
  15. package/pluggableElementTypes/DisplayType.js +1 -0
  16. package/pluggableElementTypes/PluggableElementBase.d.ts +3 -0
  17. package/pluggableElementTypes/PluggableElementBase.js +4 -0
  18. package/pluggableElementTypes/TextSearchAdapterType.d.ts +1 -0
  19. package/pluggableElementTypes/TrackType.d.ts +2 -1
  20. package/pluggableElementTypes/ViewType.d.ts +4 -3
  21. package/pluggableElementTypes/WidgetType.d.ts +10 -9
  22. package/pluggableElementTypes/models/BaseDisplayModel.js +1 -0
  23. package/pluggableElementTypes/models/BaseTrackModel.d.ts +19 -8
  24. package/pluggableElementTypes/models/BaseTrackModel.js +32 -26
  25. package/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +0 -3
  26. package/pluggableElementTypes/renderers/BoxRendererType.js +1 -14
  27. package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +9 -0
  28. package/pluggableElementTypes/renderers/CircularChordRendererType.js +23 -0
  29. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +4 -1
  30. package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +4 -4
  31. package/pluggableElementTypes/renderers/FeatureRendererType.js +11 -13
  32. package/pluggableElementTypes/renderers/RendererType.d.ts +1 -0
  33. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +8 -0
  34. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.js +60 -0
  35. package/pluggableElementTypes/renderers/ServerSideRenderedContent.d.ts +2 -2
  36. package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +6 -6
  37. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +5 -5
  38. package/pluggableElementTypes/renderers/ServerSideRendererType.js +14 -13
  39. package/rpc/BaseRpcDriver.d.ts +1 -1
  40. package/rpc/BaseRpcDriver.js +8 -18
  41. package/rpc/coreRpcMethods.d.ts +11 -99
  42. package/rpc/coreRpcMethods.js +17 -241
  43. package/rpc/methods/CoreEstimateRegionStats.d.ts +18 -0
  44. package/rpc/methods/CoreEstimateRegionStats.js +37 -0
  45. package/rpc/methods/CoreFreeResources.d.ts +12 -0
  46. package/rpc/methods/CoreFreeResources.js +35 -0
  47. package/rpc/methods/CoreGetFeatureDetails.d.ts +16 -0
  48. package/rpc/methods/CoreGetFeatureDetails.js +44 -0
  49. package/rpc/methods/CoreGetFeatures.d.ts +17 -0
  50. package/rpc/methods/CoreGetFeatures.js +44 -0
  51. package/rpc/methods/CoreGetFileInfo.d.ts +10 -0
  52. package/rpc/methods/CoreGetFileInfo.js +24 -0
  53. package/rpc/methods/CoreGetMetadata.d.ts +10 -0
  54. package/rpc/methods/CoreGetMetadata.js +24 -0
  55. package/rpc/methods/CoreGetRefNames.d.ts +10 -0
  56. package/rpc/methods/CoreGetRefNames.js +25 -0
  57. package/rpc/methods/CoreRender.d.ts +14 -0
  58. package/rpc/methods/CoreRender.js +57 -0
  59. package/rpc/methods/util.d.ts +14 -0
  60. package/rpc/methods/util.js +21 -0
  61. package/rpc/remoteAbortSignals.d.ts +3 -1
  62. package/rpc/remoteAbortSignals.js +3 -1
  63. package/tsconfig.build.tsbuildinfo +1 -1
  64. package/ui/AboutDialog.d.ts +1 -1
  65. package/ui/AboutDialog.js +8 -18
  66. package/ui/App.js +9 -77
  67. package/ui/AppLogo.d.ts +8 -0
  68. package/ui/AppLogo.js +22 -0
  69. package/ui/AppToolbar.d.ts +19 -0
  70. package/ui/AppToolbar.js +56 -0
  71. package/ui/AssemblySelector.d.ts +5 -3
  72. package/ui/AssemblySelector.js +4 -4
  73. package/ui/Dialog.d.ts +7 -0
  74. package/ui/Dialog.js +35 -0
  75. package/ui/FactoryResetDialog.js +8 -13
  76. package/ui/PrerenderedCanvas.d.ts +3 -20
  77. package/ui/PrerenderedCanvas.js +1 -19
  78. package/ui/ReturnToImportFormDialog.js +2 -17
  79. package/ui/Snackbar.js +7 -53
  80. package/ui/ViewLauncher.d.ts +18 -0
  81. package/ui/ViewLauncher.js +50 -0
  82. package/ui/index.d.ts +9 -8
  83. package/ui/index.js +19 -17
  84. package/util/Base1DUtils.js +1 -1
  85. package/util/analytics.js +3 -0
  86. package/util/dedupe.d.ts +3 -0
  87. package/util/dedupe.js +18 -0
  88. package/util/formatFastaStrings.d.ts +1 -1
  89. package/util/formatFastaStrings.js +1 -1
  90. package/util/index.d.ts +1 -0
  91. package/util/index.js +1 -0
  92. package/util/offscreenCanvasUtils.js +1 -1
  93. package/util/stats.d.ts +7 -3
  94. package/util/stats.js +33 -24
  95. package/util/tracks.d.ts +1 -1
  96. package/util/tracks.js +1 -1
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { AnyConfigurationModel } from '../configuration';
3
- export declare function FileInfo({ config }: {
3
+ export declare function FileInfoPanel({ config }: {
4
4
  config: AnyConfigurationModel;
5
5
  }): JSX.Element | null;
6
6
  export declare function AboutContents({ config }: {
package/ui/AboutDialog.js CHANGED
@@ -26,29 +26,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.AboutContents = exports.FileInfo = void 0;
29
+ exports.AboutContents = exports.FileInfoPanel = void 0;
30
30
  const react_1 = __importStar(require("react"));
31
31
  const copy_to_clipboard_1 = __importDefault(require("copy-to-clipboard"));
32
32
  const material_1 = require("@mui/material");
33
- const Close_1 = __importDefault(require("@mui/icons-material/Close"));
34
33
  const mui_1 = require("tss-react/mui");
35
34
  const configuration_1 = require("../configuration");
35
+ const Dialog_1 = __importDefault(require("./Dialog"));
36
36
  const LoadingEllipses_1 = __importDefault(require("./LoadingEllipses"));
37
37
  const util_1 = require("../util");
38
38
  const tracks_1 = require("../util/tracks");
39
39
  const BaseFeatureDetail_1 = require("../BaseFeatureWidget/BaseFeatureDetail");
40
- const useStyles = (0, mui_1.makeStyles)()(theme => ({
41
- closeButton: {
42
- position: 'absolute',
43
- right: theme.spacing(1),
44
- top: theme.spacing(1),
45
- color: theme.palette.grey[500],
46
- },
40
+ const useStyles = (0, mui_1.makeStyles)()({
47
41
  content: {
48
42
  minWidth: 800,
49
43
  },
50
- }));
51
- function FileInfo({ config }) {
44
+ });
45
+ function FileInfoPanel({ config }) {
52
46
  const [error, setError] = (0, react_1.useState)();
53
47
  const [info, setInfo] = (0, react_1.useState)();
54
48
  const session = (0, util_1.getSession)(config);
@@ -89,7 +83,7 @@ function FileInfo({ config }) {
89
83
  : info || {};
90
84
  return info !== null ? (react_1.default.createElement(BaseFeatureDetail_1.BaseCard, { title: "File info" }, error ? (react_1.default.createElement(material_1.Typography, { color: "error" }, `${error}`)) : info === undefined ? (react_1.default.createElement(LoadingEllipses_1.default, { message: "Loading file data" })) : (react_1.default.createElement(BaseFeatureDetail_1.Attributes, { attributes: details })))) : null;
91
85
  }
92
- exports.FileInfo = FileInfo;
86
+ exports.FileInfoPanel = FileInfoPanel;
93
87
  function AboutContents({ config }) {
94
88
  const [copied, setCopied] = (0, react_1.useState)(false);
95
89
  const conf = (0, configuration_1.readConfObject)(config);
@@ -115,7 +109,7 @@ function AboutContents({ config }) {
115
109
  react_1.default.createElement(BaseFeatureDetail_1.Attributes, { attributes: confPostExt, omit: ['displays', 'baseUri', 'refNames', 'formatAbout'], hideUris: hideUris })),
116
110
  ExtraPanel ? (react_1.default.createElement(BaseFeatureDetail_1.BaseCard, { title: ExtraPanel.name },
117
111
  react_1.default.createElement(ExtraPanel.Component, { config: config }))) : null,
118
- react_1.default.createElement(FileInfo, { config: config })));
112
+ react_1.default.createElement(FileInfoPanel, { config: config })));
119
113
  }
120
114
  exports.AboutContents = AboutContents;
121
115
  function AboutDialog({ config, handleClose, }) {
@@ -124,11 +118,7 @@ function AboutDialog({ config, handleClose, }) {
124
118
  const trackName = (0, tracks_1.getTrackName)(config, session);
125
119
  const { pluginManager } = (0, util_1.getEnv)(session);
126
120
  const AboutComponent = pluginManager.evaluateExtensionPoint('Core-replaceAbout', AboutContents, { session, config });
127
- return (react_1.default.createElement(material_1.Dialog, { open: true, onClose: handleClose, maxWidth: "xl" },
128
- react_1.default.createElement(material_1.DialogTitle, null,
129
- trackName,
130
- react_1.default.createElement(material_1.IconButton, { className: classes.closeButton, onClick: () => handleClose(), size: "large" },
131
- react_1.default.createElement(Close_1.default, null))),
121
+ return (react_1.default.createElement(Dialog_1.default, { open: true, onClose: handleClose, title: trackName, maxWidth: "xl" },
132
122
  react_1.default.createElement(material_1.DialogContent, { className: classes.content },
133
123
  react_1.default.createElement(AboutComponent, { config: config }))));
134
124
  }
package/ui/App.js CHANGED
@@ -32,18 +32,16 @@ const mui_1 = require("tss-react/mui");
32
32
  const Launch_1 = __importDefault(require("@mui/icons-material/Launch"));
33
33
  const react_error_boundary_1 = require("react-error-boundary");
34
34
  const mobx_react_1 = require("mobx-react");
35
- const mobx_state_tree_1 = require("mobx-state-tree");
36
35
  // locals
37
- const configuration_1 = require("../configuration");
36
+ const util_1 = require("../util");
38
37
  // ui elements
39
38
  const DrawerWidget_1 = __importDefault(require("./DrawerWidget"));
40
- const DropDownMenu_1 = __importDefault(require("./DropDownMenu"));
39
+ const AppToolbar_1 = __importDefault(require("./AppToolbar"));
41
40
  const ErrorMessage_1 = __importDefault(require("./ErrorMessage"));
42
41
  const LoadingEllipses_1 = __importDefault(require("./LoadingEllipses"));
43
- const EditableTypography_1 = __importDefault(require("./EditableTypography"));
44
42
  const Snackbar_1 = __importDefault(require("./Snackbar"));
45
43
  const ViewContainer_1 = __importDefault(require("./ViewContainer"));
46
- const Logo_1 = require("./Logo");
44
+ const ViewLauncher_1 = __importDefault(require("./ViewLauncher"));
47
45
  const useStyles = (0, mui_1.makeStyles)()(theme => ({
48
46
  root: {
49
47
  fontFamily: 'Roboto',
@@ -79,75 +77,9 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
79
77
  appBar: {
80
78
  flexGrow: 1,
81
79
  },
82
- grow: {
83
- flexGrow: 1,
84
- },
85
- inputBase: {
86
- color: theme.palette.primary.contrastText,
87
- },
88
- inputRoot: {
89
- '&:hover': {
90
- backgroundColor: theme.palette.primary.light,
91
- },
92
- },
93
- inputFocused: {
94
- borderColor: theme.palette.secondary.main,
95
- backgroundColor: theme.palette.primary.light,
96
- },
97
- selectPaper: {
98
- padding: theme.spacing(4),
99
- },
100
80
  }));
101
- const Logo = (0, mobx_react_1.observer)(({ session }) => {
102
- const { configuration } = session;
103
- const logoPath = (0, configuration_1.readConfObject)(configuration, 'logoPath');
104
- if (!(logoPath === null || logoPath === void 0 ? void 0 : logoPath.uri)) {
105
- return react_1.default.createElement(Logo_1.LogoFull, { variant: "white" });
106
- }
107
- else {
108
- return react_1.default.createElement("img", { src: logoPath.uri, alt: "Custom logo" });
109
- }
110
- });
111
- const AppToolbar = (0, mobx_react_1.observer)(({ session, HeaderButtons = react_1.default.createElement("div", null), }) => {
112
- const { classes } = useStyles();
113
- const { savedSessionNames, name, menus } = session;
114
- function handleNameChange(newName) {
115
- if (savedSessionNames === null || savedSessionNames === void 0 ? void 0 : savedSessionNames.includes(newName)) {
116
- session.notify(`Cannot rename session to "${newName}", a saved session with that name already exists`, 'warning');
117
- }
118
- else {
119
- session.renameCurrentSession(newName);
120
- }
121
- }
122
- return (react_1.default.createElement(material_1.Toolbar, null,
123
- menus.map(menu => (react_1.default.createElement(DropDownMenu_1.default, { key: menu.label, menuTitle: menu.label, menuItems: menu.menuItems, session: session }))),
124
- react_1.default.createElement("div", { className: classes.grow }),
125
- react_1.default.createElement(material_1.Tooltip, { title: "Rename Session", arrow: true },
126
- react_1.default.createElement(EditableTypography_1.default, { value: name, setValue: handleNameChange, variant: "body1", classes: {
127
- inputBase: classes.inputBase,
128
- inputRoot: classes.inputRoot,
129
- inputFocused: classes.inputFocused,
130
- } })),
131
- HeaderButtons,
132
- react_1.default.createElement("div", { className: classes.grow }),
133
- react_1.default.createElement("div", { style: { width: 150, maxHeight: 48 } },
134
- react_1.default.createElement(Logo, { session: session }))));
135
- });
136
- const ViewLauncher = (0, mobx_react_1.observer)(({ session }) => {
137
- var _a;
138
- const { classes } = useStyles();
139
- const { pluginManager } = (0, mobx_state_tree_1.getEnv)(session);
140
- const viewTypes = pluginManager.getElementTypeRecord('view').all();
141
- const [value, setValue] = (0, react_1.useState)((_a = viewTypes[0]) === null || _a === void 0 ? void 0 : _a.name);
142
- return (react_1.default.createElement(material_1.Paper, { className: classes.selectPaper },
143
- react_1.default.createElement(material_1.Typography, null, "Select a view to launch"),
144
- react_1.default.createElement(material_1.FormControl, { style: { margin: 2 } },
145
- react_1.default.createElement(material_1.Select, { value: value, onChange: event => setValue(event.target.value) }, viewTypes.map(({ name }) => (react_1.default.createElement(material_1.MenuItem, { key: name, value: name }, name))))),
146
- react_1.default.createElement(material_1.FormControl, { style: { margin: 2 } },
147
- react_1.default.createElement(material_1.Button, { onClick: () => session.addView(value, {}), variant: "contained", color: "primary" }, "Launch view"))));
148
- });
149
- const ViewPanel = (0, mobx_react_1.observer)(({ view, session }) => {
150
- const { pluginManager } = (0, mobx_state_tree_1.getEnv)(session);
81
+ const ViewPanel = (0, mobx_react_1.observer)(function ({ view, session, }) {
82
+ const { pluginManager } = (0, util_1.getEnv)(session);
151
83
  const viewType = pluginManager.getViewType(view.type);
152
84
  if (!viewType) {
153
85
  throw new Error(`unknown view type ${view.type}`);
@@ -155,9 +87,9 @@ const ViewPanel = (0, mobx_react_1.observer)(({ view, session }) => {
155
87
  const { ReactComponent } = viewType;
156
88
  return (react_1.default.createElement(ViewContainer_1.default, { view: view, onClose: () => session.removeView(view), onMinimize: () => view.setMinimized(!view.minimized) }, !view.minimized ? (react_1.default.createElement(react_error_boundary_1.ErrorBoundary, { FallbackComponent: ({ error }) => react_1.default.createElement(ErrorMessage_1.default, { error: error }) },
157
89
  react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(LoadingEllipses_1.default, null) },
158
- react_1.default.createElement(ReactComponent, { model: view, session: session, getTrackType: pluginManager.getTrackType })))) : (false)));
90
+ react_1.default.createElement(ReactComponent, { model: view, session: session })))) : (false)));
159
91
  });
160
- const App = (0, mobx_react_1.observer)((props) => {
92
+ const App = (0, mobx_react_1.observer)(function (props) {
161
93
  const { session } = props;
162
94
  const { classes } = useStyles();
163
95
  const { minimized, visibleWidget, drawerWidth, activeWidgets, views, drawerPosition, } = session;
@@ -184,9 +116,9 @@ const App = (0, mobx_react_1.observer)((props) => {
184
116
  react_1.default.createElement("div", { className: classes.menuBarAndComponents },
185
117
  react_1.default.createElement("div", { className: classes.menuBar },
186
118
  react_1.default.createElement(material_1.AppBar, { className: classes.appBar, position: "static" },
187
- react_1.default.createElement(AppToolbar, { ...props }))),
119
+ react_1.default.createElement(AppToolbar_1.default, { ...props }))),
188
120
  react_1.default.createElement("div", { className: classes.components },
189
- views.length ? (views.map(view => (react_1.default.createElement(ViewPanel, { key: `view-${view.id}`, view: view, session: session })))) : (react_1.default.createElement(ViewLauncher, { ...props })),
121
+ views.length ? (views.map(view => (react_1.default.createElement(ViewPanel, { key: `view-${view.id}`, view: view, session: session })))) : (react_1.default.createElement(ViewLauncher_1.default, { ...props })),
190
122
  react_1.default.createElement("div", { style: { height: 300 } }))),
191
123
  activeWidgets.size > 0 && minimized ? (react_1.default.createElement(material_1.Tooltip, { title: "Open drawer widget" },
192
124
  react_1.default.createElement(material_1.Fab, { className: drawerPosition === 'right' ? classes.fabRight : classes.fabLeft, color: "primary", "data-testid": "drawer-maximize", onClick: () => session.showWidgetDrawer() },
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { AnyConfigurationModel } from '../configuration';
3
+ declare const Logo: ({ session, }: {
4
+ session: {
5
+ configuration: AnyConfigurationModel;
6
+ };
7
+ }) => JSX.Element;
8
+ export default Logo;
package/ui/AppLogo.js ADDED
@@ -0,0 +1,22 @@
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 mobx_react_1 = require("mobx-react");
8
+ // locals
9
+ const configuration_1 = require("../configuration");
10
+ // ui elements
11
+ const Logo_1 = require("./Logo");
12
+ const Logo = (0, mobx_react_1.observer)(function ({ session, }) {
13
+ const { configuration } = session;
14
+ const logoPath = (0, configuration_1.readConfObject)(configuration, 'logoPath');
15
+ if (!(logoPath === null || logoPath === void 0 ? void 0 : logoPath.uri)) {
16
+ return react_1.default.createElement(Logo_1.LogoFull, { variant: "white" });
17
+ }
18
+ else {
19
+ return react_1.default.createElement("img", { src: logoPath.uri, alt: "Custom logo" });
20
+ }
21
+ });
22
+ exports.default = Logo;
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { NotificationLevel, SessionWithDrawerWidgets, SnackAction } from '../util';
3
+ import { MenuItem as JBMenuItem } from './Menu';
4
+ type SnackbarMessage = [string, NotificationLevel, SnackAction];
5
+ type AppSession = SessionWithDrawerWidgets & {
6
+ savedSessionNames: string[];
7
+ menus: {
8
+ label: string;
9
+ menuItems: JBMenuItem[];
10
+ }[];
11
+ renameCurrentSession: (arg: string) => void;
12
+ snackbarMessages: SnackbarMessage[];
13
+ popSnackbarMessage: () => unknown;
14
+ };
15
+ declare const AppToolbar: ({ session, HeaderButtons, }: {
16
+ HeaderButtons?: React.ReactElement<any, string | React.JSXElementConstructor<any>> | undefined;
17
+ session: AppSession;
18
+ }) => JSX.Element;
19
+ export default AppToolbar;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const material_1 = require("@mui/material");
8
+ const mui_1 = require("tss-react/mui");
9
+ const mobx_react_1 = require("mobx-react");
10
+ // ui elements
11
+ const DropDownMenu_1 = __importDefault(require("./DropDownMenu"));
12
+ const EditableTypography_1 = __importDefault(require("./EditableTypography"));
13
+ const AppLogo_1 = __importDefault(require("./AppLogo"));
14
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
15
+ grow: {
16
+ flexGrow: 1,
17
+ },
18
+ inputBase: {
19
+ color: theme.palette.primary.contrastText,
20
+ },
21
+ inputRoot: {
22
+ '&:hover': {
23
+ backgroundColor: theme.palette.primary.light,
24
+ },
25
+ },
26
+ inputFocused: {
27
+ borderColor: theme.palette.secondary.main,
28
+ backgroundColor: theme.palette.primary.light,
29
+ },
30
+ }));
31
+ const AppToolbar = (0, mobx_react_1.observer)(function ({ session, HeaderButtons = react_1.default.createElement("div", null), }) {
32
+ const { classes } = useStyles();
33
+ const { savedSessionNames, name, menus } = session;
34
+ function handleNameChange(newName) {
35
+ if (savedSessionNames === null || savedSessionNames === void 0 ? void 0 : savedSessionNames.includes(newName)) {
36
+ session.notify(`Cannot rename session to "${newName}", a saved session with that name already exists`, 'warning');
37
+ }
38
+ else {
39
+ session.renameCurrentSession(newName);
40
+ }
41
+ }
42
+ return (react_1.default.createElement(material_1.Toolbar, null,
43
+ menus.map(menu => (react_1.default.createElement(DropDownMenu_1.default, { key: menu.label, menuTitle: menu.label, menuItems: menu.menuItems, session: session }))),
44
+ react_1.default.createElement("div", { className: classes.grow }),
45
+ react_1.default.createElement(material_1.Tooltip, { title: "Rename Session", arrow: true },
46
+ react_1.default.createElement(EditableTypography_1.default, { value: name, setValue: handleNameChange, variant: "body1", classes: {
47
+ inputBase: classes.inputBase,
48
+ inputRoot: classes.inputRoot,
49
+ inputFocused: classes.inputFocused,
50
+ } })),
51
+ HeaderButtons,
52
+ react_1.default.createElement("div", { className: classes.grow }),
53
+ react_1.default.createElement("div", { style: { width: 150, maxHeight: 48 } },
54
+ react_1.default.createElement(AppLogo_1.default, { session: session }))));
55
+ });
56
+ exports.default = AppToolbar;
@@ -1,11 +1,13 @@
1
1
  /// <reference types="react" />
2
- import { InputProps as IIP } from '@mui/material';
2
+ import { InputProps as IIP, TextFieldProps as TFP } from '@mui/material';
3
3
  import { AbstractSessionModel } from '../util';
4
- declare const AssemblySelector: ({ session, onChange, selected, InputProps, extra, }: {
4
+ declare const AssemblySelector: ({ session, onChange, selected, InputProps, TextFieldProps, localStorageKey, helperText, }: {
5
5
  session: AbstractSessionModel;
6
+ helperText?: string | undefined;
6
7
  onChange: (arg: string) => void;
7
8
  selected?: string | undefined;
9
+ localStorageKey?: string | undefined;
8
10
  InputProps?: IIP | undefined;
9
- extra?: unknown;
11
+ TextFieldProps?: TFP | undefined;
10
12
  }) => JSX.Element;
11
13
  export default AssemblySelector;
@@ -35,17 +35,17 @@ const useStyles = (0, mui_1.makeStyles)()({
35
35
  minWidth: 180,
36
36
  },
37
37
  });
38
- const AssemblySelector = (0, mobx_react_1.observer)(({ session, onChange, selected, InputProps, extra = 0, }) => {
38
+ const AssemblySelector = (0, mobx_react_1.observer)(({ session, onChange, selected, InputProps, TextFieldProps, localStorageKey, helperText = 'Select assembly to view', }) => {
39
39
  const { classes } = useStyles();
40
40
  const { assemblyNames, assemblyManager } = session;
41
41
  // constructs a localstorage key based on host/path/config to help
42
42
  // remember. non-config assists usage with e.g. embedded apps
43
43
  const config = new URLSearchParams(window.location.search).get('config');
44
- const [lastSelected, setLastSelected] = typeof jest === 'undefined'
44
+ const [lastSelected, setLastSelected] = typeof jest === 'undefined' && localStorageKey
45
45
  ? (0, util_1.useLocalStorage)(`lastAssembly-${[
46
46
  window.location.host + window.location.pathname,
47
47
  config,
48
- extra,
48
+ localStorageKey,
49
49
  ].join('-')}`, selected)
50
50
  : (0, react_1.useState)(selected);
51
51
  const selection = assemblyNames.includes(lastSelected || '')
@@ -57,7 +57,7 @@ const AssemblySelector = (0, mobx_react_1.observer)(({ session, onChange, select
57
57
  }
58
58
  }, [selection, onChange, selected]);
59
59
  const error = assemblyNames.length ? '' : 'No configured assemblies';
60
- return (react_1.default.createElement(material_1.TextField, { select: true, label: "Assembly", variant: "outlined", helperText: error || 'Select assembly to view', value: selection || '', inputProps: { 'data-testid': 'assembly-selector' }, onChange: event => setLastSelected(event.target.value), error: !!error, InputProps: InputProps, disabled: !!error, className: classes.importFormEntry }, assemblyNames.map(name => {
60
+ return (react_1.default.createElement(material_1.TextField, { select: true, label: "Assembly", variant: "outlined", helperText: error || helperText, value: selection || '', inputProps: { 'data-testid': 'assembly-selector' }, onChange: event => setLastSelected(event.target.value), error: !!error, InputProps: InputProps, disabled: !!error, className: classes.importFormEntry, ...TextFieldProps }, assemblyNames.map(name => {
61
61
  const assembly = assemblyManager.get(name);
62
62
  const displayName = assembly ? (0, configuration_1.getConf)(assembly, 'displayName') : '';
63
63
  return (react_1.default.createElement(material_1.MenuItem, { key: name, value: name }, displayName || name));
package/ui/Dialog.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { DialogProps } from '@mui/material';
3
+ declare function JBrowseDialog(props: DialogProps & {
4
+ title: string;
5
+ }): JSX.Element;
6
+ declare const _default: typeof JBrowseDialog;
7
+ export default _default;
package/ui/Dialog.js ADDED
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const material_1 = require("@mui/material");
8
+ const mobx_react_1 = require("mobx-react");
9
+ const mui_1 = require("tss-react/mui");
10
+ // icons
11
+ const Close_1 = __importDefault(require("@mui/icons-material/Close"));
12
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
13
+ closeButton: {
14
+ position: 'absolute',
15
+ right: theme.spacing(1),
16
+ top: theme.spacing(1),
17
+ color: theme.palette.grey[500],
18
+ },
19
+ }));
20
+ function JBrowseDialog(props) {
21
+ const { classes } = useStyles();
22
+ const { title, children, onClose } = props;
23
+ return (react_1.default.createElement(material_1.Dialog, { ...props },
24
+ react_1.default.createElement(material_1.ScopedCssBaseline, null,
25
+ react_1.default.createElement(material_1.DialogTitle, null,
26
+ title,
27
+ onClose ? (react_1.default.createElement(material_1.IconButton, { className: classes.closeButton, onClick: () => {
28
+ // @ts-ignore
29
+ onClose();
30
+ } },
31
+ react_1.default.createElement(Close_1.default, null))) : null),
32
+ react_1.default.createElement(material_1.Divider, null),
33
+ children)));
34
+ }
35
+ exports.default = (0, mobx_react_1.observer)(JBrowseDialog);
@@ -3,13 +3,9 @@ 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
- const Button_1 = __importDefault(require("@mui/material/Button"));
7
- const Dialog_1 = __importDefault(require("@mui/material/Dialog"));
8
- const DialogTitle_1 = __importDefault(require("@mui/material/DialogTitle"));
9
- const DialogContent_1 = __importDefault(require("@mui/material/DialogContent"));
10
- const DialogContentText_1 = __importDefault(require("@mui/material/DialogContentText"));
11
- const DialogActions_1 = __importDefault(require("@mui/material/DialogActions"));
12
6
  const react_1 = __importDefault(require("react"));
7
+ const material_1 = require("@mui/material");
8
+ const Dialog_1 = __importDefault(require("@jbrowse/core/ui/Dialog"));
13
9
  exports.default = ({ onClose, open, onFactoryReset, }) => {
14
10
  function handleDialogClose(action) {
15
11
  if (action === 'reset') {
@@ -17,11 +13,10 @@ exports.default = ({ onClose, open, onFactoryReset, }) => {
17
13
  }
18
14
  onClose();
19
15
  }
20
- return (react_1.default.createElement(Dialog_1.default, { open: open, onClose: () => handleDialogClose() },
21
- react_1.default.createElement(DialogTitle_1.default, { id: "alert-dialog-title" }, "Reset"),
22
- react_1.default.createElement(DialogContent_1.default, null,
23
- react_1.default.createElement(DialogContentText_1.default, { id: "alert-dialog-description" }, "Are you sure you want to reset? This will restore the default configuration.")),
24
- react_1.default.createElement(DialogActions_1.default, null,
25
- react_1.default.createElement(Button_1.default, { onClick: () => handleDialogClose(), color: "primary" }, "Cancel"),
26
- react_1.default.createElement(Button_1.default, { onClick: () => handleDialogClose('reset'), color: "primary", variant: "contained" }, "OK"))));
16
+ return (react_1.default.createElement(Dialog_1.default, { title: "Reset", onClose: () => handleDialogClose(), open: open },
17
+ react_1.default.createElement(material_1.DialogContent, null,
18
+ react_1.default.createElement(material_1.DialogContentText, null, "Are you sure you want to reset? This will restore the default configuration.")),
19
+ react_1.default.createElement(material_1.DialogActions, null,
20
+ react_1.default.createElement(material_1.Button, { onClick: () => handleDialogClose(), color: "primary" }, "Cancel"),
21
+ react_1.default.createElement(material_1.Button, { onClick: () => handleDialogClose('reset'), color: "primary", variant: "contained" }, "OK"))));
27
22
  };
@@ -1,28 +1,11 @@
1
1
  /// <reference types="react" />
2
- import ReactPropTypes from 'prop-types';
3
2
  declare function PrerenderedCanvas(props: {
4
3
  width: number;
5
4
  height: number;
6
- highResolutionScaling: number;
7
- style: any;
8
- imageData: any;
5
+ highResolutionScaling?: number;
6
+ style?: any;
7
+ imageData?: any;
9
8
  showSoftClip?: boolean;
10
9
  blockKey?: string;
11
10
  }): JSX.Element;
12
- declare namespace PrerenderedCanvas {
13
- var propTypes: {
14
- height: ReactPropTypes.Validator<number>;
15
- width: ReactPropTypes.Validator<number>;
16
- highResolutionScaling: ReactPropTypes.Requireable<number>;
17
- style: ReactPropTypes.Requireable<{
18
- [x: string]: any;
19
- }>;
20
- imageData: ReactPropTypes.Requireable<any>;
21
- };
22
- var defaultProps: {
23
- imageData: undefined;
24
- highResolutionScaling: number;
25
- style: {};
26
- };
27
- }
28
11
  export default PrerenderedCanvas;
@@ -22,16 +22,12 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
25
  Object.defineProperty(exports, "__esModule", { value: true });
29
26
  /* eslint-disable @typescript-eslint/no-explicit-any */
30
- const prop_types_1 = __importDefault(require("prop-types"));
31
27
  const react_1 = __importStar(require("react"));
32
28
  const offscreenCanvasPonyfill_1 = require("../util/offscreenCanvasPonyfill");
33
29
  function PrerenderedCanvas(props) {
34
- const { width, height, highResolutionScaling, style, imageData, blockKey, showSoftClip, } = props;
30
+ const { width, height, highResolutionScaling = 1, style = {}, imageData, blockKey, showSoftClip, } = props;
35
31
  const [done, setDone] = (0, react_1.useState)(false);
36
32
  const featureCanvas = (0, react_1.useRef)(null);
37
33
  (0, react_1.useEffect)(() => {
@@ -54,18 +50,4 @@ function PrerenderedCanvas(props) {
54
50
  const testId = `prerendered_canvas${softClipString}${blockKeyStr}${done ? '_done' : ''}`;
55
51
  return (react_1.default.createElement("canvas", { "data-testid": testId, ref: featureCanvas, width: width * highResolutionScaling, height: height * highResolutionScaling, style: { width, height, ...style } }));
56
52
  }
57
- PrerenderedCanvas.propTypes = {
58
- height: prop_types_1.default.number.isRequired,
59
- width: prop_types_1.default.number.isRequired,
60
- highResolutionScaling: prop_types_1.default.number,
61
- style: prop_types_1.default.objectOf(prop_types_1.default.any),
62
- imageData: prop_types_1.default.any,
63
- // config: ReactPropTypes.objectOf(ReactPropTypes.any),
64
- };
65
- PrerenderedCanvas.defaultProps = {
66
- imageData: undefined,
67
- highResolutionScaling: 1,
68
- style: {},
69
- // config: {},
70
- };
71
53
  exports.default = PrerenderedCanvas;
@@ -6,24 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const mobx_react_1 = require("mobx-react");
8
8
  const material_1 = require("@mui/material");
9
- const mui_1 = require("tss-react/mui");
10
- const Close_1 = __importDefault(require("@mui/icons-material/Close"));
11
- const useStyles = (0, mui_1.makeStyles)()(theme => ({
12
- closeButton: {
13
- position: 'absolute',
14
- right: theme.spacing(1),
15
- top: theme.spacing(1),
16
- color: theme.palette.grey[500],
17
- },
18
- }));
9
+ const Dialog_1 = __importDefault(require("./Dialog"));
19
10
  function ReturnToImportFormDialog({ model, handleClose, }) {
20
- const { classes } = useStyles();
21
- return (react_1.default.createElement(material_1.Dialog, { maxWidth: "xl", open: true, onClose: handleClose },
22
- react_1.default.createElement(material_1.DialogTitle, null,
23
- "Reference sequence",
24
- handleClose ? (react_1.default.createElement(material_1.IconButton, { className: classes.closeButton, onClick: () => handleClose(), size: "large" },
25
- react_1.default.createElement(Close_1.default, null))) : null),
26
- react_1.default.createElement(material_1.Divider, null),
11
+ return (react_1.default.createElement(Dialog_1.default, { maxWidth: "xl", open: true, onClose: handleClose, title: "Reference sequence" },
27
12
  react_1.default.createElement(material_1.DialogContent, null,
28
13
  react_1.default.createElement(material_1.Typography, null, "Are you sure you want to return to the import form? This will lose your current view")),
29
14
  react_1.default.createElement(material_1.DialogActions, null,
package/ui/Snackbar.js CHANGED
@@ -1,79 +1,33 @@
1
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
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
4
  };
28
5
  Object.defineProperty(exports, "__esModule", { value: true });
29
- const react_1 = __importStar(require("react"));
6
+ const react_1 = __importDefault(require("react"));
30
7
  const material_1 = require("@mui/material");
31
- const Close_1 = __importDefault(require("@mui/icons-material/Close"));
32
8
  const mobx_react_1 = require("mobx-react");
9
+ // icons
10
+ const Close_1 = __importDefault(require("@mui/icons-material/Close"));
33
11
  function MessageSnackbar({ session, }) {
34
- const [open, setOpen] = (0, react_1.useState)(false);
35
- const [snackbarMessage, setSnackbarMessage] = (0, react_1.useState)();
36
12
  const { popSnackbarMessage, snackbarMessages } = session;
37
13
  const latestMessage = snackbarMessages.length
38
14
  ? snackbarMessages[snackbarMessages.length - 1]
39
15
  : null;
40
- (0, react_1.useEffect)(() => {
41
- let timeoutId;
42
- if (snackbarMessage) {
43
- if (!latestMessage) {
44
- setSnackbarMessage(undefined);
45
- }
46
- else if (snackbarMessage[0] !== latestMessage[0]) {
47
- setOpen(false);
48
- timeoutId = setTimeout(() => {
49
- setSnackbarMessage(latestMessage);
50
- setOpen(true);
51
- }, 100);
52
- }
53
- }
54
- else if (latestMessage) {
55
- setSnackbarMessage(latestMessage);
56
- setOpen(true);
57
- }
58
- return () => {
59
- clearTimeout(timeoutId);
60
- };
61
- }, [latestMessage, snackbarMessage]);
62
16
  const handleClose = (_event, reason) => {
63
17
  if (reason === 'clickaway') {
64
18
  return;
65
19
  }
66
20
  popSnackbarMessage();
67
- setOpen(false);
68
21
  };
69
- const [message, level, action] = snackbarMessage || [];
70
- return (react_1.default.createElement(material_1.Snackbar, { open: open && !!message, onClose: handleClose, anchorOrigin: { vertical: 'bottom', horizontal: 'center' } },
22
+ const open = !!latestMessage;
23
+ const [message, level, action] = latestMessage || [];
24
+ return (react_1.default.createElement(material_1.Snackbar, { open: open, onClose: handleClose, anchorOrigin: { vertical: 'bottom', horizontal: 'center' } },
71
25
  react_1.default.createElement(material_1.Alert, { onClose: handleClose, action: action ? (react_1.default.createElement(react_1.default.Fragment, null,
72
26
  react_1.default.createElement(material_1.Button, { color: "inherit", onClick: e => {
73
27
  action.onClick();
74
28
  handleClose(e);
75
29
  } }, action.name),
76
- react_1.default.createElement(material_1.IconButton, { "aria-label": "close", color: "inherit", onClick: handleClose },
30
+ react_1.default.createElement(material_1.IconButton, { color: "inherit", onClick: handleClose },
77
31
  react_1.default.createElement(Close_1.default, null)))) : null, severity: level || 'warning' }, message)));
78
32
  }
79
33
  exports.default = (0, mobx_react_1.observer)(MessageSnackbar);
@@ -0,0 +1,18 @@
1
+ /// <reference types="react" />
2
+ import { NotificationLevel, SnackAction, SessionWithDrawerWidgets } from '../util';
3
+ import { MenuItem as JBMenuItem } from './Menu';
4
+ type SnackbarMessage = [string, NotificationLevel, SnackAction];
5
+ type AppSession = SessionWithDrawerWidgets & {
6
+ savedSessionNames: string[];
7
+ menus: {
8
+ label: string;
9
+ menuItems: JBMenuItem[];
10
+ }[];
11
+ renameCurrentSession: (arg: string) => void;
12
+ snackbarMessages: SnackbarMessage[];
13
+ popSnackbarMessage: () => unknown;
14
+ };
15
+ declare const ViewLauncher: ({ session }: {
16
+ session: AppSession;
17
+ }) => JSX.Element;
18
+ export default ViewLauncher;