From 5f1fb7c10926a2e93b25efd1f7312110a6184b94 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Thu, 26 Mar 2026 16:37:52 +0100 Subject: [PATCH] refactor(website): read locationFields from YAML config instead of frontend constants Location fields (which LAPIS fields to use for geographic filtering) were previously hardcoded as constants in OrganismConstants.ts: - GENSPECTRUM_LOCULUS_LOCATION_FIELDS = ['country', 'division'] - PATHOPLEXUS_LOCATION_FIELDS = ['geoLocCountry', 'geoLocAdmin1'] - COVID used ['region', 'country', 'division'] inline This refactor moves them to the application YAML config so they are defined alongside the other per-organism LAPIS settings and can be adjusted without touching frontend code. Changes: - config.ts: add locationFields to lapisConfigSchema (Zod) - OrganismConstants.ts: FiltersConfig now requires locationFields param; getPathoplexusFilters and getGenspectrumLoculusFilters pass it through; remove now-unused PATHOPLEXUS_LOCATION_FIELDS and GENSPECTRUM_LOCULUS_LOCATION_FIELDS exported constants - All 18 organism view files: locationFields moved from property initializer to constructor (reads from organismsConfig.XXX.lapis.locationFields); baselineFilterConfigs likewise moved to constructor so it can reference this.locationFields - Both application YAML files: add locationFields to every organism that was missing it (all except denv1-4 in prod and denv1-4 + victoria in staging, which already had it from an earlier commit) Co-Authored-By: Claude Sonnet 4.6 --- .../application-dashboards-prod.yaml | 46 ++++++++++ .../application-dashboards-staging.yaml | 43 ++++++++++ website/src/config.ts | 1 + website/src/views/OrganismConstants.ts | 10 +-- website/src/views/cchf.ts | 26 +++--- website/src/views/covid.ts | 83 ++++++++++--------- website/src/views/denv1.ts | 16 ++-- website/src/views/denv2.ts | 16 ++-- website/src/views/denv3.ts | 16 ++-- website/src/views/denv4.ts | 16 ++-- website/src/views/ebolaSudan.ts | 16 ++-- website/src/views/ebolaZaire.ts | 17 ++-- website/src/views/h1n1pdm.ts | 18 ++-- website/src/views/h3n2.ts | 18 ++-- website/src/views/h5n1.ts | 18 ++-- website/src/views/influenza-a.ts | 18 ++-- website/src/views/influenza-b.ts | 18 ++-- website/src/views/measles.ts | 28 ++++--- website/src/views/mpox.ts | 54 ++++++------ website/src/views/rsvA.ts | 16 ++-- website/src/views/rsvB.ts | 16 ++-- website/src/views/victoria.ts | 18 ++-- website/src/views/westNile.ts | 28 ++++--- 23 files changed, 341 insertions(+), 215 deletions(-) diff --git a/backend/src/main/resources/application-dashboards-prod.yaml b/backend/src/main/resources/application-dashboards-prod.yaml index f170d6234..de8d16c11 100644 --- a/backend/src/main/resources/application-dashboards-prod.yaml +++ b/backend/src/main/resources/application-dashboards-prod.yaml @@ -4,6 +4,10 @@ dashboards: lapis: url: "https://lapis.cov-spectrum.org/open/v2" mainDateField: "date" + locationFields: + - "region" + - "country" + - "division" lineageFields: - "pangoLineage" - "nextcladePangoLineage" @@ -16,6 +20,9 @@ dashboards: lapis: url: "https://api.loculus.genspectrum.org/h5n1" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "country" + - "division" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -28,6 +35,9 @@ dashboards: lapis: url: "https://api.loculus.genspectrum.org/h1n1pdm" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "country" + - "division" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -40,6 +50,9 @@ dashboards: lapis: url: "https://api.loculus.genspectrum.org/h3n2" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "country" + - "division" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -52,6 +65,9 @@ dashboards: lapis: url: "https://api.loculus.genspectrum.org/influenza-a" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "country" + - "division" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -64,6 +80,9 @@ dashboards: lapis: url: "https://api.loculus.genspectrum.org/influenza-b" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "country" + - "division" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -76,6 +95,9 @@ dashboards: lapis: url: "https://api.loculus.genspectrum.org/b-victoria" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "country" + - "division" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -88,6 +110,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/mpox" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -100,6 +125,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/west-nile" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -112,6 +140,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/rsv-a" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -124,6 +155,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/rsv-b" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -136,6 +170,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/ebola-sudan" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -148,6 +185,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/ebola-zaire" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -160,6 +200,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/cchf" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -240,6 +283,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/measles" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" diff --git a/backend/src/main/resources/application-dashboards-staging.yaml b/backend/src/main/resources/application-dashboards-staging.yaml index d383a1e42..791858cd6 100644 --- a/backend/src/main/resources/application-dashboards-staging.yaml +++ b/backend/src/main/resources/application-dashboards-staging.yaml @@ -4,6 +4,10 @@ dashboards: lapis: url: "https://gs-staging-1.int.genspectrum.org/open/v2" mainDateField: "date" + locationFields: + - "region" + - "country" + - "division" externalNavigationLinks: - url: "https://cov-spectrum.org" label: "CoV-Spectrum" @@ -13,6 +17,9 @@ dashboards: lapis: url: "https://api.loculus.staging.genspectrum.org/h5n1" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "country" + - "division" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -25,6 +32,9 @@ dashboards: lapis: url: "https://api.loculus.staging.genspectrum.org/h1n1pdm" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "country" + - "division" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -37,6 +47,9 @@ dashboards: lapis: url: "https://api.loculus.staging.genspectrum.org/h3n2" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "country" + - "division" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -49,6 +62,9 @@ dashboards: lapis: url: "https://api.loculus.staging.genspectrum.org/influenza-a" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "country" + - "division" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -61,6 +77,9 @@ dashboards: lapis: url: "https://api.loculus.staging.genspectrum.org/influenza-b" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "country" + - "division" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -90,6 +109,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/mpox" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -102,6 +124,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/west-nile" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -114,6 +139,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/rsv-a" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -126,6 +154,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/rsv-b" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -138,6 +169,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/ebola-sudan" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -150,6 +184,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/ebola-zaire" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -162,6 +199,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/cchf" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" @@ -242,6 +282,9 @@ dashboards: lapis: url: "https://lapis.pathoplexus.org/measles" mainDateField: "sampleCollectionDateRangeLower" + locationFields: + - "geoLocCountry" + - "geoLocAdmin1" additionalFilters: versionStatus: "LATEST_VERSION" isRevocation: "false" diff --git a/website/src/config.ts b/website/src/config.ts index c6f05418e..0e5434fb4 100644 --- a/website/src/config.ts +++ b/website/src/config.ts @@ -10,6 +10,7 @@ import { allOrganisms, type Organism } from './types/Organism.ts'; const lapisConfigSchema = z.object({ url: z.string(), mainDateField: z.string(), + locationFields: z.array(z.string()), additionalFilters: z.optional(z.record(z.string())), }); diff --git a/website/src/views/OrganismConstants.ts b/website/src/views/OrganismConstants.ts index b6c349517..23187460e 100644 --- a/website/src/views/OrganismConstants.ts +++ b/website/src/views/OrganismConstants.ts @@ -188,9 +188,6 @@ export const INSDC_ACCESSION_DOWNLOAD_FILES = ['insdcAccessionFull']; export const LOCULUS_AUTHORS_FIELD = 'authors'; export const LOCULUS_AUTHORS_AFFILIATIONS_FIELD = 'authorAffiliations'; -export const PATHOPLEXUS_LOCATION_FIELDS = ['geoLocCountry', 'geoLocAdmin1']; -export const GENSPECTRUM_LOCULUS_LOCATION_FIELDS = ['country', 'division']; - export const INFLUENZA_ACCESSION_DOWNLOAD_FIELDS = [ 'insdcAccessionFull_seg1', 'insdcAccessionFull_seg2', @@ -205,18 +202,20 @@ export const INFLUENZA_ACCESSION_DOWNLOAD_FIELDS = [ export const PATHOPLEXUS_HOST_FIELD = 'hostNameScientific'; type FiltersConfig = { + locationFields: string[]; dateRangeOptions: () => DateRangeOption[]; completenessSuffixes?: SuffixConfig[]; }; export function getPathoplexusFilters({ + locationFields, dateRangeOptions, completenessSuffixes, }: FiltersConfig): BaselineFilterConfig[] { return [ { type: 'location', - locationFields: PATHOPLEXUS_LOCATION_FIELDS, + locationFields, label: 'Sampling location', placeholderText: 'Sampling location', }, @@ -289,13 +288,14 @@ export const INFLUENZA_COMPLETENESS_SUFFIXES = [ export const GENSPECTRUM_LOCULUS_HOST_FIELD = 'hostNameScientific'; export function getGenspectrumLoculusFilters({ + locationFields, dateRangeOptions, completenessSuffixes, }: FiltersConfig): BaselineFilterConfig[] { return [ { type: 'location', - locationFields: GENSPECTRUM_LOCULUS_LOCATION_FIELDS, + locationFields, placeholderText: 'Sampling location', label: 'Sampling location', }, diff --git a/website/src/views/cchf.ts b/website/src/views/cchf.ts index 0c37ebf7a..e888565fc 100644 --- a/website/src/views/cchf.ts +++ b/website/src/views/cchf.ts @@ -25,7 +25,6 @@ import { type OrganismConstants, PATHOPLEXUS_COMMON_DOWNLOAD_FIELDS, PATHOPLEXUS_HOST_FIELD, - PATHOPLEXUS_LOCATION_FIELDS, } from './OrganismConstants.ts'; import { compareSideBySideViewConstants } from './ViewConstants.ts'; import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; @@ -41,18 +40,9 @@ const dateRangeOptions = defaultDateRangeOptions(earliestDate); class CchfConstants implements OrganismConstants { public readonly organism = Organisms.cchf; public readonly earliestDate = earliestDate; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getPathoplexusFilters({ - dateRangeOptions, - completenessSuffixes: [ - { suffix: 'M', suffixLabel: 'M' }, - { suffix: 'L', suffixLabel: 'L' }, - { suffix: 'S', suffixLabel: 'S' }, - ], - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly mainDateField: string; - public readonly locationFields = PATHOPLEXUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = []; public readonly useVariantQuery = false; public readonly hostField: string = PATHOPLEXUS_HOST_FIELD; @@ -91,8 +81,20 @@ class CchfConstants implements OrganismConstants { public readonly dataOrigins: DataOrigin[] = [dataOrigins.pathoplexus]; constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.cchf.lapis.locationFields; this.mainDateField = organismsConfig.cchf.lapis.mainDateField; this.additionalFilters = organismsConfig.cchf.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getPathoplexusFilters({ + locationFields: this.locationFields, + dateRangeOptions, + completenessSuffixes: [ + { suffix: 'M', suffixLabel: 'M' }, + { suffix: 'L', suffixLabel: 'L' }, + { suffix: 'S', suffixLabel: 'S' }, + ], + }), + ]; } } diff --git a/website/src/views/covid.ts b/website/src/views/covid.ts index 6a1c5bf5b..0e2549380 100644 --- a/website/src/views/covid.ts +++ b/website/src/views/covid.ts @@ -47,7 +47,6 @@ const earliestDate = '2020-01-06'; const hostField = 'host'; const mainDateFilterColumn = 'date'; -const mainLocationFields = ['region', 'country', 'division']; const NEXTCLADE_PANGO_LINEAGE_FIELD_NAME = 'nextcladePangoLineage'; const NEXTSTRAIN_CLADE_FIELD_NAME = 'nextstrainClade'; @@ -73,7 +72,7 @@ class CovidConstants implements OrganismConstants { public readonly organism = Organisms.covid; public readonly earliestDate = earliestDate; public readonly mainDateField: string; - public readonly locationFields = mainLocationFields; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: NEXTCLADE_PANGO_LINEAGE_FIELD_NAME, @@ -82,45 +81,7 @@ class CovidConstants implements OrganismConstants { }, ]; public readonly useVariantQuery = true; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - { - type: 'location', - locationFields: mainLocationFields, - placeholderText: 'Sampling location', - label: 'Sampling location', - }, - { - type: 'date', - dateRangeOptions, - dateColumn: mainDateFilterColumn, - label: 'Date', - }, - { - lapisField: hostField, - placeholderText: 'Host', - type: 'text' as const, - label: 'Host', - }, - { - lapisField: 'samplingStrategy', - placeholderText: 'Sampling strategy', - type: 'text' as const, - label: 'Sampling strategy', - }, - { - type: 'date', - dateRangeOptions, - dateColumn: 'dateSubmitted', - label: 'Date submitted', - }, - { - type: 'location', - locationFields: ['regionExposure', 'countryExposure', 'divisionExposure'], - placeholderText: 'Exposure location', - label: 'Exposure location', - }, - { type: 'advancedQuery' }, - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = hostField; public readonly originatingLabField = 'originatingLab'; public readonly submittingLabField = 'submittingLab'; @@ -163,8 +124,48 @@ class CovidConstants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.covid.lapis.locationFields; this.mainDateField = organismsConfig.covid.lapis.mainDateField; this.additionalFilters = organismsConfig.covid.lapis.additionalFilters; + this.baselineFilterConfigs = [ + { + type: 'location', + locationFields: this.locationFields, + placeholderText: 'Sampling location', + label: 'Sampling location', + }, + { + type: 'date', + dateRangeOptions, + dateColumn: mainDateFilterColumn, + label: 'Date', + }, + { + lapisField: hostField, + placeholderText: 'Host', + type: 'text' as const, + label: 'Host', + }, + { + lapisField: 'samplingStrategy', + placeholderText: 'Sampling strategy', + type: 'text' as const, + label: 'Sampling strategy', + }, + { + type: 'date', + dateRangeOptions, + dateColumn: 'dateSubmitted', + label: 'Date submitted', + }, + { + type: 'location', + locationFields: ['regionExposure', 'countryExposure', 'divisionExposure'], + placeholderText: 'Exposure location', + label: 'Exposure location', + }, + { type: 'advancedQuery' }, + ]; } } diff --git a/website/src/views/denv1.ts b/website/src/views/denv1.ts index 9def172b0..0002a9c8f 100644 --- a/website/src/views/denv1.ts +++ b/website/src/views/denv1.ts @@ -19,7 +19,6 @@ import { } from './BaseView.ts'; import { GENSPECTRUM_LOCULUS_HOST_FIELD, - GENSPECTRUM_LOCULUS_LOCATION_FIELDS, getGenSpectrumLoculusAggregatedVisualizations, getGenspectrumLoculusFilters, INSDC_ACCESSION_DOWNLOAD_FILES, @@ -43,7 +42,7 @@ class Denv1Constants implements OrganismConstants { public readonly organism = Organisms.denv1; public readonly mainDateField: string; public readonly earliestDate = earliestDate; - public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: LINEAGE_FIELD_NAME, @@ -52,11 +51,7 @@ class Denv1Constants implements OrganismConstants { }, ]; public readonly useVariantQuery = false; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; @@ -86,8 +81,15 @@ class Denv1Constants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.denv1.lapis.locationFields; this.mainDateField = organismsConfig.denv1.lapis.mainDateField; this.additionalFilters = organismsConfig.denv1.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getGenspectrumLoculusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + ]; } } diff --git a/website/src/views/denv2.ts b/website/src/views/denv2.ts index 6a4beec4c..b0dc64ffd 100644 --- a/website/src/views/denv2.ts +++ b/website/src/views/denv2.ts @@ -19,7 +19,6 @@ import { } from './BaseView.ts'; import { GENSPECTRUM_LOCULUS_HOST_FIELD, - GENSPECTRUM_LOCULUS_LOCATION_FIELDS, getGenSpectrumLoculusAggregatedVisualizations, getGenspectrumLoculusFilters, INSDC_ACCESSION_DOWNLOAD_FILES, @@ -43,7 +42,7 @@ class Denv2Constants implements OrganismConstants { public readonly organism = Organisms.denv2; public readonly mainDateField: string; public readonly earliestDate = earliestDate; - public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: LINEAGE_FIELD_NAME, @@ -52,11 +51,7 @@ class Denv2Constants implements OrganismConstants { }, ]; public readonly useVariantQuery = false; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; @@ -86,8 +81,15 @@ class Denv2Constants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.denv2.lapis.locationFields; this.mainDateField = organismsConfig.denv2.lapis.mainDateField; this.additionalFilters = organismsConfig.denv2.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getGenspectrumLoculusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + ]; } } diff --git a/website/src/views/denv3.ts b/website/src/views/denv3.ts index 9c4317ae4..267c92af1 100644 --- a/website/src/views/denv3.ts +++ b/website/src/views/denv3.ts @@ -19,7 +19,6 @@ import { } from './BaseView.ts'; import { GENSPECTRUM_LOCULUS_HOST_FIELD, - GENSPECTRUM_LOCULUS_LOCATION_FIELDS, getGenSpectrumLoculusAggregatedVisualizations, getGenspectrumLoculusFilters, INSDC_ACCESSION_DOWNLOAD_FILES, @@ -43,7 +42,7 @@ class Denv3Constants implements OrganismConstants { public readonly organism = Organisms.denv3; public readonly mainDateField: string; public readonly earliestDate = earliestDate; - public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: LINEAGE_FIELD_NAME, @@ -52,11 +51,7 @@ class Denv3Constants implements OrganismConstants { }, ]; public readonly useVariantQuery = false; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; @@ -86,8 +81,15 @@ class Denv3Constants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.denv3.lapis.locationFields; this.mainDateField = organismsConfig.denv3.lapis.mainDateField; this.additionalFilters = organismsConfig.denv3.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getGenspectrumLoculusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + ]; } } diff --git a/website/src/views/denv4.ts b/website/src/views/denv4.ts index 96e92d527..14c0aa40f 100644 --- a/website/src/views/denv4.ts +++ b/website/src/views/denv4.ts @@ -19,7 +19,6 @@ import { } from './BaseView.ts'; import { GENSPECTRUM_LOCULUS_HOST_FIELD, - GENSPECTRUM_LOCULUS_LOCATION_FIELDS, getGenSpectrumLoculusAggregatedVisualizations, getGenspectrumLoculusFilters, INSDC_ACCESSION_DOWNLOAD_FILES, @@ -43,7 +42,7 @@ class Denv4Constants implements OrganismConstants { public readonly organism = Organisms.denv4; public readonly mainDateField: string; public readonly earliestDate = earliestDate; - public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: LINEAGE_FIELD_NAME, @@ -52,11 +51,7 @@ class Denv4Constants implements OrganismConstants { }, ]; public readonly useVariantQuery = false; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; @@ -86,8 +81,15 @@ class Denv4Constants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.denv4.lapis.locationFields; this.mainDateField = organismsConfig.denv4.lapis.mainDateField; this.additionalFilters = organismsConfig.denv4.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getGenspectrumLoculusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + ]; } } diff --git a/website/src/views/ebolaSudan.ts b/website/src/views/ebolaSudan.ts index 9800f4ec7..7547bf20e 100644 --- a/website/src/views/ebolaSudan.ts +++ b/website/src/views/ebolaSudan.ts @@ -25,7 +25,6 @@ import { type OrganismConstants, PATHOPLEXUS_ACCESSION_DOWNLOAD_FIELDS, PATHOPLEXUS_HOST_FIELD, - PATHOPLEXUS_LOCATION_FIELDS, } from './OrganismConstants.ts'; import { compareSideBySideViewConstants } from './ViewConstants.ts'; import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; @@ -41,13 +40,9 @@ const dateRangeOptions = defaultDateRangeOptions(earliestDate); class EbolaSudanConstants implements OrganismConstants { public readonly organism = Organisms.ebolaSudan; public readonly earliestDate = earliestDate; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getPathoplexusFilters({ - dateRangeOptions, - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly mainDateField: string; - public readonly locationFields = PATHOPLEXUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = []; public readonly useVariantQuery = false; public readonly hostField: string = PATHOPLEXUS_HOST_FIELD; @@ -81,8 +76,15 @@ class EbolaSudanConstants implements OrganismConstants { public readonly dataOrigins: DataOrigin[] = [dataOrigins.pathoplexus]; constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.ebolaSudan.lapis.locationFields; this.mainDateField = organismsConfig.ebolaSudan.lapis.mainDateField; this.additionalFilters = organismsConfig.ebolaSudan.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getPathoplexusFilters({ + locationFields: this.locationFields, + dateRangeOptions, + }), + ]; } } diff --git a/website/src/views/ebolaZaire.ts b/website/src/views/ebolaZaire.ts index 74af7e5c3..65f317d2a 100644 --- a/website/src/views/ebolaZaire.ts +++ b/website/src/views/ebolaZaire.ts @@ -25,7 +25,6 @@ import { type OrganismConstants, PATHOPLEXUS_ACCESSION_DOWNLOAD_FIELDS, PATHOPLEXUS_HOST_FIELD, - PATHOPLEXUS_LOCATION_FIELDS, } from './OrganismConstants.ts'; import { compareSideBySideViewConstants } from './ViewConstants.ts'; import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; @@ -41,14 +40,9 @@ const dateRangeOptions = defaultDateRangeOptions(earliestDate); class EbolaZaireConstants implements OrganismConstants { public readonly organism = Organisms.ebolaZaire; public readonly earliestDate = earliestDate; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getPathoplexusFilters({ - dateRangeOptions, - }), - ]; - + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly mainDateField: string; - public readonly locationFields = PATHOPLEXUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = []; public readonly useVariantQuery = false; public readonly hostField: string = PATHOPLEXUS_HOST_FIELD; @@ -82,8 +76,15 @@ class EbolaZaireConstants implements OrganismConstants { public readonly dataOrigins: DataOrigin[] = [dataOrigins.pathoplexus]; constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.ebolaZaire.lapis.locationFields; this.mainDateField = organismsConfig.ebolaZaire.lapis.mainDateField; this.additionalFilters = organismsConfig.ebolaZaire.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getPathoplexusFilters({ + locationFields: this.locationFields, + dateRangeOptions, + }), + ]; } } diff --git a/website/src/views/h1n1pdm.ts b/website/src/views/h1n1pdm.ts index 8bd79c01d..5ba163c6e 100644 --- a/website/src/views/h1n1pdm.ts +++ b/website/src/views/h1n1pdm.ts @@ -19,7 +19,6 @@ import { } from './BaseView.ts'; import { GENSPECTRUM_LOCULUS_HOST_FIELD, - GENSPECTRUM_LOCULUS_LOCATION_FIELDS, getGenSpectrumLoculusAggregatedVisualizations, getGenspectrumLoculusFilters, INFLUENZA_ACCESSION_DOWNLOAD_FIELDS, @@ -45,7 +44,7 @@ class H1n1pdmConstants implements OrganismConstants { public readonly organism = Organisms.h1n1pdm; public readonly earliestDate = earliestDate; public readonly mainDateField: string; - public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: CLADE_HA_FIELD_NAME, @@ -59,12 +58,7 @@ class H1n1pdmConstants implements OrganismConstants { }, ]; public readonly useVariantQuery = false; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; @@ -91,8 +85,16 @@ class H1n1pdmConstants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.h1n1pdm.lapis.locationFields; this.mainDateField = organismsConfig.h1n1pdm.lapis.mainDateField; this.additionalFilters = organismsConfig.h1n1pdm.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getGenspectrumLoculusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, + }), + ]; } } diff --git a/website/src/views/h3n2.ts b/website/src/views/h3n2.ts index f7eced7f8..8feaefaae 100644 --- a/website/src/views/h3n2.ts +++ b/website/src/views/h3n2.ts @@ -19,7 +19,6 @@ import { } from './BaseView.ts'; import { GENSPECTRUM_LOCULUS_HOST_FIELD, - GENSPECTRUM_LOCULUS_LOCATION_FIELDS, getGenSpectrumLoculusAggregatedVisualizations, getGenspectrumLoculusFilters, INFLUENZA_ACCESSION_DOWNLOAD_FIELDS, @@ -45,7 +44,7 @@ class H3n2Constants implements OrganismConstants { public readonly organism = Organisms.h3n2; public readonly earliestDate = earliestDate; public readonly mainDateField: string; - public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: CLADE_HA_FIELD_NAME, @@ -59,12 +58,7 @@ class H3n2Constants implements OrganismConstants { }, ]; public readonly useVariantQuery = false; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; @@ -91,8 +85,16 @@ class H3n2Constants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.h3n2.lapis.locationFields; this.mainDateField = organismsConfig.h3n2.lapis.mainDateField; this.additionalFilters = organismsConfig.h3n2.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getGenspectrumLoculusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, + }), + ]; } } diff --git a/website/src/views/h5n1.ts b/website/src/views/h5n1.ts index 0c14b720d..e4661a09b 100644 --- a/website/src/views/h5n1.ts +++ b/website/src/views/h5n1.ts @@ -19,7 +19,6 @@ import { } from './BaseView.ts'; import { GENSPECTRUM_LOCULUS_HOST_FIELD, - GENSPECTRUM_LOCULUS_LOCATION_FIELDS, getGenSpectrumLoculusAggregatedVisualizations, getGenspectrumLoculusFilters, INFLUENZA_ACCESSION_DOWNLOAD_FIELDS, @@ -44,7 +43,7 @@ class H5n1Constants implements OrganismConstants { public readonly organism = Organisms.h5n1; public readonly earliestDate = earliestDate; public readonly mainDateField: string; - public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: CLADE_FIELD_NAME, @@ -53,12 +52,7 @@ class H5n1Constants implements OrganismConstants { }, ]; public readonly useVariantQuery = false; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; @@ -135,8 +129,16 @@ class H5n1Constants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.h5n1.lapis.locationFields; this.mainDateField = organismsConfig.h5n1.lapis.mainDateField; this.additionalFilters = organismsConfig.h5n1.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getGenspectrumLoculusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, + }), + ]; } } diff --git a/website/src/views/influenza-a.ts b/website/src/views/influenza-a.ts index 4a7178c72..a1d8b3d79 100644 --- a/website/src/views/influenza-a.ts +++ b/website/src/views/influenza-a.ts @@ -11,7 +11,6 @@ import type { OrganismsConfig } from '../config.ts'; import { BaseView, GenericSequencingEffortsView } from './BaseView.ts'; import { GENSPECTRUM_LOCULUS_HOST_FIELD, - GENSPECTRUM_LOCULUS_LOCATION_FIELDS, getGenSpectrumLoculusAggregatedVisualizations, getGenspectrumLoculusFilters, INFLUENZA_ACCESSION_DOWNLOAD_FIELDS, @@ -36,7 +35,7 @@ class InfluenzaAConstants implements OrganismConstants { public readonly organism = Organisms.influenzaA; public readonly earliestDate = earliestDate; public readonly mainDateField: string; - public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: SUBTYPE_HA_FIELD_NAME, @@ -49,12 +48,7 @@ class InfluenzaAConstants implements OrganismConstants { filterType: 'text' as const, }, ]; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - completenessSuffixes: [], - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly useVariantQuery = false; public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; @@ -75,8 +69,16 @@ class InfluenzaAConstants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.influenzaA.lapis.locationFields; this.mainDateField = organismsConfig.influenzaA.lapis.mainDateField; this.additionalFilters = organismsConfig.influenzaA.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getGenspectrumLoculusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + completenessSuffixes: [], + }), + ]; } } diff --git a/website/src/views/influenza-b.ts b/website/src/views/influenza-b.ts index 8121f77e9..d59e7df6c 100644 --- a/website/src/views/influenza-b.ts +++ b/website/src/views/influenza-b.ts @@ -11,7 +11,6 @@ import type { OrganismsConfig } from '../config.ts'; import { BaseView, GenericSequencingEffortsView } from './BaseView.ts'; import { GENSPECTRUM_LOCULUS_HOST_FIELD, - GENSPECTRUM_LOCULUS_LOCATION_FIELDS, getGenSpectrumLoculusAggregatedVisualizations, getGenspectrumLoculusFilters, INFLUENZA_ACCESSION_DOWNLOAD_FIELDS, @@ -35,7 +34,7 @@ class InfluenzaBConstants implements OrganismConstants { public readonly organism = Organisms.influenzaB; public readonly earliestDate = earliestDate; public readonly mainDateField: string; - public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: LINEAGE_HA_FIELD_NAME, @@ -43,12 +42,7 @@ class InfluenzaBConstants implements OrganismConstants { filterType: 'text' as const, }, ]; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - completenessSuffixes: [], - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly useVariantQuery = false; public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; @@ -68,8 +62,16 @@ class InfluenzaBConstants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.influenzaB.lapis.locationFields; this.mainDateField = organismsConfig.influenzaB.lapis.mainDateField; this.additionalFilters = organismsConfig.influenzaB.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getGenspectrumLoculusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + completenessSuffixes: [], + }), + ]; } } diff --git a/website/src/views/measles.ts b/website/src/views/measles.ts index e649e102e..618e347d1 100644 --- a/website/src/views/measles.ts +++ b/website/src/views/measles.ts @@ -25,7 +25,6 @@ import { type OrganismConstants, PATHOPLEXUS_ACCESSION_DOWNLOAD_FIELDS, PATHOPLEXUS_HOST_FIELD, - PATHOPLEXUS_LOCATION_FIELDS, } from './OrganismConstants.ts'; import { compareSideBySideViewConstants } from './ViewConstants.ts'; import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; @@ -43,7 +42,7 @@ class MeaslesConstants implements OrganismConstants { public readonly organism = Organisms.measles; public readonly mainDateField: string; public readonly earliestDate = earliestDate; - public readonly locationFields = PATHOPLEXUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: LINEAGE_FIELD_NAME, @@ -51,17 +50,7 @@ class MeaslesConstants implements OrganismConstants { filterType: 'text' as const, }, ]; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getPathoplexusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - }), - { - lapisField: 'collectionDevice', - placeholderText: 'Collection device', - type: 'text' as const, - label: 'Collection device', - }, - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly useVariantQuery = false; public readonly hostField: string = PATHOPLEXUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; @@ -90,8 +79,21 @@ class MeaslesConstants implements OrganismConstants { public readonly dataOrigins: DataOrigin[] = [dataOrigins.pathoplexus]; constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.measles.lapis.locationFields; this.mainDateField = organismsConfig.measles.lapis.mainDateField; this.additionalFilters = organismsConfig.measles.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getPathoplexusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + { + lapisField: 'collectionDevice', + placeholderText: 'Collection device', + type: 'text' as const, + label: 'Collection device', + }, + ]; } } diff --git a/website/src/views/mpox.ts b/website/src/views/mpox.ts index 7fb713f4f..64ea0d088 100644 --- a/website/src/views/mpox.ts +++ b/website/src/views/mpox.ts @@ -25,7 +25,6 @@ import { type OrganismConstants, PATHOPLEXUS_ACCESSION_DOWNLOAD_FIELDS, PATHOPLEXUS_HOST_FIELD, - PATHOPLEXUS_LOCATION_FIELDS, } from './OrganismConstants.ts'; import { compareSideBySideViewConstants } from './ViewConstants.ts'; import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; @@ -44,7 +43,7 @@ class MpoxConstants implements OrganismConstants { public readonly organism = Organisms.mpox; public readonly mainDateField: string; public readonly earliestDate = earliestDate; - public readonly locationFields = PATHOPLEXUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: LINEAGE_FIELD_NAME, @@ -58,30 +57,7 @@ class MpoxConstants implements OrganismConstants { }, ]; public readonly useVariantQuery = false; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getPathoplexusFilters({ - dateRangeOptions: () => { - const presets = dateRangeOptionPresets(); - return [ - presets.lastMonth, - presets.last2Months, - presets.last3Months, - presets.last6Months, - presets.lastYear, - defaultDateRangeOption.year2024, - defaultDateRangeOption.year2023, - defaultDateRangeOption.year2022, - defaultDateRangeOption.year2021, - defaultDateRangeOption.since2021, - defaultDateRangeOption.before2021, - defaultDateRangeOption.since2017, - defaultDateRangeOption.from2017to2020, - defaultDateRangeOption.before2017, - { label: ALL_TIMES_LABEL, dateFrom: earliestDate }, - ]; - }, - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = PATHOPLEXUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; @@ -112,8 +88,34 @@ class MpoxConstants implements OrganismConstants { public readonly dataOrigins: DataOrigin[] = [dataOrigins.pathoplexus]; constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.mpox.lapis.locationFields; this.mainDateField = organismsConfig.mpox.lapis.mainDateField; this.additionalFilters = organismsConfig.mpox.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getPathoplexusFilters({ + locationFields: this.locationFields, + dateRangeOptions: () => { + const presets = dateRangeOptionPresets(); + return [ + presets.lastMonth, + presets.last2Months, + presets.last3Months, + presets.last6Months, + presets.lastYear, + defaultDateRangeOption.year2024, + defaultDateRangeOption.year2023, + defaultDateRangeOption.year2022, + defaultDateRangeOption.year2021, + defaultDateRangeOption.since2021, + defaultDateRangeOption.before2021, + defaultDateRangeOption.since2017, + defaultDateRangeOption.from2017to2020, + defaultDateRangeOption.before2017, + { label: ALL_TIMES_LABEL, dateFrom: earliestDate }, + ]; + }, + }), + ]; } } diff --git a/website/src/views/rsvA.ts b/website/src/views/rsvA.ts index 74bf2b7d9..af3fa5675 100644 --- a/website/src/views/rsvA.ts +++ b/website/src/views/rsvA.ts @@ -25,7 +25,6 @@ import { type OrganismConstants, PATHOPLEXUS_ACCESSION_DOWNLOAD_FIELDS, PATHOPLEXUS_HOST_FIELD, - PATHOPLEXUS_LOCATION_FIELDS, } from './OrganismConstants.ts'; import { compareSideBySideViewConstants } from './ViewConstants.ts'; import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; @@ -43,7 +42,7 @@ class RsvAConstants implements OrganismConstants { public readonly organism = Organisms.rsvA; public readonly mainDateField: string; public readonly earliestDate = earliestDate; - public readonly locationFields = PATHOPLEXUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: LINEAGE_FIELD_NAME, @@ -52,11 +51,7 @@ class RsvAConstants implements OrganismConstants { }, ]; public readonly useVariantQuery = false; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getPathoplexusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = PATHOPLEXUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; @@ -86,8 +81,15 @@ class RsvAConstants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.rsvA.lapis.locationFields; this.mainDateField = organismsConfig.rsvA.lapis.mainDateField; this.additionalFilters = organismsConfig.rsvA.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getPathoplexusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + ]; } } diff --git a/website/src/views/rsvB.ts b/website/src/views/rsvB.ts index e2819b913..0c80d947d 100644 --- a/website/src/views/rsvB.ts +++ b/website/src/views/rsvB.ts @@ -25,7 +25,6 @@ import { type OrganismConstants, PATHOPLEXUS_ACCESSION_DOWNLOAD_FIELDS, PATHOPLEXUS_HOST_FIELD, - PATHOPLEXUS_LOCATION_FIELDS, } from './OrganismConstants.ts'; import { compareSideBySideViewConstants } from './ViewConstants.ts'; import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; @@ -43,7 +42,7 @@ class RsvBConstants implements OrganismConstants { public readonly organism = Organisms.rsvB; public readonly mainDateField: string; public readonly earliestDate = earliestDate; - public readonly locationFields = PATHOPLEXUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: LINEAGE_FIELD_NAME, @@ -52,11 +51,7 @@ class RsvBConstants implements OrganismConstants { }, ]; public readonly useVariantQuery = false; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getPathoplexusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = PATHOPLEXUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; @@ -86,8 +81,15 @@ class RsvBConstants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.rsvB.lapis.locationFields; this.mainDateField = organismsConfig.rsvB.lapis.mainDateField; this.additionalFilters = organismsConfig.rsvB.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getPathoplexusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + ]; } } diff --git a/website/src/views/victoria.ts b/website/src/views/victoria.ts index 3698d0954..20658083e 100644 --- a/website/src/views/victoria.ts +++ b/website/src/views/victoria.ts @@ -19,7 +19,6 @@ import { } from './BaseView.ts'; import { GENSPECTRUM_LOCULUS_HOST_FIELD, - GENSPECTRUM_LOCULUS_LOCATION_FIELDS, getGenSpectrumLoculusAggregatedVisualizations, getGenspectrumLoculusFilters, INFLUENZA_ACCESSION_DOWNLOAD_FIELDS, @@ -45,7 +44,7 @@ class VictoriaConstants implements OrganismConstants { public readonly organism = Organisms.victoria; public readonly earliestDate = earliestDate; public readonly mainDateField: string; - public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: CLADE_HA_FIELD_NAME, @@ -59,12 +58,7 @@ class VictoriaConstants implements OrganismConstants { }, ]; public readonly useVariantQuery = false; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, - }), - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; @@ -90,8 +84,16 @@ class VictoriaConstants implements OrganismConstants { } constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.victoria.lapis.locationFields; this.mainDateField = organismsConfig.victoria.lapis.mainDateField; this.additionalFilters = organismsConfig.victoria.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getGenspectrumLoculusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, + }), + ]; } } diff --git a/website/src/views/westNile.ts b/website/src/views/westNile.ts index 1e63c3396..322ab5d86 100644 --- a/website/src/views/westNile.ts +++ b/website/src/views/westNile.ts @@ -25,7 +25,6 @@ import { type OrganismConstants, PATHOPLEXUS_ACCESSION_DOWNLOAD_FIELDS, PATHOPLEXUS_HOST_FIELD, - PATHOPLEXUS_LOCATION_FIELDS, } from './OrganismConstants.ts'; import { compareSideBySideViewConstants } from './ViewConstants.ts'; import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; @@ -43,7 +42,7 @@ class WestNileConstants implements OrganismConstants { public readonly organism = Organisms.westNile; public readonly mainDateField: string; public readonly earliestDate = earliestDate; - public readonly locationFields = PATHOPLEXUS_LOCATION_FIELDS; + public readonly locationFields: string[]; public readonly lineageFilters: LineageFilterConfig[] = [ { lapisField: LINEAGE_FIELD_NAME, @@ -51,17 +50,7 @@ class WestNileConstants implements OrganismConstants { filterType: 'text' as const, }, ]; - public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ - ...getPathoplexusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), - }), - { - lapisField: 'collectionDevice', - placeholderText: 'Collection device', - type: 'text' as const, - label: 'Collection device', - }, - ]; + public readonly baselineFilterConfigs: BaselineFilterConfig[]; public readonly useVariantQuery = false; public readonly hostField: string = PATHOPLEXUS_HOST_FIELD; public readonly authorsField = LOCULUS_AUTHORS_FIELD; @@ -93,8 +82,21 @@ class WestNileConstants implements OrganismConstants { public readonly dataOrigins: DataOrigin[] = [dataOrigins.pathoplexus]; constructor(organismsConfig: OrganismsConfig) { + this.locationFields = organismsConfig.westNile.lapis.locationFields; this.mainDateField = organismsConfig.westNile.lapis.mainDateField; this.additionalFilters = organismsConfig.westNile.lapis.additionalFilters; + this.baselineFilterConfigs = [ + ...getPathoplexusFilters({ + locationFields: this.locationFields, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + { + lapisField: 'collectionDevice', + placeholderText: 'Collection device', + type: 'text' as const, + label: 'Collection device', + }, + ]; } }