@jbrowse/core 3.6.4 → 3.7.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.
- package/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +1 -1
- package/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.d.ts +1 -1
- package/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +31 -33
- package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +15 -7
- package/BaseFeatureWidget/SequenceFeatureDetails/consts.d.ts +6 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/consts.js +9 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.d.ts +1 -1
- package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +17 -7
- package/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +6 -3
- package/BaseFeatureWidget/SequenceFeatureDetails/model.js +1 -1
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.js +4 -3
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDSSequence.js +2 -1
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/GenomicSequence.js +4 -3
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/ProteinSequence.js +11 -10
- package/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.d.ts +13 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +67 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/util.d.ts +2 -9
- package/BaseFeatureWidget/SequenceFeatureDetails/util.js +36 -39
- package/BaseFeatureWidget/stateModelFactory.d.ts +4 -4
- package/BaseFeatureWidget/util.d.ts +5 -2
- package/BaseFeatureWidget/util.js +41 -12
- package/PluginLoader.js +1 -1
- package/assemblyManager/assembly.d.ts +1 -0
- package/assemblyManager/assembly.js +3 -0
- package/assemblyManager/assemblyManager.d.ts +8 -0
- package/assemblyManager/assemblyManager.js +4 -0
- package/configuration/configurationSchema.js +1 -1
- package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +2 -2
- package/package.json +3 -4
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/BaseTooltip.d.ts +1 -1
- package/ui/CascadingMenu.js +33 -4
- package/ui/ConfirmDialog.d.ts +10 -0
- package/ui/ConfirmDialog.js +18 -0
- package/ui/EditableTypography.js +1 -8
- package/ui/LoadingEllipses.d.ts +2 -1
- package/ui/LoadingEllipses.js +1 -1
- package/ui/Menu.d.ts +1 -0
- package/ui/Menu.js +2 -2
- package/ui/SanitizedHTML.js +13 -10
- package/util/aborting.js +1 -1
- package/util/cluster.js +17 -11
- package/util/color/index.d.ts +1 -0
- package/util/color/index.js +8 -0
- package/util/compositeMap.d.ts +2 -2
- package/util/convertCodingSequenceToPeptides.d.ts +6 -0
- package/util/convertCodingSequenceToPeptides.js +12 -0
- package/util/fetchSeq.d.ts +8 -0
- package/util/fetchSeq.js +27 -0
- package/util/flatbush/index.d.ts +25 -0
- package/util/flatbush/index.js +362 -0
- package/util/flatqueue/index.d.ts +11 -0
- package/util/flatqueue/index.js +66 -0
- package/util/index.js +18 -12
- package/util/jexl.js +1 -0
- package/util/layouts/PrecomputedLayout.d.ts +3 -1
- package/util/layouts/PrecomputedLayout.js +23 -14
- package/util/tracks.js +1 -1
- package/util/types/index.d.ts +2 -2
- package/util/useFeatureSequence.d.ts +19 -0
- package/util/useFeatureSequence.js +90 -0
- package/BaseFeatureWidget/SequenceFeatureDetails/hooks.d.ts +0 -10
- package/BaseFeatureWidget/SequenceFeatureDetails/hooks.js +0 -65
package/ui/BaseTooltip.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export default function BaseTooltip({ clientPoint: clientPointCoords, children, placement, }: {
|
|
2
|
-
placement?: '
|
|
2
|
+
placement?: 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end';
|
|
3
3
|
clientPoint?: {
|
|
4
4
|
x: number;
|
|
5
5
|
y: number;
|
package/ui/CascadingMenu.js
CHANGED
|
@@ -6,7 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
7
|
const react_1 = require("react");
|
|
8
8
|
const ChevronRight_1 = __importDefault(require("@mui/icons-material/ChevronRight"));
|
|
9
|
+
const HelpOutline_1 = __importDefault(require("@mui/icons-material/HelpOutline"));
|
|
9
10
|
const material_1 = require("@mui/material");
|
|
11
|
+
const Dialog_1 = __importDefault(require("./Dialog"));
|
|
10
12
|
const HoverMenu_1 = __importDefault(require("./HoverMenu"));
|
|
11
13
|
const Menu_1 = require("./Menu");
|
|
12
14
|
const hooks_1 = require("./hooks");
|
|
@@ -14,7 +16,24 @@ const CascadingContext = (0, react_1.createContext)({
|
|
|
14
16
|
parentPopupState: undefined,
|
|
15
17
|
rootPopupState: undefined,
|
|
16
18
|
});
|
|
17
|
-
function
|
|
19
|
+
function HelpIconButton({ helpText }) {
|
|
20
|
+
const [helpDialogOpen, setHelpDialogOpen] = (0, react_1.useState)(false);
|
|
21
|
+
const handleHelpClick = (event) => {
|
|
22
|
+
event.stopPropagation();
|
|
23
|
+
setHelpDialogOpen(true);
|
|
24
|
+
};
|
|
25
|
+
const handleClose = (event) => {
|
|
26
|
+
event.stopPropagation();
|
|
27
|
+
setHelpDialogOpen(false);
|
|
28
|
+
};
|
|
29
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.IconButton, { size: "small", onClick: handleHelpClick, style: { marginLeft: 4, padding: 4 }, children: (0, jsx_runtime_1.jsx)(HelpOutline_1.default, { fontSize: "small" }) }), (0, jsx_runtime_1.jsx)(Dialog_1.default, { open: helpDialogOpen, onClose: handleClose, title: "Help", onClick: e => {
|
|
30
|
+
e.stopPropagation();
|
|
31
|
+
}, children: (0, jsx_runtime_1.jsx)(material_1.DialogContent, { children: helpText }) })] }));
|
|
32
|
+
}
|
|
33
|
+
function HelpIconSpacer() {
|
|
34
|
+
return (0, jsx_runtime_1.jsx)("div", { style: { marginLeft: 4, padding: 4, width: 28, height: 28 } });
|
|
35
|
+
}
|
|
36
|
+
function CascadingMenuItem({ onClick, closeAfterItemClick, children, ...props }) {
|
|
18
37
|
const { rootPopupState, parentPopupState } = (0, react_1.useContext)(CascadingContext);
|
|
19
38
|
if (!rootPopupState) {
|
|
20
39
|
throw new Error('must be used inside a CascadingMenu');
|
|
@@ -29,14 +48,21 @@ function CascadingMenuItem({ onClick, closeAfterItemClick, ...props }) {
|
|
|
29
48
|
parentPopupState.childHandle.close();
|
|
30
49
|
parentPopupState.setChildHandle(undefined);
|
|
31
50
|
}
|
|
32
|
-
} }));
|
|
51
|
+
}, children: children }));
|
|
33
52
|
}
|
|
34
53
|
function CascadingSubmenu({ title, Icon, inset, ...props }) {
|
|
35
54
|
const { parentPopupState } = (0, react_1.useContext)(CascadingContext);
|
|
36
55
|
const popupState = (0, hooks_1.usePopupState)({
|
|
37
56
|
parentPopupState,
|
|
38
57
|
});
|
|
39
|
-
|
|
58
|
+
const { onMouseOver: originalOnMouseOver, ...hoverProps } = (0, hooks_1.bindHover)(popupState);
|
|
59
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.MenuItem, { ...(0, hooks_1.bindFocus)(popupState), ...hoverProps, onMouseOver: event => {
|
|
60
|
+
if (parentPopupState === null || parentPopupState === void 0 ? void 0 : parentPopupState.childHandle) {
|
|
61
|
+
parentPopupState.childHandle.close();
|
|
62
|
+
parentPopupState.setChildHandle(undefined);
|
|
63
|
+
}
|
|
64
|
+
originalOnMouseOver(event);
|
|
65
|
+
}, children: [Icon ? ((0, jsx_runtime_1.jsx)(material_1.ListItemIcon, { children: (0, jsx_runtime_1.jsx)(Icon, {}) })) : null, (0, jsx_runtime_1.jsx)(material_1.ListItemText, { primary: title, inset: inset }), (0, jsx_runtime_1.jsx)(ChevronRight_1.default, {})] }), (0, jsx_runtime_1.jsx)(CascadingSubmenuHover, { ...props, anchorOrigin: { vertical: 'top', horizontal: 'right' }, transformOrigin: { vertical: 'top', horizontal: 'left' }, popupState: popupState })] }));
|
|
40
66
|
}
|
|
41
67
|
function CascadingSubmenuHover({ popupState, onMenuItemClick, menuItems, classes, ...props }) {
|
|
42
68
|
const { rootPopupState } = (0, react_1.useContext)(CascadingContext);
|
|
@@ -65,6 +91,9 @@ function EndDecoration({ item }) {
|
|
|
65
91
|
}
|
|
66
92
|
function CascadingMenuList({ onMenuItemClick, closeAfterItemClick, menuItems, ...props }) {
|
|
67
93
|
const hasIcon = menuItems.some(m => 'icon' in m && m.icon);
|
|
94
|
+
const hasCheckboxOrRadioWithHelp = menuItems.some(m => (m.type === 'checkbox' || m.type === 'radio') &&
|
|
95
|
+
'helpText' in m &&
|
|
96
|
+
m.helpText);
|
|
68
97
|
return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: menuItems
|
|
69
98
|
.toSorted((a, b) => (b.priority || 0) - (a.priority || 0))
|
|
70
99
|
.map((item, idx) => {
|
|
@@ -72,7 +101,7 @@ function CascadingMenuList({ onMenuItemClick, closeAfterItemClick, menuItems, ..
|
|
|
72
101
|
? event => {
|
|
73
102
|
onMenuItemClick(event, item.onClick);
|
|
74
103
|
}
|
|
75
|
-
: undefined, disabled: Boolean(item.disabled), children: [item.icon ? ((0, jsx_runtime_1.jsx)(material_1.ListItemIcon, { children: (0, jsx_runtime_1.jsx)(item.icon, {}) })) : null, ' ', (0, jsx_runtime_1.jsx)(material_1.ListItemText, { primary: item.label, secondary: item.subLabel, inset: hasIcon && !item.icon }), (0, jsx_runtime_1.jsx)(CascadingSpacer, {}), (0, jsx_runtime_1.jsx)(EndDecoration, { item: item })] }, `${item.label}-${idx}`));
|
|
104
|
+
: undefined, disabled: Boolean(item.disabled), children: [item.icon ? ((0, jsx_runtime_1.jsx)(material_1.ListItemIcon, { children: (0, jsx_runtime_1.jsx)(item.icon, {}) })) : null, ' ', (0, jsx_runtime_1.jsx)(material_1.ListItemText, { primary: item.label, secondary: item.subLabel, inset: hasIcon && !item.icon }), (0, jsx_runtime_1.jsx)(CascadingSpacer, {}), (0, jsx_runtime_1.jsx)(EndDecoration, { item: item }), item.type === 'checkbox' || item.type === 'radio' ? ('helpText' in item && item.helpText ? ((0, jsx_runtime_1.jsx)(HelpIconButton, { helpText: item.helpText })) : hasCheckboxOrRadioWithHelp ? ((0, jsx_runtime_1.jsx)(HelpIconSpacer, {})) : null) : 'helpText' in item && item.helpText ? ((0, jsx_runtime_1.jsx)(HelpIconButton, { helpText: item.helpText })) : null] }, `${item.label}-${idx}`));
|
|
76
105
|
}) }));
|
|
77
106
|
}
|
|
78
107
|
function CascadingSpacer() {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DialogProps } from '@mui/material';
|
|
2
|
+
interface Props extends DialogProps {
|
|
3
|
+
header?: React.ReactNode;
|
|
4
|
+
onCancel: () => void;
|
|
5
|
+
onSubmit: () => void;
|
|
6
|
+
cancelText?: string;
|
|
7
|
+
submitText?: string;
|
|
8
|
+
}
|
|
9
|
+
declare const ConfirmDialog: (props: Props) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export default ConfirmDialog;
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const material_1 = require("@mui/material");
|
|
8
|
+
const mobx_react_1 = require("mobx-react");
|
|
9
|
+
const Dialog_1 = __importDefault(require("./Dialog"));
|
|
10
|
+
const ConfirmDialog = (0, mobx_react_1.observer)(function (props) {
|
|
11
|
+
const { onSubmit, onCancel, cancelText = 'Cancel', submitText = 'OK', children, } = props;
|
|
12
|
+
return ((0, jsx_runtime_1.jsxs)(Dialog_1.default, { onClose: onCancel, ...props, children: [(0, jsx_runtime_1.jsx)(material_1.DialogContent, { children: children }), (0, jsx_runtime_1.jsxs)(material_1.DialogActions, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { color: "secondary", variant: "contained", onClick: () => {
|
|
13
|
+
onCancel();
|
|
14
|
+
}, children: cancelText }), (0, jsx_runtime_1.jsx)(material_1.Button, { color: "primary", variant: "contained", onClick: () => {
|
|
15
|
+
onSubmit();
|
|
16
|
+
}, children: submitText })] })] }));
|
|
17
|
+
});
|
|
18
|
+
exports.default = ConfirmDialog;
|
package/ui/EditableTypography.js
CHANGED
|
@@ -31,13 +31,6 @@ const EditableTypography = (0, react_1.forwardRef)(function EditableTypography2(
|
|
|
31
31
|
const [ref2, { width }] = (0, useMeasure_1.default)();
|
|
32
32
|
const [editedValue, setEditedValue] = (0, react_1.useState)();
|
|
33
33
|
const [inputNode, setInputNode] = (0, react_1.useState)(null);
|
|
34
|
-
const [blur, setBlur] = (0, react_1.useState)(false);
|
|
35
|
-
(0, react_1.useEffect)(() => {
|
|
36
|
-
if (blur) {
|
|
37
|
-
inputNode === null || inputNode === void 0 ? void 0 : inputNode.blur();
|
|
38
|
-
setBlur(false);
|
|
39
|
-
}
|
|
40
|
-
}, [blur, inputNode]);
|
|
41
34
|
const { classes } = useStyles(props, { props });
|
|
42
35
|
const theme = (0, material_1.useTheme)();
|
|
43
36
|
const val = editedValue === undefined ? value : editedValue;
|
|
@@ -62,7 +55,7 @@ const EditableTypography = (0, react_1.forwardRef)(function EditableTypography2(
|
|
|
62
55
|
}
|
|
63
56
|
else if (event.key === 'Escape') {
|
|
64
57
|
setEditedValue(undefined);
|
|
65
|
-
|
|
58
|
+
inputNode === null || inputNode === void 0 ? void 0 : inputNode.blur();
|
|
66
59
|
}
|
|
67
60
|
}, onBlur: () => {
|
|
68
61
|
setValue(editedValue || value || '');
|
package/ui/LoadingEllipses.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { TypographyProps } from '@mui/material';
|
|
2
2
|
interface Props extends TypographyProps {
|
|
3
3
|
message?: string;
|
|
4
|
+
children?: never;
|
|
4
5
|
}
|
|
5
|
-
export default function LoadingEllipses({ message, variant, ...rest }: Props): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export default function LoadingEllipses({ message, children, variant, ...rest }: Props): import("react/jsx-runtime").JSX.Element;
|
|
6
7
|
export {};
|
package/ui/LoadingEllipses.js
CHANGED
|
@@ -29,7 +29,7 @@ const useStyles = (0, mui_1.makeStyles)()({
|
|
|
29
29
|
},
|
|
30
30
|
},
|
|
31
31
|
});
|
|
32
|
-
function LoadingEllipses({ message, variant = 'body2', ...rest }) {
|
|
32
|
+
function LoadingEllipses({ message, children, variant = 'body2', ...rest }) {
|
|
33
33
|
const { cx, classes } = useStyles();
|
|
34
34
|
return ((0, jsx_runtime_1.jsx)(material_1.Typography, { className: cx(classes.dots, rest.className), ...rest, variant: variant, children: message || 'Loading' }));
|
|
35
35
|
}
|
package/ui/Menu.d.ts
CHANGED
package/ui/Menu.js
CHANGED
|
@@ -116,7 +116,7 @@ const MenuPage = (0, react_1.forwardRef)(function MenuPage2(props, ref) {
|
|
|
116
116
|
clearTimeout(timer);
|
|
117
117
|
};
|
|
118
118
|
}, [isSubMenuOpen, open, subMenuAnchorEl]);
|
|
119
|
-
(0, react_1.
|
|
119
|
+
(0, react_1.useLayoutEffect)(() => {
|
|
120
120
|
if (anchorEl) {
|
|
121
121
|
const rect = anchorEl.getBoundingClientRect();
|
|
122
122
|
if (position) {
|
|
@@ -220,7 +220,7 @@ const MenuPage = (0, react_1.forwardRef)(function MenuPage2(props, ref) {
|
|
|
220
220
|
});
|
|
221
221
|
function Menu(props) {
|
|
222
222
|
const { open, onClose, menuItems, onMenuItemClick, ...other } = props;
|
|
223
|
-
return ((0, jsx_runtime_1.jsx)(material_1.Popover, { open: open, onClose: onClose, anchorOrigin: {
|
|
223
|
+
return ((0, jsx_runtime_1.jsx)(material_1.Popover, { open: open, onClose: onClose, style: { zIndex: 10000, ...other.style }, anchorOrigin: {
|
|
224
224
|
vertical: 'bottom',
|
|
225
225
|
horizontal: 'right',
|
|
226
226
|
...other.anchorOrigin,
|
package/ui/SanitizedHTML.js
CHANGED
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.default = SanitizedHTML;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const react_1 = require("react");
|
|
8
9
|
const dompurify_1 = __importDefault(require("dompurify"));
|
|
9
10
|
const escape_html_1 = __importDefault(require("escape-html"));
|
|
10
11
|
const util_1 = require("../util");
|
|
@@ -42,22 +43,24 @@ const htmlTags = [
|
|
|
42
43
|
'ul',
|
|
43
44
|
];
|
|
44
45
|
let added = false;
|
|
45
|
-
const full = new RegExp(htmlTags.map(tag => `<${tag}
|
|
46
|
+
const full = new RegExp(htmlTags.map(tag => String.raw `<${tag}\b[^>]*>`).join('|'), 'i');
|
|
46
47
|
function isHTML(str) {
|
|
47
48
|
return full.test(str);
|
|
48
49
|
}
|
|
49
50
|
function SanitizedHTML({ html: pre, className, }) {
|
|
50
51
|
const html = (0, util_1.linkify)(`${pre}`);
|
|
51
52
|
const value = isHTML(html) ? html : (0, escape_html_1.default)(html);
|
|
52
|
-
|
|
53
|
-
added
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
node.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
53
|
+
(0, react_1.useEffect)(() => {
|
|
54
|
+
if (!added) {
|
|
55
|
+
added = true;
|
|
56
|
+
dompurify_1.default.addHook('afterSanitizeAttributes', node => {
|
|
57
|
+
if (node.tagName === 'A') {
|
|
58
|
+
node.setAttribute('rel', 'noopener noreferrer');
|
|
59
|
+
node.setAttribute('target', '_blank');
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}, []);
|
|
61
64
|
return ((0, jsx_runtime_1.jsx)("span", { className: className, dangerouslySetInnerHTML: {
|
|
62
65
|
__html: dompurify_1.default.sanitize(value),
|
|
63
66
|
} }));
|
package/util/aborting.js
CHANGED
|
@@ -44,5 +44,5 @@ function isAbortException(exception) {
|
|
|
44
44
|
return (exception instanceof Error &&
|
|
45
45
|
(exception.name === 'AbortError' ||
|
|
46
46
|
exception.code === 'ERR_ABORTED' ||
|
|
47
|
-
|
|
47
|
+
/\b(aborted|aborterror)\b/i.test(exception.message)));
|
|
48
48
|
}
|
package/util/cluster.js
CHANGED
|
@@ -27,15 +27,18 @@ function averageDistance(setA, setB, distances) {
|
|
|
27
27
|
return distance / setA.length / setB.length;
|
|
28
28
|
}
|
|
29
29
|
function clusterData({ data, distance = euclideanDistance, linkage = averageDistance, onProgress, stopToken, }) {
|
|
30
|
-
let
|
|
30
|
+
let stopTokenCheckerStart = performance.now();
|
|
31
|
+
let progressStart = performance.now();
|
|
31
32
|
const distances = [];
|
|
32
33
|
for (let i = 0; i < data.length; i++) {
|
|
33
|
-
|
|
34
|
+
const r = performance.now();
|
|
35
|
+
if (r - stopTokenCheckerStart > 400) {
|
|
34
36
|
(0, stopToken_1.checkStopToken)(stopToken);
|
|
35
|
-
|
|
37
|
+
stopTokenCheckerStart = performance.now();
|
|
36
38
|
}
|
|
37
|
-
if (
|
|
38
|
-
onProgress(`Making distance matrix: ${toP(i / (data.length - 1))}%`);
|
|
39
|
+
if (r - progressStart > 50) {
|
|
40
|
+
onProgress === null || onProgress === void 0 ? void 0 : onProgress(`Making distance matrix: ${toP(i / (data.length - 1))}%`);
|
|
41
|
+
progressStart = performance.now();
|
|
39
42
|
}
|
|
40
43
|
const row = [];
|
|
41
44
|
for (let j = 0; j < data.length; j++) {
|
|
@@ -45,17 +48,20 @@ function clusterData({ data, distance = euclideanDistance, linkage = averageDist
|
|
|
45
48
|
}
|
|
46
49
|
const clusters = data.map((_datum, index) => ({
|
|
47
50
|
height: 0,
|
|
48
|
-
indexes: [
|
|
51
|
+
indexes: [index],
|
|
49
52
|
}));
|
|
50
53
|
let clustersGivenK = [];
|
|
51
|
-
|
|
54
|
+
stopTokenCheckerStart = performance.now();
|
|
55
|
+
progressStart = performance.now();
|
|
52
56
|
for (let iteration = 0; iteration < data.length; iteration++) {
|
|
53
|
-
|
|
57
|
+
const r = performance.now();
|
|
58
|
+
if (r - stopTokenCheckerStart > 400) {
|
|
54
59
|
(0, stopToken_1.checkStopToken)(stopToken);
|
|
55
|
-
|
|
60
|
+
stopTokenCheckerStart = performance.now();
|
|
56
61
|
}
|
|
57
|
-
if (
|
|
58
|
-
onProgress(`Clustering: ${toP((iteration + 1) / data.length)}%`);
|
|
62
|
+
if (r - progressStart > 50) {
|
|
63
|
+
onProgress === null || onProgress === void 0 ? void 0 : onProgress(`Clustering: ${toP((iteration + 1) / data.length)}%`);
|
|
64
|
+
progressStart = performance.now();
|
|
59
65
|
}
|
|
60
66
|
clustersGivenK.push(clusters.map(cluster => cluster.indexes));
|
|
61
67
|
if (iteration >= data.length - 1) {
|
package/util/color/index.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ export declare function contrastingTextColor(color: string): string;
|
|
|
2
2
|
export declare function emphasize(color: string, coefficient?: number): string;
|
|
3
3
|
export declare function makeContrasting(foreground: string, background?: string, minContrastRatio?: number): string;
|
|
4
4
|
export { isNamedColor, namedColorToHex } from './cssColorsLevel4';
|
|
5
|
+
export declare function randomColor(str: string): string;
|
package/util/color/index.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.namedColorToHex = exports.isNamedColor = void 0;
|
|
|
4
4
|
exports.contrastingTextColor = contrastingTextColor;
|
|
5
5
|
exports.emphasize = emphasize;
|
|
6
6
|
exports.makeContrasting = makeContrasting;
|
|
7
|
+
exports.randomColor = randomColor;
|
|
7
8
|
const styles_1 = require("@mui/material/styles");
|
|
8
9
|
const cssColorsLevel4_1 = require("./cssColorsLevel4");
|
|
9
10
|
function contrastingTextColor(color) {
|
|
@@ -38,3 +39,10 @@ function makeContrasting(foreground, background = 'white', minContrastRatio = 3)
|
|
|
38
39
|
var cssColorsLevel4_2 = require("./cssColorsLevel4");
|
|
39
40
|
Object.defineProperty(exports, "isNamedColor", { enumerable: true, get: function () { return cssColorsLevel4_2.isNamedColor; } });
|
|
40
41
|
Object.defineProperty(exports, "namedColorToHex", { enumerable: true, get: function () { return cssColorsLevel4_2.namedColorToHex; } });
|
|
42
|
+
function randomColor(str) {
|
|
43
|
+
let sum = 0;
|
|
44
|
+
for (let i = 0; i < str.length; i++) {
|
|
45
|
+
sum += str.charCodeAt(i);
|
|
46
|
+
}
|
|
47
|
+
return `hsl(${sum * 10}, 50%, 50%)`;
|
|
48
|
+
}
|
package/util/compositeMap.d.ts
CHANGED
|
@@ -6,6 +6,6 @@ export default class CompositeMap<T, U> {
|
|
|
6
6
|
values(): Generator<U, void, unknown>;
|
|
7
7
|
keys(): Generator<T, void, unknown>;
|
|
8
8
|
find<V>(f: (arg0: U) => V): U | undefined;
|
|
9
|
-
[Symbol.iterator](): Generator<
|
|
10
|
-
entries(): Generator<
|
|
9
|
+
[Symbol.iterator](): Generator<readonly [T, U | undefined], void, unknown>;
|
|
10
|
+
entries(): Generator<readonly [T, U | undefined], void, unknown>;
|
|
11
11
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.convertCodingSequenceToPeptides = convertCodingSequenceToPeptides;
|
|
4
|
+
const util_1 = require("../BaseFeatureWidget/util");
|
|
5
|
+
function convertCodingSequenceToPeptides({ cds, sequence, codonTable, }) {
|
|
6
|
+
const str = (0, util_1.stitch)(cds, sequence);
|
|
7
|
+
let protein = '';
|
|
8
|
+
for (let i = 0; i < str.length; i += 3) {
|
|
9
|
+
protein += codonTable[str.slice(i, i + 3)] || '&';
|
|
10
|
+
}
|
|
11
|
+
return protein;
|
|
12
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AbstractSessionModel } from './types';
|
|
2
|
+
export declare function fetchSeq({ start, end, refName, assemblyName, session, }: {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
refName: string;
|
|
6
|
+
assemblyName: string;
|
|
7
|
+
session: AbstractSessionModel;
|
|
8
|
+
}): Promise<string>;
|
package/util/fetchSeq.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchSeq = fetchSeq;
|
|
4
|
+
const configuration_1 = require("../configuration");
|
|
5
|
+
async function fetchSeq({ start, end, refName, assemblyName, session, }) {
|
|
6
|
+
const { rpcManager, assemblyManager } = session;
|
|
7
|
+
const assembly = await assemblyManager.waitForAssembly(assemblyName);
|
|
8
|
+
if (!assembly) {
|
|
9
|
+
throw new Error('assembly not found');
|
|
10
|
+
}
|
|
11
|
+
const sessionId = 'getSequence';
|
|
12
|
+
const canonicalRefName = assembly.getCanonicalRefName(refName);
|
|
13
|
+
const feats = await rpcManager.call(sessionId, 'CoreGetFeatures', {
|
|
14
|
+
adapterConfig: (0, configuration_1.getConf)(assembly, ['sequence', 'adapter']),
|
|
15
|
+
sessionId,
|
|
16
|
+
regions: [
|
|
17
|
+
{
|
|
18
|
+
start,
|
|
19
|
+
end,
|
|
20
|
+
refName: canonicalRefName,
|
|
21
|
+
assemblyName,
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
});
|
|
25
|
+
const [feat] = feats;
|
|
26
|
+
return (feat === null || feat === void 0 ? void 0 : feat.get('seq')) || '';
|
|
27
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export default class Flatbush {
|
|
2
|
+
static from(data: ArrayBufferLike, byteOffset?: number): Flatbush;
|
|
3
|
+
constructor(numItems: number, nodeSize?: number, ArrayType?: TypedArrayConstructor, ArrayBufferType?: ArrayBufferConstructor | SharedArrayBufferConstructor, data?: ArrayBufferLike, byteOffset?: number);
|
|
4
|
+
numItems: number;
|
|
5
|
+
nodeSize: number;
|
|
6
|
+
byteOffset: number;
|
|
7
|
+
_levelBounds: number[];
|
|
8
|
+
ArrayType: TypedArrayConstructor;
|
|
9
|
+
IndexArrayType: Uint16ArrayConstructor | Uint32ArrayConstructor;
|
|
10
|
+
data: ArrayBufferLike;
|
|
11
|
+
_boxes: Int8Array<ArrayBuffer> | Float64Array<ArrayBuffer> | Uint8Array<ArrayBuffer> | Uint8ClampedArray<ArrayBuffer> | Int16Array<ArrayBuffer> | Uint16Array<ArrayBuffer> | Int32Array<ArrayBuffer> | Uint32Array<ArrayBuffer> | Float32Array<ArrayBuffer>;
|
|
12
|
+
_indices: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>;
|
|
13
|
+
_pos: number;
|
|
14
|
+
minX: number | undefined;
|
|
15
|
+
minY: number | undefined;
|
|
16
|
+
maxX: number | undefined;
|
|
17
|
+
maxY: number | undefined;
|
|
18
|
+
_queue: FlatQueue<number>;
|
|
19
|
+
add(minX: number, minY: number, maxX?: number, maxY?: number): number;
|
|
20
|
+
finish(): void;
|
|
21
|
+
search(minX: number, minY: number, maxX: number, maxY: number, filterFn?: (index: number, x0: number, y0: number, x1: number, y1: number) => boolean): number[];
|
|
22
|
+
neighbors(x: number, y: number, maxResults?: number, maxDistance?: number, filterFn?: (index: number) => boolean): number[];
|
|
23
|
+
}
|
|
24
|
+
export type TypedArrayConstructor = Int8ArrayConstructor | Uint8ArrayConstructor | Uint8ClampedArrayConstructor | Int16ArrayConstructor | Uint16ArrayConstructor | Int32ArrayConstructor | Uint32ArrayConstructor | Float32ArrayConstructor | Float64ArrayConstructor;
|
|
25
|
+
import FlatQueue from '../flatqueue';
|