diff --git a/varfish/vueapp/src/components/SubmissionList.vue b/varfish/vueapp/src/components/SubmissionList.vue index 9112c6731..fc32f1493 100644 --- a/varfish/vueapp/src/components/SubmissionList.vue +++ b/varfish/vueapp/src/components/SubmissionList.vue @@ -93,12 +93,11 @@ placeholder="Select Case" select-label="" deselect-label="" + :loading="loadingVariants" + :disabled="loadingVariants" :options="familyUuids" :custom-label="getFamilyLabel" @input="fetchRawModalUserAnnotations()" - @close="fetchRawModalUserAnnotations()" - @select="fetchRawModalUserAnnotations()" - @remove="fetchRawModalUserAnnotations()" >
@@ -352,6 +351,7 @@ import { mapActions, mapState } from 'vuex' import { getSubmissionLabel, + getVariantId, HPO_AGE_OF_ONSET, HPO_INHERITANCE_MODE, isDiseaseTerm, @@ -425,7 +425,7 @@ export default { */ fetchRawModalUserAnnotations() { if (this.familyUuid) { - this.modalUserAnnotations.splice(0, this.modalUserAnnotations.length) + Vue.set(this, 'modalUserAnnotations', []) this.fetchError = false this.loadingVariants = true Vue.set(this, 'rawModalUserAnnotations', null) @@ -436,10 +436,6 @@ export default { .then((res) => { this.fetchError = false - const getVariantId = (obj) => { - return `${obj.release}-${obj.chromosome}-${obj.start}-${obj.reference}-${obj.alternative}` - } - const collect = (arr) => { const result = {} for (const obj of arr) { @@ -490,8 +486,11 @@ export default { 'rawModalUserAnnotationsCount', Object.keys(smallVariants).length ) - const userAnnotations = this._computeUserAnnotations(this.rawModalUserAnnotations) - Array.prototype.push.apply(this.modalUserAnnotations, userAnnotations); + Vue.set( + this, + 'modalUserAnnotations', + this._computeUserAnnotations(this.rawModalUserAnnotations) + ) this.loadingVariants = false }) .catch((error) => { @@ -502,7 +501,6 @@ export default { } }, - /** * Return filtered data to display in the annotated variant modal. */ diff --git a/varfish/vueapp/src/helpers.js b/varfish/vueapp/src/helpers.js index 030e052db..ba0c91e71 100644 --- a/varfish/vueapp/src/helpers.js +++ b/varfish/vueapp/src/helpers.js @@ -31,6 +31,16 @@ export function removeItemOnce(arr, value) { return arr } +export function getVariantId(obj, prefix = '') { + return [ + obj[prefix + 'release'] || obj[prefix + 'assembly'], + obj[prefix + 'chromosome'], + obj[prefix + 'start'], + obj[prefix + 'reference'], + obj[prefix + 'alternative'], + ].join('-') +} + export function removeItemAll(arr, value) { let i = 0 while (i < arr.length) { diff --git a/varfish/vueapp/src/store/modules/clinvarExport.js b/varfish/vueapp/src/store/modules/clinvarExport.js index f989611f7..d56f969df 100644 --- a/varfish/vueapp/src/store/modules/clinvarExport.js +++ b/varfish/vueapp/src/store/modules/clinvarExport.js @@ -2,7 +2,8 @@ import Vue from 'vue' import { HPO_INHERITANCE_MODE, isDiseaseTerm, uuidv4 } from '@/helpers' -import clinvarExport from '../../api/clinvarExport' +import clinvarExportApi from '../../api/clinvarExport' +import { getVariantId } from '../../helpers' /** * Enum for the valid clinvar export application states. @@ -75,31 +76,31 @@ export const actions = { commit('SET_APP_STATE', AppState.initializing) Promise.all([ - clinvarExport + clinvarExportApi .getOrganisations(state.appContext) .then((res) => commit('SET_ORGANISATIONS', res)), - clinvarExport + clinvarExportApi .getSubmitters(state.appContext) .then((res) => commit('SET_SUBMITTERS', res)), - clinvarExport + clinvarExportApi .getAssertionMethods(state.appContext) .then((res) => commit('SET_ASSERTION_METHODS', res)), - clinvarExport + clinvarExportApi .getSubmissionSets(state.appContext) .then((res) => commit('SET_SUBMISSION_SETS', res)), - clinvarExport + clinvarExportApi .getSubmissions(state.appContext) .then((res) => commit('SET_SUBMISSIONS', res)), - clinvarExport + clinvarExportApi .getIndividuals(state.appContext) .then((res) => commit('SET_INDIVIDUALS', res)), - clinvarExport + clinvarExportApi .getSubmissionIndividuals(state.appContext) .then((res) => commit('SET_SUBMISSION_INDIVIDUALS', res)), - clinvarExport + clinvarExportApi .getFamilies(state.appContext) .then((res) => commit('SET_FAMILIES', res)), - clinvarExport + clinvarExportApi .getSubmittingOrgs(state.appContext) .then((res) => commit('SET_SUBMITTING_ORGS', res)), ]).then( @@ -170,13 +171,13 @@ export const actions = { submissionSetExists ) { if (submissionSetExists) { - const res = await clinvarExport.updateSubmissionSet( + const res = await clinvarExportApi.updateSubmissionSet( state.currentSubmissionSet, state.appContext ) return res } else { - const apiSet = await clinvarExport.createSubmissionSet( + const apiSet = await clinvarExportApi.createSubmissionSet( state.currentSubmissionSet, state.appContext ) @@ -206,7 +207,7 @@ export const actions = { ) { const localUuid = state.currentSubmissionSet.submitting_orgs[i] if (localUuid in state.oldModel.submittingOrgs) { - await clinvarExport.updateSubmittingOrg( + await clinvarExportApi.updateSubmittingOrg( { ...JSON.parse(JSON.stringify(state.submittingOrgs[localUuid])), sort_order: i, @@ -214,7 +215,7 @@ export const actions = { state.appContext ) } else { - const apiSubmittingOrg = await clinvarExport.createSubmittingOrg( + const apiSubmittingOrg = await clinvarExportApi.createSubmittingOrg( { ...JSON.parse(JSON.stringify(state.submittingOrgs[localUuid])), sort_order: i, @@ -238,7 +239,7 @@ export const actions = { for (let i = 0; i < oldSubmissionSet.submitting_orgs.length; i++) { const localSubmittingOrgUuid = oldSubmissionSet.submitting_orgs[i] if (!(localSubmittingOrgUuid in state.submittingOrgs)) { - await clinvarExport.deleteSubmittingOrg( + await clinvarExportApi.deleteSubmittingOrg( state.oldModel.submittingOrgs[localSubmittingOrgUuid], state.appContext ) @@ -257,7 +258,7 @@ export const actions = { const localSubmission = state.submissions[localSubmissionUuid] let apiSubmission = null if (submissionExists) { - apiSubmission = await clinvarExport.updateSubmission( + apiSubmission = await clinvarExportApi.updateSubmission( { ...JSON.parse(JSON.stringify(localSubmission)), sort_order: sortOrder, @@ -265,7 +266,7 @@ export const actions = { state.appContext ) } else { - apiSubmission = await clinvarExport.createSubmission( + apiSubmission = await clinvarExportApi.createSubmission( { ...JSON.parse(JSON.stringify(localSubmission)), sort_order: sortOrder, @@ -292,7 +293,7 @@ export const actions = { localIndividualUuid ) ) { - await clinvarExport.deleteSubmissionIndividual( + await clinvarExportApi.deleteSubmissionIndividual( state.oldModel.submissionIndividuals[localIndividualUuid], state.appContext ) @@ -310,7 +311,7 @@ export const actions = { let apiSubmissionIndividual = null if (localSubmissionIndividualExists) { apiSubmissionIndividual = - await clinvarExport.updateSubmissionIndividual( + await clinvarExportApi.updateSubmissionIndividual( { ...JSON.parse(JSON.stringify(localSI)), sort_order: i, @@ -319,7 +320,7 @@ export const actions = { ) } else { apiSubmissionIndividual = - await clinvarExport.createSubmissionIndividual( + await clinvarExportApi.createSubmissionIndividual( { ...JSON.parse(JSON.stringify(localSI)), sort_order: i, @@ -375,13 +376,16 @@ export const actions = { if (!(oldSubmissionUuid in state.submissions)) { const oldSubmission = state.oldModel.submissions[oldSubmissionUuid] for (const oldSubmissionIndividualUuid of oldSubmission.submission_individuals) { - await clinvarExport.deleteSubmissionIndividual( + await clinvarExportApi.deleteSubmissionIndividual( state.oldModel.submissionIndividuals[oldSubmissionIndividualUuid], state.appContext ) commit('DELETE_SUBMISSION_INDIVIDUAL', oldSubmissionIndividualUuid) } - await clinvarExport.deleteSubmission(oldSubmission, state.appContext) + await clinvarExportApi.deleteSubmission( + oldSubmission, + state.appContext + ) commit('DELETE_SUBMISSION', oldSubmissionUuid) } } @@ -410,7 +414,7 @@ export const actions = { for (const submittingOrgUuid of state.currentSubmissionSet .submitting_orgs) { if (submittingOrgUuid in state.oldModel.submittingOrgs) { - await clinvarExport.deleteSubmittingOrg( + await clinvarExportApi.deleteSubmittingOrg( state.submittingOrgs[submittingOrgUuid], state.appContext ) @@ -425,7 +429,7 @@ export const actions = { ) for (const submissionInvidualUuid of submissionInvidualUuids) { if (submissionInvidualUuid in state.oldModel.submissionIndividuals) { - await clinvarExport.deleteSubmissionIndividual( + await clinvarExportApi.deleteSubmissionIndividual( state.submissionIndividuals[submissionInvidualUuid], state.appContext ) @@ -433,7 +437,7 @@ export const actions = { commit('DELETE_SUBMISSION_INDIVIDUAL', submissionInvidualUuid) } if (submissionUuid in state.oldModel.submissions) { - await clinvarExport.deleteSubmission( + await clinvarExportApi.deleteSubmission( state.submissions[submissionUuid], state.appContext ) @@ -444,7 +448,7 @@ export const actions = { if ( state.currentSubmissionSet.sodar_uuid in state.oldModel.submissionSets ) { - await clinvarExport.deleteSubmissionSet( + await clinvarExportApi.deleteSubmissionSet( state.submissionSets[state.currentSubmissionSet.sodar_uuid], state.appContext ) @@ -553,8 +557,18 @@ export const actions = { /** * Add the given individual to the current submission. */ - addIndividualToCurrentSubmission({ commit }, individual) { - commit('ADD_INDIVIDUAL_TO_CURRENT_SUBMISSION', individual) + async addIndividualToCurrentSubmission({ state, commit }, individual) { + const res = await clinvarExportApi.getUserAnnotations( + state.appContext, + individual.family + ) + const smallVariants = Object.fromEntries( + res.small_variants.map((v) => [getVariantId(v), v]) + ) + commit('ADD_INDIVIDUAL_TO_CURRENT_SUBMISSION', { + individual, + smallVariants, + }) }, /** * Update the given submission individual. @@ -1028,12 +1042,9 @@ export const mutations = { state.currentSubmissionSet.submissions.push(newSubmission.sodar_uuid) }, - ADD_INDIVIDUAL_TO_CURRENT_SUBMISSION(state, individual) { - const s = state.currentSubmission - const variantKey = - `${s.variant_assembly}-${s.variant_chromosome}` + - `-${s.variant_start}-${s.variant_reference}-${s.variant_alternative}` - const smallVariant = state.userAnnotations.smallVariants[variantKey] // XXX + ADD_INDIVIDUAL_TO_CURRENT_SUBMISSION(state, { individual, smallVariants }) { + const variantKey = getVariantId(state.currentSubmission, 'variant_') + const smallVariant = smallVariants[variantKey] const { variantAlleleCount, variantZygosity } = extractVariantZygosity( smallVariant, [individual.sodar_uuid],