@jbrowse/core 2.13.0 → 2.14.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 (149) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +2 -2
  2. package/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +1 -1
  3. package/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +3 -1
  4. package/BaseFeatureWidget/BaseFeatureDetail/index.js +28 -25
  5. package/BaseFeatureWidget/BaseFeatureDetail/util.js +1 -1
  6. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +11 -5
  7. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +1 -1
  8. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.js +11 -7
  9. package/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.js +1 -1
  10. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.js +6 -2
  11. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +11 -5
  12. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceFeatureMenu.js +15 -5
  13. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.js +4 -2
  14. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SettingsDialog.js +15 -5
  15. package/BaseFeatureWidget/SequenceFeatureDetails/hooks.js +2 -2
  16. package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.js +2 -2
  17. package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.js +5 -3
  18. package/BaseFeatureWidget/stateModelFactory.js +0 -2
  19. package/PluginLoader.d.ts +1 -2
  20. package/PluginLoader.js +16 -6
  21. package/PluginManager.d.ts +13 -13
  22. package/PluginManager.js +7 -2
  23. package/ReExports/modules.js +2 -11
  24. package/assemblyManager/assembly.d.ts +18 -12
  25. package/assemblyManager/assembly.js +75 -52
  26. package/assemblyManager/assemblyConfigSchema.d.ts +9 -7
  27. package/assemblyManager/assemblyConfigSchema.js +15 -16
  28. package/assemblyManager/assemblyManager.d.ts +109 -81
  29. package/assemblyManager/assemblyManager.js +3 -6
  30. package/configuration/configurationSchema.d.ts +1 -1
  31. package/configuration/configurationSchema.js +1 -2
  32. package/configuration/configurationSlot.js +7 -8
  33. package/configuration/util.js +0 -7
  34. package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +6 -6
  35. package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +6 -6
  36. package/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.d.ts +1 -0
  37. package/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +0 -1
  38. package/data_adapters/CytobandAdapter/CytobandAdapter.js +4 -8
  39. package/data_adapters/dataAdapterCache.d.ts +9 -6
  40. package/data_adapters/dataAdapterCache.js +16 -22
  41. package/package.json +3 -3
  42. package/pluggableElementTypes/AddTrackWorkflowType.js +0 -6
  43. package/pluggableElementTypes/ConnectionType.js +0 -6
  44. package/pluggableElementTypes/DisplayType.js +0 -20
  45. package/pluggableElementTypes/InternetAccountType.js +0 -11
  46. package/pluggableElementTypes/RpcMethodType.d.ts +1 -1
  47. package/pluggableElementTypes/TextSearchAdapterType.js +0 -3
  48. package/pluggableElementTypes/TrackType.js +0 -11
  49. package/pluggableElementTypes/ViewType.js +0 -6
  50. package/pluggableElementTypes/WidgetType.js +0 -6
  51. package/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +4 -3
  52. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +1 -3
  53. package/pluggableElementTypes/models/BaseDisplayModel.d.ts +4 -5
  54. package/pluggableElementTypes/models/BaseDisplayModel.js +6 -14
  55. package/pluggableElementTypes/models/BaseTrackModel.js +8 -5
  56. package/pluggableElementTypes/models/InternetAccountModel.d.ts +1 -1
  57. package/pluggableElementTypes/models/InternetAccountModel.js +19 -13
  58. package/pluggableElementTypes/models/baseTrackConfig.js +2 -5
  59. package/pluggableElementTypes/renderers/BoxRendererType.d.ts +10 -4
  60. package/pluggableElementTypes/renderers/BoxRendererType.js +10 -26
  61. package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +1 -1
  62. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.d.ts +9 -12
  63. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +12 -19
  64. package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +5 -5
  65. package/pluggableElementTypes/renderers/FeatureRendererType.js +6 -13
  66. package/pluggableElementTypes/renderers/RendererType.js +0 -10
  67. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +1 -1
  68. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.js +8 -9
  69. package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +11 -14
  70. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +4 -4
  71. package/pluggableElementTypes/renderers/ServerSideRendererType.js +7 -5
  72. package/pluggableElementTypes/renderers/util/serializableFilterChain.js +0 -1
  73. package/rpc/BaseRpcDriver.d.ts +1 -1
  74. package/rpc/BaseRpcDriver.js +12 -11
  75. package/rpc/MainThreadRpcDriver.d.ts +2 -2
  76. package/rpc/MainThreadRpcDriver.js +3 -0
  77. package/rpc/RpcManager.d.ts +1 -1
  78. package/rpc/RpcManager.js +11 -8
  79. package/rpc/configSchema.js +0 -1
  80. package/rpc/methods/CoreFreeResources.d.ts +2 -2
  81. package/rpc/methods/CoreGetFeatureDensityStats.d.ts +2 -2
  82. package/rpc/methods/CoreGetFeatureDetails.d.ts +1 -1
  83. package/rpc/methods/CoreGetFeatureDetails.js +3 -3
  84. package/rpc/methods/CoreGetFeatures.d.ts +1 -1
  85. package/rpc/methods/CoreGetFileInfo.d.ts +1 -1
  86. package/rpc/methods/CoreGetMetadata.d.ts +1 -1
  87. package/rpc/methods/CoreGetRefNames.d.ts +1 -1
  88. package/rpc/methods/util.d.ts +2 -2
  89. package/rpc/methods/util.js +0 -3
  90. package/tsconfig.build.tsbuildinfo +1 -1
  91. package/ui/AssemblySelector.js +3 -1
  92. package/ui/CascadingMenu.js +2 -1
  93. package/ui/CascadingMenuButton.js +3 -1
  94. package/ui/ColorPicker.js +14 -4
  95. package/ui/DropDownMenu.js +3 -1
  96. package/ui/EditableTypography.js +6 -2
  97. package/ui/ErrorMessage.d.ts +2 -2
  98. package/ui/ErrorMessage.js +37 -20
  99. package/ui/ErrorMessageStackTraceDialog.js +11 -9
  100. package/ui/FactoryResetDialog.d.ts +1 -1
  101. package/ui/FactoryResetDialog.js +9 -3
  102. package/ui/FatalErrorDialog.js +9 -3
  103. package/ui/FileSelector/FileSelector.js +8 -4
  104. package/ui/FileSelector/LocalFileChooser.js +7 -6
  105. package/ui/LoadingEllipses.js +1 -1
  106. package/ui/Menu.d.ts +4 -4
  107. package/ui/Menu.js +6 -9
  108. package/ui/MenuButton.js +6 -2
  109. package/ui/PrerenderedCanvas.js +8 -5
  110. package/ui/RedErrorMessageBox.js +13 -8
  111. package/ui/ResizeHandle.d.ts +1 -1
  112. package/ui/ReturnToImportFormDialog.js +3 -1
  113. package/ui/SanitizedHTML.js +1 -3
  114. package/ui/SnackbarModel.d.ts +12 -1
  115. package/ui/SnackbarModel.js +19 -3
  116. package/ui/theme.js +5 -5
  117. package/util/Base1DViewModel.js +3 -1
  118. package/util/QuickLRU.js +8 -8
  119. package/util/TimeTraveller.js +12 -4
  120. package/util/analytics.js +0 -1
  121. package/util/blockTypes.js +5 -9
  122. package/util/calculateStaticBlocks.d.ts +1 -1
  123. package/util/compositeMap.js +2 -2
  124. package/util/idMaker.js +0 -1
  125. package/util/index.d.ts +9 -8
  126. package/util/index.js +91 -51
  127. package/util/io/RemoteFileWithRangeCache.js +1 -3
  128. package/util/io/index.js +3 -5
  129. package/util/jexlStrings.js +5 -8
  130. package/util/layouts/GranularRectLayout.js +1 -4
  131. package/util/layouts/SceneGraph.d.ts +1 -1
  132. package/util/layouts/SceneGraph.js +2 -6
  133. package/util/map-obj.js +15 -7
  134. package/util/mst-reflection.js +1 -2
  135. package/util/nanoid.js +9 -8
  136. package/util/offscreenCanvasPonyfill.d.ts +1 -1
  137. package/util/offscreenCanvasPonyfill.js +7 -10
  138. package/util/offscreenCanvasUtils.d.ts +1 -1
  139. package/util/offscreenCanvasUtils.js +1 -3
  140. package/util/rxjs.js +4 -2
  141. package/util/simpleFeature.d.ts +2 -3
  142. package/util/simpleFeature.js +9 -12
  143. package/util/stats.js +3 -1
  144. package/util/tracks.d.ts +4 -2
  145. package/util/tracks.js +10 -11
  146. package/util/types/index.d.ts +5 -5
  147. package/util/types/index.js +8 -1
  148. package/util/types/mst.js +1 -0
  149. package/util/when.js +7 -2
