@jbrowse/core 2.3.3 → 2.4.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.
- package/BaseFeatureWidget/BaseFeatureDetail.d.ts +18 -19
- package/BaseFeatureWidget/BaseFeatureDetail.js +64 -61
- package/BaseFeatureWidget/SequenceBox.js +9 -3
- package/BaseFeatureWidget/SequenceFeatureDetails.js +70 -52
- package/BaseFeatureWidget/SequencePanel.d.ts +3 -3
- package/BaseFeatureWidget/SequencePanel.js +8 -5
- package/CorePlugin.js +2 -7
- package/PluginLoader.d.ts +8 -9
- package/PluginLoader.js +35 -41
- package/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +8 -0
- package/data_adapters/CytobandAdapter/CytobandAdapter.js +40 -0
- package/data_adapters/CytobandAdapter/configSchema.d.ts +2 -0
- package/data_adapters/CytobandAdapter/configSchema.js +17 -0
- package/data_adapters/CytobandAdapter/index.d.ts +3 -0
- package/data_adapters/CytobandAdapter/index.js +37 -0
- package/package.json +5 -4
- package/pluggableElementTypes/PluggableElementBase.d.ts +1 -1
- package/pluggableElementTypes/PluggableElementBase.js +1 -2
- package/pluggableElementTypes/RpcMethodType.d.ts +5 -8
- package/pluggableElementTypes/RpcMethodType.js +22 -33
- package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +13 -2
- package/pluggableElementTypes/renderers/CircularChordRendererType.js +10 -2
- package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.d.ts +6 -0
- package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +9 -1
- package/pluggableElementTypes/renderers/ServerSideRendererType.js +2 -34
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/App.js +3 -18
- package/ui/Dialog.js +8 -1
- package/ui/DropDownMenu.js +1 -4
- package/ui/EditableTypography.js +1 -1
- package/ui/LoadingEllipses.js +6 -6
- package/ui/Menu.js +11 -3
- package/ui/ResizeBar.d.ts +11 -0
- package/ui/ResizeBar.js +94 -0
- package/ui/ResizeHandle.d.ts +1 -1
- package/ui/ResizeHandle.js +1 -1
- package/ui/SanitizedHTML.js +3 -1
- package/ui/ViewContainer.js +3 -38
- package/ui/ViewMenu.d.ts +9 -0
- package/ui/ViewMenu.js +69 -0
- package/ui/ViewPanel.d.ts +19 -0
- package/ui/ViewPanel.js +49 -0
- package/ui/theme.d.ts +10 -156
- package/ui/theme.js +270 -48
- package/util/index.d.ts +16 -9
- package/util/index.js +30 -13
- package/util/map-obj.d.ts +3 -0
- package/util/map-obj.js +33 -0
- package/util/offscreenCanvasUtils.d.ts +18 -4
- package/util/offscreenCanvasUtils.js +48 -7
- package/data_adapters/CytobandAdapter.d.ts +0 -8
- package/data_adapters/CytobandAdapter.js +0 -49
package/ui/App.js
CHANGED
|
@@ -30,24 +30,20 @@ const react_1 = __importStar(require("react"));
|
|
|
30
30
|
const material_1 = require("@mui/material");
|
|
31
31
|
const mui_1 = require("tss-react/mui");
|
|
32
32
|
const Launch_1 = __importDefault(require("@mui/icons-material/Launch"));
|
|
33
|
-
const react_error_boundary_1 = require("react-error-boundary");
|
|
34
33
|
const mobx_react_1 = require("mobx-react");
|
|
35
|
-
// locals
|
|
36
|
-
const util_1 = require("../util");
|
|
37
34
|
// ui elements
|
|
38
35
|
const DrawerWidget_1 = __importDefault(require("./DrawerWidget"));
|
|
39
36
|
const AppToolbar_1 = __importDefault(require("./AppToolbar"));
|
|
40
|
-
const ErrorMessage_1 = __importDefault(require("./ErrorMessage"));
|
|
41
|
-
const LoadingEllipses_1 = __importDefault(require("./LoadingEllipses"));
|
|
42
37
|
const Snackbar_1 = __importDefault(require("./Snackbar"));
|
|
43
|
-
const ViewContainer_1 = __importDefault(require("./ViewContainer"));
|
|
44
38
|
const ViewLauncher_1 = __importDefault(require("./ViewLauncher"));
|
|
39
|
+
const ViewPanel_1 = __importDefault(require("./ViewPanel"));
|
|
45
40
|
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
46
41
|
root: {
|
|
47
42
|
fontFamily: 'Roboto',
|
|
48
43
|
display: 'grid',
|
|
49
44
|
height: '100vh',
|
|
50
45
|
width: '100%',
|
|
46
|
+
colorScheme: theme.palette.mode,
|
|
51
47
|
},
|
|
52
48
|
fabLeft: {
|
|
53
49
|
zIndex: 10000,
|
|
@@ -78,17 +74,6 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
|
78
74
|
flexGrow: 1,
|
|
79
75
|
},
|
|
80
76
|
}));
|
|
81
|
-
const ViewPanel = (0, mobx_react_1.observer)(function ({ view, session, }) {
|
|
82
|
-
const { pluginManager } = (0, util_1.getEnv)(session);
|
|
83
|
-
const viewType = pluginManager.getViewType(view.type);
|
|
84
|
-
if (!viewType) {
|
|
85
|
-
throw new Error(`unknown view type ${view.type}`);
|
|
86
|
-
}
|
|
87
|
-
const { ReactComponent } = viewType;
|
|
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 }) },
|
|
89
|
-
react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(LoadingEllipses_1.default, null) },
|
|
90
|
-
react_1.default.createElement(ReactComponent, { model: view, session: session })))) : (false)));
|
|
91
|
-
});
|
|
92
77
|
const App = (0, mobx_react_1.observer)(function (props) {
|
|
93
78
|
const { session } = props;
|
|
94
79
|
const { classes } = useStyles();
|
|
@@ -118,7 +103,7 @@ const App = (0, mobx_react_1.observer)(function (props) {
|
|
|
118
103
|
react_1.default.createElement(material_1.AppBar, { className: classes.appBar, position: "static" },
|
|
119
104
|
react_1.default.createElement(AppToolbar_1.default, { ...props }))),
|
|
120
105
|
react_1.default.createElement("div", { className: classes.components },
|
|
121
|
-
views.length ? (views.map(view => (react_1.default.createElement(
|
|
106
|
+
views.length ? (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 })),
|
|
122
107
|
react_1.default.createElement("div", { style: { height: 300 } }))),
|
|
123
108
|
activeWidgets.size > 0 && minimized ? (react_1.default.createElement(material_1.Tooltip, { title: "Open drawer widget" },
|
|
124
109
|
react_1.default.createElement(material_1.Fab, { className: drawerPosition === 'right' ? classes.fabRight : classes.fabLeft, color: "primary", "data-testid": "drawer-maximize", onClick: () => session.showWidgetDrawer() },
|
package/ui/Dialog.js
CHANGED
|
@@ -7,8 +7,11 @@ const react_1 = __importDefault(require("react"));
|
|
|
7
7
|
const material_1 = require("@mui/material");
|
|
8
8
|
const mobx_react_1 = require("mobx-react");
|
|
9
9
|
const mui_1 = require("tss-react/mui");
|
|
10
|
+
const react_error_boundary_1 = require("react-error-boundary");
|
|
10
11
|
// icons
|
|
11
12
|
const Close_1 = __importDefault(require("@mui/icons-material/Close"));
|
|
13
|
+
// locals
|
|
14
|
+
const ErrorMessage_1 = __importDefault(require("./ErrorMessage"));
|
|
12
15
|
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
13
16
|
closeButton: {
|
|
14
17
|
position: 'absolute',
|
|
@@ -17,6 +20,10 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
|
17
20
|
color: theme.palette.grey[500],
|
|
18
21
|
},
|
|
19
22
|
}));
|
|
23
|
+
function DialogError({ error }) {
|
|
24
|
+
return (react_1.default.createElement("div", { style: { width: 800, margin: 40 } },
|
|
25
|
+
react_1.default.createElement(ErrorMessage_1.default, { error: error })));
|
|
26
|
+
}
|
|
20
27
|
function JBrowseDialog(props) {
|
|
21
28
|
const { classes } = useStyles();
|
|
22
29
|
const { title, children, onClose } = props;
|
|
@@ -30,6 +37,6 @@ function JBrowseDialog(props) {
|
|
|
30
37
|
} },
|
|
31
38
|
react_1.default.createElement(Close_1.default, null))) : null),
|
|
32
39
|
react_1.default.createElement(material_1.Divider, null),
|
|
33
|
-
children)));
|
|
40
|
+
react_1.default.createElement(react_error_boundary_1.ErrorBoundary, { FallbackComponent: DialogError }, children))));
|
|
34
41
|
}
|
|
35
42
|
exports.default = (0, mobx_react_1.observer)(JBrowseDialog);
|
package/ui/DropDownMenu.js
CHANGED
|
@@ -33,9 +33,6 @@ const mobx_react_1 = require("mobx-react");
|
|
|
33
33
|
const ArrowDropDown_1 = __importDefault(require("@mui/icons-material/ArrowDropDown"));
|
|
34
34
|
const Menu_1 = __importDefault(require("./Menu"));
|
|
35
35
|
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
36
|
-
root: {
|
|
37
|
-
display: 'flex',
|
|
38
|
-
},
|
|
39
36
|
buttonRoot: {
|
|
40
37
|
'&:hover': {
|
|
41
38
|
backgroundColor: (0, material_1.alpha)(theme.palette.primary.contrastText, theme.palette.action.hoverOpacity),
|
|
@@ -59,7 +56,7 @@ function DropDownMenu({ menuTitle, session, menuItems, }) {
|
|
|
59
56
|
function handleClose() {
|
|
60
57
|
setOpen(false);
|
|
61
58
|
}
|
|
62
|
-
return (react_1.default.createElement(
|
|
59
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
63
60
|
react_1.default.createElement(material_1.Button, { ref: anchorEl, onClick: handleToggle, color: "inherit", "data-testid": "dropDownMenuButton", classes: { root: classes.buttonRoot } },
|
|
64
61
|
menuTitle,
|
|
65
62
|
react_1.default.createElement(ArrowDropDown_1.default, null)),
|
package/ui/EditableTypography.js
CHANGED
package/ui/LoadingEllipses.js
CHANGED
|
@@ -16,22 +16,22 @@ const useStyles = (0, mui_1.makeStyles)()({
|
|
|
16
16
|
textAlign: 'left',
|
|
17
17
|
animation: `${(0, tss_react_1.keyframes) `
|
|
18
18
|
0% {
|
|
19
|
-
content: '';
|
|
19
|
+
content: '...';
|
|
20
20
|
}
|
|
21
21
|
25% {
|
|
22
|
-
content: '
|
|
22
|
+
content: '';
|
|
23
23
|
}
|
|
24
24
|
50% {
|
|
25
|
-
content: '
|
|
25
|
+
content: '.';
|
|
26
26
|
}
|
|
27
27
|
75% {
|
|
28
|
-
content: '
|
|
28
|
+
content: '..';
|
|
29
29
|
}
|
|
30
|
-
`} 1.
|
|
30
|
+
`} 1.2s infinite ease-in-out`,
|
|
31
31
|
},
|
|
32
32
|
},
|
|
33
33
|
});
|
|
34
|
-
function LoadingEllipses({ message
|
|
34
|
+
function LoadingEllipses({ message, variant = 'body2', ...rest }) {
|
|
35
35
|
const { classes } = useStyles();
|
|
36
36
|
return (react_1.default.createElement(material_1.Typography, { className: classes.dots, ...rest, variant: variant }, `${message || 'Loading'}`));
|
|
37
37
|
}
|
package/ui/Menu.js
CHANGED
|
@@ -74,7 +74,7 @@ function MenuItemEndDecoration(props) {
|
|
|
74
74
|
}
|
|
75
75
|
else if (type === 'checkbox') {
|
|
76
76
|
if (checked) {
|
|
77
|
-
const color = disabled ? 'inherit' :
|
|
77
|
+
const color = disabled ? 'inherit' : undefined;
|
|
78
78
|
icon = react_1.default.createElement(CheckBox_1.default, { color: color });
|
|
79
79
|
}
|
|
80
80
|
else {
|
|
@@ -83,7 +83,7 @@ function MenuItemEndDecoration(props) {
|
|
|
83
83
|
}
|
|
84
84
|
else if (type === 'radio') {
|
|
85
85
|
if (checked) {
|
|
86
|
-
const color = disabled ? 'inherit' :
|
|
86
|
+
const color = disabled ? 'inherit' : undefined;
|
|
87
87
|
icon = react_1.default.createElement(RadioButtonChecked_1.default, { color: color });
|
|
88
88
|
}
|
|
89
89
|
else {
|
|
@@ -245,7 +245,15 @@ const MenuPage = react_1.default.forwardRef((props, ref) => {
|
|
|
245
245
|
});
|
|
246
246
|
function Menu(props) {
|
|
247
247
|
const { open, onClose, menuItems, onMenuItemClick, ...other } = props;
|
|
248
|
-
return (react_1.default.createElement(material_1.Popover, {
|
|
248
|
+
return (react_1.default.createElement(material_1.Popover, { open: open, onClose: onClose, BackdropProps: { invisible: true }, anchorOrigin: {
|
|
249
|
+
vertical: 'bottom',
|
|
250
|
+
horizontal: 'right',
|
|
251
|
+
...other.anchorOrigin,
|
|
252
|
+
}, transformOrigin: {
|
|
253
|
+
vertical: 'top',
|
|
254
|
+
horizontal: 'left',
|
|
255
|
+
...other.transformOrigin,
|
|
256
|
+
}, ...other },
|
|
249
257
|
react_1.default.createElement(MenuPage, { open: open, onClose: onClose, menuItems: menuItems, onMenuItemClick: onMenuItemClick, top: true })));
|
|
250
258
|
}
|
|
251
259
|
exports.default = Menu;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare function useResizeBar(): {
|
|
3
|
+
ref: React.RefObject<HTMLDivElement>;
|
|
4
|
+
scrollLeft: number;
|
|
5
|
+
};
|
|
6
|
+
export default function ResizeBar({ widths, setWidths, checkbox, scrollLeft, }: {
|
|
7
|
+
widths: number[];
|
|
8
|
+
setWidths: (arg: number[]) => void;
|
|
9
|
+
checkbox?: boolean;
|
|
10
|
+
scrollLeft?: number;
|
|
11
|
+
}): JSX.Element;
|
package/ui/ResizeBar.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
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.useResizeBar = void 0;
|
|
30
|
+
const react_1 = __importStar(require("react"));
|
|
31
|
+
const mui_1 = require("tss-react/mui");
|
|
32
|
+
// locals
|
|
33
|
+
const ResizeHandle_1 = __importDefault(require("./ResizeHandle"));
|
|
34
|
+
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
35
|
+
resizeBar: {
|
|
36
|
+
background: theme.palette.action.disabledBackground,
|
|
37
|
+
height: 12,
|
|
38
|
+
position: 'relative',
|
|
39
|
+
overflow: 'hidden',
|
|
40
|
+
},
|
|
41
|
+
tick: {
|
|
42
|
+
position: 'absolute',
|
|
43
|
+
height: '100%',
|
|
44
|
+
pointerEvents: 'none',
|
|
45
|
+
background: theme.palette.divider,
|
|
46
|
+
width: 1,
|
|
47
|
+
},
|
|
48
|
+
hiddenTick: {
|
|
49
|
+
position: 'absolute',
|
|
50
|
+
height: '100%',
|
|
51
|
+
width: 5,
|
|
52
|
+
},
|
|
53
|
+
}));
|
|
54
|
+
function useResizeBar() {
|
|
55
|
+
const ref = (0, react_1.useRef)(null);
|
|
56
|
+
const [scrollLeft, setScrollLeft] = (0, react_1.useState)(0);
|
|
57
|
+
(0, react_1.useEffect)(() => {
|
|
58
|
+
const timer = setInterval(() => {
|
|
59
|
+
var _a;
|
|
60
|
+
const elt = (_a = ref.current) === null || _a === void 0 ? void 0 : _a.querySelector('.MuiDataGrid-virtualScroller');
|
|
61
|
+
if (elt) {
|
|
62
|
+
setScrollLeft(elt.scrollLeft);
|
|
63
|
+
}
|
|
64
|
+
}, 100);
|
|
65
|
+
return () => {
|
|
66
|
+
clearInterval(timer);
|
|
67
|
+
};
|
|
68
|
+
}, []);
|
|
69
|
+
return { ref, scrollLeft };
|
|
70
|
+
}
|
|
71
|
+
exports.useResizeBar = useResizeBar;
|
|
72
|
+
function Tick({ left, scrollLeft, idx, onDrag, }) {
|
|
73
|
+
const { classes } = useStyles();
|
|
74
|
+
const cb = (0, react_1.useCallback)((d) => {
|
|
75
|
+
onDrag(d, idx);
|
|
76
|
+
}, [idx, onDrag]);
|
|
77
|
+
// has an invisible wider than tick mark (1px) clickable area (5px)
|
|
78
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
79
|
+
react_1.default.createElement(ResizeHandle_1.default, { onDrag: cb, vertical: true, className: classes.hiddenTick, style: { left: left - scrollLeft - 2.5 } }),
|
|
80
|
+
react_1.default.createElement("div", { style: { left: left - scrollLeft }, className: classes.tick })));
|
|
81
|
+
}
|
|
82
|
+
function ResizeBar({ widths, setWidths, checkbox, scrollLeft = 0, }) {
|
|
83
|
+
const { classes } = useStyles();
|
|
84
|
+
const offsets = [];
|
|
85
|
+
widths.reduce((a, b, i) => (offsets[i] = a + b), checkbox ? 52 : 0);
|
|
86
|
+
const onDrag = (0, react_1.useCallback)((distance, idx) => {
|
|
87
|
+
const newWidths = [...widths];
|
|
88
|
+
// mui doesn't allow columns smaller than 50
|
|
89
|
+
newWidths[idx] = Math.max(newWidths[idx] + distance, 50);
|
|
90
|
+
setWidths(newWidths);
|
|
91
|
+
}, [widths, setWidths]);
|
|
92
|
+
return (react_1.default.createElement("div", { className: classes.resizeBar }, offsets.map((left, i) => (react_1.default.createElement(Tick, { key: i, left: i === offsets.length - 1 ? left - 3 : left, onDrag: onDrag, idx: i, scrollLeft: scrollLeft })))));
|
|
93
|
+
}
|
|
94
|
+
exports.default = ResizeBar;
|
package/ui/ResizeHandle.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
declare function ResizeHandle({ onDrag, vertical, flexbox, className: originalClassName, ...props }: {
|
|
3
|
-
onDrag: (arg: number) => number;
|
|
3
|
+
onDrag: (arg: number) => number | void;
|
|
4
4
|
vertical?: boolean;
|
|
5
5
|
flexbox?: boolean;
|
|
6
6
|
className?: string;
|
package/ui/ResizeHandle.js
CHANGED
|
@@ -89,6 +89,6 @@ function ResizeHandle({ onDrag, vertical = false, flexbox = false, className: or
|
|
|
89
89
|
event.preventDefault();
|
|
90
90
|
prevPos.current = vertical ? event.clientX : event.clientY;
|
|
91
91
|
setMouseDragging(true);
|
|
92
|
-
},
|
|
92
|
+
}, className: cx(className, originalClassName), ...props }));
|
|
93
93
|
}
|
|
94
94
|
exports.default = ResizeHandle;
|
package/ui/SanitizedHTML.js
CHANGED
|
@@ -35,6 +35,8 @@ const htmlTags = [
|
|
|
35
35
|
'strong',
|
|
36
36
|
'table',
|
|
37
37
|
'tbody',
|
|
38
|
+
'sup',
|
|
39
|
+
'sub',
|
|
38
40
|
'td',
|
|
39
41
|
'tfoot',
|
|
40
42
|
'th',
|
|
@@ -65,7 +67,7 @@ function SanitizedHTML({ html }) {
|
|
|
65
67
|
}
|
|
66
68
|
});
|
|
67
69
|
}
|
|
68
|
-
return (react_1.default.createElement("
|
|
70
|
+
return (react_1.default.createElement("span", {
|
|
69
71
|
// eslint-disable-next-line react/no-danger
|
|
70
72
|
dangerouslySetInnerHTML: {
|
|
71
73
|
__html: dompurify_1.default.sanitize(value),
|
package/ui/ViewContainer.js
CHANGED
|
@@ -36,13 +36,8 @@ const react_use_measure_1 = __importDefault(require("react-use-measure"));
|
|
|
36
36
|
const Close_1 = __importDefault(require("@mui/icons-material/Close"));
|
|
37
37
|
const Minimize_1 = __importDefault(require("@mui/icons-material/Minimize"));
|
|
38
38
|
const Add_1 = __importDefault(require("@mui/icons-material/Add"));
|
|
39
|
-
const Menu_1 = __importDefault(require("@mui/icons-material/Menu"));
|
|
40
|
-
const ArrowDownward_1 = __importDefault(require("@mui/icons-material/ArrowDownward"));
|
|
41
|
-
const ArrowUpward_1 = __importDefault(require("@mui/icons-material/ArrowUpward"));
|
|
42
|
-
// locals
|
|
43
|
-
const util_1 = require("../util");
|
|
44
39
|
const EditableTypography_1 = __importDefault(require("./EditableTypography"));
|
|
45
|
-
const
|
|
40
|
+
const ViewMenu_1 = __importDefault(require("./ViewMenu"));
|
|
46
41
|
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
47
42
|
viewContainer: {
|
|
48
43
|
overflow: 'hidden',
|
|
@@ -72,37 +67,7 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
|
72
67
|
backgroundColor: theme.palette.secondary.light,
|
|
73
68
|
},
|
|
74
69
|
}));
|
|
75
|
-
const
|
|
76
|
-
const [anchorEl, setAnchorEl] = (0, react_1.useState)();
|
|
77
|
-
const { menuItems } = model;
|
|
78
|
-
const session = (0, util_1.getSession)(model);
|
|
79
|
-
const items = [
|
|
80
|
-
...(session.views.length > 1
|
|
81
|
-
? [
|
|
82
|
-
{
|
|
83
|
-
label: 'Move view up',
|
|
84
|
-
icon: ArrowUpward_1.default,
|
|
85
|
-
onClick: () => session.moveViewUp(model.id),
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
label: 'Move view down',
|
|
89
|
-
icon: ArrowDownward_1.default,
|
|
90
|
-
onClick: () => session.moveViewDown(model.id),
|
|
91
|
-
},
|
|
92
|
-
]
|
|
93
|
-
: []),
|
|
94
|
-
// <=1.3.3 didn't use a function, so check as value also
|
|
95
|
-
...((typeof menuItems === 'function' ? menuItems() : menuItems) || []),
|
|
96
|
-
];
|
|
97
|
-
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
98
|
-
react_1.default.createElement(material_1.IconButton, { ...IconButtonProps, onClick: event => setAnchorEl(event.currentTarget), "data-testid": "view_menu_icon" },
|
|
99
|
-
react_1.default.createElement(Menu_1.default, { ...IconProps, fontSize: "small" })),
|
|
100
|
-
react_1.default.createElement(Menu_2.default, { anchorEl: anchorEl, open: Boolean(anchorEl), onMenuItemClick: (_event, callback) => {
|
|
101
|
-
callback();
|
|
102
|
-
setAnchorEl(undefined);
|
|
103
|
-
}, onClose: () => setAnchorEl(undefined), menuItems: items })));
|
|
104
|
-
});
|
|
105
|
-
const ViewContainer = (0, mobx_react_1.observer)(({ view, onClose, onMinimize, style, children, }) => {
|
|
70
|
+
const ViewContainer = (0, mobx_react_1.observer)(function ({ view, onClose, onMinimize, style, children, }) {
|
|
106
71
|
var _a;
|
|
107
72
|
const { classes } = useStyles();
|
|
108
73
|
const theme = (0, material_1.useTheme)();
|
|
@@ -123,7 +88,7 @@ const ViewContainer = (0, mobx_react_1.observer)(({ view, onClose, onMinimize, s
|
|
|
123
88
|
}, []);
|
|
124
89
|
return (react_1.default.createElement(material_1.Paper, { ref: ref, elevation: 12, className: classes.viewContainer, style: { ...style, padding: `0px ${padWidth} ${padWidth}` } },
|
|
125
90
|
react_1.default.createElement("div", { ref: scrollRef, style: { display: 'flex' } },
|
|
126
|
-
react_1.default.createElement(
|
|
91
|
+
react_1.default.createElement(ViewMenu_1.default, { model: view, IconProps: { className: classes.icon } }),
|
|
127
92
|
react_1.default.createElement("div", { className: classes.grow }),
|
|
128
93
|
react_1.default.createElement(material_1.Tooltip, { title: "Rename view", arrow: true },
|
|
129
94
|
react_1.default.createElement(EditableTypography_1.default, { value: (view.displayName ||
|
package/ui/ViewMenu.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { SvgIconProps, IconButtonProps as IconButtonPropsType } from '@mui/material';
|
|
3
|
+
import { IBaseViewModel } from '../pluggableElementTypes/models';
|
|
4
|
+
declare const ViewMenu: ({ model, IconButtonProps, IconProps, }: {
|
|
5
|
+
model: IBaseViewModel;
|
|
6
|
+
IconButtonProps?: IconButtonPropsType<"button", {}> | undefined;
|
|
7
|
+
IconProps: SvgIconProps;
|
|
8
|
+
}) => JSX.Element;
|
|
9
|
+
export default ViewMenu;
|
package/ui/ViewMenu.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
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 mobx_react_1 = require("mobx-react");
|
|
32
|
+
// icons
|
|
33
|
+
const Menu_1 = __importDefault(require("@mui/icons-material/Menu"));
|
|
34
|
+
const ArrowDownward_1 = __importDefault(require("@mui/icons-material/ArrowDownward"));
|
|
35
|
+
const ArrowUpward_1 = __importDefault(require("@mui/icons-material/ArrowUpward"));
|
|
36
|
+
// locals
|
|
37
|
+
const util_1 = require("../util");
|
|
38
|
+
const Menu_2 = __importDefault(require("./Menu"));
|
|
39
|
+
const ViewMenu = (0, mobx_react_1.observer)(function ({ model, IconButtonProps, IconProps, }) {
|
|
40
|
+
const [anchorEl, setAnchorEl] = (0, react_1.useState)();
|
|
41
|
+
const { menuItems } = model;
|
|
42
|
+
const session = (0, util_1.getSession)(model);
|
|
43
|
+
const items = [
|
|
44
|
+
...(session.views.length > 1
|
|
45
|
+
? [
|
|
46
|
+
{
|
|
47
|
+
label: 'Move view up',
|
|
48
|
+
icon: ArrowUpward_1.default,
|
|
49
|
+
onClick: () => session.moveViewUp(model.id),
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
label: 'Move view down',
|
|
53
|
+
icon: ArrowDownward_1.default,
|
|
54
|
+
onClick: () => session.moveViewDown(model.id),
|
|
55
|
+
},
|
|
56
|
+
]
|
|
57
|
+
: []),
|
|
58
|
+
// <=1.3.3 didn't use a function, so check as value also
|
|
59
|
+
...((typeof menuItems === 'function' ? menuItems() : menuItems) || []),
|
|
60
|
+
];
|
|
61
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
62
|
+
react_1.default.createElement(material_1.IconButton, { ...IconButtonProps, onClick: event => setAnchorEl(event.currentTarget), "data-testid": "view_menu_icon" },
|
|
63
|
+
react_1.default.createElement(Menu_1.default, { ...IconProps, fontSize: "small" })),
|
|
64
|
+
react_1.default.createElement(Menu_2.default, { anchorEl: anchorEl, open: Boolean(anchorEl), onMenuItemClick: (_event, callback) => {
|
|
65
|
+
callback();
|
|
66
|
+
setAnchorEl(undefined);
|
|
67
|
+
}, onClose: () => setAnchorEl(undefined), menuItems: items })));
|
|
68
|
+
});
|
|
69
|
+
exports.default = ViewMenu;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { AbstractViewModel, 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 ViewPanel: ({ view, session, }: {
|
|
16
|
+
view: AbstractViewModel;
|
|
17
|
+
session: AppSession;
|
|
18
|
+
}) => JSX.Element;
|
|
19
|
+
export default ViewPanel;
|
package/ui/ViewPanel.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
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 mobx_react_1 = require("mobx-react");
|
|
32
|
+
// locals
|
|
33
|
+
const util_1 = require("../util");
|
|
34
|
+
// ui elements
|
|
35
|
+
const ErrorMessage_1 = __importDefault(require("./ErrorMessage"));
|
|
36
|
+
const LoadingEllipses_1 = __importDefault(require("./LoadingEllipses"));
|
|
37
|
+
const ViewContainer_1 = __importDefault(require("./ViewContainer"));
|
|
38
|
+
const ViewPanel = (0, mobx_react_1.observer)(function ({ view, session, }) {
|
|
39
|
+
const { pluginManager } = (0, util_1.getEnv)(session);
|
|
40
|
+
const viewType = pluginManager.getViewType(view.type);
|
|
41
|
+
if (!viewType) {
|
|
42
|
+
throw new Error(`unknown view type ${view.type}`);
|
|
43
|
+
}
|
|
44
|
+
const { ReactComponent } = viewType;
|
|
45
|
+
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 }) },
|
|
46
|
+
react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(LoadingEllipses_1.default, { variant: "h6" }) },
|
|
47
|
+
react_1.default.createElement(ReactComponent, { model: view, session: session })))) : (false)));
|
|
48
|
+
});
|
|
49
|
+
exports.default = ViewPanel;
|