@jbrowse/core 2.3.4 → 2.4.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 (116) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail.d.ts +18 -19
  2. package/BaseFeatureWidget/BaseFeatureDetail.js +76 -69
  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/BaseFeatureWidget/index.js +2 -2
  8. package/CorePlugin.js +2 -7
  9. package/PluginLoader.d.ts +1 -1
  10. package/PluginLoader.js +20 -24
  11. package/PluginManager.d.ts +1 -1
  12. package/PluginManager.js +2 -3
  13. package/ReExports/Attributes.d.ts +1 -2
  14. package/ReExports/Attributes.js +4 -3
  15. package/ReExports/BaseCard.d.ts +1 -2
  16. package/ReExports/BaseCard.js +4 -3
  17. package/ReExports/DataGrid.d.ts +1 -2
  18. package/ReExports/DataGrid.js +2 -2
  19. package/ReExports/FeatureDetails.d.ts +1 -2
  20. package/ReExports/FeatureDetails.js +4 -3
  21. package/ReExports/index.d.ts +1 -2
  22. package/ReExports/index.js +3 -2
  23. package/ReExports/modules.d.ts +1 -1
  24. package/ReExports/modules.js +2 -2
  25. package/assemblyManager/assembly.js +5 -5
  26. package/assemblyManager/assemblyConfigSchema.js +2 -2
  27. package/configuration/configurationSchema.js +1 -1
  28. package/configuration/util.js +1 -1
  29. package/data_adapters/BaseAdapter.js +1 -1
  30. package/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +8 -0
  31. package/data_adapters/CytobandAdapter/CytobandAdapter.js +40 -0
  32. package/data_adapters/CytobandAdapter/configSchema.d.ts +2 -0
  33. package/data_adapters/CytobandAdapter/configSchema.js +17 -0
  34. package/data_adapters/CytobandAdapter/index.d.ts +3 -0
  35. package/data_adapters/CytobandAdapter/index.js +37 -0
  36. package/data_adapters/dataAdapterCache.d.ts +3 -2
  37. package/data_adapters/dataAdapterCache.js +2 -3
  38. package/package.json +5 -4
  39. package/pluggableElementTypes/PluggableElementBase.d.ts +1 -1
  40. package/pluggableElementTypes/PluggableElementBase.js +1 -2
  41. package/pluggableElementTypes/RpcMethodType.d.ts +5 -8
  42. package/pluggableElementTypes/RpcMethodType.js +23 -34
  43. package/pluggableElementTypes/index.d.ts +11 -1
  44. package/pluggableElementTypes/index.js +23 -23
  45. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +2 -2
  46. package/pluggableElementTypes/models/BaseTrackModel.js +8 -13
  47. package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +13 -2
  48. package/pluggableElementTypes/renderers/CircularChordRendererType.js +10 -2
  49. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.d.ts +8 -2
  50. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +10 -4
  51. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +1 -1
  52. package/pluggableElementTypes/renderers/ServerSideRendererType.js +2 -34
  53. package/pluggableElementTypes/renderers/index.d.ts +7 -9
  54. package/pluggableElementTypes/renderers/index.js +15 -15
  55. package/pluggableElementTypes/renderers/util/serializableFilterChain.js +1 -1
  56. package/rpc/BaseRpcDriver.js +7 -8
  57. package/rpc/WebWorkerRpcDriver.js +18 -12
  58. package/rpc/coreRpcMethods.d.ts +9 -11
  59. package/rpc/coreRpcMethods.js +17 -17
  60. package/rpc/methods/CoreGetFeatureDetails.js +1 -1
  61. package/rpc/methods/util.d.ts +2 -2
  62. package/rpc/methods/util.js +2 -2
  63. package/rpc/remoteAbortSignals.js +0 -1
  64. package/tsconfig.build.tsbuildinfo +1 -1
  65. package/ui/App.js +3 -18
  66. package/ui/AppLogo.js +1 -6
  67. package/ui/ColorPicker.js +1 -1
  68. package/ui/Dialog.js +1 -1
  69. package/ui/DrawerWidget.js +4 -4
  70. package/ui/EditableTypography.js +1 -1
  71. package/ui/FileSelector/FileSelector.d.ts +2 -2
  72. package/ui/FileSelector/FileSelector.js +24 -35
  73. package/ui/FileSelector/index.d.ts +1 -2
  74. package/ui/FileSelector/index.js +3 -2
  75. package/ui/LoadingEllipses.js +2 -2
  76. package/ui/Menu.js +45 -32
  77. package/ui/ResizeBar.js +10 -6
  78. package/ui/ResizeHandle.js +3 -6
  79. package/ui/SanitizedHTML.js +2 -0
  80. package/ui/ViewContainer.js +7 -44
  81. package/ui/ViewMenu.d.ts +9 -0
  82. package/ui/ViewMenu.js +69 -0
  83. package/ui/ViewPanel.d.ts +19 -0
  84. package/ui/ViewPanel.js +49 -0
  85. package/ui/theme.d.ts +10 -166
  86. package/ui/theme.js +260 -48
  87. package/util/Base1DUtils.js +16 -14
  88. package/util/Base1DViewModel.d.ts +1 -1
  89. package/util/Base1DViewModel.js +9 -8
  90. package/util/aborting.js +1 -1
  91. package/util/analytics.js +1 -1
  92. package/util/blockTypes.js +10 -10
  93. package/util/color/index.d.ts +1 -2
  94. package/util/color/index.js +4 -3
  95. package/util/idMaker.js +5 -8
  96. package/util/index.d.ts +9 -9
  97. package/util/index.js +35 -52
  98. package/util/io/RemoteFileWithRangeCache.js +2 -2
  99. package/util/io/index.d.ts +1 -2
  100. package/util/io/index.js +6 -6
  101. package/util/jexl.js +3 -1
  102. package/util/layouts/GranularRectLayout.js +10 -4
  103. package/util/layouts/MultiLayout.js +1 -1
  104. package/util/layouts/SceneGraph.js +3 -7
  105. package/util/map-obj.d.ts +3 -0
  106. package/util/map-obj.js +33 -0
  107. package/util/offscreenCanvasPonyfill.js +4 -3
  108. package/util/offscreenCanvasUtils.d.ts +18 -4
  109. package/util/offscreenCanvasUtils.js +49 -7
  110. package/util/tracks.d.ts +1 -1
  111. package/util/tracks.js +0 -1
  112. package/util/types/index.d.ts +1 -1
  113. package/util/types/index.js +3 -3
  114. package/util/types/mst.js +3 -3
  115. package/data_adapters/CytobandAdapter.d.ts +0 -8
  116. 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 > 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 })),
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/AppLogo.js CHANGED
@@ -12,11 +12,6 @@ const Logo_1 = require("./Logo");
12
12
  const Logo = (0, mobx_react_1.observer)(function ({ session, }) {
13
13
  const { configuration } = session;
14
14
  const logoPath = (0, configuration_1.readConfObject)(configuration, 'logoPath');
15
- if (!(logoPath === null || logoPath === void 0 ? void 0 : logoPath.uri)) {
16
- return react_1.default.createElement(Logo_1.LogoFull, { variant: "white" });
17
- }
18
- else {
19
- return react_1.default.createElement("img", { src: logoPath.uri, alt: "Custom logo" });
20
- }
15
+ return (logoPath === null || logoPath === void 0 ? void 0 : logoPath.uri) ? (react_1.default.createElement("img", { src: logoPath.uri, alt: "Custom logo" })) : (react_1.default.createElement(Logo_1.LogoFull, { variant: "white" }));
21
16
  });