@@ -57,7 +57,9 @@ const AssemblySelector = (0, mobx_react_1.observer)(function ({ session, onChang
57
57
  }
58
58
  }, [selection, onChange, selected]);
59
59
  const error = assemblyNames.length ? '' : 'No configured assemblies';
60
- return (react_1.default.createElement(material_1.TextField, { select: true, label: "Assembly", variant: "outlined", helperText: error || helperText, value: selection || '', inputProps: { 'data-testid': 'assembly-selector' }, onChange: event => setLastSelected(event.target.value), error: !!error, InputProps: InputProps, disabled: !!error, className: classes.importFormEntry, ...TextFieldProps }, assemblyNames.map(name => {
60
+ return (react_1.default.createElement(material_1.TextField, { select: true, label: "Assembly", variant: "outlined", helperText: error || helperText, value: selection || '', inputProps: { 'data-testid': 'assembly-selector' }, onChange: event => {
61
+ setLastSelected(event.target.value);
62
+ }, error: !!error, InputProps: InputProps, disabled: !!error, className: classes.importFormEntry, ...TextFieldProps }, assemblyNames.map(name => {
61
63
  const assembly = assemblyManager.get(name);
62
64
  const displayName = assembly ? (0, configuration_1.getConf)(assembly, 'displayName') : '';
63
65
  return (react_1.default.createElement(material_1.MenuItem, { key: name, value: name }, displayName || name));
@@ -26,6 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
+ /* eslint-disable @typescript-eslint/no-unsafe-function-type */
29
30
  const react_1 = __importStar(require("react"));
30
31
  const material_1 = require("@mui/material");
31
32
  const Menu_1 = require("./Menu");
@@ -99,7 +100,7 @@ function CascadingMenuList({ onMenuItemClick, closeAfterItemClick, menuItems, ..
99
100
  const hasIcon = menuItems.some(m => 'icon' in m && m.icon);
100
101
  return (react_1.default.createElement(react_1.default.Fragment, null, menuItems.map((item, idx) => {
101
102
  return 'subMenu' in item ? (react_1.default.createElement(CascadingSubmenu, { key: `subMenu-${item.label}-${idx}`, popupId: `subMenu-${item.label}`, title: item.label, Icon: item.icon, inset: hasIcon && !item.icon, onMenuItemClick: onMenuItemClick, menuItems: item.subMenu },
102
- react_1.default.createElement(CascadingMenuList, { ...props, closeAfterItemClick: closeAfterItemClick, onMenuItemClick: onMenuItemClick, menuItems: item.subMenu }))) : item.type === 'divider' ? (react_1.default.createElement(material_1.Divider, { key: `divider-${idx}`, component: "li" })) : item.type === 'subHeader' ? (react_1.default.createElement(material_1.ListSubheader, { key: `subHeader-${item.label}-${idx}` }, item.label)) : (react_1.default.createElement(CascadingMenuItem, { key: `${item.label}-${idx}`, closeAfterItemClick: closeAfterItemClick, onClick: 'onClick' in item ? handleClick(item.onClick) : undefined, disabled: Boolean(item.disabled) },
103
+ react_1.default.createElement(CascadingMenuList, { ...props, closeAfterItemClick: closeAfterItemClick, onMenuItemClick: onMenuItemClick, menuItems: item.subMenu }))) : item.type === 'divider' ? (react_1.default.createElement(material_1.Divider, { key: `divider-${JSON.stringify(item)}-${idx}`, component: "li" })) : item.type === 'subHeader' ? (react_1.default.createElement(material_1.ListSubheader, { key: `subHeader-${item.label}-${idx}` }, item.label)) : (react_1.default.createElement(CascadingMenuItem, { key: `${item.label}-${idx}`, closeAfterItemClick: closeAfterItemClick, onClick: 'onClick' in item ? handleClick(item.onClick) : undefined, disabled: Boolean(item.disabled) },
103
104
  item.icon ? (react_1.default.createElement(material_1.ListItemIcon, null,
104
105
  react_1.default.createElement(item.icon, null))) : null,
105
106
  ' ',
@@ -55,6 +55,8 @@ const CascadingMenuButton = (0, mobx_react_1.observer)(function CascadingMenuBut
55
55
  onTouchStart(event);
56
56
  onClickExtra === null || onClickExtra === void 0 ? void 0 : onClickExtra();
57
57
  }, ...rest2, ...rest, disabled: menuItems.length === 0 }, children),
58
- react_1.default.createElement(CascadingMenu_1.default, { ...(0, hooks_1.bindPopover)(popupState), onMenuItemClick: (_, callback) => callback(), menuItems: menuItems, closeAfterItemClick: closeAfterItemClick, popupState: popupState })));
58
+ react_1.default.createElement(CascadingMenu_1.default, { ...(0, hooks_1.bindPopover)(popupState), onMenuItemClick: (_, callback) => {
59
+ callback();
60
+ }, menuItems: menuItems, closeAfterItemClick: closeAfterItemClick, popupState: popupState })));
59
61
  });
60
62
  exports.default = CascadingMenuButton;
package/ui/ColorPicker.js CHANGED
@@ -58,8 +58,12 @@ const PopoverPicker = ({ color, onChange, }) => {
58
58
  const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
59
59
  const { classes } = useStyles();
60
60
  return (react_1.default.createElement("div", { className: classes.picker },
61
- react_1.default.createElement("div", { className: classes.swatch, style: { backgroundColor: color }, onClick: event => setAnchorEl(event.currentTarget) }),
62
- react_1.default.createElement(ColorPopover, { anchorEl: anchorEl, onClose: () => setAnchorEl(null), color: color, onChange: onChange })));
61
+ react_1.default.createElement("div", { className: classes.swatch, style: { backgroundColor: color }, onClick: event => {
62
+ setAnchorEl(event.currentTarget);
63
+ } }),
64
+ react_1.default.createElement(ColorPopover, { anchorEl: anchorEl, onClose: () => {
65
+ setAnchorEl(null);
66
+ }, color: color, onChange: onChange })));
63
67
  };
64
68
  exports.PopoverPicker = PopoverPicker;
65
69
  function ColorPopover({ anchorEl, onChange, onClose, color, }) {
@@ -89,7 +93,13 @@ function ColorPicker({ onChange, color, }) {
89
93
  const pal = event.target.value;
90
94
  setVal(pal);
91
95
  } }, palettes.map(p => (react_1.default.createElement(material_1.MenuItem, { value: p, key: p }, p)))),
92
- 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(material_1.TextField, { helperText: 'Manually set color (hex, rgb, or css color name)', value: text, onChange: event => handleChange(event.target.value) }))));
96
+ react_1.default.createElement("div", { className: classes.swatches }, presetColors.map((presetColor, idx) => (react_1.default.createElement("button", { type: "button",
97
+ /* biome-ignore lint/suspicious/noArrayIndexKey: */
98
+ key: `${presetColor}-${idx}`, className: classes.swatch, style: { background: presetColor }, onClick: () => {
99
+ handleChange(presetColor);
100
+ } })))),
101
+ react_1.default.createElement(material_1.TextField, { helperText: 'Manually set color (hex, rgb, or css color name)', value: text, onChange: event => {
102
+ handleChange(event.target.value);
103
+ } }))));
94
104
  }
