From 17171a7ca277e2ab5b99a21d56257e3972f982b6 Mon Sep 17 00:00:00 2001 From: Dzmitry Hramyka Date: Wed, 18 Oct 2023 10:32:41 +0200 Subject: [PATCH] feat: Link-outs in SV detail page (#143) (#155) --- frontend/src/components/SvDetails/SvTools.vue | 146 ++++++++++++++++++ .../__tests__/SvDetails/SvTools.spec.ts | 62 ++++++++ frontend/src/views/SvDetailView.vue | 8 + .../src/views/__tests__/SvDetailView.spec.ts | 3 + 4 files changed, 219 insertions(+) create mode 100644 frontend/src/components/SvDetails/SvTools.vue create mode 100644 frontend/src/components/__tests__/SvDetails/SvTools.spec.ts diff --git a/frontend/src/components/SvDetails/SvTools.vue b/frontend/src/components/SvDetails/SvTools.vue new file mode 100644 index 00000000..ac341b8f --- /dev/null +++ b/frontend/src/components/SvDetails/SvTools.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/frontend/src/components/__tests__/SvDetails/SvTools.spec.ts b/frontend/src/components/__tests__/SvDetails/SvTools.spec.ts new file mode 100644 index 00000000..10f576db --- /dev/null +++ b/frontend/src/components/__tests__/SvDetails/SvTools.spec.ts @@ -0,0 +1,62 @@ +import { describe, expect, it } from 'vitest' + +import SvTools from '@/components/SvDetails/SvTools.vue' +import { setupMountedComponents } from '@/lib/test-utils' +import { type SvRecord } from '@/stores/svInfo' + +const svRecord: SvRecord = { + svType: 'DEL', + chromosome: 'chr17', + start: '41176312', + end: '41277500', + release: 'grch37', + result: [ + { + hgnc_id: 'HGNC:18315', + transcript_effects: [ + 'transcript_variant', + 'exon_variant', + 'splice_region_variant', + 'intron_variant', + 'upstream_variant', + 'downstream_variant' + ] + }, + { + hgnc_id: 'HGNC:20691', + transcript_effects: ['upstream_variant'] + }, + { + hgnc_id: 'HGNC:1100', + transcript_effects: [ + 'transcript_variant', + 'exon_variant', + 'splice_region_variant', + 'intron_variant', + 'upstream_variant', + 'downstream_variant' + ] + }, + { + hgnc_id: 'HGNC:16919', + transcript_effects: ['upstream_variant'] + } + ] +} + +describe.concurrent('SvTools', async () => { + it('renders the SvTools content', async () => { + const { wrapper } = setupMountedComponents( + { component: SvTools, template: false }, + { + props: { + svRecord: svRecord + } + } + ) + + expect(wrapper.text()).toContain('External Resources') + const links = wrapper.findAll('a') + expect(links.length).toBe(6) + }) +}) diff --git a/frontend/src/views/SvDetailView.vue b/frontend/src/views/SvDetailView.vue index e6b69026..f4b12f3f 100644 --- a/frontend/src/views/SvDetailView.vue +++ b/frontend/src/views/SvDetailView.vue @@ -7,6 +7,7 @@ import HeaderDetailPage from '@/components/HeaderDetailPage.vue' import AcmgRating from '@/components/SvDetails/AcmgRating.vue' import SvDetailsClinvar from '@/components/SvDetails/SvDetailsClinvar.vue' import SvDetailsGenes from '@/components/SvDetails/SvGenes.vue' +import SvTools from '@/components/SvDetails/SvTools.vue' import { StoreState } from '@/stores/misc' import { useSvInfoStore } from '@/stores/svInfo' import { type SvRecord } from '@/stores/svInfo' @@ -80,6 +81,7 @@ watch( const SECTIONS = [ { id: 'gene', title: 'Gene' }, { id: 'clinvar', title: 'ClinVar' }, + { id: 'sv-tools', title: 'SV Tools' }, { id: 'acmg', title: 'ACMG' }, { id: 'genome-browser', title: 'Genome Browser' } ] @@ -120,6 +122,12 @@ const genomeReleaseRef = ref(props.genomeRelease) +
+

SV Tools

+ + +
+

ACMG

diff --git a/frontend/src/views/__tests__/SvDetailView.spec.ts b/frontend/src/views/__tests__/SvDetailView.spec.ts index 8f577693..744f3f53 100644 --- a/frontend/src/views/__tests__/SvDetailView.spec.ts +++ b/frontend/src/views/__tests__/SvDetailView.spec.ts @@ -9,6 +9,7 @@ import HeaderDetailPage from '@/components/HeaderDetailPage.vue' import AcmgRating from '@/components/SvDetails/AcmgRating.vue' import SvDetailsClinvar from '@/components/SvDetails/SvDetailsClinvar.vue' import SvGenes from '@/components/SvDetails/SvGenes.vue' +import SvTools from '@/components/SvDetails/SvTools.vue' import { setupMountedComponents } from '@/lib/test-utils' import { StoreState } from '@/stores/misc' import { useSvInfoStore } from '@/stores/svInfo' @@ -66,10 +67,12 @@ describe.concurrent('VariantDetailView', async () => { const { wrapper } = makeWrapper() const svGenes = wrapper.findComponent(SvGenes) + const svTools = wrapper.findComponent(SvTools) const svDetailsClinvar = wrapper.findComponent(SvDetailsClinvar) const acmgRating = wrapper.findComponent(AcmgRating) const genomeBrowser = wrapper.findComponent(GenomeBrowser) expect(svGenes.exists()).toBe(true) + expect(svTools.exists()).toBe(true) expect(svDetailsClinvar.exists()).toBe(true) expect(acmgRating.exists()).toBe(true) expect(genomeBrowser.exists()).toBe(true)