@jbrowse/core 3.2.0 → 3.3.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/ArrayValue.d.ts +2 -1
- package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +4 -4
- package/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +10 -9
- package/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +3 -13
- package/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +2 -1
- package/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +2 -2
- package/PluginManager.d.ts +1 -1
- package/ReExports/modules.d.ts +1 -1
- package/ReExports/modules.js +1 -22
- package/assemblyManager/assemblyManager.js +1 -1
- package/data_adapters/BaseAdapter/BaseAdapter.d.ts +2 -2
- package/data_adapters/BaseAdapter/BaseAdapter.js +1 -0
- package/package.json +5 -5
- package/pluggableElementTypes/renderers/CircularChordRendererType.js +8 -9
- package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +2 -4
- package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.js +2 -30
- package/pluggableElementTypes/renderers/ServerSideRenderedContent.d.ts +1 -1
- package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +2 -30
- package/pluggableElementTypes/renderers/ServerSideRendererType.js +6 -7
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/DataGridFlexContainer.d.ts +3 -0
- package/ui/DataGridFlexContainer.js +15 -0
- package/ui/theme.js +5 -5
- package/util/cluster.d.ts +17 -0
- package/util/cluster.js +96 -0
- package/util/index.d.ts +2 -1
- package/util/index.js +6 -1
- package/util/offscreenCanvasUtils.d.ts +11 -11
- package/util/offscreenCanvasUtils.js +4 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = DataGridFlexContainer;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const mui_1 = require("tss-react/mui");
|
|
6
|
+
const useStyles = (0, mui_1.makeStyles)()({
|
|
7
|
+
flexContainer: {
|
|
8
|
+
display: 'flex',
|
|
9
|
+
flexDirection: 'column',
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
function DataGridFlexContainer({ children, }) {
|
|
13
|
+
const { classes } = useStyles();
|
|
14
|
+
return (0, jsx_runtime_1.jsx)("div", { className: classes.flexContainer, children: children });
|
|
15
|
+
}
|
package/ui/theme.js
CHANGED
|
@@ -10,8 +10,8 @@ const colors_1 = require("@mui/material/colors");
|
|
|
10
10
|
const styles_1 = require("@mui/material/styles");
|
|
11
11
|
const deepmerge_1 = __importDefault(require("deepmerge"));
|
|
12
12
|
const refTheme = (0, styles_1.createTheme)();
|
|
13
|
-
const midnight = '#0D233F';
|
|
14
|
-
const grape = '#721E63';
|
|
13
|
+
const midnight = refTheme.palette.augmentColor({ color: { main: '#0D233F' } });
|
|
14
|
+
const grape = refTheme.palette.augmentColor({ color: { main: '#721E63' } });
|
|
15
15
|
const forest = refTheme.palette.augmentColor({ color: { main: '#135560' } });
|
|
16
16
|
const mandarin = refTheme.palette.augmentColor({ color: { main: '#FFB11D' } });
|
|
17
17
|
const lightgrey = refTheme.palette.augmentColor({ color: { main: '#aaa' } });
|
|
@@ -47,6 +47,9 @@ const hardclip = '#f00';
|
|
|
47
47
|
const softclip = '#00f';
|
|
48
48
|
const skip = '#97b8c9';
|
|
49
49
|
const defaults = {
|
|
50
|
+
primary: midnight,
|
|
51
|
+
secondary: grape,
|
|
52
|
+
tertiary: forest,
|
|
50
53
|
quaternary: mandarin,
|
|
51
54
|
highlight: mandarin,
|
|
52
55
|
stopCodon,
|
|
@@ -65,9 +68,6 @@ function stockTheme() {
|
|
|
65
68
|
palette: {
|
|
66
69
|
...defaults,
|
|
67
70
|
mode: undefined,
|
|
68
|
-
primary: { main: midnight },
|
|
69
|
-
secondary: { main: grape },
|
|
70
|
-
tertiary: forest,
|
|
71
71
|
},
|
|
72
72
|
components: {
|
|
73
73
|
MuiLink: {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare function euclideanDistance(a: number[], b: number[]): number;
|
|
2
|
+
export declare function averageDistance(setA: number[], setB: number[], distances: number[][]): number;
|
|
3
|
+
export declare function clusterData({ data, distance, linkage, onProgress, stopToken, }: {
|
|
4
|
+
data: number[][];
|
|
5
|
+
distance?: (a: number[], b: number[]) => number;
|
|
6
|
+
linkage?: (a: number[], b: number[], distances: number[][]) => number;
|
|
7
|
+
onProgress?: (a: string) => void;
|
|
8
|
+
stopToken?: string;
|
|
9
|
+
}): {
|
|
10
|
+
clusters: {
|
|
11
|
+
height: number;
|
|
12
|
+
indexes: number[];
|
|
13
|
+
} | undefined;
|
|
14
|
+
distances: number[][];
|
|
15
|
+
order: number[];
|
|
16
|
+
clustersGivenK: number[][][];
|
|
17
|
+
};
|
package/util/cluster.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.euclideanDistance = euclideanDistance;
|
|
4
|
+
exports.averageDistance = averageDistance;
|
|
5
|
+
exports.clusterData = clusterData;
|
|
6
|
+
const stopToken_1 = require("@jbrowse/core/util/stopToken");
|
|
7
|
+
function toP(n) {
|
|
8
|
+
return Number.parseFloat((n * 100).toFixed(1));
|
|
9
|
+
}
|
|
10
|
+
function euclideanDistance(a, b) {
|
|
11
|
+
const size = Math.min(a.length, b.length);
|
|
12
|
+
let sum = 0;
|
|
13
|
+
for (let index = 0; index < size; index++) {
|
|
14
|
+
sum += (a[index] - b[index]) * (a[index] - b[index]);
|
|
15
|
+
}
|
|
16
|
+
return Math.sqrt(sum);
|
|
17
|
+
}
|
|
18
|
+
function averageDistance(setA, setB, distances) {
|
|
19
|
+
let distance = 0;
|
|
20
|
+
const lenA = setA.length;
|
|
21
|
+
const lenB = setB.length;
|
|
22
|
+
for (let i = 0; i < lenA; i++) {
|
|
23
|
+
for (let j = 0; j < lenB; j++) {
|
|
24
|
+
distance += distances[setA[i]][setB[j]];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return distance / setA.length / setB.length;
|
|
28
|
+
}
|
|
29
|
+
function clusterData({ data, distance = euclideanDistance, linkage = averageDistance, onProgress, stopToken, }) {
|
|
30
|
+
let start = performance.now();
|
|
31
|
+
const distances = [];
|
|
32
|
+
for (let i = 0; i < data.length; i++) {
|
|
33
|
+
if (performance.now() - start > 400) {
|
|
34
|
+
(0, stopToken_1.checkStopToken)(stopToken);
|
|
35
|
+
start = performance.now();
|
|
36
|
+
}
|
|
37
|
+
if (onProgress) {
|
|
38
|
+
onProgress(`Making distance matrix: ${toP(i / (data.length - 1))}%`);
|
|
39
|
+
}
|
|
40
|
+
const row = [];
|
|
41
|
+
for (let j = 0; j < data.length; j++) {
|
|
42
|
+
row.push(distance(data[i], data[j]));
|
|
43
|
+
}
|
|
44
|
+
distances.push(row);
|
|
45
|
+
}
|
|
46
|
+
const clusters = data.map((_datum, index) => ({
|
|
47
|
+
height: 0,
|
|
48
|
+
indexes: [Number(index)],
|
|
49
|
+
}));
|
|
50
|
+
let clustersGivenK = [];
|
|
51
|
+
start = performance.now();
|
|
52
|
+
for (let iteration = 0; iteration < data.length; iteration++) {
|
|
53
|
+
if (performance.now() - start > 400) {
|
|
54
|
+
(0, stopToken_1.checkStopToken)(stopToken);
|
|
55
|
+
start = performance.now();
|
|
56
|
+
}
|
|
57
|
+
if (onProgress) {
|
|
58
|
+
onProgress(`Clustering: ${toP((iteration + 1) / data.length)}%`);
|
|
59
|
+
}
|
|
60
|
+
clustersGivenK.push(clusters.map(cluster => cluster.indexes));
|
|
61
|
+
if (iteration >= data.length - 1) {
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
let nearestDistance = Infinity;
|
|
65
|
+
let nearestRow = 0;
|
|
66
|
+
let nearestCol = 0;
|
|
67
|
+
for (let row = 0; row < clusters.length; row++) {
|
|
68
|
+
for (let col = row + 1; col < clusters.length; col++) {
|
|
69
|
+
const distance = linkage(clusters[row].indexes, clusters[col].indexes, distances);
|
|
70
|
+
if (distance < nearestDistance) {
|
|
71
|
+
nearestDistance = distance;
|
|
72
|
+
nearestRow = row;
|
|
73
|
+
nearestCol = col;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const newCluster = {
|
|
78
|
+
indexes: [
|
|
79
|
+
...clusters[nearestRow].indexes,
|
|
80
|
+
...clusters[nearestCol].indexes,
|
|
81
|
+
],
|
|
82
|
+
height: nearestDistance,
|
|
83
|
+
children: [clusters[nearestRow], clusters[nearestCol]],
|
|
84
|
+
};
|
|
85
|
+
clusters.splice(Math.max(nearestRow, nearestCol), 1);
|
|
86
|
+
clusters.splice(Math.min(nearestRow, nearestCol), 1);
|
|
87
|
+
clusters.push(newCluster);
|
|
88
|
+
}
|
|
89
|
+
clustersGivenK = [[], ...clustersGivenK.reverse()];
|
|
90
|
+
return {
|
|
91
|
+
clusters: clusters[0],
|
|
92
|
+
distances: distances,
|
|
93
|
+
order: clusters[0].indexes,
|
|
94
|
+
clustersGivenK: clustersGivenK,
|
|
95
|
+
};
|
|
96
|
+
}
|
package/util/index.d.ts
CHANGED
|
@@ -75,6 +75,7 @@ export declare function renameRegionsIfNeeded<ARGTYPE extends {
|
|
|
75
75
|
}>;
|
|
76
76
|
export declare function minmax(a: number, b: number): readonly [number, number];
|
|
77
77
|
export declare function shorten(name: string, max?: number, short?: number): string;
|
|
78
|
+
export declare function shorten2(name: string, max?: number): string;
|
|
78
79
|
export declare function stringify({ refName, coord, assemblyName, oob, }: {
|
|
79
80
|
assemblyName?: string;
|
|
80
81
|
coord: number;
|
|
@@ -258,7 +259,7 @@ export declare function fetchAndMaybeUnzipText(loc: GenericFilehandle, opts?: Ba
|
|
|
258
259
|
export declare function isObject(x: unknown): x is Record<string | symbol | number, unknown>;
|
|
259
260
|
export declare function localStorageGetNumber(key: string, defaultVal: number): number;
|
|
260
261
|
export declare function localStorageGetBoolean(key: string, defaultVal: boolean): boolean;
|
|
261
|
-
export declare function forEachWithStopTokenCheck<T>(iter: Iterable<T>, stopToken: string | undefined, arg: (arg: T) => void, durationMs?: number): void;
|
|
262
|
+
export declare function forEachWithStopTokenCheck<T>(iter: Iterable<T>, stopToken: string | undefined, arg: (arg: T, idx: number) => void, durationMs?: number): void;
|
|
262
263
|
export declare function testAdapter(fileName: string, regex: RegExp, adapterHint: string | undefined, expected: string): boolean;
|
|
263
264
|
export { type Feature, type SimpleFeatureSerialized, type SimpleFeatureSerializedNoId, default as SimpleFeature, isFeature, } from './simpleFeature';
|
|
264
265
|
export { blobToDataURL } from './blobToDataURL';
|
package/util/index.js
CHANGED
|
@@ -49,6 +49,7 @@ exports.renameRegionIfNeeded = renameRegionIfNeeded;
|
|
|
49
49
|
exports.renameRegionsIfNeeded = renameRegionsIfNeeded;
|
|
50
50
|
exports.minmax = minmax;
|
|
51
51
|
exports.shorten = shorten;
|
|
52
|
+
exports.shorten2 = shorten2;
|
|
52
53
|
exports.stringify = stringify;
|
|
53
54
|
exports.revcom = revcom;
|
|
54
55
|
exports.reverse = reverse;
|
|
@@ -530,6 +531,9 @@ function shorten(name, max = 70, short = 30) {
|
|
|
530
531
|
? `${name.slice(0, short)}...${name.slice(-short)}`
|
|
531
532
|
: name;
|
|
532
533
|
}
|
|
534
|
+
function shorten2(name, max = 70) {
|
|
535
|
+
return name.length > max ? `${name.slice(0, max)}...` : name;
|
|
536
|
+
}
|
|
533
537
|
function stringify({ refName, coord, assemblyName, oob, }, useAssemblyName) {
|
|
534
538
|
return [
|
|
535
539
|
assemblyName && useAssemblyName ? `{${assemblyName}}` : '',
|
|
@@ -1006,12 +1010,13 @@ function localStorageGetBoolean(key, defaultVal) {
|
|
|
1006
1010
|
}
|
|
1007
1011
|
function forEachWithStopTokenCheck(iter, stopToken, arg, durationMs = 400) {
|
|
1008
1012
|
let start = performance.now();
|
|
1013
|
+
let i = 0;
|
|
1009
1014
|
for (const t of iter) {
|
|
1010
1015
|
if (performance.now() - start > durationMs) {
|
|
1011
1016
|
(0, stopToken_1.checkStopToken)(stopToken);
|
|
1012
1017
|
start = performance.now();
|
|
1013
1018
|
}
|
|
1014
|
-
arg(t);
|
|
1019
|
+
arg(t, i++);
|
|
1015
1020
|
}
|
|
1016
1021
|
}
|
|
1017
1022
|
function testAdapter(fileName, regex, adapterHint, expected) {
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
};
|
|
1
|
+
interface ExportSVGOptions {
|
|
2
|
+
rasterizeLayers?: boolean;
|
|
3
|
+
scale?: number;
|
|
4
|
+
}
|
|
5
|
+
interface RenderToAbstractCanvasOptions {
|
|
6
|
+
exportSVG?: ExportSVGOptions;
|
|
8
7
|
highResolutionScaling?: number;
|
|
9
|
-
}
|
|
8
|
+
}
|
|
9
|
+
export declare function renderToAbstractCanvas<T>(width: number, height: number, opts: RenderToAbstractCanvasOptions, cb: (ctx: CanvasRenderingContext2D) => T): Promise<(Awaited<T> & {
|
|
10
10
|
canvasRecordedData: any;
|
|
11
|
-
} | {
|
|
11
|
+
}) | (Awaited<T> & {
|
|
12
12
|
reactElement: import("react/jsx-runtime").JSX.Element;
|
|
13
|
-
} | {
|
|
13
|
+
}) | (Awaited<T> & {
|
|
14
14
|
imageData: any;
|
|
15
|
-
}>;
|
|
15
|
+
})>;
|
|
16
16
|
export declare function getSerializedSvg(results: {
|
|
17
17
|
width: number;
|
|
18
18
|
height: number;
|
|
@@ -80,7 +80,10 @@ async function renderToAbstractCanvas(width, height, opts, cb) {
|
|
|
80
80
|
}
|
|
81
81
|
ctx.scale(s, s);
|
|
82
82
|
const result = await cb(ctx);
|
|
83
|
-
return {
|
|
83
|
+
return {
|
|
84
|
+
...result,
|
|
85
|
+
imageData: await (0, offscreenCanvasPonyfill_1.createImageBitmap)(canvas),
|
|
86
|
+
};
|
|
84
87
|
}
|
|
85
88
|
}
|
|
86
89
|
async function getSerializedSvg(results) {
|