@jbrowse/core 2.14.0 → 2.15.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 (32) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail/index.js +4 -35
  2. package/BaseFeatureWidget/BaseFeatureDetail/util.js +1 -1
  3. package/PluginManager.d.ts +1 -1
  4. package/TextSearch/TextSearchManager.d.ts +4 -3
  5. package/TextSearch/TextSearchManager.js +14 -14
  6. package/assemblyManager/assembly.d.ts +4 -9
  7. package/assemblyManager/assembly.js +10 -16
  8. package/assemblyManager/assemblyManager.d.ts +63 -35
  9. package/data_adapters/BaseAdapter/BaseAdapter.d.ts +2 -1
  10. package/data_adapters/BaseAdapter/BaseAdapter.js +2 -1
  11. package/data_adapters/dataAdapterCache.js +1 -6
  12. package/package.json +4 -4
  13. package/pluggableElementTypes/AdapterType.d.ts +0 -1
  14. package/pluggableElementTypes/AdapterType.js +4 -10
  15. package/pluggableElementTypes/DisplayType.d.ts +8 -2
  16. package/pluggableElementTypes/TextSearchAdapterType.d.ts +5 -2
  17. package/pluggableElementTypes/TextSearchAdapterType.js +4 -1
  18. package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -0
  19. package/pluggableElementTypes/models/BaseTrackModel.js +1 -0
  20. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.js +3 -0
  21. package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +3 -0
  22. package/tsconfig.build.tsbuildinfo +1 -1
  23. package/ui/BaseTooltip.d.ts +9 -0
  24. package/ui/BaseTooltip.js +53 -0
  25. package/ui/CascadingMenu.js +3 -1
  26. package/ui/Menu.js +10 -5
  27. package/ui/theme.js +5 -2
  28. package/util/aborting.js +1 -1
  29. package/util/index.d.ts +3 -2
  30. package/util/index.js +4 -2
  31. package/util/rxjs.js +1 -3
  32. package/util/types/index.d.ts +1 -1
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export default function BaseTooltip({ clientPoint: clientPointCoords, children, placement, }: {
3
+ placement?: 'left' | 'right';
4
+ clientPoint?: {
5
+ x: number;
6
+ y: number;
7
+ };
8
+ children: React.ReactNode;
9
+ }): React.JSX.Element;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = BaseTooltip;
7
+ const react_1 = __importDefault(require("react"));
8
+ const mui_1 = require("tss-react/mui");
9
+ const material_1 = require("@mui/material");
10
+ const react_2 = require("@floating-ui/react");
11
+ function round(value) {
12
+ return Math.round(value * 1e5) / 1e5;
13
+ }
14
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
15
+ // these styles come from
16
+ // https://github.com/mui-org/material-ui/blob/master/packages/material-ui/src/Tooltip/Tooltip.js
17
+ tooltip: {
18
+ position: 'absolute',
19
+ pointerEvents: 'none',
20
+ backgroundColor: (0, material_1.alpha)(theme.palette.grey[700], 0.9),
21
+ borderRadius: theme.shape.borderRadius,
22
+ color: theme.palette.common.white,
23
+ fontFamily: theme.typography.fontFamily,
24
+ padding: '4px 8px',
25
+ fontSize: theme.typography.pxToRem(12),
26
+ lineHeight: `${round(14 / 10)}em`,
27
+ maxWidth: 300,
28
+ wordWrap: 'break-word',
29
+ },
30
+ }));
31
+ function BaseTooltip({ clientPoint: clientPointCoords, children, placement = 'right', }) {
32
+ var _a, _b;
33
+ const theme = (0, material_1.useTheme)();
34
+ const popperTheme = (_a = theme.components) === null || _a === void 0 ? void 0 : _a.MuiPopper;
35
+ const { classes } = useStyles();
36
+ const { refs, floatingStyles, context } = (0, react_2.useFloating)({
37
+ placement,
38
+ strategy: 'fixed',
39
+ });
40
+ const clientPoint = (0, react_2.useClientPoint)(context, clientPointCoords);
41
+ const { getFloatingProps } = (0, react_2.useInteractions)([clientPoint]);
42
+ return (react_1.default.createElement(material_1.Portal, { container: (_b = popperTheme === null || popperTheme === void 0 ? void 0 : popperTheme.defaultProps) === null || _b === void 0 ? void 0 : _b.container },
43
+ react_1.default.createElement("div", { className: classes.tooltip, ref: refs.setFloating, style: {
44
+ ...floatingStyles,
45
+ zIndex: 100000,
46
+ // workaround for tooltips flashing at top left corner of screen
47
+ // when first appearing
48
+ visibility: floatingStyles.transform === 'translate(0px, 0px)'
49
+ ? 'hidden'
50
+ : undefined,
51
+ pointerEvents: 'none',
52
+ }, ...getFloatingProps() }, children)));
53
+ }
@@ -98,7 +98,9 @@ function CascadingMenuList({ onMenuItemClick, closeAfterItemClick, menuItems, ..
98
98
  };
99
99
  }
