From b345bc461ea8c230b2573f467305c813dedda7dd Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 24 Jan 2025 02:03:20 -0500 Subject: [PATCH] Colors from csv --- .../src/UCSCTrackHub/ucscTrackHub.ts | 2 +- .../components/VariantDisplayComponent.tsx | 2 +- .../src/MultiLinearVariantDisplay/model.ts | 18 +- .../components/VariantDisplayComponent.tsx | 2 +- .../MultiLinearVariantMatrixDisplay/model.ts | 18 +- .../StructuralVariantChordRenderer/Chord.tsx | 2 +- plugins/variants/src/VcfAdapter/VcfAdapter.ts | 31 +- .../variants/src/VcfAdapter/configSchema.ts | 11 +- .../src/VcfTabixAdapter/VcfTabixAdapter.ts | 24 +- .../src/VcfTabixAdapter/configSchema.ts | 11 +- .../src/getMultiVariantFeaturesAutorun.ts | 2 +- plugins/variants/src/shared/BulkEditPanel.tsx | 250 ++-- plugins/variants/src/shared/HelpfulTips.tsx | 19 + plugins/variants/src/shared/RowPalettizer.tsx | 66 +- .../variants/src/shared/SetColorDialog.tsx | 176 ++- .../src/MultiLinearWiggleDisplay/util.ts | 8 + .../__snapshots__/jbrowseModel.test.ts.snap | 40 + .../jbrowse-web/src/tests/VcfMatrix.test.tsx | 37 + .../vcf-matrix-test-tsx-matrix-1-snap.png | Bin 0 -> 46618 bytes .../vcf-matrix-test-tsx-regular-1-snap.png | Bin 0 -> 3986 bytes test_data/volvox/1000genomes.tsv | 1095 +++++++++++++++++ test_data/volvox/config.json | 13 +- .../volvox/trix/volvox-rev-del_meta.json | 2 +- test_data/volvox/trix/volvox_meta.json | 6 +- yarn.lock | 142 +-- 25 files changed, 1618 insertions(+), 359 deletions(-) create mode 100644 plugins/variants/src/shared/HelpfulTips.tsx create mode 100644 plugins/wiggle/src/MultiLinearWiggleDisplay/util.ts create mode 100644 products/jbrowse-web/src/tests/VcfMatrix.test.tsx create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/vcf-matrix-test-tsx-matrix-1-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/vcf-matrix-test-tsx-regular-1-snap.png create mode 100644 test_data/volvox/1000genomes.tsv diff --git a/plugins/data-management/src/UCSCTrackHub/ucscTrackHub.ts b/plugins/data-management/src/UCSCTrackHub/ucscTrackHub.ts index 2135ea3e49..bdb840d26e 100644 --- a/plugins/data-management/src/UCSCTrackHub/ucscTrackHub.ts +++ b/plugins/data-management/src/UCSCTrackHub/ucscTrackHub.ts @@ -3,7 +3,7 @@ import { generateUnknownTrackConf } from '@jbrowse/core/util/tracks' import { makeLoc2, makeLoc, makeLocAlt } from './util' -import type { RaStanza, TrackDbFile } from '@gmod/ucsc-hub' +import type { RaStanza, TrackDbFile } from '@gmod/ucsc-hub' import type { FileLocation } from '@jbrowse/core/util' export function generateTracks({ diff --git a/plugins/variants/src/MultiLinearVariantDisplay/components/VariantDisplayComponent.tsx b/plugins/variants/src/MultiLinearVariantDisplay/components/VariantDisplayComponent.tsx index 66b6119fd5..fda5262107 100644 --- a/plugins/variants/src/MultiLinearVariantDisplay/components/VariantDisplayComponent.tsx +++ b/plugins/variants/src/MultiLinearVariantDisplay/components/VariantDisplayComponent.tsx @@ -70,7 +70,7 @@ const MultiLinearVariantDisplayComponent = observer(function (props: { ) .filter(([key]) => key !== 'color') .map(([key, value]) => `${key}:${value}`) - .join('\n')} + .join('
')} /> diff --git a/plugins/variants/src/MultiLinearVariantDisplay/model.ts b/plugins/variants/src/MultiLinearVariantDisplay/model.ts index fef99141a8..202eefbb1f 100644 --- a/plugins/variants/src/MultiLinearVariantDisplay/model.ts +++ b/plugins/variants/src/MultiLinearVariantDisplay/model.ts @@ -1,14 +1,11 @@ import { lazy } from 'react' -import { set1 } from '@jbrowse/core/ui/colors' import { getSession } from '@jbrowse/core/util' import { stopStopToken } from '@jbrowse/core/util/stopToken' import { linearBareDisplayStateModelFactory } from '@jbrowse/plugin-linear-genome-view' import deepEqual from 'fast-deep-equal' import { isAlive, types } from 'mobx-state-tree' -import { randomColor } from '../util' - import type { Source } from '../types' import type PluginManager from '@jbrowse/core/PluginManager' import type { AnyConfigurationSchemaType } from '@jbrowse/core/configuration' @@ -24,7 +21,7 @@ const ClusterDialog = lazy(() => import('../shared/ClusterDialog')) /** * #stateModel MultiLinearVariantDisplay * extends - * - [SharedVariantMixin](../sharedvariantmixin) + * - [LinearBareDisplay](../linearbaredisplay) */ export function stateModelFactory( pluginManager: PluginManager, @@ -160,15 +157,10 @@ export function stateModelFactory( self.sourcesVolatile?.map(s => [s.name, s]) || [], ) const iter = self.layout.length ? self.layout : self.sourcesVolatile - return iter - ?.map(s => ({ - ...sources[s.name], - ...s, - })) - .map((s, i) => ({ - ...s, - color: s.color || set1[i] || randomColor(s.name), - })) + return iter?.map(s => ({ + ...sources[s.name], + ...s, + })) }, })) diff --git a/plugins/variants/src/MultiLinearVariantMatrixDisplay/components/VariantDisplayComponent.tsx b/plugins/variants/src/MultiLinearVariantMatrixDisplay/components/VariantDisplayComponent.tsx index 842dfec511..7bed1bf5ac 100644 --- a/plugins/variants/src/MultiLinearVariantMatrixDisplay/components/VariantDisplayComponent.tsx +++ b/plugins/variants/src/MultiLinearVariantMatrixDisplay/components/VariantDisplayComponent.tsx @@ -70,7 +70,7 @@ const MultiLinearVariantMatrixDisplayComponent = observer(function (props: { ) .filter(([key]) => key !== 'color') .map(([key, value]) => `${key}:${value}`) - .join('\n')} + .join('
')} /> diff --git a/plugins/variants/src/MultiLinearVariantMatrixDisplay/model.ts b/plugins/variants/src/MultiLinearVariantMatrixDisplay/model.ts index e14fb93781..d570842d97 100644 --- a/plugins/variants/src/MultiLinearVariantMatrixDisplay/model.ts +++ b/plugins/variants/src/MultiLinearVariantMatrixDisplay/model.ts @@ -1,15 +1,12 @@ import { lazy } from 'react' import { ConfigurationReference } from '@jbrowse/core/configuration' -import { set1 } from '@jbrowse/core/ui/colors' import { getSession } from '@jbrowse/core/util' import { stopStopToken } from '@jbrowse/core/util/stopToken' import { linearBareDisplayStateModelFactory } from '@jbrowse/plugin-linear-genome-view' import deepEqual from 'fast-deep-equal' import { isAlive, types } from 'mobx-state-tree' -import { randomColor } from '../util' - import type { Source } from '../types' import type { AnyConfigurationSchemaType } from '@jbrowse/core/configuration' import type { Feature } from '@jbrowse/core/util' @@ -24,7 +21,7 @@ const ClusterDialog = lazy(() => import('../shared/ClusterDialog')) /** * #stateModel LinearVariantMatrixDisplay * extends - * - [LinearBasicDisplay](../linearbasicdisplay) + * - [LinearBareDisplay](../linearbaredisplay) */ export default function stateModelFactory( configSchema: AnyConfigurationSchemaType, @@ -142,15 +139,10 @@ export default function stateModelFactory( const sources = Object.fromEntries( self.sourcesVolatile?.map(s => [s.name, s]) || [], ) - return this.preSources - ?.map(s => ({ - ...sources[s.name], - ...s, - })) - .map((s, i) => ({ - ...s, - color: s.color || set1[i] || randomColor(s.name), - })) + return this.preSources?.map(s => ({ + ...sources[s.name], + ...s, + })) }, })) .views(self => { diff --git a/plugins/variants/src/StructuralVariantChordRenderer/Chord.tsx b/plugins/variants/src/StructuralVariantChordRenderer/Chord.tsx index cfb8a5f90a..baeffe10a5 100644 --- a/plugins/variants/src/StructuralVariantChordRenderer/Chord.tsx +++ b/plugins/variants/src/StructuralVariantChordRenderer/Chord.tsx @@ -5,9 +5,9 @@ import { readConfObject } from '@jbrowse/core/configuration' import { getStrokeProps, polarToCartesian } from '@jbrowse/core/util' import { observer } from 'mobx-react' +import type { AnyRegion, Block } from './types' import type { AnyConfigurationModel } from '@jbrowse/core/configuration' import type { Feature } from '@jbrowse/core/util' -import type { AnyRegion, Block } from './types' function bpToRadians(block: Block, pos: number) { const blockStart = block.region.elided ? 0 : block.region.start diff --git a/plugins/variants/src/VcfAdapter/VcfAdapter.ts b/plugins/variants/src/VcfAdapter/VcfAdapter.ts index 3ef1560bc0..a8a122c3f8 100644 --- a/plugins/variants/src/VcfAdapter/VcfAdapter.ts +++ b/plugins/variants/src/VcfAdapter/VcfAdapter.ts @@ -1,11 +1,10 @@ import IntervalTree from '@flatten-js/interval-tree' -import VCF from '@gmod/vcf' +import VcfParser from '@gmod/vcf' import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter' import { fetchAndMaybeUnzip } from '@jbrowse/core/util' import { openLocation } from '@jbrowse/core/util/io' import { ObservableCreate } from '@jbrowse/core/util/rxjs' -// local import VcfFeature from '../VcfFeature' import type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter' @@ -18,6 +17,7 @@ export default class VcfAdapter extends BaseFeatureDataAdapter { vcfFeatures?: Promise<{ header: string + parser: VcfParser intervalTreeMap: Record IntervalTree> }> @@ -29,8 +29,7 @@ export default class VcfAdapter extends BaseFeatureDataAdapter { } async getMetadata() { - const { header } = await this.setup() - const parser = new VCF({ header }) + const { parser } = await this.setup() return parser.getMetadata() } @@ -72,7 +71,7 @@ export default class VcfAdapter extends BaseFeatureDataAdapter { } const header = headerLines.join('\n') - const parser = new VCF({ header }) + const parser = new VcfParser({ header }) const intervalTreeMap = Object.fromEntries( Object.entries(featureMap).map(([refName, lines]) => [ @@ -99,6 +98,7 @@ export default class VcfAdapter extends BaseFeatureDataAdapter { return { header, + parser, intervalTreeMap, } } @@ -135,5 +135,26 @@ export default class VcfAdapter extends BaseFeatureDataAdapter { }, opts.stopToken) } + async getSources() { + const conf = this.getConf('samplesTsvLocation') + if (conf.uri === '' || conf.uri === '/path/to/samples.tsv') { + const { parser } = await this.setup() + return parser.samples.map(name => ({ + name, + })) + } else { + const txt = await openLocation(conf).readFile('utf8') + const lines = txt.split(/\n|\r\n|\r/) + const header = lines[0]!.split('\t') + return lines.slice(1).map(line => + Object.fromEntries( + line + .split('\t') + // force col 0 to be called name + .map((c, idx) => [idx === 0 ? 'name' : header[idx], c]), + ), + ) + } + } public freeResources(): void {} } diff --git a/plugins/variants/src/VcfAdapter/configSchema.ts b/plugins/variants/src/VcfAdapter/configSchema.ts index 2e964778ec..49ad5f0030 100644 --- a/plugins/variants/src/VcfAdapter/configSchema.ts +++ b/plugins/variants/src/VcfAdapter/configSchema.ts @@ -21,9 +21,14 @@ const VcfAdapter = ConfigurationSchema( /** * #slot */ - samples: { - type: 'frozen', - defaultValue: [], + samplesTsvLocation: { + type: 'fileLocation', + defaultValue: { + uri: '/path/to/samples.tsv', + description: + 'tsv with header like name\tpopulation\tetc. where the first column is required, and is the sample names', + locationType: 'UriLocation', + }, }, }, { explicitlyTyped: true }, diff --git a/plugins/variants/src/VcfTabixAdapter/VcfTabixAdapter.ts b/plugins/variants/src/VcfTabixAdapter/VcfTabixAdapter.ts index 17e57e4d77..394f6ec684 100644 --- a/plugins/variants/src/VcfTabixAdapter/VcfTabixAdapter.ts +++ b/plugins/variants/src/VcfTabixAdapter/VcfTabixAdapter.ts @@ -83,12 +83,26 @@ export default class VcfTabixAdapter extends BaseFeatureDataAdapter { observer.complete() }, opts.stopToken) } - async getSources() { - const { parser } = await this.configure() - return parser.samples.map(name => ({ - name, - })) + const conf = this.getConf('samplesTsvLocation') + if (conf.uri === '' || conf.uri === '/path/to/samples.tsv') { + const { parser } = await this.configure() + return parser.samples.map(name => ({ + name, + })) + } else { + const txt = await openLocation(conf).readFile('utf8') + const lines = txt.split(/\n|\r\n|\r/) + const header = lines[0]!.split('\t') + return lines.slice(1).map(line => + Object.fromEntries( + line + .split('\t') + // force col 0 to be called name + .map((c, idx) => [idx === 0 ? 'name' : header[idx], c]), + ), + ) + } } public freeResources(/* { region } */): void {} diff --git a/plugins/variants/src/VcfTabixAdapter/configSchema.ts b/plugins/variants/src/VcfTabixAdapter/configSchema.ts index b41d2cfcb5..beb08f05a6 100644 --- a/plugins/variants/src/VcfTabixAdapter/configSchema.ts +++ b/plugins/variants/src/VcfTabixAdapter/configSchema.ts @@ -39,9 +39,14 @@ const VcfTabixAdapter = ConfigurationSchema( /** * #slot */ - samples: { - type: 'frozen', - defaultValue: [], + samplesTsvLocation: { + type: 'fileLocation', + defaultValue: { + uri: '/path/to/samples.tsv', + description: + 'tsv with header like name\tpopulation\tetc. where the first column is required, and is the sample names', + locationType: 'UriLocation', + }, }, }, { explicitlyTyped: true }, diff --git a/plugins/variants/src/getMultiVariantFeaturesAutorun.ts b/plugins/variants/src/getMultiVariantFeaturesAutorun.ts index 134a1501e5..3119fc1f50 100644 --- a/plugins/variants/src/getMultiVariantFeaturesAutorun.ts +++ b/plugins/variants/src/getMultiVariantFeaturesAutorun.ts @@ -17,7 +17,7 @@ export interface Source { name: string color?: string group?: string - [key: string]: string | undefined + [key: string]: unknown } export function getMultiVariantFeaturesAutorun(self: { diff --git a/plugins/variants/src/shared/BulkEditPanel.tsx b/plugins/variants/src/shared/BulkEditPanel.tsx index 888d0c0e68..7a6816c249 100644 --- a/plugins/variants/src/shared/BulkEditPanel.tsx +++ b/plugins/variants/src/shared/BulkEditPanel.tsx @@ -1,9 +1,16 @@ import { useState } from 'react' import { ErrorMessage } from '@jbrowse/core/ui' -import { Button, TextField, Typography } from '@mui/material' +import { + Button, + DialogActions, + DialogContent, + TextField, + Typography, +} from '@mui/material' import { makeStyles } from 'tss-react/mui' -import { Source } from '../types' + +import type { Source } from '../types' const useStyles = makeStyles()({ textAreaFont: { @@ -12,127 +19,144 @@ const useStyles = makeStyles()({ }) export default function BulkEditPanel({ - setCurrLayout, + onClose, currLayout, }: { currLayout: Source[] - setCurrLayout: (arg: Source[]) => void + onClose: (arg?: Source[]) => void }) { const { classes } = useStyles() const [val, setVal] = useState('') const [error, setError] = useState() return ( -
- - Paste CSV or TSV. If a header column is present. First line is a header. - If a column called "name" is present, it uses that to connect to IDs in - the table, otherwise it uses the first column no. - - { - setVal(event.target.value) - }} - slotProps={{ - input: { - classes: { - input: classes.textAreaFont, - }, - }, - }} - /> - - - {error ? : null} -
+ onClose( + currLayout.map(record => ({ + ...record, + ...newData[record.name], + })), + ) + } else { + setError(new Error('No "name" column found on line 1')) + } + }} + > + Update rows + + + + + + ) } diff --git a/plugins/variants/src/shared/HelpfulTips.tsx b/plugins/variants/src/shared/HelpfulTips.tsx new file mode 100644 index 0000000000..bacb7e2e03 --- /dev/null +++ b/plugins/variants/src/shared/HelpfulTips.tsx @@ -0,0 +1,19 @@ +export default function HelpfulTips() { + return ( + <> + Helpful tips +
    +
  • You can select rows in the table with the checkboxes
  • +
  • Multi-select is enabled with shift-click and control-click
  • +
  • The "Move selected items up/down" can re-arrange subtracks
  • +
  • Sorting the data grid itself can also re-arrange subtracks
  • +
  • Changes are applied when you hit Submit
  • +
  • You can click and drag the dialog box to move it on the screen
  • +
  • + Columns in the table can be hidden using a vertical '...' menu on the + right side of each column +
  • +
+ + ) +} diff --git a/plugins/variants/src/shared/RowPalettizer.tsx b/plugins/variants/src/shared/RowPalettizer.tsx index 8f257f93a0..936bd1f6f5 100644 --- a/plugins/variants/src/shared/RowPalettizer.tsx +++ b/plugins/variants/src/shared/RowPalettizer.tsx @@ -2,7 +2,8 @@ import { set1 } from '@jbrowse/core/ui/colors' import { Button } from '@mui/material' import { randomColor } from '../util' -import { Source } from '../types' + +import type { Source } from '../types' export default function RowPalettizer({ setCurrLayout, @@ -12,41 +13,42 @@ export default function RowPalettizer({ setCurrLayout: (arg: Source[]) => void }) { return ( -
+
+ Assign palette based on... {Object.keys(currLayout[0] ?? []) .filter(f => f !== 'name' && f !== 'color') - .map(r => { - return ( - - ) - })} + setCurrLayout( + currLayout.map(row => ({ + ...row, + color: ret[row[r] as string], + })), + ) + }} + > + {r} + + ))}
) } diff --git a/plugins/variants/src/shared/SetColorDialog.tsx b/plugins/variants/src/shared/SetColorDialog.tsx index 7448f75420..dceadf4bf6 100644 --- a/plugins/variants/src/shared/SetColorDialog.tsx +++ b/plugins/variants/src/shared/SetColorDialog.tsx @@ -5,10 +5,12 @@ import { useLocalStorage } from '@jbrowse/core/util' import { Button, DialogActions, DialogContent } from '@mui/material' import { makeStyles } from 'tss-react/mui' -import SourcesGrid from './SourcesGrid' import BulkEditPanel from './BulkEditPanel' +import HelpfulTips from './HelpfulTips' import RowPalettizer from './RowPalettizer' -import { Source } from '../types' +import SourcesGrid from './SourcesGrid' + +import type { Source } from '../types' const useStyles = makeStyles()({ content: { @@ -50,97 +52,89 @@ export default function SetColorDialog({ maxWidth="xl" title="Multi-variant color/arrangement editor" > - -
- - -
-
- {showTips ? : null} - - {showBulkEditor ? ( - - ) : null} - + {showBulkEditor ? ( + { + if (arg) { + setCurrLayout(arg) + } - -
- - - - - - - ) -} + /> + ) : ( + <> + +
+ + +
-function HelpfulTips() { - return ( - <> - Helpful tips -
    -
  • You can select rows in the table with the checkboxes
  • -
  • Multi-select is enabled with shift-click and control-click
  • -
  • The "Move selected items up/down" can re-arrange subtracks
  • -
  • Sorting the data grid itself can also re-arrange subtracks
  • -
  • Changes are applied when you hit Submit
  • -
  • You can click and drag the dialog box to move it on the screen
  • -
  • - Columns in the table can be hidden using a vertical '...' menu on the - right side of each column -
  • -
- + {showTips ? : null} +
+ + + +
+ + + + + + + )} + ) } diff --git a/plugins/wiggle/src/MultiLinearWiggleDisplay/util.ts b/plugins/wiggle/src/MultiLinearWiggleDisplay/util.ts new file mode 100644 index 0000000000..38d69f0c24 --- /dev/null +++ b/plugins/wiggle/src/MultiLinearWiggleDisplay/util.ts @@ -0,0 +1,8 @@ +export function randomColor(str: string) { + let sum = 0 + + for (let i = 0; i < str.length; i++) { + sum += str.charCodeAt(i) + } + return `hsl(${sum * 10}, 20%, 50%)` +} diff --git a/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap b/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap index e484959036..b9f5ae2e69 100644 --- a/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap +++ b/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap @@ -486,6 +486,10 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` "uri": "volvox.dup.vcf.gz.tbi", }, }, + "samplesTsvLocation": { + "locationType": "UriLocation", + "uri": "/path/to/samples.tsv", + }, "type": "VcfTabixAdapter", "vcfGzLocation": { "locationType": "UriLocation", @@ -533,6 +537,10 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` "uri": "volvox.dup.renamed.vcf.gz.tbi", }, }, + "samplesTsvLocation": { + "locationType": "UriLocation", + "uri": "/path/to/samples.tsv", + }, "type": "VcfTabixAdapter", "vcfGzLocation": { "locationType": "UriLocation", @@ -1193,6 +1201,10 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` "uri": "volvox.test.vcf.gz.tbi", }, }, + "samplesTsvLocation": { + "locationType": "UriLocation", + "uri": "1000genomes.tsv", + }, "type": "VcfTabixAdapter", "vcfGzLocation": { "locationType": "UriLocation", @@ -2132,6 +2144,10 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` "uri": "volvox.filtered.vcf.gz.tbi", }, }, + "samplesTsvLocation": { + "locationType": "UriLocation", + "uri": "/path/to/samples.tsv", + }, "type": "VcfTabixAdapter", "vcfGzLocation": { "locationType": "UriLocation", @@ -2178,6 +2194,10 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` "uri": "volvox.filtered.vcf.gz.tbi", }, }, + "samplesTsvLocation": { + "locationType": "UriLocation", + "uri": "/path/to/samples.tsv", + }, "type": "VcfTabixAdapter", "vcfGzLocation": { "locationType": "UriLocation", @@ -2808,6 +2828,10 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` "uri": "volvox.filtered.vcf.gz.tbi", }, }, + "samplesTsvLocation": { + "locationType": "UriLocation", + "uri": "/path/to/samples.tsv", + }, "type": "VcfTabixAdapter", "vcfGzLocation": { "locationType": "UriLocation", @@ -3138,6 +3162,10 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` "uri": "volvox.inv.vcf.gz.tbi", }, }, + "samplesTsvLocation": { + "locationType": "UriLocation", + "uri": "/path/to/samples.tsv", + }, "type": "VcfTabixAdapter", "vcfGzLocation": { "locationType": "UriLocation", @@ -3355,6 +3383,10 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` }, { "adapter": { + "samplesTsvLocation": { + "locationType": "UriLocation", + "uri": "/path/to/samples.tsv", + }, "type": "VcfAdapter", "vcfLocation": { "locationType": "UriLocation", @@ -3461,6 +3493,10 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` }, { "adapter": { + "samplesTsvLocation": { + "locationType": "UriLocation", + "uri": "/path/to/samples.tsv", + }, "type": "VcfAdapter", "vcfLocation": { "locationType": "UriLocation", @@ -3501,6 +3537,10 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` }, { "adapter": { + "samplesTsvLocation": { + "locationType": "UriLocation", + "uri": "/path/to/samples.tsv", + }, "type": "VcfAdapter", "vcfLocation": { "locationType": "UriLocation", diff --git a/products/jbrowse-web/src/tests/VcfMatrix.test.tsx b/products/jbrowse-web/src/tests/VcfMatrix.test.tsx new file mode 100644 index 0000000000..ed439f131c --- /dev/null +++ b/products/jbrowse-web/src/tests/VcfMatrix.test.tsx @@ -0,0 +1,37 @@ +import { fireEvent } from '@testing-library/react' + +import { createView, doBeforeEach, expectCanvasMatch, hts, setup } from './util' + +setup() + +beforeEach(() => { + doBeforeEach() +}) + +const delay = { timeout: 30000 } +const opts = [{}, delay] + +test('matrix', async () => { + const { view, findByTestId, findByText } = await createView() + await view.navToLocString('ctgA') + fireEvent.click(await findByTestId(hts('volvox_test_vcf'), ...opts)) + + fireEvent.click(await findByTestId('track_menu_icon', ...opts)) + fireEvent.click(await findByText('Display types', ...opts)) + fireEvent.click(await findByText('Multi-variant display (matrix)', ...opts)) + fireEvent.click(await findByText('Force load', ...opts)) + expectCanvasMatch(await findByTestId(/prerendered_canvas/, ...opts)) +}, 40000) + +test('regular', async () => { + const { view, findByTestId, findByText, findAllByTestId } = await createView() + + await view.navToLocString('ctgA') + fireEvent.click(await findByTestId(hts('volvox_test_vcf'), ...opts)) + + fireEvent.click(await findByTestId('track_menu_icon', ...opts)) + fireEvent.click(await findByText('Display types', ...opts)) + fireEvent.click(await findByText('Multi-variant display (regular)', ...opts)) + fireEvent.click(await findByText('Force load', ...opts)) + expectCanvasMatch((await findAllByTestId(/prerendered_canvas/, ...opts))[0]!) +}, 40000) diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/vcf-matrix-test-tsx-matrix-1-snap.png b/products/jbrowse-web/src/tests/__image_snapshots__/vcf-matrix-test-tsx-matrix-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..bc163a4bd55d28e36210c6d52ced88be8b1efe04 GIT binary patch literal 46618 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 literal 0 HcmV?d00001 diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/vcf-matrix-test-tsx-regular-1-snap.png b/products/jbrowse-web/src/tests/__image_snapshots__/vcf-matrix-test-tsx-regular-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..24876b6758d779a158c547dd592060a4edaf40fb GIT binary patch literal 3986 zcmeAS@N?(olHy`uVBq!ia0y~yU~^z#V4T3g1{C==bq$DOOY(MiVfYV%3-&Ib%)r3! z?&;zfQZeW4ZNo6>aEXSC?tR}T9E)>ZGO4Sq?4Xm4PD|{HrHiKQ>8jw@oU3&5qab5- zkD;>N{o7|RXFPkp@SXMhqz$VcfBaE-viA1dZ;!I?SO55V>G!mK|F_=zeE<8t@^#m% z?rop9yQF^JuKJgsr`grNES~q<`p5r0^)?^>^q-!$`~Lsp|0cGt|K5N7Ie!2AnD=`3 z<9iH`J^XiG{O{gBEABqs&8{u}|DV16{4zzl~z1|~4$3CCa+$N@T{d)52yEgW_z!6dN zkcAfZjYcXcF=M9b&5_j%3zB!=x8GGaXIc3Cr77j*yEFb4l>YS+W&~=EyMZEci&%^19^dg;oLM~1u$a>6jXz@1SQ^K=hEIXR?K^BGB+mw zdF9qfaL7NnW5GDs>j>g~IQZ+kA?z1WRsF)k@A55W71?#`{MVI#{`0~Ll!!jGj%H&} zIESmy@!6*LdkWcp@3`{rUD;bfG0QvkRy*&-+U*;%?M6`J>)h$G{qo5@ zg`jx-scL)Y`&*m!W~Vowkv}GpoOAr_$xr8h+5Ua;{wp|Uqj%ijz5DihyXQ-7YwkxC zgOc)r=to1Z!3^o-T(XO+3fJzyHWqQAHMok>pd&TU(;|mJby~R=i8Rp Se9l$^q|npV&t;ucLK6U^uB8b8 literal 0 HcmV?d00001 diff --git a/test_data/volvox/1000genomes.tsv b/test_data/volvox/1000genomes.tsv new file mode 100644 index 0000000000..8ed02f4db2 --- /dev/null +++ b/test_data/volvox/1000genomes.tsv @@ -0,0 +1,1095 @@ +sample group letter +HG00096 resistant a +HG00097 resistant a +HG00099 resistant a +HG00100 resistant a +HG00101 resistant a +HG00102 resistant a +HG00103 resistant a +HG00104 resistant a +HG00106 resistant a +HG00108 resistant a +HG00109 resistant a +HG00110 resistant a +HG00111 resistant a +HG00112 resistant a +HG00113 resistant a +HG00114 resistant a +HG00116 resistant a +HG00117 resistant a +HG00118 resistant a +HG00119 resistant a +HG00120 resistant a +HG00121 resistant a +HG00122 resistant a +HG00123 resistant a +HG00124 resistant a +HG00125 resistant a +HG00126 resistant a +HG00127 resistant a +HG00128 resistant a +HG00129 resistant a +HG00130 resistant a +HG00131 resistant a +HG00133 resistant a +HG00134 resistant a +HG00135 resistant a +HG00136 resistant a +HG00137 resistant a +HG00138 resistant a +HG00139 resistant a +HG00140 resistant a +HG00141 resistant a +HG00142 resistant a +HG00143 resistant a +HG00146 resistant a +HG00148 resistant a +HG00149 resistant a +HG00150 resistant a +HG00151 resistant a +HG00152 resistant a +HG00154 resistant a +HG00155 resistant a +HG00156 resistant a +HG00158 resistant a +HG00159 resistant a +HG00160 resistant a +HG00171 resistant a +HG00173 resistant a +HG00174 resistant a +HG00176 resistant a +HG00177 resistant a +HG00178 resistant a +HG00179 resistant a +HG00180 resistant a +HG00182 resistant a +HG00183 resistant a +HG00185 resistant a +HG00186 resistant a +HG00187 resistant a +HG00188 resistant a +HG00189 resistant a +HG00190 resistant a +HG00231 resistant a +HG00232 resistant a +HG00233 resistant a +HG00234 resistant a +HG00235 resistant a +HG00236 resistant a +HG00237 resistant a +HG00238 resistant a +HG00239 resistant a +HG00240 resistant a +HG00242 resistant a +HG00243 resistant a +HG00244 resistant a +HG00245 resistant a +HG00246 resistant a +HG00247 resistant a +HG00249 resistant a +HG00250 resistant a +HG00251 resistant a +HG00252 resistant a +HG00253 resistant a +HG00254 resistant a +HG00255 resistant a +HG00256 resistant a +HG00257 resistant a +HG00258 resistant a +HG00259 resistant a +HG00260 resistant a +HG00261 resistant a +HG00262 resistant a +HG00263 resistant a +HG00264 resistant a +HG00265 resistant a +HG00266 resistant a +HG00267 resistant a +HG00268 resistant a +HG00269 resistant a +HG00270 resistant a +HG00271 resistant a +HG00272 resistant a +HG00273 resistant a +HG00274 resistant a +HG00275 resistant a +HG00276 resistant a +HG00277 resistant a +HG00278 resistant a +HG00280 resistant a +HG00281 resistant a +HG00282 resistant a +HG00284 resistant a +HG00285 resistant a +HG00306 resistant a +HG00309 resistant a +HG00310 resistant a +HG00311 resistant a +HG00312 resistant a +HG00313 resistant a +HG00315 resistant a +HG00318 resistant a +HG00319 resistant a +HG00320 resistant a +HG00321 resistant a +HG00323 resistant a +HG00324 resistant a +HG00325 resistant a +HG00326 resistant a +HG00327 resistant a +HG00328 resistant a +HG00329 resistant a +HG00330 resistant a +HG00331 resistant a +HG00332 resistant a +HG00334 resistant a +HG00335 resistant a +HG00336 resistant a +HG00337 resistant a +HG00338 resistant a +HG00339 resistant a +HG00341 resistant a +HG00342 resistant a +HG00343 resistant a +HG00344 resistant a +HG00345 resistant a +HG00346 resistant a +HG00349 resistant a +HG00350 resistant a +HG00351 resistant a +HG00353 resistant a +HG00355 resistant a +HG00356 resistant a +HG00357 resistant a +HG00358 resistant a +HG00359 resistant a +HG00360 resistant a +HG00361 resistant a +HG00362 resistant a +HG00364 resistant a +HG00366 resistant a +HG00367 resistant a +HG00369 resistant a +HG00372 resistant a +HG00373 resistant a +HG00375 resistant a +HG00376 resistant a +HG00377 resistant a +HG00378 resistant a +HG00381 resistant a +HG00382 resistant a +HG00383 resistant a +HG00384 resistant a +HG00403 resistant a +HG00404 resistant a +HG00406 resistant a +HG00407 resistant a +HG00418 resistant a +HG00419 resistant a +HG00421 resistant a +HG00422 resistant a +HG00427 resistant a +HG00428 resistant a +HG00436 resistant a +HG00437 resistant a +HG00442 resistant a +HG00443 resistant a +HG00445 resistant a +HG00446 resistant a +HG00448 resistant a +HG00449 resistant a +HG00451 resistant a +HG00452 resistant a +HG00457 resistant a +HG00458 resistant a +HG00463 resistant a +HG00464 resistant a +HG00472 resistant a +HG00473 resistant a +HG00475 resistant a +HG00476 resistant a +HG00478 resistant a +HG00479 resistant a +HG00500 resistant a +HG00501 resistant a +HG00512 resistant a +HG00513 resistant a +HG00524 resistant a +HG00525 resistant a +HG00530 resistant a +HG00531 resistant a +HG00533 resistant a +HG00534 resistant a +HG00536 resistant a +HG00537 resistant a +HG00542 resistant a +HG00543 resistant a +HG00553 resistant a +HG00554 resistant a +HG00556 resistant a +HG00557 resistant a +HG00559 resistant a +HG00560 resistant a +HG00565 resistant b +HG00566 resistant b +HG00577 resistant b +HG00578 resistant b +HG00580 resistant b +HG00581 resistant b +HG00583 resistant b +HG00584 resistant b +HG00589 resistant b +HG00590 resistant b +HG00592 resistant b +HG00593 resistant b +HG00595 resistant b +HG00596 resistant b +HG00607 resistant b +HG00608 resistant b +HG00610 resistant b +HG00611 resistant b +HG00613 resistant b +HG00614 resistant b +HG00619 resistant b +HG00620 resistant b +HG00625 resistant b +HG00626 resistant b +HG00628 resistant b +HG00629 resistant b +HG00634 resistant b +HG00635 resistant b +HG00637 resistant b +HG00638 resistant b +HG00640 resistant b +HG00641 resistant b +HG00650 resistant b +HG00651 resistant b +HG00653 resistant b +HG00654 resistant b +HG00656 resistant b +HG00657 resistant b +HG00662 resistant b +HG00663 resistant b +HG00671 resistant b +HG00672 resistant b +HG00683 resistant b +HG00684 resistant b +HG00689 resistant b +HG00690 resistant b +HG00692 resistant b +HG00693 resistant b +HG00698 resistant b +HG00699 resistant b +HG00701 resistant b +HG00702 resistant b +HG00704 resistant b +HG00705 resistant b +HG00707 resistant b +HG00708 resistant b +HG00731 resistant b +HG00732 resistant b +HG00734 resistant b +HG00736 resistant b +HG00737 resistant b +HG00740 resistant b +HG01047 resistant b +HG01048 resistant b +HG01051 resistant b +HG01052 resistant b +HG01055 resistant b +HG01060 resistant b +HG01061 resistant b +HG01066 resistant b +HG01067 resistant b +HG01069 resistant b +HG01070 resistant b +HG01072 resistant b +HG01073 resistant b +HG01075 resistant b +HG01079 resistant b +HG01080 resistant b +HG01082 resistant b +HG01083 resistant b +HG01085 resistant b +HG01095 resistant b +HG01097 resistant b +HG01098 resistant b +HG01101 resistant b +HG01102 resistant b +HG01104 resistant b +HG01105 resistant b +HG01107 resistant b +HG01108 resistant b +HG01112 resistant b +HG01113 resistant b +HG01124 resistant b +HG01125 resistant b +HG01133 resistant b +HG01134 resistant b +HG01136 resistant b +HG01137 resistant b +HG01140 resistant b +HG01148 resistant b +HG01149 resistant b +HG01167 resistant b +HG01168 resistant b +HG01170 resistant b +HG01171 resistant b +HG01173 resistant b +HG01174 resistant b +HG01176 resistant b +HG01183 resistant b +HG01187 resistant b +HG01188 resistant b +HG01190 resistant b +HG01191 resistant b +HG01197 resistant b +HG01198 resistant b +HG01204 resistant b +HG01250 resistant b +HG01251 resistant b +HG01257 resistant b +HG01259 resistant b +HG01271 resistant b +HG01272 resistant b +HG01274 resistant b +HG01275 resistant b +HG01277 resistant b +HG01278 resistant b +HG01334 resistant b +HG01342 resistant b +HG01344 resistant b +HG01345 resistant b +HG01350 resistant b +HG01351 resistant b +HG01353 resistant b +HG01354 resistant b +HG01356 resistant b +HG01357 resistant b +HG01359 resistant b +HG01360 resistant b +HG01365 resistant b +HG01366 resistant b +HG01374 resistant b +HG01375 resistant b +HG01377 resistant b +HG01378 resistant b +HG01383 resistant c +HG01384 resistant c +HG01389 resistant c +HG01390 resistant c +HG01437 resistant c +HG01440 resistant c +HG01441 resistant c +HG01455 resistant c +HG01456 resistant c +HG01461 resistant c +HG01462 resistant c +HG01465 resistant c +HG01488 resistant c +HG01489 resistant c +HG01491 resistant c +HG01492 resistant c +HG01494 resistant c +HG01495 resistant c +HG01497 resistant c +HG01498 resistant c +HG01515 resistant c +HG01516 resistant c +HG01518 resistant c +HG01519 resistant c +HG01521 resistant c +HG01522 resistant c +HG01550 resistant c +HG01551 resistant c +HG01617 resistant c +HG01618 resistant c +HG01619 resistant c +HG01620 resistant c +HG01623 resistant c +HG01624 resistant c +HG01625 resistant c +HG01626 resistant c +NA06984 resistant c +NA06986 resistant c +NA06989 resistant c +NA06994 resistant c +NA07000 resistant c +NA07037 resistant c +NA07048 resistant c +NA07051 resistant c +NA07056 resistant c +NA07346 resistant c +NA07347 resistant c +NA07357 resistant c +NA10847 resistant c +NA10851 resistant c +NA11829 resistant c +NA11830 resistant c +NA11831 resistant c +NA11843 resistant c +NA11892 resistant c +NA11893 resistant c +NA11894 resistant c +NA11918 resistant c +NA11919 resistant c +NA11920 resistant c +NA11930 resistant c +NA11931 resistant c +NA11932 resistant c +NA11933 resistant c +NA11992 resistant c +NA11993 resistant c +NA11994 resistant c +NA11995 resistant c +NA12003 resistant c +NA12004 resistant c +NA12006 resistant c +NA12043 resistant c +NA12044 resistant c +NA12045 resistant c +NA12046 resistant c +NA12058 resistant c +NA12144 resistant c +NA12154 resistant c +NA12155 resistant c +NA12249 resistant c +NA12272 resistant c +NA12273 resistant c +NA12275 resistant c +NA12282 resistant c +NA12283 resistant c +NA12286 resistant c +NA12287 resistant c +NA12340 resistant c +NA12341 resistant c +NA12342 resistant c +NA12347 resistant c +NA12348 resistant c +NA12383 resistant c +NA12399 resistant c +NA12400 resistant c +NA12413 resistant c +NA12489 resistant c +NA12546 resistant c +NA12716 resistant c +NA12717 resistant c +NA12718 resistant c +NA12748 resistant c +NA12749 resistant c +NA12750 resistant c +NA12751 resistant c +NA12761 resistant c +NA12763 resistant c +NA12775 resistant c +NA12777 resistant c +NA12778 resistant c +NA12812 resistant c +NA12814 resistant c +NA12815 resistant c +NA12827 resistant c +NA12829 resistant c +NA12830 resistant c +NA12842 resistant c +NA12843 resistant c +NA12872 resistant c +NA12873 resistant c +NA12874 resistant c +NA12889 resistant c +NA12890 resistant c +NA18486 resistant c +NA18487 resistant c +NA18489 resistant c +NA18498 resistant c +NA18499 resistant c +NA18501 resistant c +NA18502 resistant c +NA18504 resistant c +NA18505 resistant c +NA18507 resistant c +NA18508 resistant c +NA18510 resistant c +NA18511 nonresistant c +NA18516 nonresistant c +NA18517 nonresistant c +NA18519 nonresistant c +NA18520 nonresistant c +NA18522 nonresistant c +NA18523 nonresistant c +NA18525 nonresistant c +NA18526 nonresistant c +NA18527 nonresistant c +NA18528 nonresistant c +NA18530 nonresistant c +NA18532 nonresistant c +NA18534 nonresistant c +NA18535 nonresistant c +NA18536 nonresistant c +NA18537 nonresistant c +NA18538 nonresistant c +NA18539 nonresistant c +NA18541 nonresistant c +NA18542 nonresistant c +NA18543 nonresistant c +NA18544 nonresistant c +NA18545 nonresistant c +NA18546 nonresistant c +NA18547 nonresistant c +NA18548 nonresistant c +NA18549 nonresistant c +NA18550 nonresistant c +NA18552 nonresistant c +NA18553 nonresistant c +NA18555 nonresistant c +NA18557 nonresistant c +NA18558 nonresistant c +NA18559 nonresistant c +NA18560 nonresistant c +NA18561 nonresistant c +NA18562 nonresistant c +NA18563 nonresistant c +NA18564 nonresistant c +NA18565 nonresistant c +NA18566 nonresistant c +NA18567 nonresistant c +NA18570 nonresistant c +NA18571 nonresistant c +NA18572 nonresistant c +NA18573 nonresistant c +NA18574 nonresistant c +NA18576 nonresistant c +NA18577 nonresistant c +NA18579 nonresistant c +NA18582 nonresistant c +NA18592 nonresistant c +NA18593 nonresistant c +NA18595 nonresistant c +NA18596 nonresistant c +NA18597 nonresistant c +NA18599 nonresistant c +NA18602 nonresistant c +NA18603 nonresistant c +NA18605 nonresistant c +NA18606 nonresistant c +NA18608 nonresistant c +NA18609 nonresistant c +NA18610 nonresistant c +NA18611 nonresistant c +NA18612 nonresistant c +NA18613 nonresistant c +NA18614 nonresistant c +NA18615 nonresistant c +NA18616 nonresistant c +NA18617 nonresistant c +NA18618 nonresistant c +NA18619 nonresistant c +NA18620 nonresistant c +NA18621 nonresistant c +NA18622 nonresistant c +NA18623 nonresistant c +NA18624 nonresistant c +NA18626 nonresistant c +NA18627 nonresistant c +NA18628 nonresistant c +NA18630 nonresistant c +NA18631 nonresistant c +NA18632 nonresistant c +NA18633 nonresistant c +NA18634 nonresistant c +NA18635 nonresistant c +NA18636 nonresistant c +NA18637 nonresistant c +NA18638 nonresistant c +NA18639 nonresistant c +NA18640 nonresistant c +NA18641 nonresistant c +NA18642 nonresistant c +NA18643 nonresistant c +NA18645 nonresistant d +NA18647 nonresistant d +NA18740 nonresistant d +NA18745 nonresistant d +NA18747 nonresistant d +NA18748 nonresistant d +NA18749 nonresistant d +NA18757 nonresistant d +NA18853 nonresistant d +NA18856 nonresistant d +NA18858 nonresistant d +NA18861 nonresistant d +NA18867 nonresistant d +NA18868 nonresistant d +NA18870 nonresistant d +NA18871 nonresistant d +NA18873 nonresistant d +NA18874 nonresistant d +NA18907 nonresistant d +NA18908 nonresistant d +NA18909 nonresistant d +NA18910 nonresistant d +NA18912 nonresistant d +NA18916 nonresistant d +NA18917 nonresistant d +NA18923 nonresistant d +NA18924 nonresistant d +NA18933 nonresistant d +NA18934 nonresistant d +NA18939 nonresistant d +NA18940 nonresistant d +NA18941 nonresistant d +NA18942 nonresistant d +NA18943 nonresistant d +NA18944 nonresistant d +NA18945 nonresistant d +NA18946 nonresistant d +NA18947 nonresistant d +NA18948 nonresistant d +NA18949 nonresistant d +NA18950 nonresistant d +NA18951 nonresistant d +NA18952 nonresistant d +NA18953 nonresistant d +NA18954 nonresistant d +NA18956 nonresistant d +NA18957 nonresistant d +NA18959 nonresistant d +NA18960 nonresistant d +NA18961 nonresistant d +NA18962 nonresistant d +NA18963 nonresistant d +NA18964 nonresistant d +NA18965 nonresistant d +NA18966 nonresistant d +NA18968 nonresistant d +NA18971 nonresistant d +NA18973 nonresistant d +NA18974 nonresistant d +NA18975 nonresistant d +NA18976 nonresistant d +NA18977 nonresistant d +NA18978 nonresistant d +NA18980 nonresistant d +NA18981 nonresistant d +NA18982 nonresistant d +NA18983 nonresistant d +NA18984 nonresistant d +NA18985 nonresistant d +NA18986 nonresistant d +NA18987 nonresistant d +NA18988 nonresistant d +NA18989 nonresistant d +NA18990 nonresistant d +NA18992 nonresistant d +NA18994 nonresistant d +NA18995 nonresistant d +NA18998 nonresistant d +NA18999 nonresistant d +NA19000 nonresistant d +NA19002 nonresistant d +NA19003 nonresistant d +NA19004 nonresistant d +NA19005 nonresistant d +NA19007 nonresistant d +NA19009 nonresistant d +NA19010 nonresistant d +NA19012 nonresistant d +NA19020 nonresistant d +NA19028 nonresistant d +NA19035 nonresistant d +NA19036 nonresistant d +NA19038 nonresistant d +NA19041 nonresistant d +NA19044 nonresistant d +NA19046 nonresistant d +NA19054 nonresistant d +NA19055 nonresistant d +NA19056 nonresistant d +NA19057 nonresistant d +NA19058 nonresistant d +NA19059 nonresistant d +NA19060 nonresistant d +NA19062 nonresistant d +NA19063 nonresistant d +NA19064 nonresistant d +NA19065 nonresistant d +NA19066 nonresistant d +NA19067 nonresistant d +NA19068 nonresistant d +NA19070 nonresistant d +NA19072 nonresistant d +NA19074 nonresistant d +NA19075 nonresistant d +NA19076 nonresistant d +NA19077 nonresistant d +NA19078 nonresistant d +NA19079 nonresistant d +NA19080 nonresistant d +NA19081 nonresistant d +NA19082 nonresistant d +NA19083 nonresistant d +NA19084 nonresistant d +NA19085 nonresistant d +NA19087 nonresistant d +NA19088 nonresistant d +NA19093 nonresistant d +NA19095 nonresistant d +NA19096 nonresistant d +NA19098 nonresistant d +NA19099 nonresistant d +NA19102 nonresistant d +NA19107 nonresistant d +NA19108 nonresistant d +NA19113 nonresistant d +NA19114 nonresistant d +NA19116 nonresistant d +NA19117 nonresistant d +NA19118 nonresistant d +NA19119 nonresistant d +NA19121 nonresistant d +NA19129 nonresistant d +NA19130 nonresistant d +NA19131 nonresistant d +NA19137 nonresistant d +NA19138 nonresistant d +NA19146 nonresistant d +NA19147 nonresistant d +NA19149 nonresistant d +NA19150 nonresistant d +NA19152 nonresistant d +NA19160 nonresistant d +NA19171 nonresistant d +NA19172 nonresistant d +NA19175 nonresistant d +NA19185 nonresistant d +NA19189 nonresistant d +NA19190 nonresistant d +NA19197 nonresistant d +NA19198 nonresistant d +NA19200 nonresistant d +NA19204 nonresistant d +NA19207 nonresistant d +NA19209 nonresistant d +NA19213 nonresistant d +NA19222 nonresistant d +NA19223 nonresistant d +NA19225 nonresistant d +NA19235 nonresistant d +NA19236 nonresistant d +NA19247 nonresistant d +NA19248 nonresistant d +NA19256 nonresistant d +NA19257 nonresistant d +NA19307 nonresistant d +NA19308 nonresistant d +NA19309 nonresistant d +NA19310 nonresistant d +NA19311 nonresistant d +NA19312 nonresistant d +NA19313 nonresistant d +NA19315 nonresistant d +NA19316 nonresistant d +NA19317 nonresistant d +NA19318 nonresistant d +NA19319 nonresistant d +NA19321 nonresistant d +NA19324 nonresistant d +NA19327 nonresistant d +NA19328 nonresistant d +NA19331 nonresistant d +NA19332 nonresistant d +NA19334 nonresistant d +NA19338 nonresistant d +NA19346 nonresistant d +NA19347 nonresistant d +NA19350 nonresistant d +NA19351 nonresistant d +NA19352 nonresistant d +NA19355 nonresistant d +NA19359 nonresistant d +NA19360 nonresistant d +NA19371 nonresistant d +NA19372 nonresistant d +NA19373 nonresistant d +NA19374 nonresistant d +NA19375 nonresistant d +NA19376 nonresistant d +NA19377 nonresistant d +NA19379 nonresistant d +NA19380 nonresistant d +NA19381 nonresistant e +NA19382 nonresistant e +NA19383 nonresistant e +NA19384 nonresistant e +NA19385 nonresistant e +NA19390 nonresistant e +NA19391 nonresistant e +NA19393 nonresistant e +NA19394 nonresistant e +NA19395 nonresistant e +NA19396 nonresistant e +NA19397 nonresistant e +NA19398 nonresistant e +NA19399 nonresistant e +NA19401 nonresistant e +NA19403 nonresistant e +NA19404 nonresistant e +NA19428 nonresistant e +NA19429 nonresistant e +NA19430 nonresistant e +NA19431 nonresistant e +NA19434 nonresistant e +NA19435 nonresistant e +NA19436 nonresistant e +NA19437 nonresistant e +NA19438 nonresistant e +NA19439 nonresistant e +NA19440 nonresistant e +NA19443 nonresistant e +NA19444 nonresistant e +NA19445 nonresistant e +NA19446 nonresistant e +NA19448 nonresistant e +NA19449 nonresistant e +NA19451 nonresistant e +NA19452 nonresistant e +NA19453 nonresistant e +NA19455 nonresistant e +NA19456 nonresistant e +NA19457 nonresistant e +NA19461 nonresistant e +NA19462 nonresistant e +NA19463 nonresistant e +NA19466 nonresistant e +NA19467 nonresistant e +NA19468 nonresistant e +NA19469 nonresistant e +NA19470 nonresistant e +NA19471 nonresistant e +NA19472 nonresistant e +NA19473 nonresistant e +NA19474 nonresistant e +NA19625 nonresistant e +NA19648 nonresistant e +NA19651 nonresistant e +NA19652 nonresistant e +NA19654 nonresistant e +NA19655 nonresistant e +NA19657 nonresistant e +NA19660 nonresistant e +NA19661 nonresistant e +NA19663 nonresistant e +NA19664 nonresistant e +NA19672 nonresistant e +NA19675 nonresistant e +NA19676 nonresistant e +NA19678 nonresistant e +NA19679 nonresistant e +NA19681 nonresistant e +NA19682 nonresistant e +NA19684 nonresistant e +NA19685 nonresistant e +NA19700 nonresistant e +NA19701 nonresistant e +NA19703 nonresistant e +NA19704 nonresistant e +NA19707 nonresistant e +NA19711 nonresistant e +NA19712 nonresistant e +NA19713 nonresistant e +NA19716 nonresistant e +NA19717 nonresistant e +NA19719 nonresistant e +NA19720 nonresistant e +NA19722 nonresistant e +NA19723 nonresistant e +NA19725 nonresistant e +NA19726 nonresistant e +NA19728 nonresistant e +NA19729 nonresistant e +NA19731 nonresistant e +NA19732 nonresistant e +NA19734 nonresistant e +NA19735 nonresistant e +NA19737 nonresistant e +NA19738 nonresistant e +NA19740 nonresistant e +NA19741 nonresistant e +NA19746 nonresistant e +NA19747 nonresistant e +NA19749 nonresistant e +NA19750 nonresistant e +NA19752 nonresistant e +NA19753 nonresistant e +NA19755 nonresistant e +NA19756 nonresistant e +NA19758 nonresistant e +NA19759 nonresistant e +NA19761 nonresistant e +NA19762 nonresistant e +NA19764 nonresistant e +NA19770 nonresistant e +NA19771 nonresistant e +NA19773 nonresistant e +NA19774 nonresistant e +NA19776 nonresistant e +NA19777 nonresistant e +NA19779 nonresistant e +NA19780 nonresistant e +NA19782 nonresistant e +NA19783 nonresistant e +NA19785 nonresistant e +NA19786 nonresistant e +NA19788 nonresistant e +NA19789 nonresistant e +NA19794 nonresistant e +NA19795 nonresistant e +NA19818 nonresistant e +NA19819 nonresistant e +NA19834 nonresistant e +NA19835 nonresistant e +NA19900 nonresistant e +NA19901 nonresistant e +NA19904 nonresistant e +NA19908 nonresistant e +NA19909 nonresistant e +NA19914 nonresistant e +NA19916 nonresistant e +NA19917 nonresistant e +NA19920 nonresistant e +NA19921 nonresistant e +NA19922 nonresistant e +NA19923 nonresistant e +NA19982 nonresistant e +NA19984 nonresistant e +NA19985 nonresistant e +NA20126 nonresistant e +NA20127 nonresistant e +NA20276 nonresistant e +NA20278 nonresistant e +NA20281 nonresistant e +NA20282 nonresistant e +NA20287 nonresistant e +NA20289 nonresistant e +NA20291 nonresistant e +NA20294 nonresistant e +NA20296 nonresistant e +NA20298 nonresistant e +NA20299 nonresistant e +NA20314 nonresistant e +NA20317 nonresistant e +NA20322 nonresistant e +NA20332 nonresistant e +NA20334 nonresistant e +NA20336 nonresistant e +NA20339 nonresistant e +NA20340 nonresistant e +NA20341 nonresistant e +NA20342 nonresistant e +NA20344 nonresistant e +NA20346 nonresistant e +NA20348 nonresistant e +NA20351 nonresistant e +NA20356 nonresistant e +NA20357 nonresistant e +NA20359 nonresistant e +NA20363 nonresistant e +NA20412 nonresistant e +NA20414 nonresistant e +NA20502 nonresistant e +NA20503 nonresistant e +NA20504 nonresistant e +NA20505 nonresistant e +NA20506 nonresistant e +NA20507 nonresistant e +NA20508 nonresistant e +NA20509 nonresistant e +NA20510 nonresistant e +NA20512 nonresistant e +NA20513 nonresistant e +NA20515 nonresistant e +NA20516 nonresistant e +NA20517 nonresistant e +NA20518 nonresistant e +NA20519 nonresistant e +NA20520 nonresistant e +NA20521 nonresistant e +NA20522 nonresistant e +NA20524 nonresistant e +NA20525 nonresistant e +NA20527 nonresistant e +NA20528 nonresistant e +NA20529 nonresistant e +NA20530 nonresistant e +NA20531 nonresistant e +NA20532 nonresistant e +NA20533 nonresistant e +NA20534 nonresistant e +NA20535 nonresistant e +NA20536 nonresistant e +NA20537 nonresistant e +NA20538 nonresistant e +NA20539 nonresistant e +NA20540 nonresistant e +NA20541 nonresistant e +NA20542 nonresistant e +NA20543 nonresistant e +NA20544 nonresistant e +NA20581 nonresistant e +NA20582 nonresistant e +NA20585 nonresistant e +NA20586 nonresistant e +NA20588 nonresistant e +NA20589 nonresistant e +NA20752 nonresistant e +NA20753 nonresistant e +NA20754 nonresistant e +NA20755 nonresistant e +NA20756 nonresistant e +NA20757 nonresistant e +NA20758 nonresistant e +NA20759 nonresistant e +NA20760 nonresistant e +NA20761 nonresistant e +NA20765 nonresistant e +NA20766 nonresistant e +NA20768 nonresistant e +NA20769 nonresistant e +NA20770 nonresistant e +NA20771 nonresistant e +NA20772 nonresistant e +NA20773 nonresistant e +NA20774 nonresistant e +NA20775 nonresistant e +NA20778 nonresistant e +NA20783 nonresistant e +NA20785 nonresistant e +NA20786 nonresistant e +NA20787 nonresistant e +NA20790 nonresistant e +NA20792 nonresistant e +NA20795 nonresistant e +NA20796 nonresistant e +NA20797 nonresistant e +NA20798 nonresistant e +NA20799 nonresistant e +NA20800 nonresistant e +NA20801 nonresistant e +NA20802 nonresistant e +NA20803 nonresistant e +NA20804 nonresistant e +NA20805 nonresistant e +NA20806 nonresistant e +NA20807 nonresistant e +NA20808 nonresistant e +NA20809 nonresistant e +NA20810 nonresistant e +NA20811 nonresistant e +NA20812 nonresistant e +NA20813 nonresistant e +NA20814 nonresistant e +NA20815 nonresistant e +NA20816 nonresistant e +NA20818 nonresistant e +NA20819 nonresistant e +NA20826 nonresistant e +NA20828 nonresistant e diff --git a/test_data/volvox/config.json b/test_data/volvox/config.json index db228fdb93..7a0679410a 100644 --- a/test_data/volvox/config.json +++ b/test_data/volvox/config.json @@ -365,7 +365,9 @@ "type": "LinearPileupDisplay", "displayId": "volvox_cram_pileup_pileup", "height": 400, - "colorBy": { "type": "mappingQuality" } + "colorBy": { + "type": "mappingQuality" + } } ] }, @@ -514,7 +516,9 @@ "pileupDisplay": { "type": "LinearPileupDisplay", "displayId": "volvox_bam_altname_alignments_pileup", - "colorBy": { "type": "mappingQuality" } + "colorBy": { + "type": "mappingQuality" + } } } ] @@ -662,6 +666,10 @@ "uri": "volvox.test.vcf.gz", "locationType": "UriLocation" }, + "samplesTsvLocation": { + "uri": "1000genomes.tsv", + "locationType": "UriLocation" + }, "index": { "location": { "uri": "volvox.test.vcf.gz.tbi", @@ -2219,7 +2227,6 @@ }, "assemblyNames": ["volvox"] }, - { "type": "AlignmentsTrack", "trackId": "volvox-sorted.noref.cram", diff --git a/test_data/volvox/trix/volvox-rev-del_meta.json b/test_data/volvox/trix/volvox-rev-del_meta.json index 43a7f4ee10..82c17e6b0a 100644 --- a/test_data/volvox/trix/volvox-rev-del_meta.json +++ b/test_data/volvox/trix/volvox-rev-del_meta.json @@ -1,5 +1,5 @@ { - "dateCreated": "2024-10-14T14:42:44.193Z", + "dateCreated": "2025-01-24T16:05:19.959Z", "tracks": [ { "trackId": "volvox-rev-del-annotations", diff --git a/test_data/volvox/trix/volvox_meta.json b/test_data/volvox/trix/volvox_meta.json index d3af26483e..817a316977 100644 --- a/test_data/volvox/trix/volvox_meta.json +++ b/test_data/volvox/trix/volvox_meta.json @@ -1,5 +1,5 @@ { - "dateCreated": "2024-10-14T14:42:44.177Z", + "dateCreated": "2025-01-24T16:05:19.939Z", "tracks": [ { "trackId": "volvox_sv_test", @@ -47,6 +47,10 @@ "uri": "volvox.test.vcf.gz", "locationType": "UriLocation" }, + "samplesTsvLocation": { + "uri": "1000genomes.tsv", + "locationType": "UriLocation" + }, "index": { "location": { "uri": "volvox.test.vcf.gz.tbi", diff --git a/yarn.lock b/yarn.lock index ec17b949ed..ce44eed4ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -635,7 +635,7 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2", "@babel/code-frame@^7.8.3": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -644,33 +644,33 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.0", "@babel/compat-data@^7.26.5": +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.5": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.9", "@babel/core@^7.23.9", "@babel/core@^7.24.4", "@babel/core@^7.3.4": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" - integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" + integrity sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.0" - "@babel/generator" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.5" + "@babel/helper-compilation-targets" "^7.26.5" "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.0" - "@babel/parser" "^7.26.0" + "@babel/helpers" "^7.26.7" + "@babel/parser" "^7.26.7" "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.26.0" + "@babel/traverse" "^7.26.7" + "@babel/types" "^7.26.7" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.26.0", "@babel/generator@^7.26.5", "@babel/generator@^7.7.2": +"@babel/generator@^7.26.5", "@babel/generator@^7.7.2": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== @@ -688,7 +688,7 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== @@ -819,20 +819,20 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helpers@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" - integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== +"@babel/helpers@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.7.tgz#fd1d2a7c431b6e39290277aacfd8367857c576a4" + integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== dependencies: "@babel/template" "^7.25.9" - "@babel/types" "^7.26.0" + "@babel/types" "^7.26.7" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" - integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.25.9", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" + integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== dependencies: - "@babel/types" "^7.26.5" + "@babel/types" "^7.26.7" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -1045,7 +1045,7 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-block-scoped-functions@^7.25.9": +"@babel/plugin-transform-block-scoped-functions@^7.26.5": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz#3dc4405d31ad1cbe45293aa57205a6e3b009d53e" integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== @@ -1132,7 +1132,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.25.9": +"@babel/plugin-transform-exponentiation-operator@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== @@ -1199,7 +1199,7 @@ "@babel/helper-module-transforms" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.25.9": +"@babel/plugin-transform-modules-commonjs@^7.25.9", "@babel/plugin-transform-modules-commonjs@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== @@ -1240,7 +1240,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": +"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": version "7.26.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz#fbf6b3c92cb509e7b319ee46e3da89c5bedd31fe" integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== @@ -1402,17 +1402,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typeof-symbol@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" - integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== +"@babel/plugin-transform-typeof-symbol@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz#d0e33acd9223744c1e857dbd6fa17bd0a3786937" + integrity sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/plugin-transform-typescript@^7.25.9": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.5.tgz#6d9b48e8ee40a45a3ed12ebc013449fdf261714c" - integrity sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ== + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.7.tgz#64339515ea3eff610160f62499c3ef437d0ac83d" + integrity sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg== dependencies: "@babel/helper-annotate-as-pure" "^7.25.9" "@babel/helper-create-class-features-plugin" "^7.25.9" @@ -1452,13 +1452,13 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/preset-env@^7.16.4": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1" - integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw== + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.7.tgz#24d38e211f4570b8d806337035cc3ae798e0c36d" + integrity sha512-Ycg2tnXwixaXOVb29rana8HNPgLVBof8qqtNQ9LE22IoyZboQbGSxI6ZySMdW3K5nAe6gu35IaJefUJflhUFTQ== dependencies: - "@babel/compat-data" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/compat-data" "^7.26.5" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/helper-validator-option" "^7.25.9" "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" @@ -1472,7 +1472,7 @@ "@babel/plugin-transform-arrow-functions" "^7.25.9" "@babel/plugin-transform-async-generator-functions" "^7.25.9" "@babel/plugin-transform-async-to-generator" "^7.25.9" - "@babel/plugin-transform-block-scoped-functions" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.26.5" "@babel/plugin-transform-block-scoping" "^7.25.9" "@babel/plugin-transform-class-properties" "^7.25.9" "@babel/plugin-transform-class-static-block" "^7.26.0" @@ -1483,7 +1483,7 @@ "@babel/plugin-transform-duplicate-keys" "^7.25.9" "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" "@babel/plugin-transform-dynamic-import" "^7.25.9" - "@babel/plugin-transform-exponentiation-operator" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.26.3" "@babel/plugin-transform-export-namespace-from" "^7.25.9" "@babel/plugin-transform-for-of" "^7.25.9" "@babel/plugin-transform-function-name" "^7.25.9" @@ -1492,12 +1492,12 @@ "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" "@babel/plugin-transform-member-expression-literals" "^7.25.9" "@babel/plugin-transform-modules-amd" "^7.25.9" - "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.26.3" "@babel/plugin-transform-modules-systemjs" "^7.25.9" "@babel/plugin-transform-modules-umd" "^7.25.9" "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" "@babel/plugin-transform-new-target" "^7.25.9" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" "@babel/plugin-transform-numeric-separator" "^7.25.9" "@babel/plugin-transform-object-rest-spread" "^7.25.9" "@babel/plugin-transform-object-super" "^7.25.9" @@ -1514,7 +1514,7 @@ "@babel/plugin-transform-spread" "^7.25.9" "@babel/plugin-transform-sticky-regex" "^7.25.9" "@babel/plugin-transform-template-literals" "^7.25.9" - "@babel/plugin-transform-typeof-symbol" "^7.25.9" + "@babel/plugin-transform-typeof-symbol" "^7.26.7" "@babel/plugin-transform-unicode-escapes" "^7.25.9" "@babel/plugin-transform-unicode-property-regex" "^7.25.9" "@babel/plugin-transform-unicode-regex" "^7.25.9" @@ -1559,9 +1559,9 @@ "@babel/plugin-transform-typescript" "^7.25.9" "@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.8", "@babel/runtime@^7.17.9", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.25.7", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" - integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.7.tgz#f4e7fe527cd710f8dc0618610b61b4b060c3c341" + integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ== dependencies: regenerator-runtime "^0.14.0" @@ -1574,23 +1574,23 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.18.9", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" - integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== +"@babel/traverse@^7.18.9", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" + integrity sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA== dependencies: "@babel/code-frame" "^7.26.2" "@babel/generator" "^7.26.5" - "@babel/parser" "^7.26.5" + "@babel/parser" "^7.26.7" "@babel/template" "^7.25.9" - "@babel/types" "^7.26.5" + "@babel/types" "^7.26.7" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" - integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== +"@babel/types@^7.0.0", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.5", "@babel/types@^7.26.7", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" + integrity sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -3057,21 +3057,21 @@ robust-predicates "^3.0.2" "@mui/x-data-grid@^7.0.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@mui/x-data-grid/-/x-data-grid-7.24.0.tgz#8940dbfe4f39e2a22ddb5bad0565ccfe913a7e63" - integrity sha512-goYTKDp+e+dXw7E+WndWUhWXTjX3aTqN8W2dCKhXnmE9Gu8dFwG6Azl7GK9l2m5YHGuqYmpWqcSG9etLdwYaVg== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@mui/x-data-grid/-/x-data-grid-7.24.1.tgz#7da2e1f2d54582a159babd51dd86dcc86ec23a33" + integrity sha512-4sYTbMwsDotuTd2Cwa2JGTPXPWQs8RGJvocAKnIsNOzNdZNMrikE//HO35snriK8s4dauAApY7RVbeisjpVT+A== dependencies: "@babel/runtime" "^7.25.7" "@mui/utils" "^5.16.6 || ^6.0.0" - "@mui/x-internals" "7.24.0" + "@mui/x-internals" "7.24.1" clsx "^2.1.1" prop-types "^15.8.1" reselect "^5.1.1" -"@mui/x-internals@7.24.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@mui/x-internals/-/x-internals-7.24.0.tgz#5d09d3d5d113e2be6ec2af49192024859951d348" - integrity sha512-lYa/XLltxNMY8YAFDopIHrXda2EAoqMCilyGMuPMz+WTG+b+StlUKqtj8cgFPQ/sa5dQ2fR7R3KJdjLREKUrlQ== +"@mui/x-internals@7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@mui/x-internals/-/x-internals-7.24.1.tgz#34d63f13db0ac4c24033735a11efabe0b9f0fb73" + integrity sha512-9BvJzpLJnS9BDphvkiv6v0QOLxbnu8jhwcexFjtCQ2ZyxtVuVsWzGZ2npT9sGOil7+eaFDmWnJtea/tgrPvSwQ== dependencies: "@babel/runtime" "^7.25.7" "@mui/utils" "^5.16.6 || ^6.0.0" @@ -15942,9 +15942,9 @@ typescript-eslint@^8.0.1: integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== typescript@^5.8.0-dev.20241213: - version "5.8.0-dev.20250123" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.0-dev.20250123.tgz#ff705c58a431fd5943766be94547d657cea20026" - integrity sha512-JBWpq7b3i6Y+6wScnTq4nGC+ozHLU9cbW5ZbZaHiJ1EMV+hxMX04MX0984J5T0CXrjgf9xJULXKMWc6tP2AoSQ== + version "5.8.0-dev.20250124" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.0-dev.20250124.tgz#7c48b514adf70255f0be96dcb7921a7a7fac7435" + integrity sha512-QLwmxSR4EPey4SQ554+uTUJrnp0dDhmgVmeYCbx8hiUjKqIqCVcuiQtK73JRvb/8NE4Y/gvhTlkYjD5Qj4zDAw== uglify-js@^3.1.4: version "3.19.3"