@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.
Files changed (52) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail.d.ts +18 -19
  2. package/BaseFeatureWidget/BaseFeatureDetail.js +64 -61
  3. package/BaseFeatureWidget/SequenceBox.js +9 -3
  4. package/BaseFeatureWidget/SequenceFeatureDetails.js +70 -52
  5. package/BaseFeatureWidget/SequencePanel.d.ts +3 -3
  6. package/BaseFeatureWidget/SequencePanel.js +8 -5
  7. package/CorePlugin.js +2 -7
  8. package/PluginLoader.d.ts +8 -9
  9. package/PluginLoader.js +35 -41
  10. package/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +8 -0
  11. package/data_adapters/CytobandAdapter/CytobandAdapter.js +40 -0
  12. package/data_adapters/CytobandAdapter/configSchema.d.ts +2 -0
  13. package/data_adapters/CytobandAdapter/configSchema.js +17 -0
  14. package/data_adapters/CytobandAdapter/index.d.ts +3 -0
  15. package/data_adapters/CytobandAdapter/index.js +37 -0
  16. package/package.json +5 -4
  17. package/pluggableElementTypes/PluggableElementBase.d.ts +1 -1
  18. package/pluggableElementTypes/PluggableElementBase.js +1 -2
  19. package/pluggableElementTypes/RpcMethodType.d.ts +5 -8
  20. package/pluggableElementTypes/RpcMethodType.js +22 -33
  21. package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +13 -2
  22. package/pluggableElementTypes/renderers/CircularChordRendererType.js +10 -2
  23. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.d.ts +6 -0
  24. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +9 -1
  25. package/pluggableElementTypes/renderers/ServerSideRendererType.js +2 -34
  26. package/tsconfig.build.tsbuildinfo +1 -1
  27. package/ui/App.js +3 -18
  28. package/ui/Dialog.js +8 -1
  29. package/ui/DropDownMenu.js +1 -4
  30. package/ui/EditableTypography.js +1 -1
  31. package/ui/LoadingEllipses.js +6 -6
  32. package/ui/Menu.js +11 -3
  33. package/ui/ResizeBar.d.ts +11 -0
  34. package/ui/ResizeBar.js +94 -0
  35. package/ui/ResizeHandle.d.ts +1 -1
  36. package/ui/ResizeHandle.js +1 -1
  37. package/ui/SanitizedHTML.js +3 -1
  38. package/ui/ViewContainer.js +3 -38
  39. package/ui/ViewMenu.d.ts +9 -0
  40. package/ui/ViewMenu.js +69 -0
  41. package/ui/ViewPanel.d.ts +19 -0
  42. package/ui/ViewPanel.js +49 -0
  43. package/ui/theme.d.ts +10 -156
  44. package/ui/theme.js +270 -48
  45. package/util/index.d.ts +16 -9
  46. package/util/index.js +30 -13
  47. package/util/map-obj.d.ts +3 -0
  48. package/util/map-obj.js +33 -0
  49. package/util/offscreenCanvasUtils.d.ts +18 -4
  50. package/util/offscreenCanvasUtils.js +48 -7
  51. package/data_adapters/CytobandAdapter.d.ts +0 -8
  52. 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(ViewPanel, { key: `view-${view.id}`, view: view, session: session })))) : (react_1.default.createElement(ViewLauncher_1.default, { ...props })),
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);
@@ -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("div", { className: classes.root },
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)),
@@ -88,7 +88,7 @@ const EditableTypography = react_1.default.forwardRef((props, ref) => {
88
88
  setBlur(true);
89
89
  }
90
90
  }, onBlur: () => {
91
- setValue(editedValue || '');
91
+ setValue(editedValue || value || '');
92
92
  setEditedValue(undefined);
93
93
  } })));
94
94
  });
@@ -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.4s infinite ease-in-out`,
30
+ `} 1.2s infinite ease-in-out`,
31
31
  },
32
32
  },
33
33
  });
34
- function LoadingEllipses({ message = 'Loading', variant = 'body2', ...rest }) {
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' : 'secondary';
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' : 'secondary';
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, { transitionDuration: 0, open: open, onClose: onClose, BackdropProps: { invisible: true }, ...other },
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;
@@ -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;
@@ -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;
@@ -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
- }, role: "presentation", className: cx(className, originalClassName), ...props }));
92
+ }, className: cx(className, originalClassName), ...props }));
93
93
  }
94
94
  exports.default = ResizeHandle;
@@ -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("div", {
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),
@@ -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 Menu_2 = __importDefault(require("./Menu"));
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 ViewMenu = (0, mobx_react_1.observer)(({ model, IconButtonProps, IconProps, }) => {
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(ViewMenu, { model: view, IconProps: { className: classes.icon } }),
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 ||
@@ -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;
@@ -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;