@jbrowse/app-core 2.6.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 (107) hide show
  1. package/LICENSE +201 -0
  2. package/dist/Assemblies/SessionAssembliesMixin.d.ts +72 -0
  3. package/dist/Assemblies/SessionAssembliesMixin.js +44 -0
  4. package/dist/Assemblies/TemporaryAssembliesMixin.d.ts +22 -0
  5. package/dist/Assemblies/TemporaryAssembliesMixin.js +45 -0
  6. package/dist/Assemblies/index.d.ts +2 -0
  7. package/dist/Assemblies/index.js +18 -0
  8. package/dist/HistoryManagement/index.d.ts +30 -0
  9. package/dist/HistoryManagement/index.js +54 -0
  10. package/dist/JBrowseConfig/index.d.ts +158 -0
  11. package/dist/JBrowseConfig/index.js +155 -0
  12. package/dist/JBrowseModel/index.d.ts +144 -0
  13. package/dist/JBrowseModel/index.js +132 -0
  14. package/dist/RootMenu/index.d.ts +68 -0
  15. package/dist/RootMenu/index.js +142 -0
  16. package/dist/index.d.ts +6 -0
  17. package/dist/index.js +22 -0
  18. package/dist/ui/App/App.d.ts +19 -0
  19. package/dist/ui/App/App.js +95 -0
  20. package/dist/ui/App/AppFab.d.ts +6 -0
  21. package/dist/ui/App/AppFab.js +32 -0
  22. package/dist/ui/App/AppToolbar.d.ts +19 -0
  23. package/dist/ui/App/AppToolbar.js +54 -0
  24. package/dist/ui/App/DialogQueue.d.ts +6 -0
  25. package/dist/ui/App/DialogQueue.js +32 -0
  26. package/dist/ui/App/Drawer.d.ts +8 -0
  27. package/dist/ui/App/Drawer.js +34 -0
  28. package/dist/ui/App/DrawerWidget.d.ts +6 -0
  29. package/dist/ui/App/DrawerWidget.js +132 -0
  30. package/dist/ui/App/ViewContainer.d.ts +9 -0
  31. package/dist/ui/App/ViewContainer.js +76 -0
  32. package/dist/ui/App/ViewContainerTitle.d.ts +6 -0
  33. package/dist/ui/App/ViewContainerTitle.js +42 -0
  34. package/dist/ui/App/ViewLauncher.d.ts +18 -0
  35. package/dist/ui/App/ViewLauncher.js +50 -0
  36. package/dist/ui/App/ViewMenu.d.ts +9 -0
  37. package/dist/ui/App/ViewMenu.js +38 -0
  38. package/dist/ui/App/ViewPanel.d.ts +19 -0
  39. package/dist/ui/App/ViewPanel.js +50 -0
  40. package/dist/ui/App/index.d.ts +1 -0
  41. package/dist/ui/App/index.js +17 -0
  42. package/dist/ui/index.d.ts +1 -0
  43. package/dist/ui/index.js +17 -0
  44. package/esm/Assemblies/SessionAssembliesMixin.d.ts +72 -0
  45. package/esm/Assemblies/SessionAssembliesMixin.js +40 -0
  46. package/esm/Assemblies/TemporaryAssembliesMixin.d.ts +22 -0
  47. package/esm/Assemblies/TemporaryAssembliesMixin.js +41 -0
  48. package/esm/Assemblies/index.d.ts +2 -0
  49. package/esm/Assemblies/index.js +2 -0
  50. package/esm/HistoryManagement/index.d.ts +30 -0
  51. package/esm/HistoryManagement/index.js +47 -0
  52. package/esm/JBrowseConfig/index.d.ts +158 -0
  53. package/esm/JBrowseConfig/index.js +148 -0
  54. package/esm/JBrowseModel/index.d.ts +144 -0
  55. package/esm/JBrowseModel/index.js +128 -0
  56. package/esm/RootMenu/index.d.ts +68 -0
  57. package/esm/RootMenu/index.js +138 -0
  58. package/esm/index.d.ts +6 -0
  59. package/esm/index.js +6 -0
  60. package/esm/ui/App/App.d.ts +19 -0
  61. package/esm/ui/App/App.js +66 -0
  62. package/esm/ui/App/AppFab.d.ts +6 -0
  63. package/esm/ui/App/AppFab.js +27 -0
  64. package/esm/ui/App/AppToolbar.d.ts +19 -0
  65. package/esm/ui/App/AppToolbar.js +49 -0
  66. package/esm/ui/App/DialogQueue.d.ts +6 -0
  67. package/esm/ui/App/DialogQueue.js +7 -0
  68. package/esm/ui/App/Drawer.d.ts +8 -0
  69. package/esm/ui/App/Drawer.js +29 -0
  70. package/esm/ui/App/DrawerWidget.d.ts +6 -0
  71. package/esm/ui/App/DrawerWidget.js +104 -0
  72. package/esm/ui/App/ViewContainer.d.ts +9 -0
  73. package/esm/ui/App/ViewContainer.js +48 -0
  74. package/esm/ui/App/ViewContainerTitle.d.ts +6 -0
  75. package/esm/ui/App/ViewContainerTitle.js +37 -0
  76. package/esm/ui/App/ViewLauncher.d.ts +18 -0
  77. package/esm/ui/App/ViewLauncher.js +25 -0
  78. package/esm/ui/App/ViewMenu.d.ts +9 -0
  79. package/esm/ui/App/ViewMenu.js +33 -0
  80. package/esm/ui/App/ViewPanel.d.ts +19 -0
  81. package/esm/ui/App/ViewPanel.js +22 -0
  82. package/esm/ui/App/index.d.ts +1 -0
  83. package/esm/ui/App/index.js +1 -0
  84. package/esm/ui/index.d.ts +1 -0
  85. package/esm/ui/index.js +1 -0
  86. package/package.json +66 -0
  87. package/src/Assemblies/SessionAssembliesMixin.ts +50 -0
  88. package/src/Assemblies/TemporaryAssembliesMixin.ts +51 -0
  89. package/src/Assemblies/index.ts +2 -0
  90. package/src/HistoryManagement/index.ts +56 -0
  91. package/src/JBrowseConfig/index.ts +173 -0
  92. package/src/JBrowseModel/index.ts +150 -0
  93. package/src/RootMenu/index.ts +157 -0
  94. package/src/index.ts +6 -0
  95. package/src/ui/App/App.tsx +117 -0
  96. package/src/ui/App/AppFab.tsx +45 -0
  97. package/src/ui/App/AppToolbar.tsx +89 -0
  98. package/src/ui/App/DialogQueue.tsx +22 -0
  99. package/src/ui/App/Drawer.tsx +56 -0
  100. package/src/ui/App/DrawerWidget.tsx +238 -0
  101. package/src/ui/App/ViewContainer.tsx +76 -0
  102. package/src/ui/App/ViewContainerTitle.tsx +55 -0
  103. package/src/ui/App/ViewLauncher.tsx +64 -0
  104. package/src/ui/App/ViewMenu.tsx +54 -0
  105. package/src/ui/App/ViewPanel.tsx +63 -0
  106. package/src/ui/App/index.ts +1 -0
  107. package/src/ui/index.ts +1 -0
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { SessionWithDrawerWidgets } from '@jbrowse/core/util';
3
+ import { SnackbarMessage } from '@jbrowse/core/ui/SnackbarModel';
4
+ import { MenuItem as JBMenuItem } from '@jbrowse/core/ui/Menu';
5
+ type Props = {
6
+ HeaderButtons?: React.ReactElement;
7
+ session: SessionWithDrawerWidgets & {
8
+ savedSessionNames: string[];
9
+ menus: {
10
+ label: string;
11
+ menuItems: JBMenuItem[];
12
+ }[];
13
+ renameCurrentSession: (arg: string) => void;
14
+ snackbarMessages: SnackbarMessage[];
15
+ popSnackbarMessage: () => unknown;
16
+ };
17
+ };
18
+ declare const App: (props: Props) => React.JSX.Element;
19
+ export { App };
@@ -0,0 +1,95 @@
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.App = void 0;
30
+ const react_1 = __importStar(require("react"));
31
+ const material_1 = require("@mui/material");
32
+ const mui_1 = require("tss-react/mui");
33
+ const mobx_react_1 = require("mobx-react");
34
+ const Snackbar_1 = __importDefault(require("@jbrowse/core/ui/Snackbar"));
35
+ // locals
36
+ const AppToolbar_1 = __importDefault(require("./AppToolbar"));
37
+ const ViewLauncher_1 = __importDefault(require("./ViewLauncher"));
38
+ const ViewPanel_1 = __importDefault(require("./ViewPanel"));
39
+ const DialogQueue_1 = __importDefault(require("./DialogQueue"));
40
+ const AppFab_1 = __importDefault(require("./AppFab"));
41
+ const DrawerWidget = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./DrawerWidget'))));
42
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
43
+ root: {
44
+ display: 'grid',
45
+ height: '100vh',
46
+ width: '100%',
47
+ colorScheme: theme.palette.mode,
48
+ },
49
+ appContainer: {
50
+ gridColumn: 'main',
51
+ display: 'grid',
52
+ gridTemplateRows: '[menubar] min-content [components] auto',
53
+ height: '100vh',
54
+ },
55
+ viewContainer: {
56
+ overflowY: 'auto',
57
+ gridRow: 'components',
58
+ },
59
+ appBar: {
60
+ flexGrow: 1,
61
+ gridRow: 'menubar',
62
+ },
63
+ }));
64
+ const LazyDrawerWidget = (0, mobx_react_1.observer)(function (props) {
65
+ const { session } = props;
66
+ return (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(react_1.default.Fragment, null) },
67
+ react_1.default.createElement(DrawerWidget, { session: session })));
68
+ });
69
+ const ViewContainer = (0, mobx_react_1.observer)(function (props) {
70
+ const { session } = props;
71
+ const { views } = session;
72
+ const { classes } = useStyles();
73
+ return (react_1.default.createElement("div", { className: classes.viewContainer },
74
+ views.length > 0 ? (views.map(view => (react_1.default.createElement(ViewPanel_1.default, { key: `view-${view.id}`, view: view, session: session })))) : (react_1.default.createElement(ViewLauncher_1.default, { ...props })),
75
+ react_1.default.createElement("div", { style: { height: 300 } })));
76
+ });
77
+ const App = (0, mobx_react_1.observer)(function (props) {
78
+ const { session } = props;
79
+ const { classes } = useStyles();
80
+ const { minimized, visibleWidget, drawerWidth, drawerPosition } = session;
81
+ const drawerVisible = visibleWidget && !minimized;
82
+ const d = drawerVisible ? `[drawer] ${drawerWidth}px` : undefined;
83
+ const grid = drawerPosition === 'right' ? ['[main] 1fr', d] : [d, '[main] 1fr'];
84
+ return (react_1.default.createElement("div", { className: classes.root, style: { gridTemplateColumns: grid === null || grid === void 0 ? void 0 : grid.filter(f => !!f).join(' ') } },
85
+ drawerVisible && drawerPosition === 'left' ? (react_1.default.createElement(LazyDrawerWidget, { session: session })) : null,
86
+ react_1.default.createElement(DialogQueue_1.default, { session: session }),
87
+ react_1.default.createElement("div", { className: classes.appContainer },
88
+ react_1.default.createElement(material_1.AppBar, { className: classes.appBar, position: "static" },
89
+ react_1.default.createElement(AppToolbar_1.default, { ...props })),
90
+ react_1.default.createElement(ViewContainer, { ...props })),
91
+ react_1.default.createElement(AppFab_1.default, { session: session }),
92
+ drawerVisible && drawerPosition === 'right' ? (react_1.default.createElement(LazyDrawerWidget, { session: session })) : null,
93
+ react_1.default.createElement(Snackbar_1.default, { session: session })));
94
+ });
95
+ exports.App = App;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { SessionWithDrawerWidgets } from '@jbrowse/core/util';
3
+ declare const _default: ({ session, }: {
4
+ session: SessionWithDrawerWidgets;
5
+ }) => React.JSX.Element | null;
6
+ export default _default;
@@ -0,0 +1,32 @@
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
+ // icons
11
+ const Launch_1 = __importDefault(require("@mui/icons-material/Launch"));
12
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
13
+ left: {
14
+ zIndex: 10000,
15
+ position: 'fixed',
16
+ bottom: theme.spacing(2),
17
+ left: theme.spacing(2),
18
+ },
19
+ right: {
20
+ zIndex: 10000,
21
+ position: 'fixed',
22
+ bottom: theme.spacing(2),
23
+ right: theme.spacing(2),
24
+ },
25
+ }));
26
+ exports.default = (0, mobx_react_1.observer)(function AppFab({ session, }) {
27
+ const { minimized, activeWidgets, drawerPosition } = session;
28
+ const { classes } = useStyles();
29
+ return activeWidgets.size > 0 && minimized ? (react_1.default.createElement(material_1.Tooltip, { title: "Open drawer widget" },
30
+ react_1.default.createElement(material_1.Fab, { className: drawerPosition === 'right' ? classes.right : classes.left, color: "primary", "data-testid": "drawer-maximize", onClick: () => session.showWidgetDrawer() },
31
+ react_1.default.createElement(Launch_1.default, null)))) : null;
32
+ });
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { SessionWithDrawerWidgets } from '@jbrowse/core/util';
3
+ import { MenuItem as JBMenuItem } from '@jbrowse/core/ui/Menu';
4
+ import { SnackbarMessage } from '@jbrowse/core/ui/SnackbarModel';
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
+ }) => React.JSX.Element;
19
+ export default AppToolbar;
@@ -0,0 +1,54 @@
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
+ const DropDownMenu_1 = __importDefault(require("@jbrowse/core/ui/DropDownMenu"));
11
+ const EditableTypography_1 = __importDefault(require("@jbrowse/core/ui/EditableTypography"));
12
+ const AppLogo_1 = __importDefault(require("@jbrowse/core/ui/AppLogo"));
13
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
14
+ grow: {
15
+ flexGrow: 1,
16
+ },
17
+ inputBase: {
18
+ color: theme.palette.primary.contrastText,
19
+ },
20
+ inputRoot: {
21
+ '&:hover': {
22
+ backgroundColor: theme.palette.primary.light,
23
+ },
24
+ },
25
+ inputFocused: {
26
+ borderColor: theme.palette.secondary.main,
27
+ backgroundColor: theme.palette.primary.light,
28
+ },
29
+ }));
30
+ const AppToolbar = (0, mobx_react_1.observer)(function ({ session, HeaderButtons = react_1.default.createElement("div", null), }) {
31
+ const { classes } = useStyles();
32
+ const { savedSessionNames, name, menus } = session;
33
+ return (react_1.default.createElement(material_1.Toolbar, null,
34
+ menus.map(menu => (react_1.default.createElement(DropDownMenu_1.default, { key: menu.label, menuTitle: menu.label, menuItems: menu.menuItems, session: session }))),
35
+ react_1.default.createElement("div", { className: classes.grow }),
36
+ react_1.default.createElement(material_1.Tooltip, { title: "Rename Session", arrow: true },
37
+ react_1.default.createElement(EditableTypography_1.default, { value: name, setValue: newName => {
38
+ if (savedSessionNames === null || savedSessionNames === void 0 ? void 0 : savedSessionNames.includes(newName)) {
39
+ session.notify(`Cannot rename session to "${newName}", a saved session with that name already exists`, 'warning');
40
+ }
41
+ else {
42
+ session.renameCurrentSession(newName);
43
+ }
44
+ }, variant: "body1", classes: {
45
+ inputBase: classes.inputBase,
46
+ inputRoot: classes.inputRoot,
47
+ inputFocused: classes.inputFocused,
48
+ } })),
49
+ HeaderButtons,
50
+ react_1.default.createElement("div", { className: classes.grow }),
51
+ react_1.default.createElement("div", { style: { width: 150, maxHeight: 48 } },
52
+ react_1.default.createElement(AppLogo_1.default, { session: session }))));
53
+ });
54
+ exports.default = AppToolbar;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { SessionWithDrawerWidgets } from '@jbrowse/core/util';
3
+ declare const _default: ({ session, }: {
4
+ session: SessionWithDrawerWidgets;
5
+ }) => React.JSX.Element;
6
+ export default _default;
@@ -0,0 +1,32 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const react_1 = __importStar(require("react"));
27
+ const mobx_react_1 = require("mobx-react");
28
+ exports.default = (0, mobx_react_1.observer)(function ({ session, }) {
29
+ const { DialogComponent, DialogProps } = session;
30
+ return (react_1.default.createElement(react_1.default.Fragment, null, DialogComponent ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(react_1.default.Fragment, null) },
31
+ react_1.default.createElement(DialogComponent, { ...DialogProps }))) : null));
32
+ });
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { SessionWithDrawerWidgets } from '@jbrowse/core/util/types';
3
+ declare function Drawer({ children, session, }: {
4
+ children: React.ReactNode;
5
+ session: SessionWithDrawerWidgets;
6
+ }): React.JSX.Element;
7
+ declare const _default: typeof Drawer;
8
+ export default _default;
@@ -0,0 +1,34 @@
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
+ const ResizeHandle_1 = __importDefault(require("@jbrowse/core/ui/ResizeHandle"));
11
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
12
+ paper: {
13
+ overflowY: 'auto',
14
+ height: '100%',
15
+ zIndex: theme.zIndex.drawer,
16
+ outline: 'none',
17
+ background: theme.palette.background.default,
18
+ },
19
+ resizeHandle: {
20
+ width: 4,
21
+ position: 'fixed',
22
+ top: 0,
23
+ zIndex: theme.zIndex.drawer + 1,
24
+ },
25
+ }));
26
+ function Drawer({ children, session, }) {
27
+ const { drawerPosition, drawerWidth } = session;
28
+ const { classes } = useStyles();
29
+ return (react_1.default.createElement(material_1.Paper, { className: classes.paper, elevation: 16, square: true },
30
+ drawerPosition === 'right' ? (react_1.default.createElement(ResizeHandle_1.default, { onDrag: session.resizeDrawer, className: classes.resizeHandle, vertical: true })) : null,
31
+ children,
32
+ drawerPosition === 'left' ? (react_1.default.createElement(ResizeHandle_1.default, { onDrag: session.resizeDrawer, className: classes.resizeHandle, style: { left: drawerWidth }, vertical: true })) : null));
33
+ }
34
+ exports.default = (0, mobx_react_1.observer)(Drawer);
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { SessionWithDrawerWidgets } from '@jbrowse/core/util/types';
3
+ declare const DrawerWidget: ({ session, }: {
4
+ session: SessionWithDrawerWidgets;
5
+ }) => React.JSX.Element;
6
+ export default DrawerWidget;
@@ -0,0 +1,132 @@
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 react_error_boundary_1 = require("react-error-boundary");
31
+ const material_1 = require("@mui/material");
32
+ const mui_1 = require("tss-react/mui");
33
+ const mobx_react_1 = require("mobx-react");
34
+ const util_1 = require("@jbrowse/core/util");
35
+ const LoadingEllipses_1 = __importDefault(require("@jbrowse/core/ui/LoadingEllipses"));
36
+ const ErrorMessage_1 = __importDefault(require("@jbrowse/core/ui/ErrorMessage"));
37
+ // icons
38
+ const Delete_1 = __importDefault(require("@mui/icons-material/Delete"));
39
+ const Close_1 = __importDefault(require("@mui/icons-material/Close"));
40
+ const Minimize_1 = __importDefault(require("@mui/icons-material/Minimize"));
41
+ const MoreVert_1 = __importDefault(require("@mui/icons-material/MoreVert"));
42
+ // locals
43
+ const Drawer_1 = __importDefault(require("./Drawer"));
44
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
45
+ formControl: {
46
+ margin: 0,
47
+ },
48
+ spacer: {
49
+ flexGrow: 1,
50
+ },
51
+ drawerSelect: {
52
+ margin: 0,
53
+ color: theme.palette.secondary.contrastText,
54
+ },
55
+ dropDownIcon: {
56
+ color: theme.palette.secondary.contrastText,
57
+ },
58
+ header: {
59
+ background: theme.palette.secondary.main,
60
+ },
61
+ }));
62
+ const DrawerHeader = (0, mobx_react_1.observer)(function ({ session, setToolbarHeight, }) {
63
+ const { pluginManager } = (0, util_1.getEnv)(session);
64
+ const { visibleWidget, activeWidgets, drawerPosition } = session;
65
+ const { classes } = useStyles();
66
+ const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
67
+ return (react_1.default.createElement(material_1.AppBar, { position: "sticky", className: classes.header, ref: ref => setToolbarHeight((ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect().height) || 0) },
68
+ react_1.default.createElement(material_1.Toolbar, { disableGutters: true },
69
+ react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
70
+ react_1.default.createElement(material_1.Select, { value: visibleWidget === null || visibleWidget === void 0 ? void 0 : visibleWidget.id, "data-testid": "widget-drawer-selects", className: classes.drawerSelect, classes: { icon: classes.dropDownIcon }, renderValue: widgetId => {
71
+ const widget = session.activeWidgets.get(widgetId);
72
+ if (!widget) {
73
+ return (react_1.default.createElement(material_1.Typography, { variant: "h6", color: "inherit" }, "Unknown widget"));
74
+ }
75
+ const widgetType = pluginManager.getWidgetType(widget.type);
76
+ const { HeadingComponent, heading } = widgetType;
77
+ return HeadingComponent ? (react_1.default.createElement(HeadingComponent, { model: widget })) : (react_1.default.createElement(material_1.Typography, { variant: "h6", color: "inherit" }, heading));
78
+ }, onChange: e => {
79
+ const w = session.activeWidgets.get(e.target.value);
80
+ if (w) {
81
+ session.showWidget(w);
82
+ }
83
+ else {
84
+ session.notify(`Widget not found ${e.target.value}`, 'warning');
85
+ }
86
+ } }, [...activeWidgets.values()].map(widget => {
87
+ const widgetType = pluginManager.getWidgetType(widget.type);
88
+ const { HeadingComponent, heading } = widgetType;
89
+ return (react_1.default.createElement(material_1.MenuItem, { "data-testid": `widget-drawer-selects-item-${widget.type}`, key: widget.id, value: widget.id },
90
+ HeadingComponent ? (react_1.default.createElement(HeadingComponent, { model: widget })) : (react_1.default.createElement(material_1.Typography, { variant: "h6", color: "inherit" }, heading)),
91
+ react_1.default.createElement(material_1.IconButton, { "data-testid": `${widget.type}-drawer-delete`, color: "inherit", "aria-label": "Delete", onClick: () => session.hideWidget(widget) },
92
+ react_1.default.createElement(Delete_1.default, null))));
93
+ }))),
94
+ react_1.default.createElement("div", { className: classes.spacer }),
95
+ react_1.default.createElement("div", null,
96
+ react_1.default.createElement(material_1.IconButton, { "data-testid": "drawer-close", color: "inherit", onClick: event => setAnchorEl(event.currentTarget) },
97
+ react_1.default.createElement(MoreVert_1.default, null)),
98
+ react_1.default.createElement(material_1.Tooltip, { title: "Minimize drawer" },
99
+ react_1.default.createElement(material_1.IconButton, { "data-testid": "drawer-minimize", color: "inherit", onClick: () => {
100
+ session.notify(`Drawer minimized, click button on ${drawerPosition} side of screen to re-open`, 'info');
101
+ session.minimizeWidgetDrawer();
102
+ } },
103
+ react_1.default.createElement(Minimize_1.default, null))),
104
+ react_1.default.createElement(material_1.Tooltip, { title: "Close drawer" },
105
+ react_1.default.createElement(material_1.IconButton, { "data-testid": "drawer-close", color: "inherit", onClick: () => session.hideWidget(visibleWidget) },
106
+ react_1.default.createElement(Close_1.default, null))))),
107
+ react_1.default.createElement(material_1.Menu, { anchorEl: anchorEl, open: Boolean(anchorEl), onClose: () => setAnchorEl(null) }, ['left', 'right'].map(option => (react_1.default.createElement(material_1.MenuItem, { key: option, selected: drawerPosition === 'option', onClick: () => {
108
+ session.setDrawerPosition(option);
109
+ setAnchorEl(null);
110
+ } }, option))))));
111
+ });
112
+ const DrawerWidget = (0, mobx_react_1.observer)(function ({ session, }) {
113
+ const { visibleWidget } = session;
114
+ const { pluginManager } = (0, util_1.getEnv)(session);
115
+ const DrawerComponent = visibleWidget
116
+ ? pluginManager.evaluateExtensionPoint('Core-replaceWidget', pluginManager.getWidgetType(visibleWidget.type).ReactComponent, {
117
+ session,
118
+ model: visibleWidget,
119
+ })
120
+ : null;
121
+ // we track the toolbar height because components that use virtualized
122
+ // height want to be able to fill the contained, minus the toolbar height
123
+ // (the position static/sticky is included in AutoSizer estimates)
124
+ const [toolbarHeight, setToolbarHeight] = (0, react_1.useState)(0);
125
+ return (react_1.default.createElement(Drawer_1.default, { session: session },
126
+ react_1.default.createElement(DrawerHeader, { session: session, setToolbarHeight: setToolbarHeight }),
127
+ react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(LoadingEllipses_1.default, null) },
128
+ react_1.default.createElement(react_error_boundary_1.ErrorBoundary, { FallbackComponent: ({ error }) => react_1.default.createElement(ErrorMessage_1.default, { error: error }) }, DrawerComponent ? (react_1.default.createElement(react_1.default.Fragment, null,
129
+ react_1.default.createElement(DrawerComponent, { model: visibleWidget, session: session, toolbarHeight: toolbarHeight }),
130
+ react_1.default.createElement("div", { style: { height: 300 } }))) : null))));
131
+ });
132
+ exports.default = DrawerWidget;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { IBaseViewModel } from '@jbrowse/core/pluggableElementTypes/models';
3
+ declare const _default: ({ view, onClose, onMinimize, children, }: {
4
+ view: IBaseViewModel;
5
+ onClose: () => void;
6
+ onMinimize: () => void;
7
+ children: React.ReactNode;
8
+ }) => React.JSX.Element;
9
+ export default _default;
@@ -0,0 +1,76 @@
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 mobx_react_1 = require("mobx-react");
33
+ const util_1 = require("@jbrowse/core/util");
34
+ // icons
35
+ const Close_1 = __importDefault(require("@mui/icons-material/Close"));
36
+ const Minimize_1 = __importDefault(require("@mui/icons-material/Minimize"));
37
+ const Add_1 = __importDefault(require("@mui/icons-material/Add"));
38
+ // locals
39
+ const ViewMenu_1 = __importDefault(require("./ViewMenu"));
40
+ const ViewContainerTitle_1 = __importDefault(require("./ViewContainerTitle"));
41
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
42
+ viewContainer: {
43
+ overflow: 'hidden',
44
+ background: theme.palette.secondary.main,
45
+ margin: theme.spacing(0.5),
46
+ padding: `0 ${theme.spacing(1)} ${theme.spacing(1)}`,
47
+ },
48
+ icon: {
49
+ color: theme.palette.secondary.contrastText,
50
+ },
51
+ grow: {
52
+ flexGrow: 1,
53
+ },
54
+ }));
55
+ exports.default = (0, mobx_react_1.observer)(function ({ view, onClose, onMinimize, children, }) {
56
+ const { classes } = useStyles();
57
+ const theme = (0, material_1.useTheme)();
58
+ const ref = (0, util_1.useWidthSetter)(view, theme.spacing(1));
59
+ const scrollRef = (0, react_1.useRef)(null);
60
+ // scroll the view into view when first mounted. note: this effect will run
61
+ // only once, because of the empty array second param
62
+ (0, react_1.useEffect)(() => {
63
+ var _a, _b;
64
+ (_b = (_a = scrollRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView) === null || _b === void 0 ? void 0 : _b.call(_a, { block: 'center' });
65
+ }, []);
66
+ return (react_1.default.createElement(material_1.Paper, { ref: ref, elevation: 12, className: classes.viewContainer },
67
+ react_1.default.createElement("div", { ref: scrollRef, style: { display: 'flex' } },
68
+ react_1.default.createElement(ViewMenu_1.default, { model: view, IconProps: { className: classes.icon } }),
69
+ react_1.default.createElement("div", { className: classes.grow }),
70
+ react_1.default.createElement(ViewContainerTitle_1.default, { view: view }),
71
+ react_1.default.createElement("div", { className: classes.grow }),
72
+ react_1.default.createElement(material_1.IconButton, { "data-testid": "minimize_view", onClick: onMinimize }, view.minimized ? (react_1.default.createElement(Add_1.default, { className: classes.icon, fontSize: "small" })) : (react_1.default.createElement(Minimize_1.default, { className: classes.icon, fontSize: "small" }))),
73
+ react_1.default.createElement(material_1.IconButton, { "data-testid": "close_view", onClick: onClose },
74
+ react_1.default.createElement(Close_1.default, { className: classes.icon, fontSize: "small" }))),
75
+ react_1.default.createElement(material_1.Paper, null, children)));
76
+ });
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { IBaseViewModel } from '@jbrowse/core/pluggableElementTypes';
3
+ declare const _default: ({ view, }: {
4
+ view: IBaseViewModel;
5
+ }) => React.JSX.Element;
6
+ export default _default;
@@ -0,0 +1,42 @@
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
+ // locals
11
+ const EditableTypography_1 = __importDefault(require("@jbrowse/core/ui/EditableTypography"));
12
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
13
+ input: {
14
+ paddingBottom: 0,
15
+ paddingTop: 2,
16
+ },
17
+ inputBase: {
18
+ color: theme.palette.secondary.contrastText,
19
+ },
20
+ inputRoot: {
21
+ '&:hover': {
22
+ backgroundColor: theme.palette.secondary.light,
23
+ },
24
+ },
25
+ inputFocused: {
26
+ borderColor: theme.palette.primary.main,
27
+ backgroundColor: theme.palette.secondary.light,
28
+ },
29
+ }));
30
+ exports.default = (0, mobx_react_1.observer)(function ViewContainerTitle({ view, }) {
31
+ var _a;
32
+ const { classes } = useStyles();
33
+ return (react_1.default.createElement(material_1.Tooltip, { title: "Rename view", arrow: true },
34
+ react_1.default.createElement(EditableTypography_1.default, { value: view.displayName ||
35
+ // @ts-expect-error
36
+ `${((_a = view.assemblyNames) === null || _a === void 0 ? void 0 : _a.join(',')) || 'Untitled view'}${view.minimized ? ' (minimized)' : ''}`, setValue: val => view.setDisplayName(val), variant: "body2", classes: {
37
+ input: classes.input,
38
+ inputBase: classes.inputBase,
39
+ inputRoot: classes.inputRoot,
40
+ inputFocused: classes.inputFocused,
41
+ } })));
42
+ });
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { SessionWithDrawerWidgets } from '@jbrowse/core/util';
3
+ import { MenuItem as JBMenuItem } from '@jbrowse/core/ui/Menu';
4
+ import { SnackbarMessage } from '@jbrowse/core/ui/SnackbarModel';
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
+ }) => React.JSX.Element;
18
+ export default ViewLauncher;