Skip to content

Commit 0672a6b

Browse files
fhennigFelix Hennigclaude
authored
feat(website): show resistance mutation annotations on COVID and RSV dashboards (#1359)
### Summary Extract resistance mutation collection configs and helpers from the wasap subtree into a shared util file (resistanceMutations.ts). Add `byEnv` as a pure selector to dbIdSpace.ts. Wire COVID, RSV-A, and RSV-B constants to factory functions that build collection configs; have the generic Astro page components fetch annotations server-side and pass them down through the React layout tree. ### Screenshot <img width="1615" height="1277" alt="image" src="https://github.com/user-attachments/assets/2ac51710-8848-45d5-9035-6f4f14e06126" /> ## PR Checklist - [ ] All necessary documentation has been adapted. - [ ] The implemented feature is covered by an appropriate test. --------- Co-authored-by: Felix Hennig <felix-agent@felixhennig.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent ea25404 commit 0672a6b

26 files changed

Lines changed: 380 additions & 109 deletions

website/src/components/views/analyzeSingleVariant/CovidSingleVariantReactPage.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { MutationAnnotations } from '@genspectrum/dashboard-components/util';
12
import { type FC, useMemo } from 'react';
23

34
import { CollectionsList } from './CollectionsList.tsx';
@@ -15,9 +16,14 @@ import { usePageState } from '../usePageState.ts';
1516
export type CovidSingleVariantReactPageProps = {
1617
organismsConfig: OrganismsConfig;
1718
isStaging: boolean;
19+
mutationAnnotations?: MutationAnnotations;
1820
};
1921

20-
export const CovidSingleVariantReactPage: FC<CovidSingleVariantReactPageProps> = ({ organismsConfig, isStaging }) => {
22+
export const CovidSingleVariantReactPage: FC<CovidSingleVariantReactPageProps> = ({
23+
organismsConfig,
24+
isStaging,
25+
mutationAnnotations,
26+
}) => {
2127
const organismViewKey: OrganismViewKey = 'covid.singleVariantView';
2228
const view = useMemo(() => new Routing(organismsConfig).getOrganismView(organismViewKey), [organismsConfig]);
2329

@@ -49,6 +55,7 @@ export const CovidSingleVariantReactPage: FC<CovidSingleVariantReactPageProps> =
4955
view={view}
5056
downloadLinks={downloadLinks}
5157
organismsConfig={organismsConfig}
58+
mutationAnnotations={mutationAnnotations}
5259
filters={
5360
<>
5461
<SingleVariantPageStateSelector

website/src/components/views/analyzeSingleVariant/GenericAnalyseSingleVariantReactPage.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { MutationAnnotations } from '@genspectrum/dashboard-components/util';
12
import { type FC, useMemo } from 'react';
23

34
import { GenericAnalyseSingleVariantDataDisplay } from './GenericAnalyseSingleVariantDataDisplay';
@@ -16,12 +17,14 @@ export type GenericAnalyseSingleVariantReactPageProps = {
1617
organism: Exclude<OrganismWithViewKey<typeof singleVariantViewKey>, typeof Organisms.covid>;
1718
organismsConfig: OrganismsConfig;
1819
isStaging: boolean;
20+
mutationAnnotations?: MutationAnnotations;
1921
};
2022

2123
export const GenericAnalyseSingleVariantReactPage: FC<GenericAnalyseSingleVariantReactPageProps> = ({
2224
organism,
2325
organismsConfig,
2426
isStaging,
27+
mutationAnnotations,
2528
}) => {
2629
const organismViewKey = `${organism}.${singleVariantViewKey}` satisfies OrganismViewKey;
2730
const view = useMemo(
@@ -57,6 +60,7 @@ export const GenericAnalyseSingleVariantReactPage: FC<GenericAnalyseSingleVarian
5760
view={view}
5861
downloadLinks={downloadLinks}
5962
organismsConfig={organismsConfig}
63+
mutationAnnotations={mutationAnnotations}
6064
filters={
6165
<SingleVariantPageStateSelector
6266
view={view}

website/src/components/views/analyzeSingleVariant/GenericAnalyzeSingleVariantPage.astro

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { GenericAnalyseSingleVariantReactPage } from './GenericAnalyseSingleVari
33
import { isStaging, getDashboardsConfig } from '../../../config';
44
import BaseLayout from '../../../layouts/base/BaseLayout.astro';
55
import { Organisms } from '../../../types/Organism';
6+
import { fetchOrganismMutationAnnotations } from '../../../util/fetchOrganismMutationAnnotations';
67
import { type OrganismWithViewKey } from '../../../views/routing';
78
import { ServerSide } from '../../../views/serverSideRouting';
89
import { singleVariantViewKey } from '../../../views/viewKeys';
@@ -14,13 +15,16 @@ interface Props {
1415
const { organism } = Astro.props;
1516
1617
const view = ServerSide.routing.getOrganismView(`${organism}.${singleVariantViewKey}`);
18+
19+
const mutationAnnotations = await fetchOrganismMutationAnnotations(view.organismConstants, organism);
1720
---
1821

1922
<BaseLayout title={view.viewTitle}>
2023
<GenericAnalyseSingleVariantReactPage
2124
organism={organism}
2225
organismsConfig={getDashboardsConfig().dashboards.organisms}
2326
isStaging={isStaging()}
27+
mutationAnnotations={mutationAnnotations}
2428
client:only='react'
2529
/>
2630
</BaseLayout>

website/src/components/views/compareSideBySide/GenericCompareSideBySidePage.astro

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { GenericCompareSideBySideReactPage } from './GenericCompareSideBySideReactPage';
33
import { isStaging, getDashboardsConfig } from '../../../config';
44
import BaseLayout from '../../../layouts/base/BaseLayout.astro';
5+
import { fetchOrganismMutationAnnotations } from '../../../util/fetchOrganismMutationAnnotations';
56
import { type OrganismWithViewKey } from '../../../views/routing';
67
import { ServerSide } from '../../../views/serverSideRouting';
78
import { compareSideBySideViewKey } from '../../../views/viewKeys';
@@ -15,6 +16,8 @@ const { organism, hideMutationComponents } = Astro.props;
1516
1617
const view = ServerSide.routing.getOrganismView(`${organism}.${compareSideBySideViewKey}`);
1718
const organismsConfig = getDashboardsConfig().dashboards.organisms;
19+
20+
const mutationAnnotations = await fetchOrganismMutationAnnotations(view.organismConstants, organism);
1821
---
1922

2023
<BaseLayout title={view.viewTitle}>
@@ -23,6 +26,7 @@ const organismsConfig = getDashboardsConfig().dashboards.organisms;
2326
hideMutationComponents={hideMutationComponents}
2427
organismsConfig={organismsConfig}
2528
isStaging={isStaging()}
29+
mutationAnnotations={mutationAnnotations}
2630
client:only='react'
2731
/>
2832
</BaseLayout>

website/src/components/views/compareSideBySide/GenericCompareSideBySideReactPage.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { MutationAnnotations } from '@genspectrum/dashboard-components/util';
12
import { type FC, useMemo, useState, useEffect } from 'react';
23

34
import { GenericCompareSideBySideDataDisplay } from './GenericCompareSideBySideDataDisplay.tsx';
@@ -15,13 +16,15 @@ export type GenericCompareSideBySideReactPageProps = {
1516
hideMutationComponents?: boolean;
1617
organismsConfig: OrganismsConfig;
1718
isStaging: boolean;
19+
mutationAnnotations?: MutationAnnotations;
1820
};
1921

2022
export const GenericCompareSideBySideReactPage: FC<GenericCompareSideBySideReactPageProps> = ({
2123
organism,
2224
hideMutationComponents,
2325
organismsConfig,
2426
isStaging,
27+
mutationAnnotations,
2528
}) => {
2629
const organismViewKey = `${organism}.${compareSideBySideViewKey}` satisfies OrganismViewKey;
2730

@@ -45,6 +48,7 @@ export const GenericCompareSideBySideReactPage: FC<GenericCompareSideBySideReact
4548
lapisUrl={organismsConfig[organism].lapis.url}
4649
view={view}
4750
downloadLinks={downloadLinks}
51+
mutationAnnotations={mutationAnnotations}
4852
>
4953
<div className='flex'>
5054
<div className='flex flex-1 flex-col'>

website/src/components/views/compareToBaseline/GenericCompareToBaselinePage.astro

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { GenericCompareToBaselineReactPage } from './GenericCompareToBaselineReactPage';
33
import { isStaging, getDashboardsConfig } from '../../../config';
44
import BaseLayout from '../../../layouts/base/BaseLayout.astro';
5+
import { fetchOrganismMutationAnnotations } from '../../../util/fetchOrganismMutationAnnotations';
56
import { type OrganismWithViewKey } from '../../../views/routing';
67
import { ServerSide } from '../../../views/serverSideRouting';
78
import { compareToBaselineViewKey } from '../../../views/viewKeys';
@@ -13,13 +14,16 @@ interface Props {
1314
const { organism } = Astro.props;
1415
1516
const view = ServerSide.routing.getOrganismView(`${organism}.${compareToBaselineViewKey}`);
17+
18+
const mutationAnnotations = await fetchOrganismMutationAnnotations(view.organismConstants, organism);
1619
---
1720

1821
<BaseLayout title={view.viewTitle}>
1922
<GenericCompareToBaselineReactPage
2023
organism={organism}
2124
organismsConfig={getDashboardsConfig().dashboards.organisms}
2225
isStaging={isStaging()}
26+
mutationAnnotations={mutationAnnotations}
2327
client:only='react'
2428
/>
2529
</BaseLayout>

website/src/components/views/compareToBaseline/GenericCompareToBaselineReactPage.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { MutationAnnotations } from '@genspectrum/dashboard-components/util';
12
import { type FC, useMemo } from 'react';
23

34
import { GenericCompareToBaselineDataDisplay } from './GenericCompareToBaselineDataDisplay';
@@ -13,12 +14,14 @@ export type GenericCompareToBaselineReactPageProps = {
1314
organism: OrganismWithViewKey<typeof compareToBaselineViewKey>;
1415
organismsConfig: OrganismsConfig;
1516
isStaging: boolean;
17+
mutationAnnotations?: MutationAnnotations;
1618
};
1719

1820
export const GenericCompareToBaselineReactPage: FC<GenericCompareToBaselineReactPageProps> = ({
1921
organism,
2022
organismsConfig,
2123
isStaging,
24+
mutationAnnotations,
2225
}) => {
2326
const organismViewKey = `${organism}.${compareToBaselineViewKey}` satisfies OrganismViewKey;
2427
const view = useMemo(
@@ -44,6 +47,7 @@ export const GenericCompareToBaselineReactPage: FC<GenericCompareToBaselineReact
4447
view={view}
4548
downloadLinks={downloadLinks}
4649
organismsConfig={organismsConfig}
50+
mutationAnnotations={mutationAnnotations}
4751
filters={
4852
<CompareVariantsToBaselineStateSelector
4953
view={view}

website/src/components/views/compareVariants/GenericCompareVariantsPage.astro

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { GenericCompareVariantsReactPage } from './GenericCompareVariantsReactPage';
33
import { isStaging, getDashboardsConfig } from '../../../config';
44
import BaseLayout from '../../../layouts/base/BaseLayout.astro';
5+
import { fetchOrganismMutationAnnotations } from '../../../util/fetchOrganismMutationAnnotations';
56
import { type OrganismWithViewKey } from '../../../views/routing';
67
import { ServerSide } from '../../../views/serverSideRouting';
78
import { compareVariantsViewKey } from '../../../views/viewKeys';
@@ -13,13 +14,16 @@ interface Props {
1314
const { organism } = Astro.props;
1415
1516
const view = ServerSide.routing.getOrganismView(`${organism}.${compareVariantsViewKey}`);
17+
18+
const mutationAnnotations = await fetchOrganismMutationAnnotations(view.organismConstants, organism);
1619
---
1720

1821
<BaseLayout title={view.viewTitle}>
1922
<GenericCompareVariantsReactPage
2023
organism={organism}
2124
organismsConfig={getDashboardsConfig().dashboards.organisms}
2225
isStaging={isStaging()}
26+
mutationAnnotations={mutationAnnotations}
2327
client:only='react'
2428
/>
2529
</BaseLayout>

website/src/components/views/compareVariants/GenericCompareVariantsReactPage.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { MutationAnnotations } from '@genspectrum/dashboard-components/util';
12
import { type FC, useMemo } from 'react';
23

34
import { GenericCompareVariantsDataDisplay } from './GenericCompareVariantsDataDisplay';
@@ -13,12 +14,14 @@ export type GenericCompareVariantsReactPageProps = {
1314
organism: OrganismWithViewKey<typeof compareVariantsViewKey>;
1415
organismsConfig: OrganismsConfig;
1516
isStaging: boolean;
17+
mutationAnnotations?: MutationAnnotations;
1618
};
1719

1820
export const GenericCompareVariantsReactPage: FC<GenericCompareVariantsReactPageProps> = ({
1921
organism,
2022
organismsConfig,
2123
isStaging,
24+
mutationAnnotations,
2225
}) => {
2326
const organismViewKey = `${organism}.${compareVariantsViewKey}` satisfies OrganismViewKey;
2427
const view = useMemo(
@@ -44,6 +47,7 @@ export const GenericCompareVariantsReactPage: FC<GenericCompareVariantsReactPage
4447
view={view}
4548
downloadLinks={downloadLinks}
4649
organismsConfig={organismsConfig}
50+
mutationAnnotations={mutationAnnotations}
4751
filters={
4852
<CompareVariantsPageStateSelector
4953
view={view}

website/src/components/views/sequencingEfforts/GenericSequencingEffortsPage.astro

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { GenericSequencingEffortsReactPage } from './GenericSequencingEffortsReactPage';
33
import { isStaging, getDashboardsConfig } from '../../../config';
44
import BaseLayout from '../../../layouts/base/BaseLayout.astro';
5+
import { fetchOrganismMutationAnnotations } from '../../../util/fetchOrganismMutationAnnotations';
56
import { type OrganismWithViewKey } from '../../../views/routing';
67
import { ServerSide } from '../../../views/serverSideRouting';
78
import { sequencingEffortsViewKey } from '../../../views/viewKeys';
@@ -13,13 +14,16 @@ interface Props {
1314
const { organism } = Astro.props;
1415
1516
const view = ServerSide.routing.getOrganismView(`${organism}.${sequencingEffortsViewKey}`);
17+
18+
const mutationAnnotations = await fetchOrganismMutationAnnotations(view.organismConstants, organism);
1619
---
1720

1821
<BaseLayout title={view.viewTitle}>
1922
<GenericSequencingEffortsReactPage
2023
organism={organism}
2124
organismsConfig={getDashboardsConfig().dashboards.organisms}
2225
isStaging={isStaging()}
26+
mutationAnnotations={mutationAnnotations}
2327
client:only='react'
2428
/>
2529
</BaseLayout>

0 commit comments

Comments
 (0)