@jbrowse/plugin-linear-comparative-view 3.2.0 → 3.4.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.
Files changed (25) hide show
  1. package/dist/LGVSyntenyDisplay/model.d.ts +1 -1
  2. package/dist/LinearComparativeView/model.d.ts +8 -6
  3. package/dist/LinearSyntenyView/components/ImportForm/ImportSyntenyOpenCustomTrack.js +2 -2
  4. package/dist/LinearSyntenyView/model.d.ts +8 -6
  5. package/dist/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.js +1 -1
  6. package/dist/SyntenyFeatureDetail/Formatter.d.ts +3 -0
  7. package/dist/SyntenyFeatureDetail/Formatter.js +23 -0
  8. package/dist/SyntenyFeatureDetail/LinkToSyntenyView.d.ts +3 -1
  9. package/dist/SyntenyFeatureDetail/LinkToSyntenyView.js +7 -7
  10. package/dist/SyntenyFeatureDetail/SyntenyFeatureDetail.d.ts +1 -1
  11. package/dist/SyntenyFeatureDetail/SyntenyFeatureDetail.js +7 -3
  12. package/dist/SyntenyFeatureDetail/types.d.ts +1 -1
  13. package/esm/LGVSyntenyDisplay/model.d.ts +1 -1
  14. package/esm/LinearComparativeView/model.d.ts +8 -6
  15. package/esm/LinearSyntenyView/components/ImportForm/ImportSyntenyOpenCustomTrack.js +3 -3
  16. package/esm/LinearSyntenyView/model.d.ts +8 -6
  17. package/esm/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.js +1 -1
  18. package/esm/SyntenyFeatureDetail/Formatter.d.ts +3 -0
  19. package/esm/SyntenyFeatureDetail/Formatter.js +17 -0
  20. package/esm/SyntenyFeatureDetail/LinkToSyntenyView.d.ts +3 -1
  21. package/esm/SyntenyFeatureDetail/LinkToSyntenyView.js +7 -7
  22. package/esm/SyntenyFeatureDetail/SyntenyFeatureDetail.d.ts +1 -1
  23. package/esm/SyntenyFeatureDetail/SyntenyFeatureDetail.js +7 -3
  24. package/esm/SyntenyFeatureDetail/types.d.ts +1 -1
  25. package/package.json +7 -7
