@jbrowse/plugin-linear-genome-view 2.10.0 → 2.10.2
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/models/util.js +4 -2
- package/dist/LaunchLinearGenomeView/index.js +8 -2
- package/dist/LinearBasicDisplay/model.d.ts +10 -20
- package/dist/LinearBasicDisplay/model.js +2 -2
- package/dist/LinearGenomeView/components/ExportSvgDialog.d.ts +1 -1
- package/dist/LinearGenomeView/components/ExportSvgDialog.js +2 -2
- package/dist/LinearGenomeView/components/OverviewScalebar.d.ts +0 -8
- package/dist/LinearGenomeView/components/OverviewScalebar.js +23 -55
- package/dist/LinearGenomeView/components/OverviewScalebarPolygon.d.ts +9 -0
- package/dist/LinearGenomeView/components/OverviewScalebarPolygon.js +46 -0
- package/dist/LinearGenomeView/components/RefNameAutocomplete/EndAdornment.js +1 -1
- package/dist/LinearGenomeView/components/RefNameAutocomplete/index.js +9 -10
- package/dist/LinearGenomeView/model.d.ts +5 -5
- package/dist/LinearGenomeView/model.js +15 -15
- package/dist/LinearGenomeView/svgcomponents/SVGHeader.js +2 -2
- package/dist/index.d.ts +30 -30
- package/esm/BaseLinearDisplay/models/util.js +4 -2
- package/esm/LaunchLinearGenomeView/index.js +8 -2
- package/esm/LinearBasicDisplay/model.d.ts +10 -20
- package/esm/LinearBasicDisplay/model.js +2 -2
- package/esm/LinearGenomeView/components/ExportSvgDialog.d.ts +1 -1
- package/esm/LinearGenomeView/components/ExportSvgDialog.js +1 -1
- package/esm/LinearGenomeView/components/OverviewScalebar.d.ts +0 -8
- package/esm/LinearGenomeView/components/OverviewScalebar.js +23 -53
- package/esm/LinearGenomeView/components/OverviewScalebarPolygon.d.ts +9 -0
- package/esm/LinearGenomeView/components/OverviewScalebarPolygon.js +41 -0
- package/esm/LinearGenomeView/components/RefNameAutocomplete/EndAdornment.js +1 -1
- package/esm/LinearGenomeView/components/RefNameAutocomplete/index.js +10 -11
- package/esm/LinearGenomeView/model.d.ts +5 -5
- package/esm/LinearGenomeView/model.js +15 -15
- package/esm/LinearGenomeView/svgcomponents/SVGHeader.js +2 -2
- package/esm/index.d.ts +30 -30
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -964,10 +964,10 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
964
964
|
setShowCytobands(flag: boolean): void;
|
|
965
965
|
setWidth(newWidth: number): void;
|
|
966
966
|
setError(error: unknown): void;
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
967
|
+
setHideHeader(b: boolean): void;
|
|
968
|
+
setHideHeaderOverview(b: boolean): void;
|
|
969
|
+
setHideNoTracksActive(b: boolean): void;
|
|
970
|
+
setShowGridlines(b: boolean): void;
|
|
971
971
|
scrollTo(offsetPx: number): number;
|
|
972
972
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
973
973
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -981,7 +981,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
981
981
|
closeView(): void;
|
|
982
982
|
toggleTrack(trackId: string): boolean;
|
|
983
983
|
setTrackLabels(setting: "offset" | "hidden" | "overlapping"): void;
|
|
984
|
-
|
|
984
|
+
setShowCenterLine(b: boolean): void;
|
|
985
985
|
setDisplayedRegions(regions: import("@jbrowse/core/util").Region[]): void;
|
|
986
986
|
activateTrackSelector(): import("@jbrowse/core/util").Widget;
|
|
987
987
|
getSelectedRegions(leftOffset?: import("./LinearGenomeView").BpOffset | undefined, rightOffset?: import("./LinearGenomeView").BpOffset | undefined): {
|
|
@@ -1283,10 +1283,10 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1283
1283
|
setShowCytobands(flag: boolean): void;
|
|
1284
1284
|
setWidth(newWidth: number): void;
|
|
1285
1285
|
setError(error: unknown): void;
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1286
|
+
setHideHeader(b: boolean): void;
|
|
1287
|
+
setHideHeaderOverview(b: boolean): void;
|
|
1288
|
+
setHideNoTracksActive(b: boolean): void;
|
|
1289
|
+
setShowGridlines(b: boolean): void;
|
|
1290
1290
|
scrollTo(offsetPx: number): number;
|
|
1291
1291
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
1292
1292
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -1300,7 +1300,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1300
1300
|
closeView(): void;
|
|
1301
1301
|
toggleTrack(trackId: string): boolean;
|
|
1302
1302
|
setTrackLabels(setting: "offset" | "hidden" | "overlapping"): void;
|
|
1303
|
-
|
|
1303
|
+
setShowCenterLine(b: boolean): void;
|
|
1304
1304
|
setDisplayedRegions(regions: import("@jbrowse/core/util").Region[]): void;
|
|
1305
1305
|
activateTrackSelector(): import("@jbrowse/core/util").Widget;
|
|
1306
1306
|
getSelectedRegions(leftOffset?: import("./LinearGenomeView").BpOffset | undefined, rightOffset?: import("./LinearGenomeView").BpOffset | undefined): {
|
|
@@ -1612,10 +1612,10 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1612
1612
|
setShowCytobands(flag: boolean): void;
|
|
1613
1613
|
setWidth(newWidth: number): void;
|
|
1614
1614
|
setError(error: unknown): void;
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1615
|
+
setHideHeader(b: boolean): void;
|
|
1616
|
+
setHideHeaderOverview(b: boolean): void;
|
|
1617
|
+
setHideNoTracksActive(b: boolean): void;
|
|
1618
|
+
setShowGridlines(b: boolean): void;
|
|
1619
1619
|
scrollTo(offsetPx: number): number;
|
|
1620
1620
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
1621
1621
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -1629,7 +1629,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1629
1629
|
closeView(): void;
|
|
1630
1630
|
toggleTrack(trackId: string): boolean;
|
|
1631
1631
|
setTrackLabels(setting: "offset" | "hidden" | "overlapping"): void;
|
|
1632
|
-
|
|
1632
|
+
setShowCenterLine(b: boolean): void;
|
|
1633
1633
|
setDisplayedRegions(regions: import("@jbrowse/core/util").Region[]): void;
|
|
1634
1634
|
activateTrackSelector(): import("@jbrowse/core/util").Widget;
|
|
1635
1635
|
getSelectedRegions(leftOffset?: import("./LinearGenomeView").BpOffset | undefined, rightOffset?: import("./LinearGenomeView").BpOffset | undefined): {
|
|
@@ -1931,10 +1931,10 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1931
1931
|
setShowCytobands(flag: boolean): void;
|
|
1932
1932
|
setWidth(newWidth: number): void;
|
|
1933
1933
|
setError(error: unknown): void;
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1934
|
+
setHideHeader(b: boolean): void;
|
|
1935
|
+
setHideHeaderOverview(b: boolean): void;
|
|
1936
|
+
setHideNoTracksActive(b: boolean): void;
|
|
1937
|
+
setShowGridlines(b: boolean): void;
|
|
1938
1938
|
scrollTo(offsetPx: number): number;
|
|
1939
1939
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
1940
1940
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -1948,7 +1948,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
1948
1948
|
closeView(): void;
|
|
1949
1949
|
toggleTrack(trackId: string): boolean;
|
|
1950
1950
|
setTrackLabels(setting: "offset" | "hidden" | "overlapping"): void;
|
|
1951
|
-
|
|
1951
|
+
setShowCenterLine(b: boolean): void;
|
|
1952
1952
|
setDisplayedRegions(regions: import("@jbrowse/core/util").Region[]): void;
|
|
1953
1953
|
activateTrackSelector(): import("@jbrowse/core/util").Widget;
|
|
1954
1954
|
getSelectedRegions(leftOffset?: import("./LinearGenomeView").BpOffset | undefined, rightOffset?: import("./LinearGenomeView").BpOffset | undefined): {
|
|
@@ -2260,10 +2260,10 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
2260
2260
|
setShowCytobands(flag: boolean): void;
|
|
2261
2261
|
setWidth(newWidth: number): void;
|
|
2262
2262
|
setError(error: unknown): void;
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2263
|
+
setHideHeader(b: boolean): void;
|
|
2264
|
+
setHideHeaderOverview(b: boolean): void;
|
|
2265
|
+
setHideNoTracksActive(b: boolean): void;
|
|
2266
|
+
setShowGridlines(b: boolean): void;
|
|
2267
2267
|
scrollTo(offsetPx: number): number;
|
|
2268
2268
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
2269
2269
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -2277,7 +2277,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
2277
2277
|
closeView(): void;
|
|
2278
2278
|
toggleTrack(trackId: string): boolean;
|
|
2279
2279
|
setTrackLabels(setting: "offset" | "hidden" | "overlapping"): void;
|
|
2280
|
-
|
|
2280
|
+
setShowCenterLine(b: boolean): void;
|
|
2281
2281
|
setDisplayedRegions(regions: import("@jbrowse/core/util").Region[]): void;
|
|
2282
2282
|
activateTrackSelector(): import("@jbrowse/core/util").Widget;
|
|
2283
2283
|
getSelectedRegions(leftOffset?: import("./LinearGenomeView").BpOffset | undefined, rightOffset?: import("./LinearGenomeView").BpOffset | undefined): {
|
|
@@ -2579,10 +2579,10 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
2579
2579
|
setShowCytobands(flag: boolean): void;
|
|
2580
2580
|
setWidth(newWidth: number): void;
|
|
2581
2581
|
setError(error: unknown): void;
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2582
|
+
setHideHeader(b: boolean): void;
|
|
2583
|
+
setHideHeaderOverview(b: boolean): void;
|
|
2584
|
+
setHideNoTracksActive(b: boolean): void;
|
|
2585
|
+
setShowGridlines(b: boolean): void;
|
|
2586
2586
|
scrollTo(offsetPx: number): number;
|
|
2587
2587
|
zoomTo(bpPerPx: number, offset?: number, centerAtOffset?: boolean): number;
|
|
2588
2588
|
setOffsets(left?: import("./LinearGenomeView").BpOffset | undefined, right?: import("./LinearGenomeView").BpOffset | undefined): void;
|
|
@@ -2596,7 +2596,7 @@ export default class LinearGenomeViewPlugin extends Plugin {
|
|
|
2596
2596
|
closeView(): void;
|
|
2597
2597
|
toggleTrack(trackId: string): boolean;
|
|
2598
2598
|
setTrackLabels(setting: "offset" | "hidden" | "overlapping"): void;
|
|
2599
|
-
|
|
2599
|
+
setShowCenterLine(b: boolean): void;
|
|
2600
2600
|
setDisplayedRegions(regions: import("@jbrowse/core/util").Region[]): void;
|
|
2601
2601
|
activateTrackSelector(): import("@jbrowse/core/util").Widget;
|
|
2602
2602
|
getSelectedRegions(leftOffset?: import("./LinearGenomeView").BpOffset | undefined, rightOffset?: import("./LinearGenomeView").BpOffset | undefined): {
|
|
@@ -16,8 +16,10 @@ export function getDisplayStr(totalBytes) {
|
|
|
16
16
|
}
|
|
17
17
|
// stabilize clipid under test for snapshot
|
|
18
18
|
export function getId(id, index) {
|
|
19
|
-
const
|
|
20
|
-
return
|
|
19
|
+
const notJest = typeof jest === 'undefined';
|
|
20
|
+
return ['clip', notJest ? id : 'jest', index, notJest ? Math.random() : '']
|
|
21
|
+
.filter(f => !!f)
|
|
22
|
+
.join('-');
|
|
21
23
|
}
|
|
22
24
|
export async function getFeatureDensityStatsPre(self) {
|
|
23
25
|
const view = getContainingView(self);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { when } from '@jbrowse/core/util';
|
|
2
|
-
import { handleSelectedRegion } from '
|
|
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 = [], }) => {
|
|
6
|
+
async ({ session, assembly, loc, tracks = [], tracklist, nav, }) => {
|
|
7
7
|
try {
|
|
8
8
|
const { assemblyManager } = session;
|
|
9
9
|
const view = session.addView('LinearGenomeView', {});
|
|
@@ -21,6 +21,12 @@ export default (pluginManager) => {
|
|
|
21
21
|
if (idsNotFound.length) {
|
|
22
22
|
throw new Error(`Could not resolve identifiers: ${idsNotFound.join(',')}`);
|
|
23
23
|
}
|
|
24
|
+
if (tracklist) {
|
|
25
|
+
view.activateTrackSelector();
|
|
26
|
+
}
|
|
27
|
+
if (nav !== undefined) {
|
|
28
|
+
view.setHideHeader(!nav);
|
|
29
|
+
}
|
|
24
30
|
}
|
|
25
31
|
catch (e) {
|
|
26
32
|
session.notify(`${e}`, 'error');
|
|
@@ -37,9 +37,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
37
37
|
isLeftEndOfDisplayedRegion: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
38
38
|
isRightEndOfDisplayedRegion: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
39
39
|
}, {
|
|
40
|
-
renderInProgress: AbortController | undefined;
|
|
41
|
-
* #property
|
|
42
|
-
*/
|
|
40
|
+
renderInProgress: AbortController | undefined;
|
|
43
41
|
filled: boolean;
|
|
44
42
|
reactElement: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
45
43
|
features: Map<string, import("@jbrowse/core/util").Feature> | undefined;
|
|
@@ -159,12 +157,11 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
159
157
|
}, {
|
|
160
158
|
rendererTypeName: string;
|
|
161
159
|
error: unknown;
|
|
162
|
-
message: string | undefined;
|
|
160
|
+
message: string | undefined; /**
|
|
161
|
+
* #action
|
|
162
|
+
*/
|
|
163
163
|
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
|
|
164
164
|
}> | null;
|
|
165
|
-
/**
|
|
166
|
-
* #action
|
|
167
|
-
*/
|
|
168
165
|
readonly adapterConfig: any;
|
|
169
166
|
readonly parentTrack: any;
|
|
170
167
|
renderProps(): any;
|
|
@@ -193,9 +190,6 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
193
190
|
} & {
|
|
194
191
|
readonly currentBytesRequested: number;
|
|
195
192
|
readonly currentFeatureScreenDensity: number;
|
|
196
|
-
/**
|
|
197
|
-
* #getter
|
|
198
|
-
*/
|
|
199
193
|
readonly maxFeatureScreenDensity: any;
|
|
200
194
|
readonly featureDensityStatsReady: boolean;
|
|
201
195
|
readonly maxAllowableBytes: number;
|
|
@@ -205,7 +199,9 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
205
199
|
setCurrStatsBpPerPx(n: number): void;
|
|
206
200
|
setFeatureDensityStatsLimit(stats?: import("@jbrowse/core/data_adapters/BaseAdapter").FeatureDensityStats | undefined): void;
|
|
207
201
|
getFeatureDensityStats(): Promise<import("@jbrowse/core/data_adapters/BaseAdapter").FeatureDensityStats>;
|
|
208
|
-
setFeatureDensityStatsP(arg: any): void;
|
|
202
|
+
setFeatureDensityStatsP(arg: any): void; /**
|
|
203
|
+
* #method
|
|
204
|
+
*/
|
|
209
205
|
setFeatureDensityStats(featureDensityStats?: import("@jbrowse/core/data_adapters/BaseAdapter").FeatureDensityStats | undefined): void;
|
|
210
206
|
clearFeatureDensityStats(): void;
|
|
211
207
|
} & {
|
|
@@ -275,9 +271,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
275
271
|
readonly rendererConfig: {
|
|
276
272
|
[x: string]: any;
|
|
277
273
|
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
278
|
-
setSubschema(slotName: string, data: unknown): any;
|
|
279
|
-
* #property
|
|
280
|
-
*/
|
|
274
|
+
setSubschema(slotName: string, data: unknown): any;
|
|
281
275
|
} & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>;
|
|
282
276
|
} & {
|
|
283
277
|
/**
|
|
@@ -304,9 +298,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
304
298
|
config: {
|
|
305
299
|
[x: string]: any;
|
|
306
300
|
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
307
|
-
setSubschema(slotName: string, data: unknown): any;
|
|
308
|
-
* #property
|
|
309
|
-
*/
|
|
301
|
+
setSubschema(slotName: string, data: unknown): any;
|
|
310
302
|
} & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>;
|
|
311
303
|
};
|
|
312
304
|
/**
|
|
@@ -341,9 +333,7 @@ declare function stateModelFactory(configSchema: AnyConfigurationSchemaType): im
|
|
|
341
333
|
isLeftEndOfDisplayedRegion: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
342
334
|
isRightEndOfDisplayedRegion: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
343
335
|
}, {
|
|
344
|
-
renderInProgress: AbortController | undefined;
|
|
345
|
-
* #property
|
|
346
|
-
*/
|
|
336
|
+
renderInProgress: AbortController | undefined;
|
|
347
337
|
filled: boolean;
|
|
348
338
|
reactElement: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
349
339
|
features: Map<string, import("@jbrowse/core/util").Feature> | undefined;
|
|
@@ -6,7 +6,7 @@ import { types, getEnv } from 'mobx-state-tree';
|
|
|
6
6
|
import VisibilityIcon from '@mui/icons-material/Visibility';
|
|
7
7
|
// locals
|
|
8
8
|
import { BaseLinearDisplay } from '../BaseLinearDisplay';
|
|
9
|
-
const
|
|
9
|
+
const SetMaxHeightDialog = lazy(() => import('./components/SetMaxHeight'));
|
|
10
10
|
/**
|
|
11
11
|
* #stateModel LinearBasicDisplay
|
|
12
12
|
* #category display
|
|
@@ -174,7 +174,7 @@ function stateModelFactory(configSchema) {
|
|
|
174
174
|
label: 'Set max height',
|
|
175
175
|
onClick: () => {
|
|
176
176
|
getSession(self).queueDialog(handleClose => [
|
|
177
|
-
|
|
177
|
+
SetMaxHeightDialog,
|
|
178
178
|
{ model: self, handleClose },
|
|
179
179
|
]);
|
|
180
180
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ExportSvgOptions } from '..';
|
|
3
|
-
export default function
|
|
3
|
+
export default function ExportSvgDialog({ model, handleClose, }: {
|
|
4
4
|
model: {
|
|
5
5
|
exportSvg(opts: ExportSvgOptions): Promise<void>;
|
|
6
6
|
};
|
|
@@ -10,7 +10,7 @@ function LoadingMessage() {
|
|
|
10
10
|
function useSvgLocal(key, val) {
|
|
11
11
|
return useLocalStorage('svg-' + key, val);
|
|
12
12
|
}
|
|
13
|
-
export default function
|
|
13
|
+
export default function ExportSvgDialog({ model, handleClose, }) {
|
|
14
14
|
const session = getSession(model);
|
|
15
15
|
const offscreenCanvas = typeof OffscreenCanvas !== 'undefined';
|
|
16
16
|
const [rasterizeLayers, setRasterizeLayers] = useState(offscreenCanvas);
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel';
|
|
3
2
|
import { LinearGenomeViewModel } from '..';
|
|
4
|
-
declare const Polygon: ({ model, overview, useOffset, }: {
|
|
5
|
-
model: LGV;
|
|
6
|
-
overview: Base1DViewModel;
|
|
7
|
-
useOffset?: boolean | undefined;
|
|
8
|
-
}) => React.JSX.Element | null;
|
|
9
3
|
type LGV = LinearGenomeViewModel;
|
|
10
4
|
declare const OverviewScalebar: ({ model, children, }: {
|
|
11
5
|
model: LGV;
|
|
12
6
|
children: React.ReactNode;
|
|
13
7
|
}) => React.JSX.Element;
|
|
14
|
-
export { Polygon };
|
|
15
|
-
export { default as Cytobands } from './Cytobands';
|
|
16
8
|
export default OverviewScalebar;
|
|
@@ -9,9 +9,10 @@ import { ContentBlock } from '@jbrowse/core/util/blockTypes';
|
|
|
9
9
|
// locals
|
|
10
10
|
import { HEADER_BAR_HEIGHT, HEADER_OVERVIEW_HEIGHT, } from '..';
|
|
11
11
|
import { chooseGridPitch } from '../util';
|
|
12
|
+
import { getCytobands } from './util';
|
|
12
13
|
import OverviewRubberband from './OverviewRubberband';
|
|
13
14
|
import Cytobands from './Cytobands';
|
|
14
|
-
import
|
|
15
|
+
import OverviewScalebarPolygon from './OverviewScalebarPolygon';
|
|
15
16
|
const wholeSeqSpacer = 2;
|
|
16
17
|
const useStyles = makeStyles()(theme => ({
|
|
17
18
|
scalebar: {
|
|
@@ -65,55 +66,14 @@ const useStyles = makeStyles()(theme => ({
|
|
|
65
66
|
position: 'absolute',
|
|
66
67
|
},
|
|
67
68
|
}));
|
|
68
|
-
const Polygon = observer(function ({ model, overview, useOffset = true, }) {
|
|
69
|
-
const theme = useTheme();
|
|
70
|
-
const multiplier = Number(useOffset);
|
|
71
|
-
const { interRegionPaddingWidth, offsetPx, dynamicBlocks, cytobandOffset } = model;
|
|
72
|
-
const { contentBlocks, totalWidthPxWithoutBorders } = dynamicBlocks;
|
|
73
|
-
const { tertiary, primary } = theme.palette;
|
|
74
|
-
const polygonColor = tertiary ? tertiary.light : primary.light;
|
|
75
|
-
// catches possible null from at's below
|
|
76
|
-
if (!contentBlocks.length) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
const first = contentBlocks.at(0);
|
|
80
|
-
const last = contentBlocks.at(-1);
|
|
81
|
-
const topLeft = (overview.bpToPx({
|
|
82
|
-
...first,
|
|
83
|
-
coord: first.reversed ? first.end : first.start,
|
|
84
|
-
}) || 0) +
|
|
85
|
-
cytobandOffset * multiplier;
|
|
86
|
-
const topRight = (overview.bpToPx({
|
|
87
|
-
...last,
|
|
88
|
-
coord: last.reversed ? last.start : last.end,
|
|
89
|
-
}) || 0) +
|
|
90
|
-
cytobandOffset * multiplier;
|
|
91
|
-
const startPx = Math.max(0, -offsetPx);
|
|
92
|
-
const endPx = startPx +
|
|
93
|
-
totalWidthPxWithoutBorders +
|
|
94
|
-
(contentBlocks.length * interRegionPaddingWidth) / 2;
|
|
95
|
-
const points = [
|
|
96
|
-
[startPx, HEADER_BAR_HEIGHT],
|
|
97
|
-
[endPx, HEADER_BAR_HEIGHT],
|
|
98
|
-
[topRight, 0],
|
|
99
|
-
[topLeft, 0],
|
|
100
|
-
];
|
|
101
|
-
return (React.createElement("polygon", { points: points.toString(), fill: alpha(polygonColor, 0.3), stroke: alpha(polygonColor, 0.8) }));
|
|
102
|
-
});
|
|
103
69
|
const OverviewBox = observer(function ({ scale, model, block, overview, }) {
|
|
104
70
|
const { classes, cx } = useStyles();
|
|
105
71
|
const theme = useTheme();
|
|
106
72
|
const { cytobandOffset, showCytobands } = model;
|
|
107
|
-
const {
|
|
108
|
-
const { majorPitch } = chooseGridPitch(scale, 120, 15);
|
|
73
|
+
const { reversed, refName, assemblyName } = block;
|
|
109
74
|
const { assemblyManager } = getSession(model);
|
|
110
75
|
const assembly = assemblyManager.get(assemblyName);
|
|
111
76
|
const refNameColor = assembly === null || assembly === void 0 ? void 0 : assembly.getRefNameColor(refName);
|
|
112
|
-
const tickLabels = [];
|
|
113
|
-
for (let i = 0; i < Math.floor((end - start) / majorPitch); i++) {
|
|
114
|
-
const offsetLabel = (i + 1) * majorPitch;
|
|
115
|
-
tickLabels.push(reversed ? end - offsetLabel : start + offsetLabel);
|
|
116
|
-
}
|
|
117
77
|
const canDisplayCytobands = showCytobands && getCytobands(assembly, block.refName).length;
|
|
118
78
|
return (React.createElement("div", null,
|
|
119
79
|
React.createElement(Typography, { style: {
|
|
@@ -131,16 +91,28 @@ const OverviewBox = observer(function ({ scale, model, block, overview, }) {
|
|
|
131
91
|
width: block.widthPx,
|
|
132
92
|
borderColor: refNameColor,
|
|
133
93
|
} },
|
|
134
|
-
!canDisplayCytobands
|
|
135
|
-
? tickLabels.map((tickLabel, labelIdx) => (React.createElement(Typography, { key: `${JSON.stringify(block)}-${tickLabel}-${labelIdx}`, className: classes.scalebarLabel, variant: "body2", style: {
|
|
136
|
-
left: ((labelIdx + 1) * majorPitch) / scale,
|
|
137
|
-
pointerEvents: 'none',
|
|
138
|
-
color: refNameColor,
|
|
139
|
-
} }, getTickDisplayStr(tickLabel, overview.bpPerPx))))
|
|
140
|
-
: null,
|
|
94
|
+
!canDisplayCytobands ? (React.createElement(TickLabels, { model: model, overview: overview, scale: scale, block: block })) : null,
|
|
141
95
|
canDisplayCytobands ? (React.createElement("svg", { style: { width: '100%' } },
|
|
142
96
|
React.createElement(Cytobands, { overview: overview, assembly: assembly, block: block }))) : null)));
|
|
143
97
|
});
|
|
98
|
+
const TickLabels = observer(function ({ block, scale, overview, model, }) {
|
|
99
|
+
const { classes } = useStyles();
|
|
100
|
+
const { start, end, reversed, refName, assemblyName } = block;
|
|
101
|
+
const { majorPitch } = chooseGridPitch(scale, 120, 15);
|
|
102
|
+
const { assemblyManager } = getSession(model);
|
|
103
|
+
const assembly = assemblyManager.get(assemblyName);
|
|
104
|
+
const refNameColor = assembly === null || assembly === void 0 ? void 0 : assembly.getRefNameColor(refName);
|
|
105
|
+
const tickLabels = [];
|
|
106
|
+
for (let i = 0; i < Math.floor((end - start) / majorPitch); i++) {
|
|
107
|
+
const offsetLabel = (i + 1) * majorPitch;
|
|
108
|
+
tickLabels.push(reversed ? end - offsetLabel : start + offsetLabel);
|
|
109
|
+
}
|
|
110
|
+
return tickLabels.map((tickLabel, labelIdx) => (React.createElement(Typography, { key: `${JSON.stringify(block)}-${tickLabel}-${labelIdx}`, className: classes.scalebarLabel, variant: "body2", style: {
|
|
111
|
+
left: ((labelIdx + 1) * majorPitch) / scale,
|
|
112
|
+
pointerEvents: 'none',
|
|
113
|
+
color: refNameColor,
|
|
114
|
+
} }, getTickDisplayStr(tickLabel, overview.bpPerPx))));
|
|
115
|
+
});
|
|
144
116
|
const Scalebar = observer(function ({ model, scale, overview, }) {
|
|
145
117
|
const { classes } = useStyles();
|
|
146
118
|
const theme = useTheme();
|
|
@@ -205,9 +177,7 @@ const OverviewScalebar = observer(function ({ model, children, }) {
|
|
|
205
177
|
React.createElement(OverviewRubberband, { model: model, overview: overview, ControlComponent: React.createElement(Scalebar, { model: model, overview: overview, scale: scale }) }),
|
|
206
178
|
React.createElement("div", { className: classes.overview },
|
|
207
179
|
React.createElement("svg", { height: HEADER_BAR_HEIGHT, className: classes.overviewSvg },
|
|
208
|
-
React.createElement(
|
|
180
|
+
React.createElement(OverviewScalebarPolygon, { model: model, overview: overview })),
|
|
209
181
|
children)));
|
|
210
182
|
});
|
|
211
|
-
export { Polygon };
|
|
212
|
-
export { default as Cytobands } from './Cytobands';
|
|
213
183
|
export default OverviewScalebar;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel';
|
|
3
|
+
import { LinearGenomeViewModel } from '..';
|
|
4
|
+
declare const OverviewScalebarPolygon: ({ model, overview, useOffset, }: {
|
|
5
|
+
model: LinearGenomeViewModel;
|
|
6
|
+
overview: Base1DViewModel;
|
|
7
|
+
useOffset?: boolean | undefined;
|
|
8
|
+
}) => React.JSX.Element | null;
|
|
9
|
+
export default OverviewScalebarPolygon;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useTheme, alpha } from '@mui/material';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
4
|
+
// locals
|
|
5
|
+
import { HEADER_BAR_HEIGHT } from '..';
|
|
6
|
+
const OverviewScalebarPolygon = observer(function ({ model, overview, useOffset = true, }) {
|
|
7
|
+
const theme = useTheme();
|
|
8
|
+
const multiplier = Number(useOffset);
|
|
9
|
+
const { interRegionPaddingWidth, offsetPx, dynamicBlocks, cytobandOffset } = model;
|
|
10
|
+
const { contentBlocks, totalWidthPxWithoutBorders } = dynamicBlocks;
|
|
11
|
+
const { tertiary, primary } = theme.palette;
|
|
12
|
+
const polygonColor = tertiary ? tertiary.light : primary.light;
|
|
13
|
+
// catches possible null from at's below
|
|
14
|
+
if (!contentBlocks.length) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const first = contentBlocks.at(0);
|
|
18
|
+
const last = contentBlocks.at(-1);
|
|
19
|
+
const topLeft = (overview.bpToPx({
|
|
20
|
+
...first,
|
|
21
|
+
coord: first.reversed ? first.end : first.start,
|
|
22
|
+
}) || 0) +
|
|
23
|
+
cytobandOffset * multiplier;
|
|
24
|
+
const topRight = (overview.bpToPx({
|
|
25
|
+
...last,
|
|
26
|
+
coord: last.reversed ? last.start : last.end,
|
|
27
|
+
}) || 0) +
|
|
28
|
+
cytobandOffset * multiplier;
|
|
29
|
+
const startPx = Math.max(0, -offsetPx);
|
|
30
|
+
const endPx = startPx +
|
|
31
|
+
totalWidthPxWithoutBorders +
|
|
32
|
+
(contentBlocks.length * interRegionPaddingWidth) / 2;
|
|
33
|
+
const points = [
|
|
34
|
+
[startPx, HEADER_BAR_HEIGHT],
|
|
35
|
+
[endPx, HEADER_BAR_HEIGHT],
|
|
36
|
+
[topRight, 0],
|
|
37
|
+
[topLeft, 0],
|
|
38
|
+
];
|
|
39
|
+
return (React.createElement("polygon", { points: points.toString(), fill: alpha(polygonColor, 0.3), stroke: alpha(polygonColor, 0.8) }));
|
|
40
|
+
});
|
|
41
|
+
export default OverviewScalebarPolygon;
|
|
@@ -10,7 +10,7 @@ function HelpAdornment() {
|
|
|
10
10
|
return (React.createElement(React.Fragment, null,
|
|
11
11
|
React.createElement(IconButton, { onClick: () => setHelpDialogDisplayed(true), size: "small" },
|
|
12
12
|
React.createElement(HelpIcon, { fontSize: "small" })),
|
|
13
|
-
isHelpDialogDisplayed ? (React.createElement(Suspense, { fallback:
|
|
13
|
+
isHelpDialogDisplayed ? (React.createElement(Suspense, { fallback: null },
|
|
14
14
|
React.createElement(HelpDialog, { handleClose: () => setHelpDialogDisplayed(false) }))) : null));
|
|
15
15
|
}
|
|
16
16
|
export default function EndAdornment({ showHelp, endAdornment, }) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useEffect, useState } from 'react';
|
|
1
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
2
2
|
import { observer } from 'mobx-react';
|
|
3
3
|
import { getSession, useDebounce, measureText } from '@jbrowse/core/util';
|
|
4
4
|
import BaseResult, { RefSequenceResult, } from '@jbrowse/core/TextSearch/BaseResults';
|
|
@@ -6,7 +6,6 @@ import { Autocomplete } from '@mui/material';
|
|
|
6
6
|
import { getDeduplicatedResult, getFiltered } from './util';
|
|
7
7
|
import AutocompleteTextField from './AutocompleteTextField';
|
|
8
8
|
const RefNameAutocomplete = observer(function ({ model, onSelect, assemblyName, style, fetchResults, onChange, value, showHelp = true, minWidth = 200, maxWidth = 550, TextFieldProps = {}, }) {
|
|
9
|
-
var _a;
|
|
10
9
|
const session = getSession(model);
|
|
11
10
|
const { assemblyManager } = session;
|
|
12
11
|
const [open, setOpen] = useState(false);
|
|
@@ -45,6 +44,14 @@ const RefNameAutocomplete = observer(function ({ model, onSelect, assemblyName,
|
|
|
45
44
|
const inputBoxVal = coarseVisibleLocStrings || value || '';
|
|
46
45
|
// heuristic, text width + 60 accommodates help icon and search icon
|
|
47
46
|
const width = Math.min(Math.max(measureText(inputBoxVal, 14) + 100, minWidth), maxWidth);
|
|
47
|
+
const regions = assembly === null || assembly === void 0 ? void 0 : assembly.regions;
|
|
48
|
+
const regionOptions = useMemo(() => (regions === null || regions === void 0 ? void 0 : regions.map(option => ({
|
|
49
|
+
result: new RefSequenceResult({
|
|
50
|
+
refName: option.refName,
|
|
51
|
+
label: option.refName,
|
|
52
|
+
matchedAttribute: 'refName',
|
|
53
|
+
}),
|
|
54
|
+
}))) || [], [regions]);
|
|
48
55
|
// notes on implementation:
|
|
49
56
|
// The selectOnFocus setting helps highlight the field when clicked
|
|
50
57
|
return (React.createElement(React.Fragment, null,
|
|
@@ -70,14 +77,6 @@ const RefNameAutocomplete = observer(function ({ model, onSelect, assemblyName,
|
|
|
70
77
|
onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectedOption.result);
|
|
71
78
|
}
|
|
72
79
|
setInputValue(inputBoxVal);
|
|
73
|
-
}, options:
|
|
74
|
-
? ((_a = assembly === null || assembly === void 0 ? void 0 : assembly.regions) === null || _a === void 0 ? void 0 : _a.map(option => ({
|
|
75
|
-
result: new RefSequenceResult({
|
|
76
|
-
refName: option.refName,
|
|
77
|
-
label: option.refName,
|
|
78
|
-
matchedAttribute: 'refName',
|
|
79
|
-
}),
|
|
80
|
-
}))) || []
|
|
81
|
-
: searchOptions, getOptionDisabled: option => option.group === 'limitOption', filterOptions: (opts, { inputValue }) => getFiltered(opts, inputValue), renderInput: params => (React.createElement(AutocompleteTextField, { showHelp: showHelp, params: params, inputBoxVal: inputBoxVal, TextFieldProps: TextFieldProps, setCurrentSearch: setCurrentSearch, setInputValue: setInputValue })), getOptionLabel: opt => typeof opt === 'string' ? opt : opt.result.getDisplayString() })));
|
|
80
|
+
}, options: (searchOptions === null || searchOptions === void 0 ? void 0 : searchOptions.length) ? searchOptions : regionOptions, getOptionDisabled: option => option.group === 'limitOption', filterOptions: (opts, { inputValue }) => getFiltered(opts, inputValue), renderInput: params => (React.createElement(AutocompleteTextField, { showHelp: showHelp, params: params, inputBoxVal: inputBoxVal, TextFieldProps: TextFieldProps, setCurrentSearch: setCurrentSearch, setInputValue: setInputValue })), getOptionLabel: opt => typeof opt === 'string' ? opt : opt.result.getDisplayString() })));
|
|
82
81
|
});
|
|
83
82
|
export default RefNameAutocomplete;
|
|
@@ -238,19 +238,19 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
238
238
|
/**
|
|
239
239
|
* #action
|
|
240
240
|
*/
|
|
241
|
-
|
|
241
|
+
setHideHeader(b: boolean): void;
|
|
242
242
|
/**
|
|
243
243
|
* #action
|
|
244
244
|
*/
|
|
245
|
-
|
|
245
|
+
setHideHeaderOverview(b: boolean): void;
|
|
246
246
|
/**
|
|
247
247
|
* #action
|
|
248
248
|
*/
|
|
249
|
-
|
|
249
|
+
setHideNoTracksActive(b: boolean): void;
|
|
250
250
|
/**
|
|
251
251
|
* #action
|
|
252
252
|
*/
|
|
253
|
-
|
|
253
|
+
setShowGridlines(b: boolean): void;
|
|
254
254
|
/**
|
|
255
255
|
* #action
|
|
256
256
|
*/
|
|
@@ -306,7 +306,7 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
306
306
|
/**
|
|
307
307
|
* #action
|
|
308
308
|
*/
|
|
309
|
-
|
|
309
|
+
setShowCenterLine(b: boolean): void;
|
|
310
310
|
/**
|
|
311
311
|
* #action
|
|
312
312
|
*/
|