22
17
  exports.default = Logo;
package/ui/ColorPicker.js CHANGED
@@ -90,7 +90,7 @@ function ColorPicker({ onChange, color, }) {
90
90
  const pal = event.target.value;
91
91
  setVal(pal);
92
92
  } }, palettes.map(p => (react_1.default.createElement(material_1.MenuItem, { value: p, key: p }, p)))),
93
- react_1.default.createElement("div", { className: classes.swatches }, presetColors.map((presetColor, idx) => (react_1.default.createElement("button", { key: presetColor + '-' + idx, className: classes.swatch, style: { background: presetColor }, onClick: () => handleChange(presetColor) })))),
93
+ react_1.default.createElement("div", { className: classes.swatches }, presetColors.map((presetColor, idx) => (react_1.default.createElement("button", { key: `${presetColor}-${idx}`, className: classes.swatch, style: { background: presetColor }, onClick: () => handleChange(presetColor) })))),
94
94
  react_1.default.createElement(material_1.TextField, { helperText: 'Manually set color (hex, rgb, or css color name)', value: text, onChange: event => handleChange(event.target.value) }))));
95
95
  }
96
96
  exports.ColorPicker = ColorPicker;
package/ui/Dialog.js CHANGED
@@ -32,7 +32,7 @@ function JBrowseDialog(props) {
32
32
  react_1.default.createElement(material_1.DialogTitle, null,
33
33
  title,
34
34
  onClose ? (react_1.default.createElement(material_1.IconButton, { className: classes.closeButton, onClick: () => {
35
- // @ts-ignore
35
+ // @ts-expect-error
36
36
  onClose();
37
37
  } },
38
38
  react_1.default.createElement(Close_1.default, null))) : null),
@@ -77,13 +77,13 @@ const DrawerHeader = (0, mobx_react_1.observer)(({ session, setToolbarHeight, })
77
77
  return HeadingComponent ? (react_1.default.createElement(HeadingComponent, { model: widget })) : (react_1.default.createElement(material_1.Typography, { variant: "h6", color: "inherit" }, heading));
78
78
  }, onChange: e => {
79
79
  const w = session.activeWidgets.get(e.target.value);
80
- if (!w) {
81
- session.notify(`Widget not found ${e.target.value}`, 'warning');
80
+ if (w) {
81
+ session.showWidget(w);
82
82
  }
83
83
  else {
84
- session.showWidget(w);
84
+ session.notify(`Widget not found ${e.target.value}`, 'warning');
85
85
  }
86
- } }, Array.from(activeWidgets.values()).map(widget => {
86
+ } }, [...activeWidgets.values()].map(widget => {
87
87
  const widgetType = pluginManager.getWidgetType(widget.type);
88
88
  const { HeadingComponent, heading } = widgetType;
89
89
  return (react_1.default.createElement(material_1.MenuItem, { "data-testid": `widget-drawer-selects-item-${widget.type}`, key: widget.id, value: widget.id },
@@ -59,7 +59,7 @@ const EditableTypography = react_1.default.forwardRef((props, ref) => {
59
59
  }, [blur, inputNode]);
60
60
  // possibly tss-react does not understand the passing of props to
61
61
  // useStyles, but it appears to work
62
- // @ts-ignore
62
+ // @ts-expect-error
63
63
  const { classes } = useStyles(props, { props });
64
64
  const theme = (0, material_1.useTheme)();
65
65
  const clientWidth = sizerNode === null || sizerNode === void 0 ? void 0 : sizerNode.clientWidth;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { FileLocation, AbstractRootModel } from '../../util/types';
3
- declare const FileSelector: (props: {
3
+ declare const _default: (props: {
4
4
  location?: FileLocation | undefined;
5
5
  setLocation: (param: FileLocation) => void;
6
6
  setName?: ((str: string) => void) | undefined;
@@ -8,4 +8,4 @@ declare const FileSelector: (props: {
8
8
  description?: string | undefined;
9
9
  rootModel?: AbstractRootModel | undefined;
10
10
  }) => JSX.Element;
11
- export default FileSelector;
11
+ export default _default;
@@ -42,46 +42,45 @@ function ToggleButtonWithTooltip(props) {
42
42
  }
43
43
  function shorten(str, len) {
44
44
  if (typeof str === 'string' && str.length > len) {
45
- return `${str.substring(0, len)}…`;
45
+ return `${str.slice(0, Math.max(0, len))}…`;
46
46
  }
47
47
  return str;
48
48
  }
49
- const FileSelector = (0, mobx_react_1.observer)((props) => {
49
+ exports.default = (0, mobx_react_1.observer)(function (props) {
50
50
  const { location, name, description, rootModel, setLocation } = props;
51
51
  const fileOrUrl = !location || (0, types_1.isUriLocation)(location) ? 'url' : 'file';
52
52
  const [toggleButtonValue, setToggleButtonValue] = (0, react_1.useState)(location && 'internetAccountId' in location && location.internetAccountId
53
53
  ? location.internetAccountId
54
54
  : fileOrUrl);
55
- const accts = (0, types_1.isAppRootModel)(rootModel)
56
- ? rootModel.internetAccounts.slice()
57
- : [];
55
+ const accts = (0, types_1.isAppRootModel)(rootModel) ? [...rootModel.internetAccounts] : [];
58
56
  const numShown = 2;
59
57
  const [shownAccts, setShownAccts] = (0, react_1.useState)(accts.slice(0, numShown));
60
58
  const [hiddenAccts, setHiddenAccts] = (0, react_1.useState)(accts.slice(numShown));
61
59
  const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
62
- const selectedAcct = accts.find(ia => ia.internetAccountId === toggleButtonValue);
63
- const setLocationWithAccount = (location) => {
60
+ const selectedAcct = accts.find(i => i.internetAccountId === toggleButtonValue);
61
+ const setLocationWithAcct = (0, react_1.useCallback)((location) => {
64
62
  setLocation({
65
63
  ...location,
66
- internetAccountId: selectedAcct
67
- ? selectedAcct.internetAccountId
68
- : undefined,
64
+ ...((0, types_1.isUriLocation)(location)
65
+ ? { internetAccountId: selectedAcct === null || selectedAcct === void 0 ? void 0 : selectedAcct.internetAccountId }
66
+ : {}),
69
67
  });
70
- };
71
- // if you swap account selection after inputting url
72
- if (location &&
73
- selectedAcct &&
74
- (0, types_1.isUriLocation)(location) &&
75
- location.internetAccountId !== selectedAcct.internetAccountId) {
76
- setLocationWithAccount(location);
77
- }
78
- let locationInput = (react_1.default.createElement(UrlChooser_1.default, { ...props, setLocation: setLocationWithAccount, label: selectedAcct === null || selectedAcct === void 0 ? void 0 : selectedAcct.selectorLabel }));
68
+ }, [setLocation, selectedAcct]);
69
+ (0, react_1.useEffect)(() => {
70
+ // if you swap account selection after inputting url
71
+ if (selectedAcct &&
72
+ (0, types_1.isUriLocation)(location) &&
73
+ location.internetAccountId !== selectedAcct.internetAccountId) {
74
+ setLocationWithAcct(location);
75
+ }
76
+ }, [location, selectedAcct, setLocationWithAcct]);
77
+ let locationInput = (react_1.default.createElement(UrlChooser_1.default, { ...props, setLocation: setLocationWithAcct, label: selectedAcct === null || selectedAcct === void 0 ? void 0 : selectedAcct.selectorLabel }));
79
78
  if (toggleButtonValue === 'file') {
80
79
  locationInput = react_1.default.createElement(LocalFileChooser_1.default, { ...props });
81
80
  }
82
81
  if (selectedAcct === null || selectedAcct === void 0 ? void 0 : selectedAcct.SelectorComponent) {
83
82
  const { SelectorComponent } = selectedAcct;
84
- locationInput = (react_1.default.createElement(SelectorComponent, { ...props, setLocation: setLocationWithAccount }));
83
+ locationInput = (react_1.default.createElement(SelectorComponent, { ...props, setLocation: setLocationWithAcct }));
85
84
  }
86
85
  return (react_1.default.createElement(react_1.default.Fragment, null,
87
86
  react_1.default.createElement(material_1.Box, { display: "flex" },
@@ -93,7 +92,7 @@ const FileSelector = (0, mobx_react_1.observer)((props) => {
93
92
  setToggleButtonValue(newState);
94
93
  }
95
94
  if ((0, types_1.isUriLocation)(location)) {
96
- setLocationWithAccount(location);
95
+ setLocationWithAcct(location);
97
96
  }
98
97
  }, "aria-label": "file, url, or account picker" },
99
98
  new URLSearchParams(window.location.search).get('adminKey') ? null : (react_1.default.createElement(material_1.ToggleButton, { value: "file", "aria-label": "local file" }, "File")),
@@ -101,23 +100,14 @@ const FileSelector = (0, mobx_react_1.observer)((props) => {
101
100
  shownAccts.map(({ internetAccountId, toggleContents, name }) => (react_1.default.createElement(ToggleButtonWithTooltip, { key: internetAccountId, value: internetAccountId, "aria-label": name, title: name }, typeof toggleContents === 'string'
102
101
  ? shorten(toggleContents, 5)
103
102
  : toggleContents || shorten(name, 5)))),
104
- hiddenAccts.length ? (
105
- // @ts-ignore
103
+ hiddenAccts.length > 0 ? (
104
+ // @ts-expect-error
106
105
  react_1.default.createElement(material_1.ToggleButton, { onClick: event => setAnchorEl(event.target), selected: false },
107
106
  "More",
108
107
  react_1.default.createElement(ArrowDropDown_1.default, null))) : null),
109
- react_1.default.createElement(material_1.Menu, { open: Boolean(anchorEl), anchorEl: anchorEl, onClose: () => setAnchorEl(null), anchorOrigin: {
110
- vertical: 'bottom',
111
- horizontal: 'center',
112
- }, transformOrigin: {
113
- vertical: 'top',
114
- horizontal: 'center',
115
- } }, hiddenAccts === null || hiddenAccts === void 0 ? void 0 : hiddenAccts.map((acct, idx) => (react_1.default.createElement(material_1.MenuItem, { key: acct.internetAccountId, value: acct.internetAccountId, onClick: () => {
108
+ react_1.default.createElement(material_1.Menu, { open: Boolean(anchorEl), anchorEl: anchorEl, onClose: () => setAnchorEl(null), anchorOrigin: { vertical: 'bottom', horizontal: 'center' }, transformOrigin: { vertical: 'top', horizontal: 'center' } }, hiddenAccts === null || hiddenAccts === void 0 ? void 0 : hiddenAccts.map((acct, idx) => (react_1.default.createElement(material_1.MenuItem, { key: acct.internetAccountId, value: acct.internetAccountId, onClick: () => {
116
109
  const prev = shownAccts[shownAccts.length - 1];
117
- setShownAccts([
118
- ...shownAccts.slice(0, shownAccts.length - 1),
119
- acct,
120
- ]);
110
+ setShownAccts([...shownAccts.slice(0, -1), acct]);
121
111
  setHiddenAccts([
122
112
  prev,
123
113
  ...hiddenAccts.slice(0, idx),
@@ -129,4 +119,3 @@ const FileSelector = (0, mobx_react_1.observer)((props) => {
129
119
  locationInput,
130
120
  react_1.default.createElement(material_1.FormHelperText, null, description)));
131
121
  });
132
- exports.default = FileSelector;
@@ -1,2 +1 @@
1
- import FileSelector from './FileSelector';
2
- export default FileSelector;
1
+ export { default } from './FileSelector';
@@ -3,5 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const FileSelector_1 = __importDefault(require("./FileSelector"));
7
- exports.default = FileSelector_1.default;
6
+ exports.default = void 0;
7
+ var FileSelector_1 = require("./FileSelector");
8
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(FileSelector_1).default; } });
@@ -27,11 +27,11 @@ const useStyles = (0, mui_1.makeStyles)()({
27
27
  75% {
28
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
@@ -69,26 +69,32 @@ function MenuItemEndDecoration(props) {
69
69
  ({ checked, disabled } = props);
70
70
  }
71
71
  let icon;
72
- if (type === 'subMenu') {
73
- icon = react_1.default.createElement(ArrowRight_1.default, { color: "action" });
74
- }
75
- else if (type === 'checkbox') {
76
- if (checked) {
77
- const color = disabled ? 'inherit' : 'secondary';
78
- icon = react_1.default.createElement(CheckBox_1.default, { color: color });
79
- }
80
- else {
81
- icon = react_1.default.createElement(CheckBoxOutlineBlank_1.default, { color: "action" });
72
+ switch (type) {
73
+ case 'subMenu': {
74
+ icon = react_1.default.createElement(ArrowRight_1.default, { color: "action" });
75
+ break;
82
76
  }
83
- }
84
- else if (type === 'radio') {
85
- if (checked) {
86
- const color = disabled ? 'inherit' : 'secondary';
87
- icon = react_1.default.createElement(RadioButtonChecked_1.default, { color: color });
77
+ case 'checkbox': {
78
+ if (checked) {
79
+ const color = disabled ? 'inherit' : undefined;
80
+ icon = react_1.default.createElement(CheckBox_1.default, { color: color });
81
+ }
82
+ else {
83
+ icon = react_1.default.createElement(CheckBoxOutlineBlank_1.default, { color: "action" });
84
+ }
85
+ break;
88
86
  }
89
- else {
90
- icon = react_1.default.createElement(RadioButtonUnchecked_1.default, { color: "action" });
87
+ case 'radio': {
88
+ if (checked) {
89
+ const color = disabled ? 'inherit' : undefined;
90
+ icon = react_1.default.createElement(RadioButtonChecked_1.default, { color: color });
91
+ }
92
+ else {
93
+ icon = react_1.default.createElement(RadioButtonUnchecked_1.default, { color: "action" });
94
+ }
95
+ break;
91
96
  }
97
+ // No default
92
98
  }
93
99
  return react_1.default.createElement("div", { className: classes.menuItemEndDecoration }, icon);
94
100
  }
@@ -208,21 +214,28 @@ const MenuPage = react_1.default.forwardRef((props, ref) => {
208
214
  setOpenSubMenuIdx(undefined);
209
215
  }
210
216
  }, onKeyDown: e => {
211
- if (e.key === 'ArrowLeft' || e.key === 'Escape') {
212
- onClose && onClose(e, 'escapeKeyDown');
213
- }
214
- else if (e.key === 'ArrowUp') {
215
- setSelectedMenuItemIdx(findPreviousValidIdx(menuItems, idx));
216
- }
217
- else if (e.key === 'ArrowDown') {
218
- const a = findNextValidIdx(menuItems, idx);
219
- setSelectedMenuItemIdx(a);
220
- }
221
- else if ('subMenu' in menuItem) {
222
- if (e.key === 'ArrowRight' || e.key === 'Enter') {
223
- setSubMenuAnchorEl(e.currentTarget);
224
- setOpenSubMenuIdx(idx);
225
- setIsSubMenuOpen(true);
217
+ switch (e.key) {
218
+ case 'ArrowLeft':
219
+ case 'Escape': {
220
+ onClose && onClose(e, 'escapeKeyDown');
221
+ break;
222
+ }
223
+ case 'ArrowUp': {
224
+ setSelectedMenuItemIdx(findPreviousValidIdx(menuItems, idx));
225
+ break;
226
+ }
227
+ case 'ArrowDown': {
228
+ const a = findNextValidIdx(menuItems, idx);
229
+ setSelectedMenuItemIdx(a);
230
+ break;
231
+ }
232
+ default: {
233
+ if ('subMenu' in menuItem &&
234
+ (e.key === 'ArrowRight' || e.key === 'Enter')) {
235
+ setSubMenuAnchorEl(e.currentTarget);
236
+ setOpenSubMenuIdx(idx);
237
+ setIsSubMenuOpen(true);
238
+ }
226
239
  }
227
240
  }
228
241
  }, disabled: Boolean(menuItem.disabled) },
package/ui/ResizeBar.js CHANGED
@@ -31,9 +31,9 @@ const react_1 = __importStar(require("react"));
31
31
  const mui_1 = require("tss-react/mui");
32
32
  // locals
33
33
  const ResizeHandle_1 = __importDefault(require("./ResizeHandle"));
34
- const useStyles = (0, mui_1.makeStyles)()({
34
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
35
35
  resizeBar: {
36
- background: 'lightgrey',
36
+ background: theme.palette.action.disabledBackground,
37
37
  height: 12,
38
38
  position: 'relative',
39
39
  overflow: 'hidden',
@@ -42,16 +42,15 @@ const useStyles = (0, mui_1.makeStyles)()({
42
42
  position: 'absolute',
43
43
  height: '100%',
44
44
  pointerEvents: 'none',
45
- background: 'black',
45
+ background: theme.palette.divider,
46
46
  width: 1,
47
47
  },
48
48
  hiddenTick: {
49
49
  position: 'absolute',
50
50
  height: '100%',
51
- background: 'lightgrey',
52
51
  width: 5,
53
52
  },
54
- });
53
+ }));
55
54
  function useResizeBar() {
56
55
  const ref = (0, react_1.useRef)(null);
57
56
  const [scrollLeft, setScrollLeft] = (0, react_1.useState)(0);
@@ -83,7 +82,12 @@ function Tick({ left, scrollLeft, idx, onDrag, }) {
83
82
  function ResizeBar({ widths, setWidths, checkbox, scrollLeft = 0, }) {
84
83
  const { classes } = useStyles();
85
84
  const offsets = [];
86
- widths.reduce((a, b, i) => (offsets[i] = a + b), checkbox ? 52 : 0);
85
+ let init = checkbox ? 52 : 0;
86
+ for (let i = 0; i < widths.length; i++) {
87
+ const width = widths[i];
88
+ offsets[i] = width + init;
89
+ init += width;
90
+ }
87
91
  const onDrag = (0, react_1.useCallback)((distance, idx) => {
88
92
  const newWidths = [...widths];
89
93
  // mui doesn't allow columns smaller than 50
@@ -72,12 +72,9 @@ function ResizeHandle({ onDrag, vertical = false, flexbox = false, className: or
72
72
  }, [mouseDragging, onDrag, vertical]);
73
73
  let className;
74
74
  if (flexbox) {
75
- if (vertical) {
76
- className = classes.flexbox_verticalHandle;
77
- }
78
- else {
79
- className = classes.flexbox_horizontalHandle;
80
- }
75
+ className = vertical
76
+ ? classes.flexbox_verticalHandle
77
+ : classes.flexbox_horizontalHandle;
81
78
  }
82
79
  else if (vertical) {
83
80
  className = classes.verticalHandle;
@@ -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',
@@ -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)();
@@ -110,7 +75,7 @@ const ViewContainer = (0, mobx_react_1.observer)(({ view, onClose, onMinimize, s
110
75
  const [ref, { width }] = (0, react_use_measure_1.default)();
111
76
  (0, react_1.useEffect)(() => {
112
77
  if (width && (0, mobx_state_tree_1.isAlive)(view)) {
113
- view.setWidth(width - parseInt(padWidth, 10) * 2);
78
+ view.setWidth(width - Number.parseInt(padWidth, 10) * 2);
114
79
  }
115
80
  }, [padWidth, view, width]);
116
81
  const scrollRef = (0, react_1.useRef)(null);
@@ -123,14 +88,12 @@ 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
- react_1.default.createElement(EditableTypography_1.default, { value: (view.displayName ||
130
- (
131
- // @ts-ignore
132
- (_a = view.assemblyNames) === null || _a === void 0 ? void 0 : _a.join(',')) ||
133
- 'Untitled view') + (view.minimized ? ' (minimized)' : ''), setValue: val => view.setDisplayName(val), variant: "body2", classes: {
94
+ react_1.default.createElement(EditableTypography_1.default, { value: view.displayName ||
95
+ // @ts-expect-error
96
+ `${((_a = view.assemblyNames) === null || _a === void 0 ? void 0 : _a.join(',')) || 'Untitled view'}${view.minimized ? ' (minimized)' : ''}`, setValue: val => view.setDisplayName(val), variant: "body2", classes: {
134
97
  input: classes.input,
135
98
  inputBase: classes.inputBase,
136
99
  inputRoot: classes.inputRoot,
@@ -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;