Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: adding SeqvarBeaconNetworkCard #54

Merged
merged 1 commit into from
Jan 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { describe, expect, it } from 'vitest'
import { VBtn } from 'vuetify/components'

import type { Seqvar } from '../../lib/genomicVars'
import { setupMountedComponents } from '../../lib/testUtils'
import SeqvarBeaconNetworkCard from './SeqvarBeaconNetworkCard.vue'

// Sequence Variant in BRCA1
const seqvarBrca1: Seqvar = {
genomeBuild: 'grch37',
chrom: '17',
pos: 41215920,
del: 'G',
ins: 'T',
userRepr: 'grch37-17-41215920-G-T'
}

describe.concurrent('SeqvarBeaconNetworkCard.vue', async () => {
it('renders the card without iframe', async () => {
// arrange:
const { wrapper } = await setupMountedComponents(
{ component: SeqvarBeaconNetworkCard },
{
props: {
seqvar: seqvarBrca1
}
}
)

// act: nothing

// assert:
// look for the search button
expect(wrapper.text()).toContain('Query Beacon')
const refreshButton = wrapper.findComponent(VBtn)
expect(refreshButton.exists()).toBe(true)
// no iframe yet
expect(wrapper.html()).not.toContain('<iframe')
})

it('correctly loads the iframe on click', async () => {
// arrange:
const { wrapper } = await setupMountedComponents(
{ component: SeqvarBeaconNetworkCard },
{
props: {
seqvar: seqvarBrca1
}
}
)

// act:
const refreshButton = wrapper.findComponent(VBtn)
await refreshButton.trigger('click')
await wrapper.vm.$nextTick()

// assert:
// look for the search button
expect(wrapper.text()).not.toContain('Query Beacon')
expect(refreshButton.exists()).not.toBe(true)
// iframe after click
expect(wrapper.html()).toContain('<iframe')
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import type { Meta, StoryObj } from '@storybook/vue3'

import { SeqvarImpl } from '../../lib/genomicVars'
import SeqvarBeaconNetworkCard from './SeqvarBeaconNetworkCard.vue'

const seqvarBrca1 = new SeqvarImpl('grch37', '18', 41215920, 'G', 'T')

const meta = {
title: 'Seqvar/SeqvarBeaconNetworkCard',
component: SeqvarBeaconNetworkCard,
tags: ['autodocs'],
argTypes: {
seqvar: { control: { type: 'object' } }
},
args: { seqvar: seqvarBrca1 }
} satisfies Meta<typeof SeqvarBeaconNetworkCard>

export default meta
type Story = StoryObj<typeof meta>

export const BRCA1: Story = {
args: {
seqvar: seqvarBrca1
}
}
64 changes: 64 additions & 0 deletions src/components/SeqvarBeaconNetworkCard/SeqvarBeaconNetworkCard.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<!--
This component allows to trigger a query to the Beacon Network for a given variant.

The query is performed using the `<iframe>` feature of `beacon-network.org`.
-->
<script setup lang="ts">
import { ref } from 'vue'

import { type Seqvar } from '../../lib/genomicVars'
import DocsLink from '../DocsLink/DocsLink.vue'

/** This component's props. */
const props = defineProps<{
/** Sequence variant to show the card for */
seqvar?: Seqvar
}>()

/** The beacon iframe address; when set the iframe is loaded. */
const beaconAddress = ref<string>('')

/** Update `beaconAddress.value` to the URL indicated by `props.seqvar`. */
const loadBeacon = () => {
if (!props.seqvar) {
return
}
beaconAddress.value =
'https://beacon-network.org:443/#/widget?rs=' +
props.seqvar.genomeBuild +
'&chrom=' +
props.seqvar.chrom +
'&pos=' +
props.seqvar.pos +
'&ref=' +
props.seqvar.del +
'&allele=' +
props.seqvar.ins
}
</script>

<template>
<v-card>
<v-card-title class="pb-0 pr-2">
Beacon Network
<DocsLink anchor="variant-tools" />
</v-card-title>
<v-card-subtitle class="text-overline">
Lookup Variant in GA4GH Beacon Network
</v-card-subtitle>
<v-card-text v-if="beaconAddress">
<iframe
ref="beaconFrame"
:src="beaconAddress"
style="width: 100%; height: 300px; overflow: auto; border: 0"
vspace="0"
hspace="0"
/>
</v-card-text>
<v-card-text v-else>
<v-btn prepend-icon="mdi-cloud-search" variant="tonal" rounded="sm" @click="loadBeacon()">
Query Beacon Network
</v-btn>
</v-card-text>
</v-card>
</template>
Loading