@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.
- package/BaseFeatureWidget/BaseFeatureDetail/index.js +4 -35
- package/BaseFeatureWidget/BaseFeatureDetail/util.js +1 -1
- package/PluginManager.d.ts +1 -1
- package/TextSearch/TextSearchManager.d.ts +4 -3
- package/TextSearch/TextSearchManager.js +14 -14
- package/assemblyManager/assembly.d.ts +4 -9
- package/assemblyManager/assembly.js +10 -16
- package/assemblyManager/assemblyManager.d.ts +63 -35
- package/data_adapters/BaseAdapter/BaseAdapter.d.ts +2 -1
- package/data_adapters/BaseAdapter/BaseAdapter.js +2 -1
- package/data_adapters/dataAdapterCache.js +1 -6
- package/package.json +4 -4
- package/pluggableElementTypes/AdapterType.d.ts +0 -1
- package/pluggableElementTypes/AdapterType.js +4 -10
- package/pluggableElementTypes/DisplayType.d.ts +8 -2
- package/pluggableElementTypes/TextSearchAdapterType.d.ts +5 -2
- package/pluggableElementTypes/TextSearchAdapterType.js +4 -1
- package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -0
- package/pluggableElementTypes/models/BaseTrackModel.js +1 -0
- package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.js +3 -0
- package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +3 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/BaseTooltip.d.ts +9 -0
- package/ui/BaseTooltip.js +53 -0
- package/ui/CascadingMenu.js +3 -1
- package/ui/Menu.js +10 -5
- package/ui/theme.js +5 -2
- package/util/aborting.js +1 -1
- package/util/index.d.ts +3 -2
- package/util/index.js +4 -2
- package/util/rxjs.js +1 -3
- package/util/types/index.d.ts +1 -1
|
@@ -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
|
+
}
|
package/ui/CascadingMenu.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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) : (
|
|
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,
|
|
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
|
-
|
|
190
|
-
|
|
189
|
+
slotProps: {
|
|
190
|
+
transition: {
|
|
191
|
+
timeout: 150,
|
|
192
|
+
unmountOnExit: true,
|
|
193
|
+
},
|
|
191
194
|
},
|
|
192
195
|
},
|
|
193
196
|
},
|
package/util/aborting.js
CHANGED
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):
|
|
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[]):
|
|
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
|
-
|
|
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
|
|
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)));
|
package/util/types/index.d.ts
CHANGED
|
@@ -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;
|