95
105
  exports.default = exports.PopoverPicker;
@@ -50,7 +50,9 @@ const DropDownMenu = (0, mobx_react_1.observer)(function ({ menuTitle, session,
50
50
  setOpen(false);
51
51
  }
52
52
  return (react_1.default.createElement(react_1.default.Fragment, null,
53
- react_1.default.createElement(material_1.Button, { ref: anchorEl, onClick: () => setOpen(!open), color: "inherit", "data-testid": "dropDownMenuButton", classes: { root: classes.buttonRoot } },
53
+ react_1.default.createElement(material_1.Button, { ref: anchorEl, onClick: () => {
54
+ setOpen(!open);
55
+ }, color: "inherit", "data-testid": "dropDownMenuButton", classes: { root: classes.buttonRoot } },
54
56
  menuTitle,
55
57
  react_1.default.createElement(ArrowDropDown_1.default, null)),
56
58
  react_1.default.createElement(Menu_1.default, { anchorEl: anchorEl.current, anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, onMenuItemClick: (_event, callback) => {
@@ -70,7 +70,9 @@ const EditableTypography = react_1.default.forwardRef(function EditableTypograph
70
70
  return (react_1.default.createElement("div", { ...other, ref: ref },
71
71
  react_1.default.createElement("div", { style: { position: 'relative' } },
72
72
  react_1.default.createElement(material_1.Typography, { ref: ref2, component: "span", variant: variant, className: classes.typography }, val)),
73
- react_1.default.createElement(material_1.InputBase, { inputRef: node => setInputNode(node), className: classes.inputBase, inputProps: {
73
+ react_1.default.createElement(material_1.InputBase, { inputRef: node => {
74
+ setInputNode(node);
75
+ }, className: classes.inputBase, inputProps: {
74
76
  style: {
75
77
  width,
76
78
  ...(variant && variant !== 'inherit'
@@ -81,7 +83,9 @@ const EditableTypography = react_1.default.forwardRef(function EditableTypograph
81
83
  input: classes.input,
82
84
  root: classes.inputRoot,
83
85
  focused: classes.inputFocused,
84
- }, value: val, onChange: event => setEditedValue(event.target.value), onKeyDown: event => {
86
+ }, value: val, onChange: event => {
87
+ setEditedValue(event.target.value);
88
+ }, onKeyDown: event => {
85
89
  if (event.key === 'Enter') {
86
90
  inputNode === null || inputNode === void 0 ? void 0 : inputNode.blur();
87
91
  }
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
- declare const ErrorMessage: ({ error, onReset, }: {
2
+ declare function ErrorMessage({ error, onReset, }: {
3
3
  error: unknown;
4
4
  onReset?: () => void;
5
- }) => React.JSX.Element;
5
+ }): React.JSX.Element;
6
6
  export default ErrorMessage;
@@ -28,6 +28,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const react_1 = __importStar(require("react"));
30
30
  const material_1 = require("@mui/material");
31
+ const mui_1 = require("tss-react/mui");
31
32
  // locals
32
33
  const RedErrorMessageBox_1 = __importDefault(require("./RedErrorMessageBox"));
33
34
  // icons
@@ -35,6 +36,17 @@ const Refresh_1 = __importDefault(require("@mui/icons-material/Refresh"));
35
36
  const Report_1 = __importDefault(require("@mui/icons-material/Report"));
36
37
  // lazies
37
38
  const ErrorMessageStackTraceDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./ErrorMessageStackTraceDialog'))));
39
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
40
+ bg: {
41
+ background: theme.palette.divider,
42
+ border: '1px solid black',
43
+ margin: 20,
44
+ },
45
+ iconFloat: {
46
+ float: 'right',
47
+ marginLeft: 100,
48
+ },
49
+ }));
38
50
  function parseError(str) {
39
51
  let snapshotError = '';
40
52
  const findStr = 'is not assignable';
@@ -44,41 +56,46 @@ function parseError(str) {
44
56
  // best effort to make a better error message than the default
45
57
  // mobx-state-tree
46
58
  // case 1. element has a path
47
- const match = trim.match(/.*at path "(.*)" snapshot `(.*)` is not assignable/m);
59
+ const match = /.*at path "(.*)" snapshot `(.*)` is not assignable/m.exec(trim);
48
60
  if (match) {
49
61
  str = `Failed to load element at ${match[1]}...Failed element had snapshot`;
50
62
  snapshotError = match[2];
51
63
  }
52
64
  // case 2. element has no path
53
- const match2 = trim.match(/.*snapshot `(.*)` is not assignable/);
65
+ const match2 = /.*snapshot `(.*)` is not assignable/.exec(trim);
54
66
  if (match2) {
55
- str = `Failed to load element...Failed element had snapshot`;
67
+ str = 'Failed to load element...Failed element had snapshot';
56
68
  snapshotError = match2[1];
57
69
  }
58
70
  }
59
71
  return snapshotError;
60
72
  }
61
- const ErrorMessage = ({ error, onReset, }) => {
73
+ function ErrorButtons({ error, onReset, }) {
74
+ const { classes } = useStyles();
75
+ const [showStack, setShowStack] = (0, react_1.useState)(false);
76
+ return (react_1.default.createElement("div", { className: classes.iconFloat },
77
+ typeof error === 'object' && error && 'stack' in error ? (react_1.default.createElement(material_1.Tooltip, { title: "Get stack trace" },
78
+ react_1.default.createElement(material_1.IconButton, { onClick: () => {
79
+ setShowStack(true);
80
+ }, color: "primary" },
81
+ react_1.default.createElement(Report_1.default, null)))) : null,
82
+ onReset ? (react_1.default.createElement(material_1.Tooltip, { title: "Retry" },
83
+ react_1.default.createElement(material_1.IconButton, { onClick: onReset, color: "primary" },
84
+ react_1.default.createElement(Refresh_1.default, null)))) : null,
85
+ showStack ? (react_1.default.createElement(react_1.Suspense, { fallback: null },
86
+ react_1.default.createElement(ErrorMessageStackTraceDialog, { error: error, onClose: () => {
87
+ setShowStack(false);
88
+ } }))) : null));
89
+ }
90
+ function ErrorMessage({ error, onReset, }) {
91
+ const { classes } = useStyles();
62
92
  const str = `${error}`;
63
93
  const str2 = str.indexOf('expected an instance of');
64
94
  const str3 = str2 !== -1 ? str.slice(0, str2) : str;
65
95
  const snapshotError = parseError(str);
66
- const [showStack, setShowStack] = (0, react_1.useState)(false);
67
96
  return (react_1.default.createElement(RedErrorMessageBox_1.default, null,
68
97
  str3.slice(0, 10000),
69
- react_1.default.createElement("div", { style: { float: 'right', marginLeft: 100 } },
70
- typeof error === 'object' && error && 'stack' in error ? (react_1.default.createElement(material_1.Tooltip, { title: "Get stack trace" },
71
- react_1.default.createElement(material_1.IconButton, { onClick: () => setShowStack(true), color: "primary" },
72
- react_1.default.createElement(Report_1.default, null)))) : null,
73
- onReset ? (react_1.default.createElement(material_1.Tooltip, { title: "Retry" },
74
- react_1.default.createElement(material_1.IconButton, { onClick: onReset, color: "primary" },
75
- react_1.default.createElement(Refresh_1.default, null)))) : null),
76
- snapshotError ? (react_1.default.createElement("pre", { style: {
77
- background: 'lightgrey',
78
- border: '1px solid black',
79
- margin: 20,
80
- } }, JSON.stringify(JSON.parse(snapshotError), null, 2))) : null,
81
- showStack ? (react_1.default.createElement(react_1.Suspense, { fallback: null },
82
- react_1.default.createElement(ErrorMessageStackTraceDialog, { error: error, onClose: () => setShowStack(false) }))) : null));
83
- };
98
+ react_1.default.createElement(ErrorButtons, { error: error, onReset: onReset }),
99
+ snapshotError ? (react_1.default.createElement("pre", { className: classes.bg }, JSON.stringify(JSON.parse(snapshotError), null, 2))) : null));
100
+ }
84
101
  exports.default = ErrorMessage;
@@ -58,7 +58,7 @@ async function myfetchtext(uri) {
58
58
  const sourceMaps = {};
59
59
  async function getSourceMapFromUri(uri) {
60
60
  var _a;
61
- if (sourceMaps[uri] != undefined) {
61
+ if (sourceMaps[uri] !== undefined) {
62
62
  return sourceMaps[uri];
63
63
  }
64
64
  const uriQuery = new URL(uri).search;
@@ -83,12 +83,12 @@ async function mapStackTrace(stack) {
83
83
  const uri = match[2];
84
84
  const consumer = await getSourceMapFromUri(uri);
85
85
  const originalPosition = consumer.originalPositionFor({
86
- line: parseInt(match[3]),
87
- column: parseInt(match[4]),
86
+ line: Number.parseInt(match[3]),
87
+ column: Number.parseInt(match[4]),
88
88
  });
89
- if (originalPosition.source === null ||
90
- originalPosition.line === null ||
91
- originalPosition.column === null) {
89
+ if (!originalPosition.source ||
90
+ !originalPosition.line ||
91
+ !originalPosition.column) {
92
92
  mappedStack.push(line);
93
93
  continue;
94
94
  }
@@ -120,13 +120,13 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
120
120
  }));
121
121
  function Contents({ text, extra }) {
122
122
  const { classes } = useStyles();
123
- const err = encodeURIComponent([
123
+ const err = encodeURIComponent(`${[
124
124
  'I got this error from JBrowse, here is the stack trace:\n',
125
125
  '```',
126
126
  text,
127
127
  '```',
128
128
  extra ? `supporting data: ${JSON.stringify(extra, null, 2)}` : '',
129
- ].join('\n') + '\n');
129
+ ].join('\n')}\n`);
130
130
  const err2 = [
131
131
  text,
132
132
  extra ? `supporting data: ${JSON.stringify(extra, null, 2)}` : '',
@@ -184,7 +184,9 @@ function ErrorMessageStackTraceDialog({ error, onClose, extra, }) {
184
184
  react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => {
185
185
  (0, copy_to_clipboard_1.default)(errorBoxText);
186
186
  setClicked(true);
187
- setTimeout(() => setClicked(false), 1000);
187
+ setTimeout(() => {
188
+ setClicked(false);
189
+ }, 1000);
188
190
  } }, clicked ? 'Copied!' : 'Copy stack trace to clipboard'),
189
191
  react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", onClick: onClose }, "Close"))));
190
192
  }
@@ -2,5 +2,5 @@ import React from 'react';
2
2
  export default function FactoryResetDialog({ onClose, open, onFactoryReset, }: {
3
3
  onClose: () => void;
4
4
  open: boolean;
5
- onFactoryReset: Function;
5
+ onFactoryReset: () => void;
6
6
  }): React.JSX.Element;
@@ -14,10 +14,16 @@ function FactoryResetDialog({ onClose, open, onFactoryReset, }) {
14
14
  }
15
15
  onClose();
16
16
  }
17
- return (react_1.default.createElement(Dialog_1.default, { title: "Reset", onClose: () => handleDialogClose(), open: open },
17
+ return (react_1.default.createElement(Dialog_1.default, { title: "Reset", onClose: () => {
18
+ handleDialogClose();
19
+ }, open: open },
18
20
  react_1.default.createElement(material_1.DialogContent, null,
19
21
  react_1.default.createElement(material_1.DialogContentText, null, "Are you sure you want to reset? This will restore the default configuration.")),
20
22
  react_1.default.createElement(material_1.DialogActions, null,
21
- react_1.default.createElement(material_1.Button, { onClick: () => handleDialogClose(), color: "primary" }, "Cancel"),
22
- react_1.default.createElement(material_1.Button, { onClick: () => handleDialogClose('reset'), color: "primary", variant: "contained" }, "OK"))));
23
+ react_1.default.createElement(material_1.Button, { onClick: () => {
24
+ handleDialogClose();
25
+ }, color: "primary" }, "Cancel"),
26
+ react_1.default.createElement(material_1.Button, { onClick: () => {
27
+ handleDialogClose('reset');
28
+ }, color: "primary", variant: "contained" }, "OK"))));
23
29
  }
@@ -34,8 +34,12 @@ const ErrorMessage_1 = __importDefault(require("./ErrorMessage"));
34
34
  const ResetComponent = ({ onFactoryReset, resetButtonText, }) => {
35
35
  const [dialogOpen, setDialogOpen] = (0, react_1.useState)(false);
36
36
  return (react_1.default.createElement(react_1.default.Fragment, null,
37
- react_1.default.createElement(material_1.Button, { "data-testid": "fatal-error", color: "primary", variant: "contained", onClick: () => setDialogOpen(true) }, resetButtonText),
38
- react_1.default.createElement(FactoryResetDialog_1.default, { onClose: () => setDialogOpen(false), open: dialogOpen, onFactoryReset: onFactoryReset })));
37
+ react_1.default.createElement(material_1.Button, { "data-testid": "fatal-error", color: "primary", variant: "contained", onClick: () => {
38
+ setDialogOpen(true);
39
+ } }, resetButtonText),
40
+ react_1.default.createElement(FactoryResetDialog_1.default, { onClose: () => {
41
+ setDialogOpen(false);
42
+ }, open: dialogOpen, onFactoryReset: onFactoryReset })));
39
43
  };
40
44
  function FatalErrorDialog({ componentStack, error = 'No error message provided', onFactoryReset, resetButtonText = 'Factory Reset', }) {
41
45
  return (react_1.default.createElement(material_1.Dialog, { maxWidth: "xl", open: true },
@@ -44,6 +48,8 @@ function FatalErrorDialog({ componentStack, error = 'No error message provided',
44
48
  react_1.default.createElement(ErrorMessage_1.default, { error: error }),
45
49
  react_1.default.createElement("pre", null, componentStack)),
46
50
  react_1.default.createElement(material_1.DialogActions, null,
47
- react_1.default.createElement(material_1.Button, { color: "secondary", variant: "contained", onClick: () => window.location.reload() }, "Refresh"),
51
+ react_1.default.createElement(material_1.Button, { color: "secondary", variant: "contained", onClick: () => {
52
+ window.location.reload();
53
+ } }, "Refresh"),
48
54
  react_1.default.createElement(ResetComponent, { onFactoryReset: onFactoryReset, resetButtonText: resetButtonText }))));
49
55
  }
@@ -68,8 +68,8 @@ const FileSelector = (0, mobx_react_1.observer)(function (props) {
68
68
  const setLocationWithAccount = (0, react_1.useCallback)((location) => {
69
69
  setLocation({
70
70
  ...location,
71
- ...((0, types_1.isUriLocation)(location)
72
- ? { internetAccountId: selectedAccount === null || selectedAccount === void 0 ? void 0 : selectedAccount.internetAccountId }
71
+ ...(selectedAccount && (0, types_1.isUriLocation)(location)
72
+ ? { internetAccountId: selectedAccount.internetAccountId }
73
73
  : {}),
74
74
  });
75
75
  }, [setLocation, selectedAccount]);
@@ -115,10 +115,14 @@ const FileSelector = (0, mobx_react_1.observer)(function (props) {
115
115
  }),
116
116
  hiddenAccounts.length > 0 ? (
117
117
  // @ts-expect-error
118
- react_1.default.createElement(material_1.ToggleButton, { onClick: event => setAnchorEl(event.target), selected: false },
118
+ react_1.default.createElement(material_1.ToggleButton, { onClick: event => {
119
+ setAnchorEl(event.target);
120
+ }, selected: false },
119
121
  "More",
120
122
  react_1.default.createElement(ArrowDropDown_1.default, null))) : null),
121
- 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' } }, hiddenAccounts === null || hiddenAccounts === void 0 ? void 0 : hiddenAccounts.map(id => {
123
+ react_1.default.createElement(material_1.Menu, { open: Boolean(anchorEl), anchorEl: anchorEl, onClose: () => {
124
+ setAnchorEl(null);
125
+ }, anchorOrigin: { vertical: 'bottom', horizontal: 'center' }, transformOrigin: { vertical: 'top', horizontal: 'center' } }, hiddenAccounts.map(id => {
122
126
  const { internetAccountId, name } = map[id];
123
127
  return (react_1.default.createElement(material_1.MenuItem, { key: id, value: internetAccountId, onClick: () => {
124
128
  setRecentlyUsedInternetAccounts([
@@ -8,11 +8,11 @@ const material_1 = require("@mui/material");
8
8
  const mui_1 = require("tss-react/mui");
9
9
  const util_1 = require("../../util");
10
10
  const tracks_1 = require("../../util/tracks");
11
- function isLocalPathLocation(location) {
12
- return 'localPath' in location;
11
+ function isLocalPathLocation(loc) {
12
+ return 'localPath' in loc;
13
13
  }
14
- function isBlobLocation(location) {
15
- return 'blobId' in location;
14
+ function isBlobLocation(loc) {
15
+ return 'blobId' in loc;
16
16
  }
17
17
  const useStyles = (0, mui_1.makeStyles)()(theme => ({
18
18
  filename: {
@@ -32,11 +32,12 @@ function LocalFileChooser({ location, setLocation, }) {
32
32
  "Choose File",
33
33
  react_1.default.createElement("input", { type: "file", hidden: true, onChange: ({ target }) => {
34
34
  var _a;
35
- const file = (_a = target === null || target === void 0 ? void 0 : target.files) === null || _a === void 0 ? void 0 : _a[0];
35
+ const file = (_a = target.files) === null || _a === void 0 ? void 0 : _a[0];
36
36
  if (file) {
37
37
  if (util_1.isElectron) {
38
+ const { webUtils } = window.require('electron');
38
39
  setLocation({
39
- localPath: file.path,
40
+ localPath: webUtils.getPathForFile(file),
40
41
  locationType: 'LocalPathLocation',
41
42
  });
42
43
  }
@@ -34,5 +34,5 @@ const useStyles = (0, mui_1.makeStyles)()({
34
34
  });
35
35
  function LoadingEllipses({ message, variant = 'body2', ...rest }) {
36
36
  const { classes } = useStyles();
37
- return (react_1.default.createElement(material_1.Typography, { className: classes.dots, ...rest, variant: variant }, `${message || 'Loading'}`));
37
+ return (react_1.default.createElement(material_1.Typography, { className: classes.dots, ...rest, variant: variant }, message || 'Loading'));
38
38
  }
package/ui/Menu.d.ts CHANGED
@@ -29,17 +29,17 @@ export interface BaseMenuItem {
29
29
  }
30
30
  export interface NormalMenuItem extends BaseMenuItem {
31
31
  type?: 'normal';
32
- onClick: Function;
32
+ onClick: (...args: any[]) => void;
33
33
  }
34
34
  export interface CheckboxMenuItem extends BaseMenuItem {
35
35
  type: 'checkbox';
36
36
  checked: boolean;
37
- onClick: Function;
37
+ onClick: (...args: any[]) => void;
38
38
  }
39
39
  export interface RadioMenuItem extends BaseMenuItem {
40
40
  type: 'radio';
41
41
  checked: boolean;
42
- onClick: Function;
42
+ onClick: (...args: any[]) => void;
43
43
  }
44
44
  export interface SubMenuItem extends BaseMenuItem {
45
45
  type?: 'subMenu';
@@ -48,7 +48,7 @@ export interface SubMenuItem extends BaseMenuItem {
48
48
  export type MenuItem = MenuDivider | MenuSubHeader | NormalMenuItem | CheckboxMenuItem | RadioMenuItem | SubMenuItem;
49
49
  interface MenuProps extends PopoverProps {
50
50
  menuItems: MenuItem[];
51
- onMenuItemClick: (event: React.MouseEvent<HTMLLIElement, MouseEvent>, callback: Function) => void;
51
+ onMenuItemClick: (event: React.MouseEvent<HTMLLIElement>, callback: (...args: any[]) => void) => void;
52
52
  }
53
53
  declare function Menu(props: MenuProps): React.JSX.Element;
54
54
  export default Menu;
package/ui/Menu.js CHANGED
@@ -111,7 +111,7 @@ function findNextValidIdx(menuItems, currentIdx) {
111
111
  function findPreviousValidIdx(menuItems, currentIdx) {
112
112
  return (0, util_1.findLastIndex)(menuItems.slice(0, currentIdx), checkIfValid);
113
113
  }
114
- const MenuPage = react_1.default.forwardRef(function MenuPage2(props, ref) {
114
+ function MenuPage(props) {
115
115
  const [subMenuAnchorEl, setSubMenuAnchorEl] = (0, react_1.useState)();
116
116
  const [openSubMenuIdx, setOpenSubMenuIdx] = (0, react_1.useState)();
117
117
  const [isSubMenuOpen, setIsSubMenuOpen] = (0, react_1.useState)(false);
@@ -172,7 +172,7 @@ const MenuPage = react_1.default.forwardRef(function MenuPage2(props, ref) {
172
172
  .sort((a, b) => (b.priority || 0) - (a.priority || 0))
173
173
  .map((menuItem, idx) => {
174
174
  if (menuItem.type === 'divider') {
175
- return react_1.default.createElement(material_1.Divider, { key: `divider-${idx}`, component: "li" });
175
+ return (react_1.default.createElement(material_1.Divider, { key: `divider-${JSON.stringify(menuItem)}-${idx}`, component: "li" }));
176
176
  }
177
177
  if (menuItem.type === 'subHeader') {
178
178
  return (react_1.default.createElement(material_1.ListSubheader, { key: `subHeader-${menuItem.label}-${idx}` }, menuItem.label));
@@ -191,9 +191,7 @@ const MenuPage = react_1.default.forwardRef(function MenuPage2(props, ref) {
191
191
  menuItem.type === 'radio') {
192
192
  endDecoration = (react_1.default.createElement(MenuItemEndDecoration, { type: menuItem.type, checked: menuItem.checked, disabled: menuItem.disabled }));
193
193
  }
194
- const onClick = 'onClick' in menuItem
195
- ? handleClick(menuItem.onClick)
196
- : undefined;
194
+ const onClick = 'onClick' in menuItem ? handleClick(menuItem.onClick) : undefined;
197
195
  return (react_1.default.createElement(material_1.MenuItem, { key: menuItem.id || String(menuItem.label), style: menuItemStyle, selected: idx === selectedMenuItemIdx, onClick: onClick, onMouseMove: e => {
198
196
  if (e.currentTarget !== document.activeElement) {
199
197
  e.currentTarget.focus();
@@ -213,7 +211,7 @@ const MenuPage = react_1.default.forwardRef(function MenuPage2(props, ref) {
213
211
  switch (e.key) {
214
212
  case 'ArrowLeft':
215
213
  case 'Escape': {
216
- onClose && onClose(e, 'escapeKeyDown');
214
+ onClose === null || onClose === void 0 ? void 0 : onClose(e, 'escapeKeyDown');
217
215
  break;
218
216
  }
219
217
  case 'ArrowUp': {
@@ -249,9 +247,8 @@ const MenuPage = react_1.default.forwardRef(function MenuPage2(props, ref) {
249
247
  }
250
248
  return subMenu;
251
249
  })));
252
- return top ? (ListContents) : (react_1.default.createElement(material_1.Grow, { in: open, style: { transformOrigin: `0 0 0` }, ref: ref },
253
- react_1.default.createElement(material_1.Paper, { elevation: 8, ref: paperRef, className: classes.paper, style: { ...position } }, ListContents)));
254
- });
250
+ return top ? (ListContents) : (react_1.default.createElement(material_1.Paper, { elevation: 8, ref: paperRef, className: classes.paper, style: { ...position } }, ListContents));
251
+ }
255
252
  function Menu(props) {
256
253
  const { open, onClose, menuItems, onMenuItemClick, ...other } = props;
257
254
  return (react_1.default.createElement(material_1.Popover, { open: open, onClose: onClose, BackdropProps: { invisible: true }, anchorOrigin: {
package/ui/MenuButton.js CHANGED
@@ -37,8 +37,12 @@ const MenuButton = (0, mobx_react_1.observer)(function MenuButton({ children, me
37
37
  setOpen === null || setOpen === void 0 ? void 0 : setOpen(isOpen);
38
38
  }, [isOpen, setOpen]);
39
39
  return (react_1.default.createElement(react_1.default.Fragment, null,
40
- react_1.default.createElement(material_1.IconButton, { ...rest, onClick: event => setAnchorEl(event.currentTarget) }, children),
41
- react_1.default.createElement(Menu_1.default, { open: !!anchorEl, anchorEl: anchorEl, onClose: () => setAnchorEl(undefined), onMenuItemClick: (_, callback) => {
40
+ react_1.default.createElement(material_1.IconButton, { ...rest, onClick: event => {
41
+ setAnchorEl(event.currentTarget);
42
+ } }, children),
43
+ react_1.default.createElement(Menu_1.default, { open: !!anchorEl, anchorEl: anchorEl, onClose: () => {
44
+ setAnchorEl(undefined);
45
+ }, onMenuItemClick: (_, callback) => {
42
46
  callback();
43
47
  if (closeAfterItemClick) {
44
48
  setAnchorEl(undefined);
@@ -23,7 +23,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- /* eslint-disable @typescript-eslint/no-explicit-any */
27
26
  const react_1 = __importStar(require("react"));
28
27
  const offscreenCanvasPonyfill_1 = require("../util/offscreenCanvasPonyfill");
29
28
  function PrerenderedCanvas(props) {
@@ -45,9 +44,13 @@ function PrerenderedCanvas(props) {
45
44
  (0, offscreenCanvasPonyfill_1.drawImageOntoCanvasContext)(imageData, context);
46
45
  setDone(true);
47
46
  }, [imageData]);
48
- const softClipString = showSoftClip ? '_softclipped' : '';
49
- const blockKeyStr = blockKey ? '_' + blockKey : '';
50
- const testId = `prerendered_canvas${softClipString}${blockKeyStr}${done ? '_done' : ''}`;
51
- return (react_1.default.createElement("canvas", { "data-testid": testId, ref: featureCanvas, width: width * highResolutionScaling, height: height * highResolutionScaling, style: { width, height, ...style } }));
47
+ return (react_1.default.createElement("canvas", { "data-testid": [
48
+ 'prerendered_canvas',
49
+ showSoftClip ? 'softclipped' : '',
50
+ blockKey,
51
+ done ? 'done' : '',
52
+ ]
53
+ .filter(f => !!f)
54
+ .join('_'), ref: featureCanvas, width: width * highResolutionScaling, height: height * highResolutionScaling, style: { width, height, ...style } }));
52
55
  }
53
56
  exports.default = PrerenderedCanvas;
@@ -5,13 +5,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.default = RedErrorMessageBox;
7
7
  const react_1 = __importDefault(require("react"));
8
+ const mui_1 = require("tss-react/mui");
9
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
10
+ bg: {
11
+ padding: 4,
12
+ margin: 4,
13
+ overflow: 'auto',
14
+ maxHeight: 200,
15
+ background: theme.palette.mode === 'dark' ? '#833' : '#f88',
16
+ border: `1px solid ${theme.palette.divider}`,
17
+ },
18
+ }));
8
19
  function RedErrorMessageBox({ children, }) {
9
- return (react_1.default.createElement("div", { style: {
10
- padding: 4,
11
- margin: 4,
12
- overflow: 'auto',
13
- maxHeight: 200,
14
- background: '#f88',
15
- border: '1px solid black',
16
- } }, children));
20
+ const { classes } = useStyles();
21
+ return react_1.default.createElement("div", { className: classes.bg }, children);
17
22
  }
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  declare function ResizeHandle({ onDrag, vertical, flexbox, className: originalClassName, onMouseDown, ...props }: {
3
- onDrag: (lastFrameDistance: number, totalDistance: number) => number | void;
3
+ onDrag: (lastFrameDistance: number, totalDistance: number) => number | undefined;
4
4
  onMouseDown?: (event: React.MouseEvent) => void;
5
5
  vertical?: boolean;
6
6
  flexbox?: boolean;
@@ -16,6 +16,8 @@ const ReturnToImportFormDialog = (0, mobx_react_1.observer)(function ({ model, h
16
16
  model.clearView();
17
17
  handleClose();
18
18
  }, variant: "contained", color: "primary", autoFocus: true }, "OK"),
19
- react_1.default.createElement(material_1.Button, { onClick: () => handleClose(), color: "secondary", variant: "contained" }, "Cancel"))));
19
+ react_1.default.createElement(material_1.Button, { onClick: () => {
20
+ handleClose();
21
+ }, color: "secondary", variant: "contained" }, "Cancel"))));
20
22
  });
21
23
  exports.default = ReturnToImportFormDialog;
@@ -75,9 +75,7 @@ function SanitizedHTML({ html: pre, className, }) {
75
75
  }
76
76
  });
77
77
  }
78
- return (react_1.default.createElement("span", { className: className,
79
- // eslint-disable-next-line react/no-danger
80
- dangerouslySetInnerHTML: {
78
+ return (react_1.default.createElement("span", { className: className, dangerouslySetInnerHTML: {
81
79
  __html: dompurify_1.default.sanitize(value),
82
80
  } }));
83
81
  }
@@ -9,17 +9,28 @@ export interface SnackbarMessage {
9
9
  * #category session
10
10
  */
11
11
  export default function SnackbarModel(): import("mobx-state-tree").IModelType<{}, {
12
+ /**
13
+ * #volatile
14
+ */
12
15
  snackbarMessages: import("mobx").IObservableArray<SnackbarMessage>;
16
+ } & {
17
+ /**
18
+ * #getter
19
+ */
20
+ readonly snackbarMessageSet: Map<string, SnackbarMessage>;
13
21
  } & {
14
22
  /**
15
23
  * #action
16
24
  */
17
25
  notify(message: string, level?: NotificationLevel, action?: SnackAction): void;
26
+ /**
27
+ * #action
28
+ */
18
29
  notifyError(errorMessage: string, error?: unknown, extra?: unknown): void;
19
30
  /**
20
31
  * #action
21
32
  */
22
- pushSnackbarMessage(message: string, level?: NotificationLevel, action?: SnackAction): number;
33
+ pushSnackbarMessage(message: string, level?: NotificationLevel, action?: SnackAction): void;
23
34
  /**
24
35
  * #action
25
36
  */