@@ -201,7 +201,7 @@ declare function stateModelFactory(schema: AnyConfigurationSchemaType): import("
201
201
  } & {
202
202
  addBlock(key: string, block: import("@jbrowse/core/util/blockTypes").BaseBlock): void;
203
203
  deleteBlock(key: string): void;
204
- selectFeature(feature: Feature): void;
204
+ selectFeature(feature: Feature): Promise<void>;
205
205
  navToFeature(feature: Feature): void;
206
206
  clearFeatureSelection(): void;
207
207
  setFeatureIdUnderMouse(feature?: string): void;
@@ -188,12 +188,13 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
188
188
  setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
189
189
  } & {
190
190
  moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
191
- navToLocString(input: string, optAssemblyName?: string): Promise<void>;
191
+ navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
192
192
  navToSearchString({ input, assembly, }: {
193
193
  input: string;
194
194
  assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
195
195
  }): Promise<void>;
196
- navToLocations(parsedLocStrings: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string): Promise<void>;
196
+ navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
197
+ navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
197
198
  navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
198
199
  navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
199
200
  } & {
@@ -261,9 +262,9 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
261
262
  displayName: string | undefined;
262
263
  tracks: any[];
263
264
  minimized: boolean;
264
- displayedRegions: import("@jbrowse/core/util").Region[];
265
265
  offsetPx: number;
266
266
  bpPerPx: number;
267
+ displayedRegions: import("@jbrowse/core/util").Region[];
267
268
  hideHeader: boolean;
268
269
  hideHeaderOverview: boolean;
269
270
  hideNoTracksActive: boolean;
@@ -502,12 +503,13 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
502
503
  setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
503
504
  } & {
504
505
  moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
505
- navToLocString(input: string, optAssemblyName?: string): Promise<void>;
506
+ navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
506
507
  navToSearchString({ input, assembly, }: {
507
508
  input: string;
508
509
  assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
509
510
  }): Promise<void>;
510
- navToLocations(parsedLocStrings: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string): Promise<void>;
511
+ navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
512
+ navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
511
513
  navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
512
514
  navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
513
515
  } & {
@@ -575,9 +577,9 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
575
577
  displayName: string | undefined;
576
578
  tracks: any[];
577
579
  minimized: boolean;
578
- displayedRegions: import("@jbrowse/core/util").Region[];
579
580
  offsetPx: number;
580
581
  bpPerPx: number;
582
+ displayedRegions: import("@jbrowse/core/util").Region[];
581
583
  hideHeader: boolean;
582
584
  hideHeaderOverview: boolean;
583
585
  hideNoTracksActive: boolean;
@@ -73,7 +73,7 @@ const ImportSyntenyOpenCustomTrack = (0, mobx_react_1.observer)(function ({ mode
73
73
  };
74
74
  return ((0, jsx_runtime_1.jsxs)(material_1.Paper, { style: { padding: 12 }, children: [error ? (0, jsx_runtime_1.jsx)(ui_1.ErrorMessage, { error: error }) : null, (0, jsx_runtime_1.jsx)(material_1.Typography, { style: { textAlign: 'center' }, children: "Add a .paf (minimap2), .delta (Mummer), .chain (UCSC liftover), .anchors or .anchors.simple (MCScan), or .pif.gz (jbrowse CLI make-pif) file to view. These file types can also be gzipped." }), (0, jsx_runtime_1.jsx)(material_1.RadioGroup, { value: radioOption, onChange: event => {
75
75
  setValue(event.target.value);
76
- }, children: (0, jsx_runtime_1.jsx)(material_1.Grid2, { container: true, justifyContent: "center", children: [
76
+ }, children: (0, jsx_runtime_1.jsx)(material_1.Grid, { container: true, justifyContent: "center", children: [
77
77
  '.paf',
78
78
  '.delta',
79
79
  '.out',
@@ -81,7 +81,7 @@ const ImportSyntenyOpenCustomTrack = (0, mobx_react_1.observer)(function ({ mode
81
81
  '.anchors',
82
82
  '.anchors.simple',
83
83
  '.pif.gz',
84
- ].map(extension => ((0, jsx_runtime_1.jsx)(material_1.FormControlLabel, { value: extension, control: (0, jsx_runtime_1.jsx)(material_1.Radio, {}), label: extension }, extension))) }) }), (0, jsx_runtime_1.jsx)(material_1.Grid2, { container: true, justifyContent: "center", children: radioOption === '.paf' ||
84
+ ].map(extension => ((0, jsx_runtime_1.jsx)(material_1.FormControlLabel, { value: extension, control: (0, jsx_runtime_1.jsx)(material_1.Radio, {}), label: extension }, extension))) }) }), (0, jsx_runtime_1.jsx)(material_1.Grid, { container: true, justifyContent: "center", children: radioOption === '.paf' ||
85
85
  radioOption === '.out' ||
86
86
  radioOption === '.delta' ||
87
87
  radioOption === '.chain' ||
@@ -205,12 +205,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
205
205
  setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
206
206
  } & {
207
207
  moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
208
- navToLocString(input: string, optAssemblyName?: string): Promise<void>;
208
+ navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
209
209
  navToSearchString({ input, assembly, }: {
210
210
  input: string;
211
211
  assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
212
212
  }): Promise<void>;
213
- navToLocations(parsedLocStrings: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string): Promise<void>;
213
+ navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
214
+ navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
214
215
  navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
215
216
  navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
216
217
  } & {
@@ -278,9 +279,9 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
278
279
  displayName: string | undefined;
279
280
  tracks: any[];
280
281
  minimized: boolean;
281
- displayedRegions: import("@jbrowse/core/util").Region[];
282
282
  offsetPx: number;
283
283
  bpPerPx: number;
284
+ displayedRegions: import("@jbrowse/core/util").Region[];
284
285
  hideHeader: boolean;
285
286
  hideHeaderOverview: boolean;
286
287
  hideNoTracksActive: boolean;
@@ -586,12 +587,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
586
587
  setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
587
588
  } & {
588
589
  moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
589
- navToLocString(input: string, optAssemblyName?: string): Promise<void>;
590
+ navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
590
591
  navToSearchString({ input, assembly, }: {
591
592
  input: string;
592
593
  assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
593
594
  }): Promise<void>;
594
- navToLocations(parsedLocStrings: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string): Promise<void>;
595
+ navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
596
+ navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
595
597
  navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
596
598
  navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
597
599
  } & {
@@ -659,9 +661,9 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
659
661
  displayName: string | undefined;
660
662
  tracks: any[];
661
663
  minimized: boolean;
662
- displayedRegions: import("@jbrowse/core/util").Region[];
663
664
  offsetPx: number;
664
665
  bpPerPx: number;
666
+ displayedRegions: import("@jbrowse/core/util").Region[];
665
667
  hideHeader: boolean;
666
668
  hideHeaderOverview: boolean;
667
669
  hideNoTracksActive: boolean;
@@ -73,7 +73,7 @@ async function renderToSvg(model, opts) {
73
73
  const rendering = renderings[i - 1];
74
74
  const height = heights[i];
75
75
  const levelHeight = level.height || 0;
76
- RenderList.push((0, jsx_runtime_1.jsxs)("g", { transform: `translate(0 ${currOffset})`, children: [levelHeight ? ((0, jsx_runtime_1.jsx)("defs", { children: (0, jsx_runtime_1.jsx)("clipPath", { id: `synclip-${i}`, children: (0, jsx_runtime_1.jsx)("rect", { x: 0, y: 0, width: width, height: levelHeight }) }) })) : null, (0, jsx_runtime_1.jsx)("g", { transform: `translate(${shift + trackLabelOffset} ${fontSize})`, clipPath: `url(#synclip-${i})`, children: rendering === null || rendering === void 0 ? void 0 : rendering.map((r, i) => ((0, jsx_runtime_1.jsx)(util_1.ReactRendering, { rendering: r }, i))) }), (0, jsx_runtime_1.jsx)("g", { transform: `translate(0 ${levelHeight})`, children: (0, jsx_runtime_1.jsx)(SVGLinearGenomeView_1.default, { rulerHeight: rulerHeight, shift: shift, trackLabelOffset: trackLabelOffset, textHeight: textHeight, trackLabels: trackLabels, displayResults: displayResults[i], view: view, fontSize: fontSize }, view.id) })] }, view.id));
76
+ RenderList.push((0, jsx_runtime_1.jsxs)("g", { transform: `translate(0 ${currOffset})`, children: [levelHeight ? ((0, jsx_runtime_1.jsx)("defs", { children: (0, jsx_runtime_1.jsx)("clipPath", { id: `synclip-${i}`, children: (0, jsx_runtime_1.jsx)("rect", { x: 0, y: 0, width: width, height: levelHeight }) }) })) : null, (0, jsx_runtime_1.jsx)("g", { transform: `translate(${shift + trackLabelOffset} ${fontSize})`, clipPath: `url(#synclip-${i})`, children: rendering === null || rendering === void 0 ? void 0 : rendering.map((r, i) => (0, jsx_runtime_1.jsx)(util_1.ReactRendering, { rendering: r }, i)) }), (0, jsx_runtime_1.jsx)("g", { transform: `translate(0 ${levelHeight})`, children: (0, jsx_runtime_1.jsx)(SVGLinearGenomeView_1.default, { rulerHeight: rulerHeight, shift: shift, trackLabelOffset: trackLabelOffset, textHeight: textHeight, trackLabels: trackLabels, displayResults: displayResults[i], view: view, fontSize: fontSize }, view.id) })] }, view.id));
77
77
  currOffset += height + fontSize + rulerHeight + levelHeight;
78
78
  }
79
79
  return (0, util_1.renderToStaticMarkup)((0, jsx_runtime_1.jsx)(material_1.ThemeProvider, { theme: theme, children: (0, jsx_runtime_1.jsx)(Wrapper, { children: (0, jsx_runtime_1.jsxs)("svg", { width: width, height: totalHeightSvg, xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink", viewBox: [0, 0, w + shift * 2, totalHeightSvg].toString(), children: [(0, jsx_runtime_1.jsx)(SVGBackground_1.default, { width: w, height: totalHeightSvg, shift: shift }), RenderList] }) }) }));
@@ -0,0 +1,3 @@
1
+ export default function Formatter({ value }: {
2
+ value: unknown;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = Formatter;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
9
+ const copy_to_clipboard_1 = __importDefault(require("copy-to-clipboard"));
10
+ function Formatter({ value }) {
11
+ const [show, setShow] = (0, react_1.useState)(false);
12
+ const [copied, setCopied] = (0, react_1.useState)(false);
13
+ const display = String(value);
14
+ return display.length > 100 ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => {
15
+ (0, copy_to_clipboard_1.default)(display);
16
+ setCopied(true);
17
+ setTimeout(() => {
18
+ setCopied(false);
19
+ }, 700);
20
+ }, children: copied ? 'Copied to clipboard' : 'Copy' }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => {
21
+ setShow(val => !val);
22
+ }, children: show ? 'Show less' : 'Show more' }), (0, jsx_runtime_1.jsx)("div", { children: show ? display : `${display.slice(0, 100)}...` })] })) : ((0, jsx_runtime_1.jsx)("div", { children: display }));
23
+ }
@@ -1,5 +1,7 @@
1
1
  import type { SyntenyFeatureDetailModel } from './types';
2
- declare const LinkToSyntenyView: ({ model, }: {
2
+ import type { SimpleFeatureSerialized } from '@jbrowse/core/util';
3
+ declare const LinkToSyntenyView: ({ model, feat, }: {
3
4
  model: SyntenyFeatureDetailModel;
5
+ feat: SimpleFeatureSerialized;
4
6
  }) => import("react/jsx-runtime").JSX.Element;
5
7
  export default LinkToSyntenyView;
@@ -39,19 +39,19 @@ const util_1 = require("@jbrowse/core/util");
39
39
  const material_1 = require("@mui/material");
40
40
  const mobx_react_1 = require("mobx-react");
41
41
  const LaunchSyntenyViewDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('../LGVSyntenyDisplay/components/LaunchSyntenyViewDialog'))));
42
- const LinkToSyntenyView = (0, mobx_react_1.observer)(function ({ model, }) {
43
- const { featureData, view, level, trackId } = model;
42
+ const LinkToSyntenyView = (0, mobx_react_1.observer)(function ({ model, feat, }) {
43
+ const { view, level, trackId } = model;
44
44
  return ((0, jsx_runtime_1.jsxs)("ul", { children: [view.type === 'LinearSyntenyView' ? ((0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsx)(material_1.Link, { href: "#", onClick: event => {
45
45
  var _a, _b;
46
46
  event.preventDefault();
47
47
  const { views } = view;
48
48
  if (level !== undefined) {
49
- (_a = views[level]) === null || _a === void 0 ? void 0 : _a.navTo(featureData);
50
- (_b = views[level + 1]) === null || _b === void 0 ? void 0 : _b.navTo(featureData.mate);
49
+ (_a = views[level]) === null || _a === void 0 ? void 0 : _a.navTo(feat);
50
+ (_b = views[level + 1]) === null || _b === void 0 ? void 0 : _b.navTo(feat.mate);
51
51
  }
52
52
  else {
53
- const f1 = featureData;
54
- const f2 = featureData.mate;
53
+ const f1 = feat;
54
+ const f2 = feat.mate;
55
55
  const r1 = f1.assemblyName;
56
56
  const r2 = f2.assemblyName;
57
57
  const v1 = views.find(view => view.assemblyNames[0] === r1);
@@ -71,7 +71,7 @@ const LinkToSyntenyView = (0, mobx_react_1.observer)(function ({ model, }) {
71
71
  }
72
72
  }, children: "Center view on this feature" }) })) : null, (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsx)(material_1.Link, { href: "#", onClick: event => {
73
73
  event.preventDefault();
74
- const feature = new util_1.SimpleFeature(featureData);
74
+ const feature = new util_1.SimpleFeature(feat);
75
75
  const session = (0, util_1.getSession)(model);
76
76
  session.queueDialog(handleClose => [
77
77
  LaunchSyntenyViewDialog,
@@ -1,5 +1,5 @@
1
1
  import type { SyntenyFeatureDetailModel } from './types';
2
- declare const SyntenyFeatureDetail: ({ model, }: {
2
+ declare const SyntenyFeatureDetail: (props: {
3
3
  model: SyntenyFeatureDetailModel;
4
4
  }) => import("react/jsx-runtime").JSX.Element;
5
5
  export default SyntenyFeatureDetail;
@@ -4,12 +4,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const jsx_runtime_1 = require("react/jsx-runtime");
7
- const BaseFeatureDetail_1 = __importDefault(require("@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail"));
8
7
  const BaseCard_1 = __importDefault(require("@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/BaseCard"));
8
+ const FeatureDetails_1 = __importDefault(require("@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails"));
9
9
  const material_1 = require("@mui/material");
10
10
  const mobx_react_1 = require("mobx-react");
11
+ const Formatter_1 = __importDefault(require("./Formatter"));
11
12
  const LinkToSyntenyView_1 = __importDefault(require("./LinkToSyntenyView"));
12
- const SyntenyFeatureDetail = (0, mobx_react_1.observer)(function ({ model, }) {
13
- return ((0, jsx_runtime_1.jsxs)(material_1.Paper, { children: [(0, jsx_runtime_1.jsx)(BaseFeatureDetail_1.default, { title: "Feature", model: model }), (0, jsx_runtime_1.jsx)(BaseCard_1.default, { title: "Link to view", children: (0, jsx_runtime_1.jsx)(LinkToSyntenyView_1.default, { model: model }) })] }));
13
+ const SyntenyFeatureDetail = (0, mobx_react_1.observer)(function (props) {
14
+ const { model } = props;
15
+ const { featureData } = model;
16
+ const feat = structuredClone(featureData);
17
+ return feat ? ((0, jsx_runtime_1.jsxs)(material_1.Paper, { children: [(0, jsx_runtime_1.jsx)(FeatureDetails_1.default, { ...props, feature: feat, formatter: value => (0, jsx_runtime_1.jsx)(Formatter_1.default, { value: value }) }), (0, jsx_runtime_1.jsx)(BaseCard_1.default, { title: "Link to view", children: (0, jsx_runtime_1.jsx)(LinkToSyntenyView_1.default, { model: model, feat: feat }) })] })) : ((0, jsx_runtime_1.jsx)("div", { children: "No feature loaded, may not be available after page refresh because it was too large for localStorage" }));
14
18
  });
15
19
  exports.default = SyntenyFeatureDetail;
@@ -1,7 +1,7 @@
1
1
  import type { SimpleFeatureSerialized } from '@jbrowse/core/util';
2
2
  export interface SyntenyFeatureDetailModel {
3
3
  trackId: string;
4
- featureData: SimpleFeatureSerialized;
4
+ featureData?: SimpleFeatureSerialized;
5
5
  level?: number;
6
6
  view: {
7
7
  type: string;
@@ -201,7 +201,7 @@ declare function stateModelFactory(schema: AnyConfigurationSchemaType): import("
201
201
  } & {
202
202
  addBlock(key: string, block: import("@jbrowse/core/util/blockTypes").BaseBlock): void;
203
203
  deleteBlock(key: string): void;
204
- selectFeature(feature: Feature): void;
204
+ selectFeature(feature: Feature): Promise<void>;
205
205
  navToFeature(feature: Feature): void;
206
206
  clearFeatureSelection(): void;
207
207
  setFeatureIdUnderMouse(feature?: string): void;
@@ -188,12 +188,13 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
188
188
  setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
189
189
  } & {
190
190
  moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
191
- navToLocString(input: string, optAssemblyName?: string): Promise<void>;
191
+ navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
192
192
  navToSearchString({ input, assembly, }: {
193
193
  input: string;
194
194
  assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
195
195
  }): Promise<void>;
196
- navToLocations(parsedLocStrings: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string): Promise<void>;
196
+ navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
197
+ navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
197
198
  navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
198
199
  navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
199
200
  } & {
@@ -261,9 +262,9 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
261
262
  displayName: string | undefined;
262
263
  tracks: any[];
263
264
  minimized: boolean;
264
- displayedRegions: import("@jbrowse/core/util").Region[];
265
265
  offsetPx: number;
266
266
  bpPerPx: number;
267
+ displayedRegions: import("@jbrowse/core/util").Region[];
267
268
  hideHeader: boolean;
268
269
  hideHeaderOverview: boolean;
269
270
  hideNoTracksActive: boolean;
@@ -502,12 +503,13 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
502
503
  setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
503
504
  } & {
504
505
  moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
505
- navToLocString(input: string, optAssemblyName?: string): Promise<void>;
506
+ navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
506
507
  navToSearchString({ input, assembly, }: {
507
508
  input: string;
508
509
  assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
509
510
  }): Promise<void>;
510
- navToLocations(parsedLocStrings: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string): Promise<void>;
511
+ navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
512
+ navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
511
513
  navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
512
514
  navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
513
515
  } & {
@@ -575,9 +577,9 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
575
577
  displayName: string | undefined;
576
578
  tracks: any[];
577
579
  minimized: boolean;
578
- displayedRegions: import("@jbrowse/core/util").Region[];
579
580
  offsetPx: number;
580
581
  bpPerPx: number;
582
+ displayedRegions: import("@jbrowse/core/util").Region[];
581
583
  hideHeader: boolean;
582
584
  hideHeaderOverview: boolean;
583
585
  hideNoTracksActive: boolean;
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useState } from 'react';
3
3
  import { ErrorMessage, FileSelector } from '@jbrowse/core/ui';
4
4
  import HelpIcon from '@mui/icons-material/Help';
5
- import { Button, FormControlLabel, Grid2, Paper, Radio, RadioGroup, Tooltip, Typography, } from '@mui/material';
5
+ import { Button, FormControlLabel, Grid, Paper, Radio, RadioGroup, Tooltip, Typography, } from '@mui/material';
6
6
  import { observer } from 'mobx-react';
7
7
  import { getAdapter } from './getAdapter';
8
8
  import { basename, extName, getName, stripGz } from './util';
@@ -68,7 +68,7 @@ const ImportSyntenyOpenCustomTrack = observer(function ({ model, assembly1, asse
68
68
  };
69
69
  return (_jsxs(Paper, { style: { padding: 12 }, children: [error ? _jsx(ErrorMessage, { error: error }) : null, _jsx(Typography, { style: { textAlign: 'center' }, children: "Add a .paf (minimap2), .delta (Mummer), .chain (UCSC liftover), .anchors or .anchors.simple (MCScan), or .pif.gz (jbrowse CLI make-pif) file to view. These file types can also be gzipped." }), _jsx(RadioGroup, { value: radioOption, onChange: event => {
70
70
  setValue(event.target.value);
71
- }, children: _jsx(Grid2, { container: true, justifyContent: "center", children: [
71
+ }, children: _jsx(Grid, { container: true, justifyContent: "center", children: [
72
72
  '.paf',
73
73
  '.delta',
74
74
  '.out',
@@ -76,7 +76,7 @@ const ImportSyntenyOpenCustomTrack = observer(function ({ model, assembly1, asse
76
76
  '.anchors',
77
77
  '.anchors.simple',
78
78
  '.pif.gz',
79
- ].map(extension => (_jsx(FormControlLabel, { value: extension, control: _jsx(Radio, {}), label: extension }, extension))) }) }), _jsx(Grid2, { container: true, justifyContent: "center", children: radioOption === '.paf' ||
79
+ ].map(extension => (_jsx(FormControlLabel, { value: extension, control: _jsx(Radio, {}), label: extension }, extension))) }) }), _jsx(Grid, { container: true, justifyContent: "center", children: radioOption === '.paf' ||
80
80
  radioOption === '.out' ||
81
81
  radioOption === '.delta' ||
82
82
  radioOption === '.chain' ||
@@ -205,12 +205,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
205
205
  setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
206
206
  } & {
207
207
  moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
208
- navToLocString(input: string, optAssemblyName?: string): Promise<void>;
208
+ navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
209
209
  navToSearchString({ input, assembly, }: {
210
210
  input: string;
211
211
  assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
212
212
  }): Promise<void>;
213
- navToLocations(parsedLocStrings: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string): Promise<void>;
213
+ navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
214
+ navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
214
215
  navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
215
216
  navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
216
217
  } & {
@@ -278,9 +279,9 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
278
279
  displayName: string | undefined;
279
280
  tracks: any[];
280
281
  minimized: boolean;
281
- displayedRegions: import("@jbrowse/core/util").Region[];
282
282
  offsetPx: number;
283
283
  bpPerPx: number;
284
+ displayedRegions: import("@jbrowse/core/util").Region[];
284
285
  hideHeader: boolean;
285
286
  hideHeaderOverview: boolean;
286
287
  hideNoTracksActive: boolean;
@@ -586,12 +587,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
586
587
  setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
587
588
  } & {
588
589
  moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
589
- navToLocString(input: string, optAssemblyName?: string): Promise<void>;
590
+ navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
590
591
  navToSearchString({ input, assembly, }: {
591
592
  input: string;
592
593
  assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
593
594
  }): Promise<void>;
594
- navToLocations(parsedLocStrings: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string): Promise<void>;
595
+ navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
596
+ navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
595
597
  navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
596
598
  navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
597
599
  } & {
@@ -659,9 +661,9 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
659
661
  displayName: string | undefined;
660
662
  tracks: any[];
661
663
  minimized: boolean;
662
- displayedRegions: import("@jbrowse/core/util").Region[];
663
664
  offsetPx: number;
664
665
  bpPerPx: number;
666
+ displayedRegions: import("@jbrowse/core/util").Region[];
665
667
  hideHeader: boolean;
666
668
  hideHeaderOverview: boolean;
667
669
  hideNoTracksActive: boolean;
@@ -67,7 +67,7 @@ export async function renderToSvg(model, opts) {
67
67
  const rendering = renderings[i - 1];
68
68
  const height = heights[i];
69
69
  const levelHeight = level.height || 0;
70
- RenderList.push(_jsxs("g", { transform: `translate(0 ${currOffset})`, children: [levelHeight ? (_jsx("defs", { children: _jsx("clipPath", { id: `synclip-${i}`, children: _jsx("rect", { x: 0, y: 0, width: width, height: levelHeight }) }) })) : null, _jsx("g", { transform: `translate(${shift + trackLabelOffset} ${fontSize})`, clipPath: `url(#synclip-${i})`, children: rendering === null || rendering === void 0 ? void 0 : rendering.map((r, i) => (_jsx(ReactRendering, { rendering: r }, i))) }), _jsx("g", { transform: `translate(0 ${levelHeight})`, children: _jsx(SVGLinearGenomeView, { rulerHeight: rulerHeight, shift: shift, trackLabelOffset: trackLabelOffset, textHeight: textHeight, trackLabels: trackLabels, displayResults: displayResults[i], view: view, fontSize: fontSize }, view.id) })] }, view.id));
70
+ RenderList.push(_jsxs("g", { transform: `translate(0 ${currOffset})`, children: [levelHeight ? (_jsx("defs", { children: _jsx("clipPath", { id: `synclip-${i}`, children: _jsx("rect", { x: 0, y: 0, width: width, height: levelHeight }) }) })) : null, _jsx("g", { transform: `translate(${shift + trackLabelOffset} ${fontSize})`, clipPath: `url(#synclip-${i})`, children: rendering === null || rendering === void 0 ? void 0 : rendering.map((r, i) => _jsx(ReactRendering, { rendering: r }, i)) }), _jsx("g", { transform: `translate(0 ${levelHeight})`, children: _jsx(SVGLinearGenomeView, { rulerHeight: rulerHeight, shift: shift, trackLabelOffset: trackLabelOffset, textHeight: textHeight, trackLabels: trackLabels, displayResults: displayResults[i], view: view, fontSize: fontSize }, view.id) })] }, view.id));
71
71
  currOffset += height + fontSize + rulerHeight + levelHeight;
72
72
  }
73
73
  return renderToStaticMarkup(_jsx(ThemeProvider, { theme: theme, children: _jsx(Wrapper, { children: _jsxs("svg", { width: width, height: totalHeightSvg, xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink", viewBox: [0, 0, w + shift * 2, totalHeightSvg].toString(), children: [_jsx(SVGBackground, { width: w, height: totalHeightSvg, shift: shift }), RenderList] }) }) }));
@@ -0,0 +1,3 @@
1
+ export default function Formatter({ value }: {
2
+ value: unknown;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import copy from 'copy-to-clipboard';
4
+ export default function Formatter({ value }) {
5
+ const [show, setShow] = useState(false);
6
+ const [copied, setCopied] = useState(false);
7
+ const display = String(value);
8
+ return display.length > 100 ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => {
9
+ copy(display);
10
+ setCopied(true);
11
+ setTimeout(() => {
12
+ setCopied(false);
13
+ }, 700);
14
+ }, children: copied ? 'Copied to clipboard' : 'Copy' }), _jsx("button", { type: "button", onClick: () => {
15
+ setShow(val => !val);
16
+ }, children: show ? 'Show less' : 'Show more' }), _jsx("div", { children: show ? display : `${display.slice(0, 100)}...` })] })) : (_jsx("div", { children: display }));
17
+ }
@@ -1,5 +1,7 @@
1
1
  import type { SyntenyFeatureDetailModel } from './types';
2
- declare const LinkToSyntenyView: ({ model, }: {
2
+ import type { SimpleFeatureSerialized } from '@jbrowse/core/util';
3
+ declare const LinkToSyntenyView: ({ model, feat, }: {
3
4
  model: SyntenyFeatureDetailModel;
5
+ feat: SimpleFeatureSerialized;
4
6
  }) => import("react/jsx-runtime").JSX.Element;
5
7
  export default LinkToSyntenyView;
@@ -4,19 +4,19 @@ import { SimpleFeature, assembleLocString, getSession, } from '@jbrowse/core/uti
4
4
  import { Link } from '@mui/material';
5
5
  import { observer } from 'mobx-react';
6
6
  const LaunchSyntenyViewDialog = lazy(() => import('../LGVSyntenyDisplay/components/LaunchSyntenyViewDialog'));
7
- const LinkToSyntenyView = observer(function ({ model, }) {
8
- const { featureData, view, level, trackId } = model;
7
+ const LinkToSyntenyView = observer(function ({ model, feat, }) {
8
+ const { view, level, trackId } = model;
9
9
  return (_jsxs("ul", { children: [view.type === 'LinearSyntenyView' ? (_jsx("li", { children: _jsx(Link, { href: "#", onClick: event => {
10
10
  var _a, _b;
11
11
  event.preventDefault();
12
12
  const { views } = view;
13
13
  if (level !== undefined) {
14
- (_a = views[level]) === null || _a === void 0 ? void 0 : _a.navTo(featureData);
15
- (_b = views[level + 1]) === null || _b === void 0 ? void 0 : _b.navTo(featureData.mate);
14
+ (_a = views[level]) === null || _a === void 0 ? void 0 : _a.navTo(feat);
15
+ (_b = views[level + 1]) === null || _b === void 0 ? void 0 : _b.navTo(feat.mate);
16
16
  }
17
17
  else {
18
- const f1 = featureData;
19
- const f2 = featureData.mate;
18
+ const f1 = feat;
19
+ const f2 = feat.mate;
20
20
  const r1 = f1.assemblyName;
21
21
  const r2 = f2.assemblyName;
22
22
  const v1 = views.find(view => view.assemblyNames[0] === r1);
@@ -36,7 +36,7 @@ const LinkToSyntenyView = observer(function ({ model, }) {
36
36
  }
37
37
  }, children: "Center view on this feature" }) })) : null, _jsx("li", { children: _jsx(Link, { href: "#", onClick: event => {
38
38
  event.preventDefault();
39
- const feature = new SimpleFeature(featureData);
39
+ const feature = new SimpleFeature(feat);
40
40
  const session = getSession(model);
41
41
  session.queueDialog(handleClose => [
42
42
  LaunchSyntenyViewDialog,
@@ -1,5 +1,5 @@
1
1
  import type { SyntenyFeatureDetailModel } from './types';
2
- declare const SyntenyFeatureDetail: ({ model, }: {
2
+ declare const SyntenyFeatureDetail: (props: {
3
3
  model: SyntenyFeatureDetailModel;
4
4
  }) => import("react/jsx-runtime").JSX.Element;
5
5
  export default SyntenyFeatureDetail;
@@ -1,10 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import BaseFeatureDetail from '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail';
3
2
  import BaseCard from '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/BaseCard';
3
+ import FeatureDetails from '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails';
4
4
  import { Paper } from '@mui/material';
5
5
  import { observer } from 'mobx-react';
6
+ import Formatter from './Formatter';
6
7
  import LinkToSyntenyView from './LinkToSyntenyView';
7
- const SyntenyFeatureDetail = observer(function ({ model, }) {
8
- return (_jsxs(Paper, { children: [_jsx(BaseFeatureDetail, { title: "Feature", model: model }), _jsx(BaseCard, { title: "Link to view", children: _jsx(LinkToSyntenyView, { model: model }) })] }));
8
+ const SyntenyFeatureDetail = observer(function (props) {
9
+ const { model } = props;
10
+ const { featureData } = model;
11
+ const feat = structuredClone(featureData);
12
+ return feat ? (_jsxs(Paper, { children: [_jsx(FeatureDetails, { ...props, feature: feat, formatter: value => _jsx(Formatter, { value: value }) }), _jsx(BaseCard, { title: "Link to view", children: _jsx(LinkToSyntenyView, { model: model, feat: feat }) })] })) : (_jsx("div", { children: "No feature loaded, may not be available after page refresh because it was too large for localStorage" }));
9
13
  });
10
14
  export default SyntenyFeatureDetail;
@@ -1,7 +1,7 @@
1
1
  import type { SimpleFeatureSerialized } from '@jbrowse/core/util';
2
2
  export interface SyntenyFeatureDetailModel {
3
3
  trackId: string;
4
- featureData: SimpleFeatureSerialized;
4
+ featureData?: SimpleFeatureSerialized;
5
5
  level?: number;
6
6
  view: {
7
7
  type: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/plugin-linear-comparative-view",
3
- "version": "3.2.0",
3
+ "version": "3.4.0",
4
4
  "description": "JBrowse 2 linear comparative view",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -36,11 +36,11 @@
36
36
  "clean": "rimraf dist esm *.tsbuildinfo"
37
37
  },
38
38
  "dependencies": {
39
- "@jbrowse/core": "^3.2.0",
40
- "@jbrowse/plugin-alignments": "^3.2.0",
41
- "@jbrowse/plugin-linear-genome-view": "^3.2.0",
42
- "@mui/icons-material": "^6.0.0",
43
- "@mui/material": "^6.0.0",
39
+ "@jbrowse/core": "^3.4.0",
40
+ "@jbrowse/plugin-alignments": "^3.4.0",
41
+ "@jbrowse/plugin-linear-genome-view": "^3.4.0",
42
+ "@mui/icons-material": "^7.0.0",
43
+ "@mui/material": "^7.0.0",
44
44
  "copy-to-clipboard": "^3.3.1",
45
45
  "file-saver": "^2.0.0",
46
46
  "mobx": "^6.0.0",
@@ -59,5 +59,5 @@
59
59
  "publishConfig": {
60
60
  "access": "public"
61
61
  },
62
- "gitHead": "c750e3f56706a490c19ba75abd807fec5e38aebf"
62
+ "gitHead": "a9f1ac35fc2dd810bae92cdaf1fc19995bee4413"
63
63
  }