diff --git a/src/api/mavedb/genes.ts b/src/api/mavedb/genes.ts new file mode 100644 index 00000000..b1416167 --- /dev/null +++ b/src/api/mavedb/genes.ts @@ -0,0 +1,21 @@ +import axios from 'axios' + +import config from '@/config' +import {components} from '@/schema/openapi' + +export type GeneScoreSet = components['schemas']['ShortScoreSet'] +export type GeneResponse = components['schemas']['GeneResponse'] + +export interface GetGeneParams { + limit?: number + offset?: number +} + +export async function getGene(symbol: string, params: GetGeneParams = {}, signal?: AbortSignal): Promise { + const response = await axios.get(`${config.apiBaseUrl}/genes/${encodeURIComponent(symbol)}`, { + headers: {accept: 'application/json'}, + params, + signal + }) + return response.data +} diff --git a/src/api/mavedb/index.ts b/src/api/mavedb/index.ts index 26388997..c097c748 100644 --- a/src/api/mavedb/index.ts +++ b/src/api/mavedb/index.ts @@ -17,6 +17,7 @@ export * from './access-keys' export * from './calibrations' export * from './collections' export * from './experiments' +export * from './genes' export * from './orcid' export * from './permissions' export * from './score-sets' diff --git a/src/components/common/MvCollapsible.vue b/src/components/common/MvCollapsible.vue index e7f6750b..974b82be 100644 --- a/src/components/common/MvCollapsible.vue +++ b/src/components/common/MvCollapsible.vue @@ -1,6 +1,32 @@ - + + @@ -55,7 +68,8 @@ import {defineComponent, type PropType} from 'vue' import CollectionBadge from '@/components/common/MvCollectionBadge.vue' import MvPill from '@/components/common/MvPill.vue' -import {getTargetGeneName} from '@/lib/target-genes' +import {isMultiTargetScoreSet} from '@/lib/genes' +import {getTargetGeneLinkItems, type TargetGeneLinkItem} from '@/lib/target-genes' import {components} from '@/schema/openapi' type FullScoreSet = components['schemas']['ScoreSet'] @@ -85,6 +99,10 @@ export default defineComponent({ showMeta: { type: Boolean, default: true + }, + showMultiTargetPill: { + type: Boolean, + default: false } }, @@ -95,12 +113,14 @@ export default defineComponent({ maxTags(): number { return MAX_TAGS }, + geneTargets(): TargetGeneLinkItem[] { + return getTargetGeneLinkItems(this.scoreSet.targetGenes || []) + }, geneNames(): string[] { - if (!this.scoreSet.targetGenes) return [] - return [...new Set(this.scoreSet.targetGenes.map((g) => getTargetGeneName(g)).filter(Boolean))] + return this.geneTargets.map((gene) => gene.name) }, - visibleGenes(): string[] { - return this.geneNames.slice(0, MAX_TAGS) + visibleGeneTargets(): TargetGeneLinkItem[] { + return this.geneTargets.slice(0, MAX_TAGS) }, organisms(): string[] { if (!this.scoreSet.targetGenes) return [] @@ -123,6 +143,9 @@ export default defineComponent({ if (type === 'protein') return 'Protein' return null }, + isMultiTarget(): boolean { + return isMultiTargetScoreSet(this.scoreSet) + }, formattedDate(): string { if (!this.scoreSet.publishedDate) return '' const date = new Date(this.scoreSet.publishedDate) diff --git a/src/components/common/MvServiceUnavailable.vue b/src/components/common/MvServiceUnavailable.vue new file mode 100644 index 00000000..ec014612 --- /dev/null +++ b/src/components/common/MvServiceUnavailable.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/components/common/MvTargetGeneDetails.vue b/src/components/common/MvTargetGeneDetails.vue index 199df329..fb5c15ce 100644 --- a/src/components/common/MvTargetGeneDetails.vue +++ b/src/components/common/MvTargetGeneDetails.vue @@ -31,8 +31,10 @@
{{ ext.identifier?.dbName }}: - {{ ext.identifier?.identifier - }} (offset {{ ext.offset }}) + {{ ext.identifier?.identifier }} + + (offset {{ ext.offset }}) +
@@ -46,10 +48,11 @@
 {
         this.copied = false
+        this.copyFailed = false
       }, 1500)
     }
   }
diff --git a/src/components/common/MvTargetsAccordion.vue b/src/components/common/MvTargetsAccordion.vue
index fc9208e0..79f69b5b 100644
--- a/src/components/common/MvTargetsAccordion.vue
+++ b/src/components/common/MvTargetsAccordion.vue
@@ -14,10 +14,27 @@
           
{{ scoreSet.urn }}
- + +