100
100
  const hasIcon = menuItems.some(m => 'icon' in m && m.icon);
101
- return (react_1.default.createElement(react_1.default.Fragment, null, menuItems.map((item, idx) => {
101
+ return (react_1.default.createElement(react_1.default.Fragment, null, menuItems
102
+ .sort((a, b) => (b.priority || 0) - (a.priority || 0))
103
+ .map((item, idx) => {
102
104
  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 },
103
105
  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) },
104
106
  item.icon ? (react_1.default.createElement(material_1.ListItemIcon, null,
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
- function MenuPage(props) {
114
+ const MenuPage = react_1.default.forwardRef(function MenuPage2(props, ref) {
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);
@@ -191,7 +191,9 @@ function MenuPage(props) {
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 ? handleClick(menuItem.onClick) : undefined;
194
+ const onClick = 'onClick' in menuItem
195
+ ? handleClick(menuItem.onClick)
196
+ : undefined;
195
197
  return (react_1.default.createElement(material_1.MenuItem, { key: menuItem.id || String(menuItem.label), style: menuItemStyle, selected: idx === selectedMenuItemIdx, onClick: onClick, onMouseMove: e => {
196
198
  if (e.currentTarget !== document.activeElement) {
197
199
  e.currentTarget.focus();
@@ -247,11 +249,14 @@ function MenuPage(props) {
247
249
  }
248
250
  return subMenu;
249
251
  })));
250
- return top ? (ListContents) : (react_1.default.createElement(material_1.Paper, { elevation: 8, ref: paperRef, className: classes.paper, style: { ...position } }, ListContents));
251
- }
252
+ return top ? (ListContents) : (
253
+ // Grow is required for cascading sub-menus
254
+ react_1.default.createElement(material_1.Grow, { in: open, style: { transformOrigin: '0 0 0' }, ref: ref },
255
+ react_1.default.createElement(material_1.Paper, { elevation: 8, ref: paperRef, className: classes.paper, style: { ...position } }, ListContents)));
256
+ });
252
257
  function Menu(props) {
253
258
  const { open, onClose, menuItems, onMenuItemClick, ...other } = props;
254
- return (react_1.default.createElement(material_1.Popover, { open: open, onClose: onClose, BackdropProps: { invisible: true }, anchorOrigin: {
259
+ return (react_1.default.createElement(material_1.Popover, { open: open, onClose: onClose, anchorOrigin: {
255
260
  vertical: 'bottom',
256
261
  horizontal: 'right',
257
262
  ...other.anchorOrigin,
package/ui/theme.js CHANGED
@@ -186,8 +186,11 @@ function createJBrowseBaseTheme(theme) {
186
186
  MuiAccordion: {
187
187
  defaultProps: {
188
188
  disableGutters: true,
189
- TransitionProps: {
190
- timeout: 150,
189
+ slotProps: {
190
+ transition: {
191
+ timeout: 150,
192
+ unmountOnExit: true,
193
+ },
191
194
  },
192
195
  },
193
196
  },
package/util/aborting.js CHANGED
@@ -56,7 +56,7 @@ function makeAbortError() {
56
56
  }
57
57
  function observeAbortSignal(signal) {
58
58
  if (!signal) {
59
- return rxjs_1.Observable.create();
59
+ return new rxjs_1.Observable();
60
60
  }
61
61
  return (0, rxjs_1.fromEvent)(signal, 'abort');
62
62
  }
package/util/index.d.ts CHANGED
@@ -384,13 +384,14 @@ export declare function notEmpty<T>(value: T | null | undefined): value is T;
384
384
  export declare function mergeIntervals<T extends {
385
385
  start: number;
386
386
  end: number;
387
- }>(intervals: T[], w?: number): (T | undefined)[];
387
+ }>(intervals: T[], w?: number): T[];
388
388
  interface BasicFeature {
389
389
  end: number;
390
390
  start: number;
391
391
  refName: string;
392
+ assemblyName?: string;
392
393
  }
393
- export declare function gatherOverlaps(regions: BasicFeature[]): (BasicFeature | undefined)[];
394
+ export declare function gatherOverlaps(regions: BasicFeature[], w?: number): BasicFeature[];
394
395
  export declare function stripAlpha(str: string): string;
395
396
  export declare function getStrokeProps(str: string): {
396
397
  strokeOpacity: number;
package/util/index.js CHANGED
@@ -1169,7 +1169,8 @@ function mergeIntervals(intervals, w = 5000) {
1169
1169
  }
1170
1170
  return stack;
1171
1171
  }
1172
- function gatherOverlaps(regions) {
1172
+ // returns new array non-overlapping features
1173
+ function gatherOverlaps(regions, w = 5000) {
1173
1174
  const memo = {};
1174
1175
  for (const x of regions) {
1175
1176
  if (!memo[x.refName]) {
@@ -1177,7 +1178,7 @@ function gatherOverlaps(regions) {
1177
1178
  }
1178
1179
  memo[x.refName].push(x);
1179
1180
  }
1180
- return Object.values(memo).flatMap(group => mergeIntervals(group.sort((a, b) => a.start - b.start)));
1181
+ return Object.values(memo).flatMap(group => mergeIntervals(group.sort((a, b) => a.start - b.start), w));
1181
1182
  }
1182
1183
  function stripAlpha(str) {
1183
1184
  const c = (0, colord_1.colord)(str);
@@ -1205,6 +1206,7 @@ function renderToStaticMarkup(node, createRootFn) {
1205
1206
  createRootFn(div).render(node);
1206
1207
  }
1207
1208
  else {
1209
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
1208
1210
  (0, react_dom_1.render)(node, div);
1209
1211
  }
1210
1212
  });
package/util/rxjs.js CHANGED
@@ -10,10 +10,9 @@ const _1 = require(".");
10
10
  * @param func - observer function, could be async
11
11
  */
12
12
  function ObservableCreate(func, signal) {
13
- return rxjs_1.Observable.create((observer) => {
13
+ return new rxjs_1.Observable((observer) => {
14
14
  try {
15
15
  const ret = func(observer);
16
- // catch async errors
17
16
  if (ret === null || ret === void 0 ? void 0 : ret.catch) {
18
17
  ret.catch((error) => {
19
18
  observer.error(error);
@@ -21,7 +20,6 @@ function ObservableCreate(func, signal) {
21
20
  }
22
21
  }
23
22
  catch (error) {
24
- // catch sync errors
25
23
  observer.error(error);
26
24
  }
27
25
  }).pipe((0, operators_1.takeUntil)((0, _1.observeAbortSignal)(signal)));
@@ -121,8 +121,8 @@ export interface SessionWithWidgets extends AbstractSessionModel {
121
121
  minimized: boolean;
122
122
  visibleWidget?: Widget;
123
123
  widgets: Map<string | number, Widget>;
124
- hideAllWidgets: () => void;
125
124
  activeWidgets: Map<string | number, Widget>;
125
+ hideAllWidgets: () => void;
126
126
  addWidget(typeName: string, id: string, initialState?: Record<string, unknown>, configuration?: {
127
127
  type: string;
128
128
  }): Widget;