@jbrowse/plugin-linear-genome-view 2.10.2 → 2.10.3
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/dist/BaseLinearDisplay/components/BlockMsg.d.ts +2 -4
- package/dist/BaseLinearDisplay/components/BlockMsg.js +2 -3
- package/dist/BaseLinearDisplay/components/LinearBlocks.js +2 -2
- package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.d.ts +10 -2
- package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +40 -4
- package/dist/BaseLinearDisplay/components/TooLargeMessage.js +5 -4
- package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +18 -4
- package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.d.ts +9 -2
- package/dist/LaunchLinearGenomeView/index.js +15 -7
- package/dist/LinearBareDisplay/model.d.ts +18 -4
- package/dist/LinearBasicDisplay/model.d.ts +22 -4
- package/dist/LinearGenomeView/components/Highlight.d.ts +7 -0
- package/dist/LinearGenomeView/components/Highlight.js +122 -0
- package/dist/LinearGenomeView/components/OverviewHighlight.d.ts +9 -0
- package/dist/LinearGenomeView/components/OverviewHighlight.js +53 -0
- package/dist/LinearGenomeView/components/OverviewScalebar.js +3 -1
- package/dist/LinearGenomeView/components/TracksContainer.js +2 -0
- package/dist/LinearGenomeView/model.d.ts +5 -0
- package/dist/LinearGenomeView/model.js +11 -0
- package/dist/LinearGenomeView/util.d.ts +1 -1
- package/dist/index.d.ts +66 -12
- package/esm/BaseLinearDisplay/components/BlockMsg.d.ts +2 -4
- package/esm/BaseLinearDisplay/components/BlockMsg.js +3 -4
- package/esm/BaseLinearDisplay/components/LinearBlocks.js +2 -2
- package/esm/BaseLinearDisplay/components/ServerSideRenderedBlockContent.d.ts +10 -2
- package/esm/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +17 -4
- package/esm/BaseLinearDisplay/components/TooLargeMessage.js +5 -4
- package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +18 -4
- package/esm/BaseLinearDisplay/models/serverSideRenderedBlock.d.ts +9 -2
- package/esm/LaunchLinearGenomeView/index.js +16 -8
- package/esm/LinearBareDisplay/model.d.ts +18 -4
- package/esm/LinearBasicDisplay/model.d.ts +22 -4
- package/esm/LinearGenomeView/components/Highlight.d.ts +7 -0
- package/esm/LinearGenomeView/components/Highlight.js +94 -0
- package/esm/LinearGenomeView/components/OverviewHighlight.d.ts +9 -0
- package/esm/LinearGenomeView/components/OverviewHighlight.js +48 -0
- package/esm/LinearGenomeView/components/OverviewScalebar.js +3 -1
- package/esm/LinearGenomeView/components/TracksContainer.js +2 -0
- package/esm/LinearGenomeView/model.d.ts +5 -0
- package/esm/LinearGenomeView/model.js +11 -0
- package/esm/LinearGenomeView/util.d.ts +1 -1
- package/esm/index.d.ts +66 -12
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -38,8 +38,15 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
38
38
|
message: string | undefined;
|
|
39
39
|
maxHeightReached: boolean;
|
|
40
40
|
ReactComponent: ({ model, }: {
|
|
41
|
-
model:
|
|
42
|
-
|
|
41
|
+
model: {
|
|
42
|
+
error?: unknown;
|
|
43
|
+
reload: () => void;
|
|
44
|
+
message: import("react").ReactNode;
|
|
45
|
+
filled?: boolean | undefined;
|
|
46
|
+
status?: string | undefined;
|
|
47
|
+
reactElement?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
48
|
+
};
|
|
49
|
+
}) => import("react").JSX.Element | undefined;
|
|
43
50
|
renderProps: any;
|
|
44
51
|
} & {
|
|
45
52
|
doReload(): void;
|
|
@@ -83,8 +90,15 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
83
90
|
message: string | undefined;
|
|
84
91
|
maxHeightReached: boolean;
|
|
85
92
|
ReactComponent: ({ model, }: {
|
|
86
|
-
model:
|
|
87
|
-
|
|
93
|
+
model: {
|
|
94
|
+
error?: unknown;
|
|
95
|
+
reload: () => void;
|
|
96
|
+
message: import("react").ReactNode;
|
|
97
|
+
filled?: boolean | undefined;
|
|
98
|
+
status?: string | undefined;
|
|
99
|
+
reactElement?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
100
|
+
};
|
|
101
|
+
}) => import("react").JSX.Element | undefined;
|
|
88
102
|
renderProps: any;
|
|
89
103
|
} & {
|
|
90
104
|
doReload(): void;
|
|
@@ -292,8 +306,15 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
292
306
|
message: string | undefined;
|
|
293
307
|
maxHeightReached: boolean;
|
|
294
308
|
ReactComponent: ({ model, }: {
|
|
295
|
-
model:
|
|
296
|
-
|
|
309
|
+
model: {
|
|
310
|
+
error?: unknown;
|
|
311
|
+
reload: () => void;
|
|
312
|
+
message: import("react").ReactNode;
|
|
313
|
+
filled?: boolean | undefined;
|
|
314
|
+
status?: string | undefined;
|
|
315
|
+
reactElement?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
316
|
+
};
|
|
317
|
+
}) => import("react").JSX.Element | undefined;
|
|
297
318
|
renderProps: any;
|
|
298
319
|
} & {
|
|
299
320
|
doReload(): void;
|
|
@@ -497,8 +518,15 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
497
518
|
message: string | undefined;
|
|
498
519
|
maxHeightReached: boolean;
|
|
499
520
|
ReactComponent: ({ model, }: {
|
|
500
|
-
model:
|
|
501
|
-
|
|
521
|
+
model: {
|
|
522
|
+
error?: unknown;
|
|
523
|
+
reload: () => void;
|
|
524
|
+
message: import("react").ReactNode;
|
|
525
|
+
filled?: boolean | undefined;
|
|
526
|
+
status?: string | undefined;
|
|
527
|
+
reactElement?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
528
|
+
};
|
|
529
|
+
}) => import("react").JSX.Element | undefined;
|
|
502
530
|
renderProps: any;
|
|
503
531
|
} & {
|
|
504
532
|
doReload(): void;
|
|
@@ -587,8 +615,15 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
587
615
|
message: string | undefined;
|
|
588
616
|
maxHeightReached: boolean;
|
|
589
617
|
ReactComponent: ({ model, }: {
|
|
590
|
-
model:
|
|
591
|
-
|
|
618
|
+
model: {
|
|
619
|
+
error?: unknown;
|
|
620
|
+
reload: () => void;
|
|
621
|
+
message: import("react").ReactNode;
|
|
622
|
+
filled?: boolean | undefined;
|
|
623
|
+
status?: string | undefined;
|
|
624
|
+
reactElement?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
625
|
+
};
|
|
626
|
+
}) => import("react").JSX.Element | undefined;
|
|
592
627
|
renderProps: any;
|
|
593
628
|
} & {
|
|
594
629
|
doReload(): void;
|
|
@@ -792,8 +827,15 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
792
827
|
message: string | undefined;
|
|
793
828
|
maxHeightReached: boolean;
|
|
794
829
|
ReactComponent: ({ model, }: {
|
|
795
|
-
model:
|
|
796
|
-
|
|
830
|
+
model: {
|
|
831
|
+
error?: unknown;
|
|
832
|
+
reload: () => void;
|
|
833
|
+
message: import("react").ReactNode;
|
|
834
|
+
filled?: boolean | undefined;
|
|
835
|
+
status?: string | undefined;
|
|
836
|
+
reactElement?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
837
|
+
};
|
|
838
|
+
}) => import("react").JSX.Element | undefined;
|
|
797
839
|
renderProps: any;
|
|
798
840
|
} & {
|
|
799
841
|
doReload(): void;
|
|
@@ -904,6 +946,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
904
946
|
showCytobandsSetting: boolean;
|
|
905
947
|
trackLabels: string;
|
|
906
948
|
showGridlines: boolean;
|
|
949
|
+
highlight: (Required<import("@jbrowse/core/util").ParsedLocString> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IMaybe<import("mobx-state-tree").IType<Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>>>>) | undefined;
|
|
907
950
|
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
908
951
|
width: number;
|
|
909
952
|
} & {
|
|
@@ -968,6 +1011,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
968
1011
|
setHideHeaderOverview(b: boolean): void;
|
|
969
1012
|
setHideNoTracksActive(b: boolean): void;
|
|
970
1013
|
setShowGridlines(b: boolean): void;
|
|
1014
|
+
setHighlight(highlight: Required<import("@jbrowse/core/util").ParsedLocString> | undefined): void;
|
|
971
1015
|
scrollTo(offsetPx: number): number;
|
|
972
1016
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
973
1017
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -1223,6 +1267,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1223
1267
|
showCytobandsSetting: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
|
|
1224
1268
|
trackLabels: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
1225
1269
|
showGridlines: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
1270
|
+
highlight: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IType<Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>>>;
|
|
1226
1271
|
}, {
|
|
1227
1272
|
width: number;
|
|
1228
1273
|
} & {
|
|
@@ -1287,6 +1332,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1287
1332
|
setHideHeaderOverview(b: boolean): void;
|
|
1288
1333
|
setHideNoTracksActive(b: boolean): void;
|
|
1289
1334
|
setShowGridlines(b: boolean): void;
|
|
1335
|
+
setHighlight(highlight: Required<import("@jbrowse/core/util").ParsedLocString> | undefined): void;
|
|
1290
1336
|
scrollTo(offsetPx: number): number;
|
|
1291
1337
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
1292
1338
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -1552,6 +1598,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1552
1598
|
showCytobandsSetting: boolean;
|
|
1553
1599
|
trackLabels: string;
|
|
1554
1600
|
showGridlines: boolean;
|
|
1601
|
+
highlight: (Required<import("@jbrowse/core/util").ParsedLocString> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IMaybe<import("mobx-state-tree").IType<Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>>>>) | undefined;
|
|
1555
1602
|
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
1556
1603
|
width: number;
|
|
1557
1604
|
} & {
|
|
@@ -1616,6 +1663,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1616
1663
|
setHideHeaderOverview(b: boolean): void;
|
|
1617
1664
|
setHideNoTracksActive(b: boolean): void;
|
|
1618
1665
|
setShowGridlines(b: boolean): void;
|
|
1666
|
+
setHighlight(highlight: Required<import("@jbrowse/core/util").ParsedLocString> | undefined): void;
|
|
1619
1667
|
scrollTo(offsetPx: number): number;
|
|
1620
1668
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
1621
1669
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -1871,6 +1919,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1871
1919
|
showCytobandsSetting: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
|
|
1872
1920
|
trackLabels: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
1873
1921
|
showGridlines: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
1922
|
+
highlight: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IType<Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>>>;
|
|
1874
1923
|
}, {
|
|
1875
1924
|
width: number;
|
|
1876
1925
|
} & {
|
|
@@ -1935,6 +1984,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1935
1984
|
setHideHeaderOverview(b: boolean): void;
|
|
1936
1985
|
setHideNoTracksActive(b: boolean): void;
|
|
1937
1986
|
setShowGridlines(b: boolean): void;
|
|
1987
|
+
setHighlight(highlight: Required<import("@jbrowse/core/util").ParsedLocString> | undefined): void;
|
|
1938
1988
|
scrollTo(offsetPx: number): number;
|
|
1939
1989
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
1940
1990
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -2200,6 +2250,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
2200
2250
|
showCytobandsSetting: boolean;
|
|
2201
2251
|
trackLabels: string;
|
|
2202
2252
|
showGridlines: boolean;
|
|
2253
|
+
highlight: (Required<import("@jbrowse/core/util").ParsedLocString> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IMaybe<import("mobx-state-tree").IType<Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>>>>) | undefined;
|
|
2203
2254
|
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
2204
2255
|
width: number;
|
|
2205
2256
|
} & {
|
|
@@ -2264,6 +2315,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
2264
2315
|
setHideHeaderOverview(b: boolean): void;
|
|
2265
2316
|
setHideNoTracksActive(b: boolean): void;
|
|
2266
2317
|
setShowGridlines(b: boolean): void;
|
|
2318
|
+
setHighlight(highlight: Required<import("@jbrowse/core/util").ParsedLocString> | undefined): void;
|
|
2267
2319
|
scrollTo(offsetPx: number): number;
|
|
2268
2320
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
2269
2321
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -2519,6 +2571,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
2519
2571
|
showCytobandsSetting: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
|
|
2520
2572
|
trackLabels: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
2521
2573
|
showGridlines: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
2574
|
+
highlight: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IType<Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>, Required<import("@jbrowse/core/util").ParsedLocString>>>;
|
|
2522
2575
|
}, {
|
|
2523
2576
|
width: number;
|
|
2524
2577
|
} & {
|
|
@@ -2583,6 +2636,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
2583
2636
|
setHideHeaderOverview(b: boolean): void;
|
|
2584
2637
|
setHideNoTracksActive(b: boolean): void;
|
|
2585
2638
|
setShowGridlines(b: boolean): void;
|
|
2639
|
+
setHighlight(highlight: Required<import("@jbrowse/core/util").ParsedLocString> | undefined): void;
|
|
2586
2640
|
scrollTo(offsetPx: number): number;
|
|
2587
2641
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
2588
2642
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { AlertColor } from '@mui/material';
|
|
3
|
-
export default function BlockMsg({ message, severity,
|
|
3
|
+
export default function BlockMsg({ message, severity, action, }: {
|
|
4
4
|
message: string;
|
|
5
5
|
severity?: AlertColor;
|
|
6
|
-
|
|
7
|
-
icon?: React.ReactNode;
|
|
8
|
-
action?: () => void;
|
|
6
|
+
action?: React.ReactNode;
|
|
9
7
|
}): React.JSX.Element;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Tooltip,
|
|
2
|
+
import { Tooltip, Alert } from '@mui/material';
|
|
3
3
|
import { makeStyles } from 'tss-react/mui';
|
|
4
4
|
const useStyles = makeStyles()({
|
|
5
5
|
ellipses: {
|
|
@@ -7,10 +7,9 @@ const useStyles = makeStyles()({
|
|
|
7
7
|
overflow: 'hidden',
|
|
8
8
|
},
|
|
9
9
|
});
|
|
10
|
-
export default function BlockMsg({ message, severity,
|
|
10
|
+
export default function BlockMsg({ message, severity, action, }) {
|
|
11
11
|
const { classes } = useStyles();
|
|
12
|
-
|
|
13
|
-
return (React.createElement(Alert, { severity: severity, action: button, classes: { message: classes.ellipses } },
|
|
12
|
+
return (React.createElement(Alert, { severity: severity, action: action, classes: { message: classes.ellipses } },
|
|
14
13
|
React.createElement(Tooltip, { title: message },
|
|
15
14
|
React.createElement("div", null, message))));
|
|
16
15
|
}
|
|
@@ -32,8 +32,8 @@ const RenderedBlocks = observer(function ({ model, }) {
|
|
|
32
32
|
if (block instanceof ContentBlock) {
|
|
33
33
|
const state = blockState.get(block.key);
|
|
34
34
|
return (React.createElement(ContentBlockComponent, { block: block, key: `${model.id}-${block.key}` },
|
|
35
|
-
state
|
|
36
|
-
state
|
|
35
|
+
(state === null || state === void 0 ? void 0 : state.ReactComponent) ? (React.createElement(state.ReactComponent, { model: state })) : null,
|
|
36
|
+
(state === null || state === void 0 ? void 0 : state.maxHeightReached) ? (React.createElement("div", { className: classes.heightOverflowed, style: {
|
|
37
37
|
top: state.layout.getTotalHeight() - 16,
|
|
38
38
|
pointerEvents: 'none',
|
|
39
39
|
height: 16,
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
declare const ServerSideRenderedBlockContent: ({ model, }: {
|
|
2
|
-
model:
|
|
3
|
-
|
|
3
|
+
model: {
|
|
4
|
+
error?: unknown;
|
|
5
|
+
reload: () => void;
|
|
6
|
+
message: React.ReactNode;
|
|
7
|
+
filled?: boolean;
|
|
8
|
+
status?: string;
|
|
9
|
+
reactElement?: React.ReactElement;
|
|
10
|
+
};
|
|
11
|
+
}) => React.JSX.Element | undefined;
|
|
4
12
|
export default ServerSideRenderedBlockContent;
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { lazy } from 'react';
|
|
2
|
+
import { Tooltip, IconButton } from '@mui/material';
|
|
2
3
|
import { makeStyles } from 'tss-react/mui';
|
|
3
4
|
import { observer } from 'mobx-react';
|
|
4
5
|
import { getParent } from 'mobx-state-tree';
|
|
5
6
|
import { LoadingEllipses } from '@jbrowse/core/ui';
|
|
7
|
+
import { getSession } from '@jbrowse/core/util';
|
|
6
8
|
// icons
|
|
7
9
|
import RefreshIcon from '@mui/icons-material/Refresh';
|
|
10
|
+
import ReportIcon from '@mui/icons-material/Report';
|
|
8
11
|
// locals
|
|
9
12
|
import BlockMsg from './BlockMsg';
|
|
13
|
+
const ErrorMessageStackTraceDialog = lazy(() => import('@jbrowse/core/ui/ErrorMessageStackTraceDialog'));
|
|
10
14
|
const useStyles = makeStyles()(theme => {
|
|
11
15
|
const bg = theme.palette.action.disabledBackground;
|
|
12
16
|
return {
|
|
@@ -18,11 +22,9 @@ const useStyles = makeStyles()(theme => {
|
|
|
18
22
|
},
|
|
19
23
|
};
|
|
20
24
|
});
|
|
21
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
25
|
const LoadingMessage = observer(({ model }) => {
|
|
23
26
|
const { classes } = useStyles();
|
|
24
27
|
const { status: blockStatus } = model;
|
|
25
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
26
28
|
const { message: displayStatus } = getParent(model, 2);
|
|
27
29
|
const status = displayStatus || blockStatus;
|
|
28
30
|
return (React.createElement("div", { className: classes.loading },
|
|
@@ -30,7 +32,18 @@ const LoadingMessage = observer(({ model }) => {
|
|
|
30
32
|
});
|
|
31
33
|
const ServerSideRenderedBlockContent = observer(function ({ model, }) {
|
|
32
34
|
if (model.error) {
|
|
33
|
-
return (React.createElement(BlockMsg, { message: `${model.error}`, severity: "error",
|
|
35
|
+
return (React.createElement(BlockMsg, { message: `${model.error}`, severity: "error", action: React.createElement(React.Fragment, null,
|
|
36
|
+
React.createElement(Tooltip, { title: "Reload track" },
|
|
37
|
+
React.createElement(IconButton, { "data-testid": "reload_button", onClick: () => model.reload() },
|
|
38
|
+
React.createElement(RefreshIcon, null))),
|
|
39
|
+
React.createElement(Tooltip, { title: "Show stack trace" },
|
|
40
|
+
React.createElement(IconButton, { onClick: () => {
|
|
41
|
+
getSession(model).queueDialog(onClose => [
|
|
42
|
+
ErrorMessageStackTraceDialog,
|
|
43
|
+
{ onClose, error: model.error },
|
|
44
|
+
]);
|
|
45
|
+
} },
|
|
46
|
+
React.createElement(ReportIcon, null)))) }));
|
|
34
47
|
}
|
|
35
48
|
else if (model.message) {
|
|
36
49
|
// the message can be a fully rendered react component, e.g. the region too large message
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
// locals
|
|
3
3
|
import BlockMsg from '../components/BlockMsg';
|
|
4
|
+
import { Button } from '@mui/material';
|
|
4
5
|
function TooLargeMessage({ model, }) {
|
|
5
6
|
const { regionTooLargeReason } = model;
|
|
6
|
-
return (React.createElement(BlockMsg, { severity: "warning", action: () => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
return (React.createElement(BlockMsg, { severity: "warning", action: React.createElement(Button, { onClick: () => {
|
|
8
|
+
model.setFeatureDensityStatsLimit(model.featureDensityStats);
|
|
9
|
+
model.reload();
|
|
10
|
+
} }, "Force load"), message: [
|
|
10
11
|
regionTooLargeReason,
|
|
11
12
|
'Zoom in to see features or force load (may be slow)',
|
|
12
13
|
]
|
|
@@ -58,8 +58,15 @@ export declare const BaseLinearDisplay: import("mobx-state-tree").IModelType<{
|
|
|
58
58
|
message: string | undefined;
|
|
59
59
|
maxHeightReached: boolean;
|
|
60
60
|
ReactComponent: ({ model, }: {
|
|
61
|
-
model:
|
|
62
|
-
|
|
61
|
+
model: {
|
|
62
|
+
error?: unknown;
|
|
63
|
+
reload: () => void;
|
|
64
|
+
message: React.ReactNode;
|
|
65
|
+
filled?: boolean | undefined;
|
|
66
|
+
status?: string | undefined;
|
|
67
|
+
reactElement?: React.ReactElement<any, string | React.JSXElementConstructor<any>> | undefined;
|
|
68
|
+
};
|
|
69
|
+
}) => React.JSX.Element | undefined;
|
|
63
70
|
renderProps: any;
|
|
64
71
|
} & {
|
|
65
72
|
doReload(): void;
|
|
@@ -342,8 +349,15 @@ export declare const BaseLinearDisplay: import("mobx-state-tree").IModelType<{
|
|
|
342
349
|
message: string | undefined;
|
|
343
350
|
maxHeightReached: boolean;
|
|
344
351
|
ReactComponent: ({ model, }: {
|
|
345
|
-
model:
|
|
346
|
-
|
|
352
|
+
model: {
|
|
353
|
+
error?: unknown;
|
|
354
|
+
reload: () => void;
|
|
355
|
+
message: React.ReactNode;
|
|
356
|
+
filled?: boolean | undefined;
|
|
357
|
+
status?: string | undefined;
|
|
358
|
+
reactElement?: React.ReactElement<any, string | React.JSXElementConstructor<any>> | undefined;
|
|
359
|
+
};
|
|
360
|
+
}) => React.JSX.Element | undefined;
|
|
347
361
|
renderProps: any;
|
|
348
362
|
} & {
|
|
349
363
|
doReload(): void;
|
|
@@ -28,8 +28,15 @@ declare const blockState: import("mobx-state-tree").IModelType<{
|
|
|
28
28
|
message: string | undefined;
|
|
29
29
|
maxHeightReached: boolean;
|
|
30
30
|
ReactComponent: ({ model, }: {
|
|
31
|
-
model:
|
|
32
|
-
|
|
31
|
+
model: {
|
|
32
|
+
error?: unknown;
|
|
33
|
+
reload: () => void;
|
|
34
|
+
message: React.ReactNode;
|
|
35
|
+
filled?: boolean | undefined;
|
|
36
|
+
status?: string | undefined;
|
|
37
|
+
reactElement?: React.ReactElement<any, string | React.JSXElementConstructor<any>> | undefined;
|
|
38
|
+
};
|
|
39
|
+
}) => React.JSX.Element | undefined;
|
|
33
40
|
renderProps: any;
|
|
34
41
|
} & {
|
|
35
42
|
doReload(): void;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { when } from '@jbrowse/core/util';
|
|
1
|
+
import { when, parseLocString, } from '@jbrowse/core/util';
|
|
2
2
|
import { handleSelectedRegion } from '../searchUtils';
|
|
3
3
|
export default (pluginManager) => {
|
|
4
4
|
pluginManager.addToExtensionPoint('LaunchView-LinearGenomeView',
|
|
5
5
|
// @ts-expect-error
|
|
6
|
-
async ({ session, assembly, loc, tracks = [], tracklist, nav, }) => {
|
|
6
|
+
async ({ session, assembly, loc, tracks = [], tracklist, nav, highlight, }) => {
|
|
7
7
|
try {
|
|
8
8
|
const { assemblyManager } = session;
|
|
9
|
+
const { isValidRefName } = assemblyManager;
|
|
9
10
|
const view = session.addView('LinearGenomeView', {});
|
|
10
11
|
await when(() => !!view.volatileWidth);
|
|
11
12
|
if (!assembly) {
|
|
@@ -15,18 +16,25 @@ export default (pluginManager) => {
|
|
|
15
16
|
if (!asm) {
|
|
16
17
|
throw new Error(`Assembly "${assembly}" not found when launching linear genome view`);
|
|
17
18
|
}
|
|
18
|
-
await handleSelectedRegion({ input: loc, model: view, assembly: asm });
|
|
19
|
-
const idsNotFound = [];
|
|
20
|
-
tracks.forEach(track => tryTrack(view, track, idsNotFound));
|
|
21
|
-
if (idsNotFound.length) {
|
|
22
|
-
throw new Error(`Could not resolve identifiers: ${idsNotFound.join(',')}`);
|
|
23
|
-
}
|
|
24
19
|
if (tracklist) {
|
|
25
20
|
view.activateTrackSelector();
|
|
26
21
|
}
|
|
27
22
|
if (nav !== undefined) {
|
|
28
23
|
view.setHideHeader(!nav);
|
|
29
24
|
}
|
|
25
|
+
if (highlight !== undefined) {
|
|
26
|
+
const location = parseLocString(highlight, refName => isValidRefName(refName, assembly));
|
|
27
|
+
if ((location === null || location === void 0 ? void 0 : location.start) !== undefined && (location === null || location === void 0 ? void 0 : location.end) !== undefined) {
|
|
28
|
+
location.assemblyName = assembly;
|
|
29
|
+
view.setHighlight(location);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
await handleSelectedRegion({ input: loc, model: view, assembly: asm });
|
|
33
|
+
const idsNotFound = [];
|
|
34
|
+
tracks.forEach(track => tryTrack(view, track, idsNotFound));
|
|
35
|
+
if (idsNotFound.length) {
|
|
36
|
+
throw new Error(`Could not resolve identifiers: ${idsNotFound.join(',')}`);
|
|
37
|
+
}
|
|
30
38
|
}
|
|
31
39
|
catch (e) {
|
|
32
40
|
session.notify(`${e}`, 'error');
|
|
@@ -42,8 +42,15 @@ export declare function stateModelFactory(configSchema: AnyConfigurationSchemaTy
|
|
|
42
42
|
message: string | undefined;
|
|
43
43
|
maxHeightReached: boolean;
|
|
44
44
|
ReactComponent: ({ model, }: {
|
|
45
|
-
model:
|
|
46
|
-
|
|
45
|
+
model: {
|
|
46
|
+
error?: unknown;
|
|
47
|
+
reload: () => void;
|
|
48
|
+
message: import("react").ReactNode;
|
|
49
|
+
filled?: boolean | undefined;
|
|
50
|
+
status?: string | undefined;
|
|
51
|
+
reactElement?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
52
|
+
};
|
|
53
|
+
}) => import("react").JSX.Element | undefined;
|
|
47
54
|
renderProps: any;
|
|
48
55
|
} & {
|
|
49
56
|
doReload(): void;
|
|
@@ -267,8 +274,15 @@ export declare function stateModelFactory(configSchema: AnyConfigurationSchemaTy
|
|
|
267
274
|
message: string | undefined;
|
|
268
275
|
maxHeightReached: boolean;
|
|
269
276
|
ReactComponent: ({ model, }: {
|
|
270
|
-
model:
|
|
271
|
-
|
|
277
|
+
model: {
|
|
278
|
+
error?: unknown;
|
|
279
|
+
reload: () => void;
|
|
280
|
+
message: import("react").ReactNode;
|
|
281
|
+
filled?: boolean | undefined;
|
|
282
|
+
status?: string | undefined;
|
|
283
|
+
reactElement?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
284
|
+
};
|
|
285
|
+
}) => import("react").JSX.Element | undefined;
|
|
272
286
|
renderProps: any;
|
|
273
287
|
} & {
|
|
274
288
|
doReload(): void;
|
|
@@ -47,8 +47,17 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
47
47
|
message: string | undefined;
|
|
48
48
|
maxHeightReached: boolean;
|
|
49
49
|
ReactComponent: ({ model, }: {
|
|
50
|
-
model:
|
|
51
|
-
|
|
50
|
+
model: {
|
|
51
|
+
error?: unknown;
|
|
52
|
+
reload: () => void;
|
|
53
|
+
message: import("react").ReactNode;
|
|
54
|
+
filled?: boolean | undefined;
|
|
55
|
+
status?: string | undefined; /**
|
|
56
|
+
* #getter
|
|
57
|
+
*/
|
|
58
|
+
reactElement?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
59
|
+
};
|
|
60
|
+
}) => import("react").JSX.Element | undefined;
|
|
52
61
|
renderProps: any;
|
|
53
62
|
} & {
|
|
54
63
|
doReload(): void;
|
|
@@ -343,8 +352,17 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
343
352
|
message: string | undefined;
|
|
344
353
|
maxHeightReached: boolean;
|
|
345
354
|
ReactComponent: ({ model, }: {
|
|
346
|
-
model:
|
|
347
|
-
|
|
355
|
+
model: {
|
|
356
|
+
error?: unknown;
|
|
357
|
+
reload: () => void;
|
|
358
|
+
message: import("react").ReactNode;
|
|
359
|
+
filled?: boolean | undefined;
|
|
360
|
+
status?: string | undefined; /**
|
|
361
|
+
* #getter
|
|
362
|
+
*/
|
|
363
|
+
reactElement?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
364
|
+
};
|
|
365
|
+
}) => import("react").JSX.Element | undefined;
|
|
348
366
|
renderProps: any;
|
|
349
367
|
} & {
|
|
350
368
|
doReload(): void;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import React, { useRef, useState } from 'react';
|
|
2
|
+
import { observer } from 'mobx-react';
|
|
3
|
+
import { makeStyles } from 'tss-react/mui';
|
|
4
|
+
import { colord } from '@jbrowse/core/util/colord';
|
|
5
|
+
import { getSession, } from '@jbrowse/core/util';
|
|
6
|
+
import { Menu } from '@jbrowse/core/ui';
|
|
7
|
+
import { IconButton, Tooltip, useTheme } from '@mui/material';
|
|
8
|
+
// icons
|
|
9
|
+
import LinkIcon from '@mui/icons-material/Link';
|
|
10
|
+
import CloseIcon from '@mui/icons-material/Close';
|
|
11
|
+
import BookmarkIcon from '@mui/icons-material/Bookmark';
|
|
12
|
+
const useStyles = makeStyles()(theme => {
|
|
13
|
+
var _a, _b, _c, _d, _e, _f;
|
|
14
|
+
return ({
|
|
15
|
+
highlight: {
|
|
16
|
+
height: '100%',
|
|
17
|
+
position: 'absolute',
|
|
18
|
+
background: `${colord((_b = (_a = theme.palette.quaternary) === null || _a === void 0 ? void 0 : _a.main) !== null && _b !== void 0 ? _b : 'goldenrod')
|
|
19
|
+
.alpha(0.35)
|
|
20
|
+
.toRgbString()}`,
|
|
21
|
+
borderLeft: `1px solid ${(_d = (_c = theme.palette.quaternary) === null || _c === void 0 ? void 0 : _c.main) !== null && _d !== void 0 ? _d : 'goldenrod'}`,
|
|
22
|
+
borderRight: `1px solid ${(_f = (_e = theme.palette.quaternary) === null || _e === void 0 ? void 0 : _e.main) !== null && _f !== void 0 ? _f : 'goldenrod'}`,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
const Highlight = observer(function Highlight({ model }) {
|
|
27
|
+
var _a, _b;
|
|
28
|
+
const { classes } = useStyles();
|
|
29
|
+
const [open, setOpen] = useState(false);
|
|
30
|
+
const anchorEl = useRef(null);
|
|
31
|
+
const color = (_b = (_a = useTheme().palette.quaternary) === null || _a === void 0 ? void 0 : _a.main) !== null && _b !== void 0 ? _b : 'goldenrod';
|
|
32
|
+
const session = getSession(model);
|
|
33
|
+
const dismissHighlight = () => {
|
|
34
|
+
model.setHighlight(undefined);
|
|
35
|
+
};
|
|
36
|
+
const menuItems = [
|
|
37
|
+
{
|
|
38
|
+
label: 'Dismiss highlight',
|
|
39
|
+
icon: CloseIcon,
|
|
40
|
+
onClick: () => dismissHighlight(),
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
label: 'Bookmark highlighted region',
|
|
44
|
+
icon: BookmarkIcon,
|
|
45
|
+
onClick: () => {
|
|
46
|
+
let bookmarkWidget = session.widgets.get('GridBookmark');
|
|
47
|
+
if (!bookmarkWidget) {
|
|
48
|
+
bookmarkWidget = session.addWidget('GridBookmarkWidget', 'GridBookmark');
|
|
49
|
+
}
|
|
50
|
+
// @ts-ignore
|
|
51
|
+
bookmarkWidget.addBookmark(model.highlight);
|
|
52
|
+
dismissHighlight();
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
function handleClose() {
|
|
57
|
+
setOpen(false);
|
|
58
|
+
}
|
|
59
|
+
if (!model.highlight) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
// coords
|
|
63
|
+
const mapCoords = (r) => {
|
|
64
|
+
const s = model.bpToPx({
|
|
65
|
+
refName: r.refName,
|
|
66
|
+
coord: r.start,
|
|
67
|
+
});
|
|
68
|
+
const e = model.bpToPx({
|
|
69
|
+
refName: r.refName,
|
|
70
|
+
coord: r.end,
|
|
71
|
+
});
|
|
72
|
+
return s && e
|
|
73
|
+
? {
|
|
74
|
+
width: Math.max(Math.abs(e.offsetPx - s.offsetPx), 3),
|
|
75
|
+
left: Math.min(s.offsetPx, e.offsetPx) - model.offsetPx,
|
|
76
|
+
}
|
|
77
|
+
: undefined;
|
|
78
|
+
};
|
|
79
|
+
const h = mapCoords(model.highlight);
|
|
80
|
+
return (React.createElement(React.Fragment, null, h ? (React.createElement("div", { className: classes.highlight, style: {
|
|
81
|
+
left: h.left,
|
|
82
|
+
width: h.width,
|
|
83
|
+
} },
|
|
84
|
+
React.createElement(Tooltip, { title: 'Highlighted from URL parameter', arrow: true },
|
|
85
|
+
React.createElement(IconButton, { ref: anchorEl, onClick: () => setOpen(true) },
|
|
86
|
+
React.createElement(LinkIcon, { fontSize: "small", sx: {
|
|
87
|
+
color: `${colord(color).darken(0.2).toRgbString()}`,
|
|
88
|
+
} }))),
|
|
89
|
+
React.createElement(Menu, { anchorEl: anchorEl.current, onMenuItemClick: (_event, callback) => {
|
|
90
|
+
callback(session);
|
|
91
|
+
handleClose();
|
|
92
|
+
}, open: open, onClose: handleClose, menuItems: menuItems }))) : null));
|
|
93
|
+
});
|
|
94
|
+
export default Highlight;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel';
|
|
3
|
+
import { LinearGenomeViewModel } from '../model';
|
|
4
|
+
type LGV = LinearGenomeViewModel;
|
|
5
|
+
declare const OverviewHighlight: ({ model, overview, }: {
|
|
6
|
+
model: LGV;
|
|
7
|
+
overview: Base1DViewModel;
|
|
8
|
+
}) => React.JSX.Element | null;
|
|
9
|
+
export default OverviewHighlight;
|