@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.
Files changed (43) hide show
  1. package/dist/BaseLinearDisplay/components/BlockMsg.d.ts +2 -4
  2. package/dist/BaseLinearDisplay/components/BlockMsg.js +2 -3
  3. package/dist/BaseLinearDisplay/components/LinearBlocks.js +2 -2
  4. package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.d.ts +10 -2
  5. package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +40 -4
  6. package/dist/BaseLinearDisplay/components/TooLargeMessage.js +5 -4
  7. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +18 -4
  8. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.d.ts +9 -2
  9. package/dist/LaunchLinearGenomeView/index.js +15 -7
  10. package/dist/LinearBareDisplay/model.d.ts +18 -4
  11. package/dist/LinearBasicDisplay/model.d.ts +22 -4
  12. package/dist/LinearGenomeView/components/Highlight.d.ts +7 -0
  13. package/dist/LinearGenomeView/components/Highlight.js +122 -0
  14. package/dist/LinearGenomeView/components/OverviewHighlight.d.ts +9 -0
  15. package/dist/LinearGenomeView/components/OverviewHighlight.js +53 -0
  16. package/dist/LinearGenomeView/components/OverviewScalebar.js +3 -1
  17. package/dist/LinearGenomeView/components/TracksContainer.js +2 -0
  18. package/dist/LinearGenomeView/model.d.ts +5 -0
  19. package/dist/LinearGenomeView/model.js +11 -0
  20. package/dist/LinearGenomeView/util.d.ts +1 -1
  21. package/dist/index.d.ts +66 -12
  22. package/esm/BaseLinearDisplay/components/BlockMsg.d.ts +2 -4
  23. package/esm/BaseLinearDisplay/components/BlockMsg.js +3 -4
  24. package/esm/BaseLinearDisplay/components/LinearBlocks.js +2 -2
  25. package/esm/BaseLinearDisplay/components/ServerSideRenderedBlockContent.d.ts +10 -2
  26. package/esm/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +17 -4
  27. package/esm/BaseLinearDisplay/components/TooLargeMessage.js +5 -4
  28. package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +18 -4
  29. package/esm/BaseLinearDisplay/models/serverSideRenderedBlock.d.ts +9 -2
  30. package/esm/LaunchLinearGenomeView/index.js +16 -8
  31. package/esm/LinearBareDisplay/model.d.ts +18 -4
  32. package/esm/LinearBasicDisplay/model.d.ts +22 -4
  33. package/esm/LinearGenomeView/components/Highlight.d.ts +7 -0
  34. package/esm/LinearGenomeView/components/Highlight.js +94 -0
  35. package/esm/LinearGenomeView/components/OverviewHighlight.d.ts +9 -0
  36. package/esm/LinearGenomeView/components/OverviewHighlight.js +48 -0
  37. package/esm/LinearGenomeView/components/OverviewScalebar.js +3 -1
  38. package/esm/LinearGenomeView/components/TracksContainer.js +2 -0
  39. package/esm/LinearGenomeView/model.d.ts +5 -0
  40. package/esm/LinearGenomeView/model.js +11 -0
  41. package/esm/LinearGenomeView/util.d.ts +1 -1
  42. package/esm/index.d.ts +66 -12
  43. 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: any;
42
- }) => any;
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: any;
87
- }) => any;
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: any;
296
- }) => any;
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: any;
501
- }) => any;
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: any;
591
- }) => any;
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: any;
796
- }) => any;
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, buttonText, icon, action, }: {
3
+ export default function BlockMsg({ message, severity, action, }: {
4
4
  message: string;
5
5
  severity?: AlertColor;
6
- buttonText?: string;
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, Button, Alert } from '@mui/material';
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, buttonText, icon, action, }) {
10
+ export default function BlockMsg({ message, severity, action, }) {
11
11
  const { classes } = useStyles();
12
- const button = action ? (React.createElement(Button, { "data-testid": "reload_button", onClick: action, startIcon: icon }, buttonText)) : null;
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 && state.ReactComponent ? (React.createElement(state.ReactComponent, { model: state })) : null,
36
- state && state.maxHeightReached ? (React.createElement("div", { className: classes.heightOverflowed, style: {
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: any;
3
- }) => any;
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", buttonText: "reload", icon: React.createElement(RefreshIcon, null), action: model.reload }));
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
- model.setFeatureDensityStatsLimit(model.featureDensityStats);
8
- model.reload();
9
- }, buttonText: "Force load", message: [
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: any;
62
- }) => any;
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: any;
346
- }) => any;
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: any;
32
- }) => any;
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: any;
46
- }) => any;
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: any;
271
- }) => any;
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: any;
51
- }) => any;
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: any;
347
- }) => any;
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,7 @@
1
+ import React from 'react';
2
+ import { LinearGenomeViewModel } from '../model';
3
+ type LGV = LinearGenomeViewModel;
4
+ declare const Highlight: ({ model }: {
5
+ model: LGV;
6
+ }) => React.JSX.Element | null;
7
+ export default Highlight;
@@ -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;