Skip to content

Commit

Permalink
feat: refurbishing sequence variant details page (#244)
Browse files Browse the repository at this point in the history
  • Loading branch information
holtgrewe committed Dec 5, 2023
1 parent 1d8ae68 commit 43fe16d
Show file tree
Hide file tree
Showing 36 changed files with 485 additions and 300 deletions.
2 changes: 1 addition & 1 deletion frontend/src/components/BookmarkListItem.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { StoreState } from '@/stores/misc'
// Import the BookmarksClient
export interface Props {
type: string
type: "gene" | "seqvar" | "strucvar" | ''
id: string
}
Expand Down
31 changes: 29 additions & 2 deletions frontend/src/components/GeneDetails/OverviewCard.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@ import GeneRifs from '@/components/GeneDetails/OverviewCard/GeneRifs.vue'
import LocusDatabases from '@/components/GeneDetails/OverviewCard/LocusDatabases.vue'
export interface Props {
geneInfo: any
geneInfo: any,
showGeneDetailsLink?: boolean,
genomeRelease?: 'grch37' | 'grch38'
}
const props = withDefaults(defineProps<Props>(), {
geneInfo: null
geneInfo: null,
showGeneDetailsLink: true,
genomeRelease: 'grch37'
})
// -- code for expanded / collapsed card --------------------------------------
Expand Down Expand Up @@ -98,6 +102,18 @@ const summaryText = computed<string>(() => {
</a>
</template>
</v-card-text>
<!-- <a
style="cursor: pointer"
title="go to Gene details page"
@click.prevent="
router.push({
name: 'gene',
params: { searchTerm: item.raw.hgnc.agr, genomeRelease: genomeRelease }
})
"
>
<v-icon>mdi-arrow-right-circle-outline</v-icon>
</a> -->
<v-expand-transition>
<div v-if="isExpanded">
Expand Down Expand Up @@ -160,6 +176,17 @@ const summaryText = computed<string>(() => {
>
MGI
</v-btn>
<v-btn
:to="{
name: 'gene',
params: { searchTerm: geneInfo?.hgnc?.agr, genomeRelease }
}"
target="_blank"
prepend-icon="mdi-arrow-right-circle-outline"
v-if="showGeneDetailsLink"
>
Gene Details
</v-btn>
<v-spacer />
<div class="text-grey text-caption">
Expand Down
60 changes: 50 additions & 10 deletions frontend/src/components/GeneDetails/OverviewCard/GeneRifs.vue
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
<script setup lang="ts">
import { onMounted, ref, watch } from 'vue'
export interface Props {
ncbi: any
}
Expand All @@ -7,6 +9,41 @@ export interface Props {
const props = withDefaults(defineProps<Props>(), {
ncbi: null
})
/** Data structure for gene RIF. */
interface GeneRif {
text: string
pmids: string[]
}
// The data to display.
const items = ref<GeneRif[]>([])
// Initialize `items`.
const initializeItems = () => {
if (props.ncbi?.rifEntries?.length) {
items.value = props.ncbi.rifEntries.slice(0, 10)
}
}
// Initialize items on mounted and change of `ncbi.rifEntries`.
onMounted(initializeItems)
watch(() => props.ncbi?.rifEntries, initializeItems)
// Load more items.
type Done = (status: 'error' | 'loading' | 'empty' | 'ok') => void
type LoadItemsArgs = { done: Done }
const loadItems = async ({ done }: LoadItemsArgs ) => {
if (props.ncbi?.rifEntries?.length) {
if (items.value.length === props.ncbi.rifEntries.length) {
done('empty')
} else {
const nextItems = props.ncbi.rifEntries.slice(items.value.length, items.value.length + 10)
items.value = items.value.concat(nextItems)
done('ok')
}
}
}
</script>

<template>
Expand All @@ -17,22 +54,25 @@ const props = withDefaults(defineProps<Props>(), {
<small>({{ ncbi?.rifEntries?.length ?? 0 }})</small>
</div>
</div>
<ul v-if="ncbi?.rifEntries?.length" class="d-flex flex-column flex-grow-1">
<ul class="h-auto overflow-auto" style="max-height: 200px; font-size: 90%; height: 100%">
<template v-for="entry in ncbi.rifEntries" :key="entry">
<li v-if="entry?.text?.length">
{{ entry.text }}
<div v-if="ncbi?.rifEntries?.length" class="d-flex flex-column flex-grow-1">
<v-infinite-scroll :height="200" style="font-size: 90%;" :onLoad="loadItems">
<template v-for="(item, index) in items" :key="index">
<div v-if="item?.text?.length">
{{ item.text }}
<a
:href="'https://www.ncbi.nlm.nih.gov/pubmed/?term=' + entry.pmids.join('+')"
:href="'https://www.ncbi.nlm.nih.gov/pubmed/?term=' + item.pmids.join('+')"
target="_blank"
>
<v-icon>mdi-launch</v-icon>
PubMed
</a>
</li>
</div>
</template>
</ul>
</ul>
<div v-else>No GeneRIFs available for gene.</div>

<template v-slot:empty>
No GeneRIFs available for gene
</template>
</v-infinite-scroll>
</div>
</div>
</template>
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
CLINICAL_SIGNIFICANCE_LABEL,
REVIEW_STATUS_LABEL,
REVIEW_STATUS_STARS
} from '@/components/VariantDetails/ClinVar.c'
} from '@/components/SeqvarDetails/ClinVar.c'
interface Props {
clinvar?: any
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script setup lang="ts">
import VariantDetailsFreqsAutosomal from '@/components/VariantDetails/FreqsAutosomal.vue'
import VariantDetailsFreqsMitochondrial from '@/components/VariantDetails/FreqsMitochondrial.vue'
import VariantDetailsFreqsAutosomal from '@/components/SeqvarDetails/FreqsAutosomal.vue'
import VariantDetailsFreqsMitochondrial from '@/components/SeqvarDetails/FreqsMitochondrial.vue'
import { isVariantMt } from '@/lib/utils'
import { type SmallVariant } from '@/stores/variantInfo'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<script setup lang="ts">
import { computed } from 'vue'
import ScoreDisplay from '@/components/VariantDetails/ScoreDisplay.vue'
import ScoreDisplay from '@/components/SeqvarDetails/ScoreDisplay.vue'
import { roundIt } from '@/lib/utils'
import { type SmallVariant } from '@/stores/variantInfo'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/StrucvarDetails/ClinvarCard.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
CLINICAL_SIGNIFICANCE_LABEL,
REVIEW_STATUS_LABEL,
REVIEW_STATUS_STARS
} from '@/components/VariantDetails/ClinVar.c'
} from '@/components/SeqvarDetails/ClinVar.c'
import { roundIt } from '@/lib/utils'
import { useSvInfoStore } from '@/stores/svInfo'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { createTestingPinia } from '@pinia/testing'
import { describe, expect, it, vi } from 'vitest'
import { nextTick } from 'vue'

import AcmgRating from '@/components/VariantDetails/AcmgRating.vue'
import AcmgRating from '@/components/SeqvarDetails/AcmgRating.vue'
import { AcmgCriteria, MultiSourceAcmgCriteriaState, Presence, StateSource } from '@/lib/acmgSeqVar'
import { setupMountedComponents } from '@/lib/test-utils'
import { StoreState } from '@/stores/misc'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest'

import BeaconNetwork from '@/components/VariantDetails/BeaconNetwork.vue'
import BeaconNetwork from '@/components/SeqvarDetails/BeaconNetwork.vue'
import { setupMountedComponents } from '@/lib/test-utils'

const smallVariantInfo = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, expect, it } from 'vitest'

import * as clinVarInfo from '@/assets/__tests__/BRCA1VariantClinVar.json'
import ClinVar from '@/components/VariantDetails/ClinVar.vue'
import ClinVar from '@/components/SeqvarDetails/ClinVar.vue'
import { setupMountedComponents } from '@/lib/test-utils'

describe.concurrent('ClinVar', async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, expect, it } from 'vitest'

import * as BRCA1VariantInfo from '@/assets/__tests__/BRCA1VariantInfo.json'
import FreqsAutosomal from '@/components/VariantDetails/FreqsAutosomal.vue'
import FreqsAutosomal from '@/components/SeqvarDetails/FreqsAutosomal.vue'
import { setupMountedComponents } from '@/lib/test-utils'

const smallVariantInfo = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest'

import FreqsMitochondrial from '@/components/VariantDetails/FreqsMitochondrial.vue'
import FreqsMitochondrial from '@/components/SeqvarDetails/FreqsMitochondrial.vue'
import { setupMountedComponents } from '@/lib/test-utils'

const smallVariantInfo = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest'

import ScoreDisplay from '@/components/VariantDetails/ScoreDisplay.vue'
import ScoreDisplay from '@/components/SeqvarDetails/ScoreDisplay.vue'
import { setupMountedComponents } from '@/lib/test-utils'

describe.concurrent('ScoreDisplay', async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, expect, it } from 'vitest'

import * as BRCA1TxInfo from '@/assets/__tests__/BRCA1TxInfo.json'
import TxCsq from '@/components/VariantDetails/TxCsq.vue'
import TxCsq from '@/components/SeqvarDetails/TxCsq.vue'
import { setupMountedComponents } from '@/lib/test-utils'

describe.concurrent('TxCsq', async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, expect, it } from 'vitest'

import * as BRCA1VariantInfo from '@/assets/__tests__/BRCA1VariantInfo.json'
import VariantConservation from '@/components/VariantDetails/VariantConservation.vue'
import VariantConservation from '@/components/SeqvarDetails/VariantConservation.vue'
import { setupMountedComponents } from '@/lib/test-utils'

describe.concurrent('VariantConservation', async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { describe, expect, it } from 'vitest'

import * as BRCA1VariantInfo from '@/assets/__tests__/BRCA1VariantInfo.json'
import VariantDetailsFreqsAutosomal from '@/components/VariantDetails/FreqsAutosomal.vue'
import VariantDetailsFreqsMitochondrial from '@/components/VariantDetails/FreqsMitochondrial.vue'
import VariantFreqs from '@/components/VariantDetails/VariantFreqs.vue'
import VariantDetailsFreqsAutosomal from '@/components/SeqvarDetails/FreqsAutosomal.vue'
import VariantDetailsFreqsMitochondrial from '@/components/SeqvarDetails/FreqsMitochondrial.vue'
import VariantFreqs from '@/components/SeqvarDetails/VariantFreqs.vue'
import { setupMountedComponents } from '@/lib/test-utils'

const smallVariantInfo = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, expect, it } from 'vitest'

import * as BRCA1GeneInfo from '@/assets/__tests__/BRCA1GeneInfo.json'
import VariantGene from '@/components/VariantDetails/VariantGene.vue'
import VariantGene from '@/components/SeqvarDetails/VariantGene.vue'
import { setupMountedComponents } from '@/lib/test-utils'

describe.concurrent('VariantGene', async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, expect, it } from 'vitest'

import * as BRCA1VariantInfo from '@/assets/__tests__/BRCA1VariantInfo.json'
import VariantTools from '@/components/VariantDetails/VariantTools.vue'
import VariantTools from '@/components/SeqvarDetails/VariantTools.vue'
import { setupMountedComponents } from '@/lib/test-utils'

const smallVariantInfo = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { describe, expect, it, vi } from 'vitest'
import { nextTick } from 'vue'

import * as VariantValidatorInfo from '@/assets/__tests__/BRCA1VariantValidator.json'
import VariantValidator from '@/components/VariantDetails/VariantValidator.vue'
import VariantValidator from '@/components/SeqvarDetails/VariantValidator.vue'
import { setupMountedComponents } from '@/lib/test-utils'

const smallVariantInfo = {
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/router/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import PrivacyView from '@/views/PrivacyView.vue'
import ProfileView from '@/views/ProfileView.vue'
import StrucvarDetailsView from '@/views/StrucvarDetailsView.vue'
import TermsView from '@/views/TermsView.vue'
import VariantDetailView from '@/views/VariantDetailView.vue'
import SeqvarDetailsView from '@/views/SeqvarDetailsView.vue'
import VerifyEmailView from '@/views/VerifyEmailView.vue'

const routes = [
Expand Down Expand Up @@ -69,7 +69,7 @@ const routes = [
{
path: '/variant/:searchTerm/:genomeRelease',
name: 'variant',
component: VariantDetailView,
component: SeqvarDetailsView,
props: (route: any) => {
return { searchTerm: route.params.searchTerm, genomeRelease: route.params.genomeRelease }
}
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/views/GeneDetailView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ const openedSection = ref<string[]>(['gene'])
</v-navigation-drawer>
<v-main class="my-3 mx-3">
<div id="gene-overview">
<OverviewCard :gene-info="geneInfoStore.geneInfo" />
<OverviewCard :gene-info="geneInfoStore.geneInfo" :show-gene-details-link="false" />
</div>

<div id="gene-pathogenicity">
Expand All @@ -150,7 +150,7 @@ const openedSection = ref<string[]>(['gene'])
/>
</div>
<div id="gene-clinvar">
<div id="gene-clinvar" v-if="geneInfoStore?.geneClinvar">
<ClinvarCard
:gene-clinvar="geneInfoStore.geneClinvar"
:transcripts="geneInfoStore.transcripts"
Expand Down
Loading

0 comments on commit 43fe16d

Please sign in to comment.